1:- module(new_hanoi_3,_). 2 3:- dynamic size/1. 4 5main([S|_]) :- 6 atom_chars(S,Ns),number_chars(Size,Ns), 7 retractall(size(_)), 8 assert(size(Size)), 9 query(Size, T, _),nl, 10 display(moves(T)),nl,nl. 11 12query(S, T, L) :- 13 statistics(runtime,_), 14 hanoi(S, T, L), 15 statistics(runtime,[_|Time]),nl, 16 display(runtime(Time)),nl. 17 18hanoi(S, T,List) :- 19 gen_list(1,S,Tower), 20 holds(0,T,st(Tower, [],[]),st([],[],Tower),[],List). 21 22 23holds(T,T,S,S,Ac,[S|Ac]). 24holds(T1, T3, St1, St2, Ac, Res) :- 25 trans(St1, StX), 26 \+ member(StX, Ac), 27 T2 is T1 + 1, 28 holds(T2, T3, StX, St2, [St1|Ac], Res). 29 30 31 32trans(st([A|As],Bs,Cs), st(As,[A|Bs],Cs)) :- 33 \+ bigger_in_B([A|Bs]), 34 move(A,Bs). 35trans(st([A|As],Bs,Cs), st(As,Bs,[A|Cs])) :- 36 move(A,Cs). 37 38trans(st(As,[B|Bs],Cs), st([B|As],Bs,Cs)) :- 39 move(B,As). 40trans(st(As,[B|Bs],Cs), st(As,Bs,[B|Cs])) :- 41 move(B,Cs). 42 43trans(st(As,Bs,[C|Cs]), st([C|As],Bs,Cs)) :- 44 \+ correct_([C|Cs]), 45 move(C,As). 46trans(st(As,Bs,[C|Cs]), st(As,[C|Bs],Cs)) :- 47 \+ bigger_in_B([C|Bs]), 48 \+ correct_([C|Cs]), 49 move(C,Bs). 50 51correct_([F|Rs]) :- 52 size(S), 53 gen_list(F,S,[F|Rs]). 54 55bigger_in_B([S]) :- 56 size(S). 57 58move(_,[]). 59move(E,[O|_]) :- 60 E < O. 61 62gen_list(N,N,[N]). 63gen_list(I,N,[I|L]) :- 64 I < N, 65 I1 is I + 1, 66 gen_list(I1,N,L)