Guest User

Untitled

a guest
Jun 19th, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.32 KB | None | 0 0
  1. open util/ordering[Index]
  2. open util/ordering[Value]
  3.  
  4. sig Index {}
  5. sig Value {}
  6. sig Array { data: Index -> Value }
  7.  
  8. pred inv[a:Array] {
  9. all i:Index | i not in a.data.Value =>
  10. ( i->(a.data.Value) in ^next or (a.data.Value)->i in ^next )
  11.  
  12. ~(a.data).(a.data) in iden
  13. }
  14.  
  15. pred sorted[a:Array] { all i,i':a.data.Value | i->i' in ^next => a.data[i]->a.data[i'] in *next}
  16.  
  17. // split <a> into two non-empty arrays <h>, <t>
  18. pred split[a,h,t:Array] {
  19. some h.data and some t.data
  20. h.data in a.data and t.data in a.data
  21. (h+t).data = a.data
  22. no Index.(h.data) & Index.(t.data)
  23. h.data.Value -> t.data.Value in ^next
  24. }
  25.  
  26. pred merge[h,t,a] {
  27. /* some h',t',a':Array |
  28.  
  29. merge[h',t',a']*/
  30. }
  31.  
  32. pred mergesort[a, a': Array] {
  33. a.data.Value = a'.data.Value
  34. Index.(a.data) = Index.(a'.data)
  35. some h,t:Array | split[a,h,t]
  36. sorted[a']
  37. }
  38.  
  39. assert mergesort_safe { all a,a':Array | (inv[a] && mergesort[a,a']) => (inv[a'] && sorted[a']) }
  40. assert split_safe { all h,t,a:Array | inv[a] && split[a,h,t] => inv[h] && inv[t] }
  41.  
  42. pred mergesort_consistent[a,a':Array] { inv[a] && mergesort[a,a'] }
  43. pred split_consistent[h,t,a:Array] { inv[a] && split[a,h,t] }
  44.  
  45. run split_consistent for 5
  46. check split_safe for 5
  47.  
  48. run mergesort_consistent for 5 but exactly 2 Array, exactly 3 Index, exactly 2 Value
  49. check mergesort_safe for 5
Add Comment
Please, Sign In to add comment