Theorem: Matroid.existsMaximalSubsetProperty_of_bdd
File: Mathlib/Data/Matroid/IndepAxioms.lean

Proof steps:
state_before: α : Type u_1
I B X✝ : Set α
P : Set α → Prop
hP : ∃ n, ∀ (Y : Set α), P Y → Y.encard ≤ ↑n
X : Set α
⊢ ExistsMaximalSubsetProperty P X
state_after: case intro
α : Type u_1
I B X✝ : Set α
P : Set α → Prop
X : Set α
n : ℕ
hP : ∀ (Y : Set α), P Y → Y.encard ≤ ↑n
⊢ ExistsMaximalSubsetProperty P X
tactic: obtain ⟨n, hP⟩ := hP
state_before: case intro
α : Type u_1
I B X✝ : Set α
P : Set α → Prop
X : Set α
n : ℕ
hP : ∀ (Y : Set α), P Y → Y.encard ≤ ↑n
⊢ ExistsMaximalSubsetProperty P X
state_after: case intro
α : Type u_1
I✝ B X✝ : Set α
P : Set α → Prop
X : Set α
n : ℕ
hP : ∀ (Y : Set α), P Y → Y.encard ≤ ↑n
I : Set α
hI : P I
hIX : I ⊆ X
⊢ (maximals (fun x x_1 => x ⊆ x_1) {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}).Nonempty
tactic: rintro I hI hIX
state_before: case intro
α : Type u_1
I✝ B X✝ : Set α
P : Set α → Prop
X : Set α
n : ℕ
hP : ∀ (Y : Set α), P Y → Y.encard ≤ ↑n
I : Set α
hI : P I
hIX : I ⊆ X
⊢ (maximals (fun x x_1 => x ⊆ x_1) {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}).Nonempty
state_after: case intro
α : Type u_1
I✝ B X✝ : Set α
P : Set α → Prop
X : Set α
n : ℕ
hP : ∀ (Y : Set α), P Y → Y.encard ≤ ↑n
I : Set α
hI : P I
hIX : I ⊆ X
hfin : (ncard '' {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}).Finite
⊢ (maximals (fun x x_1 => x ⊆ x_1) {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}).Nonempty
tactic: have hfin : Set.Finite (ncard '' {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}) := by
    rw [finite_iff_bddAbove, bddAbove_def]
    simp_rw [ENat.le_coe_iff] at hP
    use n
    rintro x ⟨Y, ⟨hY,-,-⟩, rfl⟩
    obtain ⟨n₀, heq, hle⟩ := hP Y hY
    rwa [ncard_def, heq, ENat.toNat_coe]
