Skip to content

Commit 0b431a6

Browse files
committed
Nat Ord proof
1 parent 7b3e48a commit 0b431a6

File tree

3 files changed

+86
-2
lines changed

3 files changed

+86
-2
lines changed

lib/Haskell/Law/Ord.agda

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ module Haskell.Law.Ord where
33
open import Haskell.Law.Ord.Def public
44
open import Haskell.Law.Ord.Bool public
55
open import Haskell.Law.Ord.Maybe public
6+
open import Haskell.Law.Ord.Nat public
67
open import Haskell.Law.Ord.Ordering public

lib/Haskell/Law/Ord/Def.agda

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,8 +176,6 @@ gt2gte x y h
176176
-- Postulated instances
177177

178178
postulate instance
179-
iLawfulOrdNat : IsLawfulOrd Nat
180-
181179
iLawfulOrdInteger : IsLawfulOrd Integer
182180

183181
iLawfulOrdInt : IsLawfulOrd Int

lib/Haskell/Law/Ord/Nat.agda

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
module Haskell.Law.Ord.Nat where
2+
3+
open import Haskell.Prim
4+
open import Haskell.Prim.Bool
5+
open import Haskell.Prim.Eq
6+
open import Haskell.Prim.Ord
7+
8+
open import Haskell.Law.Bool
9+
open import Haskell.Law.Eq
10+
open import Haskell.Law.Equality
11+
open import Haskell.Law.Ord.Def
12+
open import Haskell.Law.Nat
13+
14+
instance
15+
iLawfulOrdNat : IsLawfulOrd Nat
16+
17+
iLawfulOrdNat .comparability zero zero = refl
18+
iLawfulOrdNat .comparability zero (suc y) = refl
19+
iLawfulOrdNat .comparability (suc x) zero = refl
20+
iLawfulOrdNat .comparability (suc x) (suc y)
21+
rewrite comparability x y
22+
= refl
23+
24+
iLawfulOrdNat .transitivity zero y zero h₁ = refl
25+
iLawfulOrdNat .transitivity zero y (suc z) h₁ = refl
26+
iLawfulOrdNat .transitivity (suc x) (suc y) zero h₁
27+
rewrite &&-sym (x <= y) False
28+
= h₁
29+
iLawfulOrdNat .transitivity (suc x) (suc y) (suc z) h₁ = transitivity x y z h₁
30+
31+
iLawfulOrdNat .reflexivity zero = refl
32+
iLawfulOrdNat .reflexivity (suc x) = reflexivity x
33+
34+
iLawfulOrdNat .antisymmetry zero zero h₁ = refl
35+
iLawfulOrdNat .antisymmetry (suc x) (suc y) h₁ = antisymmetry x y h₁
36+
37+
iLawfulOrdNat .lte2gte zero zero = refl
38+
iLawfulOrdNat .lte2gte zero (suc y) = refl
39+
iLawfulOrdNat .lte2gte (suc x) zero = refl
40+
iLawfulOrdNat .lte2gte (suc x) (suc y) = lte2gte x y
41+
42+
iLawfulOrdNat .lt2LteNeq zero zero = refl
43+
iLawfulOrdNat .lt2LteNeq zero (suc y) = refl
44+
iLawfulOrdNat .lt2LteNeq (suc x) zero = refl
45+
iLawfulOrdNat .lt2LteNeq (suc x) (suc y) = lt2LteNeq x y
46+
47+
iLawfulOrdNat .lt2gt zero y = refl
48+
iLawfulOrdNat .lt2gt (suc x) y = refl
49+
50+
iLawfulOrdNat .compareLt zero zero = refl
51+
iLawfulOrdNat .compareLt zero (suc y) = refl
52+
iLawfulOrdNat .compareLt (suc x) zero = refl
53+
iLawfulOrdNat .compareLt (suc x) (suc y) = compareLt x y
54+
55+
iLawfulOrdNat .compareGt zero zero = refl
56+
iLawfulOrdNat .compareGt zero (suc y) = refl
57+
iLawfulOrdNat .compareGt (suc x) zero = refl
58+
iLawfulOrdNat .compareGt (suc x) (suc y) = compareGt x y
59+
60+
iLawfulOrdNat .compareEq zero zero = refl
61+
iLawfulOrdNat .compareEq zero (suc y) = refl
62+
iLawfulOrdNat .compareEq (suc x) zero = refl
63+
iLawfulOrdNat .compareEq (suc x) (suc y) = compareEq x y
64+
65+
iLawfulOrdNat .min2if zero zero = refl
66+
iLawfulOrdNat .min2if zero (suc y) = refl
67+
iLawfulOrdNat .min2if (suc x) zero = refl
68+
iLawfulOrdNat .min2if (suc x) (suc y) with x <= y in h₁
69+
... | True
70+
rewrite (cong (min x y ==_) (sym $ ifTrueEqThen (x <= y) {x} {y} h₁))
71+
= min2if x y
72+
... | False
73+
rewrite (cong (min x y ==_) (sym $ ifFalseEqElse (x <= y) {x} {y} h₁))
74+
= min2if x y
75+
76+
iLawfulOrdNat .max2if zero zero = refl
77+
iLawfulOrdNat .max2if zero (suc y) = equality' y y refl
78+
iLawfulOrdNat .max2if (suc x) zero = equality' x x refl
79+
iLawfulOrdNat .max2if (suc x) (suc y) with x >= y in h₁
80+
... | True
81+
rewrite (cong (max x y ==_) (sym $ ifTrueEqThen (x >= y) {x} {y} h₁))
82+
= max2if x y
83+
... | False
84+
rewrite (cong (max x y ==_) (sym $ ifFalseEqElse (x >= y) {x} {y} h₁))
85+
= max2if x y

0 commit comments

Comments
 (0)