咦惹和特-鄂匹特 入门。
笔记主要来源:B站 无穷类型咖啡
简单类型lambda演算
类型和语境(上下文)
类型论的研究对象是类型,其类似于集合论中的集合。不同的是,类型自由得多 —— 类型由一系列的规则来定义,给出相关的生成元与构造方法,我们可以定义一个类型。
语境在形式上是一个变量-类型对的列表 —— 它给出了一系列变量的定义。
相继式演算
相继式演算的形式如下:
CP1 P2 ⋯ Pn(Name)
其中,
P1⋯Pn 称为
前提,
C称为
结论,在末尾可能出现该规则的
名称。
前提与结论统称为
判断。判断是STLC中命题的形式。
以上的表达式称作一个
步骤。步骤是证明和推理的基本过程。
基本的判断
首先,我们引入判断
Atype
表示
A 是一个类型。同时我们设定基本类型集合
B ,定义是:
B={⊤,⊥,Ans}
对于
B 中的类型,我们有判断
⊤type⊥typeAnstype
可以发现这些判断是无前提的,这类判断又称之为公理。
这些判断保证了基本类型的存在。
同时,我们有判断
Γctx
表示
Γ 是一个语境。同样的,有公理
∅ctx
即,空语境是存在的。同时,我们有判断
Γ,x:ActxΓctxAtype
表示,如果
Γ 是一个语境,且
A 是一个类型,那么
Γ,x:A 也是一个语境。
项
项是具有类型的变量。
我们定义判断
x:A
表示,
x 是一个具有类型
A 的项。
对于项的判断不能离开语境。引入判断
Γ⊢x:A
意为在语境
Γ 中,
x 是一个具有类型
A 的项。
对于
B 中的类型,我们有以下公理:
Γ⊢tt:⊤
Γ⊢yes:AnsΓ⊢no:Ans
以及还有一个重要的规则:
Γ⊢x:Ax:A∈Γ Var
实用类型
类型的构造需要规则。
类型的合法性需要形成规则的保证。
引入规则刻画了类型中合法的对象。
消去规则规定了如何定义与该类型相关的函数以及构造相关的证明。
计算规则规定了该类型的计算方法。
唯一性规则表明了该类型对象的唯一性。(可以不需要。)
绝大部分类型 都拥有以上的四(五)条规则。少部分类型可能拥有不完整的规则。
布尔值 B
布尔值类型的规则如下:
Btype
- 引入:布尔值类型中只有两个值,分别是 true 与 false。
true:Bfalse:B
- 消去:对于两个具有相同类型的项 ct,cf,定义项 elimB(b,ct,cf)。
elimB(b,ct,cf):Bb:Bct:Ccf:C
- 计算:elimB(b,ct,cf) 的计算方法如下:
elimB(true,ct,cf)≡ct:Cct:Ccf:CelimB(false,ct,cf)≡cf:Cct:Ccf:C
可以看出其实是条件表达式。
注意:
elimB(∙,∙,∙) 不是一个函数,而是一个项。
elimB(b,c true,c false)≡c b:Cb:Bc:B→C
积类型 A×B
类型
A 和
B 的积类型
A×B 是一个值对,其第一个元素是
A 类型,第二个元素是
B 类型。可以看做 C++ 中的
pair 类型
注:积类型 A×B 和 Π 类型 ∏a:AB(a) 没有关系。
- 形成:需要保证 A 与 B 都是合法的类型。
A×BtypeAtypeBtype
- 引入:需要保证 a:A 与 b:B 是合法的项。其组成的有序对 (a,b) 是一个合法的 A×B 类型的项。
(a,b):A×Ba:Ab:B
- 消去:定义项 π1(p) 与 π2(p) 表示 p 的第一个元素与第二个元素。π1(p) 是 A 类型的项,π2(p) 是 B 类型的项。
π1(p):Ap:A×Bπ2(p):Bp:A×B
- 计算:π1(p) 或 π2(p) 的计算方法就是直接返回 p 的第一个元素或第二个元素。
π1((a,b))≡a:Aa:Ab:Bπ2((a,b))≡b:Ba:Ab:B
- 唯一性 :p 等价于 (π1(p),π2(p))。
p≡(π1(p),π2(p)):A×Bp:A×B
函数类型 A→B
函数类型
A→B 是一个函数,其输入是
A 类型,输出是
B 类型。
- 形成:同积类型,需要保证 A 与 B 都是合法的类型。
A→BtypeAtypeBtype
- 引入(函数抽象):当且仅当 x:A 的语境下,表达式 M:B 是合法的,那么表达式 λx.M:A→B 是合法的。
λx.M:A→Bx:A⊢M:B Lam
- 消去(函数应用):当且仅当 f:A→B 与 a:A 是合法的项,那么表达式 f a 是一合法的 B 类型的项。
f a:Bf:A→Ba:A App
- 计算 (β 规约)函数 λx.M 应用于某一项 a 的结果是: 将表达式 M 中的所有 x 替换为 a。
λx.M a≡M[x↦a]:Bx:A⊢M:Ba:A β
- 唯一性(η 规约):函数 f:A→B 等价于函数 λx.f:A→B。
λx.f a≡f:A→Bf:A→B η
余积类型
余积类型
A+B 相当于 C++ 语言中的
union 体。
注:余积类型和 Σ 类型 ∑a:AB(a) 没有关系。
- 形成:需要保证 A 与 B 都是合法的类型。
A+BtypeAtypeBtype
- 引入:如果存在合法的项 a:A 或 存在合法的项 b:B,那么存在合法的项 inl(a):A+B 或 存在合法的项 inr(b):A+B。
inl(a):A+Ba:Ainr(b):A+Bb:B
- 消去:对于项 s:A+B,以及项 cl:A→C,cr:B→C,定义项 elimA+B(s,cl,cr)。
elimA+B(s,cl,cr):Cs:A+Bcl:A→Ccr:B→C
待续