Theorem: Finset.Colex.IsInitSeg.exists_initSeg
File: Mathlib/Combinatorics/Colex.lean

Proof steps:
state_before: α : Type u_1
β : Type u_2
inst✝² : LinearOrder α
inst✝¹ : LinearOrder β
f : α → β
𝒜 𝒜₁ 𝒜₂ : Finset (Finset α)
s t u : Finset α
a b : α
r : ℕ
inst✝ : Fintype α
h𝒜 : IsInitSeg 𝒜 r
h𝒜₀ : 𝒜.Nonempty
⊢ ∃ s, s.card = r ∧ 𝒜 = initSeg s
state_after: α : Type u_1
β : Type u_2
inst✝² : LinearOrder α
inst✝¹ : LinearOrder β
f : α → β
𝒜 𝒜₁ 𝒜₂ : Finset (Finset α)
s t u : Finset α
a b : α
r : ℕ
inst✝ : Fintype α
h𝒜 : IsInitSeg 𝒜 r
h𝒜₀ : 𝒜.Nonempty
hs : 𝒜.sup' h𝒜₀ toColex ∈ ofColex ⁻¹' ↑𝒜
⊢ ∃ s, s.card = r ∧ 𝒜 = initSeg s
tactic: have hs := sup'_mem (ofColex ⁻¹' 𝒜) (LinearOrder.supClosed _) 𝒜 h𝒜₀ toColex
    (fun a ha ↦ by simpa using ha)
