Exercise 89.1.
For the inner product 𝐴 →𝖳𝗒𝗉𝖾@{𝑣}, the domain has sort 𝖳𝗒𝗉𝖾@{𝑢} and the codomain term has sort 𝖳𝗒𝗉𝖾@{𝑣 +1}, so its sort is 𝖳𝗒𝗉𝖾@{max(𝑢,𝑣 +1)}. The outer domain 𝖳𝗒𝗉𝖾@{𝑢} itself has sort 𝖳𝗒𝗉𝖾@{𝑢 +1}. Hence the whole product has sort 𝖳𝗒𝗉𝖾@{max(𝑢+1,𝑣+1)}. Equivalently, a fresh result level 𝑤 needs the constraints 𝑢 +1 ≤𝑤 and 𝑣 +1 ≤𝑤. If the innermost codomain is 𝖯𝗋𝗈𝗉, both products have propositional codomain; impredicativity makes their final sort 𝖯𝗋𝗈𝗉 instead of taking a maximum.
Exercise 89.2.
At universe 𝑢, declare 𝖳𝗋𝖾𝖾@{𝑢}(𝐴:𝖳𝗒𝗉𝖾@{𝑢}):𝖳𝗒𝗉𝖾@{𝑢}, with 𝗅𝖾𝖺𝖿 :𝐴 →𝖳𝗋𝖾𝖾(𝐴) and 𝗇𝗈𝖽𝖾 :𝖳𝗋𝖾𝖾(𝐴) →𝖳𝗋𝖾𝖾(𝐴) →𝖳𝗋𝖾𝖾(𝐴). The sole parameter is 𝐴; there are no indices. Both recursive occurrences are constructor arguments in positive positions, and every conclusion uses the same parameter 𝐴. The judgment 𝖳𝗒𝗉𝖾@{𝑢} :𝖳𝗒𝗉𝖾@{𝑢 +1} is sort formation, not a nontrivial declared universe constraint. This declaration can therefore have an empty constraint set. Choose its stored 𝗂𝗇𝖽_𝗄𝖾𝗅𝗂𝗆 list to be [𝖯𝗋𝗈𝗉,𝖲𝖾𝗍,𝖳𝗒𝗉𝖾]; the frozen 2019 𝖼𝗁𝖾𝖼𝗄_𝗂𝗇𝖽_𝗌𝗈𝗋𝗍𝗌 does not validate that list for a Type-valued inductive. A field 𝖳𝗋𝖾𝖾(𝐴) →𝐴 moves the family to the domain of an arrow inside a constructor argument, so the positivity path fails at constructor-arg/domain.
Exercise 89.3.
Environment checking uses universe-graph validity and the graph and inductive-body obligations. Weak-head normalization uses normalization, subject reduction, strengthening, and stability of fix guards under the transformations performed during reduction. Conversion additionally uses proof irrelevance and the conversion metatheory. Type inference uses validity and principality to relate inferred and expected types. Declaration checking uses the positivity/fix or configuration guards and the checked environment interfaces. Confluence says that two reductions from one term can be joined; it neither proves that reduction terminates nor constructs a total weak-head-normalization function. The strong-normalization assumption is therefore not discharged by confluence.
Exercise 89.4.
For equality, a motive may be 𝑃=:=𝜆𝑦.𝜆𝑒.𝐴:∏𝑦:𝐴𝖤𝗊(𝐴,𝑥,𝑦)→𝖳𝗒𝗉𝖾@{𝑢}. The reflexivity branch is the actual term 𝑥 :𝑃=(𝑥,𝗋𝖾𝖿𝗅), so the equality case returns an element of 𝐴 and is admitted by the stored singleton-elimination information. For the existential, take the equally explicit Type-valued motive 𝑄:=𝜆𝑒.𝐴:𝖤𝗑𝗂𝗌𝗍𝗌(𝐴,𝑅)→𝖳𝗒𝗉𝖾@{𝑢},𝑏:=𝜆𝑥.𝜆𝑝.𝑥. The proposed branch has type ∏𝑥:𝐴∏𝑝:𝑅(𝑥)𝑄(𝗂𝗇𝗍𝗋𝗈(𝑥,𝑝)) and would return the hidden witness. It is rejected: the constructor field 𝑥 :𝐴 is an informative witness, so this propositional inductive is not in the singleton-elimination class. A 𝖯𝗋𝗈𝗉-valued motive remains admissible.
Exercise 89.5.
Let 𝐼𝑉:=(kn,0) be the inductive identifier for the sole body of the vector mutual block, let 𝑢 be its universe instance, and let the constructor numbers be 0 for nil and 1 for cons. The three raw references are 𝖨𝗇𝖽(𝐼𝑉,𝑢),𝖢𝗈𝗇𝗌𝗍𝗋𝗎𝖼𝗍(𝐼𝑉,0,𝑢),𝖢𝗈𝗇𝗌𝗍𝗋𝗎𝖼𝗍(𝐼𝑉,1,𝑢). For 𝑧 :𝖨𝗇𝖽(𝐼𝑉,𝑢) 𝐴 𝑛, a dependent case predicate has type ∏𝑚:ℕ𝖨𝗇𝖽(𝐼𝑉,𝑢)𝐴𝑚→𝖳𝗒𝗉𝖾@{𝑤}. The case information is exactly (𝐼𝑉,1): there is one uniform parameter. Its raw branch list has arities [(0,𝑏𝗇𝗂𝗅),(3,𝑏𝖼𝗈𝗇𝗌)]. The nil branch has type 𝑃 0 (𝖢𝗈𝗇𝗌𝗍𝗋𝗎𝖼𝗍(𝐼𝑉,0,𝑢) 𝐴). The raw cons branch quantifies only 𝑚:ℕ,𝑥:𝐴,𝑥𝑠:𝖨𝗇𝖽(𝐼𝑉,𝑢)𝐴𝑚 and returns 𝑃 (𝗌𝗎𝖼𝑚) (𝖢𝗈𝗇𝗌𝗍𝗋𝗎𝖼𝗍(𝐼𝑉,1,𝑢) 𝐴 𝑚 𝑥 𝑥𝑠). The kernel case rule supplies no induction hypothesis. The separate generated induction constant has a cons method that additionally quantifies 𝑖ℎ :𝑃 𝑚 𝑥𝑠 before returning the same displayed result. Here 𝐴 is the uniform parameter, 𝑚 the index, 𝑥𝑠 the recursive vector, and 𝑖ℎ the result of the induction fixpoint’s recursive call on 𝑥𝑠.
Exercise 89.6.
Use 𝐼𝑉 =(kn,0), case information (𝐼𝑉,1), and raw branches [(0,𝑏0),(3,𝑏1)]. The complete constructor-headed redex is 𝖢𝖺𝗌𝖾((𝐼𝑉,1),𝑃,𝖺𝗉𝗉𝗌(𝖢𝗈𝗇𝗌𝗍𝗋𝗎𝖼𝗍(𝐼𝑉,1,𝑢),[𝐴,𝑚,𝑥,𝑥𝑠]),[(0,𝑏0),(3,𝑏1)]). By PCUIC-𝜄 it reduces in one step to the literal substitution result 𝖺𝗉𝗉𝗌(𝑏1,𝗌𝗄𝗂𝗉𝗇(1,[𝐴,𝑚,𝑥,𝑥𝑠]))≡𝖺𝗉𝗉𝗌(𝑏1,[𝑚,𝑥,𝑥𝑠]). No recursive call or induction hypothesis is inserted by this reduction.
For a projection 𝑝 and a block with 𝗎𝗇𝖿𝗈𝗅𝖽𝖢𝗈𝖥𝗂𝗑(¯𝑑,𝑘) =(𝑛𝑎,𝑓), the complete raw step is 𝖯𝗋𝗈𝗃(𝑝,𝖺𝗉𝗉𝗌(𝖢𝗈𝖥𝗂𝗑(¯𝑑,𝑘),¯𝑎))⇝0𝖯𝗋𝗈𝗃(𝑝,𝖺𝗉𝗉𝗌(𝑓,¯𝑎)). Projection from a constructor is a separate next step. For a fixpoint, 𝖺𝗉𝗉𝗌(𝖥𝗂𝗑(¯𝑒,𝑗),¯𝑞)⇝0𝖺𝗉𝗉𝗌(𝑔,¯𝑞) requires both 𝗎𝗇𝖿𝗈𝗅𝖽𝖥𝗂𝗑(¯𝑒,𝑗) =(𝑟,𝑔) and 𝗂𝗌𝖢𝗈𝗇𝗌𝗍𝗋𝗎𝖼𝗍𝗈𝗋(𝑟,¯𝑞) =𝗍𝗋𝗎𝖾. Replacing ¯𝑞[𝑟] by the neutral 𝖱𝖾𝗅(0) makes the Boolean false, so this root rule has no derivation.
The generated vector induction constant places recursion in its fix body. In its cons branch the raw body has the form 𝜆𝑚.𝜆𝑥.𝜆𝑥𝑠.𝖺𝗉𝗉𝗌(𝑠,[𝑚,𝑥,𝑥𝑠,𝖺𝗉𝗉𝗌(𝖥𝗂𝗑(¯𝑒,𝑗),[𝑚,𝑥𝑠])]). Thus the explicit fix application on 𝑥𝑠, not the kernel case branch arity, creates the induction hypothesis.
Exercise 89.7.
The frozen archive gives the following exact witnesses and gaps. Unqualified filenames below are under pcuic/theories/; other paths name their archive roots explicitly.
Confluence. PCUICConfluence.v completes red_confluence.
Subject reduction. PCUICSR.v admits sr_red1; subject_reduction is derived from that admitted environment property.
Validity, strengthening, principality, and normalization. pcuic/theories/PCUICValidity.v admits validity; pcuic/theories/PCUICSafeLemmata.v admits the declaration strengthening at line 1283 of the frozen file; pcuic/theories/PCUICPrincipality.v admits principal_typing; and pcuic/theories/PCUICSN.v declares normalisation as an axiom and admits normalisation’.
Proof irrelevance in graph equality. The comment immediately before graph_eq in template-coq/theories/common/uGraph.v marks its proof-irrelevance step; the lemma identifies canonical graph representations and is consumed by the safe checker.
Safe checker. safechecker/theories/PCUICSafeChecker.v admits check_one_ind_body, add_uctx_make_graph, gc_of_constraints_union, and no_prop_levels_union; it declares graph_eq as an axiom. Its typecheck_program definition has a dependent, squashed typing conclusion, so safe-checker soundness is conditional on this theory base. Checker completeness is separately open: pcuic/theories/PCUICCheckerCompleteness.v contains only its license header and no completeness declaration.
Erasure. erasure/theories/ErasureCorrectness.v proves erases_correct, relative to well-formed typing and weak call-by-value. Consequently canonicity and consistency remain open. The paper’s first-order erasure corollaries are explicitly nonmechanized and therefore occupy a separate status cell. No result from the living MetaRocq checkout changes any of these historical cells.