From 0b2eb621c23c6ab17b734711fda38e7a114a57c5 Mon Sep 17 00:00:00 2001 From: Etienne Kneuss <ekneuss@gmail.com> Date: Wed, 14 Nov 2012 13:57:39 +0100 Subject: [PATCH] Implement EqualitySplit We should check whether we do not always split on same variables --- src/main/scala/leon/synthesis/Rules.scala | 24 +++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/main/scala/leon/synthesis/Rules.scala b/src/main/scala/leon/synthesis/Rules.scala index b79ade73c..2ea3725c0 100644 --- a/src/main/scala/leon/synthesis/Rules.scala +++ b/src/main/scala/leon/synthesis/Rules.scala @@ -20,6 +20,7 @@ object Rules { new UnusedInput(_), new UnconstrainedOutput(_), new OptimisticGround(_), + new EqualitySplit(_), new CEGIS(_), new Assert(_) ) @@ -281,7 +282,7 @@ class ADTDual(synth: Synthesizer) extends Rule("ADTDual", synth, 200) { } } -class CEGIS(synth: Synthesizer) extends Rule("CEGIS", synth, 50) { +class CEGIS(synth: Synthesizer) extends Rule("CEGIS", synth, 150) { def applyOn(task: Task): RuleResult = { val p = task.problem @@ -457,7 +458,7 @@ class CEGIS(synth: Synthesizer) extends Rule("CEGIS", synth, 50) { } } -class OptimisticGround(synth: Synthesizer) extends Rule("Optimistic Ground", synth, 90) { +class OptimisticGround(synth: Synthesizer) extends Rule("Optimistic Ground", synth, 150) { def applyOn(task: Task): RuleResult = { val p = task.problem @@ -512,3 +513,22 @@ class OptimisticGround(synth: Synthesizer) extends Rule("Optimistic Ground", syn } } } + +class EqualitySplit(synth: Synthesizer) extends Rule("Eq. Split.", synth, 10) { + def applyOn(task: Task): RuleResult = { + val p = task.problem + + val asgroups = p.as.groupBy(_.getType).filter(_._2.size == 2).mapValues(_.toList) + + val extraConds = for (List(a1, a2) <- asgroups.values) yield { + Or(Equals(Variable(a1), Variable(a2)), Not(Equals(Variable(a1), Variable(a2)))) + } + + if (!extraConds.isEmpty) { + val sub = p.copy(phi = And(And(extraConds.toSeq), p.phi)) + RuleStep(List(sub), forward) + } else { + RuleInapplicable + } + } +} -- GitLab