Skip to content

Commit a0c1a8d

Browse files
committed
Use range instead of coercion
1 parent 8b600ea commit a0c1a8d

File tree

1 file changed

+44
-60
lines changed

1 file changed

+44
-60
lines changed

Mathlib/Combinatorics/Tiling/TileSet.lean

Lines changed: 44 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -79,34 +79,22 @@ lemma coe_mk (t) : (⟨t⟩ : TileSet ps ιₜ) = t := rfl
7979
lemma coe_injective : Injective (TileSet.tiles : TileSet ps ιₜ → ιₜ → PlacedTile ps) :=
8080
fun _ _ ↦ coe_inj.1
8181

82-
/-- Coercion from a `TileSet` to a set of tiles (losing information about the presence of
83-
duplicate tiles in the `TileSet`). Use the coercion rather than using `coeSet` directly. -/
84-
@[coe] def coeSet (t : TileSet ps ιₜ) : Set (PlacedTile ps) := Set.range t
85-
86-
instance : CoeOut (TileSet ps ιₜ) (Set (PlacedTile ps)) where
87-
coe := coeSet
88-
8982
instance : Membership (PlacedTile ps) (TileSet ps ιₜ) where
90-
mem t pt := pt ∈ (t : Set (PlacedTile ps))
91-
92-
@[simp] lemma mem_coeSet {pt : PlacedTile ps} {t : TileSet ps ιₜ} :
93-
pt ∈ (t : Set (PlacedTile ps)) ↔ pt ∈ t :=
94-
Iff.rfl
83+
mem t pt := pt ∈ Set.range t
9584

96-
lemma coeSet_apply (t : TileSet ps ιₜ) : t = Set.range t := rfl
97-
98-
protected lemma mem_def {pt : PlacedTile ps} {t : TileSet ps ιₜ} : pt ∈ t ↔ ∃ i, t i = pt :=
85+
@[simp] lemma exists_iff_mem {pt : PlacedTile ps} {t : TileSet ps ιₜ} :
86+
(∃ i, t i = pt) ↔ pt ∈ t :=
9987
Iff.rfl
10088

10189
lemma apply_mem (t : TileSet ps ιₜ) (i : ιₜ) : t i ∈ t := Set.mem_range_self i
10290

10391
@[simp] lemma exists_mem_iff {t : TileSet ps ιₜ} {f : PlacedTile ps → Prop} :
104-
(∃ pt ∈ t, f pt) ↔ ∃ i, f (t i) := by
105-
simp_rw [← mem_coeSet, coeSet_apply, Set.exists_range_iff]
92+
(∃ pt ∈ t, f pt) ↔ ∃ i, f (t i) :=
93+
Set.exists_range_iff
10694

10795
@[simp] lemma forall_mem_iff {t : TileSet ps ιₜ} {f : PlacedTile ps → Prop} :
108-
(∀ pt ∈ t, f pt) ↔ ∀ i, f (t i) := by
109-
simp_rw [← mem_coeSet, coeSet_apply, Set.forall_mem_range]
96+
(∀ pt ∈ t, f pt) ↔ ∀ i, f (t i) :=
97+
Set.forall_mem_range
11098

