我在这里错过了什么? (对证人标签的混淆)
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
同时用作 b
和 b'
,即它是谓词 showAdd
的两个参数的见证.
最终图像不应该用 $showAdd_b
标记 Book0
吗?如果不是,我的误会在哪里?
我认为两者都是有效实例:使用 Book0 或 Book1 作为 b。
注意:没有先决条件 b 不包含给定名称。
您可以通过添加这样的前置条件来改进添加谓词。
我正在阅读 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
同时用作 b
和 b'
,即它是谓词 showAdd
的两个参数的见证.
最终图像不应该用 $showAdd_b
标记 Book0
吗?如果不是,我的误会在哪里?
我认为两者都是有效实例:使用 Book0 或 Book1 作为 b。 注意:没有先决条件 b 不包含给定名称。
您可以通过添加这样的前置条件来改进添加谓词。