初めに、CFG(文脈自由文法)またはPDA(プッシュダウンオートマトン)を使用して「ww」の形をしていない文字列を受理する方法について考えます。
CFGの場合、言語を定義するために非終端記号と終端記号を使用します。CFGでは、制約を追加して言語を作ることができます。この場合、制約を考えると、文字列の後半(bの列)が正確に文字数が同じである必要があります。
一つの可能性として、以下のCFGを考えることができます:
S → aSb | ε
このCFGでは、文字列は「a」で始まり「b」で終わり、「a」と「b」の間に任意の個数の「a」または「b」を追加することができます。ただし、文字列の中央にある「a」と「b」の個数は同じである必要があります。このCFGは、より一般的な「ww」の形をしていない文字列を受理します。
PDAの場合、スタックを使用して受理することができます。遷移のルールと受理する条件を考えると、以下のPDAを考えることができます:
Q:状態の集合 {q0, q1, q2, q3}
Σ:入力記号の集合 {a, b}
Γ:スタックアルファベットの集合 {A, B, Z}
q0:初期状態
Z:スタックの空の記号
F:受理状態の集合 {q3}
遷移関数は以下のようになります:
δ(q0, a, Z) = {(q1, AZ)}
δ(q0, b, Z) = {(q2, BZ)}
δ(q1, a, A) = {(q1, AA)}
δ(q1, b, A) = {(q2, ε)}
δ(q2, b, B) = {(q2, BB)}
δ(q2, a, B) = {(q1, ε)}
δ(q2, ε, Z) = {(q3, Z)}
このPDAは、入力文字列を受け取り、スタック上に「a」と「b」をプッシュしながら処理します。スタック上の記号が一致しない場合、または最終状態でスタックが空ではない場合、受理しません。
以上のCFGとPDAは、文字列が「ww」の形をしていないという制約を満たすための方法の一つです。