Z3
 
Loading...
Searching...
No Matches
seq.go
Go to the documentation of this file.
1package z3
2
3/*
4#include "z3.h"
5#include <stdlib.h>
6*/
7import "C"
8import (
9 "unsafe"
10)
11
12// Sequence and string operations
13
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))
17}
18
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))
22}
23
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))
29}
30
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))
34}
35
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))
39}
40
41// MkSeqConcat creates a sequence concatenation.
42func (c *Context) MkSeqConcat(exprs ...*Expr) *Expr {
43 if len(exprs) == 0 {
44 return nil
45 }
46 if len(exprs) == 1 {
47 return exprs[0]
48 }
49 cExprs := make([]C.Z3_ast, len(exprs))
50 for i, e := range exprs {
51 cExprs[i] = e.ptr
52 }
53 return newExpr(c, C.Z3_mk_seq_concat(c.ptr, C.uint(len(exprs)), &cExprs[0]))
54}
55
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))
59}
60
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))
64}
65
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))
69}
70
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))
74}
75
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))
79}
80
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))
84}
85
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))
89}
90
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))
94}
95
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))
99}
100
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))
104}
105
106// Regular expression operations
107
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))
111}
112
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))
116}
117
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))
121}
122
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))
126}
127
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))
131}
132
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))
136}
137
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)))
141}
142
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)))
147}
148
149// MkReConcat creates a concatenation of regular expressions.
150func (c *Context) MkReConcat(regexes ...*Expr) *Expr {
151 if len(regexes) == 0 {
152 return nil
153 }
154 if len(regexes) == 1 {
155 return regexes[0]
156 }
157 cRegexes := make([]C.Z3_ast, len(regexes))
158 for i, re := range regexes {
159 cRegexes[i] = re.ptr
160 }
161 return newExpr(c, C.Z3_mk_re_concat(c.ptr, C.uint(len(regexes)), &cRegexes[0]))
162}
163
164// MkReUnion creates a union (alternation) of regular expressions.
165func (c *Context) MkReUnion(regexes ...*Expr) *Expr {
166 if len(regexes) == 0 {
167 return nil
168 }
169 if len(regexes) == 1 {
170 return regexes[0]
171 }
172 cRegexes := make([]C.Z3_ast, len(regexes))
173 for i, re := range regexes {
174 cRegexes[i] = re.ptr
175 }
176 return newExpr(c, C.Z3_mk_re_union(c.ptr, C.uint(len(regexes)), &cRegexes[0]))
177}
178
179// MkReIntersect creates an intersection of regular expressions.
180func (c *Context) MkReIntersect(regexes ...*Expr) *Expr {
181 if len(regexes) == 0 {
182 return nil
183 }
184 if len(regexes) == 1 {
185 return regexes[0]
186 }
187 cRegexes := make([]C.Z3_ast, len(regexes))
188 for i, re := range regexes {
189 cRegexes[i] = re.ptr
190 }
191 return newExpr(c, C.Z3_mk_re_intersect(c.ptr, C.uint(len(regexes)), &cRegexes[0]))
192}
193
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))
197}
198
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))
202}
203
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))
207}
208
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))
212}
213
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))
217}
218
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))
222}
223
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))
227}
228
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))
232}