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

Proof steps:
state_before: α : Type u_1
M : Matroid α
B B' I J D X : Set α
e f : α
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 B'✝ I J D X : Set α
e f : α
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: obtain ⟨B', hB', hIB'⟩ := hI.exists_base_superset
state_before: case intro.intro
α : Type u_1
M : Matroid α
B B'✝ I J D X : Set α
e f : α
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 B'✝ I J D X : Set α
e f : α
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: have hcard := hB'.encard_diff_comm hB
state_before: case intro.intro
α : Type u_1
M : Matroid α
B B'✝ I J D X : Set α
e f : α
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 B'✝ I J D X : Set α
e f : α
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: 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 B'✝ I J D X : Set α
e f : α
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 B'✝ I J D X : Set α
e f : α
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 B'✝ I J D X : Set α
e f : α
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: obtain ⟨hfB, (h | h)⟩ := hIB'
state_before: case intro.intro.intro.inr
α : Type u_1
M : Matroid α
B B'✝ I J D X : Set α
e f : α
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 B'✝ I J D X : Set α
e f : α
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: rw [h, encard_singleton, encard_eq_one] at hcard
state_before: case intro.intro.intro.inr
α : Type u_1
M : Matroid α
B B'✝ I J D X : Set α
e f : α
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 B'✝ I J D X : Set α
e f : α
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 ⟨x, hx⟩ := hcard
state_before: case intro.intro.intro.inr.intro
α : Type u_1
M : Matroid α
B B'✝ I J D X : Set α
e f : α
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 B'✝ I J D X : Set α
e f : α
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: obtain (rfl : f = x) := hx.subset ⟨hfB, hf⟩
state_before: case intro.intro.intro.inr.intro
α : Type u_1
M : Matroid α
B B'✝ I J D X : Set α
e f : α
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 B'✝ I J D X : Set α
e f : α
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: 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 B'✝ I J D X : Set α
e f : α
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: exact hB'