1
1
module Lam.Nat where
2
2
3
- open import Haskell.Prelude using (Eq; _==_; True; False; Bool; []; _∷_; List; Maybe; Nothing; Just)
3
+ open import Haskell.Prelude hiding (Nat; iEqNat; length; _<_; lookup; _+_; drop)
4
+ open import Relation.Nullary using (¬_)
5
+ open import Data.Empty using (⊥-elim; ⊥)
6
+ open import Data.Sum using (_⊎_; inj₁; inj₂)
4
7
5
8
data Nat : Set where
6
9
Z : Nat
@@ -12,13 +15,29 @@ instance
12
15
iEqNat ._==_ (S x) (S y) = x == y
13
16
iEqNat ._==_ _ _ = False
14
17
18
+ eq->≡ : ∀ {i j : Nat} → ((i == j) ≡ True) → i ≡ j
19
+ eq->≡ {Z} {Z} h = refl
20
+ eq->≡ {S i} {S j} h = cong S (eq->≡ {i} {j} h)
21
+
22
+ eq->not≡ : ∀ (i j : Nat) → ((i == j) ≡ False) → ¬ (i ≡ j)
23
+ eq->not≡ (S i) .(S i) h refl = eq->not≡ i i h refl
24
+
15
25
{-# COMPILE AGDA2HS Nat deriving (Eq, Show) #-}
16
26
17
27
ltNat : Nat → Nat → Bool
18
28
ltNat Z (S _) = True
19
29
ltNat (S x) (S y) = ltNat x y
20
30
ltNat _ _ = False
21
31
32
+ ltSuc : ∀ (x y : Nat) → ltNat x y ≡ False → ltNat (S x) y ≡ False
33
+ ltSuc Z Z h = refl
34
+ ltSuc (S x) Z h = refl
35
+ ltSuc (S x) (S y) h = ltSuc x y h
36
+
37
+ ltZ : ∀ {i} → ltNat i Z ≡ False
38
+ ltZ {Z} = refl
39
+ ltZ {S i} = refl
40
+
22
41
{-# COMPILE AGDA2HS ltNat #-}
23
42
24
43
inc : Nat → Nat
@@ -32,17 +51,96 @@ dec (S x) = x
32
51
33
52
{-# COMPILE AGDA2HS dec #-}
34
53
54
+ add : Nat → Nat → Nat
55
+ add Z j = j
56
+ add (S i) j = inc (add i j)
57
+
58
+ addZero : ∀ (i : Nat) → add i Z ≡ i
59
+ addZero Z = refl
60
+ addZero (S i) = cong S (addZero i)
61
+
62
+ addSuc : ∀ (i j : Nat) → add i (S j) ≡ S (add i j)
63
+ addSuc Z j = refl
64
+ addSuc (S i) j = cong S (addSuc i j)
65
+
35
66
length : {A : Set } → List A -> Nat
36
67
length [] = Z
37
68
length (_ ∷ xs) = S (length xs)
38
69
70
+ eqSuc : ∀ {i j : Nat} → S i ≡ S j → i ≡ j
71
+ eqSuc {i} {.i} refl = refl
72
+
39
73
data _≤_ : Nat → Nat → Set where
40
74
z≤ : ∀ {i} → Z ≤ i
41
75
s≤s : ∀ {i j} → i ≤ j → (S i) ≤ (S j)
42
76
77
+ sucLE : ∀ {i j : Nat} → S i ≤ S j → i ≤ j
78
+ sucLE (s≤s h) = h
79
+
80
+ decideLE : ∀ (i j : Nat) → (i ≤ j) ⊎ (¬ (i ≤ j))
81
+ decideLE Z Z = inj₁ z≤
82
+ decideLE Z (S j) = inj₁ z≤
83
+ decideLE (S i) Z = inj₂ (λ ())
84
+ decideLE (S i) (S j) with decideLE i j
85
+ ... | inj₁ h = inj₁ (s≤s h)
86
+ ... | inj₂ h = inj₂ (λ abs -> h (sucLE abs))
87
+
43
88
_<_ : Nat -> Nat -> Set
44
89
i < j = S i ≤ j
45
90
91
+ <-rewrite : ∀ {i j k : Nat} → i < j → j ≡ k → i < k
92
+ <-rewrite h refl = h
93
+
94
+ not<Self : ∀ (i : Nat) → ¬ (i < i)
95
+ not<Self (S i) (s≤s h) = not<Self i h
96
+
97
+ <s : ∀ {i j : Nat} → i < S j → i ≤ j
98
+ <s (s≤s h) = h
99
+
100
+ s< : ∀ {i j : Nat} → i < j → S i < S j
101
+ s< {Z} {j} h = s≤s h
102
+ s< {S i} {S j} h = s≤s h
103
+
104
+ s≤Self : ∀ (i : Nat) → i ≤ S i
105
+ s≤Self Z = z≤
106
+ s≤Self (S i) = s≤s (s≤Self i)
107
+
108
+
109
+ s<Self : ∀ (i : Nat) → i < S i
110
+ s<Self Z = s≤s z≤
111
+ s<Self (S i) = s≤s (s<Self i)
112
+
113
+ ≤-trans : ∀ {i j k : Nat} → i ≤ j → j ≤ k → i ≤ k
114
+ ≤-trans z≤ z≤ = z≤
115
+ ≤-trans z≤ (s≤s h2) = z≤
116
+ ≤-trans (s≤s h1) (s≤s h2) = s≤s (≤-trans h1 h2)
117
+
118
+ addInc : ∀ (i j : Nat) → j ≤ add i j
119
+ addInc Z Z = z≤
120
+ addInc Z (S j) = s≤s (addInc Z j)
121
+ addInc (S i) Z = z≤
122
+ addInc (S i) (S j) = s≤s (≤-trans (s≤Self j) (addInc i (S j)))
123
+
124
+ <-trans : ∀ {i j k : Nat} → i < j → j < k → i < k
125
+ <-trans {Z} {.(S _)} {.(S _)} (s≤s h1) (s≤s h2) = s≤s z≤
126
+ <-trans {S i} {.(S _)} {.(S _)} (s≤s h1) (s≤s h2) = s≤s (<-trans h1 h2)
127
+
128
+ <≤-trans : ∀ {i j k : Nat} → i < j → j ≤ k → i < k
129
+ <≤-trans (s≤s h1) (s≤s h2) = s≤s (≤-trans h1 h2)
130
+
131
+ ≤<-trans : ∀ {i j k : Nat} → i ≤ j → j < k → i < k
132
+ ≤<-trans z≤ (s≤s h2) = s≤s z≤
133
+ ≤<-trans (s≤s h1) (s≤s h2) = s≤s (≤<-trans h1 h2)
134
+
135
+ lt->< : ∀ {i j : Nat} → ltNat i j ≡ True → i < j
136
+ lt->< {Z} {S j} h = s≤s z≤
137
+ lt->< {S i} {S j} h = s≤s (lt->< h)
138
+
139
+ lt->≤ : ∀ {i j : Nat} → ltNat i j ≡ False → j ≤ i
140
+ lt->≤ {Z} {Z} h = z≤
141
+ lt->≤ {S i} {Z} h = z≤
142
+ lt->≤ {S i} {S j} h = s≤s (lt->≤ h)
143
+
46
144
lookupMaybe : {t : Set } → Nat → List t → Maybe t
47
145
lookupMaybe _ [] = Nothing
48
146
lookupMaybe Z (h ∷ _) = Just h
@@ -53,3 +151,76 @@ lookupMaybe (S i) (_ ∷ t) = lookupMaybe i t
53
151
lookup : {A : Set } -> (l : List A) -> (i : Nat) -> (h : i < length l) -> A
54
152
lookup (x ∷ l) Z h = x
55
153
lookup (x ∷ l) (S i) (s≤s h) = lookup l i h
154
+
155
+ piLookup : ∀ {A : Set } (Γ : List A) (i : Nat) (h1 : i < length Γ) (h2 : i < length Γ) → lookup Γ i h1 ≡ lookup Γ i h2
156
+ piLookup (x ∷ g) Z h1 h2 = refl
157
+ piLookup (x ∷ g) (S i) (s≤s h1) (s≤s h2) = piLookup g i h1 h2
158
+
159
+ insert : {A : Set } → Nat → A → List A → List A
160
+ insert Z t g = t ∷ g
161
+ insert (S i) t [] = t ∷ []
162
+ insert (S i) t (x ∷ g) = x ∷ insert i t g
163
+
164
+ ≤-refl : ∀ {i : Nat} → i ≤ i
165
+ ≤-refl {Z} = z≤
166
+ ≤-refl {S i} = s≤s (≤-refl {i})
167
+
168
+ insertIncLength : ∀ {A : Set } {L : List A} {x : A} {i : Nat} → length L < length (insert i x L)
169
+ insertIncLength {L = []} {i = Z} = s≤s z≤
170
+ insertIncLength {L = []} {i = S i} = s≤s z≤
171
+ insertIncLength {L = _ ∷ _} {i = Z} = s≤s ≤-refl
172
+ insertIncLength {L = x ∷ L} {i = S i} = s≤s insertIncLength
173
+
174
+ remove : ∀ {A : Set } (i : Nat) (L : List A) → List A
175
+ remove _ [] = []
176
+ remove Z (x ∷ L) = L
177
+ remove (S i) (x ∷ L) = x ∷ remove i L
178
+
179
+ removeLargeId : ∀ {A : Set } (i : Nat) (L : List A) → length L ≤ i → remove i L ≡ L
180
+ removeLargeId Z [] h = refl
181
+ removeLargeId (S i) [] h = refl
182
+ removeLargeId (S i) (x ∷ L) (s≤s h) = cong (λ y -> x ∷ y) (removeLargeId i L h)
183
+
184
+ sucLT : ∀ {i j : Nat} → S i < S j → i < j
185
+ sucLT (s≤s h) = h
186
+
187
+ sucLT2 : ∀ {i j : Nat} → S i < j → i < j
188
+ sucLT2 {Z} {.(S _)} (s≤s h) = s≤s z≤
189
+ sucLT2 {S i} {.(S _)} (s≤s h) = s≤s (sucLT2 h)
190
+
191
+ sucLT3 : ∀ {i : Nat} → i < S i
192
+ sucLT3 {Z} = s≤s z≤
193
+ sucLT3 {S i} = s≤s sucLT3
194
+
195
+ sucEQ : ∀ {i j : Nat} → S i ≡ S j → i ≡ j
196
+ sucEQ refl = refl
197
+
198
+ sucNeq : ∀ {i j : Nat} → ¬ (S i ≡ S j) → ¬ (i ≡ j)
199
+ sucNeq h1 refl = ⊥-elim (h1 refl)
200
+
201
+ notLE->LT : ∀ {i j : Nat} → ¬ (i ≤ j) → j < i
202
+ notLE->LT {Z} {Z} h = ⊥-elim (h ≤-refl)
203
+ notLE->LT {Z} {S j} h = ⊥-elim (h z≤)
204
+ notLE->LT {S i} {Z} h = s≤s z≤
205
+ notLE->LT {S i} {S j} h = s< (notLE->LT {i} {j} λ abs -> h (s≤s abs))
206
+
207
+ removeLength : ∀ {A : Set } (i : Nat) (L : List A) → length L ≤ S (length (remove i L))
208
+ removeLength Z [] = z≤
209
+ removeLength Z (x ∷ L) = s≤s ≤-refl
210
+ removeLength (S i) [] = z≤
211
+ removeLength (S i) (x ∷ L) = s≤s (removeLength i L)
212
+
213
+ lengthRemove : ∀ {A : Set } {L : List A} {i j : Nat} → i < length L → i < j → i < length (remove j L)
214
+ lengthRemove {_} {L} {i} {j} h1 h2 with decideLE (length L) j
215
+ ... | (inj₁ jBig) rewrite removeLargeId j L jBig = h1
216
+ ... | (inj₂ jSmall) = <≤-trans h2 (<s (<≤-trans (notLE->LT jSmall) (removeLength j L)))
217
+
218
+ almostTrichotomy : ∀ (i j : Nat) → i ≤ j → (¬ (i ≡ j)) → i < j
219
+ almostTrichotomy Z Z z≤ h2 = ⊥-elim (h2 refl)
220
+ almostTrichotomy Z (S j) z≤ h2 = s≤s z≤
221
+ almostTrichotomy (S i) (S j) (s≤s h1) h2 = s≤s (almostTrichotomy i j h1 λ eq -> h2 (cong S eq))
222
+
223
+ drop : {A : Set } → Nat → List A → List A
224
+ drop Z l = l
225
+ drop (S i) [] = []
226
+ drop (S i) (x ∷ l) = drop i l
0 commit comments