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的状态转换序列
相关文章
|
自然语言处理 开发者 异构计算
社区供稿 | Llama3-8B中文版!OpenBuddy发布新一代开源中文跨语言模型
此次发布的是在3天时间内,我们对Llama3-8B模型进行首次中文跨语言训练尝试的结果:OpenBuddy-Llama3-8B-v21.1-8k。
|
数据采集 搜索推荐 机器人
Web---robots协议详解
Web---robots协议详解
1158 1
|
存储 机器学习/深度学习 前端开发
通义灵码的技术架构
通义灵码的技术架构
|
人工智能 物联网 测试技术
CodeFuse发布34B-4bit单卡4090可部署模型
CodeFuse 是蚂蚁集团自研的代码生成专属大模型,可以根据开发者的输入提供智能建议和实时支持,帮助开发者自动生成代码、自动增加注释、自动生成测试用例、修复和优化代码等,以提升研发效率。
859 0
CodeFuse发布34B-4bit单卡4090可部署模型
|
5月前
|
存储 供应链 API
1688获得店铺所有商品的API接口
本文介绍如何通过1688开放平台API获取指定店铺的全部商品信息,涵盖注册、认证、分页调用及Python代码实现,适用于数据同步、库存管理与电商分析,内容真实可靠,步骤清晰易行。
546 0
|
消息中间件 弹性计算 运维
阿里云ECS事件通知产品详解
介绍阿里云ECS事件通知产品的详情和使用案例,包括控制台、OpenAPI、调试等。
|
Kubernetes 网络协议 Ubuntu
Kubernetes 网络排查骨灰级
Kubernetes 网络排查骨灰级
1268 1
C++(十九)new/delete 重载
本文介绍了C++中`operator new/delete`重载的使用方法,并通过示例代码展示了如何自定义内存分配与释放的行为。重载`new`和`delete`可以实现内存的精细控制,而`new[]`和`delete[]`则用于处理数组的内存管理。不当使用可能导致内存泄漏或错误释放。
|
开发框架 前端开发 JavaScript
使用FastReport报表动态更新人员签名图片
使用FastReport报表动态更新人员签名图片
|
存储 JavaScript 前端开发
【JavaScript技术专栏】ECMAScript 6+新特性详解
【4月更文挑战第30天】ES6(ES2015)标志着JavaScript的重大更新,引入了类和模块、箭头函数、模板字符串、解构赋值、Promise、新数据类型Symbol、Set和Map集合等特性,提高了语言表达力和开发效率。后续版本继续添加新特性,如ES2016的`Array.prototype.includes`,ES2017的`async/await`,以及ES2018的`Object/rest`。学习和掌握这些特性对于提升开发质量和效率至关重要。
262 1

热门文章

最新文章