mirror of
				https://github.com/Z3Prover/z3
				synced 2025-11-04 05:19:11 +00:00 
			
		
		
		
	resurrect rewriting of equality over ite
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
		
							parent
							
								
									0bf9369414
								
							
						
					
					
						commit
						65bfcec146
					
				
					 2 changed files with 15 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -740,6 +740,20 @@ br_status arith_rewriter::mk_le_ge_eq_core(expr * arg1, expr * arg2, op_kind kin
 | 
			
		|||
        case EQ: result = m.mk_ite(c, m.mk_eq(t, arg2), m.mk_eq(e, arg2)); return BR_REWRITE2;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    if (m.is_ite(arg2, c, t, e) && is_numeral(t, a2) && is_numeral(arg1, a1)) {
 | 
			
		||||
        switch (kind) {
 | 
			
		||||
        case LE: result = a1 <= a2 ? m.mk_or(c, m_util.mk_le(arg1, e)) : m.mk_and(m.mk_not(c), m_util.mk_le(arg1, e)); return BR_REWRITE2;
 | 
			
		||||
        case GE: result = a1 >= a2 ? m.mk_or(c, m_util.mk_ge(arg1, e)) : m.mk_and(m.mk_not(c), m_util.mk_ge(arg1, e)); return BR_REWRITE2;
 | 
			
		||||
        case EQ: result = a1 == a2 ? m.mk_or(c, m.mk_eq(e, arg1)) : m.mk_and(m.mk_not(c), m_util.mk_eq(e, arg1)); return BR_REWRITE2;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    if (m.is_ite(arg2, c, t, e) && is_numeral(e, a2) && is_numeral(arg1, a1)) {
 | 
			
		||||
        switch (kind) {
 | 
			
		||||
        case LE: result = a1 <= a2 ? m.mk_or(m.mk_not(c), m_util.mk_le(arg1, t)) : m.mk_and(c, m_util.mk_le(arg1, t)); return BR_REWRITE2;
 | 
			
		||||
        case GE: result = a1 >= a2 ? m.mk_or(m.mk_not(c), m_util.mk_ge(arg1, e)) : m.mk_and(c, m_util.mk_ge(arg1, t)); return BR_REWRITE2;
 | 
			
		||||
        case EQ: result = a1 == a2 ? m.mk_or(m.mk_not(c), m.mk_eq(t, arg1)) : m.mk_and(c, m_util.mk_eq(t, arg1)); return BR_REWRITE2;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    if (m_util.is_to_int(arg2) && is_numeral(arg1)) {        
 | 
			
		||||
        kind = inv(kind);
 | 
			
		||||
        std::swap(arg1, arg2);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -320,7 +320,7 @@ struct th_rewriter_cfg : public default_rewriter_cfg {
 | 
			
		|||
                return pull_ite_core<true>(f, to_app(args[1]), to_app(args[0]), result);
 | 
			
		||||
        }
 | 
			
		||||
        family_id fid = f->get_family_id();
 | 
			
		||||
        if (num == 2 && (fid == m().get_basic_family_id() || fid == m_bv_rw.get_fid())) {
 | 
			
		||||
        if (num == 2 && (fid == m().get_basic_family_id())) {
 | 
			
		||||
            // (f v3 (ite c v1 v2)) --> (ite v (f v3 v1) (f v3 v2))
 | 
			
		||||
            if (m().is_value(args[0]) && is_ite_value_tree(args[1])) 
 | 
			
		||||
                return pull_ite_core<true>(f, to_app(args[1]), to_app(args[0]), result);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue