void cnft::gate_xor(literalt a, literalt b, literalt o) { // a xor b = o <==> (a' + b' + o') // (a + b + o' ) // (a' + b + o) // (a + b' + o) bvt lits(3); lits[0]=neg(a); lits[1]=neg(b); lits[2]=neg(o); lcnf(lits); lits[0]=pos(a); lits[1]=pos(b); lits[2]=neg(o); lcnf(lits); lits[0]=neg(a); lits[1]=pos(b); lits[2]=pos(o); lcnf(lits); lits[0]=pos(a); lits[1]=neg(b); lits[2]=pos(o); lcnf(lits); }
literalt cnft::land(const bvt &bv) { if(bv.size()==0) return const_literal(true); if(bv.size()==1) return bv[0]; if(bv.size()==2) return land(bv[0], bv[1]); forall_literals(it, bv) if(it->is_false()) return *it; if(is_all(bv, const_literal(true))) return const_literal(true); bvt new_bv; eliminate_duplicates(bv, new_bv); bvt lits(2); literalt literal=new_variable(); lits[1]=neg(literal); forall_literals(it, new_bv) { lits[0]=pos(*it); lcnf(lits); }
void cnft::gate_or(literalt a, literalt b, literalt o) { // a+b=c <==> (a' + c)( b' + c)(a + b + c') bvt lits(2); lits[0]=neg(a); lits[1]=pos(o); lcnf(lits); lits[0]=neg(b); lits[1]=pos(o); lcnf(lits); lits.resize(3); lits[0]=pos(a); lits[1]=pos(b); lits[2]=neg(o); lcnf(lits); }
void cnft::gate_nor(literalt a, literalt b, literalt o) { // a Nor b = o <==> (a' + o')( b' + o')(a + b + o) bvt lits(2); lits[0]=neg(a); lits[1]=neg(o); lcnf(lits); lits[0]=neg(b); lits[1]=neg(o); lcnf(lits); lits.resize(3); lits[0]=pos(a); lits[1]=pos(b); lits[2]=pos(o); lcnf(lits); }
void cnft::gate_and(literalt a, literalt b, literalt o) { // a*b=c <==> (a + o')( b + o')(a'+b'+o) bvt lits(2); lits[0]=pos(a); lits[1]=neg(o); lcnf(lits); lits[0]=pos(b); lits[1]=neg(o); lcnf(lits); lits.clear(); lits.reserve(3); lits.push_back(neg(a)); lits.push_back(neg(b)); lits.push_back(pos(o)); lcnf(lits); }
literalt z3_propt::lor(const bvt &bv) { if(bv.size()==0) return const_literal(false); if(bv.size()==1) return bv[0]; if(bv.size()==2) return lor(bv[0], bv[1]); for(unsigned i=0; i<bv.size(); i++) if(bv[i]==const_literal(true)) return const_literal(true); if(is_all(bv, const_literal(false))) return const_literal(false); bvt new_bv; eliminate_duplicates(bv, new_bv); literalt literal=new_variable(); for(unsigned int i=0; i<new_bv.size(); ++i) { bvt lits; lits.reserve(2); lits.push_back(neg(new_bv[i])); lits.push_back(pos(literal)); lcnf(lits); } bvt lits; lits.reserve(new_bv.size()+1); for(unsigned int i=0; i<new_bv.size(); ++i) lits.push_back(pos(new_bv[i])); lits.push_back(neg(literal)); lcnf(lits); return literal; }
void z3_propt::lor(literalt a, literalt b, literalt o) { // a+b=c <==> (a' + c)( b' + c)(a + b + c') bvt lits; lits.clear(); lits.reserve(2); lits.push_back(neg(a)); lits.push_back(pos(o)); lcnf(lits); lits.clear(); lits.reserve(2); lits.push_back(neg(b)); lits.push_back(pos(o)); lcnf(lits); lits.clear(); lits.reserve(3); lits.push_back(pos(a)); lits.push_back(pos(b)); lits.push_back(neg(o)); lcnf(lits); }
void z3_propt::land(literalt a, literalt b, literalt o) { // a*b=c <==> (a + o')( b + o')(a'+b'+o) bvt lits; lits.clear(); lits.reserve(2); lits.push_back(pos(a)); lits.push_back(neg(o)); lcnf(lits); lits.clear(); lits.reserve(2); lits.push_back(pos(b)); lits.push_back(neg(o)); lcnf(lits); lits.clear(); lits.reserve(3); lits.push_back(neg(a)); lits.push_back(neg(b)); lits.push_back(pos(o)); lcnf(lits); }
void z3_propt::lnor(literalt a, literalt b, literalt o) { // a Nor b = o <==> (a' + o')( b' + o')(a + b + o) bvt lits; lits.clear(); lits.reserve(2); lits.push_back(neg(a)); lits.push_back(neg(o)); lcnf(lits); lits.clear(); lits.reserve(2); lits.push_back(neg(b)); lits.push_back(neg(o)); lcnf(lits); lits.clear(); lits.reserve(3); lits.push_back(pos(a)); lits.push_back(pos(b)); lits.push_back(pos(o)); lcnf(lits); }
void propt::set_equal(literalt a, literalt b) { lcnf(a, !b); lcnf(!a, b); }