2 (** {1 Polymorphic mutable queues}
4 The module `Queue` below is mapped to OCaml's standard library
5 module `Queue` by Why3's extraction.
7 Independently, a Why3 implementation of this module is also
8 provided in `examples/queue_two_lists.mlw`.
17 type t 'a = abstract {
18 mutable seq: Seq.seq 'a;
21 meta coercion function seq
24 ensures { result = empty }
26 val push (x: 'a) (q: t 'a) : unit
28 ensures { q = snoc (old q) x }
32 val pop (q: t 'a) : 'a
34 ensures { old q <> empty }
35 ensures { result = (old q)[0] }
36 ensures { q = (old q)[1 ..] }
37 raises { Empty -> q = old q = empty }
39 val peek (q: t 'a) : 'a
40 ensures { q <> empty }
41 ensures { result = q[0] }
42 raises { Empty -> q = empty }
44 val safe_pop (q: t 'a) : 'a
45 requires { q <> empty }
47 ensures { result = (old q)[0] }
48 ensures { q = (old q)[1 ..] }
50 val safe_peek (q: t 'a) : 'a
51 requires { q <> empty }
52 ensures { result = q[0] }
54 val clear (q: t 'a) : unit
58 val copy (q: t 'a) : t 'a
59 ensures { result == q }
61 val is_empty (q: t 'a) : bool
62 ensures { result <-> (q = empty) }
64 val length (q: t 'a) : Peano.t
65 ensures { result = length q }
67 val transfer (q1 q2: t 'a) : unit
69 ensures { q1 = empty }
70 ensures { q2 = (old q2) ++ (old q1) }