チューリング完全言語のみが解釈できる総合言語


16

チューリング完全ではない言語は、それ自身のインタープリターを作成できません。私はそれをどこで読んだのか見当がつかないが、それが何度も使われているのを見た。これにより、一種の「究極の」非チューリング完全言語が生まれるようです。のみできるものチューリングマシンによって解釈されます。これらの言語は、自然から自然までのすべての合計関数を必ずしも計算できるわけではなく、必ずしも同型であるとは限りません(つまり、Aは計算できるがBはできない関数Fが存在するような究極の言語AとBが存在する可能性があります)。AgdaはGodelのシステムTを解釈でき、Agdaは完全であるため、そのような究極の言語はGodelのシステムTのように厳密に強力でなければなりません。そのような言語は、少なくともagdaと同じくらい強力であるように思えます(ただし、証拠はありませんが、ただの予感です)。

このような研究は行われていますか?どのような結果が知られていますか(つまり、そのような「究極の」言語は知られていますか)?

ボーナス:GodelのSystem Tがまだチューリングマシンでしか解釈できない関数を計算できない病理学的なケースが存在することを心配しています。これは事実ですか、またはそのような言語がGodelのSystem Tが計算できるものを計算できることを知ることができますか?


2
用語の使用方法が原因で、説明が混乱します。用語に頼る代わりに、数学的に厳密で明確な方法で質問を述べ、あなたの質問を理解できるようにしてください。計算可能性理論の文脈でプログラミング言語とはどういう意味ですか?計算可能な関数の列挙を意味しますか?
カベ14年

1
あなたが読んだものについての私の推測:言語が十分に強く、別のクラスの関数のユニバーサル関数を含む場合、そのクラスの対角関数を定義できます。総関数のクラスである場合、対角関数はクラスに含まれません。
カベ14年

それは私がそれを見つけた非公式に述べられました。文字通り、私がここで与えたものに沿った何か。私はこれを数学的方法で述べる方法も知りません。少し読んだ後、「関数のクラスの対角関数」が何であるかわかりません。私はあなたの言葉で私が意味することは「総関数のクラスはそれ自身の普遍的な関数を含むことはできない」ということだと思うので、私は「総関数のどのクラスCについてCの汎用機能」。「普遍的な機能」とは何かを理解すれば、それは正しいと思います。
ジェイク14年

1
厳密に言えば、これは研究レベルの質問ではありません。また、なぜこれがコミュニティWikiなのですか?またはそれは?
アンドレイバウアー14年

「これにより、一種の「究極の」非ツルーイング完全言語が生まれたようです。チューリング機械でしか解釈できない言語です。」その主張に従わないでくださいそれは非秘密主義のようですがどういう意味ですか、なぜそうなのですか?
vzn 14年

回答:


42

これは言い回しの悪い質問なので、まずそれを理解しましょう。私はそれを計算可能性理論のスタイルでやろうとしています。したがって、文字列の代わりに数字を使用します。ソースコードは、記号の文字列ではなく数字です。本当に問題ではありませんs t r i nに置き換えてもかまいませんN。以下で gにます。string

ましょうm,nペアリング機能

プログラミング言語は次のデータによって与えられる:L=(P,ev)

  1. 決定可能集合「の有効なプログラム」の、およびPN
  2. 計算部分的機能ev:P×NN

事実総計算地図ある決定可能な手段であるV L iは、DはN{ 0 1 }ように、V L iは、dはNPvalid:N{0,1}。非公式には、特定の文字列が有効なコードであるかどうかを判断できると言っています。関数 e vは、本質的に私たちの言語のインタープリターです: e v m n は、入力 nでコード mを実行します–結果は未定義かもしれません。valid(n)=1nPevev(m,n)mn

ここでいくつかの用語を紹介できます。

  1. 言語は、合計場合のすべての合計の関数であり、M Pnev(m,n)mP
  2. 言語解釈の言語L 2 = P 2E 、V 2が存在する場合、U P 1、その結果のE V 1U N M のE V 2N M すべてについてのn PL1=(P1,ev1) L2=(P2,ev2)uP1ev1(u,n,m)ev2(n,m)nP。ここで Uはシミュレータである L 2に実装さ L 1。またとして知られているユニバーサルプログラムのための L 2mNuL2L1L2

