我正在尝试解决这个Pebble Solitaire问题,这是我的代码的一部分:
% Base case
play(List, X) :-
count_pebbles(List, X).
%%%%%%%%%%%%%%
% JUMP RIGHT %
%%%%%%%%%%%%%%
% oo-XXXXXXXXX
play( [111, 111, 45|Tail], X) :-
play([45, 45, 111|Tail], X).
% Xoo-XXXXXXXX
play( [A, 111, 111, 45|Tail], X) :-
play([A, 45, 45, 111|Tail], X).
% XXoo-XXXXXXX
play( [A, B, 111, 111, 45|Tail], X) :-
play([A, B, 45, 45, 111|Tail], X).
% XXXoo-XXXXXX
play( [A, B, C, 111, 111, 45|Tail], X) :-
play([A, B, C, 45, 45, 111|Tail], X).
% XXXXoo-XXXXX
play( [A, B, C, D, 111, 111, 45|Tail], X) :-
play([A, B, C, D, 45, 45, 111|Tail], X).
% XXXXXoo-XXXX
play( [A, B, C, D, E, 111, 111, 45|Tail], X) :-
play([A, B, C, D, E, 45, 45, 111|Tail], X).
% XXXXXXoo-XXX
play( [A, B, C, D, E, F, 111, 111, 45|Tail], X) :-
play([A, B, C, D, E, F, 45, 45, 111|Tail], X).
% XXXXXXXoo-XX
play( [A, B, C, D, E, F, G, 111, 111, 45|Tail], X) :-
play([A, B, C, D, E, F, G, 45, 45, 111|Tail], X).
% XXXXXXXXoo-X
play( [A, B, C, D, E, F, G, H, 111, 111, 45|Tail], X) :-
play([A, B, C, D, E, F, G, H, 45, 45, 111|Tail], X).
% XXXXXXXXXoo-
play( [A, B, C, D, E, F, G, H, I, 111, 111, 45], X) :-
play([A, B, C, D, E, F, G, H, I, 45, 45, 111], X).
%%%%%%%%%%%%%
% JUMP LEFT %
%%%%%%%%%%%%%
% -ooXXXXXXXXX
play( [45, 111, 111|Tail]) :-
play([111, 45, 45|Tail]).
% X-ooXXXXXXXX
play( [A, 45, 111, 111|Tail]) :-
play([A, 111, 45, 45|Tail]).
% XX-ooXXXXXXX
play( [A, B, 45, 111, 111|Tail]) :-
play([A, B, 111, 45, 45|Tail]).
% XXX-ooXXXXXX
play( [A, B, C, 45, 111, 111|Tail]) :-
play([A, B, C, 111, 45, 45|Tail]).
% XXXX-ooXXXXX
play( [A, B, C, D, 45, 111, 111|Tail]) :-
play([A, B, C, D, 111, 45, 45|Tail]).
% XXXXX-ooXXXX
play( [A, B, C, D, E, 45, 111, 111|Tail]) :-
play([A, B, C, D, E, 111, 45, 45|Tail]).
% XXXXXX-ooXXX
play( [A, B, C, D, E, F, 45, 111, 111|Tail]) :-
play([A, B, C, D, E, F, 111, 45, 45|Tail]).
% XXXXXXX-ooXX
play( [A, B, C, D, E, F, G, 45, 111, 111|Tail]) :-
play([A, B, C, D, E, F, G, 111, 45, 45|Tail]).
% XXXXXXXX-ooX
play( [A, B, C, D, E, F, G, H, 45, 111, 111|Tail]) :-
play([A, B, C, D, E, F, G, H, 111, 45, 45|Tail]).
% XXXXXXXXX-oo
play( [A, B, C, D, E, F, G, H, I, 45, 111, 111]) :-
play([A, B, C, D, E, F, G, H, I, 111, 45, 45]).
是的,很丑。
但是,当我调用 时findall( Value, play(Game, Value), Values)
,其中 Game 只是 45 和 111 的任意序列(例如 [45, 111, 45, 45, 45, 45, 111, 111, 111, 45, 45, 45]),Values 只是永远与 2 个项目的列表统一(编辑:不正确,它与更多项目统一,请参阅评论)。
据我了解,当我调用 findall/3 时,它会在基本情况谓词中找到一个解决方案(它只计算鹅卵石的数量并将其与 X 统一),然后从其他 20 个游戏谓词中的任何一个中找到一个解决方案,然后就……停下来?
我需要它继续下去,直到找到所有解决方案。为什么它在 2 个解决方案后停止?我怎样才能让它继续?