ラムダ計算で関数が匿名であることが重要なのはなぜですか?


19

私は、「関数型プログラミング冒険」というタイトルのジムウェイリッヒによる講義を見ていました。この講義では、高次関数の不動点を本質的に見つけるYコンビネータの概念を紹介します。

彼が述べているように、動機の1つは、ラムダ計算を使用して再帰関数を表現できるようにすることです。これにより、チャーチの理論(ラムダ計算を使用して効果的に計算できるもの)が維持されます。

問題は、ラムダ計算が名前付き関数を許可しないため、関数がそれ自体を単純に呼び出すことができないことです。

n(x,y)=x+y

名前 ' 'を付けることはできません。匿名で定義する必要があります。n

(x,y)x+y

ラムダ計算に名前のない関数が重要なのはなぜですか?名前付き関数がある場合、どの原則に違反しますか?それとも、私はジムのビデオを誤解しただけですか?


4
これはまったく重要ではないようです。あなたは割り当てることができます変数、その後、あなたは、関数に名前を与えています。N(x,t)x+yn
ユヴァルフィルマス14年

@YuvalFilmusはい、名前を関数にバインドできます。ここでの本当の質問、困惑は、なぜ(ラムダ計算で)関数がそのような名前で自分自身を呼び出せないのかと思いますか?なぜ再帰関数を実行するためにY演算子のような手法が必要なのですか?以下の答えがお役に立てば幸いです。
Jerry101 14年

1
@ Jerry101自己適用が存在しない歴史的な理由は、 -calculusが数学の基礎となることを意図していたことであり、自己適用する能力がそのような基礎を直ちに矛盾させます。したがって、この明らかな無能性(現在回避できることがわかっている)は、 -calculusの設計上の特徴です。λλλ
マーティンバーガー14年

@MartinBergerはもっと言ってください。私の答えの理由で矛盾していますか?または別の理由で?
Jerry101 14年

1
@ Jerry101数学のそのような基礎で0 = 1を証明できるという意味で一貫性がありません。KleeneとRosserが純粋で型付けされていない -calculus の矛盾を示した後、単純な型付けされた -calculusは、などの固定小数点コンバイナを定義できない代替として開発されました。ただし、単純に型指定された -calculusに再帰を追加すると、すべての型に終了しないプログラムが存在するため、再び一貫性がなくなります。λ Y λλλYλ
マーティンバーガー14年

回答:


24

この問題に関する主な定理は、ウィリアムシェークスピアと呼ばれる16世紀末の英国の数学者によるものです。このテーマに関する彼の最も有名な論文は、「ロミオとジュリエット」と題され、1597年に出版されましたが、研究は数年前に行われ、Arthur BrookeやWilliam Painterなどの前駆体に触発されました。

彼の主な結果は、第2幕に述べられています。シーンIIは、有名な定理です。

名前って何?私たちがバラと呼んでいるものは
他の名前では甘い香りがします。

この定理は、「名前は意味に寄与しない」と直感的に理解できます。

論文の大部分は定理を補完する例に当てられており、名前は意味を持たないが、それらは無限の問題の原因であることを示しています。

シェークスピアが指摘したように、名前は意味を変えずに変更できます。この操作は後にアロンゾ教会と彼の信者によって変換と呼ばれました。結果として、名前で示されるものを決定することは必ずしも簡単ではありません。これは、名前の意味の関連付けが指定される環境の概念の開発、名前に関連付けられた意味を判断しようとするときに現在の環境が何であるかを知るルールなど、さまざまな問題を提起します。これはしばらくの間コンピューター科学者を困惑させ、悪名高いフナール問題などの技術的な問題を引き起こしました。α。いくつかの一般的なプログラミング言語では環境が問題となっていますが、シェークスピアの論文で取り上げられた例のように、より具体的であることが物理的に安全でないと一般に考えられています。

この問題は、近くで育った問題にも正式な言語のアルファベットと正式なシステムをする必要がある理論、同型まで定義されたようにアンダースコアへと、アルファベットの記号は、抽象的な実体がある、どのように彼らは「マテリア」などの独立しましたいくつかのセットの要素。

シェークスピアによるこの主要な結果は、科学が魔術と宗教から分岐したことも示しています。そこでは、存在または意味には本当の名前があります

このすべての結論は、理論的な作業では、実際の作業や日常生活でより簡単に感じるかもしれないが、名前に邪魔されない方が便利な場合が多いということです。しかし、ママと呼ばれる全員があなたの母親ではないことを思い出してください。


この問題は、20世紀のアメリカの論理学者Gertrude Steinによって、より最近に対処されました 。しかし、彼女の数学者の同僚は、彼女の主な定理の正確な技術的意味をまだ熟考しています:

バラはバラですバラはバラです

1913年に「聖なるエミリー」と題された短いコミュニケーションで公開されました。


3
追記:最近数十年、「コンピューターサイエンス」では、「バラ」は他の名前と同じ名前の標準的な例として「foobar」(およびその一部)にほぼ置き換えられました。この選好は、明らかにアメリカの鉄道エンジニアによって導入されました。
FrankW 14年

ただし、頻繁に使用される概念の正規名は、効率的なコミュニケーションのために重要です。
ラファエル

