mirror of
				https://github.com/Z3Prover/z3
				synced 2025-11-04 05:19:11 +00:00 
			
		
		
		
	fix multiple bugs in interfacing with fixedpoint context
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
		
							parent
							
								
									fcdde59438
								
							
						
					
					
						commit
						7d9254f122
					
				
					 4 changed files with 40 additions and 24 deletions
				
			
		| 
						 | 
				
			
			@ -363,6 +363,12 @@ extern "C" {
 | 
			
		|||
        for (unsigned i = 0; i < coll.m_rules.size(); ++i) {
 | 
			
		||||
            to_fixedpoint_ref(d)->add_rule(coll.m_rules[i].get(), coll.m_names[i]);
 | 
			
		||||
        }
 | 
			
		||||
        ptr_vector<expr>::const_iterator it  = ctx.begin_assertions();
 | 
			
		||||
        ptr_vector<expr>::const_iterator end = ctx.end_assertions();
 | 
			
		||||
        for (; it != end; ++it) {
 | 
			
		||||
            to_fixedpoint_ref(d)->ctx().assert_expr(*it);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return of_ast_vector(v);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -439,12 +445,12 @@ extern "C" {
 | 
			
		|||
        ast_manager& m = mk_c(c)->m();
 | 
			
		||||
        Z3_ast_vector_ref* v = alloc(Z3_ast_vector_ref, m);
 | 
			
		||||
        mk_c(c)->save_object(v);
 | 
			
		||||
        datalog::rule_set const& rules = to_fixedpoint_ref(d)->ctx().get_rules();
 | 
			
		||||
        datalog::rule_set::iterator it = rules.begin(), end = rules.end();
 | 
			
		||||
        for (; it != end; ++it) {
 | 
			
		||||
            expr_ref fml(m);
 | 
			
		||||
            (*it)->to_formula(fml);
 | 
			
		||||
            v->m_ast_vector.push_back(fml);
 | 
			
		||||
        expr_ref_vector rules(m);
 | 
			
		||||
        svector<symbol> names;
 | 
			
		||||
        
 | 
			
		||||
        to_fixedpoint_ref(d)->ctx().get_rules_as_formulas(rules, names);
 | 
			
		||||
        for (unsigned i = 0; i < rules.size(); ++i) {
 | 
			
		||||
            v->m_ast_vector.push_back(rules[i].get());
 | 
			
		||||
        }
 | 
			
		||||
        RETURN_Z3(of_ast_vector(v));
 | 
			
		||||
        Z3_CATCH_RETURN(0);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -825,7 +825,8 @@ class ExprRef(AstRef):
 | 
			
		|||
        if is_app(self):
 | 
			
		||||
            return [self.arg(i) for i in range(self.num_args())]
 | 
			
		||||
        else:
 | 
			
		||||
            return [] 
 | 
			
		||||
            return []
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def _to_expr_ref(a, ctx):
 | 
			
		||||
    if isinstance(a, Pattern):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -352,11 +352,12 @@ namespace datalog {
 | 
			
		|||
                svector<symbol> names;
 | 
			
		||||
                for (unsigned i = 0; i < sorts.size(); ++i) {
 | 
			
		||||
                    if (!sorts[i]) {
 | 
			
		||||
                        sorts[i] = m.mk_bool_sort();
 | 
			
		||||
                        sorts[i] = vars[i]->get_decl()->get_range();
 | 
			
		||||
                    }
 | 
			
		||||
                    names.push_back(symbol(i));
 | 
			
		||||
                    names.push_back(vars[i]->get_decl()->get_name());
 | 
			
		||||
                }
 | 
			
		||||
                quantifier_ref q(m);
 | 
			
		||||
                sorts.reverse();
 | 
			
		||||
                q = m.mk_quantifier(is_forall, sorts.size(), sorts.c_ptr(), names.c_ptr(), result); 
 | 
			
		||||
                elim_unused_vars(m, q, result);
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -1602,11 +1603,27 @@ namespace datalog {
 | 
			
		|||
        for (unsigned i = 0; i < sz; ++i) {
 | 
			
		||||
            expr* e = exprs[i];
 | 
			
		||||
            for_each_expr(v, visited, e);
 | 
			
		||||
            while (is_quantifier(e)) e = to_quantifier(e)->get_expr();
 | 
			
		||||
            while (is_quantifier(e)) {
 | 
			
		||||
                e = to_quantifier(e)->get_expr();
 | 
			
		||||
            }
 | 
			
		||||
            fresh_names.add(e);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
   
 | 
			
		||||
    void context::get_rules_as_formulas(expr_ref_vector& rules, svector<symbol>& names) {
 | 
			
		||||
        expr_ref fml(m);
 | 
			
		||||
        rule_set::iterator it = m_rule_set.begin(), end = m_rule_set.end();
 | 
			
		||||
        for (; it != end; ++it) {
 | 
			
		||||
            (*it)->to_formula(fml);
 | 
			
		||||
            rules.push_back(fml);
 | 
			
		||||
            names.push_back((*it)->name());
 | 
			
		||||
        }
 | 
			
		||||
        for (unsigned i = 0; i < m_rule_fmls.size(); ++i) {
 | 
			
		||||
            rules.push_back(m_rule_fmls[i].get());
 | 
			
		||||
            names.push_back(m_rule_names[i]);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
    void context::display_smt2(
 | 
			
		||||
        unsigned num_queries, 
 | 
			
		||||
        expr* const* queries, 
 | 
			
		||||
| 
						 | 
				
			
			@ -1621,18 +1638,8 @@ namespace datalog {
 | 
			
		|||
        expr_ref_vector rules(m);
 | 
			
		||||
        svector<symbol> names;
 | 
			
		||||
        bool use_fixedpoint_extensions = m_params.get_bool(":print-with-fixedpoint-extensions", true);
 | 
			
		||||
        {
 | 
			
		||||
            rule_set::iterator it = m_rule_set.begin(), end = m_rule_set.end();
 | 
			
		||||
            for (; it != end; ++it) {
 | 
			
		||||
                (*it)->to_formula(fml);
 | 
			
		||||
                rules.push_back(fml);
 | 
			
		||||
                names.push_back((*it)->name());
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        for (unsigned i = 0; i < m_rule_fmls.size(); ++i) {
 | 
			
		||||
            rules.push_back(m_rule_fmls[i].get());
 | 
			
		||||
            names.push_back(m_rule_names[i]);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        get_rules_as_formulas(rules, names);
 | 
			
		||||
 | 
			
		||||
        smt2_pp_environment_dbg env(m);
 | 
			
		||||
        pp_params params;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -250,7 +250,9 @@ namespace datalog {
 | 
			
		|||
        bool is_output_predicate(func_decl * pred) { return m_output_preds.contains(pred); }
 | 
			
		||||
        const decl_set & get_output_predicates() const { return m_output_preds; }
 | 
			
		||||
 | 
			
		||||
        rule_set const & get_rules() { return m_rule_set; }
 | 
			
		||||
        rule_set const & get_rules() { flush_add_rules(); return m_rule_set; }
 | 
			
		||||
 | 
			
		||||
        void get_rules_as_formulas(expr_ref_vector& fmls, svector<symbol>& names);
 | 
			
		||||
 | 
			
		||||
        void add_fact(app * head);
 | 
			
		||||
        void add_fact(func_decl * pred, const relation_fact & fact);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue