From 7688fbb067913b60399da3e48ad69fb81ceb1aef Mon Sep 17 00:00:00 2001 From: Kim Morrison Date: Wed, 14 May 2025 08:03:46 +0800 Subject: [PATCH] feat: add `@[grind]` annotations to `contains_iff_mem` lemmas (#8328) This PR adds the `@[grind =]` attribute to all `contains_iff_mem` lemmas. --- src/Init/Data/Array/Lemmas.lean | 1 + src/Init/Data/List/Lemmas.lean | 1 + src/Init/Data/Vector/Lemmas.lean | 1 + src/Std/Data/DHashMap/Lemmas.lean | 2 +- src/Std/Data/DHashMap/RawLemmas.lean | 2 +- src/Std/Data/DTreeMap/Lemmas.lean | 2 +- src/Std/Data/DTreeMap/Raw/Lemmas.lean | 2 +- src/Std/Data/ExtDHashMap/Lemmas.lean | 2 +- src/Std/Data/ExtHashMap/Lemmas.lean | 2 +- src/Std/Data/ExtHashSet/Lemmas.lean | 2 +- src/Std/Data/HashMap/Lemmas.lean | 2 +- src/Std/Data/HashMap/RawLemmas.lean | 2 +- src/Std/Data/HashSet/Lemmas.lean | 2 +- src/Std/Data/HashSet/RawLemmas.lean | 2 +- src/Std/Data/TreeMap/Lemmas.lean | 2 +- src/Std/Data/TreeMap/Raw/Lemmas.lean | 2 +- src/Std/Data/TreeSet/Lemmas.lean | 2 +- src/Std/Data/TreeSet/Raw/Lemmas.lean | 2 +- 18 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/Init/Data/Array/Lemmas.lean b/src/Init/Data/Array/Lemmas.lean index 95fe9e559d..0b3e4d2761 100644 --- a/src/Init/Data/Array/Lemmas.lean +++ b/src/Init/Data/Array/Lemmas.lean @@ -3740,6 +3740,7 @@ theorem contains_iff_exists_mem_beq [BEq α] {xs : Array α} {a : α} : rcases xs with ⟨xs⟩ simp [List.contains_iff_exists_mem_beq] +@[grind =] theorem contains_iff_mem [BEq α] [LawfulBEq α] {xs : Array α} {a : α} : xs.contains a ↔ a ∈ xs := by simp diff --git a/src/Init/Data/List/Lemmas.lean b/src/Init/Data/List/Lemmas.lean index 8751669f5f..4d0ee94fa2 100644 --- a/src/Init/Data/List/Lemmas.lean +++ b/src/Init/Data/List/Lemmas.lean @@ -2938,6 +2938,7 @@ theorem contains_iff_exists_mem_beq [BEq α] {l : List α} {a : α} : l.contains a ↔ ∃ a' ∈ l, a == a' := by induction l <;> simp_all +@[grind =] theorem contains_iff_mem [BEq α] [LawfulBEq α] {l : List α} {a : α} : l.contains a ↔ a ∈ l := by simp diff --git a/src/Init/Data/Vector/Lemmas.lean b/src/Init/Data/Vector/Lemmas.lean index d00cc957aa..6d5da59dcf 100644 --- a/src/Init/Data/Vector/Lemmas.lean +++ b/src/Init/Data/Vector/Lemmas.lean @@ -2679,6 +2679,7 @@ theorem contains_iff_exists_mem_beq [BEq α] {xs : Vector α n} {a : α} : rcases xs with ⟨xs, rfl⟩ simp [Array.contains_iff_exists_mem_beq] +@[grind =] theorem contains_iff_mem [BEq α] [LawfulBEq α] {xs : Vector α n} {a : α} : xs.contains a ↔ a ∈ xs := by simp diff --git a/src/Std/Data/DHashMap/Lemmas.lean b/src/Std/Data/DHashMap/Lemmas.lean index 68fa623522..7bb53f479d 100644 --- a/src/Std/Data/DHashMap/Lemmas.lean +++ b/src/Std/Data/DHashMap/Lemmas.lean @@ -51,7 +51,7 @@ theorem mem_iff_contains {a : α} : a ∈ m ↔ m.contains a := -- While setting up the API, often use this in the reverse direction, -- but prefer this direction for users. -@[simp] +@[simp, grind =] theorem contains_iff_mem {a : α} : m.contains a ↔ a ∈ m := Iff.rfl diff --git a/src/Std/Data/DHashMap/RawLemmas.lean b/src/Std/Data/DHashMap/RawLemmas.lean index 2194195dd6..c5a817a04a 100644 --- a/src/Std/Data/DHashMap/RawLemmas.lean +++ b/src/Std/Data/DHashMap/RawLemmas.lean @@ -102,7 +102,7 @@ theorem isEmpty_insert [EquivBEq α] [LawfulHashable α] (h : m.WF) {k : α} {v theorem mem_iff_contains {m : Raw α β} {a : α} : a ∈ m ↔ m.contains a := Iff.rfl -@[simp] +@[simp, grind =] theorem contains_iff_mem {m : Raw α β} {a : α} : m.contains a ↔ a ∈ m := Iff.rfl diff --git a/src/Std/Data/DTreeMap/Lemmas.lean b/src/Std/Data/DTreeMap/Lemmas.lean index a49cf07a20..1333683975 100644 --- a/src/Std/Data/DTreeMap/Lemmas.lean +++ b/src/Std/Data/DTreeMap/Lemmas.lean @@ -41,7 +41,7 @@ theorem isEmpty_insert [TransCmp cmp] {k : α} {v : β k} : theorem mem_iff_contains {k : α} : k ∈ t ↔ t.contains k := Impl.mem_iff_contains -@[simp] +@[simp, grind =] theorem contains_iff_mem {k : α} : t.contains k ↔ k ∈ t := Impl.contains_iff_mem diff --git a/src/Std/Data/DTreeMap/Raw/Lemmas.lean b/src/Std/Data/DTreeMap/Raw/Lemmas.lean index 1e0e1157b4..cefa7d08eb 100644 --- a/src/Std/Data/DTreeMap/Raw/Lemmas.lean +++ b/src/Std/Data/DTreeMap/Raw/Lemmas.lean @@ -42,7 +42,7 @@ theorem isEmpty_insert [TransCmp cmp] (h : t.WF) {k : α} {v : β k} : theorem mem_iff_contains {k : α} : k ∈ t ↔ t.contains k := Impl.mem_iff_contains -@[simp] +@[simp, grind =] theorem contains_iff_mem {k : α} : t.contains k ↔ k ∈ t := Impl.contains_iff_mem diff --git a/src/Std/Data/ExtDHashMap/Lemmas.lean b/src/Std/Data/ExtDHashMap/Lemmas.lean index 8e22329e19..846f2e6a63 100644 --- a/src/Std/Data/ExtDHashMap/Lemmas.lean +++ b/src/Std/Data/ExtDHashMap/Lemmas.lean @@ -51,7 +51,7 @@ theorem not_insert_eq_empty [EquivBEq α] [LawfulHashable α] {k : α} {v : β k theorem mem_iff_contains [EquivBEq α] [LawfulHashable α] {a : α} : a ∈ m ↔ m.contains a := Iff.rfl -@[simp] +@[simp, grind =] theorem contains_iff_mem [EquivBEq α] [LawfulHashable α] {a : α} : m.contains a ↔ a ∈ m := Iff.rfl diff --git a/src/Std/Data/ExtHashMap/Lemmas.lean b/src/Std/Data/ExtHashMap/Lemmas.lean index 90336c1467..36c61b4768 100644 --- a/src/Std/Data/ExtHashMap/Lemmas.lean +++ b/src/Std/Data/ExtHashMap/Lemmas.lean @@ -55,7 +55,7 @@ theorem not_insert_eq_empty [EquivBEq α] [LawfulHashable α] {k : α} {v : β} theorem mem_iff_contains [EquivBEq α] [LawfulHashable α] {a : α} : a ∈ m ↔ m.contains a := ExtDHashMap.mem_iff_contains -@[simp] +@[simp, grind =] theorem contains_iff_mem [EquivBEq α] [LawfulHashable α] {a : α} : m.contains a ↔ a ∈ m := Iff.rfl diff --git a/src/Std/Data/ExtHashSet/Lemmas.lean b/src/Std/Data/ExtHashSet/Lemmas.lean index f3cd9ae45d..1d933c343b 100644 --- a/src/Std/Data/ExtHashSet/Lemmas.lean +++ b/src/Std/Data/ExtHashSet/Lemmas.lean @@ -55,7 +55,7 @@ theorem not_insert_eq_empty [EquivBEq α] [LawfulHashable α] {k : α} : theorem mem_iff_contains [EquivBEq α] [LawfulHashable α] {a : α} : a ∈ m ↔ m.contains a := ExtHashMap.mem_iff_contains -@[simp] +@[simp, grind =] theorem contains_iff_mem [EquivBEq α] [LawfulHashable α] {a : α} : m.contains a ↔ a ∈ m := ExtHashMap.contains_iff_mem diff --git a/src/Std/Data/HashMap/Lemmas.lean b/src/Std/Data/HashMap/Lemmas.lean index c693adb8ae..fb3a823636 100644 --- a/src/Std/Data/HashMap/Lemmas.lean +++ b/src/Std/Data/HashMap/Lemmas.lean @@ -52,7 +52,7 @@ theorem isEmpty_insert [EquivBEq α] [LawfulHashable α] {k : α} {v : β} : theorem mem_iff_contains {a : α} : a ∈ m ↔ m.contains a := DHashMap.mem_iff_contains -@[simp] +@[simp, grind =] theorem contains_iff_mem {a : α} : m.contains a ↔ a ∈ m := DHashMap.contains_iff_mem diff --git a/src/Std/Data/HashMap/RawLemmas.lean b/src/Std/Data/HashMap/RawLemmas.lean index 7048730a96..7e7c6a667f 100644 --- a/src/Std/Data/HashMap/RawLemmas.lean +++ b/src/Std/Data/HashMap/RawLemmas.lean @@ -68,7 +68,7 @@ theorem isEmpty_insert [EquivBEq α] [LawfulHashable α] (h : m.WF) {k : α} {v theorem mem_iff_contains {a : α} : a ∈ m ↔ m.contains a := DHashMap.Raw.mem_iff_contains -@[simp] +@[simp, grind =] theorem contains_iff_mem {a : α} : m.contains a ↔ a ∈ m := DHashMap.Raw.contains_iff_mem diff --git a/src/Std/Data/HashSet/Lemmas.lean b/src/Std/Data/HashSet/Lemmas.lean index ddf2e707c9..f2c2a7628a 100644 --- a/src/Std/Data/HashSet/Lemmas.lean +++ b/src/Std/Data/HashSet/Lemmas.lean @@ -50,7 +50,7 @@ theorem isEmpty_insert [EquivBEq α] [LawfulHashable α] {a : α} : (m.insert a) theorem mem_iff_contains {a : α} : a ∈ m ↔ m.contains a := HashMap.mem_iff_contains -@[simp] +@[simp, grind =] theorem contains_iff_mem {a : α} : m.contains a ↔ a ∈ m := HashMap.contains_iff_mem diff --git a/src/Std/Data/HashSet/RawLemmas.lean b/src/Std/Data/HashSet/RawLemmas.lean index 8782c2f49c..3ed9d783f6 100644 --- a/src/Std/Data/HashSet/RawLemmas.lean +++ b/src/Std/Data/HashSet/RawLemmas.lean @@ -68,7 +68,7 @@ theorem isEmpty_insert [EquivBEq α] [LawfulHashable α] (h : m.WF) {a : α} : theorem mem_iff_contains {a : α} : a ∈ m ↔ m.contains a := HashMap.Raw.mem_iff_contains -@[simp] +@[simp, grind =] theorem contains_iff_mem {a : α} : m.contains a ↔ a ∈ m := HashMap.Raw.contains_iff_mem diff --git a/src/Std/Data/TreeMap/Lemmas.lean b/src/Std/Data/TreeMap/Lemmas.lean index 6d86de67df..c7c5f3d089 100644 --- a/src/Std/Data/TreeMap/Lemmas.lean +++ b/src/Std/Data/TreeMap/Lemmas.lean @@ -38,7 +38,7 @@ theorem isEmpty_insert [TransCmp cmp] {k : α} {v : β} : theorem mem_iff_contains {k : α} : k ∈ t ↔ t.contains k := DTreeMap.mem_iff_contains -@[simp] +@[simp, grind =] theorem contains_iff_mem {k : α} : t.contains k ↔ k ∈ t := DTreeMap.contains_iff_mem diff --git a/src/Std/Data/TreeMap/Raw/Lemmas.lean b/src/Std/Data/TreeMap/Raw/Lemmas.lean index 44ac4c2407..6f3f521df7 100644 --- a/src/Std/Data/TreeMap/Raw/Lemmas.lean +++ b/src/Std/Data/TreeMap/Raw/Lemmas.lean @@ -39,7 +39,7 @@ theorem isEmpty_insert [TransCmp cmp] (h : t.WF) {k : α} {v : β} : theorem mem_iff_contains {k : α} : k ∈ t ↔ t.contains k := DTreeMap.Raw.mem_iff_contains -@[simp] +@[simp, grind =] theorem contains_iff_mem {k : α} : t.contains k ↔ k ∈ t := DTreeMap.Raw.contains_iff_mem diff --git a/src/Std/Data/TreeSet/Lemmas.lean b/src/Std/Data/TreeSet/Lemmas.lean index 7b0c5a6fa7..19541145e0 100644 --- a/src/Std/Data/TreeSet/Lemmas.lean +++ b/src/Std/Data/TreeSet/Lemmas.lean @@ -38,7 +38,7 @@ theorem isEmpty_insert [TransCmp cmp] {k : α} : theorem mem_iff_contains {k : α} : k ∈ t ↔ t.contains k := TreeMap.mem_iff_contains -@[simp] +@[simp, grind =] theorem contains_iff_mem {k : α} : t.contains k ↔ k ∈ t := TreeMap.contains_iff_mem diff --git a/src/Std/Data/TreeSet/Raw/Lemmas.lean b/src/Std/Data/TreeSet/Raw/Lemmas.lean index a6cb25a956..7f21ca1ed5 100644 --- a/src/Std/Data/TreeSet/Raw/Lemmas.lean +++ b/src/Std/Data/TreeSet/Raw/Lemmas.lean @@ -39,7 +39,7 @@ theorem isEmpty_insert [TransCmp cmp] (h : t.WF) {k : α} : theorem mem_iff_contains {k : α} : k ∈ t ↔ t.contains k := TreeMap.Raw.mem_iff_contains -@[simp] +@[simp, grind =] theorem contains_iff_mem {k : α} : t.contains k ↔ k ∈ t := TreeMap.Raw.contains_iff_mem