SMT-LIB-Like String and Sequence Syntax Support (In Progress)
Strings
Syntax | Semantics | CVC4 | Norn | Z3seq | Z3str3 |
---|---|---|---|---|---|
String literal | Printable ASCII characters enclosed in double quotes | ✓ | ✓ | ✓ | ✓ |
String sort | E.g. in (declare-const X String) | ✓ | ✓ | ✓ | ✓ |
(= s t) | Equality: String x String -> Bool | ✓ | ✓ | ✓ | ✓ |
(int.to.str i) | Retrieve string encoding of integer i. | ✓ | ✓ | ✓ | |
(str.to.int s) | Retrieve integer encoded by string s. | ✓ | ✓ | ✓ | |
(str.++ a b c) | Concatenation of one or more strings | ✓ | ✓ | ✓ | ✓ |
(str.at s offset) | Substring of length 1 at offset in s. | ✓ | ✓ | ✓ | |
(str.contains s sub) | Does s contain the substring sub? | ✓ | ✓ | ✓ | |
(str.indexof s sub offset) | First position of sub at or after offset in s. Returns -1 otherwise. | ✓ | ✓ | ✓ | |
(str.indexof s sub) | First position of sub in s. Returns -1 otherwise. | ✗ | ✗ | ✓ | ✓ |
(str.len s) | Length. Returns an integer. | ✓ | ✓ | ✓ | ✓ |
(str.prefixof pre s) | Is pre a prefix of s? | ✓ | ✓ | ✓ | |
(str.replace s src dst) | Replace the first occurrence of src by dst in s. | ✓ | ✓ | ✓ | ✓ |
(str.substr s offset length) | Retrieves string of s at offset of length length | ✓ | ✓ | ✓ | |
(str.suffixof suf s) | Is suf a suffix of s? | ✓ | ✓ | ✓ |
Sequences
Syntax | Semantics | CVC4 | Norn | Z3seq | Z3str3 |
---|---|---|---|---|---|
Seq sort | E.g. in (declare-const s (Seq Int)) for sequence of integers. | ✓ | |||
(= s t) | Equality: Seq x Seq -> Bool | ✓ | |||
(as seq.empty (Seq S)) | The empty sequence with elements of sort S. | ✓ | |||
(seq.unit elem) | Sequence with a single element elem. | ✓ | |||
(seq.++ a b c) | Concatenation of one or more sequences | ✓ | |||
(seq.at s offset) | Subsequence of length 1 at offset in s. | ✓ | |||
(seq.contains s sub) | Does s contain the subsequence sub? | ✓ | |||
(seq.indexof s sub offset) | First position of sub at or after offset in s. Returns -1 otherwise. | ✓ | |||
(seq.indexof s sub) | Retrieves first position of sub in s. Returns -1 otherwise. | ✓ | |||
(seq.len s) | Length. Returns an integer. | ✓ | |||
(seq.replace s src dst) | Replace the first occurrence of src by dst in s. | ✓ | |||
(seq.extract s offset length) | Retrieves subsequence of s at offset | ✓ | |||
(seq.prefixof pre s) | Is pre a prefix of s? | ✓ | |||
(seq.suffixof suf s) | Is suf a suffix of s? | ✓ | |||
(seq.subseq s sub) | Does s contain the subsequence sub? | ||||
(seq.nth s n) | Subsequence of length 1 at offset in s. | ||||
(seq.cons e s) | Prepend an element e to s | ||||
(seq.rev.cons s e) | Postpend an element e to s | ||||
(seq.head s) | First element of s | ||||
(seq.tail s) | Tail of s | ||||
(seq.last s) | Last element of s | ||||
(seq.first s) | All but the last element of s |
Regular Expressions
Syntax | Semantics | CVC4 | Norn | Z3seq | Z3str3 |
---|---|---|---|---|---|
(str.in.re s r) | Determine if string s is in the language generated by r. | ✓ | ✓ | ✓ | ✓ |
(str.to.re s) | Convert string to regular expression accepting s. | ✓ | ✓ | ✓ | ✓ |
((_ re.loop lo hi) r) | from lo to hi number of repetitions of r. | ✗ | ✗ | ✓ | ✗ |
(as re.all R) | The regular expression of sort R accepting every sequence. | ✗ | ✗ | ✓ | ✓ |
(as re.allchar R) | The regular expression of sort R accepting every string. | ✓ | ✗ | ✓ | ✓ |
(as re.empty R) | The regular expression R rejecting every sequence. | ✗ | ✗ | ✓ | ✓ |
(as re.nostr R) | The regular expression of sort R rejecting every string. | ✓ | ✗ | ✓ | ✓ |
(re.* r) | Kleene star. | ✓ | ✓ | ✓ | ✓ |
(re.+ r) | Kleene plus. | ✓ | ✗ | ✓ | ✓ |
(re.++ r1 r2 r3) | Concatenation of regular expressions. | ✓ | ✓ | ✓ | ✓ |
(re.inter r1 r2) | The intersection of regular languages. | ✓ | ✗ | ✓ | ✗ |
(re.opt r) | Zero or one use of r. | ✓ | ✗ | ✓ | ✓ |
(re.range ch1 ch2) | The range of elements between ch1 and ch2. | ✓ | ✗ | ✓ | ✓ |
(re.union r1 r2) | The union of regular languages. | ✓ | ✓ | ✓ | ✓ |
(re.complement r) | Complement language of r | ||||
(re.of.pred array r) | Range of predicate; array is an array of booleans | ||||
(re.difference r1 r2) | Language that accepts strings that are not accepted by both r1 and r2 | ||||
(seq.in.re s r) | Determine if sequence s is in the language generated by r. | ✓ | |||
(seq.to.re s) | Convert sequence to regular expression accepting s. | ✓ |