#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 Church（explicit typing，外顯型別）：先給定型別予變數，再推出其他表達式的型別。
+ typing à la Curry（implicit 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$
