mirror of
https://github.com/Z3Prover/z3
synced 2025-06-08 23:23:23 +00:00
theory_str API started
This commit is contained in:
parent
dc8062ba67
commit
ce53b36864
7 changed files with 167 additions and 0 deletions
|
@ -647,6 +647,12 @@ extern "C" {
|
||||||
else if (fid == mk_c(c)->get_seq_fid() && k == RE_SORT) {
|
else if (fid == mk_c(c)->get_seq_fid() && k == RE_SORT) {
|
||||||
return Z3_RE_SORT;
|
return Z3_RE_SORT;
|
||||||
}
|
}
|
||||||
|
else if (fid == mk_c(c)->get_str_fid() && k == STRING_SORT) {
|
||||||
|
return Z3_STRING_SORT;
|
||||||
|
}
|
||||||
|
else if (fid == mk_c(c)->get_str_fid() && k == REGEX_SORT) {
|
||||||
|
return Z3_REGEX_SORT;
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
return Z3_UNKNOWN_SORT;
|
return Z3_UNKNOWN_SORT;
|
||||||
}
|
}
|
||||||
|
@ -1139,6 +1145,16 @@ extern "C" {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mk_c(c)->get_str_fid() == _d->get_family_id()) {
|
||||||
|
switch (_d->get_decl_kind()) {
|
||||||
|
// TODO(z3str2) add others
|
||||||
|
case OP_STRCAT: return Z3_OP_STR_CONCAT;
|
||||||
|
case OP_STRLEN: return Z3_OP_STR_LENGTH;
|
||||||
|
default:
|
||||||
|
return Z3_OP_UNINTERPRETED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (mk_c(c)->get_fpa_fid() == _d->get_family_id()) {
|
if (mk_c(c)->get_fpa_fid() == _d->get_family_id()) {
|
||||||
switch (_d->get_decl_kind()) {
|
switch (_d->get_decl_kind()) {
|
||||||
case OP_FPA_RM_NEAREST_TIES_TO_EVEN: return Z3_OP_FPA_RM_NEAREST_TIES_TO_EVEN;
|
case OP_FPA_RM_NEAREST_TIES_TO_EVEN: return Z3_OP_FPA_RM_NEAREST_TIES_TO_EVEN;
|
||||||
|
|
|
@ -74,6 +74,7 @@ namespace api {
|
||||||
m_fpa_util(m()),
|
m_fpa_util(m()),
|
||||||
m_dtutil(m()),
|
m_dtutil(m()),
|
||||||
m_sutil(m()),
|
m_sutil(m()),
|
||||||
|
m_strutil(m()),
|
||||||
m_last_result(m()),
|
m_last_result(m()),
|
||||||
m_ast_trail(m()),
|
m_ast_trail(m()),
|
||||||
m_pmanager(m_limit) {
|
m_pmanager(m_limit) {
|
||||||
|
@ -98,6 +99,7 @@ namespace api {
|
||||||
m_datalog_fid = m().mk_family_id("datalog_relation");
|
m_datalog_fid = m().mk_family_id("datalog_relation");
|
||||||
m_fpa_fid = m().mk_family_id("fpa");
|
m_fpa_fid = m().mk_family_id("fpa");
|
||||||
m_seq_fid = m().mk_family_id("seq");
|
m_seq_fid = m().mk_family_id("seq");
|
||||||
|
m_str_fid = m().mk_family_id("str");
|
||||||
m_dt_plugin = static_cast<datatype_decl_plugin*>(m().get_plugin(m_dt_fid));
|
m_dt_plugin = static_cast<datatype_decl_plugin*>(m().get_plugin(m_dt_fid));
|
||||||
|
|
||||||
install_tactics(*this);
|
install_tactics(*this);
|
||||||
|
|
|
@ -26,6 +26,7 @@ Revision History:
|
||||||
#include"arith_decl_plugin.h"
|
#include"arith_decl_plugin.h"
|
||||||
#include"bv_decl_plugin.h"
|
#include"bv_decl_plugin.h"
|
||||||
#include"seq_decl_plugin.h"
|
#include"seq_decl_plugin.h"
|
||||||
|
#include"str_decl_plugin.h"
|
||||||
#include"datatype_decl_plugin.h"
|
#include"datatype_decl_plugin.h"
|
||||||
#include"dl_decl_plugin.h"
|
#include"dl_decl_plugin.h"
|
||||||
#include"fpa_decl_plugin.h"
|
#include"fpa_decl_plugin.h"
|
||||||
|
@ -61,6 +62,8 @@ namespace api {
|
||||||
datatype_util m_dtutil;
|
datatype_util m_dtutil;
|
||||||
seq_util m_sutil;
|
seq_util m_sutil;
|
||||||
|
|
||||||
|
str_util m_strutil;
|
||||||
|
|
||||||
// Support for old solver API
|
// Support for old solver API
|
||||||
smt_params m_fparams;
|
smt_params m_fparams;
|
||||||
// -------------------------------
|
// -------------------------------
|
||||||
|
@ -79,6 +82,7 @@ namespace api {
|
||||||
family_id m_pb_fid;
|
family_id m_pb_fid;
|
||||||
family_id m_fpa_fid;
|
family_id m_fpa_fid;
|
||||||
family_id m_seq_fid;
|
family_id m_seq_fid;
|
||||||
|
family_id m_str_fid;
|
||||||
datatype_decl_plugin * m_dt_plugin;
|
datatype_decl_plugin * m_dt_plugin;
|
||||||
|
|
||||||
std::string m_string_buffer; // temporary buffer used to cache strings sent to the "external" world.
|
std::string m_string_buffer; // temporary buffer used to cache strings sent to the "external" world.
|
||||||
|
@ -123,6 +127,7 @@ namespace api {
|
||||||
fpa_util & fpautil() { return m_fpa_util; }
|
fpa_util & fpautil() { return m_fpa_util; }
|
||||||
datatype_util& dtutil() { return m_dtutil; }
|
datatype_util& dtutil() { return m_dtutil; }
|
||||||
seq_util& sutil() { return m_sutil; }
|
seq_util& sutil() { return m_sutil; }
|
||||||
|
str_util& strutil() { return m_strutil; }
|
||||||
family_id get_basic_fid() const { return m_basic_fid; }
|
family_id get_basic_fid() const { return m_basic_fid; }
|
||||||
family_id get_array_fid() const { return m_array_fid; }
|
family_id get_array_fid() const { return m_array_fid; }
|
||||||
family_id get_arith_fid() const { return m_arith_fid; }
|
family_id get_arith_fid() const { return m_arith_fid; }
|
||||||
|
@ -132,6 +137,7 @@ namespace api {
|
||||||
family_id get_pb_fid() const { return m_pb_fid; }
|
family_id get_pb_fid() const { return m_pb_fid; }
|
||||||
family_id get_fpa_fid() const { return m_fpa_fid; }
|
family_id get_fpa_fid() const { return m_fpa_fid; }
|
||||||
family_id get_seq_fid() const { return m_seq_fid; }
|
family_id get_seq_fid() const { return m_seq_fid; }
|
||||||
|
family_id get_str_fid() const { return m_str_fid; }
|
||||||
datatype_decl_plugin * get_dt_plugin() const { return m_dt_plugin; }
|
datatype_decl_plugin * get_dt_plugin() const { return m_dt_plugin; }
|
||||||
|
|
||||||
Z3_error_code get_error_code() const { return m_error_code; }
|
Z3_error_code get_error_code() const { return m_error_code; }
|
||||||
|
|
80
src/api/api_str.cpp
Normal file
80
src/api/api_str.cpp
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
/*++
|
||||||
|
Copyright (c) 2016 Microsoft Corporation
|
||||||
|
|
||||||
|
Module Name:
|
||||||
|
|
||||||
|
api_str.cpp
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
|
||||||
|
API for strings and regular expressions (Z3str2 implementation).
|
||||||
|
|
||||||
|
Author:
|
||||||
|
|
||||||
|
Murphy Berzish (mtrberzi) 2016-10-03.
|
||||||
|
|
||||||
|
Revision History:
|
||||||
|
|
||||||
|
--*/
|
||||||
|
#include<iostream>
|
||||||
|
#include"z3.h"
|
||||||
|
#include"api_log_macros.h"
|
||||||
|
#include"api_context.h"
|
||||||
|
#include"api_util.h"
|
||||||
|
#include"ast_pp.h"
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
|
||||||
|
Z3_sort Z3_API Z3_mk_str_sort(Z3_context c) {
|
||||||
|
Z3_TRY;
|
||||||
|
LOG_Z3_mk_str_sort(c);
|
||||||
|
RESET_ERROR_CODE();
|
||||||
|
sort * ty = mk_c(c)->strutil().mk_string_sort();
|
||||||
|
mk_c(c)->save_ast_trail(ty);
|
||||||
|
RETURN_Z3(of_sort(ty));
|
||||||
|
Z3_CATCH_RETURN(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Z3_bool Z3_API Z3_is_str_sort(Z3_context c, Z3_sort s) {
|
||||||
|
Z3_TRY;
|
||||||
|
LOG_Z3_is_str_sort(c, s);
|
||||||
|
RESET_ERROR_CODE();
|
||||||
|
bool result = mk_c(c)->strutil().is_str_sort(to_sort(s));
|
||||||
|
return result?Z3_TRUE:Z3_FALSE;
|
||||||
|
Z3_CATCH_RETURN(Z3_FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
Z3_bool Z3_API Z3_is_str(Z3_context c, Z3_ast s) {
|
||||||
|
Z3_TRY;
|
||||||
|
LOG_Z3_is_str(c, s);
|
||||||
|
RESET_ERROR_CODE();
|
||||||
|
bool result = mk_c(c)->strutil().is_string(to_expr(s));
|
||||||
|
return result ? Z3_TRUE : Z3_FALSE;
|
||||||
|
Z3_CATCH_RETURN(Z3_FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
Z3_string Z3_API Z3_get_str(Z3_context c, Z3_ast s) {
|
||||||
|
Z3_TRY;
|
||||||
|
LOG_Z3_get_str(c, s);
|
||||||
|
RESET_ERROR_CODE();
|
||||||
|
if (!mk_c(c)->strutil().is_string(to_expr(s))) {
|
||||||
|
SET_ERROR_CODE(Z3_INVALID_ARG);
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
std::string result = mk_c(c)->strutil().get_string_constant_value(to_expr(s));
|
||||||
|
return mk_c(c)->mk_external_string(result);
|
||||||
|
Z3_CATCH_RETURN("");
|
||||||
|
}
|
||||||
|
|
||||||
|
Z3_ast Z3_API Z3_mk_str(Z3_context c, Z3_string str) {
|
||||||
|
Z3_TRY;
|
||||||
|
LOG_Z3_mk_str(c, str);
|
||||||
|
RESET_ERROR_CODE();
|
||||||
|
std::string s(str);
|
||||||
|
app * a = mk_c(c)->strutil().mk_string(str);
|
||||||
|
mk_c(c)->save_ast_trail(a);
|
||||||
|
RETURN_Z3(of_ast(a));
|
||||||
|
Z3_CATCH_RETURN(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
|
@ -165,6 +165,8 @@ typedef enum
|
||||||
Z3_ROUNDING_MODE_SORT,
|
Z3_ROUNDING_MODE_SORT,
|
||||||
Z3_SEQ_SORT,
|
Z3_SEQ_SORT,
|
||||||
Z3_RE_SORT,
|
Z3_RE_SORT,
|
||||||
|
Z3_STRING_SORT,
|
||||||
|
Z3_REGEX_SORT,
|
||||||
Z3_UNKNOWN_SORT = 1000
|
Z3_UNKNOWN_SORT = 1000
|
||||||
} Z3_sort_kind;
|
} Z3_sort_kind;
|
||||||
|
|
||||||
|
@ -1150,6 +1152,10 @@ typedef enum {
|
||||||
Z3_OP_RE_CONCAT,
|
Z3_OP_RE_CONCAT,
|
||||||
Z3_OP_RE_UNION,
|
Z3_OP_RE_UNION,
|
||||||
|
|
||||||
|
// theory_str
|
||||||
|
Z3_OP_STR_CONCAT,
|
||||||
|
Z3_OP_STR_LENGTH,
|
||||||
|
|
||||||
// Auxiliary
|
// Auxiliary
|
||||||
Z3_OP_LABEL = 0x700,
|
Z3_OP_LABEL = 0x700,
|
||||||
Z3_OP_LABEL_LIT,
|
Z3_OP_LABEL_LIT,
|
||||||
|
@ -3145,6 +3151,57 @@ extern "C" {
|
||||||
|
|
||||||
/*@}*/
|
/*@}*/
|
||||||
|
|
||||||
|
/** @name Strings and regular expressions (Z3str2 implementation) */
|
||||||
|
/*@{*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Create a string sort for 8-bit ASCII strings.
|
||||||
|
|
||||||
|
This function creates a sort for ASCII strings.
|
||||||
|
Each character is 8 bits.
|
||||||
|
|
||||||
|
def_API('Z3_mk_str_sort', SORT, (_in(CONTEXT), ))
|
||||||
|
*/
|
||||||
|
Z3_sort Z3_API Z3_mk_str_sort(Z3_context c);
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Check if \c s is a string sort.
|
||||||
|
|
||||||
|
def_API('Z3_is_str_sort', BOOL, (_in(CONTEXT), _in(SORT)))
|
||||||
|
*/
|
||||||
|
|
||||||
|
Z3_bool Z3_API Z3_is_str_sort(Z3_context c, Z3_sort s);
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Determine if \c s is a string constant.
|
||||||
|
|
||||||
|
def_API('Z3_is_str', BOOL, (_in(CONTEXT), _in(AST)))
|
||||||
|
*/
|
||||||
|
|
||||||
|
Z3_bool Z3_API Z3_is_str(Z3_context c, Z3_ast s);
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Retrieve the string constant stored in \c s.
|
||||||
|
|
||||||
|
\pre Z3_is_str(c, s)
|
||||||
|
|
||||||
|
def_API('Z3_get_str', STRING, (_in(CONTEXT), _in(AST)))
|
||||||
|
*/
|
||||||
|
|
||||||
|
Z3_string Z3_API Z3_get_str(Z3_context c, Z3_ast s);
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Create a string constant.
|
||||||
|
|
||||||
|
\param c logical context.
|
||||||
|
\param str The ASCII representation of the string constant.
|
||||||
|
|
||||||
|
def_API('Z3_mk_str', AST, (_in(CONTEXT), _in(STRING)))
|
||||||
|
*/
|
||||||
|
Z3_ast Z3_API Z3_mk_str(Z3_context c, Z3_string str);
|
||||||
|
|
||||||
|
/*@}*/
|
||||||
|
|
||||||
/** @name Sequences and regular expressions */
|
/** @name Sequences and regular expressions */
|
||||||
/*@{*/
|
/*@{*/
|
||||||
|
|
||||||
|
|
|
@ -322,4 +322,5 @@ str_util::str_util(ast_manager &m) :
|
||||||
m_manager(m) {
|
m_manager(m) {
|
||||||
SASSERT(m.has_plugin(symbol("str")));
|
SASSERT(m.has_plugin(symbol("str")));
|
||||||
m_plugin = static_cast<str_decl_plugin*>(m.get_plugin(m.mk_family_id(symbol("str"))));
|
m_plugin = static_cast<str_decl_plugin*>(m.get_plugin(m.mk_family_id(symbol("str"))));
|
||||||
|
m_fid = m_plugin->get_family_id();
|
||||||
}
|
}
|
||||||
|
|
|
@ -120,6 +120,8 @@ public:
|
||||||
family_id get_fid() const { return m_afid; }
|
family_id get_fid() const { return m_afid; }
|
||||||
family_id get_family_id() const { return get_fid(); }
|
family_id get_family_id() const { return get_fid(); }
|
||||||
|
|
||||||
|
bool is_str_sort(sort* s) const { return is_sort_of(s, m_afid, STRING_SORT); }
|
||||||
|
|
||||||
bool is_string(expr const * n, const char ** val) const;
|
bool is_string(expr const * n, const char ** val) const;
|
||||||
bool is_string(expr const * n) const;
|
bool is_string(expr const * n) const;
|
||||||
|
|
||||||
|
@ -135,11 +137,14 @@ public:
|
||||||
class str_util : public str_recognizers {
|
class str_util : public str_recognizers {
|
||||||
ast_manager & m_manager;
|
ast_manager & m_manager;
|
||||||
str_decl_plugin * m_plugin;
|
str_decl_plugin * m_plugin;
|
||||||
|
family_id m_fid;
|
||||||
public:
|
public:
|
||||||
str_util(ast_manager & m);
|
str_util(ast_manager & m);
|
||||||
ast_manager & get_manager() const { return m_manager; }
|
ast_manager & get_manager() const { return m_manager; }
|
||||||
str_decl_plugin & plugin() { return *m_plugin; }
|
str_decl_plugin & plugin() { return *m_plugin; }
|
||||||
|
|
||||||
|
sort* mk_string_sort() const { return get_manager().mk_sort(m_fid, STRING_SORT, 0, 0); }
|
||||||
|
|
||||||
app * mk_string(const char * val) {
|
app * mk_string(const char * val) {
|
||||||
return m_plugin->mk_string(val);
|
return m_plugin->mk_string(val);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue