-- Mathlib/LinearAlgebra/AffineSpace/AffineMap.lean
theorem image_vsub_image {s t : Set P1} (f : P1 →ᵃ[k] P2) :
    f '' s -ᵥ f '' t = f.linear '' (s -ᵥ t)

Proof state:
k : Type u_1
V1 : Type u_2
P1 : Type u_3
V2 : Type u_4
P2 : Type u_5
inst✝⁶ : Ring k
inst✝⁵ : AddCommGroup V1
inst✝⁴ : Module k V1
inst✝³ : AffineSpace V1 P1
inst✝² : AddCommGroup V2
inst✝¹ : Module k V2
inst✝ : AffineSpace V2 P2
s t : Set P1
f : P1 →ᵃ[k] P2
⊢ ⇑f '' s -ᵥ ⇑f '' t = ⇑f.linear '' (s -ᵥ t)

Tactic:
ext v

Result:
case h
k : Type u_1
V1 : Type u_2
P1 : Type u_3
V2 : Type u_4
P2 : Type u_5
inst✝⁶ : Ring k
inst✝⁵ : AddCommGroup V1
inst✝⁴ : Module k V1
inst✝³ : AffineSpace V1 P1
inst✝² : AddCommGroup V2
inst✝¹ : Module k V2
inst✝ : AffineSpace V2 P2
s t : Set P1
f : P1 →ᵃ[k] P2
v : V2
⊢ v ∈ ⇑f '' s -ᵥ ⇑f '' t ↔ v ∈ ⇑f.linear '' (s -ᵥ t)

Proof state:
case h
k : Type u_1
V1 : Type u_2
P1 : Type u_3
V2 : Type u_4
P2 : Type u_5
inst✝⁶ : Ring k
inst✝⁵ : AddCommGroup V1
inst✝⁴ : Module k V1
inst✝³ : AffineSpace V1 P1
inst✝² : AddCommGroup V2
inst✝¹ : Module k V2
inst✝ : AffineSpace V2 P2
s t : Set P1
f : P1 →ᵃ[k] P2
v : V2
⊢ v ∈ ⇑f '' s -ᵥ ⇑f '' t ↔ v ∈ ⇑f.linear '' (s -ᵥ t)

Tactic:
simp only [Set.mem_vsub, Set.mem_image,
  exists_exists_and_eq_and, exists_and_left, ← f.linearMap_vsub]

Result:
case h
k : Type u_1
V1 : Type u_2
P1 : Type u_3
V2 : Type u_4
P2 : Type u_5
inst✝⁶ : Ring k
inst✝⁵ : AddCommGroup V1
inst✝⁴ : Module k V1
inst✝³ : AffineSpace V1 P1
inst✝² : AddCommGroup V2
inst✝¹ : Module k V2
inst✝ : AffineSpace V2 P2
s t : Set P1
f : P1 →ᵃ[k] P2
v : V2
⊢ (∃ a ∈ s, ∃ a_1 ∈ t, f.linear (a -ᵥ a_1) = v) ↔ ∃ x, (∃ x_1 ∈ s, ∃ y ∈ t, x_1 -ᵥ y = x) ∧ f.linear x = v

Proof state:
case h.mp
k : Type u_1
V1 : Type u_2
P1 : Type u_3
V2 : Type u_4
P2 : Type u_5
inst✝⁶ : Ring k
inst✝⁵ : AddCommGroup V1
inst✝⁴ : Module k V1
inst✝³ : AffineSpace V1 P1
inst✝² : AddCommGroup V2
inst✝¹ : Module k V2
inst✝ : AffineSpace V2 P2
s t : Set P1
f : P1 →ᵃ[k] P2
v : V2
⊢ (∃ a ∈ s, ∃ a_1 ∈ t, f.linear (a -ᵥ a_1) = v) → ∃ x, (∃ x_1 ∈ s, ∃ y ∈ t, x_1 -ᵥ y = x) ∧ f.linear x = v

Tactic:
rintro ⟨x, hx, y, hy, hv⟩

Result:
case h.mp.intro.intro.intro.intro
k : Type u_1
V1 : Type u_2
P1 : Type u_3
V2 : Type u_4
P2 : Type u_5
inst✝⁶ : Ring k
inst✝⁵ : AddCommGroup V1
inst✝⁴ : Module k V1
inst✝³ : AffineSpace V1 P1
inst✝² : AddCommGroup V2
inst✝¹ : Module k V2
inst✝ : AffineSpace V2 P2
s t : Set P1
f : P1 →ᵃ[k] P2
v : V2
x : P1
hx : x ∈ s
y : P1
hy : y ∈ t
hv : f.linear (x -ᵥ y) = v
⊢ ∃ x, (∃ x_1 ∈ s, ∃ y ∈ t, x_1 -ᵥ y = x) ∧ f.linear x = v

Proof state:
case h.mp.intro.intro.intro.intro
k : Type u_1
V1 : Type u_2
P1 : Type u_3
V2 : Type u_4
P2 : Type u_5
inst✝⁶ : Ring k
inst✝⁵ : AddCommGroup V1
inst✝⁴ : Module k V1
inst✝³ : AffineSpace V1 P1
inst✝² : AddCommGroup V2
inst✝¹ : Module k V2
inst✝ : AffineSpace V2 P2
s t : Set P1
f : P1 →ᵃ[k] P2
v : V2
x : P1
hx : x ∈ s
y : P1
hy : y ∈ t
hv : f.linear (x -ᵥ y) = v
⊢ ∃ x, (∃ x_1 ∈ s, ∃ y ∈ t, x_1 -ᵥ y = x) ∧ f.linear x = v

