C++ 是一种递归可枚举的语言吗?

Posted

技术标签:

【中文标题】C++ 是一种递归可枚举的语言吗?【英文标题】:Is C++ a recursively enumerable language? 【发布时间】:2014-04-20 14:54:18 【问题描述】:

我知道 C++ 是不可判定的。但它是递归可枚举的吗?

让我们将一组有效的 C++ 程序定义为当前 C++ 标准下任何定义良好的程序。

是否有可能构建一个总能在有限时间内识别有效 C++ 程序的编译器?

或者它是递归可枚举的?

是否有可能构造一个编译器,在有限时间内总能识别出无效C++程序?

或者两者都没有?

【问题讨论】:

您可能正在寻找Theoretical Computer Science stackexchange site。这个问题与实际的编码问题一点关系都没有。 “C++ 模板是图灵完备的 (2003)”,作者 Todd L. Veldhuizen:citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.14.3670 这个问题不是一个实际的编程问题。这似乎是一个理论上的问题。但无论如何,请考虑:while (Riemann_hypothesis_is_true()) 。 1.10.24 规定程序最终必须终止、调用 I/O 函数、访问 volatile 对象、执行同步操作或执行原子操作。如果黎曼假设为真,那么这个程序是无效的。 “实现可能假设”和“一个有效的程序必须”是不同的东西。一个实现可能假设某事是真的,但仅仅因为它不是并不意味着程序是无效的。 顺便说一句,如果您有 Riemann_hypothesis_is_true 的实现,我很乐意看到它:P。 【参考方案1】:

是否有可能构造出一个总能在有限时间内识别出有效 C++ 程序的编译器?

是的。如果有足够的时间和资源,C++ 编译器应该能够完成任何有效的 C++ 程序的编译。递归可枚举语言需要一个图灵机,当字符串在该语言中时,它总是终止并提供肯定的答案,而编译器基本上就是这样做的。

是否有可能构造一个编译器,在有限的时间内总能识别出无效的 C++ 程序?

没有。 C++ 模板语言是图灵完备的,因此你可以在其中编写无限递归。由于停机问题,无法确定程序是否会完成编译,因此无法确定 C++ 程序是否会成功编译。

我曾经在 C++ 模板中写了一个无限递归,并尝试用 gcc 编译。原来 gcc 有一个可配置的递归深度限制。

【讨论】:

我定义的无限递归模板程序是否无效? 标准是否禁止无限模板元编程? 好问题。作为一种实用的规范(没有正式的语义),我想这个问题并没有真正得到解决。 在当前的草稿中我发现:“实例化中无限递归的结果是未定义的。” 标准中使用“未定义”一词表示无效程序。

以上是关于C++ 是一种递归可枚举的语言吗?的主要内容,如果未能解决你的问题,请参考以下文章

可判定性和递归可枚举性

非上下文无关的递归可枚举语言示例

递归可枚举,递归

非正则语言的补语总是递归语言吗?

如果 L 和 L 补码是递归可枚举的,那么为啥 L 不能是正则语言?

是否有任何不是 RE-hard 的递归可枚举问题?