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