mirror of
https://github.com/Z3Prover/z3
synced 2025-08-12 06:00:53 +00:00
add recfun rewriting, remove quantifier based recfun
This commit is contained in:
parent
7f1b147cba
commit
f9193809ea
13 changed files with 94 additions and 143 deletions
|
@ -29,6 +29,7 @@ z3_add_component(rewriter
|
|||
pb2bv_rewriter.cpp
|
||||
push_app_ite.cpp
|
||||
quant_hoist.cpp
|
||||
recfun_rewriter.cpp
|
||||
rewriter.cpp
|
||||
seq_rewriter.cpp
|
||||
th_rewriter.cpp
|
||||
|
|
39
src/ast/rewriter/recfun_rewriter.cpp
Normal file
39
src/ast/rewriter/recfun_rewriter.cpp
Normal file
|
@ -0,0 +1,39 @@
|
|||
/*++
|
||||
Copyright (c) 2018 Microsoft Corporation
|
||||
|
||||
Module Name:
|
||||
|
||||
recfun_rewriter.cpp
|
||||
|
||||
Abstract:
|
||||
|
||||
Rewriter recursive function applications to values
|
||||
|
||||
Author:
|
||||
|
||||
Nikolaj Bjorner (nbjorner) 2020-04-26
|
||||
|
||||
|
||||
--*/
|
||||
|
||||
|
||||
#include "ast/rewriter/recfun_rewriter.h"
|
||||
#include "ast/rewriter/var_subst.h"
|
||||
|
||||
br_status recfun_rewriter::mk_app_core(func_decl * f, unsigned num_args, expr * const * args, expr_ref & result) {
|
||||
if (m_rec.is_defined(f)) {
|
||||
for (unsigned i = 0; i < num_args; ++i) {
|
||||
if (!m.is_value(args[i]))
|
||||
return BR_FAILED;
|
||||
}
|
||||
recfun::def const& d = m_rec.get_def(f);
|
||||
var_subst sub(m);
|
||||
result = sub(d.get_rhs(), num_args, args);
|
||||
return BR_REWRITE_FULL;
|
||||
}
|
||||
else {
|
||||
return BR_FAILED;
|
||||
}
|
||||
}
|
||||
|
||||
|
36
src/ast/rewriter/recfun_rewriter.h
Normal file
36
src/ast/rewriter/recfun_rewriter.h
Normal file
|
@ -0,0 +1,36 @@
|
|||
/*++
|
||||
Copyright (c) 2018 Microsoft Corporation
|
||||
|
||||
Module Name:
|
||||
|
||||
recfun_rewriter.h
|
||||
|
||||
Abstract:
|
||||
|
||||
Rewriter recursive function applications to values
|
||||
|
||||
Author:
|
||||
|
||||
Nikolaj Bjorner (nbjorner) 2020-04-26
|
||||
|
||||
|
||||
--*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "ast/recfun_decl_plugin.h"
|
||||
#include "ast/rewriter/rewriter.h"
|
||||
|
||||
class recfun_rewriter {
|
||||
ast_manager& m;
|
||||
recfun::util m_rec;
|
||||
public:
|
||||
recfun_rewriter(ast_manager& m): m(m), m_rec(m) {}
|
||||
~recfun_rewriter() {}
|
||||
|
||||
br_status mk_app_core(func_decl * f, unsigned num_args, expr * const * args, expr_ref & result);
|
||||
|
||||
family_id get_fid() const { return m_rec.get_family_id(); }
|
||||
|
||||
};
|
||||
|
|
@ -26,6 +26,7 @@ Notes:
|
|||
#include "ast/rewriter/fpa_rewriter.h"
|
||||
#include "ast/rewriter/dl_rewriter.h"
|
||||
#include "ast/rewriter/pb_rewriter.h"
|
||||
#include "ast/rewriter/recfun_rewriter.h"
|
||||
#include "ast/rewriter/seq_rewriter.h"
|
||||
#include "ast/rewriter/rewriter_def.h"
|
||||
#include "ast/rewriter/var_subst.h"
|
||||
|
@ -46,6 +47,7 @@ struct th_rewriter_cfg : public default_rewriter_cfg {
|
|||
dl_rewriter m_dl_rw;
|
||||
pb_rewriter m_pb_rw;
|
||||
seq_rewriter m_seq_rw;
|
||||
recfun_rewriter m_rec_rw;
|
||||
arith_util m_a_util;
|
||||
bv_util m_bv_util;
|
||||
unsigned long long m_max_memory; // in bytes
|
||||
|
@ -219,6 +221,8 @@ struct th_rewriter_cfg : public default_rewriter_cfg {
|
|||
return m_pb_rw.mk_app_core(f, num, args, result);
|
||||
if (fid == m_seq_rw.get_fid())
|
||||
return m_seq_rw.mk_app_core(f, num, args, result);
|
||||
if (fid == m_rec_rw.get_fid())
|
||||
return m_rec_rw.mk_app_core(f, num, args, result);
|
||||
return BR_FAILED;
|
||||
}
|
||||
|
||||
|
@ -747,6 +751,7 @@ struct th_rewriter_cfg : public default_rewriter_cfg {
|
|||
m_dl_rw(m),
|
||||
m_pb_rw(m),
|
||||
m_seq_rw(m),
|
||||
m_rec_rw(m),
|
||||
m_a_util(m),
|
||||
m_bv_util(m),
|
||||
m_used_dependencies(m),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue