From fb21e0119779532952dc8604c8b42b6379591837 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Blanc?= <regwblanc@gmail.com> Date: Thu, 29 Mar 2012 02:44:25 +0000 Subject: [PATCH] bad replace of variables in blocks --- mytest/Assign1.scala | 15 ++++++++---- mytest/Bubble.scala | 24 ++++++++++++++----- .../leon/ImperativeCodeElimination.scala | 4 ++-- 3 files changed, 31 insertions(+), 12 deletions(-) diff --git a/mytest/Assign1.scala b/mytest/Assign1.scala index 864eb7bfc..ef346a02c 100644 --- a/mytest/Assign1.scala +++ b/mytest/Assign1.scala @@ -1,10 +1,17 @@ object Assign1 { def foo(): Int = { - var a = 1 - var b = a - a = a + 1 - b = b + a + var a = 0 + val tmp = a + 1 + a = a + 2 + a = a + 3 + a = a + 4 + //var j = 0 + //var sortedArray = Map.empty[Int, Int] + //val tmp = sortedArray(j) + //sortedArray = sortedArray.updated(j, sortedArray(j+1)) + //sortedArray = sortedArray.updated(j+1, tmp) + //sortedArray(j) a } diff --git a/mytest/Bubble.scala b/mytest/Bubble.scala index 1c6dc98bc..9a1b8fd44 100644 --- a/mytest/Bubble.scala +++ b/mytest/Bubble.scala @@ -2,24 +2,36 @@ import leon.Utils._ object Bubble { - def sort(a: Map[Int, Int], size: Int): Map[Int, Int] = { - require(isArray(a, size)) + def sort(a: Map[Int, Int], size: Int, k: Int): Map[Int, Int] = ({ + require(size > 0 && k < size - 1 && k >= 0) var i = size - 1 var j = 0 var sortedArray = a (while(i > 0) { j = 0 (while(j < i) { - if(a(j) > a(j+1)) { + if(sortedArray(j) > sortedArray(j+1)) { val tmp = sortedArray(j) - sortedArray = sortedArray.updated(j, a(j+1)) + sortedArray = sortedArray.updated(j, sortedArray(j+1)) sortedArray = sortedArray.updated(j+1, tmp) } j = j + 1 - }) invariant(isArray(sortedArray, size) && j >= 0 && j <= i && i < size && i >= 0) + }) invariant(j >= 0 && j <= i) i = i - 1 - }) invariant(isArray(sortedArray, size) && i >= 0 && i < size) + }) invariant(i >= 0 && i < size && (k < i || sortedArray(k) <= sortedArray(k+1))) sortedArray + }) ensuring(res => res(k) <= res(k+1)) + //ensuring(res => sorted(res, 0, size-1)) + + def sorted(a: Map[Int, Int], l: Int, u: Int): Boolean = { + var k = l + var sorted = true + while(k < u) { + if(a(k) > a(k+1)) + sorted = false + k = k + 1 + } + sorted } diff --git a/src/main/scala/leon/ImperativeCodeElimination.scala b/src/main/scala/leon/ImperativeCodeElimination.scala index f59479c74..b44e21cf4 100644 --- a/src/main/scala/leon/ImperativeCodeElimination.scala +++ b/src/main/scala/leon/ImperativeCodeElimination.scala @@ -132,8 +132,8 @@ object ImperativeCodeElimination extends Pass { (scope, accFun ++ rFun) }) val (lastRes, lastScope, lastFun) = toFunction(expr) - (replace(fun.map{ case (i1, i2) => (i1.toVariable, i2.toVariable) }, lastRes), - (body: Expr) => scope(lastScope(body)), + (lastRes, + (body: Expr) => scope(replace(fun.map{ case (i1, i2) => (i1.toVariable, i2.toVariable) }, lastScope(body))), fun ++ lastFun) } -- GitLab