Skip to content

Commit 2d876d5

Browse files
allow for internalize implies
1 parent f77123c commit 2d876d5

File tree

4 files changed

+87
-4
lines changed

4 files changed

+87
-4
lines changed

src/smt/smt_context.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -904,6 +904,8 @@ namespace smt {
904904

905905
void add_or_rel_watches(app * n);
906906

907+
void add_implies_rel_watches(app* n);
908+
907909
void add_ite_rel_watches(app * n);
908910

909911
void mk_not_cnstr(app * n);
@@ -912,6 +914,8 @@ namespace smt {
912914

913915
void mk_or_cnstr(app * n);
914916

917+
void mk_implies_cnstr(app* n);
918+
915919
void mk_iff_cnstr(app * n, bool sign);
916920

917921
void mk_ite_cnstr(app * n);

src/smt/smt_internalizer.cpp

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -696,6 +696,10 @@ namespace smt {
696696
mk_or_cnstr(to_app(n));
697697
add_or_rel_watches(to_app(n));
698698
break;
699+
case OP_IMPLIES:
700+
mk_implies_cnstr(to_app(n));
701+
add_implies_rel_watches(to_app(n));
702+
break;
699703
case OP_EQ:
700704
if (m.is_iff(n))
701705
mk_iff_cnstr(to_app(n), false);
@@ -711,8 +715,7 @@ namespace smt {
711715
mk_iff_cnstr(to_app(n), true);
712716
break;
713717
case OP_DISTINCT:
714-
case OP_IMPLIES:
715-
throw default_exception("formula has not been simplified");
718+
throw default_exception(std::string("formula has not been simplified") + " : " + mk_pp(n, m));
716719
case OP_OEQ:
717720
UNREACHABLE();
718721
default:
@@ -1687,6 +1690,14 @@ namespace smt {
16871690
}
16881691
}
16891692

1693+
void context::add_implies_rel_watches(app* n) {
1694+
if (relevancy()) {
1695+
relevancy_eh* eh = m_relevancy_propagator->mk_implies_relevancy_eh(n);
1696+
add_rel_watch(~get_literal(n->get_arg(0)), eh);
1697+
add_rel_watch(get_literal(n->get_arg(1)), eh);
1698+
}
1699+
}
1700+
16901701
void context::add_ite_rel_watches(app * n) {
16911702
if (relevancy()) {
16921703
relevancy_eh * eh = m_relevancy_propagator->mk_ite_relevancy_eh(n);
@@ -1733,9 +1744,24 @@ namespace smt {
17331744
mk_gate_clause(buffer.size(), buffer.data());
17341745
}
17351746

1747+
void context::mk_implies_cnstr(app* n) {
1748+
literal l = get_literal(n);
1749+
literal_buffer buffer;
1750+
buffer.push_back(~l);
1751+
auto arg1 = n->get_arg(0);
1752+
literal l_arg1 = get_literal(arg1);
1753+
mk_gate_clause(l, l_arg1);
1754+
buffer.push_back(~l_arg1);
1755+
auto arg2 = n->get_arg(1);
1756+
literal l_arg2 = get_literal(arg2);
1757+
mk_gate_clause(l, ~l_arg2);
1758+
buffer.push_back(l_arg2);
1759+
mk_gate_clause(buffer.size(), buffer.data());
1760+
}
1761+
17361762
void context::mk_iff_cnstr(app * n, bool sign) {
17371763
if (n->get_num_args() != 2)
1738-
throw default_exception("formula has not been simplified");
1764+
throw default_exception(std::string("formula has not been simplified") + " : " + mk_pp(n, m));
17391765
literal l = get_literal(n);
17401766
literal l1 = get_literal(n->get_arg(0));
17411767
literal l2 = get_literal(n->get_arg(1));

src/smt/smt_relevancy.cpp

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,13 @@ namespace smt {
6262
void operator()(relevancy_propagator & rp) override;
6363
};
6464

65+
class implies_relevancy_eh : public relevancy_eh {
66+
app* m_parent;
67+
public:
68+
implies_relevancy_eh(app* p) :m_parent(p) {}
69+
void operator()(relevancy_propagator& rp) override;
70+
};
71+
6572
class ite_relevancy_eh : public relevancy_eh {
6673
app * m_parent;
6774
public:
@@ -108,6 +115,11 @@ namespace smt {
108115
return mk_relevancy_eh(or_relevancy_eh(n));
109116
}
110117

118+
relevancy_eh* relevancy_propagator::mk_implies_relevancy_eh(app* n) {
119+
SASSERT(get_manager().is_implies(n));
120+
return mk_relevancy_eh(implies_relevancy_eh(n));
121+
}
122+
111123
relevancy_eh * relevancy_propagator::mk_and_relevancy_eh(app * n) {
112124
SASSERT(get_manager().is_and(n));
113125
return mk_relevancy_eh(and_relevancy_eh(n));
@@ -357,8 +369,38 @@ namespace smt {
357369
--j;
358370
mark_as_relevant(n->get_arg(j));
359371
}
360-
}
372+
}
361373

374+
void propagate_relevant_implies(app* n) {
375+
SASSERT(get_manager().is_implies(n));
376+
lbool val = m_context.find_assignment(n);
377+
// If val is l_undef, then the expression
378+
// is a root, and no boolean variable was created for it.
379+
if (val == l_undef)
380+
val = l_true;
381+
switch (val) {
382+
case l_false:
383+
propagate_relevant_app(n);
384+
break;
385+
case l_undef:
386+
break;
387+
case l_true: {
388+
expr* true_arg = nullptr;
389+
auto arg0 = n->get_arg(0);
390+
auto arg1 = n->get_arg(1);
391+
if (m_context.find_assignment(arg0) == l_false) {
392+
if (!is_relevant_core(arg0))
393+
mark_as_relevant(arg0);
394+
return;
395+
}
396+
if (m_context.find_assignment(arg1) == l_true) {
397+
if (!is_relevant_core(arg1))
398+
mark_as_relevant(arg1);
399+
return;
400+
}
401+
}
402+
}
403+
}
362404
/**
363405
\brief Propagate relevancy for an or-application.
364406
*/
@@ -470,6 +512,9 @@ namespace smt {
470512
case OP_AND:
471513
propagate_relevant_and(to_app(n));
472514
break;
515+
case OP_IMPLIES:
516+
propagate_relevant_implies(to_app(n));
517+
break;
473518
case OP_ITE:
474519
propagate_relevant_ite(to_app(n));
475520
break;
@@ -505,6 +550,8 @@ namespace smt {
505550
propagate_relevant_or(to_app(n));
506551
else if (m.is_and(n))
507552
propagate_relevant_and(to_app(n));
553+
else if (m.is_implies(n))
554+
propagate_relevant_implies(to_app(n));
508555
}
509556
relevancy_ehs * ehs = get_watches(n, val);
510557
while (ehs != nullptr) {
@@ -644,6 +691,11 @@ namespace smt {
644691
static_cast<relevancy_propagator_imp&>(rp).propagate_relevant_or(m_parent);
645692
}
646693

694+
void implies_relevancy_eh::operator()(relevancy_propagator& rp) {
695+
if (rp.is_relevant(m_parent))
696+
static_cast<relevancy_propagator_imp&>(rp).propagate_relevant_implies(m_parent);
697+
}
698+
647699
void ite_relevancy_eh::operator()(relevancy_propagator & rp) {
648700
if (rp.is_relevant(m_parent)) {
649701
static_cast<relevancy_propagator_imp&>(rp).propagate_relevant_ite(m_parent);

src/smt/smt_relevancy.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ namespace smt {
188188
void add_dependency(expr * src, expr * target);
189189

190190
relevancy_eh * mk_or_relevancy_eh(app * n);
191+
relevancy_eh* mk_implies_relevancy_eh(app* n);
191192
relevancy_eh * mk_and_relevancy_eh(app * n);
192193
relevancy_eh * mk_ite_relevancy_eh(app * n);
193194
relevancy_eh * mk_term_ite_relevancy_eh(app * c, app * t, app * e);

0 commit comments

Comments
 (0)