exception Occur;;
+let purge_restricted restrictions more_restrictions l =
+ if more_restrictions = [] then l
+ else
+ begin
+ pp (lazy ("TO BE RESTRICTED: " ^
+ (String.concat "," (List.map string_of_int restrictions))));
+ pp (lazy ("MORE RESTRICTIONS: " ^
+ (String.concat "," (List.map string_of_int more_restrictions))));
+ let shift,lc = l in
+ let lc = NCicUtils.expand_local_context lc in
+ let rec aux n lc =
+ match lc with
+ [] -> []
+ | _ when List.mem n restrictions -> aux (n+1) lc
+ | _::tl when List.mem n more_restrictions -> aux (n+1) tl
+ | he::tl -> he::aux (n+1) tl
+ in
+ pack_lc (shift, NCic.Ctx (aux 1 lc))
+ end
+;;
+
let rec force_does_not_occur metasenv subst restrictions t =
let rec aux k ms = function
| NCic.Rel r when List.mem (r - k) restrictions -> raise Occur
if restrictions_for_n = [] then
ms, if l = l' then orig else NCic.Meta (n, l')
else
- let metasenv, subst, newmeta =
- restrict metasenv subst n restrictions_for_n
- in
+ let metasenv, subst, newmeta, more_restricted =
+ restrict metasenv subst n restrictions_for_n in
+ let l' = purge_restricted restrictions more_restricted l' in
(metasenv, subst), NCic.Meta (newmeta, l'))
| t -> NCicUntrusted.map_term_fold_a (fun _ k -> k+1) k aux ms t
in
with Occur ->
metasenv, subst, (pos :: restricted), tl'
-and restrict metasenv subst i restrictions =
+and restrict metasenv subst i (restrictions as orig) =
assert (restrictions <> []);
try
let name, ctx, bo, ty = NCicUtils.lookup_subst i subst in
subst_entry_j :: List.map
(fun (n,_) as orig -> if i = n then subst_entry_i else orig) subst
in
-(*
- prerr_endline ("restringo nella subst: " ^string_of_int i ^ " -> " ^
- string_of_int j ^ "\n" ^
- NCicPp.ppsubst ~metasenv [subst_entry_j] ^ "\n\n" ^
- NCicPp.ppsubst ~metasenv [subst_entry_i] ^ "\n" ^
- NCicPp.ppterm ~metasenv ~subst ~context:ctx bo ^ " ---- " ^
- NCicPp.ppterm ~metasenv ~subst ~context:newctx newbo
- );
-*)
- metasenv, new_subst, j
+ let diff = List.filter (fun x -> not (List.mem x orig)) restrictions in
+ metasenv, new_subst, j, diff
with Occur -> raise (MetaSubstFailure (lazy (Printf.sprintf
("Cannot restrict the context of the metavariable ?%d over "^^
"the hypotheses %s since ?%d is already instantiated "^^
let reloc_irl =
mk_perforated_irl 0 (List.length ctx) restrictions in
let subst_entry = i, (name, ctx, NCic.Meta (j, reloc_irl), ty) in
+ let diff = List.filter (fun x -> not (List.mem x orig)) restrictions in
List.map
(fun (n,_) as orig -> if i = n then metasenv_entry else orig)
metasenv,
- subst_entry :: subst, j
+ subst_entry :: subst, j, diff
with Occur -> raise (MetaSubstFailure (lazy (Printf.sprintf
("Cannot restrict the context of the metavariable ?%d "^^
"over the hypotheses %s since metavariable's type depends "^^
| NCic.Irl len, NCic.Irl len1
when shift1 + len1 < shift || shift1 > shift + len ->
let restrictions = HExtlib.list_seq 1 (len1 + 1) in
- let metasenv, subst, newmeta =
- restrict metasenv subst i restrictions
- in
- (metasenv, subst),
- NCic.Meta (newmeta, (0,NCic.Irl (max 0 (k-shift1))))
+ let metasenv, subst, newmeta, more_restricted =
+ restrict metasenv subst i restrictions in
+ let l' = (0,NCic.Irl (max 0 (k-shift1))) in
+ let l' = purge_restricted restrictions more_restricted l' in
+ (metasenv, subst),NCic.Meta (newmeta,l')
| NCic.Irl len, NCic.Irl len1 ->
let low_restrictions, new_shift =
if k <= shift1 && shift1 < shift then
if shift = k then ms, orig
else ms, NCic.Meta (i, (new_shift, lc1))
else
- let metasenv, subst, newmeta =
- restrict metasenv subst i restrictions
- in
-(* {{{
- prerr_endline ("RESTRICTIONS FOR: " ^
- NCicPp.ppterm ~metasenv ~subst ~context:[]
- (NCic.Meta (i,l1))^" that was part of a term unified with "
- ^ NCicPp.ppterm ~metasenv ~subst ~context:[] (NCic.Meta
- (n,l)) ^ " ====> " ^ String.concat "," (List.map
- string_of_int restrictions) ^ "\nMENV:\n" ^
- NCicPp.ppmetasenv ~subst metasenv ^ "\nSUBST:\n" ^
- NCicPp.ppsubst subst ~metasenv);
-}}} *)
+ let metasenv, subst, newmeta, more_restricted =
+ restrict metasenv subst i restrictions in
let newlc_len = len1 - List.length restrictions in
- let meta =
- NCic.Meta(newmeta,(new_shift, NCic.Irl newlc_len))
- in
- assert (
- let _, cctx, _ = NCicUtils.lookup_meta newmeta metasenv in
- List.length cctx = newlc_len);
- (metasenv, subst), meta
+ let l' = new_shift, NCic.Irl newlc_len in
+ let l' = purge_restricted restrictions more_restricted l' in
+ (metasenv, subst),NCic.Meta(newmeta,l')
| _ ->
let lc1 = NCicUtils.expand_local_context lc1 in
(metasenv, subst),
(if lc1' = lc1 then orig else NCic.Meta (i,l1))
else
- let metasenv, subst, newmeta =
- restrict metasenv subst i to_be_r in
- (metasenv, subst), NCic.Meta(newmeta,l1))
+ let metasenv, subst, newmeta, more_restricted =
+ restrict metasenv subst i to_be_r in
+ let l1 = purge_restricted to_be_r more_restricted l1 in
+ (metasenv, subst), NCic.Meta(newmeta,l1))
| t ->
NCicUntrusted.map_term_fold_a