Theorem: Matroid.Base.exchange_base_of_indep
File: Mathlib/Data/Matroid/Basic.lean

tactic: obtain ⟨B', hB', hIB'⟩ := hI.exists_base_superset
state_before: α : Type u_1
M : Matroid α
B : Set α
f e : α
hB : M.Base B
hf : f ∉ B
hI : M.Indep (insert f (B \ {e}))
⊢ M.Base (insert f (B \ {e}))
state_after: case intro.intro
α : Type u_1
M : Matroid α
B : Set α
f e : α
hB : M.Base B
hf : f ∉ B
hI : M.Indep (insert f (B \ {e}))
B' : Set α
hB' : M.Base B'
hIB' : insert f (B \ {e}) ⊆ B'
⊢ M.Base (insert f (B \ {e}))

tactic: have hcard := hB'.encard_diff_comm hB
state_before: case intro.intro
α : Type u_1
M : Matroid α
B : Set α
f e : α
hB : M.Base B
hf : f ∉ B
hI : M.Indep (insert f (B \ {e}))
B' : Set α
hB' : M.Base B'
hIB' : insert f (B \ {e}) ⊆ B'
⊢ M.Base (insert f (B \ {e}))
state_after: case intro.intro
α : Type u_1
M : Matroid α
B : Set α
f e : α
hB : M.Base B
hf : f ∉ B
hI : M.Indep (insert f (B \ {e}))
B' : Set α
hB' : M.Base B'
hIB' : insert f (B \ {e}) ⊆ B'
hcard : (B' \ B).encard = (B \ B').encard
⊢ M.Base (insert f (B \ {e}))

tactic: rw [insert_subset_iff, ← diff_eq_empty, diff_diff_comm, diff_eq_empty, subset_singleton_iff_eq]
  at hIB'
state_before: case intro.intro
α : Type u_1
M : Matroid α
B : Set α
f e : α
hB : M.Base B
hf : f ∉ B
hI : M.Indep (insert f (B \ {e}))
B' : Set α
hB' : M.Base B'
hIB' : insert f (B \ {e}) ⊆ B'
hcard : (B' \ B).encard = (B \ B').encard
⊢ M.Base (insert f (B \ {e}))
state_after: case intro.intro
α : Type u_1
M : Matroid α
B : Set α
f e : α
hB : M.Base B
hf : f ∉ B
hI : M.Indep (insert f (B \ {e}))
B' : Set α
hB' : M.Base B'
hIB' : f ∈ B' ∧ (B \ B' = ∅ ∨ B \ B' = {e})
hcard : (B' \ B).encard = (B \ B').encard
⊢ M.Base (insert f (B \ {e}))

tactic: obtain ⟨hfB, (h | h)⟩ := hIB'
state_before: case intro.intro
α : Type u_1
M : Matroid α
B : Set α
f e : α
hB : M.Base B
hf : f ∉ B
hI : M.Indep (insert f (B \ {e}))
B' : Set α
hB' : M.Base B'
hIB' : f ∈ B' ∧ (B \ B' = ∅ ∨ B \ B' = {e})
hcard : (B' \ B).encard = (B \ B').encard
⊢ M.Base (insert f (B \ {e}))
state_after: case intro.intro.intro.inl
α : Type u_1
M : Matroid α
B : Set α
f e : α
hB : M.Base B
hf : f ∉ B
hI : M.Indep (insert f (B \ {e}))
B' : Set α
hB' : M.Base B'
hcard : (B' \ B).encard = (B \ B').encard
hfB : f ∈ B'
h : B \ B' = ∅
⊢ M.Base (insert f (B \ {e}))

case intro.intro.intro.inr
α : Type u_1
M : Matroid α
B : Set α
f e : α
hB : M.Base B
hf : f ∉ B
hI : M.Indep (insert f (B \ {e}))
B' : Set α
hB' : M.Base B'
hcard : (B' \ B).encard = (B \ B').encard
hfB : f ∈ B'
h : B \ B' = {e}
⊢ M.Base (insert f (B \ {e}))

tactic: rw [h, encard_singleton, encard_eq_one] at hcard
state_before: case intro.intro.intro.inr
α : Type u_1
M : Matroid α
B : Set α
f e : α
hB : M.Base B
hf : f ∉ B
hI : M.Indep (insert f (B \ {e}))
B' : Set α
hB' : M.Base B'
hcard : (B' \ B).encard = (B \ B').encard
hfB : f ∈ B'
h : B \ B' = {e}
⊢ M.Base (insert f (B \ {e}))
state_after: case intro.intro.intro.inr
α : Type u_1
M : Matroid α
B : Set α
f e : α
hB : M.Base B
hf : f ∉ B
hI : M.Indep (insert f (B \ {e}))
B' : Set α
hB' : M.Base B'
hcard : ∃ x, B' \ B = {x}
hfB : f ∈ B'
h : B \ B' = {e}
⊢ M.Base (insert f (B \ {e}))

