简单类型Lambda演算(2)

2019-08-05  本文已影响0人  卷毛宿敌大小姐

在前一部分中, 我们简单的学习了Lambda calculus的定义。既然是给lambda演算添加了类型,那么我们自然是希望这个类型系统真的能够减少出现不能归约的错误类型,是一个真正可靠的系统。最直接的方式就是使用定理证明器来证明一下我们在类型系统中学习过的性质。

0X00 经典形式(Canonical Forms)

之前在介绍类型系统的时候我们证明过, 有的形式的值可以被看作是经典形式,如果看到这种形式,我们立马可以推测出是哪种值。STLC的两种值类型, bool类型和箭头类型,自然也有对应的经典形式。
形式化的有:

Lemma canonical_forms_bool : ∀t,
  empty ⊢ t ∈ Bool →
  value t →
  (t = tru) ∨ (t = fls).

Lemma canonical_forms_fun : ∀t T1 T2,
  empty ⊢ t ∈ (Arrow T1 T2) →
  value t →
  ∃x u, t = abs x T1 u.

0X01 Progress

定义良好的类型关系的重要性质就是, 一个封闭的类型良好的项是不会阻塞的。

Theorem progress : ∀ t T,
  empty ⊢ t ∈ T →
  value t ∨ ∃t', t --> t'.

接下来,针对STLC, 证明这条性质。
Proof
empty ⊢ t ∈ T进行归纳证明:

0X02 自由变量

之前说过了,我们的替换操作只能对 自由出现(free occurance)进行替换, 所以首先来定义一下什么样子的上下文能满足自由替换。

Definition
如果满足以下几种不同情况之一,那么我们称变量x自由出现在满足上下文Gamma的项目t中

形式化的有

Inductive appears_free_in : string → tm → Prop :=
  | afi_var : ∀x,
      appears_free_in x (var x)
  | afi_app1 : ∀x t1 t2,
      appears_free_in x t1 →
      appears_free_in x (app t1 t2)
  | afi_app2 : ∀x t1 t2,
      appears_free_in x t2 →
      appears_free_in x (app t1 t2)
  | afi_abs : ∀x y T11 t12,
      y ≠ x →
      appears_free_in x t12 →
      appears_free_in x (abs y T11 t12)
  | afi_test1 : ∀x t1 t2 t3,
      appears_free_in x t1 →
      appears_free_in x (test t1 t2 t3)
  | afi_test2 : ∀x t1 t2 t3,
      appears_free_in x t2 →
      appears_free_in x (test t1 t2 t3)
  | afi_test3 : ∀x t1 t2 t3,
      appears_free_in x t3 →
      appears_free_in x (test t1 t2 t3).

如在一个项中没有自由变量,那么我们称该项封闭(closed).
形式化的有

Definition closed (t:tm) :=
  ∀x, ¬appears_free_in x t.

0X03 替换(substitution)

在证明替换都是安全的之前,我们需要先证明一个引理
Lemma
如果x在项t中自由出现,且项t类型良好(well-typed),那么上下文Gamma中必然存在一个x的偏射。
形式化的有

Lemma free_in_context : ∀x t T Gamma,
   appears_free_in x t →
   Gamma ⊢ t ∈ T →
   ∃T', Gamma x = Some T'.

这个引理其实是比较显然的,也比较好证明,归纳自由出现的关系就行了,根据归纳假设就可证明.

有一个比较显然的推论:
Corollary
如果一个项在空上下文中类型良好,那么这个项是封闭的。

在证明安全替换不改变类型之前,首先我们先证明一下上下问在替换中满足的性质。

Lemma
在安全替换的过程中,我们的上下文可能会发生改变,但是上下文的这种改变应该不能改变原本项目的类型。
形式化的有

Lemma context_invariance : ∀Gamma Gamma' t T,
     Gamma ⊢ t ∈ T →
     (∀x, appears_free_in x t → Gamma x = Gamma' x) →
     Gamma' ⊢ t ∈ T.

Proof
首先因为我们并不知道变化后的Gamma‘会是什么,这个和具体的变化有关,所以在这里,我们范化Gamma',对类型关系 Gamma ⊢ t ∈ T进行归纳。

综上,归纳得原命题成立
Q.E.D.

然后我们就可以证明安全替换不会改变类型了!!
形式化的有
Lemma

Lemma substitution_preserves_typing : ∀Gamma x U t v T,
  (x ⊢> U ; Gamma) ⊢ t ∈ T →
  empty ⊢ v ∈ U →
  Gamma ⊢ [x:=v]t ∈ T.

Proof
泛化Gamma T, 对t进行归纳证明

Q.E.D.

0X04 Preservation

有了上面的结论我们终于可以证明类型关系在归约过程中不会发生改变了

Theorem preservation : ∀t t' T,
  empty ⊢ t ∈ T →
  t --> t' →
  empty ⊢ t' ∈ T.

其实这里已经满简单了,毕竟除了App之外的case都是平凡的。
Proof
对类型关系empty ⊢ t ∈ T进行归纳证明:

Q.E.D.
这里我写的很简略,主要是其实这里唯一和以前证明的区别就在于出现了替换,我们主要保证,这个替换也没有改变类型那么必然是可以保证类型没有改变的~~

0X05 类型可靠(Type Soundness)

这是 Progress和Preservation的一个推论,在这里就不证明了,和之前类型系统中的基本上一样

0X06 类型唯一性(type uniqueness)

Theorem
一个item只能有一个类型,如果两个item相同那么两个类型就相同。

形式化的有

Theorem unique_types : ∀Gamma e T T',
  Gamma ⊢ e ∈ T →
  Gamma ⊢ e ∈ T' →
  T = T'.

Proof
这个证明真的很没意思。。。。。所有的case基本就是泛化T',然后对Gamma ⊢ e ∈ T 归纳,再反演Gamma ⊢ e ∈ T',加上归纳假设和替换就可以证出来。。。。。真的不是我懒....唯一技术在于怎么用Coq写的短大概,懒得折腾了。


die

上一篇下一篇

猜你喜欢

热点阅读