unsigned QuickXPlain::selectUnsatCore(unsigned low, unsigned high, std::vector<TNode>& conflict) { Assert(!d_solver->getConflict().isNull() && d_solver->inConflict()); Node query_confl = d_solver->getConflict(); // conflict wasn't actually minimized if (query_confl.getNumChildren() == high - low + 1) { return high; } TNodeSet nodes; for (unsigned i = low; i <= high; i++) { nodes.insert(conflict[i]); } unsigned write = low; for (unsigned i = 0; i < query_confl.getNumChildren(); ++i) { TNode current = query_confl[i]; // the conflict can have nodes in lower decision levels if (nodes.find(current) != nodes.end()) { conflict[write++] = current; nodes.erase(nodes.find(current)); } } // if all of the nodes in the conflict were on a lower level if (write == low) { return low; } Assert (write != 0); unsigned new_high = write - 1; for (TNodeSet::const_iterator it = nodes.begin(); it != nodes.end(); ++it) { conflict[write++] = *it; } Assert (write -1 == high); Assert (new_high <= high); return new_high; }