获取变量的 prime/next 状态

Getting the prime/next state of a variable

给定一些条件,我想检查下一个状态的变量是否适用于某个命题。我没能创造出罗丹接受的东西。

我的确切情况是以下不变量。我想确保变量 door 在锁定时永远不会改变。变量 doorOpenClosed

inv4: PrimaryLock = On ⇒ door :∣ door' = door

如果PrimaryLockOn,这意味着无论接下来触发什么事件,门的状态都不会改变。

这可以使用 Event-b 还是我需要通过添加额外的变量来解决我的问题?

目前,您可以指定有关状态更改的属性的唯一位置是事件本身。因此,您必须向每个修改变量 door.

的事件添加守卫 PrimaryLock /= On

如果您使用精化(您应该!:),那么这实际上并没有那么糟糕,因为您指定了可能改变门的抽象事件,并且精化中的所有事件都必须遵循它们的规范。

open_door  = WHEN PrimaryLock /= On THEN door := Open   END
close_door = WHEN PrimaryLock /= On THEN door := Closed END

改进中未改进 open_doorclose_door 隐式改进 skip 的新事件不允许更改门状态。因此,如果 open_doorclose_door 是抽象规范中唯一更改变量 door 的事件,则 door 只能在未锁定的情况下在细化中修改。

您可以使用

将其指定得更抽象
change_door_status = WHEN PrimaryLock /= On THEN door :: {Open,Closed} END

并将打开或关闭它的事件指定为优化。

我承认,为所有事件表达此类属性将是一个不错的功能。

您也可以使用 Atelier B 来制定 Event-B 规范。罗丹有一些变化,但原则保持不变。 对于您的问题,对于 Atelier B,您可以指定一个事件,如下所示:

door_change = BEGIN
  door :( door : { Open, Closed } & 
    (PrimaryLock = On => doors = doors[=10=]
  )
END

其中,doordoor[=12=]分别代表事件前后的数值。

您可以在规范的最抽象级别上拥有这样的事件。然后,您对系统中可能会改变门状态的所有事件进行细化,并使此类事件细化 door_change.

此 "trick" 允许指定有关系统中变量更改的属性。不过不知道罗丹有没有这个功能