鉴于某些条件,我想检查下一个状态的变量是否适用于某个命题。我无法创造出rodin已经接受的东西。
我的确切情况是以下不变量。我想确保变量door
在锁定时不会改变。变量door
可以是Open
或Closed
inv4: PrimaryLock = On ⇒ door :∣ door' = door
如果PrimaryLock
为On
,则表示无论接下来触发什么事件,门状态都不会改变。
这可能是使用Event-b还是我需要通过添加其他变量来解决我的问题?
答案 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
的优化中的新事件不允许更改门状态。因此,如果skip
和open_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
在那里,door
和door$0
代表事件前后的值。
您可以在规范的最抽象级别上拥有此类事件。然后,您将引入一个细化,其中包含系统的所有事件,这些事件可能会更改门的状态并使这些事件得到细化door_change
。
这个“技巧”允许人们指定有关系统中变量变化的属性。不过,我不知道罗丹是否有这个功能。