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).