约束语法谓词和断言

时间:2014-01-30 08:06:19

标签: alloy

我想知道如果在谓词中使用约束语法是否不同,那么./ / 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

1 个答案:

答案 0 :(得分:1)

在所有这四个示例中,您都有一个更高阶的量词:您正在尝试量化二进制字段(x: A -> B),所以当您说all x1, x2: x | ...时,它意味着“为所有人从二元关系x“中绘制的二进制元组x1和x2。合金是一阶的,通常不能处理更高阶的东西。在某些情况下它没有抱怨的原因是它能够“量化”量词,因此它不必检查任何所有元素大于1的元组。

例如,当你说check S1时,你会问合金是否适用于所有二进制元组的东西;因为Alloy是一个有界的模型发现者,它会试图通过找到一个单个这样的元组来反驳它,而这个元组的身体没有 - 那里没有更高的顺序,所以这个案例将会工作。当你说“检查S2”时,你会问合金是否所有二进制元组都有效,所以要反驳Alloy实际上必须检查该实体是否适用于每个这样的二进制文件元组---那是更高阶,合金不能这样做。

我不知道你的意图是否首先要进行高阶量化。只是猜测,也许你想要的只是all b: B, a: b.x | ...,这是一阶的,并且可以正常工作。