|
1 | 1 | (ns latte-nats.ord
|
2 | 2 | "The oredering relation for natural numbers."
|
3 | 3 |
|
4 |
| - (:refer-clojure :exclude [and or not = + < <= > >=]) |
| 4 | + (:refer-clojure :exclude [and or not = + - < <= > >=]) |
5 | 5 |
|
6 | 6 | (:require [latte.core :as latte :refer [defaxiom defthm definition
|
7 | 7 | deflemma
|
|
19 | 19 | [latte-nats.core :as nats :refer [nat = <> zero succ one]]
|
20 | 20 | [latte-nats.rec :as rec]
|
21 | 21 | [latte-nats.plus :as plus :refer [+]]
|
| 22 | + [latte-nats.minus :as minus :refer [- pred]] |
22 | 23 |
|
23 | 24 | ))
|
24 | 25 |
|
|
105 | 106 |
|
106 | 107 | (qed ((q/ex-intro (lambda [$ nat] (= (+ n $) (succ n))) one) <a>)))
|
107 | 108 |
|
| 109 | + |
| 110 | +(defthm le-zero-right |
| 111 | + [n nat] |
| 112 | + (==> (<= n zero) |
| 113 | + (= n zero))) |
| 114 | + |
| 115 | +(proof 'le-zero-right |
| 116 | + (assume [Hle (<= n zero)] |
| 117 | + (have <a> (<= zero n) :by (le-zero n)) |
| 118 | + (have <b> (= n zero) :by ((le-antisym n zero) Hle <a>))) |
| 119 | + (qed <b>)) |
| 120 | + |
108 | 121 | (defthm le-one
|
109 | 122 | [n nat]
|
110 | 123 | (<= one (succ n)))
|
|
213 | 226 | :by (p/and-elim-left Hmn)))
|
214 | 227 | (qed <a>))
|
215 | 228 |
|
| 229 | +(defthm lt-le-ne |
| 230 | + [[m n nat]] |
| 231 | + (==> (<= m n) |
| 232 | + (<> m n) |
| 233 | + (< m n))) |
| 234 | + |
| 235 | +(proof 'lt-le-ne |
| 236 | + (assume [Hle _ |
| 237 | + Hne _] |
| 238 | + (have <a> (< m n) :by (p/and-intro Hle Hne))) |
| 239 | + (qed <a>)) |
| 240 | + |
| 241 | + |
216 | 242 | (defthm lt-succ
|
217 | 243 | [n nat]
|
218 | 244 | (< n (succ n)))
|
|
222 | 248 | (have <b> (<> n (succ n)) :by (nats/succ-not n))
|
223 | 249 | (qed (p/and-intro <a> <b>)))
|
224 | 250 |
|
| 251 | + |
| 252 | +(comment |
| 253 | + |
| 254 | +;; TODO |
| 255 | +(defthm lt-le-succ |
| 256 | + [[m n nat]] |
| 257 | + (==> (< m (succ n)) |
| 258 | + (<= m n))) |
| 259 | +) |
| 260 | + |
225 | 261 | (defthm plus-le
|
226 | 262 | [[m nat] [n nat] [p nat]]
|
227 | 263 | (==> (<= (+ m p) (+ n p))
|
|
282 | 318 | (have <e> _ :by (q/ex-elim H <d>)))
|
283 | 319 | (qed <e>))
|
284 | 320 |
|
| 321 | +(defthm le-pred |
| 322 | + [n nat] |
| 323 | + (<= (pred n) n)) |
| 324 | + |
| 325 | +(proof 'le-pred |
| 326 | + "Case analysis" |
| 327 | + |
| 328 | + "Case 0" |
| 329 | + (have <a1> (= zero (pred zero)) :by (eq/eq-sym (minus/pred-zero))) |
| 330 | + (have <a2> (<= zero zero) :by (le-refl zero)) |
| 331 | + |
| 332 | + (have <a> (<= (pred zero) zero) |
| 333 | + :by (eq/eq-subst (lambda [$ nat] (<= $ zero)) <a1> <a2>)) |
| 334 | + |
| 335 | + "Case (succ n)" |
| 336 | + (assume [n nat] |
| 337 | + (have <b1> (= n (pred (succ n))) :by (eq/eq-sym (minus/pred-succ n))) |
| 338 | + (have <b2> (<= n (succ n)) :by (le-succ n)) |
| 339 | + (have <b> (<= (pred (succ n)) (succ n)) |
| 340 | + :by (eq/eq-subst (lambda [$ nat] |
| 341 | + (<= $ (succ n))) <b1> <b2>))) |
| 342 | + |
| 343 | + (qed ((nats/nat-case (lambda [n nat] |
| 344 | + (<= (pred n) n))) <a> <b> n))) |
| 345 | + |
| 346 | +(defthm lt-pred |
| 347 | + [n nat] |
| 348 | + (==> (<> n zero) |
| 349 | + (< (pred n) n))) |
| 350 | + |
| 351 | +(proof 'lt-pred |
| 352 | + (assume [Hnz (<> n zero)] |
| 353 | + |
| 354 | + (have <a> (<= (pred n) n) :by (le-pred n)) |
| 355 | + |
| 356 | + (assume [Hcontra (= (pred n) n)] |
| 357 | + (have <b1> (= n zero) :by ((minus/pred-eq-zero n) Hcontra)) |
| 358 | + (have <b> p/absurd :by (Hnz <b1>))) |
| 359 | + |
| 360 | + (have <c> (< (pred n) n) :by (p/and-intro <a> <b>))) |
| 361 | + |
| 362 | + (qed <c>)) |
| 363 | + |
| 364 | +(comment |
| 365 | + |
| 366 | + ;; TODO |
| 367 | + |
| 368 | +(defthm le-lt-pred |
| 369 | + [[m n nat]] |
| 370 | + (==> (< m n) |
| 371 | + (<= m (pred n)))) |
| 372 | + |
| 373 | +(try-proof 'le-lt-pred |
| 374 | + "By case analysis on n" |
| 375 | + |
| 376 | + "Case zero" |
| 377 | + |
| 378 | + (assume [H0 (< m zero)] |
| 379 | + (have <a1> (<= m zero) :by ((lt-le m zero) H0)) |
| 380 | + (have <a2> (= m zero) :by ((le-zero-right m) <a1>)) |
| 381 | + (have <a3> p/absurd :by ((p/and-elim-right H0) <a2>)) |
| 382 | + (have <a> _ :by (<a3> (<= m (pred zero))))) |
285 | 383 |
|
| 384 | + "Case (succ n)" |
286 | 385 |
|
| 386 | + (assume [n nat |
| 387 | + Hn (< m (succ n))] |
287 | 388 |
|
| 389 | + "We have to show (<= m (pred (succ n)))" |
| 390 | + |
| 391 | + (have <b1> (= (pred (succ n)) n) :by (minus/pred-succ n)) |
| 392 | + |
288 | 393 |
|
| 394 | +) |
289 | 395 |
|
| 396 | +) |
| 397 | +) |
0 commit comments