本文整理汇总了C++中TNode::impNode方法的典型用法代码示例。如果您正苦于以下问题:C++ TNode::impNode方法的具体用法?C++ TNode::impNode怎么用?C++ TNode::impNode使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类TNode
的用法示例。
在下文中一共展示了TNode::impNode方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: ppStaticLearn
//.........这里部分代码省略.........
if(processed.find(*i) == processed.end()) {
// unprocessed child
workList.push_back(*i);
unprocessedChildren = true;
}
}
if(unprocessedChildren) {
continue;
}
workList.pop_back();
// has node n been processed in the meantime ?
if(processed.find(n) != processed.end()) {
continue;
}
processed.insert(n);
// == DIAMONDS ==
Debug("diamonds") << "===================== looking at" << endl
<< n << endl;
// binary OR of binary ANDs of EQUALities
if(n.getKind() == kind::OR && n.getNumChildren() == 2 &&
n[0].getKind() == kind::AND && n[0].getNumChildren() == 2 &&
n[1].getKind() == kind::AND && n[1].getNumChildren() == 2 &&
(n[0][0].getKind() == kind::EQUAL || n[0][0].getKind() == kind::IFF) &&
(n[0][1].getKind() == kind::EQUAL || n[0][1].getKind() == kind::IFF) &&
(n[1][0].getKind() == kind::EQUAL || n[1][0].getKind() == kind::IFF) &&
(n[1][1].getKind() == kind::EQUAL || n[1][1].getKind() == kind::IFF)) {
// now we have (a = b && c = d) || (e = f && g = h)
Debug("diamonds") << "has form of a diamond!" << endl;
TNode
a = n[0][0][0], b = n[0][0][1],
c = n[0][1][0], d = n[0][1][1],
e = n[1][0][0], f = n[1][0][1],
g = n[1][1][0], h = n[1][1][1];
// test that one of {a, b} = one of {c, d}, and make "b" the
// shared node (i.e. put in the form (a = b && b = d))
// note we don't actually care about the shared ones, so the
// "swaps" below are one-sided, ignoring b and c
if(a == c) {
a = b;
} else if(a == d) {
a = b;
d = c;
} else if(b == c) {
// nothing to do
} else if(b == d) {
d = c;
} else {
// condition not satisfied
Debug("diamonds") << "+ A fails" << endl;
continue;
}
Debug("diamonds") << "+ A holds" << endl;
// same: one of {e, f} = one of {g, h}, and make "f" the
// shared node (i.e. put in the form (e = f && f = h))
if(e == g) {
e = f;
} else if(e == h) {
e = f;
h = g;
} else if(f == g) {
// nothing to do
} else if(f == h) {
h = g;
} else {
// condition not satisfied
Debug("diamonds") << "+ B fails" << endl;
continue;
}
Debug("diamonds") << "+ B holds" << endl;
// now we have (a = b && b = d) || (e = f && f = h)
// test that {a, d} == {e, h}
if( (a == e && d == h) ||
(a == h && d == e) ) {
// learn: n implies a == d
Debug("diamonds") << "+ C holds" << endl;
Node newEquality = a.getType().isBoolean() ? a.iffNode(d) : a.eqNode(d);
Debug("diamonds") << " ==> " << newEquality << endl;
learned << n.impNode(newEquality);
} else {
Debug("diamonds") << "+ C fails" << endl;
}
}
}
if(options::ufSymmetryBreaker()) {
d_symb.assertFormula(n);
}
}/* TheoryUF::ppStaticLearn() */