This commit is contained in:
Tan, Kian-ting 2024-12-25 00:38:19 +08:00
commit cab03d63ec
7 changed files with 387 additions and 0 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
pkg

Binary file not shown.

View file

@ -0,0 +1,50 @@
#import "pkg/prooftrees.typ"
#import "pkg/internal.typ"
#show regex("\p{sc=Hani}+"): set text(font: ("Noto Serif CJK SC"), lang: "zh", region: "tw")
= Type Theory And Formal Proof
== 3. Second order typed lambda calculus 二階有型別lambda運算
=== 3.1 型別抽象與型別套用
$x -> lambda x \. M$$M$中所有裡面的$x$變成bound variable約束變數
$lambda x : sigma : M$ 取決於(depends on)term $x$ => $lambda_arrow.r$可以terms depends on the terms
$M N$是型別的應用
如此可說是一階(first order)抽象
本章討論terms depend on types (second order operation/second order dependency) 可以理解成依型別值(?)
本章討論$lambda 2$二階具型別lambda演算
範例:$id(x)=x$函數
若是自然數,則有$lambda x : \n\a\t . space x : \n\a\t -> \n\a\t $
若是布林值,則有$lambda x : italic("bool") . space x : \b\o\o\l -> \b\o\o\l $
還有函數$lambda x : (\n\a\t->\b\o\o\l) . space x : (\n\a\t->\b\o\o\l) -> (\n\a\t->\b\o\o\l) $
可是這樣函數要每個型別就重複定義一次,有無更好的方法?
我們需要定義一個任意型別$alpha$,變成:$f equiv lambda x : alpha space . x$
但是對於$M in \n\a\t$$f space M$是invalid因為$alpha equiv.not \n\a\t$。所以要進行抽象化:
$lambda alpha : ast . lambda x : alpha . x$
其中$alpha$ 是type$ast$是kind。
所以
$(lambda alpha : ast . lambda x : alpha . x ) \n\a\t $
$arrow.twohead.r_beta lambda x : \n\a\t . space x$
$(lambda alpha : ast . lambda x : alpha . x ) (\b\o\o\l->\n\a\t) $
$arrow.twohead.r_beta lambda x : (\b\o\o\l->\n\a\t) . space x$
然而我們需要$beta$-reduction

Binary file not shown.

View file

