@@ -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