12// Sequence and string operations
14// MkSeqSort creates a sequence sort.
15func (c *Context) MkSeqSort(elemSort *Sort) *Sort {
16 return newSort(c, C.Z3_mk_seq_sort(c.ptr, elemSort.ptr))
19// MkStringSort creates a string sort (sequence of characters).
20func (c *Context) MkStringSort() *Sort {
21 return newSort(c, C.Z3_mk_string_sort(c.ptr))
24// MkString creates a string constant.
25func (c *Context) MkString(value string) *Expr {
26 cStr := C.CString(value)
27 defer C.free(unsafe.Pointer(cStr))
28 return newExpr(c, C.Z3_mk_string(c.ptr, cStr))
31// MkEmptySeq creates an empty sequence.
32func (c *Context) MkEmptySeq(sort *Sort) *Expr {
33 return newExpr(c, C.Z3_mk_seq_empty(c.ptr, sort.ptr))
36// MkSeqUnit creates a unit sequence containing a single element.
37func (c *Context) MkSeqUnit(elem *Expr) *Expr {
38 return newExpr(c, C.Z3_mk_seq_unit(c.ptr, elem.ptr))
41// MkSeqConcat creates a sequence concatenation.
42func (c *Context) MkSeqConcat(exprs ...*Expr) *Expr {
49 cExprs := make([]C.Z3_ast, len(exprs))
50 for i, e := range exprs {
53 return newExpr(c, C.Z3_mk_seq_concat(c.ptr, C.uint(len(exprs)), &cExprs[0]))
56// MkSeqLength creates a sequence length operation.
57func (c *Context) MkSeqLength(seq *Expr) *Expr {
58 return newExpr(c, C.Z3_mk_seq_length(c.ptr, seq.ptr))
61// MkSeqPrefix creates a sequence prefix predicate.
62func (c *Context) MkSeqPrefix(prefix, seq *Expr) *Expr {
63 return newExpr(c, C.Z3_mk_seq_prefix(c.ptr, prefix.ptr, seq.ptr))
66// MkSeqSuffix creates a sequence suffix predicate.
67func (c *Context) MkSeqSuffix(suffix, seq *Expr) *Expr {
68 return newExpr(c, C.Z3_mk_seq_suffix(c.ptr, suffix.ptr, seq.ptr))
71// MkSeqContains creates a sequence contains predicate.
72func (c *Context) MkSeqContains(seq, substr *Expr) *Expr {
73 return newExpr(c, C.Z3_mk_seq_contains(c.ptr, seq.ptr, substr.ptr))
76// MkSeqAt creates a sequence element access operation.
77func (c *Context) MkSeqAt(seq, index *Expr) *Expr {
78 return newExpr(c, C.Z3_mk_seq_at(c.ptr, seq.ptr, index.ptr))
81// MkSeqExtract creates a sequence extract (substring) operation.
82func (c *Context) MkSeqExtract(seq, offset, length *Expr) *Expr {
83 return newExpr(c, C.Z3_mk_seq_extract(c.ptr, seq.ptr, offset.ptr, length.ptr))
86// MkSeqReplace creates a sequence replace operation.
87func (c *Context) MkSeqReplace(seq, src, dst *Expr) *Expr {
88 return newExpr(c, C.Z3_mk_seq_replace(c.ptr, seq.ptr, src.ptr, dst.ptr))
91// MkSeqIndexOf creates a sequence index-of operation.
92func (c *Context) MkSeqIndexOf(seq, substr, offset *Expr) *Expr {
93 return newExpr(c, C.Z3_mk_seq_index(c.ptr, seq.ptr, substr.ptr, offset.ptr))
96// MkStrToInt creates a string-to-integer conversion.
97func (c *Context) MkStrToInt(str *Expr) *Expr {
98 return newExpr(c, C.Z3_mk_str_to_int(c.ptr, str.ptr))
101// MkIntToStr creates an integer-to-string conversion.
102func (c *Context) MkIntToStr(num *Expr) *Expr {
103 return newExpr(c, C.Z3_mk_int_to_str(c.ptr, num.ptr))
106// Regular expression operations
108// MkReSort creates a regular expression sort.
109func (c *Context) MkReSort(seqSort *Sort) *Sort {
110 return newSort(c, C.Z3_mk_re_sort(c.ptr, seqSort.ptr))
113// MkToRe converts a sequence to a regular expression that accepts exactly that sequence.
114func (c *Context) MkToRe(seq *Expr) *Expr {
115 return newExpr(c, C.Z3_mk_seq_to_re(c.ptr, seq.ptr))
118// MkInRe creates a membership predicate for a sequence in a regular expression.
119func (c *Context) MkInRe(seq, re *Expr) *Expr {
120 return newExpr(c, C.Z3_mk_seq_in_re(c.ptr, seq.ptr, re.ptr))
123// MkReStar creates a Kleene star (zero or more repetitions) of a regular expression.
124func (c *Context) MkReStar(re *Expr) *Expr {
125 return newExpr(c, C.Z3_mk_re_star(c.ptr, re.ptr))
128// MkRePlus creates a Kleene plus (one or more repetitions) of a regular expression.
129func (c *Context) MkRePlus(re *Expr) *Expr {
130 return newExpr(c, C.Z3_mk_re_plus(c.ptr, re.ptr))
133// MkReOption creates an optional regular expression (zero or one repetition).
134func (c *Context) MkReOption(re *Expr) *Expr {
135 return newExpr(c, C.Z3_mk_re_option(c.ptr, re.ptr))
138// MkRePower creates a regular expression that matches exactly n repetitions.
139func (c *Context) MkRePower(re *Expr, n uint) *Expr {
140 return newExpr(c, C.Z3_mk_re_power(c.ptr, re.ptr, C.uint(n)))
143// MkReLoop creates a regular expression with bounded repetition (between lo and hi times).
144// If hi is 0, it means unbounded (at least lo times).
145func (c *Context) MkReLoop(re *Expr, lo, hi uint) *Expr {
146 return newExpr(c, C.Z3_mk_re_loop(c.ptr, re.ptr, C.uint(lo), C.uint(hi)))
149// MkReConcat creates a concatenation of regular expressions.
150func (c *Context) MkReConcat(regexes ...*Expr) *Expr {
151 if len(regexes) == 0 {
154 if len(regexes) == 1 {
157 cRegexes := make([]C.Z3_ast, len(regexes))
158 for i, re := range regexes {
161 return newExpr(c, C.Z3_mk_re_concat(c.ptr, C.uint(len(regexes)), &cRegexes[0]))
164// MkReUnion creates a union (alternation) of regular expressions.
165func (c *Context) MkReUnion(regexes ...*Expr) *Expr {
166 if len(regexes) == 0 {
169 if len(regexes) == 1 {
172 cRegexes := make([]C.Z3_ast, len(regexes))
173 for i, re := range regexes {
176 return newExpr(c, C.Z3_mk_re_union(c.ptr, C.uint(len(regexes)), &cRegexes[0]))
179// MkReIntersect creates an intersection of regular expressions.
180func (c *Context) MkReIntersect(regexes ...*Expr) *Expr {
181 if len(regexes) == 0 {
184 if len(regexes) == 1 {
187 cRegexes := make([]C.Z3_ast, len(regexes))
188 for i, re := range regexes {
191 return newExpr(c, C.Z3_mk_re_intersect(c.ptr, C.uint(len(regexes)), &cRegexes[0]))
194// MkReComplement creates the complement of a regular expression.
195func (c *Context) MkReComplement(re *Expr) *Expr {
196 return newExpr(c, C.Z3_mk_re_complement(c.ptr, re.ptr))
199// MkReDiff creates the difference of two regular expressions (a - b).
200func (c *Context) MkReDiff(a, b *Expr) *Expr {
201 return newExpr(c, C.Z3_mk_re_diff(c.ptr, a.ptr, b.ptr))
204// MkReEmpty creates an empty regular expression (accepts no strings).
205func (c *Context) MkReEmpty(sort *Sort) *Expr {
206 return newExpr(c, C.Z3_mk_re_empty(c.ptr, sort.ptr))
209// MkReFull creates a full regular expression (accepts all strings).
210func (c *Context) MkReFull(sort *Sort) *Expr {
211 return newExpr(c, C.Z3_mk_re_full(c.ptr, sort.ptr))
214// MkReAllchar creates a regular expression that accepts all single characters.
215func (c *Context) MkReAllchar(sort *Sort) *Expr {
216 return newExpr(c, C.Z3_mk_re_allchar(c.ptr, sort.ptr))
219// MkReRange creates a regular expression for a character range [lo, hi].
220func (c *Context) MkReRange(lo, hi *Expr) *Expr {
221 return newExpr(c, C.Z3_mk_re_range(c.ptr, lo.ptr, hi.ptr))
224// MkSeqReplaceRe replaces the first occurrence matching a regular expression.
225func (c *Context) MkSeqReplaceRe(seq, re, replacement *Expr) *Expr {
226 return newExpr(c, C.Z3_mk_seq_replace_re(c.ptr, seq.ptr, re.ptr, replacement.ptr))
229// MkSeqReplaceReAll replaces all occurrences matching a regular expression.
230func (c *Context) MkSeqReplaceReAll(seq, re, replacement *Expr) *Expr {
231 return newExpr(c, C.Z3_mk_seq_replace_re_all(c.ptr, seq.ptr, re.ptr, replacement.ptr))