Mercurial > hg > Gears > GearsAgda
comparison etc/trichotomos-ex.agda @ 569:f24a73245f36
separate trichotomos exercise
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 17 Apr 2018 10:14:16 +0900 |
parents | redBlackTreeTest.agda@a5ba292e4081 |
children | 0b791ae19543 |
comparison
equal
deleted
inserted
replaced
568:a5ba292e4081 | 569:f24a73245f36 |
---|---|
1 module trichotomos-ex where | |
2 | |
3 open import Level hiding (zero) renaming ( suc to succ ) | |
4 open import Data.Empty | |
5 open import Data.Nat | |
6 open import Relation.Nullary | |
7 open import Algebra | |
8 open import Data.Nat.Properties as NatProp | |
9 open import Relation.Binary | |
10 open import Relation.Binary.PropositionalEquality | |
11 open import Relation.Binary.Core | |
12 open import Function | |
13 | |
14 data Bool {n : Level } : Set n where | |
15 True : Bool | |
16 False : Bool | |
17 | |
18 record _∧_ {n : Level } (a : Set n) (b : Set n): Set n where | |
19 field | |
20 pi1 : a | |
21 pi2 : b | |
22 | |
23 data _∨_ {n : Level } (a : Set n) (b : Set n): Set n where | |
24 pi1 : a -> a ∨ b | |
25 pi2 : b -> a ∨ b | |
26 | |
27 | |
28 data Maybe {n : Level } (a : Set n) : Set n where | |
29 Nothing : Maybe a | |
30 Just : a -> Maybe a | |
31 | |
32 data Color {n : Level } : Set n where | |
33 Red : Color | |
34 Black : Color | |
35 | |
36 data CompareResult {n : Level } : Set n where | |
37 LT : CompareResult | |
38 GT : CompareResult | |
39 EQ : CompareResult | |
40 | |
41 record Node {n : Level } (a k : Set n) : Set n where | |
42 inductive | |
43 field | |
44 key : k | |
45 value : a | |
46 right : Maybe (Node a k) | |
47 left : Maybe (Node a k) | |
48 color : Color {n} | |
49 open Node | |
50 | |
51 compareℕ : ℕ → ℕ → CompareResult {Level.zero} | |
52 compareℕ x y with Data.Nat.compare x y | |
53 ... | less _ _ = LT | |
54 ... | equal _ = EQ | |
55 ... | greater _ _ = GT | |
56 | |
57 compareT : ℕ → ℕ → CompareResult {Level.zero} | |
58 compareT x y with IsStrictTotalOrder.compare (Relation.Binary.StrictTotalOrder.isStrictTotalOrder strictTotalOrder) x y | |
59 ... | tri≈ _ _ _ = EQ | |
60 ... | tri< _ _ _ = LT | |
61 ... | tri> _ _ _ = GT | |
62 | |
63 | |
64 compare2 : (x y : ℕ ) → CompareResult {Level.zero} | |
65 compare2 zero zero = EQ | |
66 compare2 (suc _) zero = GT | |
67 compare2 zero (suc _) = LT | |
68 compare2 (suc x) (suc y) = compare2 x y | |
69 | |
70 contraposition : {m : Level } {A B : Set m} → (B → A) → (¬ A → ¬ B) | |
71 contraposition f = λ x y → x (f y) | |
72 | |
73 compareTri1 : (n : ℕ) → zero <′ suc n | |
74 compareTri1 zero = ≤′-refl | |
75 compareTri1 (suc n) = ≤′-step ( compareTri1 n ) | |
76 | |
77 compareTri2 : (n m : ℕ) → n ≤′ m → suc n ≤′ suc m | |
78 compareTri2 _ _ ≤′-refl = ≤′-refl | |
79 compareTri2 n (suc m) ( ≤′-step p ) = ≤′-step { suc n } ( compareTri2 n m p ) | |
80 | |
81 <′dec : Set | |
82 <′dec = ∀ m n → Dec ( m ≤′ n ) | |
83 | |
84 compareTri6 : ∀ m {n} → ¬ m ≤′ n → ¬ suc m ≤′ suc n | |
85 | |
86 is≤′ : <′dec | |
87 is≤′ zero zero = yes ≤′-refl | |
88 is≤′ zero (suc n) = yes (lemma n) | |
89 where | |
90 lemma : (n : ℕ) → zero ≤′ suc n | |
91 lemma zero = ≤′-step ≤′-refl | |
92 lemma (suc n) = ≤′-step (lemma n) | |
93 is≤′ (suc m) (zero) = no ( λ () ) | |
94 is≤′ (suc m) (suc n) with is≤′ m n | |
95 ... | yes p = yes ( compareTri2 _ _ p ) | |
96 ... | no p = no ( compareTri6 _ p ) | |
97 | |
98 compareTri20 : {n : ℕ} → ¬ suc n ≤′ zero | |
99 compareTri20 () | |
100 | |
101 | |
102 compareTri21 : (n m : ℕ) → suc n ≤′ suc m → n ≤′ m | |
103 compareTri21 _ _ ≤′-refl = ≤′-refl | |
104 compareTri21 (suc n) zero ( ≤′-step p ) = compareTri23 (suc n) ( ≤′-step p ) p | |
105 where | |
106 compareTri23 : (n : ℕ) → suc n ≤′ suc zero → suc n ≤′ zero → n ≤′ zero | |
107 compareTri23 zero ( ≤′-step p ) _ = ≤′-refl | |
108 compareTri23 zero ≤′-refl _ = ≤′-refl | |
109 compareTri23 (suc n1) ( ≤′-step p ) () | |
110 compareTri21 n (suc m) ( ≤′-step p ) = ≤′-step (compareTri21 _ _ p) | |
111 compareTri21 zero zero ( ≤′-step p ) = ≤′-refl | |
112 | |
113 | |
114 compareTri3 : ∀ m {n} → ¬ m ≡ suc (m + n) | |
115 compareTri3 zero () | |
116 compareTri3 (suc m) eq = compareTri3 m (cong pred eq) | |
117 | |
118 compareTri4' : ∀ m {n} → ¬ n ≡ m → ¬ suc n ≡ suc m | |
119 compareTri4' m {n} with n ≟ m | |
120 ... | yes refl = λ x y → x refl | |
121 ... | no p = λ x y → p ( cong pred y ) | |
122 | |
123 compareTri4 : ∀ m {n} → ¬ n ≡ m → ¬ suc n ≡ suc m | |
124 compareTri4 m = contraposition ( λ x → cong pred x ) | |
125 | |
126 -- compareTri6 : ∀ m {n} → ¬ m ≤′ n → ¬ suc m ≤′ suc n | |
127 compareTri6 m {n} = λ x y → x (compareTri21 _ _ y) | |
128 | |
129 compareTri5 : ∀ m {n} → ¬ m <′ n → ¬ suc m <′ suc n | |
130 compareTri5 m {n} = compareTri6 (suc m) | |
131 | |
132 compareTri : Trichotomous _≡_ _<′_ | |
133 compareTri zero zero = tri≈ ( λ ()) refl ( λ ()) | |
134 compareTri zero (suc n) = tri< ( compareTri1 n ) ( λ ()) ( λ ()) | |
135 compareTri (suc n) zero = tri> ( λ ()) ( λ ()) ( compareTri1 n ) | |
136 compareTri (suc n) (suc m) with compareTri n m | |
137 ... | tri< p q r = tri< (compareTri2 (suc n) m p ) (compareTri4 _ q) ( compareTri5 _ r ) | |
138 ... | tri≈ p refl r = tri≈ (compareTri5 _ p) refl ( compareTri5 _ r ) | |
139 ... | tri> p q r = tri> ( compareTri5 _ p ) (compareTri4 _ q) (compareTri2 (suc m) n r ) | |
140 | |
141 compareDecTest : (n n1 : Node ℕ ℕ) → ( key n ≡ key n1 ) ∨ ( ¬ key n ≡ key n1 ) | |
142 compareDecTest n n1 with (key n) ≟ (key n1) | |
143 ... | yes p = pi1 p | |
144 ... | no ¬p = pi2 ¬p | |
145 | |
146 | |
147 putTest1Lemma2 : (k : ℕ) → compare2 k k ≡ EQ | |
148 putTest1Lemma2 zero = refl | |
149 putTest1Lemma2 (suc k) = putTest1Lemma2 k | |
150 | |
151 putTest1Lemma1 : (x y : ℕ) → compareℕ x y ≡ compare2 x y | |
152 putTest1Lemma1 zero zero = refl | |
153 putTest1Lemma1 (suc m) zero = refl | |
154 putTest1Lemma1 zero (suc n) = refl | |
155 putTest1Lemma1 (suc m) (suc n) with Data.Nat.compare m n | |
156 putTest1Lemma1 (suc .m) (suc .(Data.Nat.suc m + k)) | less m k = lemma1 m | |
157 where | |
158 lemma1 : (m : ℕ) → LT ≡ compare2 m (ℕ.suc (m + k)) | |
159 lemma1 zero = refl | |
160 lemma1 (suc y) = lemma1 y | |
161 putTest1Lemma1 (suc .m) (suc .m) | equal m = lemma1 m | |
162 where | |
163 lemma1 : (m : ℕ) → EQ ≡ compare2 m m | |
164 lemma1 zero = refl | |
165 lemma1 (suc y) = lemma1 y | |
166 putTest1Lemma1 (suc .(Data.Nat.suc m + k)) (suc .m) | greater m k = lemma1 m | |
167 where | |
168 lemma1 : (m : ℕ) → GT ≡ compare2 (ℕ.suc (m + k)) m | |
169 lemma1 zero = refl | |
170 lemma1 (suc y) = lemma1 y | |
171 | |
172 putTest1Lemma3 : (k : ℕ) → compareℕ k k ≡ EQ | |
173 putTest1Lemma3 k = trans (putTest1Lemma1 k k) ( putTest1Lemma2 k ) | |
174 | |
175 compareLemma1 : {x y : ℕ} → compare2 x y ≡ EQ → x ≡ y | |
176 compareLemma1 {zero} {zero} refl = refl | |
177 compareLemma1 {zero} {suc _} () | |
178 compareLemma1 {suc _} {zero} () | |
179 compareLemma1 {suc x} {suc y} eq = cong ( λ z → ℕ.suc z ) ( compareLemma1 ( trans lemma2 eq ) ) | |
180 where | |
181 lemma2 : compare2 (ℕ.suc x) (ℕ.suc y) ≡ compare2 x y | |
182 lemma2 = refl | |
183 | |
184 | |
185 compTri : ( x y : ℕ ) -> Tri (x < y) ( x ≡ y ) ( x > y ) | |
186 compTri = IsStrictTotalOrder.compare (Relation.Binary.StrictTotalOrder.isStrictTotalOrder strictTotalOrder) | |
187 where open import Relation.Binary | |
188 | |
189 checkT : {m : Level } (n : Maybe (Node ℕ ℕ)) → ℕ → Bool {m} | |
190 checkT Nothing _ = False | |
191 checkT (Just n) x with compTri (value n) x | |
192 ... | tri≈ _ _ _ = True | |
193 ... | _ = False | |
194 | |
195 checkEQ : {m : Level } ( x : ℕ ) -> ( n : Node ℕ ℕ ) -> (value n ) ≡ x -> checkT {m} (Just n) x ≡ True | |
196 checkEQ x n refl with compTri (value n) x | |
197 ... | tri≈ _ refl _ = refl | |
198 ... | tri> _ neq gt = ⊥-elim (neq refl) | |
199 ... | tri< lt neq _ = ⊥-elim (neq refl) | |
200 | |
201 checkEQ' : {m : Level } ( x y : ℕ ) -> ( eq : x ≡ y ) -> ( x ≟ y ) ≡ yes eq | |
202 checkEQ' x y refl with x ≟ y | |
203 ... | yes refl = refl | |
204 ... | no neq = ⊥-elim ( neq refl ) | |
205 |