module Core.Var import Core.Context import Core.Thinning %prefix_record_projections off -- Variables ------------------------------------------------------------------- data IsVar : Nat -> Context -> Type where Here : IsVar 0 (sx :< n) There : IsVar k sx -> IsVar (S k) (sx :< n) export record Var (sx : Context) where constructor MakeVar index : Nat 0 prf : IsVar index sx %name IsVar prf %name Var i, j, k -- Constructors ---------------------------------------------------------------- export here : Var (sx :< n) here = MakeVar 0 Here export there : Var sx -> Var (sx :< n) there (MakeVar index prf) = MakeVar (S index) (There prf) -- Views ----------------------------------------------------------------------- namespace View public export data View : Var sx -> Type where Here : View Core.Var.here There : (i : Var sx) -> View (there i) %name View.View view export view : (i : Var sx) -> View i view (MakeVar 0 Here) = Here view (MakeVar (S k) (There prf)) = There (MakeVar k prf) -- Views are Unique viewInverse : {0 i : Var sx} -> View i -> Var sx viewInverse Here = here viewInverse (There i) = there i viewInversePrf1 : (view : View i) -> viewInverse view = i viewInversePrf1 Here = Refl viewInversePrf1 (There i) = Refl viewInversePrf2 : {0 i : Var sx} -> (v : View i) -> view (viewInverse v) = (rewrite viewInversePrf1 v in v) viewInversePrf2 Here = Refl viewInversePrf2 (There (MakeVar index prf)) = Refl export viewUnique : {0 i : Var sx} -> (view1, view2 : View i) -> view1 = view2 viewUnique view1 view2 = rewrite sym $ viewInversePrf2 view1 in rewrite sym $ viewInversePrf2 view2 in rewrite viewInversePrf1 view1 in rewrite viewInversePrf1 view2 in Refl -- Operations ------------------------------------------------------------------ doWkn : Var sx -> {0 thin : sx `Thins` sy} -> View thin -> Var sy doWkn i (Id sy) = i doWkn i (Drop thin n) = there $ doWkn i (view thin) doWkn (MakeVar 0 Here) (Keep thin n) = here doWkn (MakeVar (S k) (There prf)) (Keep thin n) = there $ doWkn (MakeVar k prf) (view thin) export wkn : Var sx -> sx `Thins` sy -> Var sy wkn i thin = doWkn i (view thin)