Skip to content

Commit b7ebfcf

Browse files
committed
le, lt lemmas
1 parent ba06e0c commit b7ebfcf

File tree

2 files changed

+141
-3
lines changed

2 files changed

+141
-3
lines changed

src/latte_nats/minus.clj

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
[latte-sets.quant :as sq :refer [forall-in]]
1919

20-
[latte-nats.core :as nats :refer [nat = <> zero succ one pred]]
20+
[latte-nats.core :as nats :refer [nat = <> zero succ one]]
2121
[latte-nats.rec :as rec]
2222
[latte-nats.plus :as plus :refer [+]]
2323
))
@@ -86,8 +86,38 @@ the predecessor of zero occurs."
8686
:by (eq/eq-cong succ <b1>)))
8787
(have <b> (P (succ n)) :by <b2>))
8888

89-
(qed ((nat-case P) <a> <b> n)))
89+
(qed ((nats/nat-case P) <a> <b> n)))
9090

91+
(defthm pred-eq-zero
92+
[n nat]
93+
(==> (= (pred n) n)
94+
(= n zero)))
95+
96+
(proof 'pred-eq-zero
97+
"By case analysis"
98+
99+
"Case zero"
100+
101+
(assume [H0 (= (pred zero) zero)]
102+
(have <a> (= zero zero) :by (eq/eq-refl zero)))
103+
104+
"Case (succ n)"
105+
106+
(assume [n nat
107+
Hn (= (pred (succ n)) (succ n))]
108+
109+
"We have to show (= (succ n) zero), but we will exhibit a contradiction"
110+
111+
(have <b1> (= (pred (succ n)) n) :by (pred-succ n))
112+
(have <b2> (= n (succ n))
113+
:by (eq/eq-subst (lambda [$ nat] (= $ (succ n))) <b1> Hn))
114+
(have <b3> p/absurd :by ((nats/succ-not n) <b2>))
115+
116+
(have <b> _ :by (<b3> (= (succ n) zero))))
117+
118+
(qed ((nats/nat-case (lambda [n nat] (==> (= (pred n) n)
119+
(= n zero)))) <a> <b> n)))
120+
91121
(definition sub-prop
92122
"The property of the subtraction of `m` by another natural number.
93123
Note that subtraction is not closed for natural numbers, so we

src/latte_nats/ord.clj

Lines changed: 109 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
(ns latte-nats.ord
22
"The oredering relation for natural numbers."
33

4-
(:refer-clojure :exclude [and or not = + < <= > >=])
4+
(:refer-clojure :exclude [and or not = + - < <= > >=])
55

66
(:require [latte.core :as latte :refer [defaxiom defthm definition
77
deflemma
@@ -19,6 +19,7 @@
1919
[latte-nats.core :as nats :refer [nat = <> zero succ one]]
2020
[latte-nats.rec :as rec]
2121
[latte-nats.plus :as plus :refer [+]]
22+
[latte-nats.minus :as minus :refer [- pred]]
2223

2324
))
2425

@@ -105,6 +106,18 @@
105106

106107
(qed ((q/ex-intro (lambda [$ nat] (= (+ n $) (succ n))) one) <a>)))
107108

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+
108121
(defthm le-one
109122
[n nat]
110123
(<= one (succ n)))
@@ -213,6 +226,19 @@
213226
:by (p/and-elim-left Hmn)))
214227
(qed <a>))
215228

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+
216242
(defthm lt-succ
217243
[n nat]
218244
(< n (succ n)))
@@ -222,6 +248,16 @@
222248
(have <b> (<> n (succ n)) :by (nats/succ-not n))
223249
(qed (p/and-intro <a> <b>)))
224250

251+
252+
(comment
253+
254+
;; TODO
255+
(defthm lt-le-succ
256+
[[m n nat]]
257+
(==> (< m (succ n))
258+
(<= m n)))
259+
)
260+
225261
(defthm plus-le
226262
[[m nat] [n nat] [p nat]]
227263
(==> (<= (+ m p) (+ n p))
@@ -282,8 +318,80 @@
282318
(have <e> _ :by (q/ex-elim H <d>)))
283319
(qed <e>))
284320

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)))))
285383

384+
"Case (succ n)"
286385

386+
(assume [n nat
387+
Hn (< m (succ n))]
287388

389+
"We have to show (<= m (pred (succ n)))"
390+
391+
(have <b1> (= (pred (succ n)) n) :by (minus/pred-succ n))
392+
288393

394+
)
289395

396+
)
397+
)

0 commit comments

Comments
 (0)