diff --git a/src/main/scala/lisa/kernel/proof/SCProofChecker.scala b/src/main/scala/lisa/kernel/proof/SCProofChecker.scala index bb475952dff29893a69c8f56eb2d8b72469f5868..372699abbe43d3a6f84c9d4e505cfc843ca599d2 100644 --- a/src/main/scala/lisa/kernel/proof/SCProofChecker.scala +++ b/src/main/scala/lisa/kernel/proof/SCProofChecker.scala @@ -1,7 +1,8 @@ package lisa.kernel.proof -import lisa.kernel.fol.FOL._ -import lisa.kernel.proof.SequentCalculus._ +import lisa.kernel.Printer +import lisa.kernel.fol.FOL.* +import lisa.kernel.proof.SequentCalculus.* object SCProofChecker { @@ -27,9 +28,9 @@ object SCProofChecker { val r: (Boolean, List[Int], String) = if (false_premise.nonEmpty) - return (false, Nil, "A step can't refer to a step with a higher or equal number as a premise.") + return (false, Nil, s"Step no $no can't refer to higher number ${false_premise.get} as a premise.") if (false_premise2.nonEmpty) - return (false, Nil, "A step can't refer to a step with a lower number than minus the number of imports.") + return (false, Nil, s"A step can't refer to step ${false_premise2.get}, imports only contains ${importsSize.get} elements.") else step match { /* * Γ |- Δ @@ -57,8 +58,8 @@ object SCProofChecker { case Cut(b, t1, t2, phi) => if (isSameSet(b.left + phi, ref(t1).left union ref(t2).left)) if (isSameSet(b.right + phi, ref(t2).right union ref(t1).right)) - if (ref(t2).left.contains(phi)) - if (ref(t1).right.contains(phi)) + if (contains(ref(t2).left, phi)) + if (contains(ref(t1).right, phi)) (true, Nil, "") else (false, Nil, s"Right-hand side of first premise does not contain φ as claimed.") else (false, Nil, s"Left-hand side of second premise does not contain φ as claimed.") @@ -322,7 +323,7 @@ object SCProofChecker { phi match { case PredicateFormula(`equality`, Seq(left, right)) => if (isSame(left, right)) - if (b.right.contains(phi)) + if (contains(b.right, phi)) (true, Nil, "") else (false, Nil, s"Right-Hand side of conclusion does not contain φ") else (false, Nil, s"φ is not an instance of reflexivity.") diff --git a/src/main/scala/proven/ElementsOfSetTheory.scala b/src/main/scala/proven/ElementsOfSetTheory.scala index a1bf44ded463ff24e926edbab8169cf12ee40eae..532affc320fa833ab89d643aa76a76450ef347ed 100644 --- a/src/main/scala/proven/ElementsOfSetTheory.scala +++ b/src/main/scala/proven/ElementsOfSetTheory.scala @@ -2,11 +2,13 @@ package proven import lisa.kernel.fol.FOL.* import lisa.kernel.proof.SequentCalculus.* import lisa.KernelHelpers.{*, given} +import lisa.kernel.Printer import proven.tactics.ProofTactics.* import proven.tactics.Destructors.* import lisa.settheory.AxiomaticSetTheory.* + import scala.collection.immutable.SortedSet -import lisa.kernel.proof.SCProof +import lisa.kernel.proof.{SCProof, SCProofChecker} import scala.collection.immutable @@ -64,25 +66,25 @@ object ElementsOfSetTheory { val pxy = pair(x, y) val pxy1 = pair(x1, y1) val zexy = (z === x) \/ (z === y) - val p0 = SCSubproof { + val p0 = SCSubproof({ val p0 = SCSubproof({ val zf = in(z, pxy) val p1_0 = hypothesis(zf) val p1_1 = RightImplies(emptySeq +> (zf ==> zf), 0, zf, zf) val p1_2 = RightIff(emptySeq +> (zf <=> zf), 1, 1, zf, zf) // |- (z in {x,y} <=> z in {x,y}) val p1_3 = RightSubstEq(emptySeq +< (pxy === pxy1) +> (zf <=> in(z, pxy1)), 2, pxy, pxy1, zf <=> in(z, g()), g) - SCProof(p1_0, p1_1, p1_2, p1_3) - }, display = false) // ({x,y}={x',y'}) |- ((z∈{x,y})↔(z∈{x',y'})) + SCProof(IndexedSeq(p1_0, p1_1, p1_2, p1_3), IndexedSeq(()|-pairAxiom)) + }, Seq(-1), display = true) // ({x,y}={x',y'}) |- ((z∈{x,y})↔(z∈{x',y'})) val p1 = SCSubproof({ val p1_0 = Rewrite(()|-pairAxiom, -1) // |- ∀∀∀((z$1∈{x$3,y$2})↔((x$3=z$1)∨(y$2=z$1))) val p1_1 = instantiateForall(SCProof(IndexedSeq(p1_0), IndexedSeq(()|-pairAxiom)), x, y, z) p1_1 - }, display = false) // |- (z in {x,y}) <=> (z=x \/ z=y) + }, Seq(-1), display = true) // |- (z in {x,y}) <=> (z=x \/ z=y) val p2 = SCSubproof({ val p2_0 = Rewrite(()|-pairAxiom, -1) // |- ∀∀∀((z$1∈{x$3,y$2})↔((x$3=z$1)∨(y$2=z$1))) val p2_1 = instantiateForall(SCProof(IndexedSeq(p2_0), IndexedSeq(()|-pairAxiom)), x1, y1, z) p2_1 - }, display = false) // |- (z in {x',y'}) <=> (z=x' \/ z=y') + }, Seq(-1), display = true) // |- (z in {x',y'}) <=> (z=x' \/ z=y') val p3 = RightSubstEq( emptySeq +< (pxy === pxy1) +> (in(z, pxy1) <=> ((z === x) \/ (z === y))), 1, pxy, pxy1, in(z, g()) <=> ((z === x) \/ (z === y)), g ) // ({x,y}={x',y'}) |- ((z∈{x',y'})↔((z=x)∨(z=y))) @@ -95,8 +97,8 @@ object ElementsOfSetTheory { h ) // ((z∈{x',y'})↔((x'=z)∨(y'=z))), ({x,y}={x',y'}) |- (((z=x)∨(z=y))↔((z=x')∨(z=y'))) val p5 = Cut(emptySeq ++< p3.bot ++> p4.bot, 2, 4, p2.bot.right.head) - SCProof(p0, p1, p2, p3, p4, p5) - } // ({x,y}={x',y'}) |- (((z=x)∨(z=y))↔((z=x')∨(z=y'))) + SCProof(IndexedSeq(p0, p1, p2, p3, p4, p5), IndexedSeq(()|-pairAxiom)) + }, Seq(-1)) // ({x,y}={x',y'}) |- (((z=x)∨(z=y))↔((z=x')∨(z=y'))) val p1 = SCSubproof( SCProof(byCase(x === x1)( @@ -181,9 +183,9 @@ object ElementsOfSetTheory { val rd0_1_1 = instantiateForall(SCProof(IndexedSeq(pd0_1_0), IndexedSeq(pd0_m1.bot)), x1) // ({x,y}={x',y'}) |- (x'=x \/ x'=y) <=> (x'=x' \/ x'=y') rd0_1_1 }, IndexedSeq(-1)) // ({x,y}={x',y'}) |- (x'=x \/ x'=y) <=> (x'=x' \/ x'=y') - val rd0_2 = byEquiv(pd0_1.bot.right.head, pd0_0.bot.right.head)(pd0_1, pd0_0) - val pd0_3 = SCSubproof(SCProof(rd0_2.steps, IndexedSeq(pd0_m1.bot)), IndexedSeq(-1)) // ({x,y}={x',y'}) |- (x=x' \/ y=x') - destructRightOr(SCProof(IndexedSeq(pd0_0, pd0_1, pd0_3), IndexedSeq(pd0_m1.bot)), x === x1, y === x1) // ({x,y}={x',y'}) |- x=x', y=x' + val pd0_2 = RightSubstIff(pd0_1.bot.right |- ((x1===x) \/ (x1===y)), 0,(x1===x) \/ (x1===y), (x1===x1) \/ (x1===y1),SchematicPredicateLabel("h", 0)(), SchematicPredicateLabel("h", 0) ) // (x'=x \/ x'=y) <=> (x'=x' \/ x'=y') |- (x'=x \/ x'=y) + val pd0_3 = Cut(pd0_1.bot.left |- pd0_2.bot.right, 1,2, pd0_1.bot.right.head) // ({x,y}={x',y'}) |- (x=x' \/ y=x') + destructRightOr(SCProof(IndexedSeq(pd0_0, pd0_1, pd0_2, pd0_3), IndexedSeq(pd0_m1.bot)), x === x1, y === x1) // ({x,y}={x',y'}) |- x=x', y=x' }, IndexedSeq(-1)) // ({x,y}={x',y'}) |- x=x', y=x' -- val pd1 = SCSubproof({ val pd1_m1 = pdm1 @@ -213,7 +215,7 @@ object ElementsOfSetTheory { ) // ({x,y}={x',y'}) |- (x=x' /\ y=y')\/(x=y' /\ y=x') val p2 = RightImplies(emptySeq +> (p1.bot.left.head ==> p1.bot.right.head), 1, p1.bot.left.head, p1.bot.right.head) // |- ({x,y}={x',y'}) ==> (x=x' /\ y=y')\/(x=y' /\ y=x') - generalizeToForall(SCProof(p0, p1, p2), x, y, x1, y1) + generalizeToForall(SCProof(IndexedSeq(p0, p1, p2), IndexedSeq(()|-pairAxiom)), x, y, x1, y1) } // |- ∀∀∀∀(({x$4,y$3}={x'$2,y'$1})⇒(((y'$1=y$3)∧(x'$2=x$4))∨((x$4=y'$1)∧(y$3=x'$2)))) diff --git a/src/main/scala/proven/tactics/Destructors.scala b/src/main/scala/proven/tactics/Destructors.scala index 12c080e88a76dbc8b29650611122900c1e9ca9ea..9bec6109136a16befdc89f2278ef76cc0c44a78f 100644 --- a/src/main/scala/proven/tactics/Destructors.scala +++ b/src/main/scala/proven/tactics/Destructors.scala @@ -8,11 +8,12 @@ import lisa.kernel.proof.SCProof object Destructors { def destructRightOr(p: SCProof, a: Formula, b: Formula): SCProof = { - require(contains(p.conclusion.right, a \/ b)) + val mat = p.conclusion.right.find(f => isSame(f, a \/ b)) + require(mat.nonEmpty) val p0 = hypothesis(a) val p1 = hypothesis(b) val p2 = LeftOr(emptySeq +< (a \/ b) +> a +> b, Seq(p.length, p.length + 1), Seq(a, b)) - val p3 = Cut(p.conclusion -> (a \/ b) +> a +> b, p.length - 1, p.length + 2, a \/ b) + val p3 = Cut(p.conclusion -> mat.get +> a +> b, p.length - 1, p.length + 2, a \/ b) p withNewSteps IndexedSeq(p0, p1, p2, p3) } def destructRightAnd(p: SCProof, f: Formula, g: Formula): SCProof = { diff --git a/src/main/scala/proven/tactics/ProofTactics.scala b/src/main/scala/proven/tactics/ProofTactics.scala index 85c576fc716c2b8d25dcabfb14bb22f54eb81590..d7d087186f71eb88c570d1867910f595e36e56ae 100644 --- a/src/main/scala/proven/tactics/ProofTactics.scala +++ b/src/main/scala/proven/tactics/ProofTactics.scala @@ -81,7 +81,6 @@ object ProofTactics { val fo = forall(x, prev._2) (prev._1 appended RightForall(emptySeq +> fo, prev._3, prev._2, x), fo, prev._3 + 1) }) - //val p6 = MakeFunctionDefinition(fdef._1.size - 1, f, args, x, x === t) SCProof(fdef._1 ) } // p1 is a proof of psi given phi, p2 is a proof of psi given !phi diff --git a/src/test/scala/lisa/kernel/FolTests.scala b/src/test/scala/lisa/kernel/FolTests.scala index c5f3b6f3de7543c1f47ddf7a4fe628919259232e..70ae8ea2502c808468a7b060682388a4385ac71d 100644 --- a/src/test/scala/lisa/kernel/FolTests.scala +++ b/src/test/scala/lisa/kernel/FolTests.scala @@ -120,7 +120,7 @@ class FolTests extends AnyFunSuite { test("Fresh variables should be fresh") { val y1 = VariableLabel(freshId(equ(VariableTerm(x), VariableTerm(x)).freeVariables.map(_.name), x.name)) - //println(x1, y1) + assert(!isSame(x, y1)) } } \ No newline at end of file diff --git a/src/test/scala/lisa/proven/ElementsOfSetTheoryTests.scala b/src/test/scala/lisa/proven/ElementsOfSetTheoryTests.scala index efdbd45fa6a0d46617264e4882f3eaaa7b6b95f0..413c19c457c0175e9a637499a1d8360ada471d70 100644 --- a/src/test/scala/lisa/proven/ElementsOfSetTheoryTests.scala +++ b/src/test/scala/lisa/proven/ElementsOfSetTheoryTests.scala @@ -5,13 +5,14 @@ import lisa.settheory.AxiomaticSetTheory.* import test.ProofCheckerSuite import proven.tactics.ProofTactics import lisa.kernel.proof.SCProof +import proven.ElementsOfSetTheory.* +import lisa.kernel.proof.SequentCalculus.Sequent +import lisa.kernel.fol.FOL.* +import lisa.KernelHelpers.{*, given} +import lisa.kernel.proof.SequentCalculus.* class ElementsOfSetTheoryTests extends ProofCheckerSuite { - import proven.ElementsOfSetTheory.* - import lisa.kernel.proof.SequentCalculus.Sequent - import lisa.kernel.fol.FOL.* - import lisa.KernelHelpers.{*, given} - import lisa.kernel.proof.SequentCalculus.* + test("Verification of the proof of symmetry of the pair") { checkProof(proofUnorderedPairSymmetry, emptySeq +> forall(vl, forall(ul, pair(u, v) === pair(v, u)))) @@ -20,7 +21,7 @@ class ElementsOfSetTheoryTests extends ProofCheckerSuite { test("Verification of the proof of deconstruction of the unordered pair") { checkProof(proofUnorderedPairDeconstruction, emptySeq +> forall(sl, forall(tl, forall(ul, forall(vl, - (pair(s, t) === pair(xp, v)) ==> + (pair(s, t) === pair(u, v)) ==> (((VariableTerm(v) === t) /\ (VariableTerm(u) === s)) \/ ((VariableTerm(s) === v) /\ (VariableTerm(t) === u))))))) ) } @@ -29,11 +30,11 @@ class ElementsOfSetTheoryTests extends ProofCheckerSuite { val singletonSetEqualityProof: SCProof = { val t0 = SCSubproof({ val t0 = Rewrite(()|-pairAxiom, -1) - val p0 = ProofTactics.instantiateForall(SCProof(IndexedSeq(t0), IndexedSeq(()|-pairAxiom)), t0.bot.right.head, y) - val p1 = ProofTactics.instantiateForall(p0, p0.conclusion.right.head, y) - val p2:SCProof = ProofTactics.instantiateForall(p1, p1.conclusion.right.head, x) + val p0 = ProofTactics.instantiateForall(SCProof(IndexedSeq(t0), IndexedSeq(()|-pairAxiom)), t0.bot.right.head, v) + val p1 = ProofTactics.instantiateForall(p0, p0.conclusion.right.head, v) + val p2:SCProof = ProofTactics.instantiateForall(p1, p1.conclusion.right.head, u) p2 - } ) + }, IndexedSeq(-1), display=false ) // |- f <=> (f \/ f) def selfIffOr(f: Formula): SCSubproof = SCSubproof({ @@ -44,33 +45,26 @@ class ElementsOfSetTheoryTests extends ProofCheckerSuite { val t4 = RightImplies(Sequent(Set(), Set((f \/ f) ==> f)), 2, f \/ f, f) val t5 = RightIff(Sequent(Set(), Set(f <=> (f \/ f))), 3, 4, f, f \/ f) SCProof(IndexedSeq(t0, t1, t2, t3, t4, t5)) - }) - - val t1 = selfIffOr(y === x) - - val xy = x === x + }, display=false) + val t1 = selfIffOr(u === v) + val xy = u === v val h = SchematicPredicateLabel("h", 0) - val t2 = RightSubstIff(Sequent(Set((xy \/ xy) <=> xy), Set(xy <=> in(x, pair(y, y)))), 0, - (y === x) \/ (y === x), - y === x, - in(x, pair(y, y)) <=> PredicateFormula(h, Seq.empty), + val t2 = RightSubstIff(Sequent(Set((xy \/ xy) <=> xy), Set(xy <=> in(u, pair(v, v)))), 0, + (v === u) \/ (v === u), + v === u, + in(u, pair(v, v)) <=> PredicateFormula(h, Seq.empty), h) - val t3 = Cut(Sequent(Set(), Set(xy <=> in(x, pair(y, y)))), 1, 2, (xy \/ xy) <=> xy) + val t3 = Cut(Sequent(Set(), Set(xy <=> in(u, pair(v, v)))), 1, 2, (xy \/ xy) <=> xy) - val p0 = SCProof(IndexedSeq(t0, t1, t2, t3)) + val p0 = SCProof(IndexedSeq(t0, t1, t2, t3), IndexedSeq(() |- pairAxiom)) - ProofTactics.generalizeToForall(ProofTactics.generalizeToForall(p0, ul), vl) + ProofTactics.generalizeToForall(ProofTactics.generalizeToForall(p0, vl), ul) } test("Singleton set equality") { - checkProof(singletonSetEqualityProof, emptySeq +> forall(vl, forall(ul, (u === v) <=> in(u, pair(v, v))))) + checkProof(singletonSetEqualityProof, emptySeq +> forall(u, forall(v, (u === v) <=> in(u, pair(v, v))))) } - val proofSingletonDefinition: SCProof = ProofTactics.simpleFunctionDefinition(singleton, pair(u, u), Seq(ul)) - - test("Verify singleton set definition") { - checkProof(proofSingletonDefinition) - } }