为什么这种对称断言是错误的?

时间:2012-11-26 08:50:12

标签: alloy

我真的很困惑为什么总会有一个反面的例子给我以下的断言。

//assertions must NEVER by wrong
assert Symmetric{
all r: univ -> univ | some ~r iff (some x, y: univ | x not in y and y not in x and 
                                  (x->y in r) and (y->x in r))
}

check Symmetric

反例总是在univ set中显示1个元素。但是,这应该不是这种情况,因为我指定将有一些~r iff x不在y而y不在x中。唯一的因素不应该满足这个说法。

然而,为什么模型会继续显示我的断言的反例?

---INSTANCE---
integers={}
univ={Univ$0}
Int={}
seq/Int={}
String={}
none={}
this/Univ={Univ$0}
skolem $Symmetric_r={Univ$0->Univ$0}

非常感谢一些指导!

1 个答案:

答案 0 :(得分:1)

在Alloy中,断言用于检查逻辑句子(模型的属性)的正确性,而不是指定应始终保留在模型中的属性。所以你没有指定

  

如果x不在y而y不在x

中会有一些

你反问合金是否确实对于所有二元关系rsome ~r iff x not in y and y not in x [...]和Alloy回答它不是真的,并给出了一个具体的例子(反例),其中该属性不成立。

其他几点

  • some ~r并不意味着“r是对称的”;它只是意味着r的转置是非空的,这是不一样的。如果二元关系等于它的转置,则它是对称的,所以你可以写r = ~r来表达它;

  • 而不是some x, y: univ | x not in y and y not in x and [...]您可以等同地写some disj x, y: univ | [...];

  • 然而,
  • some表达式并没有真正表达对称属性,因为它所说的是“有一些x,y使得x-> y和y-> x在r“;相反,你想说的是“对于所有的x,y,如果x-> y在r中,那么y-> x也在r中”。