Theorem: Set.ncard_le_one_iff_eq
File: Mathlib/Data/Set/Card.lean

tactic: obtain rfl | ⟨x, hx⟩ := s.eq_empty_or_nonempty
state_before: α : Type u_1
β : Type u_2
s t : Set α
f : α → β
hs : autoParam s.Finite _auto✝
⊢ s.ncard ≤ 1 ↔ s = ∅ ∨ ∃ a, s = {a}
state_after: case inl
α : Type u_1
β : Type u_2
t : Set α
f : α → β
hs : autoParam ∅.Finite _auto✝
⊢ ∅.ncard ≤ 1 ↔ ∅ = ∅ ∨ ∃ a, ∅ = {a}

case inr.intro
α : Type u_1
β : Type u_2
s t : Set α
f : α → β
hs : autoParam s.Finite _auto✝
x : α
hx : x ∈ s
⊢ s.ncard ≤ 1 ↔ s = ∅ ∨ ∃ a, s = {a}

tactic: rw [ncard_le_one_iff hs]
state_before: case inr.intro
α : Type u_1
β : Type u_2
s t : Set α
f : α → β
hs : autoParam s.Finite _auto✝
x : α
hx : x ∈ s
⊢ s.ncard ≤ 1 ↔ s = ∅ ∨ ∃ a, s = {a}
state_after: case inr.intro
α : Type u_1
β : Type u_2
s t : Set α
f : α → β
hs : autoParam s.Finite _auto✝
x : α
hx : x ∈ s
⊢ (∀ {a b : α}, a ∈ s → b ∈ s → a = b) ↔ s = ∅ ∨ ∃ a, s = {a}

tactic: refine ⟨fun h ↦ Or.inr ⟨x, (singleton_subset_iff.mpr hx).antisymm' fun y hy ↦ h hy hx⟩, ?_⟩
state_before: case inr.intro
α : Type u_1
β : Type u_2
s t : Set α
f : α → β
hs : autoParam s.Finite _auto✝
x : α
hx : x ∈ s
⊢ (∀ {a b : α}, a ∈ s → b ∈ s → a = b) ↔ s = ∅ ∨ ∃ a, s = {a}
state_after: case inr.intro
α : Type u_1
β : Type u_2
s t : Set α
f : α → β
hs : autoParam s.Finite _auto✝
x : α
hx : x ∈ s
⊢ (s = ∅ ∨ ∃ a, s = {a}) → ∀ {a b : α}, a ∈ s → b ∈ s → a = b

tactic: rintro (rfl | ⟨a, rfl⟩)
state_before: case inr.intro
α : Type u_1
β : Type u_2
s t : Set α
f : α → β
hs : autoParam s.Finite _auto✝
x : α
hx : x ∈ s
⊢ (s = ∅ ∨ ∃ a, s = {a}) → ∀ {a b : α}, a ∈ s → b ∈ s → a = b
state_after: case inr.intro.inl
α : Type u_1
β : Type u_2
t : Set α
f : α → β
x : α
hs : autoParam ∅.Finite _auto✝
hx : x ∈ ∅
⊢ ∀ {a b : α}, a ∈ ∅ → b ∈ ∅ → a = b

case inr.intro.inr.intro
α : Type u_1
β : Type u_2
t : Set α
f : α → β
x a : α
hs : autoParam {a}.Finite _auto✝
hx : x ∈ {a}
⊢ ∀ {a_1 b : α}, a_1 ∈ {a} → b ∈ {a} → a_1 = b

tactic: simp_rw [mem_singleton_iff] at hx ⊢
state_before: case inr.intro.inr.intro
α : Type u_1
β : Type u_2
t : Set α
f : α → β
x a : α
hs : autoParam {a}.Finite _auto✝
hx : x ∈ {a}
⊢ ∀ {a_1 b : α}, a_1 ∈ {a} → b ∈ {a} → a_1 = b
state_after: case inr.intro.inr.intro
α : Type u_1
β : Type u_2
t : Set α
f : α → β
x a : α
hs : autoParam {a}.Finite _auto✝
hx : x = a
⊢ ∀ {a_1 b : α}, a_1 = a → b = a → a_1 = b

tactic: subst hx
state_before: case inr.intro.inr.intro
α : Type u_1
β : Type u_2
t : Set α
f : α → β
x a : α
hs : autoParam {a}.Finite _auto✝
hx : x = a
⊢ ∀ {a_1 b : α}, a_1 = a → b = a → a_1 = b
state_after: case inr.intro.inr.intro
α : Type u_1
β : Type u_2
t : Set α
f : α → β
x : α
hs : autoParam {x}.Finite _auto✝
⊢ ∀ {a b : α}, a = x → b = x → a = b

tactic: simp only [forall_eq_apply_imp_iff, imp_self, implies_true]
state_before: case inr.intro.inr.intro
α : Type u_1
β : Type u_2
t : Set α
f : α → β
x : α
hs : autoParam {x}.Finite _auto✝
⊢ ∀ {a b : α}, a = x → b = x → a = b
state_after: no goals

tactic: exact iff_of_true (by simp) (Or.inl rfl)
state_before: case inl
α : Type u_1
β : Type u_2
t : Set α
f : α → β
hs : autoParam ∅.Finite _auto✝
⊢ ∅.ncard ≤ 1 ↔ ∅ = ∅ ∨ ∃ a, ∅ = {a}
state_after: no goals

tactic: simp
state_before: α : Type u_1
β : Type u_2
t : Set α
f : α → β
hs : autoParam ∅.Finite _auto✝
⊢ ∅.ncard ≤ 1
state_after: no goals

tactic: exact (not_mem_empty _ hx).elim
state_before: case inr.intro.inl
α : Type u_1
β : Type u_2
t : Set α
f : α → β
x : α
hs : autoParam ∅.Finite _auto✝
hx : x ∈ ∅
⊢ ∀ {a b : α}, a ∈ ∅ → b ∈ ∅ → a = b
state_after: no goals