言語がコンテキストフリーであることを証明する方法は?


26

あります多くの技術言語であることを証明するためではない文脈自由は、しかし、どのように私は言語があることを証明んです文脈自由?

これを証明するためのテクニックは何ですか?明らかに、1つの方法は、言語の文脈自由文法を示すことです。特定の言語の文脈自由文法を見つけるための体系的な手法はありますか?

通常の言語では、そこにある 体系的な方法正規文法/有限状態オートマトンを導出するには:例えば、マイヒル-ネローデの定理は、1つの方法を提供します。コンテキストフリー言語に対応する技術はありますか?


ここでの私の動機は、(願わくば)与えられた言語が文脈自由であることを証明しようとするとき、しばしば役立つテクニックのリストを含む参照質問を構築することです。この特別なケースである多くの質問がここにあるので、この種の問題に直面したときに使用できる一般的なアプローチまたは一般的なテクニックを文書化できればいいでしょう。


いつものメモを残しておいてください。手元の言語に文脈に依存しない文法を提供する場合、アプローチをかなり扱いにくいものにすることができる正確性証明が必要です。
— ラファエル

これを問題のダンパーに投げかけることができる適切な参照質問にするために、おそらくそれぞれの例で、文法とオートマトンを考え出すことについての答えを追加できますか?ありがとう!
— ラファエル

素材がここに移動するまで、Rick Deckerとbabou は重複した質問でいくつかの典型的な文脈自由イディオムを収集したことに注意してください。
— ラファエル

回答:


13

多くの例で機能する実用的なアプローチ[常にではないが、私は知っている]は、言語の文字列の入れ子構造を見つけようとしています。「ネストされた依存関係」は、文字列の異なる部分で同時に生成される必要があります。

また、基本的なツールボックスがあります:

  1. 連結:言語を2つの連続した部分に分割できる場合は、このプロダクションを使用しますS→S1S2

  2. ユニオン:分割された部分に分割S→S1∣S2

  3. 反復: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∣ε


最終コメント:これらのテクニックは、あなたの言語を認識できることを期待する文脈自由文法の候補を思いつくのに役立ちます。 文法が本当にあなたの言語を認識するように機能することを保証するために、正しい証明がまだ必要かもしれません(それ以上でもそれ以下でもありません)。


11

使用できるCFLの特徴として、チョムスキーシュッツェンベルガーの定理があります。

ダイク言語

してみましょうアルファベットを。我々が定義ダイク -languageの文脈自由文法でとによって与えられましたTDT⊆(T∪T^)∗TG=({S},T∪T^,δ,S)δ

S→aSa^S∣ε,a∈T。

チョムスキー・シュッツェンベルガーの定理

L⊆Σ∗は、次の場合にのみコンテキストフリーです。

  • アルファベット、T
  • 通常の言語およびR⊆(T∪T^)∗
  • 準同型ψ:(T∪T^)→Σ∗

そのため

L=ψ(DT∩R)。

準同型は単語(シンボルごとの記号)に拡張され、次に言語(単語ごと)に拡張されることに注意してください。

例

考えます。とL={anbncm∣n,m∈N

  • T={[,⟨}(そして、標準的には)、T^={],⟩}
  • R=L([∗]∗⟨∗⟩∗)および
  • ψ(x)={a,x=[b,x= ]ε,x=⟨c,x= ⟩

定理は、特にL

DT∩R={[n]n⟨m⟩m∣n,m∈N}。

例2

ことを示すはコンテキストに依存しません。L={bkal(bc)manbo∣k,l,m,n,o∈N,k≠o,2l=n,m≥2}

ここでは、いずれかの括弧の種類必要があるため、1、のための1つの、及びモデル化するために使用される別の原因という。を使用しておりますabcbbk≠o

  • T={[,⟨,⊢,<}、
  • R=L(<+>+⊢∗[∗⟨⟨+⟩+⟩]∗⊣∗)∪L(⊢∗[∗⟨⟨+⟩+⟩]∗⊣∗<+>+)および
  • ψ(x)={b,x∈{⊢,⊣,<}a,x=[aa,x= ]bc,x=⟨ε,else

そして定理を適用します。それを見るために、一致するシンボルが(例えばことを、我々はより多くの事実よりも必要としないと)いずれにも平等に頻繁に発生する必要が。我々が定義された正規表現にこのcontraintを追加するによっては、我々 GETL=ψ(DT∩R)[]w∈DTR

DT∩R={<p>p⊢o[l⟨m⟩m]l⊣o∣p≥1,o≥0,l≥0,m≥2}∪ {…}

そしてそれで

ψ(DT∩R)={bp+oal(bc)ma2lbo∣p≥1,o≥0,l≥0,m≥2}∪ {…}={bkal(bc)manbo∣k,l,m,n,o∈N,k>o,2l=n,m≥2}∪ {…}=L.

文法とオートマトンへ

最終的にオートマトンまたは文法を持ちたい場合は、さらに先に作業が必要です。

  • オートマトンに向けて、D_Tのと NFAを構築します。前者は標準であり、言語が適切な表現で提供されている場合、後者のアルゴリズムがあります(こちらも参照)。交差点は両方とも別の標準構造であり、はすべての遷移に個別に適用できます。DTRψ

  • 文法に向けて、 1つを構築し(再び、標準である必要があります)、の1つを、それらを交差させます。次に、ルールセット(シンボルのシンボル)にを適用します。RDTψ

おそらく、これはアルゴリズムなので簡単です。複雑さは、適切な、、およびを見つけることにあります。このアプローチが(多くの場合)PDA /文法を直接構築するよりも簡単かどうかはわかりませんが、手元の言語の重要な機能に焦点を合わせることができるかもしれません。自分で試してみてください!TRψ


特定の言語がコンテキストフリーであるかどうかは決定できません。
— reinierpost
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.