diff --git a/src/main/scala/lisa/proven/mathematics/Peano.scala b/src/main/scala/lisa/proven/mathematics/Peano.scala new file mode 100644 index 0000000000000000000000000000000000000000..2b6139ddd3ffc4dd988e9db45b215960facc26fc --- /dev/null +++ b/src/main/scala/lisa/proven/mathematics/Peano.scala @@ -0,0 +1,40 @@ +package lisa.proven.mathematics + +import lisa.utils.Helpers.{given, *} +import lisa.kernel.fol.FOL.* +import lisa.kernel.proof.RunningTheory + +object Peano { + type Axiom = Formula + final val (x, y) = + (VariableLabel("x"), VariableLabel("y")) + + final val zero: Term = ConstantFunctionLabel("0", 0)() + final val s = ConstantFunctionLabel("S", 1) + final val plus = ConstantFunctionLabel("+", 2) + final val times = ConstantFunctionLabel("*", 2) + final val sPhi: SchematicPredicateLabel = SchematicPredicateLabel("?p", 1) + + final val ax1ZeroSuccessor: Axiom = forall(x, !(s(x) === zero)) + final val ax2Injectivity: Axiom = forall(x, forall(y, (s(x) === s(y)) ==> (x === y))) + final val ax3neutral: Axiom = forall(x, plus(x, zero) === x) + final val ax4plus: Axiom = forall(x, forall(y, plus(x, s(y)) === s(plus(x, y)))) + final val ax5: Axiom = forall(x, times(x, zero) === zero) + final val ax6: Axiom = forall(x, forall(y, times(x, s(y)) === plus(times(x, y), x))) + final val ax7induction: Axiom = (sPhi(zero) /\ forall(x, sPhi(x) ==> sPhi(s(x)))) ==> forall(x, sPhi(x)) + + final val runningPeanoTheory: RunningTheory = new RunningTheory() + final val functions: Set[ConstantFunctionLabel] = Set(ConstantFunctionLabel("0", 0), s, plus, times) + functions.foreach(runningPeanoTheory.addSymbol(_)) + + private val peanoAxioms: Set[(String, Axiom)] = Set( + ("A1", ax1ZeroSuccessor), + ("A2", ax2Injectivity), + ("A3", ax3neutral), + ("A4", ax4plus), + ("A5", ax5), + ("A6", ax6), + ("Induction", ax7induction) + ) + peanoAxioms.foreach(a => runningPeanoTheory.addAxiom(a._1, a._2)) +}