如何在Alloy中表示一对一关系?

How to represent one-to-one relationship in Alloy?

假设我有 信号 A{} 签名 B{e:A} 我想表示 A 和 B 之间的 1-1 映射,因此对于每个 B,只有一个 A 对应于:

{all b:B | one a : A | b.e = a}

是否有其他方法可以做到这一点,例如使用多重性?

您可以编写以确保每个 B 都与一个 A 相关:

 sig B{
   e: one A
 }

编辑:

要确保每个 A 都与一个 B 相关,您可以在 A 的签名声明中添加一个签名事实

sig A{
}{
    one this.~e
}

为什么这样做:

签名A下的签名事实被Alloy处理为:

fact{
    all a:A | one a.~e
}

其中:

  • e 是签名 B 中定义的字段。因此它定义了类型 B -> A 的关系.

  • ~ 运算符产生该关系的逆(因此类型变为 A -> B )。

  • a 和那个关系 (A.A->B 之间的“点连接”产生所有 B 元素 B.e=a.

  • 最后用one关键字表示只有一个这样的B元素(for all a) .