mirror of
https://github.com/Z3Prover/z3
synced 2026-07-16 20:15:43 +00:00
fix #8109
default behavior is conservative: if the body of a recursive function contains uninterpreted variables they are not rewritten. Model evaluation will bind values to uninterpreted variables so the filter should not apply here.
This commit is contained in:
parent
fbf65c5d76
commit
ccc2a34444
5 changed files with 20 additions and 3 deletions
|
|
@ -21,6 +21,12 @@ Author:
|
|||
#include "ast/rewriter/var_subst.h"
|
||||
#include "ast/datatype_decl_plugin.h"
|
||||
#include "ast/for_each_expr.h"
|
||||
#include "params/rewriter_params.hpp"
|
||||
|
||||
void recfun_rewriter::updt_params(params_ref const &p) {
|
||||
rewriter_params rp(p);
|
||||
m_recfun_unfold = rp.unfold_recursive_functions();
|
||||
}
|
||||
|
||||
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) && num_args > 0) {
|
||||
|
|
@ -34,9 +40,11 @@ br_status recfun_rewriter::mk_app_core(func_decl * f, unsigned num_args, expr *
|
|||
for (unsigned i = 0; i < num_args; ++i)
|
||||
if (!m.is_value(args[i]))
|
||||
safe_to_subst = false;
|
||||
for (auto t : subterms::all(expr_ref(r, m)))
|
||||
if (is_uninterp(t))
|
||||
return BR_FAILED;
|
||||
if (!m_recfun_unfold) {
|
||||
for (auto t : subterms::all(expr_ref(r, m)))
|
||||
if (is_uninterp(t))
|
||||
return BR_FAILED;
|
||||
}
|
||||
|
||||
// check if there is an argument that is a constructor
|
||||
// such that the recursive function can be partially evaluated.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue