The core program in Prolog:
% pr(P,G): Prove G from premisse set P
pr(X, -(-G)) :- pr(X,G), !.
pr(X,F => G) :- append(X,[F],X1), pr(X1,G),!.
pr(X,F v G) :- append(X,[-(F)],X1), pr(X1,G), !.
pr(X,F & G) :- pr(X,F), !, pr(X,G), !.
pr(X,-(F & G)) :- append(X,[F],X1), pr(X1,-(G)), !.
pr(X,-(F v G)) :- pr(X,-(F)), !, pr(X, -(G)), !.
pr(X,-(F=> G)) :- pr(X,F), !, pr(X, -(G)), !.
pr(X,F<=>G) :- pr(X,F=>G), !, pr(X,G=>F), !.
pr(X,-(F<=>G)) :- append(X,[F=>G],X1), pr(X1,-(G=>F)), !.
% Terminating conditions
pr(X,F) :- memberchk(F,X), !.
pr(X,_) :- member(F,X), member(-F,X), !.
pr(X,_) :- member(-F,X), member(F,X), !.
pr(X,Y) :- pick(-(-F),X,X1,X2), append(X1,[F|X2],Z), pr(Z,Y), !.
pr(X,Y) :- pick(F & G,X,X1,X2), append(X1,[F|[G|X2]],Z), pr(Z,Y),!.
pr(X,Y) :- pick(-(F v G),X,X1,X2), append(X1,[-(F)|[-(G)|X2]],Z), pr(Z,Y),!.
pr(X,Y) :- pick(F<=>G,X,X1,X2), append(X1,[F=>G|[G=>F|X2]],Z), pr(Z,Y),!.
pr(X,Y) :- pick(-(F<=>G),X,X1,X2), append(X1,[-(F=>G)|[-(G=>F)|X2]],Z), pr(Z,Y),!.
pr(X,Y) :- pick(-(F=> G),X,X1,X2), append(X1,[F|[-(G)|X2]],Z), pr(Z,Y),!.
pr(X,Y) :- pick(-(F & G),X,X1,X2), append(X1,[-F|X2],Z1),
append(X1,[-G|X2],Z2), pr(Z1,Y), !, pr(Z2,Y), !.
pr(X,Y) :- pick(F v G,X,X1,X2), append(X1,[F|X2],Z1),
append(X1,[G|X2],Z2), pr(Z1,Y), !, pr(Z2,Y), !.
pr(X,Y) :- pick(F =>G,X,X1,X2), append(X1,[-(F)|X2],Z1),
append(X1,[G|X2],Z2), pr(Z1,Y), !, pr(Z2,Y), !.
% pick(+E,+L,-H,-T)
% removes element E from list L and returns the head before
% the element and the tail after the element
pick(H,[H|T],[],T) :- !.
pick(H,[E|T],[E|L1],L2) :- pick(H,T,L1,L2), !.
|