TLA+ Specifying System (1)

简介: TLA+ Specifying System (1)

概述

  • 并发系统的正确性是很难证明的,因为异步点太多,人类的大脑不是为并发而进化的,并发系统的行为变化可能性太多
  • 如果能够把系统的状态/行为抽象为时态逻辑(Temporal Logic),结借助CPU超强的算力,穷举出所有可能的behavior(状态序列)就可以判断系统是否正确
  • 基本的TLA+语法和使用可见状态序列是指数级别,需要深入立即系统和TLA+对状态进行剪枝
  • 什么是Temporal Logic:系统随着时间的推移,可能出现的状态序列
  • TLA+是基于数理逻辑的语言,如果你对数理逻辑很有研究,那么会如鱼得水

What is a specification?

  • spec描述应该实现什么,而不是描述如何实现
  • 用来验证设计,而不是教你如何设计
  • 在动手coding之前,进行specify能帮助你更好的理解你的系统
  • 只验证设计是否正确而不验证性能
  • specification的基础是数学,因为只有数学语言是精确的
  • 这里用到的数学是更加形式化的数学,而不是我们在学校时学到的经典数学(大部分也不是精确的)。形式化的数学看起来很冗长,但是能用最少的数学概念描述一个系统。

Why TLA+

  • 1977年,艾米尔.伯努利用时序逻辑temporal logic来specify一个系统,但是只能描述部分系统
  • 1980年代,Lamport发明了TLA(temporal logical action),选择了数学家们(而不是程序员)所喜爱的一阶逻辑理论和集合理论
  • TLA提供了specify系统的数学基础,数学描述现实的系统,TLA来形式化数学:TLA就是来解决如何用程序描述数学的问题,而TLA+就是这门语言,仅仅借鉴了编程语言的模块化的思想,除此之外都是数学概念
  • TLA+可以方便描述任何离散的系统(因为它建立于集合论),尤其是异步系统
  • TLA+使用简洁的数学语言来描述状态转换
  • TLA+不是用来描述程序执行的指令序列

一个例子

  • C语言代码
int i;
void main() {
    i = someNumber();
    i = I + 1;
}
  • 和这段代码等价的spec是下面这段tla(emacs上可以安装一个插件,以prity-print方式显示希腊字符)

![]({{ site.url }}images/2018-07-12-specify-system-1.jpg)

  • 几点说明:
  • TLA+支持以模块方式组织代码
  • 以——————————— MODULE SimpleProgram ----------------------开始
  • 以====================================================结尾
  • 任何TLA+ spce都要有Init和Next,Init和Next被称为formula
  • TLA+会默认用Init进行初始化状态,默认用Next迭代可能到达的状态
  • Init == (pc = "start") /\ (i = 0), ‘==’ 定义一个 formula
  • 逻辑与运算符‘/\’:a /\ b 表示先发生a,再发生b
  • 逻辑或运算符‘/’:a / b 表示要么发生a,要么发生b
  • Next formula描述的是一个状态机,‘/’运算连接起来的是两个状态入口“start”和“middle”
  • pc’ 和 i’ 是下一个状态中pc和I的值,记做(pc primae, i prime)
  • TLA+ 使用宽度遍历,暴力遍历所有可达的状态

总结

  • 任何系统都能够使用状态机描述
  • specify状态机所有可达的状态
  • TLA+使用CPU超强的算力穷举所有可能的状态序列
相关文章
|
5月前
|
项目管理
BayCare Health System在提升数据素养方面的成功经验
BayCare Health System在提升数据素养方面的成功经验
|
安全 Java
灵魂拷问:你真的理解System.out.println()打印原理吗?
灵魂拷问:你真的理解System.out.println()打印原理吗?
123 0
|
存储 编译器 Linux
ARTS 挑战打卡的第9天 --- 如何知道一个数是否为2的若干次幂(Algorithm)
ARTS 挑战打卡的第9天 --- 如何知道一个数是否为2的若干次幂(Algorithm)
116 0
|
算法 Java 调度
Java常用类库(System、Arrays、定时调度、Base64加密解密)
1.System类,2.Arrays数组操作类,3.定时调度,4.Base64加密与解密
75 0
|
监控 安全 Java
JDK源码(18)-System
JDK源码(18)-System
135 0
JDK源码(18)-System
【system verilog for design】verilog 1995/2001/system verilog标准语法的一些演进
【system verilog for design】verilog 1995/2001/system verilog标准语法的一些演进
158 0
|
测试技术
【排查解决】System.Runtime.InteropServices.ExternalException (0x80004005): GDI+ 中发生一般性错误
【排查解决】System.Runtime.InteropServices.ExternalException (0x80004005): GDI+ 中发生一般性错误
506 0
【排查解决】System.Runtime.InteropServices.ExternalException (0x80004005): GDI+ 中发生一般性错误
CF1341C. Nastya and Strange Generator(思维 模拟 构造)
CF1341C. Nastya and Strange Generator(思维 模拟 构造)
84 0
|
人工智能 BI
CF761D Dasha and Very Difficult Problem(构造 思维)
CF761D Dasha and Very Difficult Problem(构造 思维)
79 0
|
缓存 Java Linux
System.currentTimeMillis() 和 System.nanoTime() 哪个更快?别用错了!
System.currentTimeMillis() 和 System.nanoTime() 哪个更快?别用错了!
209 0