回文以外の文字列を生成する CFG が必要です。解決策が提供されており、以下のとおりです。 (計算理論の紹介 - Sipser)
R -> XRX | S
S -> aTb | bTa
T -> XTX | X | <epsilon>
X -> a | b
この文法がどのように機能するかについての一般的なアイデアが得られます。これは、 production を通じて、対応する等しくないアルファベットをどちらかの半分に持つ部分文字列の挿入を義務付け、S -> aTb | bTa
回文が決して生成されないようにします。
私が理解しているように、最初の 2 つのプロダクションのセマンティクスを書き留めておきます。
S
最初と最後のアルファベットが等しくないため、回文にならない文字列を生成しますR
S
回文にならないことを保証する部分文字列として少なくとも 1 つで構成されます。
3 番目のプロダクション、つまり のセマンティクスが完全にはわかりません。
T -> XTX | X | <epsilon>
X -> a | b
私の見方では、T は a と b の任意の組み合わせ、つまり {a, b}* を生成できます。どうしてこうならなかったんだろう
T -> XT | <epsilon>
X -> a | b
2つは同等ではありませんか?後者の方がより直感的であるため、なぜ使用されないのですか?