Advertisement
Guest User

Untitled

a guest
May 2nd, 2016
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.54 KB | None | 0 0
  1. predicate sorted(a: array<int>)
  2. requires a != null;
  3. reads a;
  4. {
  5. forall j,k :: 0 <= j < k < a.Length ==> a[j] <= a[k]
  6. }
  7.  
  8. predicate sortedPart(a: array<int>, n : int)
  9. requires a != null;
  10. requires n <= a.Length;
  11. reads a;
  12. {
  13. forall j,k :: 0 <= j < k < n ==> a[j] <= a[k]
  14. }
  15.  
  16. lemma transitivelyOrdered(a: array<int>, n : int, i : int, j : int)
  17. requires a != null;
  18. requires n <= a.Length;
  19. requires forall i :: 0 <= i < n-1 ==> a[i] <= a[i+1];
  20. requires 0 <= i < j < n;
  21. decreases j - i;
  22. ensures a[i] <= a[j];
  23. {
  24. if (j == i + 1) { }
  25. else { transitivelyOrdered(a, n, i+1, j); }
  26. }
  27.  
  28. predicate pairwiseOrdered(a : array<int>, n : int)
  29. requires a != null;
  30. requires n <= a.Length;
  31. reads a;
  32. {
  33. forall i :: 0 <= i < n-1 ==> a[i] <= a[i+1]
  34. }
  35.  
  36. lemma pairwiseOrderedIsSorted(a : array<int>, n : int)
  37. requires a != null;
  38. requires n <= a.Length;
  39. requires pairwiseOrdered(a, n);
  40. ensures sortedPart(a, n);
  41. {
  42. forall(i, j | 0 <= i < j < n) { transitivelyOrdered(a, n, i, j); }
  43. }
  44.  
  45. method srt(a : array<int>)
  46. requires a != null;
  47. requires a.Length >= 1;
  48. modifies a;
  49. ensures sorted(a);
  50. {
  51. var i := 0;
  52. while (i < a.Length-1)
  53. invariant i >= 0 && i < a.Length;
  54. invariant 0 < i ==> pairwiseOrdered(a, i+1);
  55. invariant forall e :: 0 < i < e < a.Length ==> a[i-1] <= a[e];
  56. {
  57. var j := i + 1;
  58.  
  59. while (j < a.Length)
  60. invariant j <= a.Length;
  61. invariant forall e :: 0 <= i < e < j <= a.Length ==> a[i] <= a[e];
  62. invariant forall r :: 0 < i < r < a.Length ==> a[i-1] <= a[r];
  63. invariant pairwiseOrdered(a, i+1);
  64. {
  65. if (a[i] > a[j]) {
  66. a[i], a[j] := a[j], a[i];
  67. }
  68. j := j+1;
  69. }
  70. i := i+1;
  71. }
  72. pairwiseOrderedIsSorted(a, a.Length);
  73. }
  74.  
  75. method srt1(a : array<int>)
  76. requires a != null;
  77. modifies a;
  78. {
  79. var i := 0;
  80. while (i < a.Length-1)
  81. {
  82. var j := i + 1;
  83.  
  84. while (j < a.Length)
  85. {
  86. if (a[i] > a[j]) {
  87. a[i], a[j] := a[j], a[i];
  88. }
  89. j := j+1;
  90. }
  91. i := i+1;
  92. }
  93. }
  94.  
  95.  
  96. method show(a : array<int>)
  97. requires a != null;
  98. {
  99. var i := 0;
  100. while(i < a.Length) {
  101. print a[i], " ";
  102. i := i+1;
  103. }
  104. print "\n";
  105. }
  106.  
  107. method binarySearch(a: array<int>, key:int) returns (i : int)
  108. requires a != null && sorted(a);
  109. ensures 0 <= i ==> i < a.Length && a[i]==key;
  110. ensures i < 0 ==> forall k :: 0 <= k < a.Length ==> a[k] != key;
  111. {
  112. var low, high := 0, a.Length;
  113. while(low < high)
  114. invariant 0 <= low <= high <= a.Length;
  115. invariant forall j :: 0 <= j < a.Length && !(low <= j < high) ==> a[j] != key;
  116. {
  117. var mid := (high + low) / 2;
  118. if (a[mid] < key) {
  119. low := mid +1;
  120. } else if (key < a[mid]) {
  121. high := mid;
  122. } else {
  123. i := mid; return;
  124. }
  125. }
  126. i := -1;
  127. }
  128.  
  129. function method multisetOf<T>(a : array<T>, i : int) : multiset<T>
  130. requires a != null;
  131. requires 0 <= i <= a.Length;
  132. reads a;
  133. decreases a.Length - i;
  134. {
  135. if i == a.Length then multiset{}
  136. else
  137. multisetOf(a, i+1) + multiset{a[i]}
  138. }
  139.  
  140. function method elements<T>(a : array<T>) : multiset<T>
  141. requires a != null;
  142. reads a;
  143. {
  144. multisetOf(a,0)
  145. }
  146.  
  147. function method isPerm<T(==)>(a : array<T>, b : array<T>) : bool
  148. requires a != null && b != null;
  149. reads a, b;
  150. {
  151. elements(a) == elements(b)
  152. }
  153.  
  154. method test(a : array<int>)
  155. requires a != null && a.Length >= 2;
  156. modifies a;
  157. ensures isPerm(a, old(a));
  158. {
  159. a[0], a[1] := a[1], a[0];
  160. }
  161.  
  162. method Main()
  163. {
  164. var a := new int[5];
  165. a[0] := 4;
  166. a[1] := 3;
  167. a[2] := 6;
  168. a[3] := 1;
  169. a[4] := 2;
  170. srt(a);
  171. show(a);
  172. var ms := elements(a);
  173. print ms;
  174. print isPerm(a,a);
  175. test(a);
  176. show(a);
  177. //var i := binarySearch(a, 3);
  178. //print i;
  179. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement