
TLA+
文章平均质量分 55
刘小京
the best way to learn is by making mistakes!
展开
-
通过例子学TLA+(十五)--时序属性
时序属性Termination最简单的时序属性是Termination,Termination是算法终止的要求,如果算法崩溃或者死锁或者进入一个无限循环,那么久违反了Termination规范。假设有一辆车在过交通灯时,有红灯和绿灯两种选择,绿灯行,红灯停,红绿灯交替亮起。NextColor(c) == CASE c = "red" -> "green" [] c = "green" -> "red" (*--al原创 2022-02-16 18:08:12 · 1090 阅读 · 0 评论 -
通过例子学TLA+(十四)--宏,过程与标签
宏,过程与标签TLA+在多进程之间复用代码,最简单的方法是使用宏和过程。宏宏是通用的代码内联器,格式为nacro Name(var1,...) begin \* stuffend macro;需要注意的是:宏代码是内联的,不能像进程那样独立运行,其实现不能有标签,不能有多重赋值,不能有while循环等。宏定义必须要在算法的define块之后,在process块之前,其调用方式为Name(arg1,…)。过程过程的编写和使用有两个好处:1、过程可以有局部变量,2、可以添加标签,格式如原创 2022-02-16 09:56:47 · 494 阅读 · 0 评论 -
通过例子学TLA+(十三)--多进程与await
多进程之前使用的例子都是单进程的,现在用多进程来描述多个逻辑同时发生,TLA+中的多进程可以理解为其他高级语言中的多线程。为了方便理解,使用Pluscal语言来描述,TLA+ Toolbox可以将pluscal语言转化为TLA+,基本格式如下:---- MODULE module_name ----\* TLA+ code(* --algorithm algorithm_name \* 固定格式,algorithm_name根据需要填写variables global_variables原创 2022-02-15 11:42:19 · 624 阅读 · 2 评论 -
通过例子学TLA+(十二)-- 函数与实例
函数和实例函数TLA+中除了 数字,字符串,布尔值,模型值 4种基本类型外,还有两种复杂类型,分别为集合和函数。函数构成了所有实用复杂类型的基础。函数的形式看起来跟之前介绍过的操作符是一样的。函数定义的两种方式:Function == [s \in S |-> foo] \* 这里foo可以是任何方程式。注意这里用的是|->,不是:Function[s \in S] == foo 在函数定义中可以使用无限集合,如Doubles == [n \in Nat |-> 2*n原创 2022-02-13 18:50:00 · 565 阅读 · 4 评论 -
通过例子学TLA+(十一)--命题逻辑与实例
命题逻辑与实例逻辑符在之前的例子中已经用过了,主要是 \A ,\E, => 等符号。\EE是"exists"的首字母,意思是存在。当写下 \E x \in S : P(x) 意味着在S中至少存在一个x使得P为真。采用\E 开头的表达式返回值是布尔类型。\E x \in {1,2} : x > 0 为 true\E x \in {} : x > 0 为 false\E 是存在一个满足条件的元素的意思,~\E 则是不存在满足条件的元素\AA的"All"的首字母,当原创 2022-02-13 08:39:16 · 765 阅读 · 0 评论 -
通过例子学TLA+(十)--集合
集合集合用大括号来表示,如{1,2},对于连续的数字集合有种特殊的表示方式,如 1…3 表示集合{1,2,3}下表是集合的常见操作Operatorexample备注\in1 \in {1,2} 为true 1\in {{1},2}为false在集合为true,不在为false\notin1 \notin {} 为true {1} \notin {{1}}为false与\in相反\subseteq{1,2} \subseteq {1,2,3}是子集为tru原创 2022-02-11 10:30:49 · 611 阅读 · 0 评论 -
通过例子学TLA+(九)--元组和结构体
元组元组和其他语言中的数组类似,用<<>>表示,不同之处在于TLA+中元组下标是从1开始。x == <<4, 5, 6>>;x[1] + x[2] + x[3] = 15;DOMAIN 操作符可以作用于元组 例如x == <<"hello", "world", "!">>DOMAIN x = {1,2,3} \* DOMAIN x 等价于 1..Len(x)跟元组有关的Module Sequences 已经在之前介绍过原创 2022-02-10 18:17:40 · 653 阅读 · 0 评论 -
通过例子学TLA+(八)--表达式
表达式在之前的例子中,已经多次用到了表达式,常见的表达式中会用到 大于,小于,等于,不等于等这样条件判断。还有一些其他的用法,比如逻辑连接,IF-ELSE 等逻辑连接逻辑连接在之前的例子中是用过的,主要是 /\ (and) ,/ (or),用来将表达式连接起来,有个点需要注意的是,逻辑连接符是空格敏感的,如果以缩进方式开始连接,则TLA+将其视为前一表达式的子表达式。例如/\ TRUE \/ TRUE/\ FALSE \* 相当于 (TRUE \/ TRUE) /\ FALSE/原创 2022-02-10 16:21:42 · 703 阅读 · 2 评论 -
通过例子学TLA+(七)--操作符
OperatorTLA+中的操作符类似于其他编程语言中的函数或者宏定义,使用 == 来定义,例如Five == 5 \* 无参数时不用加括号Sum(x,y) == x + y SumwithFive(x,y) == Sum(x,y) + Five \* 定义之后就可以随意使用高阶用法根据使用需求,可以在定义中使用其他操作符 来达到类似于其他语言中函数指针的功能。Sum(a,b) == a + bDo(op(_,_),a,b) == op(a,b) \* 注意实际调用的原创 2022-02-10 15:40:25 · 607 阅读 · 0 评论 -
通过例子学TLA+(六)--标准模块
标准模块使用标准模块有两个原因。首先,当规范使用我们已经熟悉的基本操作符时,它们更容易阅读。其次,工具如TLC可以内置这些标准操作符。目前的内置模块主要有:数字相关的模块Naturals,Integers,Reals,以及Sequences,FiniteSets,Bags数字模块常用的整数和运算符集定义在Naturals、Integers和Reals三个模块中。Naturals Module 定义了以下操作符加+ 减- 乘* 除/ 取余% 小于< 大于> 小于等于<原创 2022-01-27 17:34:22 · 755 阅读 · 0 评论 -
通过例子学TLA+(五)--FIFO & Sequences
FIFO本例子是一个先进先出FIFO的Buffer。Sender向Buff发送数据,Buffer接收数据存储在Sequence中,然后,Buffer将Sequence中第一个数据取出发送给Receiver。可以理解为上一例子的复杂应用。TLA+提供了 Sequences module可以直接使用,该module提供了 Append,Tail,Head,Len 等常见接口。\* module使用之前要先ExtendEXTENDS Sequences\* 初始化一个seqVARIABLE qq原创 2022-01-20 17:36:14 · 866 阅读 · 0 评论 -
通过例子学TLA+(四)-- Send & Rev & Print
Send & Rev稍微复杂点的程序中都会涉及数据的发送与接收,本例子基于发送器Sender与接收器Receiver来实现数据的变更。假设Sender发送一个数据给Receiver,Receiver接收后将确认信息发送给Sender,增加两个状态rdy,ack来表示发送者状态和确认状态,当rdy等于ack时允许sender发送数据,当rdy与ack不一致时则意味着Receiver有数据需要接收,用val来缓存sender发送的数据,Receiver用data来存储缓存的val数据。创建Modul原创 2022-01-18 12:04:03 · 696 阅读 · 0 评论 -
通过例子学TLA+(三) -- DieHarder
第三个例子DieHarder本例子主要介绍TLA+是如何进行输入的。在上一个例子中,严格限制了big桶为5升,small桶为3升,目标是4升。如果需要将big桶与small桶的大小根据输入不同,则只需要利用CONSTANT来定义big,small桶的大小即可。------------------------------ MODULE DieHarder ------------------------------- EXTENDS NaturalsCONSTANT BIG,SMALL,GOAL原创 2022-01-14 16:29:34 · 839 阅读 · 0 评论 -
通过例子学TLA+(二) -- DieHard
第二个例子DieHard这是一个倒水的例子,初始一个3升容量的桶,一个5升容量的桶,水不限,如何倒出一个容量刚好是4升的水。在一部老电影DieHard中主角就面临这个问题,这里就将module名命名为DieHard。如果要倒出一个4升容量的水,那这4升水最后一定在5升的桶里。具体实现方式不止一种,这里举一个例子说明倒水的过程:假设5升桶为big,3升桶为small1、装满small桶,将small水倒入big桶中:此时small为0,big为32、装满small桶,将small水倒入big桶中:此时原创 2022-01-14 10:10:09 · 677 阅读 · 0 评论 -
通过例子学TLA+(一)-- HourClock
前言刚接触TLA+,将学习过程中的理解整理记录下来,用于加深理解和备忘。有对TLA+感兴趣的可以私信我,一起学习。TLA+简介TLA+ 是一门形式规格说明语言(formal specification language),主要用来验证系统的设计和算法的正确性。它可以用来对几乎任何形式的离散系统进行精确的、正式的描述,特别适合于描述异步系统。TLA+提供了一个工具用来编写TLA+,同时提供了语法检查,参数设置,程序运行等功能,该工具就是TLA+ Toolbox,下载路径为:https://github原创 2022-01-13 10:33:34 · 1331 阅读 · 0 评论