Theorem: MeasureTheory.generateFrom_measurableCylinders
File: Mathlib/MeasureTheory/Constructions/Cylinders.lean

tactic: apply le_antisymm
state_before: ι : Type u_1
α : ι → Type u_2
inst✝ : (i : ι) → MeasurableSpace (α i)
s t : Set ((i : ι) → α i)
⊢ MeasurableSpace.generateFrom (measurableCylinders α) = MeasurableSpace.pi
state_after: case a
ι : Type u_1
α : ι → Type u_2
inst✝ : (i : ι) → MeasurableSpace (α i)
s t : Set ((i : ι) → α i)
⊢ MeasurableSpace.generateFrom (measurableCylinders α) ≤ MeasurableSpace.pi

case a
ι : Type u_1
α : ι → Type u_2
inst✝ : (i : ι) → MeasurableSpace (α i)
s t : Set ((i : ι) → α i)
⊢ MeasurableSpace.pi ≤ MeasurableSpace.generateFrom (measurableCylinders α)

tactic: refine MeasurableSpace.generateFrom_le (fun S hS ↦ ?_)
state_before: case a
ι : Type u_1
α : ι → Type u_2
inst✝ : (i : ι) → MeasurableSpace (α i)
s t : Set ((i : ι) → α i)
⊢ MeasurableSpace.generateFrom (measurableCylinders α) ≤ MeasurableSpace.pi
state_after: case a
ι : Type u_1
α : ι → Type u_2
inst✝ : (i : ι) → MeasurableSpace (α i)
s t S : Set ((i : ι) → α i)
hS : S ∈ measurableCylinders α
⊢ MeasurableSet S

