solve(Configuration, []) :- final(Configuration). solve(Configuration, [Move | R]) :- \+marked(Configuration), assert(marked(Configuration)), valid(Configuration, Move, Newconfiguration), solve(Newconfiguration, R). valid([[T | R1], P2, P3], peg1toPeg2, [R1, [T | P2], P3]) :- sorted([T | P2]). valid([[T | R1], P2, P3], peg1toPeg3, [R1, P2, [T | P3]]) :- sorted([T | P3]). valid([P1, [T | R2], P3], peg2toPeg1, [[T | P1], R2, P3]) :- sorted([T | P1]). valid([P1, [T | R2], P3], peg2toPeg3, [P1, R2, [T | P3]]) :- sorted([T | P3]). valid([P1, P2, [T | R3]], peg3toPeg1, [[T | P1], P2, R3]) :- sorted([T | P1]). valid([P1, P2, [T | R3]], 32, [P1, [T | P2], R3]) :- sorted([T | P2]). sorted([]). sorted([_]). sorted([D1, D2 | R]) :- D1 < D2, sorted([D2 | R]). final([[], [], P3]) :- sorted(P3). :- dynamic marked/1.