diff options
Diffstat (limited to 'maptools.v')
| -rw-r--r-- | maptools.v | 63 |
1 files changed, 44 insertions, 19 deletions
| @@ -4,8 +4,8 @@ From stdpp Require Import countable fin_maps fin_map_dom. | |||
| 4 | (** Generic lemmas for finite maps and their domains *) | 4 | (** Generic lemmas for finite maps and their domains *) |
| 5 | 5 | ||
| 6 | Lemma map_insert_empty_lookup {A} `{FinMap K M} | 6 | Lemma map_insert_empty_lookup {A} `{FinMap K M} |
| 7 | (i j : K) (u v : A) : | 7 | (i j : K) (x y : A) : |
| 8 | <[i := u]> (∅ : M A) !! j = Some v → i = j ∧ v = u. | 8 | <[i := x]> (∅ : M A) !! j = Some y → i = j ∧ y = x. |
| 9 | Proof. | 9 | Proof. |
| 10 | intros Hiel. | 10 | intros Hiel. |
| 11 | destruct (decide (i = j)). | 11 | destruct (decide (i = j)). |
| @@ -106,6 +106,32 @@ Lemma map_dom_insert_eq_L `{FinMapDom K M D} `{!LeibnizEquiv D} {A} | |||
| 106 | dom (delete i m1) = dom (delete i m2) ∧ i ∈ dom m2. | 106 | dom (delete i m1) = dom (delete i m2) ∧ i ∈ dom m2. |
| 107 | Proof. set_solver. Qed. | 107 | Proof. set_solver. Qed. |
| 108 | 108 | ||
| 109 | (* Copied from stdpp and changed so that the value types | ||
| 110 | of m1 and m2 are decoupled *) | ||
| 111 | Lemma map_dom_subseteq_size `{FinMapDom K M D} {A B} (m1 : M A) (m2 : M B) : | ||
| 112 | dom m2 ⊆ dom m1 → size m2 ≤ size m1. | ||
| 113 | Proof. | ||
| 114 | revert m1. induction m2 as [|i x m2 ? IH] using map_ind; intros m1 Hdom. | ||
| 115 | { rewrite map_size_empty. lia. } | ||
| 116 | rewrite dom_insert in Hdom. | ||
| 117 | assert (i ∉ dom m2) by (by apply not_elem_of_dom). | ||
| 118 | assert (i ∈ dom m1) as [x' Hx'] % elem_of_dom by set_solver. | ||
| 119 | rewrite <-(insert_delete m1 i x') by done. | ||
| 120 | rewrite !map_size_insert_None, <-Nat.succ_le_mono | ||
| 121 | by (by rewrite ?lookup_delete). | ||
| 122 | apply IH. rewrite dom_delete. set_solver. | ||
| 123 | Qed. | ||
| 124 | |||
| 125 | Lemma map_dom_empty_subset `{Countable K} `{FinMapDom K M D} {A B} (m : M A) : | ||
| 126 | dom m ⊆ dom (∅ : M B) → m = ∅. | ||
| 127 | Proof. | ||
| 128 | intros Hdom. | ||
| 129 | apply map_dom_subseteq_size in Hdom. | ||
| 130 | rewrite map_size_empty in Hdom. | ||
| 131 | inv Hdom. | ||
| 132 | by apply map_size_empty_inv. | ||
| 133 | Qed. | ||
| 134 | |||
| 109 | (** map_mapM *) | 135 | (** map_mapM *) |
| 110 | 136 | ||
| 111 | Definition map_mapM {M : Type → Type} `{MBind F} `{MRet F} `{FinMap K M} {A B} | 137 | Definition map_mapM {M : Type → Type} `{MBind F} `{MRet F} `{FinMap K M} {A B} |
| @@ -137,11 +163,10 @@ Proof. | |||
| 137 | Qed. | 163 | Qed. |
| 138 | 164 | ||
| 139 | Lemma map_mapM_option_insert_L `{FinMapDom K M D} `{!LeibnizEquiv D} {A B} | 165 | Lemma map_mapM_option_insert_L `{FinMapDom K M D} `{!LeibnizEquiv D} {A B} |
| 140 | (f : A → option B) (m1 : M A) (m2 m2' : M B) | 166 | (f : A → option B) (m1 : M A) (m2 m2' : M B) (i : K) (x : A) : |
| 141 | (i : K) (x : A) (x' : B) : | 167 | m1 !! i = None → |
| 142 | m1 !! i = None → | 168 | map_mapM f (<[i := x]>m1) = Some m2 → |
| 143 | map_mapM f (<[i := x]>m1) = Some m2 → | 169 | ∃ x', f x = Some x' ∧ map_mapM f m1 = Some (delete i m2). |
| 144 | ∃ x', f x = Some x' ∧ map_mapM f m1 = Some (delete i m2). | ||
| 145 | Proof. | 170 | Proof. |
| 146 | intros Helem HmapM. | 171 | intros Helem HmapM. |
| 147 | unfold map_mapM in HmapM. | 172 | unfold map_mapM in HmapM. |
| @@ -315,7 +340,7 @@ Qed. | |||
| 315 | 340 | ||
| 316 | Lemma map_Forall2_impl_L `{FinMapDom K M D} `{!LeibnizEquiv D} {A B} | 341 | Lemma map_Forall2_impl_L `{FinMapDom K M D} `{!LeibnizEquiv D} {A B} |
| 317 | (R1 R2 : A → B → Prop) : | 342 | (R1 R2 : A → B → Prop) : |
| 318 | (∀ a b, R1 a b → R2 a b) → | 343 | (∀ x y, R1 x y → R2 x y) → |
| 319 | ∀ (m1 : M A) (m2 : M B), | 344 | ∀ (m1 : M A) (m2 : M B), |
| 320 | map_Forall2 R1 m1 m2 → map_Forall2 R2 m1 m2. | 345 | map_Forall2 R1 m1 m2 → map_Forall2 R2 m1 m2. |
| 321 | Proof. | 346 | Proof. |
| @@ -327,8 +352,8 @@ Proof. | |||
| 327 | Qed. | 352 | Qed. |
| 328 | 353 | ||
| 329 | Lemma map_Forall2_fmap_r_L `{FinMapDom K M D} `{!LeibnizEquiv D} {A B C} | 354 | Lemma map_Forall2_fmap_r_L `{FinMapDom K M D} `{!LeibnizEquiv D} {A B C} |
| 330 | (P : A → C → Prop) (m1 : M A) (m2 : M B) (f : B → C) : | 355 | (R : A → C → Prop) (m1 : M A) (m2 : M B) (f : B → C) : |
| 331 | map_Forall2 P m1 (f <$> m2) → map_Forall2 (λ l r, P l (f r)) m1 m2. | 356 | map_Forall2 R m1 (f <$> m2) → map_Forall2 (λ x y, R x (f y)) m1 m2. |
| 332 | Proof. | 357 | Proof. |
| 333 | intros HForall2. | 358 | intros HForall2. |
| 334 | unfold map_Forall2, map_relation, option_relation in *. | 359 | unfold map_Forall2, map_relation, option_relation in *. |
| @@ -355,10 +380,10 @@ Proof. | |||
| 355 | Qed. | 380 | Qed. |
| 356 | 381 | ||
| 357 | Lemma map_insert_L `{FinMapDom K M D} `{!LeibnizEquiv D} {A} | 382 | Lemma map_insert_L `{FinMapDom K M D} `{!LeibnizEquiv D} {A} |
| 358 | (i : K) (x1 x2 : A) (m1 m2 : M A) : | 383 | (i : K) (x y : A) (m1 m2 : M A) : |
| 359 | x1 = x2 → | 384 | x = y → |
| 360 | delete i m1 = delete i m2 → | 385 | delete i m1 = delete i m2 → |
| 361 | <[i := x1]>m1 = <[i := x2]>m2. | 386 | <[i := x]>m1 = <[i := y]>m2. |
| 362 | Proof. | 387 | Proof. |
| 363 | intros Heq Hdel. | 388 | intros Heq Hdel. |
| 364 | apply map_Forall2_eq_L. | 389 | apply map_Forall2_eq_L. |
| @@ -367,8 +392,8 @@ Proof. | |||
| 367 | Qed. | 392 | Qed. |
| 368 | 393 | ||
| 369 | Lemma map_insert_rev_L `{FinMapDom K M D} `{!LeibnizEquiv D} {A} | 394 | Lemma map_insert_rev_L `{FinMapDom K M D} `{!LeibnizEquiv D} {A} |
| 370 | (i : K) (x1 x2 : A) (m1 m2 : M A) : | 395 | (m1 m2 : M A) (i : K) (x y : A) : |
| 371 | <[i := x1]>m1 = <[i := x2]>m2 → x1 = x2 ∧ delete i m1 = delete i m2. | 396 | <[i := x]>m1 = <[i := y]>m2 → x = y ∧ delete i m1 = delete i m2. |
| 372 | Proof. | 397 | Proof. |
| 373 | intros Heq. apply map_Forall2_eq_L in Heq. | 398 | intros Heq. apply map_Forall2_eq_L in Heq. |
| 374 | apply map_Forall2_insert_inv in Heq as [Heq1 Heq2]. | 399 | apply map_Forall2_insert_inv in Heq as [Heq1 Heq2]. |
| @@ -376,13 +401,13 @@ Proof. | |||
| 376 | Qed. | 401 | Qed. |
| 377 | 402 | ||
| 378 | Lemma map_insert_rev_1_L `{FinMapDom K M D} `{!LeibnizEquiv D} {A} | 403 | Lemma map_insert_rev_1_L `{FinMapDom K M D} `{!LeibnizEquiv D} {A} |
| 379 | (i : K) (x1 x2 : A) (m1 m2 : M A) : | 404 | (m1 m2 : M A) (i : K) (x y : A) : |
| 380 | <[i := x1]>m1 = <[i := x2]>m2 → x1 = x2. | 405 | <[i := x]>m1 = <[i := y]>m2 → x = y. |
| 381 | Proof. apply map_insert_rev_L. Qed. | 406 | Proof. apply map_insert_rev_L. Qed. |
| 382 | 407 | ||
| 383 | Lemma map_insert_rev_2_L `{FinMapDom K M D} `{!LeibnizEquiv D} {A} | 408 | Lemma map_insert_rev_2_L `{FinMapDom K M D} `{!LeibnizEquiv D} {A} |
| 384 | (i : K) (x1 x2 : A) (m1 m2 : M A) : | 409 | (m1 m2 : M A) (i : K) (x y : A) : |
| 385 | <[i := x1]>m1 = <[i := x2]>m2 → delete i m1 = delete i m2. | 410 | <[i := x]>m1 = <[i := y]>m2 → delete i m1 = delete i m2. |
| 386 | Proof. apply map_insert_rev_L. Qed. | 411 | Proof. apply map_insert_rev_L. Qed. |
| 387 | 412 | ||
| 388 | Lemma map_Forall2_alt_L `{FinMapDom K M D} `{!LeibnizEquiv D} {A B} | 413 | Lemma map_Forall2_alt_L `{FinMapDom K M D} `{!LeibnizEquiv D} {A B} |