4 | module Data.Telescope.Telescope
13 | plusAcc : Nat -> Nat -> Nat
15 | plusAcc (S m) n = plusAcc m (S n)
18 | plusAccIsPlus : (m, n : Nat) -> (m + n) === plusAcc m n
19 | plusAccIsPlus Z n = Refl
20 | plusAccIsPlus (S m) n =
21 | rewrite plusSuccRightSucc m n in
22 | plusAccIsPlus m (S n)
25 | plusAccZeroRightNeutral : (m : Nat) -> plusAcc m 0 === m
26 | plusAccZeroRightNeutral m =
27 | rewrite sym (plusAccIsPlus m 0) in
28 | rewrite plusZeroRightNeutral m in
40 | data Telescope : (k : Nat) -> Type where
42 | (-.) : (gamma : Left.Telescope k) -> (ty : TypeIn gamma) -> Telescope (S k)
46 | TypeIn : Left.Telescope k -> Type
47 | TypeIn gamma = (env : Environment gamma) -> Type
51 | Environment : Left.Telescope k -> Type
53 | Environment (gamma -. ty) = (env : Environment gamma ** ty env)
56 | weakenTypeIn : TypeIn gamma -> TypeIn (gamma -. sigma)
57 | weakenTypeIn ty env = ty (fst env)
60 | uncons : (gamma : Telescope (S k)) ->
62 | ** delta : (ty -> Telescope k)
63 | ** (v : ty) -> Environment (delta v) -> Environment gamma)
64 | uncons ([] -. ty) = (
ty () ** const [] ** \ v, _ => (
() ** v))
65 | uncons (gamma@(_ -. _) -. ty) =
66 | let (
sigma ** delta ** left)
= uncons gamma in
67 | (
sigma ** (\ v => delta v -. (\ env => ty (left v env)))
68 | ** (\ v, (
env ** w)
=> (
left v env ** w)
))
71 | (++) : {n : Nat} -> (gamma : Left.Telescope m) -> (Environment gamma -> Left.Telescope n) ->
72 | Telescope (plusAcc n m)
73 | (++) {n = Z} gamma delta = gamma
74 | (++) {n = S n} gamma delta = (gamma -. sigma) ++ uncurry theta where
76 | sigma : Environment gamma -> Type
77 | sigma env = fst (uncons (delta env))
79 | theta : (env : Environment gamma) -> sigma env -> Telescope n
80 | theta env val with (uncons (delta env))
81 | theta env val | (
sig ** omega ** _)
= omega val
84 | cons : {k : Nat} -> (ty : Type) -> (ty -> Left.Telescope k) -> Left.Telescope (S k)
86 | rewrite plusCommutative 1 k in
87 | rewrite plusAccIsPlus k 1 in
88 | ([] -. const sigma) ++ (gamma . snd)
94 | Position : {k : Nat} -> Telescope k -> Type
95 | Position {k} _ = Fin (S k)
99 | start : {k : Nat} -> (gamma : Telescope k) -> Position gamma
100 | start {k} gamma = last
107 | data Telescope : (k : Nat) -> Type where
109 | (.-) : (ty : Type) -> (gamma : ty -> Right.Telescope k) -> Telescope (S k)
113 | Environment : Right.Telescope k -> Type
114 | Environment [] = ()
115 | Environment (ty .- gamma) = (v : ty ** Environment (gamma v))
118 | empty : (0 gamma : Right.Telescope Z) -> Environment gamma
119 | empty {gamma = []} = ()
122 | snoc : (gamma : Right.Telescope k) -> (Environment gamma -> Type) -> Right.Telescope (S k)
123 | snoc [] tau = tau () .- const []
124 | snoc (sigma .- gamma) tau = sigma .- \ v => snoc (gamma v) (\ env => tau (
v ** env)
)
127 | unsnoc : {k : Nat} -> (gamma : Right.Telescope (S k)) ->
128 | (delta : Right.Telescope k
129 | ** sigma : (Environment delta -> Type)
130 | ** (env : Environment delta) -> sigma env -> Environment gamma)
131 | unsnoc {k = Z} (sigma .- gamma) = (
[] ** const sigma ** \ (), v => (
v ** empty (gamma v)))
132 | unsnoc {k = S k} (sigma .- gamma)
133 | = (
sigma .- delta ** uncurry tau ** \ (
v ** env)
=> transp v env)
where
135 | delta : sigma -> Right.Telescope k
136 | delta v = fst (unsnoc (gamma v))
138 | tau : (v : sigma) -> Environment (delta v) -> Type
139 | tau v = fst (snd (unsnoc (gamma v)))
141 | transp : (v : sigma) -> (env : Environment (delta v)) -> tau v env -> Environment (sigma .- gamma)
142 | transp v env w = (
v ** (snd (snd (unsnoc (gamma v))) env w))
145 | (++) : (gamma : Right.Telescope m) -> (Environment gamma -> Right.Telescope n) -> Right.Telescope (m + n)
146 | [] ++ delta = delta ()
147 | (sigma .- gamma) ++ delta = sigma .- (\ v => (gamma v ++ (\ env => delta (
v ** env)
)))
150 | split : (gamma : Right.Telescope m) -> (delta : Environment gamma -> Right.Telescope n) ->
151 | Environment (gamma ++ delta) ->
152 | (env : Environment gamma ** Environment (delta env))
153 | split [] delta env = (
() ** env)
154 | split (sigma .- gamma) delta (
v ** env)
=
155 | let (
env1 ** env2)
= split (gamma v) (\env => delta (
v ** env)
) env in
156 | ((
v ** env1)
** env2)
165 | data Telescope : (k : Nat) -> Type where
167 | Elt : Type -> Telescope 1
168 | (><) : (gamma : Tree.Telescope m) ->
169 | (delta : Tree.Environment gamma -> Tree.Telescope n) ->
174 | Environment : Tree.Telescope k -> Type
175 | Environment [] = ()
176 | Environment (Elt t) = t
177 | Environment (gamma >< delta) = (env : Environment gamma ** Environment (delta env))
180 | concat : (gamma : Tree.Telescope k) -> (delta : Right.Telescope k ** Environment delta -> Environment gamma)
181 | concat Nil = (
[] ** id)
182 | concat (Elt t) = (
(t .- const []) ** fst)
183 | concat (gamma >< delta) =
184 | let (
thetaL ** transpL)
= concat gamma in
185 | (
(thetaL ++ \ envL => fst (concat (delta (transpL envL))))
187 | let (
env1 ** env2)
= split thetaL (\ envL => fst (concat (delta (transpL envL)))) env in
188 | (
transpL env1 ** snd (concat (delta (transpL env1))) env2)
191 | export infix 5 <++>
194 | (<++>) : (gamma : Left.Telescope m) -> (Environment gamma -> Right.Telescope n) -> Right.Telescope (plusAcc m n)
195 | [] <++> delta = delta ()
196 | (gamma -. sigma ) <++> delta = gamma <++> (\ env => sigma env .- \ v => delta (
env ** v)
)
198 | export infix 5 >++<
200 | (>++<) : {m, n : Nat} -> (gamma : Right.Telescope m) -> (Environment gamma -> Left.Telescope n) ->
201 | Left.Telescope (plusAcc m n)
202 | [] >++< delta = delta ()
203 | gamma@(_ .- _) >++< delta =
204 | let (
gamma ** sigma ** transp)
= unsnoc gamma in
205 | gamma >++< \ env => (cons (sigma env) (\ v => delta (transp env v)))
208 | leftToRight : Left.Telescope m -> Right.Telescope m
209 | leftToRight gamma = rewrite sym (plusAccZeroRightNeutral m) in (gamma <++> const [])
212 | rightToLeft : {m : Nat} -> Right.Telescope m -> Left.Telescope m
213 | rightToLeft gamma = rewrite sym (plusAccZeroRightNeutral m) in (gamma >++< const [])