Alloy约束如何将一个集合置于其子集中?

时间:2016-12-30 20:17:11

标签: alloy

以下Alloy代码表示每个酒店房间都有一组钥匙:

sig Key {}

sig Room {
    keys: set Key
}

需要约束keys关系。就目前而言,它允许这样的实例:密钥K1用于一堆房间。哎哟!我们不希望这样。我们希望每个密钥只能用于一个房间。这是一个图形,说明了有效实例的范围(以及我们实际想要允许的实例子集):

Universe of room/key instances

我们真正想要的实例集很好地用这个Alloy代码表达:

Room lone -> Key

合金代码的实例在上图中用小圆圈表示。

那么,我们如何约束keys?一个答案是这样的:创建一个合金事实,其中说:

keys in Room lone -> Key

想想图中所说的是什么。据说大圆圈必须在小圆圈内(见下文)。这不奇怪吗?圆圈如何在其子圆圈内?有人可以给我一些直觉吗?这看起来很奇怪。

Big circle inside small circle

1 个答案:

答案 0 :(得分:1)

  • 如果您只有sig Room {keys: set Key}而没有任何其他事实/约束,keys关系的域名就是大圈子;

  • 您可以决定添加一些约束(例如keys in Room lone -> Key),以缩小keys关系的域(使其成为小圆圈)。

因此,思考它的正确方法并不是大圈必须在小圈内(?!);相反,将其视为使用小圆而不是大圆作为keys的域(所有有效值的集合)。