3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-06-06 06:03:23 +00:00

quick path with string-integer integration in theory_str::simplify_concat_equality

This commit is contained in:
Murphy Berzish 2016-06-19 18:25:31 -04:00
parent 5b3c868c90
commit 89a337ba7e

View file

@ -1733,17 +1733,12 @@ void theory_str::simplify_concat_equality(expr * nn1, expr * nn2) {
expr * a2_arg0 = a_nn2->get_arg(0); expr * a2_arg0 = a_nn2->get_arg(0);
expr * a2_arg1 = a_nn2->get_arg(1); expr * a2_arg1 = a_nn2->get_arg(1);
// TODO rational a1_arg0_len, a1_arg1_len, a2_arg0_len, a2_arg1_len;
/*
int a1_arg0_len = getLenValue(t, a1_arg0); bool a1_arg0_len_exists = get_len_value(a1_arg0, a1_arg0_len);
int a1_arg1_len = getLenValue(t, a1_arg1); bool a1_arg1_len_exists = get_len_value(a1_arg1, a1_arg1_len);
int a2_arg0_len = getLenValue(t, a2_arg0); bool a2_arg0_len_exists = get_len_value(a2_arg0, a2_arg0_len);
int a2_arg1_len = getLenValue(t, a2_arg1); bool a2_arg1_len_exists = get_len_value(a2_arg1, a2_arg1_len);
*/
int a1_arg0_len = -1;
int a1_arg1_len = -1;
int a2_arg0_len = -1;
int a2_arg1_len = -1;
TRACE("t_str", tout << "nn1 = " << mk_ismt2_pp(nn1, m) << std::endl TRACE("t_str", tout << "nn1 = " << mk_ismt2_pp(nn1, m) << std::endl
<< "nn2 = " << mk_ismt2_pp(nn2, m) << std::endl;); << "nn2 = " << mk_ismt2_pp(nn2, m) << std::endl;);
@ -1797,35 +1792,38 @@ void theory_str::simplify_concat_equality(expr * nn1, expr * nn2) {
} }
} }
// TODO quick path 1-2 // quick path 2-1
/* if (a1_arg0_len_exists && a2_arg0_len_exists && a1_arg0_len == a2_arg0_len) {
if(a1_arg0_len != -1 && a2_arg0_len != -1 && a1_arg0_len == a2_arg0_len){ if (!in_same_eqc(a1_arg0, a2_arg0)) {
if (! inSameEqc(t, a1_arg0, a2_arg0)) { TRACE("t_str_detail", tout << "quick path 2-1: len(nn1.arg0) == len(nn2.arg0)" << std::endl;);
__debugPrint(logFile, ">> [simplifyConcatEq] Quick Path 2-1: len(nn1.arg0) == len(nn2.arg0)\n"); expr_ref ax_l1(ctx.mk_eq_atom(nn1, nn2), m);
Z3_ast ax_l1 = Z3_mk_eq(ctx, nn1, nn2); expr_ref ax_l2(ctx.mk_eq_atom(mk_strlen(a1_arg0), mk_strlen(a2_arg0)), m);
Z3_ast ax_l2 = Z3_mk_eq(ctx, mk_length(t, a1_arg0), mk_length(t, a2_arg0)); expr_ref ax_r1(ctx.mk_eq_atom(a1_arg0, a2_arg0), m);
Z3_ast ax_r1 = Z3_mk_eq(ctx, a1_arg0, a2_arg0); expr_ref ax_r2(ctx.mk_eq_atom(a1_arg1, a2_arg1), m);
Z3_ast ax_r2 = Z3_mk_eq(ctx, a1_arg1, a2_arg1);
Z3_ast toAdd = Z3_mk_implies(ctx, mk_2_and(t, ax_l1, ax_l2), mk_2_and(t, ax_r1, ax_r2));
addAxiom(t, toAdd, __LINE__);
return;
}
}
if (a1_arg1_len != -1 && a2_arg1_len != -1 && a1_arg1_len == a2_arg1_len) expr_ref premise(m.mk_and(ax_l1, ax_l2), m);
{ expr_ref conclusion(m.mk_and(ax_r1, ax_r2), m);
if (!inSameEqc(t, a1_arg1, a2_arg1)) {
__debugPrint(logFile, ">> [simplifyConcatEq] Quick Path 2-2: len(nn1.arg1) == len(nn2.arg1)\n"); assert_implication(premise, conclusion);
Z3_ast ax_l1 = Z3_mk_eq(ctx, nn1, nn2); return;
Z3_ast ax_l2 = Z3_mk_eq(ctx, mk_length(t, a1_arg1), mk_length(t, a2_arg1)); }
Z3_ast ax_r1 = Z3_mk_eq(ctx, a1_arg0, a2_arg0); }
Z3_ast ax_r2 = Z3_mk_eq(ctx, a1_arg1, a2_arg1);
Z3_ast toAdd = Z3_mk_implies(ctx, mk_2_and(t, ax_l1, ax_l2), mk_2_and(t, ax_r1, ax_r2)); if (a1_arg1_len_exists && a2_arg1_len_exists && a1_arg1_len == a2_arg1_len) {
addAxiom(t, toAdd, __LINE__); if (!in_same_eqc(a1_arg1, a2_arg1)) {
return; TRACE("t_str_detail", tout << "quick path 2-2: len(nn1.arg1) == len(nn2.arg1)" << std::endl;);
expr_ref ax_l1(ctx.mk_eq_atom(nn1, nn2), m);
expr_ref ax_l2(ctx.mk_eq_atom(mk_strlen(a1_arg1), mk_strlen(a2_arg1)), m);
expr_ref ax_r1(ctx.mk_eq_atom(a1_arg0, a2_arg0), m);
expr_ref ax_r2(ctx.mk_eq_atom(a1_arg1, a2_arg1), m);
expr_ref premise(m.mk_and(ax_l1, ax_l2), m);
expr_ref conclusion(m.mk_and(ax_r1, ax_r2), m);
assert_implication(premise, conclusion);
return;
}
} }
}
*/
expr * new_nn1 = simplify_concat(nn1); expr * new_nn1 = simplify_concat(nn1);
expr * new_nn2 = simplify_concat(nn2); expr * new_nn2 = simplify_concat(nn2);