我正在学习Alloy并试图让它找到两个二元关系r
和s
,这样s
等于r
的传递闭包,并且s
不等于r
。我想我可以通过执行以下操作让Alloy执行此操作:
sig V
{
r : V,
s : V
}
assert F { not ( some (s-r) and s=^r ) }
check F
现在合金4.2找不到反例,尽管一个简单的3元素结构显然是r = {(V0,V1), (V1,V2)}
和s = r + {(V0,V2)}
的结构。
有人可以解释发生了什么吗?
答案 0 :(得分:2)
直接翻译您的要求:
// find two binary relations r and s such that
// s equals the transitive closure of r ands is not equal to r
run {some r, s: univ -> univ | s != r and s = ^r}
这给出了一个预期的实例。您的规范中的错误是您的声明将关系限制为函数;应该改为
sig V {
r: set V,
s: set V
}
或
sig V {r, s: set V}