This PR makes most methods of the TheoryInferenceManager expect an InferenceId.
All classes that inherit from TheoryInferenceManager are adapted accordingly and InferenceIds are passed everywhere.
In some cases, there are no appropriate InferenceIds yet. We use InferenceId::UNKNOWN for the time being and introduce proper values in future PRs.
The InferenceIds are not yet used, but will be used for statistics and debug output.
// tn is of kind REWRITE, turn this into a LEMMA here
TrustNode tlem = TrustNode::mkTrustLemma(tn.getProven(), tn.getGenerator());
// must preprocess
- d_im.trustedLemma(tlem);
+ d_im.trustedLemma(tlem, InferenceId::UNKNOWN);
// mark the atom as reduced
d_reduced[atom] = true;
return true;
std::vector<Node> args;
// convert to proof rule application
convert(id, fact, reason, children, args);
- return assertInternalFact(atom, polarity, id, children, args);
+ return assertInternalFact(atom, polarity, InferenceId::UNKNOWN, id, children, args);
}
- return assertInternalFact(atom, polarity, reason);
+ return assertInternalFact(atom, polarity, InferenceId::UNKNOWN, reason);
}
bool InferenceManager::arrayLemma(
convert(id, conc, exp, children, args);
// make the trusted lemma based on the eager proof generator and send
TrustNode tlem = d_lemmaPg->mkTrustNode(conc, id, children, args);
- return trustedLemma(tlem, p, doCache);
+ return trustedLemma(tlem, InferenceId::UNKNOWN, p, doCache);
}
// send lemma without proofs
Node lem = nm->mkNode(IMPLIES, exp, conc);
- return lemma(lem, p, doCache);
+ return lemma(lem, InferenceId::UNKNOWN, p, doCache);
}
void InferenceManager::convert(PfRule& id,
if (asLemma)
{
TrustNode trustedLemma = TrustNode::mkTrustLemma(lemma, nullptr);
- im->trustedLemma(trustedLemma);
+ im->trustedLemma(trustedLemma, getId());
}
else
{
{
Node n = pair.first.eqNode(pair.second);
TrustNode trustedLemma = TrustNode::mkTrustLemma(n, nullptr);
- im->trustedLemma(trustedLemma);
+ im->trustedLemma(trustedLemma, getId());
}
Trace("bags::InferInfo::process") << (*this) << std::endl;
lemmab << d_cnf->getNode(clause[i]);
}
Node lemma = lemmab;
- d_bv->d_inferManager.lemma(lemma);
+ d_bv->d_inferManager.lemma(lemma, InferenceId::UNKNOWN);
} else {
- d_bv->d_inferManager.lemma(d_cnf->getNode(clause[0]));
+ d_bv->d_inferManager.lemma(d_cnf->getNode(clause[0]), InferenceId::UNKNOWN);
}
}
}
NodeManager* nm = NodeManager::currentNM();
- d_inferManager.conflict(nm->mkAnd(conflict));
+ d_inferManager.conflict(nm->mkAnd(conflict), InferenceId::UNKNOWN);
}
}
{
Debug("bitvector") << indent() << "BVSolverLazy::check(): conflict "
<< d_conflictNode << std::endl;
- d_inferManager.conflict(d_conflictNode);
+ d_inferManager.conflict(d_conflictNode, InferenceId::UNKNOWN);
d_statistics.d_avgConflictSize.addEntry(d_conflictNode.getNumChildren());
d_conflictNode = Node::null();
}
{
if (assertions.size() == 1)
{
- d_inferManager.conflict(assertions[0]);
+ d_inferManager.conflict(assertions[0], InferenceId::UNKNOWN);
return;
}
Node conflict = utils::mkAnd(assertions);
- d_inferManager.conflict(conflict);
+ d_inferManager.conflict(conflict, InferenceId::UNKNOWN);
return;
}
return;
void lemma(TNode node)
{
- d_inferManager.lemma(node);
+ d_inferManager.lemma(node, InferenceId::UNKNOWN);
d_lemmasAdded = true;
}
if (d_epg == nullptr)
{
- d_inferManager.lemma(lemma);
+ d_inferManager.lemma(lemma, InferenceId::UNKNOWN);
}
else
{
TrustNode tlem = d_epg->mkTrustNode(lemma, PfRule::BV_BITBLAST, {}, {fact});
- d_inferManager.trustedLemma(tlem);
+ d_inferManager.trustedLemma(tlem, InferenceId::UNKNOWN);
}
}
if (d_epg == nullptr)
{
- d_inferManager.lemma(lemma);
+ d_inferManager.lemma(lemma, InferenceId::UNKNOWN);
}
else
{
TrustNode tlem =
d_epg->mkTrustNode(lemma, PfRule::BV_EAGER_ATOM, {}, {fact});
- d_inferManager.trustedLemma(tlem);
+ d_inferManager.trustedLemma(tlem, InferenceId::UNKNOWN);
}
std::unordered_set<Node, NodeHashFunction> bv_atoms;
nm->mkNode(kind::LT, n, max));
Trace("bv-extf-lemma")
<< "BV extf lemma (range) : " << lem << std::endl;
- d_bv->d_inferManager.lemma(lem);
+ d_bv->d_inferManager.lemma(lem, InferenceId::UNKNOWN);
sentLemma = true;
}
}
// (bv2nat ((_ int2bv w) x)) == x + k*2^w for some k
Trace("bv-extf-lemma")
<< "BV extf lemma (collapse) : " << lem << std::endl;
- d_bv->d_inferManager.lemma(lem);
+ d_bv->d_inferManager.lemma(lem, InferenceId::UNKNOWN);
sentLemma = true;
}
}
return;
}
// otherwise send as a normal lemma
- if (lemma(lem, p, doCache))
+ if (lemma(lem, id, p, doCache))
{
d_inferenceLemmas << id;
}
Node exp = NodeManager::currentNM()->mkAnd(conf);
prepareDtInference(d_false, exp, id, d_ipc.get());
}
- conflictExp(conf, d_ipc.get());
+ conflictExp(id, conf, d_ipc.get());
d_inferenceConflicts << id;
}
bool ret = false;
for (const Node& lem : lemmas)
{
- if (lemma(lem))
+ if (lemma(lem, InferenceId::UNKNOWN))
{
ret = true;
}
}
// use trusted lemma
TrustNode tlem = TrustNode::mkTrustLemma(lem, d_lemPg.get());
- if (!trustedLemma(tlem))
+ if (!trustedLemma(tlem, id))
{
Trace("dt-lemma-debug") << "...duplicate lemma" << std::endl;
return false;
{
expv.push_back(exp);
}
- assertInternalFact(atom, polarity, expv, d_ipc.get());
+ assertInternalFact(atom, polarity, id, expv, d_ipc.get());
}
else
{
// use version without proofs
- assertInternalFact(atom, polarity, exp);
+ assertInternalFact(atom, polarity, id, exp);
}
d_inferenceFacts << id;
return true;
assumptions.push_back(assumption);
Node lemma = assumptions.size()==1 ? assumptions[0] : NodeManager::currentNM()->mkNode( OR, assumptions );
Trace("dt-singleton") << "*************Singleton equality lemma " << lemma << std::endl;
- d_im.lemma(lemma);
+ d_im.lemma(lemma, InferenceId::UNKNOWN);
}
}
}else{
NodeBuilder<> nb(kind::OR);
nb << test << test.notNode();
Node lemma = nb;
- d_im.lemma(lemma);
+ d_im.lemma(lemma, InferenceId::UNKNOWN);
d_out->requirePhase( test, true );
}else{
Trace("dt-split") << "*************Split for constructors on " << n << endl;
Node v2 = NodeManager::currentNM()->mkSkolem( "k2", tn );
a = v1.eqNode( v2 ).negate();
//send out immediately as lemma
- d_im.lemma(a);
+ d_im.lemma(a, InferenceId::UNKNOWN);
Trace("dt-singleton") << "******** assert " << a << " to avoid singleton cardinality for type " << tn << std::endl;
}
d_singleton_lemma[index][tn] = a;
if( conc==d_false ){
Trace("sep-lemma") << "Sep::Conflict: " << ant << " by " << c
<< std::endl;
- d_im.conflictExp(ant, nullptr);
+ d_im.conflictExp(InferenceId::UNKNOWN, ant, nullptr);
}else{
Trace("sep-lemma") << "Sep::Lemma: " << conc << " from " << ant
<< " by " << c << std::endl;
if (fact == d_false)
{
Trace("sets-lemma") << "Conflict : " << exp << std::endl;
- conflict(exp);
+ conflict(exp, InferenceId::UNKNOWN);
return true;
}
return false;
|| (atom.getKind() == EQUAL && atom[0].getType().isSet()))
{
// send to equality engine
- if (assertInternalFact(atom, polarity, exp))
+ if (assertInternalFact(atom, polarity, InferenceId::UNKNOWN, exp))
{
// return true if this wasn't redundant
return true;
n = Rewriter::rewrite(n);
Node lem = NodeManager::currentNM()->mkNode(OR, n, n.negate());
// send the lemma
- lemma(lem);
+ lemma(lem, InferenceId::UNKNOWN);
Trace("sets-lemma") << "Sets::Lemma split : " << lem << std::endl;
if (reqPol != 0)
{
d_proxy_to_term[k] = n;
Node eq = k.eqNode(n);
Trace("sets-lemma") << "Sets::Lemma : " << eq << " by proxy" << std::endl;
- d_im.lemma(eq, LemmaProperty::NONE, false);
+ d_im.lemma(eq, InferenceId::UNKNOWN, LemmaProperty::NONE, false);
if (nk == SINGLETON)
{
Node slem = nm->mkNode(MEMBER, n[0], k);
Trace("sets-lemma") << "Sets::Lemma : " << slem << " by singleton"
<< std::endl;
- d_im.lemma(slem, LemmaProperty::NONE, false);
+ d_im.lemma(slem, InferenceId::UNKNOWN, LemmaProperty::NONE, false);
}
return k;
}
Node ulem = nm->mkNode(SUBSET, n1, n2);
Trace("sets-lemma") << "Sets::Lemma : " << ulem << " by univ-type"
<< std::endl;
- d_im.lemma(ulem, LemmaProperty::NONE, false);
+ d_im.lemma(ulem, InferenceId::UNKNOWN, LemmaProperty::NONE, false);
}
}
d_univset[tn] = n;
// infer equality between elements of singleton
Node exp = s1.eqNode(s2);
Node eq = s1[0].eqNode(s2[0]);
- d_im.assertInternalFact(eq, true, exp);
+ d_im.assertInternalFact(eq, true, InferenceId::UNKNOWN, exp);
}
else
{
Assert(facts.size() == 1);
Trace("sets-prop") << "Propagate eq-mem conflict : " << facts[0]
<< std::endl;
- d_im.conflict(facts[0]);
+ d_im.conflict(facts[0], InferenceId::UNKNOWN);
return;
}
for (const Node& f : facts)
Assert(f.getKind() == kind::IMPLIES);
Trace("sets-prop") << "Propagate eq-mem eq inference : " << f[0] << " => "
<< f[1] << std::endl;
- d_im.assertInternalFact(f[1], true, f[0]);
+ d_im.assertInternalFact(f[1], true, InferenceId::UNKNOWN, f[0]);
}
}
}
nm->mkNode(FORALL, nm->mkNode(BOUND_VAR_LIST, v), body.eqNode(mem));
Trace("sets-comprehension")
<< "Comprehension reduction: " << lem << std::endl;
- d_im.lemma(lem);
+ d_im.lemma(lem, InferenceId::UNKNOWN);
}
}
Trace("sets-prop") << "Propagate mem-eq : " << pexp << std::endl;
Node eq = s[0].eqNode(atom[0]);
// triggers an internal inference
- d_im.assertInternalFact(eq, true, pexp);
+ d_im.assertInternalFact(eq, true, InferenceId::UNKNOWN, pexp);
}
}
else
{
Trace("sets-prop")
<< "Propagate mem-eq conflict : " << pexp << std::endl;
- d_im.conflict(pexp);
+ d_im.conflict(pexp, InferenceId::UNKNOWN);
}
}
}
Trace("strings-assert") << "(assert (not " << tconf.getNode()
<< ")) ; conflict " << ii.getId() << std::endl;
// send the trusted conflict
- trustedConflict(tconf);
+ trustedConflict(tconf, ii.getId());
}
bool InferenceManager::processFact(InferInfo& ii)
// current SAT context
d_ipc->notifyFact(ii);
// now, assert the internal fact with d_ipc as proof generator
- curRet = assertInternalFact(atom, polarity, exp, d_ipc.get());
+ curRet = assertInternalFact(atom, polarity, ii.getId(), exp, d_ipc.get());
}
else
{
Node cexp = utils::mkAnd(exp);
// without proof generator
- curRet = assertInternalFact(atom, polarity, cexp);
+ curRet = assertInternalFact(atom, polarity, ii.getId(), cexp);
}
ret = ret || curRet;
// may be in conflict
++(d_statistics.d_lemmasInfer);
// call the trusted lemma, without caching
- return trustedLemma(tlem, p, false);
+ return trustedLemma(tlem, ii.getId(), p, false);
}
} // namespace strings
Assert(!d_node.isNull());
Assert(asLemma);
// send (trusted) lemma on the output channel with property p
- return im->trustedLemma(TrustNode::mkTrustLemma(d_node, d_pg), d_property);
+ return im->trustedLemma(TrustNode::mkTrustLemma(d_node, d_pg), getId(), d_property);
}
SimpleTheoryInternalFact::SimpleTheoryInternalFact(InferenceId id,
Assert(atom.getKind() != NOT && atom.getKind() != AND);
if (d_pg != nullptr)
{
- im->assertInternalFact(atom, polarity, {d_exp}, d_pg);
+ im->assertInternalFact(atom, polarity, getId(), {d_exp}, d_pg);
}
else
{
- im->assertInternalFact(atom, polarity, d_exp);
+ im->assertInternalFact(atom, polarity, getId(), d_exp);
}
return true;
}
}
}
-void TheoryInferenceManager::conflict(TNode conf)
+void TheoryInferenceManager::conflict(TNode conf, InferenceId id)
{
if (!d_theoryState.isInConflict())
{
}
}
-void TheoryInferenceManager::trustedConflict(TrustNode tconf)
+void TheoryInferenceManager::trustedConflict(TrustNode tconf, InferenceId id)
{
if (!d_theoryState.isInConflict())
{
}
}
-void TheoryInferenceManager::conflictExp(PfRule id,
+void TheoryInferenceManager::conflictExp(InferenceId id,
+ PfRule pfr,
const std::vector<Node>& exp,
const std::vector<Node>& args)
{
if (!d_theoryState.isInConflict())
{
// make the trust node
- TrustNode tconf = mkConflictExp(id, exp, args);
+ TrustNode tconf = mkConflictExp(pfr, exp, args);
// send it on the output channel
- trustedConflict(tconf);
+ trustedConflict(tconf, id);
}
}
return TrustNode::mkTrustConflict(conf, nullptr);
}
-void TheoryInferenceManager::conflictExp(const std::vector<Node>& exp,
+void TheoryInferenceManager::conflictExp(InferenceId id,
+ const std::vector<Node>& exp,
ProofGenerator* pg)
{
if (!d_theoryState.isInConflict())
// make the trust node
TrustNode tconf = mkConflictExp(exp, pg);
// send it on the output channel
- trustedConflict(tconf);
+ trustedConflict(tconf, id);
}
}
<< " mkTrustedConflictEqConstantMerge";
}
-bool TheoryInferenceManager::lemma(TNode lem, LemmaProperty p, bool doCache)
+bool TheoryInferenceManager::lemma(TNode lem,
+ InferenceId id,
+ LemmaProperty p,
+ bool doCache)
{
TrustNode tlem = TrustNode::mkTrustLemma(lem, nullptr);
- return trustedLemma(tlem, p, doCache);
+ return trustedLemma(tlem, id, p, doCache);
}
bool TheoryInferenceManager::trustedLemma(const TrustNode& tlem,
+ InferenceId id,
LemmaProperty p,
bool doCache)
{
}
bool TheoryInferenceManager::lemmaExp(Node conc,
- PfRule id,
+ InferenceId id,
+ PfRule pfr,
const std::vector<Node>& exp,
const std::vector<Node>& noExplain,
const std::vector<Node>& args,
bool doCache)
{
// make the trust node
- TrustNode trn = mkLemmaExp(conc, id, exp, noExplain, args);
+ TrustNode trn = mkLemmaExp(conc, pfr, exp, noExplain, args);
// send it on the output channel
- return trustedLemma(trn, p, doCache);
+ return trustedLemma(trn, id, p, doCache);
}
TrustNode TheoryInferenceManager::mkLemmaExp(Node conc,
}
bool TheoryInferenceManager::lemmaExp(Node conc,
+ InferenceId id,
const std::vector<Node>& exp,
const std::vector<Node>& noExplain,
ProofGenerator* pg,
// make the trust node
TrustNode trn = mkLemmaExp(conc, exp, noExplain, pg);
// send it on the output channel
- return trustedLemma(trn, p, doCache);
+ return trustedLemma(trn, id, p, doCache);
}
TrustNode TheoryInferenceManager::mkLemmaExp(Node conc,
return d_numCurrentLemmas != 0;
}
-bool TheoryInferenceManager::assertInternalFact(TNode atom, bool pol, TNode exp)
+bool TheoryInferenceManager::assertInternalFact(TNode atom,
+ bool pol,
+ InferenceId id,
+ TNode exp)
{
return processInternalFact(atom, pol, PfRule::UNKNOWN, {exp}, {}, nullptr);
}
bool TheoryInferenceManager::assertInternalFact(TNode atom,
bool pol,
- PfRule id,
+ InferenceId id,
+ PfRule pfr,
const std::vector<Node>& exp,
const std::vector<Node>& args)
{
- Assert(id != PfRule::UNKNOWN);
- return processInternalFact(atom, pol, id, exp, args, nullptr);
+ Assert(pfr != PfRule::UNKNOWN);
+ return processInternalFact(atom, pol, pfr, exp, args, nullptr);
}
bool TheoryInferenceManager::assertInternalFact(TNode atom,
bool pol,
+ InferenceId id,
const std::vector<Node>& exp,
ProofGenerator* pg)
{
* Raise conflict conf (of any form), without proofs. This method should
* only be called if there is not yet proof support in the given theory.
*/
- void conflict(TNode conf);
+ void conflict(TNode conf, InferenceId id);
/**
* Raise trusted conflict tconf (of any form) where a proof generator has
* been provided (as part of the trust node) in a custom way.
*/
- void trustedConflict(TrustNode tconf);
+ void trustedConflict(TrustNode tconf, InferenceId id);
/**
* Explain and send conflict from contradictory facts. This method is called
* when the proof rule id with premises exp and arguments args concludes
* equality engine's explanation of literals in exp, with the proof equality
* engine as the proof generator (if it exists).
*/
- void conflictExp(PfRule id,
+ void conflictExp(InferenceId id,
+ PfRule pfr,
const std::vector<Node>& exp,
const std::vector<Node>& args);
/**
* the responsibility of the caller to subsequently call trustedConflict with
* the returned trust node.
*/
- TrustNode mkConflictExp(PfRule id,
+ TrustNode mkConflictExp(PfRule pfr,
const std::vector<Node>& exp,
const std::vector<Node>& args);
/**
* engine as the proof generator (if it exists), where pg provides the
* final step(s) of this proof during this call.
*/
- void conflictExp(const std::vector<Node>& exp, ProofGenerator* pg);
+ void conflictExp(InferenceId id,
+ const std::vector<Node>& exp,
+ ProofGenerator* pg);
/**
* Make the trust node corresponding to the conflict of the above form. It is
* the responsibility of the caller to subsequently call trustedConflict with
* @return true if the lemma was sent on the output channel.
*/
bool trustedLemma(const TrustNode& tlem,
+ InferenceId id,
LemmaProperty p = LemmaProperty::NONE,
bool doCache = true);
/**
* a node instead of a trust node.
*/
bool lemma(TNode lem,
+ InferenceId id,
LemmaProperty p = LemmaProperty::NONE,
bool doCache = true);
/**
* @return true if the lemma was sent on the output channel.
*/
bool lemmaExp(Node conc,
- PfRule id,
+ InferenceId id,
+ PfRule pfr,
const std::vector<Node>& exp,
const std::vector<Node>& noExplain,
const std::vector<Node>& args,
* @return true if the lemma was sent on the output channel.
*/
bool lemmaExp(Node conc,
+ InferenceId id,
const std::vector<Node>& exp,
const std::vector<Node>& noExplain,
ProofGenerator* pg = nullptr,
* @return true if the fact was processed, i.e. it was asserted to the
* equality engine or preNotifyFact returned true.
*/
- bool assertInternalFact(TNode atom, bool pol, TNode exp);
+ bool assertInternalFact(TNode atom, bool pol, InferenceId id, TNode exp);
/**
* Assert internal fact, with a proof step justification. Notice that if
* proofs are not enabled in this inference manager, then this asserts
*/
bool assertInternalFact(TNode atom,
bool pol,
- PfRule id,
+ InferenceId id,
+ PfRule pfr,
const std::vector<Node>& exp,
const std::vector<Node>& args);
/**
*/
bool assertInternalFact(TNode atom,
bool pol,
+ InferenceId id,
const std::vector<Node>& exp,
ProofGenerator* pg);
/** The number of internal facts we have added since the last call to reset */
/** Have we added a internal fact since the last call to reset? */
bool hasSentFact() const;
//--------------------------------------- phase requirements
- /**
+ /**
* Set that literal n has SAT phase requirement pol, that is, it should be
* decided with polarity pol, for details see OutputChannel::requirePhase.
*/
//split on the equality s
Node lem = NodeManager::currentNM()->mkNode( kind::OR, ss, ss.negate() );
// send lemma, with caching
- if (d_im.lemma(lem))
+ if (d_im.lemma(lem, InferenceId::UNKNOWN))
{
Trace("uf-ss-lemma") << "*** Split on " << s << std::endl;
//tell the sat solver to explore the equals branch first
eqs.push_back(d_cardinality_literal[d_cardinality].notNode());
Node lem = NodeManager::currentNM()->mkNode(OR, eqs);
// send lemma, with caching
- if (d_im.lemma(lem))
+ if (d_im.lemma(lem, InferenceId::UNKNOWN))
{
Trace("uf-ss-lemma") << "*** Add clique lemma " << lem << std::endl;
++(d_thss->d_statistics.d_clique_lemmas);
Node lem = NodeManager::currentNM()->mkNode( AND, getCardinalityLiteral( d_cardinality.get() ),
getCardinalityLiteral( d_maxNegCard.get() ).negate() );
Trace("uf-ss-lemma") << "*** Simple cardinality conflict : " << lem << std::endl;
- d_im.conflict(lem);
+ d_im.conflict(lem, InferenceId::UNKNOWN);
}
}
Node lem = NodeManager::currentNM()->mkNode(
OR, cl, NodeManager::currentNM()->mkAnd(force_cl));
Trace("uf-ss-lemma") << "*** Enforce negative cardinality constraint lemma : " << lem << std::endl;
- d_im.lemma(lem, LemmaProperty::NONE, false);
+ d_im.lemma(lem, InferenceId::UNKNOWN, LemmaProperty::NONE, false);
return false;
}
}
Node eqv_lit = NodeManager::currentNM()->mkNode( CARDINALITY_CONSTRAINT, ct, lit[1] );
eqv_lit = lit.eqNode( eqv_lit );
Trace("uf-ss-lemma") << "*** Cardinality equiv lemma : " << eqv_lit << std::endl;
- d_im.lemma(eqv_lit, LemmaProperty::NONE, false);
+ d_im.lemma(eqv_lit, InferenceId::UNKNOWN, LemmaProperty::NONE, false);
d_card_assertions_eqv_lemma[lit] = true;
}
}
Node eq = Rewriter::rewrite( a.eqNode( b ) );
Node lem = NodeManager::currentNM()->mkNode( kind::OR, eq, eq.negate() );
Trace("uf-ss-lemma") << "*** Split (no-minimal) : " << lem << std::endl;
- d_im.lemma(lem, LemmaProperty::NONE, false);
+ d_im.lemma(lem, InferenceId::UNKNOWN, LemmaProperty::NONE, false);
d_im.requirePhase(eq, true);
type_proc[tn] = true;
break;
<< " : " << cf << std::endl;
Trace("uf-ss-com-card") << "*** Combined monotone cardinality conflict"
<< " : " << cf << std::endl;
- d_im.conflict(cf);
+ d_im.conflict(cf, InferenceId::UNKNOWN);
return;
}
}
<< std::endl;
Trace("uf-ss-com-card") << "*** Combined cardinality conflict : " << cf
<< std::endl;
- d_im.conflict(cf);
+ d_im.conflict(cf, InferenceId::UNKNOWN);
}
}
}
Node lem = NodeManager::currentNM()->mkNode(OR, deq[0], conc);
Trace("uf-ho-lemma") << "uf-ho-lemma : extensionality : " << lem
<< std::endl;
- d_im.lemma(lem);
+ d_im.lemma(lem, InferenceId::UNKNOWN);
return 1;
}
return 0;
Trace("uf-ho-lemma")
<< "uf-ho-lemma : Skolem definition for apply-conversion : " << lem
<< std::endl;
- d_im.lemma(lem);
+ d_im.lemma(lem, InferenceId::UNKNOWN);
d_uf_std_skolem[f] = new_f;
}
else
Node lem = nm->mkNode(OR, deq.negate(), eq);
Trace("uf-ho") << "HoExtension: cmi extensionality lemma " << lem
<< std::endl;
- d_im.lemma(lem);
+ d_im.lemma(lem, InferenceId::UNKNOWN);
return 1;
}
}
Node eq = n.eqNode(ret);
Trace("uf-ho-lemma") << "uf-ho-lemma : infer, by apply-expand : " << eq
<< std::endl;
- d_im.assertInternalFact(eq, true, PfRule::HO_APP_ENCODE, {}, {n});
+ d_im.assertInternalFact(eq, true, InferenceId::UNKNOWN, PfRule::HO_APP_ENCODE, {}, {n});
return 1;
}
Trace("uf-ho-debug") << " ...already have " << ret << " == " << n << "."
Node eq = n.eqNode(hn);
Trace("uf-ho") << "HoExtension: cmi app completion lemma " << eq
<< std::endl;
- d_im.lemma(eq);
+ d_im.lemma(eq, InferenceId::UNKNOWN);
return false;
}
}
++i) {
Debug("uf") << "uf: generating a lemma: " << *i << std::endl;
// no proof generator provided
- d_im.lemma(*i);
+ d_im.lemma(*i, InferenceId::UNKNOWN);
}
}
if( d_thss ){