private ProverFun procedure2ProverExpr(BoogieProcedure proc) { HashMap<Variable, ProverExpr> localbound = new HashMap<Variable, ProverExpr>(); if (!usedFunctions.containsKey(proc)) { LinkedList<ProverType> args = new LinkedList<ProverType>(); int idx = 0; for (Variable v : proc.getParameterList()) { ProverExpr arg = theoremProver.mkBoundVariable(idx++, type2ProverSort(v.getType())); args.add(arg.getType()); localbound.put(v, arg); } ProverFun vcf = null; ProverType[] arr = args.toArray(new ProverType[args.size()]); if (proc.isPure() && proc.getRootBlock() != null && proc.getRootBlock().getStatements().size() == 1) { // TODO: this is a hack: // we assume that this case only occurs for prelude functions // which have only one statement // this will not work in any other case Statement stmt = proc.getRootBlock().getStatements().get(0); ProverExpr b = null; if (stmt instanceof ExpressionStatement) { ExpressionStatement es = (ExpressionStatement) stmt; b = expression2ProverExpr(es.getExpression(), localbound); } else { throw new RuntimeException("procedure2ProverExpr failed"); } vcf = theoremProver.mkDefinedFunction(getProverFriendlyName(proc.getName()), arr, b); } else { vcf = theoremProver.mkUnintFunction( getProverFriendlyName(proc.getName()), arr, type2ProverSort(proc.getReturnVariable().getType())); // TODO: uninterpreted functions? } usedFunctions.put(proc, vcf); } return usedFunctions.get(proc); }
// TODO fix BoogieHelperFunctions s.t. we can remove qual_name and // returntype because they are already in proc public InvokeExpression(BoogieProcedure proc, LinkedList<Expression> args) { invokedProcedure = proc; qualifiedName = proc.getName(); if (proc.getReturnVariable() != null) { returnType = proc.getReturnVariable().getType(); } else { returnType = BoogieBaseTypes.getVoidType(); } arguments = args; }