View source with formatted comments or as raw
    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)