【问题标题】:Unexpected Instance found for Alloy specification发现合金规格的意外实例
【发布时间】: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!

标签: modeling alloy


【解决方案1】:

这里有两件令人困惑的事情:

  1. Book0 不参与操作。相反,Book1 具有b0b1 的角色。

  2. n->a 添加到一本书并不能断言这是一个新地址。在该实例中,Book1add 之前和之后都有此地址。 这是因为操作

    b'.addr = b.addr + n->a
    

    使用设置联合。分解为一个更简单的例子:

    {1, 2} = {1} + {2}
    

    是真的。但是

    {1, 2} = {1, 2} + {2}
    

    也是如此。所以在最初的例子中,没有什么可以排除n->a 已经成为b.addr 的一部分。合金分析器只生成与给定约束一致的所有实例。

您可以通过在add 中添加断言来改进此示例:

    b.addr[n] != a

【讨论】:

  • 啊。这确实很有帮助!我可以从 Book 实例(图片的上半部分)中看到谓词在哪个 Book 上运行,对吗?我用“but 1 Book”而不是“but 2 Book”来运行它,并且根据您的提示,这一切都是有道理的。您对添加的附加断言可以防止添加预先存在的夫妻,对吗?如果有,请简要指出,我会接受答案!
  • 嗯。不。您的附加断言迫使一本书成为“之前”状态,另一本书成为“之后”状态,但我不明白为什么。你能详细说明一下吗?
  • @JanEckert:我已经添加了一些解释。
  • 非常感谢您的宝贵时间!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-30
相关资源
最近更新 更多