L 2を解釈する」の他の定義L1L2も可能ですが、ここではこれに触れないようにします。

L 2と言いますL1L2は、相互に解釈する場合、同等であるます。

そこ「最も強力な」言語である(あなたは「チューリングマシン」と呼ぶ)チューリングマシンのは、ここでのn Nはチューリングマシンとのエンコーディングであるφ N M されます「入力mでnによってエンコードされたチューリングマシンを実行する」部分的に計算可能な関数。この言語は、e vを計算可能にする必要があるため、明らかに他のすべての言語と相互作用できます。T=(N,φ)nNφ(n,m)nmev

プログラミング言語の定義は非常にリラックスしています。以下を実行するには、さらに3つの条件が必要です。

  • 実装後継機能:ある S U C C Pその結果のE vはS 、U 、C 、C M = M + 1のすべてのための M NLsuccPev(succ,m)=m+1mN
  • 実装対角線機能:そこをさ dをI A G Pように、EのV D I G M = M M すべてに対して M NLdiagPev(diag,m)=m,mmN
  • 関数の合成の下で閉じている:場合 Lの実装 F G、それはまた、実装 F GLLfgfg

古典的な結果はこれです:

定理: 言語がそれ自体を解釈できる場合、それは完全ではありません。

証明。仮定合計のlangaugeのための普遍的なプログラムであるLに実装Lすべてのため、すなわち、M PN NEのV U M N のE V M N 後継、対角線、およびAS のE V U - に実装されているLので、それらの組成であるK uLLmPnN

ev(u,m,n)ev(m,n).
ev(u,)L。存在 nは0Pのように、EのV nは0K のE V uがK K + 1が、その後 のE V U N 0N 0E V kev(u,k,k)+1n0Pev(n0,k)ev(u,k,k)+1 ない番号が存在しないように、自身の後継に等しく、その次の Lが合計ではないか、または Lは、それ自体を解釈しません。QED。
ev(u,n0,n0)ev(n0,n0)ev(u,n0,n0)+1
LL

後続のマップを、他の不動点のないマップに置き換えることができることを確認してください。

ここに誤解を一掃するだろうと思う小さな定理があります。

定理: すべての合計言語が別の合計の言語で解釈することができます。

LLLLevP={0,nnP}{1,0}ev

ev(b,n,m)={ev(n,m)if b=0,ev(m0,m1)if b=1 and m=m0,m1
LLLLu=1,0ev(u,m,n)ev(m,n), as required. QED.

Exercise: [added 2014-06-27] The language L constructed above is not closed under composition. Fix the proof of the theorem so that L satisfies the extra requirements if L does.

In other words, you never need the full power of Turing machines to interpret a total language L – a slightly more powerful total language L suffices. The language L is strictly more powerful than L because it interprets L, but L does not interpret itself.


If I checked the wiki checkbox it was unintentional.
Andrej Bauer

2
Is there any extra power in languages where you can't tell whether or not a given program is valid?
Phylliida

3
@DaniPhye: If the language syntax is not semidecidable then you can "hide" computational power in the syntax. For instance, the language rules could require that each function be equipped with a bit which tells whether the function is total. We could then implement is_total, which is otherwise non-cmputable, but couldn't implement evaluation (because you'd have to also compute the bit of the resulting function). In general I would say it's not a programming language if you can't even implement a parser for it.
Andrej Bauer

3
How does "If a language can interpret itself then it is not total" gel with this result: A Self-Interpreter for F-omega?
Cactus


18

Any language which is not Turing complete can not write an interpreter for it self.

This statement is incorrect. Consider the programming language in which the semantics of every string is "Ignore your input and halt immediately". This programming language is not Turing complete but every program is an interpreter for the language.


Ah! That is a good point. So there has to be certain requirements on what the language computes. It seems that some minimum requirement must be made on the power of the language to make that statement true. It seems like if we demand it be able to solve basic arithmetic problems then it might hold.
Jake

@Jake You might actually be able to get away with something incredibly weak like "the language defines at least one non-constant function" or "the language defines more than one function". My counterexample is clearly trivial for any reasonable definition of "trivial".
David Richerby

Sounds like an interesting problem for me to think about. If I find anything I'll reply back.
Jake
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.