对不起,标题有点神秘。我有一个定义两组的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的结果相匹配?
答案 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然后将逻辑添加到" recycle"已完成的消息 - 将requested
和processed
都设置为FALSE。然后我们可以使用always-finally运算符[]<>
来表达:
\A id \in Ids: []<>(requested[i] => processed[i])