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

tactic: refine ⟨fun h ↦ ?_, fun h ↦ by (rw [h]; exact cylinder_empty _)⟩
state_before: ι : Type u_1
α : ι → Type u_2
h_nonempty : Nonempty ((i : ι) → α i)
s : Finset ι
S : Set ((i : { x // x ∈ s }) → α ↑i)
⊢ cylinder s S = ∅ ↔ S = ∅
state_after: ι : Type u_1
α : ι → Type u_2
h_nonempty : Nonempty ((i : ι) → α i)
s : Finset ι
S : Set ((i : { x // x ∈ s }) → α ↑i)
h : cylinder s S = ∅
⊢ S = ∅

tactic: by_contra hS
state_before: ι : Type u_1
α : ι → Type u_2
h_nonempty : Nonempty ((i : ι) → α i)
s : Finset ι
S : Set ((i : { x // x ∈ s }) → α ↑i)
h : cylinder s S = ∅
⊢ S = ∅
state_after: ι : Type u_1
α : ι → Type u_2
h_nonempty : Nonempty ((i : ι) → α i)
s : Finset ι
S : Set ((i : { x // x ∈ s }) → α ↑i)
h : cylinder s S = ∅
hS : ¬S = ∅
⊢ False

tactic: rw [← Ne, ← nonempty_iff_ne_empty] at hS
state_before: ι : Type u_1
α : ι → Type u_2
h_nonempty : Nonempty ((i : ι) → α i)
s : Finset ι
S : Set ((i : { x // x ∈ s }) → α ↑i)
h : cylinder s S = ∅
hS : ¬S = ∅
⊢ False
state_after: ι : Type u_1
α : ι → Type u_2
h_nonempty : Nonempty ((i : ι) → α i)
s : Finset ι
S : Set ((i : { x // x ∈ s }) → α ↑i)
h : cylinder s S = ∅
hS : S.Nonempty
⊢ False

tactic: let f := hS.some
state_before: ι : Type u_1
α : ι → Type u_2
h_nonempty : Nonempty ((i : ι) → α i)
s : Finset ι
S : Set ((i : { x // x ∈ s }) → α ↑i)
h : cylinder s S = ∅
hS : S.Nonempty
⊢ False
state_after: ι : Type u_1
α : ι → Type u_2
h_nonempty : Nonempty ((i : ι) → α i)
s : Finset ι
S : Set ((i : { x // x ∈ s }) → α ↑i)
h : cylinder s S = ∅
hS : S.Nonempty
f : (i : { x // x ∈ s }) → α ↑i := hS.some
⊢ False

tactic: have hf : f ∈ S := hS.choose_spec
state_before: ι : Type u_1
α : ι → Type u_2
h_nonempty : Nonempty ((i : ι) → α i)
s : Finset ι
S : Set ((i : { x // x ∈ s }) → α ↑i)
h : cylinder s S = ∅
hS : S.Nonempty
f : (i : { x // x ∈ s }) → α ↑i := hS.some
⊢ False
state_after: ι : Type u_1
α : ι → Type u_2
h_nonempty : Nonempty ((i : ι) → α i)
s : Finset ι
S : Set ((i : { x // x ∈ s }) → α ↑i)
h : cylinder s S = ∅
hS : S.Nonempty
f : (i : { x // x ∈ s }) → α ↑i := hS.some
hf : f ∈ S
⊢ False

tactic: classical
let f' : ∀ i, α i := fun i ↦ if hi : i ∈ s then f ⟨i, hi⟩ else h_nonempty.some i
have hf' : f' ∈ cylinder s S := by
  rw [mem_cylinder]
  simpa only [f', Finset.coe_mem, dif_pos]
rw [h] at hf'
exact not_mem_empty _ hf'
state_before: ι : Type u_1
α : ι → Type u_2
h_nonempty : Nonempty ((i : ι) → α i)
s : Finset ι
S : Set ((i : { x // x ∈ s }) → α ↑i)
h : cylinder s S = ∅
hS : S.Nonempty
f : (i : { x // x ∈ s }) → α ↑i := hS.some
hf : f ∈ S
⊢ False
state_after: no goals

tactic: (rw [h]; exact cylinder_empty _)
state_before: ι : Type u_1
α : ι → Type u_2
h_nonempty : Nonempty ((i : ι) → α i)
s : Finset ι
S : Set ((i : { x // x ∈ s }) → α ↑i)
h : S = ∅
⊢ cylinder s S = ∅
state_after: no goals

tactic: rw [h]
state_before: ι : Type u_1
α : ι → Type u_2
h_nonempty : Nonempty ((i : ι) → α i)
s : Finset ι
S : Set ((i : { x // x ∈ s }) → α ↑i)
h : S = ∅
⊢ cylinder s S = ∅
state_after: ι : Type u_1
α : ι → Type u_2
h_nonempty : Nonempty ((i : ι) → α i)
s : Finset ι
S : Set ((i : { x // x ∈ s }) → α ↑i)
h : S = ∅
⊢ cylinder s ∅ = ∅

tactic: exact cylinder_empty _
state_before: ι : Type u_1
α : ι → Type u_2
h_nonempty : Nonempty ((i : ι) → α i)
s : Finset ι
S : Set ((i : { x // x ∈ s }) → α ↑i)
h : S = ∅
⊢ cylinder s ∅ = ∅
state_after: no goals

tactic: let f' : ∀ i, α i := fun i ↦ if hi : i ∈ s then f ⟨i, hi⟩ else h_nonempty.some i
state_before: ι : Type u_1
α : ι → Type u_2
h_nonempty : Nonempty ((i : ι) → α i)
s : Finset ι
S : Set ((i : { x // x ∈ s }) → α ↑i)
h : cylinder s S = ∅
hS : S.Nonempty
f : (i : { x // x ∈ s }) → α ↑i := hS.some
hf : f ∈ S
⊢ False
state_after: ι : Type u_1
α : ι → Type u_2
h_nonempty : Nonempty ((i : ι) → α i)
s : Finset ι
S : Set ((i : { x // x ∈ s }) → α ↑i)
h : cylinder s S = ∅
hS : S.Nonempty
f : (i : { x // x ∈ s }) → α ↑i := hS.some
hf : f ∈ S
f' : (i : ι) → α i := fun i => if hi : i ∈ s then f ⟨i, hi⟩ else h_nonempty.some i
⊢ False

tactic: have hf' : f' ∈ cylinder s S := by
  rw [mem_cylinder]
  simpa only [f', Finset.coe_mem, dif_pos]
state_before: ι : Type u_1
α : ι → Type u_2
h_nonempty : Nonempty ((i : ι) → α i)
s : Finset ι
S : Set ((i : { x // x ∈ s }) → α ↑i)
h : cylinder s S = ∅
hS : S.Nonempty
f : (i : { x // x ∈ s }) → α ↑i := hS.some
hf : f ∈ S
f' : (i : ι) → α i := fun i => if hi : i ∈ s then f ⟨i, hi⟩ else h_nonempty.some i
⊢ False
state_after: ι : Type u_1
α : ι → Type u_2
h_nonempty : Nonempty ((i : ι) → α i)
s : Finset ι
S : Set ((i : { x // x ∈ s }) → α ↑i)
h : cylinder s S = ∅
hS : S.Nonempty
f : (i : { x // x ∈ s }) → α ↑i := hS.some
hf : f ∈ S
f' : (i : ι) → α i := fun i => if hi : i ∈ s then f ⟨i, hi⟩ else h_nonempty.some i
hf' : f' ∈ cylinder s S
⊢ False

tactic: rw [h] at hf'
state_before: ι : Type u_1
α : ι → Type u_2
h_nonempty : Nonempty ((i : ι) → α i)
s : Finset ι
S : Set ((i : { x // x ∈ s }) → α ↑i)
h : cylinder s S = ∅
hS : S.Nonempty
f : (i : { x // x ∈ s }) → α ↑i := hS.some
hf : f ∈ S
f' : (i : ι) → α i := fun i => if hi : i ∈ s then f ⟨i, hi⟩ else h_nonempty.some i
hf' : f' ∈ cylinder s S
⊢ False
state_after: ι : Type u_1
α : ι → Type u_2
h_nonempty : Nonempty ((i : ι) → α i)
s : Finset ι
S : Set ((i : { x // x ∈ s }) → α ↑i)
h : cylinder s S = ∅
hS : S.Nonempty
f : (i : { x // x ∈ s }) → α ↑i := hS.some
hf : f ∈ S
f' : (i : ι) → α i := fun i => if hi : i ∈ s then f ⟨i, hi⟩ else h_nonempty.some i
hf' : f' ∈ ∅
⊢ False

tactic: exact not_mem_empty _ hf'
state_before: ι : Type u_1
α : ι → Type u_2
h_nonempty : Nonempty ((i : ι) → α i)
s : Finset ι
S : Set ((i : { x // x ∈ s }) → α ↑i)
h : cylinder s S = ∅
hS : S.Nonempty
f : (i : { x // x ∈ s }) → α ↑i := hS.some
hf : f ∈ S
f' : (i : ι) → α i := fun i => if hi : i ∈ s then f ⟨i, hi⟩ else h_nonempty.some i
hf' : f' ∈ ∅
⊢ False
state_after: no goals

tactic: rw [mem_cylinder]
state_before: ι : Type u_1
α : ι → Type u_2
h_nonempty : Nonempty ((i : ι) → α i)
s : Finset ι
S : Set ((i : { x // x ∈ s }) → α ↑i)
h : cylinder s S = ∅
hS : S.Nonempty
f : (i : { x // x ∈ s }) → α ↑i := hS.some
hf : f ∈ S
f' : (i : ι) → α i := fun i => if hi : i ∈ s then f ⟨i, hi⟩ else h_nonempty.some i
⊢ f' ∈ cylinder s S
state_after: ι : Type u_1
α : ι → Type u_2
h_nonempty : Nonempty ((i : ι) → α i)
s : Finset ι
S : Set ((i : { x // x ∈ s }) → α ↑i)
h : cylinder s S = ∅
hS : S.Nonempty
f : (i : { x // x ∈ s }) → α ↑i := hS.some
hf : f ∈ S
f' : (i : ι) → α i := fun i => if hi : i ∈ s then f ⟨i, hi⟩ else h_nonempty.some i
⊢ (fun i => f' ↑i) ∈ S

tactic: simpa only [f', Finset.coe_mem, dif_pos]
state_before: ι : Type u_1
α : ι → Type u_2
h_nonempty : Nonempty ((i : ι) → α i)
s : Finset ι
S : Set ((i : { x // x ∈ s }) → α ↑i)
h : cylinder s S = ∅
hS : S.Nonempty
f : (i : { x // x ∈ s }) → α ↑i := hS.some
hf : f ∈ S
f' : (i : ι) → α i := fun i => if hi : i ∈ s then f ⟨i, hi⟩ else h_nonempty.some i
⊢ (fun i => f' ↑i) ∈ S
state_after: no goals