From 6f72c22858cf892bc89041a0649d4f1af42580f3 Mon Sep 17 00:00:00 2001 From: "Yury G. Kudryashov" Date: Wed, 4 Nov 2020 08:09:46 +0000 Subject: [PATCH] chore(data/finset): add a few lemmas (#4901) --- src/data/finset/basic.lean | 43 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/data/finset/basic.lean b/src/data/finset/basic.lean index f55a25fbb89d5..8ba9db8bf2a95 100644 --- a/src/data/finset/basic.lean +++ b/src/data/finset/basic.lean @@ -815,6 +815,18 @@ begin exact set.insert_diff_of_mem ↑s h end +@[simp] lemma insert_sdiff_insert (s t : finset α) (x : α) : + (insert x s) \ (insert x t) = s \ insert x t := +insert_sdiff_of_mem _ (mem_insert_self _ _) + +lemma sdiff_insert_of_not_mem {s : finset α} {x : α} (h : x ∉ s) (t : finset α) : + s \ (insert x t) = s \ t := +begin + refine subset.antisymm (sdiff_subset_sdiff (subset.refl _) (subset_insert _ _)) (λ y hy, _), + simp only [mem_sdiff, mem_insert, not_or_distrib] at hy ⊢, + exact ⟨hy.1, λ hxy, h $ hxy ▸ hy.1, hy.2⟩ +end + @[simp] lemma sdiff_subset (s t : finset α) : s \ t ⊆ s := by simp [subset_iff, mem_sdiff] {contextual := tt} @@ -915,6 +927,24 @@ lemma piecewise_singleton [decidable_eq α] (i : α) : piecewise {i} f g = function.update g i (f i) := by rw [← insert_emptyc_eq, piecewise_insert, piecewise_empty] +lemma piecewise_piecewise_of_subset_left {s t : finset α} [Π i, decidable (i ∈ s)] + [Π i, decidable (i ∈ t)] (h : s ⊆ t) (f₁ f₂ g : Π a, δ a) : + s.piecewise (t.piecewise f₁ f₂) g = s.piecewise f₁ g := +s.piecewise_congr (λ i hi, piecewise_eq_of_mem _ _ _ (h hi)) (λ _ _, rfl) + +@[simp] lemma piecewise_idem_left (f₁ f₂ g : Π a, δ a) : + s.piecewise (s.piecewise f₁ f₂) g = s.piecewise f₁ g := +piecewise_piecewise_of_subset_left (subset.refl _) _ _ _ + +lemma piecewise_piecewise_of_subset_right {s t : finset α} [Π i, decidable (i ∈ s)] + [Π i, decidable (i ∈ t)] (h : t ⊆ s) (f g₁ g₂ : Π a, δ a) : + s.piecewise f (t.piecewise g₁ g₂) = s.piecewise f g₂ := +s.piecewise_congr (λ _ _, rfl) (λ i hi, t.piecewise_eq_of_not_mem _ _ (mt (@h _) hi)) + +@[simp] lemma piecewise_idem_right (f g₁ g₂ : Π a, δ a) : + s.piecewise f (s.piecewise g₁ g₂) = s.piecewise f g₂ := +piecewise_piecewise_of_subset_right (subset.refl _) f g₁ g₂ + lemma update_eq_piecewise {β : Type*} [decidable_eq α] (f : α → β) (i : α) (v : β) : function.update f i v = piecewise (singleton i) (λj, v) f := (piecewise_singleton _ _ _).symm @@ -951,6 +981,19 @@ lemma le_piecewise_of_le_of_le {δ : α → Type*} [Π i, preorder (δ i)] {f g (Hf : h ≤ f) (Hg : h ≤ g) : h ≤ s.piecewise f g := λ x, piecewise_cases s f g (λ y, h x ≤ y) (Hf x) (Hg x) +lemma piecewise_mem_Icc_of_mem_of_mem {δ : α → Type*} [Π i, preorder (δ i)] {f f₁ g g₁ : Π i, δ i} + (hf : f ∈ set.Icc f₁ g₁) (hg : g ∈ set.Icc f₁ g₁) : + s.piecewise f g ∈ set.Icc f₁ g₁ := +⟨le_piecewise_of_le_of_le _ hf.1 hg.1, piecewise_le_of_le_of_le _ hf.2 hg.2⟩ + +lemma piecewise_mem_Icc {δ : α → Type*} [Π i, preorder (δ i)] {f g : Π i, δ i} (h : f ≤ g) : + s.piecewise f g ∈ set.Icc f g := +piecewise_mem_Icc_of_mem_of_mem _ (set.left_mem_Icc.2 h) (set.right_mem_Icc.2 h) + +lemma piecewise_mem_Icc' {δ : α → Type*} [Π i, preorder (δ i)] {f g : Π i, δ i} (h : g ≤ f) : + s.piecewise f g ∈ set.Icc g f := +piecewise_mem_Icc_of_mem_of_mem _ (set.right_mem_Icc.2 h) (set.left_mem_Icc.2 h) + end piecewise section decidable_pi_exists