这两个引用在语义上是等价的吗?

时间:2015-08-19 08:40:55

标签: alloy

软件抽象的介绍性示例:

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)表达式的确切含义是什么?

1 个答案:

答案 0 :(得分:2)

b.addr是地址簿b的映射,从名称到地址。因此Name.(b.addr)是该映射下所有名称集的图像:它是b中的地址集。因此,#Name.(b.addr) > 1表示地址簿b包含多个地址。相比之下,#Addr > 1表示存在多个地址 - 通过让地址根本不属于任何一本书来满足。