文脈自由文法とは何ですか?


104

誰かが文脈自由文法とは何かを私に説明できますか?Wikipediaのエントリ、次に正式な文法のWikipediaのエントリを調べた後、私は完全に戸惑いました。誰かがこれらのことを説明できるほど親切でしょうか?

構文解析と、正規表現エンジンの制限についても調査したいので、これは不思議に思っています。

これらの用語が直接プログラミングに関連しているか、一般的に言語学に関連しているかはわかりません。その場合は、申し訳ありませんが、もしそうであれば移動できますか?


2
それはより関連しているAutomata Theorem
Rahul

2
形式解析言語と解析のためのオートマトン理論に興味がある場合は、Sudkamp's Languages and MachinesやAho、Sethi&Ullman's Compilersのような本をお勧めします。各本は、文脈自由文法の一種である文脈自由文法の正式な説明を提供し、次に、それらを理解するために必要な文脈自由文法に関する基本定理(文脈自由言語のポンプ補題や変換や正規形定理)。正式な言語理論を学習するための数学的前提条件は、セット理論の大まかな理解以上にありません。
danportin、2011

1
そのような質問は理論計算機科学に移行されるべきではないでしょうか?
ペールブルードット

回答:


110

文脈自由文法は、特定の特性を満たす文法です。コンピュータサイエンスでは、文法は言語を記述します。具体的には、正式な言語を記述します。

形式言語は、文字列のセット(オブジェクトのコレクションの数学的用語)です(シンボルのシーケンス...「文字列」という言葉のプログラミングでの使用に非常に似ています)。形式言語の簡単な例は、長さ3のすべてのバイナリ文字列のセット、{000、001、010、011、100、101、110、111}です。

文法は、文法で記述された言語で文字列を構成するために実行できる変換を定義することによって機能します。文法は、開始記号(通常はS)を記号の文字列に変換する方法を説明します。上記の言語の文法は次のとおりです。

S -> BBB
B -> 0
B -> 1

これを解釈する方法は、ということであるSに置き換えることができBBB、かつB0に置き換えることができ、そしてB私たちが行うことができ、文字列010を構成するために1.そうで置き換えることができますS -> BBB -> 0BB -> 01B -> 010

文脈自由文法とは単に、置き換えるもの(矢印の左側)が単一の「非終端」記号である文法です。非終端記号は、最終的な文字列に表示できない文法で使用する記号です。上記の文法では、「S」と「B」は非終端記号であり、「0」と「1」は「終端」記号です。好きな文法

S -> AB
AB -> 1
A -> AA
B -> 0

「AB-> 1」のような規則が含まれているため、規則的ではありません。


12
「通常ではない」とは、「コンテキストフリーではない」という意味ですか?(CFGで表現可能な言​​語は、正規表現で表現可能な言​​語のスーパーセットであるため)
Anti Earth

3
「SはBに置き換えることができます」を「SはBBBに置き換えることができる」と読みますか?
Cosmo Harrigan 2014年

4
良い主よ、これは私がSOで見た中で最もよく説明された答えの1つです。
Rafael Dias da Silva

1
@AntiEarth 2番目の例は、通常の文法では許可されていない単一の非終端記号から2つの非終端記号を生成する規則があるため、通常の文法ではありません(また、OPが指摘しているように、複数の非終端記号が左側)。en.wikipedia.org/wiki/Regular_grammar
awwsmm 2018年

21

言語理論は計算理論に関連しています。コンピュータサイエンスのより哲学的な側面は、どのプログラムが可能であるか、またはこれから作成することが可能になるか、および解決するアルゴリズムを作成することが不可能である問題の種類を決定することです。

正規表現は、正規言語を記述する方法です。通常の言語は、決定論的有限オートマトンによって決定できる言語です。

有限状態機械に関する記事を読む必要があります:http : //en.wikipedia.org/wiki/Finite_state_machine

そして通常の言語:http : //en.wikipedia.org/wiki/Regular_language

すべての通常の言語はコンテキストフリー言語ですが、通常ではないコンテキストフリー言語もあります。コンテキストフリー言語は、コンテキストフリーグラマーまたは単一のスタックを持つ有限状態マシンであるプッシュダウンオートマトンによって受け入れられるすべての文字列のセットです。http//en.wikipedia.org/wiki/Pushdown_automaton#PDA_and_Context-free_Languages

文字列がその言語であるかどうかを判断するために、チューリングマシン(コンピューターに記述できるあらゆるプログラム)を必要とする、より複雑な言語があります。

言語理論は、P対NPの問題やその他の興味深い問題にも非常に関連しています。

私のコンピュータサイエンス入門3年目のテキストブックは、このことを説明するのがかなり上手でした:計算理論入門。Michael Sipserによる。しかし、新しいものを購入するのに160ドルほどかかり、それほど大きくありません。多分あなたは中古のコピーを見つけることができるか、図書館またはそれがあなたを助けるかもしれない何かでコピーを見つけることができます。

編集:

正規表現とそれ以上の言語のクラスの制限は、過去50年間ほど研究されてきました。通常の言語のポンピングレンマに興味があるかもしれません。これは、特定の言語が規則的でないことを証明する手段です。

http://en.wikipedia.org/wiki/Pumping_lemma_for_regular_languages

言語が通常ではない場合、それはContext Freeである可能性があります。つまり、Context Free Grammerによって記述される可能性があります。または、それがより高い言語クラスでさえも、Context Freeのポンプレンマによって、それがContext Freeではないことを証明できます。正規表現の言語と同様の言語。

言語が決定できないこともあります。つまり、チューリングマシン(コンピューターで実行できるプログラム)でさえ、その言語で文字列を受け入れるか拒否するかを決定するようにプログラムできません。

あなたが最も興味を持っているのは、正規表現で決定できる言語を確認するための有限状態機械(決定論と決定論の両方)と、どの言語が正規でないかを証明するためのポンプレンマです。

基本的に、ある種の記憶またはカウントする能力が必要な言語は、規則的ではありません。たとえば、マシンが括弧を開いたかどうかを覚えておく必要があるため、括弧を閉じる必要があるかどうかをマシンが覚えておく必要があるため、括弧を一致させる言語は規則的ではありません。

少なくとも3つのbを含む、文字aおよびbを使用するすべての文字列の言語は、通常の言語です:a ba ba ba

aより多くのbを含む文字aおよびbを使用するすべての文字列の言語は規則的ではありません。

また、次の例のように、すべての有限言語が規則的である必要はありません。

aより大きいbを含む文字aとbを使用して、50文字未満のすべての文字列の言語は、それが(b | abb | bab | bba | aabbb | ababb |。 ..)すべての可能な組み合わせが一覧表示されるまでそのままにします。


1
正規表現は、文字列をパターンと照合する決定プログラムではありません。これらは正規集合を表す表現であり、メンバーシップの問題は決定可能です。
danportin、2011

1
セットが通常の場合、それは明らかに決定可能です。他にどのように言うかわかりません。それらは事実上、記憶を持たない決定プログラムです。
ポール、

あなたは、通常の言語(「メモリを持たない決定プログラム」)の決定手順を提供する決定論的有限オートマトンを記述しています。正規表現がある用語表す正規言語を、ないプログラムには手順があります。これが私の唯一の不満でした。
danportin、2011

1
「正規表現は正規言語を記述する方法です。正規言語は決定論的有限オートマトンによって決定できる言語です」に変更しました。いいですか?
ポール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.