prove(true).
prove((P,Q)) :- prove(P), prove(Q).

prove(P) :- 
    clause((P :- Q)),
    (cut_split(Q,Before,After)
        -> (prove(Before), !, prove(After))
        ;  prove(Q) ).

cut_split((!), true, true).
cut_split((P,Q), Before, (After,Q)) :- 
    cut_split(P, Before, After).
cut_split((P,Q), (P,Before), After) :-
    cut_split(Q, Before, After).



clause((mem2(A, [A|Rest]) :- !)).
clause((mem2(A, [B|Rest]) :- mem2(A, Rest))).

clause((member(A, [A|Rest]) :- true)).
clause((member(A, [B|Rest]) :- member(A, Rest))).


