11/*@
2- predicate (datatype DlList) DlList_at (pointer p) {
3- if (is_null(p)) {
4- return Empty_DlList{};
5- } else {
6- take n = RW<struct dllist>(p);
7- take L = Take_Left(n.prev, p, n);
8- take R = Take_Right(n.next, p, n);
9- return Nonempty_DlList{left: L, curr: n, right: R};
10- }
11- }
12-
13- predicate (datatype List) Take_Right (pointer p,
2+ predicate [rec] (datatype List) Take_Right (pointer p,
143 pointer prev_pointer,
154 struct dllist prev_dllist) {
165 if (is_null(p)) {
@@ -24,7 +13,7 @@ predicate (datatype List) Take_Right (pointer p,
2413 }
2514}
2615
27- predicate (datatype List) Take_Left (pointer p,
16+ predicate [rec] (datatype List) Take_Left (pointer p,
2817 pointer next_pointer,
2918 struct dllist next_dllist) {
3019 if (is_null(p)) {
@@ -37,4 +26,17 @@ predicate (datatype List) Take_Left (pointer p,
3726 return Cons{Head: P.data, Tail: T};
3827 }
3928}
29+
30+
31+ predicate (datatype DlList) DlList_at (pointer p) {
32+ if (is_null(p)) {
33+ return Empty_DlList{};
34+ } else {
35+ take n = RW<struct dllist>(p);
36+ take L = Take_Left(n.prev, p, n);
37+ take R = Take_Right(n.next, p, n);
38+ return Nonempty_DlList{left: L, curr: n, right: R};
39+ }
40+ }
41+
4042@*/
0 commit comments