state_before: α : Type u_1
β : Type u_2
inst✝² : LinearOrder α
inst✝¹ : LinearOrder β
f : α → β
𝒜 𝒜₁ 𝒜₂ : Finset (Finset α)
s t u : Finset α
a b : α
r : ℕ
inst✝ : Fintype α
h𝒜 : IsInitSeg 𝒜 r
h𝒜₀ : 𝒜.Nonempty
hs : 𝒜.sup' h𝒜₀ toColex ∈ ofColex ⁻¹' ↑𝒜
⊢ ∃ s, s.card = r ∧ 𝒜 = initSeg s
state_after: α : Type u_1
β : Type u_2
inst✝² : LinearOrder α
inst✝¹ : LinearOrder β
f : α → β
𝒜 𝒜₁ 𝒜₂ : Finset (Finset α)
s t u : Finset α
a b : α
r : ℕ
inst✝ : Fintype α
h𝒜 : IsInitSeg 𝒜 r
h𝒜₀ : 𝒜.Nonempty
hs : 𝒜.sup' h𝒜₀ toColex ∈ ofColex ⁻¹' ↑𝒜
⊢ 𝒜 = initSeg (𝒜.sup' h𝒜₀ toColex).ofColex
tactic: refine ⟨_, h𝒜.1 hs, ?_⟩
state_before: α : Type u_1
β : Type u_2
inst✝² : LinearOrder α
inst✝¹ : LinearOrder β
f : α → β
𝒜 𝒜₁ 𝒜₂ : Finset (Finset α)
s t u : Finset α
a b : α
r : ℕ
inst✝ : Fintype α
h𝒜 : IsInitSeg 𝒜 r
h𝒜₀ : 𝒜.Nonempty
hs : 𝒜.sup' h𝒜₀ toColex ∈ ofColex ⁻¹' ↑𝒜
⊢ 𝒜 = initSeg (𝒜.sup' h𝒜₀ toColex).ofColex
state_after: case a
α : Type u_1
β : Type u_2
inst✝² : LinearOrder α
inst✝¹ : LinearOrder β
f : α → β
𝒜 𝒜₁ 𝒜₂ : Finset (Finset α)
s t✝ u : Finset α
a b : α
r : ℕ
inst✝ : Fintype α
h𝒜 : IsInitSeg 𝒜 r
h𝒜₀ : 𝒜.Nonempty
hs : 𝒜.sup' h𝒜₀ toColex ∈ ofColex ⁻¹' ↑𝒜
t : Finset α
⊢ t ∈ 𝒜 ↔ t ∈ initSeg (𝒜.sup' h𝒜₀ toColex).ofColex
tactic: ext t
state_before: case a
α : Type u_1
β : Type u_2
inst✝² : LinearOrder α
inst✝¹ : LinearOrder β
f : α → β
𝒜 𝒜₁ 𝒜₂ : Finset (Finset α)
s t✝ u : Finset α
a b : α
r : ℕ
inst✝ : Fintype α
h𝒜 : IsInitSeg 𝒜 r
h𝒜₀ : 𝒜.Nonempty
hs : 𝒜.sup' h𝒜₀ toColex ∈ ofColex ⁻¹' ↑𝒜
t : Finset α
⊢ t ∈ 𝒜 ↔ t ∈ initSeg (𝒜.sup' h𝒜₀ toColex).ofColex
state_after: case a
α : Type u_1
β : Type u_2
inst✝² : LinearOrder α
inst✝¹ : LinearOrder β
f : α → β
𝒜 𝒜₁ 𝒜₂ : Finset (Finset α)
s t✝ u : Finset α
a b : α
r : ℕ
inst✝ : Fintype α
h𝒜 : IsInitSeg 𝒜 r
h𝒜₀ : 𝒜.Nonempty
hs : 𝒜.sup' h𝒜₀ toColex ∈ ofColex ⁻¹' ↑𝒜
t : Finset α
⊢ t ∈ 𝒜 ↔ (𝒜.sup' h𝒜₀ toColex).ofColex.card = t.card ∧ { ofColex := t } ≤ { ofColex := (𝒜.sup' h𝒜₀ toColex).ofColex }
tactic: rw [mem_initSeg]
state_before: case a
α : Type u_1
β : Type u_2
inst✝² : LinearOrder α
inst✝¹ : LinearOrder β
f : α → β
𝒜 𝒜₁ 𝒜₂ : Finset (Finset α)
s t✝ u : Finset α
a b : α
r : ℕ
inst✝ : Fintype α
h𝒜 : IsInitSeg 𝒜 r
h𝒜₀ : 𝒜.Nonempty
hs : 𝒜.sup' h𝒜₀ toColex ∈ ofColex ⁻¹' ↑𝒜
t : Finset α
⊢ t ∈ 𝒜 ↔ (𝒜.sup' h𝒜₀ toColex).ofColex.card = t.card ∧ { ofColex := t } ≤ { ofColex := (𝒜.sup' h𝒜₀ toColex).ofColex }
state_after: case a.refine_1
α : Type u_1
β : Type u_2
inst✝² : LinearOrder α
inst✝¹ : LinearOrder β
f : α → β
𝒜 𝒜₁ 𝒜₂ : Finset (Finset α)
s t✝ u : Finset α
a b : α
r : ℕ
inst✝ : Fintype α
h𝒜 : IsInitSeg 𝒜 r
h𝒜₀ : 𝒜.Nonempty
hs : 𝒜.sup' h𝒜₀ toColex ∈ ofColex ⁻¹' ↑𝒜
t : Finset α
p : t ∈ 𝒜
⊢ (𝒜.sup' h𝒜₀ toColex).ofColex.card = t.card ∧ { ofColex := t } ≤ { ofColex := (𝒜.sup' h𝒜₀ toColex).ofColex }

case a.refine_2
α : Type u_1
β : Type u_2
inst✝² : LinearOrder α
inst✝¹ : LinearOrder β
f : α → β
𝒜 𝒜₁ 𝒜₂ : Finset (Finset α)
s t✝ u : Finset α
a b : α
r : ℕ
inst✝ : Fintype α
h𝒜 : IsInitSeg 𝒜 r
h𝒜₀ : 𝒜.Nonempty
hs : 𝒜.sup' h𝒜₀ toColex ∈ ofColex ⁻¹' ↑𝒜
t : Finset α
⊢ (𝒜.sup' h𝒜₀ toColex).ofColex.card = t.card ∧ { ofColex := t } ≤ { ofColex := (𝒜.sup' h𝒜₀ toColex).ofColex } → t ∈ 𝒜
tactic: refine ⟨fun p ↦ ?_, ?_⟩
state_before: case a.refine_2
α : Type u_1
β : Type u_2
inst✝² : LinearOrder α
inst✝¹ : LinearOrder β
f : α → β
𝒜 𝒜₁ 𝒜₂ : Finset (Finset α)
s t✝ u : Finset α
a b : α
r : ℕ
inst✝ : Fintype α
h𝒜 : IsInitSeg 𝒜 r
h𝒜₀ : 𝒜.Nonempty
hs : 𝒜.sup' h𝒜₀ toColex ∈ ofColex ⁻¹' ↑𝒜
t : Finset α
⊢ (𝒜.sup' h𝒜₀ toColex).ofColex.card = t.card ∧ { ofColex := t } ≤ { ofColex := (𝒜.sup' h𝒜₀ toColex).ofColex } → t ∈ 𝒜
state_after: case a.refine_2.intro
α : Type u_1
β : Type u_2
inst✝² : LinearOrder α
inst✝¹ : LinearOrder β
f : α → β
𝒜 𝒜₁ 𝒜₂ : Finset (Finset α)
s t✝ u : Finset α
a b : α
r : ℕ
inst✝ : Fintype α
h𝒜 : IsInitSeg 𝒜 r
h𝒜₀ : 𝒜.Nonempty
hs : 𝒜.sup' h𝒜₀ toColex ∈ ofColex ⁻¹' ↑𝒜
t : Finset α
cards : (𝒜.sup' h𝒜₀ toColex).ofColex.card = t.card
le : { ofColex := t } ≤ { ofColex := (𝒜.sup' h𝒜₀ toColex).ofColex }
⊢ t ∈ 𝒜
tactic: rintro ⟨cards, le⟩
state_before: case a.refine_2.intro
α : Type u_1
β : Type u_2
inst✝² : LinearOrder α
inst✝¹ : LinearOrder β
f : α → β
𝒜 𝒜₁ 𝒜₂ : Finset (Finset α)
s t✝ u : Finset α
a b : α
r : ℕ
inst✝ : Fintype α
h𝒜 : IsInitSeg 𝒜 r
h𝒜₀ : 𝒜.Nonempty
hs : 𝒜.sup' h𝒜₀ toColex ∈ ofColex ⁻¹' ↑𝒜
t : Finset α
cards : (𝒜.sup' h𝒜₀ toColex).ofColex.card = t.card
le : { ofColex := t } ≤ { ofColex := (𝒜.sup' h𝒜₀ toColex).ofColex }
⊢ t ∈ 𝒜
state_after: case a.refine_2.intro.inl
α : Type u_1
β : Type u_2
inst✝² : LinearOrder α
inst✝¹ : LinearOrder β
f : α → β
𝒜 𝒜₁ 𝒜₂ : Finset (Finset α)
s t✝ u : Finset α
a b : α
r : ℕ
inst✝ : Fintype α
h𝒜 : IsInitSeg 𝒜 r
h𝒜₀ : 𝒜.Nonempty
hs : 𝒜.sup' h𝒜₀ toColex ∈ ofColex ⁻¹' ↑𝒜
t : Finset α
cards : (𝒜.sup' h𝒜₀ toColex).ofColex.card = t.card
le : { ofColex := t } ≤ { ofColex := (𝒜.sup' h𝒜₀ toColex).ofColex }
p : { ofColex := t } = { ofColex := (𝒜.sup' h𝒜₀ toColex).ofColex }
⊢ t ∈ 𝒜

case a.refine_2.intro.inr
α : Type u_1
β : Type u_2
inst✝² : LinearOrder α
inst✝¹ : LinearOrder β
f : α → β
𝒜 𝒜₁ 𝒜₂ : Finset (Finset α)
s t✝ u : Finset α
a b : α
r : ℕ
inst✝ : Fintype α
h𝒜 : IsInitSeg 𝒜 r
h𝒜₀ : 𝒜.Nonempty
hs : 𝒜.sup' h𝒜₀ toColex ∈ ofColex ⁻¹' ↑𝒜
t : Finset α
cards : (𝒜.sup' h𝒜₀ toColex).ofColex.card = t.card
le : { ofColex := t } ≤ { ofColex := (𝒜.sup' h𝒜₀ toColex).ofColex }
p : { ofColex := t } < { ofColex := (𝒜.sup' h𝒜₀ toColex).ofColex }
⊢ t ∈ 𝒜
tactic: obtain p | p := le.eq_or_lt