{
Node f1 = t1->getData();
Node f2 = t2->getData();
- if (!d_state.areEqual(f1, f2))
+
+ // Usually when (= (f x) (f y)), we don't care whether (= x y) is true or
+ // not for the shared variables x, y in the care graph.
+ // However, this does not apply to the membership operator since the
+ // equality or disequality between members affects the number of elements
+ // in a set. Therefore we need to split on (= x y) for kind MEMBER.
+ // Example:
+ // Suppose (= (member x S) member( y, S)) is true and there are
+ // no other members in S. We would get S = {x} if (= x y) is true.
+ // Otherwise we would get S = {x, y}.
+ if (f1.getKind() == MEMBER || !d_state.areEqual(f1, f2))
{
Trace("sets-cg") << "Check " << f1 << " and " << f2 << std::endl;
vector<pair<TNode, TNode> > currentPairs;
TypeNode elementType = eqc.getType().getSetElementType();
for (const std::pair<const Node, Node>& itmm : emems)
{
+ Trace("sets-model")
+ << "m->getRepresentative(" << itmm.first
+ << ")= " << m->getRepresentative(itmm.first) << std::endl;
Node t = nm->mkSingleton(elementType, itmm.first);
els.push_back(t);
}
regress1/sets/issue2568.smt2
regress1/sets/issue2904.smt2
regress1/sets/issue4391-card-lasso.smt2
+ regress1/sets/issue5271.smt2
regress1/sets/issue5309.smt2
regress1/sets/lemmabug-ListElts317minimized.smt2
regress1/sets/remove_check_free_31_6.smt2