Advertisement
Guest User

assignment 1 dafny

a guest
Dec 16th, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 1.39 KB | None | 0 0
  1. predicate Sorted(q: seq<int>)
  2. {
  3.     forall i,j :: 0 <= i <= j < |q| ==> q[i] <= q[j]
  4. }
  5.  
  6. method {:verify false} BinarySearch(q: seq<int>, key: int) returns (j: nat)
  7.     requires Sorted(q) && key in q
  8.     ensures j < |q| && q[j] == key
  9. {
  10.     var i: nat, k: nat;
  11.     i,j,k := Init(q,key);
  12.     while Guard1(q,key,j)
  13.         invariant Inv(q,key,i,j,k)
  14.         decreases V(i,k)
  15.     {
  16.         if Guard2(q,key,j)
  17.         {
  18.             i := UpdateI(q,key,i,j,k);
  19.         }
  20.         else
  21.         {
  22.             k := UpdateK(q,key,i,j,k);
  23.         }
  24.         j := (i+k)/2;
  25.     }
  26. }
  27.  
  28. predicate Inv(q: seq<int>, key: int, i: nat, j: nat, k: nat)
  29. {
  30.   0 <= i <= j <= k <= |q| && k-i > 0
  31. }
  32.  
  33. predicate method Guard1(q: seq<int>, key: int, j: nat)
  34.   requires 0 <= j < |q|
  35. {
  36.   q[j] != key && 0 <= j <= |q|
  37. }
  38.  
  39. method Init(q: seq<int>, key: int) returns (i: nat, j: nat, k: nat)
  40.   requires |q| > 0
  41. {
  42.   i := 0;
  43.   k := |q| - 1;
  44.   j := (i+k) / 2;
  45. }
  46.  
  47. function V(i: nat, k: nat): int
  48. {
  49.   k - i
  50. }
  51.  
  52. predicate method Guard2(q: seq<int>, key: int, j: nat)
  53.   requires 0 <= j < |q|
  54. {
  55.   q[j] < key
  56. }
  57.  
  58. method UpdateI(q: seq<int>, key: int, i0: nat, j: nat, k: nat) returns (i: nat)
  59. {
  60.   i := j;
  61. }
  62.  
  63. method UpdateK(q: seq<int>, key: int, i: nat, j: nat, k0: nat) returns (k: nat)
  64. {
  65.   k := j;
  66. }
  67.  
  68. method Main()
  69. {
  70.     var q := [1,2,4,5,6,7,10,23];
  71.     assert Sorted(q);
  72.     assert 10 in q;
  73.     var i := BinarySearch(q, 10);
  74.     print "[1,2,4,5,6,7,10,23][";
  75.     print i;
  76.     print "] == 10";
  77.     assert i == 6;
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement