Theorem: Fintype.induction_subsingleton_or_nontrivial
File: Mathlib/Data/Fintype/Card.lean

tactic: obtain ⟨n, hn⟩ : ∃ n, Fintype.card α = n := ⟨Fintype.card α, rfl⟩
state_before: α✝ : Type ?u.86132
β : Type ?u.86135
γ : Type ?u.86138
P : (α : Type u_1) → [inst : Fintype α] → Prop
α : Type u_1
inst✝ : Fintype α
hbase : ∀ (α : Type u_1) [inst : Fintype α] [inst_1 : Subsingleton α], P α
hstep :
  ∀ (α : Type u_1) [inst : Fintype α] [inst_1 : Nontrivial α],
    (∀ (β : Type u_1) [inst_2 : Fintype β], card β < card α → P β) → P α
⊢ P α

tactic: induction' n using Nat.strong_induction_on with n ih generalizing α
state_before: case intro
α✝ : Type ?u.86132
β : Type ?u.86135
γ : Type ?u.86138
P : (α : Type u_1) → [inst : Fintype α] → Prop
α : Type u_1
inst✝ : Fintype α
hbase : ∀ (α : Type u_1) [inst : Fintype α] [inst_1 : Subsingleton α], P α
hstep :
  ∀ (α : Type u_1) [inst : Fintype α] [inst_1 : Nontrivial α],
    (∀ (β : Type u_1) [inst_2 : Fintype β], card β < card α → P β) → P α
n : ℕ
hn : card α = n
⊢ P α

tactic: cases' subsingleton_or_nontrivial α with hsing hnontriv
state_before: case intro.h
α✝¹ : Type ?u.86132
β : Type ?u.86135
γ : Type ?u.86138
P : (α : Type u_1) → [inst : Fintype α] → Prop
α✝ : Type u_1
inst✝¹ : Fintype α✝
hbase : ∀ (α : Type u_1) [inst : Fintype α] [inst_1 : Subsingleton α], P α
hstep :
  ∀ (α : Type u_1) [inst : Fintype α] [inst_1 : Nontrivial α],
    (∀ (β : Type u_1) [inst_2 : Fintype β], card β < card α → P β) → P α
n✝ : ℕ
hn✝ : card α✝ = n✝
n : ℕ
ih : ∀ (m : ℕ), m < n → ∀ (α : Type u_1) [inst : Fintype α], card α = m → P α
α : Type u_1
inst✝ : Fintype α
hn : card α = n
⊢ P α

tactic: apply hbase
state_before: case intro.h.inl
α✝¹ : Type ?u.86132
β : Type ?u.86135
γ : Type ?u.86138
P : (α : Type u_1) → [inst : Fintype α] → Prop
α✝ : Type u_1
inst✝¹ : Fintype α✝
hbase : ∀ (α : Type u_1) [inst : Fintype α] [inst_1 : Subsingleton α], P α
hstep :
  ∀ (α : Type u_1) [inst : Fintype α] [inst_1 : Nontrivial α],
    (∀ (β : Type u_1) [inst_2 : Fintype β], card β < card α → P β) → P α
n✝ : ℕ
hn✝ : card α✝ = n✝
n : ℕ
ih : ∀ (m : ℕ), m < n → ∀ (α : Type u_1) [inst : Fintype α], card α = m → P α
α : Type u_1
inst✝ : Fintype α
hn : card α = n
hsing : Subsingleton α
⊢ P α

tactic: apply hstep
state_before: case intro.h.inr
α✝¹ : Type ?u.86132
β : Type ?u.86135
γ : Type ?u.86138
P : (α : Type u_1) → [inst : Fintype α] → Prop
α✝ : Type u_1
inst✝¹ : Fintype α✝
hbase : ∀ (α : Type u_1) [inst : Fintype α] [inst_1 : Subsingleton α], P α
hstep :
  ∀ (α : Type u_1) [inst : Fintype α] [inst_1 : Nontrivial α],
    (∀ (β : Type u_1) [inst_2 : Fintype β], card β < card α → P β) → P α
n✝ : ℕ
hn✝ : card α✝ = n✝
n : ℕ
ih : ∀ (m : ℕ), m < n → ∀ (α : Type u_1) [inst : Fintype α], card α = m → P α
α : Type u_1
inst✝ : Fintype α
hn : card α = n
hnontriv : Nontrivial α
⊢ P α

tactic: intro β _ hlt
state_before: case intro.h.inr._ih
α✝¹ : Type ?u.86132
β : Type ?u.86135
γ : Type ?u.86138
P : (α : Type u_1) → [inst : Fintype α] → Prop
α✝ : Type u_1
inst✝¹ : Fintype α✝
hbase : ∀ (α : Type u_1) [inst : Fintype α] [inst_1 : Subsingleton α], P α
hstep :
  ∀ (α : Type u_1) [inst : Fintype α] [inst_1 : Nontrivial α],
    (∀ (β : Type u_1) [inst_2 : Fintype β], card β < card α → P β) → P α
n✝ : ℕ
hn✝ : card α✝ = n✝
n : ℕ
ih : ∀ (m : ℕ), m < n → ∀ (α : Type u_1) [inst : Fintype α], card α = m → P α
α : Type u_1
inst✝ : Fintype α
hn : card α = n
hnontriv : Nontrivial α
⊢ ∀ (β : Type u_1) [inst : Fintype β], card β < card α → P β

tactic: rw [hn] at hlt
state_before: case intro.h.inr._ih
α✝¹ : Type ?u.86132
β✝ : Type ?u.86135
γ : Type ?u.86138
P : (α : Type u_1) → [inst : Fintype α] → Prop
α✝ : Type u_1
inst✝² : Fintype α✝
hbase : ∀ (α : Type u_1) [inst : Fintype α] [inst_1 : Subsingleton α], P α
hstep :
  ∀ (α : Type u_1) [inst : Fintype α] [inst_1 : Nontrivial α],
    (∀ (β : Type u_1) [inst_2 : Fintype β], card β < card α → P β) → P α
n✝ : ℕ
hn✝ : card α✝ = n✝
n : ℕ
ih : ∀ (m : ℕ), m < n → ∀ (α : Type u_1) [inst : Fintype α], card α = m → P α
α : Type u_1
inst✝¹ : Fintype α
hn : card α = n
hnontriv : Nontrivial α
β : Type u_1
inst✝ : Fintype β
hlt : card β < card α
⊢ P β

tactic: exact ih (Fintype.card β) hlt _ rfl
state_before: case intro.h.inr._ih
α✝¹ : Type ?u.86132
β✝ : Type ?u.86135
γ : Type ?u.86138
P : (α : Type u_1) → [inst : Fintype α] → Prop
α✝ : Type u_1
inst✝² : Fintype α✝
hbase : ∀ (α : Type u_1) [inst : Fintype α] [inst_1 : Subsingleton α], P α
hstep :
  ∀ (α : Type u_1) [inst : Fintype α] [inst_1 : Nontrivial α],
    (∀ (β : Type u_1) [inst_2 : Fintype β], card β < card α → P β) → P α
n✝ : ℕ
hn✝ : card α✝ = n✝
n : ℕ
ih : ∀ (m : ℕ), m < n → ∀ (α : Type u_1) [inst : Fintype α], card α = m → P α
α : Type u_1
inst✝¹ : Fintype α
hn : card α = n
hnontriv : Nontrivial α
β : Type u_1
inst✝ : Fintype β
hlt : card β < n
⊢ P β