void operator()(goal_ref const & g, goal_ref_buffer & result) { SASSERT(g->is_well_sorted()); fail_if_proof_generation("occf", g); bool produce_models = g->models_enabled(); tactic_report report("occf", *g); m_mc = nullptr; ptr_vector<expr> new_lits; cnstr2bvar c2b; unsigned sz = g->size(); for (unsigned i = 0; i < sz; i++) { checkpoint(); expr * f = g->form(i); expr_dependency * d = g->dep(i); if (!m.is_or(f)) continue; app * cls = to_app(f); if (!is_target(cls)) continue; if (produce_models && !m_mc) { m_mc = alloc(generic_model_converter, m, "occf"); g->add(m_mc); } expr * keep = nullptr; new_lits.reset(); unsigned num = cls->get_num_args(); for (unsigned j = 0; j < num; j++) { expr * l = cls->get_arg(j); if (is_constraint(l)) { expr * new_l = get_aux_lit(c2b, l, g); if (new_l != nullptr) { new_lits.push_back(new_l); } else if (keep == nullptr) { keep = l; } else { new_l = mk_aux_lit(c2b, l, produce_models, g); new_lits.push_back(new_l); } } else { new_lits.push_back(l); } } if (keep != nullptr) new_lits.push_back(keep); g->update(i, m.mk_or(new_lits.size(), new_lits.c_ptr()), nullptr, d); } g->inc_depth(); result.push_back(g.get()); TRACE("occf", g->display(tout););
bool is_target(app * cls) { SASSERT(m.is_or(cls)); bool found = false; unsigned num = cls->get_num_args(); for (unsigned i = 0; i < num; i++) { if (is_constraint(cls->get_arg(i))) { if (found) return true; found = true; } } return false; }
void symex_target_equationt::SSA_stept::output( const namespacet &ns, std::ostream &out) const { if(source.is_set) { out << "Thread " << source.thread_nr; if(source.pc->source_location.is_not_nil()) out << " " << source.pc->source_location << std::endl; else out << std::endl; } switch(type) { case goto_trace_stept::ASSERT: out << "ASSERT " << from_expr(ns, "", cond_expr) << std::endl; break; case goto_trace_stept::ASSUME: out << "ASSUME " << from_expr(ns, "", cond_expr) << std::endl; break; case goto_trace_stept::LOCATION: out << "LOCATION" << std::endl; break; case goto_trace_stept::INPUT: out << "INPUT" << std::endl; break; case goto_trace_stept::OUTPUT: out << "OUTPUT" << std::endl; break; case goto_trace_stept::DECL: out << "DECL" << std::endl; out << from_expr(ns, "", ssa_lhs) << std::endl; break; case goto_trace_stept::ASSIGNMENT: out << "ASSIGNMENT ("; switch(assignment_type) { case HIDDEN: out << "HIDDEN"; break; case STATE: out << "STATE"; break; case VISIBLE_ACTUAL_PARAMETER: out << "VISIBLE_ACTUAL_PARAMETER"; break; case HIDDEN_ACTUAL_PARAMETER: out << "HIDDEN_ACTUAL_PARAMETER"; break; case PHI: out << "PHI"; break; case GUARD: out << "GUARD"; break; default:; } out << ")" << std::endl; break; case goto_trace_stept::DEAD: out << "DEAD" << std::endl; break; case goto_trace_stept::FUNCTION_CALL: out << "FUNCTION_CALL" << std::endl; break; case goto_trace_stept::FUNCTION_RETURN: out << "FUNCTION_RETURN" << std::endl; break; case goto_trace_stept::CONSTRAINT: out << "CONSTRAINT" << std::endl; break; case goto_trace_stept::SHARED_READ: out << "SHARED READ" << std::endl; break; case goto_trace_stept::SHARED_WRITE: out << "SHARED WRITE" << std::endl; break; case goto_trace_stept::ATOMIC_BEGIN: out << "ATOMIC_BEGIN" << std::endl; break; case goto_trace_stept::ATOMIC_END: out << "AUTOMIC_END" << std::endl; break; case goto_trace_stept::SPAWN: out << "SPAWN" << std::endl; break; case goto_trace_stept::MEMORY_BARRIER: out << "MEMORY_BARRIER" << std::endl; break; case goto_trace_stept::GOTO: out << "IF " << from_expr(ns, "", cond_expr) << " GOTO" << std::endl; break; default: assert(false); } if(is_assert() || is_assume() || is_assignment() || is_constraint()) out << from_expr(ns, "", cond_expr) << std::endl; if(is_assert() || is_constraint()) out << comment << std::endl; if(is_shared_read() || is_shared_write()) out << from_expr(ns, "", ssa_lhs) << std::endl; out << "Guard: " << from_expr(ns, "", guard) << std::endl; }