PROLOGチューリングを完全にするものは何ですか?


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]).

ソース

しかし、チューリングの完全性を失うことなく、PROLOG言語のどの部分(特に関数記号、節のオーバーロード、再帰、統合)を取り除くことができるのか疑問に思っています。関数シンボル自体はチューリング完了ですか?


4
コードスニペットで使用されるプロローグの機能のみが必要です。
ユヴァルフィルマス14年


2
@YuvalFilmus:たぶん、PROLOGでチューリングマシンをプログラミングする他の方法があります。
レナーホイト14

回答:


18

チューリング完全性は、回答または無制限の「サイズ」の中間値を構築する能力と、無制限の回数ループまたは再帰する能力に依存することは、かなり信頼できる経験則です。これらの2つのことがあれば、おそらくチューリング完全性があります。(より具体的には、Peano算術演算を構築できれば、確実にチューリング完全性が得られます!)

しばらくの間、すでに算術演算を削除したと仮定しましょう。また、、などの非論理的な機能がないことも前提としています。これらの機能はatom_charsassert一般的なシェナンガンを可能にします。

関数シンボルを削除した場合、無制限のサイズの回答または中間体を構築できません。プログラムとクエリに表示されるアトムのみを使用できます。その結果、クエリに対するすべての可能なソリューションのセットは有限であるため、プログラム/クエリの最小固定点の取得は常に終了します。データログ(Prologに基づくリレーショナルデータベースクエリ言語)は、この原則に基づいて機能します。

同様に、Prologをプリミティブな再帰のみ(縮退ケースとして再帰を含まない)に制限した場合、実行できる再帰の量はクエリのサイズによって制限されるため、すべての計算が終了します。したがって、チューリング完全性のための一般的な再帰が必要です。

もちろん、一般的な再帰がある場合は、機能の束全体をカットし、一般的な統一(構築とトップレベルパターンマッチングで十分です)、否定、カットを含むチューリング完全性を保持できます。



非常に良い点。定量化については考えていませんでしたが、それは確かに別のアプローチです。
仮名

0

@Pseudonymによる優れた回答を完了し、最後の質問「関数シンボル自体はチューリング完了ですか?」を参照してください。

おそらく、関数シンボルのみで作成された言語をチューリング完全にすることはできますか?

答えはイエスです-MLやHaskellのような関数型プログラミング言語を考えてください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.