我真的很困惑为什么总会有一个反面的例子给我以下的断言。
//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}
非常感谢一些指导!
答案 0 :(得分:1)
在Alloy中,断言用于检查逻辑句子(模型的属性)的正确性,而不是指定应始终保留在模型中的属性。所以你没有指定
如果x不在y而y不在x
中会有一些
你反问合金是否确实对于所有二元关系r
,some ~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中”。