5query(S, T, L, U) :-
6 T .>=. 0, hanoi(S, T,L).
7
10
11:- use_package(clpq). 12
13hanoi(S, T,List) :-
14 gen_list(1,S,Stack),
15 16 holds(T,st(Stack, [],[]),st([],[],Stack),[],List).
17
20
21holds(0,S,S,Ac,[S|Ac]):- \+ member(S, Ac).
22holds(T1, St1, St2, Ac, Res) :-
23 T0 .>=. 0,
24 T1 .=. T0 + 1,
25 \+ member(St1, Ac),
26 trans(St1, StX),
27 holds(T0, StX, St2, [St1|Ac], Res).
28
29
30
31trans(st(A0,B0,C0), st(A1,B1,C1)) :-
32 trans_(A0,A1,B0,B1,C0,C1).
33trans(st(A0,B0,C0), st(A1,B1,C1)) :-
34 trans_(B0,B1,C0,C1,A0,A1).
35trans(st(A0,B0,C0), st(A1,B1,C1)) :-
36 trans_(C0,C1,A0,A1,B0,B1).
37
38trans_([A|As],As,B,[A|B],C,C) :-
39 not_invalid(A,B).
40trans_([A|As],As,B,B,C,[A|C]) :-
41 not_invalid(A,C).
42
45
46not_invalid(_,[]).
47not_invalid(E,[O|_]) :-
48 E .<. O.
49
50gen_list(N,N,[N]).
51gen_list(I,N,[I|L]) :-
52 I < N,
53 I1 is I + 1,
54 gen_list(I1,N,L)