@ -0,0 +1,223 @@
#show regex("\p{sc=Hani}+"): set text(font: ("Noto Serif CJK TC"), lang: "zh", region: "tw")
#set par(leading: 1.25em) // 行距
=== 2.8 型別檢查於$lambda arrow.r$
$x : alpha arrow.r alpha, space y : (alpha arrow.r alpha) arrow.r beta tack.r (lambda z : beta . lambda u : gamma .z)(y space x): gamma arrow.r beta $
```(a)| ``` \*$x : alpha arrow.r alpha$\*
```(b)||``` \*$y : (alpha arrow.r alpha) arrow.r beta$\*
``` || ...```
```(n)||```$(lambda z : beta . lambda u : gamma .z)(y space x): gamma arrow.r beta$
appl 拆解
```(a) | ``` \*$x : alpha arrow.r alpha$\*
```(b) ||``` \*$y : (alpha arrow.r alpha) arrow.r beta$\*
``` (m1)|| ``` $lambda z : beta . lambda u : gamma .z:?_1$
``` (m2)|| ``` $y space x:?_2$
```(n) ||```$(lambda z : beta . lambda u : gamma .z)(y space x): gamma arrow.r beta$
繼續反推
```(a) | ``` \*$x : alpha arrow.r alpha$\*
```(b) ||``` \*$y : (alpha arrow.r alpha) arrow.r beta$\*
``` ||| ``` \*$z : beta$\*
``` |||| ``` \*$u : gamma$\*
``` |||| ``` $lambda u.z : gamma -> beta$
``` (m1)|| ``` $lambda z : beta . lambda u : gamma .z:beta->(gamma->beta)$
``` (m2)|| ``` $y space x:beta$
```(n) ||```$(lambda z : beta . lambda u : gamma .z)(y space x): gamma arrow.r beta$
就可以得到一串推論過程。
但是,$(lambda z: beta lambda u : gamma .z )(y space x)$
用beta-reduction處理可得
$(lambda u : gamma .(y space x))$
型別是:$gamma arrow.r beta$,也和剛才的推論出來的(n)的型別相同。
=== 2.9 找term於$lambda ->$
$a in T =>$ a 是 T 的inhabitant居民
type 是邏輯表達式(proposition)
term構築型別的證明
證明有一個term滿足
$?:A->B->A$
證明法:逆著回推,箭頭$->$型別表示abst抽象。
#pagebreak()
```|```\*$x:A$\*
```||```\*$y:B$\*
```||``` $x : A$
```|``` $lambda y. x : B->A$
$lambda x.lambda y.x : A->B->A$
PAT-interpretation
- proposition as types命題即型別
- proof as terms證明即term
=== 2.10 $lambda -> $的一般性質
dom、$harpoon.tr$投影(projection)、$subset.eq$次上下文(subcontext)
定義
1. 上下文:$Gamma equiv x_1 : sigma_1, ..., x_n: sigma_n=>$即上下文的定義域(domain)是$(x_1, x_2, ..., x_n)$
2. 若所有的宣告變數一樣,且排序一致,則$Gamma' subset.eq Gamma$,即$Gamma'$是$Gamma$的次上下文
3. $Gamma'$是$Gamma$上下文的permutation(排列),若$Gamma'$的變數宣告於$Gamma$有,且反之亦然。
4. 若$Gamma$是上下文,$Phi$是變數集合,$Gamma$在$Phi$上的投影(projection),即$Gamma harpoon.tr Phi$是$Gamma'$,滿足$d o m ( Gamma')= d o m(Gamma) sect Phi$.
定理2.10.3自由變數公理
$Gamma tack.r L:sigma => F V(L) subset.eq d o m(Gamma)$
任何自由變數x在L出現則在$Gamma$有$x:sigma$這個宣告。
任何變數的型別不會搞混。
Lemma 2.10.5
1. thinning(厚化): 令$Gamma'$和$Gamma''$是滿足$Gamma' subset.eq Gamma''$的上下文,$Gamma' tack.r M : sigma => Gamma'' tack.r M : sigma$
2. condensing(濃縮): $Gamma tack.r M: sigma => Gamma harpoon.tr F V\(M\) tack.r M : sigma $. 意思是可以移除$x:sigma$若是x不是M的自由變數所以保持這些和M有關的宣告。
3. Permutation(排列): 若$Gamma tack.r M:sigma $且 $Gamma'$是$Gamma$的permutation則$Gamma'$是上下文,滿足$Gamma' tack.r M : sigma$. 指context的變數順序不影響推演能力變數宣告互相獨立
一個人可以加減junk變數到上下文而不影響衍推能力(derivibility)。
junk包含於M中不自由的變數typing的過程不會用到
Lemma 2.10.7 - Generation Lemma
1. $Gamma tack.r x : sigma => x : sigma in Gamma$
2. if $Gamma tack.r M space N:tau$, then $exists sigma, space s.t. space Gamma tack.r M : sigma -> tau $ and $Gamma tack.r N : sigma $
3. $Gamma tack.r lambda x : sigma . M : rho => exists tau space s.t. space Gamma, x : sigma tack.r M : tau and rho equiv sigma -> tau$
Lemma 2.10.8 subterm Lemma
若M是legal$=>$任何M的subterm也legal。
if $exists Gamma_1, space sigma_1 space s.t. space Gamma_1 tack.r M:sigma_1$ 且L為M的subterm$=> exists Gamma_2, sigma_2 space s.t. space Gamma_2 tack.r L : sigma_2$
在一個上下文F一個term至多有一個type也就是
$Gamma tack.r M : sigma and Gamma tack.r M : tau => gamma equiv tau$
我們可以分出4種求型別或term的類型
1. well-typeness
? $tack.r $ term: $ ?$
1a. type assignment
context $tack.r$ term : ?
2. type checking
#set math.vec(delim: none)
context $vec( ?, tack.r)$ term: type
#set math.vec(delim: "(")
3. term finding
context $tack.r ? :$ type
以上4種皆為decidible可決定的
=== Sec.2.11 歸約與 $lambda arrow.r$
Ch1.6有beta-reduction$beta$歸約)的公式:
1a) x[x:=N]≡N // x:=N 即N代入x
1b) y[x:=N]≡y (if x≢y)
2) (P Q)[x:=N]≡(P[x:=N])(Q[x:=N])
3) (λy.P)[x:=N]≡($lambda z.P^(y→z)$[x:=N])若 $lambda z.P^(y→z)$是λy.P的variation且z∉FV(N)
為了型別系統的改變所以我們把3)改為:
***3)(λ$y:sigma$.P)[x:=N]≡($lambda z:sigma . P^(y→z)$[x:=N])*** 若$lambda z: sigma . P ^(y arrow.r z)$是$lambda y : sigma . P$的alpha variant且滿足$z in.not F V (N)$
Lemma 2.11.1替換Lemma
假設$Gamma', x:sigma,Gamma'' tack.r M:tau$且$Gamma' tack.r N : sigma$
則$Gamma', Gamma'' tack.r M[x:=N]:tau$
==== Def 定義 One-step reduction$arrow.r_(beta)$ for $Lambda_(𝕋)$
1. (Basis)
$(lambda x : sigma . M) N arrow.r_(beta)M[x:=N]$
(compatibility)見定義1.8.1。
Theorem 2.11.3
Church-Rosser Theorem ( Theorem 1.9.8)在 $lambda arrow.r$也成立。
Corollary 推論 2.11.4
假設有 $M =_(beta) N$則$exists L space s.t. M arrow.twohead.r_(beta) L$且$N arrow.twohead.r_(beta) L$
Lemma 2.11.5 Subject Reduction:
$Gamma tack.r L : rho$且$L arrow.twohead.r L'$ 則$Gamma tack.r L' : rho$
beta歸約不改變typability和其型別。
Reduction是一種形式的calculation。
$x : alpha arrow.r alpha, y : (alpha arrow.r alpha) arrow.r beta tack.r lambda u : gamma. y space x : gamma arrow.r beta$
任何計算皆為finite有限的
Theorem 2.11.6
strong normalization theorem (Termination theorem)
任何合法的M是strongly normalizing強正規化的
strong normalizing 保證運算有結果
因為$lambda arrow.r$的能力有限,有足夠能力的運算系統會有無法終止的情況發生。雖然能終止的系統也可能要很久(雖然是有限久)才能算出結果。
== 2.12結果
untyped lambda運算的缺點會消失
- 沒有自我代入(self-application)
- 保證有 beta-normal forms
- 不是所有的legal lambda term 都有不動點
== 2.13 結論
positive points of untyped lambda calculation 擴展到簡單型別 lambda 運算
system$lambda arrow.r$太弱,不能封裝所有運算的函數,不能作為數學的形式化。
- call-by-value
$(lambda x : sigma . M) N$先求出N再代入
- call-by-name
$(lambda x : sigma . M) N$直接將N代入M中的各個x$M[x:=N]$

