表达操作语义时出现符号问题

时间:2012-07-13 07:26:53

标签: haskell functional-programming

我正在尝试编写一些推理规则,但我无法理解通常用于编写它们的符号的含义。

例如: 我为一些类型表达式编写了以下规则:

 class(r) ∈ t,  \there_exists v ⊢ r ∈ type(v)
-------------------------------------------------------------
 Γ, m:n -> r ⊢ n:(Γ, r, {}) <-  r

mn替换为r的声明。

(如果表达式中的r属于t(type-expression),并且存在vr属于v类型})。

可能是我的等式是完全错误的。 至少有人请解释:运算符的含义。 同样在Benjamin Pierce的书中,他将Γ称为打字上下文。 有人可以用一个例子解释它的含义(如果例子是在Haskell或Lisp或C ++中,我会很感激)

由于

PS:这不是作业。

2 个答案:

答案 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)。