/-! # 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