11199
lemma union_of_mem_eq_iUnion (t : TileSet ps ιₜ) : ⋃ pt ∈ t, (pt : Set X) = ⋃ i, (t i : Set X) := by
112100
ext x
@@ -193,53 +181,48 @@ lemma injective_reindex_of_embeddingLike {t : TileSet ps ιₜ} (f : F) (ht : In
193181
(f : E) : t₁.reindex f = t₂.reindex (f₁ ∘ f) ↔ t₁ = t₂.reindex f₁ :=
194182
reindex_eq_reindex_comp_iff_of_surjective (EquivLike.surjective f)
195183

196-
lemma coeSet_reindex_eq_range_comp (t : TileSet ps ιₜ) (f : ιₜ' → ιₜ) :
197-
(t.reindex f : Set (PlacedTile ps)) = Set.range (t ∘ f) :=
198-
rfl
199-
200-
lemma coeSet_reindex_subset (t : TileSet ps ιₜ) (f : ιₜ' → ιₜ) :
201-
(t.reindex f : Set (PlacedTile ps)) ⊆ t := Set.range_comp_subset_range f t
184+
lemma range_reindex_subset (t : TileSet ps ιₜ) (f : ιₜ' → ιₜ) :
185+
Set.range (t.reindex f) ⊆ Set.range t := Set.range_comp_subset_range f t
202186

203187
lemma mem_of_mem_reindex {t : TileSet ps ιₜ} {f : ιₜ' → ιₜ} {pt : PlacedTile ps}
204188
(h : pt ∈ t.reindex f) : pt ∈ t :=
205-
Set.mem_of_mem_of_subset h <| t.coeSet_reindex_subset f
189+
Set.mem_of_mem_of_subset h <| t.range_reindex_subset f
206190

207191
lemma mem_reindex_iff {t : TileSet ps ιₜ} {f : ιₜ' → ιₜ} {pt : PlacedTile ps} :
208192
pt ∈ (t.reindex f) ↔ ∃ i, t (f i) = pt :=
209193
Set.mem_range
210194

211-
@[simp] lemma coeSet_reindex_of_surjective (t : TileSet ps ιₜ) {f : ιₜ' → ιₜ} (h : Surjective f) :
212-
(t.reindex f : Set (PlacedTile ps)) = t :=
195+
lemma range_reindex_of_surjective (t : TileSet ps ιₜ) {f : ιₜ' → ιₜ} (h : Surjective f) :
196+
Set.range (t.reindex f) = Set.range t :=
213197
h.range_comp _
214198

215-
@[simp] lemma coeSet_reindex_of_equivLike (t : TileSet ps ιₜ) (f : E) :
216-
(t.reindex f : Set (PlacedTile ps)) = t :=
217-
t.coeSet_reindex_of_surjective <| EquivLike.surjective f
199+
lemma range_reindex_of_equivLike (t : TileSet ps ιₜ) (f : E) :
200+
Set.range (t.reindex f) = Set.range t :=
201+
t.range_reindex_of_surjective <| EquivLike.surjective f
218202

219203
@[simp] lemma mem_reindex_iff_of_surjective {t : TileSet ps ιₜ} {f : ιₜ' → ιₜ} {pt : PlacedTile ps}
220204
(h : Surjective f) : pt ∈ t.reindex f ↔ pt ∈ t :=
221-
iff_of_eq <| congrArg (pt ∈ ·) <| t.coeSet_reindex_of_surjective h
205+
iff_of_eq <| congrArg (pt ∈ ·) <| t.range_reindex_of_surjective h
222206

223207
@[simp] lemma mem_reindex_iff_of_equivLike {t : TileSet ps ιₜ} (f : E) {pt : PlacedTile ps} :
224208
pt ∈ t.reindex f ↔ pt ∈ t :=
225209
mem_reindex_iff_of_surjective <| EquivLike.surjective f
226210

227211
/-- If two `TileSet`s have the same set of tiles and no duplicate tiles, this equivalence maps
228212
one index type to the other. -/
229-
noncomputable def equivOfCoeSetEqOfInjective {t₁ : TileSet ps ιₜ} {t₂ : TileSet ps ιₜ'}
230-
(h : (t₁ : Set (PlacedTile ps)) = t₂) (h₁ : Injective t₁) (h₂ : Injective t₂) : ιₜ' ≃ ιₜ :=
213+
noncomputable def equivOfRangeEqOfInjective {t₁ : TileSet ps ιₜ} {t₂ : TileSet ps ιₜ'}
214+
(h : Set.range t₁ = Set.range t₂) (h₁ : Injective t₁) (h₂ : Injective t₂) : ιₜ' ≃ ιₜ :=
231215
((Equiv.ofInjective t₂ h₂).trans (Equiv.cast (congrArg _ h.symm))).trans
232216
(Equiv.ofInjective t₁ h₁).symm
233217

234-
@[simp] lemma reindex_equivOfCoeSetEqOfInjective {t₁ : TileSet ps ιₜ} {t₂ : TileSet ps ιₜ'}
235-
(h : (t₁ : Set (PlacedTile ps)) = t₂) (h₁ : Injective t₁) (h₂ : Injective t₂) :
236-
t₁.reindex (equivOfCoeSetEqOfInjective h h₁ h₂) = t₂ := by
218+
@[simp] lemma reindex_equivOfRangeEqOfInjective {t₁ : TileSet ps ιₜ} {t₂ : TileSet ps ιₜ'}
219+
(h : Set.range t₁ = Set.range t₂) (h₁ : Injective t₁) (h₂ : Injective t₂) :
220+
t₁.reindex (equivOfRangeEqOfInjective h h₁ h₂) = t₂ := by
237221
ext i : 2
238-
simp only [equivOfCoeSetEqOfInjective, Equiv.coe_trans, reindex_apply, comp_apply,
222+
simp only [equivOfRangeEqOfInjective, Equiv.coe_trans, reindex_apply, comp_apply,
239223
Equiv.ofInjective_apply, Equiv.cast_apply]
240224
erw [Equiv.apply_ofInjective_symm h₁]
241225
rw [Subtype.coe_eq_iff]
242-
simp_rw [coeSet_apply] at h
243226
refine ⟨h ▸ Set.mem_range_self _, ?_⟩
244227
rw [cast_eq_iff_heq, Subtype.heq_iff_coe_eq]
245228
simp [h]
@@ -272,21 +255,21 @@ lemma mem_inv_smul_apply_iff_smul_mem {g : G} {x : X} {t : TileSet ps ιₜ} {i
272255
@[simp] lemma injective_smul_iff (g : G) {t : TileSet ps ιₜ} : Injective (g • t) ↔ Injective t :=
273256
Injective.of_comp_iff (MulAction.injective g) t
274257

275-
@[simp] lemma coeSet_smul (g : G) (t : TileSet ps ιₜ) :
276-
(g • t : TileSet ps ιₜ) = g • (t : Set (PlacedTile ps)) := by
277-
simp [coeSet_apply, smul_coe, Set.range_comp]
258+
@[simp] lemma range_smul (g : G) (t : TileSet ps ιₜ) :
259+
Set.range (g • t : TileSet ps ιₜ) = g • Set.range t := by
260+
simp [smul_coe, Set.range_comp]
278261

279262
@[simp] lemma smul_mem_smul_iff {pt : PlacedTile ps} (g : G) {t : TileSet ps ιₜ} :
280263
g • pt ∈ g • t ↔ pt ∈ t := by
281-
rw [← mem_coeSet, ← mem_coeSet, coeSet_smul, Set.smul_mem_smul_set_iff]
264+
simp_rw [← exists_iff_mem, ← Set.mem_range, range_smul, Set.smul_mem_smul_set_iff]
282265

283266
lemma mem_smul_iff_smul_inv_mem {pt : PlacedTile ps} {g : G} {t : TileSet ps ιₜ} :
284267
pt ∈ g • t ↔ g⁻¹ • pt ∈ t := by
285-
simp_rw [← mem_coeSet, coeSet_smul, Set.mem_smul_set_iff_inv_smul_mem]
268+
simp_rw [← exists_iff_mem, ← Set.mem_range, range_smul, Set.mem_smul_set_iff_inv_smul_mem]
286269

287270
lemma mem_inv_smul_iff_smul_mem {pt : PlacedTile ps} {g : G} {t : TileSet ps ιₜ} :
288271
pt ∈ g⁻¹ • t ↔ g • pt ∈ t := by
289-
simp_rw [← mem_coeSet, coeSet_smul, Set.mem_inv_smul_set_iff]
272+
simp_rw [← exists_iff_mem, ← Set.mem_range, range_smul, Set.mem_inv_smul_set_iff]
290273

291274
@[simp] lemma smul_inter_smul (g : G) (t : TileSet ps ιₜ) (s : Set X) (i : ιₜ) :
292275
g • s ∩ (g • t) i = g • (s ∩ t i) := by
@@ -353,7 +336,7 @@ lemma exists_smul_eq_of_mem_symmetryGroup' {t : TileSet ps ιₜ} {g : G} (i :
353336
lemma smul_mem_of_mem_of_mem_symmetryGroup {t : TileSet ps ιₜ} {g : G} {pt : PlacedTile ps}
354337
(hg : g ∈ t.symmetryGroup) (hpt : pt ∈ t) : g • pt ∈ t := by
355338
rcases hpt with ⟨i, rfl⟩
356-
simp_rw [TileSet.mem_def, eq_comm]
339+
simp_rw [← exists_iff_mem, eq_comm]
357340
exact exists_smul_eq_of_mem_symmetryGroup i hg
358341

359342
/-- If `g` is in the symmetry group, every tile in `t` is the image under `g` of some tile in
@@ -408,20 +391,20 @@ lemma mem_symmetryGroup_smul_iff' {t : TileSet ps ιₜ} {g g' : G} :
408391
convert mem_symmetryGroup_smul_iff g
409392
simp [mul_assoc]
410393

411-
lemma symmetryGroup_le_stabilizer_coeSet (t : TileSet ps ιₜ) :
412-
t.symmetryGroup ≤ MulAction.stabilizer G (t : Set (PlacedTile ps)) := by
394+
lemma symmetryGroup_le_stabilizer_range (t : TileSet ps ιₜ) :
395+
t.symmetryGroup ≤ MulAction.stabilizer G (Set.range t) := by
413396
simp_rw [SetLike.le_def, mem_symmetryGroup_iff_exists, MulAction.mem_stabilizer_iff]
414397
rintro g ⟨f, hf⟩
415398
nth_rewrite 2 [← hf]
416399
simp
417400

418-
lemma symmetryGroup_eq_stabilizer_coeSet_of_injective (t : TileSet ps ιₜ) (h : Injective t) :
419-
t.symmetryGroup = MulAction.stabilizer G (t : Set (PlacedTile ps)) := by
420-
refine le_antisymm t.symmetryGroup_le_stabilizer_coeSet ?_
401+
lemma symmetryGroup_eq_stabilizer_range_of_injective (t : TileSet ps ιₜ) (h : Injective t) :
402+
t.symmetryGroup = MulAction.stabilizer G (Set.range t) := by
403+
refine le_antisymm t.symmetryGroup_le_stabilizer_range ?_
421404
simp_rw [SetLike.le_def, mem_symmetryGroup_iff_exists, MulAction.mem_stabilizer_iff]
422405
intro g hg
423-
rw [← coeSet_smul] at hg
424-
exact ⟨equivOfCoeSetEqOfInjective hg ((injective_smul_iff g).2 h) h, by simp⟩
406+
rw [← range_smul] at hg
407+
exact ⟨equivOfRangeEqOfInjective hg ((injective_smul_iff g).2 h) h, by simp⟩
425408

426409
/-- The disjoint union of two `TileSet`s, indexed by the sum of their index types. -/
427410
protected def sum (t : TileSet ps ιₜ) (t' : TileSet ps ιₜ') : TileSet ps (ιₜ ⊕ ιₜ') where
@@ -430,13 +413,13 @@ protected def sum (t : TileSet ps ιₜ) (t' : TileSet ps ιₜ') : TileSet ps (
430413
@[simp] lemma coe_sum (t : TileSet ps ιₜ) (t' : TileSet ps ιₜ') : t.sum t' = Sum.elim (↑t) (↑t') :=
431414
rfl
432415

433-
@[simp] lemma coeSet_sum (t : TileSet ps ιₜ) (t' : TileSet ps ιₜ') :
434-
(t.sum t' : Set (PlacedTile ps)) = (↑t)(↑t') :=
416+
lemma range_sum (t : TileSet ps ιₜ) (t' : TileSet ps ιₜ') :
417+
Set.range (t.sum t') = Set.range tSet.range t' :=
435418
Set.Sum.elim_range _ _
436419

437420
@[simp] lemma mem_sum {pt : PlacedTile ps} {t : TileSet ps ιₜ} {t' : TileSet ps ιₜ'} :
438421
pt ∈ t.sum t' ↔ pt ∈ t ∨ pt ∈ t' := by
439-
simp [← mem_coeSet]
422+
simp [← exists_iff_mem]
440423

441424
lemma reindex_sum (t : TileSet ps ιₜ) (t' : TileSet ps ιₜ'') (f : ιₜ' → ιₜ) (f' : ιₜ''' → ιₜ'') :
442425
(t.sum t').reindex (Sum.map f f') = (t.reindex f).sum (t'.reindex f') :=
@@ -450,17 +433,18 @@ lemma smul_sum (g : G) (t : TileSet ps ιₜ) (t' : TileSet ps ιₜ') :
450433
protected def sigma (t : (i : ι) → TileSet ps (ιₜι i)) : TileSet ps (Σ i, ιₜι i) where
451434
tiles := Sigma.uncurry (fun i ↦ ↑(t i))
452435

453-
@[simp] lemma coe_sigma (t : (i : ι) → TileSet ps (ιₜι i)) :
436+
lemma coe_sigma (t : (i : ι) → TileSet ps (ιₜι i)) :
454437
TileSet.sigma t = Sigma.uncurry (fun i ↦ ↑(t i)) :=
455438
rfl
456439

457-
@[simp] lemma coeSet_sigma (t : (i : ι) → TileSet ps (ιₜι i)) :
458-
(TileSet.sigma t : Set (PlacedTile ps)) = ⋃ i, (t i : Set (PlacedTile ps)) :=
440+
@[simp] lemma range_sigma (t : (i : ι) → TileSet ps (ιₜι i)) :
441+
Set.range (TileSet.sigma t) = ⋃ i, Set.range (t i) :=
459442
Set.range_sigma_eq_iUnion_range _
460443

461444
lemma mem_sigma {pt : PlacedTile ps} {t : (i : ι) → TileSet ps (ιₜι i)} :
462445
pt ∈ TileSet.sigma t ↔ ∃ i, pt ∈ t i := by
463-
simp [← mem_coeSet]
446+
simp_rw [← exists_iff_mem, ← Set.mem_range, range_sigma]
447+
simp
464448

465449
lemma reindex_sigma (t : (i : ι) → TileSet ps (ιₜι i)) (f : (i : ι) → (ιₜ'ι i) → (ιₜι i)) :
466450
(TileSet.sigma t).reindex (Sigma.map id f) = TileSet.sigma fun i ↦ (t i).reindex (f i) :=

0 commit comments

Comments
 (0)