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/ProtoReals.tla
---
------------------------------ MODULE ProtoReals -------------------------------
EXTENDS Peano

IsModelOfReals(R, Plus, Times, Leq) ==
    LET IsAbelianGroup(G, Id, _+_ ) ==
        /\ Id \in G
        /\ \A a, b \in G: a + b \in G
        /\ \A a \in G: Id + a = a
        /\ \A a, b, c \in G: (a + b) + c = a + (b + c)
        /\ \A a \in G: \E minusa \in G: a + minusa = Id
        /\ \A a, b \in G: a + b = b + a
        (**********************************************************************)
     (* Plus and Times are functions and Leq is a set, but it's more       *)
     (* convenient to turn them into the infix operators +, *, and \leq    *)
     (**********************************************************************)
        a + b == Plus[a, b]
        a * b == Times[a, b]
        a <= b == << a, b >> \in Leq
    IN
        /\ Nat \subseteq R
        /\ \A n \in Nat: Succ[n] = n + Succ[Zero]
        /\ IsAbelianGroup(R, Zero, +)
        /\ IsAbelianGroup(R \ {Zero}, Succ[Zero], *)
        /\ \A a, b, c \in R: a * (b + c) = (a * b) + (a * c)
        /\ \A a, b \in R:
            /\ (a <= b) \/ (b <= a)
            /\ (a <= b) /\ (b <= a) <=> (a = b)
        /\ \A a, b, c \in R:
            /\ (a <= b) /\ (b <= c) => (a <= c)
            /\ (a <= b) =>
                /\ (a + c) <= (b + c)
                /\ (Zero <= c) => (a * c) <= (b * c)
        /\ \A S \in SUBSET R:
                LET SBound(a) == \A s \in S: s <= a
                IN (\E a \in R: SBound(a)) =>
                    (\E sup \in R:
                        /\ SBound(sup)
                        /\ \A a \in R: SBound(a) => (sup <= a))

THEOREM \E R, Plus, Times, Leq : IsModelOfReals(R, Plus, Times, Leq)
--------------------------------------------------------------------------------
RM == CHOOSE RM: IsModelOfReals(RM.R, RM.Plus, RM.Times, RM.Leq)

Real == RM.R
--------------------------------------------------------------------------------
Infinity == CHOOSE x: x \notin Real
MinusInfinity == CHOOSE x: x \notin Real \union {Infinity}

a + b == RM.Plus[a, b]

a * b == RM.Times[a, b]

a <= b == CASE (a \in Real) /\ (b \in Real) -> << a, b >> \in RM.Leq
    [] (a = Infinity) /\ (b \in Real \union {MinusInfinity}) -> FALSE
    [] (a \in Real \union {MinusInfinity}) /\ (b = Infinity) -> TRUE
    [] (a = b) -> TRUE

a - b == CASE (a \in Real) /\ (b \in Real) -> CHOOSE c \in Real: c + b = a
    [] (a \in Real) /\ (b = Infinity) -> MinusInfinity
    [] (a \in Real) /\ (b = MinusInfinity) -> Infinity

a / b == CHOOSE c \in Real: a = b * c

Int == Nat \union {Zero - n: n \in Nat}
--------------------------------------------------------------------------------
a ^ b ==
    LET RPos == {r \in Real \ {Zero}: Zero <= r}
        exp == CHOOSE f \in [(RPos \X Real) \union (Real \X RPos)
            \union ((Real \ {Zero}) \X Int) -> Real]:
            /\ \A r \in Real:
                /\ f[r, Succ[Zero]] = r
                /\ \A m, n \in Int: (r /= Zero) =>
                    (f[r, m + n] = f[r, m] * f[r, n])
            /\ \A r \in RPos:
                    /\ f[Zero, r] = Zero
                    /\ \A s, t \in Real: f[r, s * t] = f[f[r, s], t]
                    /\ \A s, t \in RPos: (s <= t) => (f[r, s] <= f[r, t])
    IN exp[a, b]
================================================================================