考虑以下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的结合,我真的很喜欢C被命令,我真的很喜欢B无序和非空 . 目前,我似乎能够实现任何两个目标;有没有办法同时管理这三个?
[附录:我注意到指定 run show for 3 but 3 B, 3 C
确实实现了我的三个目标 . 相比之下, run show for 2 but 3 B
根本不会产生任何实例 . 也许我需要更好地理解范围规范的语义 . ]
2 回答
简短回答:报告的现象来自违约和隐含范围的规则;这些规则在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(其子签名边界的总和) .作为一种更好地理解范围规则的方法,对于该用户来说,执行以下所有命令非常有用:
我会留下这个问题以获得其他答案,并希望它可以帮助其他一些用户 .
原因在于,当强制有序sig包含与范围允许的原子数量时,转换器可以生成有效的对称破坏谓词,在大多数示例中,有序sig可以产生更好的求解时间 . 因此,这仅仅是一种权衡,而设计决策是为了获得性能而强制实施这种额外约束 .