使用Alloy 4.2,以下Alloy模型......
sig E {}
sig G {}
sig D extends G {
x: E
}
sig F1 extends G {
x: G
}
sig F2 extends G {
x: G
}
sig F3 extends G {
x: G
}
sig F4 extends G {
x: G
}
run {} for 3
...使用以下输出执行:
Executing "Run run$1 for 3"
Solver=sat4j Bitwidth=0 MaxSeq=0 SkolemDepth=1 Symmetry=20
486 vars. 66 primary vars. 748 clauses. 158ms.
Instance found. Predicate is consistent. 36ms.
如果您只是将签名D
重命名为H
(真正的单字符更改),则底层SAT问题的变量和子句的数量会发生变化:
Executing "Run run$1 for 3"
Solver=sat4j Bitwidth=0 MaxSeq=0 SkolemDepth=1 Symmetry=20
494 vars. 66 primary vars. 762 clauses. 23ms.
Instance found. Predicate is consistent. 28ms.
为什么呢?这种行为何时出现?有没有办法命名签名,以确保获得尽可能少的变量和子句?
更多详情:
我确信这与签名名称的字母顺序有关。如果您选择任何低于E
的名称,您将获得486个变量,并且任何名称都高于H
,您将获得494个变量。
在我搜索一个最小的例子(从我相当大的模型开始)期间,我目睹了一些情况,选择三个不同的名称会产生三个不同数量的变量。我在这个过程中丢失了这些例子,但我记得涉及字母顺序。
对于小尺寸,这可能看起来没什么,但如果你run {} for 12
而不是3
,变量的数量会变成17415和19439,因此差异超过10%。我也亲眼目睹了我的实际模型的大差异(有更多的签名,但实际上并没有更大的范围)。
谢谢,