2 :- use_module(library(clpfd)).
\r
5 % relly(PC, I, PCnext, Inext).
\r
7 initial_state :- relly(start, 0, _, _).
\r
9 relly(start, _I, middle, Inext) :- Inext in 0..1000.
\r
10 relly(middle, I, done, Inext) :- Inext #= I + 1.
\r
15 next(PC, I) :- PC \= done, relly(PC, I, PCnext, Inext), next(PCnext, Inext).
\r
18 % ?- relly(start, 17, middle, 534).
\r
21 % ?- relly(middle, 534, 77, done).
\r
27 % ?- relly(start, 0, PC, I).
\r
31 % ?- relly(start, 0, PC, I), relly(PC, I, PCnext, Inext).
\r
62 type_ok(Small, Big) :- Small in 0..3, Big in 0..5.
\r
64 next_dh(Moves) :- next_dh(0, 0, Moves).
\r
66 next_dh(Small, Big, [[Move, Si, Bi]|Moves]) :-
\r
67 type_ok(Small, Big),
\r
68 die_hard(Move, Small, Big, Si, Bi),
\r
69 (Bi = 4 -> Moves = [] ; next_dh(Si, Bi, Moves)).
\r
71 die_hard( fill_small, Small, Big, 3, Big) :- Small #< 3.
\r
72 die_hard( fill_big, Small, Big, Small, 5) :- Big #< 5.
\r
73 die_hard(empty_small, Small, Big, 0, Big) :- Small #> 0.
\r
74 die_hard( empty_big, Small, Big, Small, 0) :- Big #> 0.
\r
76 die_hard(small_to_big, Small, Big, S, B) :-
\r
77 Big #< 5, Small #> 0,
\r
78 small_to_big(Small, Big, S, B).
\r
80 die_hard(big_to_small, Small, Big, S, B) :-
\r
81 Small #< 3, Big #> 0,
\r
82 big_to_small(Small, Big, S, B).
\r
84 big_to_small(Small, Big, S, 0) :-
\r
88 big_to_small(Small, Big, 3, B) :-
\r
90 B #= Big - (3 - Small).
\r
92 small_to_big(Small, Big, 0, B) :-
\r
96 small_to_big(Small, Big, S, 5) :-
\r
98 S #= Small - (5 - Big).
\r
135 With some manual reflow of the list for presentation...
\r
137 ?- call_with_depth_limit(next_dh(Moves), 11, _).
\r
140 [big_to_small, 3, 2],
\r
141 [empty_small, 0, 2],
\r
142 [big_to_small, 2, 0],
\r
144 [big_to_small, 3, 4]
\r
176 call_with_depth_limit(next_dh(0, 0, S, B), 12, REsult).
\r