@@ -1384,9 +1384,16 @@ br_status seq_rewriter::mk_seq_nth(expr* a, expr* b, expr_ref& result) {
13841384 }
13851385
13861386 expr* la = str ().mk_length (a);
1387- result = m ().mk_ite (m ().mk_and (m_autil.mk_ge (b, zero ()), m ().mk_not (m_autil.mk_le (la, b))),
1388- str ().mk_nth_i (a, b),
1389- str ().mk_nth_u (a, b));
1387+ {
1388+ // deterministic evaluation order for guard components
1389+ auto ge0 = m_autil.mk_ge (b, zero ());
1390+ auto le_la = m_autil.mk_le (la, b);
1391+ auto not_le = m ().mk_not (le_la);
1392+ auto guard = m ().mk_and (ge0, not_le);
1393+ auto t1 = str ().mk_nth_i (a, b);
1394+ auto e1 = str ().mk_nth_u (a, b);
1395+ result = m ().mk_ite (guard, t1, e1 );
1396+ }
13901397 return BR_REWRITE_FULL;
13911398}
13921399
@@ -2716,7 +2723,10 @@ br_status seq_rewriter::mk_re_reverse(expr* r, expr_ref& result) {
27162723 zstring zs;
27172724 unsigned lo = 0 , hi = 0 ;
27182725 if (re ().is_concat (r, r1, r2)) {
2719- result = re ().mk_concat (re ().mk_reverse (r2), re ().mk_reverse (r1));
2726+ // deterministic evaluation order for reverse operands
2727+ auto a_rev = re ().mk_reverse (r2);
2728+ auto b_rev = re ().mk_reverse (r1);
2729+ result = re ().mk_concat (a_rev, b_rev);
27202730 return BR_REWRITE2;
27212731 }
27222732 else if (re ().is_star (r, r1)) {
@@ -2787,8 +2797,9 @@ br_status seq_rewriter::mk_re_reverse(expr* r, expr_ref& result) {
27872797 return BR_DONE;
27882798 }
27892799 else if (re ().is_to_re (r, s) && str ().is_concat (s, s1, s2)) {
2790- result = re ().mk_concat (re ().mk_reverse (re ().mk_to_re (s2)),
2791- re ().mk_reverse (re ().mk_to_re (s1)));
2800+ auto a_rev = re ().mk_reverse (re ().mk_to_re (s2));
2801+ auto b_rev = re ().mk_reverse (re ().mk_to_re (s1));
2802+ result = re ().mk_concat (a_rev, b_rev);
27922803 return BR_REWRITE3;
27932804 }
27942805 else {
@@ -3022,8 +3033,15 @@ void seq_rewriter::mk_antimirov_deriv_rec(expr* e, expr* r, expr* path, expr_ref
30223033 result = mk_antimirov_deriv_union (c1, re ().mk_ite_simplify (r1nullable, mk_antimirov_deriv (e, r2, path), nothing ()));
30233034 }
30243035 else if (m ().is_ite (r, c, r1, r2)) {
3025- c1 = simplify_path (e, m ().mk_and (c, path));
3026- c2 = simplify_path (e, m ().mk_and (m ().mk_not (c), path));
3036+ {
3037+ auto cp = m ().mk_and (c, path);
3038+ c1 = simplify_path (e, cp);
3039+ }
3040+ {
3041+ auto notc = m ().mk_not (c);
3042+ auto np = m ().mk_and (notc, path);
3043+ c2 = simplify_path (e, np);
3044+ }
30273045 if (m ().is_false (c1))
30283046 result = mk_antimirov_deriv (e, r2, c2);
30293047 else if (m ().is_false (c2))
0 commit comments