Tactic:
exact ⟨x -ᵥ y, ⟨x, hx, y, hy, rfl⟩, hv⟩

Result:
no goals

Proof state:
case h.mpr.intro.intro.intro.intro.intro.intro
k : Type u_1
V1 : Type u_2
P1 : Type u_3
V2 : Type u_4
P2 : Type u_5
inst✝⁶ : Ring k
inst✝⁵ : AddCommGroup V1
inst✝⁴ : Module k V1
inst✝³ : AffineSpace V1 P1
inst✝² : AddCommGroup V2
inst✝¹ : Module k V2
inst✝ : AffineSpace V2 P2
s t : Set P1
f : P1 →ᵃ[k] P2
x : P1
hx : x ∈ s
y : P1
hy : y ∈ t
⊢ ∃ a ∈ s, ∃ a_1 ∈ t, f.linear (a -ᵥ a_1) = f.linear (x -ᵥ y)

Tactic:
exact ⟨x, hx, y, hy, rfl⟩

Result:
no goals

Proof state:
case h
k : Type u_1
V1 : Type u_2
P1 : Type u_3
V2 : Type u_4
P2 : Type u_5
inst✝⁶ : Ring k
inst✝⁵ : AddCommGroup V1
inst✝⁴ : Module k V1
inst✝³ : AffineSpace V1 P1
inst✝² : AddCommGroup V2
inst✝¹ : Module k V2
inst✝ : AffineSpace V2 P2
s t : Set P1
f : P1 →ᵃ[k] P2
v : V2
⊢ (∃ a ∈ s, ∃ a_1 ∈ t, f.linear (a -ᵥ a_1) = v) ↔ ∃ x, (∃ x_1 ∈ s, ∃ y ∈ t, x_1 -ᵥ y = x) ∧ f.linear x = v

Tactic:
constructor

Result:
case h.mp
k : Type u_1
V1 : Type u_2
P1 : Type u_3
V2 : Type u_4
P2 : Type u_5
inst✝⁶ : Ring k
inst✝⁵ : AddCommGroup V1
inst✝⁴ : Module k V1
inst✝³ : AffineSpace V1 P1
inst✝² : AddCommGroup V2
inst✝¹ : Module k V2
inst✝ : AffineSpace V2 P2
s t : Set P1
f : P1 →ᵃ[k] P2
v : V2
⊢ (∃ a ∈ s, ∃ a_1 ∈ t, f.linear (a -ᵥ a_1) = v) → ∃ x, (∃ x_1 ∈ s, ∃ y ∈ t, x_1 -ᵥ y = x) ∧ f.linear x = v

case h.mpr
k : Type u_1
V1 : Type u_2
P1 : Type u_3
V2 : Type u_4
P2 : Type u_5
inst✝⁶ : Ring k
inst✝⁵ : AddCommGroup V1
inst✝⁴ : Module k V1
inst✝³ : AffineSpace V1 P1
inst✝² : AddCommGroup V2
inst✝¹ : Module k V2
inst✝ : AffineSpace V2 P2
s t : Set P1
f : P1 →ᵃ[k] P2
v : V2
⊢ (∃ x, (∃ x_1 ∈ s, ∃ y ∈ t, x_1 -ᵥ y = x) ∧ f.linear x = v) → ∃ a ∈ s, ∃ a_1 ∈ t, f.linear (a -ᵥ a_1) = v

Proof state:
case h.mpr
k : Type u_1
V1 : Type u_2
P1 : Type u_3
V2 : Type u_4
P2 : Type u_5
inst✝⁶ : Ring k
inst✝⁵ : AddCommGroup V1
inst✝⁴ : Module k V1
inst✝³ : AffineSpace V1 P1
inst✝² : AddCommGroup V2
inst✝¹ : Module k V2
inst✝ : AffineSpace V2 P2
s t : Set P1
f : P1 →ᵃ[k] P2
v : V2
⊢ (∃ x, (∃ x_1 ∈ s, ∃ y ∈ t, x_1 -ᵥ y = x) ∧ f.linear x = v) → ∃ a ∈ s, ∃ a_1 ∈ t, f.linear (a -ᵥ a_1) = v

Tactic:
rintro ⟨-, ⟨x, hx, y, hy, rfl⟩, rfl⟩

Result:
case h.mpr.intro.intro.intro.intro.intro.intro
k : Type u_1
V1 : Type u_2
P1 : Type u_3
V2 : Type u_4
P2 : Type u_5
inst✝⁶ : Ring k
inst✝⁵ : AddCommGroup V1
inst✝⁴ : Module k V1
inst✝³ : AffineSpace V1 P1
inst✝² : AddCommGroup V2
inst✝¹ : Module k V2
inst✝ : AffineSpace V2 P2
s t : Set P1
f : P1 →ᵃ[k] P2
x : P1
hx : x ∈ s
y : P1
hy : y ∈ t
⊢ ∃ a ∈ s, ∃ a_1 ∈ t, f.linear (a -ᵥ a_1) = f.linear (x -ᵥ y)