Skip to content
Snippets Groups Projects
Commit fc866608 authored by Philippe Suter's avatar Philippe Suter
Browse files

New annotation to issue warning if function could not be axiomatized.

parent 953a1799
No related branches found
No related tags found
No related merge requests found
...@@ -2,4 +2,5 @@ package funcheck ...@@ -2,4 +2,5 @@ package funcheck
object Annotations { object Annotations {
class induct extends StaticAnnotation class induct extends StaticAnnotation
class axiomatize extends StaticAnnotation
} }
...@@ -179,6 +179,7 @@ trait CodeExtraction extends Extractors { ...@@ -179,6 +179,7 @@ trait CodeExtraction extends Extractors {
for(a <- dd.symbol.annotations) { for(a <- dd.symbol.annotations) {
a.atp.safeToString match { a.atp.safeToString match {
case "funcheck.Annotations.induct" => funDef.addAnnotation("induct") case "funcheck.Annotations.induct" => funDef.addAnnotation("induct")
case "funcheck.Annotations.axiomatize" => funDef.addAnnotation("axiomatize")
case _ => ; case _ => ;
} }
} }
......
...@@ -202,6 +202,12 @@ class FairZ3Solver(val reporter: Reporter) extends Solver(reporter) with Abstrac ...@@ -202,6 +202,12 @@ class FairZ3Solver(val reporter: Reporter) extends Solver(reporter) with Abstrac
if(!Settings.noForallAxioms) { if(!Settings.noForallAxioms) {
prepareAxioms prepareAxioms
} }
for(funDef <- program.definedFunctions) {
if (funDef.annotations.contains("axiomatize") && !axiomatizedFunctions(funDef)) {
reporter.warning("Function " + funDef.id + " was marked for axiomatization but could not be handled.")
}
}
} }
private def prepareAxioms : Unit = { private def prepareAxioms : Unit = {
...@@ -228,9 +234,9 @@ class FairZ3Solver(val reporter: Reporter) extends Solver(reporter) with Abstrac ...@@ -228,9 +234,9 @@ class FairZ3Solver(val reporter: Reporter) extends Solver(reporter) with Abstrac
val nameTypePairs = z3ArgSorts.map(s => (z3.mkFreshIntSymbol, s)) val nameTypePairs = z3ArgSorts.map(s => (z3.mkFreshIntSymbol, s))
z3.mkForAll(0, List(pattern), nameTypePairs, z3IzedEq) z3.mkForAll(0, List(pattern), nameTypePairs, z3IzedEq)
} }
//println("I'll assert now an axiom: " + axiom) // println("I'll assert now an axiom: " + axiom)
//println("Case axiom:") // println("Case axiom:")
//println(axiom) // println(axiom)
z3.assertCnstr(axiom) z3.assertCnstr(axiom)
} }
...@@ -392,7 +398,7 @@ class FairZ3Solver(val reporter: Reporter) extends Solver(reporter) with Abstrac ...@@ -392,7 +398,7 @@ class FairZ3Solver(val reporter: Reporter) extends Solver(reporter) with Abstrac
reporter.info(" - Running Z3 search...") reporter.info(" - Running Z3 search...")
val (answer, model, core) : (Option[Boolean], Z3Model, Seq[Z3AST]) = if(Settings.useCores) { val (answer, model, core) : (Option[Boolean], Z3Model, Seq[Z3AST]) = if(Settings.useCores) {
println(blockingSetAsZ3) // println(blockingSetAsZ3)
z3.checkAssumptions(blockingSetAsZ3 : _*) z3.checkAssumptions(blockingSetAsZ3 : _*)
} else { } else {
z3SearchStopwatch.start z3SearchStopwatch.start
......
import funcheck.Utils._ import funcheck.Utils._
import funcheck.Annotations._
object Test { object Test {
sealed abstract class List sealed abstract class List
case class Cons(head: Int, tail: List) extends List case class Cons(head: Int, tail: List) extends List
case class Nil() extends List case class Nil() extends List
def append(value: Int, list: List) : List = list match { @axiomatize
case Nil() => Cons(value, Nil()) def size(l: List) : Int = (l match {
case Cons(x, xs) => Cons(x, append(value, xs)) case Nil() => 0
} case Cons(_, t) => 1 + size(t)
}) ensuring(res => res >= 0)
def isSorted(list: List) : Boolean = list match { @axiomatize
case Nil() => true def isSorted(l : List) : Boolean = l match {
case Cons(x, Nil()) => true case Nil() => true
case Cons(x, c @ Cons(y, ys)) => x <= y && isSorted(c) case Cons(x, xs) => xs match {
} case Nil() => true
case Cons(y, _) => x <= y && isSorted(xs)
}
}
def isSorted2(list: List) : Boolean = list match { def valuesWithin(l: List, lower: Int, upper: Int) : Boolean = l match {
case Cons(x, c @ Cons(y, ys)) => x <= y && isSorted2(c) case Nil() => true
case _ => true case Cons(x, xs) => x >= lower && x <= upper && valuesWithin(xs, lower, upper)
} }
def sameSorted(list: List) : Boolean = { def findOne(l : List) : Boolean = {
isSorted(list) == isSorted2(list) isSorted(l) && valuesWithin(l, 0, 3) && size(l) == 3
} holds } ensuring(res => !res)
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment