diff --git a/src/main/scala/leon/termination/ChainBuilder.scala b/src/main/scala/leon/termination/ChainBuilder.scala index ce048806859c2ca342193884096e47ed56edcc8f..f5bd3b78e92e6a870212210d07f64fd60811e927 100644 --- a/src/main/scala/leon/termination/ChainBuilder.scala +++ b/src/main/scala/leon/termination/ChainBuilder.scala @@ -50,14 +50,19 @@ final case class Chain(relations: List[Relation]) { def loop(initialArgs: Seq[Identifier] = Seq.empty, finalArgs: Seq[Identifier] = Seq.empty): Seq[Expr] = { def rec(relations: List[Relation], funDef: TypedFunDef, subst: Map[Identifier, Identifier]): Seq[Expr] = { + val Relation(_, path, FunctionInvocation(fitfd, args), _) = relations.head + val tfd = TypedFunDef(fitfd.fd, fitfd.tps.map(funDef.translated)) + val translate : Expr => Expr = { - val map : Map[Expr, Expr] = subst.map(p => p._1.toVariable -> p._2.toVariable) + val free : Set[Identifier] = path.flatMap(variablesOf).toSet -- funDef.fd.params.map(_.id) + val freeMapping : Map[Identifier,Identifier] = free.map(id => id -> { + FreshIdentifier(id.name, funDef.translated(id.getType), true).copiedFrom(id) + }).toMap + + val map : Map[Expr, Expr] = (subst ++ freeMapping).map(p => p._1.toVariable -> p._2.toVariable) (e: Expr) => replace(map, funDef.translated(e)) } - val Relation(_, path, FunctionInvocation(fitfd, args), _) = relations.head - val tfd = TypedFunDef(fitfd.fd, fitfd.tps.map(funDef.translated)) - lazy val newArgs = args.map(translate) path.map(translate) ++ (relations.tail match {