state_before: case intro
α : Type u_1
I✝ B X✝ : Set α
P : Set α → Prop
X : Set α
n : ℕ
hP : ∀ (Y : Set α), P Y → Y.encard ≤ ↑n
I : Set α
hI : P I
hIX : I ⊆ X
hfin : (ncard '' {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}).Finite
⊢ (maximals (fun x x_1 => x ⊆ x_1) {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}).Nonempty
state_after: case intro.intro.intro
α : Type u_1
I✝ B X✝ : Set α
P : Set α → Prop
X : Set α
n : ℕ
hP : ∀ (Y : Set α), P Y → Y.encard ≤ ↑n
I : Set α
hI : P I
hIX : I ⊆ X
hfin : (ncard '' {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}).Finite
Y : Set α
hY : Y ∈ {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}
hY' : ∀ a' ∈ {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}, Y.ncard ≤ a'.ncard → Y.ncard = a'.ncard
⊢ (maximals (fun x x_1 => x ⊆ x_1) {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}).Nonempty
tactic: obtain ⟨Y, hY, hY'⟩ := Finite.exists_maximal_wrt' ncard _ hfin ⟨I, hI, rfl.subset, hIX⟩
state_before: case intro.intro.intro
α : Type u_1
I✝ B X✝ : Set α
P : Set α → Prop
X : Set α
n : ℕ
hP : ∀ (Y : Set α), P Y → Y.encard ≤ ↑n
I : Set α
hI : P I
hIX : I ⊆ X
hfin : (ncard '' {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}).Finite
Y : Set α
hY : Y ∈ {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}
hY' : ∀ a' ∈ {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}, Y.ncard ≤ a'.ncard → Y.ncard = a'.ncard
⊢ (maximals (fun x x_1 => x ⊆ x_1) {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}).Nonempty
state_after: case intro.intro.intro
α : Type u_1
I✝ B X✝ : Set α
P : Set α → Prop
X : Set α
n : ℕ
hP : ∀ (Y : Set α), P Y → Y.encard ≤ ↑n
I : Set α
hI : P I
hIX : I ⊆ X
hfin : (ncard '' {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}).Finite
Y : Set α
hY : Y ∈ {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}
hY' : ∀ a' ∈ {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}, Y.ncard ≤ a'.ncard → Y.ncard = a'.ncard
J : Set α
x✝ : J ∈ {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}
hYJ : Y ⊆ J
hJ : P J
hIJ : I ⊆ J
hJX : J ⊆ X
⊢ J ⊆ Y
tactic: refine ⟨Y, hY, fun J ⟨hJ, hIJ, hJX⟩ (hYJ : Y ⊆ J) ↦ (?_ : J ⊆ Y)⟩
state_before: case intro.intro.intro
α : Type u_1
I✝ B X✝ : Set α
P : Set α → Prop
X : Set α
n : ℕ
hP : ∀ (Y : Set α), P Y → Y.encard ≤ ↑n
I : Set α
hI : P I
hIX : I ⊆ X
hfin : (ncard '' {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}).Finite
Y : Set α
hY : Y ∈ {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}
hY' : ∀ a' ∈ {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}, Y.ncard ≤ a'.ncard → Y.ncard = a'.ncard
J : Set α
x✝ : J ∈ {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}
hYJ : Y ⊆ J
hJ : P J
hIJ : I ⊆ J
hJX : J ⊆ X
⊢ J ⊆ Y
state_after: case intro.intro.intro
α : Type u_1
I✝ B X✝ : Set α
P : Set α → Prop
X : Set α
n : ℕ
hP : ∀ (Y : Set α), P Y → Y.encard ≤ ↑n
I : Set α
hI : P I
hIX : I ⊆ X
hfin : (ncard '' {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}).Finite
Y : Set α
hY : Y ∈ {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}
hY' : ∀ a' ∈ {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}, Y.ncard ≤ a'.ncard → Y.ncard = a'.ncard
J : Set α
x✝ : J ∈ {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}
hYJ : Y ⊆ J
hJ : P J
hIJ : I ⊆ J
hJX : J ⊆ X
hJfin : J.Finite
⊢ J ⊆ Y
tactic: have hJfin := finite_of_encard_le_coe (hP J hJ)
state_before: case intro.intro.intro
α : Type u_1
I✝ B X✝ : Set α
P : Set α → Prop
X : Set α
n : ℕ
hP : ∀ (Y : Set α), P Y → Y.encard ≤ ↑n
I : Set α
hI : P I
hIX : I ⊆ X
hfin : (ncard '' {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}).Finite
Y : Set α
hY : Y ∈ {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}
hY' : ∀ a' ∈ {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}, Y.ncard ≤ a'.ncard → Y.ncard = a'.ncard
J : Set α
x✝ : J ∈ {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}
hYJ : Y ⊆ J
hJ : P J
hIJ : I ⊆ J
hJX : J ⊆ X
hJfin : J.Finite
⊢ J ⊆ Y
state_after: case intro.intro.intro
α : Type u_1
I✝ B X✝ : Set α
P : Set α → Prop
X : Set α
n : ℕ
hP : ∀ (Y : Set α), P Y → Y.encard ≤ ↑n
I : Set α
hI : P I
hIX : I ⊆ X
hfin : (ncard '' {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}).Finite
Y : Set α
hY : Y ∈ {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}
hY' : ∀ a' ∈ {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}, Y.ncard ≤ a'.ncard → Y.ncard = a'.ncard
J : Set α
x✝ : J ∈ {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}
hYJ : Y ⊆ J
hJ : P J
hIJ : I ⊆ J
hJX : J ⊆ X
hJfin : J.Finite
⊢ J.ncard ≤ Y.ncard
tactic: refine (eq_of_subset_of_ncard_le hYJ ?_ hJfin).symm.subset
state_before: case intro.intro.intro
α : Type u_1
I✝ B X✝ : Set α
P : Set α → Prop
X : Set α
n : ℕ
hP : ∀ (Y : Set α), P Y → Y.encard ≤ ↑n
I : Set α
hI : P I
hIX : I ⊆ X
hfin : (ncard '' {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}).Finite
Y : Set α
hY : Y ∈ {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}
hY' : ∀ a' ∈ {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}, Y.ncard ≤ a'.ncard → Y.ncard = a'.ncard
J : Set α
x✝ : J ∈ {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}
hYJ : Y ⊆ J
hJ : P J
hIJ : I ⊆ J
hJX : J ⊆ X
hJfin : J.Finite
⊢ J.ncard ≤ Y.ncard
state_after: no goals
tactic: rw [hY' J ⟨hJ, hIJ, hJX⟩ (ncard_le_ncard hYJ hJfin)]