@@ -79,9 +79,20 @@ by cases s₁; cases s₂; refl
79
79
{C : finmap β → Prop } (s : finmap β) (H : ∀ (a : alist β), C ⟦a⟧) : C s :=
80
80
by rcases s with ⟨⟨a⟩, h⟩; exact H ⟨a, h⟩
81
81
82
+ @[elab_as_eliminator] theorem induction_on₂ {C : finmap β → finmap β → Prop }
83
+ (s₁ s₂ : finmap β) (H : ∀ (a₁ a₂ : alist β), C ⟦a₁⟧ ⟦a₂⟧) : C s₁ s₂ :=
84
+ induction_on s₁ $ λ l₁, induction_on s₂ $ λ l₂, H l₁ l₂
85
+
86
+ @[elab_as_eliminator] theorem induction_on₃ {C : finmap β → finmap β → finmap β → Prop }
87
+ (s₁ s₂ s₃ : finmap β) (H : ∀ (a₁ a₂ a₃ : alist β), C ⟦a₁⟧ ⟦a₂⟧ ⟦a₃⟧) : C s₁ s₂ s₃ :=
88
+ induction_on₂ s₁ s₂ $ λ l₁ l₂, induction_on s₃ $ λ l₃, H l₁ l₂ l₃
89
+
82
90
@[extensionality] theorem ext : ∀ {s t : finmap β}, s.entries = t.entries → s = t
83
91
| ⟨l₁, h₁⟩ ⟨l₂, h₂⟩ H := by congr'
84
92
93
+ @[simp] theorem ext_iff {s t : finmap β} : s.entries = t.entries ↔ s = t :=
94
+ ⟨ext, congr_arg _⟩
95
+
85
96
/-- The predicate `a ∈ s` means that `s` has a value associated to the key `a`. -/
86
97
instance : has_mem α (finmap β) := ⟨λ a s, a ∈ s.entries.keys⟩
87
98
@@ -124,13 +135,19 @@ def singleton (a : α) (b : β a) : finmap β :=
124
135
125
136
variables [decidable_eq α]
126
137
138
+ instance has_decidable_eq [∀ a, decidable_eq (β a)] : decidable_eq (finmap β)
139
+ | s₁ s₂ := decidable_of_iff _ ext_iff
140
+
127
141
/-- Look up the value associated to a key in a map. -/
128
142
def lookup (a : α) (s : finmap β) : option (β a) :=
129
143
lift_on s (lookup a) (λ s t, perm_lookup)
130
144
131
145
@[simp] theorem lookup_to_finmap (a : α) (s : alist β) :
132
146
lookup a ⟦s⟧ = s.lookup a := rfl
133
147
148
+ @[simp] theorem lookup_empty (a) : lookup a (∅ : finmap β) = none :=
149
+ rfl
150
+
134
151
theorem lookup_is_some {a : α} {s : finmap β} :
135
152
(s.lookup a).is_some ↔ a ∈ s :=
136
153
induction_on s $ λ s, alist.lookup_is_some
@@ -187,7 +204,7 @@ induction_on s $ λ s, by simp
187
204
induction_on s $ lookup_erase a
188
205
189
206
@[simp] theorem lookup_erase_ne {a a'} {s : finmap β} (h : a ≠ a') :
190
- lookup a' (erase a s) = lookup a' s :=
207
+ lookup a (erase a' s) = lookup a s :=
191
208
induction_on s $ λ s, lookup_erase_ne h
192
209
193
210
/- insert -/
@@ -206,8 +223,8 @@ theorem insert_entries_of_neg {a : α} {b : β a} {s : finmap β} : a ∉ s →
206
223
induction_on s $ λ s h,
207
224
by simp [insert_entries_of_neg (mt mem_to_finmap.1 h)]
208
225
209
- @[simp] theorem mem_insert {a a' : α} {b : β a} {s : finmap β} :
210
- a' ∈ insert a b s ↔ a = a' ∨ a' ∈ s :=
226
+ @[simp] theorem mem_insert {a a' : α} {b' : β a' } {s : finmap β} :
227
+ a ∈ insert a' b' s ↔ a = a' ∨ a ∈ s :=
211
228
induction_on s mem_insert
212
229
213
230
@[simp] theorem lookup_insert {a} {b : β a} (s : finmap β) :
@@ -226,4 +243,40 @@ lift_on s (λ t, prod.map id to_finmap (extract a t)) $
226
243
extract a s = (lookup a s, erase a s) :=
227
244
induction_on s $ λ s, by simp [extract]
228
245
246
+ /- union -/
247
+
248
+ /-- `s₁ ∪ s₂` is the key-based union of two finite maps. It is left-biased: if
249
+ there exists an `a ∈ s₁`, `lookup a (s₁ ∪ s₂) = lookup a s₁`. -/
250
+ def union (s₁ s₂ : finmap β) : finmap β :=
251
+ lift_on₂ s₁ s₂ (λ s₁ s₂, ⟦s₁ ∪ s₂⟧) $
252
+ λ s₁ s₂ s₃ s₄ p₁₃ p₂₄, to_finmap_eq.mpr $ perm_union p₁₃ p₂₄
253
+
254
+ instance : has_union (finmap β) := ⟨union⟩
255
+
256
+ @[simp] theorem mem_union {a} {s₁ s₂ : finmap β} :
257
+ a ∈ s₁ ∪ s₂ ↔ a ∈ s₁ ∨ a ∈ s₂ :=
258
+ induction_on₂ s₁ s₂ $ λ _ _, mem_union
259
+
260
+ @[simp] theorem union_to_finmap (s₁ s₂ : alist β) : ⟦s₁⟧ ∪ ⟦s₂⟧ = ⟦s₁ ∪ s₂⟧ :=
261
+ by simp [(∪), union]
262
+
263
+ theorem keys_union {s₁ s₂ : finmap β} : (s₁ ∪ s₂).keys = s₁.keys ∪ s₂.keys :=
264
+ induction_on₂ s₁ s₂ $ λ s₁ s₂, finset.ext' $ by simp [keys]
265
+
266
+ @[simp] theorem lookup_union_left {a} {s₁ s₂ : finmap β} :
267
+ a ∈ s₁ → lookup a (s₁ ∪ s₂) = lookup a s₁ :=
268
+ induction_on₂ s₁ s₂ $ λ s₁ s₂, lookup_union_left
269
+
270
+ @[simp] theorem lookup_union_right {a} {s₁ s₂ : finmap β} :
271
+ a ∉ s₁ → lookup a (s₁ ∪ s₂) = lookup a s₂ :=
272
+ induction_on₂ s₁ s₂ $ λ s₁ s₂, lookup_union_right
273
+
274
+ @[simp] theorem mem_lookup_union {a} {b : β a} {s₁ s₂ : finmap β} :
275
+ b ∈ lookup a (s₁ ∪ s₂) ↔ b ∈ lookup a s₁ ∨ a ∉ s₁ ∧ b ∈ lookup a s₂ :=
276
+ induction_on₂ s₁ s₂ $ λ s₁ s₂, mem_lookup_union
277
+
278
+ theorem mem_lookup_union_middle {a} {b : β a} {s₁ s₂ s₃ : finmap β} :
279
+ b ∈ lookup a (s₁ ∪ s₃) → a ∉ s₂ → b ∈ lookup a (s₁ ∪ s₂ ∪ s₃) :=
280
+ induction_on₃ s₁ s₂ s₃ $ λ s₁ s₂ s₃, mem_lookup_union_middle
281
+
229
282
end finmap
0 commit comments