%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 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.