/* nome sul disco: inverto.pro */
/* # 1.1.8 # */
	
	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).
	   	
ritorna