基于堆栈的语言的图灵完整性证明

时间:2017-07-02 00:45:48

标签: stack programming-languages turing-complete

我正在写一个基于堆栈操作的笑话语言。我试图找到使图灵完成所需的最少量指令,但不知道基于一个堆栈的语言是否甚至可以图灵完成。这些说明是否足够?

IF (top of stack is non-zero)
WHILE (top of stack is non-zero)
PUSH [n-bit integer (where n is a natural number)]
POP
SWAP (top two values)
DUPLICATE (top value)
PLUS (adds top two values, pops them, and pushes result)

我已经查看了几个问题和答案(例如this onethis one),并且相信上述说明已足够。我对么?或者我还需要其他类似函数调用,变量或其他堆栈的东西吗?

如果这些说明充足,那么它们中的任何一个都是多余的吗?

<小时/> 编辑:添加ROTATE命令(将堆栈的前三个值从A B C更改为B C A)并删除DUPLICATE,{ {1}}和PLUS命令可以实现Rule 110 cellular automaton的3个字符版本。这足以证明图灵的完整性吗?

如果有一个图灵完整的单堆栈语言的例子,没有变量或函数会很棒。

3 个答案:

答案 0 :(得分:2)

如果您想证明您的语言是图灵完成的,那么您应该在Math StackExchange网站上查看此问答。

一种方法是查看是否可以使用可以模拟任意图灵机的语言编写程序。如果可以,那就是图灵完整性的证明。

如果您想知道这些说明是否是多余的,请查看您是否可以简化TM仿真器以避免使用其中一条说明。

但是如果您想知道是否可以使用较小的图灵完整语言,请查看SKI Combinator Calculus。可以说,有三条说明:SKI组合器。 I显然是多余的。

答案 1 :(得分:1)

正如其他人指出的那样,如果您可以模拟任何图灵机,那么您的语言就是图灵完备。

然而,尽管图灵机的概念简单性和数学处理的舒适性,但它们并不是最容易模拟的机器。

作为一种捷径,您可以模拟一些已经证明图灵完备的简单语言。

我的直觉告诉我,功能语言,特别是LISP,可能是一个不错的选择。 This SO Q&amp; A指向了图灵完整LISP的最小值。

答案 2 :(得分:1)

仅基于单个堆栈的语言无法完成Turing(除非您&#34;作弊&#34;通过允许诸如临时变量之类的内容或访问变量&#34 ;堆栈中的更深层次而不是顶层项目)。据我所知,这样的语言相当于Pushdown Automata,它可以实现一些的东西(例如无上下文语法),但肯定不如完整的图灵机那么多。 / p>

话虽如此,图灵机实际上比你直觉所期望的要低得多 - 正如最初制定的那样,它们只不过是一个链表,读写能力和分支能力。您甚至不需要将所有这些添加到纯粹的面向堆栈的语言中以使其等同于图灵机 - 第二个堆栈将在技术上做到这一点(尽管我当然不想对它进行编程) ),链表或队列也是如此。

如果我错了,请纠正我,但我认为确定你可以读取和写入内存,可以进行分支,并且至少有一个这样的数据结构(两个堆栈,一个队列,一个链表或等价物就足以建立图灵完整性。

nested stack automata处查看。

您可能还想查看Chomsky hierarchy(好像您可能会在Type 1或Type 2语言附近的某处浮动)。