时序属性

Termination

最简单的时序属性是TerminationTermination是算法终止的要求,如果算法崩溃或者死锁或者进入一个无限循环,那么久违反了Termination规范。

假设有一辆车在过交通灯时,有红灯和绿灯两种选择,绿灯行,红灯停,红绿灯交替亮起。

NextColor(c) == CASE c = "red" -> "green"[] c = "green" -> "red"(*--algorithm traffic
variablesat_light = TRUE,light = "red";process light = "light"
beginCycle:while at_light dolight := NextColor(light);end while;
end process;process car = "car"
beginDrive:when light = "green";at_light := FALSE;
end process;
end algorithm;*)

上述代码在TLC中运行时,如果在Model Overview > What to Check? > Properties, 不选中Termination,则不会报错,选中Termination,运行时会报错Temporal properties were violated.查看Error-trace,发现有个Stuffering。

Stuffering && liveness

TLA+是动作的时序逻辑,Model的每一步检查都代表着时间上的一个动作,TLC的工作原理是查看每一步中所有启用的标签,并选择一个执行,然而TLC还有另外一种选择,即不执行任何动作,这种情况称之为stuffering。大多数情况下,stuffering不会改变规范,既然没有动作发生,那就什么都不会改变。但是如果一直stuffering,就好像是动作执行被阻塞的一样,状态不会改变。

所有的不变量的检查都是安全的,用来检查不会到达一个无效状态。由于有效状态下的stuffering还是一种有效状态,因此TLC通常不会尝试stuffering。然而在大多数时序属性用来进行活性检查,活性检查(liveness check)是验证系统最终能够按照期望运行。上述例子中,由于stuffering,规范运行将不会终止。

stuffering是有用的,它可以表示服务器崩溃或者进程超时,或者信号量永远等不到。如果要明确的排除stuffering,就需要增加fairness。

Fairness

fairness有两种:弱(weak),强(strong )。只要声明了fair的动作保持启用,就能达到弱公平性(weakly fair)。为上述例子添加fairness:

fair process light = "light"  \* 通过fair关键字添加fairness
beginCycle:while at_light dolight := NextColor(light);end while;
end process;fair process car = "car"
beginDrive:when light = "green";at_light := FALSE;
end process;

如果上述例子中只给进程car添加fair,运行Model check,仍然stuffering,light不会循环变更;如果只给进程light添加fair,运行Model check,发现car永远不会Drive。如果两个进程都添加fair,运行后还是会出错。出现问题的原因是如果light在green和red之间循环,那car进程的Drive也将不断在禁用和启用之间变更。因此为了保证Car能够完成Drive,需要light保持green。

这时候强公平性就起作用了,如果一个强公平性的动作反复启动和禁用,那该动作一定会发生。可以通过fair+ 来将进程变成强公平性。如:

fair+ process car = "car"
beginDrive:when light = "green";at_light := FALSE;
end process;

重新执行model check,这次将按照预期进行,不会出现错误。需要注意的是,在Car为fair+的情况下,仍然需要light为fair。

上述fairness的强弱都是针对进程的,fairness的强弱也可以针对算法或者标签。

 --fair algorithm    \* 针对算法A:+                 \* 针对标签A,如果A本来是unfair,添加+后,A将变为weakly fair\* 如果A本来是wf,则添加+后,A将变为string fair

时序操作符

首先定义P和Q为布尔语句

[]

[]等价于always。[]P意味着对于动作中的所有状态,P都是TRUE。

<>

<>等价于eventually,<>P意味着对于动作中的所有状态,至少存在一个状态是的P为TRUE或者最终态P为TRUE。

Termination == <>(\A self \in ProcSet: pc[self] = "Done")
\* 可以理解为最终所有的process状态都是Done

~>

~>等价于 leads-to。 P ~>Q 意思是如果在某个状态P为true,那么Q也为true或者Q在未来的某个状态为true。leads-to是不可逆的,一旦发生,即使P之后是false,那Q也必须出现为true的情况。

L == (light = "green") ~> ~at_light
\* 当light为green时,一定会导致at_light变更。前后具有因果关系。

[]<> and <>[]

[]<>P意思是P总是最后为true; <>[]P意思是P最后总是为true。对于有限的规范来说,这两个是相同的意思,P在终止是为true。但对于无限的规范来说,<>[]P意思是在某个状态上P为true,并永远保持true。而[]<>P意思是如果P变为false,P最终会再次变成true。

THE END!

