diff options
author | Andrew Reynolds <andrew.j.reynolds@gmail.com> | 2021-11-04 09:32:31 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-11-04 09:32:31 -0500 |
commit | 84812843d121006218ab3d63fd651f6d7cd4c72e (patch) | |
tree | 1c74ee94271ea92cf9ee2fc0d001c8ff28b8ee6c /src/proof/lfsc/lfsc_post_processor.cpp | |
parent | b3d9ba15441dd2c46d7a25f97cf0f488d83b964f (diff) | |
parent | a517a9127e0ef70424364d093bb21be64891dd0d (diff) |
Merge branch 'master' into privateGetprivateGet
Diffstat (limited to 'src/proof/lfsc/lfsc_post_processor.cpp')
-rw-r--r-- | src/proof/lfsc/lfsc_post_processor.cpp | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/src/proof/lfsc/lfsc_post_processor.cpp b/src/proof/lfsc/lfsc_post_processor.cpp index 72db06060..33004e81f 100644 --- a/src/proof/lfsc/lfsc_post_processor.cpp +++ b/src/proof/lfsc/lfsc_post_processor.cpp @@ -16,6 +16,7 @@ #include "options/proof_options.h" #include "proof/lazy_proof.h" +#include "proof/lfsc/lfsc_printer.h" #include "proof/proof_checker.h" #include "proof/proof_node_algorithm.h" #include "proof/proof_node_manager.h" @@ -158,6 +159,8 @@ bool LfscProofPostprocessCallback::update(Node res, { Assert(res.getKind() == EQUAL); Assert(res[0].getOperator() == res[1].getOperator()); + Trace("lfsc-pp-cong") << "Processing congruence for " << res << " " + << res[0].getKind() << std::endl; // different for closures if (res[0].isClosure()) { @@ -210,6 +213,8 @@ bool LfscProofPostprocessCallback::update(Node res, // REFL step. Notice this may be for interpreted or uninterpreted // function symbols. Node op = d_tproc.getOperatorOfTerm(res[0]); + Trace("lfsc-pp-cong") << "Processing cong for op " << op << " " + << op.getType() << std::endl; Assert(!op.isNull()); // initial base step is REFL Node opEq = op.eqNode(op); @@ -245,9 +250,20 @@ bool LfscProofPostprocessCallback::update(Node res, for (size_t i = 0; i < nchildren; i++) { size_t ii = (nchildren - 1) - i; + Node uop = op; + // special case: each bv concat in the chain has a different type, + // so remake the operator here. + if (k == kind::BITVECTOR_CONCAT) + { + // we get the operator of the next argument concatenated with the + // current accumulated remainder. + Node currApp = + nm->mkNode(kind::BITVECTOR_CONCAT, children[ii][0], currEq[0]); + uop = d_tproc.getOperatorOfTerm(currApp); + } Node argAppEq = - nm->mkNode(HO_APPLY, op, children[ii][0]) - .eqNode(nm->mkNode(HO_APPLY, op, children[ii][1])); + nm->mkNode(HO_APPLY, uop, children[ii][0]) + .eqNode(nm->mkNode(HO_APPLY, uop, children[ii][1])); addLfscRule(cdp, argAppEq, {opEq, children[ii]}, LfscRule::CONG, {}); // now, congruence to the current equality Node nextEq; |