Advertisement
Guest User

Untitled

a guest
Dec 10th, 2017
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.03 KB | None | 0 0
  1. import org.sireum.logika._
  2.  
  3. l"""{ fact
  4. def Fib(m: Z): Z
  5. FZero. Fib(0) = 0
  6. FOne. Fib(1) = 1
  7. FTwoOrMore. ∀ m: Z m > 1 → Fib(m) = Fib(m - 1) + Fib(m - 2) }"""
  8.  
  9. var cache: ZS = ZS(0, 1)
  10.  
  11. l"""{ invariant cache.size ≥ 0
  12. ∀ i:(0..<cache.size)
  13. cache(i) = Fib(i) ∨ cache(i) = -1
  14. }"""
  15.  
  16. def ensureCacheCapacity(m: Z): Unit = {
  17. l"""{ modifies cache
  18. ensures cache.size ≥ cache_in.size
  19. cache.size ≥ m
  20. }"""
  21.  
  22. if (cache.size < m) {
  23.  
  24. println("Expanding cache...")
  25.  
  26. val newCache: ZS = ZS.create(m * 3 / 2, -1)
  27. var k: Z = 0
  28.  
  29. println("Before loop: cache = ", cache, ", newCache = ", newCache, ", k = ", k)
  30.  
  31. while (k < cache.size) {
  32. l"""{ invariant k >= 0
  33. newCache.size >= cache.size
  34. newCache.size >= m
  35. A i:(0..<newCache.size)
  36. newCache(i) != -1 -> newCache(i) = Fib(i)
  37. modifies k, newCache }"""
  38.  
  39. println("Loop pre: cache = ", cache, ", newCache = ", newCache, ", k = ", k)
  40.  
  41. newCache(k) = cache(k)
  42. k = k + 1
  43.  
  44. println("Loop post: cache = ", cache, ", newCache = ", newCache, ", k = ", k)
  45. }
  46.  
  47. println("After loop: cache = ", cache, ", newCache = ", newCache, ", k = ", k)
  48.  
  49. cache = newCache.clone
  50.  
  51. println("Cache expanded!")
  52. }
  53. }
  54.  
  55. def fibonacci(n: Z): Z = {
  56. l"""{ requires n ≥ 0
  57. modifies cache
  58. ensures cache.size ≥ cache_in.size
  59. result = Fib(n)
  60. }"""
  61.  
  62. println("Entry: n = ", n, ", cache = ", cache)
  63.  
  64. var r: Z = n
  65.  
  66. if (n < 2) {
  67. return r
  68. }
  69.  
  70. ensureCacheCapacity(n + 1)
  71.  
  72. r = cache(n)
  73. if (r == -1) {
  74. val f1: Z = fibonacci(n - 1)
  75. val f2: Z = fibonacci(n - 2)
  76. r = f1 + f2
  77. cache(n) = r
  78. println("Cache updated! cache(", n, ") = ", r)
  79. } else {
  80. println("Cache hit! cache(", n, ") = ", r)
  81. }
  82.  
  83. println("Exit: n = ", n, ", cache = ", cache, ", r = ", r)
  84. return r
  85. }
  86.  
  87. // Verified Tests
  88.  
  89. val test1: Z = fibonacci(4)
  90. /* Trace log:
  91. Entry: n = 4, cache = [0, 1]
  92. Expanding cache...
  93. Before loop: cache = [0, 1], newCache = [-1, -1, -1, -1, -1, -1, -1], k = 0
  94. Loop pre: cache = [0, 1], newCache = [-1, -1, -1, -1, -1, -1, -1], k = 0
  95. Loop post: cache = [0, 1], newCache = [0, -1, -1, -1, -1, -1, -1], k = 1
  96. Loop pre: cache = [0, 1], newCache = [0, -1, -1, -1, -1, -1, -1], k = 1
  97. Loop post: cache = [0, 1], newCache = [0, 1, -1, -1, -1, -1, -1], k = 2
  98. After loop: cache = [0, 1], newCache = [0, 1, -1, -1, -1, -1, -1], k = 2
  99. Cache expanded!
  100. Entry: n = 3, cache = [0, 1, -1, -1, -1, -1, -1]
  101. Entry: n = 2, cache = [0, 1, -1, -1, -1, -1, -1]
  102. Entry: n = 1, cache = [0, 1, -1, -1, -1, -1, -1]
  103. Cache hit! cache(1) = 1
  104. Exit: n = 1, cache = [0, 1, -1, -1, -1, -1, -1], r = 1
  105. Entry: n = 0, cache = [0, 1, -1, -1, -1, -1, -1]
  106. Cache hit! cache(0) = 0
  107. Exit: n = 0, cache = [0, 1, -1, -1, -1, -1, -1], r = 0
  108. Cache updated! cache(2) = 1
  109. Exit: n = 2, cache = [0, 1, 1, -1, -1, -1, -1], r = 1
  110. Entry: n = 1, cache = [0, 1, 1, -1, -1, -1, -1]
  111. Cache hit! cache(1) = 1
  112. Exit: n = 1, cache = [0, 1, 1, -1, -1, -1, -1], r = 1
  113. Cache updated! cache(3) = 2
  114. Exit: n = 3, cache = [0, 1, 1, 2, -1, -1, -1], r = 2
  115. Entry: n = 2, cache = [0, 1, 1, 2, -1, -1, -1]
  116. Cache hit! cache(2) = 1
  117. Exit: n = 2, cache = [0, 1, 1, 2, -1, -1, -1], r = 1
  118. Cache updated! cache(4) = 3
  119. Exit: n = 4, cache = [0, 1, 1, 2, 3, -1, -1], r = 3
  120. */
  121. assert(test1 == 3)
  122.  
  123. val test2: Z = fibonacci(9)
  124. /* Trace log:
  125. Entry: n = 9, cache = [0, 1, 1, 2, 3, -1, -1]
  126. Expanding cache...
  127. Before loop: cache = [0, 1, 1, 2, 3, -1, -1], newCache = [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], k = 0
  128. Loop pre: cache = [0, 1, 1, 2, 3, -1, -1], newCache = [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], k = 0
  129. Loop post: cache = [0, 1, 1, 2, 3, -1, -1], newCache = [0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], k = 1
  130. Loop pre: cache = [0, 1, 1, 2, 3, -1, -1], newCache = [0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], k = 1
  131. Loop post: cache = [0, 1, 1, 2, 3, -1, -1], newCache = [0, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], k = 2
  132. Loop pre: cache = [0, 1, 1, 2, 3, -1, -1], newCache = [0, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], k = 2
  133. Loop post: cache = [0, 1, 1, 2, 3, -1, -1], newCache = [0, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], k = 3
  134. Loop pre: cache = [0, 1, 1, 2, 3, -1, -1], newCache = [0, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], k = 3
  135. Loop post: cache = [0, 1, 1, 2, 3, -1, -1], newCache = [0, 1, 1, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], k = 4
  136. Loop pre: cache = [0, 1, 1, 2, 3, -1, -1], newCache = [0, 1, 1, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], k = 4
  137. Loop post: cache = [0, 1, 1, 2, 3, -1, -1], newCache = [0, 1, 1, 2, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], k = 5
  138. Loop pre: cache = [0, 1, 1, 2, 3, -1, -1], newCache = [0, 1, 1, 2, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], k = 5
  139. Loop post: cache = [0, 1, 1, 2, 3, -1, -1], newCache = [0, 1, 1, 2, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], k = 6
  140. Loop pre: cache = [0, 1, 1, 2, 3, -1, -1], newCache = [0, 1, 1, 2, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], k = 6
  141. Loop post: cache = [0, 1, 1, 2, 3, -1, -1], newCache = [0, 1, 1, 2, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], k = 7
  142. After loop: cache = [0, 1, 1, 2, 3, -1, -1], newCache = [0, 1, 1, 2, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], k = 7
  143. Cache expanded!
  144. Entry: n = 8, cache = [0, 1, 1, 2, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]
  145. Entry: n = 7, cache = [0, 1, 1, 2, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]
  146. Entry: n = 6, cache = [0, 1, 1, 2, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]
  147. Entry: n = 5, cache = [0, 1, 1, 2, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]
  148. Entry: n = 4, cache = [0, 1, 1, 2, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]
  149. Cache hit! cache(4) = 3
  150. Exit: n = 4, cache = [0, 1, 1, 2, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], r = 3
  151. Entry: n = 3, cache = [0, 1, 1, 2, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]
  152. Cache hit! cache(3) = 2
  153. Exit: n = 3, cache = [0, 1, 1, 2, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], r = 2
  154. Cache updated! cache(5) = 5
  155. Exit: n = 5, cache = [0, 1, 1, 2, 3, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1], r = 5
  156. Entry: n = 4, cache = [0, 1, 1, 2, 3, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1]
  157. Cache hit! cache(4) = 3
  158. Exit: n = 4, cache = [0, 1, 1, 2, 3, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1], r = 3
  159. Cache updated! cache(6) = 8
  160. Exit: n = 6, cache = [0, 1, 1, 2, 3, 5, 8, -1, -1, -1, -1, -1, -1, -1, -1], r = 8
  161. Entry: n = 5, cache = [0, 1, 1, 2, 3, 5, 8, -1, -1, -1, -1, -1, -1, -1, -1]
  162. Cache hit! cache(5) = 5
  163. Exit: n = 5, cache = [0, 1, 1, 2, 3, 5, 8, -1, -1, -1, -1, -1, -1, -1, -1], r = 5
  164. Cache updated! cache(7) = 13
  165. Exit: n = 7, cache = [0, 1, 1, 2, 3, 5, 8, 13, -1, -1, -1, -1, -1, -1, -1], r = 13
  166. Entry: n = 6, cache = [0, 1, 1, 2, 3, 5, 8, 13, -1, -1, -1, -1, -1, -1, -1]
  167. Cache hit! cache(6) = 8
  168. Exit: n = 6, cache = [0, 1, 1, 2, 3, 5, 8, 13, -1, -1, -1, -1, -1, -1, -1], r = 8
  169. Cache updated! cache(8) = 21
  170. Exit: n = 8, cache = [0, 1, 1, 2, 3, 5, 8, 13, 21, -1, -1, -1, -1, -1, -1], r = 21
  171. Entry: n = 7, cache = [0, 1, 1, 2, 3, 5, 8, 13, 21, -1, -1, -1, -1, -1, -1]
  172. Cache hit! cache(7) = 13
  173. Exit: n = 7, cache = [0, 1, 1, 2, 3, 5, 8, 13, 21, -1, -1, -1, -1, -1, -1], r = 13
  174. Cache updated! cache(9) = 34
  175. Exit: n = 9, cache = [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, -1, -1, -1, -1, -1], r = 34
  176. */
  177. assert(test2 == 34)
  178.  
  179. val test3: Z = fibonacci(7)
  180. /* Trace log:
  181. Entry: n = 7, cache = [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, -1, -1, -1, -1, -1]
  182. Cache hit! cache(7) = 13
  183. Exit: n = 7, cache = [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, -1, -1, -1, -1, -1], r = 13
  184. */
  185. assert(test3 == 13)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement