diff --git a/src/main/scala/leon/codegen/CodeGeneration.scala b/src/main/scala/leon/codegen/CodeGeneration.scala index a616a1a0b77f3a36f35e3ebba4624e5f9ccb35a8..33975a011737d50a45d1511b108d4a2025208eb7 100644 --- a/src/main/scala/leon/codegen/CodeGeneration.scala +++ b/src/main/scala/leon/codegen/CodeGeneration.scala @@ -183,7 +183,7 @@ trait CodeGeneration { // An offset we introduce to the parameters: // 1 if this is a method, so we need "this" in position 0 of the stack // 1 if we are monitoring - val idParams = (if (requireMonitor) Seq(monitorID) else Seq.empty) ++ funDef.params.map(_.id) + val idParams = (if (requireMonitor) Seq(monitorID) else Seq.empty) ++ funDef.paramIds val newMapping = idParams.zipWithIndex.toMap.mapValues(_ + (if (!isStatic) 1 else 0)) val body = funDef.body.getOrElse(throw CompilationException("Can't compile a FunDef without body: "+funDef.id.name)) diff --git a/src/main/scala/leon/purescala/Definitions.scala b/src/main/scala/leon/purescala/Definitions.scala index 6467226a0a788866891cad6ec183a89569bc5a66..ba6b11bcf49398e4a9ff1456aa4d7bffc734d2a8 100644 --- a/src/main/scala/leon/purescala/Definitions.scala +++ b/src/main/scala/leon/purescala/Definitions.scala @@ -483,7 +483,7 @@ object Definitions { def paramSubst(realArgs: Seq[Expr]) = { require(realArgs.size == params.size) - (params map { _.id } zip realArgs).toMap + (paramIds zip realArgs).toMap } def withParamSubst(realArgs: Seq[Expr], e: Expr) = { @@ -522,6 +522,8 @@ object Definitions { lazy val returnType: TypeTree = translated(fd.returnType) + lazy val paramIds = params map { _.id } + private var trCache = Map[Expr, Expr]() private def cached(e: Expr): Expr = { diff --git a/src/main/scala/leon/purescala/ExprOps.scala b/src/main/scala/leon/purescala/ExprOps.scala index 30999a647dc613a959ce8a3d95f2cf491bae24df..2f703312a0f1e064ed9af3d1f6f094d5d6f96bbc 100644 --- a/src/main/scala/leon/purescala/ExprOps.scala +++ b/src/main/scala/leon/purescala/ExprOps.scala @@ -513,7 +513,7 @@ object ExprOps { (expr, idSeqs) => idSeqs.foldLeft(expr match { case Lambda(args, _) => args.map(_.id) case Forall(args, _) => args.map(_.id) - case LetDef(fd, _) => fd.params.map(_.id) + case LetDef(fd, _) => fd.paramIds case Let(i, _, _) => Seq(i) case MatchExpr(_, cses) => cses.flatMap(_.pattern.binders) case Passes(_, _, cses) => cses.flatMap(_.pattern.binders) @@ -1511,7 +1511,7 @@ object ExprOps { (fd1.params.size == fd2.params.size) && { val newMap = map + (fd1.id -> fd2.id) ++ - (fd1.params zip fd2.params).map{ case (vd1, vd2) => (vd1.id, vd2.id) } + (fd1.paramIds zip fd2.paramIds) isHomo(fd1.fullBody, fd2.fullBody)(newMap) } } @@ -1777,14 +1777,14 @@ object ExprOps { def flattenFunctions(fdOuter: FunDef, ctx: LeonContext, p: Program): FunDef = { fdOuter.body match { case Some(LetDef(fdInner, FunctionInvocation(tfdInner2, args))) if fdInner == tfdInner2.fd => - val argsDef = fdOuter.params.map(_.id) + val argsDef = fdOuter.paramIds val argsCall = args.collect { case Variable(id) => id } if (argsDef.toSet == argsCall.toSet) { val defMap = argsDef.zipWithIndex.toMap val rewriteMap = argsCall.map(defMap) - val innerIdsToOuterIds = (fdInner.params.map(_.id) zip argsCall).toMap + val innerIdsToOuterIds = (fdInner.paramIds zip argsCall).toMap def pre(e: Expr) = e match { case FunctionInvocation(tfd, args) if tfd.fd == fdInner => diff --git a/src/main/scala/leon/purescala/Quantification.scala b/src/main/scala/leon/purescala/Quantification.scala index 1214af2aa9526abf1f7adb9b875d7829fd2720cf..38fa0ae9f81190096aa4f19cbd5a5a988dbfb249 100644 --- a/src/main/scala/leon/purescala/Quantification.scala +++ b/src/main/scala/leon/purescala/Quantification.scala @@ -108,7 +108,7 @@ object Quantification { case _ => Set.empty } (fd.fullBody) - val free = fd.params.map(_.id).toSet ++ (fd.postcondition match { + val free = fd.paramIds.toSet ++ (fd.postcondition match { case Some(Lambda(args, _)) => args.map(_.id) case _ => Seq.empty }) diff --git a/src/main/scala/leon/repair/Repairman.scala b/src/main/scala/leon/repair/Repairman.scala index 47dc7abac071490e5d9408512413c80d23050185..e5a1eaafe1a73c439a846d0c344e489924edf6eb 100644 --- a/src/main/scala/leon/repair/Repairman.scala +++ b/src/main/scala/leon/repair/Repairman.scala @@ -180,7 +180,7 @@ class Repairman(ctx0: LeonContext, initProgram: Program, fd: FunDef, verifTimeou val vrs = report.vrs vrs.collect { case (_, VCResult(VCStatus.Invalid(ex), _, _)) => - InExample(fd.params.map{vd => ex(vd.id)}) + InExample(fd.paramIds map ex) } } finally { solverf.shutdown() @@ -203,7 +203,7 @@ class Repairman(ctx0: LeonContext, initProgram: Program, fd: FunDef, verifTimeou case None => _ => true case Some(pre) => - val argIds = fd.params.map(_.id) + val argIds = fd.paramIds evaluator.compile(pre, argIds) match { case Some(evalFun) => val sat = EvaluationResults.Successful(BooleanLiteral(true)); diff --git a/src/main/scala/leon/solvers/smtlib/SMTLIBQuantifiedSolver.scala b/src/main/scala/leon/solvers/smtlib/SMTLIBQuantifiedSolver.scala index ba0187239bbd71e75cc656928fa451fa308b809c..bfcb706689062da6659b882c3672bd0e9088d4cd 100644 --- a/src/main/scala/leon/solvers/smtlib/SMTLIBQuantifiedSolver.scala +++ b/src/main/scala/leon/solvers/smtlib/SMTLIBQuantifiedSolver.scala @@ -21,7 +21,7 @@ trait SMTLIBQuantifiedSolver { // Normally, UnrollingSolver tracks the input variable, but this one // is invoked alone so we have to filter them here override def getModel: Model = { - val filter = currentFunDef.map{ _.params.map{_.id}.toSet }.getOrElse( (_:Identifier) => true ) + val filter = currentFunDef.map{ _.paramIds.toSet }.getOrElse( (_:Identifier) => true ) getModel(filter) } diff --git a/src/main/scala/leon/solvers/smtlib/SMTLIBQuantifiedTarget.scala b/src/main/scala/leon/solvers/smtlib/SMTLIBQuantifiedTarget.scala index b6d6fbfb313a15deb9030424da48ba56a65c4524..d49e3316716ae2277af5ea35c6115d076e7029bd 100644 --- a/src/main/scala/leon/solvers/smtlib/SMTLIBQuantifiedTarget.scala +++ b/src/main/scala/leon/solvers/smtlib/SMTLIBQuantifiedTarget.scala @@ -30,7 +30,7 @@ trait SMTLIBQuantifiedTarget extends SMTLIBTarget { val inductiveHyps = for { fi@FunctionInvocation(tfd, args) <- functionCallsOf(cond).toSeq } yield { - val formalToRealArgs = tfd.params.map{ _.id}.zip(args).toMap + val formalToRealArgs = tfd.paramIds.zip(args).toMap val post = tfd.postcondition map { post => application( replaceFromIDs(formalToRealArgs, post), diff --git a/src/main/scala/leon/solvers/smtlib/SMTLIBZ3QuantifiedTarget.scala b/src/main/scala/leon/solvers/smtlib/SMTLIBZ3QuantifiedTarget.scala index 4c8eedce5fb981ff037349eba6b0f6e69d595e88..f3c7cb69e83490f25c6b8dec79d082cb6f8f2c75 100644 --- a/src/main/scala/leon/solvers/smtlib/SMTLIBZ3QuantifiedTarget.scala +++ b/src/main/scala/leon/solvers/smtlib/SMTLIBZ3QuantifiedTarget.scala @@ -37,7 +37,7 @@ trait SMTLIBZ3QuantifiedTarget extends SMTLIBZ3Target with SMTLIBQuantifiedTarge val tfd = functions.toA(sym) val term = quantifiedTerm( SMTForall, - tfd.params map { _.id }, + tfd.paramIds, Equals( FunctionInvocation(tfd, tfd.params.map {_.toVariable}), tfd.body.get diff --git a/src/main/scala/leon/solvers/templates/TemplateGenerator.scala b/src/main/scala/leon/solvers/templates/TemplateGenerator.scala index 5c746db2f7377d2900afcba807febbeda0e85e62..f6484ff7be0152f316d8cf911c56a94320fade5a 100644 --- a/src/main/scala/leon/solvers/templates/TemplateGenerator.scala +++ b/src/main/scala/leon/solvers/templates/TemplateGenerator.scala @@ -44,7 +44,7 @@ class TemplateGenerator[T](val encoder: TemplateEncoder[T], val newBody : Option[Expr] = tfd.body.map(b => matchToIfThenElse(b)) val lambdaBody : Option[Expr] = newBody.map(b => simplifyHOFunctions(b)) - val funDefArgs: Seq[Identifier] = tfd.params.map(_.id) + val funDefArgs: Seq[Identifier] = tfd.paramIds val lambdaArguments: Seq[Identifier] = lambdaBody.map(lambdaArgs).toSeq.flatten val invocation : Expr = FunctionInvocation(tfd, funDefArgs.map(_.toVariable))