Prerequisites. Direct starred prerequisites: Chapter 12. No later core chapter depends on this route.
A component needed before it can be defined
Consider two modules. A lexer exports tokens but imports a table of keywords; a parser exports that table but imports tokens. 𝗂𝗆𝗉𝗈𝗋𝗍𝗌𝖾𝗑𝗉𝗈𝗋𝗍𝗌𝖫𝖾𝗑𝖾𝗋𝗄𝖾𝗒𝗐𝗈𝗋𝖽𝗌:𝖳𝖺𝖻𝗅𝖾𝗍𝗈𝗄𝖾𝗇:𝖢𝗁𝖺𝗋→𝖳𝗈𝗄𝖾𝗇𝖯𝖺𝗋𝗌𝖾𝗋𝗍𝗈𝗄𝖾𝗇:𝖢𝗁𝖺𝗋→𝖳𝗈𝗄𝖾𝗇𝗄𝖾𝗒𝗐𝗈𝗋𝖽𝗌:𝖳𝖺𝖻𝗅𝖾 An ordinary functor can break this cycle only by choosing one direction first. Recursive linking must instead connect both pairs of components and must still prevent the lexer from reading 𝗄𝖾𝗒𝗐𝗈𝗋𝖽𝗌 while its slot is empty.
Let 𝑝 range over finite component paths and let 𝐴 range over the pure core types of chapter 12. A polar component is 𝑝−:𝐴, an import, or 𝑝+:𝐴, an export. A signature Σ is a finite map from paths to polar components. Modules are generated by 𝑀,𝑁::=𝗂𝗆𝗉(𝑝:𝐴)∣𝖽𝖾𝖿(𝑝=𝑒:𝐴)∣{ℓ=𝑀}∣𝑀𝗐𝗂𝗍𝗁𝑁∣𝗌𝖾𝖺𝗅Σ(𝑀)∣𝖼𝗈𝗆𝗉𝗅𝖾𝗍𝖾(𝑀). Paths in a nested structure are prefixed by its label. A core expression records finite sets 𝗋𝖽(𝑒) and 𝗐𝗋(𝑒) of slots read and written during initialization. The fragment requires 𝗐𝗋(𝑒)={𝑝} in 𝖽𝖾𝖿(𝑝=𝑒:𝐴).
The polarity belongs to a component occurrence, not to its core type. Thus 𝑝−:𝐴 and 𝑝+:𝐴 may be linked, while two exports at the same path are competing definitions.
For the running family, prefixing gives Σ𝐿={𝗄𝖾𝗒𝗐𝗈𝗋𝖽𝗌−:𝖳𝖺𝖻𝗅𝖾,𝗍𝗈𝗄𝖾𝗇+:𝖢𝗁𝖺𝗋→𝖳𝗈𝗄𝖾𝗇},Σ𝑃={𝗍𝗈𝗄𝖾𝗇−:𝖢𝗁𝖺𝗋→𝖳𝗈𝗄𝖾𝗇,𝗄𝖾𝗒𝗐𝗈𝗋𝖽𝗌+:𝖳𝖺𝖻𝗅𝖾}. Both opposite-polarity pairs disappear as imports, hence 𝗆𝖾𝗋𝗀𝖾(Σ𝐿,Σ𝑃)={𝗄𝖾𝗒𝗐𝗈𝗋𝖽𝗌+:𝖳𝖺𝖻𝗅𝖾,𝗍𝗈𝗄𝖾𝗇+:𝖢𝗁𝖺𝗋→𝖳𝗈𝗄𝖾𝗇}.
★☆☆ Prove that if 𝗆𝖾𝗋𝗀𝖾(Σ1,Σ2)=Σ and 𝗆𝖾𝗋𝗀𝖾(Σ1,Σ2)=Σ′, then Σ=Σ′. Prove also that defined merge is commutative. Explain why left bias between two equal-typed exports cannot be observed in this signature: signature entries carry a polarity and a type, not an implementation value. Finally replace the rejection of unequal overlapping components by left bias and give a one-path counterexample to commutativity.
Compatibility solves the static wiring problem but not initialization. If 𝗍𝗈𝗄𝖾𝗇 is evaluated before 𝗄𝖾𝗒𝗐𝗈𝗋𝖽𝗌, its initializer may read an empty slot even though the final signature is complete.
Let Ω be a finite map from slots to core types, and let 𝐷 be a finite subset of dom(Ω). Write Ω;𝐷⊢𝖼𝗈𝗋𝖾𝑒:𝐴 when ordinary core typing gives 𝑒:𝐴 and 𝗋𝖽(𝑒)⊆𝐷. The judgment Ω;𝐷⊢𝑀:Σ⇒𝐷′ means that 𝑀 has signature Σ, reads only slots in 𝐷, writes each absent slot at most once, and leaves exactly the slots 𝐷′ defined. Its primitive rules for imports, definitions, and sequencing are
Ω(𝑝)=𝐴
Ω;𝐷⊢𝗂𝗆𝗉(𝑝:𝐴):{𝑝−:𝐴}⇒𝐷
Mix-Imp
Ω(𝑝)=𝐴Ω;𝐷⊢𝖼𝗈𝗋𝖾𝑒:𝐴𝑝∉𝐷𝗐𝗋(𝑒)={𝑝}
Ω;𝐷⊢𝖽𝖾𝖿(𝑝=𝑒:𝐴):{𝑝+:𝐴}⇒𝐷∪{𝑝}
Mix-Def
Ω;𝐷⊢𝑀:Σ1⇒𝐷1Ω;𝐷1⊢𝑁:Σ2⇒𝐷2𝗆𝖾𝗋𝗀𝖾(Σ1,Σ2)=Σ
Ω;𝐷⊢𝑀𝗐𝗂𝗍𝗁𝑁:Σ⇒𝐷2
Mix-With
For a label ℓ, let ℓ⋅(−) prefix every path in a map or set. Let ℓ−1Ω and ℓ−1𝐷 select the entries below ℓ and remove that prefix. Thus ℓ−1𝐷={𝑞∣ℓ.𝑞∈𝐷}. For a finite visible path set 𝑄, let Σ|𝑄 restrict a signature. The remaining rules are
ℓ−1Ω;ℓ−1𝐷⊢𝑀:Σ⇒𝐷0
Ω;𝐷⊢{ℓ=𝑀}:ℓ⋅Σ⇒(𝐷∖ℓ⋅(ℓ−1𝐷))∪ℓ⋅𝐷0
Mix-Struct
Ω;𝐷⊢𝑀:Σ⇒𝐷′𝑄⊆dom(Σ)Σ|𝑄=Σ0
Ω;𝐷⊢𝗌𝖾𝖺𝗅Σ0(𝑀):Σ0⇒𝐷′
Mix-Seal
Ω;𝐷⊢𝑀:Σ⇒𝐷′∀𝑝∈dom(Σ).∃𝐴.Σ(𝑝)=𝑝+:𝐴
Ω;𝐷⊢𝖼𝗈𝗆𝗉𝗅𝖾𝗍𝖾(𝑀):Σ⇒𝐷′
Mix-Complete
Sealing hides paths only after checking the body; it does not erase their initialized cells from 𝐷′.
The slice formulation lets sibling structures share one ambient state without requiring that state to carry two different outer prefixes. For example, let Ω𝐿𝑃 contain 𝖫𝖾𝗑𝖾𝗋.𝗍𝗈𝗄𝖾𝗇:𝖢𝗁𝖺𝗋→𝖳𝗈𝗄𝖾𝗇 and 𝖯𝖺𝗋𝗌𝖾𝗋.𝗄𝖾𝗒𝗐𝗈𝗋𝖽𝗌:𝖳𝖺𝖻𝗅𝖾, and choose initializers with empty read sets. Put 𝐿0={𝖫𝖾𝗑𝖾𝗋=𝖽𝖾𝖿(𝗍𝗈𝗄𝖾𝗇=𝑡0:𝖢𝗁𝖺𝗋→𝖳𝗈𝗄𝖾𝗇)},𝑃0={𝖯𝖺𝗋𝗌𝖾𝗋=𝖽𝖾𝖿(𝗄𝖾𝗒𝗐𝗈𝗋𝖽𝗌=𝑘0:𝖳𝖺𝖻𝗅𝖾)}. Their signatures are Σ0𝐿={𝖫𝖾𝗑𝖾𝗋.𝗍𝗈𝗄𝖾𝗇+:𝖢𝗁𝖺𝗋→𝖳𝗈𝗄𝖾𝗇} and Σ0𝑃={𝖯𝖺𝗋𝗌𝖾𝗋.𝗄𝖾𝗒𝗐𝗈𝗋𝖽𝗌+:𝖳𝖺𝖻𝗅𝖾}. Two uses of Mix-Struct, followed by Mix-With, give Ω𝐿𝑃;∅⊢𝐿0:Σ0𝐿⇒{𝖫𝖾𝗑𝖾𝗋.𝗍𝗈𝗄𝖾𝗇},Ω𝐿𝑃;{𝖫𝖾𝗑𝖾𝗋.𝗍𝗈𝗄𝖾𝗇}⊢𝑃0:Σ0𝑃⇒{𝖫𝖾𝗑𝖾𝗋.𝗍𝗈𝗄𝖾𝗇,𝖯𝖺𝗋𝗌𝖾𝗋.𝗄𝖾𝗒𝗐𝗈𝗋𝖽𝗌}. Their signatures have disjoint paths, so their sequential composition merges.
The order of Mix-With matters operationally. Define the keyword table without reading 𝗍𝗈𝗄𝖾𝗇, then define the token function while reading 𝗄𝖾𝗒𝗐𝗈𝗋𝖽𝗌: write 𝐾=𝖽𝖾𝖿(𝗄𝖾𝗒𝗐𝗈𝗋𝖽𝗌=𝑘:𝖳𝖺𝖻𝗅𝖾) and 𝑇=𝖽𝖾𝖿(𝗍𝗈𝗄𝖾𝗇=𝑡:𝖢𝗁𝖺𝗋→𝖳𝗈𝗄𝖾𝗇). Then
Proof of Lemma 15.4 — Definedness grows exactly by writes
Proof. Proceed by rule induction. Mix-Imp adds no path. In Mix-Def, the side condition 𝑝∉𝐷 gives 𝐷⊆𝐷∪{𝑝}, and the singleton write set gives the exact new write. In Mix-With, the induction hypotheses give 𝐷⊆𝐷1⊆𝐷2. A path in 𝐷2∖𝐷 lies either in 𝐷1∖𝐷 or in 𝐷2∖𝐷1. The two sets are disjoint, and the corresponding induction hypothesis gives its unique write. In the structure case, entries outside the ℓ-slice are unchanged, while prefixing injectively transports the premise’s new writes inside the slice. The two regions are disjoint, so both claims follow. Sealing does not change execution, and completeness adds no write. ◻
Proof. Rule induction fixes the temporal order. Imports perform no read. For a definition, the core judgment’s read condition is exactly the claim. For Mix-With, apply the first induction hypothesis from 𝐷 to 𝐷1, then the second from 𝐷1 to 𝐷2. The remaining rules preserve the trace and merely change path prefixes or visibility. ◻
★☆☆ Delete 𝑝∉𝐷 from Mix-Def. Construct a derivable module that seals its first definition to the empty visible signature and then assigns the same slot again. Explain why the seal makes signature merge defined, and identify the exact clause of lemma 15.4 that becomes false.
The finite module judgment rejects an early read by threading the set 𝐷. The following command calculus isolates that stronger, ordered-initialization property. It is a teaching calculus, not the full LTG typing judgment.
Write 𝐿,𝑈 for the empty-cell and filled-cell modes. A mode environment Ξ is a finite map of bindings 𝑥:𝐴𝐿 or 𝑥:𝐴𝑈. Values are pure: the auxiliary judgment Ξ𝑈⊢𝗏𝑣:𝐴 may inspect only the unrestricted projection Ξ𝑈 of Ξ. Commands and scoped event traces are 𝑐::=𝗋𝖾𝗍𝗎𝗋𝗇𝑣∣𝗀𝖾𝗍𝑥∣𝗌𝖾𝗍𝑥𝑣∣𝑐1;𝑐2∣𝗇𝖾𝗐𝐴(𝑥.𝑐),𝑡::=𝜖∣𝗀𝖾𝗍𝑥∣𝗌𝖾𝗍𝑥∣𝑡1⋅𝑡2∣𝜈𝑥.𝑡. The judgment Ξ⊢𝑐:𝐵⇒Ξ′▹𝑡 both checks a command and extracts its trace:
Ξ𝑈⊢𝗏𝑣:𝐴
Ξ⊢𝗋𝖾𝗍𝗎𝗋𝗇𝑣:𝐴⇒Ξ▹𝜖
Slot-Return
Ξ=Ξ0,𝑥:𝐴𝑈
Ξ⊢𝗀𝖾𝗍𝑥:𝐴⇒Ξ▹𝗀𝖾𝗍𝑥
Slot-Get
Ξ=Ξ0,𝑥:𝐴𝐿Ξ𝑈0⊢𝗏𝑣:𝐴
Ξ⊢𝗌𝖾𝗍𝑥𝑣:𝟏⇒Ξ0,𝑥:𝐴𝑈▹𝗌𝖾𝗍𝑥
Slot-Set
Ξ⊢𝑐1:𝟏⇒Ξ1▹𝑡1Ξ1⊢𝑐2:𝐵⇒Ξ2▹𝑡2
Ξ⊢𝑐1;𝑐2:𝐵⇒Ξ2▹𝑡1⋅𝑡2
Slot-Seq
𝑥∉dom(Ξ)∪dom(Ξ′)Ξ,𝑥:𝐴𝐿⊢𝑐:𝐵⇒Ξ′,𝑥:𝐴𝑈▹𝑡
Ξ⊢𝗇𝖾𝗐𝐴(𝑥.𝑐):𝐵⇒Ξ′▹𝜈𝑥.𝑡
Slot-New
Thus allocation creates one local 𝐿-mode obligation, setting changes that mode to 𝑈, and leaving the scope requires the obligation to have been discharged.
If Ξ⊢𝑐:𝐵⇒Ξ′▹𝑡, then Ξ⊢𝗍𝗋𝑡⇒Ξ′. Consequently each 𝗀𝖾𝗍𝑥 in 𝑡 occurs while 𝑥 has mode 𝑈, and between an allocation 𝜈𝑥 and the end of its scope there is exactly one 𝗌𝖾𝗍𝑥.
Proof of Proposition 15.8 — Ordered slot-trace safety
Proof. Induct on the command derivation. Return, get, and set select the corresponding trace rule. Composition applies the two induction hypotheses in sequence. For allocation, the induction hypothesis validates the body from 𝑥:𝐴𝐿 to 𝑥:𝐴𝑈, so Tr-New closes the scoped trace.
For the consequence, inspect a validation derivation. Only Tr-Get emits a get, and its premise requires mode 𝑈. Only Tr-Set changes the local mode; it requires 𝐿 and produces 𝑈, so it cannot occur twice. Rule Tr-New requires that one such change has occurred before the scope closes. ◻
The full LTG boundary includes black holes
The source target uses linearity for single assignment and eventual definition, but deliberately does not enforce the temporal read discipline of definition 15.6.
In LTG, modes are 𝜄::=𝐿∣𝑈. Among its types and terms are reference types (?𝜏)𝜄, allocation 𝗇𝖾𝗐𝜏, definition 𝖽𝖾𝖿𝑒1:=𝑒2, and dereference !𝑒. The full calculus also has moded kinds, functions, records, universal and existential types, fresh type names, and type-name definition. The run-time categories relevant here are 𝜎::=𝜖∣𝜎,𝛼:?𝜅∣𝜎,𝛼:=𝜏:𝜅,𝑠::=𝜖∣𝑠,𝑥:?𝜏∣𝑠,𝑥:=𝑒:𝜏,𝜉::=𝜎;𝑠;𝑒∣∙. The value-store reductions include 𝜎;𝑠;𝐸[𝗇𝖾𝗐𝜏]⇝0𝜎;𝑠,𝑥:?𝜏;𝐸[𝑥],𝜎;𝑠1,𝑥:?𝜏,𝑠2;𝐸[𝖽𝖾𝖿𝑥:=𝑒]⇝0𝜎;𝑠1,𝑥:=𝑒:𝜏,𝑠2;𝐸[{}],𝜎;𝑠1,𝑥:=𝑒:𝜏,𝑠2;𝐸[!𝑥]⇝0𝜎;𝑠1,𝑥:=𝑒:𝜏,𝑠2;𝐸[𝑒],𝜎;𝑠1,𝑥:?𝜏,𝑠2;𝐸[!𝑥]⇝0∙. Store typing assigns (?𝜏)𝐿 to 𝑥:?𝜏 and (?𝜏)𝑈 to 𝑥:=𝑒:𝜏. Definition consumes an 𝐿-mode capability, while dereference requires a 𝑈-mode occurrence. Crucially, LTG splitting contains (?𝜏)𝐿∗(?𝜏)𝑈=(?𝜏)𝐿. Hence an unrestricted read capability may coexist with the linear obligation to fill the cell. LTG permits an early dereference, which reduces to ∙; its type safety theorem does not remove that outcome.
The ordered trace checker can be used before LTG elaboration: map an empty slot to mode 𝐿, a filled slot to mode 𝑈, and accept only traces validated by definition 15.7. Equation (15.1) is intentionally absent from that checker. Thus proposition 15.8 proves a local initialization-order property, while the published LTG result proves a different single-assignment-and-progress property.
Three passes and the exact imported boundary
The full MixML rules are declarative: linking chooses locators and fresh type names. A checker must remove that nondeterminism without changing which modules are typable. The source construction separates three questions.
The paper leaves the core constructor grammar parametric. Let 𝐴 range over the selected core’s beta-normal, eta-long semantic constructors, equipped with the paper’s decidable kinding, elaboration, subtyping, and substitution judgments. Relative to that explicit parameter, the complete MixML semantic objects used by the imported rules are Σ::=[[=𝐴]]∣[[𝐴]]±∣[[Φ]]±∣{|ℓ:Σ|},Φ::=∀¯𝛼.∃¯𝛽.(𝐿𝗂;𝐿𝖾;Σ),𝐿::=[[=𝛼]]∣{|ℓ:𝐿|},𝑅::=[[=𝐴]]∣{|ℓ:𝑅|},Γ::=𝜖∣Γ,𝑋:|Σ|. Here [[𝐴]]− and [[𝐴]]+ are term imports and exports; unit components have the same polarities. Type imports and abstract type exports are represented by the two locators in Φ. Absolute signature |Σ| changes polar imports to exports before storing a module in Γ. Realizer disjoint union is written 𝑅1⊎𝑅2, and 𝑅#Σ means disjoint path domains.
Template erasure retains kinds and shapes: 𝑆::=[[𝜅]]∣[[𝐹]]±∣{|ℓ:𝑆|},𝐹::=𝐿𝑇;¯𝜅;𝑆. It erases atomic term components, replaces type definitions by their kinds, and commutes with path domains, absolute signatures, locator restriction, and disjoint union. These are the full semantic categories of the imported judgments; they are not the polar path maps of 𝖬𝗂𝗑0.
For the full source syntax of Rossberg and Dreyer, the three passes are
Γ𝑇⊢𝑀⇒𝐿𝑇;¯𝜅;𝑆 computes component domains, locator shapes, polar unit shapes, and export kinds while erasing atomic term components;
Γ;𝑅;¯𝛽⊢𝗌𝗍𝖺𝗍𝑀:Σ𝑠 computes static type components with the template-fixed locator and export-kind choices; and
Γ;𝑅;¯𝛽⊢𝗆𝖺𝗂𝗇𝑀:Σ⇝𝑒 checks core terms and produces LTG evidence 𝑒.
Here ⇝ is evidence elaboration, not evaluation. All three judgments use the paper’s full semantic signatures, locator disjointness conditions, freshness conditions, and analysis/synthesis well-formedness classes.
The deterministic link rule makes the interaction of the passes inspectable. For (𝑋=𝑀1)𝗐𝗂𝗍𝗁𝑀2, template computation first produces Γ𝑇⊢𝑀1⇒𝑅𝑇⊎𝑅𝑇1⊎𝐿𝑇1;¯𝜅𝛽1;𝑆1,Γ𝑇,𝑋:|𝑆1|⊢𝑀2⇒𝑅𝑇⊎𝑅𝑇2⊎𝐿𝑇2;¯𝜅𝛽2;𝑆2, with (𝑅1⊎𝐿1)#(𝑅2⊎𝐿2). These domains determine the common external imports 𝑅, the unmatched imports 𝑅1,𝑅2, and the cross-linked locators 𝐿1,𝐿2; no pass guesses that partition again. The static premise checks Γ,𝑋:|Σ1|;𝑅⊎𝑅2⊎𝐿2;¯𝛽2⊢𝗌𝗍𝖺𝗍𝑀2:Σ02 and bidirectional lookup computes the unique normalizing substitution (𝐿1;Σ1)⋈(𝐿2;Σ02)⟹𝛿. The main premises then check 𝑀1 at Σ1, recheck 𝑀2 under 𝛿Γ,𝑋:|𝛿Σ1| and 𝛿𝐿2 at Σ2, and finish with the deterministic merge 𝛿Σ1+Σ2⟹Σ. Equations (15.2)–(15.5) are the mechanism of the paper’s Link-Det rule: templates fix domains and fresh-kind arities, the static pass exposes type equations, lookup computes 𝛿, and the main pass checks values with those equations available.
On the lexer–parser family, the template contains two paths with opposite polarities. The static pass checks that both occurrences of 𝗄𝖾𝗒𝗐𝗈𝗋𝖽𝗌 have type 𝖳𝖺𝖻𝗅𝖾 and both occurrences of 𝗍𝗈𝗄𝖾𝗇 have type 𝖢𝗁𝖺𝗋→𝖳𝗈𝗄𝖾𝗇. The main pass then emits two cells, wires each import to the corresponding export, and sequences the initializers in an order accepted by the LTG modes.
For the MixML and LTG signatures of Rossberg–Dreyer, including their well-formed analysis and synthesis signatures and the assumed sound and complete algorithms for the chosen pure core language, the following results hold.
Evidence translation is complete and sound: the paper’s Theorems 8.1 and 8.7 relate declarative MixML derivations to well-typed LTG terms.
Template computation is complete (Theorem 9.8), and the three-pass algorithm is complete and sound (Theorems 9.9 and 9.10).
MixML type checking is decidable and inferred signatures are unique (Corollary 9.11 and Theorem 9.12).
LTG preservation and progress are Theorems 7.10 and 7.14. A well-typed non-error configuration either steps or is a value configuration whose term and type cells are all defined. Dereferencing an undefined cell may step to ∙, as displayed in definition 15.9.
Proof of Theorem 15.12 — Full MixML/LTG theorem boundary; exact import
Proof. This theorem imports the named results from [RD13]. The bridge is literal: definition 15.10 reproduces the complete MixML semantic and template shells of Figures 4, 8, and 25 relative to their stated core parameter; (15.2)–(15.5) reproduce the premises that replace declarative linking in Link-Det of Figure 29; and definition 15.9 reproduces the reference-store fragment of Figures 13–15. Consequently a derivation of the displayed three-pass judgments is a derivation in the hypotheses of Theorems 9.8–9.10, and its evidence conclusion is the input of Theorems 8.1 and 8.7.
The theorem is not obtained from 𝖬𝗂𝗑0 or from the ordered trace checker. The source proofs use environment-splitting substitution for LTG, analysis/synthesis well-formedness for elaboration, deterministic signature approximation for the static pass, and deterministic shapes for template completeness. These hypotheses are retained because removing any one changes the source judgment or invalidates its induction. ◻
The theorem concerns the frozen MixML/LTG pair. Standard ML lacks MixML’s polar semantic signatures and is not translated by the stated evidence judgments. Dreyer’s recursive-module calculus and Leroy’s modular module system give useful predecessor comparisons, but their soundness results do not instantiate theorem 15.12.
★★☆ For each claim, state whether theorem 15.12 establishes it and name the decisive hypothesis: (i) a successful full MixML elaboration is LTG-typed; (ii) every Standard ML recursive module is safe; (iii) a non-error terminal LTG module has no empty component; (iv) arbitrary impure core-language extensions preserve completeness. State separately what can happen after an early dereference.
★★☆ Give signatures for the lexer–parser family and calculate their merge. Then use initializers with 𝗋𝖽(𝑘)={𝗍𝗈𝗄𝖾𝗇} and 𝗋𝖽(𝑡)={𝗄𝖾𝗒𝗐𝗈𝗋𝖽𝗌}. Prove that neither sequential order has an initialization derivation, although the merged signature is complete.
★★☆ Construct a module whose merged signature has only exports but whose chosen initializer order fails. State separately signature completeness and LTG definedness, and prove that neither definition implies the other without an elaboration-soundness premise.
★★★Practical project.mixml-checker Implement in Kappa a finite 𝖬𝗂𝗑0 merge and initialization checker. Maintain the invariant that the state set contains exactly the slots written by the accepted prefix. The program must accept the ordered keyword/token family, reject its early-read reversal, reject duplicate exports, reject a type mismatch, and reject a cyclic pair in both orders. The exact five-case output recorded in appendix E is the acceptance test; an empty Kappa audit is also required.
★★★ Define a parallel composition rule for two modules whose read/write sets are independent. State the independence condition, prove that either sequential order is derivable under that condition, and show by counterexample why disjoint write sets alone do not suffice.