7 type cursor 'a = private {
8 ghost mutable visited : seq 'a;
11 predicate permitted (cursor 'a)
12 axiom permitted_empty: forall c: cursor 'a. c.visited = empty -> permitted c
14 predicate complete (cursor 'a)
16 val next (c: cursor 'a) : 'a
17 requires { not (complete c) }
18 requires { permitted c }
20 ensures { c.visited = snoc (old c).visited result }
21 ensures { permitted c }
23 val has_next (c: cursor 'a) : bool
24 requires { permitted c }
25 ensures { result <-> not (complete c) }
36 type cursor 'a = private {
37 ghost mutable visited : seq 'a;
38 ghost collection : list 'a;
41 predicate permitted (c: cursor 'a) =
42 length c.visited <= length c.collection /\
43 forall i. 0 <= i < length c.visited -> c.visited[i] = c.collection[i]
45 predicate complete (c: cursor 'a) =
46 length c.visited = length c.collection
48 val create (l: list 'a) : cursor 'a
49 ensures { permitted result }
50 ensures { result.visited = empty }
51 ensures { result.collection = l }
53 clone Cursor as C with
55 predicate permitted = permitted,
56 predicate complete = complete,
69 type cursor 'a = private {
70 ghost mutable visited : seq 'a;
71 ghost collection : seq 'a;
74 predicate permitted (c: cursor 'a) =
75 length c.visited <= length c.collection /\
76 forall i. 0 <= i < length c.visited -> c.visited[i] = c.collection[i]
78 predicate complete (c: cursor 'a) =
79 length c.visited = length c.collection
81 val create (a: array 'a) : cursor 'a
82 ensures { permitted result }
83 ensures { result.visited = empty }
84 ensures { result.collection = to_seq a }
86 clone Cursor as C with
88 predicate permitted = permitted,
89 predicate complete = complete,