-- Mathlib/Order/CompactlyGenerated/Basic.lean
theorem isCompactElement_iff.{u} {α : Type u} [CompleteLattice α] (k : α) :
    CompleteLattice.IsCompactElement k ↔
      ∀ (ι : Type u) (s : ι → α), k ≤ iSup s → ∃ t : Finset ι, k ≤ t.sup s

Proof state:
case mp
α : Type u
inst✝ : CompleteLattice α
k : α
H : IsCompactElement k
ι : Type u
s : ι → α
hs : k ≤ iSup s
⊢ ∃ t, k ≤ t.sup s

Tactic:
obtain ⟨t, ht, ht'⟩ := H (Set.range s) hs

Result:
case mp.intro.intro
α : Type u
inst✝ : CompleteLattice α
k : α
H : IsCompactElement k
ι : Type u
s : ι → α
hs : k ≤ iSup s
t : Finset α
ht : ↑t ⊆ range s
ht' : k ≤ t.sup id
⊢ ∃ t, k ≤ t.sup s

Proof state:
case mpr
α : Type u
inst✝ : CompleteLattice α
k : α
H : ∀ (ι : Type u) (s : ι → α), k ≤ iSup s → ∃ t, k ≤ t.sup s
s : Set α
hs : k ≤ sSup s
⊢ ∃ t, ↑t ⊆ s ∧ k ≤ t.sup id

Tactic:
obtain ⟨t, ht⟩ :=
  H s Subtype.val
    (by
      delta iSup
      rwa [Subtype.range_coe])

Result:
case mpr.intro
α : Type u
inst✝ : CompleteLattice α
k : α
H : ∀ (ι : Type u) (s : ι → α), k ≤ iSup s → ∃ t, k ≤ t.sup s
s : Set α
hs : k ≤ sSup s
t : Finset ↑s
ht : k ≤ t.sup Subtype.val
⊢ ∃ t, ↑t ⊆ s ∧ k ≤ t.sup id

Proof state:
case mpr
α : Type u
inst✝ : CompleteLattice α
k : α
⊢ (∀ (ι : Type u) (s : ι → α), k ≤ iSup s → ∃ t, k ≤ t.sup s) → IsCompactElement k

Tactic:
intro H s hs

Result:
case mpr
α : Type u
inst✝ : CompleteLattice α
k : α
H : ∀ (ι : Type u) (s : ι → α), k ≤ iSup s → ∃ t, k ≤ t.sup s
s : Set α
hs : k ≤ sSup s
⊢ ∃ t, ↑t ⊆ s ∧ k ≤ t.sup id

