1 | module TypeAligned.ZeroOne
3 | import Control.Relation
4 | import Data.Linear.Notation
10 | data ZeroOne : Rel a -> a -> a -> Type where
11 | Zero : (0 eqxy : x = y) -> ZeroOne p x y
12 | One : {0 p : a -> a -> Type} -> p x y -@ ZeroOne p x y
16 | ZeroEq : ZeroOne p x x
21 | singleton : {0 p : Rel a} -> p x y -> ZeroOne p x y
22 | singleton xy = One xy
24 | parameters {0 p : Rel a}
25 | parameters {0 f : a -> b} {0 q : Rel b}
26 | parameters (pq : {0 x, y : a} -> p x y -@ q (f x) (f y))
29 | mapReduceLOnce : q (f x) (f x) -> ZeroOne p x y -@ q (f x) (f y)
30 | mapReduceLOnce qx (Zero Refl) = qx
31 | mapReduceLOnce _ (One xy) = pq xy
35 | mapReduceROnce : q (f y) (f y) -> ZeroOne p x y -@ q (f x) (f y)
36 | mapReduceROnce qy (Zero Refl) = qy
37 | mapReduceROnce _ (One xy) = pq xy
41 | mapOnce : ZeroOne p x y -@ ZeroOne q (f x) (f y)
42 | mapOnce (Zero eq) = Zero (cong f eq)
43 | mapOnce (One xy) = One (pq xy)
45 | parameters (pq : {0 x, y : a} -> p x y -> q (f x) (f y))
48 | mapReduceL : q (f x) (f x) -> ZeroOne p x y -> q (f x) (f y)
49 | mapReduceL qx (Zero Refl) = qx
50 | mapReduceL _ (One xy) = pq xy
54 | mapReduceR : q (f y) (f y) -> ZeroOne p x y -> q (f x) (f y)
55 | mapReduceR qy (Zero Refl) = qy
56 | mapReduceR _ (One xy) = pq xy
60 | map : ZeroOne p x y -> ZeroOne q (f x) (f y)
61 | map (Zero eq) = Zero (cong f eq)
62 | map (One xy) = One (pq xy)
64 | parameters (px : p x x)
67 | reduceLOnce : ZeroOne p x y -@ p x y
68 | reduceLOnce (Zero Refl) = px
69 | reduceLOnce (One pxy) = pxy
73 | reduceL : ZeroOne p x y -> p x y
74 | reduceL zo = reduceLOnce zo
76 | parameters (py : p y y)
79 | reduceROnce : ZeroOne p x y -@ p x y
80 | reduceROnce (Zero Refl) = py
81 | reduceROnce (One pxy) = pxy
85 | reduceR : ZeroOne p x y -> p x y
86 | reduceR zo = reduceROnce zo
90 | Reflexive a (ZeroOne p) where