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

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 : 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: 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)
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: ext1 f
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: 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 ↔ 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: 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
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: specialize h_eq fun i ↦ if hi : i ∈ I then f ⟨i, hi⟩ else h_nonempty.some i
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: 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
f : (i : { x // x ∈ I }) → α ↑i
h_eq :
  (fun i => if hi : ↑i ∈ I then f ⟨↑i, hi⟩ else h_nonempty.some ↑i) ∈ S ↔
    (fun i => if hi : ↑i ∈ I then f ⟨↑i, hi⟩ else h_nonempty.some ↑i) ∈ T
⊢ f ∈ S ↔ (fun j => f ⟨↑j, ⋯⟩) ∈ T

tactic: have h_mem : ∀ j : J, ↑j ∈ I := fun j ↦ hJI j.prop
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
f : (i : { x // x ∈ I }) → α ↑i
h_eq :
  (fun i => if hi : ↑i ∈ I then f ⟨↑i, hi⟩ else h_nonempty.some ↑i) ∈ S ↔
    (fun i => if hi : ↑i ∈ I then f ⟨↑i, hi⟩ else h_nonempty.some ↑i) ∈ T
⊢ f ∈ S ↔ (fun 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
f : (i : { x // x ∈ I }) → α ↑i
h_eq :
  (fun i => if hi : ↑i ∈ I then f ⟨↑i, hi⟩ else h_nonempty.some ↑i) ∈ S ↔
    (fun i => if hi : ↑i ∈ I then f ⟨↑i, hi⟩ else h_nonempty.some ↑i) ∈ T
h_mem : ∀ (j : { x // x ∈ J }), ↑j ∈ I
⊢ f ∈ S ↔ (fun j => f ⟨↑j, ⋯⟩) ∈ T

tactic: simp only [Finset.coe_mem, dite_true, h_mem] at h_eq
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
f : (i : { x // x ∈ I }) → α ↑i
h_eq :
  (fun i => if hi : ↑i ∈ I then f ⟨↑i, hi⟩ else h_nonempty.some ↑i) ∈ S ↔
    (fun i => if hi : ↑i ∈ I then f ⟨↑i, hi⟩ else h_nonempty.some ↑i) ∈ T
h_mem : ∀ (j : { x // x ∈ J }), ↑j ∈ I
⊢ f ∈ S ↔ (fun 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
f : (i : { x // x ∈ I }) → α ↑i
h_mem : ∀ (j : { x // x ∈ J }), ↑j ∈ I
h_eq : (fun i => f ⟨↑i, ⋯⟩) ∈ S ↔ (fun i => f ⟨↑i, ⋯⟩) ∈ T
⊢ f ∈ S ↔ (fun j => f ⟨↑j, ⋯⟩) ∈ T

tactic: exact h_eq
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
f : (i : { x // x ∈ I }) → α ↑i
h_mem : ∀ (j : { x // x ∈ J }), ↑j ∈ I
h_eq : (fun i => f ⟨↑i, ⋯⟩) ∈ S ↔ (fun i => f ⟨↑i, ⋯⟩) ∈ T
⊢ f ∈ S ↔ (fun j => f ⟨↑j, ⋯⟩) ∈ T
state_after: no goals