6

理論上のコンピューター サイエンス クラスのシラバスを調べていると、Context Free Grammars の見出しに「クロージャ プロパティ」がリストされています。私はこのテーマについて教科書を調べましたが、ほとんど見つかりませんでした。現時点では、私の頭の少し上にありますが(まだコースを受講していません)、少し理解しています.

文脈自由文法内のクロージャのこの考え方は、関数型プログラミング内のクロージャの考え方と同じか、または関連しているかどうか疑問に思っていました。私が知る限り、文法を組み合わせて重複を解決することについて話しています。この本のセクションにはまだ理解できない部分がたくさんあるので、これらのアイデアが同じかどうかはわかりません.

(もう少し文脈: Perl から Ruby または Python にコースを切り替えることができるかどうかを教授に尋ねるメールを書いています。これらの概念が関連している場合、Perl よりも Ruby を使用する必要がある別の理由になる可能性があります。)

4

3 に答える 3

9

「閉鎖」という用語は、さまざまな方法で使用されますが、ほとんどの場合、ある意味で数学的な完了の概念にさかのぼります。

  • その演算子をセットの値に適用すると、指定されたセットの値が常に生成される場合、演算子は値のセットを「クローズドオーバー」します。たとえば、加算は整数に対して閉じていますが、除算はそうで​​はありません (4 / 2 は整数ですが、5 / 2 はそうではありません)。したがって、除算がそうではないという意味で、整数の加算はどういうわけか「完全」です。

  • リレーションの「推移的な」クロージャーは、(すべての可能な) 複数のアプリケーションに従って、リレーションを「完成」させます。日常的に言えば、「の子孫である」という概念は、「の子である」という関係の推移閉包です。

  • 機能的な「クロージャー」は、たとえば自由変数をどのように解決するかを指定することによって「完成」します。擬似コード式では:

    bump = function(x) (x + y)
    

    xは の引数ですbumpが、定義は を解決する問題を「未解決」のままにしているようyです。一方、次のように定義すると:

    bumper = function(y) (function(x) (x + y))
    

    次に呼び出すと、作成された関数の引数にbumperの元の引数を追加する関数が返されるため、次のようになります。bumper

    add3 = bumper(3)
    

    以下を定義するのと同じです:

    add3 = function(x) (x + 3)
    

    ネストされた定義は、その定義の時点で使用可能な変数によって「閉じられ」ます (または、変数によって完成されます)。

つまり、上記の「クロージャー」の使用には、実際には異なる特定の意味があり、一見無関係に見えますが、微妙な関係があります。

于 2009-01-10T02:49:32.193 に答える
7

クロージャプロパティは次のようになります。LとMが文脈自由言語の場合、L|Mも同様です。関数クロージャは、ファーストクラスの関数を実装する方法です。いいえ、彼らはお互いにほとんど何の関係もありません。

では、なぜ同じ名前なのか?関数クロージャは、その自由変数を「閉じます」。

def adder(n): return lambda m: n + m

ここで、nはラムダの自由変数です。Lispは元々自由変数を閉じなかったため、名前はこれを強調しています。内部関数が呼び出されたときにスタック上にあったバインディングから値を取得します。

数学のプロパティのクロージャはもう少し明白です。ある操作でセットが閉じられている場合、そのセット内でその操作を適用しても、そのセットから抜け出すことはできません。整数を追加しても、得られるのは整数のままです。

于 2009-01-10T01:32:39.323 に答える
5

ダリウスは正しいです。「クロージャプロパティ」は「関数クロージャ」とは何の関係もありません。周りに回る言葉はとてもたくさんあります:-(

クロージャプロパティの概念は、コンピュータサイエンス全体に適用されますが、さまざまなクラスの言語に多く適用されます。発話をスキャンまたは認識するために異なるテクノロジーが必要になるため、異なるクラスの言語が重要です。たとえば、正規表現では予約語があるかどうかはわかりますが、括弧がバランスの取れた式であるかどうかはわかりません。そのためには、文脈自由文法が必要です。

人々は一般的に、あなたが特定の言語を取り、別の言語と交差または結合する場合、あるいは単にその言語を補完する場合、同じクラスで別の言語を取得するかどうかに関心があります。たとえば、予約語ではないトークンと完全に一致する正規表現を作成することは可能ですか?正規言語は補集合の下で閉じられているため、はっきりとした「はい」と答えることができます。つまり、正規言語の補集合自体が正規言語です。これは、クロージャプロパティの例です。通常、証明は構成的です。つまり、予約語ではないすべてのトークンを記述する正規表現が存在することを示すだけでなく、クロージャープロパティの証明は検索方法を示します。そのような正規表現。

于 2009-01-10T02:12:27.573 に答える