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

Proof steps:
state_before: ι : Type u_1
α : ι → Type u_2
h_nonempty : Nonempty ((i : ι) → α i)
I J : Finset ι
S : Set ((i : { x // x ∈ I }) → α ↑i)
T : Set ((i : { x // x ∈ J }) → α ↑i)
h_eq : cylinder I S = cylinder J T
hJI : J ⊆ I
⊢ S = (fun f j => f ⟨↑j, ⋯⟩) ⁻¹' T
state_after: ι : Type u_1
α : ι → Type u_2
h_nonempty : Nonempty ((i : ι) → α i)
I J : Finset ι
S : Set ((i : { x // x ∈ I }) → α ↑i)
T : Set ((i : { x // x ∈ J }) → α ↑i)
h_eq : ∀ (x : (i : ι) → α i), x ∈ cylinder I S ↔ x ∈ cylinder J T
hJI : J ⊆ I
⊢ S = (fun f j => f ⟨↑j, ⋯⟩) ⁻¹' T
tactic: rw [Set.ext_iff] at h_eq
state_before: ι : Type u_1
α : ι → Type u_2
h_nonempty : Nonempty ((i : ι) → α i)
I J : Finset ι
S : Set ((i : { x // x ∈ I }) → α ↑i)
T : Set ((i : { x // x ∈ J }) → α ↑i)
h_eq : ∀ (x : (i : ι) → α i), x ∈ cylinder I S ↔ x ∈ cylinder J T
hJI : J ⊆ I
⊢ S = (fun f j => f ⟨↑j, ⋯⟩) ⁻¹' T
state_after: ι : Type u_1
α : ι → Type u_2
h_nonempty : Nonempty ((i : ι) → α i)
I J : Finset ι
S : Set ((i : { x // x ∈ I }) → α ↑i)
T : Set ((i : { x // x ∈ J }) → α ↑i)
hJI : J ⊆ I
h_eq : ∀ (x : (i : ι) → α i), (fun i => x ↑i) ∈ S ↔ (fun i => x ↑i) ∈ T
⊢ S = (fun f j => f ⟨↑j, ⋯⟩) ⁻¹' T
tactic: simp only [mem_cylinder] at h_eq
state_before: ι : Type u_1
α : ι → Type u_2
h_nonempty : Nonempty ((i : ι) → α i)
I J : Finset ι
S : Set ((i : { x // x ∈ I }) → α ↑i)
T : Set ((i : { x // x ∈ J }) → α ↑i)
hJI : J ⊆ I
h_eq : ∀ (x : (i : ι) → α i), (fun i => x ↑i) ∈ S ↔ (fun i => x ↑i) ∈ T
⊢ S = (fun f j => f ⟨↑j, ⋯⟩) ⁻¹' T
state_after: case h
ι : Type u_1
α : ι → Type u_2
h_nonempty : Nonempty ((i : ι) → α i)
I J : Finset ι
S : Set ((i : { x // x ∈ I }) → α ↑i)
T : Set ((i : { x // x ∈ J }) → α ↑i)
hJI : J ⊆ I
h_eq : ∀ (x : (i : ι) → α i), (fun i => x ↑i) ∈ S ↔ (fun i => x ↑i) ∈ T
f : (i : { x // x ∈ I }) → α ↑i
⊢ f ∈ S ↔ f ∈ (fun f j => f ⟨↑j, ⋯⟩) ⁻¹' T
tactic: ext1 f
state_before: case h
ι : Type u_1
α : ι → Type u_2
h_nonempty : Nonempty ((i : ι) → α i)
I J : Finset ι
S : Set ((i : { x // x ∈ I }) → α ↑i)
T : Set ((i : { x // x ∈ J }) → α ↑i)
hJI : J ⊆ I
h_eq : ∀ (x : (i : ι) → α i), (fun i => x ↑i) ∈ S ↔ (fun i => x ↑i) ∈ T
f : (i : { x // x ∈ I }) → α ↑i
⊢ f ∈ S ↔ f ∈ (fun f j => f ⟨↑j, ⋯⟩) ⁻¹' T
state_after: case h
ι : Type u_1
α : ι → Type u_2
h_nonempty : Nonempty ((i : ι) → α i)
I J : Finset ι
S : Set ((i : { x // x ∈ I }) → α ↑i)
T : Set ((i : { x // x ∈ J }) → α ↑i)
hJI : J ⊆ I
h_eq : ∀ (x : (i : ι) → α i), (fun i => x ↑i) ∈ S ↔ (fun i => x ↑i) ∈ T
f : (i : { x // x ∈ I }) → α ↑i
⊢ f ∈ S ↔ (fun j => f ⟨↑j, ⋯⟩) ∈ T
tactic: simp only [mem_preimage]
state_before: case h
ι : Type u_1
α : ι → Type u_2
h_nonempty : Nonempty ((i : ι) → α i)
I J : Finset ι
S : Set ((i : { x // x ∈ I }) → α ↑i)
T : Set ((i : { x // x ∈ J }) → α ↑i)
hJI : J ⊆ I
h_eq : ∀ (x : (i : ι) → α i), (fun i => x ↑i) ∈ S ↔ (fun i => x ↑i) ∈ T
f : (i : { x // x ∈ I }) → α ↑i
⊢ f ∈ S ↔ (fun j => f ⟨↑j, ⋯⟩) ∈ T
state_after: no goals
tactic: classical
  specialize h_eq fun i ↦ if hi : i ∈ I then f ⟨i, hi⟩ else h_nonempty.some i
  have h_mem : ∀ j : J, ↑j ∈ I := fun j ↦ hJI j.prop
  simp only [Finset.coe_mem, dite_true, h_mem] at h_eq
  exact h_eq