我正在努力如何定义状态更改,其中每个步骤可以发布一个事件但多个已删除。我有这个模型:
open util/ordering[State]
sig Event {}
sig State {
queue : set Event
}
pred State.post( next' : State, event : Event ) {
next'.queue = this.queue + event
}
pred State.deliver( next' : State ) {
next'.queue = this.queue - this.queue // STRUGGLE!
}
fact traces {
no first.queue
all s : State - last, next : s.next {
some e : Event | s.post[next,e] or s.deliver[next]
}
}
但是,我想在传递步骤中对其进行建模,通过删除它来提供一些事件。在代码中我提供了所有代码,但我如何对其进行编码,它实际上会尝试this.queue
的任何子集?
答案 0 :(得分:1)
似乎斗争来自于你试图将这个谓词写成一个赋值的事实。
当对问题采用更具说明性的观点时,解决方案变得清晰。只需要强制新队列成为前一个队列的正确子集:
pred State.deliver( next' : State ) {
next'.queue in this.queue and next'.queue != this.queue
}