View source with raw comments or as raw
    1peg(a;b;c).
    2disk(1..9).
    3init_on(1..9,a).
    4goal_on(1..9,c).
    5moves(511).
    6
    7% Generate
    8{ move(D,P,T) : disk(D), peg(P) } = 1 :- moves(M),  T = 1..M.
    9% Define
   10move(D,T)   :- move(D,_,T).
   11on(D,P,0)   :- init_on(D,P).
   12on(D,P,T)   :- move(D,P,T).
   13on(D,P,T+1) :- on(D,P,T), not move(D,T+1), not moves(T).
   14blocked(D-1,P,T+1) :- on(D,P,T), not moves(T).
   15blocked(D-1,P,T)   :- blocked(D,P,T), disk(D).
   16% Test
   17:- move(D,P,T), blocked(D-1,P,T).   18:- move(D,T), on(D,P,T-1), blocked(D,P,T).   19:- goal_on(D,P), not on(D,P,M), moves(M).
   20:- { on(D,P,T) } != 1, disk(D), moves(M), T = 1..M.
   21% Display
   22#