tactic: obtain ⟨s, S, hSm, rfl⟩ := (mem_measurableCylinders _).mp hS
state_before: case a
ι : Type u_1
α : ι → Type u_2
inst✝ : (i : ι) → MeasurableSpace (α i)
s t S : Set ((i : ι) → α i)
hS : S ∈ measurableCylinders α
⊢ MeasurableSet S
state_after: case a.intro.intro.intro
ι : Type u_1
α : ι → Type u_2
inst✝ : (i : ι) → MeasurableSpace (α i)
s✝ t : Set ((i : ι) → α i)
s : Finset ι
S : Set ((i : { x // x ∈ s }) → α ↑i)
hSm : MeasurableSet S
hS : cylinder s S ∈ measurableCylinders α
⊢ MeasurableSet (cylinder s S)

tactic: exact hSm.cylinder
state_before: case a.intro.intro.intro
ι : Type u_1
α : ι → Type u_2
inst✝ : (i : ι) → MeasurableSpace (α i)
s✝ t : Set ((i : ι) → α i)
s : Finset ι
S : Set ((i : { x // x ∈ s }) → α ↑i)
hSm : MeasurableSet S
hS : cylinder s S ∈ measurableCylinders α
⊢ MeasurableSet (cylinder s S)
state_after: no goals

tactic: refine iSup_le fun i ↦ ?_
state_before: case a
ι : Type u_1
α : ι → Type u_2
inst✝ : (i : ι) → MeasurableSpace (α i)
s t : Set ((i : ι) → α i)
⊢ MeasurableSpace.pi ≤ MeasurableSpace.generateFrom (measurableCylinders α)
state_after: case a
ι : Type u_1
α : ι → Type u_2
inst✝ : (i : ι) → MeasurableSpace (α i)
s t : Set ((i : ι) → α i)
i : ι
⊢ MeasurableSpace.comap (fun b => b i) (inst✝ i) ≤ MeasurableSpace.generateFrom (measurableCylinders α)

tactic: refine (comap_eval_le_generateFrom_squareCylinders_singleton α i).trans ?_
state_before: case a
ι : Type u_1
α : ι → Type u_2
inst✝ : (i : ι) → MeasurableSpace (α i)
s t : Set ((i : ι) → α i)
i : ι
⊢ MeasurableSpace.comap (fun b => b i) (inst✝ i) ≤ MeasurableSpace.generateFrom (measurableCylinders α)
state_after: case a
ι : Type u_1
α : ι → Type u_2
inst✝ : (i : ι) → MeasurableSpace (α i)
s t : Set ((i : ι) → α i)
i : ι
⊢ MeasurableSpace.generateFrom ((fun t => {i}.pi t) '' univ.pi fun i => {s | MeasurableSet s}) ≤
    MeasurableSpace.generateFrom (measurableCylinders α)

tactic: refine MeasurableSpace.generateFrom_mono (fun x ↦ ?_)
state_before: case a
ι : Type u_1
α : ι → Type u_2
inst✝ : (i : ι) → MeasurableSpace (α i)
s t : Set ((i : ι) → α i)
i : ι
⊢ MeasurableSpace.generateFrom ((fun t => {i}.pi t) '' univ.pi fun i => {s | MeasurableSet s}) ≤
    MeasurableSpace.generateFrom (measurableCylinders α)
state_after: case a
ι : Type u_1
α : ι → Type u_2
inst✝ : (i : ι) → MeasurableSpace (α i)
s t : Set ((i : ι) → α i)
i : ι
x : Set ((i : ι) → α i)
⊢ (x ∈ (fun t => {i}.pi t) '' univ.pi fun i => {s | MeasurableSet s}) → x ∈ measurableCylinders α

tactic: simp only [singleton_pi, Function.eval, mem_image, mem_pi, mem_univ, mem_setOf_eq,
  forall_true_left, mem_measurableCylinders, exists_prop, forall_exists_index, and_imp]
state_before: case a
ι : Type u_1
α : ι → Type u_2
inst✝ : (i : ι) → MeasurableSpace (α i)
s t : Set ((i : ι) → α i)
i : ι
x : Set ((i : ι) → α i)
⊢ (x ∈ (fun t => {i}.pi t) '' univ.pi fun i => {s | MeasurableSet s}) → x ∈ measurableCylinders α
state_after: case a
ι : Type u_1
α : ι → Type u_2
inst✝ : (i : ι) → MeasurableSpace (α i)
s t : Set ((i : ι) → α i)
i : ι
x : Set ((i : ι) → α i)
⊢ ∀ (x_1 : (i : ι) → Set (α i)),
    (∀ (i : ι), MeasurableSet (x_1 i)) → Function.eval i ⁻¹' x_1 i = x → ∃ s S, MeasurableSet S ∧ x = cylinder s S

tactic: rintro t ht rfl
state_before: case a
ι : Type u_1
α : ι → Type u_2
inst✝ : (i : ι) → MeasurableSpace (α i)
s t : Set ((i : ι) → α i)
i : ι
x : Set ((i : ι) → α i)
⊢ ∀ (x_1 : (i : ι) → Set (α i)),
    (∀ (i : ι), MeasurableSet (x_1 i)) → Function.eval i ⁻¹' x_1 i = x → ∃ s S, MeasurableSet S ∧ x = cylinder s S
state_after: case a
ι : Type u_1
α : ι → Type u_2
inst✝ : (i : ι) → MeasurableSpace (α i)
s t✝ : Set ((i : ι) → α i)
i : ι
t : (i : ι) → Set (α i)
ht : ∀ (i : ι), MeasurableSet (t i)
⊢ ∃ s S, MeasurableSet S ∧ Function.eval i ⁻¹' t i = cylinder s S

tactic: refine ⟨{i}, {f | f ⟨i, Finset.mem_singleton_self i⟩ ∈ t i}, measurable_pi_apply _ (ht i), ?_⟩
state_before: case a
ι : Type u_1
α : ι → Type u_2
inst✝ : (i : ι) → MeasurableSpace (α i)
s t✝ : Set ((i : ι) → α i)
i : ι
t : (i : ι) → Set (α i)
ht : ∀ (i : ι), MeasurableSet (t i)
⊢ ∃ s S, MeasurableSet S ∧ Function.eval i ⁻¹' t i = cylinder s S
state_after: case a
ι : Type u_1
α : ι → Type u_2
inst✝ : (i : ι) → MeasurableSpace (α i)
s t✝ : Set ((i : ι) → α i)
i : ι
t : (i : ι) → Set (α i)
ht : ∀ (i : ι), MeasurableSet (t i)
⊢ Function.eval i ⁻¹' t i = cylinder {i} {f | f ⟨i, ⋯⟩ ∈ t i}

tactic: ext1 x
state_before: case a
ι : Type u_1
α : ι → Type u_2
inst✝ : (i : ι) → MeasurableSpace (α i)
s t✝ : Set ((i : ι) → α i)
i : ι
t : (i : ι) → Set (α i)
ht : ∀ (i : ι), MeasurableSet (t i)
⊢ Function.eval i ⁻¹' t i = cylinder {i} {f | f ⟨i, ⋯⟩ ∈ t i}
state_after: case a.h
ι : Type u_1
α : ι → Type u_2
inst✝ : (i : ι) → MeasurableSpace (α i)
s t✝ : Set ((i : ι) → α i)
i : ι
t : (i : ι) → Set (α i)
ht : ∀ (i : ι), MeasurableSet (t i)
x : (x : ι) → α x
⊢ x ∈ Function.eval i ⁻¹' t i ↔ x ∈ cylinder {i} {f | f ⟨i, ⋯⟩ ∈ t i}

tactic: simp only [singleton_pi, Function.eval, mem_preimage, mem_cylinder, mem_setOf_eq]
state_before: case a.h
ι : Type u_1
α : ι → Type u_2
inst✝ : (i : ι) → MeasurableSpace (α i)
s t✝ : Set ((i : ι) → α i)
i : ι
t : (i : ι) → Set (α i)
ht : ∀ (i : ι), MeasurableSet (t i)
x : (x : ι) → α x
⊢ x ∈ Function.eval i ⁻¹' t i ↔ x ∈ cylinder {i} {f | f ⟨i, ⋯⟩ ∈ t i}
state_after: no goals