tactic: obtain ⟨x, hx⟩ := hcard
state_before: case intro.intro.intro.inr
α : Type u_1
M : Matroid α
B : Set α
f e : α
hB : M.Base B
hf : f ∉ B
hI : M.Indep (insert f (B \ {e}))
B' : Set α
hB' : M.Base B'
hcard : ∃ x, B' \ B = {x}
hfB : f ∈ B'
h : B \ B' = {e}
⊢ M.Base (insert f (B \ {e}))
state_after: case intro.intro.intro.inr.intro
α : Type u_1
M : Matroid α
B : Set α
f e : α
hB : M.Base B
hf : f ∉ B
hI : M.Indep (insert f (B \ {e}))
B' : Set α
hB' : M.Base B'
hfB : f ∈ B'
h : B \ B' = {e}
x : α
hx : B' \ B = {x}
⊢ M.Base (insert f (B \ {e}))

tactic: obtain (rfl : f = x) := hx.subset ⟨hfB, hf⟩
state_before: case intro.intro.intro.inr.intro
α : Type u_1
M : Matroid α
B : Set α
f e : α
hB : M.Base B
hf : f ∉ B
hI : M.Indep (insert f (B \ {e}))
B' : Set α
hB' : M.Base B'
hfB : f ∈ B'
h : B \ B' = {e}
x : α
hx : B' \ B = {x}
⊢ M.Base (insert f (B \ {e}))
state_after: case intro.intro.intro.inr.intro
α : Type u_1
M : Matroid α
B : Set α
f e : α
hB : M.Base B
hf : f ∉ B
hI : M.Indep (insert f (B \ {e}))
B' : Set α
hB' : M.Base B'
hfB : f ∈ B'
h : B \ B' = {e}
hx : B' \ B = {f}
⊢ M.Base (insert f (B \ {e}))

tactic: simp_rw [← h, ← singleton_union, ← hx, sdiff_sdiff_right_self, inf_eq_inter, inter_comm B,
  diff_union_inter]
state_before: case intro.intro.intro.inr.intro
α : Type u_1
M : Matroid α
B : Set α
f e : α
hB : M.Base B
hf : f ∉ B
hI : M.Indep (insert f (B \ {e}))
B' : Set α
hB' : M.Base B'
hfB : f ∈ B'
h : B \ B' = {e}
hx : B' \ B = {f}
⊢ M.Base (insert f (B \ {e}))
state_after: case intro.intro.intro.inr.intro
α : Type u_1
M : Matroid α
B : Set α
f e : α
hB : M.Base B
hf : f ∉ B
hI : M.Indep (insert f (B \ {e}))
B' : Set α
hB' : M.Base B'
hfB : f ∈ B'
h : B \ B' = {e}
hx : B' \ B = {f}
⊢ M.Base B'

tactic: exact hB'
state_before: case intro.intro.intro.inr.intro
α : Type u_1
M : Matroid α
B : Set α
f e : α
hB : M.Base B
hf : f ∉ B
hI : M.Indep (insert f (B \ {e}))
B' : Set α
hB' : M.Base B'
hfB : f ∈ B'
h : B \ B' = {e}
hx : B' \ B = {f}
⊢ M.Base B'
state_after: no goals

tactic: rw [h, encard_empty, encard_eq_zero, eq_empty_iff_forall_not_mem] at hcard
state_before: case intro.intro.intro.inl
α : Type u_1
M : Matroid α
B : Set α
f e : α
hB : M.Base B
hf : f ∉ B
hI : M.Indep (insert f (B \ {e}))
B' : Set α
hB' : M.Base B'
hcard : (B' \ B).encard = (B \ B').encard
hfB : f ∈ B'
h : B \ B' = ∅
⊢ M.Base (insert f (B \ {e}))
state_after: case intro.intro.intro.inl
α : Type u_1
M : Matroid α
B : Set α
f e : α
hB : M.Base B
hf : f ∉ B
hI : M.Indep (insert f (B \ {e}))
B' : Set α
hB' : M.Base B'
hcard : ∀ (x : α), x ∉ B' \ B
hfB : f ∈ B'
h : B \ B' = ∅
⊢ M.Base (insert f (B \ {e}))

tactic: exact (hcard f ⟨hfB, hf⟩).elim
state_before: case intro.intro.intro.inl
α : Type u_1
M : Matroid α
B : Set α
f e : α
hB : M.Base B
hf : f ∉ B
hI : M.Indep (insert f (B \ {e}))
B' : Set α
hB' : M.Base B'
hcard : ∀ (x : α), x ∉ B' \ B
hfB : f ∈ B'
h : B \ B' = ∅
⊢ M.Base (insert f (B \ {e}))
state_after: no goals