检查两种方法的等效性,以确保所有酒店客人获得一组独特的钥匙

时间:2018-04-02 20:55:58

标签: alloy

[更新] 感谢@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

1 个答案:

答案 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)
}

结果表明两种方法都是等效的。