A nested Σ-type stores dependent components, but the terms 𝗉𝗋1(𝗉𝗋1(𝑟)) and 𝗉𝗋2(𝑟) do not say which components they select. Reordering two independent components also changes those terms. A true-record calculus makes field labels part of the syntax. That convenience comes with precise design choices: which occurrence of a repeated label is visible, how a field is removed while searching, and whether a record is judgmentally equal to the record of its projections.
Pollack’s left-associating true records
We freeze Pollack’s 2002 left-associating rules. If 𝐿 is a record signature and 𝐴 is a type family over records 𝑙:𝐿, then ⟨𝐿,𝑟:𝐴⟩ appends a visible field 𝑟. A value ⟨𝑙,𝑟=𝑎⟩ stores a prefix 𝑙:𝐿 and a last component 𝑎:𝐴(𝑙). Labels do not bind in terms, and later occurrences shadow earlier ones.
The selected field is found from right to left. Restriction 𝑙|𝑟 removes the visible 𝑟 field, and projection 𝑙.𝑟 returns its value:
Γ⊢𝑙:⟨𝐿,𝑟:𝐴⟩
Γ⊢𝑙|𝑟:𝐿
Rec-rest
Γ⊢𝑙:⟨𝐿,𝑟:𝐴⟩
Γ⊢𝑙.𝑟:𝐴[𝑙|𝑟/𝑥]
Rec-proj
When the top label is different, both operations pass through it:
Γ⊢𝑙:⟨𝐿,𝑟:𝐴⟩Γ⊢(𝑙|𝑟)|𝑝:𝑃𝑟≠𝑝
Γ⊢𝑙|𝑝:𝑃
Rec-rest-pass
Γ⊢𝑙:⟨𝐿,𝑟:𝐴⟩Γ⊢(𝑙|𝑟).𝑝:𝑃𝑟≠𝑝
Γ⊢𝑙.𝑝:𝑃
Rec-proj-pass
The passing rules are read with the recursively established type of the searched-for field; the displayed 𝑃 is that field type. They are a derivation schema for right-to-left lookup, not a width-subtyping judgment.
Computation is generated by ⟨𝑙,𝑟=𝑎⟩|𝑟≡𝑙,⟨𝑙,𝑟=𝑎⟩.𝑟≡𝑎,𝑙|𝑝≡(𝑙|𝑟)|𝑝(𝑟≠𝑝),𝑙.𝑝≡(𝑙|𝑟).𝑝(𝑟≠𝑝). Congruence, conversion, symmetry, and transitivity are inherited from the ambient judgmental equality.
The rule names Rec-form and Rec-intro are local to this dependent true-record calculus. They are not the simply typed record rules tabulated earlier in appendix A; the term formers and dependency premises distinguish the two signatures.
There is deliberately no record-eta equation 𝑙?≡⟨𝑙|𝑟,𝑟=𝑙.𝑟⟩.(𝑛𝑜𝑡𝑎𝑟𝑢𝑙𝑒) Pollack’s displayed true-record rules do not contain it. Coquand, Pollack, and Takeyama later use generalized eta-expansion inside normalization, but state explicitly that object equality contains neither surjective pairing nor record field permutation. Eta expansion as an algorithmic device must not be confused with judgmental record eta.
For a concrete dependency, start from 𝟏 and form 𝐿0:=𝟏,𝐿1:=⟨𝐿0,𝖢𝖺𝗋𝗋𝗂𝖾𝗋:U𝑖⟩,𝐿2:=⟨𝐿1,𝗉𝗈𝗂𝗇𝗍:𝖢𝖺𝗋𝗋𝗂𝖾𝗋⟩,𝖯𝗈𝗂𝗇𝗍𝖾𝖽𝖫𝗈𝗈𝗉𝑖:=⟨𝐿2,𝗅𝗈𝗈𝗉:𝖨𝖽𝖢𝖺𝗋𝗋𝗂𝖾𝗋(𝗉𝗈𝗂𝗇𝗍,𝗉𝗈𝗂𝗇𝗍)⟩. The notation in a later field type abbreviates the corresponding projections from the prefix variable. The closed value 𝑝:=⟨⟨⟨⋆,𝖢𝖺𝗋𝗋𝗂𝖾𝗋=ℕ⟩,𝗉𝗈𝗂𝗇𝗍=𝟢⟩,𝗅𝗈𝗈𝗉=𝗋𝖾𝖿𝗅𝟢⟩:𝖯𝗈𝗂𝗇𝗍𝖾𝖽𝖫𝗈𝗈𝗉𝑖 calculates by right-to-left lookup: 𝑝.𝗅𝗈𝗈𝗉≡𝗋𝖾𝖿𝗅𝟢,𝑝.𝗉𝗈𝗂𝗇𝗍≡(𝑝|𝗅𝗈𝗈𝗉).𝗉𝗈𝗂𝗇𝗍≡𝟢,𝑝.𝖢𝖺𝗋𝗋𝗂𝖾𝗋≡(𝑝|𝗅𝗈𝗈𝗉).𝖢𝖺𝗋𝗋𝗂𝖾𝗋≡((𝑝|𝗅𝗈𝗈𝗉)|𝗉𝗈𝗂𝗇𝗍).𝖢𝖺𝗋𝗋𝗂𝖾𝗋≡ℕ. The last two lines include passing steps. The loop field is checked only after the carrier and point fields have been substituted into its type.
★★☆ Replace 𝑝 by a neutral 𝑞:𝖯𝗈𝗂𝗇𝗍𝖾𝖽𝖫𝗈𝗈𝗉𝑖. State the types of 𝑞.𝗉𝗈𝗂𝗇𝗍 and 𝑞.𝗅𝗈𝗈𝗉, and explain why neither projection contracts. Then show that ⟨𝑞|𝗅𝗈𝗈𝗉,𝗅𝗈𝗈𝗉=𝑞.𝗅𝗈𝗈𝗉⟩ is well typed but is not judgmentally equal to 𝑞 by the displayed rules.
The operation 𝑙|𝑟 is what keeps the dependency well typed during field search. Substitution therefore acts simultaneously on the prefix, the field family, and every recursively exposed restriction.
Proof. Induct on the derivation. Formation and construction use ordinary substitution for 𝐿 and for the dependent field type 𝐴(𝑙). In Rec-proj, the induction hypothesis gives 𝑙[𝑢/𝑥]:⟨𝐿[𝑢/𝑥],𝑟:𝐴[𝑢/𝑥]⟩; applying Rec-rest first gives the substituted prefix and then Rec-proj gives 𝑙[𝑢/𝑥].𝑟:𝐴[𝑢/𝑥][(𝑙[𝑢/𝑥]|𝑟)/𝑧]. Capture-avoiding substitution composition identifies this classifier with (𝐴[𝑙|𝑟/𝑧])[𝑢/𝑥]. For Rec-rest-pass, the induction hypothesis supplies the substituted outer record and the recursive premise ((𝑙|𝑟)|𝑝)[𝑢/𝑥]:𝑃[𝑢/𝑥]. Preserving 𝑟≠𝑝 reconstructs the conclusion (𝑙|𝑝)[𝑢/𝑥]:𝑃[𝑢/𝑥]. For Rec-proj-pass, the recursive premise is ((𝑙|𝑟).𝑝)[𝑢/𝑥]:𝑃[𝑢/𝑥] and the reconstructed conclusion is (𝑙.𝑝)[𝑢/𝑥]:𝑃[𝑢/𝑥]. For each of the four computation axioms, the induction hypotheses type the substituted operands and the same computation axiom, with all operands substituted, yields the required equality. A congruence case applies the induction hypothesis to every displayed premise and then rebuilds that same congruence rule; conversion uses the substituted type equality. These are all new cases. ◻
For pairwise fresh labels, flatten ⟨⋯⟨𝟏,ℓ1:𝐴1⟩⋯,ℓ𝑘:𝐴𝑘⟩ as (ℓ1:𝐴1,…,ℓ𝑘:𝐴𝑘). Define a translation to prefix-nested Sigma types by 𝑆(⋅):=𝟏,𝑆(Δ,ℓ:𝐴):=∑𝜌:𝑆(Δ)𝐴𝑆(𝜌),⟨𝑙,ℓ=𝑎⟩𝑆:=(𝑙𝑆,𝑎𝑆),(𝑙|ℓ)𝑆:=𝗉𝗋1(𝑙𝑆),(𝑙.ℓ)𝑆:=𝗉𝗋2(𝑙𝑆). Passing through a different top label first applies 𝗉𝗋1 and continues recursively. Thus named selection becomes a finite projection spine.
On the fresh-label fragment, the translation (−)𝑆 preserves formation, typing, judgmental equality, restriction computation, and projection computation. Hence the selected true-record rules are conservative over the ambient negative Sigma and Unit rules for record-free conclusions. The theorem does not reflect arbitrary Sigma equality and does not add record eta.
Proof of Theorem 79.3 — The exact Sigma comparison
Proof. Induct on the record signature. At the last field, restriction beta translates to 𝗉𝗋1(𝑙𝑆,𝑎𝑆)≡𝑙𝑆, and projection beta to 𝗉𝗋2(𝑙𝑆,𝑎𝑆)≡𝑎𝑆. A passing computation translates to one outer first projection followed by the induction hypothesis. Formation and construction are Sigma formation and introduction. Congruence and conversion commute with the translation. Translating a derivation of a record-free conclusion leaves that conclusion unchanged, which proves conservativity. No converse eta step is used. ◻
Pollack compares left-associating records with labeled Sigma types at exactly this strength: restriction exposes the prefix and projection exposes the selected component. Repeated labels remain meaningful in his calculus, but the fresh-label fragment is the one used for the algorithmic correspondence below.
★★☆ Translate the candidate eta equation 𝑞?=⟨𝑞|𝑟,𝑟=𝑞.𝑟⟩ to Sigma syntax. Show that Sigma eta would validate the translation, then explain why this does not make the source equation derivable: preservation is not reflection from all target equalities.
★★☆ Let 𝐿′=⟨𝐿,𝑟:𝐴⟩. Construct 𝜆𝑞.𝑞|𝑟:𝐿′→𝐿. Contrast this explicit operation with a candidate width rule assigning the same term 𝑞 both types 𝐿′ and 𝐿. Explain why the selected calculus contains the function but not that rule.
Coquand, Pollack, and Takeyama use right-associating records. We isolate the fragment 𝖢𝖯𝖳𝗋𝖾𝖼 containing the empty signature 1, signature extension ⟨ℓ:𝐴,𝑥.𝐵⟩, empty value (), value extension (ℓ=𝑀,𝑁), and primitive selection 𝑀.ℓ. Labels are fresh in a tail. Its two dot reductions are (ℓ=𝑀,𝑁).ℓ⟶𝑀,(ℓ=𝑀,𝑁).𝑘⟶𝑁.𝑘(ℓ≠𝑘). We exclude singleton and manifest fields, structural subtyping, signature strengthening, modules, and type-family application.
For a fresh-label Pollack signature Δ=(ℓ1:𝐴1,…,ℓ𝑘:𝐴𝑘), define [[⋅]]𝖢𝖯𝖳:=1,[[ℓ1:𝐴1,Δ]]𝖢𝖯𝖳:=⟨ℓ1:𝐴𝐶1,𝑥.[[Δ]]𝖢𝖯𝖳⟩,[[{ℓ1=𝑎1;…;ℓ𝑘=𝑎𝑘}]]𝖢𝖯𝖳:=(ℓ1=𝑎𝐶1,(⋯(ℓ𝑘=𝑎𝐶𝑘,())⋯)),[[𝑞.ℓ]]𝖢𝖯𝖳:=𝑞𝐶.ℓ. Pollack restriction is used only by the source lookup derivation; a maximal projection 𝑞.ℓ translates directly to CPT dot selection. Call this the projection fragment: restriction is not exposed as a standalone result term. This boundary is necessary because CPT’s record object syntax has dot selection but no whole-tail projection.
Proof of Theorem 79.4 — Pollack-to-CPT correspondence
Proof. For preservation, induct on the Pollack derivation. Formation and construction reverse the left-associated prefix into a right-associated CPT tail. A source projection search through 𝑚 later labels becomes exactly 𝑚 applications of the second rule in (79.4), followed by the first. Dependency is preserved because both derivations substitute the same earlier field values before checking a later type.
For reflection, invert the CPT derivation on the image grammar. A translated signature has a unique right-associated field spine and translated terms have only image constructors. Reconstruct Pollack formation or construction one field at a time. A dot derivation determines a unique label position because labels are fresh; rebuild the corresponding finite restriction search. The same induction reflects a dot-conversion chain to (79.1)–(79.3). No CPT subtyping or singleton rule occurs in the restricted derivation, so there is no remaining case. ◻
Assume the record-free base has the neutral eta-expansion normalizer of Coquand–Pollack–Takeyama, decidable type equality, and canonical forms for 𝟏 and the field types in the empty context. Then, for the fresh-label projection fragment:
formation, construction, projection typing, and judgmental equality are decidable;
dot reduction preserves typing;
a closed beta-normal inhabitant of a record signature is a nested record constructor whose fields have the corresponding base canonical forms.
The theorem asserts beta-normal canonicity, not judgmental record eta.
Proof of Theorem 79.5 — Checking and available canonicity for records
Proof. Use the correspondence theorem. The CPT normalizer extends neutral eta-expansion by the clauses printed with the record fragment; alpha-comparison of the resulting normal forms decides equality. Checking a constructor proceeds from the first field to the last, substituting each checked value into the remaining tail. Projection follows the unique finite label spine. Reflection transfers each successful or failed query back to the Pollack fragment.
For preservation, the selected dot redex (ℓ=𝑀,𝑁).ℓ has the field type assigned to 𝑀. In the different-label case the typing derivation for 𝑁.𝑘 is already a premise. The substitution lemma handles compatible reductions below dependent tails.
For canonicity, normalize the translated closed term. A closed neutral cannot be headed by a variable, and a dot-headed neutral would have a smaller closed neutral record scrutinee. Finite descent rules this out. Hence the normal form is () at the empty signature or (ℓ=𝑀,𝑁) at an extension. Induction on the signature and the assumed base canonical forms gives the claim; reflection returns the corresponding left-associated Pollack value. Generalized eta-expansion helps the equality algorithm compare neutrals, but is nowhere oriented as a source reduction or asserted as source equality. ◻
★★☆ Extend 𝖯𝗈𝗂𝗇𝗍𝖾𝖽𝖫𝗈𝗈𝗉𝑖 by a Boolean name field. Give its left-associated Pollack signature, its right-associated CPT translation, and the complete dot-reduction trace for selecting the point and carrier fields. Mark the source restriction step corresponding to each target dot-pass step.
★★★Practical project.dependent-record-checker Implement in Kappa formation and checking for the fresh-label fragment of definition 79.1. Check fields from left to right and implement named projection by a right-to-left label search. Accept the displayed 𝖯𝗈𝗂𝗇𝗍𝖾𝖽𝖫𝗈𝗈𝗉𝑖 value and compute its point projection to zero. Reject a record whose carrier is ℕ, point is 𝟢, and loop endpoints are both 𝗌𝗎𝖼(𝟢); name the expected and actual endpoint types. Also reject a duplicate-label declaration in this executable fragment. The acceptance test compares these exact results. This finite checker does not implement Pollack’s full repeated-label calculus or prove the correspondence theorem.
Sources and theorem boundary. The rules Rec-form–Rec-proj-pass and their four computations are the left-associating true-record rules in Pollack, pp. 6–7 [Pol02]; the record/Sigma comparison is bounded by his discussion on p. 7. His system has no record-eta rule. The 𝖢𝖯𝖳𝗋𝖾𝖼 grammar, dot reductions, generalized eta-expansion policy, and normalization argument are isolated from Coquand, Pollack, and Takeyama, pp. 4–5 and 11–12 [CPT03]. The correspondence and the specialization of checking/canonicity are proved here because Pollack’s paper does not own them and the CPT development is substantially larger. Singleton fields, manifest fields, structural subtyping, module applications, signature strengthening, record permutation, and surjective pairing remain outside every theorem in this chapter.