summaryrefslogtreecommitdiff
path: root/src/proof/lfsc/lfsc_post_processor.cpp
diff options
context:
space:
mode:
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>2021-11-04 09:32:31 -0500
committerGitHub <noreply@github.com>2021-11-04 09:32:31 -0500
commit84812843d121006218ab3d63fd651f6d7cd4c72e (patch)
tree1c74ee94271ea92cf9ee2fc0d001c8ff28b8ee6c /src/proof/lfsc/lfsc_post_processor.cpp
parentb3d9ba15441dd2c46d7a25f97cf0f488d83b964f (diff)
parenta517a9127e0ef70424364d093bb21be64891dd0d (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.cpp20
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;
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback