| Copyright | (c) Levent Erkok |
|---|---|
| License | BSD3 |
| Maintainer | erkokl@gmail.com |
| Stability | experimental |
| Safe Haskell | None |
| Language | Haskell2010 |
Documentation.SBV.Examples.TP.Peano
Description
Modeling Peano arithmetic in SBV and proving various properties using TP. Most of the properties we prove come from https://en.wikipedia.org/wiki/Peano_axioms.
Synopsis
- data Nat
- cv2Nat :: String -> [CV] -> Nat
- _undefiner_Nat :: a
- type SNat = SBV Nat
- sZero :: SBV Nat
- sSucc :: SBV Nat -> SBV Nat
- isZero :: SBV Nat -> SBool
- isSucc :: SBV Nat -> SBool
- getSucc_1 :: SBV Nat -> SBV Nat
- sprev :: SBV Nat -> SBV Nat
- sCaseNat :: Mergeable result => SBV Nat -> result -> (SBV Nat -> result) -> result
- n2i :: SNat -> SInteger
- i2n :: SInteger -> SNat
- n2iNonNeg :: TP (Proof (Forall "n" Nat -> SBool))
- i2n2i :: TP (Proof (Forall "i" Integer -> SBool))
- n2i2n :: TP (Proof (Forall "n" Nat -> SBool))
- n2iAdd :: TP (Proof (Forall "m" Nat -> Forall "n" Nat -> SBool))
- addCorrect :: TP (Proof (Forall "m" Nat -> Forall "n" Nat -> SBool))
- addLeftUnit :: TP (Proof (Forall "m" Nat -> SBool))
- addRightUnit :: TP (Proof (Forall "m" Nat -> SBool))
- addSucc :: TP (Proof (Forall "m" Nat -> Forall "n" Nat -> SBool))
- addAssoc :: TP (Proof (Forall "m" Nat -> Forall "n" Nat -> Forall "o" Nat -> SBool))
- addComm :: TP (Proof (Forall "m" Nat -> Forall "n" Nat -> SBool))
- mulCorrect :: TP (Proof (Forall "m" Nat -> Forall "n" Nat -> SBool))
- mulLeftAbsorb :: TP (Proof (Forall "m" Nat -> SBool))
- mulRightAbsorb :: TP (Proof (Forall "m" Nat -> SBool))
- mulLeftUnit :: TP (Proof (Forall "m" Nat -> SBool))
- mulRightUnit :: TP (Proof (Forall "m" Nat -> SBool))
- distribLeft :: TP (Proof (Forall "m" Nat -> Forall "n" Nat -> Forall "o" Nat -> SBool))
- distribRight :: TP (Proof (Forall "m" Nat -> Forall "n" Nat -> Forall "o" Nat -> SBool))
- mulSucc :: TP (Proof (Forall "m" Nat -> Forall "n" Nat -> SBool))
- mulAssoc :: TP (Proof (Forall "m" Nat -> Forall "n" Nat -> Forall "o" Nat -> SBool))
- mulComm :: TP (Proof (Forall "m" Nat -> Forall "n" Nat -> SBool))
- ltTrans :: TP (Proof (Forall "m" Nat -> Forall "n" Nat -> Forall "o" Nat -> SBool))
- ltIrreflexive :: TP (Proof (Forall "m" Nat -> SBool))
- lteEquiv :: TP (Proof (Forall "m" Nat -> Forall "n" Nat -> SBool))
- ordered :: TP (Proof (Forall "m" Nat -> Forall "n" Nat -> SBool))
- trichotomy :: TP (Proof (Forall "m" Nat -> Forall "n" Nat -> SBool))
- addOrder :: TP (Proof (Forall "m" Nat -> Forall "n" Nat -> Forall "o" Nat -> SBool))
- mulOrder :: TP (Proof (Forall "m" Nat -> Forall "n" Nat -> Forall "o" Nat -> SBool))
- orderSum :: TP (Proof (Forall "m" Nat -> Forall "n" Nat -> SBool))
- zeroLtOne :: TP (Proof SBool)
- nothingBetweenZeroAndOne :: TP (Proof (Forall "m" Nat -> SBool))
- minimumElt :: TP (Proof (Forall "m" Nat -> SBool))
- noMaximumElt :: TP (Proof (Forall "m" Nat -> Exists "n" Nat -> SBool))
Documentation
Natural numbers. (If you are looking at the haddock documents, note the plethora of definitions
the call to mkSymbolic generates. You can mostly ignore these, except for the case analyzer,
the testers and accessors.)
Instances
_undefiner_Nat :: a Source #
Autogenerated definition to avoid unused-variable warnings from GHC.
sCaseNat :: Mergeable result => SBV Nat -> result -> (SBV Nat -> result) -> result Source #
Case analyzer for the type Nat.
Conversion to and from integers
n2iNonNeg :: TP (Proof (Forall "n" Nat -> SBool)) Source #
\(\overline{n} \geq 0\)
>>>runTP n2iNonNegLemma: n2iNonNeg Q.E.D. [Proven] n2iNonNeg :: Ɐn ∷ Nat → Bool
i2n2i :: TP (Proof (Forall "i" Integer -> SBool)) Source #
\(\overline{\underline{i}} = \max(i, 0)\).
>>>runTP i2n2iLemma: i2n2i Q.E.D. [Proven] i2n2i :: Ɐi ∷ Integer → Bool
n2i2n :: TP (Proof (Forall "n" Nat -> SBool)) Source #
\(\underline{\overline{n}} = n\)
>>>runTP n2i2nLemma: n2i2n Q.E.D. [Proven] n2i2n :: Ɐn ∷ Nat → Bool
n2iAdd :: TP (Proof (Forall "m" Nat -> Forall "n" Nat -> SBool)) Source #
\(\overline{m + n} = \overline{m} + \overline{n}\)
>>>runTP n2iAddLemma: n2iAdd Q.E.D. [Proven] n2iAdd :: Ɐm ∷ Nat → Ɐn ∷ Nat → Bool
Addition
Correctness
addCorrect :: TP (Proof (Forall "m" Nat -> Forall "n" Nat -> SBool)) Source #
\(\overline{m + n} = \overline{m} + \overline{n}\)
>>>runTP addCorrectLemma: addCorrect Q.E.D. [Proven] addCorrect :: Ɐm ∷ Nat → Ɐn ∷ Nat → Bool
Left and right unit
addLeftUnit :: TP (Proof (Forall "m" Nat -> SBool)) Source #
\(0 + m = m\)
>>>runTP addLeftUnitLemma: addLeftUnit Q.E.D. [Proven] addLeftUnit :: Ɐm ∷ Nat → Bool
addRightUnit :: TP (Proof (Forall "m" Nat -> SBool)) Source #
\(m + 0 = m\)
>>>runTP addRightUnitLemma: addRightUnit Q.E.D. [Proven] addRightUnit :: Ɐm ∷ Nat → Bool
Addition with non-zero values
addSucc :: TP (Proof (Forall "m" Nat -> Forall "n" Nat -> SBool)) Source #
\(m + \mathrm{Succ}\,n = \mathrm{Succ}\,(m + n)\)
>>>runTP addSuccLemma: caseZero Q.E.D. Lemma: caseSucc Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Result: Q.E.D. Lemma: addSucc Q.E.D. [Proven] addSucc :: Ɐm ∷ Nat → Ɐn ∷ Nat → Bool
Associativity
addAssoc :: TP (Proof (Forall "m" Nat -> Forall "n" Nat -> Forall "o" Nat -> SBool)) Source #
\(m + (n + o) = (m + n) + o\)
>>>runTP addAssocLemma: addAssoc Q.E.D. [Proven] addAssoc :: Ɐm ∷ Nat → Ɐn ∷ Nat → Ɐo ∷ Nat → Bool
Commutativity
addComm :: TP (Proof (Forall "m" Nat -> Forall "n" Nat -> SBool)) Source #
\(m + n = n + m\)
>>>runTP addCommLemma: addLeftUnit Q.E.D. Lemma: addRightUnit Q.E.D. Lemma: caseZero Q.E.D. Lemma: addSucc Q.E.D. Lemma: caseSucc Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Result: Q.E.D. Lemma: addComm Q.E.D. [Proven] addComm :: Ɐm ∷ Nat → Ɐn ∷ Nat → Bool
Multiplication
Correctness
mulCorrect :: TP (Proof (Forall "m" Nat -> Forall "n" Nat -> SBool)) Source #
\(\overline{m * n} = \overline{m} * \overline{n}\)
>>>runTP mulCorrectLemma: caseZero Q.E.D. Lemma: addCorrect Q.E.D. Lemma: caseSucc Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Step: 4 Q.E.D. Step: 5 Q.E.D. Result: Q.E.D. Lemma: mullCorrect Q.E.D. [Proven] mullCorrect :: Ɐm ∷ Nat → Ɐn ∷ Nat → Bool
Left and right absorption
mulLeftAbsorb :: TP (Proof (Forall "m" Nat -> SBool)) Source #
\(0 * m = 0\)
>>>runTP mulLeftAbsorbLemma: mulLeftAbsorb Q.E.D. [Proven] mulLeftAbsorb :: Ɐm ∷ Nat → Bool
mulRightAbsorb :: TP (Proof (Forall "m" Nat -> SBool)) Source #
\(m * 0 = 0\)
>>>runTP mulRightAbsorbLemma: mulRightAbsorb Q.E.D. [Proven] mulRightAbsorb :: Ɐm ∷ Nat → Bool
Left and right unit
mulLeftUnit :: TP (Proof (Forall "m" Nat -> SBool)) Source #
\(\mathrm{Succ\,0} * m = m\)
>>>runTP mulLeftUnitLemma: mulLeftUnit Q.E.D. [Proven] mulLeftUnit :: Ɐm ∷ Nat → Bool
mulRightUnit :: TP (Proof (Forall "m" Nat -> SBool)) Source #
\(m * \mathrm{Succ\,0} = m\)
>>>runTP mulRightUnitLemma: mulRightUnit Q.E.D. [Proven] mulRightUnit :: Ɐm ∷ Nat → Bool
Distribution over addition
distribLeft :: TP (Proof (Forall "m" Nat -> Forall "n" Nat -> Forall "o" Nat -> SBool)) Source #
\(m * (n + o) = m * n + m * o\)
>>>runTP distribLeftLemma: caseZero Q.E.D. Lemma: addAssoc Q.E.D. Lemma: addComm Q.E.D. Lemma: caseSucc Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Step: 4 Q.E.D. Step: 5 Q.E.D. Step: 6 Q.E.D. Step: 7 Q.E.D. Step: 8 Q.E.D. Step: 9 Q.E.D. Result: Q.E.D. Lemma: distribLeft Q.E.D. [Proven] distribLeft :: Ɐm ∷ Nat → Ɐn ∷ Nat → Ɐo ∷ Nat → Bool
distribRight :: TP (Proof (Forall "m" Nat -> Forall "n" Nat -> Forall "o" Nat -> SBool)) Source #
\((m + n) * o = m * o + n * o\)
>>>runTP distribRightLemma: caseZero Q.E.D. Lemma: addAssoc Q.E.D. Lemma: addComm Q.E.D. Lemma: addSucc Q.E.D. Lemma: caseSucc Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Step: 4 Q.E.D. Step: 5 Q.E.D. Step: 6 Q.E.D. Step: 7 Q.E.D. Result: Q.E.D. Lemma: distribRight Q.E.D. [Proven] distribRight :: Ɐm ∷ Nat → Ɐn ∷ Nat → Ɐo ∷ Nat → Bool
Multiplication with non-zero values
mulSucc :: TP (Proof (Forall "m" Nat -> Forall "n" Nat -> SBool)) Source #
\(m * \mathrm{Succ}\,n = m * n + m\)
>>>runTP mulSuccLemma: addLeftUnit Q.E.D. Lemma: distribLeft Q.E.D. Lemma: mulRightUnit Q.E.D. Lemma: addComm Q.E.D. Lemma: mulSucc Step: 1 Q.E.D. Step: 2 (defn of +) Q.E.D. Step: 3 Q.E.D. Step: 4 Q.E.D. Step: 5 Q.E.D. Result: Q.E.D. [Proven] mulSucc :: Ɐm ∷ Nat → Ɐn ∷ Nat → Bool
Associativity
mulAssoc :: TP (Proof (Forall "m" Nat -> Forall "n" Nat -> Forall "o" Nat -> SBool)) Source #
\(m * (n * o) = (m * n) * o\)
>>>runTP mulAssocLemma: caseZero Q.E.D. Lemma: distribRight Q.E.D. Lemma: caseSucc Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Step: 4 Q.E.D. Result: Q.E.D. Lemma: mulAssoc Q.E.D. [Proven] mulAssoc :: Ɐm ∷ Nat → Ɐn ∷ Nat → Ɐo ∷ Nat → Bool
Commutativity
mulComm :: TP (Proof (Forall "m" Nat -> Forall "n" Nat -> SBool)) Source #
\(m * n = n * m\)
>>>runTP mulCommLemma: mulRightAbsorb Q.E.D. Lemma: caseZero Q.E.D. Lemma: mulRightUnit Q.E.D. Lemma: distribLeft Q.E.D. Lemma: caseSucc Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Step: 4 Q.E.D. Step: 5 Q.E.D. Step: 6 Q.E.D. Result: Q.E.D. Lemma: mulComm Q.E.D. [Proven] mulComm :: Ɐm ∷ Nat → Ɐn ∷ Nat → Bool
Ordering
Transitivity of <
ltTrans :: TP (Proof (Forall "m" Nat -> Forall "n" Nat -> Forall "o" Nat -> SBool)) Source #
\(m < n \;\wedge\; n < o \;\rightarrow\; m < o\)
>>>runTP ltTransLemma: addAssoc Q.E.D. Lemma: ltTrans Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Step: 4 Q.E.D. Step: 5 Q.E.D. Step: 6 Q.E.D. Result: Q.E.D. [Proven] ltTrans :: Ɐm ∷ Nat → Ɐn ∷ Nat → Ɐo ∷ Nat → Bool
Irreflexivity of <
ltIrreflexive :: TP (Proof (Forall "m" Nat -> SBool)) Source #
\(\neg(m < m)\)
>>>runTP ltIrreflexiveLemma: cancel Q.E.D. Lemma: ltIrreflexive Step: 1 Q.E.D. Step: 2 Q.E.D. Result: Q.E.D. [Proven] ltIrreflexive :: Ɐm ∷ Nat → Bool
Trichotomy
lteEquiv :: TP (Proof (Forall "m" Nat -> Forall "n" Nat -> SBool)) Source #
\(m \geq n = \overline{m} \geq \overline{n}\)
>>>runTP lteEquivLemma: n2iAdd Q.E.D. Lemma: n2iNonNeg Q.E.D. Lemma: n2i2n Q.E.D. Lemma: i2n2i Q.E.D. Lemma: addRightUnit Q.E.D. Lemma: lteEquiv_ltr Step: 1 (2 way case split) Step: 1.1 Q.E.D. Step: 1.2.1 Q.E.D. Step: 1.2.2 Q.E.D. Step: 1.2.3 Q.E.D. Step: 1.2.4 Q.E.D. Step: 1.Completeness Q.E.D. Result: Q.E.D. Lemma: lteEquiv_rtl Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Step: 4 Q.E.D. Step: 5 Q.E.D. Step: 6 Q.E.D. Step: 7 (2 way case split) Step: 7.1 Q.E.D. Step: 7.2.1 Q.E.D. Step: 7.2.2 Q.E.D. Step: 7.2.3 Q.E.D. Step: 7.2.4 Q.E.D. Step: 7.2.5 Q.E.D. Step: 7.Completeness Q.E.D. Result: Q.E.D. Lemma: lteEquiv Q.E.D. [Proven] lteEquiv :: Ɐm ∷ Nat → Ɐn ∷ Nat → Bool
ordered :: TP (Proof (Forall "m" Nat -> Forall "n" Nat -> SBool)) Source #
\(m \geq n \;\lor\; n \geq m\)
>>>runTP orderedLemma: lteEquiv Q.E.D. Lemma: ordered Step: 1 Q.E.D. Step: 2 Q.E.D. Result: Q.E.D. [Proven] ordered :: Ɐm ∷ Nat → Ɐn ∷ Nat → Bool
trichotomy :: TP (Proof (Forall "m" Nat -> Forall "n" Nat -> SBool)) Source #
\(m < n \;\lor\; m = n \;\lor\; n < m\)
>>>runTP trichotomyLemma: ordered Q.E.D. Lemma: trichotomy Q.E.D. [Proven] trichotomy :: Ɐm ∷ Nat → Ɐn ∷ Nat → Bool
Addition and ordering
addOrder :: TP (Proof (Forall "m" Nat -> Forall "n" Nat -> Forall "o" Nat -> SBool)) Source #
\(m < n \;\rightarrow\; m + o < n + o\)
>>>runTP addOrderLemma: addAssoc Q.E.D. Lemma: addComm Q.E.D. Lemma: addOrder Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Step: 4 Q.E.D. Step: 5 Q.E.D. Result: Q.E.D. [Proven] addOrder :: Ɐm ∷ Nat → Ɐn ∷ Nat → Ɐo ∷ Nat → Bool
Multiplication and ordering
mulOrder :: TP (Proof (Forall "m" Nat -> Forall "n" Nat -> Forall "o" Nat -> SBool)) Source #
\(o > 0 \;\wedge\; m < n \;\rightarrow\; m * o < n * o\)
>>>runTP mulOrderLemma: distribRight Q.E.D. Lemma: mulOrder Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Step: 4 Q.E.D. Step: 5 Q.E.D. Step: 6 Q.E.D. Result: Q.E.D. [Proven] mulOrder :: Ɐm ∷ Nat → Ɐn ∷ Nat → Ɐo ∷ Nat → Bool
Order and sum
orderSum :: TP (Proof (Forall "m" Nat -> Forall "n" Nat -> SBool)) Source #
\(m < n \;\rightarrow\; \exists o.\; m + o = n\)
>>>runTP orderSumLemma: orderSum Q.E.D. [Proven] orderSum :: Ɐm ∷ Nat → Ɐn ∷ Nat → Bool
0 and 1 relationship
zeroLtOne :: TP (Proof SBool) Source #
\(0 < 1\)
>>>runTP zeroLtOneLemma: zeroLtOne Q.E.D. [Proven] zeroLtOne :: Bool
nothingBetweenZeroAndOne :: TP (Proof (Forall "m" Nat -> SBool)) Source #
\(m > 0 \;\rightarrow\; m \geq 1\)
>>>runTP nothingBetweenZeroAndOneLemma: nothingBetweenZeroAndOne Q.E.D. [Proven] nothingBetweenZeroAndOne :: Ɐm ∷ Nat → Bool
0 is the minimum
minimumElt :: TP (Proof (Forall "m" Nat -> SBool)) Source #
\(m \geq 0\)
>>>runTP minimumEltLemma: minimumElt Q.E.D. [Proven] minimumElt :: Ɐm ∷ Nat → Bool