我正在浏览《合金》一书,并查看下面第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
的两个参数的见证。
该最终图像是否应该用Book0
标记$showAdd_b
?如果没有,我的误会在哪里?
答案 0 :(得分:0)
我认为这两个都是有效的实例:将Book0或Book1用作b。 注意:不存在b尚未包含给定名称的先决条件。
您可以通过添加这样的前提条件来改善添加谓词。