我正在尝试了解Alloy中的订购方式。我有一个时间签名,我用它来实例化订购模块。我希望谓词addPage在时间t'向书中添加页面,其中t'= t.next。 (基本上在下次将书页添加到书中)但是它没有按预期工作,而是Time2的页数比Time1少。有人可以向我解释为什么会这样吗?感谢。
open util/ordering[Page] as P0
open util/ordering[Time] as T0
sig Page {}
sig Time {}
sig Book
{
pages: Page -> Time
}
pred addPage(b:Book, p:Page, t: Time)
{
t != T0/last implies
{
let t' = t.next |
b.pages.t' = b.pages.t + p
}
}
run addPage {} for 3
答案 0 :(得分:0)
问题是run语句中的额外花括号。 我认为Alloy在这种情况下执行一个空谓词。
尝试:
run addPage for 3
代替。您将看到一个可视化,其中标记了b,t和p的所选实例。
答案 1 :(得分:0)
您正在尝试更改只能在约束逻辑中模拟的状态。 请注意,addPage中的表达式基本上无效/在没有它的情况下运行模型/并且解决方案中只有一个Book原子。
这是一个你可以开始并逐渐完善的模型。
open util/ordering[Time]
sig Page {}
sig Time {}
sig Book {
pages : Page lone -> Time // each Time atom is mapped to at most one Page atom
}
pred addPage(b0, b1 : Book, pg : Page, t0, t1 : Time) {
one pg and // one page at a time (it's likely redundant)
not pg in b0.pages.Time and // it's a 'new' page
b0.pages + pg->t1 = b1.pages and // 'new state' of b0
t1 = t0.next // pg is 'added' with the next time stamp
}
run addPage for 3 but 2 Book
我使用了可选的'和'运算符,在约束的末尾放置了t1 = t0.next,在右边定位了b1.pages /表示'new state'/并在注释中使用了引号来强调那里有在命令式编程工作中没有真正的状态变化和操作顺序。