lista
appartiene attacca cancella consecutivo elimina inverte permuta sostituisce sottolista ultimo
appartiene verifica se elemento appartiene a lista
DOMAINS int=integer lint=int*
reale=real lreale=reale*
simb=symbol lsimb=simb*
car=char lcar=car*
str=string lstr=str*
PREDICATES appartiene(int,lint) appartiene(reale,lreale) appartiene(car,lcar) appartiene(str,lstr) appartiene(simb,lsimb)
CLAUSES appartiene(X,[X|_]). appartiene(X,[_|C]):- appartiene(X,C).
attacca crea lista mediante unione di altre liste
DOMAINS int=integer lint=int*
reale=real lreale=reale*
simb=symbol lsimb=simb*
car=char lcar=car*
str=string lstr=str*
PREDICATES attacca(lint,lint,lint) attacca(lreale,lreale,lreale) attacca(lcar,lcar,lcar) attacca(lstr,lstr,lstr) attacca(lsimb,lsimb,lsimb)
CLAUSES
/*attacca la seconda lista alla prima*/ attacca([],L,L). attacca([X|L1],L2,[X|L3]):- attacca(L1,L2,L3).
/* attacca la prima lista alla seconda*/ attacca(L,[],L). attacca(L1,[X|L2],[X|L3]):- attacca(L1,L2,L3).
cancella cancella elemento da lista
DOMAINS int=integer lint=int* reale=real* lreale=reale* car=char lcar=car* str=string lstr=str* simb=symbol lsimb=simb*
PREDICATES cancella(int,lint,lint) cancella(reale,lreale,lreale) cancella(simb,lsimb,lsimb) cancella(car,lcar,lcar) cancella(str,lstr,lstr)
CLAUSES
/* dalla lista vuota, e' possibile cancellare */ cancella(_,[],[]). cancella(X,[X|C],M):- cancella(X,C,M), !. cancella(X,[T|C],[T|M]):- cancella(X,C,M).
consecutivo verifica se elementi sono consecutivi nella lista
DOMAINS int=integer lint=int* reale=real* lreale=reale* car=char lcar=car* str=string lstr=str* simb=symbol lsimb=simb*
PREDICATES consecutivi(int,int,lint) consecutivi(reale,reale,lreale) consecutivi(simb,simb,lsimb) consecutivi(car,car,lcar) consecutivi(str,str,lstr)
CLAUSES
/* gli elementi sono i primi due della lista data */ consecutivi(X,Y,[X,Y|_]). /* se X e Y sono consecutivi nella coda della lista, allora sono consecutivi nella lista */ consecutivi(X,Y,[_|Z]):- consecutivi(X,Y,Z).
elimina elimina una volta elemento se presente in lista
DOMAINS int=integer lint=int* reale=real lreale=reale* car=char lcar=car* str=string lstr=str* simb=symbol lsimb=simb*
PREDICATES elimina(int,lint,lint) elimina(reale,lreale,lreale) elimina(simb,lsimb,lsimb) elimina(car,lcar,lcar) elimina(str,lstr,lstr)
CLAUSES
elimina(X,[X|C],C). elimina(X,[T|C],[T|M]):- not(X=T), elimina(X,C,M).
inverte inverte sequenza elementi della lista
DOMAINS int=integer lint=int* reale=real* lreale=reale* car=char lcar=car* str=string lstr=str* simb=symbol lsimb=simb*
PREDICATES inverto(lint,lint) inverto(lsimb,lsimb) inverto(lcar,lcar) inverto(lstr,lstr)
attacca(lint,lint,lint) attacca(lsimb,lsimb,lsimb) attacca(lcar,lcar,lcar) attacca(lstr,lstr,lstr)
CLAUSES /* l'inversa di una lista vuota e' la lista vuota */ inverto([],[]). /* se L1 e' l'inversa della coda della lista data L, l'inversa si ottiene premettendo a L1 la testa di L */ inverto([T|C],L):- inverto(C,L1), attacca(L1,[T],L).
attacca([],L,L). attacca([T1|C1],L,[T1|C2]):- attacca(C1,L,C2).
permuta mostra possibili permutazioni elementi lista
DOMAINS int=integer lint=int*
reale=real lreale=reale*
simb=symbol lsimb=simb*
car=char lcar=car*
str=string lstr=str*
PREDICATES permutazione(lint,lint) permutazione(lreale,lreale) permutazione(lcar,lcar) permutazione(lsimb,lsimb) permutazione(lstr,lstr) appartiene(int,lint) appartiene(reale,lreale) appartiene(car,lcar) appartiene(str,lstr) appartiene(simb,lsimb) elimina(int,lint,lint) elimina(reale,lreale,lreale) elimina(simb,lsimb,lsimb) elimina(car,lcar,lcar) elimina(str,lstr,lstr)
CLAUSES
/* ad una lista vuota corrisponde una lista vuota */ permutazione([],[]). /* quando la lista non vuota */ permutazione(L,[T|N]):- appartiene(T,L), elimina(T,L,M), permutazione(M,N).
appartiene(X,[X|_]). appartiene(X,[_|C]):- appartiene(X,C).
elimina(X,[X|C],C). elimina(X,[T|C],[T|M]):- not(X=T), elimina(X,C,M).
sostituisce sostituzione di tutti gli elementi simili nella lista
DOMAINS int=integer lint=int* reale=real* lreale=reale* car=char lcar=car* simb=symbol lsimb=simb* str=string* lstr=str*
PREDICATES sostituisci(int,lint,int,lint) sostituisci(reale,lreale,reale,lreale) sostituisci(car,lcar,car,lcar) sostituisci(simb,lsimb,simb,lsimb) sostituisci(str,lstr,str,lstr)
CLAUSES
/* condizione limite */ sostituisci(_,[],_,[]).
/* primo caso: l'elemento da sostituire occupa il primo posto della lista data */ sostituisci(X,[X|C],A,[A|C1]):- !, sostituisci(X,C,A,C1).
/* secondo caso: X e' diverso dalla testa T della lista data */ sostituisci(X,[T|C],A,[T|C1]):- sostituisci(X,C,A,C1).
/* quattro tipi di goal: sostituisci(2,[1,2,2,4],23,L) sostituisci(2,L,23,[1,23,23,4]) sostituisci(X,[1,2,2,4],23,[1,23,23,4]) sostituisci(2,[1,2,2,4],A,[1,23,23,4])*/
sottolista verifica esistenza sottolista in lista
DOMAINS int=integer lint=int* reale=real* lreale=reale* car=char lcar=car* str=string lstr=str* simb=symbol lsimb=simb*
PREDICATES sottolista(lint,lint) sottolista(lreale,lreale) sottolista(lcar,lcar) sottolista(lsimb,lsimb) sottolista(lstr,lstr)
attacca(lint,lint,lint) attacca(lreale,lreale,lreale) attacca(lcar,lcar,lcar) attacca(lsimb,lsimb,lsimb) attacca(lstr,lstr,lstr)
CLAUSES
sottolista([],L). sottolista(M,L):- attacca(L1,L2,L), attacca(M,L3,L2), not(M=[]).
attacca([],L,L). attacca([T|C],L,[T|C1]):- attacca(C,L,C1).
ultimo verifica ultimo elemento lista
DOMAINS int=integer lint=int*
reale=real lreale=reale*
simb=symbol lsimb=simb*
car=char lcar=car*
str=string lstr=str*
PREDICATES ultimo(int,lint) ultimo(car,lcar) ultimo(str,lstr) ultimo(simb,lsimb)
CLAUSES
/* la lista contiene un solo elemento */ ultimo(X,[X]). /* X e' cercato nella coda */ ultimo(X,[_|C]):- ultimo(X,C).