|
12 | 12 |
|
13 | 13 | import nnf |
14 | 14 |
|
15 | | -from nnf import Var, And, Or, amc, dimacs, dsharp, operators, \ |
16 | | - tseitin, complete_models |
| 15 | +from nnf import (Var, And, Or, amc, dimacs, dsharp, operators, |
| 16 | + tseitin, complete_models) |
17 | 17 |
|
18 | 18 | settings.register_profile('patient', deadline=2000, |
19 | 19 | suppress_health_check=(HealthCheck.too_slow,)) |
@@ -121,8 +121,10 @@ def CNF(draw): |
121 | 121 |
|
122 | 122 | @st.composite |
123 | 123 | def models(draw): |
124 | | - return And(Var(name, draw(st.booleans())) |
125 | | - for name in range(1, 9)) |
| 124 | + return And( |
| 125 | + Var(name, draw(st.booleans())) |
| 126 | + for name in range(1, draw(st.integers(min_value=1, max_value=9))) |
| 127 | + ) |
126 | 128 |
|
127 | 129 |
|
128 | 130 | @st.composite |
@@ -766,25 +768,35 @@ def test_tseitin(sentence: nnf.NNF): |
766 | 768 | T = tseitin.to_CNF(sentence) |
767 | 769 | assert T.is_CNF() |
768 | 770 |
|
769 | | - # Only do the following checks when we haven't simplified away some vars |
770 | | - # assume(sentence.vars() <= T.vars()) |
771 | | - |
772 | 771 | # TODO: Once forgetting/projection is implemented, |
773 | 772 | # do this more complete check |
774 | 773 | # aux = filter(lambda x: 'aux' in str(x.name), T.vars()) |
775 | 774 | # assert T.forget(aux).equivalent(sentence) |
776 | 775 |
|
777 | 776 | models = list(complete_models(T.models(), sentence.vars() | T.vars())) |
778 | 777 |
|
779 | | - for mt in T.models(): |
| 778 | + for mt in models: |
780 | 779 | assert sentence.satisfied_by(mt) |
781 | 780 |
|
782 | | - assert T.model_count() == sentence.model_count() |
| 781 | + assert len(models) == sentence.model_count() |
783 | 782 |
|
784 | 783 | @given(models()) |
785 | 784 | def test_complete_models(model: nnf.And[nnf.Var]): |
786 | | - t0, t1, t2 = [], ['test1'], ['test1', 'test2'] |
787 | 785 | 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))) |
| 786 | + neg = {v.name: not v.true for v in model} |
| 787 | + |
| 788 | + zero = list(complete_models([m], model.vars())) |
| 789 | + assert len(zero) == 1 |
| 790 | + |
| 791 | + one = list(complete_models([m], model.vars() | {"test1"})) |
| 792 | + assert len(one) == 2 |
| 793 | + |
| 794 | + two = list(complete_models([m], model.vars() | {"test1", "test2"})) |
| 795 | + assert len(two) == 4 |
| 796 | + assert all(x.keys() == m.keys() | {"test1", "test2"} for x in two) |
| 797 | + |
| 798 | + if m: |
| 799 | + multi = list(complete_models([m, neg], model.vars() | {"test1", "test2"})) |
| 800 | + assert len(multi) == 8 |
| 801 | + assert len({frozenset(x.items()) for x in multi}) == 8 # all unique |
| 802 | + assert all(x.keys() == m.keys() | {"test1", "test2"} for x in multi) |
0 commit comments