From 953a1799ba7a9517df8221fb0478bba9d4d6afe5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ali=20Sinan=20K=C3=B6ksal?= <alisinan@gmail.com> Date: Tue, 10 May 2011 15:58:38 +0000 Subject: [PATCH] trust Z3 that it will return distinct models when asked. --- cp-demo/SortedList.scala | 17 ++++++++++++++++- src/cp/Terms.scala | 6 ++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/cp-demo/SortedList.scala b/cp-demo/SortedList.scala index 87e93798d..7fcd0d73e 100644 --- a/cp-demo/SortedList.scala +++ b/cp-demo/SortedList.scala @@ -1,4 +1,5 @@ import cp.Definitions._ +import cp.Terms._ @spec object Lists { sealed abstract class List @@ -15,6 +16,13 @@ import cp.Definitions._ case Cons(x, Nil()) => true case Cons(x, Cons(y, ys)) => x <= y && isSorted(Cons(y, ys)) } + // def isSorted(l : List) : Boolean = l match { + // case Nil() => true + // case Cons(x, xs) => xs match { + // case Nil() => true + // case Cons(y, _) => x <= y && isSorted(xs) + // } + // } def valuesWithin(l: List, lower: Int, upper: Int) : Boolean = l match { case Nil() => true @@ -29,7 +37,14 @@ object SortedList { val len = if (args.isEmpty) 3 else args(0).toInt val set = scala.collection.mutable.Set[List]() - for (list <- ((l : List) => isSorted(l) && valuesWithin(l, 0, len) && size(l) == len).findAll) + val c1 : Constraint1[List] = (l : List) => isSorted(l) + val c2 : Constraint1[List] = (l : List) => valuesWithin(l, 0, len) + val c3 : Constraint1[List] = (l : List) => size(l) == len + + val combined = c1 && c2 && c3 + + // for (list <- ((l : List) => isSorted(l) && valuesWithin(l, 0, len) && size(l) == len).findAll) + for (list <- combined.findAll) set += list println("size : " + set.size) diff --git a/src/cp/Terms.scala b/src/cp/Terms.scala index e87074319..3891786a4 100644 --- a/src/cp/Terms.scala +++ b/src/cp/Terms.scala @@ -1555,7 +1555,8 @@ object Terms { nextModel = Some(Some(completeModel)) val newModelEqualities = And(outputVariables.map(ov => Equals(Variable(ov), completeModel(ov)))) toCheck = negate(newModelEqualities) - toUseAsEvaluator = toUseAsEvaluator.map(e => ((m : Map[Identifier,Expr]) => e(m) && !m.forall{ case (k,v) => completeModel.get(k) == Some(v) })) + // accumulate negations of models in evaluator + // toUseAsEvaluator = toUseAsEvaluator.map(e => ((m : Map[Identifier,Expr]) => e(m) && !m.forall{ case (k,v) => completeModel.get(k) == Some(v) })) true case Some(true) => // there are definitely no more solutions @@ -1593,7 +1594,8 @@ object Terms { val newModelEqualities = And(outputVariables.map(ov => Equals(Variable(ov), completeModel(ov)))) toCheck = negate(newModelEqualities) - toUseAsEvaluator = toUseAsEvaluator.map(e => ((m : Map[Identifier,Expr]) => e(m) && !m.forall{ case (k,v) => completeModel.get(k) == Some(v) })) + // accumulate negations of models in evaluator + // toUseAsEvaluator = toUseAsEvaluator.map(e => ((m : Map[Identifier,Expr]) => e(m) && !m.forall(p => completeModel.get(p._1) == Some(p._2)))) completeModel case Some(true) => // Definitely no more solutions -- GitLab