通过例子学TLA+(十)--集合
集合
集合用大括号来表示,如{1,2},对于连续的数字集合有种特殊的表示方式,如 1…3 表示集合{1,2,3}
下表是集合的常见操作
Operator | example | 备注 |
---|---|---|
\in | 1 \in {1,2} 为true 1\in {{1},2}为false | 在集合为true,不在为false |
\notin | 1 \notin {} 为true {1} \notin {{1}}为false | 与\in相反 |
\subseteq | {1,2} \subseteq {1,2,3} | 是子集为true |
\union | {1,2} \union {2,3} = {1,2,3} | 并集,重复元素只保留一个 |
\intersect | {1,2} \intersect {2,3} = {2} | 交集 |
S1 \ S2 | {1,2} \ {2,3} = {1} | 差集,在S1中,不在S2中 |
SUBSET S | SUBSET {1,2} = {{},{1},{2},{1,2}} | S的所有子集,包括空和自身 |
UNION S | UNION {{1},{1,2},{5}} = {1,2,5} | 等价于{1} \union {1,2} \union {5} |
有个标准MODULE FiniteSets ,有两个operators,
operator | example | 备注 |
---|---|---|
IsFiniteSet(S) | IsFiniteSet({1,3}) = TRUE | S为有限集合返回True |
Cardinality(S) | Cardinality({1,3}) = 2 | 但S为有限集时,返回元素个数 |
过滤器
可以对集合进行过滤,格式为{x \in S : P(x)},其中S为集合,x为集合中元素,P为过滤条件,返回满足过滤条件的元素的集合,其中P必须返回一个布尔值,否则将会报错。
例如:
{x \in 1..8 : x % 2 = 1} = {1,3,5,7}
如果S是元组集合,可以用<<…>> \in S 来访问元素
例如:
{<<x,y>> \in {1,2} \X {1,2} : x>=y} = {<<1, 1>>, <<2, 1>>, <<2, 2>>}
过滤器可以嵌套使用,例如
{x \in {y \in S : P(y)} : Q(x)} 等价于 {x \in S: P(x) /\ Q(x)}
映射
映射的格式与过滤器相反:{P(x): x \in S} ,如果P是布尔表达式则结果集就是布尔值的集合。
例如:
{ x * x : x \in 1..4 } = {1,4,9,16}
{ x % 2 = 1: x \in 1..8 } = {TRUE,FALSE}T == <<1,2,3>>
{ T[x] : x \in DOMAIN T } = {1,2,3} \* 将元组转化为集合
CHOOSE
格式为:CHOOSE x \in S : P(x) 意思是从有限集S中选择一个满足P条件的元素
例如
CHOOSE x \in 1..8 : x % 2 = 1 满足条件的1,3,5,7都可能是返回值。
需要说明的是采用CHOOSE则认为S中至少有一个满足P的元素,否则TLC将会引发错误。
实例
给定一个集合S,编写一个返回所有长度为 2 的子集的运算符,如 Op(1…3) = {{1, 2}, {1, 3}, {2, 3}}
\* 将该问题分解 1、获取S的所有子集, 2、计算每个子集的长度 3、过滤出子集长度为2的集合
Op(S) == { subset \in SUBSET S : Cardinality(subset) = 2 }
通过例子学TLA+(十)--集合相关推荐
- 通过例子学TLA+(十二)-- 函数与实例
函数和实例 函数 TLA+中除了 数字,字符串,布尔值,模型值 4种基本类型外,还有两种复杂类型,分别为集合和函数.函数构成了所有实用复杂类型的基础. 函数的形式看起来跟之前介绍过的操作符是一样的.函 ...
- 通过例子学TLA+(十五)--时序属性
时序属性 Termination 最简单的时序属性是Termination,Termination是算法终止的要求,如果算法崩溃或者死锁或者进入一个无限循环,那么久违反了Termination规范. ...
- 通过例子学TLA+(十四)--宏,过程与标签
宏,过程与标签 TLA+在多进程之间复用代码,最简单的方法是使用宏和过程. 宏 宏是通用的代码内联器,格式为 nacro Name(var1,...) begin\* stuff end macro; ...
- 通过例子学TLA+(十三)--多进程与await
多进程 之前使用的例子都是单进程的,现在用多进程来描述多个逻辑同时发生,TLA+中的多进程可以理解为其他高级语言中的多线程.为了方便理解,使用Pluscal语言来描述,TLA+ Toolbox可以将p ...
- 通过例子学TLA+(五)--FIFO Sequences
FIFO 本例子是一个先进先出FIFO的Buffer.Sender向Buff发送数据,Buffer接收数据存储在Sequence中,然后,Buffer将Sequence中第一个数据取出发送给Recei ...
- 通过例子学TLA+(九)--元组和结构体
元组 元组和其他语言中的数组类似,用<<>>表示,不同之处在于TLA+中元组下标是从1开始. x == <<4, 5, 6>>; x[1] + x[2] ...
- 通过例子学TLA+(一)-- HourClock
前言 刚接触TLA+,将学习过程中的理解整理记录下来,用于加深理解和备忘.有对TLA+感兴趣的可以私信我,一起学习. TLA+简介 TLA+ 是一门形式规格说明语言(formal specificat ...
- 通过例子学TLA+(八)--表达式
表达式 在之前的例子中,已经多次用到了表达式,常见的表达式中会用到 大于,小于,等于,不等于等这样条件判断.还有一些其他的用法,比如逻辑连接,IF-ELSE 等 逻辑连接 逻辑连接在之前的例子中是用过 ...
- 通过例子学TLA+(二) -- DieHard
第二个例子DieHard 这是一个倒水的例子,初始一个3升容量的桶,一个5升容量的桶,水不限,如何倒出一个容量刚好是4升的水.在一部老电影DieHard中主角就面临这个问题,这里就将module名命名 ...
最新文章
- gops - Go语言程序查看和诊断工具
- 修改Docker0网桥默认网段
- vim打开所有折叠的方法及其他所有折叠的命令
- 2020邮箱账号密码大全_通知 | 复旦大学2020年春季学期研究生选课FAQ
- 微信公众号页面模版怎么添加文章推荐功能
- SCCM 2007系列教程之四在工作组环境内实现SCCM客户端
- python是什么类型的语言-为什么说 Python 是强类型语言?
- bzoj 3384: [Usaco2004 Nov]Apple Catching 接苹果(DP)
- html5 localStorage
- codewars python Regex validate PIN code
- eda数字竞赛抢答器
- solidworks导出xml文件 (matlab打开)
- 【趣闻】清华大学大一的英文原版线性代数教材里居然出现了Python
- 工业机器人的臂部配置形式_工业机器人臂部设计注意事项
- Unity 导入图片安卓和IOS自动转换格式ETC2或者ASTC
- Windows禁用签名启动
- 美颜相机android版,美颜相机手机版
- html+抽奖游戏,九宫格抽奖HTML+JS版
- 创新之道,亚马逊创新之旅背后的故事
- (一) 一元线性回归方程 梯度下降
热门文章
- Google谷歌浏览器Post请求预见strict-origin-when-cross-origin跨域问题的 解决办法
- 计算机保研英语面试问题,保研英语面试准备
- 由工厂设计模式实现的Java多功能计算器(包括数值运算和图形运算以及字符串运算)
- 关于java 计算器设计,Java课程设计报告---设计一个多功能计算器
- 大学计算机课程报告python_基于python语言和数据分析的大学公共计算机课程方案...
- 乐Pro3双摄暗黑版即将发售,为乐视超级手机上市两周年添彩
- 贵州西部农产品:正安情寄予白茶
- Web 攻击的日志分析:初学者指南
- 人工智能成天桥区智能制造突破口
- linux下.xz文件的解压方式