libtlafmt 0.4.1

A formatter library for TLA+ specs, core of tlafmt
Documentation
----------------------------- 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 \leq 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 \leq b) \/ (b \leq a)
                         /\ (a \leq b) /\ (b \leq a) <=> (a = b)
      /\ \A a, b, c \in R : /\ (a \leq b) /\ (b \leq c) => (a \leq c)
                            /\ (a \leq b) => 
                                 /\ (a + c) \leq (b + c)
                                 /\ (Zero \leq c) => (a * c) \leq (b * c)
      /\ \A S \in SUBSET R :
           LET SBound(a) == \A s \in S : s \leq a
           IN  (\E a \in R : SBound(a)) => 
                  (\E sup \in R : /\ SBound(sup) 
                                  /\ \A a \in R : SBound(a) => (sup\leq 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 \cup {Infinity}

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

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

a \leq b == CASE (a \in Real) /\ (b \in Real) -> <<a, b>> \in RM.Leq
              [] (a = Infinity) /\ (b \in Real \cup {MinusInfinity})  -> FALSE
              [] (a \in Real  \cup {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 \cup {Zero - n : n \in Nat}
-----------------------------------------------------------------------------
a ^ b == 
  LET RPos == {r \in Real \ {Zero} : Zero \leq r}
      exp  == CHOOSE f \in [(RPos \X Real) \cup (Real \X RPos) 
                                   \cup ((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 \leq t) => (f[r,s] \leq f[r,t])
  IN  exp[a, b]
=============================================================================