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

函数和实例

函数

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]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值