-
Notifications
You must be signed in to change notification settings - Fork 0
/
spec_ordered_set.v
86 lines (73 loc) · 2.9 KB
/
spec_ordered_set.v
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
From iris.algebra Require Import gset.
From iris.base_logic.lib Require Import invariants.
From smr.program_logic Require Import atomic.
From smr.lang Require Import proofmode notation.
From iris.prelude Require Import options.
Definition OrderedSetT Σ : Type :=
∀ (γo : gname) (xs : gset Z), iProp Σ.
Definition IsOrderedSetT Σ (N : namespace) : Type :=
∀ (γo : gname) (oset : loc), iProp Σ.
Section spec.
Context {Σ} `{!heapGS Σ} (ordsetN : namespace).
Variables
(ordset_new : val)
(ordset_lookup : val)
(ordset_insert : val)
(ordset_delete : val).
Variables
(OrderedSet : OrderedSetT Σ)
(IsOrderedSet : IsOrderedSetT Σ ordsetN).
Definition ordset_new_spec' : Prop :=
⊢ {{{ True }}}
ordset_new #()
{{{ γo oset, RET #oset; IsOrderedSet γo oset ∗ OrderedSet γo ∅ }}}.
Definition ordset_lookup_spec' : Prop :=
⊢ ∀ γo oset (x : Z),
IsOrderedSet γo oset-∗
<<< ∀∀ xs, OrderedSet γo xs >>>
ordset_lookup #oset #x @ ⊤,↑ordsetN,∅
<<< ∃∃ (b : bool), OrderedSet γo xs ∗ ⌜b = bool_decide (x ∈ xs)⌝, RET #b >>>.
Definition ordset_insert_spec' : Prop :=
⊢ ∀ γo oset (x : Z),
IsOrderedSet γo oset -∗
<<< ∀∀ xs, OrderedSet γo xs >>>
ordset_insert #oset #x @ ⊤,↑ordsetN,∅
<<< ∃∃ (b : bool) xs', OrderedSet γo xs' ∗
⌜if (b : bool) then
x ∉ xs ∧ xs' = {[ x ]} ∪ xs
else
x ∈ xs ∧ xs' = xs⌝,
RET #b >>>.
Definition ordset_delete_spec' : Prop :=
⊢ ∀ γo oset (x : Z),
IsOrderedSet γo oset -∗
<<< ∀∀ xs, OrderedSet γo xs >>>
ordset_delete #oset #x @ ⊤,↑ordsetN,∅
<<< ∃∃ (b : bool) xs', OrderedSet γo xs' ∗
⌜if (b : bool) then
x ∈ xs ∧ xs' = xs ∖ {[ x ]}
else
x ∉ xs ∧ xs' = xs⌝,
RET #b >>>.
End spec.
Record ordset_code : Type := OrderedSetCode {
ordset_new : val;
ordset_lookup : val;
ordset_insert : val;
ordset_delete : val;
}.
Record ordset_spec {Σ} `{!heapGS Σ} {ordsetN : namespace}
: Type := OrderedSetSpec {
ordset_spec_code :> ordset_code;
OrderedSet : OrderedSetT Σ;
IsOrderedSet : IsOrderedSetT Σ ordsetN;
OrderedSet_Timeless : ∀ γo xs, Timeless (OrderedSet γo xs);
IsOrderedSet_Persistent : ∀ γo oset, Persistent (IsOrderedSet γo oset);
ordset_new_spec : ordset_new_spec' ordsetN ordset_spec_code.(ordset_new) OrderedSet IsOrderedSet;
ordset_lookup_spec : ordset_lookup_spec' ordsetN ordset_spec_code.(ordset_lookup) OrderedSet IsOrderedSet;
ordset_insert_spec : ordset_insert_spec' ordsetN ordset_spec_code.(ordset_insert) OrderedSet IsOrderedSet;
ordset_delete_spec : ordset_delete_spec' ordsetN ordset_spec_code.(ordset_delete) OrderedSet IsOrderedSet;
}.
Global Arguments ordset_spec : clear implicits.
Global Arguments ordset_spec _ {_} _ : assert.
Global Existing Instances OrderedSet_Timeless IsOrderedSet_Persistent.