誰かが、文脈依存の文法の単純ではあるがおもちゃではない例を与えることができますか?


12

文脈依存文法を理解しようとしています。

言語が好きな理由がわかります

  1. {wwwA}
  2. {anbncnnN}

文脈自由ではないが、型付けされていないラムダ計算に似た言語が文脈依存であるかどうかを知りたい。

シンプルだが、おもちゃではない例(上記のおもちゃの例を検討します)、いくつかの生産規則のために、たとえば記号の文字列の有無を伝えることができる文脈依存文法の例を見てみたい現在スコープ内にあります(たとえば、関数の本体を生成する場合)。

文脈依存文法は、未定義/未宣言/非バインド変数を構文上の(意味ではなく)エラーにするほど強力ですか?


1
ほぼすべての実際のプログラミング言語は、コンテキストに依存します(一般的な意味、つまり、「コンテキスト依存」でchomskyタイプ0とタイプIの両方の文法を融合します)。例えば、変数が使用前に宣言する必要がために、これらは(stがセマンティックコンテキストとして参照さが、誤解をすることができます)コンテキストを必要とするすべて、識別子が一意でなければなりませんcs.purdue.edu/homes/hosking/502/notes/04-semantics.pdf
ニコスM 。

まあ、「文脈依存」はタイプ1文法の標準用語です。
reinierpost

回答:


8

はい、これは可能だと思いますが、いいえ、その文脈依存文法を明示的に構築するつもりはありません。質問を2つの異なる部分に分けて、答えを説明します。

