【发布时间】: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