{
Trace("sel-trigger") << "Selector trigger: " << mpat << std::endl;
Assert(mpat.getKind() == APPLY_SELECTOR);
- // NOTE: could use qs.getValuation().getPreprocessedTerm(mpat); when
- // expand definitions is eliminated, however, this also requires avoiding
- // term formula removal.
+ // Get the expanded form of the selector, meaning that we will match on
+ // the shared selector if shared selectors are enabled.
Node mpatExp = datatypes::DatatypesRewriter::expandApplySelector(mpat);
Trace("sel-trigger") << "Expands to: " << mpatExp << std::endl;
- if (mpatExp.getKind() == ITE)
- {
- Assert(mpatExp[1].getKind() == APPLY_SELECTOR);
- Assert(mpatExp[2].getKind() == APPLY_UF);
- d_selOp = d_treg.getTermDatabase()->getMatchOperator(mpatExp[1]);
- d_ufOp = d_treg.getTermDatabase()->getMatchOperator(mpatExp[2]);
- }
- else if (mpatExp.getKind() == APPLY_SELECTOR)
- {
- // corner case of datatype with one constructor
- d_selOp = d_treg.getTermDatabase()->getMatchOperator(mpatExp);
- }
- else
- {
- // corner case of a wrongly applied selector as a trigger
- Assert(mpatExp.getKind() == APPLY_UF);
- d_ufOp = d_treg.getTermDatabase()->getMatchOperator(mpatExp);
- }
- Assert(d_selOp != d_ufOp);
+ Assert (mpatExp.getKind() == APPLY_SELECTOR);
+ d_selOp = d_treg.getTermDatabase()->getMatchOperator(mpatExp);
}
void CandidateGeneratorSelector::reset(Node eqc)
{
Trace("sel-trigger-debug") << "Reset in eqc=" << eqc << std::endl;
// start with d_selOp, if it exists
- resetForOperator(eqc, !d_selOp.isNull()? d_selOp : d_ufOp);
+ resetForOperator(eqc, d_selOp);
}
Node CandidateGeneratorSelector::getNextCandidate()
Trace("sel-trigger-debug") << "...next candidate is " << nextc << std::endl;
return nextc;
}
- else if (d_op == d_selOp)
- {
- if (d_ufOp.isNull())
- {
- // corner case: selector cannot be wrongly applied (1-cons case)
- d_op = Node::null();
- }
- else
- {
- // finished correctly applied selectors, now try incorrectly applied ones
- resetForOperator(d_eqc, d_ufOp);
- return getNextCandidate();
- }
- }
Trace("sel-trigger-debug") << "...finished" << std::endl;
// no more candidates
return Node::null();