mirror of
				https://github.com/Z3Prover/z3
				synced 2025-10-31 11:42:28 +00:00 
			
		
		
		
	
							parent
							
								
									43a19cadf6
								
							
						
					
					
						commit
						e593b5b2c8
					
				
					 3 changed files with 12 additions and 9 deletions
				
			
		|  | @ -699,9 +699,11 @@ br_status seq_rewriter::mk_seq_extract(expr* a, expr* b, expr* c, expr_ref& resu | |||
|     if (lengthPos) { | ||||
|          | ||||
|         m_lhs.reset(); | ||||
|         expr_ref_vector lens(m()), other(m()); | ||||
|         expr_ref_vector lens(m()); | ||||
|         m_util.str.get_concat(a, m_lhs); | ||||
|         get_lengths(b, lens, other, pos); | ||||
|         if (!get_lengths(b, lens, pos)) { | ||||
|             return BR_FAILED; | ||||
|         } | ||||
|         unsigned rsz = lens.size(); | ||||
|         unsigned i = 0; | ||||
|         for (; i < m_lhs.size(); ++i) { | ||||
|  | @ -728,9 +730,6 @@ br_status seq_rewriter::mk_seq_extract(expr* a, expr* b, expr* c, expr_ref& resu | |||
|         for (expr* rhs : lens) { | ||||
|             t2 = m_autil.mk_add(t2, m_util.str.mk_length(rhs)); | ||||
|         } | ||||
|         for (expr* rhs : other) { | ||||
|             t2 = m_autil.mk_add(t2, rhs); | ||||
|         } | ||||
|         result = m_util.str.mk_substr(t1, t2, c); | ||||
|         return BR_REWRITE2; | ||||
|     } | ||||
|  | @ -782,12 +781,12 @@ br_status seq_rewriter::mk_seq_extract(expr* a, expr* b, expr* c, expr_ref& resu | |||
|     return BR_REWRITE3; | ||||
| } | ||||
| 
 | ||||
| void seq_rewriter::get_lengths(expr* e, expr_ref_vector& lens, expr_ref_vector& other, rational& pos) { | ||||
| bool seq_rewriter::get_lengths(expr* e, expr_ref_vector& lens, rational& pos) { | ||||
|     expr* arg = nullptr; | ||||
|     rational pos1; | ||||
|     if (m_autil.is_add(e)) { | ||||
|         for (expr* arg1 : *to_app(e)) { | ||||
|             get_lengths(arg1, lens, other, pos); | ||||
|             if (!get_lengths(arg1, lens, pos)) return false; | ||||
|         } | ||||
|     } | ||||
|     else if (m_util.str.is_length(e, arg)) { | ||||
|  | @ -797,8 +796,9 @@ void seq_rewriter::get_lengths(expr* e, expr_ref_vector& lens, expr_ref_vector& | |||
|         pos += pos1; | ||||
|     } | ||||
|     else { | ||||
|         other.push_back(e); | ||||
|         return false; | ||||
|     } | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| bool seq_rewriter::cannot_contain_suffix(expr* a, expr* b) { | ||||
|  |  | |||
|  | @ -155,7 +155,7 @@ class seq_rewriter { | |||
|     bool is_sequence(eautomaton& aut, expr_ref_vector& seq); | ||||
|     bool is_epsilon(expr* e) const; | ||||
|     void split_units(expr_ref_vector& lhs, expr_ref_vector& rhs); | ||||
|     void get_lengths(expr* e, expr_ref_vector& lens, expr_ref_vector& other, rational& pos); | ||||
|     bool get_lengths(expr* e, expr_ref_vector& lens, rational& pos); | ||||
| 
 | ||||
| 
 | ||||
| public:     | ||||
|  |  | |||
|  | @ -4746,6 +4746,9 @@ void theory_seq::add_itos_length_axiom(expr* len) { | |||
|     literal n_ge_100hi = mk_literal(m_autil.mk_ge(n, m_autil.mk_numeral(ten*ten*hi, true))); | ||||
|      | ||||
|     add_axiom(~n_ge_10hi, len_ge); | ||||
|     add_axiom(n_ge_10hi, ~len_ge); | ||||
| 
 | ||||
|     add_axiom(n_ge_100hi, len_le); | ||||
|     add_axiom(~n_ge_100hi, ~len_le); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue