如何断言一个给定的状态导致另一个状态变量在TLA +?

时间:2017-10-11 15:23:05

标签: tla+

对不起,标题有点神秘。我有一个定义两组的TLA +规范:

variables Requests = {}, Outcomes = {};

我有一组工作人员添加请求,另一组工作人员正在履行这些请求并写入Outcomes。每个请求都有一个唯一的Id,匹配的Outcome条目也将包含。{/ p>

我想保证添加到Requests集的任何请求最终都会与Id集中具有相同Outcomes的结构匹配。我一直尝试使用"导致",~>,运营商,但无法弄清楚如何解决Id匹配部分。

我天真地试过像:

RequestsAreFulfilled == \E req \in Requests: TRUE 
                        ~> \E outcome \in Outcomes : outcome.id = req.id

但是这显然会因为req未在第二个表达式中定义而中断。我已经考虑了第二个快递的内容"然后有一个状态,其中所有请求项目都与结果项目#34;相匹配,但由于系统永远不会终止,因此不起作用 - Requests集合中可能总是会有更多请求,因为Outcomes总是在追赶。

我可以断言请求最终是否与具有相同ID的结果相匹配?

1 个答案:

答案 0 :(得分:1)

TLC在使用非恒定集证明活跃属性方面存在一些问题。让我们从固定的情况开始,在这种情况下,你有一组有限的,固定的id。然后我们可以将关系指定为

\A id \in Ids: (\E r \in req: r.id = id) ~> (\E o \in out: o.id = id)

在这种情况下,我们最好使用结构,因为它们更容易理解并更好地表达共享关系。

requested = [i \in Ids |-> FALSE];
processed = [i \in Ids |-> FALSE];

\A id \in Ids: requested[i] ~> processed[i]

messages = [i \in Ids |-> [requested |-> FALSE, processed |-> FALSE]]
\A id \in Ids: 
   LET m == messages[i]
   IN  m.requested ~> m.processed

如果你想要无限数量的消息,让TLC处理活体检查的一种方法是使用一组固定的id然后将逻辑添加到&#34; recycle&#34;已完成的消息 - 将requestedprocessed都设置为FALSE。然后我们可以使用always-finally运算符[]<>来表达:

\A id \in Ids: []<>(requested[i] => processed[i])