3

アルゴリズムの擬似コードがすでにある場合、チューリングマシンが何をするかを説明するのに役立つガイドラインはありますか?

私は複雑さの理論のコースを受講しており、Cやアセンブリのようなものでコーディングする方法を知っていても、いくつかの言語(状態、遷移など)を決定または受け入れるチューリングマシンについて説明するのに時間がかかります。チューリングマシン(それに取り組んでいる)を十分に練習していないと思いますが、何か提案があればありがたいです。

編集

チューリングマシンのシミュレーターを作りたくありません。いくつかの言語を決定するために、紙にチューリングマシン(アルファベット、状態、遷移)を記述したいと思います。

これは、私が意味する簡単な例です。たとえば、0と1の文字列を調べ、その中のすべての0を1に変更するチューリングマシンを作成する必要があるとします。たとえば、テープ(入力)で11010から開始すると、テープ(出力)で11111で停止します。これで、高級言語では、次のようなものであることがわかります。

Go over every character on tape
    If character is 0 change it to 1

チューリングマシンの説明は、非公式に次のようなものです。

qとhaltの2つの状態があります。状態qにあり、1が表示されたら、変更せずに右に移動します。0が表示されている場合は、1に変更して、右に移動します。空白の記号(テープの終わり)が表示された場合は、停止状態になります。

正式には、状態に対して{q、halt}のようなものがあります。{((q、1)->(q、1、R))、((q、0)->(q、1、R))、((q、#)->(halt、0、L) )}トランジションの場合。

現在、この問題は些細なことですが、より複雑な問題もあります(1進数を追加するか、a、b、およびcの数が等しい言語を認識します)。それらの擬似コードを簡単に書くことはできましたが、チューリングマシンを書くことははるかに困難であり(時間がかかります)、そのような問題をよりよく解決するのに役立つヒント、リソース、またはガイドラインがあるかどうか疑問に思いました。

4

2 に答える 2

10

免責事項:あなたの質問は非常に一般的であるため、この回答も同様です。私は TM の専門家ではないことに注意してください。このアプローチは通常、あまり効率的ではありません (常に効果的であるとは約束できません)。ここにちょっとだけ感想を書いておきます。

次のようなアプローチを試すことをお勧めします。擬似コードを取得して、a) ブール変数と b)ifステートメントのみで構成されるように縮小します。例えば:

if THIS_LETTER_IS("A"):
    found_an_even_number_of_A = not found_an_even_number_of_A

if THIS_LETTER_IS("Q") and previous_letter_was_X and found_an_even_number_of_A
        and not checking_for_alternative_2:
    # can't be a word of alternative 1, so check for alternative 2
    going_back_to_start_to_check_for_alternative_2 = True

if going_back_to_start_to_check_for_alternative_2:
    MOVE_TO_PREVIOUS
else:
    MOVE_TO_NEXT

if going_back_to_start_to_check_for_alternative_2 and THIS_LETTER_IS(EMPTY):
    # reached the beginning, so let's check for alternative 2
    going_back_to_start_to_check_for_alternative_2 = False
    checking_for_alternative_2 = True

sがネストされている場合はif、それらを s に置き換えますandelseを使用してブロックを削除しnotます。

if something:
    if something_else:
        do_a
    else:
        do_b

になる

if something and something_else:
    do_a

if something and not something_else:
    do_b

各ブロックには、1 つまたは、場合によってはコマンドと、任意の数の変数割り当てifのみを含める必要があります。MOVE_TO_PREVIOUSMOVE_TO_NEXTWRITE

ブール値のすべてifと現在の文字が常にチェックされるようにすべての句を完成させ、必要に応じてブロックを複製します。例:

if something and something_else:
    do_a

になる

if THIS_LETTER_IS("A") and something and something_else and something_i_dont_care_about_here:
    do_a

if THIS_LETTER_IS("A") and something and something_else and not something_i_dont_care_about_here:
    do_a

if THIS_LETTER_IS("Q") and something and something_else and something_i_dont_care_about_here:
    do_a

if THIS_LETTER_IS("Q") and something and something_else and not something_i_dont_care_about_here:
    do_a

n個のブール値とm個の文字がある場合、m * 2 n if sが必要です。ブール値をビットフィールドに格納したと想像してください。したがって、ブール値の可能な組み合わせはそれぞれ整数を表します。したがって、上記は

if THIS_LETTER_IS("A") and bitfield[0] and bitfield[1] and bitfield[2]:
    do_a

if THIS_LETTER_IS("A") and bitfield[0] and bitfield[1] and not bitfield[2]:
    do_a

# ...

その後、

if THIS_LETTER_IS("A") and bitfield == 7:
    do_a

if THIS_LETTER_IS("A") and bitfield == 3:
    do_a

# ...

ビットフィールドのこの整数値は、チューリング マシンの状態です。このdo_a部分はブール値への割り当て (つまり、ビットフィールド、つまり新しい状態)、書き込みコマンド (何もない場合は、既に存在していた文字を書き込むだけ)、および移動コマンドであり、明示的にチューリング マシンの遷移です。

上記のいずれかが理にかなっていることを願っています。

于 2010-01-20T09:18:56.927 に答える
1

すぐに使えるツール、Turing Machine シミュレーターが必要ですか? かなりたくさんあります。それとも、実際に自分で作りたいですか?これは JavaScript での有効な実装のようです: http://klickfamily.com/david/school/cis119/TuringSim.htmlコードを分析して、C または C++ に簡単に変換できます。

于 2010-01-20T07:34:03.393 に答える