- and check_allowed_sort_elimination ~subst ~metasenv r =
- let mkapp he arg =
- match he with
- | C.Appl l -> C.Appl (l @ [arg])
- | t -> C.Appl [t;arg] in
- let rec aux context ind arity1 arity2 =
- let arity1 = R.whd ~subst context arity1 in
- let arity2 = R.whd ~subst context arity2 in
- match arity1,arity2 with
- | C.Prod (name,so1,de1), C.Prod (_,so2,de2) ->
- if not (R.are_convertible ~subst context so1 so2) then
- raise (TypeCheckerFailure (lazy (Printf.sprintf
- "In outtype: expected %s, found %s"
- (PP.ppterm ~subst ~metasenv ~context so1)
- (PP.ppterm ~subst ~metasenv ~context so2)
- )));
- aux ((name, C.Decl so1)::context)
- (mkapp (S.lift 1 ind) (C.Rel 1)) de1 de2
- | C.Sort _, C.Prod (name,so,ta) ->
- if not (R.are_convertible ~subst context so ind) then
- raise (TypeCheckerFailure (lazy (Printf.sprintf
- "In outtype: expected %s, found %s"
- (PP.ppterm ~subst ~metasenv ~context ind)
- (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 _) ->
- (* TODO: we should pass all these parameters since we
- * have them already *)
- let _,leftno,itl,_,i = E.get_checked_indtys r in
- let itl_len = List.length itl in
- let _,itname,ittype,cl = List.nth itl i in
- let cl_len = List.length cl in
- (* is it a singleton, non recursive and non informative
- definition or an empty one? *)
- if not
- (cl_len = 0 ||
- (itl_len = 1 && cl_len = 1 &&
- let _,_,constrty = List.hd cl in
- is_non_recursive_singleton r itname ittype constrty &&
- is_non_informative leftno constrty))
- then
- raise (TypeCheckerFailure (lazy
- ("Sort elimination not allowed")));
- | _,_ -> ())
- | _,_ -> ()
- in
- aux
-