72
|
1 {-# OPTIONS --allow-unsolved-metas #-}
|
|
2 module nat where
|
|
3
|
|
4 open import Data.Nat
|
|
5 open import Data.Nat.Properties
|
|
6 open import Data.Empty
|
|
7 open import Relation.Nullary
|
|
8 open import Relation.Binary.PropositionalEquality
|
|
9 open import Relation.Binary.Core
|
74
|
10 open import Relation.Binary.Definitions
|
72
|
11 open import logic
|
|
12
|
|
13
|
|
14 nat-<> : { x y : ℕ } → x < y → y < x → ⊥
|
|
15 nat-<> (s≤s x<y) (s≤s y<x) = nat-<> x<y y<x
|
|
16
|
|
17 nat-≤> : { x y : ℕ } → x ≤ y → y < x → ⊥
|
|
18 nat-≤> (s≤s x<y) (s≤s y<x) = nat-≤> x<y y<x
|
|
19
|
|
20 nat-<≡ : { x : ℕ } → x < x → ⊥
|
|
21 nat-<≡ (s≤s lt) = nat-<≡ lt
|
|
22
|
|
23 nat-≡< : { x y : ℕ } → x ≡ y → x < y → ⊥
|
|
24 nat-≡< refl lt = nat-<≡ lt
|
|
25
|
|
26 ¬a≤a : {la : ℕ} → suc la ≤ la → ⊥
|
|
27 ¬a≤a (s≤s lt) = ¬a≤a lt
|
|
28
|
|
29 a<sa : {la : ℕ} → la < suc la
|
|
30 a<sa {zero} = s≤s z≤n
|
|
31 a<sa {suc la} = s≤s a<sa
|
|
32
|
|
33 refl-≤s : {x : ℕ } → x ≤ suc x
|
|
34 refl-≤s {zero} = z≤n
|
|
35 refl-≤s {suc x} = s≤s (refl-≤s {x})
|
|
36
|
91
|
37 a≤sa : {x : ℕ } → x ≤ suc x
|
|
38 a≤sa {zero} = z≤n
|
|
39 a≤sa {suc x} = s≤s (a≤sa {x})
|
|
40
|
72
|
41 =→¬< : {x : ℕ } → ¬ ( x < x )
|
|
42 =→¬< {zero} ()
|
|
43 =→¬< {suc x} (s≤s lt) = =→¬< lt
|
|
44
|
|
45 >→¬< : {x y : ℕ } → (x < y ) → ¬ ( y < x )
|
|
46 >→¬< (s≤s x<y) (s≤s y<x) = >→¬< x<y y<x
|
|
47
|
|
48 <-∨ : { x y : ℕ } → x < suc y → ( (x ≡ y ) ∨ (x < y) )
|
|
49 <-∨ {zero} {zero} (s≤s z≤n) = case1 refl
|
|
50 <-∨ {zero} {suc y} (s≤s lt) = case2 (s≤s z≤n)
|
|
51 <-∨ {suc x} {zero} (s≤s ())
|
|
52 <-∨ {suc x} {suc y} (s≤s lt) with <-∨ {x} {y} lt
|
|
53 <-∨ {suc x} {suc y} (s≤s lt) | case1 eq = case1 (cong (λ k → suc k ) eq)
|
|
54 <-∨ {suc x} {suc y} (s≤s lt) | case2 lt1 = case2 (s≤s lt1)
|
|
55
|
|
56 max : (x y : ℕ) → ℕ
|
|
57 max zero zero = zero
|
|
58 max zero (suc x) = (suc x)
|
|
59 max (suc x) zero = (suc x)
|
|
60 max (suc x) (suc y) = suc ( max x y )
|
|
61
|
|
62 -- _*_ : ℕ → ℕ → ℕ
|
|
63 -- _*_ zero _ = zero
|
|
64 -- _*_ (suc n) m = m + ( n * m )
|
|
65
|
|
66 exp : ℕ → ℕ → ℕ
|
|
67 exp _ zero = 1
|
|
68 exp n (suc m) = n * ( exp n m )
|
|
69
|
|
70 minus : (a b : ℕ ) → ℕ
|
|
71 minus a zero = a
|
|
72 minus zero (suc b) = zero
|
|
73 minus (suc a) (suc b) = minus a b
|
|
74
|
|
75 _-_ = minus
|
|
76
|
|
77 m+= : {i j m : ℕ } → m + i ≡ m + j → i ≡ j
|
|
78 m+= {i} {j} {zero} refl = refl
|
|
79 m+= {i} {j} {suc m} eq = m+= {i} {j} {m} ( cong (λ k → pred k ) eq )
|
|
80
|
|
81 +m= : {i j m : ℕ } → i + m ≡ j + m → i ≡ j
|
|
82 +m= {i} {j} {m} eq = m+= ( subst₂ (λ j k → j ≡ k ) (+-comm i _ ) (+-comm j _ ) eq )
|
|
83
|
|
84 less-1 : { n m : ℕ } → suc n < m → n < m
|
|
85 less-1 {zero} {suc (suc _)} (s≤s (s≤s z≤n)) = s≤s z≤n
|
|
86 less-1 {suc n} {suc m} (s≤s lt) = s≤s (less-1 {n} {m} lt)
|
|
87
|
|
88 sa=b→a<b : { n m : ℕ } → suc n ≡ m → n < m
|
|
89 sa=b→a<b {0} {suc zero} refl = s≤s z≤n
|
|
90 sa=b→a<b {suc n} {suc (suc n)} refl = s≤s (sa=b→a<b refl)
|
|
91
|
|
92 minus+n : {x y : ℕ } → suc x > y → minus x y + y ≡ x
|
|
93 minus+n {x} {zero} _ = trans (sym (+-comm zero _ )) refl
|
|
94 minus+n {zero} {suc y} (s≤s ())
|
|
95 minus+n {suc x} {suc y} (s≤s lt) = begin
|
|
96 minus (suc x) (suc y) + suc y
|
|
97 ≡⟨ +-comm _ (suc y) ⟩
|
|
98 suc y + minus x y
|
|
99 ≡⟨ cong ( λ k → suc k ) (
|
|
100 begin
|
|
101 y + minus x y
|
|
102 ≡⟨ +-comm y _ ⟩
|
|
103 minus x y + y
|
|
104 ≡⟨ minus+n {x} {y} lt ⟩
|
|
105 x
|
|
106 ∎
|
|
107 ) ⟩
|
|
108 suc x
|
|
109 ∎ where open ≡-Reasoning
|
|
110
|
|
111 sn-m=sn-m : {m n : ℕ } → m ≤ n → suc n - m ≡ suc ( n - m )
|
|
112 sn-m=sn-m {0} {n} z≤n = refl
|
|
113 sn-m=sn-m {suc m} {suc n} (s≤s m<n) = sn-m=sn-m m<n
|
|
114
|
|
115 si-sn=i-n : {i n : ℕ } → n < i → suc (i - suc n) ≡ (i - n)
|
|
116 si-sn=i-n {i} {n} n<i = begin
|
|
117 suc (i - suc n) ≡⟨ sym (sn-m=sn-m n<i ) ⟩
|
|
118 suc i - suc n ≡⟨⟩
|
|
119 i - n
|
|
120 ∎ where
|
|
121 open ≡-Reasoning
|
|
122
|
|
123 n-m<n : (n m : ℕ ) → n - m ≤ n
|
|
124 n-m<n zero zero = z≤n
|
|
125 n-m<n (suc n) zero = s≤s (n-m<n n zero)
|
|
126 n-m<n zero (suc m) = z≤n
|
|
127 n-m<n (suc n) (suc m) = ≤-trans (n-m<n n m ) refl-≤s
|
|
128
|
|
129 n-n-m=m : {m n : ℕ } → m ≤ n → m ≡ (n - (n - m))
|
|
130 n-n-m=m {0} {zero} z≤n = refl
|
|
131 n-n-m=m {0} {suc n} z≤n = n-n-m=m {0} {n} z≤n
|
|
132 n-n-m=m {suc m} {suc n} (s≤s m≤n) = sym ( begin
|
|
133 suc n - ( n - m ) ≡⟨ sn-m=sn-m (n-m<n n m) ⟩
|
|
134 suc (n - ( n - m )) ≡⟨ cong (λ k → suc k ) (sym (n-n-m=m m≤n)) ⟩
|
|
135 suc m
|
|
136 ∎ ) where
|
|
137 open ≡-Reasoning
|
|
138
|
|
139 0<s : {x : ℕ } → zero < suc x
|
|
140 0<s {_} = s≤s z≤n
|
|
141
|
|
142 <-minus-0 : {x y z : ℕ } → z + x < z + y → x < y
|
|
143 <-minus-0 {x} {suc _} {zero} lt = lt
|
|
144 <-minus-0 {x} {y} {suc z} (s≤s lt) = <-minus-0 {x} {y} {z} lt
|
|
145
|
|
146 <-minus : {x y z : ℕ } → x + z < y + z → x < y
|
|
147 <-minus {x} {y} {z} lt = <-minus-0 ( subst₂ ( λ j k → j < k ) (+-comm x _) (+-comm y _ ) lt )
|
|
148
|
|
149 x≤x+y : {z y : ℕ } → z ≤ z + y
|
|
150 x≤x+y {zero} {y} = z≤n
|
|
151 x≤x+y {suc z} {y} = s≤s (x≤x+y {z} {y})
|
|
152
|
|
153 <-plus : {x y z : ℕ } → x < y → x + z < y + z
|
|
154 <-plus {zero} {suc y} {z} (s≤s z≤n) = s≤s (subst (λ k → z ≤ k ) (+-comm z _ ) x≤x+y )
|
|
155 <-plus {suc x} {suc y} {z} (s≤s lt) = s≤s (<-plus {x} {y} {z} lt)
|
|
156
|
|
157 <-plus-0 : {x y z : ℕ } → x < y → z + x < z + y
|
|
158 <-plus-0 {x} {y} {z} lt = subst₂ (λ j k → j < k ) (+-comm _ z) (+-comm _ z) ( <-plus {x} {y} {z} lt )
|
|
159
|
|
160 ≤-plus : {x y z : ℕ } → x ≤ y → x + z ≤ y + z
|
|
161 ≤-plus {0} {y} {zero} z≤n = z≤n
|
|
162 ≤-plus {0} {y} {suc z} z≤n = subst (λ k → z < k ) (+-comm _ y ) x≤x+y
|
|
163 ≤-plus {suc x} {suc y} {z} (s≤s lt) = s≤s ( ≤-plus {x} {y} {z} lt )
|
|
164
|
|
165 ≤-plus-0 : {x y z : ℕ } → x ≤ y → z + x ≤ z + y
|
|
166 ≤-plus-0 {x} {y} {zero} lt = lt
|
|
167 ≤-plus-0 {x} {y} {suc z} lt = s≤s ( ≤-plus-0 {x} {y} {z} lt )
|
|
168
|
|
169 x+y<z→x<z : {x y z : ℕ } → x + y < z → x < z
|
|
170 x+y<z→x<z {zero} {y} {suc z} (s≤s lt1) = s≤s z≤n
|
|
171 x+y<z→x<z {suc x} {y} {suc z} (s≤s lt1) = s≤s ( x+y<z→x<z {x} {y} {z} lt1 )
|
|
172
|
|
173 *≤ : {x y z : ℕ } → x ≤ y → x * z ≤ y * z
|
|
174 *≤ lt = *-mono-≤ lt ≤-refl
|
|
175
|
|
176 *< : {x y z : ℕ } → x < y → x * suc z < y * suc z
|
|
177 *< {zero} {suc y} lt = s≤s z≤n
|
|
178 *< {suc x} {suc y} (s≤s lt) = <-plus-0 (*< lt)
|
|
179
|
|
180 <to<s : {x y : ℕ } → x < y → x < suc y
|
|
181 <to<s {zero} {suc y} (s≤s lt) = s≤s z≤n
|
|
182 <to<s {suc x} {suc y} (s≤s lt) = s≤s (<to<s {x} {y} lt)
|
|
183
|
|
184 <tos<s : {x y : ℕ } → x < y → suc x < suc y
|
|
185 <tos<s {zero} {suc y} (s≤s z≤n) = s≤s (s≤s z≤n)
|
|
186 <tos<s {suc x} {suc y} (s≤s lt) = s≤s (<tos<s {x} {y} lt)
|
|
187
|
|
188 ≤to< : {x y : ℕ } → x < y → x ≤ y
|
|
189 ≤to< {zero} {suc y} (s≤s z≤n) = z≤n
|
|
190 ≤to< {suc x} {suc y} (s≤s lt) = s≤s (≤to< {x} {y} lt)
|
|
191
|
|
192 x<y→≤ : {x y : ℕ } → x < y → x ≤ suc y
|
|
193 x<y→≤ {zero} {.(suc _)} (s≤s z≤n) = z≤n
|
|
194 x<y→≤ {suc x} {suc y} (s≤s lt) = s≤s (x<y→≤ {x} {y} lt)
|
|
195
|
|
196 open import Data.Product
|
|
197
|
|
198 minus<=0 : {x y : ℕ } → x ≤ y → minus x y ≡ 0
|
|
199 minus<=0 {0} {zero} z≤n = refl
|
|
200 minus<=0 {0} {suc y} z≤n = refl
|
|
201 minus<=0 {suc x} {suc y} (s≤s le) = minus<=0 {x} {y} le
|
|
202
|
|
203 minus>0 : {x y : ℕ } → x < y → 0 < minus y x
|
|
204 minus>0 {zero} {suc _} (s≤s z≤n) = s≤s z≤n
|
|
205 minus>0 {suc x} {suc y} (s≤s lt) = minus>0 {x} {y} lt
|
|
206
|
|
207 distr-minus-* : {x y z : ℕ } → (minus x y) * z ≡ minus (x * z) (y * z)
|
|
208 distr-minus-* {x} {zero} {z} = refl
|
|
209 distr-minus-* {x} {suc y} {z} with <-cmp x y
|
|
210 distr-minus-* {x} {suc y} {z} | tri< a ¬b ¬c = begin
|
|
211 minus x (suc y) * z
|
|
212 ≡⟨ cong (λ k → k * z ) (minus<=0 {x} {suc y} (x<y→≤ a)) ⟩
|
|
213 0 * z
|
|
214 ≡⟨ sym (minus<=0 {x * z} {z + y * z} le ) ⟩
|
|
215 minus (x * z) (z + y * z)
|
|
216 ∎ where
|
|
217 open ≡-Reasoning
|
|
218 le : x * z ≤ z + y * z
|
|
219 le = ≤-trans lemma (subst (λ k → y * z ≤ k ) (+-comm _ z ) (x≤x+y {y * z} {z} ) ) where
|
|
220 lemma : x * z ≤ y * z
|
|
221 lemma = *≤ {x} {y} {z} (≤to< a)
|
|
222 distr-minus-* {x} {suc y} {z} | tri≈ ¬a refl ¬c = begin
|
|
223 minus x (suc y) * z
|
|
224 ≡⟨ cong (λ k → k * z ) (minus<=0 {x} {suc y} refl-≤s ) ⟩
|
|
225 0 * z
|
|
226 ≡⟨ sym (minus<=0 {x * z} {z + y * z} (lt {x} {z} )) ⟩
|
|
227 minus (x * z) (z + y * z)
|
|
228 ∎ where
|
|
229 open ≡-Reasoning
|
|
230 lt : {x z : ℕ } → x * z ≤ z + x * z
|
|
231 lt {zero} {zero} = z≤n
|
|
232 lt {suc x} {zero} = lt {x} {zero}
|
|
233 lt {x} {suc z} = ≤-trans lemma refl-≤s where
|
|
234 lemma : x * suc z ≤ z + x * suc z
|
|
235 lemma = subst (λ k → x * suc z ≤ k ) (+-comm _ z) (x≤x+y {x * suc z} {z})
|
|
236 distr-minus-* {x} {suc y} {z} | tri> ¬a ¬b c = +m= {_} {_} {suc y * z} ( begin
|
|
237 minus x (suc y) * z + suc y * z
|
|
238 ≡⟨ sym (proj₂ *-distrib-+ z (minus x (suc y) ) _) ⟩
|
|
239 ( minus x (suc y) + suc y ) * z
|
|
240 ≡⟨ cong (λ k → k * z) (minus+n {x} {suc y} (s≤s c)) ⟩
|
|
241 x * z
|
|
242 ≡⟨ sym (minus+n {x * z} {suc y * z} (s≤s (lt c))) ⟩
|
|
243 minus (x * z) (suc y * z) + suc y * z
|
|
244 ∎ ) where
|
|
245 open ≡-Reasoning
|
|
246 lt : {x y z : ℕ } → suc y ≤ x → z + y * z ≤ x * z
|
|
247 lt {x} {y} {z} le = *≤ le
|
|
248
|
|
249 minus- : {x y z : ℕ } → suc x > z + y → minus (minus x y) z ≡ minus x (y + z)
|
|
250 minus- {x} {y} {z} gt = +m= {_} {_} {z} ( begin
|
|
251 minus (minus x y) z + z
|
|
252 ≡⟨ minus+n {_} {z} lemma ⟩
|
|
253 minus x y
|
|
254 ≡⟨ +m= {_} {_} {y} ( begin
|
|
255 minus x y + y
|
|
256 ≡⟨ minus+n {_} {y} lemma1 ⟩
|
|
257 x
|
|
258 ≡⟨ sym ( minus+n {_} {z + y} gt ) ⟩
|
|
259 minus x (z + y) + (z + y)
|
|
260 ≡⟨ sym ( +-assoc (minus x (z + y)) _ _ ) ⟩
|
|
261 minus x (z + y) + z + y
|
|
262 ∎ ) ⟩
|
|
263 minus x (z + y) + z
|
|
264 ≡⟨ cong (λ k → minus x k + z ) (+-comm _ y ) ⟩
|
|
265 minus x (y + z) + z
|
|
266 ∎ ) where
|
|
267 open ≡-Reasoning
|
|
268 lemma1 : suc x > y
|
|
269 lemma1 = x+y<z→x<z (subst (λ k → k < suc x ) (+-comm z _ ) gt )
|
|
270 lemma : suc (minus x y) > z
|
|
271 lemma = <-minus {_} {_} {y} ( subst ( λ x → z + y < suc x ) (sym (minus+n {x} {y} lemma1 )) gt )
|
|
272
|
|
273 minus-* : {M k n : ℕ } → n < k → minus k (suc n) * M ≡ minus (minus k n * M ) M
|
|
274 minus-* {zero} {k} {n} lt = begin
|
|
275 minus k (suc n) * zero
|
|
276 ≡⟨ *-comm (minus k (suc n)) zero ⟩
|
|
277 zero * minus k (suc n)
|
|
278 ≡⟨⟩
|
|
279 0 * minus k n
|
|
280 ≡⟨ *-comm 0 (minus k n) ⟩
|
|
281 minus (minus k n * 0 ) 0
|
|
282 ∎ where
|
|
283 open ≡-Reasoning
|
|
284 minus-* {suc m} {k} {n} lt with <-cmp k 1
|
|
285 minus-* {suc m} {.0} {zero} lt | tri< (s≤s z≤n) ¬b ¬c = refl
|
|
286 minus-* {suc m} {.0} {suc n} lt | tri< (s≤s z≤n) ¬b ¬c = refl
|
|
287 minus-* {suc zero} {.1} {zero} lt | tri≈ ¬a refl ¬c = refl
|
|
288 minus-* {suc (suc m)} {.1} {zero} lt | tri≈ ¬a refl ¬c = minus-* {suc m} {1} {zero} lt
|
|
289 minus-* {suc m} {.1} {suc n} (s≤s ()) | tri≈ ¬a refl ¬c
|
|
290 minus-* {suc m} {k} {n} lt | tri> ¬a ¬b c = begin
|
|
291 minus k (suc n) * M
|
|
292 ≡⟨ distr-minus-* {k} {suc n} {M} ⟩
|
|
293 minus (k * M ) ((suc n) * M)
|
|
294 ≡⟨⟩
|
|
295 minus (k * M ) (M + n * M )
|
|
296 ≡⟨ cong (λ x → minus (k * M) x) (+-comm M _ ) ⟩
|
|
297 minus (k * M ) ((n * M) + M )
|
|
298 ≡⟨ sym ( minus- {k * M} {n * M} (lemma lt) ) ⟩
|
|
299 minus (minus (k * M ) (n * M)) M
|
|
300 ≡⟨ cong (λ x → minus x M ) ( sym ( distr-minus-* {k} {n} )) ⟩
|
|
301 minus (minus k n * M ) M
|
|
302 ∎ where
|
|
303 M = suc m
|
|
304 lemma : {n k m : ℕ } → n < k → suc (k * suc m) > suc m + n * suc m
|
|
305 lemma {zero} {suc k} {m} (s≤s lt) = s≤s (s≤s (subst (λ x → x ≤ m + k * suc m) (+-comm 0 _ ) x≤x+y ))
|
|
306 lemma {suc n} {suc k} {m} lt = begin
|
|
307 suc (suc m + suc n * suc m)
|
|
308 ≡⟨⟩
|
|
309 suc ( suc (suc n) * suc m)
|
|
310 ≤⟨ ≤-plus-0 {_} {_} {1} (*≤ lt ) ⟩
|
|
311 suc (suc k * suc m)
|
|
312 ∎ where open ≤-Reasoning
|
|
313 open ≡-Reasoning
|
112
|
314
|
|
315 open import Data.List
|
|
316
|
|
317 ℕL-inject : {h h1 : ℕ } {x y : List ℕ } → h ∷ x ≡ h1 ∷ y → h ≡ h1
|
|
318 ℕL-inject refl = refl
|
|
319
|
|
320 ℕL-inject-t : {h h1 : ℕ } {x y : List ℕ } → h ∷ x ≡ h1 ∷ y → x ≡ y
|
|
321 ℕL-inject-t refl = refl
|
|
322
|
|
323 ℕL-eq? : (x y : List ℕ ) → Dec (x ≡ y )
|
|
324 ℕL-eq? [] [] = yes refl
|
|
325 ℕL-eq? [] (x ∷ y) = no (λ ())
|
|
326 ℕL-eq? (x ∷ x₁) [] = no (λ ())
|
|
327 ℕL-eq? (h ∷ x) (h1 ∷ y) with h ≟ h1 | ℕL-eq? x y
|
|
328 ... | yes y1 | yes y2 = yes ( cong₂ (λ j k → j ∷ k ) y1 y2 )
|
|
329 ... | yes y1 | no n = no (λ e → n (ℕL-inject-t e))
|
|
330 ... | no n | t = no (λ e → n (ℕL-inject e))
|
|
331
|