以下模型表示给定某个预定义顺序的一系列操作。
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
通过运行,我希望有一个序列,其中最后一个排队操作正常,但某些操作之前失败了。但是我没有得到任何实例。 有人可以解释一下我做错了什么吗?
问候,安德烈。
答案 0 :(得分:0)
问题来自这样一个事实:一旦某个动作在给定时间内具有Nok
状态,那么它将在未来的某个时间内无法更改回另一个状态(如Queue
和Reply
谓词中的两个量词。
因此,分析器无法找到一个实例,在最后一个时间内,所有操作都处于Ok
状态,并且在给定时间,某个操作处于Nok
状态。 (这是您在运行命令中请求的内容)
希望有所帮助