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

tactic: obtain ⟨n, hP⟩ := hP
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: 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
⊢ 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: 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
⊢ (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: obtain ⟨Y, hY, hY'⟩ := Finite.exists_maximal_wrt' ncard _ hfin ⟨I, hI, rfl.subset, 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
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: 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
⊢ (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: 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
⊢ 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: 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 ⊆ 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: rw [hY' J ⟨hJ, hIJ, hJX⟩ (ncard_le_ncard hYJ hJfin)]
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 [finite_iff_bddAbove, bddAbove_def]
state_before: α : 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
⊢ (ncard '' {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}).Finite
state_after: α : 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
⊢ ∃ x, ∀ y ∈ ncard '' {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}, y ≤ x

tactic: simp_rw [ENat.le_coe_iff] at hP
state_before: α : 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
⊢ ∃ x, ∀ y ∈ ncard '' {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}, y ≤ x
state_after: α : Type u_1
I✝ B X✝ : Set α
P : Set α → Prop
X : Set α
n : ℕ
I : Set α
hI : P I
hIX : I ⊆ X
hP : ∀ (Y : Set α), P Y → ∃ n₀, Y.encard = ↑n₀ ∧ n₀ ≤ n
⊢ ∃ x, ∀ y ∈ ncard '' {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}, y ≤ x

tactic: use n
state_before: α : Type u_1
I✝ B X✝ : Set α
P : Set α → Prop
X : Set α
n : ℕ
I : Set α
hI : P I
hIX : I ⊆ X
hP : ∀ (Y : Set α), P Y → ∃ n₀, Y.encard = ↑n₀ ∧ n₀ ≤ n
⊢ ∃ x, ∀ y ∈ ncard '' {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}, y ≤ x
state_after: case h
α : Type u_1
I✝ B X✝ : Set α
P : Set α → Prop
X : Set α
n : ℕ
I : Set α
hI : P I
hIX : I ⊆ X
hP : ∀ (Y : Set α), P Y → ∃ n₀, Y.encard = ↑n₀ ∧ n₀ ≤ n
⊢ ∀ y ∈ ncard '' {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}, y ≤ n

tactic: rintro x ⟨Y, ⟨hY,-,-⟩, rfl⟩
state_before: case h
α : Type u_1
I✝ B X✝ : Set α
P : Set α → Prop
X : Set α
n : ℕ
I : Set α
hI : P I
hIX : I ⊆ X
hP : ∀ (Y : Set α), P Y → ∃ n₀, Y.encard = ↑n₀ ∧ n₀ ≤ n
⊢ ∀ y ∈ ncard '' {Y | P Y ∧ I ⊆ Y ∧ Y ⊆ X}, y ≤ n
state_after: case h.intro.intro.intro.intro
α : Type u_1
I✝ B X✝ : Set α
P : Set α → Prop
X : Set α
n : ℕ
I : Set α
hI : P I
hIX : I ⊆ X
hP : ∀ (Y : Set α), P Y → ∃ n₀, Y.encard = ↑n₀ ∧ n₀ ≤ n
Y : Set α
hY : P Y
⊢ Y.ncard ≤ n

tactic: obtain ⟨n₀, heq, hle⟩ := hP Y hY
state_before: case h.intro.intro.intro.intro
α : Type u_1
I✝ B X✝ : Set α
P : Set α → Prop
X : Set α
n : ℕ
I : Set α
hI : P I
hIX : I ⊆ X
hP : ∀ (Y : Set α), P Y → ∃ n₀, Y.encard = ↑n₀ ∧ n₀ ≤ n
Y : Set α
hY : P Y
⊢ Y.ncard ≤ n
state_after: case h.intro.intro.intro.intro.intro.intro
α : Type u_1
I✝ B X✝ : Set α
P : Set α → Prop
X : Set α
n : ℕ
I : Set α
hI : P I
hIX : I ⊆ X
hP : ∀ (Y : Set α), P Y → ∃ n₀, Y.encard = ↑n₀ ∧ n₀ ≤ n
Y : Set α
hY : P Y
n₀ : ℕ
heq : Y.encard = ↑n₀
hle : n₀ ≤ n
⊢ Y.ncard ≤ n

tactic: rwa [ncard_def, heq, ENat.toNat_coe]
state_before: case h.intro.intro.intro.intro.intro.intro
α : Type u_1
I✝ B X✝ : Set α
P : Set α → Prop
X : Set α
n : ℕ
I : Set α
hI : P I
hIX : I ⊆ X
hP : ∀ (Y : Set α), P Y → ∃ n₀, Y.encard = ↑n₀ ∧ n₀ ≤ n
Y : Set α
hY : P Y
n₀ : ℕ
heq : Y.encard = ↑n₀
hle : n₀ ≤ n
⊢ Y.ncard ≤ n
state_after: no goals