void symex_target_equationt::convert_assertions( prop_convt &prop_conv) { // we find out if there is only _one_ assertion, // which allows for a simpler formula unsigned number_of_assertions=count_assertions(); if(number_of_assertions==0) return; if(number_of_assertions==1) { for(SSA_stepst::iterator it=SSA_steps.begin(); it!=SSA_steps.end(); it++) if(it->is_assert()) { prop_conv.set_to_false(it->cond_expr); it->cond_literal=const_literal(false); return; // prevent further assumptions! } else if(it->is_assume()) prop_conv.set_to_true(it->cond_expr); assert(false); // unreachable } bvt bv; bv.reserve(number_of_assertions); literalt assumption_literal=const_literal(true); for(SSA_stepst::iterator it=SSA_steps.begin(); it!=SSA_steps.end(); it++) if(it->is_assert()) { // do the expression literalt tmp_literal=prop_conv.convert(it->cond_expr); it->cond_literal=prop_conv.prop.limplies(assumption_literal, tmp_literal); bv.push_back(prop_conv.prop.lnot(it->cond_literal)); } else if(it->is_assume()) assumption_literal= prop_conv.prop.land(assumption_literal, it->cond_literal); if(!bv.empty()) prop_conv.prop.lcnf(bv); }
void symex_target_equationt::convert_assertions( prop_convt &prop_conv) { // we find out if there is only _one_ assertion, // which allows for a simpler formula unsigned number_of_assertions=count_assertions(); if(number_of_assertions==0) return; if(number_of_assertions==1) { for(auto & it : SSA_steps) { if(it.is_assert()) { prop_conv.set_to_false(it.cond_expr); it.cond_literal=const_literal(false); return; // prevent further assumptions! } else if(it.is_assume()) prop_conv.set_to_true(it.cond_expr); } assert(false); // unreachable } // We do (NOT a1) OR (NOT a2) ... // where the a's are the assertions or_exprt::operandst disjuncts; disjuncts.reserve(number_of_assertions); exprt assumption=true_exprt(); for(auto & it : SSA_steps) { if(it.is_assert()) { implies_exprt implication( assumption, it.cond_expr); // do the conversion it.cond_literal=prop_conv.convert(implication); // store disjunct disjuncts.push_back(literal_exprt(!it.cond_literal)); } else if(it.is_assume()) { // the assumptions have been converted before // avoid deep nesting of ID_and expressions if(assumption.id()==ID_and) assumption.copy_to_operands(literal_exprt(it.cond_literal)); else assumption= and_exprt(assumption, literal_exprt(it.cond_literal)); } } // the below is 'true' if there are no assertions prop_conv.set_to_true(disjunction(disjuncts)); }