web-dev-qa-db-ja.com

通常の言語とは何ですか?

言語レベルの概念(通常、文脈自由、文脈依存など)を理解しようとしています。

私はこれを簡単に調べることができますが、私が見つけた説明はすべて記号の負荷であり、setsについて語っています。 2つの質問があります。

  1. 通常の言語とは何か、また言語の違いを言葉で説明できますか?

  2. 人々はこのことをどこで理解するのを学ぶのですか?私はそれを理解しているように、それは正式な数学ですか?私はuniでそれを使用する2つのコースを持っていましたが、チューターが私たちがそれを知っていると仮定したので、ほとんど誰もそれを理解しませんでした。それをどこで学ぶことができ、なぜ人々は非常に多くの情報源でそれを知ることが「期待される」のでしょうか?教育にギャップがあるようなものです。

です:

このセットに属する言語はすべて、アルファベット上の通常の言語です。

言語はどのように「上」にあるのでしょうか?

74
FBryant87

コンピューターサイエンスの文脈では、Wordsymbolsの連結です。使用される記号は、alphabetと呼ばれます。たとえば、アルファベット_{0,1,2,3,4,5,6,7,8,9}_から形成される一部の単語は、_1_、_2_、_12_、_543_、_1000_、および_002_。

languageは、考えられるすべての単語のサブセットです。たとえば、すべてのElite MI6エージェントをキャプチャする言語を定義できます。これらはすべてダブル0で始まるため、言語の単語は_007_、_001_、_005_、および_0012_になりますが、_07_または_15_。簡単にするために、言語は「記号の連結によって形成された単語のサブセットinではなく、「overアルファベット」であると言います。 )アルファベット」。

コンピューターサイエンスでは、言語を分類したいと考えています。 Wordのすべての記号を1つずつ調べることにより、Wordがアルゴリズム(一定の(有限)メモリを備えたマシン)の言語であるかどうかを判断できる場合、言語regularを呼び出します別の。 Word _42_だけで構成される言語は規則的です。これは、任意の量のメモリを必要とせずにWordが含まれているかどうかを判断できるためです。最初のシンボルが4かどうか、2番目のシンボルが2かどうか、さらに数字が続くかどうかを確認するだけです。

(理論上)一定のサイズの制御フローツリーを構築するだけでよいため、有限数の単語を含むすべての言語は規則的です(1桁を調べるネストされたif--ステートメントの束として視覚化できます)他)。たとえば、次の構成を使用して、Wordが「10〜99の素数」言語であるかどうかをテストできます。現在のコード行でエンコードするメモリ以外は必要ありません。

_if Word[0] == 1:
  if Word[1] == 1: # 11
      return true # "accept" Word, i.e. it's in the language
  if Word[1] == 3: # 13
      return true
...
return false
_

すべての有限言語は規則的ですが、すべての正規言語が有限ではないことに注意してください。 double-0言語には無限の数の単語(_007_、_008_、さらに_004242_および_0012345_)が含まれていますが、定数メモリでテストできます: Wordがそれに属している場合、最初のシンボルが_0_であるかどうか、2番目のシンボルが_0_であるかどうかを確認します。その場合は、受け入れます。 Wordが3より短いか、_00_で始まらない場合、MI6コード名ではありません。

正式には、言語が正規であることを証明するために、 有限状態機械 または 正規文法 の構成体が使用されます。これらは上記のif- statementsに似ていますが、任意の長い単語を使用できます。有限状態マシンがある場合は、通常の文法もあり、その逆もあるため、どちらかを表示するだけで十分です。たとえば、double-0言語の有限状態マシンは次のとおりです。

_start state:  if input = 0 then goto state 2
start state:  if input = 1 then fail
start state:  if input = 2 then fail
...
state 2: if input = 0 then accept
state 2: if input != 0 then fail
accept: for any input, accept
_

同等の通常の文法は次のとおりです。

_start → 0 B
B → 0 accept
accept → 0 accept
accept → 1 accept
...
_

同等の 正規表現 は次のとおりです。

_00[0-9]*
_

一部の言語はnot正規ではありません。たとえば、任意の数の_1_の言語の後に、同じ数の_2_が続きます(多くの場合1と記述されます)n2n、任意のn)は規則的ではありません-_1_ sの数を保存するには、一定量以上のメモリ(=一定数の状態)が必要ですWordが言語に含まれているかどうかを判断します。

これは通常、理論的なコンピューターサイエンスコースで説明する必要があります。幸いなことに、ウィキペディアは formalregular languages の両方を非常にうまく説明しています。

141
phihag

Wikipedia の同等の定義の一部を次に示します。

[...]正規言語は、次の同等の特性を満たす形式言語(つまり、有限アルファベットからのシンボルの有限シーケンスの無限集合)です。

  • 確定的な有限状態マシンで受け入れられます。
  • 非決定性の有限状態マシンで受け入れられる
  • 正式な正規表現で記述できます。

    多くのプログラミング言語で提供される「正規表現」機能は、正規ではない言語を認識できるようにする機能で強化されているため、正式な正規表現と厳密に同等ではないことに注意してください。

最初に注意することは、通常の言語は 正式な言語 であり、いくつかの制限があることです。正式な言語は、本質的には(おそらく無限の)文字列のコレクションです。たとえば、形式言語Javaは、可能なすべてのJavaファイルのコレクションです。これは、可能なすべてのテキストファイルのコレクションのサブセットです。

最も重要な特徴の1つは、 コンテキストフリー言語 とは異なり、通常の言語は任意のネスト/再帰をサポートしていませんが、任意の繰り返しがあることです。

言語には常に、許可される記号のセットである基礎となるアルファベットがあります。たとえば、プログラミング言語のアルファベットは通常ASCIIまたはUnicodeのいずれかです。許可される文字は0および1

私の大学では、コンパイラクラスで正式な言語理論を教えられましたが、これはおそらく学校によって異なります。

5
hammar