diff --git a/src/main/scala/leon/synthesis/Rules.scala b/src/main/scala/leon/synthesis/Rules.scala index f2df54b71f0f032f7a8e1a52f2de28af7cc01625..2ac45f4be1b1198d4cda98d3d75a173a6df9b4ae 100644 --- a/src/main/scala/leon/synthesis/Rules.scala +++ b/src/main/scala/leon/synthesis/Rules.scala @@ -143,6 +143,12 @@ trait RuleDSL { def substAll(what: Map[Identifier, Expr], in: Expr): Expr = replaceFromIDs(what, in) val forward: List[Solution] => Option[Solution] = { ss => ss.headOption } + + def forwardMap(f : Expr => Expr) : List[Solution] => Option[Solution] = { + _.headOption map { s => + Solution(f(s.pre), s.defs, f(s.term)) + } + } def decomp(sub: List[Problem], onSuccess: List[Solution] => Option[Solution], description: String) (implicit problem: Problem): RuleInstantiation = { diff --git a/src/main/scala/leon/synthesis/rules/EquivalentInputs.scala b/src/main/scala/leon/synthesis/rules/EquivalentInputs.scala index b5c5744f6225904530209073dbf266a274353aef..35423e656e3890d0fa8c20910fbfe52b83872765 100644 --- a/src/main/scala/leon/synthesis/rules/EquivalentInputs.scala +++ b/src/main/scala/leon/synthesis/rules/EquivalentInputs.scala @@ -19,7 +19,7 @@ case object EquivalentInputs extends NormalizingRule("EquivalentInputs") { case ccio @ CaseClassInstanceOf(cct, s) => ccio } - var clauses = allClauses.filterNot(instanceOfs.toSet) + val clauses = allClauses.filterNot(instanceOfs.toSet) val ccSubsts = for (CaseClassInstanceOf(cct, s) <- instanceOfs) yield { @@ -73,7 +73,12 @@ case object EquivalentInputs extends NormalizingRule("EquivalentInputs") { pc = simplifier(andJoin(replaceSeq(substs, p.pc) +: postsToInject)), phi = simplifier(replaceSeq(substs, p.phi))) - List(decomp(List(sub), forward, "Equivalent Inputs")) + val subst = replace( + substs.map{_.swap}.filter{ case (x,y) => formulaSize(x) > formulaSize(y) }.toMap, + _:Expr + ) + + List(decomp(List(sub), forwardMap(subst), "Equivalent Inputs")) } else { Nil }