示例#1
0
 void process(expr * f) {
     if (fvisited.is_marked(f))
         return;
     fvisited.mark(f);
     todo.push_back(f);
     while (!todo.empty()) {
         expr * t = todo.back();
         todo.pop_back();
         if (is_uninterp_const(t))
             continue;
         if (is_app(t) && to_app(t)->get_family_id() == m.get_basic_family_id() && to_app(t)->get_num_args() > 0) {
             decl_kind k = to_app(t)->get_decl_kind();
             if (k == OP_OR || k == OP_NOT || k == OP_IFF || ((k == OP_EQ || k == OP_ITE) && m.is_bool(to_app(t)->get_arg(1)))) {
                 unsigned num = to_app(t)->get_num_args();
                 for (unsigned i = 0; i < num; i++) {
                     expr * arg = to_app(t)->get_arg(i);
                     if (fvisited.is_marked(arg))
                         continue;
                     fvisited.mark(arg);
                     todo.push_back(arg);
                 }
             }
         }
         else {
             quick_for_each_expr(proc, tvisited, t);
         }
     }
 }
示例#2
0
文件: qe_mbi.cpp 项目: levnach/z3
 void euf_arith_mbi_plugin::collect_atoms(expr_ref_vector const& fmls) {
     expr_fast_mark1 marks;
     is_atom_proc proc(m_atoms, m_atom_set);
     for (expr* e : fmls) {
         quick_for_each_expr(proc, marks, e);
     }
 }
示例#3
0
 void operator()(goal_ref const & g,
                 goal_ref_buffer & result,
                 model_converter_ref & mc,
                 proof_converter_ref & pc,
                 expr_dependency_ref & core) override {
     mc = nullptr; pc = nullptr; core = nullptr;
     bool produce_proofs = g->proofs_enabled();
     tactic_report report("dt2bv", *g);
     unsigned   size = g->size();
     expr_fast_mark1 visited;
     check_fd proc(*this);
     for (unsigned i = 0; i < size; ++i) {
         quick_for_each_expr(proc, visited, g->form(i));
     }
     obj_hashtable<sort>::iterator it = m_non_fd_sorts.begin(), end = m_non_fd_sorts.end();
     for (; it != end; ++it) {
         m_fd_sorts.remove(*it);
     }
     if (!m_fd_sorts.empty()) {
         ref<extension_model_converter> ext = alloc(extension_model_converter, m);
         ref<filter_model_converter> filter = alloc(filter_model_converter, m);
         enum2bv_rewriter rw(m, m_params);
         rw.set_is_fd(&m_is_fd);            
         expr_ref   new_curr(m);
         proof_ref  new_pr(m);
         for (unsigned idx = 0; idx < size; idx++) {
             rw(g->form(idx), new_curr, new_pr);
             if (produce_proofs) {
                 proof * pr = g->pr(idx);
                 new_pr = m.mk_modus_ponens(pr, new_pr);
             }
             g->update(idx, new_curr, new_pr, g->dep(idx));
         }
         expr_ref_vector bounds(m);
         rw.flush_side_constraints(bounds);
         for (unsigned i = 0; i < bounds.size(); ++i) {
             g->assert_expr(bounds[i].get());
         }
         {
             obj_map<func_decl, func_decl*>::iterator it = rw.enum2bv().begin(), end = rw.enum2bv().end();
             for (; it != end; ++it) {
                 filter->insert(it->m_value);
             }
         }
         {
             obj_map<func_decl, expr*>::iterator it = rw.enum2def().begin(), end = rw.enum2def().end();
             for (; it != end; ++it) {
                 ext->insert(it->m_key, it->m_value);
             }
         }
         
         mc = concat(filter.get(), ext.get());
         report_tactic_progress(":fd-num-translated", rw.num_translated());
     }
     g->inc_depth();
     result.push_back(g.get());
     TRACE("dt2bv", g->display(tout););
示例#4
0
 bool is_pure(is_variable_proc &is_var, expr *e) {
     try {
         is_pure_ns::proc v(is_var);
         quick_for_each_expr(v, e);
     }
     catch (const is_pure_ns::found &) {
         return false;
     }
     return true;
 }
示例#5
0
文件: occurs.cpp 项目: bishoksan/z3
bool occurs(func_decl * d, expr * n) {
    occurs_namespace::decl_proc p(d);
    try {
        quick_for_each_expr(p, n);
    }
    catch (occurs_namespace::found) {
        return true;
    }
    return false;
}
示例#6
0
文件: occurs.cpp 项目: bishoksan/z3
// Return true if n1 occurs in n2
bool occurs(expr * n1, expr * n2) {
    occurs_namespace::proc p(n1);
    try {
        quick_for_each_expr(p, n2);
    }
    catch (occurs_namespace::found) {
        return true;
    }
    return false;
}
 /**
    \brief Unmark atoms that occur in the boolean structure.
 */
 void formula_compiler::unmark_nested_atoms(assertion_set const & s, expr_fast_mark2 & axioms) {
     ast_manager & m = s.m();
     expr_fast_mark1 visited;
     unmark_axioms_proc proc(axioms);
     unsigned sz = s.size();
     for (unsigned i = 0; i < sz; i++) {
         expr * f = s.form(i);
         while (m.is_not(f, f));
         if (axioms.is_marked(f))
             continue;
         quick_for_each_expr(proc, visited, f);
     }
 }
示例#8
0
 virtual result operator()(goal const & g) {
     try {
         expr_fast_mark1 visited;
         proc p;
         unsigned sz = g.size();
         for (unsigned i = 0; i < sz; i++) {
             quick_for_each_expr(p, visited, g.form(i));
         }
         return false;
     }
     catch (found) {
         return true;
     }
 }
示例#9
0
 void operator()(assertion_set & s, model_converter_ref & mc) {
     mc = 0;
     if (s.inconsistent())
         return;
     as_st_report report("add-bounds", s);
     bound_manager bm(m);
     expr_fast_mark1 visited;
     add_bound_proc proc(bm, s, m_lower, m_upper);
     unsigned sz = s.size();
     for (unsigned i = 0; i < sz; i++)
         quick_for_each_expr(proc, visited, s.form(i));
     visited.reset();
     report_st_progress(":added-bounds", proc.m_num_bounds);
     TRACE("add_bounds", s.display(tout););
示例#10
0
 void operator()(goal_ref const & g, 
                 goal_ref_buffer & result) {
     tactic_report report("add-bounds", *g);
     bound_manager bm(m);
     expr_fast_mark1 visited;
     add_bound_proc proc(bm, *(g.get()), m_lower, m_upper);
     unsigned sz = g->size();
     for (unsigned i = 0; i < sz; i++)
         quick_for_each_expr(proc, visited, g->form(i));
     visited.reset();
     g->inc_depth();
     result.push_back(g.get());
     if (proc.m_num_bounds > 0) 
         g->updt_prec(goal::UNDER);
     report_tactic_progress(":added-bounds", proc.m_num_bounds);
     TRACE("add_bounds", g->display(tout););