チューリング マシンの命令にコンパイルする独自のプログラミング言語を作成しましたが、実装方法を知りたいと思っていましたif(a>b) do _ end
。言語の定義は次のとおりです(ここでも入手できます)
変数は任意の幅で動的に割り当てられるため、任意の大きな整数を持つことができます
各行は、関数の呼び出し (引数の変更)、while ループの開始 (実際には for ループに近い)、変数の割り当ての 3 つのうちのいずれかを実行できます。
使用可能な関数はincr
、(1 ずつ増加、オーバーフロー可能)、decr
(1 ずつ減少、オーバーフロー可能)、pop
(変数から最後の桁を削除)、first
(変数の最上位の 0 を 1 にfrost
変更)、および (最も重要な桁を変更) です。有意な 1 からゼロ)。
while ループの構文は次のとおりです。
while a <func> {
_
}
基本的にループするたびにエラー状態になるまで<func>
行います。a
エラー条件は次のとおりで、incr
すべてfirst
1 で、decr
すべてfrost
0 でpop
、最後の桁を削除します。incr
またはを使用した while ループの後、frost
ループ変数のすべてのビットが 0 になり、 と が逆にfirst
なりdecr
ます。while ループは関数呼び出しで終了する必要があり、各実行後に含まれるすべての変数を削除します。
割り当ては、構文に基づいていくつかの異なることを行うことができます。これよりも長い場合、変数が所有するスペースにa=b
変数をコピーすることを意味し、作成された最新の変数でない限り、未定義の動作を引き起こします。左に 5 つのパディング ビット (ゼロに設定) を割り当てると、最後に変数が作成されない限り、オーバーフローによって未定義の動作が発生します。をゼロにします。最後に 3 ビットで代入します。b
a
b
a
a
a=b,5
b
a
a
a=a,0
a
a=5,3
5 % 2**3
a
今私はで実装if(a != 0) do _ end
することができます
while a decr {
_
t=0,1
while a incr {
incr(t)
}
incr(t)
}
if(a==b)
私の質問は、if(a!=b)
、 、などの他の if ステートメントをどのように実装できるかです。if(a>b)
そして、二次的な質問として、この言語はチューリング完全です.この回答に基づいてそう信じていますプログラミング言語がチューリング完全であるための最小基準はありますか? . 言語が 1 ~ 5 を満たすことはわかっていますが、6 についてはわかりません。