:- dynamic r/2.
:-op(190,xfx,<==>).
:-op(180,xfx,=>).
:-op(150,fx,~).
:-op(160,xfx,and).
:-op(170,xfx,or).
:-dynamic learned_theorem/2.

thm( [1,2],	A or A  		=> A).
thm( [1,3], 	A 			=> B or A).
thm( [1,4], 	A or B 			=> B or A).
thm( [1,5],	A or (B or C) 		=> B or (A or C)).
thm( [1,6], 	(A => B) 		=> (C or A => C or B)).
thm( X, Y) :- learned_theorem(X,Y).

r( [2,0,1], 	(p => ~p)		=> ~p).
r( [2,0,2], 	q			=> (p => q)).
r( [2,0,3], 	(p => ~q)		=> (q => ~p)).
r( [2,0,4], 	(p => (q => r))		=> (q => (p => r))).
r( [2,0,5], 	(q => r) 		=> ((p => q) => (p => r))).
r( [2,0,6], 	(p => q) 		=> ((q => r) => (p => r))).
r( [2,0,7], 	p			=> p or p).
r( [2,0,8], 	p			=> p).

r( [2,1],	~p			or	p).
r( [2,1,1],	p			or	~p).
r( [2,1,2],	p			=> ~ (~p)).
r( [2,1,3],	p			or	~ (~(~p))).
r( [2,1,4], 	~ (~ p)			=> p).
r( [2,1,5],	(~p => q)		=> (~q => p)).
r( [2,1,6],	(p => q)		=> (~q => ~p)).
r( [2,1,7],	(~q => ~p) 		=> (p => q)).
r( [2,1,8],	(~p => p)		=> p).

r( [2,2],	p			=> p or q).
r( [2,2,1],	~p			=> (p => q)).
r( [2,2,4],	p			=> (~p => q)).
r( [2,2,5],	p			or (p or q => q)).
r( [2,2,6],	~p			or ((p => q) => q)).
r( [2,2,7],	p 			=> ((p => q) => q)).

r( [2,3],	p or (q or r)		=> (p or (r or q))).
r( [2,3,1],	p or (q or r)		=> (p or q) or r).
r( [2,3,2],	(p or q) or r		=> p or (q or r)).
r( [2,3,6],	(q => r)		=> (p or q => r or p)).
r( [2,3,7],	(q => r)		=> (q or p => p or r)).
r( [2,3,8],	(q => r) 		=> (q or p => r or p)).

r( [2,4],	p or (p or q)		=> p or q).
r( [2,4,1],	q or (p or q)		=> p or q).
r( [2,4,2],	~p or (p => q)		=> (p => q)).
r( [2,4,3],	(p => (p => q))		=> (p => q)).
r( [2,4,5],	~(p or q)		=> ~p).
r( [2,4,6],	~(p or q)		=> ~q).
r( [2,4,7],	~(p or q)		=> ~p or q).
r( [2,4,8],	~(p or q) 		=> p or ~q).
r( [2,4,9],	~(p or q)		=> ~p or ~q).

r( [2,5],	~(p => q)		=> (~p => q)).
r( [2,5,1],	~(p => q)		=> (p => ~q)).
r( [2,5,2],	~(p => q)		=> (~p => ~q)).
r( [2,5,2,1],	~(p => q)		=> (q => p)).
r( [2,5,3],	p or q			=> (~p => q)).
r( [2,5,4],	(~p => q)		=> p or q).
r( [2,5,5],	~p			=> (p or q => q)).
r( [2,5,6],	~q			=> (p or q => p)).

r( [2,6],	~p			=> (q => ((p => q) =>q))).
r( [2,6,1],	(p => q)		=> ((~p => q) => q)).
r( [2,6,2],	p or q			=> ((p => q) => q)).
r( [2,6,2,1],	(p => q)		=> (p or q => q)).
r( [2,6,3],	p or q 			=> (~p or q => q)).
r( [2,6,4],	p or q			=> (p or ~q => p)).
r( [2,6,5],	(p => q)		=> ((p => ~q) => ~p)).
r( [2,6,7],	(p or q => q)		=> (p => q)).
r( [2,6,8],	((p => q) => q)		=> p or q).
r( [2,6,9],	((p => q) => q)		=> ((q => p) => p)).

r( [2,7,3],	(p => q)		=> ((p or q) or r => q or r)).
r( [2,7,4],	(q => p)		=> ((p or q) or r => p or r)).
r( [2,7,5],	p or q			=> (p or (q => r) => p or r)).
r( [2,7,6],	(p or (q => r))		=> (p or q => p or r)).
r( [2,7,7],	(p => (q => r))		=> ((p => q) => (p => r))).

r( [2,8],	q or r			=> (~r or s => q or s)).
r( [2,8,1],	(q => (r => s))		=> ( p or q => ((p or r) => (p or s)))).
r( [2,8,2],     ((p or q) or r)         => (((p or ~r) or s) => ((p or q) or s))).
r( [2,8,3], 	(p => (q => r))		=> ((p => (r => s)) => (p => (q => s)))).
r( [2,8,5],	(p or q => p or r)	=> p or (q => r)).
r( [2,8,6],	((p => q) => (p => r))	=> (p => (q => r))). /* corrected by Pfahringer 4-14-89 */

r([3,1], 	(p and q) => ~(~p or ~q)).
r([3,1,1],	~(~p or ~q) => (p and q)).
r([3,1,2],	~p or (~q or (p and q))).
r([3,1,3],	~(p and q) => (~p or ~q)).
r([3,1,4],	(~p or ~q) => ~(p and q)).
r([3,2],	p => (q => (p and q))).
r([3,2,1],	q => (p => (p and q))).
r([3,2,2],	(p and q) => (q and p)).
r([3,2,4],	~(p and ~p)).
r([3,2,6],	(p and q) => p).
r([3,2,7],	(p and q) => q).
r([3,3],	((p and q) => r) => (p => (q => r))).
r([3,3,1],	(p => (q => r)) => ((p and q) => r)).
r([3,3,3],	((p => q) and (q => r)) => (p => r)).
r([3,3,4],	((q => r) and (p => q)) => (p => r)).
r([3,3,5],	(p and (p => q)) => q).
r([3,3,7],	((p and q) => r) => ((p and ~r) => ~q)).
r([3,4],	(p and q) => (p => q)).
r([3,4,1],	(p => r) => ((p and q) => r)).
r([3,4,2],	(q => r) => ((p and q) => r)).
r([3,4,3],	((p => q) and (p => r)) => (p => (q and r))).
r([3,4,4],	((q => p) and (r => p)) => ((q or r) => p)).
r([3,4,5],	(p => q) => ((p and r) => (q and r))).
r([3,4,7],	((p => r) and (q => s)) => ((p and q) => (r and s))).
r([3,4,8],	((p => r) and (q => s)) => ((p or q) => (r or s))).
