2 回答
在高层次上,符号很简单:假设行以上的条件成立,则行以下的表达式为真。
Γ 是一个类型化上下文——也就是说,它是一组变量和类型对。这些对将变量映射到类型。⊢ 仅表示“在上下文中”。冒号只是将变量与类型组合在一起——就像::
在 Haskell 或:
Scala 或 Ocaml 中一样。所以类似的Γ ⊢ x:σ
意思是“在上下文Γ中,x具有类型σ”。like表示由andΓ,x:σ
组成的上下文。Γ
x:σ
本质上,上下文代表了其他变量所具有的所有类型。Sox:σ ∈ Γ
表示x
具有类型σ
in Γ
,这可以让您轻松解决该问题Γ ⊢ x:σ
。这就是说,如果x
在上下文中绑定到某种类型,那么它在该上下文中具有该类型。
您可以将输入上下文视为来自“外部”的所有类型信息。所以上一段中的简单陈述基本上告诉你,如果你看到一个x
并且x
已经有类型σ
,你可以推断出那个x
有类型σ
。不是很有趣,但很重要!
你可以把这条规则写成:
x:σ ∈ Γ
-------
Γ ⊢ x:σ
如果我们有 LaTeX :P。我想我们不如 math.se 或 cstheory.se 酷。
这是一个稍微复杂一点的例子。本质上,我们想在简单类型的 lambda 演算中编码应用程序的工作方式。它实际上非常简单:给定一个 type 的函数f
和τ → τ'
一个 type 的值x
,τ
然后f x
有 type τ'
。在 Haskell 中,这看起来像应用f :: Int -> Bool
在x :: Int
. 很明显f x :: Bool
。所以让我们把这个写出来。
条件(最高位)是,在某些情况下,f
有一个类型τ → τ'
: Γ ⊢ f:τ → τ'
。此外,在相同的上下文中,x
具有类型τ
: Γ ⊢ x:τ
。放在一起,我们得到:Γ ⊢ f:τ → τ' Γ ⊢ x:τ
.
现在到底部。鉴于这两种类型,我们知道什么?我们知道应用程序的类型,f x
但仅在相同的上下文中。(这就是Γ
重要的原因。)所以我们得到:Γ ⊢ f x:τ'
.
现在,把它们放在一起,我们有:
Γ ⊢ f:τ → τ' Γ ⊢ x:τ
--------------------
Γ ⊢ f x:τ'
看到 StackOverflow 语法荧光笔与最后一个示例的斗争很有趣。我想知道它认为这是哪种语言。
(Γ
如果有人知道如何嵌入 LaTeX,请留下评论或编辑评论)是输入上下文的符号:您可以将其视为表达式与其类型之间的映射。
例如,让我们看两个上下文:
Γ0
空地图和Γ1 = Γ0, x:Int
前一个丰富了类型信息,说x
有 typeInt
。因此,:
这里代表类型分配。
现在,在空上下文 ( Γ0
) 中,无法键入表达式x + x
,因为您不知道类型x
(它不存储在映射中)。但是,在另一种情况下,我们有一个类型 for x
(that is Int
),所以我们可以说 that x + x
has type Int
。
形式上,我们使用了这样的规则:
x : σ ∈ Γ
______________
Γ ⊢ x + x: σ
请注意在:
Haskell::
中的含义。并且A ⊢ B
被理解为“在A
B
持有的情况下。
PS:我有一个关于类型系统的课程,你可以在这里找到一些材料(你可以看看 Typed_Lambda_Calculus.pdf)。