diff --git a/mytest/Abs.scala b/mytest/Abs.scala index 3774d5daa8940ba06b48c2fee2c1ed7652f2d846..d189299038305f429d5324f5e13d6e9cb506fb3b 100644 --- a/mytest/Abs.scala +++ b/mytest/Abs.scala @@ -3,19 +3,22 @@ import leon.Utils._ object Abs { - def abs(tab: Map[Int, Int], size: Int, j: Int): Map[Int, Int] = { - require(j >= 0 && j < size && tab.isDefinedAt(j) && size > 0) + def abs(tab: Map[Int, Int], size: Int, j: Int): Map[Int, Int] = ({ + require(j >= 0 && j < size && size > 0) var k = 0 var tabres = Map.empty[Int, Int] (while(k < size) { - if(tab(k) < 0) - tabres = tabres.updated(k, -tab(k)) - else - tabres = tabres.updated(k, tab(k)) + if(tab.isDefinedAt(k)) { + if(tab(k) < 0) + tabres = tabres.updated(k, -tab(k)) + else + tabres = tabres.updated(k, tab(k)) + } else { + tabres = tabres.updated(k, 0) + } k = k + 1 - }) invariant(k >= 0) + }) invariant(k >= 0 && (if(j < k) tabres(j) >= 0 else true)) tabres - - } + }) ensuring(res => res(j) >= 0) } diff --git a/src/main/scala/leon/ImperativeCodeElimination.scala b/src/main/scala/leon/ImperativeCodeElimination.scala index 17248c50d311b12c769c3bed4a5ad04fd3f4b7e3..f59479c740c1d272ebe79f5aad233805b16f12c7 100644 --- a/src/main/scala/leon/ImperativeCodeElimination.scala +++ b/src/main/scala/leon/ImperativeCodeElimination.scala @@ -91,14 +91,15 @@ object ImperativeCodeElimination extends Pass { Map(whileFunVars.head.toVariable -> resVar) else whileFunVars.zipWithIndex.map{ case (v, i) => (v.toVariable, TupleSelect(resVar, i+1).setType(v.getType)) }.toMap - val modifiedVars2ResultVars: Map[Expr, Expr] = modifiedVars.map(v => (v.toVariable, modifiedVars2WhileFunVars(v.toVariable))).toMap + val modifiedVars2ResultVars: Map[Expr, Expr] = modifiedVars.map(v => (v.toVariable, whileFunVars2ResultVars(modifiedVars2WhileFunVars(v.toVariable)))).toMap val trivialPostcondition: Option[Expr] = Some(Not(replace(whileFunVars2ResultVars, whileFunCond))) val invariantPrecondition: Option[Expr] = wh.invariant.map(expr => replace(modifiedVars2WhileFunVars, expr)) + val invariantPostcondition: Option[Expr] = wh.invariant.map(expr => replace(modifiedVars2ResultVars, expr)) whileFunDef.precondition = invariantPrecondition whileFunDef.postcondition = trivialPostcondition.map(expr => - And(expr, invariantPrecondition match { - case Some(e) => replace(modifiedVars2ResultVars, e) + And(expr, invariantPostcondition match { + case Some(e) => e case None => BooleanLiteral(true) }))