X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Flambda-delta%2Fcomplete_rg%2Fcrg.ml;h=0b0853386ebb41c604d919d5f4feb76f3a4328f3;hb=adb0fc58f7de5c1741cf18bed8a2251e8313f103;hp=fa76c6164ab02c1605eae0282d210d8dab9a5f71;hpb=3f6af93003bef461be59c8d4c96009c631f0c2e7;p=helm.git diff --git a/helm/software/lambda-delta/complete_rg/crg.ml b/helm/software/lambda-delta/complete_rg/crg.ml index fa76c6164..0b0853386 100644 --- a/helm/software/lambda-delta/complete_rg/crg.ml +++ b/helm/software/lambda-delta/complete_rg/crg.ml @@ -46,7 +46,7 @@ let push_bind f lenv a b = f (EBind (lenv, a, b)) let push_proj f lenv a e = f (EProj (lenv, a, e)) -let push2 err f lenv attr ?t = match lenv, t with +let push2 err f lenv attr ?t () = match lenv, t with | EBind (e, a, Abst ws), Some t -> f (EBind (e, (attr :: a), Abst (t :: ws))) | EBind (e, a, Abbr vs), Some t -> f (EBind (e, (attr :: a), Abbr (t :: vs))) | EBind (e, a, Void n), None -> f (EBind (e, (attr :: a), Void (succ n))) @@ -55,20 +55,23 @@ let push2 err f lenv attr ?t = match lenv, t with (* this id not tail recursive *) let resolve_lref err f id lenv = let rec aux f i k = function - | ESort -> err () - | EBind (tl, a, _) -> + | ESort -> err () + | EBind (tl, _, Abst []) + | EBind (tl, _, Abbr []) + | EBind (tl, _, Void 0) -> aux f i k tl + | EBind (tl, a, _) -> let err kk = aux f (succ i) (k + kk) tl in let f j = f i j (k + j) in Entity.resolve err f id a - | EProj _ -> assert false (* TODO *) + | EProj _ -> assert false (* TODO *) in aux f 0 0 lenv let rec get_name err f i j = function | ESort -> err i - | EBind (tl, a, Abst []) -> get_name err f i j tl - | EBind (tl, a, Abbr []) -> get_name err f i j tl - | EBind (tl, a, Void 0) -> get_name err f i j tl + | EBind (tl, _, Abst []) + | EBind (tl, _, Abbr []) + | EBind (tl, _, Void 0) -> get_name err f i j tl | EBind (_, a, _) when i = 0 -> let err () = err i in Entity.get_name err f j a @@ -77,3 +80,17 @@ let rec get_name err f i j = function | EProj (tl, _, e) -> let err i = get_name err f i j tl in get_name err f i j e + +let get_index err f i j lenv = + let rec aux f i k = function + | ESort -> err i + | EBind (tl, _, Abst []) + | EBind (tl, _, Abbr []) + | EBind (tl, _, Void 0) -> aux f i k tl + | EBind (_, a, _) when i = 0 -> + if Entity.count_names a > j then f (k + j) else err i + | EBind (tl, a, _) -> + aux f (pred i) (k + Entity.count_names a) tl + | EProj _ -> assert false (* TODO *) + in + aux f i 0 lenv