From 4f19acdf4e13fcb4afba82a460d1eb0765096ff8 Mon Sep 17 00:00:00 2001 From: Katja Goltsova <katja.goltsova@protonmail.com> Date: Sun, 17 Jul 2022 00:50:48 +0200 Subject: [PATCH 1/2] Add tests for formula and set removals from sequents --- .../scala/lisa/utils/SequentUtilsTest.scala | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 lisa-utils/src/test/scala/lisa/utils/SequentUtilsTest.scala diff --git a/lisa-utils/src/test/scala/lisa/utils/SequentUtilsTest.scala b/lisa-utils/src/test/scala/lisa/utils/SequentUtilsTest.scala new file mode 100644 index 00000000..846b131b --- /dev/null +++ b/lisa-utils/src/test/scala/lisa/utils/SequentUtilsTest.scala @@ -0,0 +1,56 @@ +package lisa.utils + +import lisa.kernel.fol.FOL.* +import lisa.kernel.proof.SequentCalculus.Sequent +import lisa.kernel.proof.SequentCalculus.isSameSequent +import lisa.test.ProofCheckerSuite +import lisa.utils.Helpers.* + +import scala.collection.immutable.Set + +class SequentUtilsTest extends ProofCheckerSuite { + val simpleSequent: Sequent = s === t |- s === t + val sequent: Sequent = Set(s === t, t === u) |- Set(s === t, s === u) + val emptySequent: Sequent = () |- () + + test("left remove formula") { + val leftFormula = simpleSequent.left.head + // plain removal + assert((simpleSequent -< leftFormula) === (() |- simpleSequent.right)) + // isSame removal + val sameFormula = leftFormula /\ (s === s) + assert(!(sameFormula == leftFormula)) + assert(isSame(leftFormula, sameFormula)) + assert((simpleSequent -< sameFormula) === (simpleSequent -< leftFormula)) + } + + test("right remove formula") { + val rightFormula = simpleSequent.right.head + // plain removal + assert((simpleSequent -> rightFormula) === (simpleSequent.left |- ())) + // isSame removal + val sameFormula = rightFormula /\ (s === s) + assert(!(sameFormula == rightFormula)) + assert(isSame(rightFormula, sameFormula)) + assert((simpleSequent -> sameFormula) === (simpleSequent -> rightFormula)) + } + + test("left remove set") { + assert(sequent --< sequent === (() |- sequent.right)) + val sameLeft = Sequent(sequent.left.map(_ /\ (u === u)), sequent.right) + assert((sequent --< sameLeft) === (() |- sequent.right)) + } + + test("right remove set") { + assert((sequent --> sequent) === (sequent.left |- ())) + val sameRight = Sequent(sequent.left, sequent.right.map(_ /\ (u === u))) + assert(!(sequent.right === sameRight)) + assert(isSameSet(sequent.right, sameRight.right)) + assert(sequent --> sameRight === (sequent.left |- ())) + } + + test("sequent remove sequent") { + val equivalentSequent = Set((s === t) /\ (s === s), t === u) |- Set(s === t, (s === u) /\ (u === u)) + assert(sequent -- equivalentSequent === emptySequent) + } +} -- GitLab From da641136a2f0767e39a073669f44d2a70f3e454c Mon Sep 17 00:00:00 2001 From: Katja Goltsova <katja.goltsova@protonmail.com> Date: Mon, 18 Jul 2022 10:08:08 +0200 Subject: [PATCH 2/2] When removing a formula from a sequent, account for isSame formulas First try removing the exact formula, if that fails, remove all isSame formulas. This increases the runtime of the removal operation to O(n). --- .../src/main/scala/lisa/utils/KernelHelpers.scala | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/lisa-utils/src/main/scala/lisa/utils/KernelHelpers.scala b/lisa-utils/src/main/scala/lisa/utils/KernelHelpers.scala index e372a02e..94f5fb0e 100644 --- a/lisa-utils/src/main/scala/lisa/utils/KernelHelpers.scala +++ b/lisa-utils/src/main/scala/lisa/utils/KernelHelpers.scala @@ -98,17 +98,21 @@ trait KernelHelpers { val emptySeq: Sequent = Sequent(Set.empty, Set.empty) + private def removeFormula(s: Set[Formula], f: Formula): Set[Formula] = { + if (s.contains(f)) s - f else s.filterNot(isSame(_, f)) + } + extension (s: Sequent) { infix def +<(f: Formula): Sequent = s.copy(left = s.left + f) - infix def -<(f: Formula): Sequent = s.copy(left = s.left - f) + infix def -<(f: Formula): Sequent = s.copy(left = removeFormula(s.left, f)) infix def +>(f: Formula): Sequent = s.copy(right = s.right + f) - infix def ->(f: Formula): Sequent = s.copy(right = s.right - f) + infix def ->(f: Formula): Sequent = s.copy(right = removeFormula(s.right, f)) infix def ++<(s1: Sequent): Sequent = s.copy(left = s.left ++ s1.left) - infix def --<(s1: Sequent): Sequent = s.copy(left = s.left -- s1.left) + infix def --<(s1: Sequent): Sequent = s.copy(left = s1.left.foldLeft(s.left)(removeFormula)) infix def ++>(s1: Sequent): Sequent = s.copy(right = s.right ++ s1.right) - infix def -->(s1: Sequent): Sequent = s.copy(right = s.right -- s1.right) + infix def -->(s1: Sequent): Sequent = s.copy(right = s1.right.foldLeft(s.right)(removeFormula)) infix def ++(s1: Sequent): Sequent = s.copy(left = s.left ++ s1.left, right = s.right ++ s1.right) - infix def --(s1: Sequent): Sequent = s.copy(left = s.left -- s1.left, right = s.right -- s1.right) + infix def --(s1: Sequent): Sequent = s.copy(left = s1.left.foldLeft(s.left)(removeFormula), right = s1.right.foldLeft(s.right)(removeFormula)) } /** -- GitLab