Proof state:
case mp.intro.intro
α : Type u
inst✝ : CompleteLattice α
k : α
H : IsCompactElement k
ι : Type u
s : ι → α
hs : k ≤ iSup s
t : Finset α
ht : ↑t ⊆ range s
ht' : k ≤ t.sup id
this : ∀ (x : { x // x ∈ t }), ∃ i, s i = ↑x
⊢ ∃ t, k ≤ t.sup s

Tactic:
choose f hf using this

Result:
case mp.intro.intro
α : Type u
inst✝ : CompleteLattice α
k : α
H : IsCompactElement k
ι : Type u
s : ι → α
hs : k ≤ iSup s
t : Finset α
ht : ↑t ⊆ range s
ht' : k ≤ t.sup id
f : { x // x ∈ t } → ι
hf : ∀ (x : { x // x ∈ t }), s (f x) = ↑x
⊢ ∃ t, k ≤ t.sup s

Proof state:
case mp.intro.intro
α : Type u
inst✝ : CompleteLattice α
k : α
H : IsCompactElement k
ι : Type u
s : ι → α
hs : k ≤ iSup s
t : Finset α
ht : ↑t ⊆ range s
ht' : k ≤ t.sup id
f : { x // x ∈ t } → ι
hf : ∀ (x : { x // x ∈ t }), s (f x) = ↑x
⊢ ∃ t, k ≤ t.sup s

Tactic:
refine ⟨Finset.univ.image f, ht'.trans ?_⟩

Result:
case mp.intro.intro
α : Type u
inst✝ : CompleteLattice α
k : α
H : IsCompactElement k
ι : Type u
s : ι → α
hs : k ≤ iSup s
t : Finset α
ht : ↑t ⊆ range s
ht' : k ≤ t.sup id
f : { x // x ∈ t } → ι
hf : ∀ (x : { x // x ∈ t }), s (f x) = ↑x
⊢ t.sup id ≤ (Finset.image f Finset.univ).sup s

Proof state:
α : Type u
inst✝ : CompleteLattice α
k : α
⊢ IsCompactElement k ↔ ∀ (ι : Type u) (s : ι → α), k ≤ iSup s → ∃ t, k ≤ t.sup s

Tactic:
constructor

Result:
case mp
α : Type u
inst✝ : CompleteLattice α
k : α
⊢ IsCompactElement k → ∀ (ι : Type u) (s : ι → α), k ≤ iSup s → ∃ t, k ≤ t.sup s

case mpr
α : Type u
inst✝ : CompleteLattice α
k : α
⊢ (∀ (ι : Type u) (s : ι → α), k ≤ iSup s → ∃ t, k ≤ t.sup s) → IsCompactElement k

Proof state:
case mpr.intro
α : Type u
inst✝ : CompleteLattice α
k : α
H : ∀ (ι : Type u) (s : ι → α), k ≤ iSup s → ∃ t, k ≤ t.sup s
s : Set α
hs : k ≤ sSup s
t : Finset ↑s
ht : k ≤ t.sup Subtype.val
⊢ t.sup Subtype.val ≤ (Finset.image Subtype.val t).sup id

Tactic:
rw [Finset.sup_le_iff]

Result:
case mpr.intro
α : Type u
inst✝ : CompleteLattice α
k : α
H : ∀ (ι : Type u) (s : ι → α), k ≤ iSup s → ∃ t, k ≤ t.sup s
s : Set α
hs : k ≤ sSup s
t : Finset ↑s
ht : k ≤ t.sup Subtype.val
⊢ ∀ b ∈ t, ↑b ≤ (Finset.image Subtype.val t).sup id

Proof state:
case mp.intro.intro
α : Type u
inst✝ : CompleteLattice α
k : α
H : IsCompactElement k
ι : Type u
s : ι → α
hs : k ≤ iSup s
t : Finset α
ht : ↑t ⊆ range s
ht' : k ≤ t.sup id
f : { x // x ∈ t } → ι
hf : ∀ (x : { x // x ∈ t }), s (f x) = ↑x
⊢ ∀ b ∈ t, id b ≤ (Finset.image f Finset.univ).sup s

Tactic:
intro b hb

Result:
case mp.intro.intro
α : Type u
inst✝ : CompleteLattice α
k : α
H : IsCompactElement k
ι : Type u
s : ι → α
hs : k ≤ iSup s
t : Finset α
ht : ↑t ⊆ range s
ht' : k ≤ t.sup id
f : { x // x ∈ t } → ι
hf : ∀ (x : { x // x ∈ t }), s (f x) = ↑x
b : α
hb : b ∈ t
⊢ id b ≤ (Finset.image f Finset.univ).sup s

Proof state:
case mpr.intro
α : Type u
inst✝ : CompleteLattice α
k : α
H : ∀ (ι : Type u) (s : ι → α), k ≤ iSup s → ∃ t, k ≤ t.sup s
s : Set α
hs : k ≤ sSup s
t : Finset ↑s
ht : k ≤ t.sup Subtype.val
⊢ ∃ t, ↑t ⊆ s ∧ k ≤ t.sup id

Tactic:
refine ⟨t.image Subtype.val, by simp, ht.trans ?_⟩

Result:
case mpr.intro
α : Type u
inst✝ : CompleteLattice α
k : α
H : ∀ (ι : Type u) (s : ι → α), k ≤ iSup s → ∃ t, k ≤ t.sup s
s : Set α
hs : k ≤ sSup s
t : Finset ↑s
ht : k ≤ t.sup Subtype.val
⊢ t.sup Subtype.val ≤ (Finset.image Subtype.val t).sup id

Proof state:
case mpr.intro
α : Type u
inst✝ : CompleteLattice α
k : α
H : ∀ (ι : Type u) (s : ι → α), k ≤ iSup s → ∃ t, k ≤ t.sup s
s : Set α
hs : k ≤ sSup s
t : Finset ↑s
ht : k ≤ t.sup Subtype.val
⊢ ∀ b ∈ t, ↑b ≤ (Finset.image Subtype.val t).sup id

Tactic:
exact fun x hx => @Finset.le_sup _ _ _ _ _ id _ (Finset.mem_image_of_mem Subtype.val hx)

Result:
no goals

Proof state:
case mp.intro.intro
α : Type u
inst✝ : CompleteLattice α
k : α
H : IsCompactElement k
ι : Type u
s : ι → α
hs : k ≤ iSup s
t : Finset α
ht : ↑t ⊆ range s
ht' : k ≤ t.sup id
f : { x // x ∈ t } → ι
hf : ∀ (x : { x // x ∈ t }), s (f x) = ↑x
⊢ t.sup id ≤ (Finset.image f Finset.univ).sup s

Tactic:
rw [Finset.sup_le_iff]

Result:
case mp.intro.intro
α : Type u
inst✝ : CompleteLattice α
k : α
H : IsCompactElement k
ι : Type u
s : ι → α
hs : k ≤ iSup s
t : Finset α
ht : ↑t ⊆ range s
ht' : k ≤ t.sup id
f : { x // x ∈ t } → ι
hf : ∀ (x : { x // x ∈ t }), s (f x) = ↑x
⊢ ∀ b ∈ t, id b ≤ (Finset.image f Finset.univ).sup s

Proof state:
α : Type u
inst✝ : CompleteLattice α
k : α
H : ∀ (ι : Type u) (s : ι → α), k ≤ iSup s → ∃ t, k ≤ t.sup s
s : Set α
hs : k ≤ sSup s
⊢ k ≤ sSup (range Subtype.val)

Tactic:
rwa [Subtype.range_coe]

Result:
no goals

Proof state:
case mp.intro.intro
α : Type u
inst✝ : CompleteLattice α
k : α
H : IsCompactElement k
ι : Type u
s : ι → α
hs : k ≤ iSup s
t : Finset α
ht : ↑t ⊆ range s
ht' : k ≤ t.sup id
f : { x // x ∈ t } → ι
hf : ∀ (x : { x // x ∈ t }), s (f x) = ↑x
b : α
hb : b ∈ t
⊢ s (f ⟨b, hb⟩) ≤ (Finset.image f Finset.univ).sup s

Tactic:
exact Finset.le_sup (Finset.mem_image_of_mem f <| Finset.mem_univ (Subtype.mk b hb))

Result:
no goals

Proof state:
case mp.intro.intro
α : Type u
inst✝ : CompleteLattice α
k : α
H : IsCompactElement k
ι : Type u
s : ι → α
hs : k ≤ iSup s
t : Finset α
ht : ↑t ⊆ range s
ht' : k ≤ t.sup id
⊢ ∃ t, k ≤ t.sup s

Tactic:
have : ∀ x : t, ∃ i, s i = x := fun x => ht x.prop

Result:
case mp.intro.intro
α : Type u
inst✝ : CompleteLattice α
k : α
H : IsCompactElement k
ι : Type u
s : ι → α
hs : k ≤ iSup s
t : Finset α
ht : ↑t ⊆ range s
ht' : k ≤ t.sup id
this : ∀ (x : { x // x ∈ t }), ∃ i, s i = ↑x
⊢ ∃ t, k ≤ t.sup s

Proof state:
case mp
α : Type u
inst✝ : CompleteLattice α
k : α
⊢ IsCompactElement k → ∀ (ι : Type u) (s : ι → α), k ≤ iSup s → ∃ t, k ≤ t.sup s

Tactic:
intro H ι s hs

Result:
case mp
α : Type u
inst✝ : CompleteLattice α
k : α
H : IsCompactElement k
ι : Type u
s : ι → α
hs : k ≤ iSup s
⊢ ∃ t, k ≤ t.sup s

Proof state:
case mp.intro.intro
α : Type u
inst✝ : CompleteLattice α
k : α
H : IsCompactElement k
ι : Type u
s : ι → α
hs : k ≤ iSup s
t : Finset α
ht : ↑t ⊆ range s
ht' : k ≤ t.sup id
f : { x // x ∈ t } → ι
hf : ∀ (x : { x // x ∈ t }), s (f x) = ↑x
b : α
hb : b ∈ t
⊢ id b ≤ (Finset.image f Finset.univ).sup s

Tactic:
rw [← show s (f ⟨b, hb⟩) = id b from hf _]

Result:
case mp.intro.intro
α : Type u
inst✝ : CompleteLattice α
k : α
H : IsCompactElement k
ι : Type u
s : ι → α
hs : k ≤ iSup s
t : Finset α
ht : ↑t ⊆ range s
ht' : k ≤ t.sup id
f : { x // x ∈ t } → ι
hf : ∀ (x : { x // x ∈ t }), s (f x) = ↑x
b : α
hb : b ∈ t
⊢ s (f ⟨b, hb⟩) ≤ (Finset.image f Finset.univ).sup s