我在这里错过了什么? (对证人标签的混淆)

What am I missing here? (Confusion over witness labels)

我正在阅读 Alloy 这本书,并查看下面第 2 章的代码片段。

module tour/addressBook1

sig Name, Addr {}
sig Book {
  addr: Name -> lone Addr
}

pred show (b: Book) {
  #b.addr > 1
  #Name.(b.addr) > 1
}

run show for 3 but 1 Book

pred add( b, b': Book, n:Name, a: Addr) {
  b'.addr = b.addr + n -> a
}

run add for 3 but 2 Book

pred showAdd (b, b': Book, n: Name, a: Addr) {
  add [b, b', n, a]
  #Name.(b'.addr) > 1
}

run showAdd for 3 but 2 Book

当我执行 run showAdd for 3 but 2 Book 并在 Book 上投影时,我得到以下两个图像

这个输出很有意义。 Book1 添加了 Name0 -> Addr,这两个元素被标记为 showAdd.

的见证

但是,如果我在 Book 上停止投影,我会得到这个图像:

这就是我感到困惑的地方。如果我没看错的话,它告诉我 Book1 同时用作 bb',即它是谓词 showAdd 的两个参数的见证.

最终图像不应该用 $showAdd_b 标记 Book0 吗?如果不是,我的误会在哪里?

我认为两者都是有效实例:使用 Book0 或 Book1 作为 b。 注意:没有先决条件 b 不包含给定名称。

您可以通过添加这样的前置条件来改进添加谓词。