2 | import Core.Name.Scoped
5 | import Libraries.Data.List.SizeOf
11 | data Subst : Scoped -> Scope -> Scoped where
12 | Nil : Subst tm Scope.empty vars
13 | (::) : tm vars -> Subst tm ds vars -> Subst tm (d :: ds) vars
16 | empty : Subst tm Scope.empty vars
23 | index : Subst tm ds vars -> Var ds -> tm vars
24 | index [] (MkVar p) impossible
25 | index (t :: _) (MkVar First) = t
26 | index (_ :: ts) (MkVar (Later p)) = index ts (MkVar p)
31 | (Var vars -> tm vars) ->
33 | Var (dropped ++ vars) ->
34 | Subst tm dropped vars ->
36 | findDrop k s var sub = case locateVar s var of
37 | Left var => index sub var
42 | (forall vars. Var vars -> tm vars) ->
43 | SizeOf outer -> SizeOf dropped ->
44 | Var (outer ++ (dropped ++ vars)) ->
45 | Subst tm dropped vars ->
47 | find k outer dropped var sub = case locateVar outer var of
48 | Left var => k (embed var)
49 | Right var => weakenNs outer (findDrop k dropped var sub)
53 | 0 Substitutable : Scoped -> Scoped -> Type
54 | Substitutable val tm
55 | = {0 outer, dropped, vars : Scope} ->
58 | Subst val dropped vars ->
59 | tm (outer ++ (dropped ++ vars)) ->