https://github.com/ionboleac/lab-vincolata
Some example how to solve some problems with clp and asp (prolog)
https://github.com/ionboleac/lab-vincolata
asp clp csp eclipse prolog
Last synced: about 1 month ago
JSON representation
Some example how to solve some problems with clp and asp (prolog)
- Host: GitHub
- URL: https://github.com/ionboleac/lab-vincolata
- Owner: IonBoleac
- License: wtfpl
- Created: 2023-09-11T13:03:56.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2024-01-05T21:27:24.000Z (over 1 year ago)
- Last Synced: 2025-04-15T21:45:15.495Z (about 1 month ago)
- Topics: asp, clp, csp, eclipse, prolog
- Language: Prolog
- Homepage: http://www.eclipseclp.org/
- Size: 75.2 KB
- Stars: 2
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Proof of concept
## Sito delle librerie di eclipse
https://eclipseclp.org/doc/bips/lib_public/fd_global_gac/index.html
## Carico le librerie necessarie
```bash
:- lib(fd).
:- lib(fd_global).
:- lib(cumulative). # serve per fare i vincoli cumulativi
:- lib(edge_finder). o :- lib(edge_finder). # fa molto più prunning
```## Aggiorno il path di eclipse
```bash
PATH=$PATH:$HOME/eclipse/bin/x86_64_linux/
```
## Vari esempi di utilizzo
```prolog
append(A, B, AB). # concatena due liste A e B concatenate in AB -> (fa liste di liste)length(L, N). # lungehzza di una lista -> N è la lunghezza della lista L
# se N è una variabile, allora N è il numero di elementi di L.
# se L è una variabile, allora L è una lista di N elementi di cui N è dichiarato.flatten(L, F).
# -> F è la lista ottenuta dalla lista L con tutti gli elementi annidati
# L = [[1,2],3,[4,5]] -> F = [1,2,3,4,5]# fornisce la lista di tutti i valori che possono assumere una variabile
# X = 1..10 -> X = [1,2,3,4,5,6,7,8,9,10]
# X = 1..10::2 -> X = [1,3,5,7,9]
# X = 1..10::3 -> X = [1,4,7,10]# foreach(X, L, G) -> per ogni elemento X della lista L, esegue il goal G
# foreach(X, L, G, R) -> per ogni elemento X della lista L, esegue il goal G e salva il risultato in R# somma tutti gli elementi di una lista
sommalista([], 0) .
sommalista([H|T], S) :-
sommalista(T, S1),
S #= S1 + H.# ordina in ordine crescente gli elementi di una lista (cambia solo l'ordine, non la lista) dipende dal segno #< (crescente) o #> (decrescente)
ordina([]) :- !.
ordina([_]) :- !.
ordina([A, B|T]) :- ordina([B|T]), A #< B.# calcola la distanza tra tutti gli elementi di una lista e le inserisce in un'altra lista tali distanze
distanze([A,B], [C]) :- C #= B-A, !.
distanze([A, B|T], [C|Td]) :- C #= B-A, distanze([B|T], Td).# trova il minimo di una lista
minimo([X], X) :- !.
minimo([X|T], X) :- minimo(T, Y), X #=< Y, !.
minimo([_|T], Y) :- minimo(T, Y).# trova il massimo di una lista
massimo([X], X) :- !.
massimo([X|T], X) :- massimo(T, Y), X #>= Y, !.
massimo([_|T], Y) :- massimo(T, Y).# trova elemento E in posizione I di una lista L oppure restituisce la posizione I di un elemento E in una lista L
element(I, L, E).# restituisce una lista di tutte le distanze tra un elemento E e una lista L dentro una lista D (con tutti valori >0)
# dist(E, L, Dist).
dist(_, [], []) :- !.
dist(E, [H|T], [O|To]) :-
O #= H-E,
O #> 0,
dist(E, T, To).# estrai l'ultimo elemento di una lista L
ultimo_elemento([H], H) :- !.
ultimo_elemento([H|T], E) :-
ultimo_elemento(T,E).# estrai il primo elemento di una lista
primo_elemento([Primo|_], Primo).# golomb(L, N, M) :- L è la lista di numeri di golomb di lunghezza N, dove M è il valore massimo che deve assumere l'ultimo elemento della lista L
dist(_, [], []) :- !.
dist(E, [H|T], [O|To]) :-
O #= H-E,
O #> 0,
dist(E, T, To).# funzione di golomb che restituisce tutte le distanze tra due tacche
golomb([A], []) :-!.
golomb([A|T], [Ldist|Ldist1]) :-
golomb(T, Ldist1),
dist(A, T, Ldist).## fine golomb
# restiruisce la lista al contrario -> reverse(L, R)
reverse([], []).
reverse([H|T], R) :- reverse(T, R1), append(R1, [H], R).## cazzate su liste
# 1. The first 5 elements of L are 1.
L = [1,1,1,1,1|_],# 2. The last 5 elements of L are 0.
reverse(L, [0,0,0,0,0|_]),# 3. The 6th element of L is 1.
L = [_|L1],
L1 = [_,_,_,_,_,1|_],# 4. The 7th element of L is 0.
L = [_|L2],
L2 = [_,_,_,_,_,_,0|_],
## fine cazzate# predicato per la stampa di una lista
stampa([]) :- !.
stampa([X|T]) :- write(X), stampa(T).# predicato if then else (da utilizzare solamente con elemnti ground)
ifthenesle(Condizione, GoalThen, GoalElse) :-
call(Condizione), !,
call(GoalThen).
ifthenesle(Condizione, GoalThen, GoalElse) :-
call(GoalElse).# altrimenti si può utilizzare la forma contratta (da utilizzare solamente con elemnti ground)
( H1 #\= H2 -> B = 1 ; B = 0 ) -> B = 1 se H1 #\= H2, altrimenti B = 0# predicato per la ricerca di un elemento in una lista
ennesimo(1, [X|_], X) :- !.
ennesimo(N, [_|T], X) :- N1 is N-1, ennesimo(N1, T, X).# 3 *EXIT member(_591{[0 .. 6]}, [_591, _609{[...]}, _627{...}, ...]) %>
# l'asterisco dice che ci sono altri punti di scelta. Quando farà backtracking potrebbe partire da questo punto
```