123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498 |
- The correctness of the algorithm relies on the fact that we only compute with
- well-typed terms. This guarantees the existence of normal forms, and hence,
- ensures the termination of the type checking algorithm.
- The proof will be done in two stages: first we prove soundness in the absence
- of constraint solving, and then we prove that constraint solving is sound.
- \subsection{Soundness without constraint solving}
- There are a number of things we need to prove: that type checking preserves
- well-formed signatures, that it produces well-typed terms, that conversion
- checking is sound, and that new signatures respect the old signatures.
- Unfortunately these properties are all interdependent, so we cannot prove them
- separately.
- \begin{definition}[Signature extension] \label{defSigExt}
- We say that $\Sigma'$ {\em extends} $\Sigma$ if for any {\Core}
- judgement $J$, $\vdash_\Sigma J$ implies $\vdash_{\Sigma'} J$.
- \end{definition}
- Note that this definition admits both simple extensions--adding a new
- constant--and refinement, where we give a definition to a constant.
- \if \DetailedProofs 1
- This is expressed by the following two lemmas.
- \begin{lemma}[Signature weakening] \label{lemWeakenSig}
- If $\Sigma' = \Ext \Sigma {c:A}$ and $\IsSigCS {\Sigma'}$ then $\Extends
- {\Sigma'} \Sigma$.
- \end{lemma}
- \begin{lemma}[Signature refinement] \label{lemRefineSig}
- Giving a definition to a constant in a signature is an extension of the
- signature.
- \if \DetailedProofs 1
- More precisely, if
- \begin{itemize}
- \item $\HasTypeCS {\Sigma_1} {} M A$
- \item $\Sigma ~ = ~ \Ext {\Sigma_1} \Ext {\MetaDecl c A} \Sigma_2$
- \item $\Sigma' ~ = ~ \Ext {\Sigma_1} \Ext {\IMetaDecl c A M} \Sigma_2$
- \end{itemize}
- then $\Extends {\Sigma'} \Sigma$.
- \fi
- \end{lemma}
- \fi
- \if \DetailedProofs 1
- \begin{proof}[Proofs]
- In both lemmas any derivation using $\Sigma$ is immediately valid also with $\Sigma'$.
- \end{proof}
- \fi
- \if \DetailedProofs 1
- To express the soundness of conversion checking we need to define when a
- constraint is well-formed. Note that this is not the same as being true. For
- instance, $\TypeConstr {\mathit{Nat}} {\mathit{Bool}}$ is a well-formed
- constraint given $\mathit{Nat} : \SET$ and $\mathit{Bool} : \SET$ in the
- signature.
- \begin{definition}[Well-formed constraint]
- A constraint if well-formed if the terms (or types) under consideration are
- well-typed.
- \if \DetailedProofs 1
- \[
- \infer{ \ValidConstr \Sigma {\TypeConstr A B}}
- {\begin{array}{l}
- \IsTypeCS \Sigma \Gamma A \\
- \IsTypeCS \Sigma \Gamma B
- \end{array}}
- \qquad
- \infer{ \ValidConstr \Sigma {\TermConstr M N A}}
- {\begin{array}{l}
- \HasTypeCS \Sigma \Gamma M A \\
- \HasTypeCS \Sigma \Gamma N A \\
- \end{array}}
- \]
- \else
- For instace, $\TermConstr M N A$ is well-formed if $\HasTypeC
- \Gamma M A$ and $\HasTypeC \Gamma N A$.
- \fi
- \end{definition}
- \fi
- Now we are ready to state the soundness of the type checking algorithm in the
- absence of constraint solving.
- \begin{theorem}[Soundness of type checking] \label{thmSoundNoCs}
- Type checking produces well-typed terms, conversion checking produces
- well-formed constraints and if no constraints are produced, the conversion
- is valid in {\Core}. Also, all rules produce well-formed extensions of the
- signature.
- \if \DetailedProofs 1
- \begin{itemize}
- % is type
- \item
- $\begin{array}[t]{l}
- \ExplicitJudgement \Sigma {\IsType e A} {\Sigma'}
- ~ \wedge ~ \IsCtxCS \Sigma \Gamma \\
- {} \implies \Extends {\Sigma'} {\Sigma}
- ~ \wedge ~ \IsTypeCS {\Sigma'} \Gamma A
- \end{array}$
- % check type
- \item
- $\begin{array}[t]{l}
- \ExplicitJudgement \Sigma {\CheckType e A M} {\Sigma'}
- ~ \wedge ~ \IsTypeCS \Sigma \Gamma A \\
- {} \implies \Extends {\Sigma'} {\Sigma}
- ~ \wedge ~ \HasTypeCS {\Sigma'} \Gamma M A
- \end{array}$
- % infer type
- \item
- $\begin{array}[t]{l}
- \ExplicitJudgement \Sigma {\InferType e A M} {\Sigma'}
- ~ \wedge ~ \IsCtxCS \Sigma \Gamma \\
- {} \implies \Extends {\Sigma'} {\Sigma}
- ~ \wedge ~ \HasTypeCS {\Sigma'} \Gamma M A
- \end{array}$
- % equal types
- \item
- $\begin{array}[t]{l}
- \ExplicitJudgement \Sigma {\EqualType A B \Cs} {\Sigma'}
- ~ \wedge ~ \IsTypeCS \Sigma \Gamma A
- ~ \wedge ~ \IsTypeCS \Sigma \Gamma B
- \\
- {} \implies \Extends {\Sigma'} {\Sigma}
- ~ \wedge ~ \ValidConstr {\Sigma'} \Cs
- ~ \wedge ~ (\Cs = \emptyset \implies \EqualTypeCS {\Sigma'} \Gamma A B)
- \end{array}$
- % equal terms
- \item
- $\begin{array}[t]{l}
- \ExplicitJudgement \Sigma {\Equal M N A \Cs} {\Sigma'}
- ~ \wedge ~ \HasTypeCS \Sigma \Gamma M A
- ~ \wedge ~ \HasTypeCS \Sigma \Gamma N A
- \\
- {} \implies \Extends {\Sigma'} {\Sigma}
- ~ \wedge ~ \ValidConstr {\Sigma'} \Cs
- ~ \wedge ~ (\Cs = \emptyset \implies \EqualCS {\Sigma'} \Gamma M N A)
- \end{array}$
- \end{itemize}
- The statements for weak head normal form conversion ($\EqualWhnf M N A
- \Cs$) and term sequence conversion ($\Equal {\bar M} {\bar N} \Delta \Cs$)
- are equivalent to that of term conversion.
- \fi
- \end{theorem}
- \begin{proof}
- By induction on the derivation.
- \if \DetailedProofs 1
- Some interesting cases:
- \begin{itemize}
- \item {\em (TODO: Not so interesting)} In the type conversion case for
- function spaces where the domains produce constraints, we have to use
- Lemma~\ref{lemCoreSubstType}.
- \item In the term conversion case where the terms are weak head
- normalised we need subject reduction for weak head normalisation
- (Lemma~\ref{lemCoreSubjectReduction}).
- \item When checking conversion of terms with the same head we need an
- inversion principle for application (Lemma~\ref{lemCoreAppInv}).
- \item The most interesting case is the meta-variable instantiation
- case, so let us spell that out in more detail.
- The instantiation rule does not produce any constraints, so the only
- thing we have to prove is that it constructs a valid extension of the
- signature. This follows from the signature refinement lemma
- (Lemma~\ref{lemRefineSig}) which can be applied if we prove that if
- $\Sigma = \Ext {\Sigma_1} \Ext {\MetaDecl \alpha {B'}} \Sigma_2$ then
- $\LAM {\bar x} M : {B'}$.
- We have $\HasTypeCS \Sigma \Gamma {\alpha \, \bar x} A$ so $B'$ must
- have the form $\PI {\bar x} \Delta B$. By Lemma~\ref{lemCoreAppInv} we
- conclude that $\HasTypeCS \Sigma \Gamma {\bar x} \Delta$ and thus
- $\HasTypeCS \Sigma \Gamma {\alpha \, \bar x} B$. Then by
- Lemma~\ref{lemCoreEqType} $\EqualTypeCS \Sigma \Gamma A B$.
- From $\HasTypeCS \Sigma \Gamma M A$ we get $\HasTypeCS \Sigma \Gamma M
- B$ and using Lemma~\ref{lemCoreShadow} $\HasTypeCS \Sigma \Gamma {\LAM
- {\bar x} M} {\Delta \to B}$. We know that $\Delta \to B$ is a closed
- type, and since $\FV{M} \subseteq \bar x$, $\LAM {\bar x} M$ is also
- closed. Thus by strenghtening (Lemma~\ref{lemCoreStrengthen})
- $\HasTypeCS \Sigma {} {\LAM {\bar x} M} {\Delta \to B}$. We have
- $\IsTypeCS {\Sigma_1} {} {\Delta \to B}$ and $\InScope \alpha M$ so
- $\HasTypeCS {\Sigma_1} {} {\LAM {\bar x} M} {\Delta \to B}$ which is
- what we set out to prove.
- \end{itemize}
- \else
- The most interesting case is the meta-variable instantiation case where we
- have to prove that the instantiation constructs a valid extension of the
- signature. This is proven by showing that the instantiation is well-typed.
- % This follows from Lemma~\ref{lemRefineSig} once we show that
- % the instantiation is well-typed.
- \fi
- \end{proof}
- Since well-typed terms in {\Core} have normal forms we get the existence of
- normal forms for type checked terms and hence the type checking algorithm is
- terminating.
- \begin{corollary}
- The type checking algorithm is terminating.
- \end{corollary}
- Note that type checking terminates with one of three answers: {\em yes it is
- type correct}, {\em no it is not correct}, or {\em it might be correct if the
- meta-variables are instantiated properly}. The algorithm is not complete, since
- finding correct instantiations to the meta-variables is undecidable in the
- general case.
- \subsection{Soundness of constraint solving}
- In the previous section we proved type checking sound and decidable in the
- absence of constraint solving. We also mostly ignored the constraints, only
- requiring them to be well-formed. In this section we prove that the terms
- produced by the type checker stay well-typed under constraint solving. This is
- done by showing that constraint solving is a signature extension operator in
- the sense of Definition~\ref{defSigExt}.
- Previously we only ensured that the {\Core} restriction of the signature was
- well-formed. Now, since we are going to update and remove the constraints of
- guarded constants we have to strengthen the requirements and demand {\em
- consistent} signatures. A signature is consistent if the solution of a guard is
- a sufficient condition for the well-typedness of the definition it is guarding.
- \if \DetailedProofs 1
- \begin{definition}[Ensures] \label{defEnsures}
- A set of constraints $\Cs$ {\em ensures} a {\Core} judgement $J$ in a signature
- $\Sigma$ if, for any $\Sigma_1$ such that
- $\Extends {\Sigma_1} \Sigma$ and
- $\ExplicitJudgement {\Sigma_1} {\CheckConstr \Cs \emptyset} {\Sigma_2}$
- it is the case that $\vdash_{\CoreSig{\Sigma_2}} J$.
- \end{definition}
- \begin{remark} \label{lemExtendEnsures}
- If $\Cs$ ensures $J$ in $\Sigma$ and $\Extends {\Sigma'} \Sigma$ then $\Cs$
- ensures $J$ in $\Sigma'$.
- \end{remark}
- \begin{definition}[Consistent signature] \label{defConsistentSig}
- A signature $\Sigma$ is said to be {\em consistent} if $\Sigma = \Ext
- {\Sigma_1} \Ext {\ConstDecl p A M \Cs} \Sigma_2$ implies that $\Cs$ ensures
- $\HasTypeC {} M A$ in $\Sigma_1$.
- \end{definition}
- \fi
- In order to prove that type checking preserves consistency, we first need to
- know that the constraints we produce are sound.
- \begin{lemma}[Soundness of generated constraints] \label{lemSoundConstraints}
- The constraints generated during conversion checking ensures that the
- checked terms are convertible. For instance, if $\EqualType A B \Cs$, then
- solving $\Cs$ guarantees that $\EqualTypeC \Gamma A B$ in {\Core}.
- \if \DetailedProofs 1
- More precisely,
- \begin{itemize}
- \item \( \begin{array}[t]{l}
- \IsTypeCS \Sigma \Gamma A
- ~ \wedge ~ \IsTypeCS \Sigma \Gamma B
- ~ \wedge ~ \ExplicitJudgement \Sigma {\EqualType A B \Cs} {\Sigma'}
- \\ {} \implies \mbox{$\Cs$ ensures $\EqualTypeC \Gamma A B$ in $\Sigma'$}
- \end{array} \)
- \item \( \begin{array}[t]{l}
- \HasTypeCS \Sigma \Gamma M A
- ~ \wedge ~ \HasTypeCS \Sigma \Gamma N A
- ~ \wedge ~ \ExplicitJudgement \Sigma {\Equal M N A \Cs} {\Sigma'}
- \\ {} \implies \mbox{$\Cs$ ensures $\EqualC \Gamma M N A$ in $\Sigma'$}
- \end{array} \)
- \end{itemize}
- \fi
- \end{lemma}
- \if \DetailedProofs 1
- \begin{proof}
- Again we highlight some interesting cases.
- \begin{itemize}
- \item
-
- The only difficult case is the case of conversion for function types
- where a new constant $p$ is introduced. There we need to prove
- $\EqualTypeCS {\Sigma_2} {\Ext \Gamma x : A_1} {B_1} {B_2}$ from
- $\EqualTypeCS {\Sigma_2} {\Ext \Gamma x : A_1} {B_1} {\SubstD {B_2} {p
- \, \Gamma \, x}}$
- If $\Sigma_2$ has an empty guard for $p$ then $p \, \Gamma \, x$
- reduces to $x$ and we are done. If the guard is non-empty we can apply
- Lemma~\ref{lemCoreEqualDummySubst}, since $p \, \Gamma \, x$ is on weak
- head normal form, and $p$ is a fresh constant which does not appear in
- $B_1$.
- \item In the case where $\Cs$ is known (for instance, in the rule for
- blocked terms), we can apply soundness of conversion checking
- (Theorem~\ref{thmSoundNoCs}) to get $\TrueConstr {\Sigma_2} \Cs$.
- \end{itemize}
- \end{proof}
- \fi
- \if \DetailedProofs 1
- \begin{lemma} \label{lemRefineConsistent}
- Refinement preserves consistent signatures.
- More precisely, if
- \begin{itemize}
- \item $\HasTypeCS {\Sigma_1} {} M A$
- \item $\Sigma ~ = ~ \Ext {\Sigma_1} \Ext {\MetaDecl c A} \Sigma_2$
- \item $\Sigma' ~ = ~ \Ext {\Sigma_1} \Ext {\IMetaDecl c A M} \Sigma_2$
- \item $\Sigma$ is consistent
- \end{itemize}
- then $\Sigma'$ is consistent.
- \end{lemma}
- \begin{proof}
- There are two cases to consider: refinement to the left and to the right of
- a guard. In the latter case the proof is trivial, and in the former case
- consistency follows from the fact that refinement extends a signature
- (Lemma~\ref{lemRefineSig}).
- \end{proof}
- \fi
- \begin{lemma}[Type checking preserves consistency] \label{lemTypeCheckConsistent}
- Type checking and conversion checking preserves consistent signatures.
- \if \DetailedProofs 1
- More precisely,
- \begin{itemize}
- % is type
- \item
- $\begin{array}[t]{l}
- \ExplicitJudgement \Sigma {\IsType e A} {\Sigma'}
- ~ \wedge ~ \IsCtxCS \Sigma \Gamma
- ~ \wedge ~ \mbox{$\Sigma$ is consistent}
- \\ {} \implies \mbox{$\Sigma'$ is consistent}
- \end{array}$
- % check type
- \item
- $\begin{array}[t]{l}
- \ExplicitJudgement \Sigma {\CheckType e A M} {\Sigma'}
- ~ \wedge ~ \IsTypeCS \Sigma \Gamma A
- ~ \wedge ~ \mbox{$\Sigma$ is consistent}
- \\ {} \implies \mbox{$\Sigma'$ is consistent}
- \end{array}$
- % infer type
- \item
- $\begin{array}[t]{l}
- \ExplicitJudgement \Sigma {\InferType e A M} {\Sigma'}
- ~ \wedge ~ \IsCtxCS \Sigma \Gamma
- ~ \wedge ~ \mbox{$\Sigma$ is consistent}
- \\ {} \implies \mbox{$\Sigma'$ is consistent}
- \end{array}$
- % equal types
- \item
- $\begin{array}[t]{l}
- \ExplicitJudgement \Sigma {\EqualType A B \Cs} {\Sigma'}
- ~ \wedge ~ \IsTypeCS \Sigma \Gamma A
- ~ \wedge ~ \IsTypeCS \Sigma \Gamma B \\
- ~ \wedge ~ \mbox{$\Sigma$ is consistent}
- \\ {} \implies \mbox{$\Sigma'$ is consistent}
- \end{array}$
- % equal terms
- \item
- $\begin{array}[t]{l}
- \ExplicitJudgement \Sigma {\Equal M N A \Cs} {\Sigma'}
- ~ \wedge ~ \HasTypeCS \Sigma \Gamma M A
- ~ \wedge ~ \HasTypeCS \Sigma \Gamma N A \\
- ~ \wedge ~ \mbox{$\Sigma$ is consistent}
- \\ {} \implies \mbox{$\Sigma'$ is consistent}
- \end{array}$
- \end{itemize}
- The statements for weak head normal form conversion ($\EqualWhnf M N A
- \Cs$) and term sequence conversion ($\Equal {\bar M} {\bar N} \Delta \Cs$)
- are equivalent to that of term conversion.
- \fi
- \end{lemma}
- \begin{proof}
- \if \DetailedProofs 1
- By induction on the derivation. We only need to consider the cases where
- the signature changes. Adding a (non-guarded) constant trivially preserves
- consistency, instantiating a meta-variable preserves consistency by
- Lemma~\ref{lemRefineConsistent}. What remains is to check that new guarded
- constants are consistent. There are two cases: the conversion rule and
- conversion checking of function types. In both cases consistency follows
- from soundness of conversion checking (Lemma~\ref{lemSoundConstraints}).
- \else
- We have to prove that when we introduce a guarded constant the guard
- ensures the well-typedness of the value. This follows from
- Lemma~\ref{lemSoundConstraints}.
- \fi
- \end{proof}
- \begin{lemma}[Constraint solving is sound] \label{lemSolveConsistent}
- If $\Sigma$ is consistent and the solving the constraints yields a
- signature $\Sigma'$, then $\Sigma'$ is consistent and $\Extends {\Sigma'}
- \Sigma$.
- \end{lemma}
- \begin{proof}
- Follows from Theorem~\ref{thmSoundNoCs}, Lemma~\ref{lemSoundConstraints},
- and Lemma~\ref{lemTypeCheckConsistent}.
- \end{proof}
- From this follows that we can mix type checking and constraint solving freely,
- so we can add a constraint solving rule to the type checking algorithm. In
- order to obtain optimal approximations we have to solve constraints eagerly,
- i.e as soon as a meta-variable has been instantiated.
- \subsection{Relating user expressions and checked terms}
- An important property of the type checking algorithm is that the type correct terms
- produced correspond to the expressions being type checked. The correspondance
- is expressed by stating that the only operations the type checker is allowed
- when constructing a term is replacing a $?$ by a term ({\em refinement}) and
- replacing a term by a guarded constant ({\em approximation}).
- \if \DetailedProofs 1
- \begin{definition}[Approximation]
- A term $M$ {\em approximates} $M'$ if $M$ can be obtained by replacing
- subterms of $M'$ by guarded constants $p \, \bar x$.
- \end{definition}
- \begin{definition}[Refinement]
- A term $M$ is a {\em refinment} of a user expression $e$ if $M$ can be
- obtained by replacing the $?$ in $e$ by concrete terms.
- \end{definition}
- \fi
- \begin{lemma} \label{lemApproxRefine}
- If $\CheckType e A M$ then $M$ approximates a refinement of $e$. This
- property is preserved when unfolding instantiated meta-variables and
- guarded constants in $M$.
- \end{lemma}
- \begin{lemma}
- If $\CheckType e A M$ then $M$ is an {\em optimal approximation} of a
- refinement $M'$ of $e$.
- \end{lemma}
- \begin{proof}
- The proof relies on the fact that we only introduce guarded constants when
- absolutely necessary and solve the constraints eagerly. This is proven by
- showing that the constraints produced by conversion checking are not only
- sufficient but also necessary for the validity of the judgement.
- \end{proof}
- \subsection{Main result}
- We now prove the main soundness theorem stating that if all meta-variables are
- instantiated and all guards solved, then the term produced by the type checker
- (extended with constraint solving) is valid in the original signature after
- unfolding the definitions of the meta-variables and guarded constants
- introduced during type checking.
- \begin{theorem}[Soundness of type checking] \label{thmMain}
- If $\Sigma$ is a well-formed {\Core} signature and $\ExplicitJudgement
- \Sigma {\CheckType e A M} {\Sigma'}$, then if all meta-variables have been
- instantiated and all guards are empty in $\Sigma'$, then $\HasTypeCS \Sigma
- \Gamma {M\sigma} A$ where $\sigma$ is the substitution inlining the meta
- variables and constants in $\Sigma'$. Moreover, $M\sigma$ is a refinement
- of $e$.
- \end{theorem}
- \if \DetailedProofs 1
- \begin{proof}
- From Theorem~\ref{thmSoundNoCs} follows that $\HasTypeCS {\Sigma'} \Gamma M
- A$ and Lemma~\ref{lemTypeCheckConsistent} and
- Lemma~\ref{lemSolveConsistent} give that $\Sigma'$ is a consistent
- extension of $\Sigma$. Thus $\sigma$ is well-typed and we have $\HasTypeCS
- {\Sigma'} \Gamma {M\sigma} A$.
- Since $M\sigma$ only uses constants from $\Sigma$ we can strengthen the
- signature to obtain $\HasTypeCS \Sigma \Gamma {M\sigma} A$.
- By Lemma~\ref{lemApproxRefine} we have that $M\sigma$ approximates a
- refinement of $e$. Since $M\sigma$ does not contain any guarded constants
- it is a refinement of $e$.
- \end{proof}
- \fi
|