|
1 | | -datatype Node<K,T> { Node(next: Option K, val: T) } |
| 1 | +datatype Node<T> { Node(next: Option (Loc (Node T)), val: T) } |
| 2 | +type LocNode T = Loc (Node T); |
2 | 3 |
|
3 | | -function Between<K,T>(f: [K]Node K T, x: Option K, y: Option K, z: Option K): bool; |
4 | | -function Avoiding<K,T>(f: [K]Node K T, x: Option K, y: Option K, z: Option K): bool; |
5 | | -function {:inline} BetweenSet<K,T>(f:[K]Node K T, x: Option K, z: Option K): [K]bool |
| 4 | +function Between<T>(f: [Loc (Node T)]Node T, x: Option (Loc (Node T)), y: Option (Loc (Node T)), z: Option (Loc (Node T))): bool; |
| 5 | +function Avoiding<T>(f: [Loc (Node T)]Node T, x: Option (Loc (Node T)), y: Option (Loc (Node T)), z: Option (Loc (Node T))): bool; |
| 6 | +function {:inline} BetweenSet<T>(f:[Loc (Node T)]Node T, x: Option (Loc (Node T)), z: Option (Loc (Node T))): [Loc (Node T)]bool |
6 | 7 | { |
7 | | - (lambda y: K :: Between(f, x, Some(y), z)) |
| 8 | + (lambda y: Loc (Node T) :: Between(f, x, Some(y), z)) |
8 | 9 | } |
9 | 10 |
|
10 | 11 | // reflexive |
11 | | -axiom {:ctor "Node"} (forall<K,T> f: [K]Node K T, x: Option K :: Between(f, x, x, x)); |
| 12 | +axiom {:ctor "Node"} (forall<T> f: [Loc (Node T)]Node T, x: Option (Loc (Node T)) :: Between(f, x, x, x)); |
12 | 13 |
|
13 | 14 | // step |
14 | | -axiom {:ctor "Node"} (forall<K,T> f: [K]Node K T, x: K :: |
| 15 | +axiom {:ctor "Node"} (forall<T> f: [Loc (Node T)]Node T, x: Loc (Node T) :: |
15 | 16 | {f[x]} |
16 | 17 | Between(f, Some(x), f[x]->next, f[x]->next)); |
17 | 18 |
|
18 | 19 | // reach |
19 | | -axiom {:ctor "Node"} (forall<K,T> f: [K]Node K T, x: K, y: Option K :: |
| 20 | +axiom {:ctor "Node"} (forall<T> f: [Loc (Node T)]Node T, x: Loc (Node T), y: Option (Loc (Node T)) :: |
20 | 21 | {f[x], Between(f, Some(x), y, y)} |
21 | 22 | Between(f, Some(x), y, y) ==> Some(x) == y || Between(f, Some(x), f[x]->next, y)); |
22 | 23 |
|
23 | 24 | // cycle |
24 | | -axiom {:ctor "Node"} (forall<K,T> f: [K]Node K T, x: K, y: Option K :: |
| 25 | +axiom {:ctor "Node"} (forall<T> f: [Loc (Node T)]Node T, x: Loc (Node T), y: Option (Loc (Node T)) :: |
25 | 26 | {f[x], Between(f, Some(x), y, y)} |
26 | 27 | f[x]->next == Some(x) && Between(f, Some(x), y, y) ==> Some(x) == y); |
27 | 28 |
|
28 | 29 | // sandwich |
29 | | -axiom {:ctor "Node"} (forall<K,T> f: [K]Node K T, x: Option K, y: Option K :: |
| 30 | +axiom {:ctor "Node"} (forall<T> f: [Loc (Node T)]Node T, x: Option (Loc (Node T)), y: Option (Loc (Node T)) :: |
30 | 31 | {Between(f, x, y, x)} |
31 | 32 | Between(f, x, y, x) ==> x == y); |
32 | 33 |
|
33 | 34 | // order1 |
34 | | -axiom {:ctor "Node"} (forall<K,T> f: [K]Node K T, x: Option K, y: Option K, z: Option K :: |
| 35 | +axiom {:ctor "Node"} (forall<T> f: [Loc (Node T)]Node T, x: Option (Loc (Node T)), y: Option (Loc (Node T)), z: Option (Loc (Node T)) :: |
35 | 36 | {Between(f, x, y, y), Between(f, x, z, z)} |
36 | 37 | Between(f, x, y, y) && Between(f, x, z, z) ==> Between(f, x, y, z) || Between(f, x, z, y)); |
37 | 38 |
|
38 | 39 | // order2 |
39 | | -axiom {:ctor "Node"} (forall<K,T> f: [K]Node K T, x: Option K, y: Option K, z: Option K :: |
| 40 | +axiom {:ctor "Node"} (forall<T> f: [Loc (Node T)]Node T, x: Option (Loc (Node T)), y: Option (Loc (Node T)), z: Option (Loc (Node T)) :: |
40 | 41 | {Between(f, x, y, z)} |
41 | 42 | Between(f, x, y, z) ==> Between(f, x, y, y) && Between(f, y, z, z)); |
42 | 43 |
|
43 | 44 | // transitive1 |
44 | | -axiom {:ctor "Node"} (forall<K,T> f: [K]Node K T, x: Option K, y: Option K, z: Option K :: |
| 45 | +axiom {:ctor "Node"} (forall<T> f: [Loc (Node T)]Node T, x: Option (Loc (Node T)), y: Option (Loc (Node T)), z: Option (Loc (Node T)) :: |
45 | 46 | {Between(f, x, y, y), Between(f, y, z, z)} |
46 | 47 | Between(f, x, y, y) && Between(f, y, z, z) ==> Between(f, x, z, z)); |
47 | 48 |
|
48 | 49 | // transitive2 |
49 | | -axiom {:ctor "Node"} (forall<K,T> f: [K]Node K T, x: Option K, y: Option K, z: Option K, w: Option K :: |
| 50 | +axiom {:ctor "Node"} (forall<T> f: [Loc (Node T)]Node T, x: Option (Loc (Node T)), y: Option (Loc (Node T)), z: Option (Loc (Node T)), w: Option (Loc (Node T)) :: |
50 | 51 | {Between(f, x, y, z), Between(f, y, w, z)} |
51 | 52 | Between(f, x, y, z) && Between(f, y, w, z) ==> Between(f, x, y, w) && Between(f, x, w, z)); |
52 | 53 |
|
53 | 54 | // transitive3 |
54 | | -axiom {:ctor "Node"} (forall<K,T> f: [K]Node K T, x: Option K, y: Option K, z: Option K, w: Option K :: |
| 55 | +axiom {:ctor "Node"} (forall<T> f: [Loc (Node T)]Node T, x: Option (Loc (Node T)), y: Option (Loc (Node T)), z: Option (Loc (Node T)), w: Option (Loc (Node T)) :: |
55 | 56 | {Between(f, x, y, z), Between(f, x, w, y)} |
56 | 57 | Between(f, x, y, z) && Between(f, x, w, y) ==> Between(f, x, w, z) && Between(f, w, y, z)); |
57 | 58 |
|
58 | 59 | // This axiom is required to deal with the incompleteness of the trigger for the reflexive axiom. |
59 | 60 | // It cannot be proved using the rest of the axioms. |
60 | | -axiom {:ctor "Node"} (forall<K,T> f: [K]Node K T, u: Option K, x: Option K :: |
| 61 | +axiom {:ctor "Node"} (forall<T> f: [Loc (Node T)]Node T, u: Option (Loc (Node T)), x: Option (Loc (Node T)) :: |
61 | 62 | {Between(f, u, x, x)} |
62 | 63 | Between(f, u, x, x) ==> Between(f, u, u, x)); |
63 | 64 |
|
64 | 65 | // relation between Avoiding and Between |
65 | | -axiom {:ctor "Node"} (forall<K,T> f: [K]Node K T, x: Option K, y: Option K, z: Option K :: |
| 66 | +axiom {:ctor "Node"} (forall<T> f: [Loc (Node T)]Node T, x: Option (Loc (Node T)), y: Option (Loc (Node T)), z: Option (Loc (Node T)) :: |
66 | 67 | {Avoiding(f, x, y, z)} |
67 | 68 | Avoiding(f, x, y, z) <==> Between(f, x, y, z) || (Between(f, x, y, y) && !Between(f, x, z, z))); |
68 | | -axiom {:ctor "Node"} (forall<K,T> f: [K]Node K T, x: Option K, y: Option K, z: Option K :: |
| 69 | +axiom {:ctor "Node"} (forall<T> f: [Loc (Node T)]Node T, x: Option (Loc (Node T)), y: Option (Loc (Node T)), z: Option (Loc (Node T)) :: |
69 | 70 | {Between(f, x, y, z)} |
70 | 71 | Between(f, x, y, z) <==> Avoiding(f, x, y, z) && Avoiding(f, x, z, z)); |
71 | 72 |
|
72 | 73 | // update |
73 | | -axiom {:ctor "Node"} (forall<K,T> f: [K]Node K T, u: Option K, v: Option K, x: Option K, p: K, q: Node K T :: |
| 74 | +axiom {:ctor "Node"} (forall<T> f: [Loc (Node T)]Node T, u: Option (Loc (Node T)), v: Option (Loc (Node T)), x: Option (Loc (Node T)), p: Loc (Node T), q: Node T :: |
74 | 75 | {Avoiding(f[p := q], u, v, x)} |
75 | 76 | Avoiding(f[p := q], u, v, x) <==> |
76 | 77 | (Avoiding(f, u, v, Some(p)) && Avoiding(f, u, v, x)) || |
|
0 commit comments