From dff5eafba6e8e8a0988eb042a91d9b61b2c4f149 Mon Sep 17 00:00:00 2001
From: Manos Koukoutos <emmanouil.koukoutos@epfl.ch>
Date: Fri, 29 Apr 2016 18:25:29 +0200
Subject: [PATCH] Fix bug in EquivalentInputs where pc got simplified under
 itself

---
 .../leon/synthesis/rules/EquivalentInputs.scala     | 13 ++++++-------
 1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/src/main/scala/leon/synthesis/rules/EquivalentInputs.scala b/src/main/scala/leon/synthesis/rules/EquivalentInputs.scala
index 74abe6721..e4562426c 100644
--- a/src/main/scala/leon/synthesis/rules/EquivalentInputs.scala
+++ b/src/main/scala/leon/synthesis/rules/EquivalentInputs.scala
@@ -9,15 +9,12 @@ import purescala.Path
 import purescala.Common._
 import purescala.Expressions._
 import purescala.ExprOps._
-import purescala.Extractors._
 import purescala.Constructors._
 import purescala.Types.CaseClassType
 
 case object EquivalentInputs extends NormalizingRule("EquivalentInputs") {
   def instantiateOn(implicit hctx: SearchContext, p: Problem): Traversable[RuleInstantiation] = {
 
-    val simplifier = Simplifiers.bestEffort(hctx, hctx.program)(_:Expr, p.pc)
-
     var subst = Map.empty[Identifier, Expr]
     var reverseSubst = Map.empty[Identifier, Expr]
 
@@ -57,12 +54,12 @@ case object EquivalentInputs extends NormalizingRule("EquivalentInputs") {
       obsolete ++= equivalences.map(_._1)
       free ++= unbound
 
-      def replace(e: Expr) = simplifier(replaceFromIDs(equivalences.toMap, e))
+      def replace(e: Expr) = replaceFromIDs(equivalences.toMap, e)
       subst = subst.mapValues(replace) ++ equivalences
 
       val reverse = equivalences.toMap.flatMap { case (id, CaseClass(cct, fields)) =>
         (cct.classDef.fields zip fields).map { case (vid, Variable(fieldId)) =>
-          fieldId -> CaseClassSelector(cct, AsInstanceOf(Variable(id), cct), vid.id)
+          fieldId -> caseClassSelector(cct, asInstOf(Variable(id), cct), vid.id)
         }
       }
 
@@ -73,7 +70,7 @@ case object EquivalentInputs extends NormalizingRule("EquivalentInputs") {
 
     // We could discover one equivalence, which could allow us to discover
     // other equivalences: We do a fixpoint with limit 5.
-    val simplifiedPath = fixpoint({ (path: Path) => discoverEquivalences(path) }, 5)(p.pc)
+    val newPC = fixpoint({ (path: Path) => discoverEquivalences(path) }, 5)(p.pc)
 
     if (subst.nonEmpty) {
       // XXX: must take place in this order!! obsolete & free is typically non-empty
@@ -88,10 +85,12 @@ case object EquivalentInputs extends NormalizingRule("EquivalentInputs") {
         })
       }
 
+      val simplifier = Simplifiers.bestEffort(hctx, hctx.program)(_:Expr, newPC)
+
       val sub = p.copy(
         as = newAs,
         ws = replaceFromIDs(subst, p.ws),
-        pc = simplifiedPath,
+        pc = newPC,
         phi = simplifier(replaceFromIDs(subst, p.phi)),
         eb = newBank
       )
-- 
GitLab