util / ordering模块和有序子签名

时间:2013-06-25 22:39:39

标签: alloy

考虑以下Alloy模型:

open util/ordering[C]

abstract sig A {}
sig B extends A {}
sig C extends A {}

pred show {}
run show for 7

我理解为什么,当我run show for 7时,这个模型的所有实例都有7个签名C原子。(嗯,这不是真的。我理解 有序签名将会始终拥有与范围允许的原子数一样多的原子,因为util / ordering告诉我。但这与为什么不完全相同。)

但为什么这个模型的实例没有任何签名B的原子?这是针对util / ordering执行的特殊处理的副作用吗? (意图?意外?)util / ordering是否仅适用于顶级签名?

或者还有其他事情发生在我身上吗?

在这个抽象的模型中,我真的希望有一个像A和B这样的联合的名字,我真的很想订购C,我真的很喜欢B到是无序的,非空的。目前,我似乎能够实现任何两个目标;有没有办法同时管理这三个?

[附录:我注意到指定run show for 3 but 3 B, 3 C确实实现了我的三个目标。相比之下,run show for 2 but 3 B根本不会产生任何实例。也许我需要更好地理解范围规范的语义。]

2 个答案:

答案 0 :(得分:1)

简短回答:报告的现象来自违约和隐含范围的规则;这些规则在Language Reference

的B.7.6节中讨论

更长的答案:

最终怀疑我应该更仔细地研究范围规范的语义,这是值得肯定的。在此处显示的示例中,规则完全符合记录:

  • 对于run show for 7,签名A的默认范围为7; B和C也是如此。使用util / ordering模块强制C原子数为7;这也耗尽了签名A的配额,签名B的隐含范围为0。

  • 对于run show for 2 but 3 B,签名A的默认范围为2,B的显式范围为3.这使签名C的隐式签名为2减3或负1.算作不一致;范围界限预计是自然数。

  • 对于run show for 2 but 3 B, 3 C,签名A的隐式界限为6(其子签名的界限之和)。

为了更好地理解范围规则,这个用户执行以下所有命令非常有用:

run show for 3
run show for 3 but 2 C
run show for 3 but 2 B
run show for 3 but 2 B,  2 C
run show for 3 but 2 A
run show for 3 but 2 A, 2 C
run show for 3 but 2 A, 2 B
run show for 3 but 2 A, 2 B, 2 C

我会留下这个问题以获得其他答案,并希望它可以帮助其他一些用户。

答案 1 :(得分:1)

  

我知道有序签名将始终具有与示波器允许的原子数一样多的原子,因为util / ordering告诉我。但这与原因并不完全相同。

原因在于,当强制有序sig包含与作用域允许的原子数一样多时,转换器可以生成有效的对称破坏谓词,在大多数示例中使用有序sig,可以获得更好的求解时间。因此,这仅仅是一种权衡,而设计决策是为了获得性能而强制实施这种额外约束。