我想知道如果在谓词中使用约束语法是否不同,那么./ / p>
约束所有disj x1,x2:X | x1 = x2 在a中执行时给出不同的结果 谓词和断言。
例如,假设以下模型:
sig A {}
sig B {x: one A}
assert S1
{all x1,x2: x | x1 = x2}
将S1检查为2 - 反例作为x1和x2的非等效实例
assert S2
{! (all x1,x2: x | x1 = x2)}
检查S2是否为2 - 更高阶量化误差
pred P1
{(all x1,x2: x | x1 = x2)}
run P1 for 2 -- higher-order quantification error
pred P2
{! (all x1,x2: x | x1 = x2)}
运行p2 for 2 - 生成x1和x2
的非等效实例为什么有些约束可以量化,而它们的否定却没有,反之亦然!
感谢
Abdallah Rayhan
答案 0 :(得分:1)
在所有这四个示例中,您都有一个更高阶的量词:您正在尝试量化二进制字段(x: A -> B
),所以当您说all x1, x2: x | ...
时,它意味着“为所有人从二元关系x“中绘制的二进制元组x1和x2。合金是一阶的,通常不能处理更高阶的东西。在某些情况下它没有抱怨的原因是它能够“量化”量词,因此它不必检查任何所有元素大于1的元组。
例如,当你说check S1
时,你会问合金是否适用于所有二进制元组的东西;因为Alloy是一个有界的模型发现者,它会试图通过找到一个单个这样的元组来反驳它,而这个元组的身体没有 - 那里没有更高的顺序,所以这个案例将会工作。当你说“检查S2”时,你会问合金是否所有二进制元组都有效,所以要反驳Alloy实际上必须检查该实体是否适用于每个这样的二进制文件元组---那是更高阶,合金不能这样做。
我不知道你的意图是否首先要进行高阶量化。只是猜测,也许你想要的只是all b: B, a: b.x | ...
,这是一阶的,并且可以正常工作。