ラムダ計算は抽象的に見えませんでした。そして、私はそれのポイントを見ることができません


18

根本的な質問:

ラムダ計算は、中学校の代数で一般に学んだ基本的な関数のプロパティと表記法ではできないことを私たちに何をしますか?

まず、ラムダ計算の文脈で抽象とはどういう意味ですか?抽象という言葉の私の理解は、概念の概念的な要約である機械から離婚したものです。

ただし、ラムダ関数は、関数名を廃止することにより、特定のレベルの抽象化を防ぎます。例えば:

f(x) = x + 2
h(x, y) = x + 5 y

しかし、これらの機能の仕組みを定義しなくても、その構成について簡単に話すことができます。例えば:

1. h(x, y) . f(x) . f(x) . h(x, y) or 
2. h . f . f . h

必要に応じて引数を含めることも、完全に抽象化して何が起きているのかを概観することもできます。そして、それらをすぐに単一の機能に減らすことができます。構成2を見てみましょう。強調に応じて、学生の詳細なレイヤーを書くことができます。

g = h . f . f . h
g(x, y) = h(x, y) . f(x) . f(x) . h(x, y)
g(x, y) = h . f . f . h = x + 10 y + 4

上記をラムダ計算で実行するか、少なくとも関数を定義しましょう。これが正しいかどうかはわかりませんが、最初と2番目の式は2ずつ増加すると考えています。

(λuv.u(u(uv)))(λwyx.y(wyx))x

そして、5年を掛けます。

(λz.y(5z))

抽象的というよりは、これは加算、乗算などの意味のまさにその仕組みに入っているようです。私の考えでは、抽象化は低レベルではなく高レベルを意味します。

さらに、ラムダ計算がなぜなのかを理解するのに苦労しています。の利点は何ですか

(λuv.u(u(uv)))(λwyx.y(wyx))x

以上

h(x) = x + 5 y

または組み合わせ表記

Hxy.x+5y

またはHaskellの表記法でさえ

h x y = x + 5 * y

繰り返しになりますが、ラムダ計算はf(x)スタイルの関数プロパティと多くの人が知っている表記法では処理できないということを、私たちのために何をしますか。


9
Haskellはラムダ計算に基づいているため、Haskellから例を挙げるのは面白いです。ラムダ計算は特定の表記法ではありません。これは、「すべてが関数」であるチューリングマシンに相当する計算モデルです。
ユヴァルフィルマス16

2
はい、ラムダ計算に基づいていると言われています。私がまだ理解していない質問は、haskellがちょうどでなくラムダ計算に基づいている理由です。。。小学校で学んだ機能の基本的な属性。それが本当にこの質問全体の要点です。
JDG

6
「目的がすぐに浮かばない」ことは、ほとんど「抽象」の定義ではありませんか?:
デビッドリチャービー16

1
軽de的とは言いません。関数のその処理は、計算を通じて利用できます。しかし、中学校としてのラベル付けがどのように解釈されるかを見ることができます。調整します。
JDG

6
「中学校代数関数表記法」の正式な定義を実際に持っているとは思いません。そのような関数の定義がある場合、それはおそらく計算上の意味を持たない集合理論的なものです。ラムダ計算のポイントの一部は、独自の用語でそのような表記法を理解することであり、あえて言うなら、多項式関数や計算のような特定のアプリケーションから抽象化されます。
デレクエルキンズは

回答:


24

ラムダ計算が非常に重要である多くの理由があります。

非常に重要な理由は、ラムダ計算により、計算可能な関数が第一級市民である計算モデルを使用できることです。

中学代数の言語で高階関数を表現することはできません。

例としてラムダ式を取り上げます

λf.λg.λx.f(g(x))

この単純な式は、ラムダ計算の中で、関数構成自体が関数であることを示しています。中学校の代数では、これは簡単に表現できません。

ラムダ計算では、関数が結果として関数を返すことを表現するのは非常に簡単です。

以下に小さな例を示します。式(ここでは、追加定数と整数定数を使用してラムダ計算を適用したと仮定しています)

