% 
% 
% 
% ?- go(a,p,LE).
% LE = [a, b, g, p]

linha(1,[a,b,c,d,e]). 
linha(2,[b,g,f,e,i,h]). 
linha(3,[l,m,g,n,f,o,p,q,i,j]).


mesma_linha(X,Y):-
	linha(_,L), member(X,L), member(Y,L).
	
muda_linha(Est,LE,NL):-
	linha(NL, Lin),
	member(Est, Lin),
	\+ member(NL,LE),
	linha(NL1, Lin1),
	NL1 \= NL,
	member(Est, Lin1).
	
go(O,D,LE):-
	encontra_linha(O,L),
	go1(O,D,[L],LE).
go1(O,D,_,[O,D]):-
	mesma_linha(O,D).
go1(O,D,LV,[O|LE]):-
	muda_linha(X,LV,NL),
	mesma_linha(O,X),
	\+ member(NL, LV),
	go1(X,D,[NL|LV],LE).

encontra_linha(Est, Linha):-
	linha(Linha,LE), member(Est,LE).
	
	
hanoi(N):-
	move(N,esquerda,centro,direita,0,_).
		
move(0,_,_,_,I,I):-!. 
move(N,A,B,C,I,I2):-
	M is N-1,  
   move(M,A,C,B,I,I1), 
   J is I1+1, 
   informa(A,B,J), 
   move(M,C,B,A,J,I2).
   
informa(A,B,I):-
    write(I),write(': MOVER DISCO DE '),write(A),
    write(' PARA '),write(B),nl.
    
% ----------- processamento genérico de listas -------

pred([], []).
pred([H|T1], [H|T2]):-
	N is H mod 2, N == 0, pred(T1, T2).
pred([_|T1], L2):- pred(T1, L2).

p(L1, L2):- pred1(L1,[],L2).
pred1([], L, L).
pred1([H|T1], LA, L2):-
	N is H mod 2, N == 0, pred1(T1, [H|LA], L2).
pred1([_|T1], LA, L2):- pred1(T1, LA, L2).
	





