The only remaining unknown inferences covered by our regressions are from the sygus solver, will address in later PR.
Debug("arith::eq") << "negation has proof" << endl;
Debug("arith::eq") << constraint << endl;
Debug("arith::eq") << negation << endl;
- raiseConflict(negation, InferenceId::UNKNOWN);
+ raiseConflict(negation, InferenceId::ARITH_CONF_FACT_QUEUE);
return NullConstraint;
}else{
return constraint;
}
d_im.assertInference(selConst.eqNode(defValue),
true,
- InferenceId::UNKNOWN,
+ InferenceId::ARRAYS_CONST_ARRAY_DEFAULT,
d_true,
PfRule::ARRAYS_TRUST);
}
{
preRegisterTermInternal(aj2);
}
- d_im.assertInference(
- aj.eqNode(aj2), true, InferenceId::UNKNOWN, d_true, PfRule::MACRO_SR_PRED_INTRO);
+ d_im.assertInference(aj.eqNode(aj2),
+ true,
+ InferenceId::ARRAYS_EQ_TAUTOLOGY,
+ d_true,
+ PfRule::MACRO_SR_PRED_INTRO);
}
Node bj2 = Rewriter::rewrite(bj);
if (bj != bj2) {
{
preRegisterTermInternal(bj2);
}
- d_im.assertInference(
- bj.eqNode(bj2), true, InferenceId::UNKNOWN, d_true, PfRule::MACRO_SR_PRED_INTRO);
+ d_im.assertInference(bj.eqNode(bj2),
+ true,
+ InferenceId::ARRAYS_EQ_TAUTOLOGY,
+ d_true,
+ PfRule::MACRO_SR_PRED_INTRO);
}
if (aj2 == bj2) {
return;
{
preRegisterTermInternal(bj2);
}
- d_im.assertInference(eq1, true, InferenceId::UNKNOWN, d_true, PfRule::MACRO_SR_PRED_INTRO);
+ d_im.assertInference(eq1,
+ true,
+ InferenceId::ARRAYS_EQ_TAUTOLOGY,
+ d_true,
+ PfRule::MACRO_SR_PRED_INTRO);
return;
}
Node eq2 = i.eqNode(j);
Node eq2_r = Rewriter::rewrite(eq2);
if (eq2_r == d_true) {
- d_im.assertInference(eq2, true, InferenceId::UNKNOWN, d_true, PfRule::MACRO_SR_PRED_INTRO);
+ d_im.assertInference(eq2,
+ true,
+ InferenceId::ARRAYS_EQ_TAUTOLOGY,
+ d_true,
+ PfRule::MACRO_SR_PRED_INTRO);
return;
}
{
preRegisterTermInternal(aj2);
}
- d_im.assertInference(
- aj.eqNode(aj2), true, InferenceId::UNKNOWN, d_true, PfRule::MACRO_SR_PRED_INTRO);
+ d_im.assertInference(aj.eqNode(aj2),
+ true,
+ InferenceId::ARRAYS_EQ_TAUTOLOGY,
+ d_true,
+ PfRule::MACRO_SR_PRED_INTRO);
}
Node bj2 = Rewriter::rewrite(bj);
if (bj != bj2) {
{
preRegisterTermInternal(bj2);
}
- d_im.assertInference(
- bj.eqNode(bj2), true, InferenceId::UNKNOWN, d_true, PfRule::MACRO_SR_PRED_INTRO);
+ d_im.assertInference(bj.eqNode(bj2),
+ true,
+ InferenceId::ARRAYS_EQ_TAUTOLOGY,
+ d_true,
+ PfRule::MACRO_SR_PRED_INTRO);
}
if (aj2 == bj2) {
continue;
{
preRegisterTermInternal(bj2);
}
- d_im.assertInference(eq1, true, InferenceId::UNKNOWN, d_true, PfRule::MACRO_SR_PRED_INTRO);
+ d_im.assertInference(eq1,
+ true,
+ InferenceId::ARRAYS_EQ_TAUTOLOGY,
+ d_true,
+ PfRule::MACRO_SR_PRED_INTRO);
continue;
}
Node eq2 = i.eqNode(j);
Node eq2_r = Rewriter::rewrite(eq2);
if (eq2_r == d_true) {
- d_im.assertInference(eq2, true, InferenceId::UNKNOWN, d_true, PfRule::MACRO_SR_PRED_INTRO);
+ d_im.assertInference(eq2,
+ true,
+ InferenceId::ARRAYS_EQ_TAUTOLOGY,
+ d_true,
+ PfRule::MACRO_SR_PRED_INTRO);
continue;
}
case InferenceId::ARITH_CONF_UPPER: return "ARITH_CONF_UPPER";
case InferenceId::ARITH_CONF_SIMPLEX: return "ARITH_CONF_SIMPLEX";
case InferenceId::ARITH_CONF_SOI_SIMPLEX: return "ARITH_CONF_SOI_SIMPLEX";
+ case InferenceId::ARITH_CONF_FACT_QUEUE: return "ARITH_CONF_FACT_QUEUE";
case InferenceId::ARITH_SPLIT_DEQ: return "ARITH_SPLIT_DEQ";
case InferenceId::ARITH_TIGHTEN_CEIL: return "ARITH_TIGHTEN_CEIL";
case InferenceId::ARITH_TIGHTEN_FLOOR: return "ARITH_TIGHTEN_FLOOR";
case InferenceId::ARRAYS_READ_OVER_WRITE: return "ARRAYS_READ_OVER_WRITE";
case InferenceId::ARRAYS_READ_OVER_WRITE_1: return "ARRAYS_READ_OVER_WRITE_1";
case InferenceId::ARRAYS_READ_OVER_WRITE_CONTRA: return "ARRAYS_READ_OVER_WRITE_CONTRA";
+ case InferenceId::ARRAYS_CONST_ARRAY_DEFAULT:
+ return "ARRAYS_CONST_ARRAY_DEFAULT";
+ case InferenceId::ARRAYS_EQ_TAUTOLOGY: return "ARRAYS_EQ_TAUTOLOGY";
case InferenceId::BAG_NON_NEGATIVE_COUNT: return "BAG_NON_NEGATIVE_COUNT";
case InferenceId::BAG_MK_BAG_SAME_ELEMENT: return "BAG_MK_BAG_SAME_ELEMENT";
return "QUANTIFIERS_SYGUS_STREAM_EXCLUDE_CURRENT";
case InferenceId::QUANTIFIERS_SYGUS_EXAMPLE_INFER_CONTRA:
return "QUANTIFIERS_SYGUS_EXAMPLE_INFER_CONTRA";
+ case InferenceId::QUANTIFIERS_SYGUS_UNIF_PI_INTER_ENUM_SB:
+ return "QUANTIFIERS_SYGUS_UNIF_PI_INTER_ENUM_SB";
+ case InferenceId::QUANTIFIERS_SYGUS_UNIF_PI_SEPARATION:
+ return "QUANTIFIERS_SYGUS_UNIF_PI_SEPARATION";
+ case InferenceId::QUANTIFIERS_SYGUS_UNIF_PI_FAIR_SIZE:
+ return "QUANTIFIERS_SYGUS_UNIF_PI_FAIR_SIZE";
+ case InferenceId::QUANTIFIERS_SYGUS_UNIF_PI_REM_OPS:
+ return "QUANTIFIERS_SYGUS_UNIF_PI_REM_OPS";
+ case InferenceId::QUANTIFIERS_SYGUS_UNIF_PI_ENUM_SB:
+ return "QUANTIFIERS_SYGUS_UNIF_PI_ENUM_SB";
+ case InferenceId::QUANTIFIERS_SYGUS_UNIF_PI_DOMAIN:
+ return "QUANTIFIERS_SYGUS_UNIF_PI_DOMAIN";
case InferenceId::QUANTIFIERS_DSPLIT: return "QUANTIFIERS_DSPLIT";
+ case InferenceId::QUANTIFIERS_CONJ_GEN_SPLIT:
+ return "QUANTIFIERS_CONJ_GEN_SPLIT";
+ case InferenceId::QUANTIFIERS_CONJ_GEN_GT_ENUM:
+ return "QUANTIFIERS_CONJ_GEN_GT_ENUM";
case InferenceId::QUANTIFIERS_SKOLEMIZE: return "QUANTIFIERS_SKOLEMIZE";
case InferenceId::QUANTIFIERS_REDUCE_ALPHA_EQ:
return "QUANTIFIERS_REDUCE_ALPHA_EQ";
case InferenceId::QUANTIFIERS_HO_MATCH_PRED:
return "QUANTIFIERS_HO_MATCH_PRED";
+ case InferenceId::QUANTIFIERS_HO_PURIFY: return "QUANTIFIERS_HO_PURIFY";
case InferenceId::QUANTIFIERS_PARTIAL_TRIGGER_REDUCE:
return "QUANTIFIERS_PARTIAL_TRIGGER_REDUCE";
+ case InferenceId::QUANTIFIERS_GT_PURIFY: return "QUANTIFIERS_GT_PURIFY";
+ case InferenceId::QUANTIFIERS_TDB_DEQ_CONG:
+ return "QUANTIFIERS_TDB_DEQ_CONG";
case InferenceId::SEP_PTO_NEG_PROP: return "SEP_PTO_NEG_PROP";
case InferenceId::SEP_PTO_PROP: return "SEP_PTO_PROP";
case InferenceId::SETS_RELS_JOIN_COMPOSE: return "SETS_RELS_JOIN_COMPOSE";
case InferenceId::SETS_RELS_JOIN_IMAGE_DOWN:
return "SETS_RELS_JOIN_IMAGE_DOWN";
+ case InferenceId::SETS_RELS_JOIN_IMAGE_UP: return "SETS_RELS_JOIN_IMAGE_UP";
case InferenceId::SETS_RELS_JOIN_SPLIT_1: return "SETS_RELS_JOIN_SPLIT_1";
case InferenceId::SETS_RELS_JOIN_SPLIT_2: return "SETS_RELS_JOIN_SPLIT_2";
case InferenceId::SETS_RELS_PRODUCE_COMPOSE:
ARITH_CONF_SIMPLEX,
// conflict from sum-of-infeasibility simplex
ARITH_CONF_SOI_SIMPLEX,
+ // conflict when getting constraint from fact queue
+ ARITH_CONF_FACT_QUEUE,
// introduces split on a disequality
ARITH_SPLIT_DEQ,
// tighten integer inequalities to ceiling
ARRAYS_READ_OVER_WRITE,
ARRAYS_READ_OVER_WRITE_1,
ARRAYS_READ_OVER_WRITE_CONTRA,
+ // (= (select (as const (Array T1 T2) x) y) x)
+ ARRAYS_CONST_ARRAY_DEFAULT,
+ // an internally inferred tautological equality
+ ARRAYS_EQ_TAUTOLOGY,
// ---------------------------------- end arrays theory
// ---------------------------------- bags theory
QUANTIFIERS_SYGUS_STREAM_EXCLUDE_CURRENT,
// ~Q where Q is a PBE conjecture with conflicting examples
QUANTIFIERS_SYGUS_EXAMPLE_INFER_CONTRA,
+ // unif+pi symmetry breaking between multiple enumerators
+ QUANTIFIERS_SYGUS_UNIF_PI_INTER_ENUM_SB,
+ // unif+pi separation lemma
+ QUANTIFIERS_SYGUS_UNIF_PI_SEPARATION,
+ // unif+pi lemma for fairness of size of enumerators
+ QUANTIFIERS_SYGUS_UNIF_PI_FAIR_SIZE,
+ // unif+pi lemma for removing redundant operators
+ QUANTIFIERS_SYGUS_UNIF_PI_REM_OPS,
+ // symmetry breaking for enumerators
+ QUANTIFIERS_SYGUS_UNIF_PI_ENUM_SB,
+ // constraining terms to be in the domain of output
+ QUANTIFIERS_SYGUS_UNIF_PI_DOMAIN,
//-------------------- dynamic splitting
// a dynamic split from quantifiers
QUANTIFIERS_DSPLIT,
+ //-------------------- induction / conjecture generation
+ // a split on a conjecture for inductive theorem proving
+ QUANTIFIERS_CONJ_GEN_SPLIT,
+ // enumeration of ground terms for inductive theorem proving
+ QUANTIFIERS_CONJ_GEN_GT_ENUM,
//-------------------- miscellaneous
// skolemization
QUANTIFIERS_SKOLEMIZE,
QUANTIFIERS_REDUCE_ALPHA_EQ,
// a higher-order match predicate lemma
QUANTIFIERS_HO_MATCH_PRED,
+ // purification of non-variable higher-order function
+ QUANTIFIERS_HO_PURIFY,
// reduction of quantifiers that don't have triggers that cover all variables
QUANTIFIERS_PARTIAL_TRIGGER_REDUCE,
+ // a purification lemma for a ground term appearing in a quantified formula,
+ // used to ensure E-matching has equality information for that term
+ QUANTIFIERS_GT_PURIFY,
+ // when term indexing discovers disequal congruent terms in the master
+ // equality engine
+ QUANTIFIERS_TDB_DEQ_CONG,
//-------------------------------------- end quantifiers theory
// ---------------------------------- sep theory
SETS_RELS_IDENTITY_UP,
SETS_RELS_JOIN_COMPOSE,
SETS_RELS_JOIN_IMAGE_DOWN,
+ SETS_RELS_JOIN_IMAGE_UP,
SETS_RELS_JOIN_SPLIT_1,
SETS_RELS_JOIN_SPLIT_2,
SETS_RELS_PRODUCE_COMPOSE,
if( !lem.empty() ){
for (const Node& l : lem)
{
- d_qim.addPendingLemma(l, InferenceId::UNKNOWN);
+ d_qim.addPendingLemma(l, InferenceId::QUANTIFIERS_CONJ_GEN_GT_ENUM);
}
d_hasAddedLemma = true;
return false;
d_eq_conjectures[rhs].push_back( lhs );
Node lem = NodeManager::currentNM()->mkNode( OR, rsg.negate(), rsg );
- d_qim.addPendingLemma(lem, InferenceId::UNKNOWN);
+ d_qim.addPendingLemma(lem,
+ InferenceId::QUANTIFIERS_CONJ_GEN_SPLIT);
d_qim.addPendingPhaseRequirement(rsg, false);
addedLemmas++;
if( (int)addedLemmas>=options::conjectureGenPerRound() ){
Node eq = k.eqNode(gt);
Trace("trigger-gt-lemma")
<< "Trigger: ground term purify lemma: " << eq << std::endl;
- d_qim.addPendingLemma(eq, InferenceId::UNKNOWN);
+ d_qim.addPendingLemma(eq, InferenceId::QUANTIFIERS_GT_PURIFY);
gtAddedLemmas++;
}
}
<< "CegisUnif::lemma, inter-unif-enumerator "
"symmetry breaking lemma : "
<< slem << "\n";
- d_qim.lemma(slem, InferenceId::UNKNOWN);
+ d_qim.lemma(
+ slem, InferenceId::QUANTIFIERS_SYGUS_UNIF_PI_INTER_ENUM_SB);
addedUnifEnumSymBreakLemma = true;
break;
}
{
Trace("cegis-unif-lemma")
<< "CegisUnif::lemma, separation lemma : " << lem << "\n";
- d_qim.lemma(lem, InferenceId::UNKNOWN);
+ d_qim.lemma(lem, InferenceId::QUANTIFIERS_SYGUS_UNIF_PI_SEPARATION);
}
Trace("cegis-unif") << "..failed to separate heads\n---CegisUnif Engine---\n";
return false;
// G_uq_i => size(ve) >= log_2( i-1 )
// In other words, if we use i conditions, then we allow terms in our
// solution whose size is at most log_2(i-1).
- d_qim.lemma(fair_lemma, InferenceId::UNKNOWN);
+ d_qim.lemma(fair_lemma, InferenceId::QUANTIFIERS_SYGUS_UNIF_PI_FAIR_SIZE);
}
}
Trace("cegis-unif-enum-lemma")
<< "CegisUnifEnum::lemma, remove redundant ops of " << e << " : "
<< sym_break_red_ops << "\n";
- d_qim.lemma(sym_break_red_ops, InferenceId::UNKNOWN);
+ d_qim.lemma(sym_break_red_ops,
+ InferenceId::QUANTIFIERS_SYGUS_UNIF_PI_REM_OPS);
}
// symmetry breaking between enumerators
if (!si.d_enums[index].empty() && index == 0)
Node sym_break = nm->mkNode(GEQ, size_e, size_e_prev);
Trace("cegis-unif-enum-lemma")
<< "CegisUnifEnum::lemma, enum sym break:" << sym_break << "\n";
- d_qim.lemma(sym_break, InferenceId::UNKNOWN);
+ d_qim.lemma(sym_break, InferenceId::QUANTIFIERS_SYGUS_UNIF_PI_ENUM_SB);
}
// register the enumerator
si.d_enums[index].push_back(e);
Node lem = NodeManager::currentNM()->mkNode(OR, disj);
Trace("cegis-unif-enum-lemma")
<< "CegisUnifEnum::lemma, domain:" << lem << "\n";
- d_qim.lemma(lem, InferenceId::UNKNOWN);
+ d_qim.lemma(lem, InferenceId::QUANTIFIERS_SYGUS_UNIF_PI_DOMAIN);
}
} // namespace quantifiers
}
Trace("term-db-lemma") << " add lemma : " << lem << std::endl;
}
- d_qim->addPendingLemma(lem, InferenceId::UNKNOWN);
+ d_qim->addPendingLemma(lem, InferenceId::QUANTIFIERS_TDB_DEQ_CONG);
d_qstate.notifyInConflict();
d_consistent_ee = false;
return;
// equality is sent out as a lemma here.
Trace("term-db-lemma")
<< "Purify equality lemma: " << eq << std::endl;
- d_qim->addPendingLemma(eq, InferenceId::UNKNOWN);
+ d_qim->addPendingLemma(eq, InferenceId::QUANTIFIERS_HO_PURIFY);
d_qstate.notifyInConflict();
d_consistent_ee = false;
return false;
Trace("sets-nf") << "Actual Split : ";
d_treg.debugPrintSet(r, "sets-nf");
Trace("sets-nf") << std::endl;
- d_im.split(r.eqNode(emp_set), InferenceId::UNKNOWN, 1);
+ d_im.split(
+ r.eqNode(emp_set), InferenceId::SETS_CARD_SPLIT_EMPTY, 1);
Assert(d_im.hasSent());
return;
}
&& !d_state.hasMembers(eqc))
{
Trace("sets-nf-debug") << "Split on leaf " << eqc << std::endl;
- d_im.split(eqc.eqNode(emp_set), InferenceId::UNKNOWN);
+ d_im.split(eqc.eqNode(emp_set), InferenceId::SETS_CARD_SPLIT_EMPTY);
success = false;
}
else
Assert(reasons.size() >= 1);
sendInfer(
new_membership,
- InferenceId::UNKNOWN,
+ InferenceId::SETS_RELS_JOIN_IMAGE_UP,
reasons.size() > 1 ? nm->mkNode(AND, reasons) : reasons[0]);
break;
}