web-dev-qa-db-ja.com

言語が文脈自由かどうかをどのように判断できますか?

言語が文脈自由かどうかをどうやって知ることができますか?

25
user423733

まず、主語で言語を構成する context-free grammar を構築する必要があります。すべてのプロダクションの左側に1つの非終端記号が含まれている場合、文法は文脈自由です。定義により、存在する場合、言語は文脈自由です。

同等の構成は pushdown automaton になります。 DFAと同じですが、スタックが利用可能です。文法より構築する方が簡単かもしれません。

ただし、文法またはオートマトンの構築に失敗したとしても、言語が文脈自由でないわけではありません。多分、トリッキーな文法を十分に構築できないのはあなただけです(たとえば、私はかつてトリッキーな言語の文法を構築するのに約7時間費やしていました)。

言語が文脈自由かどうか疑い始めたら、いわゆる "文脈自由言語のポンピング補題" を使用する必要があります。 all文脈自由言語のプロパティを記述し、あなたの言語がそれに違反している場合、それは明らかに文脈自由ではありません(- sage注 ウィキペディアで)。

この補題は オグデンの補題 の結果です。したがって、Ogdenはより強力であり、ポンピングレンマを適用できなかった場合は、Ogdenを試すことができます(同じ方法で使用されます)。

28
P Shved

編集

言語が非CFGであることを証明するためのコメントで示唆されているように、私はogdensの補題を使用することによると思います。私の以前の答えに含まれている固有の誤解は許されるべきです:)潜伏者のために以前の答えを保持します。

古い答え

使用されている文法とルールを見ることで!画像からわかるように(礼儀ウィキペディアチョムスキー階層)。通常の言語のみが非コンテキストフリーではありません。フォームA-> aBまたはA-> Baのみを使用するものを暗示することは、文脈自由ではありません。

alt text

編集 A-> aBおよびA-> Baの定義は、左および右の再帰文法を表現することを意図しており、文字どおりに解釈されることはありません。

2
questzen

言語が文脈自由かどうかを判断するには、言語の文法が必要です。文法は、すべてのプロダクションが「(非終端)->終端と非終端のシーケンス」の形式を持っている場合、コンテキストフリーです。

1
falagar