2

目前正在学习 TLA+,并且一直坚持使用这种简单的方法来从注册表中删除一个人。从我所见,问题似乎与许可状态有关。

我的 TLA+ 函数看起来像这样,它会从注册表中删除一个人以及权限。

DeRegister(p) == 
/\ p \in register
/\ register' = register \ {p}
/\ permission' = [x \in DOMAIN permission \ {p} |-> permission[x]]
/\ UNCHANGED <<location>>

我正在检查的 typeok 具有以下限制

TypeOk 
    /\ register \subseteq PERSON
    /\ permission \in [register -> SUBSET BUILDING]
    /\ location \in [register -> (BUILDING \union {OUTSIDE})]

我收到违反 typeOK 的模型错误。在堆栈跟踪中,错误看起来像这样

/\  location = [p1 |-> OUTSIDE]
/\  permission = << >>
/\  register = {}

感谢您的任何见解

编辑:

以前的状态可能有一些用处

/\  location = [p2 |-> OUTSIDE]
/\  permission = [p2 |-> {}]
/\  register = {"p2"}
4

1 回答 1

2

location \in [register -> SUBSET BUILDING]意味着(除其他外)那个DOMAIN location = register。但是,在 之后DeRegister,您有DOMAIN location = {"pq"} /\ register = {},这违反了您的不变量。

于 2018-10-22T15:20:49.360 回答