* http://cs.unibo.it/helm/.
*)
-type type_checker_exn =
- Impossible of int
- | NotWellTyped of string
- | WrongUriToConstant of string
- | WrongUriToVariable of string
- | WrongUriToMutualInductiveDefinitions of string
- | ListTooShort
- | NotPositiveOccurrences of string
- | NotWellFormedTypeOfInductiveConstructor of string
- | WrongRequiredArgument of string
- | RelToHiddenHypothesis
- | MetasenvInconsistency;;
+(* TODO factorize functions to frequent errors (e.g. "Unknwon mutual inductive
+ * ...") *)
-(* This is the only exception that will be raised *)
-exception TypeCheckerFailure of type_checker_exn;;
+open Printf
+
+exception AssertFailure of string;;
+exception TypeCheckerFailure of string;;
let fdebug = ref 0;;
let debug t context =
CicPp.ppobj (C.Variable ("DEBUG", None, t, [])) ^ "\n" ^ i
in
if !fdebug = 0 then
- raise
- (TypeCheckerFailure
- (NotWellTyped ("\n" ^ List.fold_right debug_aux (t::context) "")))
- (*print_endline ("\n" ^ List.fold_right debug_aux (t::context) "") ; flush stdout*)
+ raise (TypeCheckerFailure (List.fold_right debug_aux (t::context) ""))
;;
+let debug_print = prerr_endline ;;
+
let rec split l n =
match (l,n) with
(l,0) -> ([], l)
| (he::tl, n) -> let (l1,l2) = split tl (n-1) in (he::l1,l2)
- | (_,_) -> raise (TypeCheckerFailure ListTooShort)
+ | (_,_) ->
+ raise (TypeCheckerFailure "Parameters number < left parameters number")
;;
let debrujin_constructor uri number_of_types =
function
C.Rel n as t when n <= k -> t
| C.Rel _ ->
- raise (TypeCheckerFailure (NotWellTyped ("Debrujin: open term found")))
+ raise (TypeCheckerFailure "unbound variable found in constructor type")
| C.Var (uri,exp_named_subst) ->
let exp_named_subst' =
List.map (function (uri,t) -> (uri,aux k t)) exp_named_subst
C.Const (uri,exp_named_subst')
| C.MutInd (uri',tyno,exp_named_subst) when UriManager.eq uri uri' ->
if exp_named_subst != [] then
- raise
- (TypeCheckerFailure
- (NotWellTyped
- ("Debrujin: a non-empty explicit named substitution is applied to "^
- "a mutual inductive type which is being defined"))) ;
+ raise (TypeCheckerFailure
+ ("non-empty explicit named substitution is applied to "^
+ "a mutual inductive type which is being defined")) ;
C.Rel (k + number_of_types - tyno) ;
| C.MutInd (uri',tyno,exp_named_subst) ->
let exp_named_subst' =
(match uobj with
C.Constant (_,Some te,ty,_) ->
let _ = type_of ty in
- if not (R.are_convertible [] (type_of te) ty) then
- raise
- (TypeCheckerFailure
- (NotWellTyped ("Constant " ^ (U.string_of_uri uri))))
+ let type_of_te = type_of te in
+ if not (R.are_convertible [] type_of_te ty) then
+ raise (TypeCheckerFailure (sprintf
+ "the constant %s is not well typed because the type %s of the body is not convertible to the declared type %s"
+ (U.string_of_uri uri) (CicPp.ppterm type_of_te)
+ (CicPp.ppterm ty)))
| C.Constant (_,None,ty,_) ->
(* only to check that ty is well-typed *)
let _ = type_of ty in ()
) [] conjs
in
let _ = type_of_aux' conjs [] ty in
- if not (R.are_convertible [] (type_of_aux' conjs [] te) ty)
- then
- raise
- (TypeCheckerFailure
- (NotWellTyped ("CurrentProof" ^ (U.string_of_uri uri))))
+ let type_of_te = type_of_aux' conjs [] te in
+ if not (R.are_convertible [] type_of_te ty) then
+ raise (TypeCheckerFailure (sprintf
+ "the current proof %s is not well typed because the type %s of the body is not convertible to the declared type %s"
+ (U.string_of_uri uri) (CicPp.ppterm type_of_te)
+ (CicPp.ppterm ty)))
| _ ->
- raise (TypeCheckerFailure (WrongUriToConstant (U.string_of_uri uri)))
- ) ;
+ raise (TypeCheckerFailure
+ ("Unknown constant:" ^ U.string_of_uri uri))
+ );
CicEnvironment.set_type_checking_info uri ;
CicLogger.log (`Type_checking_completed uri) ;
match CicEnvironment.is_type_checked ~trust:false uri with
match cobj with
C.Constant (_,_,ty,_) -> ty
| C.CurrentProof (_,_,_,ty,_) -> ty
- | _ -> raise (TypeCheckerFailure (WrongUriToConstant (U.string_of_uri uri)))
+ | _ ->
+ raise (TypeCheckerFailure ("Unknown constant:" ^ U.string_of_uri uri))
and type_of_variable uri =
let module C = Cic in
None -> ()
| Some bo ->
if not (R.are_convertible [] (type_of bo) ty) then
- raise
- (TypeCheckerFailure
- (NotWellTyped ("Variable " ^ (U.string_of_uri uri))))
+ raise (TypeCheckerFailure
+ ("Unknown variable:" ^ U.string_of_uri uri))
) ;
CicEnvironment.set_type_checking_info uri ;
CicLogger.log (`Type_checking_completed uri) ;
ty
| _ ->
- raise
- (TypeCheckerFailure (WrongUriToVariable (UriManager.string_of_uri uri)))
+ raise (TypeCheckerFailure ("Unknown variable:" ^ U.string_of_uri uri))
and does_not_occur context n nn te =
let module C = Cic in
weakly_positive ((Some (name,(C.Decl source)))::context)
(n + 1) (nn + 1) uri dest
| _ ->
- raise
- (TypeCheckerFailure
- (NotWellFormedTypeOfInductiveConstructor
- ("Guess where the error is ;-)")))
+ raise (TypeCheckerFailure "Malformed inductive constructor type")
(* instantiate_parameters ps (x1:T1)...(xn:Tn)C *)
(* returns ((x_|ps|:T_|ps|)...(xn:Tn)C){ps_1 / x1 ; ... ; ps_|ps| / x_|ps|} *)
instantiate_parameters tl
(CicSubstitution.subst he ta)
| (C.Cast (te,_), _) -> instantiate_parameters params te
- | (t,l) -> raise (TypeCheckerFailure (Impossible 1))
+ | (t,l) -> raise (AssertFailure "1")
and strictly_positive context n nn te =
let module C = Cic in
let (name,_,ity,cl) = List.nth tl i in
(List.length tl = 1, paramsno, ity, cl, name)
| _ ->
- raise
- (TypeCheckerFailure
- (WrongUriToMutualInductiveDefinitions(U.string_of_uri uri)))
+ raise (TypeCheckerFailure
+ ("Unknown inductive type:" ^ U.string_of_uri uri))
in
let (params,arguments) = split tl paramsno in
let lifted_params = List.map (CicSubstitution.lift 1) params in
match CicReduction.whd context x with
C.Rel m when m = n - (indparamsno - k) -> k - 1
| _ ->
- raise
- (TypeCheckerFailure
- (WrongRequiredArgument (UriManager.string_of_uri uri)))
+ raise (TypeCheckerFailure
+ ("Non-positive occurence in mutual inductive definition(s) " ^
+ UriManager.string_of_uri uri))
) indparamsno tl
in
if last = 0 then
List.fold_right (fun x i -> i && does_not_occur context n nn x) tl true
else
- raise
- (TypeCheckerFailure
- (WrongRequiredArgument (UriManager.string_of_uri uri)))
+ raise (TypeCheckerFailure
+ ("Non-positive occurence in mutual inductive definition(s) " ^
+ UriManager.string_of_uri uri))
| C.Rel m when m = i ->
if indparamsno = 0 then
true
else
- raise
- (TypeCheckerFailure
- (WrongRequiredArgument (UriManager.string_of_uri uri)))
+ raise (TypeCheckerFailure
+ ("Non-positive occurence in mutual inductive definition(s) " ^
+ UriManager.string_of_uri uri))
| C.Prod (C.Anonymous,source,dest) ->
strictly_positive context n nn source &&
are_all_occurrences_positive
uri indparamsno (i+1) (n + 1) (nn + 1) dest
| _ ->
raise
- (TypeCheckerFailure
- (NotWellFormedTypeOfInductiveConstructor (UriManager.string_of_uri uri)))
+ (TypeCheckerFailure ("Malformed inductive constructor type " ^
+ (UriManager.string_of_uri uri)))
(* Main function to checks the correctness of a mutual *)
(* inductive block definition. This is the function *)
debrujinedte)
then
raise
- (TypeCheckerFailure
- (NotPositiveOccurrences (U.string_of_uri uri)))
+ (TypeCheckerFailure ("Non positive occurence in " ^
+ U.string_of_uri uri))
) cl ;
(i + 1)
) itl 1
Cic.InductiveDefinition (itl, params, indparamsno) ->
typecheck_mutual_inductive_defs uri (itl,params,indparamsno)
| _ ->
- raise
- (TypeCheckerFailure
- (WrongUriToMutualInductiveDefinitions (UriManager.string_of_uri uri)))
+ raise (TypeCheckerFailure ("Unknown mutual inductive definition:" ^
+ UriManager.string_of_uri uri))
and type_of_mutual_inductive_defs uri i =
let module C = Cic in
let (_,_,arity,_) = List.nth dl i in
arity
| _ ->
- raise
- (TypeCheckerFailure
- (WrongUriToMutualInductiveDefinitions (U.string_of_uri uri)))
+ raise (TypeCheckerFailure ("Unknown mutual inductive definition:" ^
+ U.string_of_uri uri))
and type_of_mutual_inductive_constr uri i j =
let module C = Cic in
let (_,ty) = List.nth cl (j-1) in
ty
| _ ->
- raise
- (TypeCheckerFailure
- (WrongUriToMutualInductiveDefinitions (U.string_of_uri uri)))
+ raise (TypeCheckerFailure ("Unknown mutual inductive definition:" ^
+ UriManager.string_of_uri uri))
and recursive_args context n nn te =
let module C = Cic in
| C.Sort _
| C.Implicit
| C.Cast _ (*CSC ??? *) ->
- raise (TypeCheckerFailure (Impossible 3)) (* due to type-checking *)
+ raise (AssertFailure "3") (* due to type-checking *)
| C.Prod (name,so,de) ->
(not (does_not_occur context n nn so)) ::
(recursive_args ((Some (name,(C.Decl so)))::context) (n+1) (nn + 1) de)
| C.Lambda _
| C.LetIn _ ->
- raise (TypeCheckerFailure (Impossible 4)) (* due to type-checking *)
+ raise (AssertFailure "4") (* due to type-checking *)
| C.Appl _ -> []
- | C.Const _ -> raise (TypeCheckerFailure (Impossible 5))
+ | C.Const _ -> raise (AssertFailure "5")
| C.MutInd _
| C.MutConstruct _
| C.MutCase _
| C.Fix _
- | C.CoFix _ ->
- raise (TypeCheckerFailure (Impossible 6)) (* due to type-checking *)
+ | C.CoFix _ -> raise (AssertFailure "6") (* due to type-checking *)
and get_new_safes context p c rl safes n nn x =
let module C = Cic in
(* CSC: as a branch of a case whose type is a Prod. In *)
(* CSC: particular, this means that a new (C.Prod, x,_) case *)
(* CSC: must be considered in this match. (e.g. x = MutCase) *)
- raise (TypeCheckerFailure (Impossible 7))
+ raise (AssertFailure "7")
and split_prods context n te =
let module C = Cic in
(0, _) -> context,te
| (n, C.Prod (name,so,ta)) when n > 0 ->
split_prods ((Some (name,(C.Decl so)))::context) (n - 1) ta
- | (_, _) -> raise (TypeCheckerFailure (Impossible 8))
+ | (_, _) -> raise (AssertFailure "8")
and eat_lambdas context n te =
let module C = Cic in
eat_lambdas ((Some (name,(C.Decl so)))::context) (n - 1) ta
in
(te, k + 1, context')
- | (_, _) -> raise (TypeCheckerFailure (Impossible 9))
+ | (_, _) -> raise (AssertFailure "9")
(*CSC: Tutto quello che segue e' l'intuzione di luca ;-) *)
and check_is_really_smaller_arg context n nn kl x safes te =
check_is_really_smaller_arg n nn kl x safes so &&
check_is_really_smaller_arg (n+1) (nn+1) kl (x+1)
(List.map (fun x -> x + 1) safes) ta*)
- | C.Prod _ -> raise (TypeCheckerFailure (Impossible 10))
+ | C.Prod _ -> raise (AssertFailure "10")
| C.Lambda (name,so,ta) ->
check_is_really_smaller_arg context n nn kl x safes so &&
check_is_really_smaller_arg ((Some (name,(C.Decl so)))::context)
(*CSC: sulla coda ci vogliono dei controlli? secondo noi no, ma *)
(*CSC: solo perche' non abbiamo trovato controesempi *)
check_is_really_smaller_arg context n nn kl x safes he
- | C.Appl [] -> raise (TypeCheckerFailure (Impossible 11))
+ | C.Appl [] -> raise (AssertFailure "11")
| C.Const _
- | C.MutInd _ -> raise (TypeCheckerFailure (Impossible 12))
+ | C.MutInd _ -> raise (AssertFailure "12")
| C.MutConstruct _ -> false
| C.MutCase (uri,i,outtype,term,pl) ->
(match term with
in
(tys,List.length tl,isinductive,paramsno,cl')
| _ ->
- raise
- (TypeCheckerFailure
- (WrongUriToMutualInductiveDefinitions(U.string_of_uri uri)))
+ raise (TypeCheckerFailure
+ ("Unknown mutual inductive definition:" ^
+ UriManager.string_of_uri uri))
in
if not isinductive then
List.fold_right
in
(tys,List.length tl,isinductive,paramsno,cl')
| _ ->
- raise
- (TypeCheckerFailure
- (WrongUriToMutualInductiveDefinitions(U.string_of_uri uri)))
+ raise (TypeCheckerFailure
+ ("Unknown mutual inductive definition:" ^
+ UriManager.string_of_uri uri))
in
if not isinductive then
List.fold_right
Some (_,C.Decl _) -> true
| Some (_,C.Def (bo,_)) ->
guarded_by_destructors context n nn kl x safes bo
- | None -> raise (TypeCheckerFailure RelToHiddenHypothesis)
+ | None -> raise (TypeCheckerFailure "Reference to deleted hypothesis")
)
| C.Meta _
| C.Sort _
in
(tys,List.length tl,isinductive,paramsno,cl')
| _ ->
- raise
- (TypeCheckerFailure
- (WrongUriToMutualInductiveDefinitions(U.string_of_uri uri)))
+ raise (TypeCheckerFailure
+ ("Unknown mutual inductive definition:" ^
+ UriManager.string_of_uri uri))
in
if not isinductive then
guarded_by_destructors context n nn kl x safes outtype &&
in
(tys,List.length tl,isinductive,paramsno,cl')
| _ ->
- raise
- (TypeCheckerFailure
- (WrongUriToMutualInductiveDefinitions(U.string_of_uri uri)))
+ raise (TypeCheckerFailure
+ ("Unknown mutual inductive definition:" ^
+ UriManager.string_of_uri uri))
in
if not isinductive then
guarded_by_destructors context n nn kl x safes outtype &&
| C.Prod _
| C.LetIn _ ->
(* the term has just been type-checked *)
- raise (TypeCheckerFailure (Impossible 17))
+ raise (AssertFailure "17")
| C.Lambda (name,so,de) ->
does_not_occur context n nn so &&
guarded_by_constructors ((Some (name,(C.Decl so)))::context)
let (_,cons) = List.nth cl (j - 1) in
CicSubstitution.subst_vars exp_named_subst cons
| _ ->
- raise
- (TypeCheckerFailure
- (WrongUriToMutualInductiveDefinitions
- (UriManager.string_of_uri uri)))
+ raise (TypeCheckerFailure ("Unknown mutual inductive definition:" ^
+ UriManager.string_of_uri uri))
in
let rec analyse_branch context ty te =
match CicReduction.whd context ty with
- C.Meta _ -> raise (TypeCheckerFailure (Impossible 34))
+ C.Meta _ -> raise (AssertFailure "34")
| C.Rel _
| C.Var _
| C.Sort _ ->
does_not_occur context n nn te
| C.Implicit
| C.Cast _ ->
- raise (TypeCheckerFailure (Impossible 24))(* due to type-checking *)
+ raise (AssertFailure "24")(* due to type-checking *)
| C.Prod (name,so,de) ->
analyse_branch ((Some (name,(C.Decl so)))::context) de te
| C.Lambda _
| C.LetIn _ ->
- raise (TypeCheckerFailure (Impossible 25))(* due to type-checking *)
+ raise (AssertFailure "25")(* due to type-checking *)
| C.Appl ((C.MutInd (uri,_,_))::_) as ty
when uri == coInductiveTypeURI ->
guarded_by_constructors context n nn true te [] coInductiveTypeURI
guarded_by_constructors context n nn true te tl coInductiveTypeURI
| C.Appl _ ->
does_not_occur context n nn te
- | C.Const _ -> raise (TypeCheckerFailure (Impossible 26))
+ | C.Const _ -> raise (AssertFailure "26")
| C.MutInd (uri,_,_) when uri == coInductiveTypeURI ->
guarded_by_constructors context n nn true te [] coInductiveTypeURI
| C.MutInd _ ->
does_not_occur context n nn te
- | C.MutConstruct _ -> raise (TypeCheckerFailure (Impossible 27))
+ | C.MutConstruct _ -> raise (AssertFailure "27")
(*CSC: we do not consider backbones with a MutCase, Fix, Cofix *)
(*CSC: in head position. *)
| C.MutCase _
| C.Fix _
| C.CoFix _ ->
- raise (TypeCheckerFailure (Impossible 28))(* due to type-checking *)
+ raise (AssertFailure "28")(* due to type-checking *)
in
let rec analyse_instantiated_type context ty l =
match CicReduction.whd context ty with
| C.Meta _
| C.Sort _
| C.Implicit
- | C.Cast _ ->
- raise (TypeCheckerFailure (Impossible 29))(* due to type-checking *)
+ | C.Cast _ -> raise (AssertFailure "29")(* due to type-checking *)
| C.Prod (name,so,de) ->
begin
match l with
end
| C.Lambda _
| C.LetIn _ ->
- raise (TypeCheckerFailure (Impossible 30))(* due to type-checking *)
+ raise (AssertFailure "30")(* due to type-checking *)
| C.Appl _ ->
List.fold_left
(fun i x -> i && does_not_occur context n nn x) true l
- | C.Const _ -> raise (TypeCheckerFailure (Impossible 31))
+ | C.Const _ -> raise (AssertFailure "31")
| C.MutInd _ ->
List.fold_left
(fun i x -> i && does_not_occur context n nn x) true l
- | C.MutConstruct _ -> raise (TypeCheckerFailure (Impossible 32))
+ | C.MutConstruct _ -> raise (AssertFailure "32")
(*CSC: we do not consider backbones with a MutCase, Fix, Cofix *)
(*CSC: in head position. *)
| C.MutCase _
| C.Fix _
| C.CoFix _ ->
- raise (TypeCheckerFailure (Impossible 33))(* due to type-checking *)
+ raise (AssertFailure "33")(* due to type-checking *)
in
let rec instantiate_type args consty =
function
| _ ->
(*CSC:We do not consider backbones with a MutCase, a *)
(*CSC:FixPoint, a CoFixPoint and so on in head position.*)
- raise (TypeCheckerFailure (Impossible 23))
+ raise (AssertFailure "23")
end
| [] -> analyse_instantiated_type context consty' l
(* These are all the other cases *)
(* is a singleton definition or the empty proposition? *)
List.length cl = 1 || List.length cl = 0
| _ ->
- raise
- (TypeCheckerFailure
- (WrongUriToMutualInductiveDefinitions (U.string_of_uri uri)))
+ raise (TypeCheckerFailure ("Unknown mutual inductive definition:" ^
+ UriManager.string_of_uri uri))
)
| (C.Sort C.Set, C.Sort C.Prop) when need_dummy -> true
| (C.Sort C.CProp, C.Sort C.Prop) when need_dummy -> true
List.fold_right
(fun (_,x) i -> i && is_small tys paramsno x) cl true
| _ ->
- raise
- (TypeCheckerFailure
- (WrongUriToMutualInductiveDefinitions (U.string_of_uri uri)))
+ raise (TypeCheckerFailure ("Unknown mutual inductive definition:" ^
+ UriManager.string_of_uri uri))
)
| (C.Sort C.Type, C.Sort _) when need_dummy -> true
| (C.Sort C.Prop, C.Prod (name,so,ta)) when not need_dummy ->
(* is a singleton definition? *)
List.length cl = 1
| _ ->
- raise
- (TypeCheckerFailure
- (WrongUriToMutualInductiveDefinitions(U.string_of_uri uri)))
+ raise (TypeCheckerFailure
+ ("Unknown mutual inductive definition:" ^
+ UriManager.string_of_uri uri))
)
| _ -> false
)
List.fold_right
(fun (_,x) i -> i && is_small tys paramsno x) cl true
| _ ->
- raise
- (TypeCheckerFailure
- (WrongUriToMutualInductiveDefinitions(U.string_of_uri uri)))
+ raise (TypeCheckerFailure
+ ("Unknown mutual inductive definition:" ^
+ UriManager.string_of_uri uri))
)
- | _ -> raise (TypeCheckerFailure (Impossible 19))
+ | _ -> raise (AssertFailure "19")
)
| (C.Sort C.Type, C.Prod (_,so,_)) when not need_dummy ->
CicReduction.are_convertible context so ind
C.Prod (C.Anonymous,so,type_of_branch
((Some (name,(C.Decl so)))::context) argsno need_dummy
(CicSubstitution.lift 1 outtype) term' de)
- | _ -> raise (TypeCheckerFailure (Impossible 20))
+ | _ -> raise (AssertFailure "20")
(* check_metasenv_consistency checks that the "canonical" context of a
metavariable is consitent - up to relocation via the relocation list l -
in
List.iter2
(fun t ct ->
- let res =
match (t,ct) with
- _,None -> true
+ | _,None -> ()
| Some t,Some (_,C.Def (ct,_)) ->
- R.are_convertible context t ct
+ if not (R.are_convertible context t ct) then
+ raise (TypeCheckerFailure (sprintf
+ "Not well typed metavariable local context: expected a term convertible with %s, found %s"
+ (CicPp.ppterm ct) (CicPp.ppterm t)))
| Some t,Some (_,C.Decl ct) ->
- R.are_convertible context (type_of_aux' metasenv context t) ct
- | _, _ -> false
- in
- if not res then raise (TypeCheckerFailure MetasenvInconsistency)
+ let type_t = type_of_aux' metasenv context t in
+ if not (R.are_convertible context type_t ct) then
+ raise (TypeCheckerFailure (sprintf
+ "Not well typed metavariable local context: expected a term of type %s, found %s of type %s"
+ (CicPp.ppterm ct) (CicPp.ppterm t) (CicPp.ppterm type_t)))
+ | None, _ ->
+ raise (TypeCheckerFailure
+ "Not well typed metavariable local context: an hypothesis, that is not hidden, is not instantiated")
) l lifted_canonical_context
(* type_of_aux' is just another name (with a different scope) for type_of_aux *)
Some (_,C.Decl t) -> S.lift n t
| Some (_,C.Def (_,Some ty)) -> S.lift n ty
| Some (_,C.Def (bo,None)) ->
- prerr_endline "##### CASO DA INVESTIGARE E CAPIRE" ;
+ debug_print "##### CASO DA INVESTIGARE E CAPIRE" ;
type_of_aux context (S.lift n bo)
- | None -> raise (TypeCheckerFailure RelToHiddenHypothesis)
+ | None -> raise (TypeCheckerFailure "Reference to deleted hypothesis")
with
- _ -> raise (TypeCheckerFailure (NotWellTyped "Not a close term"))
+ _ ->
+ raise (TypeCheckerFailure
+ "unbound variable found in constructor type")
)
| C.Var (uri,exp_named_subst) ->
incr fdebug ;
check_metasenv_consistency metasenv context canonical_context l;
CicSubstitution.lift_meta l ty
| C.Sort s -> C.Sort C.Type (*CSC manca la gestione degli universi!!! *)
- | C.Implicit -> raise (TypeCheckerFailure (Impossible 21))
- | C.Cast (te,ty) ->
+ | C.Implicit -> raise (AssertFailure "21")
+ | C.Cast (te,ty) as t ->
let _ = type_of_aux context ty in
- if R.are_convertible context (type_of_aux context te) ty then ty
- else raise (TypeCheckerFailure (NotWellTyped "Cast"))
+ if R.are_convertible context (type_of_aux context te) ty then
+ ty
+ else
+ raise (TypeCheckerFailure
+ (sprintf "Invalid cast %s" (CicPp.ppterm t)))
| C.Prod (name,s,t) ->
let sort1 = type_of_aux context s
and sort2 = type_of_aux ((Some (name,(C.Decl s)))::context) t in
let hetype = type_of_aux context he
and tlbody_and_type = List.map (fun x -> (x, type_of_aux context x)) tl in
eat_prods context hetype tlbody_and_type
- | C.Appl _ -> raise (TypeCheckerFailure (NotWellTyped "Appl: no arguments"))
+ | C.Appl _ -> raise (AssertFailure "Appl: no arguments")
| C.Const (uri,exp_named_subst) ->
incr fdebug ;
check_exp_named_subst context exp_named_subst ;
let outsort = type_of_aux context outtype in
let (need_dummy, k) =
let rec guess_args context t =
- match CicReduction.whd context t with
+ let outtype = CicReduction.whd context t in
+ match outtype with
C.Sort _ -> (true, 0)
| C.Prod (name, s, t) ->
let (b, n) = guess_args ((Some (name,(C.Decl s)))::context) t in
else
(b, n + 1)
| _ ->
- raise
- (TypeCheckerFailure (NotWellTyped "MutCase: outtype ill-formed"))
+ raise (TypeCheckerFailure (sprintf
+ "Malformed case analasys' output type %s" (CicPp.ppterm outtype)))
in
(*CSC whd non serve dopo type_of_aux ? *)
let (b, k) = guess_args context outsort in
(*CSC: Hint: nella DTD servono per gli stylesheet. *)
C.MutInd (uri',i',exp_named_subst) as typ ->
if U.eq uri uri' && i = i' then ([],[],exp_named_subst)
- else raise (TypeCheckerFailure
- (NotWellTyped ("MutCase: the term is of type " ^
- CicPp.ppterm typ ^
- " instead of type " ^ (U.string_of_uri uri) ^ "#1/" ^
- string_of_int i ^ "{_}")))
- | C.Appl ((C.MutInd (uri',i',exp_named_subst) as typ):: tl) ->
+ else raise (TypeCheckerFailure (sprintf
+ "Case analysys: analysed term type is %s, but is expected to be (an application of) %s#1/%d{_}"
+ (CicPp.ppterm typ) (U.string_of_uri uri) i))
+ | C.Appl ((C.MutInd (uri',i',exp_named_subst) as typ):: tl) as typ' ->
if U.eq uri uri' && i = i' then
let params,args =
split tl (List.length tl - k)
in params,args,exp_named_subst
- else raise (TypeCheckerFailure (NotWellTyped
- ("MutCase: the term is of type " ^
- CicPp.ppterm typ ^
- " instead of type " ^ (U.string_of_uri uri) ^ "#1/" ^
- string_of_int i ^ "{_}")))
- | _ -> raise (TypeCheckerFailure
- (NotWellTyped "MutCase: the term is not an inductive one"))
+ else raise (TypeCheckerFailure (sprintf
+ "Case analysys: analysed term type is %s, but is expected to be (an application of) %s#1/%d{_}"
+ (CicPp.ppterm typ') (U.string_of_uri uri) i))
+ | _ ->
+ raise (TypeCheckerFailure (sprintf
+ "Case analysis: analysed term %s is not an inductive one"
+ (CicPp.ppterm term)))
in
(* let's control if the sort elimination is allowed: [(I q1 ... qr)|B] *)
let sort_of_ind_type =
sort_of_ind_type (type_of_aux context sort_of_ind_type) outsort)
then
raise
- (TypeCheckerFailure
- (NotWellTyped "MutCase: not allowed sort elimination")) ;
-
+ (TypeCheckerFailure ("Case analasys: sort elimination not allowed"));
(* let's check if the type of branches are right *)
let parsno =
match CicEnvironment.get_cooked_obj ~trust:false uri with
C.InductiveDefinition (_,_,parsno) -> parsno
| _ ->
- raise
- (TypeCheckerFailure
- (WrongUriToMutualInductiveDefinitions (U.string_of_uri uri)))
+ raise (TypeCheckerFailure
+ ("Unknown mutual inductive definition:" ^
+ UriManager.string_of_uri uri))
in
let (_,branches_ok) =
List.fold_left
R.are_convertible context (type_of_aux context p)
(type_of_branch context parsno need_dummy outtype cons
(type_of_aux context cons))
-in if not res then prerr_endline ("#### " ^ CicPp.ppterm (type_of_aux context p) ^ " <==> " ^ CicPp.ppterm (type_of_branch context parsno need_dummy outtype cons (type_of_aux context cons))) ; res
+in if not res then debug_print ("#### " ^ CicPp.ppterm (type_of_aux context p) ^ " <==> " ^ CicPp.ppterm (type_of_branch context parsno need_dummy outtype cons (type_of_aux context cons))) ; res
)
) (1,true) pl
in
if not branches_ok then
raise
- (TypeCheckerFailure
- (NotWellTyped "MutCase: wrong type of a branch")) ;
-
+ (TypeCheckerFailure "Case analysys: wrong branch type");
if not need_dummy then
C.Appl ((outtype::arguments)@[term])
else if arguments = [] then
(guarded_by_destructors context' eaten (len + eaten) kl 1 [] m)
then
raise
- (TypeCheckerFailure
- (NotWellTyped "Fix: not guarded by destructors"))
+ (TypeCheckerFailure ("Fix: not guarded by destructors"))
end
else
- raise (TypeCheckerFailure (NotWellTyped "Fix: ill-typed bodies"))
+ raise (TypeCheckerFailure ("Fix: ill-typed bodies"))
) fl ;
(*CSC: controlli mancanti solo su D{f,k,x,M} *)
None ->
raise
(TypeCheckerFailure
- (NotWellTyped "CoFix: does not return a coinductive type"))
+ ("CoFix: does not return a coinductive type"))
| Some uri ->
(*let's control the guarded by constructors conditions C{f,M}*)
if
[] uri)
then
raise
- (TypeCheckerFailure
- (NotWellTyped "CoFix: not guarded by constructors"))
+ (TypeCheckerFailure ("CoFix: not guarded by constructors"))
end
else
raise
- (TypeCheckerFailure
- (NotWellTyped "CoFix: ill-typed bodies"))
+ (TypeCheckerFailure ("CoFix: ill-typed bodies"))
) fl ;
let (_,ty,_) = List.nth fl i in
Cic.Variable (_,Some bo,_,_) ->
raise
(TypeCheckerFailure
- (NotWellTyped
- "A variable with a body can not be explicit substituted"))
+ ("A variable with a body can not be explicit substituted"))
| Cic.Variable (_,None,_,_) -> ()
| _ ->
- raise
- (TypeCheckerFailure
- (WrongUriToVariable (UriManager.string_of_uri uri)))
+ raise (TypeCheckerFailure
+ ("Unknown mutual inductive definition:" ^
+ UriManager.string_of_uri uri))
) ;
let typeoft = type_of_aux context t in
if CicReduction.are_convertible context typeoft typeofvar then
ignore (CicReduction.are_convertible context typeoft typeofvar) ;
fdebug := 0 ;
debug typeoft [typeofvar] ;
- raise
- (TypeCheckerFailure
- (NotWellTyped "Wrong Explicit Named Substitution"))
+ raise (TypeCheckerFailure "Wrong Explicit Named Substitution")
end
in
check_exp_named_subst_aux []
C.Sort s2
| (C.Sort s1, C.Sort s2) -> C.Sort C.Type (*CSC manca la gestione degli universi!!! *)
| (_,_) ->
- raise
- (TypeCheckerFailure
- (NotWellTyped
- ("Prod: sort1= " ^ CicPp.ppterm t1' ^ " ; sort2= "^ CicPp.ppterm t2')))
+ raise (TypeCheckerFailure (sprintf
+ "Prod: expected two sorts, found = %s, %s" (CicPp.ppterm t1')
+ (CicPp.ppterm t2')))
and eat_prods context hetype =
(*CSC: siamo sicuri che le are_convertible non lavorino con termini non *)
ignore (CicReduction.are_convertible context s hety) ;
fdebug := 0 ;
debug s [hety] ;
- raise
- (TypeCheckerFailure (NotWellTyped "Appl: wrong parameter-type"))
+ raise (TypeCheckerFailure (sprintf
+ "Appl: wrong parameter-type, expected %s, found %s"
+ (CicPp.ppterm hetype) (CicPp.ppterm s)))
end
- | _ -> raise (TypeCheckerFailure (NotWellTyped "Appl: wrong Prod-type"))
+ | _ ->
+ raise (TypeCheckerFailure
+ "Appl: this is not a function, it cannot be applied")
)
and returns_a_coinductive context ty =
let (_,is_inductive,_,_) = List.nth itl i in
if is_inductive then None else (Some uri)
| _ ->
- raise
- (TypeCheckerFailure (WrongUriToMutualInductiveDefinitions
- (UriManager.string_of_uri uri)))
+ raise (TypeCheckerFailure
+ ("Unknown mutual inductive definition:" ^
+ UriManager.string_of_uri uri))
)
| C.Appl ((C.MutInd (uri,i,_))::_) ->
(match CicEnvironment.get_obj uri with
let (_,is_inductive,_,_) = List.nth itl i in
if is_inductive then None else (Some uri)
| _ ->
- raise
- (TypeCheckerFailure
- (WrongUriToMutualInductiveDefinitions
- (UriManager.string_of_uri uri)))
+ raise (TypeCheckerFailure
+ ("Unknown mutual inductive definition:" ^
+ UriManager.string_of_uri uri))
)
| C.Prod (n,so,de) ->
returns_a_coinductive ((Some (n,C.Decl so))::context) de
in
(*CSC
-prerr_endline ("INIZIO TYPE_OF_AUX " ^ CicPp.ppterm t) ; flush stderr ;
+debug_print ("INIZIO TYPE_OF_AUX " ^ CicPp.ppterm t) ; flush stderr ;
let res =
*)
type_of_aux context t
(*
-in prerr_endline "FINE TYPE_OF_AUX" ; flush stderr ; res
+in debug_print "FINE TYPE_OF_AUX" ; flush stderr ; res
*)
(* is a small constructor? *)
and type_of t =
(*CSC
-prerr_endline ("INIZIO TYPE_OF_AUX' " ^ CicPp.ppterm t) ; flush stderr ;
+debug_print ("INIZIO TYPE_OF_AUX' " ^ CicPp.ppterm t) ; flush stderr ;
let res =
*)
type_of_aux' [] [] t
(*CSC
-in prerr_endline "FINE TYPE_OF_AUX'" ; flush stderr ; res
+in debug_print "FINE TYPE_OF_AUX'" ; flush stderr ; res
*)
;;
C.Constant (_,Some te,ty,_) ->
let _ = type_of ty in
if not (R.are_convertible [] (type_of te ) ty) then
- raise
- (TypeCheckerFailure
- (NotWellTyped ("Constant " ^ (U.string_of_uri uri))))
+ raise (TypeCheckerFailure
+ ("Unknown constant:" ^ U.string_of_uri uri))
| C.Constant (_,None,ty,_) ->
(* only to check that ty is well-typed *)
let _ = type_of ty in ()
) [] conjs
in
let _ = type_of_aux' conjs [] ty in
- if not (R.are_convertible [] (type_of_aux' conjs [] te) ty)
+ let type_of_te = type_of_aux' conjs [] te in
+ if not (R.are_convertible [] type_of_te ty)
then
- raise
- (TypeCheckerFailure
- (NotWellTyped ("CurrentProof" ^ (U.string_of_uri uri))))
+ raise (TypeCheckerFailure (sprintf
+ "the current proof %s is not well typed because the type %s of the body is not convertible to the declared type %s"
+ (U.string_of_uri uri) (CicPp.ppterm type_of_te)
+ (CicPp.ppterm ty)))
| C.Variable (_,bo,ty,_) ->
(* only to check that ty is well-typed *)
let _ = type_of ty in
None -> ()
| Some bo ->
if not (R.are_convertible [] (type_of bo) ty) then
- raise
- (TypeCheckerFailure
- (NotWellTyped ("Variable" ^ (U.string_of_uri uri))))
+ raise (TypeCheckerFailure
+ ("Unknown variable:" ^ U.string_of_uri uri))
)
| C.InductiveDefinition _ ->
check_mutual_inductive_defs uri uobj