pred treap (Loc arg0) = ite(arg0 = nil, true, (treap (l arg0)) & (treap (r arg0)) & ((singleton (priority arg0)) x.l.priority) { Loc y := x.l; x.l := y.r; y.r := x return y; } return x; } else { x.r := treap-insert(x.r, k, p); if (x.priority > x.r.priority) { Loc y := x.r; x.r := y.l; y.l := x; return y; } return x; } } Loc treap-delete(Loc x, Int k){ @ requires x =/= NIL & treap(x) & k in keys(x) @ ensures treap'(result) & keys'(result) U {k} = keys(x) & priorities'(result) \subset priorities(x) if (x.key > k) { x.l := treap-delete(x.l, k); return x; } else if (x.key < k) { x.r := treap-delete(x.r, k); return x; } else { return remove(x); } } Loc remove(Loc x) { @ requires x =/= NIL & treap(x.l) & treap(x.r) & keys(x.l) < keys(x.r) & disjoint(priorities(x.l), priorities(x.r)) @ ensures treap'(result) & keys'(result) = keys(x.l) U keys(x.r) & priorities'(result) = priorities(x.l) U priorities(x.r) if (x.l == NIL & x.r == NIL) { return NIL; } else if (x.l =/= NIL & x.r == NIL) { return x.l; } else if (x.l == NIL & x.r =/= NIL) { return x.r; } else if (x.l.priority <= x.r.priority) { Loc y := x.l; x.l := y.r; y.r := remove(x); return y; } else { Loc y := x.r; x.r := y.l; y.l := remove(x); return y; } }