我在这里想念什么? (对证人标签的困惑)

时间:2018-06-22 14:52:54

标签: 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上时,我得到以下两个图像

Book0

Book1

该输出很有意义。 Book1中添加了Name0 -> Addr,这两个元素被标记为showAdd的见证人。

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

No Projection

这就是我感到困惑的地方。如果我正确阅读,则表示Book1b都同时使用b',即它是谓词showAdd的两个参数的见证。

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

1 个答案:

答案 0 :(得分:0)

我认为这两个都是有效的实例:将Book0或Book1用作b。 注意:不存在b尚未包含给定名称的先决条件。

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