clutch.coneris.examples.hash.coll_free_hash_view_interface
An interface of a collision-free hash view
(* A hash function is collision free if the partial map it
implements is an injective function *)
Definition coll_free (m : gmap nat nat) :=
forall k1 k2,
is_Some (m !! k1) ->
is_Some (m !! k2) ->
m !!! k1 = m !!! k2 ->
k1 = k2.
Class hash_view `{!conerisGS Σ} := Hash_View
{
hvG : gFunctors -> Type;
hv_name : Type;
hv_auth {L:hvG Σ} : gmap nat nat -> hv_name -> iProp Σ;
hv_frag {L:hvG Σ} : nat -> nat -> hv_name -> iProp Σ;
hv_auth_timeless {L:hvG Σ} m γ::
Timeless (hv_auth (L:=L) m γ);
hv_frag_timeless {L:hvG Σ} k v γ::
Timeless (hv_frag (L:=L) k v γ);
hv_frag_persistent {L:hvG Σ} k v γ::
Persistent (hv_frag (L:=L) k v γ);
hv_auth_exclusive {L:hvG Σ} m m' γ:
hv_auth (L:=L) m γ -∗ hv_auth (L:=L) m' γ -∗ False;
hv_auth_init {L:hvG Σ}:
(⊢|==> (∃ γ, hv_auth (L:=L) ∅ γ))%I;
hv_auth_coll_free {L:hvG Σ} m γ: hv_auth (L:=L) m γ -∗ ⌜coll_free m⌝;
hv_auth_duplicate_frag {L:hvG Σ} m n b γ:
m!!n=Some b -> hv_auth (L:=L) m γ -∗ hv_auth (L:=L) m γ ∗ hv_frag (L:=L) n b γ;
hv_auth_frag_agree {L:hvG Σ} m γ k v:
hv_auth (L:=L) m γ ∗ hv_frag (L:=L) k v γ -∗
⌜m!!k=Some v⌝;
hv_frag_frag_agree {L:hvG Σ} k1 k2 v1 v2 γ:
hv_frag (L:=L) k1 v1 γ -∗ hv_frag (L:=L) k2 v2 γ -∗
⌜k1 = k2 <-> v1 = v2 ⌝;
hv_auth_insert {L:hvG Σ} m n x γ:
m!!n=None ->
Forall (λ m : nat, x ≠ m) (map (λ p : nat * nat, p.2) (map_to_list m)) ->
hv_auth (L:=L) m γ ==∗
hv_auth (L:=L) (<[n:=x]> m) γ ∗ hv_frag (L:=L) n x γ
}.