Node ITESimplifier::simpConstants(TNode simpContext, TNode iteNode, TNode simpVar) { NodePairMap::iterator it; it = d_simpConstCache.find(pair<Node, Node>(simpContext,iteNode)); if (it != d_simpConstCache.end()) { return (*it).second; } if (iteNode.getKind() == kind::ITE) { NodeBuilder<> builder(kind::ITE); builder << iteNode[0]; unsigned i = 1; for (; i < iteNode.getNumChildren(); ++ i) { Node n = simpConstants(simpContext, iteNode[i], simpVar); if (n.isNull()) { return n; } builder << n; } // Mark the substitution and continue Node result = builder; result = Rewriter::rewrite(result); d_simpConstCache[pair<Node, Node>(simpContext, iteNode)] = result; return result; } if (!containsTermITE(iteNode)) { Node n = Rewriter::rewrite(simpContext.substitute(simpVar, iteNode)); d_simpConstCache[pair<Node, Node>(simpContext, iteNode)] = n; return n; } Node iteNode2; Node simpVar2; d_simpContextCache.clear(); Node simpContext2 = createSimpContext(iteNode, iteNode2, simpVar2); if (!simpContext2.isNull()) { Assert(!iteNode2.isNull()); simpContext2 = simpContext.substitute(simpVar, simpContext2); Node n = simpConstants(simpContext2, iteNode2, simpVar2); if (n.isNull()) { return n; } d_simpConstCache[pair<Node, Node>(simpContext, iteNode)] = n; return n; } return Node(); }