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

tactic: apply le_antisymm
state_before: ι : Type u_2
α : ι → Type u_1
inst✝ : (i : ι) → MeasurableSpace (α i)
⊢ MeasurableSpace.generateFrom (squareCylinders fun i => {s | MeasurableSet s}) = MeasurableSpace.pi
state_after: case a
ι : Type u_2
α : ι → Type u_1
inst✝ : (i : ι) → MeasurableSpace (α i)
⊢ MeasurableSpace.generateFrom (squareCylinders fun i => {s | MeasurableSet s}) ≤ MeasurableSpace.pi

case a
ι : Type u_2
α : ι → Type u_1
inst✝ : (i : ι) → MeasurableSpace (α i)
⊢ MeasurableSpace.pi ≤ MeasurableSpace.generateFrom (squareCylinders fun i => {s | MeasurableSet s})

tactic: rw [MeasurableSpace.generateFrom_le_iff]
state_before: case a
ι : Type u_2
α : ι → Type u_1
inst✝ : (i : ι) → MeasurableSpace (α i)
⊢ MeasurableSpace.generateFrom (squareCylinders fun i => {s | MeasurableSet s}) ≤ MeasurableSpace.pi
state_after: case a
ι : Type u_2
α : ι → Type u_1
inst✝ : (i : ι) → MeasurableSpace (α i)
⊢ (squareCylinders fun i => {s | MeasurableSet s}) ⊆ {t | MeasurableSet t}

tactic: rintro S ⟨s, t, h, rfl⟩
state_before: case a
ι : Type u_2
α : ι → Type u_1
inst✝ : (i : ι) → MeasurableSpace (α i)
⊢ (squareCylinders fun i => {s | MeasurableSet s}) ⊆ {t | MeasurableSet t}
state_after: case a.intro.intro.intro
ι : Type u_2
α : ι → Type u_1
inst✝ : (i : ι) → MeasurableSpace (α i)
s : Finset ι
t : (i : ι) → Set (α i)
h : t ∈ univ.pi fun i => {s | MeasurableSet s}
⊢ (↑s).pi t ∈ {t | MeasurableSet t}

tactic: simp only [mem_univ_pi, mem_setOf_eq] at h
state_before: case a.intro.intro.intro
ι : Type u_2
α : ι → Type u_1
inst✝ : (i : ι) → MeasurableSpace (α i)
s : Finset ι
t : (i : ι) → Set (α i)
h : t ∈ univ.pi fun i => {s | MeasurableSet s}
⊢ (↑s).pi t ∈ {t | MeasurableSet t}
state_after: case a.intro.intro.intro
ι : Type u_2
α : ι → Type u_1
inst✝ : (i : ι) → MeasurableSpace (α i)
s : Finset ι
t : (i : ι) → Set (α i)
h : ∀ (i : ι), MeasurableSet (t i)
⊢ (↑s).pi t ∈ {t | MeasurableSet t}

tactic: exact MeasurableSet.pi (Finset.countable_toSet _) (fun i _ ↦ h i)
state_before: case a.intro.intro.intro
ι : Type u_2
α : ι → Type u_1
inst✝ : (i : ι) → MeasurableSpace (α i)
s : Finset ι
t : (i : ι) → Set (α i)
h : ∀ (i : ι), MeasurableSet (t i)
⊢ (↑s).pi t ∈ {t | MeasurableSet t}
state_after: no goals

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

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

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

tactic: rw [← Finset.coe_singleton, squareCylinders_eq_iUnion_image]
state_before: case a
ι : Type u_2
α : ι → Type u_1
inst✝ : (i : ι) → MeasurableSpace (α i)
i : ι
⊢ ((fun t => {i}.pi t) '' univ.pi fun i => {s | MeasurableSet s}) ⊆ squareCylinders fun i => {s | MeasurableSet s}
state_after: case a
ι : Type u_2
α : ι → Type u_1
inst✝ : (i : ι) → MeasurableSpace (α i)
i : ι
⊢ ((fun t => (↑{i}).pi t) '' univ.pi fun i => {s | MeasurableSet s}) ⊆
    ⋃ s, (fun t => (↑s).pi t) '' univ.pi fun i => {s | MeasurableSet s}

tactic: exact subset_iUnion
  (fun (s : Finset ι) ↦
    (fun t : ∀ i, Set (α i) ↦ (s : Set ι).pi t) '' univ.pi (fun i ↦ setOf MeasurableSet))
  ({i} : Finset ι)
state_before: case a
ι : Type u_2
α : ι → Type u_1
inst✝ : (i : ι) → MeasurableSpace (α i)
i : ι
⊢ ((fun t => (↑{i}).pi t) '' univ.pi fun i => {s | MeasurableSet s}) ⊆
    ⋃ s, (fun t => (↑s).pi t) '' univ.pi fun i => {s | MeasurableSet s}
state_after: no goals