? <(a=b). The proof : <(a = b) reduces to : a and proves : <a equals : <b ? >(a=b). The proof : >(a = b) reduces to : b and proves : >a equals : >b ? 1(a b). The proof : 1(a b) reduces to : a and proves : 1(a b) equals : 1(a b) ? 2(a b). The proof : 2(a b) reduces to : b and proves : 2(a b) equals : 2(a b)Here is a proof file "e.prf" containing an example of application of modus ponens on equalities :
! AE ^x (E x x = [*]) ! A1 (E a b c = E a b d) ! A2 (a = b) $( AE a c ; E a A2 c ; A1 ; E a A2 d ; AE a d )We use a word E with the axiom AE : "^x (E x x = [*]" saying that for all x, E x x = {*], or for all x and y, E x x y = y. The implication a = b => c = d is written "E a b c = E a b d" (axiom A1). If we also have a = b (axiom A2) we can deduce c = d by the proof "$( AE a c ; E a A2 c ; A1 ; E a A2 d ; AE a d )" :
$ ./pl-v8 e.prf The proof : @([@([@([$( ( ( ( ''* a c ; E a * c ) ; '* ) ; E a * d ) ; ''* a d )] (a = b))] (E a b c = E a b d))] [E * * = [*]]) proves : c equals : dWith Proof Logic v8, we can define a schema of modus ponens application on equalities like in the proof file "e-v8.prf" :
! AE ^x (E x x = [*]) ! MP ^pA1 ^pA2 $( AE <pA2 2<pA1 ; E <pA2 pA2 2<pA1 ; pA1 ; E <pA2 pA2 2>pA1 ; AE <pA2 2>pA1 ) ! A1 (E a b c = E a b d) ! A2 (a = b) (MP A1 A2)It gives the same result as e.prf :
$ ./pl-v8 e-v8.prf The proof : @([@([@([@([''* '* *] (a = b))] (E a b c = E a b d))] [[$( ( ( ( ''* <* 2<'* ; E <* * 2<'* ) ; '* ) ; E <* * 2>'* ) ; ''* <* 2>'* )]])] [E * * = [*]]) proves : c equals : d
Example :
& axiom1 (foo = bar). & axiom2 (foo = baz). axiom1 ; axiom2.Result :
$ ./pl-v8 named-proofs.prf The proof : axiom1 proves : foo equals : bar The proof : axiom2 proves : foo equals : baz The proof : axiom1 ; axiom2 proves : bar equals : bazOther example :
& axiom_parent [parent * (mother *) = true]. & axiom_child (child = ^x ^y (parent y x)). & axiom_mother_Anthony (mother Anthony = Brenda). ( $(axiom_child Brenda Anthony) ; parent Anthony axiom_mother_Anthony ; $(axiom_parent Anthony) ).Result :
$ ./pl-v8 tuto-v8.prf The proof : axiom_parent proves : [parent * (mother *)] equals : [true] The proof : axiom_child proves : child equals : [[parent * '*]] The proof : axiom_mother_Anthony proves : mother Anthony equals : Brenda The proof : ( $(axiom_child Brenda Anthony) ; parent Anthony axiom_mother_Anthony ) ; $(axiom_parent Anthony) proves : child Brenda Anthony equals : trueThe examples of this document can be rewritten with named proofs, replacing "! x y" by "& x y."
Previous version :
! gpRule1 ^x ^y ^z ((parent x y : parent y z : grandparent x z) = [*]) ! gpAxiom1 ((parent allan brenda) = [*]) ! gpAxiom2 ((parent brenda charles) = [*]) ! gpTheorem1 ( grandparent allan charles ; gpAxiom2 (grandparent allan charles) ; gpAxiom1 (parent brenda charles (grandparent allan charles)) ; gpRule1 allan brenda charles ) gpTheorem1Rewritten version grandparent-v8.prf :
& gpRule1 ^x ^y ^z ((parent x y : parent y z : grandparent x z) = [*]). & gpAxiom1 (parent allan brenda = [*]). & gpAxiom2 (parent brenda charles = [*]). $( grandparent allan charles ; gpAxiom2 (grandparent allan charles) ; gpAxiom1 (parent brenda charles (grandparent allan charles)) ; gpRule1 allan brenda charles )Result :
$ ./pl-v8 grandparent-v8.prf The proof : gpRule1 proves : [[[parent ''* '* (parent '* * (grandparent ''* *))]]] equals : [[[[*]]]] The proof : gpAxiom1 proves : parent allan brenda equals : [*] The proof : gpAxiom2 proves : parent brenda charles equals : [*] The proof : $( ( ( grandparent allan charles ; gpAxiom2 (grandparent allan charles) ) ; gpAxiom1 (parent brenda charles (grandparent allan charles)) ) ; gpRule1 allan brenda charles ) proves : grandparent allan charles equals : [*]skk-v8.prf :
& DI (I = ^a a). & DK (K = ^a ^b a). & DS (S = ^a ^b ^c (a c (b c))). ( DS DK DK ; DI ).Result :
$ ./pl-v8 skk-v8.prf The proof : DI proves : I equals : [*] The proof : DK proves : K equals : [['*]] The proof : DS proves : S equals : [[[''* * ('* *)]]] The proof : DS DK DK ; DI proves : S K K equals : ISometimes, a reduction operator like $ or @ must be added, for example with this proof :
# Proof of p => p # Axioms ! MP ^p ^q ((imp p q) (p q) = [*]) ! AK ^p ^q (imp p (imp q p) = [*]) ! AS ^p ^q ^r (imp (imp p (imp q r)) (imp (imp p q) (imp p r)) = [*]) # Proof ! lemma1 (AS p (imp p p) p) ! lemma2 (AK p (imp p p)) ! lemma3 (MP (imp p (imp (imp p p) p)) (imp (imp p (imp p p)) (imp p p))) ! lemma4 ( lemma1 ( (imp p (imp (imp p p) p)) (imp (imp p (imp p p)) (imp p p)) ) ) ! lemma5 ( lemma4 ; lemma3 ) ! lemma6 ( lemma2 (imp (imp p (imp p p)) (imp p p) ) ) ! lemma7 ( lemma6 ; lemma5 ) ! lemma8 (AK p p) ! lemma9 (MP (imp p (imp p p)) (imp p p) ) ! lemma10 (lemma7 ((imp p (imp p p)) (imp p p))) ! lemma11 ( lemma10 ; lemma9 ) ! lemma12 (lemma8 (imp p p)) ! theorem1 ( imp p p ; lemma12 ; lemma11 ) theorem1This proof can be rewritten with named proofs, adding operator "$" :
# Proof of p => p # Axioms & MP ^p ^q ((imp p q) (p q) = [*]). & AK ^p ^q (imp p (imp q p) = [*]. & AS ^p ^q ^r (imp (imp p (imp q r)) (imp (imp p q) (imp p r)) = [*]). # Proof & lemma1 $ (AS p (imp p p) p). & lemma2 $ (AK p (imp p p)). & lemma3 $ (MP (imp p (imp (imp p p) p)) (imp (imp p (imp p p)) (imp p p))). & lemma4 $ ( lemma1 ( (imp p (imp (imp p p) p)) (imp (imp p (imp p p)) (imp p p)) ) ). & lemma5 $ ( lemma4 ; lemma3 ). & lemma6 $ ( lemma2 (imp (imp p (imp p p)) (imp p p) ) ). & lemma7 $ ( lemma6 ; lemma5 ). & lemma8 $ (AK p p). & lemma9 $ (MP (imp p (imp p p)) (imp p p) ). & lemma10 $ (lemma7 ((imp p (imp p p)) (imp p p))). & lemma11 $ ( lemma10 ; lemma9 ). & lemma12 $ (lemma8 (imp p p)). & theorem1 $ ( imp p p ; lemma12 ; lemma11 ). theorem1.Result :
$ ./pl-v8 prop-v8-a.prf The proof : MP proves : [[imp '* * ('* *)]] equals : [[[*]]] The proof : AK proves : [[imp '* (imp * '*)]] equals : [[[*]]] The proof : AS proves : [[[imp (imp ''* (imp '* *)) (imp (imp ''* '*) (imp ''* *))]]] equals : [[[[*]]]] The proof : lemma1 proves : imp (imp p (imp (imp p p) p)) (imp (imp p (imp p p)) (imp p p)) equals : [*] The proof : lemma2 proves : imp p (imp (imp p p) p) equals : [*] The proof : lemma3 proves : imp (imp p (imp (imp p p) p)) (imp (imp p (imp p p)) (imp p p)) (imp p (imp (imp p p) p) (imp (imp p (imp p p)) (imp p p))) equals : [*] The proof : lemma4 proves : imp (imp p (imp (imp p p) p)) (imp (imp p (imp p p)) (imp p p)) (imp p (imp (imp p p) p) (imp (imp p (imp p p)) (imp p p))) equals : imp p (imp (imp p p) p) (imp (imp p (imp p p)) (imp p p)) The proof : lemma5 proves : imp p (imp (imp p p) p) (imp (imp p (imp p p)) (imp p p)) equals : [*] The proof : lemma6 proves : imp p (imp (imp p p) p) (imp (imp p (imp p p)) (imp p p)) equals : imp (imp p (imp p p)) (imp p p) The proof : lemma7 proves : imp (imp p (imp p p)) (imp p p) equals : [*] The proof : lemma8 proves : imp p (imp p p) equals : [*] The proof : lemma9 proves : imp (imp p (imp p p)) (imp p p) (imp p (imp p p) (imp p p)) equals : [*] The proof : lemma10 proves : imp (imp p (imp p p)) (imp p p) (imp p (imp p p) (imp p p)) equals : imp p (imp p p) (imp p p) The proof : lemma11 proves : imp p (imp p p) (imp p p) equals : [*] The proof : lemma12 proves : imp p (imp p p) (imp p p) equals : imp p p The proof : theorem1 proves : imp p p equals : [*] The proof : theorem1 proves : imp p p equals : [*]It can also be rewritten adding operator "@" :
# Proof of p => p # Axioms & MP ^p ^q ((imp p q) (p q) = [*]). & AK ^p ^q (imp p (imp q p) = [*]. & AS ^p ^q ^r (imp (imp p (imp q r)) (imp (imp p q) (imp p r)) = [*]). # Proof & lemma1 @ (AS p (imp p p) p). & lemma2 @ (AK p (imp p p)). & lemma3 @ (MP (imp p (imp (imp p p) p)) (imp (imp p (imp p p)) (imp p p))). & lemma4 @ ( lemma1 ( (imp p (imp (imp p p) p)) (imp (imp p (imp p p)) (imp p p)) ) ). & lemma5 @ ( lemma4 ; lemma3 ). & lemma6 @ ( lemma2 (imp (imp p (imp p p)) (imp p p) ) ). & lemma7 @ ( lemma6 ; lemma5 ). & lemma8 @ (AK p p). & lemma9 @ (MP (imp p (imp p p)) (imp p p) ). & lemma10 @ (lemma7 ((imp p (imp p p)) (imp p p))). & lemma11 @ ( lemma10 ; lemma9 ). & lemma12 @ (lemma8 (imp p p)). & theorem1 @ ( imp p p ; lemma12 ; lemma11 ). theorem1.The result is the same :
$ ./pl-v8 prop-v8-b.prf The proof : MP proves : [[imp '* * ('* *)]] equals : [[[*]]] The proof : AK proves : [[imp '* (imp * '*)]] equals : [[[*]]] The proof : AS proves : [[[imp (imp ''* (imp '* *)) (imp (imp ''* '*) (imp ''* *))]]] equals : [[[[*]]]] The proof : lemma1 proves : imp (imp p (imp (imp p p) p)) (imp (imp p (imp p p)) (imp p p)) equals : [*] The proof : lemma2 proves : imp p (imp (imp p p) p) equals : [*] The proof : lemma3 proves : imp (imp p (imp (imp p p) p)) (imp (imp p (imp p p)) (imp p p)) (imp p (imp (imp p p) p) (imp (imp p (imp p p)) (imp p p))) equals : [*] The proof : lemma4 proves : imp (imp p (imp (imp p p) p)) (imp (imp p (imp p p)) (imp p p)) (imp p (imp (imp p p) p) (imp (imp p (imp p p)) (imp p p))) equals : [*] (imp p (imp (imp p p) p) (imp (imp p (imp p p)) (imp p p))) The proof : lemma5 proves : [*] (imp p (imp (imp p p) p) (imp (imp p (imp p p)) (imp p p))) equals : [*] The proof : lemma6 proves : imp p (imp (imp p p) p) (imp (imp p (imp p p)) (imp p p)) equals : [*] (imp (imp p (imp p p)) (imp p p)) The proof : lemma7 proves : [*] (imp (imp p (imp p p)) (imp p p)) equals : [*] The proof : lemma8 proves : imp p (imp p p) equals : [*] The proof : lemma9 proves : imp (imp p (imp p p)) (imp p p) (imp p (imp p p) (imp p p)) equals : [*] The proof : lemma10 proves : [*] (imp (imp p (imp p p)) (imp p p)) (imp p (imp p p) (imp p p)) equals : [*] (imp p (imp p p) (imp p p)) The proof : lemma11 proves : [*] (imp p (imp p p) (imp p p)) equals : [*] The proof : lemma12 proves : imp p (imp p p) (imp p p) equals : [*] (imp p p) The proof : theorem1 proves : imp p p equals : [*] The proof : theorem1 proves : imp p p equals : [*]
Left of x is : ... Right of x is : ...For example with the proof file prop-v8-c.prf :
# Proof of p => p # Axioms & MP ^p ^q ((imp p q) (p q) = [*]). & AK ^p ^q (imp p (imp q p) = [*]. & AS ^p ^q ^r (imp (imp p (imp q r)) (imp (imp p q) (imp p r)) = [*]). # Proof & lemma1 $ (AS p (imp p p) p). & lemma2 $ (AK p (imp p p)). & lemma3 $ (MP (imp p (imp (imp p p) p)) (imp (imp p (imp p p)) (imp p p))). & lemma4 $ ( lemma1 ( (imp p (imp (imp p p) p)) (imp (imp p (imp p p)) (imp p p)) ) ). & lemma5 $ ( lemma4 ; lemma3 ). & lemma6 $ ( lemma2 (imp (imp p (imp p p)) (imp p p) ) ). & lemma7 $ ( lemma6 ; lemma5 ). & lemma8 $ (AK p p). & lemma9 $ (MP (imp p (imp p p)) (imp p p) ). & lemma10 $ (lemma7 ((imp p (imp p p)) (imp p p))). & lemma11 $ ( lemma10 ; lemma9 ). & lemma12 $ (lemma8 (imp p p)). & theorem1 $ ( imp p p ; lemma12 ; lemma11 ). ? theorem1 theorem1.we get this result :
$ ./pl-v8 -q prop-v8-c.prf Left of theorem1 is : imp p p Right of theorem1 is : [*]