我受到Greg Dennis和Rob Seater的幻灯片http://alloy.mit.edu/alloy/tutorials/day-course/s4_dynamic.pdf的启发,对自动机进行建模,其自身的过渡由规则和不变性定义,但我无法理解为什么即使存在不变性和矛盾也能满足约束条件规则。
sig State {value : one Int}
sig System { trans : State -> State }
pred i1[s : State] { s.value < 4 }
pred i2[s : State] { s.value > 0 }
pred r1[s, s' : State, m, m' : System] {
s.value = -1 and s'.value = 0 and change[s, s', m, m']
}
pred r2[s, s' : State, m, m' : System] {
s.value = 1 and s'.value = 2 and change[s, s', m, m']
}
pred change[s, s' : State, m, m' : System] {
m'.trans = m.trans + s -> s'
}
assert ruleSafe {
all s, s' : State, m,m' : System |
i1[s] and i2[s] and r1[s,s',m,m'] and r2[s,s',m,m'] =>
i1[s'] and i2[s']
}
check ruleSafe
答案 0 :(得分:0)
首先,旁注:不清楚value
关系打算做什么,但要记住Alloy中的整数往往非常窄,溢出行为可以制定像{{s.value < 4
这样的规则。 1}}产生意想不到的结果。每当使用整数只是为了确保提供不同的值或有序值时,使用Alloy中未解释的类型以及某些关系来确保必要的约束几乎总是更好。
但是,这不是您混淆的主要原因。我认为您认为,因为r1
要求其第一个参数的value
为-1且r2
需要相同的参数才能使value
为1,任何涉及的条件具有相同第一个参数的r1
和r2
都不可能满足,并且不存在满足这样的谓词所需的模型实例。几乎是真的!
我认为你是正确的r1
和r2
对于同一组参数(或具有相同第一个参数s
的任何参数集)都不能同时为真。但是,您指定的约束在条件的前提中使用r1[s,s',m,m'] and r2[s,s',m,m']
。在你继续前进之前,停下来想一想:如果先行者是假的,条件的真值是多少?
如果您无法查看正在发生的事情,请尝试检查模型的实例,其中条件的前提对于所有状态和系统对都是正确的。具体而言,将以下内容添加到模型中并查看它生成的实例。
pred antecedent {
all s, s' : State, m, m' : System
| i1[s] and i2[s] and r1[s,s',m,m'] and r2[s,s',m,m']
}
run antecedent
在我理解我所看到的之前,我花了一两分钟;如果花费的时间超过几分钟,您可以尝试antecedent
的以下变体定义,看看它是否能够启发你。
pred antecedent {
all s, s' : State, m, m' : System
| i1[s] and i2[s] and r1[s,s',m,m'] and r2[s,s',m,m']
some State
some System
}
如果您的模型中的条件语句在您预期为假时是真空的,那么您不是第一个使用一线逻辑的用户。你不会是最后一个。