else if (polarity != pol)
{
// a positive and negative pto
- if (!areDisequal(pval, qval))
+ bool isSat = false;
+ std::vector<Node> conc;
+ // based on the lemma below, either the domain or range has to be
+ // disequal. We iterate on each child of the pto
+ for (size_t j = 0; j < 2; j++)
+ {
+ if (areDisequal(p[0][j], q[0][j]))
+ {
+ isSat = true;
+ break;
+ }
+ if (p[0][j] != q[0][j])
+ {
+ conc.push_back(p[0][j].eqNode(q[0][j]).notNode());
+ }
+ }
+ if (!isSat)
{
std::vector<Node> exp;
if (plbl != qlbl)
Node neg = polarity ? q : p;
exp.push_back(pos);
exp.push_back(neg.notNode());
- std::vector<Node> conc;
- if (pval != qval)
- {
- conc.push_back(pval.eqNode(qval).notNode());
- }
Node concn = nm->mkOr(conc);
Trace("sep-pto") << "prop neg/pos: " << concn << " by " << exp
<< std::endl;
- // (label (pto x y) A) ^ ~(label (pto z w) B) ^ A = B => y != w
- // or (label (pto x y) A) ^ ~(label (pto z y) B) ^ A = B => false
+ // (label (pto x y) A) ^ ~(label (pto z w) B) ^ A = B =>
+ // (x != z or y != w)
sendLemma(exp, concn, InferenceId::SEP_PTO_NEG_PROP);
}
}
regress0/sep/issue3720-check-model.smt2
regress0/sep/issue5343-err.smt2
regress0/sep/issue8659-wand-diff-heaps.smt2
+ regress0/sep/issue8841-neg-prop.smt2
regress0/sep/nemp.smt2
regress0/sep/nil-no-elim.smt2
regress0/sep/nspatial-simp.smt2