diff --git a/iris_heap_lang/lib/lock.v b/iris_heap_lang/lib/lock.v index 10e87b49d4250ca73206a0f05bd7b621b4094ada..ed80e9ca4ed7abbfbd9ae8a13161e356fc751d2b 100644 --- a/iris_heap_lang/lib/lock.v +++ b/iris_heap_lang/lib/lock.v @@ -1,5 +1,5 @@ From iris.base_logic.lib Require Export invariants. -From iris.heap_lang Require Import primitive_laws notation. +From iris.heap_lang Require Import proofmode notation. From iris.prelude Require Import options. (** A general interface for a lock. @@ -28,7 +28,6 @@ Class lock `{!heapGS_gen hlc Σ} := Lock { is_lock (γ: lock_name) (lock: val) (R: iProp Σ) : iProp Σ; locked (γ: lock_name) : iProp Σ; (** * General properties of the predicates *) - is_lock_ne γ lk :> Contractive (is_lock γ lk); is_lock_persistent γ lk R :> Persistent (is_lock γ lk R); is_lock_iff γ lk R1 R2 : is_lock γ lk R1 -∗ ▷ □ (R1 ↔ R2) -∗ is_lock γ lk R2; @@ -44,5 +43,14 @@ Class lock `{!heapGS_gen hlc Σ} := Lock { }. Global Hint Mode lock + + + : typeclass_instances. -Global Instance is_lock_proper hlc Σ `{!heapGS_gen hlc Σ} (L : lock) γ lk : - Proper ((≡) ==> (≡)) (L.(is_lock) γ lk) := ne_proper _. +Global Instance is_lock_contractive `{!heapGS_gen hlc Σ, !lock} γ lk : + Contractive (is_lock γ lk). +Proof. + apply (uPred.contractive_internal_eq (M:=iResUR Σ)). + iIntros (P Q) "#HPQ". iApply prop_ext. iIntros "!>". + iSplit; iIntros "H"; iApply (is_lock_iff with "H"); + iNext; iRewrite "HPQ"; auto. +Qed. + +Global Instance is_lock_proper `{!heapGS_gen hlc Σ, !lock} γ lk : + Proper ((≡) ==> (≡)) (is_lock γ lk) := ne_proper _. diff --git a/iris_heap_lang/lib/spin_lock.v b/iris_heap_lang/lib/spin_lock.v index 07cd3721b5ce486e2848204a6670ae2e0c91af94..30753ba199745709696bb6a35c05d29ea38bc8af 100644 --- a/iris_heap_lang/lib/spin_lock.v +++ b/iris_heap_lang/lib/spin_lock.v @@ -92,8 +92,7 @@ Section proof. Qed. End proof. -Program Definition spin_lock `{!heapGS_gen hlc Σ, !lockG Σ} : lock := +Definition spin_lock `{!heapGS_gen hlc Σ, !lockG Σ} : lock := {| lock.locked_exclusive := locked_exclusive; lock.is_lock_iff := is_lock_iff; lock.newlock_spec := newlock_spec; lock.acquire_spec := acquire_spec; lock.release_spec := release_spec |}. -Next Obligation. intros. rewrite /is_lock /lock_inv. solve_contractive. Qed. diff --git a/iris_heap_lang/lib/ticket_lock.v b/iris_heap_lang/lib/ticket_lock.v index 5095a766ba83e378254ec7b245db943fa4953eb9..6095603642904fdc76224c0e4bb87763af50fa0e 100644 --- a/iris_heap_lang/lib/ticket_lock.v +++ b/iris_heap_lang/lib/ticket_lock.v @@ -163,8 +163,7 @@ Section proof. Qed. End proof. -Program Definition ticket_lock `{!heapGS_gen hlc Σ, !tlockG Σ} : lock := +Definition ticket_lock `{!heapGS_gen hlc Σ, !tlockG Σ} : lock := {| lock.locked_exclusive := locked_exclusive; lock.is_lock_iff := is_lock_iff; lock.newlock_spec := newlock_spec; lock.acquire_spec := acquire_spec; lock.release_spec := release_spec |}. -Next Obligation. intros. rewrite /is_lock /lock_inv. solve_contractive. Qed.