diff --git a/theories/heap_lang/lang.v b/theories/heap_lang/lang.v index f292f2e1b2507e15a38397f9ec026e8b9cbbf237..697a59f78ee1d5843057731dc7ade7088e25fca1 100644 --- a/theories/heap_lang/lang.v +++ b/theories/heap_lang/lang.v @@ -442,10 +442,10 @@ Definition vals_cas_compare_safe (vl v1 : val) : Prop := val_is_unboxed vl ∨ val_is_unboxed v1. Arguments vals_cas_compare_safe !_ !_ /. -Definition state_upd_heap (f: gmap loc val → gmap loc val) (σ: state) := +Definition state_upd_heap (f: gmap loc val → gmap loc val) (σ: state) : state := {| heap := f σ.(heap); used_proph_id := σ.(used_proph_id) |}. Arguments state_upd_heap _ !_ /. -Definition state_upd_used_proph_id (f: gset proph_id → gset proph_id) (σ: state) := +Definition state_upd_used_proph_id (f: gset proph_id → gset proph_id) (σ: state) : state := {| heap := σ.(heap); used_proph_id := f σ.(used_proph_id) |}. Arguments state_upd_used_proph_id _ !_ /. diff --git a/theories/heap_lang/proph_map.v b/theories/heap_lang/proph_map.v index 92f0000fb6e8df3225cc88c23b18c6440a0cc73f..5f19f0c774c5d75678af3b1d1c42f8ae4ba4d048 100644 --- a/theories/heap_lang/proph_map.v +++ b/theories/heap_lang/proph_map.v @@ -7,54 +7,6 @@ Import uPred. Definition proph_map (P V : Type) `{Countable P} := gmap P (option V). Definition proph_val_list (P V : Type) := list (P * V). -Section first_resolve. - Context {P V : Type} `{Countable P}. - Implicit Type pvs : proph_val_list P V. - Implicit Type p : P. - Implicit Type v : V. - Implicit Type R : proph_map P V. - - (** The first resolve for [p] in [pvs] *) - Definition first_resolve pvs p := - (map_of_list pvs : gmap P V) !! p. - - Definition first_resolve_in_list R pvs := - ∀ p v, p ∈ dom (gset _) R → - first_resolve pvs p = Some v → - R !! p = Some (Some v). - - Lemma first_resolve_insert pvs p R : - first_resolve_in_list R pvs → - p ∉ dom (gset _) R → - first_resolve_in_list (<[p := first_resolve pvs p]> R) pvs. - Proof. - intros Hf Hnotin p' v' Hp'. rewrite (dom_insert_L R p) in Hp'. - erewrite elem_of_union in Hp'. destruct Hp' as [->%elem_of_singleton | Hin] => [->]. - - by rewrite lookup_insert. - - rewrite lookup_insert_ne; first auto. by intros ->. - Qed. - - Lemma first_resolve_delete pvs p v R : - first_resolve_in_list R ((p, v) :: pvs) → - first_resolve_in_list (delete p R) pvs. - Proof. - intros Hfr p' v' Hpin Heq. rewrite dom_delete_L in Hpin. rewrite /first_resolve in Heq. - apply elem_of_difference in Hpin as [Hpin Hne%not_elem_of_singleton]. - erewrite <- lookup_insert_ne in Heq; last done. rewrite lookup_delete_ne; eauto. - Qed. - - Lemma first_resolve_eq R p v w pvs : - first_resolve_in_list R ((p, v) :: pvs) → - R !! p = Some w → - w = Some v. - Proof. - intros Hfr Hlookup. specialize (Hfr p v (elem_of_dom_2 _ _ _ Hlookup)). - rewrite /first_resolve lookup_insert in Hfr. rewrite Hfr in Hlookup; last done. - inversion Hlookup. done. - Qed. - -End first_resolve. - Definition proph_mapUR (P V : Type) `{Countable P} : ucmraT := gmapUR P $ exclR $ optionC $ leibnizC V. @@ -81,6 +33,15 @@ Proof. solve_inG. Qed. Section definitions. Context `{pG : proph_mapG P V Σ}. + (** The first resolve for [p] in [pvs] *) + Definition first_resolve (pvs : proph_val_list P V) (p : P) := + (map_of_list pvs : gmap P V) !! p. + + Definition first_resolve_in_list (R : proph_map P V) pvs := + ∀ p v, p ∈ dom (gset _) R → + first_resolve pvs p = Some v → + R !! p = Some (Some v). + Definition proph_map_auth (R : proph_map P V) : iProp Σ := own (proph_map_name pG) (◠(to_proph_map R)). @@ -98,6 +59,45 @@ Section definitions. End definitions. +Section first_resolve. + Context {P V : Type} `{Countable P}. + Implicit Type pvs : proph_val_list P V. + Implicit Type p : P. + Implicit Type v : V. + Implicit Type R : proph_map P V. + + Lemma first_resolve_insert pvs p R : + first_resolve_in_list R pvs → + p ∉ dom (gset _) R → + first_resolve_in_list (<[p := first_resolve pvs p]> R) pvs. + Proof. + intros Hf Hnotin p' v' Hp'. rewrite (dom_insert_L R p) in Hp'. + erewrite elem_of_union in Hp'. destruct Hp' as [->%elem_of_singleton | Hin] => [->]. + - by rewrite lookup_insert. + - rewrite lookup_insert_ne; first auto. by intros ->. + Qed. + + Lemma first_resolve_delete pvs p v R : + first_resolve_in_list R ((p, v) :: pvs) → + first_resolve_in_list (delete p R) pvs. + Proof. + intros Hfr p' v' Hpin Heq. rewrite dom_delete_L in Hpin. rewrite /first_resolve in Heq. + apply elem_of_difference in Hpin as [Hpin Hne%not_elem_of_singleton]. + erewrite <- lookup_insert_ne in Heq; last done. rewrite lookup_delete_ne; eauto. + Qed. + + Lemma first_resolve_eq R p v w pvs : + first_resolve_in_list R ((p, v) :: pvs) → + R !! p = Some w → + w = Some v. + Proof. + intros Hfr Hlookup. specialize (Hfr p v (elem_of_dom_2 _ _ _ Hlookup)). + rewrite /first_resolve lookup_insert in Hfr. rewrite Hfr in Hlookup; last done. + inversion Hlookup. done. + Qed. + +End first_resolve. + Section to_proph_map. Context (P V : Type) `{Countable P}. Implicit Types p : P.