在我前面一篇文章中
true有一个类型叫做bool,
false有一个类型叫做bool
n有一个类型叫做N
true和n是e
Types t ::= bool | N
Terms e ::= true | false | n | e <= e | e + e | e ^ e
- 如何表示值有一个type呢?
- 就使用e:t来表示吧, 例如true : bool, 读作某一个值有一个类型
- 所以:是一个关系运算符号
- 我们如何定义值与类型间的关系呢?
n:N => Num true:Bool => True
左边的叫做条件:premises,
右边的叫做结论: conclusion
可以由这些东西推导出操作
当引入变量后一切又会变得不同
-
Example: let x = 5 in (x + x) <= 10, 左边是值
-
但是我们如何推断出x:?
-
to handle with, the type judegemnet must konw what the x are
-
so we change the typing judegement to be Γ⊢e:T, 表示在当前的环境中寻找一个变量
-
环境的引入Contents F ::= . | Γ,x:τ, 这个点可能表示这个上下文是空的, 如果不为空也就是右边那个。
于是现在我们就可以写出下面这样的表达式: -
we have: a type system, associating elements from one grammar(the terms) with elements form
anther grammar (the types) -
but does it really?
-
To prove, we must show type safety
substitution
because we have introduce the veriables into our language, 所以我们需要引入新的符号来表示变量的规则。
[e/x]true = true
[e/x]false = false
[e/x]n = n
[e/x](e1 + e2) = [e/x]e1 + [e/x]e2
[e/x](e1 ≤ e2) = [e/x]e1 ≤ [e/x]e2
[e/x](e1 ∧ e2) = [e/x]e1 ∧ [e/x]e2
[e/x]z = e when z = x
z when z = x
[e/x](let z = e1 in e2) = let z = [e/x]e1 in [e/x]e2 (∗)
(∗)α-rename表示z没有出现在e!
下面是几条公约
- If a term typechecks in a context, then it will still typecheck in a bigger context
这句话是说一个变量在一个环境中具有某个类型, 现在我们扩展了这个类型, 使这个上下文具有了另外一个类型, 比如原来的上下文中只有a, 现在有了b, 那么a的类型还是和原来一样。也就是扩展但是不会破坏 - If a term typechecks in a context, then it will still typecheck aǒter reordering the variables in the context.
已经检查出一个类型了, 但是现在我们调准了这个变量的位置, 这个变量的类型是不应该改变的。
比如原来环境的顺序是Γ, a:Int, b:Int, 现在是Γ, b:Int, a:Int, 那么a的类型还是Int - (Substitution) If Γ ⊢ e : τ and Γ, x : τ ⊢ e ′ : τ ′ then Γ ⊢ [e/x]e ′ : τ ′ . Subsituting a type-correct term for a variable will preserve type correctness。
将一个类型正确的表达式替换到另外一个变量中依然会保证类型的正确性。
下面是这几种证明
operational semantics: 更重要的是一个过程比如and的结果
- we have a language and type system
- we have a proof of substitu