summaryrefslogtreecommitdiffstats
path: root/theories/basic_queue_spec.v
blob: d7a38e14e8ed3940bec18b1963558ec1e6f780f9 (about) (plain) (blame)
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
From iris.program_logic Require Import atomic.
From iris.heap_lang Require Import notation proofmode.

From lmpmc Require Import util.

Record basic_queue {Σ} `{!heapGS Σ} :=
  BasicQueue
    { new : val;
      enqueue : val;
      try_dequeue : val;

      queue_repr : loc → list val → iProp Σ;
      #[global] queue_repr_timeless ℓ vs :: Timeless (queue_repr ℓ vs);

      new_spec :
        {{{ True }}}
          new #()
        {{{ (ℓ_q : loc), RET #ℓ_q; queue_repr ℓ_q [] }}};

      enqueue_spec (ℓ_q : loc) (data : val) :<<{ ∀∀ vs, queue_repr ℓ_q vs }>>
            enqueue #ℓ_q data @<<{ queue_repr ℓ_q (vs ++ [data]) | RET #() }>>;

      try_dequeue_spec (ℓ_q : loc) :<<{ ∀∀ vs, queue_repr ℓ_q vs }>>
            try_dequeue #ℓ_q @<<{ queue_repr ℓ_q (tail vs) | RET (val_opt_hl (head vs)) }>>;
    }.
#[global] Arguments basic_queue _ {_} : assert.