具有规则和不变性的自动机

时间:2015-03-25 10:40:15

标签: alloy

我受到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

1 个答案:

答案 0 :(得分:0)

首先,旁注:不清楚value关系打算做什么,但要记住Alloy中的整数往往非常窄,溢出行为可以制定像{{s.value < 4这样的规则。 1}}产生意想不到的结果。每当使用整数只是为了确保提供不同的值或有序值时,使用Alloy中未解释的类型以及某些关系来确保必要的约束几乎总是更好。

但是,这不是您混淆的主要原因。我认为您认为,因为r1要求其第一个参数的value为-1且r2需要相同的参数才能使value为1,任何涉及的条件具有相同第一个参数的r1r2都不可能满足,并且不存在满足这样的谓词所需的模型实例。几乎是真的!

我认为你是正确的r1r2对于同一组参数(或具有相同第一个参数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
}

如果您的模型中的条件语句在您预期为假时是真空的,那么您不是第一个使用一线逻辑的用户。你不会是最后一个。