获取变量的 prime/next 状态
Getting the prime/next state of a variable
给定一些条件,我想检查下一个状态的变量是否适用于某个命题。我没能创造出罗丹接受的东西。
我的确切情况是以下不变量。我想确保变量 door
在锁定时永远不会改变。变量 door
是 Open
或 Closed
inv4: PrimaryLock = On ⇒ door :∣ door' = door
如果PrimaryLock
是On
,这意味着无论接下来触发什么事件,门的状态都不会改变。
这可以使用 Event-b 还是我需要通过添加额外的变量来解决我的问题?
目前,您可以指定有关状态更改的属性的唯一位置是事件本身。因此,您必须向每个修改变量 door
.
的事件添加守卫 PrimaryLock /= On
如果您使用精化(您应该!:),那么这实际上并没有那么糟糕,因为您指定了可能改变门的抽象事件,并且精化中的所有事件都必须遵循它们的规范。
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
只能在未锁定的情况下在细化中修改。
您可以使用
将其指定得更抽象
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
其中,door
和door[=12=]
分别代表事件前后的数值。
您可以在规范的最抽象级别上拥有这样的事件。然后,您对系统中可能会改变门状态的所有事件进行细化,并使此类事件细化 door_change
.
此 "trick" 允许指定有关系统中变量更改的属性。不过不知道罗丹有没有这个功能
给定一些条件,我想检查下一个状态的变量是否适用于某个命题。我没能创造出罗丹接受的东西。
我的确切情况是以下不变量。我想确保变量 door
在锁定时永远不会改变。变量 door
是 Open
或 Closed
inv4: PrimaryLock = On ⇒ door :∣ door' = door
如果PrimaryLock
是On
,这意味着无论接下来触发什么事件,门的状态都不会改变。
这可以使用 Event-b 还是我需要通过添加额外的变量来解决我的问题?
目前,您可以指定有关状态更改的属性的唯一位置是事件本身。因此,您必须向每个修改变量 door
.
PrimaryLock /= On
如果您使用精化(您应该!:),那么这实际上并没有那么糟糕,因为您指定了可能改变门的抽象事件,并且精化中的所有事件都必须遵循它们的规范。
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
只能在未锁定的情况下在细化中修改。
您可以使用
将其指定得更抽象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
其中,door
和door[=12=]
分别代表事件前后的数值。
您可以在规范的最抽象级别上拥有这样的事件。然后,您对系统中可能会改变门状态的所有事件进行细化,并使此类事件细化 door_change
.
此 "trick" 允许指定有关系统中变量更改的属性。不过不知道罗丹有没有这个功能