diff options
Diffstat (limited to 'toplevel/himsg.ml')
-rw-r--r-- | toplevel/himsg.ml | 907 |
1 files changed, 494 insertions, 413 deletions
diff --git a/toplevel/himsg.ml b/toplevel/himsg.ml index 1809baa5..579acffa 100644 --- a/toplevel/himsg.ml +++ b/toplevel/himsg.ml @@ -6,11 +6,11 @@ (* * GNU Lesser General Public License Version 2.1 *) (************************************************************************) -(* $Id: himsg.ml 9976 2007-07-12 11:58:30Z msozeau $ *) +(* $Id: himsg.ml 11150 2008-06-19 11:38:27Z msozeau $ *) open Pp open Util -open Options +open Flags open Names open Nameops open Term @@ -21,6 +21,7 @@ open Sign open Environ open Pretype_errors open Type_errors +open Typeclasses_errors open Indrec open Reduction open Cases @@ -29,51 +30,45 @@ open Printer open Rawterm open Evd -let quote s = h 0 (str "\"" ++ s ++ str "\"") - let pr_lconstr c = quote (pr_lconstr c) let pr_lconstr_env e c = quote (pr_lconstr_env e c) let pr_lconstr_env_at_top e c = quote (pr_lconstr_env_at_top e c) let pr_ljudge_env e c = let v,t = pr_ljudge_env e c in (quote v,quote t) -let nth i = - let many = match i mod 10 with 1 -> "st" | 2 -> "nd" | _ -> "th" in - int i ++ str many - -let pr_db ctx i = +let pr_db env i = try - match lookup_rel i ctx with + match lookup_rel i env with Name id, _, _ -> pr_id id - | Anonymous, _, _ -> str"<>" - with Not_found -> str"UNBOUND_REL_"++int i + | Anonymous, _, _ -> str "<>" + with Not_found -> str "UNBOUND_REL_" ++ int i -let explain_unbound_rel ctx n = - let pe = pr_ne_context_of (str "In environment") ctx in - str"Unbound reference: " ++ pe ++ - str"The reference " ++ int n ++ str " is free" +let explain_unbound_rel env n = + let pe = pr_ne_context_of (str "In environment") env in + str "Unbound reference: " ++ pe ++ + str "The reference " ++ int n ++ str " is free." -let explain_unbound_var ctx v = +let explain_unbound_var env v = let var = pr_id v in - str"No such section variable or assumption : " ++ var - -let explain_not_type ctx j = - let pe = pr_ne_context_of (str"In environment") ctx in - let pc,pt = pr_ljudge_env ctx j in - pe ++ str "the term" ++ brk(1,1) ++ pc ++ spc () ++ - str"has type" ++ spc () ++ pt ++ spc () ++ - str"which should be Set, Prop or Type." - -let explain_bad_assumption ctx j = - let pe = pr_ne_context_of (str"In environment") ctx in - let pc,pt = pr_ljudge_env ctx j in - pe ++ str "cannot declare a variable or hypothesis over the term" ++ - brk(1,1) ++ pc ++ spc () ++ str"of type" ++ spc () ++ pt ++ spc () ++ + str "No such section variable or assumption: " ++ var ++ str "." + +let explain_not_type env j = + let pe = pr_ne_context_of (str "In environment") env in + let pc,pt = pr_ljudge_env env j in + pe ++ str "The term" ++ brk(1,1) ++ pc ++ spc () ++ + str "has type" ++ spc () ++ pt ++ spc () ++ + str "which should be Set, Prop or Type." + +let explain_bad_assumption env j = + let pe = pr_ne_context_of (str "In environment") env in + let pc,pt = pr_ljudge_env env j in + pe ++ str "Cannot declare a variable or hypothesis over the term" ++ + brk(1,1) ++ pc ++ spc () ++ str "of type" ++ spc () ++ pt ++ spc () ++ str "because this term is not a type." let explain_reference_variables c = let pc = pr_lconstr c in - str "the constant" ++ spc () ++ pc ++ spc () ++ - str "refers to variables which are not in the context" + str "The constant" ++ spc () ++ pc ++ spc () ++ + str "refers to variables which are not in the context." let rec pr_disjunction pr = function | [a] -> pr a @@ -81,10 +76,10 @@ let rec pr_disjunction pr = function | a::l -> pr a ++ str "," ++ spc () ++ pr_disjunction pr l | [] -> assert false -let explain_elim_arity ctx ind sorts c pj okinds = - let ctx = make_all_name_different ctx in - let pi = pr_inductive ctx ind in - let pc = pr_lconstr_env ctx c in +let explain_elim_arity env ind sorts c pj okinds = + let env = make_all_name_different env in + let pi = pr_inductive env ind in + let pc = pr_lconstr_env env c in let msg = match okinds with | Some(kp,ki,explanation) -> let pki = pr_sort_family ki in @@ -93,144 +88,137 @@ let explain_elim_arity ctx ind sorts c pj okinds = | NonInformativeToInformative -> "proofs can be eliminated only to build proofs" | StrongEliminationOnNonSmallType -> - "strong elimination on non-small inductive types leads to paradoxes." + "strong elimination on non-small inductive types leads to paradoxes" | WrongArity -> "wrong arity" in let ppar = pr_disjunction (fun s -> quote (pr_sort_family s)) sorts in - let ppt = pr_lconstr_env ctx (snd (decompose_prod_assum pj.uj_type)) in - hov 0 - (str "the return type has sort" ++ spc() ++ ppt ++ spc() ++ - str "while it" ++ spc() ++ str "should be " ++ ppar ++ str ".") ++ - fnl() ++ + let ppt = pr_lconstr_env env (snd (decompose_prod_assum pj.uj_type)) in + hov 0 + (str "the return type has sort" ++ spc () ++ ppt ++ spc () ++ + str "while it" ++ spc () ++ str "should be " ++ ppar ++ str ".") ++ + fnl () ++ hov 0 (str "Elimination of an inductive object of sort " ++ pki ++ brk(1,0) ++ - str "is not allowed on a predicate in sort " ++ pkp ++ fnl() ++ - str "because" ++ spc() ++ str explanation ++ str ".") - | None -> + str "is not allowed on a predicate in sort " ++ pkp ++ fnl () ++ + str "because" ++ spc () ++ str explanation ++ str ".") + | None -> str "ill-formed elimination predicate." in hov 0 ( - str "Incorrect elimination of" ++ spc() ++ pc ++ spc () ++ - str "in the inductive type" ++ spc() ++ quote pi ++ str":") ++ + str "Incorrect elimination of" ++ spc () ++ pc ++ spc () ++ + str "in the inductive type" ++ spc () ++ quote pi ++ str ":") ++ fnl () ++ msg -let explain_case_not_inductive ctx cj = - let ctx = make_all_name_different ctx in - let pc = pr_lconstr_env ctx cj.uj_val in - let pct = pr_lconstr_env ctx cj.uj_type in +let explain_case_not_inductive env cj = + let env = make_all_name_different env in + let pc = pr_lconstr_env env cj.uj_val in + let pct = pr_lconstr_env env cj.uj_type in match kind_of_term cj.uj_type with - | Evar _ -> - str "Cannot infer a type for this expression" + | Evar _ -> + str "Cannot infer a type for this expression." | _ -> - str "The term" ++ brk(1,1) ++ pc ++ spc () ++ - str "has type" ++ brk(1,1) ++ pct ++ spc () ++ - str "which is not a (co-)inductive type" - -let explain_number_branches ctx cj expn = - let ctx = make_all_name_different ctx in - let pc = pr_lconstr_env ctx cj.uj_val in - let pct = pr_lconstr_env ctx cj.uj_type in - str "Matching on term" ++ brk(1,1) ++ pc ++ spc () ++ + str "The term" ++ brk(1,1) ++ pc ++ spc () ++ + str "has type" ++ brk(1,1) ++ pct ++ spc () ++ + str "which is not a (co-)inductive type." + +let explain_number_branches env cj expn = + let env = make_all_name_different env in + let pc = pr_lconstr_env env cj.uj_val in + let pct = pr_lconstr_env env cj.uj_type in + str "Matching on term" ++ brk(1,1) ++ pc ++ spc () ++ str "of type" ++ brk(1,1) ++ pct ++ spc () ++ - str "expects " ++ int expn ++ str " branches" + str "expects " ++ int expn ++ str " branches." -let ordinal n = - let s = match n mod 10 with 1 -> "st" | 2 -> "nd" | 3 -> "rd" | _ -> "th" in - string_of_int n ^ s - -let explain_ill_formed_branch ctx c i actty expty = - let ctx = make_all_name_different ctx in - let pc = pr_lconstr_env ctx c in - let pa = pr_lconstr_env ctx actty in - let pe = pr_lconstr_env ctx expty in +let explain_ill_formed_branch env c i actty expty = + let env = make_all_name_different env in + let pc = pr_lconstr_env env c in + let pa = pr_lconstr_env env actty in + let pe = pr_lconstr_env env expty in str "In pattern-matching on term" ++ brk(1,1) ++ pc ++ - spc () ++ str "the " ++ str (ordinal (i+1)) ++ str " branch has type" ++ - brk(1,1) ++ pa ++ spc () ++ - str "which should be" ++ brk(1,1) ++ pe - -let explain_generalization ctx (name,var) j = - let pe = pr_ne_context_of (str "In environment") ctx in - let pv = pr_ltype_env ctx var in - let (pc,pt) = pr_ljudge_env (push_rel_assum (name,var) ctx) j in - str"Illegal generalization: " ++ pe ++ - str"Cannot generalize" ++ brk(1,1) ++ pv ++ spc () ++ - str"over" ++ brk(1,1) ++ pc ++ str"," ++ spc () ++ - str"it has type" ++ spc () ++ pt ++ - spc () ++ str"which should be Set, Prop or Type." - -let explain_actual_type ctx j pt = - let pe = pr_ne_context_of (str "In environment") ctx in - let (pc,pct) = pr_ljudge_env ctx j in - let pt = pr_lconstr_env ctx pt in + spc () ++ str "the " ++ nth (i+1) ++ str " branch has type" ++ + brk(1,1) ++ pa ++ spc () ++ + str "which should be" ++ brk(1,1) ++ pe ++ str "." + +let explain_generalization env (name,var) j = + let pe = pr_ne_context_of (str "In environment") env in + let pv = pr_ltype_env env var in + let (pc,pt) = pr_ljudge_env (push_rel_assum (name,var) env) j in + pe ++ str "Cannot generalize" ++ brk(1,1) ++ pv ++ spc () ++ + str "over" ++ brk(1,1) ++ pc ++ str "," ++ spc () ++ + str "it has type" ++ spc () ++ pt ++ + spc () ++ str "which should be Set, Prop or Type." + +let explain_actual_type env j pt = + let pe = pr_ne_context_of (str "In environment") env in + let (pc,pct) = pr_ljudge_env env j in + let pt = pr_lconstr_env env pt in pe ++ - str "The term" ++ brk(1,1) ++ pc ++ spc () ++ - str "has type" ++ brk(1,1) ++ pct ++ brk(1,1) ++ - str "while it is expected to have type" ++ brk(1,1) ++ pt - -let explain_cant_apply_bad_type ctx (n,exptyp,actualtyp) rator randl = - let ctx = make_all_name_different ctx in - let randl = Array.to_list randl in -(* let pe = pr_ne_context_of (str"in environment") ctx in*) - let pr,prt = pr_ljudge_env ctx rator in - let term_string1,term_string2 = - if List.length randl > 1 then - str "terms", (str"The "++nth n++str" term") - else - str "term", str "This term" in - let appl = prlist_with_sep pr_fnl + str "The term" ++ brk(1,1) ++ pc ++ spc () ++ + str "has type" ++ brk(1,1) ++ pct ++ brk(1,1) ++ + str "while it is expected to have type" ++ brk(1,1) ++ pt ++ str "." + +let explain_cant_apply_bad_type env (n,exptyp,actualtyp) rator randl = + let env = make_all_name_different env in + let nargs = Array.length randl in +(* let pe = pr_ne_context_of (str "in environment") env in*) + let pr,prt = pr_ljudge_env env rator in + let term_string1 = str (plural nargs "term") in + let term_string2 = + if nargs>1 then str "The " ++ nth n ++ str " term" else str "This term" in + let appl = prvect_with_sep pr_fnl (fun c -> - let pc,pct = pr_ljudge_env ctx c in - hov 2 (pc ++ spc () ++ str": " ++ pct)) randl + let pc,pct = pr_ljudge_env env c in + hov 2 (pc ++ spc () ++ str ": " ++ pct)) randl in - str"Illegal application (Type Error): " ++ (* pe ++ *) fnl () ++ - str"The term" ++ brk(1,1) ++ pr ++ spc () ++ - str"of type" ++ brk(1,1) ++ prt ++ spc () ++ - str"cannot be applied to the " ++ term_string1 ++ fnl () ++ - str" " ++ v 0 appl ++ fnl () ++ term_string2 ++ str" has type" ++ - brk(1,1) ++ pr_lconstr_env ctx actualtyp ++ spc () ++ - str"which should be coercible to" ++ brk(1,1) ++ pr_lconstr_env ctx exptyp - -let explain_cant_apply_not_functional ctx rator randl = - let ctx = make_all_name_different ctx in - let randl = Array.to_list randl in -(* let pe = pr_ne_context_of (str"in environment") ctx in*) - let pr = pr_lconstr_env ctx rator.uj_val in - let prt = pr_lconstr_env ctx rator.uj_type in - let term_string = if List.length randl > 1 then "terms" else "term" in - let appl = prlist_with_sep pr_fnl + str "Illegal application (Type Error): " ++ (* pe ++ *) fnl () ++ + str "The term" ++ brk(1,1) ++ pr ++ spc () ++ + str "of type" ++ brk(1,1) ++ prt ++ spc () ++ + str "cannot be applied to the " ++ term_string1 ++ fnl () ++ + str " " ++ v 0 appl ++ fnl () ++ term_string2 ++ str " has type" ++ + brk(1,1) ++ pr_lconstr_env env actualtyp ++ spc () ++ + str "which should be coercible to" ++ brk(1,1) ++ + pr_lconstr_env env exptyp ++ str "." + +let explain_cant_apply_not_functional env rator randl = + let env = make_all_name_different env in + let nargs = Array.length randl in +(* let pe = pr_ne_context_of (str "in environment") env in*) + let pr = pr_lconstr_env env rator.uj_val in + let prt = pr_lconstr_env env rator.uj_type in + let appl = prvect_with_sep pr_fnl (fun c -> - let pc = pr_lconstr_env ctx c.uj_val in - let pct = pr_lconstr_env ctx c.uj_type in - hov 2 (pc ++ spc () ++ str": " ++ pct)) randl + let pc = pr_lconstr_env env c.uj_val in + let pct = pr_lconstr_env env c.uj_type in + hov 2 (pc ++ spc () ++ str ": " ++ pct)) randl in - str"Illegal application (Non-functional construction): " ++ + str "Illegal application (Non-functional construction): " ++ (* pe ++ *) fnl () ++ - str"The expression" ++ brk(1,1) ++ pr ++ spc () ++ - str"of type" ++ brk(1,1) ++ prt ++ spc () ++ - str("cannot be applied to the "^term_string) ++ fnl () ++ - str" " ++ v 0 appl - -let explain_unexpected_type ctx actual_type expected_type = - let pract = pr_lconstr_env ctx actual_type in - let prexp = pr_lconstr_env ctx expected_type in - str"This type is" ++ spc () ++ pract ++ spc () ++ + str "The expression" ++ brk(1,1) ++ pr ++ spc () ++ + str "of type" ++ brk(1,1) ++ prt ++ spc () ++ + str "cannot be applied to the " ++ str (plural nargs "term") ++ fnl () ++ + str " " ++ v 0 appl + +let explain_unexpected_type env actual_type expected_type = + let pract = pr_lconstr_env env actual_type in + let prexp = pr_lconstr_env env expected_type in + str "This type is" ++ spc () ++ pract ++ spc () ++ str "but is expected to be" ++ - spc () ++ prexp + spc () ++ prexp ++ str "." -let explain_not_product ctx c = - let pr = pr_lconstr_env ctx c in - str"The type of this term is a product," ++ spc () ++ - str"while it is expected to be" ++ - if is_Type c then str " a sort" else (brk(1,1) ++ pr) +let explain_not_product env c = + let pr = pr_lconstr_env env c in + str "The type of this term is a product" ++ spc () ++ + str "while it is expected to be" ++ + (if is_Type c then str " a sort" else (brk(1,1) ++ pr)) ++ str "." (* TODO: use the names *) (* (co)fixpoints *) -let explain_ill_formed_rec_body ctx err names i = +let explain_ill_formed_rec_body env err names i fixenv vdefj = let prt_name i = match names.(i) with Name id -> str "Recursive definition of " ++ pr_id id - | Anonymous -> str"The " ++ nth i ++ str" definition" in + | Anonymous -> str "The " ++ nth i ++ str " definition" in let st = match err with @@ -238,277 +226,359 @@ let explain_ill_formed_rec_body ctx err names i = | NotEnoughAbstractionInFixBody -> str "Not enough abstractions in the definition" | RecursionNotOnInductiveType c -> - str "Recursive definition on" ++ spc() ++ pr_lconstr_env ctx c ++ spc() ++ + str "Recursive definition on" ++ spc () ++ pr_lconstr_env env c ++ spc () ++ str "which should be an inductive type" | RecursionOnIllegalTerm(j,arg,le,lt) -> let called = match names.(j) with Name id -> pr_id id - | Anonymous -> str"the " ++ nth i ++ str" definition" in + | Anonymous -> str "the " ++ nth i ++ str " definition" in let vars = match (lt,le) with - ([],[]) -> mt() + ([],[]) -> assert false | ([],[x]) -> - str "a subterm of " ++ pr_db ctx x + str "a subterm of " ++ pr_db env x | ([],_) -> str "a subterm of the following variables: " ++ - prlist_with_sep pr_spc (pr_db ctx) le - | ([x],_) -> pr_db ctx x + prlist_with_sep pr_spc (pr_db env) le + | ([x],_) -> pr_db env x | _ -> str "one of the following variables: " ++ - prlist_with_sep pr_spc (pr_db ctx) lt in - str "Recursive call to " ++ called ++ spc() ++ - str "has principal argument equal to" ++ spc() ++ - pr_lconstr_env ctx arg ++ fnl() ++ str "instead of " ++ vars + prlist_with_sep pr_spc (pr_db env) lt in + str "Recursive call to " ++ called ++ spc () ++ + str "has principal argument equal to" ++ spc () ++ + pr_lconstr_env env arg ++ fnl () ++ str "instead of " ++ vars | NotEnoughArgumentsForFixCall j -> let called = match names.(j) with Name id -> pr_id id - | Anonymous -> str"the " ++ nth i ++ str" definition" in - str "Recursive call to " ++ called ++ str " had not enough arguments" + | Anonymous -> str "the " ++ nth i ++ str " definition" in + str "Recursive call to " ++ called ++ str " has not enough arguments" (* CoFixpoint guard errors *) | CodomainNotInductiveType c -> - str "the codomain is" ++ spc () ++ pr_lconstr_env ctx c ++ spc () ++ + str "The codomain is" ++ spc () ++ pr_lconstr_env env c ++ spc () ++ str "which should be a coinductive type" | NestedRecursiveOccurrences -> - str "nested recursive occurrences" + str "Nested recursive occurrences" | UnguardedRecursiveCall c -> - str "unguarded recursive call in" ++ spc() ++ pr_lconstr_env ctx c + str "Unguarded recursive call in" ++ spc () ++ pr_lconstr_env env c | RecCallInTypeOfAbstraction c -> - str "recursive call forbidden in the domain of an abstraction:" ++ - spc() ++ pr_lconstr_env ctx c + str "Recursive call forbidden in the domain of an abstraction:" ++ + spc () ++ pr_lconstr_env env c | RecCallInNonRecArgOfConstructor c -> - str "recursive call on a non-recursive argument of constructor" ++ - spc() ++ pr_lconstr_env ctx c + str "Recursive call on a non-recursive argument of constructor" ++ + spc () ++ pr_lconstr_env env c | RecCallInTypeOfDef c -> - str "recursive call forbidden in the type of a recursive definition" ++ - spc() ++ pr_lconstr_env ctx c + str "Recursive call forbidden in the type of a recursive definition" ++ + spc () ++ pr_lconstr_env env c | RecCallInCaseFun c -> - str "recursive call in a branch of" ++ spc() ++ pr_lconstr_env ctx c - | RecCallInCaseArg c -> - str "recursive call in the argument of cases in" ++ spc() ++ - pr_lconstr_env ctx c + str "Recursive call in a branch of" ++ spc () ++ pr_lconstr_env env c + | RecCallInCaseArg c -> + str "Recursive call in the argument of cases in" ++ spc () ++ + pr_lconstr_env env c | RecCallInCasePred c -> - str "recursive call in the type of cases in" ++ spc() ++ - pr_lconstr_env ctx c + str "Recursive call in the type of cases in" ++ spc () ++ + pr_lconstr_env env c | NotGuardedForm c -> - str "sub-expression " ++ pr_lconstr_env ctx c ++ spc() ++ - str "not in guarded form" ++ spc()++ - str"(should be a constructor, an abstraction, a match, a cofix or a recursive call)" + str "Sub-expression " ++ pr_lconstr_env env c ++ + strbrk " not in guarded form (should be a constructor," ++ + strbrk " an abstraction, a match, a cofix or a recursive call)" in - prt_name i ++ str" is ill-formed." ++ fnl() ++ - pr_ne_context_of (str "In environment") ctx ++ - st - -let explain_ill_typed_rec_body ctx i names vdefj vargs = - let ctx = make_all_name_different ctx in - let pvd,pvdt = pr_ljudge_env ctx (vdefj.(i)) in - let pv = pr_lconstr_env ctx vargs.(i) in - str"The " ++ - (if Array.length vdefj = 1 then mt () else int (i+1) ++ str "-th") ++ - str"recursive definition" ++ spc () ++ pvd ++ spc () ++ - str "has type" ++ spc () ++ pvdt ++spc () ++ - str "it should be" ++ spc () ++ pv -(* -let explain_not_inductive ctx c = - let ctx = make_all_name_different ctx in - let pc = pr_lconstr_env ctx c in - str"The term" ++ brk(1,1) ++ pc ++ spc () ++ - str "is not an inductive definition" -*) -let explain_cant_find_case_type ctx c = - let ctx = make_all_name_different ctx in - let pe = pr_lconstr_env ctx c in - hov 3 (str "Cannot infer type of pattern-matching on" ++ ws 1 ++ pe) - -let explain_occur_check ctx ev rhs = - let ctx = make_all_name_different ctx in + prt_name i ++ str " is ill-formed." ++ fnl () ++ + pr_ne_context_of (str "In environment") env ++ + st ++ str "." + +let explain_ill_typed_rec_body env i names vdefj vargs = + let env = make_all_name_different env in + let pvd,pvdt = pr_ljudge_env env (vdefj.(i)) in + let pv = pr_lconstr_env env vargs.(i) in + str "The " ++ + (if Array.length vdefj = 1 then mt () else nth (i+1) ++ spc ()) ++ + str "recursive definition" ++ spc () ++ pvd ++ spc () ++ + str "has type" ++ spc () ++ pvdt ++ spc () ++ + str "while it should be" ++ spc () ++ pv ++ str "." + +let explain_cant_find_case_type env c = + let env = make_all_name_different env in + let pe = pr_lconstr_env env c in + str "Cannot infer type of pattern-matching on" ++ ws 1 ++ pe ++ str "." + +let explain_occur_check env ev rhs = + let env = make_all_name_different env in let id = Evd.string_of_existential ev in - let pt = pr_lconstr_env ctx rhs in - str"Occur check failed: tried to define " ++ str id ++ - str" with term" ++ brk(1,1) ++ pt + let pt = pr_lconstr_env env rhs in + str "Cannot define " ++ str id ++ str " with term" ++ brk(1,1) ++ + pt ++ spc () ++ str "that would depend on itself." let explain_hole_kind env = function - | QuestionMark _ -> str "a term for this placeholder" + | QuestionMark _ -> str "this placeholder" | CasesType -> str "the type of this pattern-matching problem" | BinderType (Name id) -> - str "a type for " ++ Nameops.pr_id id + str "the type of " ++ Nameops.pr_id id | BinderType Anonymous -> - str "a type for this anonymous binder" + str "the type of this anonymous binder" | ImplicitArg (c,(n,ido)) -> - let id = out_some ido in - str "an instance for the implicit parameter " ++ + let id = Option.get ido in + str "the implicit parameter " ++ pr_id id ++ spc () ++ str "of" ++ spc () ++ Nametab.pr_global_env Idset.empty c | InternalHole -> - str "a term for an internal placeholder" + str "an internal placeholder" | TomatchTypeParameter (tyi,n) -> - str "the " ++ pr_ord n ++ + str "the " ++ nth n ++ str " argument of the inductive type (" ++ pr_inductive env tyi ++ str ") of this term" + | GoalEvar -> + str "an existential variable" + | ImpossibleCase -> + str "the type of an impossible pattern-matching clause" -let explain_not_clean ctx ev t k = - let ctx = make_all_name_different ctx in +let explain_not_clean env ev t k = + let env = make_all_name_different env in let id = Evd.string_of_existential ev in - let var = pr_lconstr_env ctx t in - str"Tried to define " ++ explain_hole_kind ctx k ++ - str" (" ++ str id ++ str ")" ++ spc() ++ - str"with a term using variable " ++ var ++ spc () ++ - str"which is not in its scope." - -let explain_unsolvable_implicit env k = - str "Cannot infer " ++ explain_hole_kind env k - - -let explain_var_not_found ctx id = - str "The variable" ++ spc () ++ str (string_of_id id) ++ - spc () ++ str "was not found" ++ - spc () ++ str "in the current" ++ spc () ++ str "environment" - -let explain_wrong_case_info ctx ind ci = - let pi = pr_lconstr (mkInd ind) in + let var = pr_lconstr_env env t in + str "Tried to instantiate " ++ explain_hole_kind env k ++ + str " (" ++ str id ++ str ")" ++ spc () ++ + str "with a term using variable " ++ var ++ spc () ++ + str "which is not in its scope." + +let explain_unsolvability = function + | None -> mt() + | Some (SeveralInstancesFound n) -> + strbrk " (several distinct possible instances found)" + +let pr_ne_context_of header footer env = + if Environ.rel_context env = empty_rel_context & + Environ.named_context env = empty_named_context then footer + else pr_ne_context_of header env + +let explain_typeclass_resolution env evi k = + match k with + InternalHole | ImplicitArg _ -> + (match Typeclasses.class_of_constr evi.evar_concl with + | Some c -> + let env = Evd.evar_env evi in + fnl () ++ str "Could not find an instance for " ++ + pr_lconstr_env env evi.evar_concl ++ + pr_ne_context_of (str " in environment:"++ fnl ()) (str ".") env + | None -> mt()) + | _ -> mt() + +let explain_unsolvable_implicit env evi k explain = + str "Cannot infer " ++ explain_hole_kind env k ++ + explain_unsolvability explain ++ str "." ++ + explain_typeclass_resolution env evi k + +let explain_var_not_found env id = + str "The variable" ++ spc () ++ pr_id id ++ + spc () ++ str "was not found" ++ + spc () ++ str "in the current" ++ spc () ++ str "environment" ++ str "." + +let explain_wrong_case_info env ind ci = + let pi = pr_inductive (Global.env()) ind in if ci.ci_ind = ind then - str"Pattern-matching expression on an object of inductive" ++ spc () ++ pi ++ - spc () ++ str"has invalid information" + str "Pattern-matching expression on an object of inductive type" ++ + spc () ++ pi ++ spc () ++ str "has invalid information." else - let pc = pr_lconstr (mkInd ci.ci_ind) in - str"A term of inductive type" ++ spc () ++ pi ++ spc () ++ - str"was given to a pattern-matching expression on the inductive type" ++ - spc () ++ pc - - -let explain_cannot_unify ctx m n = - let pm = pr_lconstr_env ctx m in - let pn = pr_lconstr_env ctx n in - str"Impossible to unify" ++ brk(1,1) ++ pm ++ spc () ++ - str"with" ++ brk(1,1) ++ pn + let pc = pr_inductive (Global.env()) ci.ci_ind in + str "A term of inductive type" ++ spc () ++ pi ++ spc () ++ + str "was given to a pattern-matching expression on the inductive type" ++ + spc () ++ pc ++ str "." + +let explain_cannot_unify env m n = + let pm = pr_lconstr_env env m in + let pn = pr_lconstr_env env n in + str "Impossible to unify" ++ brk(1,1) ++ pm ++ spc () ++ + str "with" ++ brk(1,1) ++ pn let explain_cannot_unify_local env m n subn = - let pm = pr_lconstr_env env m in + let pm = pr_lconstr_env env m in let pn = pr_lconstr_env env n in let psubn = pr_lconstr_env env subn in - str"Impossible to unify" ++ brk(1,1) ++ pm ++ spc () ++ - str"with" ++ brk(1,1) ++ pn ++ spc() ++ str"as" ++ brk(1,1) ++ - psubn ++ str" contains local variables" - -let explain_refiner_cannot_generalize ty = - str "Cannot find a well-typed generalisation of the goal with type : " ++ - pr_lconstr ty - -let explain_no_occurrence_found c = - str "Found no subterm matching " ++ pr_lconstr c ++ str " in the current goal" - -let explain_cannot_unify_binding_type ctx m n = - let pm = pr_lconstr_env ctx m in - let pn = pr_lconstr_env ctx n in - str "This binding has type" ++ brk(1,1) ++ pm ++ spc () ++ + str "Impossible to unify" ++ brk(1,1) ++ pm ++ spc () ++ + str "with" ++ brk(1,1) ++ pn ++ spc () ++ str "as" ++ brk(1,1) ++ + psubn ++ str " contains local variables" + +let explain_refiner_cannot_generalize env ty = + str "Cannot find a well-typed generalisation of the goal with type: " ++ + pr_lconstr_env env ty + +let explain_no_occurrence_found env c id = + str "Found no subterm matching " ++ pr_lconstr_env env c ++ + str " in " ++ + (match id with + | Some id -> pr_id id + | None -> str"the current goal") + +let explain_cannot_unify_binding_type env m n = + let pm = pr_lconstr_env env m in + let pn = pr_lconstr_env env n in + str "This binding has type" ++ brk(1,1) ++ pm ++ spc () ++ str "which should be unifiable with" ++ brk(1,1) ++ pn -let explain_type_error ctx err = - let ctx = make_all_name_different ctx in +let explain_cannot_find_well_typed_abstraction env p l = + let la,lc = list_chop (List.length l - 1) l in + str "Abstracting over the " ++ + str (plural (List.length l) "term") ++ spc () ++ + hov 0 (prlist_with_sep pr_coma (pr_lconstr_env env) la ++ + (if la<>[] then str " and" ++ spc () else mt()) ++ + pr_lconstr_env env (List.hd lc)) ++ spc () ++ + str "leads to a term" ++ spc () ++ pr_lconstr_env env p ++ spc () ++ + str "which is ill-typed" + +let explain_type_error env err = + let env = make_all_name_different env in match err with - | UnboundRel n -> - explain_unbound_rel ctx n - | UnboundVar v -> - explain_unbound_var ctx v - | NotAType j -> - explain_not_type ctx j - | BadAssumption c -> - explain_bad_assumption ctx c - | ReferenceVariables id -> + | UnboundRel n -> + explain_unbound_rel env n + | UnboundVar v -> + explain_unbound_var env v + | NotAType j -> + explain_not_type env j + | BadAssumption c -> + explain_bad_assumption env c + | ReferenceVariables id -> explain_reference_variables id | ElimArity (ind, aritylst, c, pj, okinds) -> - explain_elim_arity ctx ind aritylst c pj okinds - | CaseNotInductive cj -> - explain_case_not_inductive ctx cj - | NumberBranches (cj, n) -> - explain_number_branches ctx cj n - | IllFormedBranch (c, i, actty, expty) -> - explain_ill_formed_branch ctx c i actty expty + explain_elim_arity env ind aritylst c pj okinds + | CaseNotInductive cj -> + explain_case_not_inductive env cj + | NumberBranches (cj, n) -> + explain_number_branches env cj n + | IllFormedBranch (c, i, actty, expty) -> + explain_ill_formed_branch env c i actty expty | Generalization (nvar, c) -> - explain_generalization ctx nvar c - | ActualType (j, pt) -> - explain_actual_type ctx j pt + explain_generalization env nvar c + | ActualType (j, pt) -> + explain_actual_type env j pt | CantApplyBadType (t, rator, randl) -> - explain_cant_apply_bad_type ctx t rator randl + explain_cant_apply_bad_type env t rator randl | CantApplyNonFunctional (rator, randl) -> - explain_cant_apply_not_functional ctx rator randl - | IllFormedRecBody (err, lna, i) -> - explain_ill_formed_rec_body ctx err lna i - | IllTypedRecBody (i, lna, vdefj, vargs) -> - explain_ill_typed_rec_body ctx i lna vdefj vargs + explain_cant_apply_not_functional env rator randl + | IllFormedRecBody (err, lna, i, fixenv, vdefj) -> + explain_ill_formed_rec_body env err lna i fixenv vdefj + | IllTypedRecBody (i, lna, vdefj, vargs) -> + explain_ill_typed_rec_body env i lna vdefj vargs | WrongCaseInfo (ind,ci) -> - explain_wrong_case_info ctx ind ci -(* - | NotInductive c -> - explain_not_inductive ctx c -*) -let explain_pretype_error ctx err = - let ctx = make_all_name_different ctx in - match err with - | CantFindCaseType c -> - explain_cant_find_case_type ctx c - | OccurCheck (n,c) -> - explain_occur_check ctx n c - | NotClean (n,c,k) -> - explain_not_clean ctx n c k - | UnsolvableImplicit k -> - explain_unsolvable_implicit ctx k - | VarNotFound id -> - explain_var_not_found ctx id - | UnexpectedType (actual,expected) -> - explain_unexpected_type ctx actual expected - | NotProduct c -> - explain_not_product ctx c - | CannotUnify (m,n) -> explain_cannot_unify ctx m n - | CannotUnifyLocal (e,m,n,sn) -> explain_cannot_unify_local e m n sn - | CannotGeneralize ty -> explain_refiner_cannot_generalize ty - | NoOccurrenceFound c -> explain_no_occurrence_found c - | CannotUnifyBindingType (m,n) -> explain_cannot_unify_binding_type ctx m n + explain_wrong_case_info env ind ci +let explain_pretype_error env err = + let env = make_all_name_different env in + match err with + | CantFindCaseType c -> explain_cant_find_case_type env c + | OccurCheck (n,c) -> explain_occur_check env n c + | NotClean (n,c,k) -> explain_not_clean env n c k + | UnsolvableImplicit (evi,k,exp) -> explain_unsolvable_implicit env evi k exp + | VarNotFound id -> explain_var_not_found env id + | UnexpectedType (actual,expect) -> explain_unexpected_type env actual expect + | NotProduct c -> explain_not_product env c + | CannotUnify (m,n) -> explain_cannot_unify env m n + | CannotUnifyLocal (m,n,sn) -> explain_cannot_unify_local env m n sn + | CannotGeneralize ty -> explain_refiner_cannot_generalize env ty + | NoOccurrenceFound (c, id) -> explain_no_occurrence_found env c id + | CannotUnifyBindingType (m,n) -> explain_cannot_unify_binding_type env m n + | CannotFindWellTypedAbstraction (p,l) -> + explain_cannot_find_well_typed_abstraction env p l + + +(* Typeclass errors *) + +let explain_not_a_class env c = + pr_constr_env env c ++ str" is not a declared type class" + +let explain_unbound_method env cid id = + str "Unbound method name " ++ Nameops.pr_id (snd id) ++ spc () ++ str"of class" ++ spc () ++ + pr_global cid + +let pr_constr_exprs exprs = + hv 0 (List.fold_right + (fun d pps -> ws 2 ++ Ppconstr.pr_constr_expr d ++ pps) + exprs (mt ())) + +let explain_no_instance env (_,id) l = + str "No instance found for class " ++ Nameops.pr_id id ++ spc () ++ + str "applied to arguments" ++ spc () ++ + prlist_with_sep pr_spc (pr_lconstr_env env) l + +let pr_constraints env evm = + let l = Evd.to_list evm in + let (ev, evi) = List.hd l in + if List.for_all (fun (ev', evi') -> + eq_named_context_val evi.evar_hyps evi'.evar_hyps) l + then + let pe = pr_ne_context_of (str "In environment:") (mt ()) + (reset_with_named_context evi.evar_hyps env) in + pe ++ fnl () ++ + prlist_with_sep (fun () -> fnl ()) + (fun (ev, evi) -> str(string_of_existential ev)++ str " == " ++ pr_constr evi.evar_concl) l + else + pr_evar_map evm + +let explain_unsatisfiable_constraints env evd constr = + let evm = Evd.evars_of evd in + match constr with + | None -> + str"Unable to satisfy the following typeclass constraints:" ++ fnl() ++ + pr_constraints env evm + | Some (evi, k) -> + explain_unsolvable_implicit env evi k None ++ fnl () ++ + if List.length (Evd.to_list evm) > 1 then + str"With the following meta variables:" ++ + fnl() ++ Evd.pr_evar_map evm + else mt () + +let explain_mismatched_contexts env c i j = + str"Mismatched contexts while declaring instance: " ++ brk (1,1) ++ + hov 1 (str"Expected:" ++ brk (1, 1) ++ pr_named_context env j) ++ fnl () ++ brk (1,1) ++ + hov 1 (str"Found:" ++ brk (1, 1) ++ pr_constr_exprs i) + +let explain_typeclass_error env err = + match err with + | NotAClass c -> explain_not_a_class env c + | UnboundMethod (cid, id) -> explain_unbound_method env cid id + | NoInstance (id, l) -> explain_no_instance env id l + | UnsatisfiableConstraints (evd, c) -> explain_unsatisfiable_constraints env evd c + | MismatchedContextInstance (c, i, j) -> explain_mismatched_contexts env c i j + (* Refiner errors *) let explain_refiner_bad_type arg ty conclty = - str"refiner was given an argument" ++ brk(1,1) ++ + str "Refiner was given an argument" ++ brk(1,1) ++ pr_lconstr arg ++ spc () ++ - str"of type" ++ brk(1,1) ++ pr_lconstr ty ++ spc () ++ - str"instead of" ++ brk(1,1) ++ pr_lconstr conclty + str "of type" ++ brk(1,1) ++ pr_lconstr ty ++ spc () ++ + str "instead of" ++ brk(1,1) ++ pr_lconstr conclty -let explain_refiner_occur_meta t = - str"cannot refine with term" ++ brk(1,1) ++ pr_lconstr t ++ - spc () ++ str"because there are metavariables, and it is" ++ - spc () ++ str"neither an application nor a Case" - -let explain_refiner_occur_meta_goal t = - str"generated subgoal" ++ brk(1,1) ++ pr_lconstr t ++ - spc () ++ str"has metavariables in it" +let explain_refiner_unresolved_bindings l = + let l = map_succeed (function Name id -> id | _ -> failwith "") l in + str "Unable to find an instance for the " ++ + str (plural (List.length l) "variable") ++ spc () ++ + prlist_with_sep pr_coma pr_id l let explain_refiner_cannot_apply t harg = - str"in refiner, a term of type " ++ brk(1,1) ++ - pr_lconstr t ++ spc () ++ str"could not be applied to" ++ brk(1,1) ++ + str "In refiner, a term of type " ++ brk(1,1) ++ + pr_lconstr t ++ spc () ++ str "could not be applied to" ++ brk(1,1) ++ pr_lconstr harg let explain_refiner_not_well_typed c = - str"The term " ++ pr_lconstr c ++ str" is not well-typed" + str "The term " ++ pr_lconstr c ++ str " is not well-typed" let explain_intro_needs_product () = - str "Introduction tactics needs products" + str "Introduction tactics needs products." let explain_does_not_occur_in c hyp = - str "The term" ++ spc () ++ pr_lconstr c ++ spc () ++ str "does not occur in" ++ - spc () ++ pr_id hyp + str "The term" ++ spc () ++ pr_lconstr c ++ spc () ++ + str "does not occur in" ++ spc () ++ pr_id hyp ++ str "." let explain_non_linear_proof c = - str "cannot refine with term" ++ brk(1,1) ++ pr_lconstr c ++ - spc () ++ str"because a metavariable has several occurrences" + str "Cannot refine with term" ++ brk(1,1) ++ pr_lconstr c ++ + spc () ++ str "because a metavariable has several occurrences." let explain_refiner_error = function | BadType (arg,ty,conclty) -> explain_refiner_bad_type arg ty conclty - | OccurMeta t -> explain_refiner_occur_meta t - | OccurMetaGoal t -> explain_refiner_occur_meta_goal t + | UnresolvedBindings t -> explain_refiner_unresolved_bindings t | CannotApply (t,harg) -> explain_refiner_cannot_apply t harg | NotWellTyped c -> explain_refiner_not_well_typed c | IntroNeedsProduct -> explain_intro_needs_product () @@ -521,48 +591,52 @@ let error_non_strictly_positive env c v = let pc = pr_lconstr_env env c in let pv = pr_lconstr_env env v in str "Non strictly positive occurrence of " ++ pv ++ str " in" ++ - brk(1,1) ++ pc + brk(1,1) ++ pc ++ str "." let error_ill_formed_inductive env c v = let pc = pr_lconstr_env env c in let pv = pr_lconstr_env env v in str "Not enough arguments applied to the " ++ pv ++ - str " in" ++ brk(1,1) ++ pc + str " in" ++ brk(1,1) ++ pc ++ str "." -let error_ill_formed_constructor env c v = - let pc = pr_lconstr_env env c in +let error_ill_formed_constructor env id c v nparams nargs = let pv = pr_lconstr_env env v in - str "The conclusion of" ++ brk(1,1) ++ pc ++ brk(1,1) ++ - str "is not valid;" ++ brk(1,1) ++ str "it must be built from " ++ pv - -let str_of_nth n = - (string_of_int n)^ - (match n mod 10 with - | 1 -> "st" - | 2 -> "nd" - | 3 -> "rd" - | _ -> "th") + let atomic = (nb_prod c = 0) in + str "The type of constructor" ++ brk(1,1) ++ pr_id id ++ brk(1,1) ++ + str "is not valid;" ++ brk(1,1) ++ + strbrk (if atomic then "it must be " else "its conclusion must be ") ++ + pv ++ + (* warning: because of implicit arguments it is difficult to say which + parameters must be explicitly given *) + (if nparams<>0 then + strbrk " applied to its " ++ str (plural nparams "parameter") + else + mt()) ++ + (if nargs<>0 then + str (if nparams<>0 then " and" else " applied") ++ + strbrk " to some " ++ str (plural nargs "argument") + else + mt()) ++ str "." let error_bad_ind_parameters env c n v1 v2 = let pc = pr_lconstr_env_at_top env c in let pv1 = pr_lconstr_env env v1 in let pv2 = pr_lconstr_env env v2 in - str ("The "^(str_of_nth n)^" argument of ") ++ pv2 ++ brk(1,1) ++ - str "must be " ++ pv1 ++ str " in" ++ brk(1,1) ++ pc + str "The " ++ nth n ++ str " argument of " ++ pv2 ++ brk(1,1) ++ + str "must be " ++ pv1 ++ str " in" ++ brk(1,1) ++ pc ++ str "." let error_same_names_types id = - str "The name" ++ spc () ++ pr_id id ++ spc () ++ - str "is used twice is the inductive types definition." + str "The name" ++ spc () ++ pr_id id ++ spc () ++ + str "is used more than once." -let error_same_names_constructors id cid = - str "The constructor name" ++ spc () ++ pr_id cid ++ spc () ++ - str "is used twice is the definition of type" ++ spc () ++ - pr_id id +let error_same_names_constructors id = + str "The constructor name" ++ spc () ++ pr_id id ++ spc () ++ + str "is used more than once." -let error_same_names_overlap idl = - str "The following names" ++ spc () ++ - str "are used both as type names and constructor names:" ++ spc () ++ - prlist_with_sep pr_coma pr_id idl +let error_same_names_overlap idl = + strbrk "The following names are used both as type names and constructor " ++ + str "names:" ++ spc () ++ + prlist_with_sep pr_coma pr_id idl ++ str "." let error_not_an_arity id = str "The type of" ++ spc () ++ pr_id id ++ spc () ++ str "is not an arity." @@ -571,29 +645,36 @@ let error_bad_entry () = str "Bad inductive definition." let error_not_allowed_case_analysis dep kind i = - str (if dep then "Dependent" else "Non Dependent") ++ + str (if dep then "Dependent" else "Non dependent") ++ str " case analysis on sort: " ++ pr_sort kind ++ fnl () ++ str "is not allowed for inductive definition: " ++ - pr_inductive (Global.env()) i + pr_inductive (Global.env()) i ++ str "." let error_bad_induction dep indid kind = str (if dep then "Dependent" else "Non dependent") ++ str " induction for type " ++ pr_id indid ++ str " and sort " ++ pr_sort kind ++ spc () ++ - str "is not allowed" + str "is not allowed." -let error_not_mutual_in_scheme () = - str "Induction schemes are concerned only with distinct mutually inductive types" +let error_not_mutual_in_scheme ind ind' = + if ind = ind' then + str "The inductive type " ++ pr_inductive (Global.env()) ind ++ + str "occurs twice." + else + str "The inductive types " ++ pr_inductive (Global.env()) ind ++ spc () ++ + str "and" ++ spc () ++ pr_inductive (Global.env()) ind' ++ spc () ++ + str "are not mutually defined." (* Inductive constructions errors *) let explain_inductive_error = function | NonPos (env,c,v) -> error_non_strictly_positive env c v | NotEnoughArgs (env,c,v) -> error_ill_formed_inductive env c v - | NotConstructor (env,c,v) -> error_ill_formed_constructor env c v + | NotConstructor (env,id,c,v,n,m) -> + error_ill_formed_constructor env id c v n m | NonPar (env,c,n,v1,v2) -> error_bad_ind_parameters env c n v1 v2 | SameNamesTypes id -> error_same_names_types id - | SameNamesConstructors (id,cid) -> error_same_names_constructors id cid + | SameNamesConstructors id -> error_same_names_constructors id | SameNamesOverlap idl -> error_same_names_overlap idl | NotAnArity id -> error_not_an_arity id | BadEntry -> error_bad_entry () @@ -604,54 +685,54 @@ let explain_recursion_scheme_error = function | NotAllowedCaseAnalysis (dep,k,i) -> error_not_allowed_case_analysis dep k i | BadInduction (dep,indid,kind) -> error_bad_induction dep indid kind - | NotMutualInScheme -> error_not_mutual_in_scheme () + | NotMutualInScheme (ind,ind')-> error_not_mutual_in_scheme ind ind' (* Pattern-matching errors *) -let explain_bad_pattern ctx cstr ty = - let ctx = make_all_name_different ctx in - let pt = pr_lconstr_env ctx ty in - let pc = pr_constructor ctx cstr in - str "Found the constructor " ++ pc ++ brk(1,1) ++ - str "while matching a term of type " ++ pt ++ brk(1,1) ++ - str "which is not an inductive type" - -let explain_bad_constructor ctx cstr ind = - let pi = pr_inductive ctx ind in -(* let pc = pr_constructor ctx cstr in*) - let pt = pr_inductive ctx (inductive_of_constructor cstr) in - str "Found a constructor of inductive type " ++ pt ++ brk(1,1) ++ - str "while a constructor of " ++ pi ++ brk(1,1) ++ - str "is expected" +let explain_bad_pattern env cstr ty = + let env = make_all_name_different env in + let pt = pr_lconstr_env env ty in + let pc = pr_constructor env cstr in + str "Found the constructor " ++ pc ++ brk(1,1) ++ + str "while matching a term of type " ++ pt ++ brk(1,1) ++ + str "which is not an inductive type." + +let explain_bad_constructor env cstr ind = + let pi = pr_inductive env ind in +(* let pc = pr_constructor env cstr in*) + let pt = pr_inductive env (inductive_of_constructor cstr) in + str "Found a constructor of inductive type " ++ pt ++ brk(1,1) ++ + str "while a constructor of " ++ pi ++ brk(1,1) ++ + str "is expected." let decline_string n s = if n = 0 then "no "^s else if n = 1 then "1 "^s else (string_of_int n^" "^s^"s") -let explain_wrong_numarg_constructor ctx cstr n = - str "The constructor " ++ pr_constructor ctx cstr ++ - str " expects " ++ str (decline_string n "argument") +let explain_wrong_numarg_constructor env cstr n = + str "The constructor " ++ pr_constructor env cstr ++ + str " expects " ++ str (decline_string n "argument") ++ str "." -let explain_wrong_numarg_inductive ctx ind n = - str "The inductive type " ++ pr_inductive ctx ind ++ - str " expects " ++ str (decline_string n "argument") +let explain_wrong_numarg_inductive env ind n = + str "The inductive type " ++ pr_inductive env ind ++ + str " expects " ++ str (decline_string n "argument") ++ str "." -let explain_wrong_predicate_arity ctx pred nondep_arity dep_arity= - let ctx = make_all_name_different ctx in - let pp = pr_lconstr_env ctx pred in +let explain_wrong_predicate_arity env pred nondep_arity dep_arity= + let env = make_all_name_different env in + let pp = pr_lconstr_env env pred in str "The elimination predicate " ++ spc () ++ pp ++ fnl () ++ - str "should be of arity" ++ spc () ++ - pr_lconstr_env ctx nondep_arity ++ spc () ++ - str "(for non dependent case) or" ++ - spc () ++ pr_lconstr_env ctx dep_arity ++ spc () ++ str "(for dependent case)." - -let explain_needs_inversion ctx x t = - let ctx = make_all_name_different ctx in - let px = pr_lconstr_env ctx x in - let pt = pr_lconstr_env ctx t in - str "Sorry, I need inversion to compile pattern matching of term " ++ - px ++ str " of type: " ++ pt + str "should be of arity" ++ spc () ++ + pr_lconstr_env env nondep_arity ++ spc () ++ + str "(for non dependent case) or" ++ + spc () ++ pr_lconstr_env env dep_arity ++ spc () ++ str "(for dependent case)." + +let explain_needs_inversion env x t = + let env = make_all_name_different env in + let px = pr_lconstr_env env x in + let pt = pr_lconstr_env env t in + str "Sorry, I need inversion to compile pattern matching on term " ++ + px ++ str " of type: " ++ pt ++ str "." let explain_unused_clause env pats = (* Without localisation @@ -659,24 +740,24 @@ let explain_unused_clause env pats = (str ("Unused clause with pattern"^s) ++ spc () ++ hov 0 (prlist_with_sep pr_spc pr_cases_pattern pats) ++ str ")") *) - str "This clause is redundant" + str "This clause is redundant." let explain_non_exhaustive env pats = - let s = if List.length pats > 1 then "s" else "" in - str ("Non exhaustive pattern-matching: no clause found for pattern"^s) ++ + str "Non exhaustive pattern-matching: no clause found for " ++ + str (plural (List.length pats) "pattern") ++ spc () ++ hov 0 (prlist_with_sep pr_spc pr_cases_pattern pats) -let explain_cannot_infer_predicate ctx typs = - let ctx = make_all_name_different ctx in +let explain_cannot_infer_predicate env typs = + let env = make_all_name_different env in let pr_branch (cstr,typ) = let cstr,_ = decompose_app cstr in - str "For " ++ pr_lconstr_env ctx cstr ++ str " : " ++ pr_lconstr_env ctx typ + str "For " ++ pr_lconstr_env env cstr ++ str ": " ++ pr_lconstr_env env typ in str "Unable to unify the types found in the branches:" ++ spc () ++ hov 0 (prlist_with_sep pr_fnl pr_branch (Array.to_list typs)) let explain_pattern_matching_error env = function - | BadPattern (c,t) -> + | BadPattern (c,t) -> explain_bad_pattern env c t | BadConstructor (c,ind) -> explain_bad_constructor env c ind @@ -697,6 +778,6 @@ let explain_pattern_matching_error env = function let explain_reduction_tactic_error = function | Tacred.InvalidAbstraction (env,c,(env',e)) -> - str "The abstracted term" ++ spc() ++ pr_lconstr_env_at_top env c ++ - spc() ++ str "is not well typed." ++ fnl () ++ + str "The abstracted term" ++ spc () ++ pr_lconstr_env_at_top env c ++ + spc () ++ str "is not well typed." ++ fnl () ++ explain_type_error env' e |