关系连接中Alloy谓词的含义

时间:2013-02-01 17:38:49

标签: alloy

考虑以下地址簿示例的简单变体

sig Name, Addr {}
sig Book { addr : Name -> Addr } // no lone on Addr
pred show(b:Book) { some n : Name | #addr[b,n] > 1 }
run show for exactly 2 Book, exactly 2 Addr, exactly 2 Name

在某些模型实例中,我可以在评估程序中获得以下结果

all b:Book | show[b]
--> yields false
some b:Book | show[b]
--> yields true
show[Book]
--> yields true

如果show是一种关系,那么人们可能会得到一个答案:{true,false}。鉴于它是谓词,返回单个布尔值。我希望show [Book]能够成为它上面普遍量化表达的简写。相反,似乎使用存在量化来折叠结果。任何人都知道这可能是什么理由,或者对show [Book]的含义有另一种解释?

1 个答案:

答案 0 :(得分:1)

(我不确定我是否有正确的话,所以如果这看起来很模糊,请耐心等待。)

请记住,Alloy中表示个体的所有表达都表示个体集合,并且“个体X”和“成员为个体X”的单例集之间的语言没有区别。 ([后来的附录:]在更常用的术语中:Alloy的逻辑中的一般规则是所有值都是关系。二元关系是对的集合,n元组的n元关系集,集合是一元关系,和标量单例集。请参阅软件抽象的第3.2.2节中的讨论,或the Alloy Analyzer 4 tutorial by Greg Dennis and Rob Seater中的“一切都是关系”幻灯片。)

鉴于你给出的'show'谓词的声明,很容易指望'show'的参数应该是一本书 - 或者更确切地说,是单一的Book集合 - 然后进一步期待如果参数实际上不是单例集(如此处的表达式show[Book]那么),那么系统会将其强制为单例集,或者用某种隐式存在性或通用量化来解释它。但是在声明pred show(b:Book) ...中,表达式b:Book只是命名一个对象b,它将是签名Book中的一组对象。 (要求b是一个单例集,请写pred show(one b: Book) ...。)构成show主体的表达式对b = Book进行评估,就像b = Book $ 0一样容易。

存在量化的出现是点运算符位于表达式addr[b,n](或等效n.(b.addr)的核心位置的方式的结果。实际上,如果你进行实验,你会发现那个节目只要存在所有书籍集合包含两个不同地址的映射的名称,即使在存在性解释失败的情况下,[Book]也是如此。尝试将此添加到模型中,例如:

pred hmmmm { show[Book] and no b: Book | show[b] }
run hmmmm for exactly 2 Book, exactly 2 Addr, exactly 2 Name