From 696844ea23ece1e4251ec0a624bf24a9d3a85d71 Mon Sep 17 00:00:00 2001 From: Philippe Suter <philippe.suter@gmail.com> Date: Fri, 20 Aug 2010 10:46:56 +0000 Subject: [PATCH] started to rewrite the CADE07 formulas as FunCheck functions. So far they all work :) --- lib/z3.jar | Bin 148167 -> 148414 bytes src/funcheck/CodeExtraction.scala | 24 +++++++++- src/funcheck/Extractors.scala | 14 ++++++ src/purescala/PrettyPrinter.scala | 7 ++- src/purescala/Trees.scala | 8 +++- vmcai2011-testcases/CADE07.scala | 72 ++++++++++++++++++++++++++++++ 6 files changed, 120 insertions(+), 5 deletions(-) create mode 100644 vmcai2011-testcases/CADE07.scala diff --git a/lib/z3.jar b/lib/z3.jar index 37ffb232df24c3b5aa8e35181a736edf576ed751..e40a8c348760944735605957c8a5d45f5dada7db 100644 GIT binary patch delta 6716 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 delta 6499 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 H03~byhdvJG diff --git a/src/funcheck/CodeExtraction.scala b/src/funcheck/CodeExtraction.scala index b60cab38f..c6caa595e 100644 --- a/src/funcheck/CodeExtraction.scala +++ b/src/funcheck/CodeExtraction.scala @@ -422,7 +422,29 @@ trait CodeExtraction extends Extractors { throw ImpureCodeEncounteredException(tree) } } - } + } + case ExSetContains(t1,t2) => { + val rl = rec(t1) + val rr = rec(t2) + rl.getType match { + case s @ SetType(_) => ElementOfSet(rr, rl) + case _ => { + if(!silent) unit.error(tree.pos, ".contains on non set expression.") + throw ImpureCodeEncounteredException(tree) + } + } + } + case ExSetSubset(t1,t2) => { + val rl = rec(t1) + val rr = rec(t2) + rl.getType match { + case s @ SetType(_) => SubsetOf(rl, rr) + case _ => { + if(!silent) unit.error(tree.pos, "Subset on non set expression.") + throw ImpureCodeEncounteredException(tree) + } + } + } case ExSetMinus(t1,t2) => { val rl = rec(t1) val rr = rec(t2) diff --git a/src/funcheck/Extractors.scala b/src/funcheck/Extractors.scala index 62f4b0dae..110efa675 100644 --- a/src/funcheck/Extractors.scala +++ b/src/funcheck/Extractors.scala @@ -409,6 +409,20 @@ trait Extractors { case _ => None } } + + object ExSetContains { + def unapply(tree: Apply) : Option[(Tree,Tree)] = tree match { + case Apply(Select(lhs, n), List(rhs)) if (n.toString == "contains") => Some((lhs,rhs)) + case _ => None + } + } + + object ExSetSubset { + def unapply(tree: Apply) : Option[(Tree,Tree)] = tree match { + case Apply(Select(lhs, n), List(rhs)) if (n.toString == "subsetOf") => Some((lhs,rhs)) + case _ => None + } + } object ExSetMinus { def unapply(tree: Apply): Option[(Tree,Tree)] = tree match { diff --git a/src/purescala/PrettyPrinter.scala b/src/purescala/PrettyPrinter.scala index 11daf5eba..4b8207562 100644 --- a/src/purescala/PrettyPrinter.scala +++ b/src/purescala/PrettyPrinter.scala @@ -73,7 +73,6 @@ object PrettyPrinter { case And(exprs) => ppNary(sb, exprs, "(", " \u2227 ", ")", lvl) // \land case Or(exprs) => ppNary(sb, exprs, "(", " \u2228 ", ")", lvl) // \lor case Not(Equals(l, r)) => ppBinary(sb, l, r, " \u2260 ", lvl) // \neq - case Not(expr) => ppUnary(sb, expr, "\u00AC(", ")", lvl) // \neg case Iff(l,r) => ppBinary(sb, l, r, " <=> ", lvl) case Implies(l,r) => ppBinary(sb, l, r, " ==> ", lvl) case UMinus(expr) => ppUnary(sb, expr, "-(", ")", lvl) @@ -106,6 +105,10 @@ object PrettyPrinter { case FiniteMultiset(rs) => ppNary(sb, rs, "{|", ", ", "|}", lvl) case EmptySet(_) => sb.append("\u2205") // Ø case EmptyMultiset(_) => sb.append("\u2205") // Ø + case Not(ElementOfSet(s,e)) => ppBinary(sb, s, e, " \u2209 ", lvl) // \notin + case ElementOfSet(s,e) => ppBinary(sb, s, e, " \u2208 ", lvl) // \in + case SubsetOf(l,r) => ppBinary(sb, l, r, " \u2286 ", lvl) // \subseteq + case Not(SubsetOf(l,r)) => ppBinary(sb, l, r, " \u2288 ", lvl) // \notsubseteq case SetMin(s) => pp(s, sb, lvl).append(".min") case SetMax(s) => pp(s, sb, lvl).append(".max") case SetUnion(l,r) => ppBinary(sb, l, r, " \u222A ", lvl) // \cup @@ -181,7 +184,7 @@ object PrettyPrinter { } case ResultVariable() => sb.append("#res") - + case Not(expr) => ppUnary(sb, expr, "\u00AC(", ")", lvl) // \neg case _ => sb.append("Expr?") } diff --git a/src/purescala/Trees.scala b/src/purescala/Trees.scala index 66fa89e42..cafc43db5 100644 --- a/src/purescala/Trees.scala +++ b/src/purescala/Trees.scala @@ -249,11 +249,15 @@ object Trees { /* Set expressions */ case class EmptySet(baseType: TypeTree) extends Expr with Terminal case class FiniteSet(elements: Seq[Expr]) extends Expr - case class ElementOfSet(element: Expr, set: Expr) extends Expr + case class ElementOfSet(element: Expr, set: Expr) extends Expr with FixedType { + val fixedType = BooleanType + } case class SetCardinality(set: Expr) extends Expr with FixedType { val fixedType = Int32Type } - case class SubsetOf(set1: Expr, set2: Expr) extends Expr + case class SubsetOf(set1: Expr, set2: Expr) extends Expr with FixedType { + val fixedType = BooleanType + } case class SetIntersection(set1: Expr, set2: Expr) extends Expr case class SetUnion(set1: Expr, set2: Expr) extends Expr case class SetDifference(set1: Expr, set2: Expr) extends Expr diff --git a/vmcai2011-testcases/CADE07.scala b/vmcai2011-testcases/CADE07.scala new file mode 100644 index 000000000..1453c4534 --- /dev/null +++ b/vmcai2011-testcases/CADE07.scala @@ -0,0 +1,72 @@ +import scala.collection.immutable.Set + +object CADE07 { + def vc1(listContent: Set[Int]) : Boolean = { + (listContent.size == 0) == (listContent == Set.empty[Int]) + } ensuring(_ == true) + + def vc2(x: Int, listContent: Set[Int]) : Set[Int] = { + require(!listContent.contains(x)) + listContent ++ Set(x) + } // ensuring(_.size == listContent.size + 1) + + def vc2r(x: Set[Int], listContent: Set[Int]) : Set[Int] = { + require(x.size == 1 && !x.subsetOf(listContent)) + listContent ++ x + } ensuring(_.size == listContent.size + 1) + + def vc2a(listRoot: Int, list: Set[Int], x: Int, listContent: Set[Int], objectAlloc: Set[Int], objct: Set[Int]) : Set[Int] = { + require( + list.contains(listRoot) + && !listContent.contains(x) + && listContent.subsetOf(objectAlloc) + && objct.contains(x) + && objectAlloc.contains(x)) + + listContent ++ Set(x) + } // ensuring(_.size == listContent.size + 1) + + def vc2ar(listRoot: Set[Int], list: Set[Int], x: Set[Int], listContent: Set[Int], objectAlloc: Set[Int], objct: Set[Int]) : Set[Int] = { + require( + listRoot.size == 1 + && listRoot.subsetOf(list) + && x.size == 1 + && !x.subsetOf(listContent) + && listContent.subsetOf(objectAlloc) + && x.subsetOf(objct) + && x.subsetOf(objectAlloc)) + + listContent ++ x + } ensuring(_.size == listContent.size + 1) + + def vc2b(listRoot: Int, list: Set[Int], x: Int, listContent: Set[Int], objectAlloc: Set[Int], objct: Set[Int]) : Set[Int] = { + require( + list.contains(listRoot) + && listContent.subsetOf(objectAlloc) + && objct.contains(x) + && objectAlloc.contains(x)) + + listContent ++ Set(x) + } ensuring(_.size == listContent.size + 1) + + def vc2br(listRoot: Set[Int], list: Set[Int], x: Set[Int], listContent: Set[Int], objectAlloc: Set[Int], objct: Set[Int]) : Set[Int] = { + require( + listRoot.size == 1 + && listRoot.subsetOf(list) + && x.size == 1 + && listContent.subsetOf(objectAlloc) + && x.subsetOf(objct) + && x.subsetOf(objectAlloc)) + + listContent ++ x + } ensuring(_.size == listContent.size + 1) + + def vc3(x: Int, listContent: Set[Int]) : Set[Int] = { + listContent ++ Set(x) + } //ensuring(_.size <= listContent.size + 1) + + def vc3r(x: Set[Int], listContent: Set[Int]) : Set[Int] = { + require(x.size == 1) + listContent ++ x + } ensuring(_.size <= listContent.size + 1) +} -- GitLab