mirror of
				https://github.com/Z3Prover/z3
				synced 2025-11-04 13:29:11 +00:00 
			
		
		
		
	
							parent
							
								
									5c9b205dfc
								
							
						
					
					
						commit
						b402268d35
					
				
					 3 changed files with 21 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -1383,6 +1383,12 @@ br_status seq_rewriter::mk_seq_nth_i(expr* a, expr* b, expr_ref& result) {
 | 
			
		|||
    }
 | 
			
		||||
    unsigned len = r.get_unsigned();
 | 
			
		||||
 | 
			
		||||
    expr* a2, *i2;
 | 
			
		||||
    if (len == 0 && str().is_at(a, a2, i2) && m_autil.is_numeral(i2, r) && r.is_zero()) {
 | 
			
		||||
        result = str().mk_nth_i(a2, i2);
 | 
			
		||||
        return BR_REWRITE1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    expr_ref_vector as(m());
 | 
			
		||||
    str().get_concat_units(a, as);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1577,6 +1577,16 @@ bool theory_seq::is_ternary_eq_lhs(expr_ref_vector const& ls, expr_ref_vector co
 | 
			
		|||
    return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct remove_obj_pair_map : public trail<context> {
 | 
			
		||||
    obj_pair_hashtable<expr, expr> & m_map;
 | 
			
		||||
    expr* a, *b;
 | 
			
		||||
    remove_obj_pair_map(obj_pair_hashtable<expr, expr> & map, expr* a, expr* b):
 | 
			
		||||
        m_map(map), a(a), b(b) {}
 | 
			
		||||
    void undo(context& ctx) override {
 | 
			
		||||
        m_map.erase(std::make_pair(a, b));
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
   nth(x,idx) = rhs => 
 | 
			
		||||
   x = pre(x, idx) ++ unit(rhs) ++ post(x, idx + 1)
 | 
			
		||||
| 
						 | 
				
			
			@ -1591,6 +1601,10 @@ bool theory_seq::solve_nth_eq2(expr_ref_vector const& ls, expr_ref_vector const&
 | 
			
		|||
        expr_ref idx1(m_autil.mk_add(idx, m_autil.mk_int(1)), m);
 | 
			
		||||
        m_rewrite(idx1);
 | 
			
		||||
        expr_ref rhs = mk_concat(rs.size(), rs.c_ptr(), m.get_sort(ls[0]));
 | 
			
		||||
        if (m_nth_eq2_cache.contains(std::make_pair(rhs, ls[0])))
 | 
			
		||||
            return false;
 | 
			
		||||
        m_nth_eq2_cache.insert(std::make_pair(rhs, ls[0]));
 | 
			
		||||
        ctx.push_trail(remove_obj_pair_map(m_nth_eq2_cache, rhs, ls[0]));
 | 
			
		||||
        ls1.push_back(s);        
 | 
			
		||||
        if (!idx_is_zero) rs1.push_back(m_sk.mk_pre(s, idx)); 
 | 
			
		||||
        rs1.push_back(m_util.str.mk_unit(rhs)); 
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -459,6 +459,7 @@ namespace smt {
 | 
			
		|||
        bool solve_unit_eq(expr* l, expr* r, dependency* dep);
 | 
			
		||||
        bool solve_unit_eq(expr_ref_vector const& l, expr_ref_vector const& r, dependency* dep);
 | 
			
		||||
        bool solve_nth_eq1(expr_ref_vector const& ls, expr_ref_vector const& rs, dependency* dep);
 | 
			
		||||
        obj_pair_hashtable<expr, expr> m_nth_eq2_cache;
 | 
			
		||||
        bool solve_nth_eq2(expr_ref_vector const& ls, expr_ref_vector const& rs, dependency* dep);
 | 
			
		||||
        bool solve_itos(expr_ref_vector const& ls, expr_ref_vector const& rs, dependency* dep);
 | 
			
		||||
        bool solve_itos(expr* n, expr_ref_vector const& rs, dependency* dep);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue