「SF-PLF」11. TypeChecking
The
has_type
relation is good but doesn’t give us a executable algorithm — 不是一个算法
but it’s syntax directed, just one typing rule for one term (unique typing) — translate into function!
Comparing Types
首先我们需要 check equality for types.
这里非常简单,如果是 SystemF 会麻烦很多,对 ∀
要做 local nameless 或者 alpha renaming:
1 | Fixpoint eqb_ty (T1 T2:ty) : bool := |
然后我们需要一个 refl 和一个 reflection,准确得说:「define equality by computation」,反方向用 refl 即可易证
1 | Lemma eqb_ty_refl : ∀T1, |
The Typechecker
直接 syntax directed,不过麻烦的是需要 pattern matching option
…
1 | Fixpoint type_check (Gamma : context) (t : tm) : option ty := |
在课堂时提到关于 eqb_ty
的一个细节(我以前也经常犯,在 ML/Haskell 中……):
我们能不能在 pattern matching 里支持「用同一个 binding 来 imply 说他们两需要 be equal」?
1 | (** instead of this **) |
the answer is NO because this demands a decidable equality.
我好奇的是,用 typeclass 是不是就可以 bake in 这个功能了?尤其是在 Coq function 还是 total 的情况下
Digression: Improving the Notation
这里我们可以自己定义一个 Haskell do
notation 风格的 monadic notation:
1 | Notation " x <- e1 ;; e2" := (match e1 with |
好看一些吧反正:
1 | Fixpoint type_check (Gamma : context) (t : tm) : option ty := |
Properties
最后我们需要验证一下算法的正确性:
这里的 soundness 和 completess 都是围绕 “typechecking function ~ typing relation inference rule” 这组关系来说的:
1 | Theorem type_checking_sound : ∀Gamma t T, |
Exercise
给 MoreStlc.v
里的 StlcE 写 typechecker, 然后 prove soundness / completeness (过程中用了非常 mega 的 tactics)
1 | (** 还不能这么写 **) |
Extra Exercise (Prof.Mtf)
I believe this part of exercise was added by Prof. Fluet (not found in SF website version)
给 MoreStlc.v
的 operational semantics 写 Interpreter (stepf
), 然后 prove soundness / completeness…
step
vs. stepf
首先我们定义了 value
关系的函数版本 valuef
,
然后我们定义 step
关系的函数版本 stepf
:
以 pure STLC 为例:
1 | Inductive step : tm -> tm -> Prop := |
1 | Fixpoint stepf (t : tm) : option tm := |
对于关系,一直就是 implicitly applied 的,在可用时即使用。
对于函数,我们需要手动指定 match 的顺序stepf t1 => None
只代表这是一个normal form
,但不一定就是value
,还有可能是 stuck 了,所以我们需要额外的assert
ion. (失败时返回异常)
dynamics 本身与 statics 是正交的,在typecheck
之后我们可以有progress
,但是现在还没有
Soundness
1 | Theorem sound_stepf : forall t t', |
证明用了一个 given 的非常夸张的 automation…
不过帮助我找到了 stepf
和 step
的多处 inconsistency:
- 3 次做
subst
时依赖的valuef
不能省 valuef pair
该怎么写才合适?
最后把step
中的value p ->
改成了value v1 -> value v2 ->
,
因为valuef (pair v1 v2)
出来的valuef v1 && valuef v2
比较麻烦。
但底线是:两者必须 consistent! 这时就能感受到 Formal Methods 的严谨了。
Completeness
发现了 pair 实现漏了 2 个 case……然后才发现了 Soundness
自动化中的 valuef pair
问题
Extra (Mentioned)
Church Style vs. Curry Style
Rice’s Theorem
CakeML
- prove correctness of ML lang compiler
- latest paper on verifying GC