可计算性和计算复杂度

第1章 引论

第2章 WHILE语言

第2.1节 WHILE数据和程序的句法

第2.1.1小节 二叉树作为数据值

定义2.1.1. 树的集合𝔻定义如下:
  1. 原子nil𝔻的一个元素;
  2. 每当d1d2𝔻的元素, 那么(d1.d2)也是; 并且
  3. 𝔻是满足前述两点的最小集合.
定义2.1.2. 函数||:𝔻N定义如下:|d|={1, 如果dA|d1|+|d2|, 如果d=(d1.d2)其代表了一个数据值d𝔻大小(size).

第2.1.2小节 WHILE程序的句法

定义2.1.3. Vars={V0,V1,}是不同的变量. 我们使用约定d,e,f,𝔻X,Y,Z,Vars. 那么, WHILE的句法由以下语法给出:ExpressionsE,FX(对于XVars)|d(对于原子d)|consEF|hdE|tlE|=?EFCommandsC,DX:=E|C;D|whileEdoCProgramsPreadX;C;writeY这里的XY是不需要相异的输入变量输出变量.

我们使用缩进来指明while和其他命令的作用域. 例如, 考虑以下两个命令:

while E do
  C;
D
while E do
  C;
  D

第2.1.3小节 非形式化的语义

第2.1.4小节 真值和if-then-else

第2.1.5小节 列表

第2.1.6小节 数字

第2.1.7小节 句法糖: 一些有用的宏记号

第2.2节 WHILE程序的语义

第2.2.1小节 存储

第2.2.2小节 对于表达式的求值

第2.2.3小节 命令的执行

第2.2.4小节 WHILE程序的语义

第2.2.5小节 计算语义值

第2.3节 相等性与原子相等性的对比

第2.3.1小节 更多的句法糖

练习

引用

第3章 程序作为数据对象

第3.1节 编程语言和模拟

定义3.1.1. 一个编程语言L由以下资料构成:
  1. 两个集合, L-程序L-数据;
  2. 一个函数L:L-程序(L-数据L-数据).
这里LL语义函数, 其将每个L-程序pL-程序与一个相应的部分函数pL:L-数据L-数据联系起来.
如果L-程序L-数据, 那么我们称L具有程序作为数据(programs-as-data)的性质. 另外, 如果L-数据×L-数据L-数据, 那么我们称L具有结对(pairing)性质.
定义3.1.2. L-数据=M-数据. 语言M可以模拟L, 如果对于每个pL-程序, 存在一个M-程序q使得对于每个dL-数据, 我们有pL(d)qM(d).等价地: M可以模拟L当且仅当存在一个完全函数f:L-程序M-程序满足对于每个L-程序p都有pL=f(p)M.语言L等价于语言M, 记作LM, 如果语言L和语言M可以互相模拟.

这个定义表达了LM可以计算相同函数的事实; 但是其并没有断言存在任何构造性的方式来获得一个等价于给定L-程序的M-程序. 本章的剩余部分关心的是模拟是如何计算性地完成的, 要么通过转换 (应用一个编译函数), 要么是通过解释. 然而, 首先我们需要一种方式来将程序视为数据对象.

第3.2节 在𝔻中表示WHILE程序

之前我们已经给过了WHILE-程序WHILE-数据的句法. 假设我们想要将一个WHILE程序喂给另外一个WHILE程序作为输入. 目前这是不可行的, 仅仅是因为WHILE-程序的元素并非WHILE-数据中的对象. 因此, 我们现在需要对于WHILE程序给出一种程序作为数据表示.

定义3.2.1. {:=,;,while,var,quote,cons,hd,tl,=?,nil}代表𝔻10个相异元素. WHILE程序p的表示

第4章 自解释: WHILEI的通用程序

第5章 可计算理论的基本

第6章 元编程, 自应用, 和编译器生成

第7章 其他顺序计算模型

第8章 可计算概念的健壮性

第9章 函数式语言所施行的计算

第10章 一些自然的不可解问题

第11章 Hilbert第十问题

第12章 推理系统和Gödel不完备性定理

第13章 基于数字的可计算理论

第14章 更多可计算性的抽象方式