固定小数点コンビネーター(Yコンビネーター)の明確で直感的な派生?


28

(型なし)ラムダ計算()の固定小数点コンビネータFIX(別名Yコンビネータ)は次のように定義されます:λ

FIXλf.(λx.f (λy.x x y)) (λx.f (λy.x x y))

私はその目的を理解しており、アプリケーションの実行を完全にトレースできます。最初の原理からFIXを導き出す方法を理解したいです。

ここに私がそれを自分で導き出そうとしたときに得られる限りです:

  1. FIXは関数です:FIX λ
  2. FIXは、別の関数fを使用して再帰的にします。FIX λf.
  3. 関数fの最初の引数は、関数fの「名前」であり、再帰的アプリケーションが意図されている場合に使用されます。したがって、fの最初の引数の出現はすべてf関数で置き換えられる必要があり、この関数はfの残りの引数を期待する必要がありますffが1つの引数を取ると仮定しましょう):FIX λf.f (λy.y)

これは、推論の「一歩を踏み出す」方法がわからない場所です。小さな楕円は、FIXがどこに欠けているかを示します(ただし、それを「実際の」FIXと比較することによってしか知ることができません)。

私は既にタイプとプログラミング言語を読んでいますが、それは直接派生しようとせず、代わりに派生物についてリトルスキーマーを読者に紹介しています。私もそれを読みましたが、その「派生」はあまり役に立ちませんでした。さらに、直接的な派生ではなく、非常に具体的な例の使用と、\ lambdaに適切な再帰関数を記述するためのアドホックな試みλです。


1
この投稿は役に立つかもしれません。一般的に、コンビネータのいくつかの反復をただ計算して計算するだけで、それが機能する理由を理解するのに役立つと思います。
Xodarap

2
いくつかの異なる固定小数点コンビネーターがあります。たぶん、人々はつまずくまでコンビネーターで遊んだだけでしょう。
ユヴァルフィルマス

@YuvalFilmus、それが私の研究とこの質問への回答が私に考えさせ始めていることです。しかし、コンビネーターが論理的にどのように形成されるかを見るのは有益だと思います。たとえば、新しいコンビネーターを構築しようとする場合に特に役立つスキルです。
ブルーボンバー

Daniel P. Friedman(または「The Little Schemer」)による「The Little Lisper」の第9章を読んでください。
user18199 14

2
OPは、すでにそれを読んだことを示しているようです。
ラファエル

回答:


29

私はこれをどこでも読んでいませんが、これはが導出された可能性があると信じている方法です:Y

おそらく、階乗などの再帰関数持ちましょう。非公式には、を擬似ラムダ項として定義します。ここで、は独自の定義で発生します。fff

f=ff

最初に、再帰呼び出しをパラメーターとしてファクタリングできることを理解します。

f=(λr.(rr))Mf

引数としてそれ自体に渡す方法しかなかった場合、を定義できます。もちろん、手元にがないため、これは不可能です。手元にあるのはです。はを定義するために必要なものがすべて含まれているため、代わりにを引数として渡し、後で内部からを再構築することができます。最初の試みは次のようになります。ffMMfMff

f=(λr.(rr))M(λr.(rr))M

ただし、これは完全に正しいわけではありません。以前、は内の代わりになりました。しかし、今では代わりにを渡します。を使用するすべての場所を何らかの方法で修正して、からを再構築する必要があります。実際、これはまったく難しくありませんであることがわかったので、を使用するすべての場所で、単に置き換えます。frMMrfMf=MMr(rr)

f=(λr.((rr)(rr)))M(λr.((rr)(rr)))M

この解決策は優れていますが、内部でを変更する必要がありました。これはあまり便利ではありません。に自身に適用される引数を送信する別のを導入することにより、を変更することなくこれをよりエレガントに行うことができます:をとして表現するMMλMMλx.M(xx)

f=(λx.(λr.(rr))M(xx))(λx.(λr.(rr))M(xx))

このように、がに置換されると、がに置換されます。これは、等しい定義によります。これにより、有効なラムダ項として表される非再帰的な定義が得られます!MxMMrff

への移行が簡単になりました。代わりに任意のラムダ項を使用して、この手順を実行できます。したがって、を因数して定義することができますYMM

Y=λm.(λx.m(xx))(λx.m(xx))

実際、は定義した減少します。YMf


注:文献で定義されているとおり、を導出しました。あなたが説明してきたコンビネータはの変形である用のコールバイ値と呼ばれることもあり言語、。このウィキペディアの記事を参照してくださいYYZ


1
あなたの優れた応答がくれたことに不足している-しかし、一見明白な直感は、私たちは関数がフォーム持っているという前提で始めるので、再帰関数は、引数としての地位を必要とすることで、いくつかのための。我々が構築としてその後、、我々はそれをその主張を利用します内部でそれ自体に何かのアプリケーションとして定義されている適用し、例えば、とに等しい定義であるあなたの答えに。魅力的!f=X(X)XXfXxxf
ブルーボンバー

11