(1)おもちゃ以外の例はどうなりますか?変数の宣言を反映する必要があります。実際のプログラミングから抽象化されたこのような言語の私の提案は、このようなものになります。アルファベットは{ w 1 ; w 2 ; ; w nx 1 ;{a,b,;,(,)} その言語はコンテキスト依存です。

{w1;w2;;wn(x1;x2;;xm)wi,xj{a,b}, each xj is equal to some wi}

(2)実際コンテキスト依存であることを示すために、別の形式を使用します。テープを線形で使用するチューリングマシンのそれ:線形有界オートマトンLBA。パターンマッチングを行うようにプログラムすることができます/各を連続して検討し、文字ごとに適切なw jと照合しようとします。LBAは文脈依存文法と同等ですが、プログラミングがはるかに簡単です。xjwj


投稿ありがとうございます。私は今のところLBAにあまり詳しくないので、ポイント(2)に納得しません。ポイント(1)の時点で、変数名が式として期待される場合、現在のスコープ内の変数の1つのみを生成するルールを作成する方法を確認しようとしています。正式なCSG全体を見る必要はありませんが、非公式の説明で十分です。マルチシンボル変数名でそれを行う方法を想像することはできません。これは、単一の非終端コンテキストを使用して〜英語の文派生で主語と動詞の数の一致を指示する場合とは異なるコンテキストの使用です。

一方、私は正式な言語のバックグラウンドであり(英語のネイティブスピーカーでもない)、モデル化/表現したい内容を正確に理解するのに苦労しています。ごめんなさい!私のビジョンでは、この文脈で、{www}は単なるnpyの例ですが、達成したいことの一部であり、同じ文字列(変数名?)の完全なコピーを持っています
Hendrik Jan

返信いただきありがとうございます!。はおもちゃの例であり、なぜコンテキストフリーではないのかは理解していますが、コンテキスト依存性やCSGがそれを生成する方法を直感的に「見る」ことはできません。私が理解していないことを明確にしてみましょう(フォローアップの質問が少なくとも1つありますが、今のところこれで十分です):CSGは、複数の記号の単語を含むコンテキストを使用して、特定の単語の1つを再び生成できます製造?私が見たところから、CSGは通常、制作中に文字を交換し、単一のシンボルを使用して制作を指示しますが、マルチシンボルの単語は使用しません。
{ww|w...}

3
ああ。それはかなり具体的な質問です。文法を与えることなく、いくつかのことを言うことができます。文法には2つの「境界記号」、つまりL Rがあります。導出中、文字列はL w R wのようになります。Lは、文字の生成Aをコピーと一緒にアルファベットからM意志で、文字の上に「移動」wの制作によりMそれは手紙のコピー書き込みM RをRのA{ww}LRLwRwLaMawMabbMaRMaRRa。長い(マルチシンボル)文字列をコピーできます。
ヘンドリック

13

コンテキスト依存言語(CSL)の私のお気に入りの例はSATです。の[n]

CLIQUEなど、他の多くのNPハード言語も同じ理由でCSLに含まれています。

CSLにはかなり難しい自然言語もあります。

しかし、論文の定理3でLandweberの構造を使用する以外に、任意のCSLを状況依存文法(CSG)として表現する方法を知りません。この構成では、CSGは、CSLを認識する線形有界オートマトンの動作の逆を記述します。CSGのプロダクションでは、マシンの特定の状態が1つの可能な動きからどのように生じるかを説明しています。このようなCSGは、オートマトンを文法に簡単に変換するものであるため、変数を宣言できるなどの言語機能に必ずしも対応する必要はなく、オートマトンの詳細によって行き詰まります。

CSLではなくCSGを主張し、実際の質問が、制限された変数スコープを含む言語のCSGを見たいということである場合、Hendrik Janの答えは良い出発点のようです。


9

はい、コンテキスト依存文法(CSG)は未定義/未宣言/非バインド変数のチェックを行うのに十分強力ですが、残念ながらCSGの文字列を解析するための効率的なアルゴリズムを知りません。

状況依存言語の実際の例は、Cプログラミング言語です。最初に変数を宣言し、後で使用するような機能により、C言語を状況依存言語にします(CSL)になります。(型付けされていないラムダ計算については知りません)。

また、CSL(またはCSG)の線形解析アルゴリズムを知らないためです。これがコンパイラ設計の理由です。CFG(制限された形式の場合)を解析する効率的なアルゴリズムを知っているので、構文チェックにCFG(およびその解析アルゴリズムのみ)を使用します。コンパイラは、まずコンテキストのない機能を解析し、その後、問題のある方法でコンテキストに依存する機能を処理します(たとえば、定義されている場合、シンボルテーブルで使用されている変数をチェックします。

また、文脈依存文法は自然言語処理(NLP)で使用されます。そして、ほとんどの自然言語は状況依存言語の例です。(サンスクリット語がわからない語)。

愚かではあるが単純な例で説明しようとします(単なるアイデアであり、改良することができます)。

NOUN     -->  { BlueBomber, Grijesh, I, We}
TENSE    -->  { am, was, is, were}
VERB     -->  { going, eating, working}

SENTENCE --> <NOUN> <TENSE> <VERB>

さて、この文法を使用して、正しいステートメントを生成できますが、間違ったステートメントもあります。例えば、

SENTENCE --> <NOUN>   <TENSE>   <VERB>
             Grijesh    is       working       [Correct statement]

だが

             Grijesh    am       working       [wrong statement]

理由:<TENSE>の値は値<NOUN>(たとえば、I &lt;TENNSE> --> I am)に依存するため、文法は英語の正しいステートメントを生成しません。

実際、完全な英語の文脈自由文法を書くことはできません!

お気づきかもしれませんが、自然言語の翻訳者や文法チェッカーは正しく動作しません(長いステートメントで試してください)。この問題は状況依存の解析アルゴリズムに起因するためです。


参考アルン・クマール博士の講義を見ることができます。 いくつかの講義では、彼はあなたが興味を持っていることを正確に説明します。


情報をありがとう、この同じトピックに興味のある他の人にとっては間違いなく役立つでしょうが、それは私が私が尋ねていたものに部分的にしか関連していません。私はCSGによって生成された文字列の解析に関心がありませんが、整形式の抽象化を生成する正式なCSGの単純な(ばかげた)例を見ます(関数の本体内にバインドされていない変数はありません)。CSGが正しい「英語」文字列を生成することを想像できます。単一のシンボルで主題と動詞の一致を指示できますが、抽象化では、変数は通常複数のシンボルで構成されます。

1
@BlueBomber:ありがとう、私はあなたに答えます、インドの夜。:)
Grijesh Chauhan

それは限られた回数しかできないようで、(this)[ meta.scicomp.stackexchange.com/questions/156/…に従って、この質問を削除してより適切な場所に再投稿する必要があります...

@BlueBomberシフトするようにフラグを立てました、あなたもできます。
グリジェシュショーハン

1

(コメントを回答に拡張する)

とにかく、これがあなたが望む例かどうかわかりません。

ほぼすべての実際のプログラミング言語はコンテキスト依存です(つまり、一般的な意味で、「コンテキスト依存」の下でChomskyタイプ0とタイプIの両方の文法を融合します。これはもちろん、制限のない文法コンテキストよりもコンテキスト依存です-sensitive grammars)。

たとえば、「識別子が一意である必要があります」、これらすべては、コンテキスト必要、「使用前に変数を宣言する必要は」(時々 、セマンティックコンテキストとして参照さを、それはそれはとにかく構文の特徴を伴うため、誤解を招くことができる)の例を参照のhttps:// WWW .cs.purdue.edu / homes / hosking / 502 / notes / 04-semantics.pdf

上記の例が文脈に依存しているという意味(文法/構文の意味および意味論的な意味)は、文脈(前後にあるもの)について話すためです。

「変数は既に定義されています」とは、変数の使用に先行するコンテキストに関するものです。「一意の識別子」は、識別子宣言の前後のコンテキストなどです。

JavaScriptはContext Free Languageですか?もご覧くださいSO


「コンテキスト依存」はタイプ1を意味します。
reinierpost
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.