annotate agda/nat.agda @ 143:f896c112f01f

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 29 Dec 2020 15:32:57 +0900
parents b3f05cd08d24
children 26407ce19d66
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
138
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
1 {-# OPTIONS --allow-unsolved-metas #-}
70
702ce92c45ab add concat
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 module nat where
702ce92c45ab add concat
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3
138
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
4 open import Data.Nat
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
5 open import Data.Nat.Properties
70
702ce92c45ab add concat
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 open import Data.Empty
702ce92c45ab add concat
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 open import Relation.Nullary
702ce92c45ab add concat
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 open import Relation.Binary.PropositionalEquality
138
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
9 open import Relation.Binary.Core
70
702ce92c45ab add concat
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 open import logic
702ce92c45ab add concat
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11
702ce92c45ab add concat
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12
138
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
13 nat-<> : { x y : ℕ } → x < y → y < x → ⊥
70
702ce92c45ab add concat
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 nat-<> (s≤s x<y) (s≤s y<x) = nat-<> x<y y<x
702ce92c45ab add concat
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15
138
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
16 nat-≤> : { x y : ℕ } → x ≤ y → y < x → ⊥
83
92f396c3a1d7 add end function
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
17 nat-≤> (s≤s x<y) (s≤s y<x) = nat-≤> x<y y<x
92f396c3a1d7 add end function
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
18
138
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
19 nat-<≡ : { x : ℕ } → x < x → ⊥
70
702ce92c45ab add concat
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 nat-<≡ (s≤s lt) = nat-<≡ lt
702ce92c45ab add concat
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21
138
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
22 nat-≡< : { x y : ℕ } → x ≡ y → x < y → ⊥
70
702ce92c45ab add concat
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 nat-≡< refl lt = nat-<≡ lt
702ce92c45ab add concat
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24
138
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
25 ¬a≤a : {la : ℕ} → suc la ≤ la → ⊥
70
702ce92c45ab add concat
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 ¬a≤a (s≤s lt) = ¬a≤a lt
702ce92c45ab add concat
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27
138
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
28 a<sa : {la : ℕ} → la < suc la
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
29 a<sa {zero} = s≤s z≤n
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
30 a<sa {suc la} = s≤s a<sa
70
702ce92c45ab add concat
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31
138
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
32 =→¬< : {x : ℕ } → ¬ ( x < x )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
33 =→¬< {zero} ()
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
34 =→¬< {suc x} (s≤s lt) = =→¬< lt
70
702ce92c45ab add concat
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35
138
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
36 >→¬< : {x y : ℕ } → (x < y ) → ¬ ( y < x )
70
702ce92c45ab add concat
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 >→¬< (s≤s x<y) (s≤s y<x) = >→¬< x<y y<x
702ce92c45ab add concat
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38
138
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
39 <-∨ : { x y : ℕ } → x < suc y → ( (x ≡ y ) ∨ (x < y) )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
40 <-∨ {zero} {zero} (s≤s z≤n) = case1 refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
41 <-∨ {zero} {suc y} (s≤s lt) = case2 (s≤s z≤n)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
42 <-∨ {suc x} {zero} (s≤s ())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
43 <-∨ {suc x} {suc y} (s≤s lt) with <-∨ {x} {y} lt
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
44 <-∨ {suc x} {suc y} (s≤s lt) | case1 eq = case1 (cong (λ k → suc k ) eq)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
45 <-∨ {suc x} {suc y} (s≤s lt) | case2 lt1 = case2 (s≤s lt1)
70
702ce92c45ab add concat
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46
138
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
47 max : (x y : ℕ) → ℕ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
48 max zero zero = zero
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
49 max zero (suc x) = (suc x)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
50 max (suc x) zero = (suc x)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
51 max (suc x) (suc y) = suc ( max x y )
70
702ce92c45ab add concat
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52
138
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
53 -- _*_ : ℕ → ℕ → ℕ
70
702ce92c45ab add concat
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 -- _*_ zero _ = zero
702ce92c45ab add concat
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 -- _*_ (suc n) m = m + ( n * m )
702ce92c45ab add concat
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
56
138
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
57 exp : ℕ → ℕ → ℕ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
58 exp _ zero = 1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
59 exp n (suc m) = n * ( exp n m )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
60
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
61 minus : (a b : ℕ ) → ℕ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
62 minus a zero = a
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
63 minus zero (suc b) = zero
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
64 minus (suc a) (suc b) = minus a b
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
65
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
66 _-_ = minus
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
67
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
68 m+= : {i j m : ℕ } → m + i ≡ m + j → i ≡ j
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
69 m+= {i} {j} {zero} refl = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
70 m+= {i} {j} {suc m} eq = m+= {i} {j} {m} ( cong (λ k → pred k ) eq )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
71
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
72 +m= : {i j m : ℕ } → i + m ≡ j + m → i ≡ j
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
73 +m= {i} {j} {m} eq = m+= ( subst₂ (λ j k → j ≡ k ) (+-comm i _ ) (+-comm j _ ) eq )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
74
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
75 less-1 : { n m : ℕ } → suc n < m → n < m
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
76 less-1 {zero} {suc (suc _)} (s≤s (s≤s z≤n)) = s≤s z≤n
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
77 less-1 {suc n} {suc m} (s≤s lt) = s≤s (less-1 {n} {m} lt)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
78
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
79 sa=b→a<b : { n m : ℕ } → suc n ≡ m → n < m
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
80 sa=b→a<b {0} {suc zero} refl = s≤s z≤n
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
81 sa=b→a<b {suc n} {suc (suc n)} refl = s≤s (sa=b→a<b refl)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
82
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
83 minus+n : {x y : ℕ } → suc x > y → minus x y + y ≡ x
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
84 minus+n {x} {zero} _ = trans (sym (+-comm zero _ )) refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
85 minus+n {zero} {suc y} (s≤s ())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
86 minus+n {suc x} {suc y} (s≤s lt) = begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
87 minus (suc x) (suc y) + suc y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
88 ≡⟨ +-comm _ (suc y) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
89 suc y + minus x y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
90 ≡⟨ cong ( λ k → suc k ) (
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
91 begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
92 y + minus x y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
93 ≡⟨ +-comm y _ ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
94 minus x y + y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
95 ≡⟨ minus+n {x} {y} lt ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
96 x
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
97
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
98 ) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
99 suc x
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
100 ∎ where open ≡-Reasoning
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
101
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
102
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
103 -- open import Relation.Binary.PropositionalEquality
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
104
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
105 -- postulate extensionality : { n : Level} → Relation.Binary.PropositionalEquality.Extensionality n n -- (Level.suc n)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
106
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
107 -- <-≡-iff : {A B : (a b : ℕ ) → Set } → {a b : ℕ } → (A a b → B a b ) → (B a b → A a b ) → A ≡ B
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
108 -- <-≡-iff {A} {B} ab ba = {!!}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
109
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
110
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
111 0<s : {x : ℕ } → zero < suc x
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
112 0<s {_} = s≤s z≤n
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
113
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
114 <-minus-0 : {x y z : ℕ } → z + x < z + y → x < y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
115 <-minus-0 {x} {suc _} {zero} lt = lt
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
116 <-minus-0 {x} {y} {suc z} (s≤s lt) = <-minus-0 {x} {y} {z} lt
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
117
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
118 <-minus : {x y z : ℕ } → x + z < y + z → x < y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
119 <-minus {x} {y} {z} lt = <-minus-0 ( subst₂ ( λ j k → j < k ) (+-comm x _) (+-comm y _ ) lt )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
120
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
121 x≤x+y : {z y : ℕ } → z ≤ z + y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
122 x≤x+y {zero} {y} = z≤n
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
123 x≤x+y {suc z} {y} = s≤s (x≤x+y {z} {y})
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
124
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
125 <-plus : {x y z : ℕ } → x < y → x + z < y + z
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
126 <-plus {zero} {suc y} {z} (s≤s z≤n) = s≤s (subst (λ k → z ≤ k ) (+-comm z _ ) x≤x+y )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
127 <-plus {suc x} {suc y} {z} (s≤s lt) = s≤s (<-plus {x} {y} {z} lt)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
128
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
129 <-plus-0 : {x y z : ℕ } → x < y → z + x < z + y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
130 <-plus-0 {x} {y} {z} lt = subst₂ (λ j k → j < k ) (+-comm _ z) (+-comm _ z) ( <-plus {x} {y} {z} lt )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
131
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
132 ≤-plus : {x y z : ℕ } → x ≤ y → x + z ≤ y + z
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
133 ≤-plus {0} {y} {zero} z≤n = z≤n
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
134 ≤-plus {0} {y} {suc z} z≤n = subst (λ k → z < k ) (+-comm _ y ) x≤x+y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
135 ≤-plus {suc x} {suc y} {z} (s≤s lt) = s≤s ( ≤-plus {x} {y} {z} lt )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
136
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
137 ≤-plus-0 : {x y z : ℕ } → x ≤ y → z + x ≤ z + y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
138 ≤-plus-0 {x} {y} {zero} lt = lt
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
139 ≤-plus-0 {x} {y} {suc z} lt = s≤s ( ≤-plus-0 {x} {y} {z} lt )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
140
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
141 x+y<z→x<z : {x y z : ℕ } → x + y < z → x < z
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
142 x+y<z→x<z {zero} {y} {suc z} (s≤s lt1) = s≤s z≤n
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
143 x+y<z→x<z {suc x} {y} {suc z} (s≤s lt1) = s≤s ( x+y<z→x<z {x} {y} {z} lt1 )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
144
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
145 *≤ : {x y z : ℕ } → x ≤ y → x * z ≤ y * z
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
146 *≤ lt = *-mono-≤ lt ≤-refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
147
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
148 *< : {x y z : ℕ } → x < y → x * suc z < y * suc z
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
149 *< {zero} {suc y} lt = s≤s z≤n
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
150 *< {suc x} {suc y} (s≤s lt) = <-plus-0 (*< lt)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
151
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
152 <to<s : {x y : ℕ } → x < y → x < suc y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
153 <to<s {zero} {suc y} (s≤s lt) = s≤s z≤n
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
154 <to<s {suc x} {suc y} (s≤s lt) = s≤s (<to<s {x} {y} lt)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
155
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
156 <tos<s : {x y : ℕ } → x < y → suc x < suc y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
157 <tos<s {zero} {suc y} (s≤s z≤n) = s≤s (s≤s z≤n)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
158 <tos<s {suc x} {suc y} (s≤s lt) = s≤s (<tos<s {x} {y} lt)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
159
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
160 ≤to< : {x y : ℕ } → x < y → x ≤ y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
161 ≤to< {zero} {suc y} (s≤s z≤n) = z≤n
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
162 ≤to< {suc x} {suc y} (s≤s lt) = s≤s (≤to< {x} {y} lt)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
163
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
164 refl-≤s : {x : ℕ } → x ≤ suc x
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
165 refl-≤s {zero} = z≤n
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
166 refl-≤s {suc x} = s≤s (refl-≤s {x})
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
167
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
168 x<y→≤ : {x y : ℕ } → x < y → x ≤ suc y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
169 x<y→≤ {zero} {.(suc _)} (s≤s z≤n) = z≤n
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
170 x<y→≤ {suc x} {suc y} (s≤s lt) = s≤s (x<y→≤ {x} {y} lt)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
171
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
172 open import Data.Product
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
173
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
174 minus<=0 : {x y : ℕ } → x ≤ y → minus x y ≡ 0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
175 minus<=0 {0} {zero} z≤n = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
176 minus<=0 {0} {suc y} z≤n = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
177 minus<=0 {suc x} {suc y} (s≤s le) = minus<=0 {x} {y} le
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
178
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
179 minus>0 : {x y : ℕ } → x < y → 0 < minus y x
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
180 minus>0 {zero} {suc _} (s≤s z≤n) = s≤s z≤n
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
181 minus>0 {suc x} {suc y} (s≤s lt) = minus>0 {x} {y} lt
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
182
141
b3f05cd08d24 clean up
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
183 open import Relation.Binary.Definitions
b3f05cd08d24 clean up
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
184
138
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
185 distr-minus-* : {x y z : ℕ } → (minus x y) * z ≡ minus (x * z) (y * z)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
186 distr-minus-* {x} {zero} {z} = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
187 distr-minus-* {x} {suc y} {z} with <-cmp x y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
188 distr-minus-* {x} {suc y} {z} | tri< a ¬b ¬c = begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
189 minus x (suc y) * z
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
190 ≡⟨ cong (λ k → k * z ) (minus<=0 {x} {suc y} (x<y→≤ a)) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
191 0 * z
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
192 ≡⟨ sym (minus<=0 {x * z} {z + y * z} le ) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
193 minus (x * z) (z + y * z)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
194 ∎ where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
195 open ≡-Reasoning
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
196 le : x * z ≤ z + y * z
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
197 le = ≤-trans lemma (subst (λ k → y * z ≤ k ) (+-comm _ z ) (x≤x+y {y * z} {z} ) ) where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
198 lemma : x * z ≤ y * z
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
199 lemma = *≤ {x} {y} {z} (≤to< a)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
200 distr-minus-* {x} {suc y} {z} | tri≈ ¬a refl ¬c = begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
201 minus x (suc y) * z
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
202 ≡⟨ cong (λ k → k * z ) (minus<=0 {x} {suc y} refl-≤s ) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
203 0 * z
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
204 ≡⟨ sym (minus<=0 {x * z} {z + y * z} (lt {x} {z} )) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
205 minus (x * z) (z + y * z)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
206 ∎ where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
207 open ≡-Reasoning
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
208 lt : {x z : ℕ } → x * z ≤ z + x * z
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
209 lt {zero} {zero} = z≤n
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
210 lt {suc x} {zero} = lt {x} {zero}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
211 lt {x} {suc z} = ≤-trans lemma refl-≤s where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
212 lemma : x * suc z ≤ z + x * suc z
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
213 lemma = subst (λ k → x * suc z ≤ k ) (+-comm _ z) (x≤x+y {x * suc z} {z})
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
214 distr-minus-* {x} {suc y} {z} | tri> ¬a ¬b c = +m= {_} {_} {suc y * z} ( begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
215 minus x (suc y) * z + suc y * z
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
216 ≡⟨ sym (proj₂ *-distrib-+ z (minus x (suc y) ) _) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
217 ( minus x (suc y) + suc y ) * z
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
218 ≡⟨ cong (λ k → k * z) (minus+n {x} {suc y} (s≤s c)) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
219 x * z
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
220 ≡⟨ sym (minus+n {x * z} {suc y * z} (s≤s (lt c))) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
221 minus (x * z) (suc y * z) + suc y * z
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
222 ∎ ) where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
223 open ≡-Reasoning
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
224 lt : {x y z : ℕ } → suc y ≤ x → z + y * z ≤ x * z
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
225 lt {x} {y} {z} le = *≤ le
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
226
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
227 minus- : {x y z : ℕ } → suc x > z + y → minus (minus x y) z ≡ minus x (y + z)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
228 minus- {x} {y} {z} gt = +m= {_} {_} {z} ( begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
229 minus (minus x y) z + z
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
230 ≡⟨ minus+n {_} {z} lemma ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
231 minus x y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
232 ≡⟨ +m= {_} {_} {y} ( begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
233 minus x y + y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
234 ≡⟨ minus+n {_} {y} lemma1 ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
235 x
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
236 ≡⟨ sym ( minus+n {_} {z + y} gt ) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
237 minus x (z + y) + (z + y)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
238 ≡⟨ sym ( +-assoc (minus x (z + y)) _ _ ) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
239 minus x (z + y) + z + y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
240 ∎ ) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
241 minus x (z + y) + z
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
242 ≡⟨ cong (λ k → minus x k + z ) (+-comm _ y ) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
243 minus x (y + z) + z
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
244 ∎ ) where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
245 open ≡-Reasoning
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
246 lemma1 : suc x > y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
247 lemma1 = x+y<z→x<z (subst (λ k → k < suc x ) (+-comm z _ ) gt )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
248 lemma : suc (minus x y) > z
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
249 lemma = <-minus {_} {_} {y} ( subst ( λ x → z + y < suc x ) (sym (minus+n {x} {y} lemma1 )) gt )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
250
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
251 minus-* : {M k n : ℕ } → n < k → minus k (suc n) * M ≡ minus (minus k n * M ) M
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
252 minus-* {zero} {k} {n} lt = begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
253 minus k (suc n) * zero
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
254 ≡⟨ *-comm (minus k (suc n)) zero ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
255 zero * minus k (suc n)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
256 ≡⟨⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
257 0 * minus k n
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
258 ≡⟨ *-comm 0 (minus k n) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
259 minus (minus k n * 0 ) 0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
260 ∎ where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
261 open ≡-Reasoning
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
262 minus-* {suc m} {k} {n} lt with <-cmp k 1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
263 minus-* {suc m} {.0} {zero} lt | tri< (s≤s z≤n) ¬b ¬c = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
264 minus-* {suc m} {.0} {suc n} lt | tri< (s≤s z≤n) ¬b ¬c = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
265 minus-* {suc zero} {.1} {zero} lt | tri≈ ¬a refl ¬c = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
266 minus-* {suc (suc m)} {.1} {zero} lt | tri≈ ¬a refl ¬c = minus-* {suc m} {1} {zero} lt
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
267 minus-* {suc m} {.1} {suc n} (s≤s ()) | tri≈ ¬a refl ¬c
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
268 minus-* {suc m} {k} {n} lt | tri> ¬a ¬b c = begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
269 minus k (suc n) * M
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
270 ≡⟨ distr-minus-* {k} {suc n} {M} ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
271 minus (k * M ) ((suc n) * M)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
272 ≡⟨⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
273 minus (k * M ) (M + n * M )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
274 ≡⟨ cong (λ x → minus (k * M) x) (+-comm M _ ) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
275 minus (k * M ) ((n * M) + M )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
276 ≡⟨ sym ( minus- {k * M} {n * M} (lemma lt) ) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
277 minus (minus (k * M ) (n * M)) M
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
278 ≡⟨ cong (λ x → minus x M ) ( sym ( distr-minus-* {k} {n} )) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
279 minus (minus k n * M ) M
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
280 ∎ where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
281 M = suc m
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
282 lemma : {n k m : ℕ } → n < k → suc (k * suc m) > suc m + n * suc m
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
283 lemma {zero} {suc k} {m} (s≤s lt) = s≤s (s≤s (subst (λ x → x ≤ m + k * suc m) (+-comm 0 _ ) x≤x+y ))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
284 lemma {suc n} {suc k} {m} lt = begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
285 suc (suc m + suc n * suc m)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
286 ≡⟨⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
287 suc ( suc (suc n) * suc m)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
288 ≤⟨ ≤-plus-0 {_} {_} {1} (*≤ lt ) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
289 suc (suc k * suc m)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
290 ∎ where open ≤-Reasoning
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
291 open ≡-Reasoning