-
Notifications
You must be signed in to change notification settings - Fork 470
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: explanations for
cases
applied to non-inductive types (#6378)
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)
- Loading branch information
Showing
2 changed files
with
71 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
/-! | ||
# 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 |