3
0
Fork 0
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:
Murphy Berzish 2015-09-07 19:51:52 -04:00
parent 9b04f1570f
commit 799fd07c85
2 changed files with 13 additions and 4 deletions

View file

@ -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);
}
} }
/* /*

View file

@ -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);
}; };