TypeNode realt = NodeManager::currentNM()->realType();
if (isSubtypeOf(realt)) {
return realt;
- } else if (isParametricDatatype()) {
- std::vector<TypeNode> v;
- for(size_t i = 1; i < getNumChildren(); ++i) {
- v.push_back((*this)[i].getBaseType());
- }
- return (*this)[0].getDType().getTypeNode().instantiate(v);
}
return *this;
}
std::vector<TypeNode> argTypes;
for (const Node& nc : n)
{
- argTypes.push_back(nc.getType());
+ // We take the base type, so that e.g. arithmetic operators are over
+ // real. This avoids issues with subtyping when currying during proof
+ // postprocessing
+ argTypes.push_back(nc.getType().getBaseType());
}
// we only use binary operators
if (NodeManager::isNAryKind(k))
for (size_t i = 0; i < nchildren; i++)
{
size_t ii = (nchildren - 1) - i;
+ Trace("lfsc-pp-cong") << "Process child " << ii << std::endl;
Node uop = op;
// special case: each bv concat in the chain has a different type,
// so remake the operator here.
nm->mkNode(kind::BITVECTOR_CONCAT, children[ii][0], currEq[0]);
uop = d_tproc.getOperatorOfTerm(currApp);
}
+ Trace("lfsc-pp-cong") << "Apply " << uop << " to " << children[ii][0]
+ << " and " << children[ii][1] << std::endl;
Node argAppEq =
nm->mkNode(HO_APPLY, uop, children[ii][0])
.eqNode(nm->mkNode(HO_APPLY, uop, children[ii][1]));