TLA+ Specifying System (2)

简介: TLA+ Specifying System (2)

问题

要用一个 3 加仑的水壶和一个 5 加仑的水壶得到 4 加仑的水,怎么做呢?

思路

  • 描述两个水壶所有可能的状态,通过TLA+的宽度遍历机制,暴力搜索所有的状态序列(TLA+中称为behavior)
  • 给 3 加仑水壶灌满水
  • 给 5 加仑水壶灌满水
  • 清空 3 加仑水壶
  • 清空 5 加仑水壶
  • 将 3 加仑水壶的水倒到 5 加仑水壶
  • 将 5 加仑水壶的水倒到 3 加仑水壶

TLA+代码如下

-------------------------- MODULE DieHard  --------------------------
EXTENDS Naturals
VARIABLES small,big
Init == /\ small = 0
       /\ big = 0
TypeOK == /\ small \in 0..3
         /\ big \in 0..5
FillSmall == /\ small' = 3
            /\ big' = big
FillBig == /\ small' = small
          /\ big' = 5
EmptySmall == /\ small' = 0
             /\ big' = big
EmptyBig == /\ big' = 0
           /\ small' = small
SmallToBig == IF small + big < 5
             THEN
                /\ big' = small + big
                /\ small' = 0
             ELSE
                /\ big' = 5
                /\ small' = small - (5 - big)
BigToSmall == IF small + big < 3
             THEN
                /\ small' = small + big
                /\ big' = 0
             ELSE
                /\ small' = 3
                /\ big' = big - (3 - small)
Next == \/ FillSmall
       \/ FillBig
       \/ SmallToBig
       \/ BigToSmall
       \/ EmptyBig
       \/ EmptySmall
=============================================================================
\* Modification History
\* Last modified Thu Apr 26 10:31:15 CST 2018 by max
\* Created Wed Apr 25 21:42:59 CST 2018 by max
  • 涉及到的语法
  • TLA的变量没有类型的概念,类型的正确性是通过形式化的定义,来检查某个变量的类型是否正确
  • TLA要求每个形式的定义,都要列举出所有的变量状态,没有默认值
  • TLA中的‘=’不是程序设计语言中的赋值操作,仅仅是一个判断是否相等的逻辑运算,满足交换性,比如:big = 5 和 5 = big 是等价的
  • 运行
  • 使用TLA+ ToolBox 运行上面的代码(具体使用方法可以参考Lamport TLA+的视频)
  • TLA+校验的算法不会终止,会一直运行下去
  • 为了让DieHard正确的终止,添加了bit = 4的不变式
  • 最终,TLA遍历出了一个可行的状态序列,使得big为4

image.png

总结

  • 描述系统可能的状态转换
  • TLA+穷举出所有的状态序列
  • 每次状态转换都校验invariant
  • TLA+列出违背invariant的状态转换序列
相关文章
C语言:十进制、BCD码互换
C语言:十进制、BCD码互换
C语言:十进制、BCD码互换
微机原理||各种进制数显示程序
微机原理||各种进制数显示程序
|
机器学习/深度学习
常见位运算的总结
常见位运算的总结
134 0
|
存储 Java 程序员
“高端”的位运算
大家好,我是王有志。原计划迭代作为预备知识的收尾,不过在解2的幂和4的幂时,想到关于数字2的问题可以通过位运算去解决,因此补充了关于位运算的内容。
147 1
|
传感器 数据采集 物联网
Zigbee温湿度采集控制完整流程|学习笔记
快速学习Zigbee温湿度采集控制完整流程
Zigbee温湿度采集控制完整流程|学习笔记
|
安全 网络安全 API
技术:firewalld浅谈使用
防火墙技术的功能主要在于及时发现并处理计算机网络运行时可能存在的安全风险、数据传输等问题,其中处理措施包括隔离与保护,同时可对计算机网络安全当中的各项操作实施记录与检测,以确保计算机网络运行的安全性,保障用户资料与信息的完整性,为用户提供更好、更安全的计算机网络使用体验。
技术:firewalld浅谈使用
|
安全 Java
java常用类之System
System是一个类,这个System类主要是一些与系统相关的属性和方法的集合,而且其内部的方法全部是静态的,所以我们直接使用System直接调用就好,比如我们常用的一个System.out.print。这篇文章我们就来分析一下System类。
639 0
java常用类之System
|
并行计算 算法 编译器
开创性提供量子计算机从软到硬的完整可编程性!Delft提出可执行量子计算指令集eQASM
传统计算机硬件的计算单元与控制单元一样,都是数字电路,能够轻易集成在一块处理器上;传统软件输出的二进制代码则可以直接在处理器上运行。量子计算机与此不同,其计算单元是量子比特,而控制媒介是模拟信号,通常需要由独立于量子芯片的控制单元产生。额外的量子控制架构,作为量子软件与量子硬件之间的桥梁,构成了量子计算机与传统计算机在系统结构上最核心的区别之一。但在量子计算工程领域,以往量子软件与量子硬件的研究相对独立,这导致二者的设计及实现难以有机地联接在一起。
510 0
开创性提供量子计算机从软到硬的完整可编程性!Delft提出可执行量子计算指令集eQASM
|
机器学习/深度学习 资源调度 Python
熟悉常见概率分布
生活中的很多事情潜在的都符合某种规律。例如:反复抛掷一枚均匀的硬币,出现正面和反面的机会是差不多的;我们认识的人里面特别高或者特别矮的都不多,大部分人的身高都在一个比较接近的范围内。概率论通过概率分布来描述事件出现的频率。本文选取了一些常见的概率分布做一些介绍,以方便在今后使用的时候可以查阅。 > 当然,“常见”是一个很口语而非科学的说法,因为这很难有明确的标准。如果想要对更多的概率分布做深
2784 0

热门文章

最新文章