ええ、あなたのオートマトンは、文字列abを受け入れないので正しくない、または空文字列を受け入れます。
- q0 Z
a q0 AZ
b q1 AZ
(doesn't accept)
- q0 Z
(doesn't accept)
q1は受け付けていませんので、あなたのマシンはあなたが記述言語であるABを、受け入れることができない:あなたは、マシンの状態を、以下の配列を取得します。
適切な一般的な考え方があります。表示されているそれぞれにAを追加し、表示されている1,2、または3つのbのグループごとにAを削除します。この策定は明らかに非決定論的ですが、DPDAに求められていなければOKです。
(q0, a, Z) => (q0, AZ)
(q0, a, A) => (q0, AA)
(q0, -, Z) => (q1, Z)
(q0, -, A) => (q1, A)
これらのトランジションはaをカウントし、Aをスタックに追加します。 aを読み終えたら、次の状態q1に行き、bの数をカウントしてAをポップすることができます。
(q1, -, A) => (q2, A)
(q1, -, A) => (q3, A)
(q1, -, A) => (q4, A)
これらの遷移は、マシンが非決定的に
(q2, b, A) => (q1, -)
(q3, b, A) => (q5, A)
(q5, b, A) => (q1, -)
(q4, b, A) => (q6, A)
(q6, b, A) => (q7, A)
(q7, b, A) => (q1, -)
これらの遷移は、実際に1つ、2つまたは3つのBさんをカウント扱う特定のA.のために1、2、または3のBさんをカウントするかどうかを選択することを可能にし、 Aを除去し、q1に戻り、スタックから追加のAを除去することができる。
(q1, -, Z) => (qf, Z)
この移行により、Aのスタックが使い尽くされた後にPDAが文字列を受け入れることができます。入力にbが残っていると、そこに遷移が定義されていないため、PDAはqfでクラッシュすることに注意してください。クラッシュするので、文字列は受け入れられません(スタックが空で受け入れ状態でクラッシュしても)。
この問題のもう1つのアプローチは、この言語用のCFGを構築し、次にトップダウンまたはボトムアップパーサを構築することです。この言語のための簡単なCFGは次のとおりです。
S := aSb | aSbb | aSbbb
DPDAを希望する場合、それは難しい問題と答えは「何もDPDAが存在しない」とすることができる:1です。正直言って、私はこの言語のためのDPDAの構築を何ら考えていません。基本的な考え方は、次のプロパティを持つ3つのパーティションにあなたのスタックを分割することをあるよう