diff --git a/src/main/scala/leon/purescala/Constructors.scala b/src/main/scala/leon/purescala/Constructors.scala index 11ad9577c636a2c011f577d922e5e3ec7db69078..98223ecceb30e6dcff1d30ce2a15ec0a2f7d3750 100644 --- a/src/main/scala/leon/purescala/Constructors.scala +++ b/src/main/scala/leon/purescala/Constructors.scala @@ -224,20 +224,6 @@ object Constructors { Lambda(args, body) } - def application(fn: Expr, realArgs: Seq[Expr]) = fn match { - case Lambda(formalArgs, body) => - val (inline, notInline) = formalArgs.map{_.id}.zip(realArgs).partition { - case (form, _) => count{ - case Variable(`form`) => 1 - case _ => 0 - }(body) <= 1 - } - val newBody = replaceFromIDs(inline.toMap, body) - val (ids, es) = notInline.unzip - letTuple(ids, tupleWrap(es), newBody) - case _ => Application(fn, realArgs) - } - def equality(a: Expr, b: Expr) = { if (a == b && isDeterministic(a)) { BooleanLiteral(true) @@ -246,6 +232,26 @@ object Constructors { } } + def application(fn: Expr, realArgs: Seq[Expr]) = fn match { + case Lambda(formalArgs, body) => + var defs: Seq[(Identifier, Expr)] = Seq() + + val subst = formalArgs.zip(realArgs).map { + case (ValDef(from, _), to:Variable) => + from -> to + case (ValDef(from, _), e) => + val fresh = from.freshen + defs :+= (fresh -> e) + from -> Variable(fresh) + }.toMap + + val (ids, bds) = defs.unzip + + letTuple(ids, tupleWrap(bds), replaceFromIDs(subst, body)) + case _ => + Application(fn, realArgs) + } + def plus(lhs: Expr, rhs: Expr): Expr = (lhs, rhs) match { case (InfiniteIntegerLiteral(bi), _) if bi == 0 => rhs case (_, InfiniteIntegerLiteral(bi)) if bi == 0 => lhs