时序属性

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. android项目两种构建方式的整合(Eclipse/idea和Android Studio)
  2. 从生命周期去看互联网金融产品的风险管理框架
  3. rsviwe32 7.6 授权_「复杂系统迁移 .NET Core平台系列」之认证和授权
  4. Anisble中的任务执行控制
  5. Spring Cloud Config入门(本地配置)
  6. 服务器文件夹和电脑文件夹同步软件哪个好,windows文件同步备份软件-文件夹同步工具哪个好?...
  7. 文本预处理及keras的学习
  8. LInux 查看环境变量
  9. mod_expires和mod_deflate的配置
  10. CMMI认证的周期是多久?费用是多少?
  11. CAD制图初学入门:使用CAD切换窗口
  12. RNAcentral 数据库简介
  13. matlab在机械中的应用,MATLAB在机械工程控制基础中的应用
  14. 虎赢大数据:“企业工商数据价值挖掘”,是2020年大数据创业发展的方向之一
  15. vue + element-ui本地下载图片
  16. windows的域和域林间的信任是如何工作的
  17. GitHub入门之一:使用github下载项目
  18. SourceTree跳过注册安装使用
  19. sharepoint能做什么,门户开发出来是什么效果,这里转一个个人产品的案例
  20. Flappy bird模式值得追捧么?

热门文章

  1. thinkphp5 调用支付宝支付电脑版
  2. C# 打开以对话框,获取文件夹路径 、文件的路径、文件名
  3. python结束运行快捷键_Python 快捷键大全
  4. Unity Color颜色转换 colorhex 转换color
  5. 点赋网络:淘宝开店货源怎么选
  6. 长沙理工考研2021计算机软件黑不黑,2021长沙理工大学考研历年真题复习资料
  7. ESP8266/ESP32 AT 固件烧录 + 生成数据看板App
  8. Android Studio之maven Central 和 JCenter
  9. jssdk分享设置_微信JSSDK分享页面自定义当前链接最简单示例
  10. 建立三年学习思路 教你系统有效的自学摄影