declare % Returns the list of solutions of Script given by a lazy % depth-first exploration fun {Solve Script} {SolveStep {Space.new Script} nil} end % Returns the list of solutions of S appended with SolTail fun {SolveStep S SolTail} case {Space.ask S} of failed then SolTail [] succeeded then {Space.merge S}|SolTail [] alternatives(N) then {SolveLoop S 1 N SolTail} end end % Lazily explores the alternatives I through N of space S, % and returns the list of solutions found, appended with % SolTail fun lazy {SolveLoop S I N SolTail} if I>N then SolTail elseif I==N then {Space.commit S I} {SolveStep S SolTail} else C={Space.clone S} NewTail={SolveLoop S I+1 N SolTail} in {Space.commit C I} {SolveStep C NewTail} end end