(λf.λg.λx.f((g(x)))(λx.x+2)

に減少します

λg.λx.g(x)+2

f(x)=e

また、高階関数を表現することが不可能になる(または単に表記が面倒になる)と、式への型の割り当てに問題が生じます。

関数合成には多相型があります

α.β.γ.(βγ)((αβ)γ)

Hindley-Milner型システムで。

ラムダ計算の非常に強力なセールスポイントは、型付きラムダ計算の正確な概念です。HaskellやMLファミリなどの関数型プログラミング言語のさまざまな型システムは、ラムダ計算の型システムに基づいており、これらの型システムは数学的定理の形式で強力な保証を提供します。

eeee

ee

TϕTϕTT

私は、中学校代数がラムダ計算の優れた代替手段であると感じている人たちに、カリー・ハワード同型の適切な概念とともに、高次の多形的に型付けされた中学校代数の説明を展開するよう促します。CoqやIsabelleなどのラムダ計算ベースの証明アシスタントを使用して定式化された多くの定理を証明できる中学校代数に基づいたインタラクティブな証明アシスタントを作成することができれば、さらに良いでしょう。それから、中学校の代数を使い始めたので、他の多くの人と一緒にいたいと思います。


これは素晴らしい説明です。高次関数(合成など)とタイピングがラムダ計算でより適切に表現されていることを耳にすることは有益です。さらに、これにより証明と証明可能なコードが容易になります。あなたが言及したことの多くの影響と、従来の表記法が不適切である理由はわかりません(たとえば、別個の定義構文f(x)= eが不要なことについて)。ラムダ計算によってどの領域が改善されているかの感覚を与えます。
JDG

もちろんローカル定義を導入できますletx=eine(λx.e)e4

5

RR

ラムダ計算の関数は、はるかに一般的です。正確な定義は、ラムダ計算が型付きか型なしかによって異なります。純粋な型なしラムダ計算では、すべてが関数です。これは、微積分の実際の関数よりもはるかに一般的です。

手続き型言語でさえ、ラムダ計算からのアイデアを使用することがあります。Cのソート関数は、要素を比較するために使用する比較関数をパラメーターとして受け入れます。ラムダ計算はさらに進んでいます。関数は入力として関数を受け入れるだけでなく、出力することもできます。

ラムダ計算は、チューリングマシンと同等のパワーの計算モデルです。それ自体が完全なシステムです。純粋なラムダ計算には、プリミティブ用語として「5」や「+」がありません。「5」や「+」が集合論のプリミティブではないように、計算内で定義できます。(実用的なプログラミング言語は、効率の理由から自然数をネイティブに実装します。)

ラムダ計算に感銘を受けない理由の1つは、そのアイデアがプログラミングの言説に浸透しすぎて、もはや革新的に見えなくなったためだと思います。


「あなたがラムダ計算に感銘を受けていない理由の一つだと思う」Therinは私が尋ねている質問にある:ラムダ計算は私たちのために何をするのか?つまり、ラムダ計算を使用しないと、どうなりますか。ラムダ計算を使用する場合、何が得られますか?ラムダ計算が初めて考えられた場合、関数自体が関数を作成できるとしたらどうでしょうか。最初のpythonプログラムの中で、後で評価する関数を含むテキストを作成しました。これは、意思決定のタスクを他の人に委任するのと同じです。明らかですか?
JDG

これは、私が多くのことを知る前のことでした。コードは何度も入力するのが面倒だと思ったので、そのプログラミングは関数自体を含む機能の自動生成に役立つはずです。
JDG

2
Pythonは関数型プログラミングをサポートしています。最初のプログラミング言語はそうではありませんでした。FORTRANでプログラミングした場合、後で評価した関数を含むテキストを使用してプログラムを作成したことはありません。気付かないうちに、ラムダ計算のアイデアが提供する機能を利用しました。
ユヴァルフィルマス16

2
EvalLISPに由来し、これはラムダ計算によって強く影響されました。このようなことは、FORTRAN、C、COBOL、および他の多くのプログラミング言語では不可能です。
ユヴァルフィルマス16

はい、Pythonは関数型プログラミングをサポートしていますが、eval()能力がλCalcに触発されたのかどうかはわかりません。これは、「ミランダに自分の部署の運営方法について最善の判断を下すように指示する」、つまり、関数を取得して独自の関数を生成するように考えるために、λCalcが必要だと言っているようなものです。高レベルのタスクの委任について考えるためにλCalcは必要ありません。λCalcからインスピレーションを引き出すことについて話をしたい場合は、ラムダ関数、理解などへのより適切なポイントです。
JDG16年

4

x2xx2

λx.x2x2

ff(x)=x2f

プログラミング言語でラムダ式を使用すると、同様の利点があります。プログラムのどこかでまったく新しい関数を定義するのではなく、必要な場所で関数が実行することを記述できます。

ddxx2ddxx2


θ:VV

θ(v)(f)=f(v)

多くの人々は、この二重評価表記法が混乱および/または不安定であることに気づき、さらに関数の点ごとの定義の再帰的な使用を発見します。ラムダ抽象化バージョン

θ=λv.λf.f(v)

その問題はありません。


最後に、「単純型付きラムダ計算」は基本的に「デカルト閉カテゴリー」と同じものであるという抽象的ナンセンスの定理があります。したがって、デカルト閉カテゴリーで計算を行いたい場合は、おそらく使用することをお勧めします単純にラムダ計算を入力してそうします。


私はこの質問に戻ってきて、この答えをすばらしいと思っています。ありがとうございました。ここでの一般的な答えは非常に興味深いものです。
JDG

4

私はこのトピックの専門家ではありませんが、少し時間をかけて勉強しましたが、どのトピックでも私にとって最も魅力的なことの1つは、その背後にある歴史です。だから私にとって、ラムダ計算の背後にある歴史を少し理解することは、なぜそれが役立つのを説明するのに役立ちます。

簡単に要約すると、1900年代初期に集合論が始まり、集合に基づいて数学が再構想された後、一部の数学者は集合論の定義では特定の構造が存在することを主張できるが、その方法を教えていないことに気づいた構築して計算します。したがって、集合論的定義は非構造的です。数学者は、何かがあることを証明するだけでなく、その方法を証明する建設的な定義を開発する方法があるのではないかと考え始めました。

ウィキペディアから:

数学では、構成的証明は、オブジェクトを作成するためのメソッドを作成または提供することにより、数学的なオブジェクトの存在を実証する証明の方法です。これは、例を提供せずに特定の種類のオブジェクトの存在を証明する非構成的証明(存在証明または純粋な存在定理とも呼ばれます)とは対照的です。

その後、ラムダ計算とチューリングマシンの両方が任意の計算可能な関数を表すことができ、したがって同等であることが示されました。

理論的には、任意の数学関数または概念をラムダ計算形式でエンコードして計算できます。これは、ラムダ計算が数学の完全に独立した基礎になりうることを意味しますが、明らかに非常に退屈なものです。

ラムダ計算は、それを使用してコードを記述しないという意味では「有用」ではありませんが、プログラムとその動的効果を記述するために使用される表示セマンティクスの基礎を形成します。これは、プログラムの正確さと意味の意味の議論で使用されます。また、ラムダ計算から実行の概念全体を引き出す関数型プログラミング言語の開発にも明らかに大きな影響を与えました。

お役に立てば幸いです。

編集して追加:トポロジ、ラムダ計算、物理学の関係を示すこの論文を指摘しました。それを簡単にざっと見て、この素晴らしい声明に出くわしました。

チューリングマシンは、コンピューターハードウェアの理想化された単純化されたモデルと見なすことができますが、ラムダ計算はソフトウェアの単純なモデルに似ています。...詩的に言えば、ラムダ計算は、すべてがプログラムであり、すべてがデータである宇宙を表しますプログラムはデータです。

ポイントは、ラムダ計算がソフトウェア計算の理想化されたモデルであり、それ自体がプログラミング言語の特定の実装に結び付けられていないことです。純粋な計算をモデル化します。


歴史の詳細:スタンフォード哲学百科事典でのλ計算の簡単な歴史。生涯で処理できるよりも多くのエントリがあります。
デビッドトンホーファー


3

ラムダ計算は、プログラミング言語として設計されていません。実際、プログラム可能なコンピューターが登場する数十年前の1930年代に作成されました。むしろ、計算そのものを研究するための正式なモデルとして作成されました。コードや数学関数をどれだけ簡単に表現できるかに失望しているのは、それが目的ではないからです。


1
「プログラム可能なコンピューターが登場する前の10年」-間違っています。プログラム可能なコンピューターは以前に存在し(ユニバーサルコンピューターではない場合)、1930年代に最初のユニバーサルコンピューターが構築されました。
ラファエル

-2

ラムダ計算が存在するため、匿名(別名ラムダ)関数を作成できます。関数名を廃止しないと、名前空間が乱雑になり、使用可能な関数名が不足する可能性があります。これは、明らかな理由で関数(または関数ポインター)を返すいわゆる「高階関数」を扱う場合に特に重要です。

基本的に、ラムダ関数はローカルスコープの変数と同等です。ラムダ関数を使用しない関数型プログラミングは、ローカル変数を使用しない手続き型プログラミングに似ています。つまり、ひどい考えです。

「なぜラムダ計算が重要なのか」数学者は冗長性を好む。ラムダ計算は数学ではめったに使用されません。これは、この表記法があまり役に立たないことがわかったからです。

「中学校の代数に基づいたインタラクティブな証明アシスタントを作成できれば、CoqやIsabelleなどのラムダ計算ベースの証明アシスタントを使用して定式化された多くの定理を証明できれば、さらに良いでしょう。その後、中学校代数を使い始めてください。そうすれば、他の多くの人も私と一緒になるでしょう。」メタマスのことを聞いたことがありますか?そこにラムダ計算は含まれていません。coq/ isabelle定理の多くを証明できます


いくつかの意見は別として、この答えは何を提供しますか?
ラファエル

@ラファエル誤報。この答えのほとんどは意味がありません。名前の不足はありません。「ラムダ関数」は、ローカルスコープの変数と同等ではありません。これは意味がありません。私はこれをを指すことを意味すると仮定しletますが、一方でlet無名関数でエンコードすることができ、あなたは明らかに他の道を行くことはできません。関数型プログラミングには、BackusのFPSisalなどの「ラムダ関数」必要ありませ
デレクエルキンズが

主にハンスの答えにコメントを投稿したかったのですが、カルマが足りませんでした。本格的な答えにコメントをオンにすることを決めた私はそう
SN
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.