Programming Languages And Lambda calculi 1.1 定义集合

Programming Languages And Lambda calculi

第一章 用文字计算

在本书中,我们将会研究如何用一种人们容易理解的方式去定义一种编程语言以及进行形式分析。

定义语言的其中一种方法是用整段整段的文字去定义,解释语言中的表达方式以及如何去分析它们。这种方法能够让读者很快在整体上大致理解一种语言,但是有关这种语言的细节将会变得非常难以提取。更加糟糕的是,段落文本不适合正式的分析。

另一种定义语言的方法是引入一个叫元语言(meta-language)的解释器。假设读者对元语言非常熟悉,这种方法能够清楚、完成地描述语言的细节。假设元语言有一个正式的规范,那么解释器在语言中将会有正式的含义,并且能够被分析。

用来定义另一种语言的元语言不需要有效地执行,因为它的主要目的是解释语言。元语言的基本数据结构不需要用位和字节定义。实际上,对于元语言,我们可以直接使用逻辑和集合论来处理程序文本,就像在物理机上计算被描述的方式一样。最终,可以用无序位(shuffling bits)来描述内存位置,抽象计算则可以用文本关系描述。

1.1 定义集合

现在给出如下BNF语法:

在这里插入图片描述

实际上我们定义了一组文本字符串。上述的定义可以扩展成如下对B的约束:

在这里插入图片描述

我们提及的B集合是满足上述约束的最小集合。

注意:有时候,“B”意味着“集合B”,另一些时候,“B”意味着“任意一个B集合的元素”。不用担心的是,B的含义在上下文之中不会有歧义。有时候我们也会在集合的名称上使用下标或者上标,如B1, B

因此,上述的约束也可以写作:
在这里插入图片描述

无论是用BNF速记表达,还是扩展为约束集,B集合都是被严格定义的,在这种情况下,枚举有限空间中的所有元素显然是不可能的。
在这里插入图片描述

然而,给定属于B的特定文本,我们可以通过演绎B约束中的规约来证明它是否属于B。例如,(t•(f•t)) 属于B。

在这里插入图片描述

通常我们也会通过用参数构建证明树的方式来证明:
在这里插入图片描述

当然,我们也可以省略某些使用的规则的名称,因为它们通常都很显然。

在这里插入图片描述

练习1.1

下列元素是否属于集合B?如果是,编写出证明树。

  1. t
  2. ((f•t)•(f•f))
  3. ((f)•(t))
题解1.1
  • 1 树略
  • 4 树:
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_35714301/article/details/113732297
今日推荐