[更新] 感谢@LoïcGammaitoni提供答案。基于Loïc的见解,这是我为测试两种方法的等效性而创建的模型:
sig Key {}
sig Room {
keys: set Key
}
pred DisjointKeySet_v1 {
keys in Room lone -> Key
}
// See page 274 of Software Abstractions.
// It says that this: sig S {f: disj e}
// is equivalent to the constraint:
// all a,b: S | a != b => no a.f & b.f
pred DisjointKeySet_v2 {
all r, r': Room | r != r' => no r.keys & r'.keys
}
assert Equivalent {
DisjointKeySet_v1 iff DisjointKeySet_v2
}
check Equivalent
酒店的每位客人都有一套钥匙:
sig Key {}
sig Room {
keys: set Key
}
我们必须限制密钥组,以便没有两个访客获得相同的密钥。以下是实现该约束的一种方法:
fact DisjointKeySet {
keys in Room lone -> Key
}
实现约束的第二种方法涉及修改密钥声明:
sig Room {
keys: disj set Key
}
这两种方法是否相同?
我相信他们是。
可以肯定的是,我希望Alloy Analyzer比较这两种方法并搜索反例。
怎么做?如何写出正确的断言?
以下是我创建的断言。我认为它正确地检查了两种方法的等价性。你同意吗?我的断言似乎是围绕。是否有更多直接显示等价的方式?
sig Key {}
sig Room {
keys: disj set Key
}
// If each room has a disjoint set of keys,
// then each key may be used with only
// one room
assert Equivalent {
no k: Key, disj r, r': Room |
(k in r.keys) and (k in r'.keys)
}
check Equivalent
答案 0 :(得分:1)
关键字disj
在此上下文中是all a, b: Room| a!=b implies no a.keys & b.keys
的简写(c.f。软件抽象附录B)
要回答你的问题,你可以检查断言:
assert equivalence {
(keys in Room lone -> Key) <=> (all a, b: Room| a!=b implies no a.keys & b.keys)
}
结果表明两种方法都是等效的。