【发布时间】:2018-10-19 12:49:23
【问题描述】:
我尝试了使用 Alloy 进行建模的第一步,但遇到了一个我无法理解的问题。我有以下规格:
module tour/AddressBook1
sig Name, Addr{}
sig Book {
addr: Name->lone Addr
}
// operation: adds a (name, address) to the Book b, resulting in b'
pred add (b, b' : Book, n:Name, a:Addr) {
b'.addr = b.addr + n->a
}
run add for 3 but 2 Book
到目前为止没有什么特别的。它实际上是 Daniel Jackson 的“软件抽象”一书的例子。
它本质上是对具有(名称,地址)对的书籍进行建模。 add-predicate 应该通过添加(可能已经存在的)(名称,地址)对来获取 Book-instance b 并从中创建另一个 Book-instance b'。
找到的前几个示例很简单且令人信服,但单击“下一步”按钮我最终得到了以下示例(上面的完整视图,下面书籍的等效投影)
我看到两本书,起始书 Book0 有两对 (Name0, Addr2) 和 (Name1, Addr1)。从注释中我们还可以看到,添加操作将添加新的二人组(Name1,Addr2)。当我现在查看结果书 Book1 时,我有 {(Name0, Addr0),(Name1, Addr2)} 而不是 {(Name0, Addr2),(Name1, Addr1),(Name1, Addr2)}
为什么这被视为法律实例?
(Alloy Analyzer 4.2,构建日期 2012-09-25 15:54 EDT)
【问题讨论】:
-
感谢您添加图片,Peter Kriens!