I'm trying to solve this Pebble Solitaire problem, and this is part of my code:
% 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]).
Yeah, it's ugly.
However, when I call findall( Value, play(Game, Value), Values)
, where Game is just any sequence of 45 and 111 (for example [45, 111, 45, 45, 45, 45, 111, 111, 111, 45, 45, 45]), Values is only ever unified with a list of 2 items (EDIT: Not true, it unifies with more items, see comments).
From what I understand, when I call findall/3, it finds one solution in the base case predicate (which just counts the amount of pebbles and unifies it with X), and then one solution from any one of the 20 other play predicates, and then just... stops?
I need it to keep going until all solutions have been found. Why does it stop after 2 solutions? How can I make it continue?