Safe Haskell | Safe |
---|---|
Language | Haskell2010 |
Less-than-or-equal relation for (unary) natural numbers Nat
.
There are at least three ways to encode this relation.
- \(zero : 0 \le m\) and \(succ : n \le m \to 1 + n \le 1 + m\) (this module),
- \(refl : n \le n \) and \(step : n \le m \to n \le 1 + m\) (Data.Type.Nat.LE.ReflStep),
- \(ex : \exists p. n + p \equiv m \) (tricky in Haskell).
Depending on a situation, usage ergonomics are different.
Synopsis
- class LE n m where
- data LEProof n m where
- withLEProof :: LEProof n m -> (LE n m => r) -> r
- decideLE :: forall n m. (SNatI n, SNatI m) => Dec (LEProof n m)
- leZero :: LEProof 'Z n
- leSucc :: LEProof n m -> LEProof ('S n) ('S m)
- leRefl :: forall n. SNatI n => LEProof n n
- leStep :: LEProof n m -> LEProof n ('S m)
- leAsym :: LEProof n m -> LEProof m n -> n :~: m
- leTrans :: LEProof n m -> LEProof m p -> LEProof n p
- leSwap :: forall n m. (SNatI n, SNatI m) => Neg (LEProof n m) -> LEProof ('S m) n
- leSwap' :: LEProof n m -> LEProof ('S m) n -> void
- leStepL :: LEProof ('S n) m -> LEProof n m
- lePred :: LEProof ('S n) ('S m) -> LEProof n m
- proofZeroLEZero :: LEProof n 'Z -> n :~: 'Z
Relation
Total order of Nat
, less-than-or-Equal-to, \( \le \).
data LEProof n m where Source #
An evidence of \(n \le m\). zero+succ definition.
Instances
Show (LEProof n m) Source # | |
(LE m n, n' ~ 'S n) => Absurd (LEProof n' m) Source # | Since: 0.2.1 |
Defined in Data.Type.Nat.LE | |
LE n m => Boring (LEProof n m) Source # | Since: 0.2.1 |
Defined in Data.Type.Nat.LE | |
(SNatI n, SNatI m) => Decidable (LEProof n m) Source # | |
Defined in Data.Type.Nat.LE | |
Eq (LEProof n m) Source # | |
Ord (LEProof n m) Source # | |
Defined in Data.Type.Nat.LE |
Decidability
decideLE :: forall n m. (SNatI n, SNatI m) => Dec (LEProof n m) Source #
Find the
, i.e. compare numbers.LEProof
n m
Lemmas
Constructor like
leSucc :: LEProof n m -> LEProof ('S n) ('S m) Source #
\(\forall n\, m : \mathbb{N}, n \le m \to 1 + n \le 1 + m \)
leStep :: LEProof n m -> LEProof n ('S m) Source #
\(\forall n\, m : \mathbb{N}, n \le m \to n \le 1 + m \)
Partial order
leAsym :: LEProof n m -> LEProof m n -> n :~: m Source #
\(\forall n\, m : \mathbb{N}, n \le m \to m \le n \to n \equiv m \)
leTrans :: LEProof n m -> LEProof m p -> LEProof n p Source #
\(\forall n\, m\, p : \mathbb{N}, n \le m \to m \le p \to n \le p \)
Total order
leSwap :: forall n m. (SNatI n, SNatI m) => Neg (LEProof n m) -> LEProof ('S m) n Source #
\(\forall n\, m : \mathbb{N}, \neg (n \le m) \to 1 + m \le n \)
leSwap' :: LEProof n m -> LEProof ('S m) n -> void Source #
\(\forall n\, m : \mathbb{N}, n \le m \to \neg (1 + m \le n) \)
>>>
leProof :: LEProof Nat2 Nat3
LESucc (LESucc LEZero)
>>>
leSwap (leSwap' (leProof :: LEProof Nat2 Nat3))
LESucc (LESucc (LESucc LEZero))
>>>
lePred (leSwap (leSwap' (leProof :: LEProof Nat2 Nat3)))
LESucc (LESucc LEZero)
More
leStepL :: LEProof ('S n) m -> LEProof n m Source #
\(\forall n\, m : \mathbb{N}, 1 + n \le m \to n \le m \)