以下Alloy代码表示每个酒店房间都有一组钥匙:
sig Key {}
sig Room {
keys: set Key
}
需要约束keys
关系。就目前而言,它允许这样的实例:密钥K1用于一堆房间。哎哟!我们不希望这样。我们希望每个密钥只能用于一个房间。这是一个图形,说明了有效实例的范围(以及我们实际想要允许的实例子集):
我们真正想要的实例集很好地用这个Alloy代码表达:
Room lone -> Key
合金代码的实例在上图中用小圆圈表示。
那么,我们如何约束keys
?一个答案是这样的:创建一个合金事实,其中说:
keys in Room lone -> Key
想想图中所说的是什么。据说大圆圈必须在小圆圈内(见下文)。这不奇怪吗?圆圈如何在其子圆圈内?有人可以给我一些直觉吗?这看起来很奇怪。
答案 0 :(得分:1)
如果您只有sig Room {keys: set Key}
而没有任何其他事实/约束,keys
关系的域名就是大圈子;
您可以决定添加一些约束(例如keys in Room lone -> Key
),以缩小keys
关系的域(使其成为小圆圈)。
因此,思考它的正确方法并不是大圈必须在小圈内(?!);相反,将其视为使用小圆而不是大圆作为keys
的域(所有有效值的集合)。