3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-10-01 21:49:29 +00:00

probably fix duplication of mk_string() terms

also implement Case 2 of solve_concat_eq_str()
This commit is contained in:
Murphy Berzish 2015-09-28 14:44:25 -04:00
parent 9bc685b21d
commit 876af399e3
3 changed files with 63 additions and 5 deletions

View file

@ -99,11 +99,25 @@ func_decl * str_decl_plugin::mk_func_decl(decl_kind k, unsigned num_parameters,
return mk_func_decl(k);
}
app * str_decl_plugin::mk_string(std::string & val) {
std::map<std::string, app*>::iterator it = string_cache.find(val);
if (it == string_cache.end()) {
char * new_buffer = alloc_svect(char, val.length() + 1);
strcpy(new_buffer, val.c_str());
parameter p[1] = {parameter(new_buffer)};
func_decl * d;
d = m_manager->mk_const_decl(m_strv_sym, m_str_decl, func_decl_info(m_family_id, OP_STR, 1, p));
app * str = m_manager->mk_const(d);
string_cache[val] = str;
return str;
} else {
return it->second;
}
}
app * str_decl_plugin::mk_string(const char * val) {
parameter p[1] = {parameter(val)};
func_decl * d;
d = m_manager->mk_const_decl(m_strv_sym, m_str_decl, func_decl_info(m_family_id, OP_STR, 1, p));
return m_manager->mk_const(d);
std::string key(val);
return mk_string(key);
}
void str_decl_plugin::get_op_names(svector<builtin_name> & op_names, symbol const & logic) {

View file

@ -19,6 +19,7 @@ Revision History:
#include"ast.h"
#include"arith_decl_plugin.h"
#include<map>
enum str_sort_kind {
STRING_SORT,
@ -44,6 +45,8 @@ protected:
func_decl * m_concat_decl;
func_decl * m_length_decl;
std::map<std::string, app*> string_cache;
virtual void set_manager(ast_manager * m, family_id id);
func_decl * mk_func_decl(decl_kind k);
@ -58,6 +61,7 @@ public:
unsigned arity, sort * const * domain, sort * range);
app * mk_string(const char * val);
app * mk_string(std::string & val);
virtual void get_op_names(svector<builtin_name> & op_names, symbol const & logic);
virtual void get_sort_names(svector<builtin_name> & sort_names, symbol const & logic);
@ -90,6 +94,9 @@ public:
app * mk_string(const char * val) {
return m_plugin->mk_string(val);
}
app * mk_string(std::string & val) {
return m_plugin->mk_string(val);
}
// TODO
};