フォワードリードイテレーターチューリングを備えたスタックマシンは完成していますか?


7

スタックの先頭からしか読み取ることができない場合、ストレージが無制限の単一スタックのマシンはチューリング完了ではないことはよく知られています。スタックマシンよりも(少し)強力なマシンが必要ですが、それでもチューリングは完全ではありません。(多項式のスローダウンのみで非決定論的なプッシュダウンオートマトンを決定論的にシミュレートできる非チューリング完全なマシンが存在するかどうか疑問に思います。)私の頭に浮かんだ最も良性の(まっすぐな)拡張は、(単一の)前進でした。イテレータを読みます。

実装の詳細を詳しく説明して、フォワードリードイテレーターの意味を明確にします。単独リンクリストには、スタックを実装するために使用することができます。リストpTopは、ゼロであるか、SListノードを指すポインターによって実装されます。SListノードは、ペイロードフィールドから構成valueし、ポインタフィールドpNextpNextのいずれかがゼロであるか、または点SListノード。前方読み取り反復子をpRead、ゼロであるか、SListノードを指すポインターによって実装します。ポインタpToppReadは直接アクセスできませんが、次の方法でのみ使用できます。

  • Push(val)およびで新しいSListノードnを作成し、を設定します。n.value = valn.pNext = pToppTop = &n
  • Pop()pTop == 0またはの場合は中止しpRead == pTopます。それ以外の場合は、が指すノードを読み取っval = pTop->valuepTopNext = pTop->pNext解放SListpTop、を設定pTop = pTopNextして返しますval
  • ReadBegin()セットpRead = pTop
  • ReadNext()場合は中止しますpRead == 0。それ以外の場合は、読み取りval = pRead->value、設定pRead = pRead->pNext、および戻りますval
  • ReadFinished()true場合pRead == 0は、falseそれ以外の場合はを返します。

私が最初にそれを明確にすべきであるpTop == 0pRead == 0。メソッドReadCancel()のセットはpRead = 0のそれ以外の場合は中止ためにも、良いアイデアかもしれないPop()ためにはpRead == pTop迷惑かもしれません。
Thomas Klimpel

3
プッシュダウンオートマトンとチョムスキー階層のチューリングマシンの間に、状況依存型言語に対応する線形制限非決定性チューリングマシンがあります
–PålGD 2015

1
スタックのスタックを持つオートマトンがありますが、名前を忘れてしまいました。また、「自作」のヒープオートマトンを覚えています。
ラファエル

@ThomasKlimpelは私の回答に間違いがあったことを示していますが、破滅的なものではありません。チューリングの完全性からはまだ明らかですが、モデルは最初に思ったよりも少し強力です(非消去プロパティを誤って解釈しました) 、後から考えると本当に馬鹿げた方法で)。
ルーク・マシソン、2015

1
@ ThomasKlimpel、2番目のヘッドアップ、user23013は正しい(彼の答えを参照)、モデルは完全なチューリングです-クリンチャーはスタックへのポインターが2つあるのに対し、スタックオートマタは1つしかありません(スタックを移動できるため、ただし、上部でのみポップ/プッシュできます)。
ルークマチソン

回答:


5

残念ながらあなたのモデルはチューリング完全です。

次のアルゴリズムを使用して、データ構造のキューをシミュレートできます。3つの新しいスタックシンボルが導入されました。dバツy

Enqueue(val)ただPush(val)です。

の場合Dequeue()

  1. ReadBegin()
  2. その他の数を数える-数 dスタック全体(常に負ではないはずです)。押すy またはポップ バツ すべてのための d、そしてプッシュ バツ またはポップ y他のもののために。常にプッシュよりポップを好みます。最後に何もありませんy スタックでは、結果は バツ スタックの一番上。
  3. ReadBegin()
  4. 一方でpTopありますバツ
    1. ReadNext()それ以外のものを返すまで繰り返しますバツ そして d
    2. Pop()
  5. プッシュ d
  6. の最後の結果がReadNext()の結果として返されDequeueます。

証明は簡単です。より複雑なバージョンの改訂履歴を確認して、最初に双方向バージョンに減らします。


違いを見つけた、あなたは正しい、OPのモデルは完全なチューリングです。スタックオートマトンには、スタックをスキャンするための2番目の読み取りヘッドがありません。通常のヘッドを上下に動かすだけで、上部を押すことができます。
ルークマシソン

5

モデルは(以前考えていたのとは異なり)完全なチューリングです。user23013の回答の証明のスケッチを参照してください(本質は、キューをシミュレートでき、キューのオートマトンは完全なチューリングです)。

