X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;ds=sidebyside;f=helm%2Fsoftware%2Flambda-delta%2Fsrc%2Fcomplete_rg%2Fcrg.ml;h=5a394f4f8372f3411430137b45e3da9f9a61d827;hb=4025c3f5b36025380dcad84bb7a97045d08652f6;hp=07305e9c124630eac45bbad21c6de59b2683c006;hpb=e7f64fe2cc67f3514131c8831f87311ff600d005;p=helm.git diff --git a/helm/software/lambda-delta/src/complete_rg/crg.ml b/helm/software/lambda-delta/src/complete_rg/crg.ml index 07305e9c1..5a394f4f8 100644 --- a/helm/software/lambda-delta/src/complete_rg/crg.ml +++ b/helm/software/lambda-delta/src/complete_rg/crg.ml @@ -12,6 +12,7 @@ (* kernel version: complete, relative, global *) (* note : fragment of complete lambda-delta serving as abstract layer *) +module C = Cps module E = Entity module N = Level @@ -39,6 +40,18 @@ type entity = term E.entity (* helpers ******************************************************************) +let rec tshift t = function + | ESort -> t + | EBind (e, a, b) -> tshift (TBind (a, b, t)) e + | EProj (e, a, d) -> tshift (TProj (a, d, t)) e + +let tshift c t = tshift t c + +let rec eshift f c = function + | ESort -> f c + | EBind (e, a, b) -> let f ee = f (EBind (ee, a, b)) in eshift f c e + | EProj (e, a, d) -> let f ee = f (EProj (ee, a, d)) in eshift f c e + let empty_lenv = ESort let push_bind f lenv a b = f (EBind (lenv, a, b)) @@ -71,7 +84,7 @@ let resolve_lref err f id lenv = let err kk = aux f (succ i) (k + kk) tl in let f j = f i j (k + j) in E.resolve err f id a - | EProj _ -> assert false (* TODO *) + | EProj (tl, _, d) -> aux f i k (eshift C.start tl d) in aux f 0 0 lenv @@ -99,7 +112,7 @@ let get_index err f i j lenv = if E.count_names a > j then f (k + j) else err i | EBind (tl, a, _) -> aux f (pred i) (k + E.count_names a) tl - | EProj _ -> assert false (* TODO *) + | EProj (tl, _, d) -> aux f i k (eshift C.start tl d) in aux f i 0 lenv @@ -115,6 +128,6 @@ let rec get i = function | EBind (e, _, Void 0) -> get i e | EBind (e, a, b) when i = 0 -> e, a, b | EBind (e, _, _) -> get (pred i) e - | EProj _ -> assert false (* TODO *) + | EProj (e, _, d) -> get i (eshift C.start e d) let get e i = get i e