Theorem: prod_generateFrom_generateFrom_eq
File: Mathlib/Topology/Constructions.lean

tactic: simp_rw [← prod_iUnion, ← sUnion_eq_biUnion, ht, prod_univ]
state_before: α✝ : Type u
β✝ : Type v
γ : Type ?u.42130
δ : Type ?u.42133
ε : Type ?u.42136
ζ : Type ?u.42139
inst✝⁵ : TopologicalSpace α✝
inst✝⁴ : TopologicalSpace β✝
inst✝³ : TopologicalSpace γ
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
α : Type u_1
β : Type u_2
s : Set (Set α)
t : Set (Set β)
hs : ⋃₀ s = univ
ht : ⋃₀ t = univ
G : TopologicalSpace (α × β) := generateFrom {g | ∃ u, u ∈ s ∧ ∃ v, v ∈ t ∧ g = u ×ˢ v}
u : Set α
hu : u ∈ s
⊢ (⋃ (v : Set β) (_ : v ∈ t), u ×ˢ v) = Prod.fst ⁻¹' u

tactic: rw [← this]
state_before: α✝ : Type u
β✝ : Type v
γ : Type ?u.42130
δ : Type ?u.42133
ε : Type ?u.42136
ζ : Type ?u.42139
inst✝⁵ : TopologicalSpace α✝
inst✝⁴ : TopologicalSpace β✝
inst✝³ : TopologicalSpace γ
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
α : Type u_1
β : Type u_2
s : Set (Set α)
t : Set (Set β)
hs : ⋃₀ s = univ
ht : ⋃₀ t = univ
G : TopologicalSpace (α × β) := generateFrom {g | ∃ u, u ∈ s ∧ ∃ v, v ∈ t ∧ g = u ×ˢ v}
u : Set α
hu : u ∈ s
this : (⋃ (v : Set β) (_ : v ∈ t), u ×ˢ v) = Prod.fst ⁻¹' u
⊢ TopologicalSpace.IsOpen (Prod.fst ⁻¹' u)

tactic: exact
  isOpen_iUnion fun v =>
    isOpen_iUnion fun hv => GenerateOpen.basic _ ⟨_, hu, _, hv, rfl⟩
state_before: α✝ : Type u
β✝ : Type v
γ : Type ?u.42130
δ : Type ?u.42133
ε : Type ?u.42136
ζ : Type ?u.42139
inst✝⁵ : TopologicalSpace α✝
inst✝⁴ : TopologicalSpace β✝
inst✝³ : TopologicalSpace γ
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
α : Type u_1
β : Type u_2
s : Set (Set α)
t : Set (Set β)
hs : ⋃₀ s = univ
ht : ⋃₀ t = univ
G : TopologicalSpace (α × β) := generateFrom {g | ∃ u, u ∈ s ∧ ∃ v, v ∈ t ∧ g = u ×ˢ v}
u : Set α
hu : u ∈ s
this : (⋃ (v : Set β) (_ : v ∈ t), u ×ˢ v) = Prod.fst ⁻¹' u
⊢ TopologicalSpace.IsOpen (⋃ (v : Set β) (_ : v ∈ t), u ×ˢ v)

tactic: simp_rw [← iUnion_prod_const, ← sUnion_eq_biUnion, hs, univ_prod]
state_before: α✝ : Type u
β✝ : Type v
γ : Type ?u.42130
δ : Type ?u.42133
ε : Type ?u.42136
ζ : Type ?u.42139
inst✝⁵ : TopologicalSpace α✝
inst✝⁴ : TopologicalSpace β✝
inst✝³ : TopologicalSpace γ
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
α : Type u_1
β : Type u_2
s : Set (Set α)
t : Set (Set β)
hs : ⋃₀ s = univ
ht : ⋃₀ t = univ
G : TopologicalSpace (α × β) := generateFrom {g | ∃ u, u ∈ s ∧ ∃ v, v ∈ t ∧ g = u ×ˢ v}
v : Set β
hv : v ∈ t
⊢ (⋃ (u : Set α) (_ : u ∈ s), u ×ˢ v) = Prod.snd ⁻¹' v

tactic: rw [← this]
state_before: α✝ : Type u
β✝ : Type v
γ : Type ?u.42130
δ : Type ?u.42133
ε : Type ?u.42136
ζ : Type ?u.42139
inst✝⁵ : TopologicalSpace α✝
inst✝⁴ : TopologicalSpace β✝
inst✝³ : TopologicalSpace γ
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
α : Type u_1
β : Type u_2
s : Set (Set α)
t : Set (Set β)
hs : ⋃₀ s = univ
ht : ⋃₀ t = univ
G : TopologicalSpace (α × β) := generateFrom {g | ∃ u, u ∈ s ∧ ∃ v, v ∈ t ∧ g = u ×ˢ v}
v : Set β
hv : v ∈ t
this : (⋃ (u : Set α) (_ : u ∈ s), u ×ˢ v) = Prod.snd ⁻¹' v
⊢ TopologicalSpace.IsOpen (Prod.snd ⁻¹' v)

tactic: exact
  isOpen_iUnion fun u =>
    isOpen_iUnion fun hu => GenerateOpen.basic _ ⟨_, hu, _, hv, rfl⟩
state_before: α✝ : Type u
β✝ : Type v
γ : Type ?u.42130
δ : Type ?u.42133
ε : Type ?u.42136
ζ : Type ?u.42139
inst✝⁵ : TopologicalSpace α✝
inst✝⁴ : TopologicalSpace β✝
inst✝³ : TopologicalSpace γ
inst✝² : TopologicalSpace δ
inst✝¹ : TopologicalSpace ε
inst✝ : TopologicalSpace ζ
α : Type u_1
β : Type u_2
s : Set (Set α)
t : Set (Set β)
hs : ⋃₀ s = univ
ht : ⋃₀ t = univ
G : TopologicalSpace (α × β) := generateFrom {g | ∃ u, u ∈ s ∧ ∃ v, v ∈ t ∧ g = u ×ˢ v}
v : Set β
hv : v ∈ t
this : (⋃ (u : Set α) (_ : u ∈ s), u ×ˢ v) = Prod.snd ⁻¹' v
⊢ TopologicalSpace.IsOpen (⋃ (u : Set α) (_ : u ∈ s), u ×ˢ v)