函数和实例

函数

TLA+中除了 数字,字符串,布尔值,模型值 4种基本类型外,还有两种复杂类型,分别为集合和函数。函数构成了所有实用复杂类型的基础。

函数的形式看起来跟之前介绍过的操作符是一样的。函数定义的两种方式:

Function == [s \in S |-> foo]  \* 这里foo可以是任何方程式。注意这里用的是|->,不是:
Function[s \in S] == foo

在函数定义中可以使用无限集合,如

Doubles == [n \in Nat |-> 2*n ]
Doubles[12] = 24 \* 调用方式为[],而不是()\* 多参数
Sum == [x, y \in 1..10 |-> x + y] \*限定了x,y的值在1..10中
Sum[2,3] = 5
Sum[2,30]    \* error,30不在1..10中Addx(x) == [y \in Nat |-> x+y+1]
Addx(2)[3] = 6  \*该调用x=2,y=3

函数集

函数集的语法为:SetOfFunctions == [A -> B],注意这里用的是 -> ,而不是|->。 ->的结果需要用|->来描述。例如:

S1 == {1, 2}
S2 == {3, 4}
[s \in S1 |-> S2] = [1 |-> {3, 4}, 2 |-> {3, 4}] = <<{3,4},{3,4}>> \* 这是一个元组
[S1 -> S2] = {[1 |-> 3, 2 |-> 3], [1 |-> 3, 2 |-> 4], [1 |-> 4, 2 |-> 3], [1 |-> 4, 2 |-> 4]} = {<<3, 3>>, <<3, 4>>, <<4, 3>>, <<4, 4>>} \* 这是一个集合,[1 |-> 3, 2 |-> 3]中的1表示第一个元素,2表示第二个元素,如果将1,2替换为2,3,就不能表示为<<3,3>>了,只能表示为[2|->3,3|->3]

实例

1、给定一个字符串,返回每个字符的个数。如:给定<<“a”,“b”,“a”>>返回 [a |-> 2, b |-> 1]

\* 1 将元组转化为集合,此时集合中包含了不重复的元组的元素 2 遍历集合元素,统计每个元素在元组中的个数
Range(S) == {S[t]:t \in 1..Len(S)}
Counter(str) == [c \in Range(str) |-> Cardinality({n \in 1..Len(str) : str[n] = c})]Counter(<<"a","b","a">>) = [a |-> 2, b|-> 1]

2、给定一个集合S和数字N,返回N个S的笛卡尔积,如Op(S, 3) == S \X S \X S

Op(S,N) == [1..N -> S]

通过例子学TLA+(十二)-- 函数与实例相关推荐

  1. 通过例子学TLA+(十五)--时序属性

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

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

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

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

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

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

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

  5. 深入理解PHP内核(十二)函数-函数的定义、传参及返回值

    原文链接:http://www.orlion.ga/344/ 一.函数的定义 用户函数的定义从function 关键字开始,如下 function foo($var) { echo $var; } 1 ...

  6. 零基础入门python3.7 ——基础知识总结(十二) 函数进级

    python中的函数调用时除了对位传参. 关键字传参. 默认参数以外还提供了以下传参方式. 一.可变参数 顾名思义可变参数就是参数的个数是可变的,可以是任意1个或者多个,由于参数的数量不确定所以我们要 ...

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

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

  8. 通过例子学TLA+(七)--操作符

    Operator TLA+中的操作符类似于其他编程语言中的函数或者宏定义,使用 == 来定义,例如 Five == 5 \* 无参数时不用加括号 Sum(x,y) == x + y SumwithFi ...

  9. 【C语言进阶深度学习记录】三十二 函数指针与使用函数指针实现回调函数

    回调函数是非常重要的概念 文章目录 1 函数的类型 2 函数指针 2.1 函数指针的使用 2.2 使用函数指针实现回调函数 3 总结 1 函数的类型 跟以前学数组的时候是一样的,C语言中的数组是有自己 ...

最新文章

  1. ActiveReports 报表应用教程 (14)---数据可视化
  2. 【清华集训2017】榕树之心
  3. HTTP Header 详解
  4. valgrind 详解
  5. XML4跨浏览器兼容
  6. 使用idea编写代码作为生产者,Kafka接收其发来的信息【小案例】(一)
  7. nuget 包管理器
  8. 种草!这些好像用处不大但是很可爱的Mac软件
  9. 从0开始学习 GitHub 系列之「Git 速成」
  10. 模糊控制器原理笔记(附简单demo以及MATLAB相关操作)
  11. python面板数据分析代码_【译】用python做计量之面板数据模型
  12. e次方用计算机怎么算百分比,e指数计算器
  13. 前端面试题集锦——算法
  14. 想学python网课哪个好过_python入门:想学python网课哪个好?
  15. 大学四年,靠着这些学习网站,我从挂科学渣变成了别人眼中的大神
  16. java破解WIFI
  17. AcWing 2019. 拖拉机(双端队列BFS)
  18. element实现form表单动态添加email效果
  19. 批量在DHCP中设定IP地址保留
  20. css小技巧(文字两端对齐)

热门文章

  1. 判断ios/android设备;判断页面是否在微信中打开
  2. tgp进游戏不显示服务器,TGP饥荒联机版浏览游戏在线服务器显示为0解决方法分享...
  3. mysql分库分表风险_别再问“分库分表”了,再问就崩溃了!
  4. ubuntu 看迅雷电影的方法
  5. 浏览器特性与安全策略
  6. 微信小程序API 数据缓存
  7. 緊急流出!我會進入!手把手教你入门内网渗透(放課後Hなアルバイト)
  8. 贵州“十三五”风电装机或翻番
  9. Spring Boot系列(三)、Spring Boot视图技术(Jsp、FreeMarker、Thymeleaf)
  10. 粤嵌GEC6818板子TCP网络编程发送命令控制音视频