元组
元组和其他语言中的数组类似,用<<>>表示,不同之处在于TLA+中元组下标是从1开始。
x == <<4, 5, 6>>;
x[1] + x[2] + x[3] = 15;
DOMAIN 操作符可以作用于元组 例如
x == <<"hello", "world", "!">>
DOMAIN x = {1,2,3} \* DOMAIN x 等价于 1..Len(x)
跟元组有关的Module Sequences 已经在之前介绍过了。
元组集合
两个集合Set的笛卡尔积是元组集,例如
{"a","b"} \X {2,3} = {<<"a", 2>>, <<"a", 3>>, <<"b", 2>>, <<"b", 3>>}
结构体
结构体是有key和value组成,跟hash一样,表现形式上采用 |-> 符号或者 :来分隔key和value。当使用:来分隔时得到的是元素集合,例如:
\* 用|->表示
x == [a |-> 1, b |-> {2, 3}];
x.a = 1;
x["b"] = {2, 3};
\* 用:表示
y == [a : {1}, b : {2, 3}]; \* 注意与前面的x表示的意思不一样,上述x为结构体,这里的y是结构的集合
y = { [a |-> 1, b |-> 2], [a |-> 1, b |-> 3] }
\* 下面的表述会报错:
z == [a:1, b:{2,3}] \* 用:分隔,需要value为集合
可以使用DOMAIN来获取结构体的keys,返回结果是keys字符串的集合例如
x == [a |-> 1, b |-> {2, 3}];
DOMAIN x = {"a","b"} \* 注意x
成员访问
上面例子中有关于成员访问的格式,如
x == [a |-> 1, b |-> {2, 3}];
x.a = 1;
x["b"] = {2, 3};
\* 复杂结构的访问
x == [a |-> {<<>>, <<1, 2, 3>>, <<3, 2, 1>>}, b |-> <<[a |-> 0]>>];
x.b[1].a; \* 0