線形束縛オートマトン以下と同等になるまでモデルを弱める方法はいくつかあります。

Ginsburg、Greibach、およびHarrison [1]は、「Stack Automaton」と呼ばれるマシンを提供します。これは、2つの追加機能を備えたPDAです。1.入力ヘッドを左に右に移動できます(入力の以前に表示された部分をスキャンできます)。2.スタックの読み取り/書き込みヘッドは、読み取り専用モードでスタックをスキャンできますが、プッシュとポップは依然として上部でのみ発生します。ここでモデルとの主な違いに注意してください。以前は混乱していました。スタックにはスタックを上下に移動できるヘッド/ポインターが1つしかありませんが、あなたのヘッドには2つあり、モデルのチューリングを完成させるのに十分です。また、入力を左から右にのみ読み取ることができる別のモデル[2]も提供しますが、追加の読み取り専用スタックスキャンは引き続き使用できます。

[1]の図2では、包含関係が与えられ(同じセクション5で証明され、おそらく[2]の一部が含まれています)、双方向の非決定的スタックオートマトン言語は、 R。ただし、これらは非決定的線形境界オートマトンと同等であるため、状況依存言語を認識します。

双方向および非決定論的スタックオートマトンと双方向の決定論的スタックオートマトンは同等に見えますが、入力ヘッドを一方向に変更すると大きな違いが生じます。一方向の非決定的スタックオートマトン言語のセットは、状況依存言語の厳密なサブセットです(まだどこに正確に指を置くことはできません)、および一方向の決定論的スタックオートマトンのセット(モデルと同等)言語は、一方向の非決定的スタックオートマトン言語のセットの厳密なサブセットです。

これらよりも弱い弱いタイプも、スタックにのみ書き込み可能な非消去スタックオートマトンです。

Hopcroft&Ullmanは、非消去性の決定論的スタックオートマトンによって認識される言語は、 DSPCEログ 非消去の非決定的スタックオートマトンは、 DSPCE2

補遺

さらに掘り下げた後、これらの講義スライドは、一方向の非消去の確定的スタックオートマトンが双方向のバージョンよりも厳密に弱いことを示しています。DSPCEログ

さらに、Hopcroft&Ullman [4,5]の論文も見つけました。これは、いくつかの手がかりを提供するかもしれませんが、現時点では接線のようです。[5]少なくとも、いくつかのスタックオートマトンがLBAと同等であることを証明します。

参考文献

  1. シーモアギンズバーグ、シーラA.グレイバッハ、マイケルA.ハリソン、「スタックオートマトンとコンパイル」。Journal of the ACM、14(1):172–201、1967。
  2. シーモアギンズバーグ、シーラA.グレイバッハ、マイケルA.ハリソン、「一方向スタックオートマトン」。Journal of the ACM、14(2):389–418、1967。
  3. ジョン・E.ホップクロフト、ジェフリー・D.ウルマン、「Nonerasingスタックオートマトン」。JCSS、1(2):166–186、1967。
  4. John E. Hopcroft、Jeffrey D. Ullman、「Deterministic Stack Automata and the Quotient Operator」、JCSS、2:1-12、1968。
  5. ジョンE.ホップクロフト、ジェフリーD.ウルマン、「一方向スタックオートマトンに関する2つの結果」、スイッチングおよびオートマトン理論に関するシンポジウム(SWAT-ただし、そのSWATではない)、1967年。

しかし、この質問のモデルは非消去ではありません。これは、双方向バージョン(スタックのプッシュ/ポップ/アップ/ダウン操作を記録してカウントすること)と同等であるはずです。
user23013 2015

@ user23013正解、非消去部分を誤って解釈した。
ルークマシソン2015

なぜ私の結論があなたの結論と一致しないのかを確認しようとしたところ、このモデルは実際にはチューリング完全であると確信しています。確認するには:双方向スタックオートマトンはスタックをキューとして使用できないと言いますか(追加のポインターを下部に設定し、下に移動しないでください)。どうせ禁じられているのなら、この質問には明記していないと思います。
user23013

@ user23013 2番目のポインターは読み取り専用pReadです。どこにでも何かを追加する操作はありません。(私が理解しているように)
ルーク・マチソン2015

しかしpToppRead2つの別個のポインターです。でエンキューしpTopたり、デキューしたりできます(上に移動して、以下のものをすべて無視します)pRead。(双方向の場合)
user23013 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.