Prover/G4ip.mod
changeset 96 907b1fff5637
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Prover/G4ip.mod	Thu Mar 15 10:07:28 2012 +0000
@@ -0,0 +1,118 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% An Implementation of G4ip for Terzo
+% 	author: Christian.Urban@cl.cam.ac.uk 
+% 
+% some solvable sample queries:
+%
+% prove (nil |- p imp p).
+% prove (nil |- (p imp p) imp (p imp p)).
+% prove (nil |- ((((p imp q) imp p) imp p) imp q) imp q).
+% prove (nil |- (a imp (b imp c)) imp ((a imp b) imp (a imp c))).
+% prove (nil |- (a or (a imp b)) imp (((a imp b) imp a) imp a)).
+%
+% two non-solvable queries
+%
+% prove (nil |- a or (a imp false)).
+% prove (nil |- ((a imp b) imp a) imp a).
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+module G4ip.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% atomic formulae
+kind form type.
+
+type p form. 
+type q form.
+type a form.
+type b form.
+type c form.
+
+type isatomic form -> o.
+
+isatomic p.
+isatomic q.
+isatomic a.
+isatomic b.
+isatomic c.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% logical operators
+type false  form.
+type and    form -> form -> form.    
+type or     form -> form -> form.       
+type imp    form -> form -> form.
+ 
+infixr and   9.
+infixr or    9.
+infixr imp   9.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% sequent constructor; sequents are of the form: (list |- formula) 
+kind seq type.
+
+type   |-  list form -> form -> seq. 
+infixl |-   4.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% prove predicate; prints "solvable" if seq is provable, otherwise "no" 
+type prove seq -> o.
+
+prove (Gamma |- G) :- ( membNrest P Gamma Gamma',
+                        left (P::Gamma' |- G) );
+                        right   (Gamma  |- G).   
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% rightrules
+type right seq -> o.
+
+right (Gamma |- B and C) :- prove (Gamma |- B),          %% and-R   
+                            prove (Gamma |- C).          
+
+right (Gamma |- B imp C) :- prove (B::Gamma |- C).       %% imp-R
+
+right (Gamma |- B or  C) :- prove (Gamma |- B);          %% or-R 
+                            prove (Gamma |- C).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% leftrules
+type left  seq -> o.
+
+left (false :: Gamma |- G).                              %% false-L
+
+left (A :: Gamma |- A)     :- isatomic A.                %% axiom 
+
+left (B and C::Gamma |- G) :- prove (B::C::Gamma |- G).  %% and-L
+ 
+left (B  or C::Gamma |- G) :- prove (B::Gamma |- G),     %% or-L 
+                              prove (C::Gamma |- G).
+
+
+left (A imp B::Gamma |- G) :-                            %% imp-L1
+	isatomic A, ismember A Gamma, prove (B::Gamma |- G).
+
+left ((B and C) imp D::Gamma |- G) :-                    %% imp-L2
+	prove (B imp (C imp D)::Gamma |- G).
+
+left ((B or  C) imp D::Gamma |- G) :-                    %% imp-L3
+	prove (B imp D::C imp D::Gamma |- G).
+
+left ((B imp C) imp D::Gamma |- G) :-                    %% imp-L4
+	prove (C imp D::Gamma |- B imp C),	                              
+	prove (D::Gamma |- G).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% returns a member and the remainder of a list
+type membNrest     A -> list A -> list A -> o.
+
+membNrest X (X::Rest) Rest.
+membNrest X (Y::Tail) (Y::Rest) :- membNrest X Tail Rest.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% succeeds only once if A is element in the list 
+type ismember     A -> list A -> o.
+
+ismember X (X::Rest) :- !.
+ismember X (Y::Tail) :- ismember X Tail.
+
+