Theorem: isLUB_prod
File: Mathlib/Order/Bounds/Basic.lean

tactic: refine
  ⟨fun H =>
    ⟨⟨monotone_fst.mem_upperBounds_image H.1, fun a ha => ?_⟩,
      ⟨monotone_snd.mem_upperBounds_image H.1, fun a ha => ?_⟩⟩,
    fun H => ⟨?_, ?_⟩⟩
state_before: α✝ : Type u
β✝ : Type v
γ : Type w
ι : Sort x
α : Type u_1
β : Type u_2
inst✝¹ : Preorder α
inst✝ : Preorder β
s : Set (α × β)
p : α × β
⊢ IsLUB s p ↔ IsLUB (Prod.fst '' s) p.1 ∧ IsLUB (Prod.snd '' s) p.2
state_after: case refine_1
α✝ : Type u
β✝ : Type v
γ : Type w
ι : Sort x
α : Type u_1
β : Type u_2
inst✝¹ : Preorder α
inst✝ : Preorder β
s : Set (α × β)
p : α × β
H : IsLUB s p
a : α
ha : a ∈ upperBounds (Prod.fst '' s)
⊢ p.1 ≤ a

case refine_2
α✝ : Type u
β✝ : Type v
γ : Type w
ι : Sort x
α : Type u_1
β : Type u_2
inst✝¹ : Preorder α
inst✝ : Preorder β
s : Set (α × β)
p : α × β
H : IsLUB s p
a : β
ha : a ∈ upperBounds (Prod.snd '' s)
⊢ p.2 ≤ a

case refine_3
α✝ : Type u
β✝ : Type v
γ : Type w
ι : Sort x
α : Type u_1
β : Type u_2
inst✝¹ : Preorder α
inst✝ : Preorder β
s : Set (α × β)
p : α × β
H : IsLUB (Prod.fst '' s) p.1 ∧ IsLUB (Prod.snd '' s) p.2
⊢ p ∈ upperBounds s

case refine_4
α✝ : Type u
β✝ : Type v
γ : Type w
ι : Sort x
α : Type u_1
β : Type u_2
inst✝¹ : Preorder α
inst✝ : Preorder β
s : Set (α × β)
p : α × β
H : IsLUB (Prod.fst '' s) p.1 ∧ IsLUB (Prod.snd '' s) p.2
⊢ p ∈ lowerBounds (upperBounds s)

tactic: suffices h : (a, p.2) ∈ upperBounds s from (H.2 h).1
state_before: case refine_1
α✝ : Type u
β✝ : Type v
γ : Type w
ι : Sort x
α : Type u_1
β : Type u_2
inst✝¹ : Preorder α
inst✝ : Preorder β
s : Set (α × β)
p : α × β
H : IsLUB s p
a : α
ha : a ∈ upperBounds (Prod.fst '' s)
⊢ p.1 ≤ a
state_after: case refine_1
α✝ : Type u
β✝ : Type v
γ : Type w
ι : Sort x
α : Type u_1
β : Type u_2
inst✝¹ : Preorder α
inst✝ : Preorder β
s : Set (α × β)
p : α × β
H : IsLUB s p
a : α
ha : a ∈ upperBounds (Prod.fst '' s)
⊢ (a, p.2) ∈ upperBounds s

tactic: exact fun q hq => ⟨ha <| mem_image_of_mem _ hq, (H.1 hq).2⟩
state_before: case refine_1
α✝ : Type u
β✝ : Type v
γ : Type w
ι : Sort x
α : Type u_1
β : Type u_2
inst✝¹ : Preorder α
inst✝ : Preorder β
s : Set (α × β)
p : α × β
H : IsLUB s p
a : α
ha : a ∈ upperBounds (Prod.fst '' s)
⊢ (a, p.2) ∈ upperBounds s
state_after: no goals

tactic: suffices h : (p.1, a) ∈ upperBounds s from (H.2 h).2
state_before: case refine_2
α✝ : Type u
β✝ : Type v
γ : Type w
ι : Sort x
α : Type u_1
β : Type u_2
inst✝¹ : Preorder α
inst✝ : Preorder β
s : Set (α × β)
p : α × β
H : IsLUB s p
a : β
ha : a ∈ upperBounds (Prod.snd '' s)
⊢ p.2 ≤ a
state_after: case refine_2
α✝ : Type u
β✝ : Type v
γ : Type w
ι : Sort x
α : Type u_1
β : Type u_2
inst✝¹ : Preorder α
inst✝ : Preorder β
s : Set (α × β)
p : α × β
H : IsLUB s p
a : β
ha : a ∈ upperBounds (Prod.snd '' s)
⊢ (p.1, a) ∈ upperBounds s

tactic: exact fun q hq => ⟨(H.1 hq).1, ha <| mem_image_of_mem _ hq⟩
state_before: case refine_2
α✝ : Type u
β✝ : Type v
γ : Type w
ι : Sort x
α : Type u_1
β : Type u_2
inst✝¹ : Preorder α
inst✝ : Preorder β
s : Set (α × β)
p : α × β
H : IsLUB s p
a : β
ha : a ∈ upperBounds (Prod.snd '' s)
⊢ (p.1, a) ∈ upperBounds s
state_after: no goals

tactic: exact fun q hq => ⟨H.1.1 <| mem_image_of_mem _ hq, H.2.1 <| mem_image_of_mem _ hq⟩
state_before: case refine_3
α✝ : Type u
β✝ : Type v
γ : Type w
ι : Sort x
α : Type u_1
β : Type u_2
inst✝¹ : Preorder α
inst✝ : Preorder β
s : Set (α × β)
p : α × β
H : IsLUB (Prod.fst '' s) p.1 ∧ IsLUB (Prod.snd '' s) p.2
⊢ p ∈ upperBounds s
state_after: no goals

tactic: exact fun q hq =>
  ⟨H.1.2 <| monotone_fst.mem_upperBounds_image hq,
    H.2.2 <| monotone_snd.mem_upperBounds_image hq⟩
state_before: case refine_4
α✝ : Type u
β✝ : Type v
γ : Type w
ι : Sort x
α : Type u_1
β : Type u_2
inst✝¹ : Preorder α
inst✝ : Preorder β
s : Set (α × β)
p : α × β
H : IsLUB (Prod.fst '' s) p.1 ∧ IsLUB (Prod.snd '' s) p.2
⊢ p ∈ lowerBounds (upperBounds s)
state_after: no goals