合金中事件的建模顺序

时间:2017-03-22 11:46:01

标签: alloy

以下模型表示给定某个预定义顺序的一系列操作。

open util/ordering[Time]

abstract sig Action {pre: set Action}

one sig A, B, C, D extends Action {}

fact{
    pre = A -> B + D -> B + D -> C
}

sig Time { queue: Action -> lone State}

abstract sig State {}
one sig Acted, Ok, Nok extends State{}

pred Queue [t, t': Time] {
   some a: Action-(t.queue).State |
       a.pre in (t.queue).Ok + (t.queue).Nok and t'.queue=t.queue+(a->Acted)
}

pred Reply [t, t': Time] {
   some a: (t.queue).Acted | 
          some s: State-Acted | t'.queue=t.queue++(a->s)
}

fact {
  no first.queue 
  last.queue=Action->Ok or last.queue = Action -> Nok
  all t:Time-last | Queue[t,t.next] or Reply[t,t.next]
}


run {last.queue=Action->Ok and some t:Time-last | t.queue = Action->Nok} for 9 

通过运行,我希望有一个序列,其中最后一个排队操作正常,但某些操作之前失败了。但是我没有得到任何实例。 有人可以解释一下我做错了什么吗?

问候,安德烈。

1 个答案:

答案 0 :(得分:0)

问题来自这样一个事实:一旦某个动作在给定时间内具有Nok状态,那么它将在未来的某个时间内无法更改回另一个状态(如QueueReply谓词中的两个量词。

因此,分析器无法找到一个实例,在最后一个时间内,所有操作都处于Ok状态,并且在给定时间,某个操作处于Nok状态。 (这是您在运行命令中请求的内容)

希望有所帮助