软件抽象的介绍性示例:
sig Name, Addr{}
sig Book {
addr: Name -> lone Addr
}
pred show(b:Book) {
#b.addr > 1
#Name.(b.addr) > 1
}
#Addr> 1 在语义上等同于 #Name。(b.addr)> 1
让我感到困惑名称是一般的集合引用,而 b 是指特定的图书,它们一起出现在表达式中。此外,括号(b.addr)表达式的确切含义是什么?
答案 0 :(得分:2)
b.addr
是地址簿b
的映射,从名称到地址。因此Name.(b.addr)
是该映射下所有名称集的图像:它是b
中的地址集。因此,#Name.(b.addr) > 1
表示地址簿b
包含多个地址。相比之下,#Addr > 1
表示存在多个地址 - 通过让地址根本不属于任何一本书来满足。