多くの例で機能する実用的なアプローチ[常にではないが、私は知っている]は、言語の文字列の入れ子構造を見つけようとしています。「ネストされた依存関係」は、文字列の異なる部分で同時に生成される必要があります。
また、基本的なツールボックスがあります:
連結:言語を2つの連続した部分に分割できる場合は、このプロダクションを使用しますS→S1S2
ユニオン:分割された部分に分割S→S1∣S2
反復:S→S1S∣ε
例1
ネスティングの例を次に示します(ありがとうございますRaphael)。
L={bkal(bc)manbo∣k,l,m,n,o∈N,k≠o,2l=n,m≥2}
を置き換えます。条件でをドロップできるようになりました。n2ln
を置き換え(混同しますか?は 'oh'ではなく 'oh' です)。組合にツールを適用します。ここではで作業します。また、 IFFおよび新しい変数です。を置き換えます。k≠ok>o or k<ook>ok>ok=s+os>0sks+o
L1={bs+oal(bc)ma2lbo∣l,m,o,s∈N,s>0,m≥2}
いくつかの簡単な書き換え。
L1={bbsboalbcbc(bc)m(aa)lbo∣l,m,o,s∈N}
これでネスト構造が表示され、文法の構築が開始されます。
S1→TV、、(ここでの連結と反復を参照)T→bUU→bU∣ε
V→bVb∣W(両側にを生成します)o b
W→aWaa∣X
X→YZ、、Y→bcbcZ→bcZ∣ε
例2
K={akblcm∣l=m+k}
最初の「明白な」書き換え。
K={akbm+kcm∣m,k≥0}={akbmbkcm∣m,k≥0}
言語学では、これは「クロスシリアル依存性」と呼ばれます。インターリービング(通常)非コンテキストフリー性を強く示します。もちろんあり、私たちは救われています。k,m,k,mm+k=k+m
K={akbk+mcm∣m,k≥0}={akbkbmcm∣m,k≥0}
プロダクション、、S→XYX→aXb∣εY→bYc∣ε
同様に、K′={akblcm∣m=k+l}={akblclck∣k,l≥0}
プロダクションで、S→aSc∣XX→bXc∣ε
最終コメント:これらのテクニックは、あなたの言語を認識できることを期待する文脈自由文法の候補を思いつくのに役立ちます。 文法が本当にあなたの言語を認識するように機能することを保証するために、正しい証明がまだ必要かもしれません(それ以上でもそれ以下でもありません)。