1
@Raphael Agreeed、しかし私はそれを日常生活のカテゴリに入れます。そして、本当に標準的なものの境界をどうやって知るのでしょうか?それでも、神から与えられた不変の真理について、すべての用語、表記法、定義(またはいくつかの定理が述べられている方法)を学生が取っているのを見ると、私はしばしば懸念を感じます。ここでも、SEで生徒は質問をしますが、記法やクラスで使用する定義がわからない場合があることに気づきません。本当の名前の魔法は簡単に死ぬことはありません。
babou 14年

10

@babouや@YuvalFilmusの意見とは異なる意見に挑戦したいと思います。純粋な -calculusが匿名関数を持つことは重要です。名前付き関数のみを持つことの問題は、必要な名前の数を事前に知る必要があることです。しかし、純粋にあなたが行く(1)匿名関数、または(2)のいずれかを使用しますが、あなたは、(再帰を考える)先験的に使用される機能の数にバインドを持たない-calculus -calculusルートをと提供します新鮮名前コンビネータ(中実行時に、新鮮な名前の無尽蔵を与える-calculus)。λλπνx.Pπ

純粋な -calculusに再帰の明示的なメカニズムがない理由は、純粋な -calculusがもともとA. Churchによる数学の基礎となることを意図していたためです。したがって、Stephen KleeneとJB Rosserが純粋な -calculusが数学の基礎として不適切であることを発見したとき、ショックとして来ました(Kleene–Rosser paradox)。Haskell Curryは、Kleene-Rosserのパラドックスを分析し、その本質が現在Y-Combinatorとして知られているものであることに気付きました。λλλ

@babouのコメントの後に追加されました。名前付き関数を使用しても問題はありません。これは、次のようにして行うことができます。 は、 値による呼び出し -calculusの省略形です 。letf=MinN(λf.N)Mλ


1
OPは、匿名関数を禁止するのではなく、関数に名前を付ける機能を望んでいたと思います。つまり、匿名関数の必要性に関するλ計算の要件は、Lisp / SchemeやMLのような言語でも同様に示されると思います。Lisp / Schemeの場合、評価者のメタ循環性により、必要に応じて新しい名前を作成できるようになりますが、正式なシステムでそのようにしたいのかどうかはわかりません。再帰によってすでに使用されている名前のローカル再利用が許可されている場合、無制限の数の関数の使用は必ずしも問題ではありません。
babou

@babou SchemeとMLにはletrecがあるため、有限数の名前付き関数と簡単に共存できます。名前を再利用するための明示的なスキームを備えた純粋な -calculusのプレゼンテーションを見てみたいと思います。そして、はい、関数(および他の用語)に名前を付ける機能は、純粋な -calculus と完全に互換性があります。λλλ
マーティンバーガー14年

最後の行は(lambda f。N)Mである必要がありますか?
ジョーザパーソン

@JoethePersonはい、よく見分けられます。修繕。ありがとう。
マーティンバーガー

4

名前は必要ないという考え方だと思います。名前が必要と思われるものはすべて、匿名関数として作成できます。

ラムダ計算はアセンブリ言語のように考えることができます。アセンブリに関する講義の誰かが、「アセンブリ言語にはオブジェクト指向の継承ツリーはありません」と言うかもしれません。その後、継承ツリーを実装するための賢い方法を考え出すかもしれませんが、それはポイントではありません。ポイントは、物理コンピューターのプログラミング方法の最も基本的なレベルでは、継承ツリーは必要ないということです。

ラムダ計算では、最も基本的なレベルでアルゴリズムを記述するために名前が必要ないという点がポイントです。


4

ここまでの3つの答え、特に@babouのシェークスピアレンの分析を楽しんでいますが、質問の本質であると思うものに光を当てません。

λ-calculusは、関数に関数を適用するたびに名前を関数にバインドします。問題は名前の不足ではありません。

「問題は、関数がその名前を参照することによって単純にそれ自体を呼び出すことができないことです。

(純粋なLispでは、名前->関数バインディングは関数の本体内のスコープ内にありません。関数がその名前で自分自身を呼び出すためには、関数はその関数を参照する環境を参照する必要があります。循環データ構造。不純なLispは、関数が参照する環境を変化させることでそれを行います。)

@MartinBergerが指摘したように、λ計算が関数を名前で呼び出すことを許可しない歴史的な理由は、演calc 論理を含む数学の基礎としてλ計算を使用しようとしたときにカリーのパラドックスを排除しようとしたためです。Yコンビネータなどの手法では、自己参照がなくても再帰が許可されるため、これは機能しませんでした。

ウィキペディアから:

私たちは、関数を定義することができた場合はr = (λ.x x x ⇒ y)、その後r r = (r r ⇒ y)

場合はr rtrueで、その後y真です。場合はr rfalseで、その後r r ⇒ y矛盾である、真実です。それyは真実でありy、あらゆる声明がそうであるように、あらゆる声明が真実であると証明されるかもしれません。

r r終了しない計算です。ロジックr rは、存在しない値の式と見なされます。


私はラムダ計算にかなり慣れていないので、疑問がありました。何をしない意味ですか?私はに掛けることを意味しないと確信しています。式をそれ自体に適用するということですか?また、この部分の意味は何ですか?>> y x x xλ.x xxxxx
ロハンプラブー

@RohanPrabhu λ.x x xはLispとして(lambda (x) (x x))、JavaScriptとしてに変換されfunction (x) {return x(x);}ます。x⇒yx implies y、とほぼ同じことを意味し(NOT x) OR yます。参照してくださいen.wikipedia.org/wiki/Lambda_calculus
Jerry101

その恥ずかしい新人の質問に答えてくれてありがとう!
ロハンプラブー14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.