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/spanning.tla
---
------------------------------- MODULE spanning --------------------------------
EXTENDS Integers
CONSTANTS Proc, NoPrnt, root, nbrs
ASSUME NoPrnt \notin Proc /\ nbrs \subseteq Proc \times Proc
VARIABLES prnt, rpt, msg
vars == << prnt, rpt, msg >>

Init ==
    /\ prnt = [i \in Proc |-> NoPrnt]
    /\ rpt = [i \in Proc |-> FALSE]
    /\ msg = {}

CanSend(i, j) == (<< i, j >> \in nbrs) /\ (i = root \/ prnt[i] /= NoPrnt)

Update(i, j) ==
    /\ prnt' = [prnt EXCEPT ![i] = j]
    /\ UNCHANGED << rpt, msg >>

Send(i) == \E k \in Proc:
    /\ CanSend(i, k) /\ (<< i, k >> \notin msg)
    /\ msg' = msg \union {<< i, k >>}
    /\ UNCHANGED << prnt, rpt >>

Parent(i) ==
    /\ prnt[i] /= NoPrnt /\ ~rpt[i]
    /\ rpt' = [rpt EXCEPT ![i] = TRUE]
    /\ UNCHANGED << msg, prnt >>

Next == \E i, j \in Proc: IF i /= root /\ prnt[i] = NoPrnt /\ << j, i >> \in msg
THEN Update(i, j)
ELSE
    \/ Send(i) \/ Parent(i)
    \/ UNCHANGED << prnt, msg, rpt >>

Spec ==
    /\ Init /\ [][Next]_vars
    /\ WF_vars(\E i, j \in Proc: IF i /= root /\ prnt[i] = NoPrnt /\ << j, i >> \in msg
        THEN Update(i, j)
        ELSE
            \/ Send(i) \/ Parent(i)
            \/ UNCHANGED << prnt, msg, rpt >>)

TypeOK ==
    /\ \A i \in Proc: prnt[i] = NoPrnt \/ << i, prnt[i] >> \in nbrs
    /\ rpt \in [Proc -> BOOLEAN ]
    /\ msg \subseteq Proc \times Proc

Termination == <>(\A i \in Proc: i = root \/ (prnt[i] /= NoPrnt /\ << i, prnt[i] >> \in nbrs))

OneParent == [][\A i \in Proc : prnt[i] # NoPrnt => prnt[i] = prnt'[i]]_vars

SntMsg == \A i \in Proc: (i /= root /\ prnt[i] = NoPrnt => \A j \in Proc: << i, j >> \notin msg)

================================================================================
\* Modification History
\* Last modified Mon Jul 09 13:30:26 CEST 2018 by tthai