Yuvalが指摘したように、固定小数点演算子は1つだけではありません。それらの多くがあります。つまり、固定小数点定理の方程式には単一の答えはありません。したがって、それらから演算子を導出することはできません。

これは、解として人々がをどのように導出するかを尋ねるようなものです。彼らはしません!この方程式には独自の解決策はありません。(x,y)=(0,0)x=y


知りたいのは、最初の固定小数点定理がどのように発見されたかです。私が最初に見たときに、どのように固定小数点/再帰定理を思いついたのかについても疑問に思ったと言いましょう。とても独創的です。特に計算可能性理論の形式で。ユバルの言うこととは異なり、何かを見つけるまで人々が遊んでいたわけではありません。ここに私が見つけたものがあります:

私が覚えている限りでは、定理はもともとSC Kleeneによるものです。クリーネは、教会の元のラムダ計算の矛盾の証拠を救い出すことにより、元の固定小数点定理を思いつきました。教会の元のラムダ計算は、ラッセル型のパラドックスに苦しんでいました。変更されたラムダ計算は問題を回避しました。Kleeneは、変更されたラムダ計算が同様の問題に苦しむかどうかを確認するために、おそらく矛盾の証明を研究し、変更されたラムダ計算の矛盾の証明を有用な定理に変えました。ラムダ計算と他の計算モデル(チューリングマシン、再帰関数など)との等価性に関する研究を通じて、彼はそれを他の計算モデルに移しました。


あなたが尋ねるかもしれない演算子を導き出すには?ここに私が心に留めておく方法があります。固定小数点定理は、自己参照を削除することです。

誰もが嘘つきのパラドックスを知っている:

私は隠れ家です。

または、より言語的な形式で:

この文は誤りです。

現在、ほとんどの人は、この文の問題は自己参照にあると考えています。そうではない!自己参照を排除することができます(問題は真実にあり、言語は一般に自身の文の真実について話すことができません。Tarskiの真実の定理の定義不能を参照してください)。自己参照が削除されるフォームは次のとおりです。

次の引用を2回、引用内に2回記述すると、結果の文は偽になります。

自己参照はありません。文を作成し、それで何かを行う方法についての指示があります。そして、構築される文は指示と同じです。中にいることを注意データと命令の区別がないので、我々は引用符は必要ありません-calculus。λ

これを分析すると、が得られます。ここで、はを構築し、それに何かをする命令です。MMMxxx

Mx=f(xx)

したがって、はそしてMλx.f(xx)

MM=(λx.f(xx))(λx.f(xx))

これは、固定です。演算子にしたい場合は、を追加するだけで得られます。fλfY

Y=λf.(MM)=λf.((λx.f(xx))(λx.f(xx)))

ですから、自己参照のないパラドックスを念頭に置いておくと、が何であるかを理解するのに役立ちます。Y


3

したがって、固定小数点コンビネータを定義する必要があります

fix f = f (fix f)
      = f (f (fix f))
      = f (f (f ... ))

しかし、明示的な再帰なし。最も単純な既約結合子から始めましょう

omega = (\x. x x) (\x. x x)
      = (\x. x x) (\x. x x)
      = ...

x最初のラムダでは、繰り返し二ラムダで置換されています。単純なアルファ変換により、このプロセスがより明確になります。

omega =  (\x. x x) (\x. x x)
      =α (\x. x x) (\y. y y)
      =β (\y. y y) (\y. y y)
      =α (\y. y y) (\z. z z)
      =β (\z. z z) (\z. z z)

つまり、最初のラムダの変数は常に消えます。したがってf、最初のラムダにを追加すると

(\x. f (x x)) (\y. y y)

f意志のボブアップ

f ((\y. y y) (\y. y y))

私たちは持っているomegaバックを。ここでf、2番目のラムダにを追加すると、1番目のラムダにfが表示され、その後ボブアップすることは明らかです。

Y f = (\x. x x)     (\x. f (x x))
      (\x. f (x x)) (\x. f (x x)) -- the classical definition of Y

以来

(\x. s t) z = s ((\x. t) z), if `x' doesn't occur free in `s'

式を次のように書き換えることができます

f ((\x. x x) (\x. f (x x))

それはただ

f (Y f)

そして、我々は方程式を持っていますY f = f (Y f)。したがって、Yコンビネータは本質的に

  1. f
  2. 最初のfボブアップ
  3. 繰り返す

2

正規形のない方程式の古典的な例を見てきたかもしれません。

(λx.xx)(λx.xx)(λx.xx)(λx.xx)

同様の式が、一般的な再帰について提案されています。

(A)(λx.R(xx))(λx.R(xx)) R( (λx.R(xx))(λx.R(xx)) )R(R( (λx.R(xx))(λx.R(xx)) ))

(A)は、一般的な再帰方程式をラムダ計算(原始再帰を超えて)で記述する方法です。では、方程式どのように解くのでしょうか?プラグ用で得るために上記の式で:Yf=f(Yf)fR

Yf=(λx.f(xx))(λx.f(xx))
Y=λf.(λx.f(xx))(λx.f(xx))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.