Advertisement
Guest User

Untitled

a guest
Oct 9th, 2015
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.25 KB | None | 0 0
  1. // class Node
  2. field left: Ref
  3. field right: Ref
  4. field is_marked: Bool
  5.  
  6. predicate inv(node: Ref, graph: Set[Ref]) {
  7. node != null
  8. && acc(node.left)
  9. && acc(node.right)
  10. && acc(node.is_marked)
  11. && (node.left != null ==> acc(inv(node.left, graph)))
  12. && (node.right != null ==> acc(inv(node.right, graph)))
  13. && node in graph
  14. && (forall a: Ref :: a in graph ==> acc(a.left))
  15. && (forall b: Ref :: b in graph ==> acc(b.right))
  16. && (forall c: Ref :: c in graph ==> acc(c.is_marked))
  17. && (forall x: Ref :: x in graph ==> (x.left != null ==> x.left in graph))
  18. && (forall y: Ref :: y in graph ==> (y.right != null ==> y.right in graph))
  19. }
  20.  
  21. method reach(graph: Set[Ref], node: Ref) returns (reached: Set[Ref])
  22. requires acc(inv(node, graph))
  23. ensures acc(inv(node, graph))
  24. //TODO: ensures acc(inv(node, reached))
  25. {
  26. unfold acc(inv(node, graph))
  27.  
  28. var left_reached: Set[Ref] := Set[Ref]()
  29. if (node.left != null && !node.left.is_marked) {
  30. node.left.is_marked := true
  31. left_reached := reach(graph, node.left)
  32. }
  33. var right_reached: Set[Ref] := Set[Ref]()
  34. if (node.right != null && !node.right.is_marked) {
  35. node.right.is_marked := true
  36. right_reached := reach(graph, node.right)
  37. }
  38. reached := (left_reached) union Set(node) union (right_reached)
  39.  
  40. fold acc(inv(node, graph))
  41. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement