获取变量的主要/下一个状态

时间:2015-12-11 11:20:57

标签: event-b

鉴于某些条件,我想检查下一个状态的变量是否适用于某个命题。我无法创造出rodin已经接受的东西。

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

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

如果PrimaryLockOn,则表示无论接下来触发什么事件,门状态都不会改变。

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

2 个答案:

答案 0 :(得分:1)

目前,唯一可以指定状态更改属性的地方是事件本身。因此,您必须将保护false添加到修改变量PrimaryLock /= On的每个事件。

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

door

不会优化open_door = WHEN PrimaryLock /= On THEN door := Open END close_door = WHEN PrimaryLock /= On THEN door := Closed END open_door隐式优化close_door的优化中的新事件不允许更改门状态。因此,如果skipopen_door是抽象规范中唯一更改变量close_door的事件,则door只能在优化中修改(如果未锁定)。

您可以使用

更明确地指定它
door

并指定打开或关闭它的事件作为改进。

我承认为所有事件表达这些属性是一个很好的功能。

答案 1 :(得分:0)

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

door_change = BEGIN
  door :( door : { Open, Closed } & 
    (PrimaryLock = On => doors = doors$0
  )
END

在那里,doordoor$0代表事件前后的值。

您可以在规范的最抽象级别上拥有此类事件。然后,您将引入一个细化,其中包含系统的所有事件,这些事件可能会更改门的状态并使这些事件得到细化door_change

这个“技巧”允许人们指定有关系统中变量变化的属性。不过,我不知道罗丹是否有这个功能。