diff --git a/src/main/scala/leon/synthesis/rules/EqualitySplit.scala b/src/main/scala/leon/synthesis/rules/EqualitySplit.scala index 2fb7bd19a8e57e46dd46714b1eec1485b5324426..0b3cc6a345d04981b61a0b75298648a78542c28a 100644 --- a/src/main/scala/leon/synthesis/rules/EqualitySplit.scala +++ b/src/main/scala/leon/synthesis/rules/EqualitySplit.scala @@ -12,22 +12,23 @@ class EqualitySplit(synth: Synthesizer) extends Rule("Eq. Split.", synth, 90) { def applyOn(task: Task): RuleResult = { val p = task.problem - val TopLevelAnds(presSeq) = p.c - val pres = presSeq.toSet - - def combinations(a1: Identifier, a2: Identifier): Set[Expr] = { - val v1 = Variable(a1) - val v2 = Variable(a2) - Set( - Equals(v1, v2), - Equals(v2, v1), - Not(Equals(v1, v2)), - Not(Equals(v2, v1)) - ) - } - val candidate = p.as.groupBy(_.getType).map(_._2.toList).find { - case List(a1, a2) => (pres & combinations(a1, a2)).isEmpty + case List(a1, a2) => + val toValEQ = Implies(p.c, Equals(Variable(a1), Variable(a2))) + + val impliesEQ = synth.solver.solveSAT(Not(toValEQ)) match { + case (Some(false), _) => true + case _ => false + } + + val toValNE = Implies(p.c, Not(Equals(Variable(a1), Variable(a2)))) + + val impliesNE = synth.solver.solveSAT(Not(toValNE)) match { + case (Some(false), _) => true + case _ => false + } + + !impliesNE && !impliesEQ case _ => false }