在TLA +中,通常使用诸如编程语言数组之类的功能。
我的规范更新了一个功能范围值,用TLA表示为:
f' = [f EXCEPT ![x]=e]
在证明安全特性的情况下,我想推断旧函数f
与新函数f'
之间的基数关系。
要给出具体的方案,请考虑以下内容:
S == {1,2,3}
f == [x \in S |-> FALSE]
g == [f EXCEPT ![2]=TRUE]
THEOREM t1 ==
Cardinality({x \in S : g[x]}) = Cardinality({x \in S : f[x]}) + 1
PROOF BY DEF S, f, g, Cardinality
问题是g
与f
的功能完全相同,只是x=2
除外。
现在Cardinality({x \in S : g[x]})
应该大一个单位。但这无法证明。
我可以添加一些前提,以使后端证明更容易:
THEOREM t1 ==
/\ f[2]=FALSE /\ g[2]=TRUE
/\ \A k \in S\{2} : f[k]=g[k] /\ g[k]=FALSE
=> Cardinality({x \in S : g[x]}) = Cardinality({x \in S : f[x]}) + 1
PROOF BY DEF S, f, g, Cardinality
但仍然无法证明。证明者要注意基数的变化需要什么明确表示?
总的来说,在这种情况下,当我们使用要更新的函数并且想要断言更新前后的关系时,如何进行处理的一般规则或技巧是什么?