% Source: http://www.cs.kuleuven.ac.be/~dtai/prototypes/dppd/memo-solve.html
memo_solve([],MemoList).
memo_solve([Head|Tail],MemoList) :-
	\+(member(Head,MemoList)),
	claus(Head,Body),
	memo_solve(Body,[Head|MemoList]),
	memo_solve(Tail,MemoList).

member(X,[X|T]).
member(X,[Y|T]) :- member(X,T).

claus(member(X,[X|T]),[]).
claus(member(X,[Y|T]),[member(X,T)]).

claus(inboth(X,L1,L2),[member(X,L1),member(X,L2)]).

claus(app([],L,L),[]).
claus(app([H|X],Y,[H|Z]),[app(X,Y,Z)]).

claus(delete(X,[X|T],T),[]).
claus(delete(X,[Y|T],[Y|D]),[delete(X,T,D)]).

claus(test(A,L1,L2,Res),
	[inboth(A,L1,L2),delete(A,L1,D1),app(D1,L2,Res)]).
