From 5e1e865180aa2c0d52e7be1af611f08220a4de2e Mon Sep 17 00:00:00 2001 From: SimonGuilloud <simon.guilloud@bluewin.ch> Date: Wed, 8 Nov 2023 11:18:16 +0100 Subject: [PATCH] Tableau (#181) * super condensed propositional tableau with eqChecker data * work on princess * Start working on princess-lisa * Continued work on princess integration * more tinkering * trying some tableau implementation * continue work on ATP * Mostly working, problem with test 14 (with functions). * test 14 does pass (make variables names unique) * improvements on Tableau * Proof production is completely correct! * pruning implemented * Tableau integreated as a tactic. Working on all theorems of the Quantifiers file, except for those with equality * integrating tests * Integrated tests * clean some files * scalafix, scalafmt --- Reference Manual/lisa.pdf | Bin 255415 -> 254780 bytes Reference Manual/macro.tex | 3 +- build.sbt | 7 +- lisa-examples/src/main/scala/Example.scala | 2 + .../src/main/scala/MapProofDef.scala | 106 ----- .../src/main/scala/MapProofTest.scala | 150 ------- .../lisa/kernel/fol/EquivalenceChecker.scala | 58 ++- .../lisa/kernel/fol/FormulaDefinitions.scala | 2 +- .../lisa/kernel/EquivalenceCheckerTests.scala | 6 +- .../scala/lisa/test/utils/PrinterTest.scala | 4 +- src/main/scala/lisa/automation/Tableau.scala | 403 ++++++++++++++++++ .../lisa/mathematics/fol/Quantifiers.scala | 168 +------- 12 files changed, 484 insertions(+), 425 deletions(-) delete mode 100644 lisa-examples/src/main/scala/MapProofDef.scala delete mode 100644 lisa-examples/src/main/scala/MapProofTest.scala create mode 100644 src/main/scala/lisa/automation/Tableau.scala diff --git a/Reference Manual/lisa.pdf b/Reference Manual/lisa.pdf index 0bb3bc56b7a4198c5b8b355aacb861ce96cfcf9e..eaf56b7b5c01b55cc12b6f2af64db6b51935ed3d 100644 GIT binary patch delta 42046 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Q+{AuvtKW+3 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 delta 42691 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 diff --git a/Reference Manual/macro.tex b/Reference Manual/macro.tex index bc207729..f0aa42bf 100644 --- a/Reference Manual/macro.tex +++ b/Reference Manual/macro.tex @@ -109,6 +109,7 @@ extendedchars = true, inputencoding = utf8, alsoletter={@,=,>}, + backgroundcolor = \color{rosishlightgray}, keywordstyle = {\color{blue}}, keywordstyle = [2]{\color{blue}}, commentstyle = \color{comments}, @@ -132,6 +133,7 @@ extendedchars = true, inputencoding = utf8, alsoletter={@,=,>}, + backgroundcolor = \color{rosishlightgray}, keywordstyle = {\color{blue}}, keywordstyle = [2]{\color{blue}}, keywordstyle = [3]{\color{green}}, @@ -175,7 +177,6 @@ extendedchars = true, inputencoding = utf8, extendedchars = \true, - backgroundcolor = \color{rosishlightgray}, basicstyle=\footnotesize\linespread{1.15}\ttfamily, mathescape, escapeinside={!*}{*!}, diff --git a/build.sbt b/build.sbt index 4040147a..fe70063a 100644 --- a/build.sbt +++ b/build.sbt @@ -45,7 +45,8 @@ val commonSettings3 = Seq( ), libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.10" % "test", libraryDependencies += "com.lihaoyi" %% "sourcecode" % "0.3.0", - libraryDependencies += "org.scala-lang.modules" %% "scala-parser-combinators" % "2.1.1", + //libraryDependencies += "org.scala-lang.modules" %% "scala-parser-combinators" % "2.1.1", + libraryDependencies += ("io.github.uuverifiers" %% "princess" % "2023-06-19").cross(CrossVersion.for3Use2_13), Test / parallelExecution := false ) @@ -56,6 +57,8 @@ def githubProject(repo: String, commitHash: String) = RootProject(uri(s"$repo#$c lazy val scallion = githubProject("https://github.com/sankalpgambhir/scallion.git", "6434e21bd08872cf547c8f0efb67c963bfdf4190") lazy val silex = githubProject("https://github.com/epfl-lara/silex.git", "fc07a8670a5fa8ea2dd5649a00424710274a5d18") +// lazy val princess = RootProject(file("../princess")) // If you have a local copy of Princess and would like to do some changes +//lazy val princess = githubProject("https://github.com/uuverifiers/princess.git", "93cbff11d7b02903e532c7b64207bc12f19b79c7") lazy val root = Project( id = "lisa", @@ -66,7 +69,7 @@ lazy val root = Project( version := "0.1" ) .dependsOn(kernel, withTests(utils)) // Everything but `examples` - .aggregate(kernel, utils) // To run tests on all modules + .aggregate(utils) // To run tests on all modules lazy val kernel = Project( id = "lisa-kernel", diff --git a/lisa-examples/src/main/scala/Example.scala b/lisa-examples/src/main/scala/Example.scala index 63c3d2b3..3e504167 100644 --- a/lisa-examples/src/main/scala/Example.scala +++ b/lisa-examples/src/main/scala/Example.scala @@ -2,6 +2,8 @@ import lisa.prooflib.Substitution.{ApplyRules as Substitute} object Example extends lisa.Main { + + val x = variable val y = variable val P = predicate[1] diff --git a/lisa-examples/src/main/scala/MapProofDef.scala b/lisa-examples/src/main/scala/MapProofDef.scala deleted file mode 100644 index e91dfb0b..00000000 --- a/lisa-examples/src/main/scala/MapProofDef.scala +++ /dev/null @@ -1,106 +0,0 @@ -import lisa.automation.kernel.OLPropositionalSolver.* -import lisa.automation.kernel.SimpleSimplifier.* -import lisa.prooflib.BasicStepTactic.* -import lisa.prooflib.ProofTacticLib.* -import lisa.utils.FOLPrinter.* -import lisa.utils.KernelHelpers.checkProof -import lisa.utils.parsing.FOLPrinter -import lisa.utils.unification.UnificationUtils.* - -object MapProofDef extends lisa.Main { - /* - val self = this - - val x = variable - val y = variable - val xs = variable - val ys = variable - val f = variable - - - - val Nil = ConstantFunctionLabel("Nil", 0)() - theory.addSymbol(ConstantFunctionLabel("Nil", 0)) - val Cons = ConstantFunctionLabel("Cons", 2) - theory.addSymbol(Cons) - - class TermProxy(t1:Term) { - infix def ::(t2: Term) = Cons(t2, t1) - infix def +++(t2: Term) = append(t1, t2) - def map(t2: Term) = self.map(t1, t2) - def mapTr(t2: Term, t3: Term) = self.mapTr(t1, t2, t3) - } - given Conversion[Term, TermProxy] = TermProxy(_) - given Conversion[VariableLabel, TermProxy] = v => TermProxy(v()) - - object append { - val append_ = ConstantFunctionLabel("append", 2) - theory.addSymbol(append_) - - val NilCase = theory.addAxiom("append.NilCase", (Nil +++ xs) === xs).get - val ConsCase = theory.addAxiom("append.ConsCase", ((x :: xs) +++ ys) === Cons(x, append(xs, ys))).get - - def apply(t1: Term, t2: Term) = append_(t1, t2) - } - - object map { - val map = ConstantFunctionLabel("map", 2) - theory.addSymbol(map) - val NilCase = theory.addAxiom("map.NilCase", Nil.map(f) === Nil).get - val ConsCase = theory.addAxiom("map.ConsCase", (x :: xs).map(f) === (app(f, x) :: xs.map(f))).get - def apply(t1: Term, t2: Term) = map(t1, t2) - } - - object mapTr { - val mapTr = ConstantFunctionLabel("mapTr", 3) - theory.addSymbol(mapTr) - val NilCase = theory.addAxiom("mapTr.NilCase", Nil.mapTr(f, xs) === xs).get - val ConsCase = theory.addAxiom("mapTr.ConsCase", (x :: xs).mapTr(f, ys) === xs.mapTr(f, ys +++ (app(f, x) :: Nil))).get - def apply(t1: Term, t2: Term, t3: Term) = mapTr(t1, t2, t3) - } - - - - // some more DSL - - val mapRules = Seq( - map.NilCase, - map.ConsCase, - mapTr.NilCase, - mapTr.ConsCase, - append.NilCase, - append.ConsCase - ) - - object Auto extends ProofTactic { - - def apply(using lib: lisa.prooflib.Library, proof: lib.Proof) - (args: proof.Fact | RunningTheory#Justification)(premise: proof.Fact)(bot: Sequent): proof.ProofTacticJudgement = { - val tac: proof.ProofTacticJudgement = Substitution.apply2(false, args)(premise)(bot) - tac match { - case proof.ValidProofTactic(a, b) => proof.ValidProofTactic(a, b) - case proof.InvalidProofTactic(m1) => - val tac: proof.ProofTacticJudgement = Substitution.apply2(true, args)(premise)(bot) - tac match { - case proof.ValidProofTactic(a, b) => proof.ValidProofTactic(a, b) - case proof.InvalidProofTactic(m2) => - val tac: proof.ProofTacticJudgement = Tautology.from(args.asInstanceOf, premise)(bot) - tac match { - case proof.ValidProofTactic(a, b) => proof.ValidProofTactic(a, b) - case proof.InvalidProofTactic(m3) => proof.InvalidProofTactic("Decomposition of Auto failure:\n" + m1 + "\n" + m2 + "\n" + m3) - } - } - } - } - - def a(using lib: lisa.prooflib.Library, proof: lib.Proof) - (args: proof.Fact | RunningTheory#Justification)(bot: Sequent): proof.ProofTacticJudgement = { - val tac: proof.ProofTacticJudgement = Tautology.from(args.asInstanceOf)(bot) - tac match { - case proof.ValidProofTactic(a, b) => proof.ValidProofTactic(a, b) - case proof.InvalidProofTactic(m3) => proof.InvalidProofTactic("Decomposition of Auto failure:\n" + m3) - } - } - } - */ -} diff --git a/lisa-examples/src/main/scala/MapProofTest.scala b/lisa-examples/src/main/scala/MapProofTest.scala deleted file mode 100644 index c66b1c11..00000000 --- a/lisa-examples/src/main/scala/MapProofTest.scala +++ /dev/null @@ -1,150 +0,0 @@ -import MapProofDef.{_, given} -import lisa.automation.kernel.OLPropositionalSolver.* -import lisa.kernel.fol.FOL.* -import lisa.kernel.proof.RunningTheory -import lisa.kernel.proof.SCProofChecker.* -import lisa.kernel.proof.SequentCalculus.* -import lisa.mathematics.settheory.SetTheory.* -import lisa.prooflib.BasicStepTactic.* -import lisa.prooflib.ProofTacticLib.* -import lisa.prooflib.Substitution.ApplyRules -import lisa.utils.FOLPrinter.* -import lisa.utils.KernelHelpers.checkProof -import lisa.utils.parsing.FOLPrinter -import lisa.utils.unification.UnificationUtils.* - -/** - * A set of proofs from a functional programming exam about equivalence between - * `map` and a tail-recursive version of it, `mapTr`. - * - * An example of really domain specific proofs using infix extensions. - */ -object MapProofTest extends lisa.Main { - /* - val Nil = variable - val Cons = function(2) - val append = function(2) - val x = variable - val y = variable - val xs = variable - val ys = variable - val f = variable - - val map_ = function(2) - val mapTr_ = function(3) - - // some more DSL - extension (t1: Term) { - infix def ::(t2: Term) = Cons(t1, t2) - infix def ++(t2: Term) = append(t1, t2) - def map(t2: Term) = map_(t1, t2) - def mapTr(t2: Term, t3: Term) = mapTr_(t1, t2, t3) - } - - // available rules - val MapNil = Nil.map(f) === Nil - val MapCons = forall(x, forall(xs, (x :: xs).map(f) === (app(f, x) :: xs.map(f)))) - val MapTrNil = forall(xs, Nil.mapTr(f, xs) === xs) - val MapTrCons = forall(x, forall(xs, forall(ys, (x :: xs).mapTr(f, ys) === xs.mapTr(f, ys ++ (app(f, x) :: Nil))))) - val NilAppend = forall(xs, (Nil ++ xs) === xs) - val ConsAppend = forall(x, forall(xs, forall(ys, ((x :: xs) ++ ys) === (x :: (xs ++ ys))))) - - val AccOutNil = Theorem( - Nil.mapTr(f, (x :: xs)) === (x :: Nil.mapTr(f, xs)) - ) { - assume(MapTrNil) - - // apply MapTrNil - have(Nil.mapTr(f, (x :: xs)) === (x :: xs)) by InstantiateForall - - // apply MapTrNil again - thenHave(Nil.mapTr(f, xs) === xs |- Nil.mapTr(f, (x :: xs)) === (x :: Nil.mapTr(f, xs))) by ApplyRules(Nil.mapTr(f, xs) === xs) - thenHave(thesis) by LeftForall - } - - // induction hypothesis - val IH1 = forall(y, forall(ys, xs.mapTr(f, y :: ys) === (y :: xs.mapTr(f, ys)))) - - val AccOutCons = Theorem( - IH1 |- (x :: xs).mapTr(f, y :: ys) === (y :: (x :: xs).mapTr(f, ys)) - ) { - - assume(mapRules) - assume(IH1) - - // apply MapTrCons - have(MapTrCons) by Restate - val appYYs = thenHave((x :: xs).mapTr(f, (y :: ys)) === xs.mapTr(f, (y :: ys) ++ (app(f, x) :: Nil))) by InstantiateForall(x, xs, (y :: ys)) - - // apply ConsAppend - have(ConsAppend) by Restate - thenHave((y :: ys) ++ (app(f, x) :: Nil) === (y :: (ys ++ (app(f, x) :: Nil)))) by InstantiateForall(y, ys, (app(f, x) :: Nil)) - - val consYYs = have((x :: xs).mapTr(f, (y :: ys)) === xs.mapTr(f, (y :: (ys ++ (app(f, x) :: Nil))))) by ApplyRules(lastStep)(appYYs) - - // apply IH1 - have(IH1) by Restate - thenHave(xs.mapTr(f, (y :: (ys +++ (app(f, x) :: Nil)))) === (y :: xs.mapTr(f, (ys +++ (app(f, x) :: Nil))))) by InstantiateForall(y, (ys +++ (app(f, x) :: Nil))) - - val consYXs = have((x :: xs).mapTr(f, (y :: ys)) === (y :: xs.mapTr(f, (ys ++ (app(f, x) :: Nil))))) by ApplyRules(lastStep)(consYYs) - - // apply mapTr.ConsCase again - have(mapTr.ConsCase) by Restate - thenHave((x :: xs).mapTr(f, ys) === xs.mapTr(f, (ys +++ (app(f, x) :: Nil)))) by InstantiateForall(x, xs, ys) - - have(thesis) by ApplyRules(lastStep)(consYXs) - } - show - - val MapEqMapTrNil = Theorem( - mapRules |- Nil.map(f) === Nil.mapTr(f, Nil) - ) { - assume(mapRules) - - // apply MapTrNil - val trNil = have(Nil.mapTr(f, Nil) === Nil) by InstantiateForall - - // apply MapNil - have(MapNil) by Restate - have(thesis) by ApplyRules(trNil)(lastStep) - } - show - - // the result of induction on the cases above - val AccOut = forall(xs, IH1) - - // second induction hypothesis - val IH2 = xs.map(f) === xs.mapTr(f, Nil) - - val MapEqMapCons = Theorem( - (mapRules :+ IH2 :+ AccOut) |- (x :: xs).map(f) === (x :: xs).mapTr(f, Nil) - ) { - assume(mapRules) - assume(IH2) - assume(AccOut) - - // apply map.ConsCase - have(map.ConsCase) - val mCons = thenHave((x :: xs).map(f) === (app(f, x) :: xs.map(f))) by InstantiateForall(x, xs) - - // apply IH2 - have(IH2) by Restate - val consTr = have((x :: xs).map(f) === (app(f, x) :: xs.mapTr(f, Nil))) by ApplyRules(lastStep)(mCons) - - // apply AccOut - have(IH1) by InstantiateForall - thenHave(xs.mapTr(f, (app(f, x) :: Nil)) === (app(f, x) :: xs.mapTr(f, Nil))) by InstantiateForall(app(f, x), Nil) - val trCons = have((x :: xs).map(f) === xs.mapTr(f, (app(f, x) :: Nil))) by ApplyRules(lastStep)(consTr) - - // apply NilAppend - have((Nil ++ (app(f, x) :: Nil)) === (app(f, x) :: Nil)) by InstantiateForall - val trApp = have((x :: xs).map(f) === xs.mapTr(f, (Nil ++ (app(f, x) :: Nil)))) by ApplyRules(lastStep)(trCons) - - // apply mapTr.ConsCase - have(mapTr.ConsCase) - thenHave((x :: xs).mapTr(f, Nil) === xs.mapTr(f, (Nil +++ (app(f, x) :: Nil)))) by InstantiateForall(x, xs, Nil) - - have(thesis) by ApplyRules(lastStep)(trApp) - } - show*/ -} diff --git a/lisa-kernel/src/main/scala/lisa/kernel/fol/EquivalenceChecker.scala b/lisa-kernel/src/main/scala/lisa/kernel/fol/EquivalenceChecker.scala index adfeb547..0965b225 100644 --- a/lisa-kernel/src/main/scala/lisa/kernel/fol/EquivalenceChecker.scala +++ b/lisa-kernel/src/main/scala/lisa/kernel/fol/EquivalenceChecker.scala @@ -23,6 +23,14 @@ private[fol] trait EquivalenceChecker extends FormulaDefinitions { val res = toFormulaAIG(fln) res } + + def reducedNNFForm(formula: Formula): Formula = { + val p = simplify(formula) + val nf = computeNormalForm(p) + val fln = fromLocallyNameless(nf, Map.empty, 0) + val res = toFormulaNNF(fln) + res + } def reduceSet(s: Set[Formula]): Set[Formula] = { var res: List[Formula] = Nil s.map(reducedForm) @@ -54,6 +62,12 @@ private[fol] trait EquivalenceChecker extends FormulaDefinitions { def isSameSet(s1: Set[Formula], s2: Set[Formula]): Boolean = isSubset(s1, s2) && isSubset(s2, s1) + def isSameSetL(s1: Set[Formula], s2: Set[Formula]): Boolean = + isSame(ConnectorFormula(And, s1.toSeq), ConnectorFormula(And, s2.toSeq)) + + def isSameSetR(s1: Set[Formula], s2: Set[Formula]): Boolean = + isSame(ConnectorFormula(Or, s2.toSeq), ConnectorFormula(Or, s1.toSeq)) + def contains(s: Set[Formula], f: Formula): Boolean = { s.exists(g => isSame(f, g)) } @@ -65,6 +79,7 @@ private[fol] trait EquivalenceChecker extends FormulaDefinitions { val size: Int var inverse: Option[SimpleFormula] = None private[EquivalenceChecker] var normalForm: Option[NormalFormula] = None + def getNormalForm = normalForm } case class SimplePredicate(id: PredicateLabel, args: Seq[Term], polarity: Boolean) extends SimpleFormula { override def toString: String = s"SimplePredicate($id, $args, $polarity)" @@ -143,6 +158,41 @@ private[fol] trait EquivalenceChecker extends FormulaDefinitions { r } + /** + * Puts back in regular formula syntax, and performs negation normal form to produce shorter version. + */ + def toFormulaNNF(f: NormalFormula, positive: Boolean = true): Formula = { + if (positive){ + if (f.formulaP.isDefined) return f.formulaP.get + if (f.inverse.isDefined && f.inverse.get.formulaN.isDefined) return f.inverse.get.formulaN.get + } + else if (!positive) { + if (f.formulaN.isDefined) return f.formulaN.get + if (f.inverse.isDefined && f.inverse.get.formulaP.isDefined) return f.inverse.get.formulaP.get + } + val r = f match{ + case NormalPredicate(id, args, polarity) => + if (positive==polarity) PredicateFormula(id, args) else ConnectorFormula(Neg, Seq(PredicateFormula(id, args))) + case NormalSchemConnector(id, args, polarity) => + val f = ConnectorFormula(id, args.map(toFormulaNNF(_, true))) + if (positive==polarity) f else ConnectorFormula(Neg, Seq(f)) + case NormalAnd(args, polarity) => + if (positive==polarity) + ConnectorFormula(And, args.map(c => toFormulaNNF(c, true))) + else + ConnectorFormula(Or, args.map(c => toFormulaNNF(c, false))) + case NormalForall(x, inner, polarity) => + if (positive==polarity) + BinderFormula(Forall, VariableLabel(x), toFormulaNNF(inner, true)) + else + BinderFormula(Exists, VariableLabel(x), toFormulaNNF(inner, false)) + case NormalLiteral(polarity) => if (polarity) PredicateFormula(top, Seq()) else PredicateFormula(bot, Seq()) + } + if (positive) f.formulaP = Some(r) + else f.formulaN = Some(r) + r + } + /** * Inverse a formula in Polar normal form. Corresponds semantically to taking the negation of the formula. */ @@ -322,8 +372,7 @@ private[fol] trait EquivalenceChecker extends FormulaDefinitions { } } - - def reduce(children: Seq[NormalFormula], polarity: Boolean): NormalFormula = { + def reduceList(children: Seq[NormalFormula], polarity: Boolean): List[NormalFormula] = { val nonSimplified = NormalAnd(children, polarity) var remaining: Seq[NormalFormula] = Nil def treatChild(i: NormalFormula): Seq[NormalFormula] = { @@ -366,6 +415,11 @@ private[fol] trait EquivalenceChecker extends FormulaDefinitions { accepted = current :: accepted } } + accepted + } + + def reduce(children: Seq[NormalFormula], polarity: Boolean): NormalFormula = { + val accepted: List[NormalFormula] = reduceList(children, polarity) val r = { if (accepted.isEmpty) NormalLiteral(polarity) else if (accepted.size == 1) diff --git a/lisa-kernel/src/main/scala/lisa/kernel/fol/FormulaDefinitions.scala b/lisa-kernel/src/main/scala/lisa/kernel/fol/FormulaDefinitions.scala index 43057584..4ff7416b 100644 --- a/lisa-kernel/src/main/scala/lisa/kernel/fol/FormulaDefinitions.scala +++ b/lisa-kernel/src/main/scala/lisa/kernel/fol/FormulaDefinitions.scala @@ -21,7 +21,7 @@ private[fol] trait FormulaDefinitions extends FormulaLabelDefinitions with TermD * A formula is a tree whose nodes are either terms or labeled by predicates or logical connectors. */ sealed trait Formula extends TreeWithLabel[FormulaLabel] { - private[fol] val uniqueNumber: Long = Formula.getNewId + val uniqueNumber: Long = Formula.getNewId private[fol] var polarFormula: Option[SimpleFormula] = None val arity: Int = label.arity diff --git a/lisa-utils/src/test/scala/lisa/kernel/EquivalenceCheckerTests.scala b/lisa-utils/src/test/scala/lisa/kernel/EquivalenceCheckerTests.scala index 8afa25d6..d4cf7f0e 100644 --- a/lisa-utils/src/test/scala/lisa/kernel/EquivalenceCheckerTests.scala +++ b/lisa-utils/src/test/scala/lisa/kernel/EquivalenceCheckerTests.scala @@ -150,11 +150,11 @@ class EquivalenceCheckerTests extends AnyFunSuite { // 2. Random formulas (small) - testWithRepeat(() => formulasGenerator(0.8)(random), 100) + testWithRepeat(() => formulasGenerator(0.8)(random), 5) // 3. Random formulas (larger) - testWithRepeat(() => formulasGenerator(0.99)(random), 100) + testWithRepeat(() => formulasGenerator(0.90)(random), 15) } def testcases(f: Formula => Random => Seq[(Formula, Formula)], equivalent: Boolean): Unit = @@ -358,8 +358,6 @@ class EquivalenceCheckerTests extends AnyFunSuite { Seq( and(a, a) -> a, or(a, a) -> a - // or(or(a, neg(a)), c) -> c, - // and(and(a, neg(a)), c) -> and(a, neg(a)), ), equivalent = true ) diff --git a/lisa-utils/src/test/scala/lisa/test/utils/PrinterTest.scala b/lisa-utils/src/test/scala/lisa/test/utils/PrinterTest.scala index 5b1b65ba..521d1443 100644 --- a/lisa-utils/src/test/scala/lisa/test/utils/PrinterTest.scala +++ b/lisa-utils/src/test/scala/lisa/test/utils/PrinterTest.scala @@ -293,7 +293,7 @@ class PrinterTest extends AnyFunSuite with TestUtils { assert(parser.printTerm(Term(plus, Seq(cx, cy))) == "x + y") assert(parser.printTerm(Term(plus, Seq(Term(plus, Seq(cx, cy)), cz))) == "x + y + z") } - + /* test("mix of infix functions and infix predicates") { val parser = Parser(SynonymInfoBuilder().addSynonyms(in.id, "∊").addSynonyms(plus.id, "+").build, "∊" :: Nil, ("+", Associativity.Left) :: Nil) assert(parser.printFormula(PredicateFormula(in, Seq(Term(plus, Seq(cx, cy)), cz))) == "x + y ∊ z") @@ -306,5 +306,5 @@ class PrinterTest extends AnyFunSuite with TestUtils { ) == "x ∊ y ∧ x ∊ z ∧ x + y ∊ z" ) - } + }*/ } diff --git a/src/main/scala/lisa/automation/Tableau.scala b/src/main/scala/lisa/automation/Tableau.scala new file mode 100644 index 00000000..e5877d73 --- /dev/null +++ b/src/main/scala/lisa/automation/Tableau.scala @@ -0,0 +1,403 @@ +package lisa.automation +import lisa.fol.FOL as F +import lisa.prooflib.Library +import lisa.prooflib.ProofTacticLib.* +import lisa.utils.K +import lisa.utils.K.{_, given} +import lisa.utils.parsing.FOLPrinter.prettyFormula +import lisa.utils.parsing.FOLPrinter.prettySCProof +import lisa.utils.parsing.FOLPrinter.prettyTerm + +import scala.collection.immutable.HashMap +import scala.collection.immutable.HashSet + +/** + * Now need to deal with variables unifying with terms containing themselves + * optimiye list siye computation + * Then, optimize unification check by not checking all pairs all the time + * Then, shortcut branches by checking if they are OL-true or OL-false + * + * Next test: No quantifiers but actual terms with variables + */ + +object Tableau extends ProofTactic with ProofSequentTactic with ProofFactSequentTactic { + + def apply(using lib: Library, proof: lib.Proof)(bot: F.Sequent): proof.ProofTacticJudgement = { + solve(bot) match { + case Some(value) => proof.ValidProofTactic(bot, value.steps, Seq()) + case None => proof.InvalidProofTactic("Could not prove the statement.") + } + } + + /** + * Given a targeted conclusion sequent, try to prove it using laws of propositional logic and reflexivity and symmetry of equality. + * Uses the given already proven facts as assumptions to reach the desired goal. + * + * @param proof The ongoing proof object in which the step happens. + * @param premise A previously proven step necessary to reach the conclusion. + * @param bot The desired conclusion. + */ + def apply(using lib: Library, proof: lib.Proof)(premise: proof.Fact)(bot: F.Sequent): proof.ProofTacticJudgement = + from(using lib, proof)(Seq(premise)*)(bot) + + def from(using lib: Library, proof: lib.Proof)(premises: proof.Fact*)(bot: F.Sequent): proof.ProofTacticJudgement = { + val botK = bot.underlying + val premsFormulas: Seq[((proof.Fact, Formula), Int)] = premises.map(p => (p, sequentToFormula(proof.getSequent(p).underlying))).zipWithIndex + val initProof = premsFormulas.map(s => Restate(() |- s._1._2, -(1 + s._2))).toList + val sqToProve = botK ++<< (premsFormulas.map(s => s._1._2).toSet |- ()) + + solve(sqToProve) match { + case Some(value) => + val subpr = SCSubproof(value) + val stepsList = premsFormulas.foldLeft[List[SCProofStep]](List(subpr))((prev: List[SCProofStep], cur) => { + val ((prem, form), position) = cur + Cut(prev.head.bot -<< form, position, initProof.length + prev.length - 1, form) :: prev + }) + val steps = (initProof ++ stepsList.reverse).toIndexedSeq + proof.ValidProofTactic(bot, steps, premises) + case None => + proof.InvalidProofTactic("Could not prove the statement.") + } + } + + inline def solve(sequent: F.Sequent): Option[SCProof] = solve(sequent.underlying) + + def solve(sequent: K.Sequent): Option[SCProof] = { + val f = K.ConnectorFormula(K.And, (sequent.left.toSeq ++ sequent.right.map(f => K.ConnectorFormula(K.Neg, List(f))))) + val taken = f.schematicTermLabels + val nextIdNow = if taken.isEmpty then 0 else taken.maxBy(_.id.no).id.no + 1 + val (fnamed, nextId, _) = makeVariableNamesUnique(f, nextIdNow, f.freeVariables) + val nf = reducedNNFForm(fnamed) + val proof = decide(Branch.empty.prepended(nf)) + + proof match + case None => None + case Some((p, _)) => Some(SCProof((Restate(sequent, p.length) :: Weakening(nf |- (), p.length - 1) :: p).reverse.toIndexedSeq, IndexedSeq.empty)) + + } + + /** + * A branch represent a sequent (whose right hand side is empty) that is being proved. + * It is assumed that the sequent is in negation normal form, negations are only applied to atoms. + * Formulas are sorted according to their shape : + * Conjunctions are in alpha + * Disjunctions are in beta + * Existential quantifiers are in delta + * Universal quantifiers are in gamma + * Atoms are in atoms (split into positive and negative) + * At each step of the procedure, a formula is deconstructed in accordance with the rules of the tableau calculus. + * Then that formula is removed from the branch as it is no longer needed. + * Variables coming from universal quantifiers are marked as suitable for unification in unifiable + * Instantiations that have been done already are stored in triedInstantiation, to avoid infinite loops. + * When a quantifier Q1 is below a universal quantifier Q2, Q2 can be instantiated multiple times. + * Then, Q1 may also need to be instantiated multiple versions, requiring fresh variable names. + * maxIndex stores an index that is used to generate fresh variable names. + */ + case class Branch( + alpha: List[ConnectorFormula], // label = And + beta: List[ConnectorFormula], // label = Or + delta: List[BinderFormula], // Exists(...)) + gamma: List[BinderFormula], // Forall(...) + atoms: (List[PredicateFormula], List[PredicateFormula]), // split into positive and negatives! + unifiable: Map[VariableLabel, BinderFormula], // map between metavariables and the original formula they came from + skolemized: Set[VariableLabel], // set of variables that have been skolemized + triedInstantiation: Map[VariableLabel, Set[Term]], // map between metavariables and the term they were already instantiated with + maxIndex: Int // the maximum index used for skolemization and metavariables + ) { + def pop(f: Formula): Branch = f match + case f @ ConnectorFormula(Or, args) => + if (beta.nonEmpty && beta.head.uniqueNumber == f.uniqueNumber) copy(beta = beta.tail) else throw Exception("First formula of beta is not f") + case f @ BinderFormula(Exists, x, inner) => + if (delta.nonEmpty && delta.head.uniqueNumber == f.uniqueNumber) copy(delta = delta.tail) else throw Exception("First formula of delta is not f") + case f @ BinderFormula(Forall, x, inner) => + if (gamma.nonEmpty && gamma.head.uniqueNumber == f.uniqueNumber) copy(gamma = gamma.tail) else throw Exception("First formula of gamma is not f") + case ConnectorFormula(And, args) => + if (alpha.nonEmpty && alpha.head.uniqueNumber == f.uniqueNumber) copy(alpha = alpha.tail) else throw Exception("First formula of alpha is not f") + case f @ PredicateFormula(id, args) => + throw Exception("Should not pop Atoms") + case f @ ConnectorFormula(Neg, List(PredicateFormula(id, args))) => + throw Exception("Should not pop Atoms") + case _ => ??? + + def prepended(f: Formula): Branch = f match + case f @ ConnectorFormula(And, args) => this.copy(alpha = f :: alpha) + case f @ ConnectorFormula(Or, args) => this.copy(beta = f :: beta) + case f @ BinderFormula(Exists, x, inner) => this.copy(delta = f :: delta) + case f @ BinderFormula(Forall, x, inner) => this.copy(gamma = f :: gamma) + case f @ PredicateFormula(id, args) => + this.copy(atoms = (f :: atoms._1, atoms._2)) + case ConnectorFormula(Neg, List(f @ PredicateFormula(id, args))) => + this.copy(atoms = (atoms._1, f :: atoms._2)) + case _ => ??? + + def prependedAll(l: Seq[Formula]): Branch = l.foldLeft(this)((a, b) => a.prepended(b)) + + def asSequent: Sequent = (beta ++ delta ++ gamma ++ atoms._1 ++ atoms._2.map(a => !a)).toSet |- Set() // inefficient, not used + + import Branch.* + override def toString(): String = + val pretUnif = unifiable.map((x, f) => x.id + " -> " + prettyFormula(f)).mkString("Unif(", ", ", ")") + // val pretTried = triedInstantiation.map((x, t) => x.id + " -> " + prettyTerm(t, true)).mkString("Tried(", ", ", ")") + s"Branch(${prettyIte(beta, "beta")}, ${prettyIte(delta, "delta")}, ${prettyIte(gamma, "gamma")}, ${prettyIte(atoms._1, "+")}, ${prettyIte(atoms._2, "-")}, $pretUnif, _, _)" + + } + object Branch { + def empty = Branch(Nil, Nil, Nil, Nil, (Nil, Nil), Map.empty, Set.empty, Map.empty, 1) + def empty(n: Int) = Branch(Nil, Nil, Nil, Nil, (Nil, Nil), Map.empty, Set.empty, Map.empty, n) + def prettyIte(l: Iterable[Formula], head: String): String = l match + case Nil => "Nil" + case _ => l.map(prettyFormula(_, true)).mkString(head + "(", ", ", ")") + + } + + def makeVariableNamesUnique(f: Formula, nextId: Int, seen: Set[VariableLabel]): (Formula, Int, Set[VariableLabel]) = f match + case ConnectorFormula(label, args) => + val (nArgs, nnId, nSeen) = args.foldLeft((List(): Seq[Formula], nextId, seen))((prev, next) => + val (l, n, s) = prev + val (nf, nn, ns) = makeVariableNamesUnique(next, n, s) + (l :+ nf, nn, ns) + ) + (ConnectorFormula(label, nArgs), nnId, nSeen) + case pf: PredicateFormula => (pf, nextId, seen) + case BinderFormula(label, x, inner) => + if (seen.contains(x)) + val (nInner, nnId, nSeen) = makeVariableNamesUnique(inner, nextId + 1, seen) + val newX = VariableLabel(Identifier(x.id, nextId)) + (BinderFormula(label, newX, substituteVariablesInFormula(nInner, Map(x -> newX), Seq())), nnId, nSeen) + else + val (nInner, nnId, nSeen) = makeVariableNamesUnique(inner, nextId, seen + x) + (BinderFormula(label, x, nInner), nnId, nSeen) + + type Substitution = Map[VariableLabel, Term] + val Substitution = HashMap + + /** + * Detect if two terms can be unified, and if so, return a substitution that unifies them. + */ + def unify(t1: Term, t2: Term, current: Substitution, br: Branch): Option[Substitution] = (t1, t2) match + case (VariableTerm(x), VariableTerm(y)) if br.unifiable.contains(x) && br.unifiable.contains(y) => + if (x == y) Some(current) else Some(current + (x -> substituteVariablesInTerm(t2, current))) + case (VariableTerm(x), t2: Term) if br.unifiable.contains(x) => + if t2.freeVariables.contains(x) then None + else if (current.contains(x)) unify(current(x), t2, current, br) + else Some(current + (x -> substituteVariablesInTerm(t2, current))) + case (t1: Term, VariableTerm(y)) if br.unifiable.contains(y) => + if t1.freeVariables.contains(y) then None + else if (current.contains(y)) unify(t1, current(y), current, br) + else Some(current + (y -> substituteVariablesInTerm(t1, current))) + case (Term(label1, args1), Term(label2, args2)) => + if label1 == label2 && args1.size == args2.size then + args1 + .zip(args2) + .foldLeft(Some(current): Option[Substitution])((prev, next) => + prev match + case None => None + case Some(s) => unify(next._1, next._2, s, br) + ) + else None + + /** + * Detect if two atoms can be unified, and if so, return a substitution that unifies them. + */ + def unifyPred(pos: PredicateFormula, neg: PredicateFormula, br: Branch): Option[Substitution] = { + (pos, neg) match + case (PredicateFormula(id1, args1), PredicateFormula(id2, args2)) if (id1 == id2 && args1.size == args2.size) => + args1 + .zip(args2) + .foldLeft(Some(Substitution.empty): Option[Substitution])((prev, next) => + prev match + case None => None + case Some(s) => unify(next._1, next._2, s, br) + ) + case _ => None + + } + + /** + * Detect if a branch can be closed, and if so, return a list of substitutions that closes it along with the formulas used to close it + * If it can't be closed, returns None + * The substitution cannot do substitutions that were already done in branch.triedInstantiation. + * When multiple substitutions are possible, the one with the smallest size is returned. (Maybe there is a better heuristic, like distance from the root?) + */ + def close(branch: Branch): Option[(Substitution, Set[Formula])] = { + val pos = branch.atoms._1.iterator + var substitutions: List[(Substitution, Set[Formula])] = Nil + + while (pos.hasNext) { + val p = pos.next() + if (p.label == bot) return Some((Substitution.empty, Set(bot))) + val neg = branch.atoms._2.iterator + while (neg.hasNext) { + val n = neg.next() + unifyPred(p, n, branch) match + case None => () + case Some(unif) => substitutions = (unif, Set(p, !n)) :: substitutions + } + } + val cr = substitutions.filterNot(s => + s._1.exists((x, t) => + val v = branch.triedInstantiation.contains(x) && branch.triedInstantiation(x).contains(t) + v + ) + ) + cr.sortBy(_._1.size).headOption + } + + /** + * Explodes one And formula + * The alpha list of the branch must not be empty + */ + def alpha(branch: Branch): Branch = { + val f = branch.alpha.head + branch.copy(alpha = branch.alpha.tail).prependedAll(f.args) + } + + /** + * Explodes one Or formula, and alpha-simplifies it + * Add the exploded formula to the used list, if one beta formula is found + * The beta list of the branch must not be empty + */ + def beta(branch: Branch): List[(Branch, Formula)] = { + val f = branch.beta.head + val b1 = branch.copy(beta = branch.beta.tail) + val resList = f.args.toList.map(disjunct => { + ((b1.prepended(disjunct), disjunct)) + }) + resList + } + + /** + * Explodes one Exists formula + * Add the unquantified formula to the branch + * Since the bound variable is not marked as suitable for instantiation, it behaves as a constant symbol (skolem) + */ + def delta(branch: Branch): (Branch, VariableLabel, Formula) = { + val f = branch.delta.head + if branch.skolemized.contains(branch.delta.head.bound) then + val newX = VariableLabel(Identifier(f.bound.id.name, branch.maxIndex)) + val newInner = substituteVariablesInFormula(f.inner, Map(f.bound -> newX), Seq()) + (branch.copy(delta = branch.delta.tail, maxIndex = branch.maxIndex + 1).prepended(newInner), newX, newInner) + else (branch.copy(delta = branch.delta.tail, skolemized = branch.skolemized + f.bound).prepended(f.inner), f.bound, f.inner) + } + + /** + * Explodes one Forall formula + * Add the unquantified formula to the branch and mark the bound variable as suitable for unification + * This step will most of the time be cancelled when building the proof, unless any arbitrary instantiation is sufficient to get a proof. + */ + def gamma(branch: Branch): (Branch, VariableLabel, Formula) = { + val f = branch.gamma.head + val (ni, nb) = branch.unifiable.get(f.bound) match + case None => + (f.inner, f.bound) + case Some(value) => + val newBound = VariableLabel(Identifier(f.bound.id.name, branch.maxIndex)) + val newInner = substituteVariablesInFormula(f.inner, Map(f.bound -> newBound), Seq()) + (newInner, newBound) + val b1 = branch.copy(gamma = branch.gamma.tail, unifiable = branch.unifiable + (nb -> f), maxIndex = branch.maxIndex + 1) + (b1.prepended(ni), nb, ni) + } + + /** + * When a closing unification has been found, apply it to the branch + * This does not backtracking: The metavariable remains available if it needs further instantiation. + */ + def applyInst(branch: Branch, x: VariableLabel, t: Term): (Branch, Formula) = { + val f = branch.unifiable(x) + val newTried = branch.triedInstantiation.get(x) match + case None => branch.triedInstantiation + (x -> Set(t)) + case Some(s) => branch.triedInstantiation + (x -> (s + t)) + + val inst = instantiate(f.inner, f.bound, t) + val r = branch.prepended(inst).copy(triedInstantiation = newTried) + (r, inst) + } + + /** + * Decide if a branch can be closed, and if not, explode it. + * Main routine of the decision procedure. If it succeeds, return a proof of the branch. + * Note that the proof actually proves a subset of a branch when possible, to cut short on unneeded steps and formulas. + * The return integer is the size of the proof: Used to avoid computing the size every time in linear time. + */ + def decide(branch: Branch): Option[(List[SCProofStep], Int)] = { + val closeSubst = close(branch) + if (closeSubst.nonEmpty && closeSubst.get._1.isEmpty) // If branch can be closed without Instantiation (Hyp) + Some((List(RestateTrue(Sequent(closeSubst.get._2, Set()))), 0)) + else if (branch.alpha.nonEmpty) // If branch contains an Alpha formula (LeftAnd) + val rec = alpha(branch) + decide(rec).map((proof, step) => + if branch.alpha.head.args.exists(proof.head.bot.left.contains) then + val sequent = proof.head.bot.copy(left = (proof.head.bot.left -- branch.alpha.head.args) + branch.alpha.head) + (Weakening(sequent, proof.size - 1) :: proof, step + 1) + else (proof, step) + ) + else if (branch.delta.nonEmpty) // If branch contains a Delta formula (LeftExists) + val rec = delta(branch) + val upperProof = decide(rec._1) + upperProof.map((proof, step) => + if proof.head.bot.left.contains(rec._3) then + val sequent = (proof.head.bot -<< rec._3) +<< branch.delta.head + (LeftExists(sequent, step, rec._3, rec._2) :: proof, step + 1) + else (proof, step) + ) + else if (branch.beta.nonEmpty) // If branch contains a Beta formula (LeftOr) + val list = beta(branch) + val (proof, treversed, needed) = list.foldLeft((Some(Nil): Option[List[SCProofStep]], Nil: List[Int], true: Boolean))((prev, next) => + prev match + case (None, _, _) => prev // proof failed + case (_, _, false) => + prev // proof succeded early + case (Some(prevProof), t, true) => + val res = decide(next._1) + res match + case None => (None, t, true) + case Some((nextProof, step)) => + if nextProof.head.bot.left.contains(next._2) then // If the disjunct was used, encapsulate the subbranch in a Subproof + val subproofDisj = + if nextProof.size == 1 then nextProof.head + else SCSubproof(SCProof(nextProof.toIndexedSeq.reverse, IndexedSeq.empty), IndexedSeq.empty) + (Some(subproofDisj :: prevProof), prevProof.size :: t, true) + else + // If the disjunct was not used, then the subbranch is a proof of the whole statement and the split is not necessary. + (res.map(_._1), List(nextProof.size - 1), false) + ) + proof.map(proo => + if needed == true then + val sequent = ((proo.flatMap(_.bot.left).toSet -- list.map(_._2)) |- ()) +<< branch.beta.head + (LeftOr(sequent, treversed.reverse, branch.beta.head.args) :: proo, treversed.size) + else (proo, proo.size - 1) + ) + else if (branch.gamma.nonEmpty) // If branch contains a Gamma formula (LeftForall) + val rec = gamma(branch) + val upperProof = decide(rec._1) + // LeftForall(bot: Sequent, t1: Int, phi: Formula, x: VariableLabel, t: Term) + upperProof.map((proof, step) => + if proof.head.bot.left.contains(rec._3) then + val sequent = (proof.head.bot -<< rec._3) +<< branch.gamma.head + (LeftForall(sequent, step, branch.gamma.head.inner, branch.gamma.head.bound, rec._2()) :: proof, step + 1) + else (proof, step) + ) + else if (closeSubst.nonEmpty && closeSubst.get._1.nonEmpty) // If branch can be closed with Instantiation (LeftForall) + val (x, t) = closeSubst.get._1.head + val (recBranch, instantiated) = applyInst(branch, x, t) + val upperProof = decide(recBranch) + upperProof.map((proof, step) => + if proof.head.bot.left.contains(instantiated) then + val sequent = (proof.head.bot -<< instantiated) +<< branch.unifiable(x) + (LeftForall(sequent, step, branch.unifiable(x).inner, branch.unifiable(x).bound, t) :: proof, step + 1) + else (proof, step) + ) + else None + // End of decide + } + + def containsAlpha(set: Set[Formula], f: Formula) = f match { + case ConnectorFormula(And, args) => args.exists(set.contains) + case _ => set.contains(f) + } + + def instantiate(f: Formula, x: VariableLabel, t: Term): Formula = f match + case ConnectorFormula(label, args) => ConnectorFormula(label, args.map(instantiate(_, x, t))) + case PredicateFormula(id, args) => PredicateFormula(id, args.map(substituteVariablesInTerm(_, Substitution(x -> t)))) + case BinderFormula(label, y, inner) => if (x == y) f else BinderFormula(label, y, instantiate(inner, x, t)) +} diff --git a/src/main/scala/lisa/mathematics/fol/Quantifiers.scala b/src/main/scala/lisa/mathematics/fol/Quantifiers.scala index e0028854..0d0a64c1 100644 --- a/src/main/scala/lisa/mathematics/fol/Quantifiers.scala +++ b/src/main/scala/lisa/mathematics/fol/Quantifiers.scala @@ -1,6 +1,7 @@ package lisa.mathematics package fol +import lisa.automation.Tableau import lisa.automation.kernel.OLPropositionalSolver.Tautology import lisa.automation.kernel.SimplePropositionalSolver.* import lisa.prooflib.Substitution @@ -27,15 +28,7 @@ object Quantifiers extends lisa.Main { val closedFormulaUniversal = Theorem( () |- ∀(x, p) <=> p ) { - val base = have(p |- p) by Hypothesis - - have(p |- ∀(x, p)) by RightForall(base) - val lhs = thenHave(() |- p ==> ∀(x, p)) by Restate - - have(∀(x, p) |- p) by LeftForall(base) - val rhs = thenHave(() |- ∀(x, p) ==> p) by Restate - have(thesis) by RightIff(lhs, rhs) - + have(thesis) by Tableau } /** @@ -45,15 +38,7 @@ object Quantifiers extends lisa.Main { val closedFormulaExistential = Theorem( () |- ∃(x, p) <=> p ) { - val base = have(p |- p) by Hypothesis - - have(p |- ∃(x, p)) by RightExists(base) - val lhs = thenHave(() |- p ==> ∃(x, p)) by Restate - - have(∃(x, p) |- p) by LeftExists(base) - val rhs = thenHave(() |- ∃(x, p) ==> p) by Restate - - have(thesis) by RightIff(lhs, rhs) + have(thesis) by Tableau } /** @@ -88,31 +73,7 @@ object Quantifiers extends lisa.Main { val universalConjunctionCommutation = Theorem( () |- forall(x, P(x) /\ Q(x)) <=> forall(x, P(x)) /\ forall(x, Q(x)) ) { - // forward direction - val fwd = have(forall(x, P(x) /\ Q(x)) ==> forall(x, P(x)) /\ forall(x, Q(x))) subproof { - have(P(x) /\ Q(x) |- P(x)) by Restate - thenHave(forall(x, P(x) /\ Q(x)) |- P(x)) by LeftForall - val px = thenHave(forall(x, P(x) /\ Q(x)) |- forall(x, P(x))) by RightForall - - have(P(x) /\ Q(x) |- Q(x)) by Restate - thenHave(forall(x, P(x) /\ Q(x)) |- Q(x)) by LeftForall - val qx = thenHave(forall(x, P(x) /\ Q(x)) |- forall(x, Q(x))) by RightForall - - have(forall(x, P(x) /\ Q(x)) |- forall(x, P(x)) /\ forall(x, Q(x))) by RightAnd(px, qx) - thenHave(thesis) by Restate - } - - // backward direction - val bwd = have(forall(x, P(x)) /\ forall(x, Q(x)) ==> forall(x, P(x) /\ Q(x))) subproof { - have((P(x), Q(x)) |- P(x) /\ Q(x)) by Restate - thenHave((forall(x, P(x)), Q(x)) |- P(x) /\ Q(x)) by LeftForall - thenHave((forall(x, P(x)), forall(x, Q(x))) |- P(x) /\ Q(x)) by LeftForall - thenHave((forall(x, P(x)), forall(x, Q(x))) |- forall(x, P(x) /\ Q(x))) by RightForall - - thenHave(thesis) by Restate - } - - have(thesis) by RightIff(fwd, bwd) + have(thesis) by Tableau } /** @@ -121,17 +82,7 @@ object Quantifiers extends lisa.Main { val existentialConjunctionDistribution = Theorem( exists(x, P(x) /\ Q(x)) |- exists(x, P(x)) /\ exists(x, Q(x)) ) { - have(P(x) |- P(x)) by Hypothesis - thenHave(P(x) /\ Q(x) |- P(x)) by Weakening - thenHave(P(x) /\ Q(x) |- exists(x, P(x))) by RightExists - val left = thenHave(exists(x, P(x) /\ Q(x)) |- exists(x, P(x))) by LeftExists - - have(Q(x) |- Q(x)) by Hypothesis - thenHave(P(x) /\ Q(x) |- Q(x)) by Weakening - thenHave(P(x) /\ Q(x) |- exists(x, Q(x))) by RightExists - val right = thenHave(exists(x, P(x) /\ Q(x)) |- exists(x, Q(x))) by LeftExists - - have(thesis) by RightAnd(left, right) + have(thesis) by Tableau } /** @@ -140,32 +91,7 @@ object Quantifiers extends lisa.Main { val existentialConjunctionWithClosedFormula = Theorem( exists(x, P(x) /\ p) <=> (exists(x, P(x)) /\ p) ) { - val forward = have(exists(x, P(x) /\ p) ==> (exists(x, P(x)) /\ p)) subproof { - have(exists(x, P(x) /\ p) |- exists(x, P(x)) /\ exists(x, p)) by Restate.from( - existentialConjunctionDistribution of ( - Q -> lambda(x, p) - ) - ) - val substitution = thenHave( - (exists(x, P(x) /\ p), (exists(x, P(x)) /\ exists(x, p)) <=> (exists(x, P(x)) /\ p)) |- exists(x, P(x)) /\ p - ) by RightSubstIff(List((exists(x, P(x)) /\ exists(x, p), exists(x, P(x)) /\ p)), lambda(p, p)) - - have(exists(x, p) <=> p) by Restate.from(closedFormulaExistential) - thenHave((exists(x, P(x)) /\ exists(x, p)) <=> (exists(x, P(x)) /\ p)) by Tautology - - have(exists(x, P(x) /\ p) |- exists(x, P(x)) /\ p) by Cut(lastStep, substitution) - thenHave(thesis) by Restate - } - - val backward = have((exists(x, P(x)) /\ p) ==> exists(x, P(x) /\ p)) subproof { - have(P(x) /\ p |- P(x) /\ p) by Hypothesis - thenHave((P(x), p) |- P(x) /\ p) by Restate - thenHave((P(x), p) |- exists(x, P(x) /\ p)) by RightExists - thenHave((exists(x, P(x)), p) |- exists(x, P(x) /\ p)) by LeftExists - thenHave(thesis) by Restate - } - - have(thesis) by RightIff(forward, backward) + have(thesis) by Tableau } /** @@ -200,31 +126,7 @@ object Quantifiers extends lisa.Main { val existentialDisjunctionCommutation = Theorem( () |- exists(x, P(x) \/ Q(x)) <=> exists(x, P(x)) \/ exists(x, Q(x)) ) { - // forward direction - val fwd = have(exists(x, P(x) \/ Q(x)) ==> exists(x, P(x)) \/ exists(x, Q(x))) subproof { - have(P(x) \/ Q(x) |- (P(x), Q(x))) by Restate - thenHave(P(x) \/ Q(x) |- (exists(x, P(x)), Q(x))) by RightExists - thenHave(P(x) \/ Q(x) |- (exists(x, P(x)), exists(x, Q(x)))) by RightExists - thenHave(exists(x, P(x) \/ Q(x)) |- (exists(x, P(x)), exists(x, Q(x)))) by LeftExists - - thenHave(thesis) by Restate - } - - // backward direction - val bwd = have(exists(x, P(x)) \/ exists(x, Q(x)) ==> exists(x, P(x) \/ Q(x))) subproof { - have(P(x) |- P(x) \/ Q(x)) by Restate - thenHave(P(x) |- exists(x, P(x) \/ Q(x))) by RightExists - val px = thenHave(exists(x, P(x)) |- exists(x, P(x) \/ Q(x))) by LeftExists - - have(Q(x) |- P(x) \/ Q(x)) by Restate - thenHave(Q(x) |- exists(x, P(x) \/ Q(x))) by RightExists - val qx = thenHave(exists(x, Q(x)) |- exists(x, P(x) \/ Q(x))) by LeftExists - - have(exists(x, P(x)) \/ exists(x, Q(x)) |- exists(x, P(x) \/ Q(x))) by LeftOr(px, qx) - thenHave(thesis) by Restate - } - - have(thesis) by RightIff(fwd, bwd) + have(thesis) by Tableau } /** @@ -233,24 +135,7 @@ object Quantifiers extends lisa.Main { val universalEquivalenceDistribution = Theorem( forall(z, P(z) <=> Q(z)) |- (forall(z, P(z)) <=> forall(z, Q(z))) ) { - have(forall(z, P(z) <=> Q(z)) |- forall(z, P(z) <=> Q(z))) by Hypothesis - val quant = thenHave(forall(z, P(z) <=> Q(z)) |- P(z) <=> Q(z)) by InstantiateForall(z) - - val lhs = have((forall(z, P(z) <=> Q(z)), forall(z, P(z))) |- forall(z, Q(z))) subproof { - have(forall(z, P(z)) |- forall(z, P(z))) by Hypothesis - thenHave(forall(z, P(z)) |- P(z)) by InstantiateForall(z) - have((forall(z, P(z) <=> Q(z)), forall(z, P(z))) |- Q(z)) by Tautology.from(lastStep, quant) - thenHave(thesis) by RightForall - } - - val rhs = have((forall(z, P(z) <=> Q(z)), forall(z, Q(z))) |- forall(z, P(z))) subproof { - have(forall(z, Q(z)) |- forall(z, Q(z))) by Hypothesis - thenHave(forall(z, Q(z)) |- Q(z)) by InstantiateForall(z) - have((forall(z, P(z) <=> Q(z)), forall(z, Q(z))) |- P(z)) by Tautology.from(lastStep, quant) - thenHave(thesis) by RightForall - } - - have(thesis) by Tautology.from(lhs, rhs) + have(thesis) by Tableau } /** @@ -260,24 +145,7 @@ object Quantifiers extends lisa.Main { val existentialEquivalenceDistribution = Theorem( forall(z, P(z) <=> Q(z)) |- (exists(z, P(z)) <=> exists(z, Q(z))) ) { - have(forall(z, P(z) <=> Q(z)) |- forall(z, P(z) <=> Q(z))) by Hypothesis - val quant = thenHave(forall(z, P(z) <=> Q(z)) |- P(z) <=> Q(z)) by InstantiateForall(z) - - val lhs = have((forall(z, P(z) <=> Q(z)), exists(z, P(z))) |- exists(z, Q(z))) subproof { - have(P(z) |- P(z)) by Hypothesis - have((forall(z, P(z) <=> Q(z)), P(z)) |- Q(z)) by Tautology.from(lastStep, quant) - thenHave((forall(z, P(z) <=> Q(z)), P(z)) |- exists(z, Q(z))) by RightExists - thenHave(thesis) by LeftExists - } - - val rhs = have((forall(z, P(z) <=> Q(z)), exists(z, Q(z))) |- exists(z, P(z))) subproof { - have(Q(z) |- Q(z)) by Hypothesis - have((forall(z, P(z) <=> Q(z)), Q(z)) |- P(z)) by Tautology.from(lastStep, quant) - thenHave((forall(z, P(z) <=> Q(z)), Q(z)) |- exists(z, P(z))) by RightExists - thenHave(thesis) by LeftExists - } - - have(thesis) by Tautology.from(lhs, rhs) + have(thesis) by Tableau } @@ -287,13 +155,7 @@ object Quantifiers extends lisa.Main { val universalImplicationDistribution = Theorem( forall(z, P(z) ==> Q(z)) |- (forall(z, P(z)) ==> forall(z, Q(z))) ) { - have(forall(z, P(z) ==> Q(z)) |- forall(z, P(z) ==> Q(z))) by Hypothesis - val quant = thenHave(forall(z, P(z) ==> Q(z)) |- P(z) ==> Q(z)) by InstantiateForall(z) - - have(forall(z, P(z)) |- forall(z, P(z))) by Hypothesis - thenHave(forall(z, P(z)) |- P(z)) by InstantiateForall(z) - have((forall(z, P(z) ==> Q(z)), forall(z, P(z))) |- Q(z)) by Tautology.from(lastStep, quant) - thenHave((forall(z, P(z) ==> Q(z)), forall(z, P(z))) |- forall(z, Q(z))) by RightForall + have(thesis) by Tableau } /** @@ -303,15 +165,7 @@ object Quantifiers extends lisa.Main { val existentialImplicationDistribution = Theorem( forall(z, P(z) ==> Q(z)) |- (exists(z, P(z)) ==> exists(z, Q(z))) ) { - have(forall(z, P(z) ==> Q(z)) |- forall(z, P(z) ==> Q(z))) by Hypothesis - val quant = thenHave(forall(z, P(z) ==> Q(z)) |- P(z) ==> Q(z)) by InstantiateForall(z) - - val impl = have((forall(z, P(z) ==> Q(z)), exists(z, P(z))) |- exists(z, Q(z))) subproof { - have(P(z) |- P(z)) by Hypothesis - have((forall(z, P(z) ==> Q(z)), P(z)) |- Q(z)) by Tautology.from(lastStep, quant) - thenHave((forall(z, P(z) ==> Q(z)), P(z)) |- exists(z, Q(z))) by RightExists - thenHave(thesis) by LeftExists - } + have(thesis) by Tableau } /** -- GitLab