λ計算、又はラムダ計算は、匿名関数に基づいて、論理システムです。たとえば、これはλ式です。
λf.(λx.xx)(λx.f(xx))
ただし、この課題のために、表記を簡略化します。
- に変更
λ
します\
(入力しやすくするため):\f.(\x.xx)(\x.f(xx))
.
我々はそれをドロップすることができますので、ラムダヘッダーのは、不要です。\f(\xxx)(\xf(xx))
- 使用Unlambdaとスタイルのプレフィックス表記を
`
(これを行う方法の完全な説明については、参照ではなく2つの関数を書くよりもアプリケーションのためのラムダ計算表記間の変換を):\f`\x`xx\x`f`xx
- これは最も複雑な代替です。各変数を、その変数が属するラムダヘッダーに対してどれだけ深くネストされているかに基づいて、括弧内の数字で置き換えます(つまり、0ベースのDe Bruijnインデックスを使用します)。たとえば、
\xx
(恒等関数)では、式を変数から最後までトラバースするときに遭遇する最初の(0から始まる)ヘッダーに属するためx
、本文のはに置き換えられ[0]
ます。\x\y``\x`xxxy
に変換され\x\y``\x`[0][0][1][0]
ます。ヘッダーに変数をドロップして、を残すことができます\\``\`[0][0][1][0]
。
組み合わせ論理は、基本的にλ計算から作成されたチューリングターピットです(まあ、実際は最初に来ましたが、ここでは無関係です)。
「組み合わせロジックはラムダ計算の変形と見なすことができ、ラムダ式(機能の抽象化を表す)は限定されたコンビネータのセット、バインドされた変数が存在しないプリミティブ関数に置き換えられます。」1
組み合わせロジックの最も一般的なタイプはSKコンビネーター計算で、次のプリミティブを使用します。
K = λx.λy.x
S = λx.λy.λz.xz(yz)
コンビネータI = λx.x
が追加されることもありますが、SKK
(または実際SKx
にはx
)と同等であるため、冗長I
です。
必要なのは、λ計算の任意の式をエンコードできるようにするためのK、S、およびアプリケーションだけです。例として、関数λf.(λx.xx)(λx.f(xx))
から組み合わせロジックへの変換を次に示します。
λf.(λx.xx)(λx.f(xx)) = S(K(λx.xx))(λf.λx.f(xx))
λx.f(xx) = S(Kf)(S(SKK)(SKK))
λf.λx.f(xx) = λf.S(Kf)(S(SKK)(SKK))
λf.S(Sf)(S(SKK)(SKK)) = S(λf.S(Sf))(K(S(SKK)(SKK)))
λf.S(Sf) = S(KS)S
λf.λx.f(xx) = S(S(KS)S)(K(S(SKK)(SKK)))
λx.xx = S(SKK)(SKK)
λf.(λx.xx)(λx.f(xx)) = S(K(S(SKK)(SKK)))(S(S(KS)S)(K(S(SKK)(SKK))))
プレフィックス表記を使用しているため、これは```S`K``S``SKK``SKK``S``S`KSS`K``SKK`
です。
1出典:ウィキペディア
チャレンジ
今までに、あなたはおそらく何であるかを推測しました:有効なλ式(上記の表記法)を入力および出力(または返す)としてSKコンビネーター計算で書き直されたプログラムを書く。これを書き換える方法は無限にあることに注意してください。無限の方法のいずれかを出力するだけです。
これはcode-golfであるため、最短の有効な送信(バイト単位で測定)が優先されます。
テストケース
各テストケースは、1つの可能な出力を示します。上の式は、同等のλ計算式です。
λx.x:
\[0] -> ``SKK
λx.xx:
\`[0][0] -> ```SKK``SKK
λx.λy.y:
\\[0] -> `SK
λx.λy.x:
\\[1] -> K
λx.λy.λz.xz(yz):
\\\``[2][0]`[1][0] -> S
λw.w(λx.λy.λz.xz(yz))(λx.λy.x):
\``[0]\\[1]\\\``[2][0]`[1][0] -> ``S``SI`KS`KK
λx.f(xx) = S(Kf)(SKK)
?むしろそうではありλx.f(xx) = S(Kf)(SII) = S(Kf)(S(SKK)(SKK))
ませんか?変換するときにλx.f(xx)
、私が手S {λx.f} {λx.xx}
に減少させるS (Kf) {λx.xx}
と、カッコ内で式がより他に何もないω=λx.xx
私たちのように表現され知っている、SII = S(SKK)(SKK)
右、?
SII
ありませんSKK
。それは間違いでした。