mirror of
https://github.com/Z3Prover/z3
synced 2025-06-15 18:36:16 +00:00
add character sort to Python API and allchar function to API for ease. #5500
This commit is contained in:
parent
4b3b4b95d9
commit
170ef1dcca
7 changed files with 39 additions and 1 deletions
|
@ -719,6 +719,9 @@ 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_char_fid() && k == CHAR_SORT) {
|
||||||
|
return Z3_SEQ_SORT;
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
return Z3_UNKNOWN_SORT;
|
return Z3_UNKNOWN_SORT;
|
||||||
}
|
}
|
||||||
|
|
|
@ -98,6 +98,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_char_fid = m().mk_family_id("char");
|
||||||
m_special_relations_fid = m().mk_family_id("specrels");
|
m_special_relations_fid = m().mk_family_id("specrels");
|
||||||
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));
|
||||||
|
|
||||||
|
|
|
@ -104,6 +104,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_char_fid;
|
||||||
family_id m_special_relations_fid;
|
family_id m_special_relations_fid;
|
||||||
datatype_decl_plugin * m_dt_plugin;
|
datatype_decl_plugin * m_dt_plugin;
|
||||||
|
|
||||||
|
@ -159,6 +160,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_char_fid() const { return m_char_fid; }
|
||||||
datatype_decl_plugin * get_dt_plugin() const { return m_dt_plugin; }
|
datatype_decl_plugin * get_dt_plugin() const { return m_dt_plugin; }
|
||||||
family_id get_special_relations_fid() const { return m_special_relations_fid; }
|
family_id get_special_relations_fid() const { return m_special_relations_fid; }
|
||||||
|
|
||||||
|
|
|
@ -267,6 +267,7 @@ extern "C" {
|
||||||
MK_NARY(Z3_mk_re_concat, mk_c(c)->get_seq_fid(), OP_RE_CONCAT, SKIP);
|
MK_NARY(Z3_mk_re_concat, mk_c(c)->get_seq_fid(), OP_RE_CONCAT, SKIP);
|
||||||
MK_BINARY(Z3_mk_re_range, mk_c(c)->get_seq_fid(), OP_RE_RANGE, SKIP);
|
MK_BINARY(Z3_mk_re_range, mk_c(c)->get_seq_fid(), OP_RE_RANGE, SKIP);
|
||||||
|
|
||||||
|
MK_SORTED(Z3_mk_re_allchar, mk_c(c)->sutil().re.mk_full_char);
|
||||||
MK_SORTED(Z3_mk_re_empty, mk_c(c)->sutil().re.mk_empty);
|
MK_SORTED(Z3_mk_re_empty, mk_c(c)->sutil().re.mk_empty);
|
||||||
MK_SORTED(Z3_mk_re_full, mk_c(c)->sutil().re.mk_full_seq);
|
MK_SORTED(Z3_mk_re_full, mk_c(c)->sutil().re.mk_full_seq);
|
||||||
|
|
||||||
|
|
|
@ -680,6 +680,8 @@ def _to_sort_ref(s, ctx):
|
||||||
return ReSortRef(s, ctx)
|
return ReSortRef(s, ctx)
|
||||||
elif k == Z3_SEQ_SORT:
|
elif k == Z3_SEQ_SORT:
|
||||||
return SeqSortRef(s, ctx)
|
return SeqSortRef(s, ctx)
|
||||||
|
elif k == Z3_CHAR_SORT:
|
||||||
|
return CharSortRef(s, ctx)
|
||||||
return SortRef(s, ctx)
|
return SortRef(s, ctx)
|
||||||
|
|
||||||
|
|
||||||
|
@ -10574,6 +10576,10 @@ class SeqSortRef(SortRef):
|
||||||
def basis(self):
|
def basis(self):
|
||||||
return _to_sort_ref(Z3_get_seq_sort_basis(self.ctx_ref(), self.ast), self.ctx)
|
return _to_sort_ref(Z3_get_seq_sort_basis(self.ctx_ref(), self.ast), self.ctx)
|
||||||
|
|
||||||
|
class CharSortRef(SortRef):
|
||||||
|
"""Character sort."""
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def StringSort(ctx=None):
|
def StringSort(ctx=None):
|
||||||
"""Create a string sort
|
"""Create a string sort
|
||||||
|
@ -10584,6 +10590,15 @@ def StringSort(ctx=None):
|
||||||
ctx = _get_ctx(ctx)
|
ctx = _get_ctx(ctx)
|
||||||
return SeqSortRef(Z3_mk_string_sort(ctx.ref()), ctx)
|
return SeqSortRef(Z3_mk_string_sort(ctx.ref()), ctx)
|
||||||
|
|
||||||
|
def CharSort(ctx=None):
|
||||||
|
"""Create a character sort
|
||||||
|
>>> ch = CharSort()
|
||||||
|
>>> print(ch)
|
||||||
|
Char
|
||||||
|
"""
|
||||||
|
ctx = _get_ctx(ctx)
|
||||||
|
return CharSortRef(Z3_mk_char_sort(ctx.ref()), ctx)
|
||||||
|
|
||||||
|
|
||||||
def SeqSort(s):
|
def SeqSort(s):
|
||||||
"""Create a sequence sort over elements provided in the argument
|
"""Create a sequence sort over elements provided in the argument
|
||||||
|
@ -11051,6 +11066,11 @@ def Range(lo, hi, ctx=None):
|
||||||
hi = _coerce_seq(hi, ctx)
|
hi = _coerce_seq(hi, ctx)
|
||||||
return ReRef(Z3_mk_re_range(lo.ctx_ref(), lo.ast, hi.ast), lo.ctx)
|
return ReRef(Z3_mk_re_range(lo.ctx_ref(), lo.ast, hi.ast), lo.ctx)
|
||||||
|
|
||||||
|
def AllChar(regex_sort, ctx=None):
|
||||||
|
"""Create a regular expression that accepts all single character strings
|
||||||
|
"""
|
||||||
|
return ReRef(Z3_mk_re_allchar(regex_sort.ctx_ref(), regex_sort.ast), regex_sort.ctx)
|
||||||
|
|
||||||
# Special Relations
|
# Special Relations
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -757,6 +757,8 @@ class Formatter:
|
||||||
if s.is_string():
|
if s.is_string():
|
||||||
return to_format("String")
|
return to_format("String")
|
||||||
return seq1("Seq", (self.pp_sort(s.basis()), ))
|
return seq1("Seq", (self.pp_sort(s.basis()), ))
|
||||||
|
elif isinstance(s, z3.CharSortRef):
|
||||||
|
return to_format("Char")
|
||||||
else:
|
else:
|
||||||
return to_format(s.name())
|
return to_format(s.name())
|
||||||
|
|
||||||
|
|
|
@ -161,6 +161,7 @@ typedef enum
|
||||||
Z3_ROUNDING_MODE_SORT,
|
Z3_ROUNDING_MODE_SORT,
|
||||||
Z3_SEQ_SORT,
|
Z3_SEQ_SORT,
|
||||||
Z3_RE_SORT,
|
Z3_RE_SORT,
|
||||||
|
Z3_CHAR_SORT,
|
||||||
Z3_UNKNOWN_SORT = 1000
|
Z3_UNKNOWN_SORT = 1000
|
||||||
} Z3_sort_kind;
|
} Z3_sort_kind;
|
||||||
|
|
||||||
|
@ -3724,6 +3725,14 @@ extern "C" {
|
||||||
*/
|
*/
|
||||||
Z3_ast Z3_API Z3_mk_re_range(Z3_context c, Z3_ast lo, Z3_ast hi);
|
Z3_ast Z3_API Z3_mk_re_range(Z3_context c, Z3_ast lo, Z3_ast hi);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Create a regular expression that accepts all singleton sequences of the regular expression sort
|
||||||
|
|
||||||
|
def_API('Z3_mk_re_allchar', AST, (_in(CONTEXT), _in(SORT)))
|
||||||
|
*/
|
||||||
|
Z3_ast Z3_API Z3_mk_re_allchar(Z3_context c, Z3_sort regex_sort);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
\brief Create a regular expression loop. The supplied regular expression \c r is repeated
|
\brief Create a regular expression loop. The supplied regular expression \c r is repeated
|
||||||
between \c lo and \c hi times. The \c lo should be below \c hi with one exception: when
|
between \c lo and \c hi times. The \c lo should be below \c hi with one exception: when
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue