《A Tour of TLA+》
什么是 TLA+
数学
公里语义的形式化语言
系统规格定义语言
简单、实用、高表达力的设计语言
可调试、可自动穷尽式验证
一线工程师容易掌握
设计哲学
simple example
这段代码什么意思?
如何知道的?
机器模型: C 语言 -》 汇编语言 -》 机器指令
C 语言合适么?
为何不需要在机器层面上去理解这个程序的语义?
C 语言模型简单么?
C 语言合不合适对于计算进行形式化的描述呢?
刚开始学 C 语言的时候理解变量和数学领域里是不一样的
需要程序跑起来
从数学角度不是字包含解释的,需要机器模型
所以需要一个更简单的模型描述这个计算。
正确么?
调用一次 foo 后,y = 3,正确吗?
我们在脑子里计算了一下,其实脑子里有一幅图的:
所以 y=2
程序控制流
控制流状态显示化
状态空间
如何选出我们期望的状态序列?
如何找出 S1
如何通过 Si 找出 Si+1
其实也就是找出过滤条件。
精确的表达
初始状态的表达
是针对单一状态的变量的布尔表达式
状态迁移的规则
是针对两个状态的变量间关系的布尔表达式
数学语言的表达
TLA+的表达
结果
总结
状态机是通用的计算模型,任何其他计算形式都可以表述为状态机
我们没有实际去构造状态序列,而是描述了状态序列要满足的属性!!
状态变量的构成
每一步的大小
练习
-------------------------------- MODULE lec1 --------------------------------
EXTENDS Integers
VARIABLES x,y,pc
Init == y = 1 /\ x = 0 /\ pc = "L1"
Next1 == pc = "L1" /\ x' = y /\ y' = y /\ pc' = "L2"
Next2 == pc = "L2" /\ x' = x+1 /\ y' = y /\ pc' = "L3"
Next3 == pc = "L3" /\ x' = x /\ y' = y /\ pc' = "Done"
Next == Next1 \/ Next2 \/ Next3
=============================================================================
这是个模型的描述,我们现在要运行一下这个模型。
就是把这个模型满足的行为全部产生出来
TLC
deadlock
和常规理解的死锁不一样。是指当前的状态下,已经再也找不到。
即没有 NEXT 可以满足了。
invariant 不变性
所有状态都要满足的属性
例如:
y /= 2
ERROR Trace
整个状态跃迁过程
练习
Init == y \in 1..5 /\ x = 0 /\ pc = "L1"
invariant:y /= 6
-------------------------------- MODULE lec1 --------------------------------
EXTENDS Integers
VARIABLES x,y,pc
Init == y \in 1..5 /\ x = 0 /\ pc = "L1"
Next1 == pc = "L1" /\ x' = y /\ y' = y /\ pc' = "L2"
Next2 == pc = "L2" /\ x' = x+1 /\ y' = y /\ pc' = "L3"
Next3 == pc = "L3" /\ x' = x /\ y' = x /\ pc' = "Done"
Next == Next1 \/ Next2 \/ Next3
===============================================================
TLA+ 用到的数学
一阶逻辑和集合论(+的部分)
变量数据结构定义
状态机定义
定义不变性
时态逻辑
整体上定义行为和属性
一阶命题逻辑
集合操作
谓词逻辑
集合构造器
Simple Operaors
High Order Operators
Sets Filtering
Sets Mapping
Tuples
Sequences
Structures / Records
练习
Functions
Function Set
练习:汉诺塔
清晰的思考和表达
状态有哪些?如何表达?
如何定义行为?
如何定义不变性?
小总结
用代码来写,层次太低了
用自然语言来写,不精确,写出来其实并不一定想清楚
TLA+会迫使你思考,输出对系统理解精确的表达
评论