Alloy 断言没有按预期工作
Alloy assertion does not work as expected
这是我的 alloy 代码:
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
}
所以我想添加一个断言,即两个赞助人目前不能拥有同一本书。这是我的断言:
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 找到有效实例。
我做错了什么?谢谢。
您错误地使用了检查命令。要检查断言 sameBook2Patrons
,您应该改用
check sameBook2Patrons for exactly 2 Book, exactly 2 Patron
即没有花括号。如果放置大括号,则要检查的断言是大括号内的表达式(在您的情况下为空,相当于 true),sameBook2Patrons
只是命令的名称。
这是我的 alloy 代码:
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
}
所以我想添加一个断言,即两个赞助人目前不能拥有同一本书。这是我的断言:
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 找到有效实例。
我做错了什么?谢谢。
您错误地使用了检查命令。要检查断言 sameBook2Patrons
,您应该改用
check sameBook2Patrons for exactly 2 Book, exactly 2 Patron
即没有花括号。如果放置大括号,则要检查的断言是大括号内的表达式(在您的情况下为空,相当于 true),sameBook2Patrons
只是命令的名称。