#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