_internal
fx.tc.check._internal: cross-part checker helpers reachable from sibling parts via the self-fixpoint; not part of the stable consumer surface.
checkDescAtAnyLevel
checkDescAtAnyLevel: description checking at any universe level — accepts both primitive VDesc results and encoded VMu descriptions (the VDesc ↔ μ_⊤(descDesc I L) correspondence) and threads the universe level back to the caller for downstream encoding decisions.
checkDescAtAnyLevel : Ctx -> Tm -> Val -> Computation { term; level }
Trusted-annotation fast path: when dTm is a T.mkAnnTrusted
with a complete _descRef, build a canonical description term
directly (skipping the unfolding scan) and reuse the carried
level. Otherwise fall through to inference and dispatch on the
inferred type's tag:
VDesc: the level is already on the type; conv-check that the index type matchesiTyValand forward.VMu: the description is encoded — scan a bounded list of candidate universe levels (the prelude exercisesL = 0..3) and askconvwhetherV.vDesc lev iTyValunifies with the inferred type. Conv fires the symmetricVDesc ↔ VMuunfolding internally (same mechanism asconv.nix:344-355).- Anything else: emit a
typeError— not a description.
Used by desc-con checking (check.nix) for _descConCert
validation, by infer.nix for desc-ind motive and branch
checking, and by type.nix:mu to thread the description level
into the μ type's universe level.
checkMotive
checkMotive: eliminator-motive validation — walks the lambda layers of a motive against an expected domain chain D_1 → … → D_n → U(k) and returns the elaborated motive term together with the universe level k of its codomain.
checkMotive : Ctx -> Tm -> Chain -> Comp { term; level }
The domain chain is a { head : Val; tail : Val → Chain } | null
sequence so each layer's domain may depend on the previously-bound
value (required by desc-ind, whose motive is
(i : I) → μ D i → U(k)). 1-argument call sites use the
singleton helper to build a one-element chain.
- Lambda motive: extend the context with the current layer's
domain, recurse into the body with
chain.tail freshV, and wrap the result inT.mkLam. The level threads up unchanged through each lam wrapper so the innermost codomain's universe flows back to eliminators that care about it (e.g.,desc-ind'sallTy). - Non-lambda motive: fall through to
infer, then walk the inferred Π-chain in lock-step with the expectedchain, conv-checking each domain and instantiating each codomain through a fresh variable. The innermost codomain must be a universe; its level is the motive's level.
Failure modes emit D.mkKernelError under the P.Motive position
for the diagnostic renderer. Cross-ref: singleton for the
unary-chain helper, infer for the synthesis fallback,
checkTypeLevel for the innermost-universe leaf.
singleton
singleton: build a one-element motive chain — { head = dom; tail = _: null; } — the trivial telescope used by checkMotive call sites with a single domain and no nested binder dependency.
singleton : Val -> Chain
The motive chain consumed by checkMotive is a nested
{ head : Val; tail : Val → Chain } | null structure so each
layer's domain may depend on prior binder values. Most
eliminator sites (Sum, Eq, Squash) have only one motive
argument and no inter-binder dependency; singleton dom packs
that into the chain shape with a constant tail that ignores
its argument and returns null — closing the chain after a
single layer.