(* constructors using Prods *)
let len = List.length itl in
let tys =
- List.map (fun (n,_,ty,_) -> Some (Cic.Name n,(Cic.Decl ty))) itl in
+ List.rev_map (fun (n,_,ty,_) -> Some (Cic.Name n,(Cic.Decl ty))) itl in
let _,ugraph2 =
List.fold_right
- (fun (_,_,_,cl) (i,ugraph) ->
+ (fun (_,_,ty,cl) (i,ugraph) ->
+ let _,ty_sort = split_prods ~subst:[] [] ~-1 ty in
let ugraph'' =
List.fold_left
(fun ugraph (name,te) ->
- let debrujinedte = debrujin_constructor uri len [] te in
- let augmented_term =
- List.fold_right
- (fun (name,_,ty,_) i -> Cic.Prod (Cic.Name name, ty, i))
- itl debrujinedte
- in
- let _,ugraph' = type_of ~logger augmented_term ugraph in
+ let te = debrujin_constructor uri len [] te in
+ let context,te = split_prods ~subst:[] tys indparamsno te in
+ let con_sort,ugraph = type_of_aux' ~logger [] context te ugraph in
+ let ugraph =
+ match
+ CicReduction.whd context con_sort, CicReduction.whd [] ty_sort
+ with
+ Cic.Sort (Cic.Type u1), Cic.Sort (Cic.Type u2)
+ | Cic.Sort (Cic.CProp u1), Cic.Sort (Cic.CProp u2)
+ | Cic.Sort (Cic.Type u1), Cic.Sort (Cic.CProp u2) ->
+ CicUniv.add_ge u2 u1 ugraph
+ | Cic.Sort (Cic.CProp u1), Cic.Sort (Cic.Type u2) ->
+ CicUniv.add_gt u2 u1 ugraph
+ | Cic.Sort _, Cic.Sort Cic.Prop
+ | Cic.Sort _, Cic.Sort Cic.CProp _
+ | Cic.Sort _, Cic.Sort Cic.Set
+ | Cic.Sort _, Cic.Sort Cic.Type _ -> ugraph
+ | a,b ->
+ raise
+ (TypeCheckerFailure
+ (lazy ("Wrong constructor or inductive arity shape: "^
+ CicPp.ppterm a ^ " --- " ^ CicPp.ppterm b))) in
(* let's check also the positivity conditions *)
if
not
- (are_all_occurrences_positive tys uri indparamsno i 0 len
- debrujinedte)
+ (are_all_occurrences_positive context uri indparamsno
+ (i+indparamsno) indparamsno (len+indparamsno) te)
then
begin
prerr_endline (UriManager.string_of_uri uri);
(TypeCheckerFailure
(lazy ("Non positive occurence in " ^ U.string_of_uri uri))) end
else
- ugraph'
+ ugraph
) ugraph cl in
(i + 1),ugraph''
) itl (1,ugrap1)
let module R = CicReduction in
match (n, R.whd ~subst context te) with
(0, _) -> context,te
- | (n, C.Prod (name,so,ta)) when n > 0 ->
+ | (n, C.Sort _) when n <= 0 -> context,te
+ | (n, C.Prod (name,so,ta)) ->
split_prods ~subst ((Some (name,(C.Decl so)))::context) (n - 1) ta
| (_, _) -> raise (AssertFailure (lazy "8"))
((Some (name,C.Decl so))::context) ta true
| (C.Sort C.Prop, C.Sort C.Prop) when need_dummy -> true,ugraph
| (C.Sort C.Prop, C.Sort C.Set)
- | (C.Sort C.Prop, C.Sort C.CProp)
+ | (C.Sort C.Prop, C.Sort (C.CProp _))
| (C.Sort C.Prop, C.Sort (C.Type _) ) when need_dummy ->
(let o,_ = CicEnvironment.get_obj CicUniv.empty_ugraph uri in
match o with
UriManager.string_of_uri uri)))
)
| (C.Sort C.Set, C.Sort C.Prop) when need_dummy -> true , ugraph
- | (C.Sort C.CProp, C.Sort C.Prop) when need_dummy -> true , ugraph
| (C.Sort C.Set, C.Sort C.Set) when need_dummy -> true , ugraph
- | (C.Sort C.Set, C.Sort C.CProp) when need_dummy -> true , ugraph
- | (C.Sort C.CProp, C.Sort C.Set) when need_dummy -> true , ugraph
- | (C.Sort C.CProp, C.Sort C.CProp) when need_dummy -> true , ugraph
- | ((C.Sort C.Set, C.Sort (C.Type _)) | (C.Sort C.CProp, C.Sort (C.Type _)))
+ | (C.Sort C.Set, C.Sort (C.Type _))
+ | (C.Sort C.Set, C.Sort (C.CProp _))
when need_dummy ->
(let o,_ = CicEnvironment.get_obj CicUniv.empty_ugraph uri in
match o with
UriManager.string_of_uri uri)))
)
| (C.Sort (C.Type _), C.Sort _) when need_dummy -> true , ugraph
+ | (C.Sort (C.CProp _), C.Sort _) when need_dummy -> true , ugraph
| (_,_) -> false,ugraph
in
check_allowed_sort_elimination_aux ugraph context arity2 need_dummy
let t1' = CicReduction.whd ~subst context t1 in
let t2' = CicReduction.whd ~subst ((Some (name,C.Decl s))::context) t2 in
match (t1', t2') with
- (C.Sort s1, C.Sort s2)
- when (s2 = C.Prop or s2 = C.Set or s2 = C.CProp) ->
+ | (C.Sort s1, C.Sort (C.Prop | C.Set)) ->
(* different from Coq manual!!! *)
- C.Sort s2,ugraph
+ t2',ugraph
| (C.Sort (C.Type t1), C.Sort (C.Type t2)) ->
- (* TASSI: CONSRTAINTS: the same in doubletypeinference, cicrefine *)
let t' = CicUniv.fresh() in
(try
let ugraph1 = CicUniv.add_ge t' t1 ugraph in
C.Sort (C.Type t'),ugraph2
with
CicUniv.UniverseInconsistency msg -> raise (TypeCheckerFailure msg))
- | (C.Sort _,C.Sort (C.Type t1)) ->
- (* TASSI: CONSRTAINTS: the same in doubletypeinference, cicrefine *)
- C.Sort (C.Type t1),ugraph (* c'e' bisogno di un fresh? *)
+ | (C.Sort (C.CProp t1), C.Sort (C.CProp t2)) ->
+ let t' = CicUniv.fresh() in
+ (try
+ let ugraph1 = CicUniv.add_ge t' t1 ugraph in
+ let ugraph2 = CicUniv.add_ge t' t2 ugraph1 in
+ C.Sort (C.CProp t'),ugraph2
+ with
+ CicUniv.UniverseInconsistency msg -> raise (TypeCheckerFailure msg))
+ | (C.Sort (C.Type t1), C.Sort (C.CProp t2)) ->
+ let t' = CicUniv.fresh() in
+ (try
+ let ugraph1 = CicUniv.add_ge t' t1 ugraph in
+ let ugraph2 = CicUniv.add_ge t' t2 ugraph1 in
+ C.Sort (C.CProp t'),ugraph2
+ with
+ CicUniv.UniverseInconsistency msg -> raise (TypeCheckerFailure msg))
+ | (C.Sort (C.CProp t1), C.Sort (C.Type t2)) ->
+ let t' = CicUniv.fresh() in
+ (try
+ let ugraph1 = CicUniv.add_gt t' t1 ugraph in
+ let ugraph2 = CicUniv.add_ge t' t2 ugraph1 in
+ C.Sort (C.Type t'),ugraph2
+ with
+ CicUniv.UniverseInconsistency msg -> raise (TypeCheckerFailure msg))
+ | (C.Sort _,C.Sort (C.Type t1)) -> C.Sort (C.Type t1),ugraph
+ | (C.Sort _,C.Sort (C.CProp t1)) -> C.Sort (C.CProp t1),ugraph
| (C.Meta _, C.Sort _) -> t2',ugraph
| (C.Meta _, (C.Meta (_,_) as t))
| (C.Sort _, (C.Meta (_,_) as t)) when CicUtil.is_closed t ->