mirror of
				https://github.com/Z3Prover/z3
				synced 2025-10-31 11:42:28 +00:00 
			
		
		
		
	seq
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
		
							parent
							
								
									bd9b5b5735
								
							
						
					
					
						commit
						746d26e744
					
				
					 4 changed files with 385 additions and 204 deletions
				
			
		|  | @ -328,9 +328,16 @@ br_status seq_rewriter::mk_seq_contains(expr* a, expr* b, expr_ref& result) { | |||
|     expr_ref_vector as(m()), bs(m()); | ||||
|     m_util.str.get_concat(a, as); | ||||
|     m_util.str.get_concat(b, bs); | ||||
|     bool all_values = true; | ||||
|      | ||||
|     for (unsigned i = 0; all_values && i < bs.size(); ++i) {  | ||||
|         all_values = m().is_value(bs[i].get()); | ||||
|     } | ||||
| 
 | ||||
|     bool found = false; | ||||
|     for (unsigned i = 0; !found && i < as.size(); ++i) { | ||||
|         if (bs.size() > as.size() - i) break; | ||||
|         all_values &= m().is_value(as[i].get()); | ||||
|         unsigned j = 0; | ||||
|         for (; j < bs.size() && as[j+i].get() == bs[j].get(); ++j) {}; | ||||
|         found = j == bs.size(); | ||||
|  | @ -339,6 +346,10 @@ br_status seq_rewriter::mk_seq_contains(expr* a, expr* b, expr_ref& result) { | |||
|         result = m().mk_true(); | ||||
|         return BR_DONE; | ||||
|     } | ||||
|     if (all_values) { | ||||
|         result = m().mk_false(); | ||||
|         return BR_DONE; | ||||
|     } | ||||
|     return BR_FAILED; | ||||
| } | ||||
| 
 | ||||
|  | @ -460,11 +471,22 @@ br_status seq_rewriter::mk_seq_prefix(expr* a, expr* b, expr_ref& result) { | |||
|     m_util.str.get_concat(a, as); | ||||
|     m_util.str.get_concat(b, bs); | ||||
|     unsigned i = 0; | ||||
|     for (; i < as.size() && i < bs.size() && as[i].get() == bs[i].get(); ++i) {}; | ||||
|     bool all_values = true;     | ||||
|     for (; i < as.size() && i < bs.size(); ++i) { | ||||
|         all_values &= m().is_value(as[i].get()) && m().is_value(bs[i].get()); | ||||
|         if (as[i].get() != bs[i].get()) { | ||||
|             break; | ||||
|         } | ||||
|     }; | ||||
|     if (i == as.size()) { | ||||
|         result = m().mk_true(); | ||||
|         return BR_DONE; | ||||
|     } | ||||
|     SASSERT(i < as.size()); | ||||
|     if (all_values && (i < bs.size() || m_util.str.is_unit(as[i+1].get()))) { | ||||
|         result = m().mk_false(); | ||||
|         return BR_DONE; | ||||
|     } | ||||
|     if (i == bs.size()) { | ||||
|         expr_ref_vector es(m()); | ||||
|         for (unsigned j = i; j < as.size(); ++j) { | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue