libtlafmt 0.4.1

A formatter library for TLA+ specs, core of tlafmt
Documentation
---
source: libtlafmt/tests/format.rs
expression: output
input_file: libtlafmt/tests/corpus/Sequences.tla
---
------------------------------- MODULE Sequences -------------------------------
(***************************************************************************)
(* Defines operators on finite sequences, where a sequence of length n is  *)
(* represented as a function whose domain is the set 1..n (the set         *)
(* {1, 2, ... , n}).  This is also how TLA+ defines an n-tuple, so         *)
(* tuples are sequences.                                                   *)
(***************************************************************************)

LOCAL INSTANCE Naturals
(*************************************************************************)
  (* Imports the definitions from Naturals, but don't export them.         *)
  (*************************************************************************)

Seq(S) == UNION {[1..n -> S]: n \in Nat}
(*************************************************************************)
  (* The set of all sequences of elements in S.                            *)
  (*************************************************************************)

Len(s) == CHOOSE n \in Nat: DOMAIN s = 1..n
(*************************************************************************)
  (* The length of sequence s.                                             *)
  (*************************************************************************)

s \o t == [i \in 1..(Len(s) + Len(t)) |-> IF i <= Len(s) THEN s[i]
    ELSE t[i - Len(s)]]
(*************************************************************************)
  (* The sequence obtained by concatenating sequences s and t.             *)
  (*************************************************************************)

Append(s, e) == s \o << e >>
(**************************************************************************)
  (* The sequence obtained by appending element e to the end of sequence s. *)
  (**************************************************************************)

Head(s) == s[1]
Tail(s) == [i \in 1..(Len(s) - 1) |-> s[i + 1]]
(*************************************************************************)
  (* The usual head (first) and tail (rest) operators.                     *)
  (*************************************************************************)

SubSeq(s, m, n) == [i \in 1..(1 + n - m) |-> s[i + m - 1]]
(*************************************************************************)
  (* The sequence <<s[m], s[m+1], ... , s[n]>>.                            *)
  (*************************************************************************)

SelectSeq(s, Test(_) ) ==
    (*************************************************************************)
  (* The subsequence of s consisting of all elements s[i] such that        *)
  (* Test(s[i]) is true.                                                   *)
  (*************************************************************************)
    LET F[i \in 0..Len(s)] ==
    (*******************************************************************)
        (* F[i] equals SelectSeq(SubSeq(s, 1, i), Test]                    *)
        (*******************************************************************)
        IF i = 0 THEN <<>>
        ELSE IF Test(s[i]) THEN Append(F[i - 1], s[i])
            ELSE F[i - 1]
    IN F[Len(s)]
================================================================================