diff --git a/src/Init/Data/Array/Basic.lean b/src/Init/Data/Array/Basic.lean index c84ad50a53..d89d3efe9f 100644 --- a/src/Init/Data/Array/Basic.lean +++ b/src/Init/Data/Array/Basic.lean @@ -180,7 +180,7 @@ in-place when the reference to the array is unique. This avoids overhead due to unboxing a `Nat` used as an index. -/ -@[extern "lean_array_uset"] +@[extern "lean_array_uset", expose] def uset (xs : Array α) (i : USize) (v : α) (h : i.toNat < xs.size) : Array α := xs.set i.toNat v h @@ -1024,7 +1024,7 @@ The optional parameters `start` and `stop` control the region of the array to wh applied. Iteration proceeds from `start` (inclusive) to `stop` (exclusive), so `f` is not invoked unless `start < stop`. By default, the entire array is used. -/ -@[inline] +@[inline, expose] protected def forM {α : Type u} {m : Type v → Type w} [Monad m] (f : α → m PUnit) (as : Array α) (start := 0) (stop := as.size) : m PUnit := as.foldlM (fun _ => f) ⟨⟩ start stop diff --git a/src/Init/Data/List/BasicAux.lean b/src/Init/Data/List/BasicAux.lean index 5c2f9b122a..6c90595e63 100644 --- a/src/Init/Data/List/BasicAux.lean +++ b/src/Init/Data/List/BasicAux.lean @@ -130,7 +130,7 @@ Safer alternatives include: * `List.head?`, which returns an `Option`, and * `List.headD`, which returns an explicitly-provided fallback value on empty lists. -/ -def head! [Inhabited α] : List α → α +@[expose] def head! [Inhabited α] : List α → α | [] => panic! "empty list" | a::_ => a diff --git a/src/Std/Data/DHashMap.lean b/src/Std/Data/DHashMap.lean index c868b646c0..29763dff90 100644 --- a/src/Std/Data/DHashMap.lean +++ b/src/Std/Data/DHashMap.lean @@ -3,7 +3,11 @@ Copyright (c) 2024 Lean FRO, LLC. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Markus Himmel -/ +module + prelude -import Std.Data.DHashMap.Basic -import Std.Data.DHashMap.Lemmas -import Std.Data.DHashMap.AdditionalOperations +public import Std.Data.DHashMap.Basic +public import Std.Data.DHashMap.Lemmas +public import Std.Data.DHashMap.AdditionalOperations + +public section diff --git a/src/Std/Data/DHashMap/AdditionalOperations.lean b/src/Std/Data/DHashMap/AdditionalOperations.lean index c617e25bac..28eb563cc1 100644 --- a/src/Std/Data/DHashMap/AdditionalOperations.lean +++ b/src/Std/Data/DHashMap/AdditionalOperations.lean @@ -3,9 +3,13 @@ Copyright (c) 2024 Lean FRO, LLC. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Markus Himmel -/ +module + prelude -import Std.Data.DHashMap.Internal.Raw -import Std.Data.DHashMap.Internal.WF +public import Std.Data.DHashMap.Internal.Raw +public import Std.Data.DHashMap.Internal.WF + +public section /-! # Additional dependent hash map operations diff --git a/src/Std/Data/DHashMap/Basic.lean b/src/Std/Data/DHashMap/Basic.lean index cbce4beaa5..8f59f7a937 100644 --- a/src/Std/Data/DHashMap/Basic.lean +++ b/src/Std/Data/DHashMap/Basic.lean @@ -3,8 +3,12 @@ Copyright (c) 2024 Lean FRO, LLC. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Markus Himmel -/ +module + prelude -import Std.Data.DHashMap.Raw +public import all Std.Data.DHashMap.Raw + +public section /-! # Dependent hash maps diff --git a/src/Std/Data/DHashMap/Internal/AssocList/Basic.lean b/src/Std/Data/DHashMap/Internal/AssocList/Basic.lean index 9ed98fbbae..75be2a8fda 100644 --- a/src/Std/Data/DHashMap/Internal/AssocList/Basic.lean +++ b/src/Std/Data/DHashMap/Internal/AssocList/Basic.lean @@ -3,8 +3,12 @@ Copyright (c) 2019 Microsoft Corporation. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Leonardo de Moura, Mario Carneiro, Markus Himmel -/ +module + prelude -import Init.NotationExtra +public import Init.NotationExtra + +public section /-! This is an internal implementation file of the hash map. Users of the hash map should not rely on diff --git a/src/Std/Data/DHashMap/Internal/AssocList/Lemmas.lean b/src/Std/Data/DHashMap/Internal/AssocList/Lemmas.lean index 59acc0a060..4c8ba673ef 100644 --- a/src/Std/Data/DHashMap/Internal/AssocList/Lemmas.lean +++ b/src/Std/Data/DHashMap/Internal/AssocList/Lemmas.lean @@ -3,9 +3,13 @@ Copyright (c) 2024 Lean FRO, LLC. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Markus Himmel -/ +module + prelude -import Std.Data.DHashMap.Internal.AssocList.Basic -import Std.Data.Internal.List.Associative +public import all Std.Data.DHashMap.Internal.AssocList.Basic +public import Std.Data.Internal.List.Associative + +public section /-! This is an internal implementation file of the hash map. Users of the hash map should not rely on @@ -29,9 +33,9 @@ namespace Std.DHashMap.Internal.AssocList open Std.Internal.List open Std.Internal -@[simp] theorem toList_nil : (nil : AssocList α β).toList = [] := rfl +@[simp] theorem toList_nil : (nil : AssocList α β).toList = [] := (rfl) @[simp] theorem toList_cons {l : AssocList α β} {a : α} {b : β a} : - (l.cons a b).toList = ⟨a, b⟩ :: l.toList := rfl + (l.cons a b).toList = ⟨a, b⟩ :: l.toList := (rfl) @[simp] theorem foldl_eq {f : δ → (a : α) → β a → δ} {init : δ} {l : AssocList α β} : @@ -81,8 +85,8 @@ theorem get_eq {β : Type v} [BEq α] {l : AssocList α (fun _ => β)} {a : α} theorem getCastD_eq [BEq α] [LawfulBEq α] {l : AssocList α β} {a : α} {fallback : β a} : l.getCastD a fallback = getValueCastD a l.toList fallback := by induction l - · simp [getCastD, List.getValueCastD] - · simp_all [getCastD, List.getValueCastD, List.getValueCastD, List.getValueCast?_cons, + · simp [getCastD] + · simp_all [getCastD, List.getValueCastD, List.getValueCast?_cons, apply_dite (fun x => Option.getD x fallback)] @[simp] diff --git a/src/Std/Data/DHashMap/Internal/Defs.lean b/src/Std/Data/DHashMap/Internal/Defs.lean index cb40861d9c..27c25912c3 100644 --- a/src/Std/Data/DHashMap/Internal/Defs.lean +++ b/src/Std/Data/DHashMap/Internal/Defs.lean @@ -3,11 +3,15 @@ Copyright (c) 2018 Microsoft Corporation. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Leonardo de Moura, Mario Carneiro, Markus Himmel -/ +module + prelude -import Init.Data.Array.Lemmas -import Std.Data.DHashMap.RawDef -import Std.Data.Internal.List.Defs -import Std.Data.DHashMap.Internal.Index +public import Init.Data.Array.Lemmas +public import Std.Data.DHashMap.RawDef +public import Std.Data.Internal.List.Defs +public import Std.Data.DHashMap.Internal.Index + +public section /-! This is an internal implementation file of the hash map. Users of the hash map should not rely on diff --git a/src/Std/Data/DHashMap/Internal/HashesTo.lean b/src/Std/Data/DHashMap/Internal/HashesTo.lean index 959daf015d..11c46488b2 100644 --- a/src/Std/Data/DHashMap/Internal/HashesTo.lean +++ b/src/Std/Data/DHashMap/Internal/HashesTo.lean @@ -3,10 +3,14 @@ Copyright (c) 2024 Lean FRO, LLC. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Markus Himmel -/ +module + prelude -import Init.Data.Hashable -import Std.Data.Internal.List.Associative -import Std.Data.DHashMap.Internal.Defs +public import Init.Data.Hashable +public import Std.Data.Internal.List.Associative +public import Std.Data.DHashMap.Internal.Defs + +public section /-! This is an internal implementation file of the hash map. Users of the hash map should not rely on diff --git a/src/Std/Data/DHashMap/Internal/Index.lean b/src/Std/Data/DHashMap/Internal/Index.lean index 89e44a14d0..6fa429eca9 100644 --- a/src/Std/Data/DHashMap/Internal/Index.lean +++ b/src/Std/Data/DHashMap/Internal/Index.lean @@ -3,9 +3,13 @@ Copyright (c) 2024 Lean FRO, LLC. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Markus Himmel -/ +module + prelude -import Init.Data.UInt.Lemmas -import Init.Data.UInt.Bitwise +public import Init.Data.UInt.Lemmas +public import Init.Data.UInt.Bitwise + +public section /-! This is an internal implementation file of the hash map. Users of the hash map should not rely on @@ -43,7 +47,7 @@ def scrambleHash (hash : UInt64) : UInt64 := `sz` is an explicit parameter because having it inferred from `h` can lead to suboptimal IR, cf. https://github.com/leanprover/lean4/issues/4157 -/ -@[irreducible, inline] def mkIdx (sz : Nat) (h : 0 < sz) (hash : UInt64) : +@[irreducible, inline, expose] def mkIdx (sz : Nat) (h : 0 < sz) (hash : UInt64) : { u : USize // u.toNat < sz } := ⟨(scrambleHash hash).toUSize &&& (USize.ofNat sz - 1), by -- This proof is a good test for our USize API diff --git a/src/Std/Data/DHashMap/Internal/Model.lean b/src/Std/Data/DHashMap/Internal/Model.lean index c90d00da32..681588ee17 100644 --- a/src/Std/Data/DHashMap/Internal/Model.lean +++ b/src/Std/Data/DHashMap/Internal/Model.lean @@ -3,11 +3,16 @@ Copyright (c) 2024 Lean FRO, LLC. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Markus Himmel -/ +module + prelude -import Init.Data.Array.TakeDrop -import Std.Data.DHashMap.Basic -import Std.Data.DHashMap.Internal.HashesTo -import Std.Data.DHashMap.Internal.AssocList.Lemmas +public import Init.Data.Array.TakeDrop +public import Std.Data.DHashMap.Basic +public import all Std.Data.DHashMap.Internal.Defs +public import Std.Data.DHashMap.Internal.HashesTo +public import Std.Data.DHashMap.Internal.AssocList.Lemmas + +public @[expose] section /-! This is an internal implementation file of the hash map. Users of the hash map should not rely on @@ -430,13 +435,13 @@ end theorem reinsertAux_eq [Hashable α] (data : { d : Array (AssocList α β) // 0 < d.size }) (a : α) (b : β a) : - (reinsertAux hash data a b).1 = updateBucket data.1 data.2 a (fun l => l.cons a b) := rfl + (reinsertAux hash data a b).1 = updateBucket data.1 data.2 a (fun l => l.cons a b) := (rfl) theorem get?_eq_get?ₘ [BEq α] [LawfulBEq α] [Hashable α] (m : Raw₀ α β) (a : α) : - get? m a = get?ₘ m a := rfl + get? m a = get?ₘ m a := (rfl) theorem get_eq_getₘ [BEq α] [LawfulBEq α] [Hashable α] (m : Raw₀ α β) (a : α) (h : m.contains a) : - get m a h = getₘ m a h := rfl + get m a h = getₘ m a (by exact h) := (rfl) theorem getD_eq_getDₘ [BEq α] [LawfulBEq α] [Hashable α] (m : Raw₀ α β) (a : α) (fallback : β a) : getD m a fallback = getDₘ m a fallback := by @@ -447,10 +452,10 @@ theorem get!_eq_get!ₘ [BEq α] [LawfulBEq α] [Hashable α] (m : Raw₀ α β) simp [get!, get!ₘ, get?ₘ, List.getValueCast!_eq_getValueCast?, bucket] theorem getKey?_eq_getKey?ₘ [BEq α] [Hashable α] (m : Raw₀ α β) (a : α) : - getKey? m a = getKey?ₘ m a := rfl + getKey? m a = getKey?ₘ m a := (rfl) theorem getKey_eq_getKeyₘ [BEq α] [Hashable α] (m : Raw₀ α β) (a : α) (h : m.contains a) : - getKey m a h = getKeyₘ m a h := rfl + getKey m a h = getKeyₘ m a (by exact h) := (rfl) theorem getKeyD_eq_getKeyDₘ [BEq α] [Hashable α] (m : Raw₀ α β) (a fallback : α) : getKeyD m a fallback = getKeyDₘ m a fallback := by @@ -461,7 +466,7 @@ theorem getKey!_eq_getKey!ₘ [BEq α] [Hashable α] [Inhabited α] (m : Raw₀ simp [getKey!, getKey!ₘ, getKey?ₘ, List.getKey!_eq_getKey?, bucket] theorem contains_eq_containsₘ [BEq α] [Hashable α] (m : Raw₀ α β) (a : α) : - m.contains a = m.containsₘ a := rfl + m.contains a = m.containsₘ a := (rfl) theorem insert_eq_insertₘ [BEq α] [Hashable α] (m : Raw₀ α β) (a : α) (b : β a) : m.insert a b = m.insertₘ a b := by @@ -562,7 +567,7 @@ theorem containsThenInsertIfNew_eq_containsₘ [BEq α] [Hashable α] (m : Raw split <;> simp_all theorem insertIfNew_eq_insertIfNewₘ [BEq α] [Hashable α] (m : Raw₀ α β) (a : α) (b : β a) : - m.insertIfNew a b = m.insertIfNewₘ a b := rfl + m.insertIfNew a b = m.insertIfNewₘ a b := (rfl) theorem getThenInsertIfNew?_eq_insertIfNewₘ [BEq α] [Hashable α] [LawfulBEq α] (m : Raw₀ α β) (a : α) (b : β a) : (m.getThenInsertIfNew? a b).2 = m.insertIfNewₘ a b := by @@ -587,13 +592,13 @@ theorem erase_eq_eraseₘ [BEq α] [Hashable α] (m : Raw₀ α β) (a : α) : · rfl theorem filterMap_eq_filterMapₘ (m : Raw₀ α β) (f : (a : α) → β a → Option (δ a)) : - m.filterMap f = m.filterMapₘ f := rfl + m.filterMap f = m.filterMapₘ f := (rfl) theorem map_eq_mapₘ (m : Raw₀ α β) (f : (a : α) → β a → δ a) : - m.map f = m.mapₘ f := rfl + m.map f = m.mapₘ f := (rfl) theorem filter_eq_filterₘ (m : Raw₀ α β) (f : (a : α) → β a → Bool) : - m.filter f = m.filterₘ f := rfl + m.filter f = m.filterₘ f := (rfl) theorem insertMany_eq_insertListₘ [BEq α] [Hashable α] (m : Raw₀ α β) (l : List ((a : α) × β a)) : insertMany m l = insertListₘ m l := by simp only [insertMany, Id.run_pure, pure_bind, List.forIn_pure_yield_eq_foldl] @@ -613,10 +618,10 @@ section variable {β : Type v} theorem Const.get?_eq_get?ₘ [BEq α] [Hashable α] (m : Raw₀ α (fun _ => β)) (a : α) : - Const.get? m a = Const.get?ₘ m a := rfl + Const.get? m a = Const.get?ₘ m a := (rfl) theorem Const.get_eq_getₘ [BEq α] [Hashable α] (m : Raw₀ α (fun _ => β)) (a : α) - (h : m.contains a) : Const.get m a h = Const.getₘ m a h := rfl + (h : m.contains a) : Const.get m a h = Const.getₘ m a (by exact h) := (rfl) theorem Const.getD_eq_getDₘ [BEq α] [Hashable α] (m : Raw₀ α (fun _ => β)) (a : α) (fallback : β) : Const.getD m a fallback = Const.getDₘ m a fallback := by diff --git a/src/Std/Data/DHashMap/Internal/Raw.lean b/src/Std/Data/DHashMap/Internal/Raw.lean index 80089cfdf6..effc801196 100644 --- a/src/Std/Data/DHashMap/Internal/Raw.lean +++ b/src/Std/Data/DHashMap/Internal/Raw.lean @@ -3,8 +3,12 @@ Copyright (c) 2024 Lean FRO, LLC. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Markus Himmel -/ +module + prelude -import Std.Data.DHashMap.Basic +public import all Std.Data.DHashMap.Basic + +public section /-! This is an internal implementation file of the hash map. Users of the hash map should not rely on @@ -26,9 +30,9 @@ namespace Raw -- TODO: the next two lemmas need to be renamed, but there is a bootstrapping obstacle. -theorem empty_eq [BEq α] [Hashable α] {c : Nat} : (Raw.emptyWithCapacity c : Raw α β) = (Raw₀.emptyWithCapacity c).1 := rfl +theorem empty_eq {c : Nat} : (Raw.emptyWithCapacity c : Raw α β) = (Raw₀.emptyWithCapacity c).1 := (rfl) -theorem emptyc_eq [BEq α] [Hashable α] : (∅ : Raw α β) = Raw₀.emptyWithCapacity.1 := rfl +theorem emptyc_eq : (∅ : Raw α β) = Raw₀.emptyWithCapacity.1 := (rfl) theorem insert_eq [BEq α] [Hashable α] {m : Raw α β} (h : m.WF) {a : α} {b : β a} : m.insert a b = (Raw₀.insert ⟨m, h.size_buckets_pos⟩ a b).1 := by @@ -76,7 +80,7 @@ theorem contains_eq [BEq α] [Hashable α] {m : Raw α β} (h : m.WF) {a : α} : theorem get_eq [BEq α] [Hashable α] [LawfulBEq α] {m : Raw α β} {a : α} {h : a ∈ m} : m.get a h = Raw₀.get ⟨m, by change dite .. = true at h; split at h <;> simp_all⟩ a - (by change dite .. = true at h; split at h <;> simp_all) := rfl + (by change dite .. = true at h; split at h <;> simp_all) := (rfl) theorem getD_eq [BEq α] [Hashable α] [LawfulBEq α] {m : Raw α β} (h : m.WF) {a : α} {fallback : β a} : m.getD a fallback = Raw₀.getD ⟨m, h.size_buckets_pos⟩ a fallback := by @@ -92,7 +96,7 @@ theorem getKey?_eq [BEq α] [Hashable α] {m : Raw α β} (h : m.WF) {a : α} : theorem getKey_eq [BEq α] [Hashable α] {m : Raw α β} {a : α} {h : a ∈ m} : m.getKey a h = Raw₀.getKey ⟨m, by change dite .. = true at h; split at h <;> simp_all⟩ a - (by change dite .. = true at h; split at h <;> simp_all) := rfl + (by change dite .. = true at h; split at h <;> simp_all) := (rfl) theorem getKeyD_eq [BEq α] [Hashable α] {m : Raw α β} (h : m.WF) {a fallback : α} : m.getKeyD a fallback = Raw₀.getKeyD ⟨m, h.size_buckets_pos⟩ a fallback := by @@ -168,7 +172,7 @@ theorem Const.get_eq [BEq α] [Hashable α] {m : Raw α (fun _ => β)} {a : α} Raw.Const.get m a h = Raw₀.Const.get ⟨m, by change dite .. = true at h; split at h <;> simp_all⟩ a (by change dite .. = true at h; split at h <;> simp_all) := - rfl + (rfl) theorem Const.getD_eq [BEq α] [Hashable α] {m : Raw α (fun _ => β)} (h : m.WF) {a : α} {fallback : β} : Raw.Const.getD m a fallback = diff --git a/src/Std/Data/DHashMap/Internal/RawLemmas.lean b/src/Std/Data/DHashMap/Internal/RawLemmas.lean index b9baaf5431..ffc2663059 100644 --- a/src/Std/Data/DHashMap/Internal/RawLemmas.lean +++ b/src/Std/Data/DHashMap/Internal/RawLemmas.lean @@ -3,8 +3,16 @@ Copyright (c) 2024 Lean FRO, LLC. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Markus Himmel -/ +module + prelude -import Std.Data.DHashMap.Internal.WF +import all Std.Data.Internal.List.Associative +import all Std.Data.DHashMap.Internal.Defs +public import Std.Data.DHashMap.Internal.WF +import all Std.Data.DHashMap.Raw +meta import all Std.Data.DHashMap.Basic + +public section /-! This is an internal implementation file of the hash map. Users of the hash map should not rely on @@ -73,7 +81,7 @@ namespace Raw₀ variable (m : Raw₀ α β) @[simp] -theorem size_emptyWithCapacity {c} : (emptyWithCapacity c : Raw₀ α β).1.size = 0 := rfl +theorem size_emptyWithCapacity {c} : (emptyWithCapacity c : Raw₀ α β).1.size = 0 := (rfl) set_option linter.missingDocs false in @[deprecated size_emptyWithCapacity (since := "2025-03-12")] diff --git a/src/Std/Data/DHashMap/Internal/WF.lean b/src/Std/Data/DHashMap/Internal/WF.lean index 52fbbc6f8a..5bb3826ed2 100644 --- a/src/Std/Data/DHashMap/Internal/WF.lean +++ b/src/Std/Data/DHashMap/Internal/WF.lean @@ -3,10 +3,18 @@ Copyright (c) 2024 Lean FRO, LLC. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Markus Himmel -/ +module + prelude -import Std.Data.DHashMap.Basic -import Std.Data.DHashMap.Internal.Model -import Std.Data.DHashMap.Internal.AssocList.Lemmas +import all Std.Data.Internal.List.Associative +import all Std.Data.DHashMap.Raw +public import Std.Data.DHashMap.Basic +import all Std.Data.DHashMap.Internal.Defs +public import Std.Data.DHashMap.Internal.Model +import all Std.Data.DHashMap.Internal.AssocList.Basic +public import Std.Data.DHashMap.Internal.AssocList.Lemmas + +public section /-! This is an internal implementation file of the hash map. Users of the hash map should not rely on @@ -69,7 +77,7 @@ theorem isEmpty_eq_isEmpty [BEq α] [Hashable α] {m : Raw α β} (h : Raw.WFImp Nat.beq_eq_true_eq] theorem fold_eq {l : Raw α β} {f : γ → (a : α) → β a → γ} {init : γ} : - l.fold f init = l.buckets.foldl (fun acc l => l.foldl f acc) init := rfl + l.fold f init = l.buckets.foldl (fun acc l => l.foldl f acc) init := (rfl) theorem fold_cons_apply {l : Raw α β} {acc : List γ} (f : (a : α) → β a → γ) : l.fold (fun acc k v => f k v :: acc) acc = @@ -411,7 +419,7 @@ theorem getKey?_eq_getKey? [BEq α] [Hashable α] [EquivBEq α] [LawfulHashable theorem getKeyₘ_eq_getKey [BEq α] [Hashable α] [EquivBEq α] [LawfulHashable α] {m : Raw₀ α β} (hm : Raw.WFImp m.1) {a : α} {h : m.contains a} : - m.getKeyₘ a h = List.getKey a (toListModel m.1.buckets) (contains_eq_containsKey hm ▸ h) := + m.getKeyₘ a (by exact h) = List.getKey a (toListModel m.1.buckets) (contains_eq_containsKey hm ▸ h) := apply_bucket_with_proof hm a AssocList.getKey List.getKey AssocList.getKey_eq List.getKey_of_perm List.getKey_append_of_containsKey_eq_false diff --git a/src/Std/Data/DHashMap/Lemmas.lean b/src/Std/Data/DHashMap/Lemmas.lean index 4556397b13..e0b8f28a93 100644 --- a/src/Std/Data/DHashMap/Lemmas.lean +++ b/src/Std/Data/DHashMap/Lemmas.lean @@ -3,10 +3,15 @@ Copyright (c) 2024 Lean FRO, LLC. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Markus Himmel -/ +module + prelude -import Std.Data.DHashMap.Internal.Raw -import Std.Data.DHashMap.Internal.RawLemmas -import Std.Data.DHashMap.AdditionalOperations +public import Std.Data.DHashMap.Internal.Raw +public import Std.Data.DHashMap.Internal.RawLemmas +import all Std.Data.DHashMap.Basic +public import all Std.Data.DHashMap.AdditionalOperations + +public section /-! # Dependent hash map lemmas @@ -152,7 +157,7 @@ set_option linter.missingDocs false in @[deprecated size_empty (since := "2025-03-12")] abbrev size_emptyc := @size_empty -theorem isEmpty_eq_size_eq_zero : m.isEmpty = (m.size == 0) := rfl +theorem isEmpty_eq_size_eq_zero : m.isEmpty = (m.size == 0) := (rfl) @[grind =] theorem size_insert [EquivBEq α] [LawfulHashable α] {k : α} {v : β k} : (m.insert k v).size = if k ∈ m then m.size else m.size + 1 := @@ -1336,7 +1341,7 @@ theorem fold_eq_foldl_toList {f : δ → (a : α) → β → δ} {init : δ} : Raw₀.Const.fold_eq_foldl_toList ⟨m.1, m.2.size_buckets_pos⟩ theorem forM_eq_forMUncurried [Monad m'] [LawfulMonad m'] {f : α → β → m' PUnit} : - DHashMap.forM f m = forMUncurried (fun a => f a.1 a.2) m := rfl + DHashMap.forM f m = forMUncurried (fun a => f a.1 a.2) m := (rfl) theorem forMUncurried_eq_forM_toList [Monad m'] [LawfulMonad m'] {f : α × β → m' PUnit} : Const.forMUncurried f m = (Const.toList m).forM f := @@ -1352,7 +1357,7 @@ theorem forM_eq_forM_toList [Monad m'] [LawfulMonad m'] {f : α → β → m' PU theorem forIn_eq_forInUncurried [Monad m'] [LawfulMonad m'] {f : α → β → δ → m' (ForInStep δ)} {init : δ} : - DHashMap.forIn f init m = forInUncurried (fun a b => f a.1 a.2 b) init m := rfl + DHashMap.forIn f init m = forInUncurried (fun a b => f a.1 a.2 b) init m := (rfl) theorem forInUncurried_eq_forIn_toList [Monad m'] [LawfulMonad m'] {f : α × β → δ → m' (ForInStep δ)} {init : δ} : @@ -2016,7 +2021,7 @@ theorem ofList_singleton {k : α} {v : β k} : ext <| congrArg Subtype.val (Raw₀.insertMany_emptyWithCapacity_list_cons (α := α)) theorem ofList_eq_insertMany_empty {l : List ((a : α) × β a)} : - ofList l = insertMany (∅ : DHashMap α β) l := rfl + ofList l = insertMany (∅ : DHashMap α β) l := (rfl) @[simp, grind =] theorem contains_ofList [EquivBEq α] [LawfulHashable α] @@ -2165,7 +2170,7 @@ theorem ofList_singleton {k : α} {v : β} : ext <| congrArg Subtype.val (Raw₀.Const.insertMany_emptyWithCapacity_list_cons (α:= α)) theorem ofList_eq_insertMany_empty {l : List (α × β)} : - ofList l = insertMany (∅ : DHashMap α (fun _ => β)) l := rfl + ofList l = insertMany (∅ : DHashMap α (fun _ => β)) l := (rfl) @[simp, grind =] theorem contains_ofList [EquivBEq α] [LawfulHashable α] diff --git a/src/Std/Data/DHashMap/Raw.lean b/src/Std/Data/DHashMap/Raw.lean index 8176be6da8..ca6b941b36 100644 --- a/src/Std/Data/DHashMap/Raw.lean +++ b/src/Std/Data/DHashMap/Raw.lean @@ -3,10 +3,14 @@ Copyright (c) 2024 Lean FRO, LLC. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Markus Himmel -/ +module + prelude -import Init.Data.BEq -import Init.Data.Hashable -import Std.Data.DHashMap.Internal.Defs +public import Init.Data.BEq +public import Init.Data.Hashable +public import Std.Data.DHashMap.Internal.Defs + +public section /-! # Dependent hash maps with unbundled well-formedness invariant diff --git a/src/Std/Data/DHashMap/RawDef.lean b/src/Std/Data/DHashMap/RawDef.lean index 42fb1e5c35..322171ca2d 100644 --- a/src/Std/Data/DHashMap/RawDef.lean +++ b/src/Std/Data/DHashMap/RawDef.lean @@ -3,8 +3,12 @@ Copyright (c) 2018 Microsoft Corporation. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Leonardo de Moura, Mario Carneiro, Markus Himmel -/ +module + prelude -import Std.Data.DHashMap.Internal.AssocList.Basic +public import Std.Data.DHashMap.Internal.AssocList.Basic + +public section /-! # Definition of `DHashMap.Raw` diff --git a/src/Std/Data/DHashMap/RawLemmas.lean b/src/Std/Data/DHashMap/RawLemmas.lean index 9b44a10807..a19f0cd23b 100644 --- a/src/Std/Data/DHashMap/RawLemmas.lean +++ b/src/Std/Data/DHashMap/RawLemmas.lean @@ -3,9 +3,14 @@ Copyright (c) 2024 Lean FRO, LLC. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Markus Himmel -/ +module + prelude -import Std.Data.DHashMap.Internal.Raw -import Std.Data.DHashMap.Internal.RawLemmas +public import Std.Data.DHashMap.Internal.Raw +public import Std.Data.DHashMap.Internal.RawLemmas +public import all Std.Data.DHashMap.Raw + +public section /-! # Dependent hash map lemmas @@ -1410,7 +1415,7 @@ theorem fold_eq_foldl_toList (h : m.WF) {f : δ → (a : α) → β → δ} {ini omit [BEq α] [Hashable α] in theorem forM_eq_forMUncurried [Monad m'] [LawfulMonad m'] {f : α → β → m' PUnit} : - Raw.forM f m = Const.forMUncurried (fun a => f a.1 a.2) m := rfl + Raw.forM f m = Const.forMUncurried (fun a => f a.1 a.2) m := (rfl) theorem forMUncurried_eq_forM_toList [Monad m'] [LawfulMonad m'] (h : m.WF) {f : α × β → m' PUnit} : @@ -1429,7 +1434,7 @@ omit [BEq α] [Hashable α] in @[simp] theorem forIn_eq_forInUncurried [Monad m'] [LawfulMonad m'] {f : α → β → δ → m' (ForInStep δ)} {init : δ} : - forIn f init m = forInUncurried (fun a b => f a.1 a.2 b) init m := rfl + forIn f init m = forInUncurried (fun a b => f a.1 a.2 b) init m := (rfl) theorem forInUncurried_eq_forIn_toList [Monad m'] [LawfulMonad m'] (h : m.WF) {f : α × β → δ → m' (ForInStep δ)} {init : δ} : @@ -2126,7 +2131,7 @@ theorem ofList_singleton {k : α} {v : β k} : rw [Raw₀.insertMany_emptyWithCapacity_list_cons] theorem ofList_eq_insertMany_empty {l : List ((a : α) × (β a))} : - ofList l = insertMany (∅ : Raw α β) l := rfl + ofList l = insertMany (∅ : Raw α β) l := (rfl) @[simp, grind =] theorem contains_ofList [EquivBEq α] [LawfulHashable α] @@ -2278,7 +2283,7 @@ theorem ofList_singleton {k : α} {v : β} : rw [Raw₀.Const.insertMany_emptyWithCapacity_list_cons] theorem ofList_eq_insertMany_empty {l : List (α × β)} : - ofList l = insertMany (∅ : Raw α (fun _ => β)) l := rfl + ofList l = insertMany (∅ : Raw α (fun _ => β)) l := (rfl) @[simp, grind =] theorem contains_ofList [EquivBEq α] [LawfulHashable α] diff --git a/src/Std/Data/Internal/List/Associative.lean b/src/Std/Data/Internal/List/Associative.lean index 9790a4bff6..57bfd99aac 100644 --- a/src/Std/Data/Internal/List/Associative.lean +++ b/src/Std/Data/Internal/List/Associative.lean @@ -3,16 +3,20 @@ Copyright (c) 2024 Lean FRO, LLC. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Markus Himmel -/ +module + prelude -import Init.Data.BEq -import Init.Data.Nat.Simproc -import Init.Data.Option.Attach -import Init.Data.List.Perm -import Init.Data.List.Find -import Init.Data.List.MinMax -import Init.Data.List.Monadic -import Std.Data.Internal.List.Defs -import Std.Classes.Ord.Basic +public import Init.Data.BEq +public import Init.Data.Nat.Simproc +public import Init.Data.Option.Attach +public import Init.Data.List.Perm +public import Init.Data.List.Find +public import Init.Data.List.MinMax +public import Init.Data.List.Monadic +public import all Std.Data.Internal.List.Defs +public import Std.Classes.Ord.Basic + +public section /-! This is an internal implementation file of the hash map. Users of the hash map should not rely on @@ -23,7 +27,6 @@ File contents: Verification of associative lists set_option linter.missingDocs true set_option autoImplicit false -set_option Elab.async false universe u v w w' @@ -49,9 +52,9 @@ def getEntry? [BEq α] (a : α) : List ((a : α) × β a) → Option ((a : α) | ⟨k, v⟩ :: l => bif k == a then some ⟨k, v⟩ else getEntry? a l @[simp] theorem getEntry?_nil [BEq α] {a : α} : - getEntry? a ([] : List ((a : α) × β a)) = none := rfl + getEntry? a ([] : List ((a : α) × β a)) = none := (rfl) theorem getEntry?_cons [BEq α] {l : List ((a : α) × β a)} {k a : α} {v : β k} : - getEntry? a (⟨k, v⟩ :: l) = bif k == a then some ⟨k, v⟩ else getEntry? a l := rfl + getEntry? a (⟨k, v⟩ :: l) = bif k == a then some ⟨k, v⟩ else getEntry? a l := (rfl) theorem getEntry?_eq_find [BEq α] {k : α} {l : List ((a : α) × β a)} : getEntry? k l = l.find? (·.1 == k) := by @@ -143,7 +146,7 @@ section variable {β : Type v} /-- Internal implementation detail of the hash map -/ -def getValue? [BEq α] (a : α) : List ((_ : α) × β) → Option β +@[expose] def getValue? [BEq α] (a : α) : List ((_ : α) × β) → Option β | [] => none | ⟨k, v⟩ :: l => bif k == a then some v else getValue? a l @@ -184,7 +187,7 @@ theorem isEmpty_eq_false_iff_exists_isSome_getValue? [BEq α] [ReflBEq α] {l : end /-- Internal implementation detail of the hash map -/ -def getValueCast? [BEq α] [LawfulBEq α] (a : α) : List ((a : α) × β a) → Option (β a) +@[expose] def getValueCast? [BEq α] [LawfulBEq α] (a : α) : List ((a : α) × β a) → Option (β a) | [] => none | ⟨k, v⟩ :: l => if h : k == a then some (cast (congrArg β (eq_of_beq h)) v) else getValueCast? a l @@ -252,7 +255,7 @@ private theorem Option.dmap_eq_some {o : Option α} {f : (a : α) → (o = some end -theorem getValueCast?_eq_getEntry? [BEq α] [LawfulBEq α] {l : List ((a : α) × β a)} {a : α} : +private theorem getValueCast?_eq_getEntry? [BEq α] [LawfulBEq α] {l : List ((a : α) × β a)} {a : α} : getValueCast? a l = Option.dmap (getEntry? a l) (fun p h => cast (congrArg β (eq_of_beq (beq_of_getEntry?_eq_some h))) p.2) := by induction l using assoc_induction @@ -276,9 +279,9 @@ def containsKey [BEq α] (a : α) : List ((a : α) × β a) → Bool | ⟨k, _⟩ :: l => k == a || containsKey a l @[simp] theorem containsKey_nil [BEq α] {a : α} : - containsKey a ([] : List ((a : α) × β a)) = false := rfl + containsKey a ([] : List ((a : α) × β a)) = false := (rfl) @[simp] theorem containsKey_cons [BEq α] {l : List ((a : α) × β a)} {k a : α} {v : β k} : - containsKey a (⟨k, v⟩ :: l) = (k == a || containsKey a l) := rfl + containsKey a (⟨k, v⟩ :: l) = (k == a || containsKey a l) := (rfl) theorem containsKey_cons_eq_false [BEq α] {l : List ((a : α) × β a)} {k a : α} {v : β k} : (containsKey a (⟨k, v⟩ :: l) = false) ↔ ((k == a) = false) ∧ (containsKey a l = false) := by @@ -330,9 +333,9 @@ theorem containsKey_eq_contains_map_fst [BEq α] [PartialEquivBEq α] {l : List simp only [List.map_cons, List.contains_cons] rw [BEq.comm] -@[simp] theorem keys_nil : keys ([] : List ((a : α) × β a)) = [] := rfl +@[simp] theorem keys_nil : keys ([] : List ((a : α) × β a)) = [] := (rfl) @[simp] theorem keys_cons {l : List ((a : α) × β a)} {k : α} {v : β k} : - keys (⟨k, v⟩ :: l) = k :: keys l := rfl + keys (⟨k, v⟩ :: l) = k :: keys l := (rfl) theorem length_keys_eq_length (l : List ((a : α) × β a)) : (keys l).length = l.length := by induction l using assoc_induction <;> simp_all @@ -542,7 +545,7 @@ theorem getValue?_eq_some_getValue [BEq α] {l : List ((_ : α) × β)} {a : α} simp [getValue] theorem getValue_cons_of_beq [BEq α] {l : List ((_ : α) × β)} {k a : α} {v : β} (h : k == a) : - getValue a (⟨k, v⟩ :: l) (containsKey_cons_of_beq (k := k) (v := v) h) = v := by + getValue a (⟨k, v⟩ :: l) (containsKey_cons_of_beq h) = v := by simp [getValue, getValue?_cons_of_true h] @[simp] @@ -649,15 +652,15 @@ theorem getValue_eq_getValueCast {β : Type v} [BEq α] [LawfulBEq α] {l : List · simp_all [getValue_cons, getValueCast_cons] /-- Internal implementation detail of the hash map -/ -def getValueCastD [BEq α] [LawfulBEq α] (a : α) (l : List ((a : α) × β a)) (fallback : β a) : β a := +@[expose] def getValueCastD [BEq α] [LawfulBEq α] (a : α) (l : List ((a : α) × β a)) (fallback : β a) : β a := (getValueCast? a l).getD fallback @[simp] theorem getValueCastD_nil [BEq α] [LawfulBEq α] {a : α} {fallback : β a} : - getValueCastD a ([] : List ((a : α) × β a)) fallback = fallback := rfl + getValueCastD a ([] : List ((a : α) × β a)) fallback = fallback := (rfl) theorem getValueCastD_eq_getValueCast? [BEq α] [LawfulBEq α] {l : List ((a : α) × β a)} {a : α} - {fallback : β a} : getValueCastD a l fallback = (getValueCast? a l).getD fallback := rfl + {fallback : β a} : getValueCastD a l fallback = (getValueCast? a l).getD fallback := (rfl) theorem getValueCastD_eq_fallback [BEq α] [LawfulBEq α] {l : List ((a : α) × β a)} {a : α} {fallback : β a} (h : containsKey a l = false) : getValueCastD a l fallback = fallback := by @@ -676,16 +679,16 @@ theorem getValueCast?_eq_some_getValueCastD [BEq α] [LawfulBEq α] {l : List (( rw [getValueCast?_eq_some_getValueCast h, getValueCast_eq_getValueCastD] /-- Internal implementation detail of the hash map -/ -def getValueCast! [BEq α] [LawfulBEq α] (a : α) [Inhabited (β a)] (l : List ((a : α) × β a)) : +@[expose] def getValueCast! [BEq α] [LawfulBEq α] (a : α) [Inhabited (β a)] (l : List ((a : α) × β a)) : β a := (getValueCast? a l).get! @[simp] theorem getValueCast!_nil [BEq α] [LawfulBEq α] {a : α} [Inhabited (β a)] : - getValueCast! a ([] : List ((a : α) × β a)) = default := rfl + getValueCast! a ([] : List ((a : α) × β a)) = default := (rfl) theorem getValueCast!_eq_getValueCast? [BEq α] [LawfulBEq α] {l : List ((a : α) × β a)} {a : α} - [Inhabited (β a)] : getValueCast! a l = (getValueCast? a l).get! := rfl + [Inhabited (β a)] : getValueCast! a l = (getValueCast? a l).get! := (rfl) theorem getValueCast!_eq_default [BEq α] [LawfulBEq α] {l : List ((a : α) × β a)} {a : α} [Inhabited (β a)] (h : containsKey a l = false) : getValueCast! a l = default := by @@ -703,22 +706,22 @@ theorem getValueCast?_eq_some_getValueCast! [BEq α] [LawfulBEq α] {l : List (( rw [getValueCast?_eq_some_getValueCast h, getValueCast_eq_getValueCast!] theorem getValueCast!_eq_getValueCastD_default [BEq α] [LawfulBEq α] {l : List ((a : α) × β a)} - {a : α} [Inhabited (β a)] : getValueCast! a l = getValueCastD a l default := rfl + {a : α} [Inhabited (β a)] : getValueCast! a l = getValueCastD a l default := (rfl) section variable {β : Type v} /-- Internal implementation detail of the hash map -/ -def getValueD [BEq α] (a : α) (l : List ((_ : α) × β)) (fallback : β) : β := +@[expose] def getValueD [BEq α] (a : α) (l : List ((_ : α) × β)) (fallback : β) : β := (getValue? a l).getD fallback @[simp] theorem getValueD_nil [BEq α] {a : α} {fallback : β} : - getValueD a ([] : List ((_ : α) × β)) fallback = fallback := rfl + getValueD a ([] : List ((_ : α) × β)) fallback = fallback := (rfl) theorem getValueD_eq_getValue? [BEq α] {l : List ((_ : α) × β)} {a : α} {fallback : β} : - getValueD a l fallback = (getValue? a l).getD fallback := rfl + getValueD a l fallback = (getValue? a l).getD fallback := (rfl) theorem getValueD_eq_fallback [BEq α] {l : List ((_ : α) × β)} {a : α} {fallback : β} (h : containsKey a l = false) : getValueD a l fallback = fallback := by @@ -742,15 +745,15 @@ theorem getValueD_congr [BEq α] [PartialEquivBEq α] {l : List ((_ : α) × β) simp only [getValueD_eq_getValue?, getValue?_congr hab] /-- Internal implementation detail of the hash map -/ -def getValue! [BEq α] [Inhabited β] (a : α) (l : List ((_ : α) × β)) : β := +@[expose] def getValue! [BEq α] [Inhabited β] (a : α) (l : List ((_ : α) × β)) : β := (getValue? a l).get! @[simp] theorem getValue!_nil [BEq α] [Inhabited β] {a : α} : - getValue! a ([] : List ((_ : α) × β)) = default := rfl + getValue! a ([] : List ((_ : α) × β)) = default := (rfl) theorem getValue!_eq_getValue? [BEq α] [Inhabited β] {l : List ((_ : α) × β)} {a : α} : - getValue! a l = (getValue? a l).get! := rfl + getValue! a l = (getValue? a l).get! := (rfl) theorem getValue!_eq_default [BEq α] [Inhabited β] {l : List ((_ : α) × β)} {a : α} (h : containsKey a l = false) : getValue! a l = default := by @@ -774,7 +777,7 @@ theorem getValue!_congr [BEq α] [PartialEquivBEq α] [Inhabited β] {l : List ( simp only [getValue!_eq_getValue?, getValue?_congr hab] theorem getValue!_eq_getValueD_default [BEq α] [Inhabited β] {l : List ((_ : α) × β)} {a : α} : - getValue! a l = getValueD a l default := rfl + getValue! a l = getValueD a l default := (rfl) end @@ -784,10 +787,10 @@ def getKey? [BEq α] (a : α) : List ((a : α) × β a) → Option α | ⟨k, _⟩ :: l => bif k == a then some k else getKey? a l @[simp] theorem getKey?_nil [BEq α] {a : α} : - getKey? a ([] : List ((a : α) × β a)) = none := rfl + getKey? a ([] : List ((a : α) × β a)) = none := (rfl) @[simp] theorem getKey?_cons [BEq α] {l : List ((a : α) × β a)} {k a : α} {v : β k} : - getKey? a (⟨k, v⟩ :: l) = bif k == a then some k else getKey? a l := rfl + getKey? a (⟨k, v⟩ :: l) = bif k == a then some k else getKey? a l := (rfl) theorem getKey?_cons_of_true [BEq α] {l : List ((a : α) × β a)} {k a : α} {v : β k} (h : k == a) : getKey? a (⟨k, v⟩ :: l) = some k := by @@ -969,15 +972,15 @@ theorem forall_mem_keys_iff_forall_containsKey_getKey [BEq α] [EquivBEq α] {l · exact h /-- Internal implementation detail of the hash map -/ -def getKeyD [BEq α] (a : α) (l : List ((a : α) × β a)) (fallback : α) : α := +@[expose] def getKeyD [BEq α] (a : α) (l : List ((a : α) × β a)) (fallback : α) : α := (getKey? a l).getD fallback @[simp] theorem getKeyD_nil [BEq α] {a fallback : α} : - getKeyD a ([] : List ((a : α) × β a)) fallback = fallback := rfl + getKeyD a ([] : List ((a : α) × β a)) fallback = fallback := (rfl) theorem getKeyD_eq_getKey? [BEq α] {l : List ((a : α) × β a)} {a fallback : α} : - getKeyD a l fallback = (getKey? a l).getD fallback := rfl + getKeyD a l fallback = (getKey? a l).getD fallback := (rfl) theorem getKeyD_eq_fallback [BEq α] [EquivBEq α] {l : List ((a : α) × β a)} {a fallback : α} (h : containsKey a l = false) : getKeyD a l fallback = fallback := by @@ -1005,15 +1008,15 @@ theorem getKey?_eq_some_getKeyD [BEq α] [EquivBEq α] {l : List ((a : α) × β rw [getKey?_eq_some_getKey h, getKey_eq_getKeyD] /-- Internal implementation detail of the hash map -/ -def getKey! [BEq α] [Inhabited α] (a : α) (l : List ((a : α) × β a)) : α := +@[expose] def getKey! [BEq α] [Inhabited α] (a : α) (l : List ((a : α) × β a)) : α := (getKey? a l).get! @[simp] theorem getKey!_nil [BEq α] [Inhabited α] {a : α} : - getKey! a ([] : List ((a : α) × β a)) = default := rfl + getKey! a ([] : List ((a : α) × β a)) = default := (rfl) theorem getKey!_eq_getKey? [BEq α] [Inhabited α] {l : List ((a : α) × β a)} {a : α} : - getKey! a l = (getKey? a l).get! := rfl + getKey! a l = (getKey? a l).get! := (rfl) theorem getKey!_eq_default [BEq α] [Inhabited α] {l : List ((a : α) × β a)} {a : α} (h : containsKey a l = false) : getKey! a l = default := by @@ -1040,7 +1043,7 @@ theorem getKey?_eq_some_getKey! [BEq α] [Inhabited α] {l : List ((a : α) × rw [getKey?_eq_some_getKey h, getKey_eq_getKey!] theorem getKey!_eq_getKeyD_default [BEq α] [EquivBEq α] [Inhabited α] {l : List ((a : α) × β a)} - {a : α} : getKey! a l = getKeyD a l default := rfl + {a : α} : getKey! a l = getKeyD a l default := (rfl) theorem getEntry?_eq_getValueCast? [BEq α] [LawfulBEq α] {l : List ((a : α) × β a)} {a : α} : getEntry? a l = (getValueCast? a l).map (fun v => ⟨a, v⟩) := by @@ -1073,10 +1076,10 @@ def replaceEntry [BEq α] (k : α) (v : β k) : List ((a : α) × β a) → List | [] => [] | ⟨k', v'⟩ :: l => bif k' == k then ⟨k, v⟩ :: l else ⟨k', v'⟩ :: replaceEntry k v l -@[simp] theorem replaceEntry_nil [BEq α] {k : α} {v : β k} : replaceEntry k v [] = [] := rfl +@[simp] theorem replaceEntry_nil [BEq α] {k : α} {v : β k} : replaceEntry k v [] = [] := (rfl) theorem replaceEntry_cons [BEq α] {l : List ((a : α) × β a)} {k k' : α} {v : β k} {v' : β k'} : replaceEntry k v (⟨k', v'⟩ :: l) = - bif k' == k then ⟨k, v⟩ :: l else ⟨k', v'⟩ :: replaceEntry k v l := rfl + bif k' == k then ⟨k, v⟩ :: l else ⟨k', v'⟩ :: replaceEntry k v l := (rfl) theorem replaceEntry_cons_of_true [BEq α] {l : List ((a : α) × β a)} {k k' : α} {v : β k} {v' : β k'} (h : k' == k) : replaceEntry k v (⟨k', v'⟩ :: l) = ⟨k, v⟩ :: l := by @@ -1256,10 +1259,10 @@ def eraseKey [BEq α] (k : α) : List ((a : α) × β a) → List ((a : α) × | [] => [] | ⟨k', v'⟩ :: l => bif k' == k then l else ⟨k', v'⟩ :: eraseKey k l -@[simp] theorem eraseKey_nil [BEq α] {k : α} : eraseKey k ([] : List ((a : α) × β a)) = [] := rfl +@[simp] theorem eraseKey_nil [BEq α] {k : α} : eraseKey k ([] : List ((a : α) × β a)) = [] := (rfl) theorem eraseKey_cons [BEq α] {l : List ((a : α) × β a)} {k k' : α} {v' : β k'} : - eraseKey k (⟨k', v'⟩ :: l) = bif k' == k then l else ⟨k', v'⟩ :: eraseKey k l := rfl + eraseKey k (⟨k', v'⟩ :: l) = bif k' == k then l else ⟨k', v'⟩ :: eraseKey k l := (rfl) theorem eraseKey_cons_of_beq [BEq α] {l : List ((a : α) × β a)} {k k' : α} {v' : β k'} (h : k' == k) : eraseKey k (⟨k', v'⟩ :: l) = l := @@ -1868,12 +1871,12 @@ theorem keys_filter [BEq α] [LawfulBEq α] {l : List ((a : α) × β a)} {f : ( (List.filter (fun x => f x.1 (getValueCast x.1 l (mem_keys_iff_contains.mp x.2))) (keys l).attach).unattach := by induction l using assoc_induction with - | nil => simp + | nil => simp [keys] | cons k v tl ih => rw [List.filter_cons] specialize ih hl.tail replace hl := hl.containsKey_eq_false - simp only [keys_cons, List.attach_cons, getValueCast_cons, ↓reduceDIte, cast_eq, + simp only [keys, List.attach_cons, getValueCast_cons, ↓reduceDIte, cast_eq, List.filter_cons, BEq.rfl, List.filter_map, Function.comp_def] have (x : { x // x ∈ keys tl }) : (k == x.val) = False := eq_false <| by intro h @@ -1890,12 +1893,12 @@ theorem Const.keys_filter [BEq α] [EquivBEq α] {β : Type v} (List.filter (fun x => f x.1 (getValue x.1 l (containsKey_of_mem_keys x.2))) (keys l).attach).unattach := by induction l using assoc_induction with - | nil => simp + | nil => simp [keys] | cons k v tl ih => rw [List.filter_cons] specialize ih hl.tail replace hl := hl.containsKey_eq_false - simp only [keys_cons, List.attach_cons, getValue_cons, ↓reduceDIte, + simp only [keys, List.attach_cons, getValue_cons, ↓reduceDIte, List.filter_cons, BEq.rfl, List.filter_map, Function.comp_def] have (x : { x // x ∈ keys tl }) : (k == x.val) = False := eq_false <| by intro h @@ -3413,7 +3416,7 @@ theorem length_insertListIfNewUnit [BEq α] [EquivBEq α] rw [ih] · rw [length_insertEntryIfNew] specialize distinct_both hd - simp only [List.contains_cons, BEq.rfl, Bool.true_or, + simp only [List.contains_cons, BEq.rfl, Bool.true_or, ] at distinct_both cases eq : containsKey hd l with | true => simp [eq] at distinct_both @@ -3424,7 +3427,7 @@ theorem length_insertListIfNewUnit [BEq α] [EquivBEq α] · simp only [pairwise_cons] at distinct_toInsert apply And.right distinct_toInsert · intro a - simp only [List.contains_cons, + simp only [List.contains_cons, ] at distinct_both rw [containsKey_insertEntryIfNew] simp only [Bool.or_eq_true] @@ -3546,7 +3549,8 @@ theorem alterKey_cons_perm {k : α} {f : Option (β k) → Option (β k)} {k' : by_cases hk' : k' == k · simp only [hk', ↓reduceDIte] rw [getValueCast?_cons_of_true hk', eraseKey_cons_of_beq hk'] - simp [insertEntry_cons_of_beq hk'] + simp only [insertEntry_cons_of_beq hk'] + rfl · simp only [hk', Bool.false_eq_true, ↓reduceDIte] rw [Bool.not_eq_true] at hk' rw [getValueCast?_cons_of_false hk', eraseKey_cons_of_false hk', alterKey] @@ -3584,7 +3588,7 @@ theorem alterKey_append_of_containsKey_right_eq_false {a : α} {f : Option (β a theorem alterKey_nil {a : α} {f : Option (β a) → Option (β a)} : alterKey a f [] = match f none with | none => [] -| some b => [⟨a, b⟩] := rfl +| some b => [⟨a, b⟩] := (rfl) theorem containsKey_alterKey_self {a : α} {f : Option (β a) → Option (β a)} {l : List ((a : α) × β a)} (hl : DistinctKeys l) : @@ -3831,7 +3835,8 @@ theorem alterKey_cons_perm {k : α} {f : Option β → Option β} {k' : α} {v' by_cases hk' : k' == k · simp only [hk'] rw [getValue?_cons_of_true hk', eraseKey_cons_of_beq hk'] - simp [insertEntry_cons_of_beq hk'] + simp only [insertEntry_cons_of_beq hk'] + rfl · simp only [hk', Bool.false_eq_true] rw [Bool.not_eq_true] at hk' rw [getValue?_cons_of_false hk', eraseKey_cons_of_false hk', alterKey] @@ -3869,7 +3874,7 @@ theorem alterKey_append_of_containsKey_right_eq_false {a : α} {f : Option β theorem alterKey_nil {a : α} {f : Option β → Option β} : alterKey a f [] = match f none with | none => [] -| some b => [⟨a, b⟩] := rfl +| some b => [⟨a, b⟩] := (rfl) theorem containsKey_alterKey_self [EquivBEq α] {a : α} {f : Option β → Option β} {l : List ((_ : α) × β)} (hl : DistinctKeys l) : @@ -3969,7 +3974,7 @@ theorem getValue!_alterKey [EquivBEq α] {k k' : α} [Inhabited β] {f : Option (f (getValue? k l)).get! else getValue! k' l := by - simp only [hl, getValue!_eq_getValue?, getValue?_alterKey, + simp only [hl, getValue!_eq_getValue?, getValue?_alterKey, apply_ite Option.get!] theorem getValueD_alterKey [EquivBEq α] {k k' : α} {fallback : β} {f : Option β → Option β} @@ -3979,7 +3984,7 @@ theorem getValueD_alterKey [EquivBEq α] {k k' : α} {fallback : β} {f : Option f (getValue? k l) |>.getD fallback else getValueD k' l fallback := by - simp only [hl, getValueD_eq_getValue?, getValue?_alterKey, + simp only [hl, getValueD_eq_getValue?, getValue?_alterKey, apply_ite (Option.getD · fallback)] theorem getKey?_alterKey [EquivBEq α] {k k' : α} {f : Option β → Option β} (l : List ((_ : α) × β)) @@ -4413,31 +4418,31 @@ end Modify section FilterMap -theorem Option.dmap_bind {α β γ : Type _} (x : Option α) (f : α → Option β) +private theorem Option.dmap_bind {α β γ : Type _} (x : Option α) (f : α → Option β) (g : (a : β) → x.bind f = some a → γ) : Option.dmap (x.bind f) g = x.pbind (fun a h => Option.dmap (f a) (fun b h' => g b (h ▸ h'.symm ▸ rfl))) := by cases x <;> rfl -theorem Option.bind_dmap_left {α β γ : Type _} (x : Option α) +private theorem Option.bind_dmap_left {α β γ : Type _} (x : Option α) (f : (a : α) → x = some a → β) (g : β → Option γ) : (Option.dmap x f).bind g = x.pbind (fun a h => g (f a h)) := by cases x <;> rfl -theorem Option.dmap_map {α β γ : Type _} (x : Option α) (f : α → β) +private theorem Option.dmap_map {α β γ : Type _} (x : Option α) (f : α → β) (g : (a : β) → x.map f = some a → γ) : Option.dmap (x.map f) g = Option.dmap x (fun a h => g (f a) (h ▸ rfl)) := by cases x <;> rfl -theorem Option.map_dmap {α β γ : Type _} (x : Option α) +private theorem Option.map_dmap {α β γ : Type _} (x : Option α) (f : (a : α) → x = some a → β) (g : β → γ) : (x.dmap f).map g = Option.dmap x (fun a h => g (f a h)) := by cases x <;> rfl -theorem Option.dmap_id {α : Type _} (x : Option α) : Option.dmap x (fun a _ => a) = x := by +private theorem Option.dmap_id {α : Type _} (x : Option α) : Option.dmap x (fun a _ => a) = x := by cases x <;> rfl -theorem Option.dmap_ite {α β : Type _} (p : Prop) [Decidable p] (t e : Option α) +private theorem Option.dmap_ite {α β : Type _} (p : Prop) [Decidable p] (t e : Option α) (f : (a : α) → (if p then t else e) = some a → β) : Option.dmap (if p then t else e) f = if h : p then Option.dmap t (fun a h' => f a (if_pos h ▸ h')) @@ -4448,7 +4453,7 @@ theorem Option.dmap_ite {α β : Type _} (p : Prop) [Decidable p] (t e : Option · rename_i h simp only -theorem Option.get_dmap {α β : Type _} {x : Option α} {f : (a : α) → x = some a → β} (h) : +private theorem Option.get_dmap {α β : Type _} {x : Option α} {f : (a : α) → x = some a → β} (h) : (Option.dmap x f).get h = f (x.get (isSome_dmap.symm.trans h)) (Option.eq_some_of_isSome _) := by cases x <;> trivial @@ -4462,16 +4467,16 @@ theorem Sigma.snd_congr {x x' : (a : α) × β a} (h : x = x') : x.snd = cast (congrArg (β ·.fst) h.symm) x'.snd := by cases h; rfl -theorem Option.pmap_eq_dmap {α β : Type _} {p : α → Prop} {x : Option α} +private theorem Option.pmap_eq_dmap {α β : Type _} {p : α → Prop} {x : Option α} {f : (a : α) → p a → β} (h : ∀ a ∈ x, p a) : x.pmap f h = Option.dmap x (fun a h' => f a (h a h')) := by cases x <;> rfl -theorem Option.dmap_eq_map {α β : Type _} {x : Option α} {f : α → β} : +private theorem Option.dmap_eq_map {α β : Type _} {x : Option α} {f : α → β} : Option.dmap x (fun a _ => f a) = x.map f := by cases x <;> rfl -theorem Option.any_dmap {α β : Type _} {x : Option α} +private theorem Option.any_dmap {α β : Type _} {x : Option α} {f : (a : α) → x = some a → β} {p : β → Bool} : (x.dmap f).any p = x.attach.any (fun ⟨a, h⟩ => p (f a h)) := by cases x <;> rfl @@ -5013,7 +5018,7 @@ theorem length_filter_eq_length_iff [BEq α] [LawfulBEq α] {f : (a : α) → β {l : List ((a : α) × β a)} (distinct : DistinctKeys l) : (l.filter fun p => f p.1 p.2).length = l.length ↔ ∀ (a : α) (h : containsKey a l), (f a (getValueCast a l h)) = true := by - simp [← List.filterMap_eq_filter, + simp [← List.filterMap_eq_filter, forall_mem_iff_forall_contains_getValueCast (p := fun a b => f a b = true) distinct] theorem length_filter_key_eq_length_iff [BEq α] [EquivBEq α] {f : α → Bool} @@ -5205,7 +5210,7 @@ theorem getValue?_filter {β : Type v} [BEq α] [EquivBEq α] getValue? k (l.filter fun p => (f p.1 p.2)) = (getValue? k l).pfilter (fun v h => f (getKey k l (containsKey_eq_isSome_getValue?.trans (Option.isSome_of_eq_some h))) v) := by - simp only [getValue?_eq_getEntry?, distinct, getEntry?_filter, + simp only [getValue?_eq_getEntry?, distinct, getEntry?_filter, Option.pfilter_eq_pbind_ite, ← Option.bind_guard, Option.guard_def, Option.pbind_map, Option.map_bind, Function.comp_def, apply_ite, Option.map_some, Option.map_none] @@ -5380,14 +5385,14 @@ theorem length_filter_eq_length_iff {β : Type v} [BEq α] [EquivBEq α] {f : (_ : α) → β → Bool} {l : List ((_ : α) × β)} (distinct : DistinctKeys l) : (l.filter fun p => (f p.1 p.2)).length = l.length ↔ ∀ (a : α) (h : containsKey a l), (f (getKey a l h) (getValue a l h)) = true := by - simp [← List.filterMap_eq_filter, Option.guard, + simp [← List.filterMap_eq_filter, Option.guard, forall_mem_iff_forall_contains_getKey_getValue (p := fun a b => f a b = true) distinct] theorem length_filter_key_eq_length_iff {β : Type v} [BEq α] [EquivBEq α] {f : (_ : α) → Bool} {l : List ((_ : α) × β)} (distinct : DistinctKeys l) : (l.filter fun p => f p.1).length = l.length ↔ ∀ (a : α) (h : containsKey a l), f (getKey a l h) = true := by - simp [← List.filterMap_eq_filter, + simp [← List.filterMap_eq_filter, forall_mem_iff_forall_contains_getKey_getValue (p := fun a b => f a = true) distinct] theorem isEmpty_filterMap_eq_true [BEq α] [EquivBEq α] {β : Type v} {γ : Type w} @@ -5461,7 +5466,7 @@ private theorem leSigmaOfOrd_total [Ord α] [OrientedOrd α] (a b : (a : α) × private local instance minSigmaOfOrd [Ord α] : Min ((a : α) × β a) where min a b := if compare a.1 b.1 |>.isLE then a else b -theorem min_def [Ord α] {p q : (a : α) × β a} : +private theorem min_def [Ord α] {p q : (a : α) × β a} : min p q = if compare p.1 q.1 |>.isLE then p else q := rfl @@ -5500,14 +5505,14 @@ theorem DistinctKeys.eq_of_mem_of_beq [BEq α] [EquivBEq α] {a b : (a : α) × · simp [BEq.symm_false <| hd.1 a.1 <| fst_mem_keys_of_mem ‹_›] at he · exact ih ‹_› hd.2 -theorem min_eq_or [Ord α] {p q : (a : α) × β a} : min p q = p ∨ min p q = q := by +private theorem min_eq_or [Ord α] {p q : (a : α) × β a} : min p q = p ∨ min p q = q := by rw [min_def] split <;> simp -theorem min_eq_left [Ord α] {p q : (a : α) × β a} (h : compare p.1 q.1 |>.isLE) : min p q = p := by +private theorem min_eq_left [Ord α] {p q : (a : α) × β a} (h : compare p.1 q.1 |>.isLE) : min p q = p := by simp [min_def, h] -theorem min_eq_left_of_lt [Ord α] {p q : (a : α) × β a} (h : compare p.1 q.1 = .lt) : min p q = p := +private theorem min_eq_left_of_lt [Ord α] {p q : (a : α) × β a} (h : compare p.1 q.1 = .lt) : min p q = p := min_eq_left (Ordering.isLE_of_eq_lt h) theorem minEntry?_eq_head? [Ord α] {l : List ((a : α) × β a)} @@ -5518,7 +5523,7 @@ theorem minEntry?_eq_head? [Ord α] {l : List ((a : α) × β a)} theorem minEntry?_nil [Ord α] : minEntry? ([] : List ((a : α) × β a)) = none := by simp [minEntry?, List.min?] -theorem minEntry?_cons [Ord α] [TransOrd α] (e : (a : α) × β a) (l : List ((a : α) × β a)) : +private theorem minEntry?_cons [Ord α] [TransOrd α] (e : (a : α) × β a) (l : List ((a : α) × β a)) : minEntry? (e :: l) = some (match minEntry? l with | none => e | some w => min e w) := by @@ -5531,7 +5536,7 @@ theorem isSome_minEntry?_of_isEmpty_eq_false [Ord α] {l : List ((a : α) × β · simp_all · simp [minEntry?, List.min?] -theorem le_min_iff [Ord α] [TransOrd α] {a b c : (a : α) × β a} : +private theorem le_min_iff [Ord α] [TransOrd α] {a b c : (a : α) × β a} : a ≤ min b c ↔ a ≤ b ∧ a ≤ c := by simp only [min_def] split @@ -5632,7 +5637,7 @@ theorem isSome_minKey?_iff_isEmpty_eq_false [Ord α] {l : List ((a : α) × β a (minKey? l).isSome ↔ l.isEmpty = false := by simp [isSome_minKey?_eq_not_isEmpty] -theorem min_apply [Ord α] {e₁ e₂ : (a : α) × β a} {f : (a : α) × β a → (a : α) × β a} +private theorem min_apply [Ord α] {e₁ e₂ : (a : α) × β a} {f : (a : α) × β a → (a : α) × β a} (hf : compare e₁.1 e₂.1 = compare (f e₁).1 (f e₂).1) : min (f e₁) (f e₂) = f (min e₁ e₂) := by simp only [min_def, hf, apply_ite f] @@ -6070,7 +6075,7 @@ theorem minKey_of_perm [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] {l l' : theorem minKey_eq_get_minKey? [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] {l : List ((a : α) × β a)} {he} : minKey l he = (minKey? l |>.get (by simp [isSome_minKey?_eq_not_isEmpty, he])) := - rfl + (rfl) theorem minKey?_eq_some_minKey [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] {l : List ((a : α) × β a)} {he} : @@ -6235,7 +6240,7 @@ theorem minKey_alterKey_eq_self [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α end Const /-- Returns the smallest key in an associative list or panics if the list is empty. -/ -def minKey! [Ord α] [Inhabited α] (xs : List ((a : α) × β a)) : α := +@[expose] def minKey! [Ord α] [Inhabited α] (xs : List ((a : α) × β a)) : α := minKey? xs |>.get! theorem minKey!_of_perm [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] [Inhabited α] @@ -6440,7 +6445,7 @@ theorem minKeyD_of_perm [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] theorem minKeyD_eq_getD_minKey? [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] {l : List ((a : α) × β a)} {fallback} : minKeyD l fallback = (minKey? l).getD fallback := - rfl + (rfl) theorem minKey_eq_minKeyD [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] {l : List ((a : α) × β a)} {he fallback} : @@ -6919,7 +6924,7 @@ theorem maxKey_of_perm [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] {l l' : theorem maxKey_eq_get_maxKey? [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] {l : List ((a : α) × β a)} {he} : maxKey l he = (maxKey? l |>.get (by simp [isSome_maxKey?_eq_not_isEmpty, he])) := - rfl + (rfl) theorem maxKey?_eq_some_maxKey [Ord α] [TransOrd α] [BEq α] [LawfulBEqOrd α] {l : List ((a : α) × β a)} {he} : diff --git a/src/Std/Data/Internal/List/Defs.lean b/src/Std/Data/Internal/List/Defs.lean index e80e22d15a..b12878672e 100644 --- a/src/Std/Data/Internal/List/Defs.lean +++ b/src/Std/Data/Internal/List/Defs.lean @@ -3,8 +3,12 @@ Copyright (c) 2024 Lean FRO, LLC. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Markus Himmel -/ +module + prelude -import Init.BinderPredicates +public import Init.BinderPredicates + +public section /-! This is an internal implementation file of the hash map. Users of the hash map should not rely on