• 検索結果がありません。

スタックを用いた動作

ドキュメント内 _auto (ページ 96-100)

13

正則言語を受理する機械として有限状態オートマトンがあるように、文脈自由言語を受理する機

2

械としてプッシュダウン・オートマトン(pushdown automaton)が考案されています。「プッシュ

3

ダウン」とは「最後に記憶された情報が最初に検索される」ことを意味します1。このようなデー

4

タ構造としてすぐに

スタック

stack)が連想されますが、プッシュダウン・オー

5

トマトンとはまさに スタックを持つオートマトン に他なりません。

6

なお、以下ではプッシュダウン・オートマトンを簡単にPDAと呼ぶこととします。

7

ǡǧǫǗƣງ߰

# A A A

q0 q1

(a,#→#A) (a,A→AA)

(b,A→ϵ)

(b,A→ϵ)

๧ۆभઆശ

ద໧݈֗་ƣߢƿ aaaabb...

q2 (ϵ,#→#) ہޟƣभઆ

q0

図 13.1: anbnを認識するプッシュダウン・オートマトン

(a) 記号aを読んだときには、スタックの状態に関わらず、記号Aをスタックに積みます。

1

(b) 記号bを読んだときに、スタックの頂上の記号がAならば、Aをスタックから降ろし

2

ます。そしてq1へ遷移します。

3

(c) 上の二つに当てはまらない場合には、オートマトンの動作は失敗と見なし、入力記号列

4

は受理されません。

5

4. 状態q1 において

6

(a) 記号bを読んだときに、スタックの頂上の記号がAならば、Aをスタックから降ろし

7

8 ます。

(b) スタックの頂上の記号が#ならば、入力記号を読まないで、状態q2 へ遷移します(こ

9

れはε遷移です)。

10

(c) 上の二つに当てはまらない場合には、オートマトンの動作は失敗と見なし、入力記号列

11

は受理されません。

12

5. 状態q2 において入力記号を全て読み終えたならば、オートマトンの動作は成功です。さも

13

なくば失敗です。

14

このオートマトンの動作のポイントは、読み込んだ入力記号aと同じ個数のA をスタックに積む

15

ことです。そして次に入力記号bを読むときにはAをスタックからひとつずつ降ろしていきます。

16

そして、aと同じ個数の bを読み終えたならば、スタックの頂上には# が見えているはずです。

17

つまり、スタックを用いて記号 aの個数を記憶するのです。このような記憶装置はDFA、NFA、

18

ε-NFAにはありませんでした。

19

ところで、ある状態 pにおいて、入力記号がa であり、かつスタックの頂上の記号がZ であ るときに、状態qへ遷移し、スタックからZ を下ろし、新たにスタックに記号Z1、Z2、...、Zk

(k≥0)をこの順に積むという動作を行うと仮定します。これをオートマトンの状態遷移図に表す ために、状態遷移図のpからqへの枝に以下のラベルを付けると約束します。

(a, Z→Z1Z2...Zk) 記号を読まないε遷移の場合には以下の通りとします。

(ε, Z→Z1Z2...Zk) スタックに何も積まない場合には以下の通りとします。

(a, Z→ε) 図13.1の状態遷移図には上のようなラベルを付けています。

1

図13.1に基づいて、実際に入力記号列aaaabbbbを読み込んでみましょう。

2

その準備として、オートマトンの実行の様子を的確に知るために、オートマトンの状態 q、ス

3

タックの内容γ、(まだ読み込まれていない)入力記号列の残りuを以下のように並べて表します。

4

状態 スタック 入力列の残り

q γ u

5

これを一般に

時点表示

instantaneous description)2と呼びます。そうすると、

6

例題のPDA で入力記号列aaaabbbbを読むときの初期の時点表示は以下の通りです。

7

状態 スタック 入力列の残り

q0 # aaaabbbb

8

ここでオートマトンが記号aを読み、上の規則3.(a)によって時点表示は以下のように変化します。

9

状態 スタック 入力列の残り

q0 #A aaabbbb

10

同じく、残りの三つのaを読むと、変化は以下の通りです。

11

状態 スタック 入力列の残り

q0 #AA aabbbb

q0 #AAA abbbb

q0 #AAAA bbbb

12

次にbを読むと、上の3.(b)の規則によって、状態はq1 に遷移し、スタック上の記号Aがひとつ

13

減ります。

14

2読んで字のごとく、オートマトンの各時点での状態を表した式のことです。

状態 スタック 入力列の残り

q0 #A aaabbbb

q0 #AA aabbbb

q0 #AAA abbbb

q0 #AAAA bbbb

q1 #AAA bbb

q1 #AA q1 #A q1 # q2 #

図13.2: 図13.1のプッシュダウン・オートマトンの動作例(まとめ)

状態 スタック 入力列の残り

q1 #AAA bbb

1

さらに4.(a)の規則を3回適用し、時点表示は以下のように変化します。

2

状態 スタック 入力列の残り q1 #AA

q1 #A q1 #

3

最後に4.(b)の規則を適用すると、

4

状態 スタック 入力列の残り q2 #

5

となり、状態q2 において入力列は全て読み終えました。よって記号列aaaabbbb は受理されまし

6

た。この一連の動作を図13.2にまとめました。

7

考察 入力記号列がε、aaabb、aabbbのときのオートマトンの動作をそれぞれ調べなさい。

8

考察 言語{anbn |n≥0} を受理する PDA を検討しなさい。ここに上の例とは異なり、n= 0

9

の場合が含まれることを注意する。

10

考察(難問) 以下の文脈自由文法に対応するPDAを検討しなさい。

1

1: E→E + F 2: E→F

3: F →id 4: F →(E )

2

ドキュメント内 _auto (ページ 96-100)