TLA+ wiki

Modules #

  • Integers
  • Naturals
  • Reals
  • Sequences
  • TLC – print
  • Bags are multi-set functions, each element points to an integer as its quntity. Defines operators: (+) (-)
  • FiniteSets defines IsFiniteSet(S) and Cardinality(S).
  • RealTime – RTBound RTnow now

Definition #

<A>_v == A /\ (v' # v)

Av==A(vv)\langle A \rangle_v == A \land (v’ \neq v)

[A]_v == A \/ (v' = v)

[A]v==A(v=v)[A]_v == A \lor (v’=v)

Operators #

Divides (p, n) == qInt:n=qp\exists q \in Int : n = q * p

DivisorsOf (n) == {pIntp \in Int : Divides(p, n)}

SetMax (S) == CHOOSE iSi \in S : jS\forall j \in S : iji \geq j

GCD (m, n) == SetMax(DivisorsOf(m) \cap DivisorsOf(n))

SetGCD(T) == SetMax( {dIntd \in Int : tT\forall t \in T : Divides(d, t)} )

max(x, y) == IF x>y THEN x ELSE y

min(x, y) == IF x<y THEN x ELSE y

maxv(x, y) == [ii \in DOMAIN x |-> max(x[i], y[i])]

Cardinality(set)
SortSeq(s, <)
Len(s)
Head(s)
Tail(s)
Append(s,e)
Seq(s)
SubSeq(s, m, n)
SelectSeq(s, op)

successor[iNati \in Nat] == i+1

successor == [iNati \in Nat |-> i+1]

factorial[nNatn \in Nat] == IF n = 0 THEN 1 ELSE n * factorial[n-1]

RECURSIVE FactorialOp(_)

FactorialOp(n) == IF n=0 THEN 1 ELSE n * Factorial(n-1)

RECURSIVE Cardinality(_)

Cardinality(S) == IF S={} THEN 0 ELSE 1+Cardinality(S \ {CHOOSE xSx \in S : TRUE})


Sortings(S) == LET D == 1..Cardinality(S)

IN {seq[DS]:seq \in [D \to S] :

Sseq[i]:iD\land S \subseteq {seq[i] : i \in D}

i,jD:(i<j)(seq[i].keyseq[j].key)\land \forall i,j \in D : (i<j) \Rightarrow (seq[i].key \leq seq[j].key)}


RECURSIVE SetSum(_)

SetSum(S) == IF S={} THEN 0 ELSE LET s==CHOOSE xSx \in S : TRUE IN s + SetSum(S \ {s})


RECURSIVE SeqSum(_)

SeqSum(s) == IF s=«» THEN 0 ELSE Head(s) + SeqSum(Tail(s))

Network #

variable network = [from 1..N\in 1..N |-> [to 1..N\in 1..N |-> «»]];

define
{
    send(from, to, msg) == [network EXCEPT ![from][to] = Append(@, msg)]
    bcast(from, msg) == [network EXCEPT ![from] = [to $\in 1..N$ |-> Append(network[from][to], msg)]]
}
macro rcv()
{
    with (from $\in$ {$j \in 1..N$ : Len(network[j][self]) > 0}) {
        msg := Head(network[from][self]);
        network[from][self] := Tail(@)
    };
}