Binary file not shown.

View file

@ -0,0 +1,113 @@
#import "pkg/prooftrees.typ"
#import "pkg/internal.typ"
#show regex("\p{sc=Hani}+"): set text(font: ("Noto Serif CJK SC"), lang: "zh", region: "tw")
= Type Theory And Formal Proof
== 第2章簡單型別lambda運算(simple typed lambda calculus)
=== 2.2 simple type 簡單型別
型別變數 type variable$VV = {alpha, beta, gamma, dots.h}$用希臘字母表示。
$TT$:所有簡單型別,定義如下:
+ 型別變數:$alpha in VV arrow.double alpha in TT $表達基本型別比如list, nat等
+ 箭頭型別:$alpha, tau in TT arrow.double (alpha arrow tau ) in TT$
箭頭$arrow$是右結合的和函數的apply代入不同。比較$alpha arrow beta arrow gamma=(alpha arrow (beta arrow gamma))$和$x_1 x_2 x_3 = ((x_1 x_2) x_3)$。
註:在本書中,$NN$ 和 $LL$ 指數學世界的自然數和列表而nat和list指電腦程式世界的同樣的型別。
「term $M$有類型type、型別$sigma$」寫成$M : sigma$
type有唯一性。比如若$x : sigma$且$x : tau$,則$sigma ≡ tau$
簡單型別lambda演算的出現的推演規則
1. application代入若 $M:sigma arrow.r tau$ 且 $N:sigma$,則 $M N : tau$
2. abstration抽象若 $x:sigma$ 且 $M:tau$,則 $lambda x.M : sigma arrow.r tau$
$(x space x)$在這種情況下,因為不可能既是$x:alpha->beta$且$x:alpha$這種型別存在,所以這種式子不會被構造到。
若$exists sigma "滿足" M:sigma$,則$M$是可賦予型別的(typable)。
=== 2.3 Church-typing (explicit typing) 和 Curry-typing (implicit typing)
+ typing à la Churchexplicit typing外顯型別先給定型別予變數再推出其他表達式的型別。
+ typing à la Curryimplicit typing隱藏型別先給定一個表達式再推論其內變數可能的型別。
explicit typing的案例
設$M≡((lambda x .lambda y. x) (u space v))$,如果$v:alpha -> alpha$$u:(alpha->alpha)->beta$$x : beta$$y:gamma$,則$M: gamma->beta$
implicit typing的案例需要用推理和類似合一 (unification) 的方法):
$M≡((lambda x .lambda y. x) (u space v))$,可以推論:
$v : alpha$
$u : alpha -> beta $
$lambda x .lambda y. x : gamma->delta$
$x : gamma$
$lambda y.x : delta = epsilon -> zeta$
$y : epsilon$
$x : gamma = zeta$
$ lambda y.x : delta = epsilon -> gamma$
$lambda x .lambda y. x : gamma-> epsilon -> gamma$
$(u space v) : beta = gamma $
$u :alpha -> gamma $
$M: epsilon -> gamma$
但是implicit typing的型別變數只是一種示例可以把$beta$用「$omega -> omega$」這種形式取代。
本書常用explicit typing。
我們用上面的explicit typing的範例
$u : (alpha arrow.r alpha) arrow.r beta, v: (alpha arrow.r alpha)$ 可以推論到
$((lambda x . lambda y . x) (u space v)) : beta -> gamma$
則可以寫成:
在上下文$u colon (alpha->alpha)->beta, v colon (alpha->alpha)$下,$((lambda x . lambda y . x) (u space v)) : beta -> gamma$
用形式語言的方式寫出來如下:
$u colon (alpha->alpha)->beta, v colon (alpha->alpha) tack.r ((lambda x .lambda y . x) (u space v)) : beta -> gamma$
$tack.r$ 表示左邊的可以推論到右邊的能力(derivibility)。(註:可以參考弗雷格的著作)
== 2.4 Church lambda→演算的推演規則 (derivation rules)
先賦予型別的lambda term其名為$Lambda_{TT}$,定義如下:
$Lambda_TT = V|(Lambda_𝕋 space Lambda_𝕋)|(λ V : 𝕋 . Lambda_𝕋)$,其中$V$表變數的集合。
*定義*
+ statement形如$M:sigma$,其中$M in Lambda_𝕋$且$sigma in 𝕋$$sigma$是型別)。$M$稱為主體(subject)$sigma$稱為類型(type)。
+ declaration宣告是有變數當主體的statement
+ context上下文是一系列不同主體不同變數的宣告列表context可為空
+ judgement判斷形如$Gamma tack.r M : sigma$,其中左邊的$Gamma$是上下文,右邊的$M:sigma$是statement
*Premiss 前提和Conclusion表達式*
$gamma tack.r x : sigma 若 x : sigma in Gamma$
$Gamma tack.r M : sigma arrow.r tau quad Gamma tack.r N : tau$
$Gamma tack.r M space N : tau$
$Gamma, x : sigma tack.r M : tau$
$Gamma tack.r lambda x : sigma M : sigma arrow.r tau$