X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Flambda-delta%2Fsrc%2Fcomplete_rg%2FcrgAut.ml;fp=helm%2Fsoftware%2Flambda-delta%2Fsrc%2Fcomplete_rg%2FcrgAut.ml;h=388b0c2b9eebbc0bfaeb87c3193b49d9230d8f7d;hb=22fd9c98a22929f0319286c0693fcdaee43a72df;hp=2221c3c06a88ff4b925f2d0ac9b43c8dd41d6c92;hpb=10d33a8c1be31d0c7aeccee8968fd5218ca2510a;p=helm.git diff --git a/helm/software/lambda-delta/src/complete_rg/crgAut.ml b/helm/software/lambda-delta/src/complete_rg/crgAut.ml index 2221c3c06..388b0c2b9 100644 --- a/helm/software/lambda-delta/src/complete_rg/crgAut.ml +++ b/helm/software/lambda-delta/src/complete_rg/crgAut.ml @@ -14,6 +14,7 @@ module K = U.UriHash module C = Cps module G = Options module E = Entity +module N = Level module A = Aut module D = Crg @@ -43,15 +44,12 @@ let hcnt = K.create hcnt_size (* optimized context *) (* Internal functions *******************************************************) -let empty_cnt = [], [] +let empty_cnt = [], [], [] -let add_abst (a, ws) id w = - E.Name (id, true) :: a, w :: ws +let add_abst (a, ws, ns) id w n = + E.Name (id, true) :: a, w :: ws, N.succ n :: ns -let lenv_of_cnt (a, ws) = - D.push_bind C.start D.empty_lenv a (D.Abst ws) - -let mk_lref f i j k = f (D.TLRef ([E.Apix k], i, j)) +let mk_lref f n i j k = f n (D.TLRef ([E.Apix k], i, j)) let id_of_name (id, _, _) = id @@ -84,7 +82,7 @@ let relax_opt_qid f st = function | Some qid -> let f qid = f (Some qid) in relax_qid f st qid let resolve_gref err f st qid = - try let cnt = K.find henv (uri_of_qid qid) in f qid cnt + try let n, cnt = K.find henv (uri_of_qid qid) in f n qid cnt with Not_found -> err qid let resolve_gref_relaxed f st qid = @@ -93,7 +91,7 @@ let resolve_gref_relaxed f st qid = resolve_gref err f st qid let get_cnt err f st = function - | None -> f empty_cnt + | None -> f empty_cnt | Some qid as node -> try let cnt = K.find hcnt (uri_of_qid qid) in f cnt with Not_found -> err node @@ -103,21 +101,38 @@ let get_cnt_relaxed f st = let rec err node = relax_opt_qid (get_cnt err f st) st node in get_cnt err f st st.node +(****************************************************************************) + +let push_abst f (lenv, ns) a n w = + let bw = D.Abst (N.infinite, [w]) in + let f lenv = f (lenv, N.succ n :: ns) in + D.push_bind f lenv a bw + +let resolve_lref err f id (lenv, ns) = + let f i j k = f (List.nth ns k) i j k in + D.resolve_lref err f id lenv + +let lenv_of_cnt (a, ws, ns) = + D.push_bind C.start D.empty_lenv a (D.Abst (N.infinite, ws)), ns + (* this is not tail recursive in the GRef branch *) let rec xlate_term f st lenv = function | A.Sort s -> - let f h = f (D.TSort ([], h)) in + let f h = f (N.finite 0) (D.TSort ([], h)) in if s then f 0 else f 1 | A.Appl (v, t) -> - let f vv tt = f (D.TAppl ([], [vv], tt)) in - let f vv = xlate_term (f vv) st lenv t in + let f vv n tt = f n (D.TAppl ([], [vv], tt)) in + let f _ vv = xlate_term (f vv) st lenv t in xlate_term f st lenv v | A.Abst (name, w, t) -> - let f ww = - let a, b = [E.Name (name, true)], (D.Abst [ww]) in - let f tt = f (D.TBind (a, b, tt)) in + let f nw ww = + let a = [E.Name (name, true)] in + let f nt tt = + let b = D.Abst (nt, [ww]) in + f nt (D.TBind (a, b, tt)) + in let f lenv = xlate_term f st lenv t in - D.push_bind f lenv a b + push_abst f lenv a nw ww in xlate_term f st lenv w | A.GRef (name, args) -> @@ -125,20 +140,22 @@ let rec xlate_term f st lenv = function | E.Name (id, _) -> f (A.GRef ((id, true, []), [])) | _ -> C.err () in - let map2 f = xlate_term f st lenv in - let g qid (a, _) = + let map2 f t = + let f _ tt = f tt in xlate_term f st lenv t + in + let g n qid (a, _, _) = let gref = D.TGRef ([], uri_of_qid qid) in match args, a with - | [], [] -> f gref - | _ -> - let f args = f (D.TAppl ([], args, gref)) in - let f args = f (List.rev_map (map2 C.start) args) in + | [], [] -> f n gref + | _ -> + let f args = f n (D.TAppl ([], args, gref)) in + let f args = C.list_rev_map f map2 args in let f a = C.list_rev_map_append f map1 a ~tail:args in C.list_sub_strict f a args in let g qid = resolve_gref_relaxed g st qid in let err () = complete_qid g st name in - D.resolve_lref err (mk_lref f) (id_of_name name) lenv + resolve_lref err (mk_lref f) (id_of_name name) lenv let xlate_entity err f st = function | A.Section (Some (_, name)) -> @@ -158,53 +175,62 @@ let xlate_entity err f st = function let f qid = let f cnt = let lenv = lenv_of_cnt cnt in - let ww = xlate_term C.start st lenv w in - K.add hcnt (uri_of_qid qid) (add_abst cnt name ww); - err {st with node = Some qid} + let f nw ww = + K.add hcnt (uri_of_qid qid) (add_abst cnt name ww nw); + err {st with node = Some qid} + in + xlate_term f st lenv w in get_cnt_relaxed f st in complete_qid f st (name, true, []) | A.Decl (name, w) -> let f cnt = - let a, ws = cnt in + let a, ws, _ = cnt in let lenv = lenv_of_cnt cnt in let f qid = - let ww = xlate_term C.start st lenv w in - K.add henv (uri_of_qid qid) cnt; - let t = match ws with - | [] -> ww - | _ -> D.TBind (a, D.Abst ws, ww) - in + let f nw ww = + K.add henv (uri_of_qid qid) (N.succ nw, cnt); + let t = match ws with + | [] -> ww + | _ -> D.TBind (a, D.Abst (N.infinite, ws), ww) + in (* print_newline (); CrgOutput.pp_term print_string t; *) - let b = E.Abst t in - let entity = [E.Mark st.line], uri_of_qid qid, b in - f {st with line = succ st.line} entity + let b = E.Abst (N.infinite, t) in + let entity = [E.Mark st.line], uri_of_qid qid, b in + f {st with line = succ st.line} entity + in + xlate_term f st lenv w in complete_qid f st (name, true, []) in get_cnt_relaxed f st | A.Def (name, w, trans, v) -> let f cnt = - let a, ws = cnt in + let a, ws, _ = cnt in let lenv = lenv_of_cnt cnt in let f qid = - let ww = xlate_term C.start st lenv w in - let vv = xlate_term C.start st lenv v in - K.add henv (uri_of_qid qid) cnt; - let t = match ws with - | [] -> D.TCast ([], ww, vv) - | _ -> D.TBind (a, D.Abst ws, D.TCast ([], ww, vv)) - in + let f nw ww = + let f nv vv = + assert (nv = N.succ nw); (**) + K.add henv (uri_of_qid qid) (nv, cnt); + let t = match ws with + | [] -> D.TCast ([], ww, vv) + | _ -> D.TBind (a, D.Abst (N.infinite, ws), D.TCast ([], ww, vv)) + in (* print_newline (); CrgOutput.pp_term print_string t; *) - let b = E.Abbr t in - let a = E.Mark st.line :: if trans then [] else [E.Priv] in - let entity = a, uri_of_qid qid, b in - f {st with line = succ st.line} entity + let b = E.Abbr t in + let a = E.Mark st.line :: if trans then [] else [E.Priv] in + let entity = a, uri_of_qid qid, b in + f {st with line = succ st.line} entity + in + xlate_term f st lenv v + in + xlate_term f st lenv w in complete_qid f st (name, true, []) in