Skip to content

Commit 93ce84a

Browse files
committed
Adding a complete_models method.
1 parent 6166a97 commit 93ce84a

File tree

2 files changed

+28
-3
lines changed

2 files changed

+28
-3
lines changed

nnf/__init__.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -590,7 +590,7 @@ def neg(node: NNF) -> NNF:
590590

591591
return neg(self)
592592

593-
def to_CNF(self: T_NNF) -> 'And[Or[Var]]':
593+
def to_CNF(self) -> 'And[Or[Var]]':
594594
"""Compile theory to a semantically equivalent CNF formula."""
595595
from nnf import tseitin
596596
return tseitin.to_CNF(self)
@@ -1567,6 +1567,20 @@ def map(self, func: t.Callable[[T_NNF_co], U_NNF]) -> 'Or[U_NNF]':
15671567
...
15681568

15691569

1570+
def complete_models(
1571+
models: t.Iterable[Model],
1572+
names: t.FrozenSet[Name]
1573+
) -> t.Iterator[Model]:
1574+
diff = None
1575+
for model in models:
1576+
if diff is None:
1577+
diff = names - model.keys()
1578+
for supplement in all_models(diff):
1579+
new = model.copy()
1580+
new.update(supplement)
1581+
yield new
1582+
1583+
15701584
def decision(
15711585
var: Var,
15721586
if_true: T_NNF,

test_nnf.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212

1313
import nnf
1414

15-
from nnf import Var, And, Or, amc, dimacs, dsharp, operators, tseitin
15+
from nnf import Var, And, Or, amc, dimacs, dsharp, operators, \
16+
tseitin, complete_models
1617

1718
settings.register_profile('patient', deadline=2000,
1819
suppress_health_check=(HealthCheck.too_slow,))
@@ -766,14 +767,24 @@ def test_tseitin(sentence: nnf.NNF):
766767
assert T.is_CNF()
767768

768769
# Only do the following checks when we haven't simplified away some vars
769-
assume(sentence.vars() <= T.vars())
770+
# assume(sentence.vars() <= T.vars())
770771

771772
# TODO: Once forgetting/projection is implemented,
772773
# do this more complete check
773774
# aux = filter(lambda x: 'aux' in str(x.name), T.vars())
774775
# assert T.forget(aux).equivalent(sentence)
775776

777+
models = list(complete_models(T.models(), sentence.vars() | T.vars()))
778+
776779
for mt in T.models():
777780
assert sentence.satisfied_by(mt)
778781

779782
assert T.model_count() == sentence.model_count()
783+
784+
@given(models())
785+
def test_complete_models(model: nnf.And[nnf.Var]):
786+
t0, t1, t2 = [], ['test1'], ['test1', 'test2']
787+
m = {v.name: v.true for v in model}
788+
assert 1 == len(list(complete_models([m], list(m.keys())+t0)))
789+
assert 2 == len(list(complete_models([m], list(m.keys())+t1)))
790+
assert 4 == len(list(complete_models([m], list(m.keys())+t2)))

0 commit comments

Comments
 (0)