The canonical (single-spelling) name a builtin prefix operator becomes as a
CoreTLAPlus.Expression.var, reachable via opCall.
Equations
- SurfaceTLAPlus.PrefixOperator.«-».canonicalName = "-."
- (SurfaceTLAPlus.PrefixOperator.«\neg » x_1).canonicalName = "\\neg"
- SurfaceTLAPlus.PrefixOperator.«[]».canonicalName = "[]"
- SurfaceTLAPlus.PrefixOperator.«<>».canonicalName = "<>"
- SurfaceTLAPlus.PrefixOperator.DOMAIN.canonicalName = "DOMAIN"
- SurfaceTLAPlus.PrefixOperator.ENABLED.canonicalName = "ENABLED"
- SurfaceTLAPlus.PrefixOperator.SUBSET.canonicalName = "SUBSET"
- SurfaceTLAPlus.PrefixOperator.UNCHANGED.canonicalName = "UNCHANGED"
- SurfaceTLAPlus.PrefixOperator.UNION.canonicalName = "UNION"
Instances For
The canonical name a builtin postfix operator becomes.
Equations
Instances For
The canonical name a builtin infix operator becomes (collapsing every alternative spelling
— e.g. <=/=</\leq — to one).
Equations
- SurfaceTLAPlus.InfixOperator.«!!».canonicalName = "!!"
- SurfaceTLAPlus.InfixOperator.«##».canonicalName = "##"
- SurfaceTLAPlus.InfixOperator.«$$».canonicalName = "$$"
- SurfaceTLAPlus.InfixOperator.«$».canonicalName = "$"
- SurfaceTLAPlus.InfixOperator.«%%».canonicalName = "%%"
- SurfaceTLAPlus.InfixOperator.«%».canonicalName = "%"
- SurfaceTLAPlus.InfixOperator.«&&».canonicalName = "&&"
- SurfaceTLAPlus.InfixOperator.«&».canonicalName = "&"
- (SurfaceTLAPlus.InfixOperator.«(+) » x_1).canonicalName = "(+)"
- (SurfaceTLAPlus.InfixOperator.«(-) » x_1).canonicalName = "(-)"
- (SurfaceTLAPlus.InfixOperator.«(.) » x_1).canonicalName = "(.)"
- (SurfaceTLAPlus.InfixOperator.«(/) » x_1).canonicalName = "(/)"
- (SurfaceTLAPlus.InfixOperator.«(\X) » x_1).canonicalName = "(\\X)"
- (SurfaceTLAPlus.InfixOperator.«\X » x_1).canonicalName = "\\X"
- SurfaceTLAPlus.InfixOperator.«**».canonicalName = "**"
- SurfaceTLAPlus.InfixOperator.«*».canonicalName = "*"
- SurfaceTLAPlus.InfixOperator.«++».canonicalName = "++"
- SurfaceTLAPlus.InfixOperator.«+».canonicalName = "+"
- SurfaceTLAPlus.InfixOperator.«-+->».canonicalName = "-+->"
- SurfaceTLAPlus.InfixOperator.«--».canonicalName = "--"
- SurfaceTLAPlus.InfixOperator.«-|».canonicalName = "-|"
- SurfaceTLAPlus.InfixOperator.«-».canonicalName = "-"
- SurfaceTLAPlus.InfixOperator.«...».canonicalName = "..."
- SurfaceTLAPlus.InfixOperator.«..».canonicalName = ".."
- SurfaceTLAPlus.InfixOperator.«.».canonicalName = "."
- SurfaceTLAPlus.InfixOperator.«//».canonicalName = "//"
- (SurfaceTLAPlus.InfixOperator.«/= » x_1).canonicalName = "/="
- (SurfaceTLAPlus.InfixOperator.«/\ » x_1).canonicalName = "/\\"
- SurfaceTLAPlus.InfixOperator.«/».canonicalName = "/"
- SurfaceTLAPlus.InfixOperator.«::=».canonicalName = "::="
- SurfaceTLAPlus.InfixOperator.«:=».canonicalName = ":="
- SurfaceTLAPlus.InfixOperator.«:>».canonicalName = ":>"
- SurfaceTLAPlus.InfixOperator.«<:».canonicalName = "<:"
- (SurfaceTLAPlus.InfixOperator.«<=> » x_1).canonicalName = "<=>"
- (SurfaceTLAPlus.InfixOperator.«=< » x_1).canonicalName = "=<"
- SurfaceTLAPlus.InfixOperator.«=>».canonicalName = "=>"
- SurfaceTLAPlus.InfixOperator.«=|».canonicalName = "=|"
- SurfaceTLAPlus.InfixOperator.«<».canonicalName = "<"
- SurfaceTLAPlus.InfixOperator.«=».canonicalName = "="
- (SurfaceTLAPlus.InfixOperator.«>= » x_1).canonicalName = ">="
- SurfaceTLAPlus.InfixOperator.«>».canonicalName = ">"
- SurfaceTLAPlus.InfixOperator.«??».canonicalName = "??"
- SurfaceTLAPlus.InfixOperator.«?».canonicalName = "?"
- SurfaceTLAPlus.InfixOperator.«@@».canonicalName = "@@"
- (SurfaceTLAPlus.InfixOperator.«\/ » x_1).canonicalName = "\\/"
- SurfaceTLAPlus.InfixOperator.«^^».canonicalName = "^^"
- SurfaceTLAPlus.InfixOperator.«^».canonicalName = "^"
- SurfaceTLAPlus.InfixOperator.«|-».canonicalName = "|-"
- SurfaceTLAPlus.InfixOperator.«|=».canonicalName = "|="
- SurfaceTLAPlus.InfixOperator.«||».canonicalName = "||"
- SurfaceTLAPlus.InfixOperator.«|».canonicalName = "|"
- SurfaceTLAPlus.InfixOperator.«~>».canonicalName = "~>"
- SurfaceTLAPlus.InfixOperator.«\approx».canonicalName = "\\approx"
- SurfaceTLAPlus.InfixOperator.«\sqsupseteq».canonicalName = "\\sqsupseteq"
- SurfaceTLAPlus.InfixOperator.«\asymp».canonicalName = "\\asymp"
- SurfaceTLAPlus.InfixOperator.«\gg».canonicalName = "\\gg"
- SurfaceTLAPlus.InfixOperator.«\star».canonicalName = "\\star"
- SurfaceTLAPlus.InfixOperator.«\bigcirc».canonicalName = "\\bigcirc"
- SurfaceTLAPlus.InfixOperator.«\in».canonicalName = "\\in"
- SurfaceTLAPlus.InfixOperator.«\preceq».canonicalName = "\\preceq"
- SurfaceTLAPlus.InfixOperator.«\prec».canonicalName = "\\prec"
- SurfaceTLAPlus.InfixOperator.«\subseteq».canonicalName = "\\subseteq"
- SurfaceTLAPlus.InfixOperator.«\subset».canonicalName = "\\subset"
- SurfaceTLAPlus.InfixOperator.«\bullet».canonicalName = "\\bullet"
- (SurfaceTLAPlus.InfixOperator.«\cap » x_1).canonicalName = "\\cap"
- SurfaceTLAPlus.InfixOperator.«\propto».canonicalName = "\\propto"
- SurfaceTLAPlus.InfixOperator.«\succeq».canonicalName = "\\succeq"
- SurfaceTLAPlus.InfixOperator.«\succ».canonicalName = "\\succ"
- SurfaceTLAPlus.InfixOperator.«\cdot».canonicalName = "\\cdot"
- SurfaceTLAPlus.InfixOperator.«\simeq».canonicalName = "\\simeq"
- SurfaceTLAPlus.InfixOperator.«\sim».canonicalName = "\\sim"
- SurfaceTLAPlus.InfixOperator.«\ll».canonicalName = "\\ll"
- SurfaceTLAPlus.InfixOperator.«\supseteq».canonicalName = "\\supseteq"
- SurfaceTLAPlus.InfixOperator.«\supset».canonicalName = "\\supset"
- SurfaceTLAPlus.InfixOperator.«\cong».canonicalName = "\\cong"
- SurfaceTLAPlus.InfixOperator.«\sqcap».canonicalName = "\\sqcap"
- (SurfaceTLAPlus.InfixOperator.«\cup » x_1).canonicalName = "\\cup"
- (SurfaceTLAPlus.InfixOperator.«\o » x_1).canonicalName = "\\o"
- SurfaceTLAPlus.InfixOperator.«\sqcup».canonicalName = "\\sqcup"
- SurfaceTLAPlus.InfixOperator.«\div».canonicalName = "\\div"
- SurfaceTLAPlus.InfixOperator.«\sqsubseteq».canonicalName = "\\sqsubseteq"
- SurfaceTLAPlus.InfixOperator.«\sqsubset».canonicalName = "\\sqsubset"
- SurfaceTLAPlus.InfixOperator.«\uplus».canonicalName = "\\uplus"
- SurfaceTLAPlus.InfixOperator.«\doteq».canonicalName = "\\doteq"
- SurfaceTLAPlus.InfixOperator.«\wr».canonicalName = "\\wr"
- SurfaceTLAPlus.InfixOperator.«\sqsupset».canonicalName = "\\sqsupset"
- SurfaceTLAPlus.InfixOperator.«\notin».canonicalName = "\\notin"
- SurfaceTLAPlus.InfixOperator.«\».canonicalName = "\\"
Instances For
Cartesian product, used to collapse a multi-binder function literal/set-map into a single
fresh tuple binder (see flattenBound/collapseToSingleBinder below). Reused by
Desugarer/PlusCal.lean for multicast's own filter collapse, which builds the same product
out of the filter's components.
Instances For
Substitute every free occurrence of CoreTLAPlus.Expression.var x with e, stopping at any
binder that rebinds x. Used to reconstruct tuple-pattern/multi-binder variables as
projections off a single fresh binder (flattenBound, collapseToSingleBinder).
Substitution rebuilds every node on the path it walks, so each rebuilt node is re-registered
(match_source/@@) at the span the original carried. Skipping that would leave a whole
subtree of the desugared body positionless, and posOf answers for an unregistered node with
an unrelated node's span rather than failing (Common/Position.lean).
The z[i] (1-based, TLA⁺-style) tuple projection — a single index, so no <<…>>
wrapping (wrapIndices below) is needed. Registered at pos, the span of the tuple-pattern
binder this projection was synthesized to replace. Reused by Desugarer/PlusCal.lean, which
rewrites a collapsed multicast filter's component names the same way.
Equations
- SurfaceTLAPlus.tupleProj pos z i = (CoreTLAPlus.Expression.var z @@ pos).fnCall (CoreTLAPlus.Expression.nat (toString (i + 1)) @@ pos) @@ pos
Instances For
f[e₁, …, eₙ]'s/![e₁, …, eₙ]'s indices, collapsed to the single CoreTLAPlus.Expression
fnCall/except take: a lone index (n = 1) stays exactly that, f[e]; more than one becomes
the tuple f[<<e₁, …, eₙ>>]. es is always non-empty by construction of the parser. Reused by
Desugarer/PlusCal.lean for SurfacePlusCal.Ref's own indices.
Equations
- SurfaceTLAPlus.wrapIndices pos [e] = e
- SurfaceTLAPlus.wrapIndices pos x✝ = CoreTLAPlus.Expression.tuple x✝ @@ pos
Instances For
Flatten one already-desugared QuantifierBound into a list of single-variable (name, annotation, domain) bindings, plus how body needs rewriting to still make sense in terms of
those flattened names:
.var ann x domis already single-variable: one binding, no rewriting..vars [(ann₁,x),(ann₂,y),…] dom(\A x, y ∈ S : …) shares one domain across several names: expands to one binding per name, no rewriting..varTuple [(ann₁,x),(ann₂,y),…] dom(\A ⟨x,y⟩ ∈ S : …) is a tuple pattern: collapses to one fresh binding overdom, rewritingbodyto substitute eachx/ywith the corresponding projection out of the fresh variable.
Equations
Instances For
Collapse a list of already-flattened single-variable bindings into exactly one, as required
by CoreTLAPlus's single-binder function literals/set-maps. A single binding needs no change;
multiple bindings x ∈ A, y ∈ B, … collapse to one fresh variable over the Cartesian product
A × B × …, rewriting body to project each original name back out. Not the same
transformation as \A x, y : P's sequential nesting (nestQuantifier below): [x ∈ A, y ∈ B ↦ e] denotes one function over pairs, not a function of functions.
Equations
- One or more equations did not get rendered due to their size.
- SurfaceTLAPlus.collapseToSingleBinder pos [(x, ann, dom)] body = pure (x, ann, dom, body)
- SurfaceTLAPlus.collapseToSingleBinder pos [] body = panicWithPosWithDecl "Desugarer.TLAPlus" "SurfaceTLAPlus.collapseToSingleBinder" 168 12 "unreachable code has been reached"
Instances For
Sequentially nest a list of (name, annotation, domain) bindings into repeated
single-variable quantification: x ∈ A, y ∈ B becomes ∫ x ∈ A : ∫ y ∈ B : body (a true
nesting, unlike collapseToSingleBinder's product collapse).
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- One or more equations did not get rendered due to their size.
- (SurfaceTLAPlus.Declaration.constants vs).desugar = pure (Declaration.constants vs)
- (SurfaceTLAPlus.Declaration.variables vs).desugar = pure (Declaration.variables vs)
- (SurfaceTLAPlus.Declaration.assume e).desugar = Declaration.assume <$> e.desugar
- (SurfaceTLAPlus.Declaration.operator ann x_1 ps e).desugar = Declaration.operator ann x_1 ps <$> e.desugar
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Run expression desugaring against the concrete monad it needs: @'s Reader context,
fresh-name generation, and MonadDiagnostic's error reporting/warning accumulation (instantiated
at DiagT, so a warning survives a later fatal error). No expression-level rule actually emits a
DesugarWarning yet, but the concrete stack stays uniform with Desugarer/PlusCal.lean's
statement-level runDesugarer. The base monad n stays abstract, constrained only to supply the
fresh-name counter (MonadStateOf Nat, which Common/Fresh.lean's MonadFresh instance reads):
the counter belongs to one compile, so the driver owns it (Driver/Modules.lean's DriverState)
rather than this pass pinning a base monad that can reach a process-wide one.
Equations
- mod.runDesugarer = mod.desugar.run none
Instances For
Validate an annotation slot known to be @type-only: must contain only @type, and at most
one, then is replaced by the Typ it names. Shared between the TLA⁺ half below
(stripTLAPlusAnnotations) and Desugarer/PlusCal.lean's equivalent check.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Validate every List Annotation slot reachable from a module's own declarations/expressions
— excluding the embedded PlusCal algorithm, which Desugarer/PlusCal.lean's
SurfacePlusCal.Algorithm.desugar covers separately — must contain only @type, and at most
one (extractType above), and is replaced by the Option Typ it names. Runs after
Module.desugar/runDesugarer, since this check is only meaningful once α is concretely
List Annotation.
DiagT … Id rather than a bare Except, so every diagnostics-producing entry point in the
compiler reports through the same MonadDiagnostic shape — the caller absorbs it with
DiagT.lift, exactly as it already does for parseModule and runDesugarer. This check emits
no warnings today; the List DesugarWarning it pairs against its result is simply always [].