Skip to content

Commit 00f1e6a

Browse files
committed
parameter eval order
1 parent c154b9d commit 00f1e6a

File tree

1 file changed

+23
-8
lines changed

1 file changed

+23
-8
lines changed

‎src/ast/rewriter/seq_rewriter.cpp‎

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3412,12 +3412,22 @@ expr_ref seq_rewriter::mk_regex_reverse(expr* r) {
34123412
result = mk_regex_concat(mk_regex_reverse(r2), mk_regex_reverse(r1));
34133413
else if (m().is_ite(r, c, r1, r2))
34143414
result = m().mk_ite(c, mk_regex_reverse(r1), mk_regex_reverse(r2));
3415-
else if (re().is_union(r, r1, r2))
3416-
result = re().mk_union(mk_regex_reverse(r1), mk_regex_reverse(r2));
3417-
else if (re().is_intersection(r, r1, r2))
3418-
result = re().mk_inter(mk_regex_reverse(r1), mk_regex_reverse(r2));
3419-
else if (re().is_diff(r, r1, r2))
3420-
result = re().mk_diff(mk_regex_reverse(r1), mk_regex_reverse(r2));
3415+
else if (re().is_union(r, r1, r2)) {
3416+
// enforce deterministic evaluation order
3417+
auto a1 = mk_regex_reverse(r1);
3418+
auto b1 = mk_regex_reverse(r2);
3419+
result = re().mk_union(a1, b1);
3420+
}
3421+
else if (re().is_intersection(r, r1, r2)) {
3422+
auto a1 = mk_regex_reverse(r1);
3423+
auto b1 = mk_regex_reverse(r2);
3424+
result = re().mk_inter(a1, b1);
3425+
}
3426+
else if (re().is_diff(r, r1, r2)) {
3427+
auto a1 = mk_regex_reverse(r1);
3428+
auto b1 = mk_regex_reverse(r2);
3429+
result = re().mk_diff(a1, b1);
3430+
}
34213431
else if (re().is_star(r, r1))
34223432
result = re().mk_star(mk_regex_reverse(r1));
34233433
else if (re().is_plus(r, r1))
@@ -5093,11 +5103,16 @@ br_status seq_rewriter::reduce_re_is_empty(expr* r, expr_ref& result) {
50935103
}
50945104
// Partial DNF expansion:
50955105
else if (re().is_intersection(r, r1, r2) && re().is_union(r1, r3, r4)) {
5096-
result = eq_empty(re().mk_union(re().mk_inter(r3, r2), re().mk_inter(r4, r2)));
5106+
// enforce deterministic order for nested intersections inside union
5107+
auto a1 = re().mk_inter(r3, r2);
5108+
auto b1 = re().mk_inter(r4, r2);
5109+
result = eq_empty(re().mk_union(a1, b1));
50975110
return BR_REWRITE3;
50985111
}
50995112
else if (re().is_intersection(r, r1, r2) && re().is_union(r2, r3, r4)) {
5100-
result = eq_empty(re().mk_union(re().mk_inter(r3, r1), re().mk_inter(r4, r1)));
5113+
auto a1 = re().mk_inter(r3, r1);
5114+
auto b1 = re().mk_inter(r4, r1);
5115+
result = eq_empty(re().mk_union(a1, b1));
51015116
return BR_REWRITE3;
51025117
}
51035118
return BR_FAILED;

0 commit comments

Comments
 (0)