Skip to content

Commit

Permalink
feat(data/{list,multiset,finset}/nat_antidiagonal): add lemmas to rem…
Browse files Browse the repository at this point in the history
…ove elements from head and tail of antidiagonal (#12028)

Also lowered `finset.nat.map_swap_antidiagonal` down to `list` through `multiset`.
  • Loading branch information
kmill committed Feb 15, 2022
1 parent c0c673a commit 52aaf17
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 12 deletions.
29 changes: 17 additions & 12 deletions src/data/finset/nat_antidiagonal.lean
Expand Up @@ -45,26 +45,31 @@ lemma antidiagonal_succ {n : ℕ} :
begin
apply eq_of_veq,
rw [insert_val_of_not_mem, map_val],
{apply multiset.nat.antidiagonal_succ},
{ apply multiset.nat.antidiagonal_succ },
{ intro con, rcases mem_map.1 con with ⟨⟨a,b⟩, ⟨h1, h2⟩⟩,
simp only [prod.mk.inj_iff, function.embedding.coe_prod_map, prod.map_mk] at h2,
apply nat.succ_ne_zero a h2.1, }
end

lemma map_swap_antidiagonal {n : ℕ} :
(antidiagonal n).map ⟨prod.swap, prod.swap_right_inverse.injective⟩ = antidiagonal n :=
lemma antidiagonal_succ' {n : ℕ} :
antidiagonal (n + 1) = insert (n + 1, 0) ((antidiagonal n).map
(function.embedding.prod_map (function.embedding.refl _) ⟨nat.succ, nat.succ_injective⟩)) :=
begin
ext,
simp only [exists_prop, mem_map, mem_antidiagonal, prod.exists],
rw add_comm,
split,
{ rintro ⟨b, c, ⟨rfl, rfl⟩⟩,
simp },
{ rintro rfl,
use [a.snd, a.fst],
simp }
apply eq_of_veq,
rw [insert_val_of_not_mem, map_val],
{ apply multiset.nat.antidiagonal_succ' },
{ simp },
end

lemma antidiagonal_succ_succ' {n : ℕ} :
antidiagonal (n + 2) = insert (0, n + 2) (insert (n + 2, 0) ((antidiagonal n).map
(function.embedding.prod_map ⟨nat.succ, nat.succ_injective⟩ ⟨nat.succ, nat.succ_injective⟩))) :=
by { rw [antidiagonal_succ, antidiagonal_succ', map_insert, map_map], refl }

lemma map_swap_antidiagonal {n : ℕ} :
(antidiagonal n).map ⟨prod.swap, prod.swap_right_inverse.injective⟩ = antidiagonal n :=
eq_of_veq $ by simp [antidiagonal, multiset.nat.map_swap_antidiagonal]

/-- A point in the antidiagonal is determined by its first co-ordinate. -/
lemma antidiagonal_congr {n : ℕ} {p q : ℕ × ℕ} (hp : p ∈ antidiagonal n)
(hq : q ∈ antidiagonal n) : p = q ↔ p.fst = q.fst :=
Expand Down
24 changes: 24 additions & 0 deletions src/data/list/nat_antidiagonal.lean
Expand Up @@ -59,5 +59,29 @@ begin
ext; simp,
end

lemma antidiagonal_succ' {n : ℕ} :
antidiagonal (n + 1) = ((antidiagonal n).map (prod.map id nat.succ)) ++ [(n + 1, 0)] :=
begin
simp only [antidiagonal, range_succ, add_tsub_cancel_left, map_append,
append_assoc, tsub_self, singleton_append, map_map, map],
congr' 1,
apply map_congr,
simp [le_of_lt, nat.succ_eq_add_one, nat.sub_add_comm] { contextual := tt },
end

lemma antidiagonal_succ_succ' {n : ℕ} :
antidiagonal (n + 2) =
(0, n + 2) :: ((antidiagonal n).map (prod.map nat.succ nat.succ)) ++ [(n + 2, 0)] :=
by { rw antidiagonal_succ', simpa }

lemma map_swap_antidiagonal {n : ℕ} :
(antidiagonal n).map prod.swap = (antidiagonal n).reverse :=
begin
rw [antidiagonal, map_map, prod.swap, ← list.map_reverse,
range_eq_range', reverse_range', ← range_eq_range', map_map],
apply map_congr,
simp [nat.sub_sub_self, lt_succ_iff] { contextual := tt },
end

end nat
end list
14 changes: 14 additions & 0 deletions src/data/multiset/nat_antidiagonal.lean
Expand Up @@ -48,5 +48,19 @@ coe_nodup.2 $ list.nat.nodup_antidiagonal n
antidiagonal (n + 1) = (0, n + 1) ::ₘ ((antidiagonal n).map (prod.map nat.succ id)) :=
by simp only [antidiagonal, list.nat.antidiagonal_succ, coe_map, cons_coe]

lemma antidiagonal_succ' {n : ℕ} :
antidiagonal (n + 1) = (n + 1, 0) ::ₘ ((antidiagonal n).map (prod.map id nat.succ)) :=
by rw [antidiagonal, list.nat.antidiagonal_succ', ← coe_add, add_comm, antidiagonal, coe_map,
coe_add, list.singleton_append, cons_coe]

lemma antidiagonal_succ_succ' {n : ℕ} :
antidiagonal (n + 2) =
(0, n + 2) ::ₘ (n + 2, 0) ::ₘ ((antidiagonal n).map (prod.map nat.succ nat.succ)) :=
by { rw [antidiagonal_succ, antidiagonal_succ', map_cons, map_map, prod_map], refl }

lemma map_swap_antidiagonal {n : ℕ} :
(antidiagonal n).map prod.swap = antidiagonal n :=
by rw [antidiagonal, coe_map, list.nat.map_swap_antidiagonal, coe_reverse]

end nat
end multiset

0 comments on commit 52aaf17

Please sign in to comment.