@@ -340,6 +340,7 @@ bool theory_seq::reduce_length_eq() {
340
340
context& ctx = get_context ();
341
341
int start = ctx.get_random_value ();
342
342
343
+ TRACE (" seq" , tout << " reduce length eq\n " ;);
343
344
for (unsigned i = 0 ; !ctx.inconsistent () && i < m_eqs.size (); ++i) {
344
345
eq const & e = m_eqs[(i + start) % m_eqs.size ()];
345
346
if (reduce_length_eq (e.ls (), e.rs (), e.dep ())) {
@@ -2688,8 +2689,8 @@ bool theory_seq::reduce_length_eq(expr_ref_vector const& ls, expr_ref_vector con
2688
2689
rhs.append (rs.size ()-1 , rs.c_ptr ());
2689
2690
SASSERT (!lhs.empty () || !rhs.empty ());
2690
2691
deps = mk_join (deps, lits);
2692
+ TRACE (" seq" , tout << " Propagate equal lengths " << l << " " << r << " \n " << " ls: " << ls << " \n rs: " << rs << " \n " ;);
2691
2693
m_eqs.push_back (eq (m_eq_id++, lhs, rhs, deps));
2692
- TRACE (" seq" , tout << " Propagate equal lengths " << l << " " << r << " \n " ;);
2693
2694
propagate_eq (deps, lits, l, r, true );
2694
2695
return true ;
2695
2696
}
@@ -2762,10 +2763,6 @@ bool theory_seq::reduce_length(unsigned i, unsigned j, bool front, expr_ref_vect
2762
2763
expr_ref lenr = mk_len (r);
2763
2764
literal lit = mk_eq (lenl, lenr, false );
2764
2765
if (ctx.get_assignment (lit) == l_true) {
2765
- // expr_ref len_eq(m.mk_eq(lenl, lenr), m);
2766
- // if (ctx.find_assignment(len_eq) == l_true) {
2767
- // literal lit = mk_eq(lenl, lenr, false);
2768
- // literal_vector lits;
2769
2766
expr_ref_vector lhs (m), rhs (m);
2770
2767
lhs.append (l2, ls2);
2771
2768
rhs.append (r2, rs2);
@@ -2776,7 +2773,6 @@ bool theory_seq::reduce_length(unsigned i, unsigned j, bool front, expr_ref_vect
2776
2773
return true ;
2777
2774
}
2778
2775
else {
2779
- // TRACE("seq", tout << "Assignment: " << lenl << " = " << lenr << " " << ctx.get_assignment(lit) << "\n";);
2780
2776
return false ;
2781
2777
}
2782
2778
}
@@ -2909,13 +2905,16 @@ bool theory_seq::get_length(expr* e, expr_ref& len, literal_vector& lits) {
2909
2905
TRACE (" seq" , ctx.display_literals_verbose (tout, 2 , _lits); tout << " \n " ;);
2910
2906
}
2911
2907
else if (is_skolem (m_tail, e)) {
2908
+ // e = tail(s, l), len(s) > l =>
2909
+ // len(tail(s, l)) = len(s) - l - 1
2912
2910
s = to_app (e)->get_arg (0 );
2913
2911
l = to_app (e)->get_arg (1 );
2914
2912
expr_ref len_s = mk_len (s);
2915
- literal len_s_ge_l = mk_simplified_literal (m_autil.mk_ge (mk_sub (len_s, l), m_autil.mk_int (0 )));
2916
- if (ctx.get_assignment (len_s_ge_l) == l_true) {
2917
- len = mk_sub (len_s, l);
2918
- lits.push_back (len_s_ge_l);
2913
+ literal len_s_gt_l = mk_simplified_literal (m_autil.mk_ge (mk_sub (len_s, l), m_autil.mk_int (1 )));
2914
+ if (ctx.get_assignment (len_s_gt_l) == l_true) {
2915
+ len = mk_sub (len_s, mk_sub (l, m_autil.mk_int (1 )));
2916
+ TRACE (" seq" , tout << len_s << " " << len << " " << len_s_gt_l << " \n " ;);
2917
+ lits.push_back (len_s_gt_l);
2919
2918
return true ;
2920
2919
}
2921
2920
}
@@ -4952,7 +4951,7 @@ void theory_seq::add_at_axiom(expr* e) {
4952
4951
es.push_back (m_util.str .mk_unit (mk_nth (s, m_autil.mk_int (j))));
4953
4952
}
4954
4953
nth = es.back ();
4955
- es.push_back (mk_skolem (m_tail, s, m_autil. mk_int (k) ));
4954
+ es.push_back (mk_skolem (m_tail, s, i ));
4956
4955
add_axiom (~i_ge_0, i_ge_len_s, mk_seq_eq (s, m_util.str .mk_concat (es)));
4957
4956
add_axiom (~i_ge_0, i_ge_len_s, mk_seq_eq (nth, e));
4958
4957
}
@@ -4987,6 +4986,7 @@ void theory_seq::add_nth_axiom(expr* e) {
4987
4986
lit => s = (nth s 0) ++ (nth s 1) ++ ... ++ (nth s idx) ++ (tail s idx)
4988
4987
*/
4989
4988
void theory_seq::ensure_nth (literal lit, expr* s, expr* idx) {
4989
+ TRACE (" seq" , tout << " ensure-nth: " << lit << " " << mk_pp (s, m) << " " << mk_pp (idx, m) << " \n " ;);
4990
4990
rational r;
4991
4991
SASSERT (get_context ().get_assignment (lit) == l_true);
4992
4992
VERIFY (m_autil.is_numeral (idx, r) && r.is_unsigned ());
0 commit comments