以下是对该内容的翻译:
一个可递归枚举的集合是指,你能够编写一个程序输出集合中每个元素(如E1、E2、E3等),即使这个程序永远不停止也没关系。
通常人们在语言的背景下谈论这一点。可递归枚举的语言是指,你可以编写一个程序,列出该语言中的每个有效字符串。语言只是一组字符串,所以“十进制质数的所有数字”是一个有效的语言。
但是,想象一下,如果你只是想检查并查看给定的字符串是否属于该语言,而不是生成语言中的所有字符串或集合中的所有元素。问题是,你永远无法确定该字符串是否不属于你的语言。如果你需要为这种语言编写编译器,你的编译器将在有效输入上运行良好,但在无效输入上,由于它在一个无限列表中搜索不存在的东西,导致编译器永远卡住。
“可递归语言”或“可递归集合”的集合是指,你能够编写一个程序来告诉你给定的输入是否属于该集合。所有可递归语言也是可递归枚举的,因为你可以列举每个字符串,并在它属于你的集合时输出它。可递归语言也称为可判定语言,因为你可以确定一个元素是否在其中。这在更一般的可递归枚举集合中并非如此。
通常情况下,证明一个集合或语言是可递归枚举的或可递归的要容易些,但证明它不是可递归却是可递归枚举的则要困难得多。
这个概念最好通过例子和与递归集的比较以及不同定义的比较来说明。因此,我会先给你一些例子,然后再给你不同(但等价的)定义。
首先,注意到技术上我们把“可递归枚举”(也称为“半可判定”)这个形容词应用于自然数的集合。但是这个形容词也可以应用于整数的集合、整数对的集合、Unicode字符串的集合。请注意,所有这些(整数、整数对、Unicode字符串)都可以存储在计算机内存中。(不能存储在计算机内存中的内容包括任意(无限精度)实数和无限的0或1序列)
例1:所有质数的集合
您可以编写一个算法,它以自然数作为输入,并返回一个yes或no的答案(yes表示“是,该输入是质数”,no表示“不,该输入不是质数”)。这个算法很容易编写。如果您不费心优化性能,那么非常容易。因为您可以编写一个始终完成并给出yes或no答案的算法,所以所有质数的集合被称为可判定集合(也称为递归集)。它被称为可判定,是因为您可以判断一个自然数是否是质数。请注意,如果要证明一个集合是可判定集合,只需要想出一个始终完成并给出正确答案的算法,而不需要优化性能。让我们不去深究为什么它被称为递归。
例2. 质数间隔是连续两个质数之间的差值。例如,13是一个质数,下一个质数是17,因此它们的差4是一个质数间隔。我们的第二个例子是所有质数间隔的集合。
您能编写一个算法来检查一个数是否是质数间隔吗?以下是伪代码:
input: x
set i to 1
loop
check primeness of i, i+1, ..., i+x
if only i and i+x among them are primes, return yes.
otherwise, increment i by 1 and go to start of loop
伪代码中的算法有好有坏。递归可枚举集是指存在部分可计算算法来判断元素是否属于该集合(可以计算但不一定终止)的一种集合。
例如,确定一个项不在曼德博集合中是递归可枚举的。