The single shared table of builtin operators — every name builtinContext
(Elaborator/Declarations.lean) and builtinModules (Driver/Builtins.lean) bind, plus the
coercion-only StrToSeq neither binds, keyed by (Origin, name). Pure data with no
Driver/Elaborator dependency, so any pass downstream of type checking can recognize a builtin
call without re-deriving its own string list.
This is the one place the name↔operator wiring is written down: the reserved-temporal-action
check and Typed2Computable's "is this builtin computable?" question both read it from here.
One constructor per literal builtin rather than a lighter category-tagged table: gives
exhaustiveness-checked matches to every downstream consumer, at the cost of hand-duplicating
each name a third time here.
One constructor per name builtinContext/builtinModules bind. Naming mirrors each
operator's own TLA⁺ role, not its surface spelling (eq for =, cup for \cup, …) — see
builtinOpOf? for the spelling↔constructor table itself.
- eq : BuiltinOp
- neq : BuiltinOp
- and : BuiltinOp
- or : BuiltinOp
- implies : BuiltinOp
- iff : BuiltinOp
- neg : BuiltinOp
- inSet : BuiltinOp
- notInSet : BuiltinOp
- subseteq : BuiltinOp
- cup : BuiltinOp
- cap : BuiltinOp
- setMinus : BuiltinOp
- cartesianProduct : BuiltinOp
- domain : BuiltinOp
- enabled : BuiltinOp
- unchanged : BuiltinOp
- always : BuiltinOp
- eventually : BuiltinOp
- prime : BuiltinOp
- strToSeq : BuiltinOp
- plus : BuiltinOp
- minus : BuiltinOp
- times : BuiltinOp
- intDiv : BuiltinOp
- mod : BuiltinOp
- pow : BuiltinOp
- lt : BuiltinOp
- gt : BuiltinOp
- leq : BuiltinOp
- geq : BuiltinOp
- dotdot : BuiltinOp
- natSet : BuiltinOp
- len : BuiltinOp
- head : BuiltinOp
- tail : BuiltinOp
- append : BuiltinOp
- intSet : BuiltinOp
- unaryMinus : BuiltinOp
- isFiniteSet : BuiltinOp
- cardinality : BuiltinOp
- isABag : BuiltinOp
- bagToSet : BuiltinOp
- setToBag : BuiltinOp
- bagIn : BuiltinOp
- emptyBag : BuiltinOp
- bagAdd : BuiltinOp
- bagSub : BuiltinOp
- bagUnion : BuiltinOp
- bagLeq : BuiltinOp
- subBag : BuiltinOp
- bagOfAll : BuiltinOp
- bagCardinality : BuiltinOp
- copiesIn : BuiltinOp
- addressPrec : BuiltinOp
- addressPreceq : BuiltinOp
- addressSucc : BuiltinOp
- addressSucceq : BuiltinOp
- funAsSeq : BuiltinOp
- mkSeq : BuiltinOp
- setAsFun : BuiltinOp
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
Equations
Equations
Equations
- TypedTLAPlus.instBEqBuiltinOp.beq x✝ y✝ = (x✝.ctorIdx == y✝.ctorIdx)
Instances For
The name↔operator table itself, one arm per BuiltinOp constructor (exhaustiveness-checked
by the compiler — a new BuiltinOp constructor with no arm here is a build error, not a silent
gap). none for any Origin not bound by builtinContext/builtinModules.
Equations
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.intrinsic "=") = some TypedTLAPlus.BuiltinOp.eq
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.intrinsic "/=") = some TypedTLAPlus.BuiltinOp.neq
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.intrinsic "/\\") = some TypedTLAPlus.BuiltinOp.and
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.intrinsic "\\/") = some TypedTLAPlus.BuiltinOp.or
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.intrinsic "=>") = some TypedTLAPlus.BuiltinOp.implies
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.intrinsic "<=>") = some TypedTLAPlus.BuiltinOp.iff
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.intrinsic "\\neg") = some TypedTLAPlus.BuiltinOp.neg
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.intrinsic "\\in") = some TypedTLAPlus.BuiltinOp.inSet
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.intrinsic "\\notin") = some TypedTLAPlus.BuiltinOp.notInSet
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.intrinsic "\\subseteq") = some TypedTLAPlus.BuiltinOp.subseteq
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.intrinsic "\\cup") = some TypedTLAPlus.BuiltinOp.cup
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.intrinsic "\\cap") = some TypedTLAPlus.BuiltinOp.cap
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.intrinsic "\\") = some TypedTLAPlus.BuiltinOp.setMinus
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.intrinsic "\\X") = some TypedTLAPlus.BuiltinOp.cartesianProduct
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.intrinsic "DOMAIN") = some TypedTLAPlus.BuiltinOp.domain
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.intrinsic "ENABLED") = some TypedTLAPlus.BuiltinOp.enabled
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.intrinsic "UNCHANGED") = some TypedTLAPlus.BuiltinOp.unchanged
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.intrinsic "[]") = some TypedTLAPlus.BuiltinOp.always
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.intrinsic "<>") = some TypedTLAPlus.BuiltinOp.eventually
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.intrinsic "'") = some TypedTLAPlus.BuiltinOp.prime
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.intrinsic "StrToSeq") = some TypedTLAPlus.BuiltinOp.strToSeq
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.intrinsic name) = none
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Naturals" "+") = some TypedTLAPlus.BuiltinOp.plus
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Naturals" "-") = some TypedTLAPlus.BuiltinOp.minus
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Naturals" "*") = some TypedTLAPlus.BuiltinOp.times
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Naturals" "\\div") = some TypedTLAPlus.BuiltinOp.intDiv
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Naturals" "%") = some TypedTLAPlus.BuiltinOp.mod
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Naturals" "^") = some TypedTLAPlus.BuiltinOp.pow
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Naturals" "<") = some TypedTLAPlus.BuiltinOp.lt
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Naturals" ">") = some TypedTLAPlus.BuiltinOp.gt
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Naturals" "=<") = some TypedTLAPlus.BuiltinOp.leq
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Naturals" ">=") = some TypedTLAPlus.BuiltinOp.geq
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Naturals" "..") = some TypedTLAPlus.BuiltinOp.dotdot
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Naturals" "Nat") = some TypedTLAPlus.BuiltinOp.natSet
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Naturals" name) = none
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Sequences" "Len") = some TypedTLAPlus.BuiltinOp.len
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Sequences" "Head") = some TypedTLAPlus.BuiltinOp.head
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Sequences" "Tail") = some TypedTLAPlus.BuiltinOp.tail
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Sequences" "Append") = some TypedTLAPlus.BuiltinOp.append
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Sequences" name) = none
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Integers" "Int") = some TypedTLAPlus.BuiltinOp.intSet
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Integers" "-.") = some TypedTLAPlus.BuiltinOp.unaryMinus
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Integers" name) = none
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "FiniteSets" "IsFiniteSet") = some TypedTLAPlus.BuiltinOp.isFiniteSet
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "FiniteSets" "Cardinality") = some TypedTLAPlus.BuiltinOp.cardinality
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "FiniteSets" name) = none
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Bags" "IsABag") = some TypedTLAPlus.BuiltinOp.isABag
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Bags" "BagToSet") = some TypedTLAPlus.BuiltinOp.bagToSet
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Bags" "SetToBag") = some TypedTLAPlus.BuiltinOp.setToBag
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Bags" "BagIn") = some TypedTLAPlus.BuiltinOp.bagIn
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Bags" "EmptyBag") = some TypedTLAPlus.BuiltinOp.emptyBag
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Bags" "(+)") = some TypedTLAPlus.BuiltinOp.bagAdd
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Bags" "(-)") = some TypedTLAPlus.BuiltinOp.bagSub
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Bags" "BagUnion") = some TypedTLAPlus.BuiltinOp.bagUnion
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Bags" "\\sqsubseteq") = some TypedTLAPlus.BuiltinOp.bagLeq
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Bags" "SubBag") = some TypedTLAPlus.BuiltinOp.subBag
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Bags" "BagOfAll") = some TypedTLAPlus.BuiltinOp.bagOfAll
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Bags" "BagCardinality") = some TypedTLAPlus.BuiltinOp.bagCardinality
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Bags" "CopiesIn") = some TypedTLAPlus.BuiltinOp.copiesIn
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Bags" name) = none
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Fugue" "\\prec") = some TypedTLAPlus.BuiltinOp.addressPrec
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Fugue" "\\preceq") = some TypedTLAPlus.BuiltinOp.addressPreceq
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Fugue" "\\succ") = some TypedTLAPlus.BuiltinOp.addressSucc
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Fugue" "\\succeq") = some TypedTLAPlus.BuiltinOp.addressSucceq
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Fugue" "FunAsSeq") = some TypedTLAPlus.BuiltinOp.funAsSeq
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Fugue" "MkSeq") = some TypedTLAPlus.BuiltinOp.mkSeq
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Fugue" "SetAsFun") = some TypedTLAPlus.BuiltinOp.setAsFun
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module "Fugue" name) = none
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.free name) = none
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.bound idx) = none
- TypedTLAPlus.builtinOpOf? (TypedTLAPlus.Origin.module mod name) = none
Instances For
builtinOpOf? picks out Nat only at Naturals!Nat.
builtinOpOf? picks out Int only at Integers!Int.
Recognizes e as a builtin call — .opCall (.var _ origin) args where origin hits
builtinOpOf? — returning the operator and its argument list. none for anything else, including
a call to a resolved-but-non-builtin operator/function.
Equations
- ((TypedTLAPlus.Expression.var a origin).opCall args).recognizeBuiltin? = Option.map (fun (x : TypedTLAPlus.BuiltinOp) => (x, args)) (TypedTLAPlus.builtinOpOf? origin)
- x✝.recognizeBuiltin? = none
Instances For
The eight reserved temporal/action operator spellings real TLA⁺ core syntax carries, banned
outright by bare name in WellFormedness/Restrictions.lean's check 3 regardless of whether the
name resolves to anything (a reserved name can never be shadowed by a user declaration, so an
origin-agnostic check is exact). ^+/^*/^# have no typing rule and so no BuiltinOp
constructor above — genuinely unbound, unlike the other five, which double as real builtinOpOf?
entries (.enabled, .unchanged, .always, .eventually, .prime). Kept as a separate list
rather than derived from builtinOpOf?, since the two overlap but aren't the same.