Alloy中的所有子集都在Alloy中

时间:2017-07-19 09:01:54

标签: alloy

我正在努力如何定义状态更改,其中每个步骤可以发布一个事件但多个已删除。我有这个模型:

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的任何子集?

1 个答案:

答案 0 :(得分:1)

似乎斗争来自于你试图将这个谓词写成一个赋值的事实。

当对问题采用更具说明性的观点时,解决方案变得清晰。只需要强制新队列成为前一个队列的正确子集:

pred State.deliver( next' : State ) {   
     next'.queue in this.queue and next'.queue != this.queue 
}