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
|
314
|
10 open import Relation.Binary.Definitions
|
72
|
11 open import logic
|
314
|
12 open import Level hiding ( zero ; suc )
|
72
|
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 =→¬< : {x : ℕ } → ¬ ( x < x )
|
|
34 =→¬< {zero} ()
|
|
35 =→¬< {suc x} (s≤s lt) = =→¬< lt
|
|
36
|
|
37 >→¬< : {x y : ℕ } → (x < y ) → ¬ ( y < x )
|
|
38 >→¬< (s≤s x<y) (s≤s y<x) = >→¬< x<y y<x
|
|
39
|
|
40 <-∨ : { x y : ℕ } → x < suc y → ( (x ≡ y ) ∨ (x < y) )
|
|
41 <-∨ {zero} {zero} (s≤s z≤n) = case1 refl
|
|
42 <-∨ {zero} {suc y} (s≤s lt) = case2 (s≤s z≤n)
|
|
43 <-∨ {suc x} {zero} (s≤s ())
|
|
44 <-∨ {suc x} {suc y} (s≤s lt) with <-∨ {x} {y} lt
|
|
45 <-∨ {suc x} {suc y} (s≤s lt) | case1 eq = case1 (cong (λ k → suc k ) eq)
|
|
46 <-∨ {suc x} {suc y} (s≤s lt) | case2 lt1 = case2 (s≤s lt1)
|
|
47
|
314
|
48 ≤-∨ : { x y : ℕ } → x ≤ y → ( (x ≡ y ) ∨ (x < y) )
|
|
49 ≤-∨ {zero} {zero} z≤n = case1 refl
|
|
50 ≤-∨ {zero} {suc y} z≤n = case2 (s≤s z≤n)
|
|
51 ≤-∨ {suc x} {zero} ()
|
|
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)
|
210
|
55
|
72
|
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
|
314
|
62 x≤max : (x y : ℕ) → x ≤ max x y
|
|
63 x≤max zero zero = ≤-refl
|
|
64 x≤max zero (suc x) = z≤n
|
|
65 x≤max (suc x) zero = ≤-refl
|
|
66 x≤max (suc x) (suc y) = s≤s( x≤max x y )
|
|
67
|
|
68 y≤max : (x y : ℕ) → y ≤ max x y
|
|
69 y≤max zero zero = ≤-refl
|
|
70 y≤max zero (suc x) = ≤-refl
|
|
71 y≤max (suc x) zero = z≤n
|
|
72 y≤max (suc x) (suc y) = s≤s( y≤max x y )
|
|
73
|
|
74 x≤y→max=y : (x y : ℕ) → x ≤ y → max x y ≡ y
|
|
75 x≤y→max=y zero zero x≤y = refl
|
|
76 x≤y→max=y zero (suc y) x≤y = refl
|
|
77 x≤y→max=y (suc x) (suc y) (s≤s x≤y) = cong suc (x≤y→max=y x y x≤y )
|
|
78
|
|
79 y≤x→max=x : (x y : ℕ) → y ≤ x → max x y ≡ x
|
|
80 y≤x→max=x zero zero y≤x = refl
|
|
81 y≤x→max=x zero (suc y) ()
|
|
82 y≤x→max=x (suc x) zero lt = refl
|
|
83 y≤x→max=x (suc x) (suc y) (s≤s y≤x) = cong suc (y≤x→max=x x y y≤x )
|
|
84
|
72
|
85 -- _*_ : ℕ → ℕ → ℕ
|
|
86 -- _*_ zero _ = zero
|
|
87 -- _*_ (suc n) m = m + ( n * m )
|
|
88
|
314
|
89 -- x ^ y
|
72
|
90 exp : ℕ → ℕ → ℕ
|
|
91 exp _ zero = 1
|
|
92 exp n (suc m) = n * ( exp n m )
|
|
93
|
314
|
94 div2 : ℕ → (ℕ ∧ Bool )
|
|
95 div2 zero = ⟪ 0 , false ⟫
|
|
96 div2 (suc zero) = ⟪ 0 , true ⟫
|
|
97 div2 (suc (suc n)) = ⟪ suc (proj1 (div2 n)) , proj2 (div2 n) ⟫ where
|
|
98 open _∧_
|
|
99
|
|
100 div2-rev : (ℕ ∧ Bool ) → ℕ
|
|
101 div2-rev ⟪ x , true ⟫ = suc (x + x)
|
|
102 div2-rev ⟪ x , false ⟫ = x + x
|
|
103
|
|
104 div2-eq : (x : ℕ ) → div2-rev ( div2 x ) ≡ x
|
|
105 div2-eq zero = refl
|
|
106 div2-eq (suc zero) = refl
|
|
107 div2-eq (suc (suc x)) with div2 x | inspect div2 x
|
|
108 ... | ⟪ x1 , true ⟫ | record { eq = eq1 } = begin -- eq1 : div2 x ≡ ⟪ x1 , true ⟫
|
|
109 div2-rev ⟪ suc x1 , true ⟫ ≡⟨⟩
|
|
110 suc (suc (x1 + suc x1)) ≡⟨ cong (λ k → suc (suc k )) (+-comm x1 _ ) ⟩
|
|
111 suc (suc (suc (x1 + x1))) ≡⟨⟩
|
|
112 suc (suc (div2-rev ⟪ x1 , true ⟫)) ≡⟨ cong (λ k → suc (suc (div2-rev k ))) (sym eq1) ⟩
|
|
113 suc (suc (div2-rev (div2 x))) ≡⟨ cong (λ k → suc (suc k)) (div2-eq x) ⟩
|
|
114 suc (suc x) ∎ where open ≡-Reasoning
|
|
115 ... | ⟪ x1 , false ⟫ | record { eq = eq1 } = begin
|
|
116 div2-rev ⟪ suc x1 , false ⟫ ≡⟨⟩
|
|
117 suc (x1 + suc x1) ≡⟨ cong (λ k → (suc k )) (+-comm x1 _ ) ⟩
|
|
118 suc (suc (x1 + x1)) ≡⟨⟩
|
|
119 suc (suc (div2-rev ⟪ x1 , false ⟫)) ≡⟨ cong (λ k → suc (suc (div2-rev k ))) (sym eq1) ⟩
|
|
120 suc (suc (div2-rev (div2 x))) ≡⟨ cong (λ k → suc (suc k)) (div2-eq x) ⟩
|
|
121 suc (suc x) ∎ where open ≡-Reasoning
|
|
122
|
|
123 sucprd : {i : ℕ } → 0 < i → suc (pred i) ≡ i
|
|
124 sucprd {suc i} 0<i = refl
|
|
125
|
|
126 0<s : {x : ℕ } → zero < suc x
|
|
127 0<s {_} = s≤s z≤n
|
|
128
|
|
129 px<py : {x y : ℕ } → pred x < pred y → x < y
|
|
130 px<py {zero} {suc y} lt = 0<s
|
|
131 px<py {suc zero} {suc (suc y)} (s≤s lt) = s≤s 0<s
|
|
132 px<py {suc (suc x)} {suc (suc y)} (s≤s lt) = s≤s (px<py {suc x} {suc y} lt)
|
|
133
|
72
|
134 minus : (a b : ℕ ) → ℕ
|
|
135 minus a zero = a
|
|
136 minus zero (suc b) = zero
|
|
137 minus (suc a) (suc b) = minus a b
|
|
138
|
|
139 _-_ = minus
|
|
140
|
314
|
141 sn-m=sn-m : {m n : ℕ } → m ≤ n → suc n - m ≡ suc ( n - m )
|
|
142 sn-m=sn-m {0} {n} z≤n = refl
|
|
143 sn-m=sn-m {suc m} {suc n} (s≤s m<n) = sn-m=sn-m m<n
|
|
144
|
|
145 si-sn=i-n : {i n : ℕ } → n < i → suc (i - suc n) ≡ (i - n)
|
|
146 si-sn=i-n {i} {n} n<i = begin
|
|
147 suc (i - suc n) ≡⟨ sym (sn-m=sn-m n<i ) ⟩
|
|
148 suc i - suc n ≡⟨⟩
|
|
149 i - n
|
|
150 ∎ where
|
|
151 open ≡-Reasoning
|
|
152
|
|
153 refl-≤s : {x : ℕ } → x ≤ suc x
|
|
154 refl-≤s {zero} = z≤n
|
|
155 refl-≤s {suc x} = s≤s (refl-≤s {x})
|
|
156
|
|
157 a≤sa = refl-≤s
|
|
158
|
|
159 n-m<n : (n m : ℕ ) → n - m ≤ n
|
|
160 n-m<n zero zero = z≤n
|
|
161 n-m<n (suc n) zero = s≤s (n-m<n n zero)
|
|
162 n-m<n zero (suc m) = z≤n
|
|
163 n-m<n (suc n) (suc m) = ≤-trans (n-m<n n m ) refl-≤s
|
|
164
|
|
165 n-n-m=m : {m n : ℕ } → m ≤ n → m ≡ (n - (n - m))
|
|
166 n-n-m=m {0} {zero} z≤n = refl
|
|
167 n-n-m=m {0} {suc n} z≤n = n-n-m=m {0} {n} z≤n
|
|
168 n-n-m=m {suc m} {suc n} (s≤s m≤n) = sym ( begin
|
|
169 suc n - ( n - m ) ≡⟨ sn-m=sn-m (n-m<n n m) ⟩
|
|
170 suc (n - ( n - m )) ≡⟨ cong (λ k → suc k ) (sym (n-n-m=m m≤n)) ⟩
|
|
171 suc m
|
|
172 ∎ ) where
|
|
173 open ≡-Reasoning
|
|
174
|
72
|
175 m+= : {i j m : ℕ } → m + i ≡ m + j → i ≡ j
|
|
176 m+= {i} {j} {zero} refl = refl
|
|
177 m+= {i} {j} {suc m} eq = m+= {i} {j} {m} ( cong (λ k → pred k ) eq )
|
|
178
|
|
179 +m= : {i j m : ℕ } → i + m ≡ j + m → i ≡ j
|
|
180 +m= {i} {j} {m} eq = m+= ( subst₂ (λ j k → j ≡ k ) (+-comm i _ ) (+-comm j _ ) eq )
|
|
181
|
|
182 less-1 : { n m : ℕ } → suc n < m → n < m
|
|
183 less-1 {zero} {suc (suc _)} (s≤s (s≤s z≤n)) = s≤s z≤n
|
|
184 less-1 {suc n} {suc m} (s≤s lt) = s≤s (less-1 {n} {m} lt)
|
|
185
|
|
186 sa=b→a<b : { n m : ℕ } → suc n ≡ m → n < m
|
|
187 sa=b→a<b {0} {suc zero} refl = s≤s z≤n
|
|
188 sa=b→a<b {suc n} {suc (suc n)} refl = s≤s (sa=b→a<b refl)
|
|
189
|
|
190 minus+n : {x y : ℕ } → suc x > y → minus x y + y ≡ x
|
|
191 minus+n {x} {zero} _ = trans (sym (+-comm zero _ )) refl
|
|
192 minus+n {zero} {suc y} (s≤s ())
|
|
193 minus+n {suc x} {suc y} (s≤s lt) = begin
|
|
194 minus (suc x) (suc y) + suc y
|
|
195 ≡⟨ +-comm _ (suc y) ⟩
|
|
196 suc y + minus x y
|
|
197 ≡⟨ cong ( λ k → suc k ) (
|
|
198 begin
|
|
199 y + minus x y
|
|
200 ≡⟨ +-comm y _ ⟩
|
|
201 minus x y + y
|
|
202 ≡⟨ minus+n {x} {y} lt ⟩
|
|
203 x
|
|
204 ∎
|
|
205 ) ⟩
|
|
206 suc x
|
|
207 ∎ where open ≡-Reasoning
|
|
208
|
|
209 <-minus-0 : {x y z : ℕ } → z + x < z + y → x < y
|
|
210 <-minus-0 {x} {suc _} {zero} lt = lt
|
|
211 <-minus-0 {x} {y} {suc z} (s≤s lt) = <-minus-0 {x} {y} {z} lt
|
|
212
|
|
213 <-minus : {x y z : ℕ } → x + z < y + z → x < y
|
|
214 <-minus {x} {y} {z} lt = <-minus-0 ( subst₂ ( λ j k → j < k ) (+-comm x _) (+-comm y _ ) lt )
|
|
215
|
|
216 x≤x+y : {z y : ℕ } → z ≤ z + y
|
|
217 x≤x+y {zero} {y} = z≤n
|
|
218 x≤x+y {suc z} {y} = s≤s (x≤x+y {z} {y})
|
|
219
|
314
|
220 x≤y+x : {z y : ℕ } → z ≤ y + z
|
|
221 x≤y+x {z} {y} = subst (λ k → z ≤ k ) (+-comm _ y ) x≤x+y
|
|
222
|
|
223 x≤x+sy : {x y : ℕ} → x < x + suc y
|
|
224 x≤x+sy {x} {y} = begin
|
|
225 suc x ≤⟨ x≤x+y ⟩
|
|
226 suc x + y ≡⟨ cong (λ k → k + y) (+-comm 1 x ) ⟩
|
|
227 (x + 1) + y ≡⟨ (+-assoc x 1 _) ⟩
|
|
228 x + suc y ∎ where open ≤-Reasoning
|
|
229
|
72
|
230 <-plus : {x y z : ℕ } → x < y → x + z < y + z
|
|
231 <-plus {zero} {suc y} {z} (s≤s z≤n) = s≤s (subst (λ k → z ≤ k ) (+-comm z _ ) x≤x+y )
|
|
232 <-plus {suc x} {suc y} {z} (s≤s lt) = s≤s (<-plus {x} {y} {z} lt)
|
|
233
|
|
234 <-plus-0 : {x y z : ℕ } → x < y → z + x < z + y
|
|
235 <-plus-0 {x} {y} {z} lt = subst₂ (λ j k → j < k ) (+-comm _ z) (+-comm _ z) ( <-plus {x} {y} {z} lt )
|
|
236
|
|
237 ≤-plus : {x y z : ℕ } → x ≤ y → x + z ≤ y + z
|
|
238 ≤-plus {0} {y} {zero} z≤n = z≤n
|
|
239 ≤-plus {0} {y} {suc z} z≤n = subst (λ k → z < k ) (+-comm _ y ) x≤x+y
|
|
240 ≤-plus {suc x} {suc y} {z} (s≤s lt) = s≤s ( ≤-plus {x} {y} {z} lt )
|
|
241
|
|
242 ≤-plus-0 : {x y z : ℕ } → x ≤ y → z + x ≤ z + y
|
|
243 ≤-plus-0 {x} {y} {zero} lt = lt
|
|
244 ≤-plus-0 {x} {y} {suc z} lt = s≤s ( ≤-plus-0 {x} {y} {z} lt )
|
|
245
|
|
246 x+y<z→x<z : {x y z : ℕ } → x + y < z → x < z
|
|
247 x+y<z→x<z {zero} {y} {suc z} (s≤s lt1) = s≤s z≤n
|
|
248 x+y<z→x<z {suc x} {y} {suc z} (s≤s lt1) = s≤s ( x+y<z→x<z {x} {y} {z} lt1 )
|
|
249
|
|
250 *≤ : {x y z : ℕ } → x ≤ y → x * z ≤ y * z
|
|
251 *≤ lt = *-mono-≤ lt ≤-refl
|
|
252
|
|
253 *< : {x y z : ℕ } → x < y → x * suc z < y * suc z
|
|
254 *< {zero} {suc y} lt = s≤s z≤n
|
|
255 *< {suc x} {suc y} (s≤s lt) = <-plus-0 (*< lt)
|
|
256
|
|
257 <to<s : {x y : ℕ } → x < y → x < suc y
|
|
258 <to<s {zero} {suc y} (s≤s lt) = s≤s z≤n
|
|
259 <to<s {suc x} {suc y} (s≤s lt) = s≤s (<to<s {x} {y} lt)
|
|
260
|
|
261 <tos<s : {x y : ℕ } → x < y → suc x < suc y
|
|
262 <tos<s {zero} {suc y} (s≤s z≤n) = s≤s (s≤s z≤n)
|
|
263 <tos<s {suc x} {suc y} (s≤s lt) = s≤s (<tos<s {x} {y} lt)
|
|
264
|
314
|
265 <to≤ : {x y : ℕ } → x < y → x ≤ y
|
|
266 <to≤ {zero} {suc y} (s≤s z≤n) = z≤n
|
|
267 <to≤ {suc x} {suc y} (s≤s lt) = s≤s (<to≤ {x} {y} lt)
|
|
268
|
|
269 <∨≤ : ( x y : ℕ ) → (x < y ) ∨ (y ≤ x)
|
|
270 <∨≤ x y with <-cmp x y
|
|
271 ... | tri< a ¬b ¬c = case1 a
|
|
272 ... | tri≈ ¬a refl ¬c = case2 ≤-refl
|
|
273 ... | tri> ¬a ¬b c = case2 (<to≤ c)
|
|
274
|
|
275 refl-≤ : {x : ℕ } → x ≤ x
|
|
276 refl-≤ {zero} = z≤n
|
|
277 refl-≤ {suc x} = s≤s (refl-≤ {x})
|
|
278
|
|
279 refl-≤≡ : {x y : ℕ } → x ≡ y → x ≤ y
|
|
280 refl-≤≡ refl = refl-≤
|
72
|
281
|
|
282 x<y→≤ : {x y : ℕ } → x < y → x ≤ suc y
|
|
283 x<y→≤ {zero} {.(suc _)} (s≤s z≤n) = z≤n
|
|
284 x<y→≤ {suc x} {suc y} (s≤s lt) = s≤s (x<y→≤ {x} {y} lt)
|
|
285
|
314
|
286 ≤→= : {i j : ℕ} → i ≤ j → j ≤ i → i ≡ j
|
|
287 ≤→= {0} {0} z≤n z≤n = refl
|
|
288 ≤→= {suc i} {suc j} (s≤s i<j) (s≤s j<i) = cong suc ( ≤→= {i} {j} i<j j<i )
|
|
289
|
|
290 px≤x : {x : ℕ } → pred x ≤ x
|
|
291 px≤x {zero} = refl-≤
|
|
292 px≤x {suc x} = refl-≤s
|
|
293
|
|
294 px≤py : {x y : ℕ } → x ≤ y → pred x ≤ pred y
|
|
295 px≤py {zero} {zero} lt = refl-≤
|
|
296 px≤py {zero} {suc y} lt = z≤n
|
|
297 px≤py {suc x} {suc y} (s≤s lt) = lt
|
|
298
|
|
299 sx≤py→x≤y : {x y : ℕ } → suc x ≤ suc y → x ≤ y
|
|
300 sx≤py→x≤y (s≤s lt) = lt
|
|
301
|
|
302 sx<py→x<y : {x y : ℕ } → suc x < suc y → x < y
|
|
303 sx<py→x<y (s≤s lt) = lt
|
|
304
|
|
305 sx≤y→x≤y : {x y : ℕ } → suc x ≤ y → x ≤ y
|
|
306 sx≤y→x≤y {zero} {suc y} (s≤s le) = z≤n
|
|
307 sx≤y→x≤y {suc x} {suc y} (s≤s le) = s≤s (sx≤y→x≤y {x} {y} le)
|
|
308
|
|
309 x<sy→x≤y : {x y : ℕ } → x < suc y → x ≤ y
|
|
310 x<sy→x≤y {zero} {suc y} (s≤s le) = z≤n
|
|
311 x<sy→x≤y {suc x} {suc y} (s≤s le) = s≤s (x<sy→x≤y {x} {y} le)
|
|
312 x<sy→x≤y {zero} {zero} (s≤s z≤n) = ≤-refl
|
|
313
|
|
314 x≤y→x<sy : {x y : ℕ } → x ≤ y → x < suc y
|
|
315 x≤y→x<sy {.zero} {y} z≤n = ≤-trans a<sa (s≤s z≤n)
|
|
316 x≤y→x<sy {.(suc _)} {.(suc _)} (s≤s le) = s≤s ( x≤y→x<sy le)
|
|
317
|
|
318 sx≤y→x<y : {x y : ℕ } → suc x ≤ y → x < y
|
|
319 sx≤y→x<y {zero} {suc y} (s≤s le) = s≤s z≤n
|
|
320 sx≤y→x<y {suc x} {suc y} (s≤s le) = s≤s ( sx≤y→x<y {x} {y} le )
|
|
321
|
72
|
322 open import Data.Product
|
|
323
|
314
|
324 i-j=0→i=j : {i j : ℕ } → j ≤ i → i - j ≡ 0 → i ≡ j
|
|
325 i-j=0→i=j {zero} {zero} _ refl = refl
|
|
326 i-j=0→i=j {zero} {suc j} () refl
|
|
327 i-j=0→i=j {suc i} {zero} z≤n ()
|
|
328 i-j=0→i=j {suc i} {suc j} (s≤s lt) eq = cong suc (i-j=0→i=j {i} {j} lt eq)
|
|
329
|
|
330 m*n=0⇒m=0∨n=0 : {i j : ℕ} → i * j ≡ 0 → (i ≡ 0) ∨ ( j ≡ 0 )
|
|
331 m*n=0⇒m=0∨n=0 {zero} {j} refl = case1 refl
|
|
332 m*n=0⇒m=0∨n=0 {suc i} {zero} eq = case2 refl
|
|
333
|
|
334
|
|
335 minus+1 : {x y : ℕ } → y ≤ x → suc (minus x y) ≡ minus (suc x) y
|
|
336 minus+1 {zero} {zero} y≤x = refl
|
|
337 minus+1 {suc x} {zero} y≤x = refl
|
|
338 minus+1 {suc x} {suc y} (s≤s y≤x) = minus+1 {x} {y} y≤x
|
|
339
|
|
340 minus+yz : {x y z : ℕ } → z ≤ y → x + minus y z ≡ minus (x + y) z
|
|
341 minus+yz {zero} {y} {z} _ = refl
|
|
342 minus+yz {suc x} {y} {z} z≤y = begin
|
|
343 suc x + minus y z ≡⟨ cong suc ( minus+yz z≤y ) ⟩
|
|
344 suc (minus (x + y) z) ≡⟨ minus+1 {x + y} {z} (≤-trans z≤y (subst (λ g → y ≤ g) (+-comm y x) x≤x+y) ) ⟩
|
|
345 minus (suc x + y) z ∎ where open ≡-Reasoning
|
|
346
|
72
|
347 minus<=0 : {x y : ℕ } → x ≤ y → minus x y ≡ 0
|
|
348 minus<=0 {0} {zero} z≤n = refl
|
|
349 minus<=0 {0} {suc y} z≤n = refl
|
|
350 minus<=0 {suc x} {suc y} (s≤s le) = minus<=0 {x} {y} le
|
|
351
|
|
352 minus>0 : {x y : ℕ } → x < y → 0 < minus y x
|
|
353 minus>0 {zero} {suc _} (s≤s z≤n) = s≤s z≤n
|
|
354 minus>0 {suc x} {suc y} (s≤s lt) = minus>0 {x} {y} lt
|
|
355
|
314
|
356 minus>0→x<y : {x y : ℕ } → 0 < minus y x → x < y
|
|
357 minus>0→x<y {x} {y} lt with <-cmp x y
|
|
358 ... | tri< a ¬b ¬c = a
|
|
359 ... | tri≈ ¬a refl ¬c = ⊥-elim ( nat-≡< (sym (minus<=0 {x} ≤-refl)) lt )
|
|
360 ... | tri> ¬a ¬b c = ⊥-elim ( nat-≡< (sym (minus<=0 {y} (≤-trans refl-≤s c ))) lt )
|
|
361
|
|
362 minus+y-y : {x y : ℕ } → (x + y) - y ≡ x
|
|
363 minus+y-y {zero} {y} = minus<=0 {zero + y} {y} ≤-refl
|
|
364 minus+y-y {suc x} {y} = begin
|
|
365 (suc x + y) - y ≡⟨ sym (minus+1 {_} {y} x≤y+x) ⟩
|
|
366 suc ((x + y) - y) ≡⟨ cong suc (minus+y-y {x} {y}) ⟩
|
|
367 suc x ∎ where open ≡-Reasoning
|
|
368
|
|
369 minus+yx-yz : {x y z : ℕ } → (y + x) - (y + z) ≡ x - z
|
|
370 minus+yx-yz {x} {zero} {z} = refl
|
|
371 minus+yx-yz {x} {suc y} {z} = minus+yx-yz {x} {y} {z}
|
|
372
|
|
373 minus+xy-zy : {x y z : ℕ } → (x + y) - (z + y) ≡ x - z
|
|
374 minus+xy-zy {x} {y} {z} = subst₂ (λ j k → j - k ≡ x - z ) (+-comm y x) (+-comm y z) (minus+yx-yz {x} {y} {z})
|
|
375
|
|
376 +cancel<l : (x z : ℕ ) {y : ℕ} → y + x < y + z → x < z
|
|
377 +cancel<l x z {zero} lt = lt
|
|
378 +cancel<l x z {suc y} (s≤s lt) = +cancel<l x z {y} lt
|
|
379
|
|
380 +cancel<r : (x z : ℕ ) {y : ℕ} → x + y < z + y → x < z
|
|
381 +cancel<r x z {y} lt = +cancel<l x z (subst₂ (λ j k → j < k ) (+-comm x _) (+-comm z _) lt )
|
|
382
|
|
383 y-x<y : {x y : ℕ } → 0 < x → 0 < y → y - x < y
|
|
384 y-x<y {x} {y} 0<x 0<y with <-cmp x (suc y)
|
|
385 ... | tri< a ¬b ¬c = +cancel<r (y - x) _ ( begin
|
|
386 suc ((y - x) + x) ≡⟨ cong suc (minus+n {y} {x} a ) ⟩
|
|
387 suc y ≡⟨ +-comm 1 _ ⟩
|
|
388 y + suc 0 ≤⟨ +-mono-≤ ≤-refl 0<x ⟩
|
|
389 y + x ∎ ) where open ≤-Reasoning
|
|
390 ... | tri≈ ¬a refl ¬c = subst ( λ k → k < y ) (sym (minus<=0 {y} {x} refl-≤s )) 0<y
|
|
391 ... | tri> ¬a ¬b c = subst ( λ k → k < y ) (sym (minus<=0 {y} {x} (≤-trans (≤-trans refl-≤s refl-≤s) c))) 0<y -- suc (suc y) ≤ x → y ≤ x
|
|
392
|
|
393 open import Relation.Binary.Definitions
|
|
394
|
72
|
395 distr-minus-* : {x y z : ℕ } → (minus x y) * z ≡ minus (x * z) (y * z)
|
|
396 distr-minus-* {x} {zero} {z} = refl
|
|
397 distr-minus-* {x} {suc y} {z} with <-cmp x y
|
|
398 distr-minus-* {x} {suc y} {z} | tri< a ¬b ¬c = begin
|
|
399 minus x (suc y) * z
|
|
400 ≡⟨ cong (λ k → k * z ) (minus<=0 {x} {suc y} (x<y→≤ a)) ⟩
|
|
401 0 * z
|
|
402 ≡⟨ sym (minus<=0 {x * z} {z + y * z} le ) ⟩
|
|
403 minus (x * z) (z + y * z)
|
|
404 ∎ where
|
|
405 open ≡-Reasoning
|
|
406 le : x * z ≤ z + y * z
|
|
407 le = ≤-trans lemma (subst (λ k → y * z ≤ k ) (+-comm _ z ) (x≤x+y {y * z} {z} ) ) where
|
|
408 lemma : x * z ≤ y * z
|
314
|
409 lemma = *≤ {x} {y} {z} (<to≤ a)
|
72
|
410 distr-minus-* {x} {suc y} {z} | tri≈ ¬a refl ¬c = begin
|
|
411 minus x (suc y) * z
|
|
412 ≡⟨ cong (λ k → k * z ) (minus<=0 {x} {suc y} refl-≤s ) ⟩
|
|
413 0 * z
|
|
414 ≡⟨ sym (minus<=0 {x * z} {z + y * z} (lt {x} {z} )) ⟩
|
|
415 minus (x * z) (z + y * z)
|
|
416 ∎ where
|
|
417 open ≡-Reasoning
|
|
418 lt : {x z : ℕ } → x * z ≤ z + x * z
|
|
419 lt {zero} {zero} = z≤n
|
|
420 lt {suc x} {zero} = lt {x} {zero}
|
|
421 lt {x} {suc z} = ≤-trans lemma refl-≤s where
|
|
422 lemma : x * suc z ≤ z + x * suc z
|
|
423 lemma = subst (λ k → x * suc z ≤ k ) (+-comm _ z) (x≤x+y {x * suc z} {z})
|
|
424 distr-minus-* {x} {suc y} {z} | tri> ¬a ¬b c = +m= {_} {_} {suc y * z} ( begin
|
|
425 minus x (suc y) * z + suc y * z
|
|
426 ≡⟨ sym (proj₂ *-distrib-+ z (minus x (suc y) ) _) ⟩
|
|
427 ( minus x (suc y) + suc y ) * z
|
|
428 ≡⟨ cong (λ k → k * z) (minus+n {x} {suc y} (s≤s c)) ⟩
|
|
429 x * z
|
|
430 ≡⟨ sym (minus+n {x * z} {suc y * z} (s≤s (lt c))) ⟩
|
|
431 minus (x * z) (suc y * z) + suc y * z
|
|
432 ∎ ) where
|
|
433 open ≡-Reasoning
|
|
434 lt : {x y z : ℕ } → suc y ≤ x → z + y * z ≤ x * z
|
|
435 lt {x} {y} {z} le = *≤ le
|
|
436
|
314
|
437 distr-minus-*' : {z x y : ℕ } → z * (minus x y) ≡ minus (z * x) (z * y)
|
|
438 distr-minus-*' {z} {x} {y} = begin
|
|
439 z * (minus x y) ≡⟨ *-comm _ (x - y) ⟩
|
|
440 (minus x y) * z ≡⟨ distr-minus-* {x} {y} {z} ⟩
|
|
441 minus (x * z) (y * z) ≡⟨ cong₂ (λ j k → j - k ) (*-comm x z ) (*-comm y z) ⟩
|
|
442 minus (z * x) (z * y) ∎ where open ≡-Reasoning
|
|
443
|
72
|
444 minus- : {x y z : ℕ } → suc x > z + y → minus (minus x y) z ≡ minus x (y + z)
|
|
445 minus- {x} {y} {z} gt = +m= {_} {_} {z} ( begin
|
|
446 minus (minus x y) z + z
|
|
447 ≡⟨ minus+n {_} {z} lemma ⟩
|
|
448 minus x y
|
|
449 ≡⟨ +m= {_} {_} {y} ( begin
|
|
450 minus x y + y
|
|
451 ≡⟨ minus+n {_} {y} lemma1 ⟩
|
|
452 x
|
|
453 ≡⟨ sym ( minus+n {_} {z + y} gt ) ⟩
|
|
454 minus x (z + y) + (z + y)
|
|
455 ≡⟨ sym ( +-assoc (minus x (z + y)) _ _ ) ⟩
|
|
456 minus x (z + y) + z + y
|
|
457 ∎ ) ⟩
|
|
458 minus x (z + y) + z
|
|
459 ≡⟨ cong (λ k → minus x k + z ) (+-comm _ y ) ⟩
|
|
460 minus x (y + z) + z
|
|
461 ∎ ) where
|
|
462 open ≡-Reasoning
|
|
463 lemma1 : suc x > y
|
|
464 lemma1 = x+y<z→x<z (subst (λ k → k < suc x ) (+-comm z _ ) gt )
|
|
465 lemma : suc (minus x y) > z
|
|
466 lemma = <-minus {_} {_} {y} ( subst ( λ x → z + y < suc x ) (sym (minus+n {x} {y} lemma1 )) gt )
|
|
467
|
|
468 minus-* : {M k n : ℕ } → n < k → minus k (suc n) * M ≡ minus (minus k n * M ) M
|
|
469 minus-* {zero} {k} {n} lt = begin
|
|
470 minus k (suc n) * zero
|
|
471 ≡⟨ *-comm (minus k (suc n)) zero ⟩
|
|
472 zero * minus k (suc n)
|
|
473 ≡⟨⟩
|
|
474 0 * minus k n
|
|
475 ≡⟨ *-comm 0 (minus k n) ⟩
|
|
476 minus (minus k n * 0 ) 0
|
|
477 ∎ where
|
|
478 open ≡-Reasoning
|
|
479 minus-* {suc m} {k} {n} lt with <-cmp k 1
|
|
480 minus-* {suc m} {.0} {zero} lt | tri< (s≤s z≤n) ¬b ¬c = refl
|
|
481 minus-* {suc m} {.0} {suc n} lt | tri< (s≤s z≤n) ¬b ¬c = refl
|
|
482 minus-* {suc zero} {.1} {zero} lt | tri≈ ¬a refl ¬c = refl
|
|
483 minus-* {suc (suc m)} {.1} {zero} lt | tri≈ ¬a refl ¬c = minus-* {suc m} {1} {zero} lt
|
|
484 minus-* {suc m} {.1} {suc n} (s≤s ()) | tri≈ ¬a refl ¬c
|
|
485 minus-* {suc m} {k} {n} lt | tri> ¬a ¬b c = begin
|
|
486 minus k (suc n) * M
|
|
487 ≡⟨ distr-minus-* {k} {suc n} {M} ⟩
|
|
488 minus (k * M ) ((suc n) * M)
|
|
489 ≡⟨⟩
|
|
490 minus (k * M ) (M + n * M )
|
|
491 ≡⟨ cong (λ x → minus (k * M) x) (+-comm M _ ) ⟩
|
|
492 minus (k * M ) ((n * M) + M )
|
|
493 ≡⟨ sym ( minus- {k * M} {n * M} (lemma lt) ) ⟩
|
|
494 minus (minus (k * M ) (n * M)) M
|
|
495 ≡⟨ cong (λ x → minus x M ) ( sym ( distr-minus-* {k} {n} )) ⟩
|
|
496 minus (minus k n * M ) M
|
|
497 ∎ where
|
|
498 M = suc m
|
|
499 lemma : {n k m : ℕ } → n < k → suc (k * suc m) > suc m + n * suc m
|
|
500 lemma {zero} {suc k} {m} (s≤s lt) = s≤s (s≤s (subst (λ x → x ≤ m + k * suc m) (+-comm 0 _ ) x≤x+y ))
|
|
501 lemma {suc n} {suc k} {m} lt = begin
|
|
502 suc (suc m + suc n * suc m)
|
|
503 ≡⟨⟩
|
|
504 suc ( suc (suc n) * suc m)
|
|
505 ≤⟨ ≤-plus-0 {_} {_} {1} (*≤ lt ) ⟩
|
|
506 suc (suc k * suc m)
|
|
507 ∎ where open ≤-Reasoning
|
|
508 open ≡-Reasoning
|
112
|
509
|
314
|
510 x=y+z→x-z=y : {x y z : ℕ } → x ≡ y + z → x - z ≡ y
|
|
511 x=y+z→x-z=y {x} {zero} {.x} refl = minus<=0 {x} {x} refl-≤ -- x ≡ suc (y + z) → (x ≡ y + z → x - z ≡ y) → (x - z) ≡ suc y
|
|
512 x=y+z→x-z=y {suc x} {suc y} {zero} eq = begin -- suc x ≡ suc (y + zero) → (suc x - zero) ≡ suc y
|
|
513 suc x - zero ≡⟨ refl ⟩
|
|
514 suc x ≡⟨ eq ⟩
|
|
515 suc y + zero ≡⟨ +-comm _ zero ⟩
|
|
516 suc y ∎ where open ≡-Reasoning
|
|
517 x=y+z→x-z=y {suc x} {suc y} {suc z} eq = x=y+z→x-z=y {x} {suc y} {z} ( begin
|
|
518 x ≡⟨ cong pred eq ⟩
|
|
519 pred (suc y + suc z) ≡⟨ +-comm _ (suc z) ⟩
|
|
520 suc z + y ≡⟨ cong suc ( +-comm _ y ) ⟩
|
|
521 suc y + z ∎ ) where open ≡-Reasoning
|
|
522
|
|
523 m*1=m : {m : ℕ } → m * 1 ≡ m
|
|
524 m*1=m {zero} = refl
|
|
525 m*1=m {suc m} = cong suc m*1=m
|
|
526
|
|
527 +-cancel-1 : (x y z : ℕ ) → x + y ≡ x + z → y ≡ z
|
|
528 +-cancel-1 zero y z eq = eq
|
|
529 +-cancel-1 (suc x) y z eq = +-cancel-1 x y z (cong pred eq )
|
|
530
|
|
531 +-cancel-0 : (x y z : ℕ ) → y + x ≡ z + x → y ≡ z
|
|
532 +-cancel-0 x y z eq = +-cancel-1 x y z (trans (+-comm x y) (trans eq (sym (+-comm x z)) ))
|
|
533
|
|
534 *-cancel-left : {x y z : ℕ } → x > 0 → x * y ≡ x * z → y ≡ z
|
|
535 *-cancel-left {suc x} {zero} {zero} lt eq = refl
|
|
536 *-cancel-left {suc x} {zero} {suc z} lt eq = ⊥-elim ( nat-≡< eq (s≤s (begin
|
|
537 x * zero ≡⟨ *-comm x _ ⟩
|
|
538 zero ≤⟨ z≤n ⟩
|
|
539 z + x * suc z ∎ ))) where open ≤-Reasoning
|
|
540 *-cancel-left {suc x} {suc y} {zero} lt eq = ⊥-elim ( nat-≡< (sym eq) (s≤s (begin
|
|
541 x * zero ≡⟨ *-comm x _ ⟩
|
|
542 zero ≤⟨ z≤n ⟩
|
|
543 _ ∎ ))) where open ≤-Reasoning
|
|
544 *-cancel-left {suc x} {suc y} {suc z} lt eq with cong pred eq
|
|
545 ... | eq1 = cong suc (*-cancel-left {suc x} {y} {z} lt (+-cancel-0 x _ _ (begin
|
|
546 y + x * y + x ≡⟨ +-assoc y _ _ ⟩
|
|
547 y + (x * y + x) ≡⟨ cong (λ k → y + (k + x)) (*-comm x _) ⟩
|
|
548 y + (y * x + x) ≡⟨ cong (_+_ y) (+-comm _ x) ⟩
|
|
549 y + (x + y * x ) ≡⟨ refl ⟩
|
|
550 y + suc y * x ≡⟨ cong (_+_ y) (*-comm (suc y) _) ⟩
|
|
551 y + x * suc y ≡⟨ eq1 ⟩
|
|
552 z + x * suc z ≡⟨ refl ⟩
|
|
553 _ ≡⟨ sym ( cong (_+_ z) (*-comm (suc z) _) ) ⟩
|
|
554 _ ≡⟨ sym ( cong (_+_ z) (+-comm _ x)) ⟩
|
|
555 z + (z * x + x) ≡⟨ sym ( cong (λ k → z + (k + x)) (*-comm x _) ) ⟩
|
|
556 z + (x * z + x) ≡⟨ sym ( +-assoc z _ _) ⟩
|
|
557 z + x * z + x ∎ ))) where open ≡-Reasoning
|
|
558
|
|
559 record Finduction {n m : Level} (P : Set n ) (Q : P → Set m ) (f : P → ℕ) : Set (n Level.⊔ m) where
|
|
560 field
|
|
561 fzero : {p : P} → f p ≡ zero → Q p
|
|
562 pnext : (p : P ) → P
|
|
563 decline : {p : P} → 0 < f p → f (pnext p) < f p
|
|
564 ind : {p : P} → Q (pnext p) → Q p
|
|
565
|
|
566 y<sx→y≤x : {x y : ℕ} → y < suc x → y ≤ x
|
|
567 y<sx→y≤x (s≤s lt) = lt
|
|
568
|
|
569 fi0 : (x : ℕ) → x ≤ zero → x ≡ zero
|
|
570 fi0 .0 z≤n = refl
|
112
|
571
|
314
|
572 f-induction : {n m : Level} {P : Set n } → {Q : P → Set m }
|
|
573 → (f : P → ℕ)
|
|
574 → Finduction P Q f
|
|
575 → (p : P ) → Q p
|
|
576 f-induction {n} {m} {P} {Q} f I p with <-cmp 0 (f p)
|
|
577 ... | tri> ¬a ¬b ()
|
|
578 ... | tri≈ ¬a b ¬c = Finduction.fzero I (sym b)
|
|
579 ... | tri< lt _ _ = f-induction0 p (f p) (<to≤ (Finduction.decline I lt)) where
|
|
580 f-induction0 : (p : P) → (x : ℕ) → (f (Finduction.pnext I p)) ≤ x → Q p
|
|
581 f-induction0 p zero le = Finduction.ind I (Finduction.fzero I (fi0 _ le))
|
|
582 f-induction0 p (suc x) le with <-cmp (f (Finduction.pnext I p)) (suc x)
|
|
583 ... | tri< (s≤s a) ¬b ¬c = f-induction0 p x a
|
|
584 ... | tri≈ ¬a b ¬c = Finduction.ind I (f-induction0 (Finduction.pnext I p) x (y<sx→y≤x f1)) where
|
|
585 f1 : f (Finduction.pnext I (Finduction.pnext I p)) < suc x
|
|
586 f1 = subst (λ k → f (Finduction.pnext I (Finduction.pnext I p)) < k ) b ( Finduction.decline I {Finduction.pnext I p}
|
|
587 (subst (λ k → 0 < k ) (sym b) (s≤s z≤n ) ))
|
|
588 ... | tri> ¬a ¬b c = ⊥-elim ( nat-≤> le c )
|
|
589
|
|
590
|
|
591 record Ninduction {n m : Level} (P : Set n ) (Q : P → Set m ) (f : P → ℕ) : Set (n Level.⊔ m) where
|
|
592 field
|
|
593 pnext : (p : P ) → P
|
|
594 fzero : {p : P} → f (pnext p) ≡ zero → Q p
|
|
595 decline : {p : P} → 0 < f p → f (pnext p) < f p
|
|
596 ind : {p : P} → Q (pnext p) → Q p
|
|
597
|
|
598 s≤s→≤ : { i j : ℕ} → suc i ≤ suc j → i ≤ j
|
|
599 s≤s→≤ (s≤s lt) = lt
|
112
|
600
|
314
|
601 n-induction : {n m : Level} {P : Set n } → {Q : P → Set m }
|
|
602 → (f : P → ℕ)
|
|
603 → Ninduction P Q f
|
|
604 → (p : P ) → Q p
|
|
605 n-induction {n} {m} {P} {Q} f I p = f-induction0 p (f (Ninduction.pnext I p)) ≤-refl where
|
|
606 f-induction0 : (p : P) → (x : ℕ) → (f (Ninduction.pnext I p)) ≤ x → Q p
|
|
607 f-induction0 p zero lt = Ninduction.fzero I {p} (fi0 _ lt)
|
|
608 f-induction0 p (suc x) le with <-cmp (f (Ninduction.pnext I p)) (suc x)
|
|
609 ... | tri< (s≤s a) ¬b ¬c = f-induction0 p x a
|
|
610 ... | tri≈ ¬a b ¬c = Ninduction.ind I (f-induction0 (Ninduction.pnext I p) x (s≤s→≤ nle) ) where
|
|
611 f>0 : 0 < f (Ninduction.pnext I p)
|
|
612 f>0 = subst (λ k → 0 < k ) (sym b) ( s≤s z≤n )
|
|
613 nle : suc (f (Ninduction.pnext I (Ninduction.pnext I p))) ≤ suc x
|
|
614 nle = subst (λ k → suc (f (Ninduction.pnext I (Ninduction.pnext I p))) ≤ k) b (Ninduction.decline I {Ninduction.pnext I p} f>0 )
|
|
615 ... | tri> ¬a ¬b c = ⊥-elim ( nat-≤> le c )
|
|
616
|
|
617
|
|
618 record Factor (n m : ℕ ) : Set where
|
|
619 field
|
|
620 factor : ℕ
|
|
621 remain : ℕ
|
|
622 is-factor : factor * n + remain ≡ m
|
|
623
|
|
624 record Dividable (n m : ℕ ) : Set where
|
|
625 field
|
|
626 factor : ℕ
|
|
627 is-factor : factor * n + 0 ≡ m
|
|
628
|
|
629 open Factor
|
|
630
|
|
631 DtoF : {n m : ℕ} → Dividable n m → Factor n m
|
|
632 DtoF {n} {m} record { factor = f ; is-factor = fa } = record { factor = f ; remain = 0 ; is-factor = fa }
|
|
633
|
|
634 FtoD : {n m : ℕ} → (fc : Factor n m) → remain fc ≡ 0 → Dividable n m
|
|
635 FtoD {n} {m} record { factor = f ; remain = r ; is-factor = fa } refl = record { factor = f ; is-factor = fa }
|
|
636
|
|
637 --divdable^2 : ( n k : ℕ ) → Dividable k ( n * n ) → Dividable k n
|
|
638 --divdable^2 n k dn2 = {!!}
|
112
|
639
|
314
|
640 decf : { n k : ℕ } → ( x : Factor k (suc n) ) → Factor k n
|
|
641 decf {n} {k} record { factor = f ; remain = r ; is-factor = fa } =
|
|
642 decf1 {n} {k} f r fa where
|
|
643 decf1 : { n k : ℕ } → (f r : ℕ) → (f * k + r ≡ suc n) → Factor k n
|
|
644 decf1 {n} {k} f (suc r) fa = -- this case must be the first
|
|
645 record { factor = f ; remain = r ; is-factor = ( begin -- fa : f * k + suc r ≡ suc n
|
|
646 f * k + r ≡⟨ cong pred ( begin
|
|
647 suc ( f * k + r ) ≡⟨ +-comm _ r ⟩
|
|
648 r + suc (f * k) ≡⟨ sym (+-assoc r 1 _) ⟩
|
|
649 (r + 1) + f * k ≡⟨ cong (λ t → t + f * k ) (+-comm r 1) ⟩
|
|
650 (suc r ) + f * k ≡⟨ +-comm (suc r) _ ⟩
|
|
651 f * k + suc r ≡⟨ fa ⟩
|
|
652 suc n ∎ ) ⟩
|
|
653 n ∎ ) } where open ≡-Reasoning
|
|
654 decf1 {n} {zero} (suc f) zero fa = ⊥-elim ( nat-≡< fa (
|
|
655 begin suc (suc f * zero + zero) ≡⟨ cong suc (+-comm _ zero) ⟩
|
|
656 suc (f * 0) ≡⟨ cong suc (*-comm f zero) ⟩
|
|
657 suc zero ≤⟨ s≤s z≤n ⟩
|
|
658 suc n ∎ )) where open ≤-Reasoning
|
|
659 decf1 {n} {suc k} (suc f) zero fa =
|
|
660 record { factor = f ; remain = k ; is-factor = ( begin -- fa : suc (k + f * suc k + zero) ≡ suc n
|
|
661 f * suc k + k ≡⟨ +-comm _ k ⟩
|
|
662 k + f * suc k ≡⟨ +-comm zero _ ⟩
|
|
663 (k + f * suc k) + zero ≡⟨ cong pred fa ⟩
|
|
664 n ∎ ) } where open ≡-Reasoning
|
|
665
|
|
666 div0 : {k : ℕ} → Dividable k 0
|
|
667 div0 {k} = record { factor = 0; is-factor = refl }
|
|
668
|
|
669 div= : {k : ℕ} → Dividable k k
|
|
670 div= {k} = record { factor = 1; is-factor = ( begin
|
|
671 k + 0 * k + 0 ≡⟨ trans ( +-comm _ 0) ( +-comm _ 0) ⟩
|
|
672 k ∎ ) } where open ≡-Reasoning
|
|
673
|
|
674 div1 : { k : ℕ } → k > 1 → ¬ Dividable k 1
|
|
675 div1 {k} k>1 record { factor = (suc f) ; is-factor = fa } = ⊥-elim ( nat-≡< (sym fa) ( begin
|
|
676 2 ≤⟨ k>1 ⟩
|
|
677 k ≡⟨ +-comm 0 _ ⟩
|
|
678 k + 0 ≡⟨ refl ⟩
|
|
679 1 * k ≤⟨ *-mono-≤ {1} {suc f} (s≤s z≤n ) ≤-refl ⟩
|
|
680 suc f * k ≡⟨ +-comm 0 _ ⟩
|
|
681 suc f * k + 0 ∎ )) where open ≤-Reasoning
|
|
682
|
|
683 div+div : { i j k : ℕ } → Dividable k i → Dividable k j → Dividable k (i + j) ∧ Dividable k (j + i)
|
|
684 div+div {i} {j} {k} di dj = ⟪ div+div1 , subst (λ g → Dividable k g) (+-comm i j) div+div1 ⟫ where
|
|
685 fki = Dividable.factor di
|
|
686 fkj = Dividable.factor dj
|
|
687 div+div1 : Dividable k (i + j)
|
|
688 div+div1 = record { factor = fki + fkj ; is-factor = ( begin
|
|
689 (fki + fkj) * k + 0 ≡⟨ +-comm _ 0 ⟩
|
|
690 (fki + fkj) * k ≡⟨ *-distribʳ-+ k fki _ ⟩
|
|
691 fki * k + fkj * k ≡⟨ cong₂ ( λ i j → i + j ) (+-comm 0 (fki * k)) (+-comm 0 (fkj * k)) ⟩
|
|
692 (fki * k + 0) + (fkj * k + 0) ≡⟨ cong₂ ( λ i j → i + j ) (Dividable.is-factor di) (Dividable.is-factor dj) ⟩
|
|
693 i + j ∎ ) } where
|
|
694 open ≡-Reasoning
|
|
695
|
|
696 div-div : { i j k : ℕ } → k > 1 → Dividable k i → Dividable k j → Dividable k (i - j) ∧ Dividable k (j - i)
|
|
697 div-div {i} {j} {k} k>1 di dj = ⟪ div-div1 di dj , div-div1 dj di ⟫ where
|
|
698 div-div1 : {i j : ℕ } → Dividable k i → Dividable k j → Dividable k (i - j)
|
|
699 div-div1 {i} {j} di dj = record { factor = fki - fkj ; is-factor = ( begin
|
|
700 (fki - fkj) * k + 0 ≡⟨ +-comm _ 0 ⟩
|
|
701 (fki - fkj) * k ≡⟨ distr-minus-* {fki} {fkj} ⟩
|
|
702 (fki * k) - (fkj * k) ≡⟨ cong₂ ( λ i j → i - j ) (+-comm 0 (fki * k)) (+-comm 0 (fkj * k)) ⟩
|
|
703 (fki * k + 0) - (fkj * k + 0) ≡⟨ cong₂ ( λ i j → i - j ) (Dividable.is-factor di) (Dividable.is-factor dj) ⟩
|
|
704 i - j ∎ ) } where
|
|
705 open ≡-Reasoning
|
|
706 fki = Dividable.factor di
|
|
707 fkj = Dividable.factor dj
|
|
708
|
|
709 open _∧_
|
112
|
710
|
314
|
711 div+1 : { i k : ℕ } → k > 1 → Dividable k i → ¬ Dividable k (suc i)
|
|
712 div+1 {i} {k} k>1 d d1 = div1 k>1 div+11 where
|
|
713 div+11 : Dividable k 1
|
|
714 div+11 = subst (λ g → Dividable k g) (minus+y-y {1} {i} ) ( proj2 (div-div k>1 d d1 ) )
|
|
715
|
|
716 div<k : { m k : ℕ } → k > 1 → m > 0 → m < k → ¬ Dividable k m
|
|
717 div<k {m} {k} k>1 m>0 m<k d = ⊥-elim ( nat-≤> (div<k1 (Dividable.factor d) (Dividable.is-factor d)) m<k ) where
|
|
718 div<k1 : (f : ℕ ) → f * k + 0 ≡ m → k ≤ m
|
|
719 div<k1 zero eq = ⊥-elim (nat-≡< eq m>0 )
|
|
720 div<k1 (suc f) eq = begin
|
|
721 k ≤⟨ x≤x+y ⟩
|
|
722 k + (f * k + 0) ≡⟨ sym (+-assoc k _ _) ⟩
|
|
723 k + f * k + 0 ≡⟨ eq ⟩
|
|
724 m ∎ where open ≤-Reasoning
|
|
725
|
|
726 0<factor : { m k : ℕ } → k > 0 → m > 0 → (d : Dividable k m ) → Dividable.factor d > 0
|
|
727 0<factor {m} {k} k>0 m>0 d with Dividable.factor d | inspect Dividable.factor d
|
|
728 ... | zero | record { eq = eq1 } = ⊥-elim ( nat-≡< ff1 m>0 ) where
|
|
729 ff1 : 0 ≡ m
|
|
730 ff1 = begin
|
|
731 0 ≡⟨⟩
|
|
732 0 * k + 0 ≡⟨ cong (λ j → j * k + 0) (sym eq1) ⟩
|
|
733 Dividable.factor d * k + 0 ≡⟨ Dividable.is-factor d ⟩
|
|
734 m ∎ where open ≡-Reasoning
|
|
735 ... | suc t | _ = s≤s z≤n
|
|
736
|
|
737 div→k≤m : { m k : ℕ } → k > 1 → m > 0 → Dividable k m → m ≥ k
|
|
738 div→k≤m {m} {k} k>1 m>0 d with <-cmp m k
|
|
739 ... | tri< a ¬b ¬c = ⊥-elim ( div<k k>1 m>0 a d )
|
|
740 ... | tri≈ ¬a refl ¬c = ≤-refl
|
|
741 ... | tri> ¬a ¬b c = <to≤ c
|
|
742
|
|
743 div1*k+0=k : {k : ℕ } → 1 * k + 0 ≡ k
|
|
744 div1*k+0=k {k} = begin
|
|
745 1 * k + 0 ≡⟨ cong (λ g → g + 0) (+-comm _ 0) ⟩
|
|
746 k + 0 ≡⟨ +-comm _ 0 ⟩
|
|
747 k ∎ where open ≡-Reasoning
|
|
748
|
|
749 decD : {k m : ℕ} → k > 1 → Dec (Dividable k m )
|
|
750 decD {k} {m} k>1 = n-induction {_} {_} {ℕ} {λ m → Dec (Dividable k m ) } F I m where
|
|
751 F : ℕ → ℕ
|
|
752 F m = m
|
|
753 F0 : ( m : ℕ ) → F (m - k) ≡ 0 → Dec (Dividable k m )
|
|
754 F0 0 eq = yes record { factor = 0 ; is-factor = refl }
|
|
755 F0 (suc m) eq with <-cmp k (suc m)
|
|
756 ... | tri< a ¬b ¬c = yes record { factor = 1 ; is-factor =
|
|
757 subst (λ g → 1 * k + 0 ≡ g ) (sym (i-j=0→i=j (<to≤ a) eq )) div1*k+0=k } -- (suc m - k) ≡ 0 → k ≡ suc m, k ≤ suc m
|
|
758 ... | tri≈ ¬a refl ¬c = yes record { factor = 1 ; is-factor = div1*k+0=k }
|
|
759 ... | tri> ¬a ¬b c = no ( λ d → ⊥-elim (div<k k>1 (s≤s z≤n ) c d) )
|
|
760 decl : {m : ℕ } → 0 < m → m - k < m
|
|
761 decl {m} 0<m = y-x<y (<-trans a<sa k>1 ) 0<m
|
|
762 ind : (p : ℕ ) → Dec (Dividable k (p - k) ) → Dec (Dividable k p )
|
|
763 ind p (yes y) with <-cmp p k
|
|
764 ... | tri≈ ¬a refl ¬c = yes (subst (λ g → Dividable k g) (minus+n ≤-refl ) (proj1 ( div+div y div= )))
|
|
765 ... | tri> ¬a ¬b k<p = yes (subst (λ g → Dividable k g) (minus+n (<-trans k<p a<sa)) (proj1 ( div+div y div= )))
|
|
766 ... | tri< a ¬b ¬c with <-cmp p 0
|
|
767 ... | tri≈ ¬a refl ¬c₁ = yes div0
|
|
768 ... | tri> ¬a ¬b₁ c = no (λ d → not-div p (Dividable.factor d) a c (Dividable.is-factor d) ) where
|
|
769 not-div : (p f : ℕ) → p < k → 0 < p → f * k + 0 ≡ p → ⊥
|
|
770 not-div (suc p) (suc f) p<k 0<p eq = nat-≡< (sym eq) ( begin -- ≤-trans p<k {!!}) -- suc p ≤ k
|
|
771 suc (suc p) ≤⟨ p<k ⟩
|
|
772 k ≤⟨ x≤x+y ⟩
|
|
773 k + (f * k + 0) ≡⟨ sym (+-assoc k _ _) ⟩
|
|
774 suc f * k + 0 ∎ ) where open ≤-Reasoning
|
|
775 ind p (no n) = no (λ d → n (proj1 (div-div k>1 d div=)) )
|
|
776 I : Ninduction ℕ _ F
|
|
777 I = record {
|
|
778 pnext = λ p → p - k
|
|
779 ; fzero = λ {m} eq → F0 m eq
|
|
780 ; decline = λ {m} lt → decl lt
|
|
781 ; ind = λ {p} prev → ind p prev
|
|
782 }
|
|
783
|
|
784
|