aneris.dist_lang.helpers
From stdpp Require Export gmap.
Section map_Filter.
Context `{FinMap K M}.
Context {A} (P : K * A → Prop) `{!∀ x, Decision (P x)}.
Implicit Types m : M A.
Lemma map_filter_lookup_None_insert i x m:
filter P m !! i = None →
¬ P (i,x) →
filter P (<[i:=x]> m) = filter P m.
Proof.
intros HNone Hneg.
apply map_eq. intros j. apply option_eq; intros y.
destruct (decide (j = i)) as [->|?].
- split; intro.
+ rewrite map_filter_lookup_Some in H8. destruct H8 as [? Hc].
rewrite lookup_insert in H8; simplify_eq. contradiction.
+ rewrite H8 in HNone. simplify_eq.
- by rewrite !map_filter_lookup_Some, lookup_insert_ne.
Qed.
End map_Filter.
Section fin_map_dom.
Context `{FinMapDom K M D}.
Context `{!LeibnizEquiv D}.
Lemma dom_insert_Some {A} (m : M A) i (x y : A) :
m !! i = Some x →
dom D (<[i:=y]> m) = dom D m.
Proof.
intros.
rewrite dom_insert_L.
apply subseteq_union_1_L, elem_of_subseteq_singleton,
elem_of_dom; eauto.
Qed.
End fin_map_dom.
Section map_Filter.
Context `{FinMap K M}.
Context {A} (P : K * A → Prop) `{!∀ x, Decision (P x)}.
Implicit Types m : M A.
Lemma map_filter_lookup_None_insert i x m:
filter P m !! i = None →
¬ P (i,x) →
filter P (<[i:=x]> m) = filter P m.
Proof.
intros HNone Hneg.
apply map_eq. intros j. apply option_eq; intros y.
destruct (decide (j = i)) as [->|?].
- split; intro.
+ rewrite map_filter_lookup_Some in H8. destruct H8 as [? Hc].
rewrite lookup_insert in H8; simplify_eq. contradiction.
+ rewrite H8 in HNone. simplify_eq.
- by rewrite !map_filter_lookup_Some, lookup_insert_ne.
Qed.
End map_Filter.
Section fin_map_dom.
Context `{FinMapDom K M D}.
Context `{!LeibnizEquiv D}.
Lemma dom_insert_Some {A} (m : M A) i (x y : A) :
m !! i = Some x →
dom D (<[i:=y]> m) = dom D m.
Proof.
intros.
rewrite dom_insert_L.
apply subseteq_union_1_L, elem_of_subseteq_singleton,
elem_of_dom; eauto.
Qed.
End fin_map_dom.