4 | import public Data.Trichotomy
10 | data Either0 : Type -> Type -> Type where
11 | Left0 : (0 v : a) -> Either0 a b
12 | Right0 : (0 v : b) -> Either0 a b
22 | strictRefl : (0 prf : a === b) -> Lazy c -> c
23 | strictRefl Refl x = x
51 | interface Total (0 a : Type) (0 lt : a -> a -> Type) | lt where
53 | 0 transLT : {k,m,n : a} -> lt k m -> lt m n -> lt k n
56 | trichotomy : (m,n : a) -> Trichotomy lt m n
60 | testLT : Total a lt => (x,y : a) -> Either0 (lt x y) (Either (lt y x) (y === x))
61 | testLT x y = case trichotomy {lt} x y of
63 | EQ _ p _ => Right0 (Right $
sym p)
64 | GT _ _ p => Right0 (Left p)
68 | testGT : Total a lt => (x,y : a) -> Either0 (lt y x) (Either (lt x y) (x === y))
69 | testGT x y = case trichotomy {lt} x y of
71 | LT p _ _ => Right0 (Left p)
72 | EQ _ p _ => Right0 (Right p)
76 | testEQ : Total a lt => (x,y : a) -> Either0 (x === y) (Either (lt x y) (lt y x))
77 | testEQ x y = case trichotomy {lt} x y of
79 | LT p _ _ => Right0 (Left p)
80 | GT _ _ p => Right0 (Right p)
88 | 0 irrefl : Total a lt => Not (lt m m)
89 | irrefl x = case trichotomy m m of
102 | 0 trans : Total a lt => lt k m -> lt m n -> lt k n
108 | {auto _ : Total a lt}
110 | -> Either (lt m n) (lt n m)
111 | -> Either (lt k n) (lt n k)
112 | trans_EQ_NEQ eqv neq = rewrite eqv in neq
117 | {auto _ : Total a lt}
118 | -> Either (lt k m) (lt m k)
120 | -> Either (lt k n) (lt n k)
121 | trans_NEQ_EQ neq eqv = rewrite (sym eqv) in neq
125 | 0 trans_LT_EQ : Total a lt => lt k m -> m === n -> lt k n
126 | trans_LT_EQ p eqv = rewrite sym eqv in p
130 | 0 trans_EQ_LT : Total a lt => k === m -> lt m n -> lt k n
131 | trans_EQ_LT eqv q = rewrite eqv in q
135 | 0 trans_LTE_LT : Total a lt => Either (lt k m) (k === m) -> lt m n -> lt k n
136 | trans_LTE_LT x y = either (`trans` y) (`trans_EQ_LT` y) x
140 | 0 trans_LT_LTE : Total a lt => lt k m -> Either (lt m n) (m === n) -> lt k n
141 | trans_LT_LTE x = either (trans x) (trans_LT_EQ x)
145 | 0 trans_GT_EQ : Total a lt => lt m k -> m === n -> lt n k
146 | trans_GT_EQ p eqv = rewrite sym eqv in p
150 | 0 trans_EQ_GT : Total a lt => k === m -> lt n m -> lt n k
151 | trans_EQ_GT eqv q = rewrite eqv in q
155 | 0 trans_GTE_GT : Total a lt => Either (lt m k) (m === k) -> lt n m -> lt n k
156 | trans_GTE_GT x y = either (trans y) (\v => trans_EQ_GT (sym v) y) x
160 | 0 trans_GT_GTE : Total a lt => lt m k -> Either (lt n m) (n === m) -> lt n k
161 | trans_GT_GTE x (Left y) = trans y x
162 | trans_GT_GTE x (Right y) = trans_GT_EQ x (sym y)
168 | 0 refl : Total a lt => Either (lt m m) (m === m)
174 | {auto _ : Total a lt}
175 | -> Either (lt k m) (k === m)
176 | -> Either (lt m n) (m === n)
177 | -> Either (lt k n) (k === n)
178 | trans (Left x) y = Left (trans_LT_LTE x y)
179 | trans (Right x) (Left y) = Left (trans_EQ_LT x y)
180 | trans (Right x) (Right y) = Right (trans x y)
185 | {auto _ : Total a lt}
186 | -> Either (lt m n) (m === n)
187 | -> Either (lt n m) (m === n)
189 | antisym (Right x) _ = x
190 | antisym (Left x) (Right y) = y
191 | antisym (Left x) (Left y) = void (irrefl $
trans x y)
196 | {auto _ : Total a lt}
197 | -> Either (lt k m) (k === m)
199 | -> Either (lt k n) (k === n)
200 | trans_LTE_EQ lte eq = trans lte (Right eq)
205 | {auto _ : Total a lt}
207 | -> Either (lt m n) (m === n)
208 | -> Either (lt k n) (k === n)
209 | trans_EQ_LTE eq lte = trans (Right eq) lte
216 | {auto _ : Total a lt}
217 | -> Either (lt m k) (m === k)
218 | -> Either (lt n m) (n === m)
219 | -> Either (lt n k) (n === k)
220 | trans (Left x) y = Left (trans_GT_GTE x y)
221 | trans (Right x) (Left y) = Left (trans_EQ_GT (sym x) y)
222 | trans (Right x) (Right y) = Right (trans y x)
227 | {auto _ : Total a lt}
228 | -> Either (lt n m) (m === n)
229 | -> Either (lt m n) (m === n)
231 | antisym (Right x) _ = x
232 | antisym (Left x) (Right y) = y
233 | antisym (Left x) (Left y) = void (irrefl $
trans x y)
238 | {auto _ : Total a lt}
239 | -> Either (lt m k) (m === k)
241 | -> Either (lt n k) (n === k)
242 | trans_GTE_EQ gte eq = trans gte (Right $
sym eq)
247 | {auto _ : Total a lt}
249 | -> Either (lt n m) (n === m)
250 | -> Either (lt n k) (n === k)
251 | trans_EQ_GTE eq gte = trans (Right $
sym eq) gte
259 | 0 LT_not_GT : Total a lt => lt m n -> Not (lt n m)
260 | LT_not_GT isLT isGT = case trichotomy m n of
267 | 0 LT_not_EQ : Total a lt => lt m n -> Not (m === n)
268 | LT_not_EQ isLT isEQ = case trichotomy m n of
275 | 0 LT_not_GTE : Total a lt => lt m n -> Not (Either (lt n m) (n === m))
276 | LT_not_GTE l = either (LT_not_GT l) (\e => LT_not_EQ l (sym e))
280 | 0 Not_LT_to_GTE : Total a lt => Not (lt m n) -> Either (lt n m) (n === m)
281 | Not_LT_to_GTE f = case trichotomy m n of
282 | LT x _ _ => void (f x)
283 | EQ _ x _ => Right (sym x)
288 | 0 EQ_not_LT : Total a lt => m === n -> Not (lt m n)
289 | EQ_not_LT = flip LT_not_EQ
293 | 0 EQ_not_GT : Total a lt => m === n -> Not (lt n m)
294 | EQ_not_GT isEQ = EQ_not_LT (sym isEQ)
298 | 0 EQ_not_NEQ : Total a lt => m === n -> Not (Either (lt m n) (lt n m))
299 | EQ_not_NEQ isEQ = either (EQ_not_LT isEQ) (EQ_not_GT isEQ)
303 | 0 Not_EQ_to_NEQ : Total a lt => Not (m === n) -> Either (lt m n) (lt n m)
304 | Not_EQ_to_NEQ f = case trichotomy m n of
306 | EQ _ x _ => void (f x)
307 | GT _ _ x => Right x
311 | 0 GT_not_LT : Total a lt => lt n m -> Not (lt m n)
312 | GT_not_LT = LT_not_GT
316 | 0 GT_not_EQ : Total a lt => lt n m -> Not (m === n)
317 | GT_not_EQ = flip EQ_not_GT
321 | 0 GT_not_LTE : Total a lt => lt n m -> Not (Either (lt m n) (m === n))
322 | GT_not_LTE gt = either (GT_not_LT gt) (GT_not_EQ gt)
326 | 0 Not_GT_to_LTE : Total a lt => Not (lt n m) -> Either (lt m n) (m === n)
327 | Not_GT_to_LTE f = case trichotomy m n of
329 | EQ _ x _ => Right x
330 | GT _ _ x => void (f x)
334 | 0 LTE_not_GT : Total a lt => (Either (lt m n) (m === n)) -> Not (lt n m)
335 | LTE_not_GT = either LT_not_GT EQ_not_GT
339 | 0 Not_LTE_to_GT : Total a lt => Not (Either (lt m n) (m === n)) -> lt n m
340 | Not_LTE_to_GT f = case trichotomy m n of
341 | LT x _ _ => void (f $
Left x)
342 | EQ _ x _ => void (f $
Right x)
347 | 0 LTE_and_GTE_to_EQ :
348 | {auto _ : Total a lt}
349 | -> Either (lt m n) (m === n)
350 | -> Either (lt n m) (n === m)
352 | LTE_and_GTE_to_EQ (Left x) (Right y) = sym y
353 | LTE_and_GTE_to_EQ (Right x) _ = x
354 | LTE_and_GTE_to_EQ (Left x) (Left y) = void (LT_not_GT x y)
358 | 0 LTE_and_NEQ_to_LT :
359 | {auto _ : Total a lt}
360 | -> Either (lt m n) (m === n)
361 | -> Either (lt m n) (lt n m)
363 | LTE_and_NEQ_to_LT (Left x) _ = x
364 | LTE_and_NEQ_to_LT (Right _) (Left x) = x
365 | LTE_and_NEQ_to_LT (Right x) (Right y) = void (EQ_not_GT x y)
369 | 0 NEQ_not_EQ : Total a lt => Either (lt m n) (lt n m) -> Not (m === n)
370 | NEQ_not_EQ = either LT_not_EQ GT_not_EQ
374 | 0 Not_NEQ_to_EQ : Total a lt => Not (Either (lt m n) (lt n m)) -> m === n
375 | Not_NEQ_to_EQ f = case trichotomy m n of
376 | LT x _ _ => void (f $
Left x)
378 | GT _ _ x => void (f $
Right x)
382 | 0 NEQ_and_LTE_to_LT :
383 | {auto _ : Total a lt}
384 | -> Either (lt m n) (lt n m)
385 | -> Either (lt m n) (m === n)
387 | NEQ_and_LTE_to_LT = flip LTE_and_NEQ_to_LT
391 | 0 NEQ_and_GTE_to_GT :
392 | {auto _ : Total a lt}
393 | -> Either (lt m n) (lt n m)
394 | -> Either (lt n m) (n === m)
396 | NEQ_and_GTE_to_GT (Right x) _ = x
397 | NEQ_and_GTE_to_GT (Left _) (Left y) = y
398 | NEQ_and_GTE_to_GT (Left x) (Right y) = void (GT_not_EQ x y)
402 | 0 GTE_not_LT : Total a lt => Either (lt n m) (n === m) -> Not (lt m n)
403 | GTE_not_LT = either GT_not_LT EQ_not_GT
407 | 0 Not_GTE_to_LT : Total a lt => Not (Either (lt n m) (n === m)) -> lt m n
408 | Not_GTE_to_LT f = case trichotomy m n of
410 | EQ _ x _ => void (f $
Right (sym x))
411 | GT _ _ x => void (f $
Left x)
415 | 0 GTE_and_LTE_to_EQ :
416 | {auto _ : Total a lt}
417 | -> Either (lt n m) (n === m)
418 | -> Either (lt m n) (m === n)
420 | GTE_and_LTE_to_EQ = flip LTE_and_GTE_to_EQ
424 | 0 GTE_and_NEQ_to_GT :
425 | {auto _ : Total a lt}
426 | -> Either (lt n m) (n === m)
427 | -> Either (lt m n) (lt n m)
429 | GTE_and_NEQ_to_GT = flip NEQ_and_GTE_to_GT