为什么签名的名称会影响变量的数量?

时间:2017-05-24 13:21:43

标签: alloy

使用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%。我也亲眼目睹了我的实际模型的大差异(有更多的签名,但实际上并没有更大的范围)。

谢谢,

0 个答案:

没有答案