goal(state([], r, Rs)) :- setEquals(Rs, [rw, ld, nr]). successor(state([L|Ls], l, Rs), row(X, right), state(NewL, r, NewR)) :- setMember(X, [L|Ls]), setDelete(X, [L|Ls], NewL), setInsert(X, Rs, NewR), legal(NewL). successor(state(Ls, r, [R|Rs]), row(X, left), state(NewL, l, NewR)) :- setMember(X, [R|Rs]), setDelete(X, [R|Rs], NewR), setInsert(X, Ls, NewL), legal(NewR). successor(state(Ls, l, Rs), row(empty, right), state(Ls, r, Rs)) :- legal(Ls). successor(state(Ls, r, Rs), row(empty, left), state(Ls, l, Rs)) :- legal(Rs). legal(Xs) :- \+ (setMember(rw, Xs), setMember(ld, Xs)), \+ (setMember(ld, Xs), setMember(nr, Xs)). sameState(state(L1s, B, R1s), state(L2s, B, R2s)) :- setEquals(L1s, L2s), setEquals(R1s, R2s).