From 1508a8e5e9d707fd302490d1c4aee35cda742ef2 Mon Sep 17 00:00:00 2001 From: Philippe Suter <philippe.suter@gmail.com> Date: Thu, 7 Oct 2010 18:00:02 +0000 Subject: [PATCH] more new better --- project/build/funcheck.scala | 9 ++++++--- src/funcheck/Annotations.scala | 5 +++++ src/funcheck/CodeExtraction.scala | 11 ++++++++++- src/purescala/Definitions.scala | 10 +++++++++- src/purescala/PrettyPrinter.scala | 7 ++++++- src/purescala/Z3ModelReconstruction.scala | 14 ++++++++++++++ testcases/ListWithSize.scala | 4 +++- 7 files changed, 53 insertions(+), 7 deletions(-) create mode 100644 src/funcheck/Annotations.scala create mode 100644 src/purescala/Z3ModelReconstruction.scala diff --git a/project/build/funcheck.scala b/project/build/funcheck.scala index d4b148c4f..7c70f935d 100644 --- a/project/build/funcheck.scala +++ b/project/build/funcheck.scala @@ -30,20 +30,23 @@ class FunCheckProject(info: ProjectInfo) extends DefaultProject(info) with FileT val f = scriptPath.asFile val fw = new java.io.FileWriter(f) fw.write("#!/bin/bash" + nl) - fw.write("FUNCHECKCLASSPATH=") + fw.write("FUNCHECKCLASSPATH=\"") fw.write(buildLibraryJar.absolutePath + ":") fw.write(buildCompilerJar.absolutePath + ":") fw.write(purescala.jarPath.absolutePath + ":") fw.write(plugin.jarPath.absolutePath + ":") fw.write(("lib" / "z3.jar").absolutePath) - fw.write(nl + nl) + fw.write("\"" + nl + nl) fw.write("for f in " + extensionJars.map(_.absolutePath).map(n => "\"" + n + "\"").mkString(" ") + "; do" + nl) fw.write(" if [ -e ${f} ]" + nl) fw.write(" then" + nl) fw.write(" FUNCHECKCLASSPATH=${FUNCHECKCLASSPATH}:${f}" + nl) fw.write(" fi" + nl) fw.write("done" + nl + nl) - fw.write("SCALACCLASSPATH=\"" + (multisetsLib.jarPath.absolutePath) + "\"" + nl) + fw.write("SCALACCLASSPATH=\"") + fw.write(multisetsLib.jarPath.absolutePath + ":") + fw.write(plugin.jarPath.absolutePath) + fw.write("\"" + nl + nl) fw.write("LD_LIBRARY_PATH=" + ("." / "lib-bin").absolutePath + " \\" + nl) fw.write("java \\" + nl) diff --git a/src/funcheck/Annotations.scala b/src/funcheck/Annotations.scala new file mode 100644 index 000000000..4d15717df --- /dev/null +++ b/src/funcheck/Annotations.scala @@ -0,0 +1,5 @@ +package funcheck + +object Annotations { + class induct extends StaticAnnotation +} diff --git a/src/funcheck/CodeExtraction.scala b/src/funcheck/CodeExtraction.scala index c6caa595e..e996e7bf8 100644 --- a/src/funcheck/CodeExtraction.scala +++ b/src/funcheck/CodeExtraction.scala @@ -155,7 +155,16 @@ trait CodeExtraction extends Extractors { _ match { case ExMainFunctionDef() => ; case dd @ ExFunctionDef(n,p,t,b) => { - defsToDefs += (dd.symbol -> extractFunSig(n, p, t)) + val mods = dd.mods + val funDef = extractFunSig(n, p, t) + if(mods.isPrivate) funDef.addAnnotation("private") + for(a <- dd.symbol.annotations) { + a.atp.safeToString match { + case "funcheck.Annotations.induct" => funDef.addAnnotation("induct") + case _ => ; + } + } + defsToDefs += (dd.symbol -> funDef) } case _ => ; } diff --git a/src/purescala/Definitions.scala b/src/purescala/Definitions.scala index 67fe9fd5b..9eaebe171 100644 --- a/src/purescala/Definitions.scala +++ b/src/purescala/Definitions.scala @@ -232,6 +232,14 @@ object Definitions { def hasImplementation : Boolean = body.isDefined def hasPrecondition : Boolean = precondition.isDefined def hasPostcondition : Boolean = postcondition.isDefined - } + private var annots: Set[String] = Set.empty[String] + def addAnnotation(as: String*) : FunDef = { + annots = annots ++ as + this + } + def annotations : Set[String] = annots + + def isPrivate : Boolean = annots.contains("private") + } } diff --git a/src/purescala/PrettyPrinter.scala b/src/purescala/PrettyPrinter.scala index 4b8207562..c073757ce 100644 --- a/src/purescala/PrettyPrinter.scala +++ b/src/purescala/PrettyPrinter.scala @@ -268,9 +268,14 @@ object PrettyPrinter { nsb } - case FunDef(id, rt, args, body, pre, post) => { + case fd @ FunDef(id, rt, args, body, pre, post) => { var nsb = sb + for(a <- fd.annotations) { + ind(nsb, lvl) + nsb.append("@" + a + "\n") + } + pre.foreach(prec => { ind(nsb, lvl) nsb.append("@pre : ") diff --git a/src/purescala/Z3ModelReconstruction.scala b/src/purescala/Z3ModelReconstruction.scala new file mode 100644 index 000000000..77688b217 --- /dev/null +++ b/src/purescala/Z3ModelReconstruction.scala @@ -0,0 +1,14 @@ +package purescala + +import z3.scala._ +import Common._ +import Definitions._ +import Extensions._ +import Trees._ +import TypeTrees._ + +trait Z3ModelReconstruction { + self: Z3Solver => + + +} diff --git a/testcases/ListWithSize.scala b/testcases/ListWithSize.scala index b9425d804..130955bc6 100644 --- a/testcases/ListWithSize.scala +++ b/testcases/ListWithSize.scala @@ -1,4 +1,5 @@ import scala.collection.immutable.Set +import funcheck.Annotations._ object ListWithSize { sealed abstract class List @@ -34,9 +35,10 @@ object ListWithSize { case Cons(x,xs) => Cons(x, append(xs, l2)) }) + @induct def propAppend1(l : List) : Boolean = { append(l, Nil()) == l - } + } ensuring(_ == true) def propAppend2(l : List) : Boolean = (l match { case Nil() => propAppend1(l) -- GitLab