Theorem: isOpen_prod_iff'
File: Mathlib/Topology/Constructions.lean

tactic: cases' (s ×ˢ t).eq_empty_or_nonempty with h h
state_before: α : Type u
β : Type v
γ : Type ?u.57822
δ : Type ?u.57825
ε : Type ?u.57828
ζ : Type ?u.57831
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
s : Set α
t : Set β
⊢ IsOpen (s ×ˢ t) ↔ IsOpen s ∧ IsOpen t ∨ s = ∅ ∨ t = ∅

tactic: simp [h, prod_eq_empty_iff.1 h]
state_before: case inl
α : Type u
β : Type v
γ : Type ?u.57822
δ : Type ?u.57825
ε : Type ?u.57828
ζ : Type ?u.57831
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
s : Set α
t : Set β
h : s ×ˢ t = ∅
⊢ IsOpen (s ×ˢ t) ↔ IsOpen s ∧ IsOpen t ∨ s = ∅ ∨ t = ∅

tactic: have st : s.Nonempty ∧ t.Nonempty := prod_nonempty_iff.1 h
state_before: case inr
α : Type u
β : Type v
γ : Type ?u.57822
δ : Type ?u.57825
ε : Type ?u.57828
ζ : Type ?u.57831
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
s : Set α
t : Set β
h : Set.Nonempty (s ×ˢ t)
⊢ IsOpen (s ×ˢ t) ↔ IsOpen s ∧ IsOpen t ∨ s = ∅ ∨ t = ∅

tactic: constructor
state_before: case inr
α : Type u
β : Type v
γ : Type ?u.57822
δ : Type ?u.57825
ε : Type ?u.57828
ζ : Type ?u.57831
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
s : Set α
t : Set β
h : Set.Nonempty (s ×ˢ t)
st : Set.Nonempty s ∧ Set.Nonempty t
⊢ IsOpen (s ×ˢ t) ↔ IsOpen s ∧ IsOpen t ∨ s = ∅ ∨ t = ∅

tactic: intro (H : IsOpen (s ×ˢ t))
state_before: case inr.mp
α : Type u
β : Type v
γ : Type ?u.57822
δ : Type ?u.57825
ε : Type ?u.57828
ζ : Type ?u.57831
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
s : Set α
t : Set β
h : Set.Nonempty (s ×ˢ t)
st : Set.Nonempty s ∧ Set.Nonempty t
⊢ IsOpen (s ×ˢ t) → IsOpen s ∧ IsOpen t ∨ s = ∅ ∨ t = ∅

tactic: refine' Or.inl ⟨_, _⟩
state_before: case inr.mp
α : Type u
β : Type v
γ : Type ?u.57822
δ : Type ?u.57825
ε : Type ?u.57828
ζ : Type ?u.57831
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
s : Set α
t : Set β
h : Set.Nonempty (s ×ˢ t)
st : Set.Nonempty s ∧ Set.Nonempty t
H : IsOpen (s ×ˢ t)
⊢ IsOpen s ∧ IsOpen t ∨ s = ∅ ∨ t = ∅

tactic: show IsOpen s
state_before: case inr.mp.refine'_1
α : Type u
β : Type v
γ : Type ?u.57822
δ : Type ?u.57825
ε : Type ?u.57828
ζ : Type ?u.57831
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
s : Set α
t : Set β
h : Set.Nonempty (s ×ˢ t)
st : Set.Nonempty s ∧ Set.Nonempty t
H : IsOpen (s ×ˢ t)
⊢ IsOpen s

case inr.mp.refine'_2
α : Type u
β : Type v
γ : Type ?u.57822
δ : Type ?u.57825
ε : Type ?u.57828
ζ : Type ?u.57831
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
s : Set α
t : Set β
h : Set.Nonempty (s ×ˢ t)
st : Set.Nonempty s ∧ Set.Nonempty t
H : IsOpen (s ×ˢ t)
⊢ IsOpen t

