0 | module Data.List.Shift
2 | import Data.Bool.Rewrite
3 | import Data.List.Suffix
29 | -> (sx : SnocList t)
31 | -> (giro : SnocList t)
34 | [search strict xs giro orig]
39 | -> {0 sx : SnocList t}
41 | -> Shift False t sx xs sx xs
48 | -> {0 sx,sy : SnocList t}
49 | -> {0 xs,ys : List t}
50 | -> Shift b1 t sx (x :: xs) sy ys
51 | -> Shift b2 t (sx :< x) xs sy ys
54 | public export %inline
55 | shift : Shift b t sc (x::xs) giro orig -> Shift True t (sc :< x) xs giro orig
67 | toNat : {0 b : Bool} -> Shift b t sx xs sy ys -> Nat
69 | toNat (SH x) = S $
toNat x
71 | public export %inline
72 | Cast (Shift b t sx xs sy ys) Nat where cast = toNat
77 | -> Shift (x || y) t sx xs sy ys
78 | -> Shift (y || x) t sx xs sy ys
79 | swapOr = swapOr (\k => Shift k t sx xs sy ys)
81 | public export %inline
82 | orSame : {0 x : _} -> Shift (x || x) t sx xs sy ys -> Shift x t sx xs sy ys
83 | orSame = orSame (\k => Shift k t sx xs sy ys)
85 | public export %inline
88 | -> Shift (x || True) t sx xs sy ys
89 | -> Shift True t sx xs sy ys
90 | orTrue = orTrue (\k => Shift k t sx xs sy ys)
92 | public export %inline
95 | -> Shift (x || False) t sx xs sy ys
96 | -> Shift x t sx xs sy ys
97 | orFalse = orFalse (\k => Shift k t sx xs sy ys)
99 | public export %inline
102 | -> Shift (x && y) t sx xs sy ys
103 | -> Shift (y && x) t sx xs sy ys
104 | swapAnd = swapAnd (\k => Shift k t sx xs sy ys)
106 | public export %inline
109 | -> Shift (x && x) t sx xs sy ys
110 | -> Shift x t sx xs sy ys
111 | andSame = andSame (\k => Shift k t sx xs sy ys)
113 | public export %inline
116 | -> Shift (x && True) t sx xs sy ys
117 | -> Shift x t sx xs sy ys
118 | andTrue = andTrue (\k => Shift k t sx xs sy ys)
120 | public export %inline
123 | -> Shift (x && False) t sx xs sy ys
124 | -> Shift False t sx xs sy ys
125 | andFalse = andFalse (\k => Shift k t sx xs sy ys)
131 | weaken : {0 b : Bool} -> Shift b t sx xs sy ys -> Shift False t sx xs sy ys
133 | weaken (SH x) = SH x
139 | weakens : {0 b : Bool} -> Shift True t sx xs sy ys -> Shift b t sx xs sy ys
140 | weakens (SH x) = SH x
141 | weakens Same
impossible
147 | suffix : {0 b : Bool} -> Shift b t sx xs sy ys -> Suffix b xs ys
149 | suffix (SH x) = Uncons $
suffix x
152 | and1 : Shift b1 t sx xs sy ys -> Shift (b1 && b2) t sx xs sy ys
157 | and2 : Shift b2 t sx xs sy ys -> Shift (b1 && b2) t sx xs sy ys
158 | and2 s = swapAnd (and1 s)
165 | Shift b1 t sx xs sy ys
166 | -> Shift b2 t sy ys sz zs
167 | -> Shift (b1 || b2) t sx xs sz zs
169 | trans (SH x) y = SH $
trans x y
173 | Shift b1 t sx xs sy ys
174 | -> Shift b2 t sy ys sz zs
175 | -> Shift (b1 || b2) t sx xs sz zs
176 | transp x y = believe_me (toNat x + toNat y)
178 | %transform "shiftTransPlus"
Shift.trans = Shift.transp