mirror of
https://github.com/Z3Prover/z3
synced 2025-08-21 02:30:23 +00:00
optimization: return integer consts for strlen() over constant strings
This commit is contained in:
parent
9b04f1570f
commit
799fd07c85
2 changed files with 13 additions and 4 deletions
|
@ -26,7 +26,8 @@ namespace smt {
|
||||||
theory_str::theory_str(ast_manager & m):
|
theory_str::theory_str(ast_manager & m):
|
||||||
theory(m.mk_family_id("str")),
|
theory(m.mk_family_id("str")),
|
||||||
search_started(false),
|
search_started(false),
|
||||||
m_autil(m)
|
m_autil(m),
|
||||||
|
m_strutil(m)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -100,8 +101,15 @@ bool theory_str::internalize_term(app * term) {
|
||||||
}
|
}
|
||||||
|
|
||||||
app * theory_str::mk_strlen(app * e) {
|
app * theory_str::mk_strlen(app * e) {
|
||||||
expr * args[1] = {e};
|
if (m_strutil.is_string(e)) {
|
||||||
return get_manager().mk_app(get_id(), OP_STRLEN, 0, 0, 1, args);
|
const char * strval = 0;
|
||||||
|
m_strutil.is_string(e, &strval);
|
||||||
|
int len = strlen(strval);
|
||||||
|
return m_autil.mk_numeral(rational(len), true);
|
||||||
|
} else {
|
||||||
|
expr * args[1] = {e};
|
||||||
|
return get_manager().mk_app(get_id(), OP_STRLEN, 0, 0, 1, args);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -34,6 +34,8 @@ namespace smt {
|
||||||
// TODO
|
// TODO
|
||||||
protected:
|
protected:
|
||||||
bool search_started;
|
bool search_started;
|
||||||
|
arith_util m_autil;
|
||||||
|
str_util m_strutil;
|
||||||
protected:
|
protected:
|
||||||
virtual bool internalize_atom(app * atom, bool gate_ctx);
|
virtual bool internalize_atom(app * atom, bool gate_ctx);
|
||||||
virtual bool internalize_term(app * term);
|
virtual bool internalize_term(app * term);
|
||||||
|
@ -61,7 +63,6 @@ namespace smt {
|
||||||
public:
|
public:
|
||||||
theory_str(ast_manager & m);
|
theory_str(ast_manager & m);
|
||||||
virtual ~theory_str();
|
virtual ~theory_str();
|
||||||
arith_util m_autil;
|
|
||||||
protected:
|
protected:
|
||||||
void attach_new_th_var(enode * n);
|
void attach_new_th_var(enode * n);
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue