Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit 03f0285

Browse files
committed
refactor(algebra/add_torsor): define pointwise -ᵥ and +ᵥ on sets (#4710)
This seems more natural than `vsub_set` to me.
1 parent 4c4d47c commit 03f0285

File tree

4 files changed

+84
-41
lines changed

4 files changed

+84
-41
lines changed

src/algebra/add_torsor.lean

Lines changed: 58 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Authors: Joseph Myers, Yury Kudryashov.
66
import algebra.group.prod
77
import algebra.group.type_tags
88
import algebra.group.pi
9+
import algebra.pointwise
910
import data.equiv.basic
1011
import data.set.finite
1112

@@ -229,29 +230,68 @@ element. -/
229230
lemma eq_vadd_iff_vsub_eq (p1 : P) (g : G) (p2 : P) : p1 = g +ᵥ p2 ↔ p1 -ᵥ p2 = g :=
230231
⟨λ h, h.symm ▸ vadd_vsub _ _, λ h, h ▸ (vsub_vadd _ _).symm⟩
231232

232-
/-- The pairwise differences of a set of points. -/
233-
def vsub_set (s : set P) : set G := set.image2 (-ᵥ) s s
233+
namespace set
234234

235-
/-- `vsub_set` of an empty set. -/
236-
@[simp] lemma vsub_set_empty : vsub_set (∅ : set P) = ∅ :=
237-
set.image2_empty_left
235+
instance has_vsub : has_vsub (set G) (set P) := ⟨set.image2 (-ᵥ)⟩
238236

239-
/-- `vsub_set` of a single point. -/
240-
@[simp] lemma vsub_set_singleton (p : P) : vsub_set ({p} : set P) = {(0:G)} :=
241-
by simp [vsub_set]
237+
section vsub
242238

243-
/-- `vsub_set` of a finite set is finite. -/
244-
lemma vsub_set_finite_of_finite {s : set P} (h : set.finite s) : set.finite (vsub_set s) :=
245-
h.image2 _ h
239+
variables (s t : set P)
246240

247-
/-- Each pairwise difference is in the `vsub_set`. -/
248-
lemma vsub_mem_vsub_set {p1 p2 : P} {s : set P} (hp1 : p1 ∈ s) (hp2 : p2 ∈ s) :
249-
(p1 -ᵥ p2) ∈ vsub_set s :=
250-
set.mem_image2_of_mem hp1 hp2
241+
@[simp] lemma vsub_empty : s -ᵥ ∅ = ∅ := set.image2_empty_right
251242

252-
/-- `vsub_set` is contained in `vsub_set` of a larger set. -/
253-
lemma vsub_set_mono {s1 s2 : set P} (h : s1 ⊆ s2) : vsub_set s1 ⊆ vsub_set s2 :=
254-
set.image2_subset h h
243+
@[simp] lemma empty_vsub : ∅ -ᵥ s = ∅ := set.image2_empty_left
244+
245+
@[simp] lemma singleton_vsub (p : P) : {p} -ᵥ s = ((-ᵥ) p) '' s :=
246+
image2_singleton_left
247+
248+
@[simp] lemma vsub_singleton (p : P) : s -ᵥ {p} = (-ᵥ p) '' s :=
249+
image2_singleton_right
250+
251+
@[simp] lemma singleton_vsub_self (p : P) : ({p} : set P) -ᵥ {p} = {(0:G)} :=
252+
by simp
253+
254+
variables {s t}
255+
256+
/-- `vsub` of a finite set is finite. -/
257+
lemma finite.vsub (hs : finite s) (ht : finite t) : finite (s -ᵥ t) :=
258+
hs.image2 _ ht
259+
260+
/-- Each pairwise difference is in the `vsub` set. -/
261+
lemma vsub_mem_vsub {ps pt : P} (hs : ps ∈ s) (ht : pt ∈ t) :
262+
(ps -ᵥ pt) ∈ s -ᵥ t :=
263+
mem_image2_of_mem hs ht
264+
265+
/-- `s -ᵥ t` is monotone in both arguments. -/
266+
@[mono] lemma vsub_subset_vsub {s' t' : set P} (hs : s ⊆ s') (ht : t ⊆ t') :
267+
s -ᵥ t ⊆ s' -ᵥ t' :=
268+
image2_subset hs ht
269+
270+
lemma vsub_self_mono (h : s ⊆ t) : s -ᵥ s ⊆ t -ᵥ t := vsub_subset_vsub h h
271+
272+
lemma vsub_subset_iff {u : set G} : s -ᵥ t ⊆ u ↔ ∀ (x ∈ s) (y ∈ t), x -ᵥ y ∈ u :=
273+
image2_subset_iff
274+
275+
end vsub
276+
277+
instance add_action : add_action (set G) (set P) :=
278+
{ vadd := set.image2 (+ᵥ),
279+
zero_vadd' := λ s, by simp [← singleton_zero],
280+
vadd_assoc' := λ s t p, by { symmetry, apply image2_assoc, intros, symmetry, apply vadd_assoc } }
281+
282+
variables {s s' : set G} {t t' : set P}
283+
284+
@[mono] lemma vadd_subset_vadd (hs : s ⊆ s') (ht : t ⊆ t') : s +ᵥ t ⊆ s' +ᵥ t' :=
285+
image2_subset hs ht
286+
287+
@[simp] lemma vadd_singleton (s : set G) (p : P) : s +ᵥ {p} = (+ᵥ p) '' s := image2_singleton_right
288+
289+
@[simp] lemma singleton_vadd (v : G) (s : set P) : ({v} : set G) +ᵥ s = ((+ᵥ) v) '' s :=
290+
image2_singleton_left
291+
292+
lemma finite.vadd (hs : finite s) (ht : finite t) : finite (s +ᵥ t) := hs.image2 _ ht
293+
294+
end set
255295

256296
@[simp] lemma vadd_vsub_vadd_cancel_right (v₁ v₂ : G) (p : P) :
257297
(v₁ +ᵥ p) -ᵥ (v₂ +ᵥ p) = v₁ - v₂ :=

src/geometry/euclidean/monge_point.lean

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -252,8 +252,9 @@ opposite edge (in 2 dimensions, this is the same as an altitude).
252252
This definition is only intended to be used when `i₁ ≠ i₂`. -/
253253
def monge_plane {n : ℕ} (s : simplex ℝ P (n + 2)) (i₁ i₂ : fin (n + 3)) :
254254
affine_subspace ℝ P :=
255-
mk' (({i₁, i₂}ᶜ : finset (fin (n + 3))).centroid ℝ s.points) (submodule.span ℝ {s.points i₁ -ᵥ s.points i₂}).orthogonal ⊓
256-
affine_span ℝ (set.range s.points)
255+
mk' (({i₁, i₂}ᶜ : finset (fin (n + 3))).centroid ℝ s.points)
256+
(submodule.span ℝ {s.points i₁ -ᵥ s.points i₂}).orthogonal ⊓
257+
affine_span ℝ (set.range s.points)
257258

258259
/-- The definition of a Monge plane. -/
259260
lemma monge_plane_def {n : ℕ} (s : simplex ℝ P (n + 2)) (i₁ i₂ : fin (n + 3)) :

src/linear_algebra/affine_space/basic.lean

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,8 @@ space, or more generally a module. We omit the arguments `(k : Type*) [ring k] [
102102
in the type synonym itself to simplify type class search. -/
103103
notation `affine_space` := add_torsor
104104

105+
open set
106+
105107
section
106108

107109
variables (k : Type*) {V : Type*} {P : Type*} [ring k] [add_comm_group V] [module k V]
@@ -110,36 +112,36 @@ include V
110112

111113
/-- The submodule spanning the differences of a (possibly empty) set
112114
of points. -/
113-
def vector_span (s : set P) : submodule k V := submodule.span k (vsub_set s)
115+
def vector_span (s : set P) : submodule k V := submodule.span k (s -ᵥ s)
114116

115117
/-- The definition of `vector_span`, for rewriting. -/
116-
lemma vector_span_def (s : set P) : vector_span k s = submodule.span k (vsub_set s) :=
118+
lemma vector_span_def (s : set P) : vector_span k s = submodule.span k (s -ᵥ s) :=
117119
rfl
118120

119121
/-- `vector_span` is monotone. -/
120122
lemma vector_span_mono {s₁ s₂ : set P} (h : s₁ ⊆ s₂) : vector_span k s₁ ≤ vector_span k s₂ :=
121-
submodule.span_mono (vsub_set_mono h)
123+
submodule.span_mono (vsub_self_mono h)
122124

123125
variables (P)
124126

125127
/-- The `vector_span` of the empty set is `⊥`. -/
126128
@[simp] lemma vector_span_empty : vector_span k (∅ : set P) = (⊥ : submodule k V) :=
127-
by rw [vector_span_def, vsub_set_empty, submodule.span_empty]
129+
by rw [vector_span_def, vsub_empty, submodule.span_empty]
128130

129131
variables {P}
130132

131133
/-- The `vector_span` of a single point is `⊥`. -/
132134
@[simp] lemma vector_span_singleton (p : P) : vector_span k ({p} : set P) = ⊥ :=
133135
by simp [vector_span_def]
134136

135-
/-- The `vsub_set` lies within the `vector_span`. -/
136-
lemma vsub_set_subset_vector_span (s : set P) : vsub_set s ⊆ vector_span k s :=
137+
/-- The `s -ᵥ s` lies within the `vector_span k s`. -/
138+
lemma vsub_set_subset_vector_span (s : set P) : s -ᵥ s ⊆ ↑(vector_span k s) :=
137139
submodule.subset_span
138140

139141
/-- Each pairwise difference is in the `vector_span`. -/
140142
lemma vsub_mem_vector_span {s : set P} {p1 p2 : P} (hp1 : p1 ∈ s) (hp2 : p2 ∈ s) :
141143
p1 -ᵥ p2 ∈ vector_span k s :=
142-
vsub_set_subset_vector_span k s (vsub_mem_vsub_set hp1 hp2)
144+
vsub_set_subset_vector_span k s (vsub_mem_vsub hp1 hp2)
143145

144146
/-- The points in the affine span of a (possibly empty) set of
145147
points. Use `affine_span` instead to get an `affine_subspace k P`. -/
@@ -252,25 +254,25 @@ in the definition of `submodule.span`) can be used in the proof of
252254
that proof. -/
253255
def direction_of_nonempty {s : affine_subspace k P} (h : (s : set P).nonempty) :
254256
submodule k V :=
255-
{ carrier := vsub_set (s : set P),
257+
{ carrier := (s : set P) -ᵥ s,
256258
zero_mem' := begin
257259
cases h with p hp,
258-
exact (vsub_self p) ▸ vsub_mem_vsub_set hp hp
260+
exact (vsub_self p) ▸ vsub_mem_vsub hp hp
259261
end,
260262
add_mem' := begin
261263
intros a b ha hb,
262264
rcases ha with ⟨p1, p2, hp1, hp2, rfl⟩,
263265
rcases hb with ⟨p3, p4, hp3, hp4, rfl⟩,
264266
rw [←vadd_vsub_assoc],
265-
refine vsub_mem_vsub_set _ hp4,
267+
refine vsub_mem_vsub _ hp4,
266268
convert s.smul_vsub_vadd_mem 1 hp1 hp2 hp3,
267269
rw one_smul
268270
end,
269271
smul_mem' := begin
270272
intros c v hv,
271273
rcases hv with ⟨p1, p2, hp1, hp2, rfl⟩,
272274
rw [←vadd_vsub (c • (p1 -ᵥ p2)) p2],
273-
refine vsub_mem_vsub_set _ hp2,
275+
refine vsub_mem_vsub _ hp2,
274276
exact s.smul_vsub_vadd_mem c hp1 hp2 hp2
275277
end }
276278

@@ -283,7 +285,7 @@ le_antisymm (vsub_set_subset_vector_span k s) (submodule.span_le.2 set.subset.rf
283285
/-- The set of vectors in the direction of a nonempty affine subspace
284286
is given by `vsub_set`. -/
285287
lemma coe_direction_eq_vsub_set {s : affine_subspace k P} (h : (s : set P).nonempty) :
286-
(s.direction : set V) = vsub_set (s : set P) :=
288+
(s.direction : set V) = (s : set P) -ᵥ s :=
287289
direction_of_nonempty_eq_direction h ▸ rfl
288290

289291
/-- A vector is in the direction of a nonempty affine subspace if and
@@ -704,7 +706,7 @@ variables (P)
704706

705707
/-- The direction of `⊥` is the submodule `⊥`. -/
706708
@[simp] lemma direction_bot : (⊥ : affine_subspace k P).direction = ⊥ :=
707-
by rw [direction_eq_vector_span, bot_coe, vector_span_def, vsub_set_empty, submodule.span_empty]
709+
by rw [direction_eq_vector_span, bot_coe, vector_span_def, vsub_empty, submodule.span_empty]
708710

709711
variables {k V P}
710712

@@ -739,8 +741,8 @@ lemma direction_inf (s1 s2 : affine_subspace k P) :
739741
begin
740742
repeat { rw [direction_eq_vector_span, vector_span_def] },
741743
exact le_inf
742-
(Inf_le_Inf (λ p hp, set.subset.trans (vsub_set_mono (set.inter_subset_left _ _)) hp))
743-
(Inf_le_Inf (λ p hp, set.subset.trans (vsub_set_mono (set.inter_subset_right _ _)) hp))
744+
(Inf_le_Inf (λ p hp, trans (vsub_self_mono (inter_subset_left _ _)) hp))
745+
(Inf_le_Inf (λ p hp, trans (vsub_self_mono (inter_subset_right _ _)) hp))
744746
end
745747

746748
/-- If two affine subspaces have a point in common, the direction of
@@ -789,8 +791,8 @@ lemma sup_direction_le (s1 s2 : affine_subspace k P) :
789791
begin
790792
repeat { rw [direction_eq_vector_span, vector_span_def] },
791793
exact sup_le
792-
(Inf_le_Inf (λ p hp, set.subset.trans (vsub_set_mono (le_sup_left : s1 ≤ s1 ⊔ s2)) hp))
793-
(Inf_le_Inf (λ p hp, set.subset.trans (vsub_set_mono (le_sup_right : s2 ≤ s1 ⊔ s2)) hp))
794+
(Inf_le_Inf (λ p hp, set.subset.trans (vsub_self_mono (le_sup_left : s1 ≤ s1 ⊔ s2)) hp))
795+
(Inf_le_Inf (λ p hp, set.subset.trans (vsub_self_mono (le_sup_right : s2 ≤ s1 ⊔ s2)) hp))
794796
end
795797

796798
/-- The sup of the directions of two nonempty affine subspaces with
@@ -865,7 +867,7 @@ variables (k : Type*) {V : Type*} {P : Type*} [ring k] [add_comm_group V] [modul
865867
variables {ι : Type*}
866868
include V
867869

868-
open affine_subspace
870+
open affine_subspace set
869871

870872
/-- The `vector_span` is the span of the pairwise subtractions with a
871873
given point on the left. -/
@@ -1073,8 +1075,8 @@ begin
10731075
rw [direction_eq_vector_span, vector_span_def],
10741076
exact Inf_le_Inf (λ p hp, set.subset.trans
10751077
(set.singleton_subset_iff.2
1076-
(vsub_mem_vsub_set (mem_span_points k p2 _ (set.mem_union_right _ hp2))
1077-
(mem_span_points k p1 _ (set.mem_union_left _ hp1))))
1078+
(vsub_mem_vsub (mem_span_points k p2 _ (set.mem_union_right _ hp2))
1079+
(mem_span_points k p1 _ (set.mem_union_left _ hp1))))
10781080
hp) }
10791081
end
10801082

src/linear_algebra/affine_space/finite_dimensional.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ open affine_subspace finite_dimensional vector_space
3535
/-- The `vector_span` of a finite set is finite-dimensional. -/
3636
lemma finite_dimensional_vector_span_of_finite {s : set P} (h : set.finite s) :
3737
finite_dimensional k (vector_span k s) :=
38-
span_of_finite k $ vsub_set_finite_of_finite h
38+
span_of_finite k $ h.vsub h
3939

4040
/-- The `vector_span` of a family indexed by a `fintype` is
4141
finite-dimensional. -/

0 commit comments

Comments
 (0)