This PR adds an explanation to the error message when `cases` and `induction` are applied to a term whose type is not an inductive type. For `Prop`, these tactics now suggest the `by_cases` tactic. Example: ``` tactic 'cases' failed, major premise type is not an inductive type Prop Explanation: the 'cases' tactic is for constructor-based reasoning as well as for applying custom cases principles with a 'using' clause or a registered '@[cases_eliminator]' theorem. The above type neither is an inductive type nor has a registered theorem. Consider using the 'by_cases' tactic, which does true/false reasoning for propositions. ``` [Zulip discussion](https://leanprover.zulipchat.com/#narrow/channel/270676-lean4/topic/Improving.20the.20error.20for.20.60cases.20p.60.20when.20.60p.60.20is.20a.20proposition/near/488882682)
55 lines
1.7 KiB
Text
55 lines
1.7 KiB
Text
/-!
|
||
# Tests of the 'cases' tactic
|
||
-/
|
||
|
||
/-!
|
||
Error messages when not an inductive type.
|
||
-/
|
||
|
||
/--
|
||
error: tactic 'cases' failed, major premise type is not an inductive type
|
||
Prop
|
||
|
||
Explanation: the 'cases' tactic is for constructor-based reasoning as well as for applying custom
|
||
cases principles with a 'using' clause or a registered '@[cases_eliminator]' theorem. The above
|
||
type neither is an inductive type nor has a registered theorem.
|
||
|
||
Consider using the 'by_cases' tactic, which does true/false reasoning for propositions.
|
||
p : Prop
|
||
⊢ True
|
||
-/
|
||
#guard_msgs in
|
||
example (p : Prop) : True := by
|
||
cases p
|
||
|
||
/--
|
||
error: tactic 'cases' failed, major premise type is not an inductive type
|
||
Type
|
||
|
||
Explanation: the 'cases' tactic is for constructor-based reasoning as well as for applying custom
|
||
cases principles with a 'using' clause or a registered '@[cases_eliminator]' theorem. The above
|
||
type neither is an inductive type nor has a registered theorem.
|
||
|
||
Type universes are not inductive types, and type-constructor-based reasoning is not possible.
|
||
This is a strong limitation. According to Lean's underlying theory, the only provable
|
||
distinguishing feature of types is their cardinalities.
|
||
α : Type
|
||
⊢ True
|
||
-/
|
||
#guard_msgs in
|
||
example (α : Type) : True := by
|
||
cases α
|
||
|
||
/--
|
||
error: tactic 'cases' failed, major premise type is not an inductive type
|
||
Bool → Bool
|
||
|
||
Explanation: the 'cases' tactic is for constructor-based reasoning as well as for applying custom
|
||
cases principles with a 'using' clause or a registered '@[cases_eliminator]' theorem. The above
|
||
type neither is an inductive type nor has a registered theorem.
|
||
f : Bool → Bool
|
||
⊢ True
|
||
-/
|
||
#guard_msgs in
|
||
example (f : Bool → Bool) : True := by
|
||
cases f
|