通过例子学TLA+(十五)--时序属性相关推荐

  1. 通过例子学TLA+(十四)--宏,过程与标签

    宏,过程与标签 TLA+在多进程之间复用代码,最简单的方法是使用宏和过程. 宏 宏是通用的代码内联器,格式为 nacro Name(var1,...) begin\* stuff end macro; ...

  2. 通过例子学TLA+(十二)-- 函数与实例

    函数和实例 函数 TLA+中除了 数字,字符串,布尔值,模型值 4种基本类型外,还有两种复杂类型,分别为集合和函数.函数构成了所有实用复杂类型的基础. 函数的形式看起来跟之前介绍过的操作符是一样的.函 ...

  3. 通过例子学TLA+(十)--集合

    集合 集合用大括号来表示,如{1,2},对于连续的数字集合有种特殊的表示方式,如 1-3 表示集合{1,2,3} 下表是集合的常见操作 Operator example 备注 \in 1 \in {1 ...

  4. 通过例子学TLA+(五)--FIFO Sequences

    FIFO 本例子是一个先进先出FIFO的Buffer.Sender向Buff发送数据,Buffer接收数据存储在Sequence中,然后,Buffer将Sequence中第一个数据取出发送给Recei ...

  5. 通过例子学TLA+(一)-- HourClock

    前言 刚接触TLA+,将学习过程中的理解整理记录下来,用于加深理解和备忘.有对TLA+感兴趣的可以私信我,一起学习. TLA+简介 TLA+ 是一门形式规格说明语言(formal specificat ...

  6. 通过例子学TLA+(十三)--多进程与await

    多进程 之前使用的例子都是单进程的,现在用多进程来描述多个逻辑同时发生,TLA+中的多进程可以理解为其他高级语言中的多线程.为了方便理解,使用Pluscal语言来描述,TLA+ Toolbox可以将p ...

  7. 通过例子学TLA+(八)--表达式

    表达式 在之前的例子中,已经多次用到了表达式,常见的表达式中会用到 大于,小于,等于,不等于等这样条件判断.还有一些其他的用法,比如逻辑连接,IF-ELSE 等 逻辑连接 逻辑连接在之前的例子中是用过 ...

  8. 通过例子学TLA+(二) -- DieHard

    第二个例子DieHard 这是一个倒水的例子,初始一个3升容量的桶,一个5升容量的桶,水不限,如何倒出一个容量刚好是4升的水.在一部老电影DieHard中主角就面临这个问题,这里就将module名命名 ...

  9. 通过例子学TLA+(四)-- Send Rev Print

    Send & Rev 稍微复杂点的程序中都会涉及数据的发送与接收,本例子基于发送器Sender与接收器Receiver来实现数据的变更.假设Sender发送一个数据给Receiver,Rece ...

最新文章

  1. 面试官:连YOLO都搞不定,是自己走还是我送你
  2. python与excel的应用-Python 3 读取和存储Excel数据(应用到接口测试)
  3. cocos2d-x 3.2读取xml和json练习
  4. mysql 报错ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executin
  5. 5种避免C#.NET中因事件造成内存泄漏的技术
  6. Windows Phone 7(accelerometer)重力感应编程
  7. 采用Locust对grpc协议进行压测
  8. 【动态规划】牛客网:把数字翻译成字符串
  9. pip3 install mysqlclient 报错 “/bin/sh: 1: mysql_config: not found”的解决方法
  10. 怎样通过计算机修改蓝牙音箱,蓝牙音箱怎么连接电脑(图文教程)
  11. java编程加载窗口,插入图片
  12. 地球上20张最惊人照片!不看将后悔一辈子
  13. 双稳态电路的两个稳定状态是什么_NE555集成电路--交替闪烁灯
  14. java deflate_Java实现deflate算法的压缩和解压
  15. 基于PHP的酒店住宿管理系统 毕业设计源码261455
  16. 从核酸检测平台崩盘看性能工程的范围
  17. AltiumDesigner 绘制PCB常见问题
  18. P1139 再分麦粒
  19. 经度从0-360更改为-180到180
  20. SCSI/iSCSI及SAS、NAS、SAN的基本介绍

热门文章

  1. 微视更新达人计划 ,补贴大幅下降引起公会达人强烈反弹[联络易]
  2. B树在数据库索引中的应用剖析
  3. Java毕业设计_基于web的师生交流平台的设计与实现
  4. 【python OCR】PaddleOCR简单demo入门
  5. 计算机图形学的发展与电子游戏不可分割的联系(译文)
  6. AcWing 1010 拦截导弹
  7. onkeyup、onkeydown和onkeypress的区别
  8. D3D11和Vulkan共享资源 (二) - 和Intel MediaSDK sample_decode 集成
  9. net::ERR_CONNECTION_TIMED_OUT 微信小程序 解决办法
  10. android killer去除火柴人广告