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
let dummy = C.Sort C.Prop in
(*CSC: to be moved in cicSubstitution? *)
let rec subst_inductive_type_with_dummy _ = function
+ | C.Meta (_,(_,C.Irl _)) as x -> x
+ | C.Meta (i,(lift,C.Ctx ls)) ->
+ C.Meta (i,(lift,C.Ctx
+ (List.map (subst_inductive_type_with_dummy ()) ls)))
| 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 ->
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 _) ->
- raise (AssertFailure (lazy ("Cannot type an inferred type: "^
- NCicPp.ppterm ~subst ~metasenv ~context t)))
- | C.Sort _ -> C.Sort (C.Type NCicEnvironment.type0)
+ | C.Sort s ->
+ (try C.Sort (NCicEnvironment.typeof_sort s)
+ with
+ | NCicEnvironment.UntypableSort msg -> raise (TypeCheckerFailure msg)
+ | NCicEnvironment.AssertFailure msg -> raise (AssertFailure msg))
| C.Implicit _ -> raise (AssertFailure (lazy "Implicit found"))
| C.Meta (n,l) as t ->
let canonical_ctx,ty =
(PP.ppterm ~subst ~metasenv ~context so)
)));
(match arity1, R.whd ~subst ((name,C.Decl so)::context) ta with
- | (C.Sort C.Type _, C.Sort _)
- | (C.Sort C.Prop, C.Sort C.Prop) -> ()
- | (C.Sort C.Prop, C.Sort C.Type _) ->
+ | C.Sort s1, C.Sort s2 ->
+ (match NCicEnvironment.allowed_sort_elimination s1 s2 with
+ | `Yes -> ()
+ | `UnitOnly ->
(* TODO: we should pass all these parameters since we
* have them already *)
let _,leftno,itl,_,i = E.get_checked_indtys r in
is_non_informative ~metasenv ~subst leftno constrty))
then
raise (TypeCheckerFailure (lazy
- ("Sort elimination not allowed")));
- | _,_ -> ())
+ ("Sort elimination not allowed"))))
+ | _ -> ())
| _,_ -> ()
in
aux
match R.whd ~subst context c with
| C.Prod (n,so,de) ->
let s = typeof ~metasenv ~subst context so in
- s = C.Sort C.Prop && aux ((n,(C.Decl so))::context) de
+ (s = C.Sort C.Prop ||
+ match s with C.Sort (C.Type ((`CProp,_)::_)) -> true | _ -> false) &&
+ aux ((n,(C.Decl so))::context) de
| _ -> true in
let context',dx = NCicReduction.split_prods ~subst [] paramsno c in
aux context' dx
is_really_smaller r_uri r_len ~subst ~metasenv (shift_k (name,C.Decl s) k) t
| C.Appl (he::_) ->
is_really_smaller r_uri r_len ~subst ~metasenv k he
- | C.Rel _
- | C.Const (Ref.Ref (_,Ref.Con _)) -> false
- | C.Appl []
- | C.Const (Ref.Ref (_,Ref.Fix _)) -> assert false
+ | C.Appl [] | C.Implicit _ -> assert false
| C.Meta _ -> true
| C.Match (Ref.Ref (_,Ref.Ind (isinductive,_,_)),_,term,pl) ->
(match term with
is_really_smaller r_uri r_len ~subst ~metasenv k e)
pl dcl
| _ -> List.for_all (is_really_smaller r_uri r_len ~subst ~metasenv k) pl)
- | _ -> assert false
+ | _ -> false
and returns_a_coinductive ~subst context ty =
match R.whd ~subst context ty with