これは、言語の定義とそれらが完全なチューリングであることを証明することに基づく警官と強盗の挑戦です。
これは警官のスレッドです。強盗のスレッドはこちらです。
警官
警官として、次の2つを準備します。
プログラミング言語またはその他の計算システムの正式な仕様。(計算システムは以下に定義されています。)
以下のやや厳密な定義に従って、システムがチューリング完全であることの証明。
あなたはあなたの言語の仕様を投稿し、強盗はそのチューリングの完全性を証明することによってそれを「クラッキング」しようとします。提出物が1週間以内にクラックされない場合は、安全なものとしてマークし、証拠を投稿できます。(あなたがそれを修正できない限り、誰かがあなたの証明に欠陥を見つけた場合、あなたの答えは無効になる可能性があります。)
これは人気コンテストなので、投票数が最も多く、クラックや無効化されていない答えが勝者になります。挑戦は自由回答です-私は答えを受け入れません。
この課題のために、計算システムは次の4つとして定義されます。
「プログラムセット」
P
。これは、数え切れないほど無限のセットになります。たとえば、文字列、整数、バイナリツリー、グリッド上のピクセルの構成などです(ただし、以下の技術的な制限を参照してください)。「入力セット」
I
。これも数え切れないほど無限のセットであり、と同じセットである必要はありませんP
(ただし、そうである場合もあります)。「出力セット」は
O
、同様に無数に無限のセットであり、P
またはと同じであってもなくてもかまいません。I
出力生成のための決定論的、機構的手順
o
プログラムからp
の入力i
、p
、i
およびo
のメンバーでありP
、I
そしてO
それぞれ。この手順は、原則として、チューリングマシンまたは他の抽象的な計算モデルに実装できるような手順にする必要があります。もちろん、プログラムとその入力によっては、手順が停止しない場合があります。
セットP
、I
そしてO
あなたが計算可能な方法で文字列としてそれらを表現できるようなものでなければなりません。(ほとんどの賢明な選択の場合、これは重要ではありません。このルールは、停止しないチューリングマシンのセットなどの奇妙なセットを選択しないようにするために存在します。)
チューリング完全性は次のように定義されます。
- 任意の計算部分の機能のために
f
からI
のO
、プログラムが存在するp
中でP
、そのような与えられたp
入力i
、出力されf(i)
た場合f(i)
の値を有します。(それ以外の場合、プログラムは停止しません。)
上記の定義で「計算可能」という用語は、「チューリングマシンを使用して計算できる」という意味です。
どちらのことを注意ルール110もビット単位のサイクリックタグは、彼らが必要な入出力構造を持っていないので、この定義にチューリング完全です。ラムダ計算は、私たちが定義I
しO
、教会の数字である限り、チューリング完全です。(一般的にラムダ式を採用するI
と、チューリング完全ではありませんO
。)
言語の実装を提供する必要はありませんが、必要に応じて回答に含めることもできます。ただし、言語を定義するために実装に依存するべきではありません。仕様自体が完全である必要があり、仕様と実装の間に矛盾がある場合、これは実装のバグとして扱われるべきです。