终于可以自己解决这个问题了:
move(state(A,B,C,D,E,0),state(A,B,C,D,0,E)).
move(state(A,B,C,D,E,0),state(0,B,C,D,E,A)).
move(state(0,B,C,D,E,F),state(B,0,C,D,E,F)).
move(state(0,B,C,D,E,F),state(F,B,C,D,E,0)).
move(state(0,B,C,D,E,F),state(E,B,C,D,0,F)).
move(state(A,0,C,D,E,F),state(0,A,C,D,E,F)).
move(state(A,0,C,D,E,F),state(A,C,0,D,E,F)).
move(state(A,B,0,D,E,F),state(A,0,B,D,E,F)).
move(state(A,B,0,D,E,F),state(A,B,D,0,E,F)).
move(state(A,B,C,0,E,F),state(A,B,0,C,E,F)).
move(state(A,B,C,0,E,F),state(A,B,C,E,0,F)).
move(state(A,B,C,D,0,F),state(A,B,C,0,D,F)).
move(state(A,B,C,D,0,F),state(A,B,C,D,F,0)).
move(state(A,B,C,D,0,F),state(0,B,C,D,A,F)).
solve(Start,Finish):-
solve(Start,Finish,[],Path),
length(Path,X),
reverse([Finish|Path],XPath),
write(X),write(' steps :'),nl,
write(XPath),nl.
solve(Finish,Finish,Path,Path).
solve(Start,Finish,Cache,Path):-
move(Start,Next),
\+ is_member(Next,Cache),
solve(Next,Finish,[Start|Cache],Path).
reverse(A, Z) :- reverse(A, [], Z).
reverse([], Z, Z).
reverse([A|X], SoFar, Z) :- reverse(X, [A|SoFar], Z).
length(L, N) :-length(L, 0, N).
length([], N, N).
length([_|Y], X, N) :-
XX is X + 1,
length(Y, XX, N).
2017年11月19日 08点11分
11