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

tactic: simp only [Function.eval, singleton_pi, ge_iff_le]
state_before: ι : Type u_2
α✝ : ι → Type ?u.4966
α : ι → Type u_1
m : (i : ι) → MeasurableSpace (α i)
i : ι
⊢ MeasurableSpace.comap (Function.eval i) (m i) ≤
    MeasurableSpace.generateFrom ((fun t => {i}.pi t) '' univ.pi fun i => {s | MeasurableSet s})
state_after: ι : Type u_2
α✝ : ι → Type ?u.4966
α : ι → Type u_1
m : (i : ι) → MeasurableSpace (α i)
i : ι
⊢ MeasurableSpace.comap (Function.eval i) (m i) ≤
    MeasurableSpace.generateFrom ((fun a => Function.eval i ⁻¹' a i) '' univ.pi fun i => {s | MeasurableSet s})

tactic: rw [MeasurableSpace.comap_eq_generateFrom]
state_before: ι : Type u_2
α✝ : ι → Type ?u.4966
α : ι → Type u_1
m : (i : ι) → MeasurableSpace (α i)
i : ι
⊢ MeasurableSpace.comap (Function.eval i) (m i) ≤
    MeasurableSpace.generateFrom ((fun a => Function.eval i ⁻¹' a i) '' univ.pi fun i => {s | MeasurableSet s})
state_after: ι : Type u_2
α✝ : ι → Type ?u.4966
α : ι → Type u_1
m : (i : ι) → MeasurableSpace (α i)
i : ι
⊢ MeasurableSpace.generateFrom {t | ∃ s, MeasurableSet s ∧ Function.eval i ⁻¹' s = t} ≤
    MeasurableSpace.generateFrom ((fun a => Function.eval i ⁻¹' a i) '' univ.pi fun i => {s | MeasurableSet s})

tactic: refine MeasurableSpace.generateFrom_mono fun S ↦ ?_
state_before: ι : Type u_2
α✝ : ι → Type ?u.4966
α : ι → Type u_1
m : (i : ι) → MeasurableSpace (α i)
i : ι
⊢ MeasurableSpace.generateFrom {t | ∃ s, MeasurableSet s ∧ Function.eval i ⁻¹' s = t} ≤
    MeasurableSpace.generateFrom ((fun a => Function.eval i ⁻¹' a i) '' univ.pi fun i => {s | MeasurableSet s})
state_after: ι : Type u_2
α✝ : ι → Type ?u.4966
α : ι → Type u_1
m : (i : ι) → MeasurableSpace (α i)
i : ι
S : Set ((x : ι) → α x)
⊢ S ∈ {t | ∃ s, MeasurableSet s ∧ Function.eval i ⁻¹' s = t} →
    S ∈ (fun a => Function.eval i ⁻¹' a i) '' univ.pi fun i => {s | MeasurableSet s}

tactic: simp only [mem_setOf_eq, mem_image, mem_univ_pi, forall_exists_index, and_imp]
state_before: ι : Type u_2
α✝ : ι → Type ?u.4966
α : ι → Type u_1
m : (i : ι) → MeasurableSpace (α i)
i : ι
S : Set ((x : ι) → α x)
⊢ S ∈ {t | ∃ s, MeasurableSet s ∧ Function.eval i ⁻¹' s = t} →
    S ∈ (fun a => Function.eval i ⁻¹' a i) '' univ.pi fun i => {s | MeasurableSet s}
state_after: ι : Type u_2
α✝ : ι → Type ?u.4966
α : ι → Type u_1
m : (i : ι) → MeasurableSpace (α i)
i : ι
S : Set ((x : ι) → α x)
⊢ ∀ (x : Set (α i)),
    MeasurableSet x → Function.eval i ⁻¹' x = S → ∃ x, (∀ (i : ι), MeasurableSet (x i)) ∧ Function.eval i ⁻¹' x i = S

tactic: intro t ht h
state_before: ι : Type u_2
α✝ : ι → Type ?u.4966
α : ι → Type u_1
m : (i : ι) → MeasurableSpace (α i)
i : ι
S : Set ((x : ι) → α x)
⊢ ∀ (x : Set (α i)),
    MeasurableSet x → Function.eval i ⁻¹' x = S → ∃ x, (∀ (i : ι), MeasurableSet (x i)) ∧ Function.eval i ⁻¹' x i = S
state_after: ι : Type u_2
α✝ : ι → Type ?u.4966
α : ι → Type u_1
m : (i : ι) → MeasurableSpace (α i)
i : ι
S : Set ((x : ι) → α x)
t : Set (α i)
ht : MeasurableSet t
h : Function.eval i ⁻¹' t = S
⊢ ∃ x, (∀ (i : ι), MeasurableSet (x i)) ∧ Function.eval i ⁻¹' x i = S

tactic: refine ⟨fun j ↦ if hji : j = i then by convert t else univ, fun j ↦ ?_, ?_⟩
state_before: ι : Type u_2
α✝ : ι → Type ?u.4966
α : ι → Type u_1
m : (i : ι) → MeasurableSpace (α i)
i : ι
S : Set ((x : ι) → α x)
t : Set (α i)
ht : MeasurableSet t
h : Function.eval i ⁻¹' t = S
⊢ ∃ x, (∀ (i : ι), MeasurableSet (x i)) ∧ Function.eval i ⁻¹' x i = S
state_after: case refine_1
ι : Type u_2
α✝ : ι → Type ?u.4966
α : ι → Type u_1
m : (i : ι) → MeasurableSpace (α i)
i : ι
S : Set ((x : ι) → α x)
t : Set (α i)
ht : MeasurableSet t
h : Function.eval i ⁻¹' t = S
j : ι
⊢ MeasurableSet ((fun j => if hji : j = i then ⋯.mpr (id t) else univ) j)

case refine_2
ι : Type u_2
α✝ : ι → Type ?u.4966
α : ι → Type u_1
m : (i : ι) → MeasurableSpace (α i)
i : ι
S : Set ((x : ι) → α x)
t : Set (α i)
ht : MeasurableSet t
h : Function.eval i ⁻¹' t = S
⊢ Function.eval i ⁻¹' (fun j => if hji : j = i then ⋯.mpr (id t) else univ) i = S

tactic: convert t
state_before: ι : Type u_2
α✝ : ι → Type ?u.4966
α : ι → Type u_1
m : (i : ι) → MeasurableSpace (α i)
i : ι
S : Set ((x : ι) → α x)
t : Set (α i)
ht : MeasurableSet t
h : Function.eval i ⁻¹' t = S
j : ι
hji : j = i
⊢ Set (α j)
state_after: no goals

tactic: by_cases hji : j = i
state_before: case refine_1
ι : Type u_2
α✝ : ι → Type ?u.4966
α : ι → Type u_1
m : (i : ι) → MeasurableSpace (α i)
i : ι
S : Set ((x : ι) → α x)
t : Set (α i)
ht : MeasurableSet t
h : Function.eval i ⁻¹' t = S
j : ι
⊢ MeasurableSet ((fun j => if hji : j = i then ⋯.mpr (id t) else univ) j)
state_after: case pos
ι : Type u_2
α✝ : ι → Type ?u.4966
α : ι → Type u_1
m : (i : ι) → MeasurableSpace (α i)
i : ι
S : Set ((x : ι) → α x)
t : Set (α i)
ht : MeasurableSet t
h : Function.eval i ⁻¹' t = S
j : ι
hji : j = i
⊢ MeasurableSet ((fun j => if hji : j = i then ⋯.mpr (id t) else univ) j)

case neg
ι : Type u_2
α✝ : ι → Type ?u.4966
α : ι → Type u_1
m : (i : ι) → MeasurableSpace (α i)
i : ι
S : Set ((x : ι) → α x)
t : Set (α i)
ht : MeasurableSet t
h : Function.eval i ⁻¹' t = S
j : ι
hji : ¬j = i
⊢ MeasurableSet ((fun j => if hji : j = i then ⋯.mpr (id t) else univ) j)

tactic: simp only [hji, eq_self_iff_true, eq_mpr_eq_cast, dif_pos]
state_before: case pos
ι : Type u_2
α✝ : ι → Type ?u.4966
α : ι → Type u_1
m : (i : ι) → MeasurableSpace (α i)
i : ι
S : Set ((x : ι) → α x)
t : Set (α i)
ht : MeasurableSet t
h : Function.eval i ⁻¹' t = S
j : ι
hji : j = i
⊢ MeasurableSet ((fun j => if hji : j = i then ⋯.mpr (id t) else univ) j)
state_after: case pos
ι : Type u_2
α✝ : ι → Type ?u.4966
α : ι → Type u_1
m : (i : ι) → MeasurableSpace (α i)
i : ι
S : Set ((x : ι) → α x)
t : Set (α i)
ht : MeasurableSet t
h : Function.eval i ⁻¹' t = S
j : ι
hji : j = i
⊢ MeasurableSet (cast ⋯ (id t))

tactic: convert ht
state_before: case pos
ι : Type u_2
α✝ : ι → Type ?u.4966
α : ι → Type u_1
m : (i : ι) → MeasurableSpace (α i)
i : ι
S : Set ((x : ι) → α x)
t : Set (α i)
ht : MeasurableSet t
h : Function.eval i ⁻¹' t = S
j : ι
hji : j = i
⊢ MeasurableSet (cast ⋯ (id t))
state_after: case h.e'_3
ι : Type u_2
α✝ : ι → Type ?u.4966
α : ι → Type u_1
m : (i : ι) → MeasurableSpace (α i)
i : ι
S : Set ((x : ι) → α x)
t : Set (α i)
ht : MeasurableSet t
h : Function.eval i ⁻¹' t = S
j : ι
hji : j = i
e_1✝ : α j = α i
⊢ HEq (cast ⋯ (id t)) t

tactic: simp only [id_eq, cast_heq]
state_before: case h.e'_3
ι : Type u_2
α✝ : ι → Type ?u.4966
α : ι → Type u_1
m : (i : ι) → MeasurableSpace (α i)
i : ι
S : Set ((x : ι) → α x)
t : Set (α i)
ht : MeasurableSet t
h : Function.eval i ⁻¹' t = S
j : ι
hji : j = i
e_1✝ : α j = α i
⊢ HEq (cast ⋯ (id t)) t
state_after: no goals

tactic: simp only [hji, not_false_iff, dif_neg, MeasurableSet.univ]
state_before: case neg
ι : Type u_2
α✝ : ι → Type ?u.4966
α : ι → Type u_1
m : (i : ι) → MeasurableSpace (α i)
i : ι
S : Set ((x : ι) → α x)
t : Set (α i)
ht : MeasurableSet t
h : Function.eval i ⁻¹' t = S
j : ι
hji : ¬j = i
⊢ MeasurableSet ((fun j => if hji : j = i then ⋯.mpr (id t) else univ) j)
state_after: no goals

tactic: simp only [id_eq, eq_mpr_eq_cast, ← h]
state_before: case refine_2
ι : Type u_2
α✝ : ι → Type ?u.4966
α : ι → Type u_1
m : (i : ι) → MeasurableSpace (α i)
i : ι
S : Set ((x : ι) → α x)
t : Set (α i)
ht : MeasurableSet t
h : Function.eval i ⁻¹' t = S
⊢ Function.eval i ⁻¹' (fun j => if hji : j = i then ⋯.mpr (id t) else univ) i = S
state_after: case refine_2
ι : Type u_2
α✝ : ι → Type ?u.4966
α : ι → Type u_1
m : (i : ι) → MeasurableSpace (α i)
i : ι
S : Set ((x : ι) → α x)
t : Set (α i)
ht : MeasurableSet t
h : Function.eval i ⁻¹' t = S
⊢ (Function.eval i ⁻¹' if h_1 : True then cast ⋯ t else univ) = Function.eval i ⁻¹' t

tactic: ext1 x
state_before: case refine_2
ι : Type u_2
α✝ : ι → Type ?u.4966
α : ι → Type u_1
m : (i : ι) → MeasurableSpace (α i)
i : ι
S : Set ((x : ι) → α x)
t : Set (α i)
ht : MeasurableSet t
h : Function.eval i ⁻¹' t = S
⊢ (Function.eval i ⁻¹' if h_1 : True then cast ⋯ t else univ) = Function.eval i ⁻¹' t
state_after: case refine_2.h
ι : Type u_2
α✝ : ι → Type ?u.4966
α : ι → Type u_1
m : (i : ι) → MeasurableSpace (α i)
i : ι
S : Set ((x : ι) → α x)
t : Set (α i)
ht : MeasurableSet t
h : Function.eval i ⁻¹' t = S
x : (x : ι) → α x
⊢ (x ∈ Function.eval i ⁻¹' if h_1 : True then cast ⋯ t else univ) ↔ x ∈ Function.eval i ⁻¹' t

tactic: simp only [singleton_pi, Function.eval, cast_eq, dite_eq_ite, ite_true, mem_preimage]
state_before: case refine_2.h
ι : Type u_2
α✝ : ι → Type ?u.4966
α : ι → Type u_1
m : (i : ι) → MeasurableSpace (α i)
i : ι
S : Set ((x : ι) → α x)
t : Set (α i)
ht : MeasurableSet t
h : Function.eval i ⁻¹' t = S
x : (x : ι) → α x
⊢ (x ∈ Function.eval i ⁻¹' if h_1 : True then cast ⋯ t else univ) ↔ x ∈ Function.eval i ⁻¹' t
state_after: no goals