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