TLA
参考资料:
概念
想象一下,我们正在为一家银行构建电汇服务。用户可以向其他用户进行转移。作为一项要求,我们不允许任何会透支用户帐户或使其低于零美元的电汇:如果您尝试转移超过您拥有的金额,警卫会阻止您。
def transfer(from, to, amount)
if (from.balance >= amount) # guard
from.balance -= amount; # withdraw
to.balance += amount; # deposit
现在考虑两个变化:
- 用户可以一次启动多个传输;
- 转移步骤是非原子的。一个转移可以开始并(可能)完成,而另一个转移正在进行。
---- MODULE wire ----
(* 导入模块 *)
EXTENDS TLC, Integers
(* People 和 Money 是集合:唯一、无序 *)
People == {"alice", "bob"}
Money == 1..10
NumTransfers == 2
(* --algorithm wire
(* [People -> Money] 也是一个集合
变量 acct 不是一个固定值,它是 100 个不同值之一
*)
variables
acct \in [Perople -> Money];
(* NoOverdrafts 是一个量词:
如果每个帐户都是 >= 0,则为 true,否则为 false
*)
define
NoOverdrafts ==
\A p \in People:
acct[p] >= 0
end define;
(* 使用 NumTransfers == 2:
两个 wire 进程同时运行
*)
process wire \in 1..NumTransfers
variable
amnt \in 1..5;
from \in People;
to \in People
begin
Check:
if acct[from] >= amnt then
Withdraw:
acct[from] := acct[from] -amnt;
Deposit:
acct[to] := acct[to] + amnt;
end if;
end process;
end algorithm; *)
====