Margus Veanes
513b81253b
Add OP_RE_XOR and union-find bisimulation for ground regex equivalence ( #9804 )
...
Implements the algorithm of Eq(p,q) = Empty(p XOR q)' using a union-find
driven bisimulation closure (per the CAV'26 ERE paper).
### What's added
* **New primitive OP_RE_XOR (re.xor)** wired through seq_decl_plugin:
parser signature, info propagation (nullable, min_length), and
pretty-printer.
* **seq_rewriter**: structural XOR rewrites ( XOR r = empty, XOR empty =
r, ull XOR r = comp(r), comp/comp absorption, complement push, AC
normalisation), nullability (Null(p XOR q) = Null(p) != Null(q)),
derivative (D_a(p XOR q) = D_a(p) XOR D_a(q)), reverse, antimirov
derivative, and `check_deriv_normal_form` coverage.
* **New class seq::regex_bisim** in
`src/ast/rewriter/seq_regex_bisim.{h,cpp}` to keep the bisim logic out
of the already-large `seq_rewriter.cpp`. Uses `basic_union_find` from
`util/union_find.h`, an `obj_map` for the node assignment, and a
50000-step bound (returns `l_undef` on overrun).
* **Integration** in `seq_rewriter::reduce_re_eq` (with a re-entry
guard) and in `seq_regex::propagate_eq` / `propagate_ne` for ground
regexes; on `l_undef` we fall back to the existing axiomatisation.
* **`sls_seq_plugin`**: extend `OP_RE_DIFF` switch arms to also cover
`OP_RE_XOR`.
### Validation
* Full release build with MSVC + Ninja.
* `./test-z3 /a` -- 89/89 tests passing.
* `./test-z3 /seq smt2print_parse` -- PASS.
* Smoke tests with `(a|b)*` vs `(a*b*)*` (equal) and `a*` vs `(a|b)*`
(not equal) return the expected `sat`/`unsat` quickly.
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-06-10 14:58:20 -07:00
Copilot
d415ead6a2
Port is_classical attribute to seq_util::rex::info ( #9796 )
...
`is_classical` (tracks whether a regex uses only classical operators —
no complement, intersection, diff, or empty-language/fail) was only
available on `euf::snode`. Moving it into `seq_util::rex::info` makes it
accessible to all regex-handling code without going through the snode
layer.
### Changes
**`seq_decl_plugin.h`**
- Added `bool classical { true }` to `seq_util::rex::info`
- The general `info` constructor requires `bool is_classical` explicitly
(no default)
**`seq_decl_plugin.cpp`**
- `mk_info_rec`: `OP_RE_EMPTY_SET` (fail) sets `classical=false`
- `mk_info_rec`: `OP_RE_RANGE`, `OP_RE_FULL_CHAR_SET`, `OP_RE_OF_PRED`
set `classical=false`
- `complement()`, `conj()` (intersection), `diff()`: always produce
`classical=false`
- `star()`, `plus()`, `opt()`, `concat()`, `disj()`, `orelse()`,
`loop()`: propagate `classical` via logical AND over operands
- `operator=` and `display()` updated to include `classical`
### Semantics
| Operation | `classical` |
|-----------|-------------|
| `re.empty` (fail) | `false` |
| `re.range`, `re.allchar`, `re.of.pred` | `false` |
| `re.comp` (complement) | `false` |
| `re.inter` (intersection) | `false` |
| `re.diff` | `false` |
| `re.all` (full sequence set) | `true` |
| `str.to.re` (string literal) | `true` |
| `re.*`, `re.+`, `re.opt`, `re.++`, `re.union`, `re.loop` | inherited
from operands |
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
2026-06-09 14:35:48 -07:00
Clemens Eisenhofer
1553bae20c
Performance improvements for seq-sls ( #7519 )
...
* Improve length repair
* Fixed arguments
* Special case regex membership with constant string
* Trying hybrid eq-repair strategy
* Different heuristic
* Fixed stoi
2025-01-21 08:01:59 -08:00
Nikolaj Bjorner
ab9ea4e6e7
Add outline of elimination for regex membership constraints
2025-01-07 14:17:28 -08:00
Nikolaj Bjorner
24c3cd38d1
add v0 of equality solver
2024-11-30 17:25:49 -08:00
Nuno Lopes
a62fede64b
remove a few default constructors
2024-09-23 08:17:58 +01:00
Nikolaj Bjorner
0629353fdc
add match for foldli
2022-09-10 16:02:11 -07:00
Bruce Mitchener
1d9345c3de
Fix typos.
2022-08-05 07:40:50 +03:00
Nikolaj Bjorner
1e0f71c971
add way to access range bounds directly #6186
...
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
2022-07-22 09:35:37 -07:00
Nikolaj Bjorner
1e8f9078e3
fix unsoundness in explanation handling for nested datatypes and sequences
2022-07-03 17:00:39 -07:00
Nikolaj Bjorner
367bfedab0
add min/max diff in final check
...
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
2022-05-04 07:39:38 -07:00
Nikolaj Bjorner
87d2a3b4e5
map/mapi/foldl/foldli
...
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
2022-05-04 01:10:18 -07:00
Nikolaj Bjorner
e1929ca9b9
add regex power to API and for Java per request
...
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
2022-03-15 19:18:33 -07:00
Margus Veanes
a7b1db611c
State graph dgml update and fixes in condition simplifier ( #5721 )
...
* improved generated dgml graph
* fixed simplification of negated ranges and did some code cleanup
* do not make loops with lower=upper=0, this is epsilon
* do not add loops with lower=upper=1
* bug fix in normalization: forgotten eps case
2021-12-19 11:09:55 -08:00
Margus Veanes
2be93870c8
Cleanup regex info and some fixes in Derivative code ( #5709 )
...
* removed unused regex info fields
* cleanup of info and fixes in antimirov derivatives
* removed extra qualification on operator
2021-12-15 10:59:34 -08:00
Nikolaj Bjorner
51fa40ece5
fix spelling
2021-12-09 10:23:37 -08:00
Nikolaj Bjorner
518ef9f916
fix #5674
...
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
2021-11-18 21:14:50 -08:00
Nikolaj Bjorner
fb9fa1b7d2
updated printer
2021-10-15 17:56:54 -07:00
Nikolaj Bjorner
9a76bf0aa2
#5591
...
nth issue
2021-10-12 13:59:28 -07:00
Margus Veanes
146f4621c5
Updated regex derivative engine ( #5567 )
...
* updated derivative engine
* some edit
* further improvements in derivative code
* more deriv code edits and re::to_str update
* optimized mk_deriv_accept
* fixed PR comments
* small syntax fix
* updated some simplifications
* bugfix:forgot to_re before reverse
* fixed PR comments
* more PR comment fixes
* more PR comment fixes
* forgot to delete
* deleting unused definition
* fixes
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* fixes
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
Co-authored-by: Nikolaj Bjorner <nbjorner@microsoft.com>
2021-10-08 13:04:49 -07:00
Nikolaj Bjorner
f13ccf8969
bv2char and char2bv with Clemens
...
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
2021-09-13 16:09:03 +02:00
CEisenhofer
47fdd6c060
Added 16 bit string-encoding ( #5540 )
2021-09-09 11:35:16 +02:00
CEisenhofer
0fa4b63d26
Added sbv2s ( #5413 )
...
* Added sbv2s
* Fixed indention
Co-authored-by: Clemens Eisenhofer <Clemens.Eisenhofer@tuwien.ac.at>
2021-07-16 17:58:28 +02:00
Nikolaj Bjorner
b6a3891ac4
str.from_ubv step2
2021-07-12 15:00:36 +02:00
Nikolaj Bjorner
1bc10cebc5
add ubv2s step 1
2021-07-12 12:53:00 +02:00
Nikolaj Bjorner
29c6d42380
is-char is overloaded #5389
...
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
2021-07-07 08:20:31 +02:00
Nikolaj Bjorner
bdcfba1324
use sort* not ast* #5386
2021-07-06 10:19:17 +02:00
Nuno Lopes
f1e0d5dc8a
remove a hundred implicit constructors/destructors
2021-05-23 14:25:01 +01:00
Nikolaj Bjorner
20a67e47ca
remove symbol -> zstring -> symbol round-trips
...
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
2021-05-22 13:12:49 -07:00
Nikolaj Bjorner
4a6083836a
call it data instead of c_ptr for approaching C++11 std::vector convention.
2021-04-13 18:17:35 -07:00
Nikolaj Bjorner
9098084217
reduce overhead of creating seq-plugin, enable parameter cleanup for #5095
2021-03-15 11:54:44 -07:00
Nikolaj Bjorner
377d060036
move to separate axiom management
...
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
2021-02-23 18:09:45 -08:00
Nikolaj Bjorner
612cc5cfba
fix #5014
...
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
2021-02-12 16:01:33 -08:00
Nikolaj Bjorner
cbb570051c
#5007 - wrong recognizer function definitions
2021-02-09 09:54:24 -08:00
Nikolaj Bjorner
0f29fff836
remove bit-vector dependencies in seq theory
2021-02-08 10:57:50 -08:00
Nikolaj Bjorner
4455f6caf8
move to get_sort as method, add opt_lns pass, disable xor simplification unless configured, fix perf bug in model converter update trail
2021-02-02 03:58:19 -08:00
Nikolaj Bjorner
909257f856
remove family id externals
...
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
2021-01-27 06:48:24 -08:00
Nikolaj Bjorner
d3564f5b50
move unicode toggle to char-plugin
...
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
2021-01-27 06:42:19 -08:00
Nikolaj Bjorner
e969bd1c97
fully remove seq-based characters
...
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
2021-01-27 06:26:44 -08:00
Nikolaj Bjorner
d0f1d8f59e
move to unicode as stand-alone theory
...
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
2021-01-27 05:46:45 -08:00
Nikolaj Bjorner
20332c6d3e
adding char decl plugin for separate theory treatment
...
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
2021-01-26 16:28:44 -08:00
Nikolaj Bjorner
33714ceb40
use _
2021-01-26 14:56:48 -08:00
Nikolaj Bjorner
47cb1d1207
remove bit-vector dependencies in theory_str_mc. See discussion #4939
...
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
2021-01-23 13:03:06 -08:00
Nikolaj Bjorner
03fd251ccb
streamline unicode/ascii toggling. Fix bit-width for unicode to 18
2021-01-23 11:11:44 -08:00
Nikolaj Bjorner
4e8ba8b160
regression fix, fix unicode mode
2021-01-21 22:06:15 -08:00
Nikolaj Bjorner
dafee71500
reshuffle unicode support to use global parameter, and use bit-vectors on demand
2021-01-21 14:24:26 -08:00
Nikolaj Bjorner
5d10cb7af4
fix #4791 - diff is left associative
...
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
2020-11-11 18:07:05 -08:00
Margus Veanes
af54a79acc
fixing issue #4651 ( #4666 )
...
* fixing issue #4651
* regression fix
* fix #4662
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* na
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* reenabled lift_ites_throttled with an additional filter, without the filter finding the model in report #4651 goes from .02s to 20s, also updated pretty printing of regexes to be more accurate
* removing temp testing variable
* Allow to skip System.loadLibrary() calls from Java Native class (#4667 )
* using intended utility methods for sort detection
* adding ack/model
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* add smt params dependency
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* missing file
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* deps
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* order
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* persist fields
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* dbg build
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* reset caches
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* sr
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* fix cmake build
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* shuffle dependencies
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* warnings /errors
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* update include
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* missing cmakelists
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* update cmake
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* add depend
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* add depend
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* virtual method
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* path
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* move parameters from ast/rewriter to params
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* move fpa
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* fix warnings
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* remove pragma
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* dbg
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* updated sat_smt
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* na
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* fix #4651
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* encoding options #4665
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* expose name inclusion as optional
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* fix misc issues around #4661 introduced when adding lazy push/pop to selected theories
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* remove lazy push from theory_lra
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* na
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* fix dotnet build
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* na
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* release nodes
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* free memory in egraph
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* avoid duplicate class names frame in sat_scc and sat_smt
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* adding euf
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* elaborate on smt/drat format outline, expose euf mode as config
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* mk-var during copy
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* move theory_var_list into id_var_list and utilities from smt-enode into it, prepare for theory variables in egraph
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* with bounded
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* na
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* Remove duplicate binary condition. Fixes #4668 .
* butterfly effect on fp?
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* prepare for theory plugins
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* file
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* build fix
* remove SMTFD
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* na
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* na
* na
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* na
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* na
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* na
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* na
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* na
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* na
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
* SMTFD is back (#4676 )
* fixing issue #4651
* regression fix
* reenabled lift_ites_throttled with an additional filter, without the filter finding the model in report #4651 goes from .02s to 20s, also updated pretty printing of regexes to be more accurate
* removing temp testing variable
* using intended utility methods for sort detection
* misc edits related to nonground regexes
* bug fix of state id off by 1 calculation error and improved pretty printing with regex tooltip generated in dgml state graph
* removed unused method declaration
* improved id to regex value map info in generated dgml
* reorgd callback function for state pretty printer
* updated some comments
Co-authored-by: Nikolaj Bjorner <nbjorner@microsoft.com>
Co-authored-by: Sergey Vladimirov <vlsergey@gmail.com>
Co-authored-by: Christoph M. Wintersteiger <cwinter@microsoft.com>
Co-authored-by: Arie Gurfinkel <arie.gurfinkel@gmail.com>
2020-09-08 04:13:18 -07:00
Margus Veanes
5e5ef50dbc
re info extension ( #4659 )
...
* made loop info calculation more accurate
* made loop info calculation more accurate
* updated formattig and added const declarations
2020-08-22 15:59:53 -07:00
Margus Veanes
1e29ba76d0
renamed compl method (compl is a reserved c++ keyword) to complement
2020-08-21 17:34:15 -07:00