For the families I of one mutual component, direct occurrences pass only at positive sign with an open ancestry flag. Function domains reverse sign and block recursive occurrences: 𝐷∈I𝜖=+𝛿=𝗈𝗉𝖾𝗇I∩Fam(⃗𝐴)=∅I;𝜖;𝛿⊢𝐷⃗𝐴𝗉𝗈𝗌,I;−𝜖;𝖻𝗅𝗈𝖼𝗄𝖾𝖽⊢𝐴𝗉𝗈𝗌I;𝜖;𝛿⊢𝐵𝗉𝗈𝗌I;𝜖;𝛿⊢∏𝑥:𝐴𝐵𝗉𝗈𝗌. An external type-level application 𝐻⃗𝑎, including a local type-family variable or a family accepted earlier, passes at either sign exactly when its head and arguments are block-family-free; a covariant occurrence such as 𝖫𝗂𝗌𝗍(𝐷) is positive but needs an 𝖠𝗅𝗅 combinator the target does not have. Identity 𝖨𝖽𝐵(𝑢,𝑣) and primitive 𝖵𝖾𝖼(𝐵,𝑛) pass exactly when all displayed type and term arguments are block-family-free. A type-level eliminator or projection headed by 𝗂𝗇𝖽𝟐, 𝗂𝗇𝖽ℕ, 𝖩, 𝗏𝗂𝗇𝖽, 𝗉𝗋1, or 𝗉𝗋2 passes exactly when all its immediate subterms are block-family-free; the checker does not reduce that head. A strict lift passes when its argument passes at the same state. The Kappa companion of chapter 122 implements only the five-node subgrammar through external-head application, not these identity, vector, opaque-elimination, or lift clauses.
Every accepted binder 𝑥:𝐴 contributes the hypothesis type. For a pair type ∑𝑦:𝐵𝐴′, choose 𝑤∉FV(𝐵)∪FV(𝐴′)∪FV(⃗𝑃)∪{𝑥,𝑦}, and put 𝜎𝑥:=[𝜋1𝑥/𝑦,𝜋2𝑥/𝑤]: H⃗𝑃(𝐴,𝑥):=𝟏(nofamilyofIin𝐴),H⃗𝑃(𝐷𝑡⃗𝑝⃗𝑣,𝑥):=𝑃𝑡⃗𝑝⃗𝑣𝑥,H⃗𝑃(∏𝑦:𝐵𝐴′,𝑥):=∏𝑦:𝐵H⃗𝑃(𝐴′,𝑥𝑦),H⃗𝑃(∑𝑦:𝐵𝐴′,𝑥):=H⃗𝑃(𝐵,𝜋1𝑥)×H⃗𝑃(𝐴′,𝑤)[𝜎𝑥],H⃗𝑃(𝖫𝗂𝖿𝗍𝑢𝐴,𝑥):=H⃗𝑃(𝐴,𝑥), so a field of type ℕ→𝐷 receives (𝑦:ℕ)→𝑃𝐷(𝑥𝑦) rather than nothing. The Π clause is legitimate only because 𝐵 was checked at negative sign, hence cannot mention the block.
The computation rule also needs a generated term of that type. With the simultaneous eliminators in scope, define 𝗂𝗁⃗𝑃(𝐴,𝑥):=⋆(𝐴isfamily-free),𝗂𝗁⃗𝑃(𝐷𝑡⃗𝑝⃗𝑣,𝑥):=𝗂𝗇𝖽𝑡(⃗𝑝,⃗𝑣,𝑥),𝗂𝗁⃗𝑃(∏𝑦:𝐵𝐴′,𝑥):=𝜆𝑦.𝗂𝗁⃗𝑃(𝐴′,𝑥𝑦),𝗂𝗁⃗𝑃(∑𝑦:𝐵𝐴′,𝑥):=(𝗂𝗁⃗𝑃(𝐵,𝜋1𝑥),𝗂𝗁⃗𝑃(𝐴′,𝑤)[𝜎𝑥]),𝗂𝗁⃗𝑃(𝖫𝗂𝖿𝗍𝑢𝐴,𝑥):=𝗂𝗁⃗𝑃(𝐴,𝑥). The family-free clause takes precedence. The nonpositive-family-free lemma ensures that the recursive calls in the function clause are made only beneath an accepted family-free domain.
Strict positivity is a premise of Block-I, not only a source-side filter. Without it a field of type 𝐷⃗𝑝⃗𝑖→ℕ would be admitted, and blindly applying the function clause would yield ∏𝑦:𝐷⃗𝑝⃗𝑖𝟏, a hypothesis quantifying over the family being defined. The hypothesis recursion is total only on accepted binder types.
Datatype rejection returns 𝖣𝖺𝗍𝖺𝖱𝖾𝗃𝖾𝖼𝗍(𝜙,𝐷𝑟,𝑐𝑠,𝜔,𝐸,𝑂) from definition 122.5. Phase order, declaration order, binder order, and type-preorder make the record deterministic; its expected and observed fields name the exact failed rule premise.
The component is formed simultaneously. Given its motives and one method per constructor, Tfam-block supplies 𝗂𝗇𝖽𝑟:(⃗𝑝:Δ𝑝)(⃗𝑖:Δ𝑟)(𝑧:𝐷𝑟⃗𝑝⃗𝑖)→𝑃𝑟⃗𝑝⃗𝑖𝑧 and, for every constructor 𝑐𝑠, the rule 𝗂𝗇𝖽𝑟𝑠(⃗𝑝,⃗𝑢𝑠,𝑐𝑠(⃗𝑧))≡𝑏𝑠(⃗𝑧,⃗𝑧𝗂𝗁)(𝐵𝑙𝑜𝑐𝑘−𝑐𝑜𝑚𝑝). Here ⃗𝑧𝗂𝗁 inserts 𝗂𝗁⃗𝑃(𝐴,𝑧) immediately after every field 𝑧:𝐴 whose type mentions the block, including function- and pair-nested occurrences. Writing 𝗅𝖾𝗏(Δ) for the maximum universe inhabited by a binder type in Δ, the generated eliminator package has level max(𝗅𝖾𝗏(Δ𝑝),max𝑟𝗅𝖾𝗏(Δ𝑟),max𝑠𝗅𝖾𝗏(Θ𝑠),max𝑟ℓ𝑟,max𝑟𝑘𝑟). The encoded empty target has the independent fixed definition and typing 𝖤𝗆𝗉𝗍𝗒𝖳𝗂𝗆𝗉𝗅:=∏𝑋:U0𝑋:U1. No-confusion is stated at one index instance. For ⃗ı:Δ𝑟 and arguments with ⃗𝑢𝑠[⃗𝑎]≡⃗ı≡⃗𝑢𝑡[⃗𝑏], distinct constructor tags eliminate 𝖨𝖽𝐷𝑟⃗𝑝⃗ı(𝑐𝑠(⃗𝑎),𝑐𝑡(⃗𝑏)) into 𝖤𝗆𝗉𝗍𝗒𝖳𝗂𝗆𝗉𝗅; equal tags produce ⃗𝑎≡Θ𝑠⃗𝑏, the homogeneous telescopic equality of their arguments. Without the index premise the identity type is not well formed, because the two constructor applications need not inhabit the same type.
Certified recursive calls
A structural certificate is 𝑢∈𝖢𝗁𝗂𝗅𝖽(𝑥)Θ;𝑥⊢𝑢𝖽𝖾𝗌𝖼𝑥. A structural component over a mutual block B=(𝐷1,…,𝐷𝑟) at common parameters ⃗𝑝 stores, independently of the 𝑞 functions, a family map 𝜅:𝖥𝗂𝗇𝗂𝗇𝖽(𝑞)→𝖥𝗂𝗇𝗂𝗇𝖽(𝑟). Only this discipline has 𝜅. It uses the total-space carrier 𝐿B:=max(0,max𝑙𝗅𝖾𝗏(Δ𝑙),max𝑙ℓ𝑙),𝖯𝖺𝗒𝗅𝗈𝖺𝖽B(𝑙):=∑⃗ı:Δ𝑙𝐷𝑙⃗𝑝⃗ı:U𝐿B, where the payload family is defined by the dependent eliminator for 𝖥𝗂𝗇𝗂𝗇𝖽(𝑟), inserting strict lifts into the common universe when required. Then 𝖢𝖺𝗋𝗋𝗂𝖾𝗋B(⃗𝑝):=∑𝑙:𝖥𝗂𝗇𝗂𝗇𝖽(𝑟)𝖯𝖺𝗒𝗅𝗈𝖺𝖽B(𝑙):U𝐿B and the uniform relation generated by 𝖼𝗁𝗂𝗅𝖽𝑐,𝑟:𝖣𝖢𝗁𝗂𝗅𝖽B((𝑘,(⃗ȷ,𝑥𝑟)),(𝑙,(⃗ı,𝑐⃗𝑥))) for each recursive field 𝑥𝑟:𝐷𝑘⃗𝑝⃗ȷ of a constructor 𝑐:Θ→𝐷𝑙⃗𝑝⃗ı. The stored 𝑢∈𝖢𝗁𝗂𝗅𝖽(𝑥) certificate selects one such generator after the leaf substitution. Thus the tagged call relation is defined uniformly on all inputs, rather than by a leaf-specific child set. This relation is a nonrecursive Timpl-data block at 𝐾B=max(𝗅𝖾𝗏(Δ𝑝),𝐿B,max𝑠𝗅𝖾𝗏(Θ𝑠)), the maximum emitted by definition 122.13; its constructor telescopes contain no occurrence of the relation, so positivity accepts it. A primitive structural component uses either 𝖼𝗁𝗂𝗅𝖽𝗌𝗎𝖼:𝖣𝖢𝗁𝗂𝗅𝖽ℕ(𝑛,𝗌𝗎𝖼𝑛) or, at fixed 𝑐, 𝖼𝗁𝗂𝗅𝖽𝗏𝖼𝗈𝗇𝗌:𝖣𝖢𝗁𝗂𝗅𝖽𝖵𝖾𝖼(𝑐,−)((𝑛,𝑥𝑠),(𝗌𝗎𝖼𝑛,𝗏𝖼𝗈𝗇𝗌(𝑛,𝑎,𝑥𝑠))). Accessibility follows from mutual block induction, Nat-elim, or Vec-elim, respectively. The three carriers and state-constructor maps are 𝑆𝑋𝑆𝜇𝑆𝑖(⃗𝑎)B𝖢𝖺𝗋𝗋𝗂𝖾𝗋B(⃗𝑝)𝜄𝜅(𝑖)(𝑎𝑝𝑖)ℕℕ𝑎𝑝𝑖𝖵𝖾𝖼(𝑐,−)∑𝑛:ℕ𝖵𝖾𝖼(𝑐,𝑛)(𝑛𝑖(⃗𝑎),𝑎𝑝𝑖). For the one discipline chosen by the component, 𝗂𝗇𝑗(⃗𝑏)𝑅𝑆𝗂𝗇𝑖(⃗𝑎):=𝖣𝖢𝗁𝗂𝗅𝖽𝑆(𝜇𝑆𝑗(⃗𝑏),𝜇𝑆𝑖(⃗𝑎)). A structural component fixes one common block parameter vector, or one common vector element code. It never coerces a primitive carrier into the mutual block carrier. A lexicographic certificate selects the least 𝑘 for which 𝑎ℎ≡𝑏ℎ for ℎ<𝑘 and 𝑏𝑘𝑅𝑘𝑎𝑘. The compiled body replaces a call at ⃗𝑏 by the accessibility recursor hypothesis applied to this stored predecessor proof. Rejection returns 𝖱𝖾𝖼𝖱𝖾𝗃𝖾𝖼𝗍(𝑆,𝑓𝑖→𝑓𝑗,𝜔,𝛿,⃗𝑎,⃗𝑏,𝐹) from definition 123.5. The record names the first internal call without a complete direct-child or least-coordinate predecessor proof and stores the failed comparison rather than a fixture-specific message. For each recursive component 𝑆, compilation first generates the nonrecursive Timpl-data block 𝖲𝗍𝖺𝗍𝖾𝑆:Uℓ,𝗂𝗇𝑖:(⃗𝑎:Δ𝑖)→𝖲𝗍𝖺𝗍𝖾𝑆(𝑓𝑖∈𝑆). No constructor argument mentions the generated family, so positivity accepts the block. The relation 𝑅𝑆 and the accessibility recursor range over these state constructors; the generated signature is program data, not a Timpl-rec-core rule. For accepted groups, the signature ΣG contains every fixed Timpl contraction and every generated Block-comp equation used by its clause trees and state blocks. The source program root families are those contractions and R-Call. The target replaces R-Call by the C-Call macro whose deterministic nonempty raw-core expansion is the outer definition beta prefix, generated state-block step, WF-𝛽, and the compiler’s administrative beta prefix. Their dynamic compatible contexts do not enter compiler-generated accessibility proofs, predecessor certificates, or conversion witnesses. Nor are fixed-kernel contractions inside a compiler-marked C-Call administrative region independent target program roots; the macro schedules that whole region atomically. Then 𝑡⇓𝖱𝑣 and 𝑡⇓𝖱𝖢𝑣 are finite closures of the respective program steps to a closed constructor normal form. Root-step correspondence treats a fixed contraction, generated block computation, and the R-Call/C-Call pair separately; dynamic-context and finite-closure induction give lemma 123.17, lemma 123.18.
Guarded stream groups
Each finite group fixes one element type 𝐴, and all its declarations have codomain 𝖲𝗍𝗋𝖾𝖺𝗆(𝐴); heterogeneous streams are checked as separate groups. This side condition is what gives coiterator elaboration one map ℎ:𝖲𝗍𝖺𝗍𝖾G→𝐴, where the compiler generates 𝖲𝗍𝖺𝗍𝖾G with one constructor 𝗂𝗇𝑖:(⃗𝑎:Δ𝑖)→𝖲𝗍𝖺𝗍𝖾G per declaration. The state block is nonrecursive and accepted by Timpl-data. An edge 𝑓𝑘→𝑔 records that 𝑘 tail observations have been discharged before the call. The card’s two right-side forms make 𝑘 total and confine it to {0,1}: a head alias emits 0 and a tail step emits 1. A group passes exactly when its zero-weight subgraph is acyclic, which for these weights coincides with every cycle having positive total weight. Each binder retains its inherited Timpl relevance mark. For closed ⋅⊢𝑡:𝐴, group-free subevaluation is defined by the extended typed NbE normalizer: 𝑡⇓𝖳𝑛⟺𝑛=nf𝐴Σ,⋅(𝑡). Its result is the unique typed 𝛽𝜂-long normal form. The optional call-by-value implementation layer 𝑡⇓𝖳,𝖼𝖻𝗏𝑣 is T-Val–T-Vec-Cons, beginning with 𝑋𝑣⇓𝖳,𝖼𝖻𝗏𝑣T−Val,𝑓⇓𝖳,𝖼𝖻𝗏𝜆𝜖,𝗋𝗎𝗇𝗍𝗂𝗆𝖾(𝑥:𝐴).𝑏𝑎⇓𝖳,𝖼𝖻𝗏𝑣𝑎𝑏[𝑣𝑎/𝑥]⇓𝖳,𝖼𝖻𝗏𝑣𝑓𝜖,𝗋𝗎𝗇𝗍𝗂𝗆𝖾𝑎⇓𝖳,𝖼𝖻𝗏𝑣T−App−R,𝑓⇓𝖳,𝖼𝖻𝗏𝜆𝜖,𝖾𝗋𝖺𝗌𝖾𝖽(𝑥:𝐴).𝑏𝑏[𝑎/𝑥]⇓𝖳,𝖼𝖻𝗏𝑣𝑓𝜖,𝖾𝗋𝖺𝗌𝖾𝖽𝑎⇓𝖳,𝖼𝖻𝗏𝑣T−App−E. It contains T-Pair, T-Fst, and T-Snd with the exact premises 𝑎⇓𝖳,𝖼𝖻𝗏𝑣𝑎𝑏⇓𝖳,𝖼𝖻𝗏𝑣𝑏(𝑎,𝑏)⇓𝖳,𝖼𝖻𝗏(𝑣𝑎,𝑣𝑏)T−Pair𝑠⇓𝖳,𝖼𝖻𝗏(𝑣𝑎,𝑣𝑏)𝗉𝗋1(𝑠)⇓𝖳,𝖼𝖻𝗏𝑣𝑎T−Fst𝑠⇓𝖳,𝖼𝖻𝗏(𝑣𝑎,𝑣𝑏)𝗉𝗋2(𝑠)⇓𝖳,𝖼𝖻𝗏𝑣𝑏T−Snd. For field mark 𝜅𝑖, put ̂𝑎𝑖=𝑣𝑖 with premise 𝑎𝑖⇓𝖳,𝖼𝖻𝗏𝑣𝑖 when it is runtime, and put ̂𝑎𝑖=𝑎𝑖 when it is erased. Then (𝑎𝑖⇓𝖳,𝖼𝖻𝗏𝑣𝑖)𝜅𝑖=𝗋𝗎𝗇𝗍𝗂𝗆𝖾𝑐(⃗𝑎)⇓𝖳,𝖼𝖻𝗏𝑐(̂⃗𝑎)T−Con.𝑒⇓𝖳,𝖼𝖻𝗏𝑐𝑘(̂⃗𝑎)𝑒𝑘[̂⃗𝑎/⃗𝑥𝑘]⇓𝖳,𝖼𝖻𝗏𝑣𝖼𝖺𝗌𝖾𝑒𝗈𝖿{𝑐𝑗(⃗𝑥𝑗)⇒𝑒𝑗}𝑗⇓𝖳,𝖼𝖻𝗏𝑣T−Case. The Boolean rules are 𝑏⇓𝖳,𝖼𝖻𝗏𝗍𝗍𝑒𝑡⇓𝖳,𝖼𝖻𝗏𝑣𝗂𝗇𝖽𝟐(𝑥.𝐶;𝑒𝑡,𝑒𝑓,𝑏)⇓𝖳,𝖼𝖻𝗏𝑣T−Bool−T.𝑏⇓𝖳,𝖼𝖻𝗏𝖿𝖿𝑒𝑓⇓𝖳,𝖼𝖻𝗏𝑣𝗂𝗇𝖽𝟐(𝑥.𝐶;𝑒𝑡,𝑒𝑓,𝑏)⇓𝖳,𝖼𝖻𝗏𝑣T−Bool−F. Put 𝑁𝐶(𝑒0,𝑒𝑠;𝑚):=𝐼𝐶(𝑒0;𝑛𝜚𝑛.𝑟𝜚𝑟.𝑒𝑠;𝑚). The natural-number rules are 𝑚⇓𝖳,𝖼𝖻𝗏𝟢𝑒0⇓𝖳,𝖼𝖻𝗏𝑣𝑁𝐶(𝑒0,𝑒𝑠;𝑚)⇓𝖳,𝖼𝖻𝗏𝑣T−Nat−Z𝑚⇓𝖳,𝖼𝖻𝗏𝗌𝗎𝖼(𝑣𝑛)𝑁𝐶(𝑒0,𝑒𝑠;𝑣𝑛)⇓𝖳,𝖼𝖻𝗏𝑣𝑟𝑒𝑠[𝑣𝑛/𝑛,𝑣𝑟/𝑟]⇓𝖳,𝖼𝖻𝗏𝑣𝑁𝐶(𝑒0,𝑒𝑠;𝑚)⇓𝖳,𝖼𝖻𝗏𝑣T−Nat−S. Identity elimination has the rule 𝑒𝑞⇓𝖳,𝖼𝖻𝗏𝗋𝖾𝖿𝗅𝑣𝑞𝑒𝑟[𝑎/𝑧]⇓𝖳,𝖼𝖻𝗏𝑣𝖩𝐴;𝑎;𝑏(𝑥.𝑦.𝑝.𝐶;𝑧𝜚𝑧.𝑒𝑟;𝑒𝑞)⇓𝖳,𝖼𝖻𝗏𝑣T−J. The vector rules are 𝑚⇓𝖳,𝖼𝖻𝗏𝟢𝑦𝑠⇓𝖳,𝖼𝖻𝗏𝗏𝗇𝗂𝗅𝑒0⇓𝖳,𝖼𝖻𝗏𝑣𝗏𝗂𝗇𝖽(𝑃;𝑒0;𝑛𝜚𝑛.𝑎𝜚𝑎.𝑥𝑠.𝑟𝜚𝑟.𝑒𝑠;𝑚,𝑦𝑠)⇓𝖳,𝖼𝖻𝗏𝑣T−Vec−Nil𝑚⇓𝖳,𝖼𝖻𝗏𝗌𝗎𝖼(𝑣𝑛)𝑦𝑠⇓𝖳,𝖼𝖻𝗏𝗏𝖼𝗈𝗇𝗌(𝑣𝑛,𝑣𝑎,𝑣𝑥𝑠)𝗏𝗂𝗇𝖽(𝑃;𝑒0;𝑛𝜚𝑛.𝑎𝜚𝑎.𝑥𝑠.𝑟𝜚𝑟.𝑒𝑠;𝑣𝑛,𝑣𝑥𝑠)⇓𝖳,𝖼𝖻𝗏𝑣𝑟𝑒𝑠[𝑣𝑛/𝑛,𝑣𝑎/𝑎,𝑣𝑥𝑠/𝑥𝑠,𝑣𝑟/𝑟]⇓𝖳,𝖼𝖻𝗏𝑣𝗏𝗂𝗇𝖽(𝑃;𝑒0;𝑛𝜚𝑛.𝑎𝜚𝑎.𝑥𝑠.𝑟𝜚𝑟.𝑒𝑠;𝑚,𝑦𝑠)⇓𝖳,𝖼𝖻𝗏𝑣T−Vec−Cons. There is no T-Call rule. The implementation card is not the meaning of ⇓𝖳. The accepted NbE normalizer is extended declaration-by-declaration with the nonrecursive Timpl-data constructor, neutral-eliminator, and Block-comp cases. It satisfies 𝑡⇓𝖳,𝖼𝖻𝗏𝑣⟹nf(𝑡)=nf(𝑣)and𝑡⇓𝖳nf(𝑣), whereas 𝑡⇓𝖳𝑛 always returns 𝑛=nf(𝑡). Soundness, completeness, stability, substitution, and the implementation bridge are lemma 124.3. The function 𝗉𝗋𝖾𝗉Δ(⃗𝑎) processes a dependent tuple in telescope order. It normalizes a runtime component as demanded subevaluation and canonicalizes an erased component statically with the same typed normalizer; both results are substituted into later components. No runtime CBV frame forces an erased component. Its clauses are 𝗉𝗋𝖾𝗉⋅(⋅)=⋅,𝗉𝗋𝖾𝗉Δ,𝑥𝗋𝗎𝗇𝗍𝗂𝗆𝖾:𝐴(⃗𝑎,𝑏)=(⃗𝑣,𝑤)if𝗉𝗋𝖾𝗉Δ(⃗𝑎)=⃗𝑣and𝑏[⃗𝑣/⃗𝑥]⇓𝖳𝑤,𝗉𝗋𝖾𝗉Δ,𝑥𝖾𝗋𝖺𝗌𝖾𝖽:𝐴(⃗𝑎,𝑏)=(⃗𝑣,𝑛)if𝗉𝗋𝖾𝗉Δ(⃗𝑎)=⃗𝑣and𝑛=nf𝐴[⃗𝑣/⃗𝑥]Σ,⋅(𝑏[⃗𝑣/⃗𝑥]). The big-step rules are 𝛿𝖼𝗈(𝑓𝑖)=(Δ𝑖;𝑡;𝑒𝑡)𝗉𝗋𝖾𝗉Δ𝑖(⃗𝑎)=⃗𝑎𝑣𝑡[⃗𝑎𝑣/⃗𝑥]⇓𝖳𝑣𝗁𝖾𝖺𝖽(𝑓𝑖⃗𝑎)⇓𝑣Co−Head−Producer,𝛿𝖼𝗈(𝑓𝑖)=(Δ𝑖;𝗁𝖾𝖺𝖽(𝑔⃗𝑢);𝑒𝑡)𝗉𝗋𝖾𝗉Δ𝑖(⃗𝑎)=⃗𝑎𝑣𝗉𝗋𝖾𝗉Δ𝑔(⃗𝑢[⃗𝑎𝑣/⃗𝑥])=⃗𝑏𝗁𝖾𝖺𝖽(𝑔⃗𝑏)⇓𝑣𝗁𝖾𝖺𝖽(𝑓𝑖⃗𝑎)⇓𝑣Co−Head−Alias,𝛿𝖼𝗈(𝑓𝑖)=(Δ𝑖;𝑒ℎ;𝑔⃗𝑢)𝗉𝗋𝖾𝗉Δ𝑖(⃗𝑎)=⃗𝑎𝑣𝗉𝗋𝖾𝗉Δ𝑔(⃗𝑢[⃗𝑎𝑣/⃗𝑥])=⃗𝑏𝗍𝖺𝗂𝗅(𝑓𝑖⃗𝑎)⇓𝑔⃗𝑏Co−Tail−Unfold. A closed well-typed group-free tuple has a unique prepared form by lemma 124.3. Preparation composes with group-free simultaneous substitution and is idempotent on prepared tuples; these are lemma 124.12, lemma 124.13. Those two facts justify alias resolution and the generalized induction step in the source/coiterator simulation. A bare stream call has no eager unfolding rule. Observation words and their path rules are 𝑜::=𝗁𝖾𝖺𝖽∣𝗍𝖺𝗂𝗅⋅𝑜,𝗁𝖾𝖺𝖽(𝑠)⇓𝑣𝑠⇓𝗁𝖾𝖺𝖽𝑣, and 𝗍𝖺𝗂𝗅(𝑠)⇓𝑠′𝑠′⇓𝑜𝑣𝑠⇓𝗍𝖺𝗂𝗅⋅𝑜𝑣. Coiterator elaboration computes by 𝗁𝖾𝖺𝖽(𝖼𝗈𝗂𝗍𝖾𝗋(ℎ,𝑡,𝑠))⇝0ℎ(𝑠),𝗍𝖺𝗂𝗅(𝖼𝗈𝗂𝗍𝖾𝗋(ℎ,𝑡,𝑠))⇝0𝖼𝗈𝗂𝗍𝖾𝗋(ℎ,𝑡,𝑡(𝑠)). Its normalizer-defined state-strict evaluation rules are 𝑠⇓𝖳𝑠𝑣ℎ(𝑠𝑣)⇓𝖳𝑣𝗁𝖾𝖺𝖽(𝖼𝗈𝗂𝗍𝖾𝗋(ℎ,𝑡,𝑠))⇓𝑣Coiter−Head and 𝑠⇓𝖳𝑠𝑣𝑡(𝑠𝑣)⇓𝖳𝑠′𝑣𝗍𝖺𝗂𝗅(𝖼𝗈𝗂𝗍𝖾𝗋(ℎ,𝑡,𝑠))⇓𝖼𝗈𝗂𝗍𝖾𝗋(ℎ,𝑡,𝑠′𝑣)Coiter−Tail.
Dependent copattern frontiers
For a row map ̂𝜌𝑟:Θ𝑟→Δ, static acceptance checks Θ𝑟⊢𝑒𝑟:𝐴𝑗𝑟[𝑑@Δ̂𝜌𝑟/𝑧][⃗𝑢𝑟,<𝑗𝑟/⃗𝜋<𝑗𝑟]. Closed right sides use 𝑤::=𝑣∣𝑑′⃗𝑎 and 𝑒containsnocalltothecopatterngroup𝑒⇓𝖳𝑣𝑒⇓𝖢𝑣Copat−Result−Val,𝑑′:(Δ′)→𝑅⃗𝑝⃗ı′(𝑏𝑙⇓𝖳𝑎𝑙)𝑙∈Δ′𝑑′@Δ′⃗𝑏⇓𝖢𝑑′@Δ′⃗𝑎Copat−Result−Rec. The least matching row for one demanded field is selected only at a closed well-typed ready tuple, using the matching relation of definition 121.6: ⃗𝑎isclosed,welltyped,andready𝗆𝖺𝗍𝖼𝗁𝖾𝗌(⃗𝑝𝑟,⃗𝑎,𝜃𝑟)(∄𝜃𝑞.𝗆𝖺𝗍𝖼𝗁𝖾𝗌(⃗𝑝𝑞,⃗𝑎,𝜃𝑞))𝑞<𝑟,𝑗𝑞=𝑗𝑟𝑒𝑟𝜃𝑟⇓𝖢𝑤𝑑⃗𝑎⇓𝜋𝑗𝑟𝑤Copat−Row. Longer source paths are generated only through a recursive field: 𝑗∈𝑁𝑠⇓𝜋𝑗𝑠′𝑠′⇓𝑜𝑣𝑠⇓𝜋𝑗⋅𝑜𝑣Copat−Path−Step. An unrelated record-valued nonrecursive field ends a path in this card. The intermediate case-tree relation, also restricted to closed ready tuples, is generated by 𝑄𝑗[⃗𝑎/Δ]⇓𝑤𝖿𝗂𝖾𝗅𝖽𝗌{𝜋𝑙(⃗𝑢<𝑙)⇒𝑄𝑙}𝑙(⃗𝑎)⇓𝜋𝑗𝑤Tree−Field,𝑎𝑥⇓𝖳𝑐𝑘(⃗𝑣)𝑄𝑘[⃗𝑣/⃗𝑦𝑘]⇓𝑤𝗌𝗉𝗅𝗂𝗍(𝑥;{𝑐𝑙(⃗𝑦𝑙)⇒𝑄𝑙}𝑙)[⃗𝑎]⇓𝑤Tree−Split,𝑒𝜎⇓𝖢𝑤𝗅𝖾𝖺𝖿(𝑟,𝜎,𝑒)⇓𝑤Tree−Leaf. For the tree 𝑄𝑑 generated for declaration 𝑑, recursive paths use 𝑗∈𝑁𝑄𝑑(⃗𝑎)⇓𝜋𝑗𝑑′⃗𝑏𝑄𝑑′(⃗𝑏)⇓𝑜𝑣𝑄𝑑(⃗𝑎)⇓𝜋𝑗⋅𝑜𝑣Tree−Path−Step. At field 𝜋𝑗, a typed frontier records all earlier field terms: Θ∣𝑧:𝑅⃗𝑝⃗𝑖∣𝜋1(𝑧)=𝑢1,…,𝜋𝑗−1(𝑧)=𝑢𝑗−1⊢𝜋𝑗(𝑧):𝐴𝑗[⃗𝑢/⃗𝜋]. Input splits transport this whole telescope by their dependency-preserving substitution. A complete field spine becomes one sequential Rec-Corec method tuple in the same order. Set 𝑘G:=max(𝗅𝖾𝗏(Δ𝑖),max𝑑∈G𝗅𝖾𝗏(Δ𝑑(⃗ı))). The compiler generates the indexed Timpl-data family 𝖲𝗍𝖺𝗍𝖾G:(⃗ı:Δ𝑖)→U𝑘G,𝗂𝗇𝑑:(⃗ı:Δ𝑖)(⃗𝑎:Δ𝑑(⃗ı))→𝖲𝗍𝖺𝗍𝖾G(⃗ı). The maximum is the universe constraint supplied to the level solver. It covers every index and constructor telescope, and the family occurs in none of them, so Timpl-data formation and positivity accept the block. Abbreviate this family by 𝑆. A recursive leaf 𝑑′@Δ𝑑′(⃗ı𝑗)⃗𝑏 translates to 𝗂𝗇𝑑′(⃗ı𝑗,‖⃗𝑏‖):𝑆⃗ı𝑗. The Rec-Corec extension is checked transactionally. First place the method-independent declaration 𝖼𝗈𝗋𝖾𝖼𝑅:(⃗ı:Δ𝑖)(𝑠:𝑆⃗ı)→𝑅⃗𝑝⃗ı in a provisional signature. After methods ℎ1,…,ℎ𝑗−1 have checked, define their actual outputs and decoded fields in the context (⃗ı:Δ𝑖)(𝑠:𝑆⃗ı): 𝑧𝑠:=𝖼𝗈𝗋𝖾𝖼𝑅⃗ı𝑠,𝑣𝑙:=ℎ𝑙⃗ı𝑠,¯𝑣𝑙:={𝖼𝗈𝗋𝖾𝖼𝑅⃗ı𝑙𝑣𝑙,𝑙∈𝑁,𝑣𝑙,𝑙∉𝑁. Write 𝜎𝑗:=[¯𝑣1,…,¯𝑣𝑗−1/𝜋1(𝑧𝑠),…,𝜋𝑗−1(𝑧𝑠)].𝐴∗𝑗[⃗ℎ<𝑗]:={𝑆⃗ı𝑗,𝑗∈𝑁,𝐴𝑗[𝑧𝑠/𝑧]𝜎𝑗,𝑗∉𝑁. Thus every self occurrence is instantiated by the generated record, and later dependent fields see the record generated from each actual recursive method output, not the state itself. The sequential check is 𝑋Σ+⊢𝗆𝖾𝗍𝗁𝗈𝖽𝗌𝑆():Φ≤0Corec−Meth−Nil.Σ+⊢𝗆𝖾𝗍𝗁𝗈𝖽𝗌𝑆(⃗ℎ<𝑗):Φ<𝑗Σ+⊢ℎ𝑗:(⃗ı:Δ𝑖)(𝑠:𝑆⃗ı)→𝐴∗𝑗[⃗ℎ<𝑗]Σ+⊢𝗆𝖾𝗍𝗁𝗈𝖽𝗌𝑆(⃗ℎ≤𝑗):Φ≤𝑗Corec−Meth−Snoc. Previously checked method terms are substituted literally. Their beta rules are available, but no coprojection equation is available during method checking. Once the finite sequential judgment succeeds, the constant and the following equations are committed together: 𝜋𝑗(𝖼𝗈𝗋𝖾𝖼𝑅⃗ı𝑠)⇝0ℎ𝑗⃗ı𝑠(𝑗∉𝑁),𝜋𝑗(𝖼𝗈𝗋𝖾𝖼𝑅⃗ı𝑠)⇝0𝖼𝗈𝗋𝖾𝖼𝑅⃗ı𝑗(ℎ𝑗⃗ı𝑠)(𝑗∈𝑁). for a nonrecursive and a recursive field respectively. A recursive method returns a state, never a record; substitution of ¯𝑣𝑙 is what types a later field that mentions that recursive projection. The transaction has the displayed Rec-Corec rule form Σ⊢𝑅𝖼𝖺𝗋𝖽𝗋𝖾𝖼𝗈𝗋𝖽:ΦΣ⊢𝑆:(Δ𝑖)→U𝑘Σ+⊢𝗆𝖾𝗍𝗁𝗈𝖽𝗌𝑆(ℎ1,…,ℎ𝑚):ΦΣ,𝖼𝗈𝗋𝖾𝖼𝑅,(𝐸𝑗)1≤𝑗≤𝑚𝗌𝗂𝗀𝗇𝖺𝗍𝗎𝗋𝖾Rec−Corec, where Σ+ contains the provisional method-independent corecursor and 𝐸𝑗 is the corresponding displayed equation. No conclusion is committed unless every method premise checks.
Consider the legal unindexed fields 𝗅𝖺𝖻𝖾𝗅:𝟐,𝗍𝖺𝗂𝗅:𝑅,𝖿𝗅𝖺𝗀:𝖨𝖽𝟐(𝗅𝖺𝖻𝖾𝗅(𝗍𝖺𝗂𝗅(𝑧)),𝗍𝗍). The earlier projection 𝗅𝖺𝖻𝖾𝗅:𝑅→𝟐 is already in scope when the flag type is formed. Translation gives ¯𝑣2=𝖼𝗈𝗋𝖾𝖼𝑅(ℎ2𝑠),𝐴∗3[ℎ1,ℎ2]=𝖨𝖽𝟐(𝗅𝖺𝖻𝖾𝗅(𝖼𝗈𝗋𝖾𝖼𝑅(ℎ2𝑠)),𝗍𝗍).
The compiled declaration has the exact outer form ‖𝑄𝑑‖=𝜆⃗ı.𝜆⃗𝑎.𝖼𝗈𝗋𝖾𝖼𝑅⃗ı(𝗂𝗇𝑑(⃗ı,⃗𝑎)). For an applied compiled declaration, the deterministic nonempty relation 𝑞⟹𝗂𝗇𝑐 contracts only these outer beta-redexes and stops at the displayed primitive corecursor. It never selects an input branch or row, uses Block-comp, contracts a corecursor projection, or enters a method body. Field selection chooses a method first; that method then runs its own translated input-split tree. The bridge into the distinct target observation is 𝑞⟹𝗂𝗇𝑐𝑐⇓𝖢𝖢𝑜𝑣𝑞⇓𝖢𝖢𝑜𝑣Core−Prepare. For a closed target object 𝑐=𝖼𝗈𝗋𝖾𝖼𝑅⃗ı𝑠, abbreviate 𝑐𝑗(𝑠′)=𝖼𝗈𝗋𝖾𝖼𝑅⃗ı𝑗𝑠′. Then its recursive-field rule is narrow enough to display with the value-field rule: 𝑗∉𝑁𝜋𝑗(𝑐)⇝0𝑒𝑒⇓𝖳𝑣𝑐⇓𝖢𝖢𝜋𝑗𝑣Core−Field−Val,𝑗∈𝑁𝜋𝑗(𝑐)⇝0𝖼𝗈𝗋𝖾𝖼𝑅⃗ı𝑗(ℎ𝑗⃗ı𝑠)ℎ𝑗⃗ı𝑠⇓𝖳𝑠′𝑐⇓𝖢𝖢𝜋𝑗𝑐𝑗(𝑠′)Core−Field−Rec, and Core-Path-Step composes such an observation with a shorter target path only when 𝑗∈𝑁.
Runtime erasure
The exact first-order source phrases are those of definition 126.3: variables, annotated abstractions and applications, dependent pairs and projections, reflexivity, Boolean, natural, identity, and vector elimination, declared constructors and cases, and saturated recursive calls. Recursive declarations are not first class. The relevance judgments begin with
Γ⊢𝑒:𝐴
Γ⊢𝑒𝖾𝗋𝖺𝗌𝖾𝖽
Rel-Erased
𝑥𝗋𝗎𝗇𝗍𝗂𝗆𝖾:𝐴∈Γ
Γ⊢𝑥𝗋𝗎𝗇𝗍𝗂𝗆𝖾
Rel-Var
Γ,𝑥𝗋𝗎𝗇𝗍𝗂𝗆𝖾:𝐴⊢𝑏𝗋𝗎𝗇𝗍𝗂𝗆𝖾
Γ⊢𝜆𝜖,𝗋𝗎𝗇𝗍𝗂𝗆𝖾(𝑥:𝐴).𝑏𝗋𝗎𝗇𝗍𝗂𝗆𝖾
Rel-Lam-R
Γ⊢𝑓𝗋𝗎𝗇𝗍𝗂𝗆𝖾Γ⊢𝑎𝗋𝗎𝗇𝗍𝗂𝗆𝖾
Γ⊢𝑓𝜖,𝗋𝗎𝗇𝗍𝗂𝗆𝖾𝑎𝗋𝗎𝗇𝗍𝗂𝗆𝖾
Rel-App-R
Γ,𝑥𝖾𝗋𝖺𝗌𝖾𝖽:𝐴⊢𝑏𝗋𝗎𝗇𝗍𝗂𝗆𝖾Γ⊢𝑎𝖾𝗋𝖺𝗌𝖾𝖽
Γ⊢𝜆𝜖′,𝖾𝗋𝖺𝗌𝖾𝖽(𝑥:𝐴).𝑏𝜖,𝖾𝗋𝖺𝗌𝖾𝖽𝑎𝗋𝗎𝗇𝗍𝗂𝗆𝖾
Rel-App-E
Rule Rel-App-E accepts only a visible administrative redex; a variable-headed erased application is rejected. Rules Rel-Con, Rel-Case, and Rel-Call require constructor fields, branches, and saturated call inputs at the relevance recorded by the accepted declaration. Dependent pairs, projections, and retained reflexivity are checked by Γ⊢𝑎𝗋𝗎𝗇𝗍𝗂𝗆𝖾Γ⊢𝑏𝗋𝗎𝗇𝗍𝗂𝗆𝖾Γ⊢(𝑎,𝑏)𝗋𝗎𝗇𝗍𝗂𝗆𝖾Rel−PairΓ⊢𝑠𝗋𝗎𝗇𝗍𝗂𝗆𝖾Γ⊢𝗉𝗋1(𝑠)𝗋𝗎𝗇𝗍𝗂𝗆𝖾Rel−FstΓ⊢𝑠𝗋𝗎𝗇𝗍𝗂𝗆𝖾Γ⊢𝗉𝗋2(𝑠)𝗋𝗎𝗇𝗍𝗂𝗆𝖾Rel−SndΓ⊢𝑎:𝐴Γ⊢𝗋𝖾𝖿𝗅𝑎𝗋𝗎𝗇𝗍𝗂𝗆𝖾Rel−Refl. The primitive eliminator rules are Γ⊢𝑏𝗋𝗎𝗇𝗍𝗂𝗆𝖾Γ⊢𝑒𝑡𝗋𝗎𝗇𝗍𝗂𝗆𝖾Γ⊢𝑒𝑓𝗋𝗎𝗇𝗍𝗂𝗆𝖾Γ⊢𝗂𝗇𝖽𝟐(𝑥.𝐶;𝑒𝑡,𝑒𝑓,𝑏)𝗋𝗎𝗇𝗍𝗂𝗆𝖾Rel−Bool−Elim,Γ⊢𝑒0𝗋𝗎𝗇𝗍𝗂𝗆𝖾Γ,𝑛𝜚𝑛:ℕ,𝑟𝜚𝑟:𝐶(𝑛)⊢𝑒𝑠𝗋𝗎𝗇𝗍𝗂𝗆𝖾Γ⊢𝑚𝗋𝗎𝗇𝗍𝗂𝗆𝖾Γ⊢𝐼𝐶(𝑒0;𝑛𝜚𝑛.𝑟𝜚𝑟.𝑒𝑠;𝑚)𝗋𝗎𝗇𝗍𝗂𝗆𝖾Rel−Nat−Elim,Γ,𝑧𝜚𝑧:𝐴⊢𝑒𝑟𝗋𝗎𝗇𝗍𝗂𝗆𝖾Γ⊢𝑎𝜚𝑧Γ⊢𝑒𝑞𝖾𝗋𝖺𝗌𝖾𝖽Γ⊢𝖩𝐴;𝑎;𝑏(𝑥.𝑦.𝑝.𝐶;𝑧𝜚𝑧.𝑒𝑟;𝑒𝑞)𝗋𝗎𝗇𝗍𝗂𝗆𝖾Rel−J, Put V:=𝗏𝗂𝗇𝖽(𝑃;𝑒0;𝑛𝜚𝑛.𝑎𝜚𝑎.𝑥𝑠.𝑟𝜚𝑟.𝑒𝑠;𝑚,𝑦𝑠). Put also ΓV:=Γ,𝑛𝜚𝑛:ℕ,𝑎𝜚𝑎:𝐴,𝑥𝑠𝗋𝗎𝗇𝗍𝗂𝗆𝖾:𝖵𝖾𝖼(𝐴,𝑛),𝑟𝜚𝑟:𝑃(𝑛,𝑥𝑠).Γ⊢𝑒0𝗋𝗎𝗇𝗍𝗂𝗆𝖾ΓV⊢𝑒𝑠𝗋𝗎𝗇𝗍𝗂𝗆𝖾Γ⊢𝑚𝜚𝑚Γ⊢𝑦𝑠𝗋𝗎𝗇𝗍𝗂𝗆𝖾Γ⊢V𝗋𝗎𝗇𝗍𝗂𝗆𝖾Rel−Vec−Elim. The proof and motive of Rel-J are static. Its endpoint 𝑎 is retained exactly when the branch uses 𝑧. A runtime vector index forces the predecessor constructor-field mark 𝜅𝑛 to be runtime, and the structural vector child is always runtime. A runtime branch-use mark 𝜚𝑛 or 𝜚𝑎 respectively requires the constructor-field mark 𝜅𝑛 or 𝜅𝑎 to be runtime; an erased branch may ignore a retained field. Every binder whose declared type is judgmentally a universe is erased because Texec has no universe or source-type representation. A data-valued index may be runtime only when its value forms occur in the source runtime grammar and target representation.
The source call-by-value relation 𝑒⇓𝑣 of definition 126.5 is relevance directed. For a marked argument 𝑎𝑖, put ̂𝑎𝑖=𝑣𝑖 when the mark is runtime and 𝑎𝑖⇓𝑣𝑖, and put ̂𝑎𝑖=𝑎𝑖 with no evaluation premise when the mark is erased. Source and Texec share the glyph, but their disjoint grammars select disjoint rule cards. The complete source card begins 𝑋𝑣⇓𝑣S−Val𝑓⇓𝜆𝜖,𝗋𝗎𝗇𝗍𝗂𝗆𝖾(𝑥:𝐴).𝑏𝑎⇓𝑣𝑎𝑏[𝑣𝑎/𝑥]⇓𝑣𝑓𝜖,𝗋𝗎𝗇𝗍𝗂𝗆𝖾𝑎⇓𝑣S−App−R,𝑓⇓𝜆𝜖,𝖾𝗋𝖺𝗌𝖾𝖽(𝑥:𝐴).𝑏𝑏[𝑎/𝑥]⇓𝑣𝑓𝜖,𝖾𝗋𝖺𝗌𝖾𝖽𝑎⇓𝑣S−App−E,𝑎⇓𝑣𝑎𝑏⇓𝑣𝑏(𝑎,𝑏)⇓(𝑣𝑎,𝑣𝑏)S−Pair𝑠⇓(𝑣𝑎,𝑣𝑏)𝗉𝗋1(𝑠)⇓𝑣𝑎S−Fst𝑠⇓(𝑣𝑎,𝑣𝑏)𝗉𝗋2(𝑠)⇓𝑣𝑏S−Snd,(𝑎𝑖⇓𝑣𝑖)𝜅𝑖=𝗋𝗎𝗇𝗍𝗂𝗆𝖾𝑐(𝑎1,…,𝑎𝑛)⇓𝑐(̂𝑎1,…,̂𝑎𝑛)S−Con,𝑒⇓𝑐𝑘(̂⃗𝑎)𝑒𝑘[̂⃗𝑎/⃗𝑥𝑘]⇓𝑣𝖼𝖺𝗌𝖾𝑒𝗈𝖿{𝑐𝑗(⃗𝑥𝑗)⇒𝑒𝑗}𝑗⇓𝑣S−Case,𝑏⇓𝗍𝗍𝑒𝑡⇓𝑣𝗂𝗇𝖽𝟐(𝑥.𝐶;𝑒𝑡,𝑒𝑓,𝑏)⇓𝑣S−Bool−T𝑏⇓𝖿𝖿𝑒𝑓⇓𝑣𝗂𝗇𝖽𝟐(𝑥.𝐶;𝑒𝑡,𝑒𝑓,𝑏)⇓𝑣S−Bool−F, Abbreviate N(𝑞):=𝐼𝐶(𝑒0;𝑛𝜚𝑛.𝑟𝜚𝑟.𝑒𝑠;𝑞).𝑚⇓𝟢𝑒0⇓𝑣N(𝑚)⇓𝑣S−Nat−Z,𝑚⇓𝗌𝗎𝖼(𝑣𝑛)N(𝑣𝑛)⇓𝑣𝑟𝑒𝑠[𝑣𝑛/𝑛,𝑣𝑟/𝑟]⇓𝑣N(𝑚)⇓𝑣S−Nat−S,𝑒𝑞⇓𝗋𝖾𝖿𝗅𝑣𝑞𝑒𝑟[𝑎/𝑧]⇓𝑣𝖩𝐴;𝑎;𝑏(𝑥.𝑦.𝑝.𝐶;𝑧𝜚𝑧.𝑒𝑟;𝑒𝑞)⇓𝑣S−J,𝑚⇓𝟢𝑦𝑠⇓𝗏𝗇𝗂𝗅𝑒0⇓𝑣𝗏𝗂𝗇𝖽(𝑃;𝑒0;𝑛𝜚𝑛.𝑎𝜚𝑎.𝑥𝑠.𝑟𝜚𝑟.𝑒𝑠;𝑚,𝑦𝑠)⇓𝑣S−Vec−Nil,𝑚⇓𝗌𝗎𝖼(𝑣𝑛)𝑦𝑠⇓𝗏𝖼𝗈𝗇𝗌(𝑣𝑛,𝑣𝑎,𝑣𝑥𝑠)𝗏𝗂𝗇𝖽(𝑃;𝑒0;𝑛𝜚𝑛.𝑎𝜚𝑎.𝑥𝑠.𝑟𝜚𝑟.𝑒𝑠;𝑣𝑛,𝑣𝑥𝑠)⇓𝑣𝑟𝑒𝑠[𝑣𝑛/𝑛,𝑣𝑎/𝑎,𝑣𝑥𝑠/𝑥𝑠,𝑣𝑟/𝑟]⇓𝑣𝗏𝗂𝗇𝖽(𝑃;𝑒0;𝑛𝜚𝑛.𝑎𝜚𝑎.𝑥𝑠.𝑟𝜚𝑟.𝑒𝑠;𝑚,𝑦𝑠)⇓𝑣S−Vec−Cons,(𝑦𝑗⇓𝑢𝑗)𝜎𝑗=𝗋𝗎𝗇𝗍𝗂𝗆𝖾(𝑎𝑖⇓𝑣𝑖)𝜚𝑖=𝗋𝗎𝗇𝗍𝗂𝗆𝖾𝑏𝑓[̂⃗𝑦/⃗𝑦,̂⃗𝑎/⃗𝑥]⇓𝑣𝛿𝑠(𝑓)=(⃗𝑦⃗𝜎;⃗𝑥⃗𝜚;𝑏𝑓)𝑓⟨⃗𝑦⟩(⃗𝑎)⇓𝑣S−Call. The relation is partial on raw syntax: neutral or mismatched scrutinees and wrong-arity calls have no rule. Forward simulation assumes a source derivation. Erased arguments are checked static syntax substituted on the source side and are evaluated by neither source nor target.
Runtime binders survive and erased binders disappear: |𝜆𝜖,𝗋𝗎𝗇𝗍𝗂𝗆𝖾(𝑥:𝐴).𝑏|=𝜆𝑥.|𝑏|,|𝑓𝜖,𝗋𝗎𝗇𝗍𝗂𝗆𝖾𝑎|=|𝑓||𝑎|,|𝜆𝜖,𝖾𝗋𝖺𝗌𝖾𝖽(𝑥:𝐴).𝑏|=|𝑏|,|𝑓𝜖,𝖾𝗋𝖺𝗌𝖾𝖽𝑎|=|𝑓|. Pairs, projections, retained reflexivity, Boolean elimination, and identity elimination erase by |(𝑎,𝑏)|=𝐶𝗉𝖺𝗂𝗋(|𝑎|,|𝑏|),|𝗉𝗋1(𝑠)|=𝖼𝖺𝗌𝖾|𝑠|𝗈𝖿{𝐶𝗉𝖺𝗂𝗋(𝑥,𝑦)⇒𝑥},|𝗉𝗋2(𝑠)|=𝖼𝖺𝗌𝖾|𝑠|𝗈𝖿{𝐶𝗉𝖺𝗂𝗋(𝑥,𝑦)⇒𝑦},|𝗋𝖾𝖿𝗅𝑎|=𝐶𝗋𝖾𝖿𝗅,|𝗂𝗇𝖽𝟐(𝑥.𝐶;𝑒𝑡,𝑒𝑓,𝑏)|=𝖼𝖺𝗌𝖾|𝑏|𝗈𝖿{𝐶𝗍𝗍⇒|𝑒𝑡|,𝐶𝖿𝖿⇒|𝑒𝑓|},∣𝖩𝐴;𝑎;𝑏(𝑥.𝑦.𝑝.𝐶;𝑧𝜚𝑧.𝑒𝑟;𝑒𝑞)∣={|𝑒𝑟|[|𝑎|/𝑧],𝜚𝑧=𝗋𝗎𝗇𝗍𝗂𝗆𝖾,|𝑒𝑟|,𝜚𝑧=𝖾𝗋𝖺𝗌𝖾𝖽. The identity clause is structural on the checked branch derivation; marked substitution proves that it equals |𝑒𝑟[𝑎/𝑧]|. Thus a proof retained by a Σ-component or constructor is not deleted; it is represented by 𝐶𝗋𝖾𝖿𝗅. Constructors retain runtime fields in declaration order. A target case pattern retains a binder exactly when the corresponding constructor-field mark 𝜅𝑖 is runtime, even when its independent branch-use mark 𝜚𝑖 is erased; admissibility requires runtime branch use to imply runtime field retention. Recursive closures retain their tag and runtime environment. For 𝛿𝑠(𝑓)=(⃗𝑦⃗𝜎;⃗𝑥⃗𝜚;𝑏𝑓), compilation creates 𝛿𝑡(𝑓)=(⃗𝑦|⃗𝜎=𝗋𝗎𝗇𝗍𝗂𝗆𝖾;⃗𝑥|⃗𝜚=𝗋𝗎𝗇𝗍𝗂𝗆𝖾;|𝑏𝑓|). A saturated call to one is 𝖼𝖺𝗅𝗅(𝖼𝗅𝗈𝗌(𝑓,⃗𝑤),⃗𝑡).
Every primitive natural or vector eliminator occurrence 𝑜 receives a stable tag 𝜈𝑁(𝑜) or 𝜈𝑉(𝑜). The natural tag stores the ordered runtime lexical slots ⃗𝑦, one scrutinee parameter 𝑚, and the body 𝖼𝖺𝗌𝖾𝑚𝗈𝖿{𝐶𝟢⇒|𝑒0|,𝐶𝗌𝗎𝖼(𝑛)⇒|𝑒𝑠|♮}, where, when the recursive hypothesis is runtime, |𝑒𝑠|♮ is the administrative beta-redex (𝜆𝑟.|𝑒𝑠|)𝖼𝖺𝗅𝗅(𝖼𝗅𝗈𝗌(𝜈𝑁(𝑜),⃗𝑦),𝑛). This forces the recursive call to a value before installing it in the branch, matching source call by value. The vector tag stores its ordered slots, optional runtime index, and vector scrutinee; its successor branch analogously applies 𝜆𝑟.|𝑒𝑠| to the recursive 𝖼𝖺𝗅𝗅(𝖼𝗅𝗈𝗌(𝜈𝑉(𝑜),⃗𝑧),[𝑛]𝜚𝑚,𝑥𝑠). Stable occurrence tags and fixed lexical slots make runtime substitution fill slots without regenerating tags.
Source evaluation is sound for judgmental equality: Γ⊢𝑒:𝐴𝑒⇓𝑣⟹Γ⊢𝑒≡𝑣:𝐴. The rule induction uses computation plus substitution congruence in every dependent case; in particular it converts application results along 𝑎≡𝑣𝑎, second projections along the evaluated first component, eliminator motives along evaluated indices and scrutinees, and identity branches along their endpoint equalities. Hence source evaluation preserves Timpl typing. It also preserves runtime relevance by a second induction using marked substitution; that statement supplies the relevance premise required at every runtime substitution in forward simulation.
Texec cases have pairwise distinct branch tags. Texec evaluation is deterministic left-to-right call by value. Its complete rule card begins with 𝑋𝑤⇓𝑤E−Val𝑡1⇓𝜆𝑥.𝑡𝑡2⇓𝑤2𝑡[𝑤2/𝑥]⇓𝑤𝑡1𝑡2⇓𝑤E−App. Constructor blocks and closures evaluate their fields from left to right: (𝑡𝑖⇓𝑤𝑖)1≤𝑖≤𝑛𝐶𝑘(𝑡1,…,𝑡𝑛)⇓𝐶𝑘(𝑤1,…,𝑤𝑛)E−Con(𝑡𝑖⇓𝑤𝑖)𝑖𝖼𝗅𝗈𝗌(𝑓,⃗𝑡)⇓𝖼𝗅𝗈𝗌(𝑓,⃗𝑤)E−Clos. The remaining two rules are 𝑡⇓𝐶𝑘(⃗𝑤)𝑡𝑘[⃗𝑤/⃗𝑥𝑘]⇓𝑤𝖼𝖺𝗌𝖾𝑡𝗈𝖿{𝐶𝑗(⃗𝑥𝑗)⇒𝑡𝑗}𝑗⇓𝑤E−Case𝛿𝑡(𝑓)=(⃗𝑦;⃗𝑥;𝑡𝑓)𝑡⇓𝖼𝗅𝗈𝗌(𝑓,⃗𝑤)(𝑡𝑖⇓𝑤𝑖)𝑖𝑡𝑓[⃗𝑤/⃗𝑦][⃗𝑤𝑖/⃗𝑥]⇓𝑤𝖼𝖺𝗅𝗅(𝑡,⃗𝑡)⇓𝑤E−Call. Texec is untyped, so the reference invariant is target well-formedness plus the value representation relation, not a target typing judgment. A configuration with no applicable rule is stuck. Representation well-formedness excludes malformed stored arities; forward simulation, under a source evaluation derivation, constructs the matching dynamic rule sequence and excludes wrong value shapes.
Co-erasure uses the runtime-first-order card of definition 126.15. Every retained field of the element and state data types is recursively data-valued. No retained field has Π-type. Each generated map is one outer state lambda. Its body contains only variables, data constructors, pairs, reflexivity, datatype cases, and first-order instances of the four primitive eliminators. There is no internal application or named call. For such a map 𝑔, 𝑔(𝜎)⇓𝖳𝑛⟹∃!𝑣.𝑔(𝜎)⇓𝑣∧nf(𝑣)=𝑛∧|𝑣|=|𝑛|. This is lemma 126.18; the restriction is what excludes a retained lambda whose CBV body and NbE normal body have different target syntax.
For co-erasure, fresh nullary tags satisfy 𝛿𝑡(ℎ∗)=(𝑠;⋅;|ℎ(𝑠)|),𝛿𝑡(𝑡∗)=(𝑠;⋅;(𝜆𝑠′.𝐶𝗌𝗍𝗋𝖾𝖺𝗆(𝖼𝗅𝗈𝗌(ℎ∗,𝑠′),𝖼𝗅𝗈𝗌(𝑡∗,𝑠′)))|𝑡(𝑠)|). Thus the tail tag computes the next state once and returns the next stream block; the ordinary compiled tag of 𝑡:𝑆→𝑆 would return only a state. Finite target observation is the separate judgment 𝖮𝖻𝗌(𝑞,𝑜,𝑤), generated by 𝖼𝖺𝗅𝗅(ℎ)⇓𝑤𝖮𝖻𝗌(𝐶𝗌𝗍𝗋𝖾𝖺𝗆(ℎ,𝑘),𝗁𝖾𝖺𝖽,𝑤)Obs−Head and 𝖼𝖺𝗅𝗅(𝑘)⇓𝐶𝗌𝗍𝗋𝖾𝖺𝗆(ℎ′,𝑘′)𝖮𝖻𝗌(𝐶𝗌𝗍𝗋𝖾𝖺𝗆(ℎ′,𝑘′),𝑜,𝑤)𝖮𝖻𝗌(𝐶𝗌𝗍𝗋𝖾𝖺𝗆(ℎ,𝑘),𝗍𝖺𝗂𝗅⋅𝑜,𝑤)Obs−Tail. It is not an unlisted Texec term former.
System Fi index erasure
System Fi extends 𝐹𝜔 by index-arrow kinds, index abstraction and application, and index polymorphism. The extra clauses are (𝐴⇒𝜅)∘=𝜅∘,(𝜆𝑖𝐴.𝐹)∘=𝐹∘,(𝐹{𝑠})∘=𝐹∘,(∀𝑖𝐴.𝐵)∘=𝐵∘. Terms are unchanged. The exact typing consequence is Δ⊢ΓΔ;Γ⊢𝑡:𝐴Δ∘;(Δ∙,Γ)∘⊢𝐹𝜔𝑡:𝐴∘. Here Δ∙ moves index bindings to the target term context; it drops out when the term contains no free index variable.