diff --git a/src/main/scala/leon/synthesis/Rules.scala b/src/main/scala/leon/synthesis/Rules.scala index 78a8546a2622acda17fbd82b9fee6594f43e12a9..8fd86f53cdb8e468704ce60e24fb6186aad6ad3b 100644 --- a/src/main/scala/leon/synthesis/Rules.scala +++ b/src/main/scala/leon/synthesis/Rules.scala @@ -441,6 +441,8 @@ class CEGIS(synth: Synthesizer) extends Rule("CEGIS", synth, 150) { result = Some(RuleSuccess(Solution(BooleanLiteral(true), Set(), Tuple(p.xs.map(valuateWithModel(mapping))).setType(tpe)))) case _ => + reporter.warning("Solver returned 'UNKNOWN' in a CEGIS iteration.") + continue = false } case (Some(false), _) => @@ -479,12 +481,14 @@ class OptimisticGround(synth: Synthesizer) extends Rule("Optimistic Ground", syn while (result.isEmpty && i < maxTries) { val phi = And(p.phi +: predicates) + //println("SOLVING " + phi + " ...") synth.solver.solveSAT(phi) match { case (Some(true), satModel) => val satXsModel = satModel.filterKeys(xss) val newPhi = valuateWithModelIn(phi, xss, satModel) + //println("REFUTING " + Not(newPhi) + "...") synth.solver.solveSAT(Not(newPhi)) match { case (Some(true), invalidModel) => // Found as such as the xs break, refine predicates @@ -535,7 +539,7 @@ class EqualitySplit(synth: Synthesizer) extends Rule("Eq. Split.", synth, 90) { ) } - val candidate = p.as.groupBy(_.getType).map(_._2.toList).find{ + val candidate = p.as.groupBy(_.getType).map(_._2.toList).find { case List(a1, a2) => (pres & combinations(a1, a2)).isEmpty case _ => false } diff --git a/testcases/synthesis/ADTInduction.scala b/testcases/synthesis/ADTInduction.scala index f30827fa3e691090c231922c70fdd628932e1b5f..23db0bb0111d5673f296cf6b4c4f2bac8dbf2e68 100644 --- a/testcases/synthesis/ADTInduction.scala +++ b/testcases/synthesis/ADTInduction.scala @@ -16,11 +16,21 @@ object SortedList { //def sizeSynth(l: List): Int = choose{ (i: Int) => i >= 0 && sizeSynth(Cons(0, l)) == i + 1} def content(l: List): Set[Int] = l match { - case Nil() => Set() + case Nil() => Set.empty[Int] case Cons(i, t) => Set(i) ++ content(t) } - def deleteSynth(in: List, v: Int) = choose{ (out: List) => !(content(out) contains v) && size(out)+1 >= size(in) } + //def artifialSubcase(v : Int) = choose { + // (out : List) => + // content(out) == (content(Nil()) -- Set(v)) + //} + + def deleteSynth(in: List, v: Int) = choose { + (out: List) => + // This spec is too weak. Maybe use later as bad example? + //!(content(out) contains v) && size(out)+1 >= size(in) + (content(out) == (content(in) -- Set(v))) + } def isSorted(l: List): Boolean = l match { case Nil() => true