考虑以下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
根本不会产生任何实例。也许我需要更好地理解范围规范的语义。]
答案 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,可以获得更好的求解时间。因此,这仅仅是一种权衡,而设计决策是为了获得性能而强制实施这种额外约束。