| _::tl, [] -> (false,C.Rel ~-1)::combine tl [] (* dummy term *)
| [],_::_ -> assert false
in
- let lefts, _ = HExtlib.split_nth "NTC 1" (min j (List.length args)) args in
+ let lefts, _ = HExtlib.split_nth (min j (List.length args)) args in
List.map (fun ((b,x),i) -> b && x = C.Rel (k-i))
(HExtlib.list_mapi (fun x i -> x,i) (combine acc lefts))
| t -> U.fold (fun _ k -> k+1) k aux acc t
(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)
| C.Appl (C.Const (Ref.Ref (_,Ref.Ind _) as ref) :: _ ) as ty ->
let args = match ty with C.Appl (_::tl) -> tl | _ -> [] in
let _, leftno, itl, _, i = E.get_checked_indtys ref in
- let left_args,_ = HExtlib.split_nth "NTC 2" leftno args in
+ let left_args,_ = HExtlib.split_nth leftno args in
let _,_,_,cl = List.nth itl i in
List.map
(fun (rel,name,ty) -> rel, name, instantiate_parameters left_args ty) cl
| _ -> 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
;;
perform substitution only if DoesOccur is raised *)
let _,_,term,_ = U.lookup_subst mno subst in
aux (k-s) () (S.subst_meta (0,l) term)
- with U.Subst_not_found _ -> match l with
+ with U.Subst_not_found _ -> () (*match l with
| C.Irl len -> if not (n+k >= s+len || s > nn+k) then raise DoesOccur
- | C.Ctx lc -> List.iter (aux (k-s) ()) lc)
+ | C.Ctx lc -> List.iter (aux (k-s) ()) lc*))
| t -> U.fold (fun _ k -> k + 1) k aux () t
in
try aux 0 () t; true
| C.Const (Ref.Ref (uri',Ref.Ind (true,0,_))) when NUri.eq uri' uri -> dummy
| C.Appl ((C.Const (Ref.Ref (uri',Ref.Ind (true,0,lno))))::tl)
when NUri.eq uri' uri ->
- let _, rargs = HExtlib.split_nth "NTC 3" lno tl in
+ let _, rargs = HExtlib.split_nth lno tl in
if rargs = [] then dummy else C.Appl (dummy :: rargs)
| t -> U.map (fun _ x->x) () subst_inductive_type_with_dummy t
in
let rec aux context n nn te =
match R.whd ~subst context te with
| t when t = dummy -> true
+ | C.Meta (i,lc) ->
+ (try
+ let _,_,term,_ = U.lookup_subst i subst in
+ let t = S.subst_meta lc term in
+ weakly_positive ~subst context n nn uri indparamsno posuri t
+ with U.Subst_not_found _ -> true)
| C.Appl (te::rargs) when te = dummy ->
List.for_all (does_not_occur ~subst context n nn) rargs
| C.Prod (name,source,dest) when
and strictly_positive ~subst context n nn indparamsno posuri te =
match R.whd ~subst context te with
| t when does_not_occur ~subst context n nn t -> true
+ | C.Meta (i,lc) ->
+ (try
+ let _,_,term,_ = U.lookup_subst i subst in
+ let t = S.subst_meta lc term in
+ strictly_positive ~subst context n nn indparamsno posuri t
+ with U.Subst_not_found _ -> true)
| C.Rel _ when indparamsno = 0 -> true
| C.Appl ((C.Rel m)::tl) as reduct when m > n && m <= nn ->
check_homogeneous_call ~subst context indparamsno n posuri reduct tl;
let _,paramsno,tyl,_,i = E.get_checked_indtys r in
let _,name,ity,cl = List.nth tyl i in
let ok = List.length tyl = 1 in
- let params, arguments = HExtlib.split_nth "NTC 4" paramsno tl in
+ let params, arguments = HExtlib.split_nth paramsno tl in
let lifted_params = List.map (S.lift 1) params in
let cl =
List.map (fun (_,_,te) -> instantiate_parameters lifted_params te) cl
match R.whd ~subst context tycons with
| C.Const (Ref.Ref (_,Ref.Ind _)) -> C.Appl [S.lift liftno outty ; cons]
| C.Appl (C.Const (Ref.Ref (_,Ref.Ind _))::tl) ->
- let _,arguments = HExtlib.split_nth "NTC 5" leftno tl in
+ let _,arguments = HExtlib.split_nth leftno tl in
C.Appl (S.lift liftno outty::arguments@[cons])
| C.Prod (name,so,de) ->
let cons =
with Failure _ ->
raise (TypeCheckerFailure (lazy ("unbound variable " ^ string_of_int n
^" under: " ^ NCicPp.ppcontext ~metasenv ~subst context))))
- | C.Sort (C.Type [false,u]) -> C.Sort (C.Type [true, u])
+ | C.Sort (C.Type ([false,u] as univ)) ->
+ if NCicEnvironment.is_declared univ then
+ C.Sort (C.Type [true, u])
+ else
+ raise (TypeCheckerFailure (lazy ("undeclared universe " ^
+ NUri.string_of_uri u)))
| C.Sort (C.Type _) ->
raise (AssertFailure (lazy ("Cannot type an inferred type: "^
NCicPp.ppterm ~subst ~metasenv ~context t)))
(PP.ppterm ~subst ~metasenv ~context ty)
(PP.ppterm ~subst ~metasenv ~context (C.Const r')))))
else
- try HExtlib.split_nth "NTC 6" leftno tl
+ try HExtlib.split_nth leftno tl
with
Failure _ ->
raise (TypeCheckerFailure (lazy (Printf.sprintf
=
match l with
| shift, C.Irl n ->
- let context = snd (HExtlib.split_nth "NTC 7" shift context) in
+ let context = snd (HExtlib.split_nth shift context) in
let rec compare = function
| 0,_,[] -> ()
| 0,_,_::_
compare (n,context,canonical_context)
| shift, lc_kind ->
(* we avoid useless lifting by shortening the context*)
- let l,context = (0,lc_kind), snd (HExtlib.split_nth "NTC 8" shift context) in
+ let l,context = (0,lc_kind), snd (HExtlib.split_nth shift context) in
let lifted_canonical_context =
let rec lift_metas i = function
| [] -> []
let eaten = List.length args_with_ty - res in
(C.Appl
(he::List.map fst
- (fst (HExtlib.split_nth "NTC 9" eaten args_with_ty)))))))))
+ (fst (HExtlib.split_nth eaten args_with_ty)))))))))
in
aux ty_he args_with_ty
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
(List.fold_right
(fun (it_relev,_,ty,cl) i ->
let context,ty_sort = NCicReduction.split_prods ~subst [] ~-1 ty in
- let sx_context_ty_rev,_ = HExtlib.split_nth "NTC 10" leftno (List.rev context) in
+ let sx_context_ty_rev,_ = HExtlib.split_nth leftno (List.rev context) in
List.iter
(fun (k_relev,_,te) ->
let k_relev =
- try snd (HExtlib.split_nth "NTC 11" leftno 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 "NTC 12" (List.length tys) (List.rev context) in
+ HExtlib.split_nth (List.length tys) (List.rev context) in
let sx_context_te_rev,_ =
- HExtlib.split_nth "NTC 13" leftno chopped_context_rev in
+ HExtlib.split_nth leftno chopped_context_rev in
(try
ignore (List.fold_left2
(fun context item1 item2 ->
let convertible =
match item1,item2 with
- (n1,C.Decl ty1),(n2,C.Decl ty2) ->
- n1 = n2 &&
+ (_,C.Decl ty1),(_,C.Decl ty2) ->
R.are_convertible ~metasenv ~subst context ty1 ty2
- | (n1,C.Def (bo1,ty1)),(n2,C.Def (bo2,ty2)) ->
- n1 = n2
- && R.are_convertible ~metasenv ~subst context ty1 ty2
- && R.are_convertible ~metasenv ~subst context bo1 bo2
+ | (_,C.Def (bo1,ty1)),(_,C.Def (bo2,ty2)) ->
+ R.are_convertible ~metasenv ~subst context ty1 ty2 &&
+ R.are_convertible ~metasenv ~subst context bo1 bo2
| _,_ -> false
in
if not convertible then
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 ... *)
let bo, context' =
eat_lambdas ~subst ~metasenv context (recno + 1 - j) bo in
let new_context_part,_ =
- HExtlib.split_nth "NTC 14" (List.length context' - List.length context)
+ HExtlib.split_nth (List.length context' - List.length context)
context' in
let k = List.fold_right shift_k new_context_part new_k in
let context, recfuns, x = k in
("Too many args for constructor: " ^ String.concat " "
(List.map (fun x-> PP.ppterm ~subst ~metasenv ~context x) args))))
in
- let _, args = HExtlib.split_nth "NTC 15" paramsno tl in
+ let _, args = HExtlib.split_nth paramsno tl in
analyse_instantiated_type rec_params args
| C.Appl ((C.Match (_,out,te,pl))::_)
| C.Match (_,out,te,pl) as t ->
let _,_,recno1,arity,_ = List.nth fl i in
if h1 <> h2 || recno1 <> recno2 then error ();
arity
- | (_,_,_,_,C.Constant (_,_,_,ty,_)), Ref.Ref (_,Ref.Decl) -> ty
- | (_,h1,_,_,C.Constant (_,_,_,ty,_)), Ref.Ref (_,Ref.Def h2) ->
+ | (_,_,_,_,C.Constant (_,_,None,ty,_)), Ref.Ref (_,Ref.Decl) -> ty
+ | (_,h1,_,_,C.Constant (_,_,Some _,ty,_)), Ref.Ref (_,Ref.Def h2) ->
if h1 <> h2 then error ();
ty
| _ ->
let eaten = List.length args - res in
(C.Appl
(t::fst
- (HExtlib.split_nth "NTC 16" eaten args))))))))
+ (HExtlib.split_nth eaten args))))))))
in aux context ty args
;;
) [] subst)
;;
+let height_of_term tl =
+ let h = ref 0 in
+ let get_height (NReference.Ref (uri,_)) =
+ let _,height,_,_,_ = NCicEnvironment.get_checked_obj uri in
+ height in
+ let rec aux =
+ function
+ NCic.Meta (_,(_,NCic.Ctx l)) -> List.iter aux l
+ | NCic.Meta _ -> ()
+ | NCic.Rel _
+ | NCic.Sort _ -> ()
+ | NCic.Implicit _ -> assert false
+ | NCic.Const nref -> h := max !h (get_height nref)
+ | NCic.Prod (_,t1,t2)
+ | NCic.Lambda (_,t1,t2) -> aux t1; aux t2
+ | NCic.LetIn (_,s,ty,t) -> aux s; aux ty; aux t
+ | NCic.Appl l -> List.iter aux l
+ | NCic.Match (_,outty,t,pl) -> aux outty; aux t; List.iter aux pl
+ in
+ List.iter aux tl;
+ 1 + !h
+;;
+
+let height_of_obj_kind uri ~subst =
+ function
+ NCic.Inductive _
+ | NCic.Constant (_,_,None,_,_)
+ | NCic.Fixpoint (false,_,_) -> 0
+ | NCic.Fixpoint (true,ifl,_) ->
+ let iflno = List.length ifl in
+ height_of_term
+ (List.fold_left
+ (fun l (_,_,_,ty,bo) ->
+ 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 is not checked since it is only used to implement an optimization *)
+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 ~subst kind in
+ if height <> iheight then
+ raise (TypeCheckerFailure (lazy (Printf.sprintf
+ "the declared object height (%d) is not the inferred one (%d)"
+ height iheight)));
typecheck_metasenv metasenv;
typecheck_subst ~metasenv subst;
match kind with
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