tactic: show IsOpen t
state_before: case inr.mp.refine'_2
α : Type u
β : Type v
γ : Type ?u.57822
δ : Type ?u.57825
ε : Type ?u.57828
ζ : Type ?u.57831
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
s : Set α
t : Set β
h : Set.Nonempty (s ×ˢ t)
st : Set.Nonempty s ∧ Set.Nonempty t
H : IsOpen (s ×ˢ t)
⊢ IsOpen t

tactic: rw [← fst_image_prod s st.2]
state_before: case inr.mp.refine'_1
α : Type u
β : Type v
γ : Type ?u.57822
δ : Type ?u.57825
ε : Type ?u.57828
ζ : Type ?u.57831
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
s : Set α
t : Set β
h : Set.Nonempty (s ×ˢ t)
st : Set.Nonempty s ∧ Set.Nonempty t
H : IsOpen (s ×ˢ t)
⊢ IsOpen s

tactic: exact isOpenMap_fst _ H
state_before: case inr.mp.refine'_1
α : Type u
β : Type v
γ : Type ?u.57822
δ : Type ?u.57825
ε : Type ?u.57828
ζ : Type ?u.57831
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
s : Set α
t : Set β
h : Set.Nonempty (s ×ˢ t)
st : Set.Nonempty s ∧ Set.Nonempty t
H : IsOpen (s ×ˢ t)
⊢ IsOpen (Prod.fst '' s ×ˢ t)

tactic: rw [← snd_image_prod st.1 t]
state_before: case inr.mp.refine'_2
α : Type u
β : Type v
γ : Type ?u.57822
δ : Type ?u.57825
ε : Type ?u.57828
ζ : Type ?u.57831
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
s : Set α
t : Set β
h : Set.Nonempty (s ×ˢ t)
st : Set.Nonempty s ∧ Set.Nonempty t
H : IsOpen (s ×ˢ t)
⊢ IsOpen t

tactic: exact isOpenMap_snd _ H
state_before: case inr.mp.refine'_2
α : Type u
β : Type v
γ : Type ?u.57822
δ : Type ?u.57825
ε : Type ?u.57828
ζ : Type ?u.57831
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
s : Set α
t : Set β
h : Set.Nonempty (s ×ˢ t)
st : Set.Nonempty s ∧ Set.Nonempty t
H : IsOpen (s ×ˢ t)
⊢ IsOpen (Prod.snd '' s ×ˢ t)

tactic: intro H
state_before: case inr.mpr
α : Type u
β : Type v
γ : Type ?u.57822
δ : Type ?u.57825
ε : Type ?u.57828
ζ : Type ?u.57831
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
s : Set α
t : Set β
h : Set.Nonempty (s ×ˢ t)
st : Set.Nonempty s ∧ Set.Nonempty t
⊢ IsOpen s ∧ IsOpen t ∨ s = ∅ ∨ t = ∅ → IsOpen (s ×ˢ t)

tactic: simp only [st.1.ne_empty, st.2.ne_empty, not_false_iff, or_false_iff] at H
state_before: case inr.mpr
α : Type u
β : Type v
γ : Type ?u.57822
δ : Type ?u.57825
ε : Type ?u.57828
ζ : Type ?u.57831
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
s : Set α
t : Set β
h : Set.Nonempty (s ×ˢ t)
st : Set.Nonempty s ∧ Set.Nonempty t
H : IsOpen s ∧ IsOpen t ∨ s = ∅ ∨ t = ∅
⊢ IsOpen (s ×ˢ t)

tactic: exact H.1.prod H.2
state_before: case inr.mpr
α : Type u
β : Type v
γ : Type ?u.57822
δ : Type ?u.57825
ε : Type ?u.57828
ζ : Type ?u.57831
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
s : Set α
t : Set β
h : Set.Nonempty (s ×ˢ t)
st : Set.Nonempty s ∧ Set.Nonempty t
H : IsOpen s ∧ IsOpen t
⊢ IsOpen (s ×ˢ t)