From 12154513488e8978060b674ab60f76c4fffd77ce Mon Sep 17 00:00:00 2001 From: Etienne Kneuss <colder@php.net> Date: Tue, 26 Aug 2014 10:37:30 +0200 Subject: [PATCH] Fix issues with phantom variables showing up in synthesis. Previously if the choose was in the following context: ``` a match { case Cons(h, t) => case _ => choose() } ``` its path condition would include: ``` !(a.isInstanceOf[Cons] && a.head == h && a.tail == t) ``` which causes mostly unconstrained variables `h` and `t` to show up in the synthesis problem. --- src/main/scala/leon/purescala/TransformerWithPC.scala | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/scala/leon/purescala/TransformerWithPC.scala b/src/main/scala/leon/purescala/TransformerWithPC.scala index a3655aaa1..9c6b4cad8 100644 --- a/src/main/scala/leon/purescala/TransformerWithPC.scala +++ b/src/main/scala/leon/purescala/TransformerWithPC.scala @@ -26,10 +26,11 @@ abstract class TransformerWithPC extends Transformer { var soFar = path MatchExpr(rs, cases.map { c => - val patternExpr = conditionForPattern(rs, c.pattern, includeBinders = true) + val patternExprPos = conditionForPattern(rs, c.pattern, includeBinders = true) + val patternExprNeg = conditionForPattern(rs, c.pattern, includeBinders = false) - val subPath = register(patternExpr, soFar) - soFar = register(Not(patternExpr), soFar) + val subPath = register(patternExprPos, soFar) + soFar = register(Not(patternExprNeg), soFar) c match { case SimpleCase(p, rhs) => -- GitLab