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

Commit a489500

Browse files
committed
feat(data/sym/basic): add fill_mem, append_mem and supporting lemmas (#16486)
Add lemmas for membership of fill and append, with supporting coercion and casting lemmas.
1 parent fd2fb7b commit a489500

File tree

1 file changed

+23
-11
lines changed

1 file changed

+23
-11
lines changed

src/data/sym/basic.lean

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ local attribute [instance] vector.perm.is_setoid
5353

5454
namespace sym
5555

56-
variables {α β : Type*} {n : ℕ} {s : sym α n} {a b : α}
56+
variables {α β : Type*} {n n' m : ℕ} {s : sym α n} {a b : α}
5757

5858
lemma coe_injective : injective (coe : sym α n → multiset α) := subtype.coe_injective
5959

@@ -117,10 +117,12 @@ s.1.decidable_mem _
117117
@[simp]
118118
lemma mem_mk (a : α) (s : multiset α) (h : s.card = n) : a ∈ mk s h ↔ a ∈ s := iff.rfl
119119

120-
@[simp] lemma mem_cons {a b : α} {s : sym α n} : a ∈ b ::ₛ s ↔ a = b ∨ a ∈ s :=
120+
@[simp] lemma mem_cons : a ∈ b ::ₛ s ↔ a = b ∨ a ∈ s :=
121121
multiset.mem_cons
122122

123-
lemma mem_cons_of_mem {a b : α} {s : sym α n} (h : a ∈ s) : a ∈ b ::ₛ s :=
123+
@[simp] lemma mem_coe : a ∈ (s : multiset α) ↔ a ∈ s := iff.rfl
124+
125+
lemma mem_cons_of_mem (h : a ∈ s) : a ∈ b ::ₛ s :=
124126
multiset.mem_cons_of_mem h
125127

126128
@[simp] lemma mem_cons_self (a : α) (s : sym α n) : a ∈ a ::ₛ s :=
@@ -324,36 +326,46 @@ protected def cast {n m : ℕ} (h : n = m) : sym α n ≃ sym α m :=
324326

325327
@[simp] lemma cast_rfl : sym.cast rfl s = s := subtype.ext rfl
326328

327-
@[simp] lemma cast_cast {n n' n'' : ℕ} (s : sym α n) (h : n = n') (h' : n' = n'') :
329+
@[simp] lemma cast_cast {n'' : ℕ} (h : n = n') (h' : n' = n'') :
328330
sym.cast h' (sym.cast h s) = sym.cast (h.trans h') s := rfl
329331

330-
@[simp] lemma coe_cast {n m : ℕ} (h : n = m) (s : sym α n) :
331-
(sym.cast h s : multiset α) = s := rfl
332+
@[simp] lemma coe_cast (h : n = m) : (sym.cast h s : multiset α) = s := rfl
333+
334+
@[simp] lemma mem_cast (h : n = m) : a ∈ sym.cast h s ↔ a ∈ s := iff.rfl
332335

333336
/-- Append a pair of `sym` terms. -/
334-
def append {n n' : ℕ} (s : sym α n) (s' : sym α n') : sym α (n + n') :=
337+
def append (s : sym α n) (s' : sym α n') : sym α (n + n') :=
335338
⟨s.1 + s'.1, by simp_rw [← s.2, ← s'.2, map_add]⟩
336339

337-
@[simp] lemma append_inj_right {n n' : ℕ} (s : sym α n) (t t' : sym α n') :
340+
@[simp] lemma append_inj_right (s : sym α n) {t t' : sym α n'} :
338341
s.append t = s.append t' ↔ t = t' :=
339342
subtype.ext_iff.trans $ (add_right_inj _).trans subtype.ext_iff.symm
340343

341-
@[simp] lemma append_inj_left {n n' : ℕ} (s s' : sym α n) (t : sym α n') :
344+
@[simp] lemma append_inj_left {s s' : sym α n} (t : sym α n') :
342345
s.append t = s'.append t ↔ s = s' :=
343346
subtype.ext_iff.trans $ (add_left_inj _).trans subtype.ext_iff.symm
344347

345-
lemma append_comm {n n' : ℕ} (s : sym α n) (s' : sym α n') :
348+
lemma append_comm (s : sym α n') (s' : sym α n') :
346349
s.append s' = sym.cast (add_comm _ _) (s'.append s) :=
347350
by { ext, simp [append, add_comm], }
348351

352+
@[simp, norm_cast] lemma coe_append (s : sym α n') (s' : sym α n') :
353+
(s.append s' : multiset α) = s + s' := rfl
354+
355+
lemma mem_append_iff {s' : sym α m} : a ∈ s.append s' ↔ a ∈ s ∨ a ∈ s' := multiset.mem_add
356+
349357
/-- Fill a term `m : sym α (n - i)` with `i` copies of `a` to obtain a term of `sym α n`.
350358
This is a convenience wrapper for `m.append (repeat a i)` that adjusts the term using `sym.cast`. -/
351359
def fill (a : α) (i : fin (n + 1)) (m : sym α (n - i)) : sym α n :=
352360
sym.cast (nat.sub_add_cancel i.is_le) (m.append (repeat a i))
353361

362+
lemma mem_fill_iff (a b : α) (i : fin (n + 1)) (s : sym α (n - i)) :
363+
a ∈ sym.fill b i s ↔ ((i : ℕ) ≠ 0 ∧ a = b) ∨ a ∈ s :=
364+
by rw [fill, mem_cast, mem_append_iff, or_comm, mem_repeat]
365+
354366
/-- Remove every `a` from a given `sym α n`.
355367
Yields the number of copies `i` and a term of `sym α (n - i)`. -/
356-
def filter_ne [decidable_eq α] (a : α) {n : ℕ} (m : sym α n) : Σ i : fin (n + 1), sym α (n - i) :=
368+
def filter_ne [decidable_eq α] (a : α) (m : sym α n) : Σ i : fin (n + 1), sym α (n - i) :=
357369
⟨⟨m.1.count a, (multiset.count_le_card _ _).trans_lt $ by rw [m.2, nat.lt_succ_iff]⟩,
358370
m.1.filter ((≠) a), eq_tsub_of_add_eq $ eq.trans begin
359371
rw [← multiset.countp_eq_card_filter, add_comm],

0 commit comments

Comments
 (0)