(let rec f = function 0 -> [] | n -> true :: f (n-1) in f j) bos
;;
-let debruijn uri number_of_types context =
+let debruijn uri number_of_types ~subst context =
+(* manca la subst! *)
let rec aux k t =
match t with
- | C.Meta (i,(s,C.Ctx l)) ->
- let l1 = HExtlib.sharing_map (aux (k-s)) l in
- if l1 == l then t else C.Meta (i,(s,C.Ctx l1))
- | C.Meta _ -> t
+ | C.Meta (i,(s,l)) ->
+ (try
+ let _,_,term,_ = U.lookup_subst i subst in
+ let ts = S.subst_meta (0,l) term in
+ let ts' = aux (k-s) ts in
+ if ts == ts' then t else ts'
+ with U.Subst_not_found _ ->
+ match l with
+ C.Ctx l ->
+ let l1 = HExtlib.sharing_map (aux (k-s)) l in
+ if l1 == l then t else C.Meta (i,(s,C.Ctx l1))
+ | _ -> t)
| C.Const (Ref.Ref (uri1,(Ref.Fix (no,_,_) | Ref.CoFix no)))
| C.Const (Ref.Ref (uri1,Ref.Ind (_,no,_))) when NUri.eq uri uri1 ->
C.Rel (k + number_of_types - no)
| _ -> assert false
in
context_dcl,
- List.map (fun (_,id,ty) -> id, debruijn r_uri r_len context ty) cl,
+ List.map (fun (_,id,ty) -> id, debruijn r_uri r_len ~subst context ty) cl,
len, len + r_len
;;
and is_non_recursive_singleton ~subst (Ref.Ref (uri,_)) iname ity cty =
let ctx = [iname, C.Decl ity] in
- let cty = debruijn uri 1 [] cty in
+ let cty = debruijn uri 1 [] ~subst cty in
let len = List.length ctx in
let rec aux ctx n nn t =
match R.whd ~subst ctx t with
let k_relev =
try snd (HExtlib.split_nth leftno k_relev)
with Failure _ -> k_relev in
- let te = debruijn uri len [] te in
+ let te = debruijn uri len [] ~subst te in
let context,te = NCicReduction.split_prods ~subst tys leftno te in
let _,chopped_context_rev =
HExtlib.split_nth (List.length tys) (List.rev context) in
List.split (List.map (fun (_,name,_,ty,bo) -> (name, C.Decl ty), bo) fl)
in
let fl_len = List.length fl in
- let bos = List.map (debruijn uri fl_len context) bos in
+ let bos = List.map (debruijn uri fl_len context ~subst) bos in
let j = List.fold_left min max_int (List.map (fun (_,_,i,_,_)->i) fl) in
let ctx_len = List.length context in
(* we may look for fixed params not only up to j ... *)
1 + !h
;;
-let height_of_obj_kind uri =
+let height_of_obj_kind uri ~subst =
function
NCic.Inductive _
| NCic.Constant (_,_,None,_,_)
height_of_term
(List.fold_left
(fun l (_,_,_,ty,bo) ->
- let bo = debruijn uri iflno [] bo in
+ let bo = debruijn uri iflno [] ~subst bo in
ty::bo::l
) [] ifl)
| NCic.Constant (_,_,Some bo,ty,_) -> height_of_term [bo;ty]
let typecheck_obj (uri,height,metasenv,subst,kind) =
(*height must be checked since it is not only an optimization during reduction*)
- let iheight = height_of_obj_kind uri kind in
+ let iheight = height_of_obj_kind uri ~subst kind in
if height <> iheight then
raise (TypeCheckerFailure (lazy (Printf.sprintf
"the declared object height (%d) is not the inferred one (%d)"
let dfl, kl =
List.split (List.map2
(fun (_,_,_,_,bo) rno ->
- let dbo = debruijn uri len [] bo in
+ let dbo = debruijn uri len [] ~subst bo in
dbo, Evil rno)
fl kl)
in
match bo with
| Some bo ->
let metasenv, subst, bo, ty =
- typeof rdb ~localise metasenv subst [] bo (Some ty)
- in
+ typeof rdb ~localise metasenv subst [] bo (Some ty) in
let height = (* XXX recalculate *) height in
metasenv, subst, Some bo, ty, height
| None -> metasenv, subst, None, ty, 0
List.fold_left
(fun (types, metasenv, subst, fl) (relevance,name,k,ty,bo) ->
let metasenv, subst, ty, _ = check_type metasenv subst [] ty in
- let dbo = NCicTypeChecker.debruijn uri len [] bo in
+ let dbo = NCicTypeChecker.debruijn uri len [] ~subst bo in
let localise = relocalise localise dbo bo in
(name,C.Decl ty)::types,
metasenv, subst, (relevance,name,k,ty,dbo,localise)::fl
let k_relev =
try snd (HExtlib.split_nth leftno k_relev)
with Failure _ -> k_relev in
- let te = NCicTypeChecker.debruijn uri len [] te in
+ let te = NCicTypeChecker.debruijn uri len [] ~subst te in
let metasenv, subst, te, _ = check_type metasenv subst tys te in
let context,te = NCicReduction.split_prods ~subst tys leftno te in
let _,chopped_context_rev =