我正在尝试编写一些推理规则,但我无法理解通常用于编写它们的符号的含义。
例如: 我为一些类型表达式编写了以下规则:
class(r) ∈ t, \there_exists v ⊢ r ∈ type(v)
-------------------------------------------------------------
Γ, m:n -> r ⊢ n:(Γ, r, {}) <- r
m
是n
替换为r
的声明。
(如果表达式中的r
属于t
(type-expression),并且存在v
,r
属于v
类型})。
可能是我的等式是完全错误的。
至少有人请解释⊢
和:
运算符的含义。
同样在Benjamin Pierce的书中,他将Γ
称为打字上下文。
有人可以用一个例子解释它的含义(如果例子是在Haskell或Lisp或C ++中,我会很感激)
由于
PS:这不是作业。
答案 0 :(得分:5)
在较高的层次上,符号很简单:假设线条上方的条件成立,则线条下方的表达式为真。
Γ是一个打字上下文 - 也就是说,它是一组变量和类型。这些对将变量映射到类型。 ⊢仅仅意味着“在上下文中”。冒号只是将变量与类型组合在一起 - 就像Haskell中的::
或Scala或Ocaml中的:
一样。所以类似Γ ⊢ x:σ
的意思是“在上下文中,Γ,x具有类型σ”。 Γ,x:σ
之类的内容表示由Γ
和x:σ
组成的上下文。
本质上,上下文表示其他变量具有的所有类型。因此,x:σ ∈ Γ
表示x
σ
中的Γ
类型Γ ⊢ x:σ
,可让您轻松解析x
。所有这一切都说明如果x
绑定到上下文中的某种类型,它在该上下文中具有该类型。
您可以将输入上下文视为“外部”的所有类型信息。因此,上段中的简单陈述基本上告诉您,如果您看到x
且σ
已有类型x
,则可以推断出σ
的类型为{{1} }}。不是很有趣,但非常重要!
您可以将此规则写为:
x:σ ∈ Γ
-------
Γ ⊢ x:σ
如果我们只有LaTeX:P。我想我们不像math.se或cstheory.se那样酷。
这是一个稍微复杂的例子。本质上,我们想要编码应用程序在简单类型的lambda演算中的工作方式。实际上非常简单:给定f
类型的函数τ → τ'
和类型为x
的值τ
,f x
类型为τ'
。在Haskell中,这看起来就像在f :: Int -> Bool
上应用x :: Int
一样。很明显f x :: Bool
。所以让我们写出来。
条件(最高位)是,在某些情况下,f
的类型为τ → τ'
:Γ ⊢ f:τ → τ'
。此外,在同一上下文中,x
的类型为τ
:Γ ⊢ x:τ
。放在一起,我们得到:Γ ⊢ f:τ → τ' Γ ⊢ x:τ
。
现在到了最后一点。鉴于这两种类型,我们知道什么?我们知道应用程序f x
的类型,但仅在相同的上下文中。 (这就是Γ
重要的原因。)所以我们得到:Γ ⊢ f x:τ'
。
现在,把它们放在一起,我们有:
Γ ⊢ f:τ → τ' Γ ⊢ x:τ
--------------------
Γ ⊢ f x:τ'
看到StackOverflow语法高亮显示器与最后一个例子斗争是有趣的。我想知道它认为的是哪种语言。
答案 1 :(得分:3)
Γ
(如果有人知道如何嵌入LaTeX,请发表评论或编辑评论)是输入上下文的符号:您可以将其视为表达式与其类型之间的映射。
例如,让我们采取两种情况:
Γ0
空地图和Γ1 = Γ0, x:Int
上一篇文章内容丰富,其中包含x
类型为Int
的类型信息。因此,此处:
代表类型分配。现在,在空上下文(Γ0
)中,无法键入表达式x + x
,因为您不知道x
的类型(它不存储在地图)。但是,在其他情况下,我们有x
的类型(即Int
),因此我们可以说x + x
的类型为Int
。
正式地,我们使用了像这样的规则:
x : σ ∈ Γ
______________
Γ ⊢ x + x: σ
观察Haskell中:
代表::
。并且A ⊢ B
应被视为“在A
B
持有的情况下。
PS:我有一个关于Type Systems的课程,你可以找到一些材料here(你可以看看Typed_Lambda_Calculus.pdf)。