私はLambda Calculusを勉強していますが、Reductionにこだわっています。この例で、Reductionのタイプ、特にベータリダクションを可能な限り簡単に説明できますか。また、わかりやすいチュートリアルを気にしないでください。
(λxyz .xyz )(λx .xx )(λx .x )x
ラムダ計算には、多くのステップにスパイラル化する方法があり、問題を解決するのは面倒で、実に難しいように見えますが、実際にはそれほど悪くはありません。ラムダ計算では、ラムダのみがあり、ラムダでできることは置換のみです。ラムダは関数またはメソッドのようなものです-プログラミングに精通している場合、ラムダは関数を入力として受け取り、新しい関数を出力として返す関数です。
1)アルファ変換-内部に同じ変数名を持つ2つのラムダ式を適用する場合、そのうちの1つを新しい変数名に変更します。たとえば、(λx.xx)(λx.x)は、縮小後に(λx.xx)(λy.y)または(λx.xx)(λx'.x ')のようになります。結果は、変数名が異なるだけで、最初の結果と同等です。
2)ベータ削減-基本的には単なる置換。これは、入力を使用してラムダ式を呼び出し、出力を取得するプロセスです。ラムダ式は関数のようなもので、式全体で入力を置き換えることで関数を呼び出します。 (λx.xy)zの後半(λx.xy)を取得します。これは、ピリオドの後のすべてが出力されます。出力は保持しますが、変数(ピリオドの前の名前)を指定された入力に置き換えます。 z
は入力、x
はパラメーター名、xy
は出力です。出力内のパラメーターのすべての出現を検索し、それらを入力に置き換えます。それが還元されます。したがって、(λx.xy)z
=> xy
の代わりにz
をx
に置き換えて、zy
にします。
2.5)Eta変換/ Eta削減-これは特殊なケースの削減であり、プロセスの半分のみと呼びます。これは、技術的にはそうではないのように、ベータ削減だからです。ウィキペディアまたは教科書に「イータ変換はλx。(f x)とfの間でxがfに自由に表示されないときはいつでもfに変換する」と書かれているのを見るかもしれません。それが本当に意味するのは、fがxを使用しない場合、λx。(f x)= fです。それが実際に完全に理にかなっているが、例を通してより良く示されている場合。 (λx。(λy.yy)x)を考えてみましょう。これは、ηを削減して(λy.yy)と同等です。これは、fが(λy.yy)でxが含まれていないため、削減することでこれを示すことができます、(λx.xx)に解決されるように、これは明らかに同じものです。あなたはベータ削減に焦点を当てると言ったので、私はイータ変換をそれに値する詳細について議論するつもりはありませんが、多くの人がそれに挑戦しました CS理論スタック交換で
提供された入力を出力に置き換えるために、次の表記法を使用します。
(λ param . output)input
=> output [param := input]
=> result
これは、出力のparamのオカレンスを置き換えることを意味します。
例:
(λx.xy)z
= (xy)[x:=z]
= (zy)
= zy
あなたが思いついた問題は、アルファ変換とベータ削減だけで解決することができます。以下のプロセスがどれほど長くても気にしないでください。間違いなくかなり長いですが、それを解決するためのステップは本当に難しいです。
(λxyz.xyz)(λx.xx)(λx.x)x
=(((λxyz.xyz)(λx.xx))(λx.x))x-「通常の順序」で括弧を追加しましょう。左結合性、abcは((ab)c)として減少し、bが適用されます。 a、およびcはその結果に適用されます
=(((λxyz.xyz)(λx.xx))(λx.x))x-最も深いネストされたアプリケーションを選択し、最初にそれを減らします。
太字のセクションは次のように減少します。
(λxyz.xyz)(λx.xx)
=(λx.λyz.xyz)(λx.xx)-同じことを意味しますが、最初のパラメーターを引き抜くため、最初のパラメーターを引き出します。
=(λx.λyz.xyz)(λx'.x'x ')-アルファ変換、一部の人々は新しい文字に固執しますが、末尾または `sに数字を追加するのが好きです。どちらの方法でも構いません。両方の式がパラメーターxを使用するため、2つのXはローカル変数であり、同じものを表す必要がないため、一方の側で名前を変更する必要があります。
=(λyz.xyz)[x:=λx'.x'x ']-ベータ削減の表記法。最初のパラメーターを削除し、出力内の出現箇所を適用中のものに置き換えます[a:= b]はaをbに置き換えること。
=(λyz。(λx'.x'x ')yz)-実際の削減。xの出現を指定されたラムダ式に置き換えます。
=(λyz。((λx'.x'x ')y)z)-括弧の再度の通常の順序、および、削減する別のアプリケーション、今回はyが(λx'.x'x ')に適用されるので、今それを減らしましょう
=(λyz。((x'x ')[x':= y])z)-これをベータ削減の表記法に入れます。
=(λyz。(yy)z)-x'x 'の2つのオカレンスをYに交換し、これは完全に削減されました。
これを元の式に追加し直します。
(((λxyz.xyz)(λx.xx))(λx.x))x
=((λyz。(yy)z)(λx.x))x-これは新しいものではなく、以前に見つけたものを戻すだけです。
=((λyz。(yy)z)(λx.x))x-最も深いネストされたアプリケーションを取得し、それは(λx.x) (λyz。(yy)z)に適用
これを個別に解決します。
(λyz。(yy)z)(λx.x)
=(λy.λz.(yy)z)(λx.x)-わかりやすくするために、最初のパラメーターのみを取り出します。
=(λz。(yy)z)[y:=(λx.x)]-ベータ削減表記に入れて、最初のパラメーターをポップアウトし、Ysが(λx.x)に切り替えられることに注意してください
=(λz。((λx.x)(λx.x))z)-実際の縮小/置換、太字の部分を縮小できるようになりました
=(λz。((x)[x:=λx.x])z)-うまくいけば、今までに画像が手に入ることを願っています。 betaは(λ)を(x)[x:=λx.x]の形式にすることで(λx.x)(λx.x)を削減します。
=(λz。((λx.x))z)-そして置換があります
=(λz。(λx.x)z)-過剰な括弧を整理し、何を見つけましたか?
=(λz。(x)[x:= z])-xパラメーターをポップし、表記法に入れる
=(λz。(z))-置換を実行
=(λz.z)-過剰な括弧を削除します
メイン式に戻します。
((λyz。(yy)z)(λx.x))x
=((λz.z))x-上記で証明した内容を記入
=(λz.z)x-余分な括弧を削除します。これは1つの最終アプリケーションに削減され、xは(λz.z)に適用されます
=(z)[z:= x]-ベータ削減、表記法
=(x)-置換を行います
= x-過剰な括弧を削除する
ええ答えはx
で、グルーヴィーに減少しました。