1peg(a;b;c).
2disk(1..7).
3init_on(1..7,a).
4goal_on(1..7,c).
5moves(127).
6
7% Generate
8{ move(D,P,T) : disk(D), peg(P) } = 1 :- moves(M), T = 1..M.
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).
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#