Theorem: Set.image_projection_prod
File: Mathlib/Data/Set/Lattice.lean

tactic: apply Subset.antisymm
state_before: α✝ : Type ?u.77979
β : Type ?u.77982
γ : Type ?u.77985
ι✝ : Sort ?u.77988
ι' : Sort ?u.77991
ι₂ : Sort ?u.77994
κ : ι✝ → Sort ?u.77999
κ₁ : ι✝ → Sort ?u.78004
κ₂ : ι✝ → Sort ?u.78009
κ' : ι' → Sort ?u.78014
ι : Type u_1
α : ι → Type u_2
v : (i : ι) → Set (α i)
hv : Set.Nonempty (pi univ v)
i : ι
⊢ ((fun x => x i) '' ⋂ (k : ι), (fun x => x k) ⁻¹' v k) = v i

tactic: simp [iInter_subset]
state_before: case h₁
α✝ : Type ?u.77979
β : Type ?u.77982
γ : Type ?u.77985
ι✝ : Sort ?u.77988
ι' : Sort ?u.77991
ι₂ : Sort ?u.77994
κ : ι✝ → Sort ?u.77999
κ₁ : ι✝ → Sort ?u.78004
κ₂ : ι✝ → Sort ?u.78009
κ' : ι' → Sort ?u.78014
ι : Type u_1
α : ι → Type u_2
v : (i : ι) → Set (α i)
hv : Set.Nonempty (pi univ v)
i : ι
⊢ ((fun x => x i) '' ⋂ (k : ι), (fun x => x k) ⁻¹' v k) ⊆ v i

tactic: intro y y_in
state_before: case h₂
α✝ : Type ?u.77979
β : Type ?u.77982
γ : Type ?u.77985
ι✝ : Sort ?u.77988
ι' : Sort ?u.77991
ι₂ : Sort ?u.77994
κ : ι✝ → Sort ?u.77999
κ₁ : ι✝ → Sort ?u.78004
κ₂ : ι✝ → Sort ?u.78009
κ' : ι' → Sort ?u.78014
ι : Type u_1
α : ι → Type u_2
v : (i : ι) → Set (α i)
hv : Set.Nonempty (pi univ v)
i : ι
⊢ v i ⊆ (fun x => x i) '' ⋂ (k : ι), (fun x => x k) ⁻¹' v k

tactic: simp only [mem_image, mem_iInter, mem_preimage]
state_before: case h₂
α✝ : Type ?u.77979
β : Type ?u.77982
γ : Type ?u.77985
ι✝ : Sort ?u.77988
ι' : Sort ?u.77991
ι₂ : Sort ?u.77994
κ : ι✝ → Sort ?u.77999
κ₁ : ι✝ → Sort ?u.78004
κ₂ : ι✝ → Sort ?u.78009
κ' : ι' → Sort ?u.78014
ι : Type u_1
α : ι → Type u_2
v : (i : ι) → Set (α i)
hv : Set.Nonempty (pi univ v)
i : ι
y : α i
y_in : y ∈ v i
⊢ y ∈ (fun x => x i) '' ⋂ (k : ι), (fun x => x k) ⁻¹' v k

tactic: rcases hv with ⟨z, hz⟩
state_before: case h₂
α✝ : Type ?u.77979
β : Type ?u.77982
γ : Type ?u.77985
ι✝ : Sort ?u.77988
ι' : Sort ?u.77991
ι₂ : Sort ?u.77994
κ : ι✝ → Sort ?u.77999
κ₁ : ι✝ → Sort ?u.78004
κ₂ : ι✝ → Sort ?u.78009
κ' : ι' → Sort ?u.78014
ι : Type u_1
α : ι → Type u_2
v : (i : ι) → Set (α i)
hv : Set.Nonempty (pi univ v)
i : ι
y : α i
y_in : y ∈ v i
⊢ ∃ x, (∀ (i : ι), x i ∈ v i) ∧ x i = y

tactic: refine' ⟨Function.update z i y, _, update_same i y z⟩
state_before: case h₂.intro
α✝ : Type ?u.77979
β : Type ?u.77982
γ : Type ?u.77985
ι✝ : Sort ?u.77988
ι' : Sort ?u.77991
ι₂ : Sort ?u.77994
κ : ι✝ → Sort ?u.77999
κ₁ : ι✝ → Sort ?u.78004
κ₂ : ι✝ → Sort ?u.78009
κ' : ι' → Sort ?u.78014
ι : Type u_1
α : ι → Type u_2
v : (i : ι) → Set (α i)
i : ι
y : α i
y_in : y ∈ v i
z : (i : ι) → α i
hz : z ∈ pi univ v
⊢ ∃ x, (∀ (i : ι), x i ∈ v i) ∧ x i = y

tactic: rw [@forall_update_iff ι α _ z i y fun i t => t ∈ v i]
state_before: case h₂.intro
α✝ : Type ?u.77979
β : Type ?u.77982
γ : Type ?u.77985
ι✝ : Sort ?u.77988
ι' : Sort ?u.77991
ι₂ : Sort ?u.77994
κ : ι✝ → Sort ?u.77999
κ₁ : ι✝ → Sort ?u.78004
κ₂ : ι✝ → Sort ?u.78009
κ' : ι' → Sort ?u.78014
ι : Type u_1
α : ι → Type u_2
v : (i : ι) → Set (α i)
i : ι
y : α i
y_in : y ∈ v i
z : (i : ι) → α i
hz : z ∈ pi univ v
⊢ ∀ (i_1 : ι), update z i y i_1 ∈ v i_1

tactic: exact ⟨y_in, fun j _ => by simpa using hz j⟩
state_before: case h₂.intro
α✝ : Type ?u.77979
β : Type ?u.77982
γ : Type ?u.77985
ι✝ : Sort ?u.77988
ι' : Sort ?u.77991
ι₂ : Sort ?u.77994
κ : ι✝ → Sort ?u.77999
κ₁ : ι✝ → Sort ?u.78004
κ₂ : ι✝ → Sort ?u.78009
κ' : ι' → Sort ?u.78014
ι : Type u_1
α : ι → Type u_2
v : (i : ι) → Set (α i)
i : ι
y : α i
y_in : y ∈ v i
z : (i : ι) → α i
hz : z ∈ pi univ v
⊢ y ∈ v i ∧ ∀ (x : ι), x ≠ i → z x ∈ v x

tactic: simpa using hz j
state_before: α✝ : Type ?u.77979
β : Type ?u.77982
γ : Type ?u.77985
ι✝ : Sort ?u.77988
ι' : Sort ?u.77991
ι₂ : Sort ?u.77994
κ : ι✝ → Sort ?u.77999
κ₁ : ι✝ → Sort ?u.78004
κ₂ : ι✝ → Sort ?u.78009
κ' : ι' → Sort ?u.78014
ι : Type u_1
α : ι → Type u_2
v : (i : ι) → Set (α i)
i : ι
y : α i
y_in : y ∈ v i
z : (i : ι) → α i
hz : z ∈ pi univ v
j : ι
x✝ : j ≠ i
⊢ z j ∈ v j