【问题标题】:Alloy assertion does not work as expected合金断言没有按预期工作
【发布时间】:2016-02-20 15:57:51
【问题描述】:

这是我的合金代码:

one sig Library {
    books: set Book,    // set of the library's books
    patrons: set Patron,    // set of the library's patrons
    circulation: Patron lone -> some Book   // books in circulation
}

// set of books in the Library
sig Book {
}

// set of patrons
sig Patron {
    curbooks: set Book // books currently checked out by a patron
}

所以我想添加一个断言,即两个 Patron 目前不能拥有同一本书。这是我的断言:

assert sameBook2Patrons {
    all disj p, p': Patron | all b: p.curbooks | b not in p'.curbooks
}

所以当检查断言时:

check sameBook2Patrons{} for exactly 2 Book, exactly 2 Patron

Alloy 没有找到任何反例。但是当我使用运行命令时,Alloy 给了我很多反例:

run{} for exactly 2 Book, exactly 2 Patron

另外,我读到添加一个否定有效断言的事实不应该给出任何实例。我补充说:

fact sameBook2Patrons {
    not (all disj p, p': Patron | all b: p.curbooks | b not in p'.curbooks)
}

当我运行模型时,Alloy 会找到有效的实例。

我做错了什么?谢谢。

【问题讨论】:

  • 请注意,使用 run 命令不会产生反例,但会产生满足您的合金规范的实例。

标签: assertion alloy model-checking


【解决方案1】:

您错误地使用了检查命令。要检查断言sameBook2Patrons,您应该改用

check sameBook2Patrons for exactly 2 Book, exactly 2 Patron

即,没有花括号。如果您放置大括号,则要检查的断言是大括号内的表达式(在您的情况下,为空,相当于 true),sameBook2Patrons 只是命令的名称。

【讨论】:

  • 啊,谢谢,那是错误。现在,我觉得很菜鸟,我想这只是因为我是。再次感谢您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-23
  • 1970-01-01
  • 1970-01-01
  • 2020-05-31
  • 1970-01-01
相关资源
最近更新 更多