case PfRule::EXISTS_INTRO: return "EXISTS_INTRO";
case PfRule::SKOLEMIZE: return "SKOLEMIZE";
case PfRule::INSTANTIATE: return "INSTANTIATE";
+ case PfRule::QUANTIFIERS_PREPROCESS: return "QUANTIFIERS_PREPROCESS";
//================================================= String rules
case PfRule::CONCAT_EQ: return "CONCAT_EQ";
case PfRule::CONCAT_UNIFY: return "CONCAT_UNIFY";
// Conclusion: F*sigma
// sigma maps x1 ... xn to t1 ... tn.
INSTANTIATE,
+ // ======== (Trusted) quantifiers preprocess
+ // Children: ?
+ // Arguments: (F)
+ // ---------------------------------------------------------------
+ // Conclusion: F
+ // where F is an equality of the form t = QuantifiersRewriter::preprocess(t)
+ QUANTIFIERS_PREPROCESS,
//================================================= String rules
//======================== Core solver
// ------------------------------ EQ_RESOLVE
// body
Node proven = tpBody.getProven();
- // add the transformation proof, or THEORY_PREPROCESS if none provided
+ // add the transformation proof, or the trusted rule if none provided
pfTmp->addLazyStep(proven,
tpBody.getGenerator(),
- PfRule::THEORY_PREPROCESS,
+ PfRule::QUANTIFIERS_PREPROCESS,
true,
"Instantiate::getInstantiation:qpreprocess");
pfTmp->addStep(body, PfRule::EQ_RESOLVE, {orig_body, proven}, {});
pc->registerChecker(PfRule::EXISTS_INTRO, this);
pc->registerChecker(PfRule::SKOLEMIZE, this);
pc->registerChecker(PfRule::INSTANTIATE, this);
+ // trusted rules
+ pc->registerTrustedChecker(PfRule::QUANTIFIERS_PREPROCESS, this, 3);
}
Node QuantifiersProofRuleChecker::checkInternal(
body.substitute(vars.begin(), vars.end(), subs.begin(), subs.end());
return inst;
}
+ else if (id == PfRule::QUANTIFIERS_PREPROCESS)
+ {
+ Assert(!args.empty());
+ Assert(args[0].getType().isBoolean());
+ return args[0];
+ }
// no rule
return Node::null();