是什么使PROLOG Turing完整?


15

我知道可以通过构建一个模拟图灵机的程序来证明PROLOG是图灵完备的:

turing(Tape0, Tape) :-
    perform(q0, [], Ls, Tape0, Rs),
    reverse(Ls, Ls1),
    append(Ls1, Rs, Tape).

perform(qf, Ls, Ls, Rs, Rs) :- !.
perform(Q0, Ls0, Ls, Rs0, Rs) :-
    symbol(Rs0, Sym, RsRest),
    once(rule(Q0, Sym, Q1, NewSym, Action)),
    action(Action, Ls0, Ls1, [NewSym|RsRest], Rs1),
    perform(Q1, Ls1, Ls, Rs1, Rs).

symbol([], b, []).
symbol([Sym|Rs], Sym, Rs).

action(left, Ls0, Ls, Rs0, Rs) :- left(Ls0, Ls, Rs0, Rs).
action(stay, Ls, Ls, Rs, Rs).
action(right, Ls0, [Sym|Ls0], [Sym|Rs], Rs).

left([], [], Rs0, [b|Rs0]).
left([L|Ls], Ls, Rs, [L|Rs]).

资源

但是,我想知道可以在不损失Turing完整性的情况下剥离PROLOG语言的哪些部分(特别是函数符号,子句重载,递归,统一)。图灵功能符号本身是否完整?


4
您仅需要代码片段中使用的prolog功能。
Yuval Filmus 2014年

1
你看到这个问题了吗?
拉斐尔

2
@YuvalFilmus:也许还有其他方法可以在PROLOG中对Turing机器进行编程。
Lenar Hoyt 2014年

Answers:


18

这是一个相当可靠的经验法则,图灵完备性取决于构造无限制“大小”的答案或中间值的能力以及无限制次数循环或递归的能力。如果您有这两件事,那么您可能具有图灵完备性。(更具体地说,如果您可以构造Peano算术,那么您当然具有图灵完备性!)

现在让我们假设您已经剥离了算术。我们还将假设您没有任何非逻辑功能,例如atom_charsassert等等,这些功能可以启用一般的恶作剧。

如果删除功能符号,则不能构造大小不受限制的答案或中间值;您只能使用出现在程序和查询中的原子。结果,对任何查询的所有可能解决方案的集合都是有限的,因此获取程序/查询的最小固定点将始终终止。Datalog(一种基于Prolog的关系数据库查询语言)基于此原理工作。

同样,如果将Prolog仅限于原始递归(不包括递归作为退化的情况),则可以执行的递归量受查询大小的限制,因此所有计算都将终止。因此,您需要图灵完备性的一般递归。

而且,当然,如果您具有一般递归,则可以削减一大堆特征并保留Turing完整性,包括一般统一性(构造和顶层模式匹配就足够了),取反和削减。



很好的一点。我没有考虑量化,但这确实是另一种方法。
别名

0

用@Pseudonym填写出色的答案,并参考您的最后一个问题“函数符号本身图灵完成了吗?”。

您可能是说:仅由功能符号构成的语言可以图灵完备吗?

答案是肯定的-想想像ML和Haskell这样的函数式编程语言。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.