型なしラムダ蚈算、コンビネヌタ、アンラムダおよびフィボナッチ数

以䞋は、私の意芋では、筋金入りのプログラミング方法に぀いおの話です。

投皿の䞻題は簡単ではありたせん。パスは長くなりたす。最埌にCookieずしお、Unlambdaでフィボナッチ数を数える方法を説明したす。



目利きの堎合蚘事は、厳密に正匏な説明をするよりも、その仕組みを説明する可胜性が高くなりたす。



λ-calculusは、アルゎリズムず蚈算可胜性の抂念を圢匏化するためにAlonzo Churchによっお発明されたした。 λ蚈算の関数は、このように理解する必芁がありたす-入力デヌタを凊理する特定のアルゎリズムずしお。



型なしのλ蚈算



単䞀の匕数の関数があるずしたす。 さらに、匕数ず戻り倀の䞡方が1぀の匕数の関数でもありたす。



ここで、数孊者は異議を唱えたすそれ自䜓からそれ自䜓ぞの関数のセットず䞀臎するセットを取埗したす。これはセット理論にはありたせん無限セットの堎合でも、関数のセットは厳密に倧きいです。 しかし、これはアメリカのスコットが郚分的に順序付けられたセットに特別なトポロゞヌを導入するこずでデカルト閉カテゎリヌを構築するこずを劚げたせんでした。 提瀺されたオブゞェクトは存圚したすが、これはたったく別の話です。



したがっお、手元にあるこのような抜象的で無限の奇劙な関数のセットだけで䜕ができるのでしょうか そもそも、これらの関数の曞き方を決めおおくずいいでしょう。 λ蚈算では、次の芏則が採甚されたす。





次に、この関数は匕数xを取り、倀fxを返すため、 λx.fx= fです。これは、関数f自䜓が行うこずです。 これはη倉換ず呌ばれたす。



たずえば、 λx.x2は2乗関数であり、 λx.x23はこの関数の匕数3ぞの適甚です。盎芳では、この匏の倀は9であり、これはλ蚈算の唯䞀の公理であり、 β-削枛 



ここで、 F [x= a]は匏Fを意味し、 xの代わりにaが䜿甚されたす。 この公理ずずもに、 λ蚈算はチュヌリング完党なプログラミング蚀語になりたす。 任意のアルゎリズムを実装できたすアルゎリズムが䜕であるかの合理的な意味で。 自然な疑問が生じたす-どうやっお



匕数を単に返すアむデンティティ関数をスケッチするのは簡単です λx.x

定数関数も耇雑さを匕き起こしたせん λx.c 、ここでcはxから独立しおいたす。 実際、どの匕数に察しおも、関数はcを返したす 。

それがすべおのようです。 いく぀かの匕数の関数を䜜成する方法すら知らない いいえ、できたす。ただ知りたせん。



次の䟋を考えおみたしょう λx.λy.x+ y 。 わかりやすくするために、括匧を付けたす λx。Λy。X + yは、合蚈を返す別の関数を返す関数です。 どのように機胜したすか それをいく぀かの匕数に適甚しおみたしょう λx。Λy。X + ya =λy。A + y 。 結果の関数は、別の匕数λy。A + yb = a + bに適甚できたす。 この手法はcurrying 、たたはcurrying Haskell Curryの埌ず呌ばれ、任意の数の匕数に察しお機胜したす。 関数の圢匏がλx。Λy。Λz。Fの堎合、 λxyz.Fず曞くこずに同意したす。 たた、 fabcは

fabc 。 これで、倚くの匕数の関数は非垞に簡単に蚘述されたす λxy.x+ y 、およびそれらのアプリケヌションはfabです。



ちょっずした䜙談この蚘事は型のないλ蚈算に関するものであるにもかかわらず、数倀ず算術挔算を繰り返し䜿甚したしたが、正匏にはただ数倀ず挔算に぀いおは知りたせん。 これは理解を深めるために行われ、すぐに䞡方がλ蚈算で実珟できるこずがわかりたす。



制埡構造





ここで、λ蚈算でサむクルを䜜成する方法の質問に答えたす。 関数のみを扱っおいるため、明らかに、再垰メカニズムを䜿甚しおいたす。 しかし、λ蚈算では、関数を自分の䞭から呌び出すこずはできないため、少し異なるアプロヌチが䜿甚されたす。関数は匕数ずしお自身に枡されたす。



次の関数を考えおください w =λx.xx。 圌女は圌女に唯䞀の議論を適甚したす私たちにずっお、あなたが取るものはすべお関数であるこずを忘れないでください。 この関数を自分自身に適甚しおみたしょう ww =λx.xxw =xx[x= w] = ww おっず、β-還元を䜿甚しお、私たちは始めたずころに来たした。 これは、λ蚈算における無限ルヌプの最も単玔な䟋の1぀であり、絶察に䜕もしないずいう点で泚目に倀したす。



別の重芁な質問条件付きステヌトメントを実装する方法 ここでは、elseブランチが存圚しないこずを理解するこずが重芁です。 すべおのオブゞェクト、぀たり倀を返すために必芁な関数があり、「䜕もしない」こずはできたせん。 次のオブゞェクトを定矩したす。



ここで、 boolがこれらの定矩の意味で論理倀である堎合 、 boolの堎合はboolがたさに必芁な構造です。 bool = trueの堎合、結果はifステヌトメントになり 、そうでない堎合はelseステヌトメントになりたす。



ここで、ルヌプず再垰の叀兞的な問題-階乗の蚈算を解決しおみたしょう。 すでに数字、算術挔算接頭蟞衚蚘でλ蚈算のスタむルで蚘述したす、匕数を1枛らすdec関数、およびれロず等しいかどうかを確認できるれロ関数を甚意したしょう。

g =λrn。れロn1* nrrdec n

よく芋おみたしょう関数はnが0に等しいかどうかをチェックし、成功した堎合は1を返し、そうでない堎合は* nrrdec n - nずそれ自䜓ずn-1からの関数rの倀の積を返したす 関数rずは䜕ですか これは再垰を行うための䞀皮のハックです-rは関数g自䜓を枡すので、曞かれた匏は実際に階乗を蚈算したす gn= n * gn-1 。 毎回関数を自分自身に枡すのは䞍䟿なので、階乗の最終的な実装を行いたす。

f = gg

したがっお、 gは最初の匕数を 「蚘憶」し、残りは蚈算に必芁な数を枡すだけです。



さらに悪い。



固定小数点コンビネヌタヌ





関数fのラムダ蚈算では、 fx = xのような匕数xが存圚するこずがわかりたす。 さらに、このxは垞に芋぀かりたす この䜜業は、いわゆる固定小数点コンビネヌタヌによっお行われたす。 私たちの最愛のHaskell Curryによっお発明されたそのオプションの1぀

Y =λf。Λx.fxxλx.fxx

仕組みを芋おみたしょう。

Y f =λx.fxxλx.fxx= fλx.fxxλx.fxx= fY f

したがっお、 fY f= Y fであるため、 Y fは実際には関数fの固定小数点です。



数字ず算術





ご想像のずおり、䞊蚘の必芁なオブゞェクトず構造の実装はすべお䞀意ではありたせん。λ蚈算の魅力は、必芁な基本的なものの実装方法を決定できるこずです。 しかし、サむクルず条件に関しお、最も単玔な実装が特定されおいるように思える堎合は、数字によっお物事が異なりたす-数字の実甚的な実装はたくさんありたす。タスクごずに独自の特定のオプションを考え出すこずができたす。 それにもかかわらず、アロンゟ教䌚によっお発明された数字-教䌚の数字の䞀般的に受け入れられた実装がありたす。



非負の数Nを、関数f 、匕数x 、およびxからfの倀を蚈算するN回を取る関数ずしお定矩したす。



したがっお、λ蚈算では、数倀は次のようになりたす。





Inc関数

inc =λnfx.fnfx

関数をn回適甚し、もう䞀床適甚しおn + 1を取埗したした。



mずnを远加する方法は fを最初にxに適甚し、次にn回実行する必芁がありたす。



add =λmnfx.mfnfx



乗算が簡単になりたす。xに nf回適甚する必芁がありたす。



mult =λmnf.mnf



パワヌアップ-さらに簡単

pow =λmn.nm



匕数がれロかどうかをチェックする関数を䜜成したす。

λn.nλx.falsetrue

匕数がれロの堎合、定矩から芚えおいるように2番目の匕数を返すだけです。 true 、そうでない堎合、関数λx.falseをそこにあるものに䜕床もたあ、少なくずも1回適甚したす。 そのため、先ほど説明した定数が圹に立ちたした 。戻り倀はfalseになりたす 。



今、もっず難しいのは枛算です。 最初に、1より小さい数倀たたは匕数が0の堎合は䜕かを返す関数を䜜成したす。 ここにありたす

dec =λnfx.nλgh.hgfλu.xλu.u

「地獄はどのように機胜するのか」ずいう質問に関連しお、今では最も氞続的なものでさえ神経を倱っおいるず思いたす。 理解しおみたしょう。



たず、ピヌスnλgh.hgfλu.xを芋おみたしょう-未知の䜕かがn λu.x n回適甚されたす。 教䌚の番号のようになり、適甚しおみたしょう。





したがっお、 n回のアプリケヌションの埌、匏は次の圢匏になりたす。

dec n =λfx。λh.hn-1fxλu.u=λfx。λu.un-1fx=λfx。n-1fx =n-1

利益

しかし、れロの堎合、関数は䜕を返したすか

dec 0 =λfx。λu.xλu.u=λfx.x= 0



定矩の0ずfalseは同じであるこずに泚意しおください。



これで、簡単に蚘述および枛算できたす。

sub =λmn。n decm



コンビネヌタヌ





コンビネヌタは、自由倉数を含たないλ関数です。 それらの倉数はすべお、λ-抜象化によっお接続されたす。

非コンビネヌタヌの䟋





コンビネヌタヌの䟋





そしおもう1぀の興味深い事実他のλ関数を衚珟できる有限の組み合わせの組み合わせを遞択するこずができたす このようなキットは、たずえば、 SKIおよびBCKWです。



りンラムダ





Unlambdaは、組み合わせロゞックを䜿甚した玔粋な関数型プログラミング蚀語です。 ぀たり、関数を䜜成するために、SKIセットを䜿甚したす。 関数Fを関数Gに適甚するこずは `FGずしお曞かれおおり、 䞍必芁な括匧から私たちを救いたす。 耇数の匕数を連続しお適甚する `` fxyz 。 組み蟌み関数s、k、iに加えお、蚀語には画面に衚瀺する機胜がありたす .xはiず同様の機胜を瀺したすが、副䜜甚ずしお文字xが画面に衚瀺されたす。たた、入力および保留䞭の蚈算のメカニズムがありたす。行かない



むかしむかし、遠く、遠くの銀河で、次のようなもので終わるアンラムダチュヌトリアルを芋぀けたした。



今、私はこの蚀語でフィボナッチ数を蚈算するサむクルを曞くこずができる方法を説明したかったのですが、すでにここで私は無力です

`` `s``s``sii`ki

`k。*` `s``s`ks

`` s`k`s`ks``s``s`ks``s`k`s`kr``s`k`sikk

`k``s`ksk




さお、詊しおみたしょう。

ちなみに、プログラムは、画面にフィボナッチ数を星の察応する数の圢で衚瀺したす。



サむクルに぀いお説明したす。

  1. N個の星を衚瀺
  2. 翻蚳を新しい行に出力したすublambdaでは、 r関数がこれを行いたす
  3. 蚘憶されおいる以前のフィボナッチ数にNを远加したす




ずりあえず、私たちはすでに銎染みのあるλ蚈算のスタむルですべおを曞きたす。



N個の星を印刷  N個の印刷i-同じ関数に印刷をN回適甚し、同時にN個の星を印刷したす。 その結果、同䞀の機胜が埗られたす。 それを䜕かに適甚したしょう N print inewlinecycle+ NMN 、ここでMは前のフィボナッチ数です。 そのため、サむクルの1パスの関数を取埗したした。

cycle =λcnm。n print inewlinec+ nmn

パラメヌタずしおルヌプに自分自身を枡し、1ず0で初期化したす。

fib =サむクルサむクル1 0



私が玄束したように、これをunlambdaに倉換するこずは残っおいたす。 おお



匏をλ蚈算からSKIセットに倉換するためのアルゎリズムを読者に玹介しおいただければ幞いです偶然、任意の関数がSKIで衚珟できるこずを瀺しおいたす。 したがっお、アルゎリズム自䜓







最埌を陀いお、すべおが倚かれ少なかれ明癜です。 コンビナトリアルSの定矩を芋おみたしょう。

S =λxyz。Xzyz

Fに適甚し、次にGに適甚したす。

SFG =λyz。F zyzG =λz。F zG z

実際、これが必芁なものです。



倉換アルゎリズムλx.Fは、次のアクションになりたす。





次に、必芁な「ブリック」をアンラムダに倉換したす。

0 = `ki

1 = i

远加

`` s''s`ks``s``s`ks``s`kk`ks``s``s`ks``s``s`ks``s`kk`ks``s` `s`ks``s`kk`kk``s`kk`k

s``s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s``s`ks``s`kk`ks``s `` s`ks``s`kk`kk``s`kk`

ks``s``s`ks``s`kk`kk``s`kk`ki``s``s`ks``s``s`ks``s`kk`ks``s` `s`ks``s`kk`kk``s`kk

`kk``s``s`ks``s`kk`kk`ki``s``s`ks``s``s`ks``s`kk`ks``s``s`ks `` s``s`ks``s`kk`ks``

s''s`ks``s`kk`kk``s`kk`ks``s``s`ks``s``s`ks``s`kk`ks``s``s` ks``s``s`ks``s`kk`ks`

`s``s`ks``s`kk`kk``s`kk`ks``s``s`ks``s``s`ks``s`kk`ks``s``s `ks``s`kk`kk``s`kk`kk

`` s`kk`ki``s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s`kk`kk``s`kk `kk``s``s`ks``s`kk`k

k`ki``s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s`kk`kk``s`kk`kk`` s''s`ks``s`kk`kk``s`

kki


サむクル

`` s''s`ks``s``s`ks``s`kk`ks``s``s`ks``s``s`ks``s`kk`ks``s` `s`ks``s`kk`kk``s`kk`k

s``s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s``s`ks``s`kk`ks``s `` s`ks``s`kk`kk``s`kk`

ks``s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s``s`ks``s`kk`ks``s `` s`ks``s`kk`kk``s`kk

`ks``s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s``s`ks``s`kk`ks`` s''s`ks``s`kk`kk``s`k

k`ks``s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s`kk`kk``s`kk`kk`` s''ks`s`kk`kk`ki`

`s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s`kk`kk``s`kk`kk``s``s `ks``s`kk`kk``s`kk`k。*

`` s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s`kk`kk``s`kk`kk``s`` s`ks``s`kk`kk``s`kk`k

i``s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s`kk`kk``s`kk`kk``s` `s`ks``s`kk`kk``s`kk`

kr``s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s``s`ks``s`kk`ks``s `` s`ks``s`kk`kk``s`kk

`ks``s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s``s`ks``s`kk`ks`` s''s`ks``s`kk`kk``s`k

k`ks``s``s`ks``s`kk`kk``s`kk`ki``s``s`ks``s``s`ks``s`kk`ks`` s``s`ks``s``s`ks``s`

kk`ks``s``s`ks``s`kk`kk``s`kk`ks``s``s`ks``s``s`ks``s`kk`ks`` s``s`ks``s``s`ks``s

`kk`ks``s``s`ks``s`kk`kk``s`kk`ks``s``s`ks``s``s`ks``s`kk`ks` `s``s`ks``s`kk`kk``

s`kk`kk``s`kk`ki``s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s`kk`kk `` s`kk`kk``s``s`s`

`s`kk`kk`ki``s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s`kk`kk``s` kk`kk``s``s`ks``s`kk

「kk」s「kki」s「s」ks「s」s「ks」s「kk」ks「s」s「ks」s「kk」kk「s」kk `kk``s``s`ks``s`kk`

っっっきヌ




そしお、完成したプログラム

`` ``

`` s''s`ks``s``s`ks``s`kk`ks``s``s`ks``s``s`ks``s`kk`ks``s` `s`ks``s`kk`kk``s`kk`k

s``s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s``s`ks``s`kk`ks``s `` s`ks``s`kk`kk``s`kk`

ks``s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s``s`ks``s`kk`ks``s `` s`ks``s`kk`kk``s`kk

`ks``s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s``s`ks``s`kk`ks`` s''s`ks``s`kk`kk``s`k

k`ks``s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s`kk`kk``s`kk`kk`` s''ks`s`kk`kk`ki`

`s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s`kk`kk``s`kk`kk``s``s `ks``s`kk`kk``s`kk`k。*

`` s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s`kk`kk``s`kk`kk``s`` s`ks``s`kk`kk``s`kk`k

i``s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s`kk`kk``s`kk`kk``s` `s`ks``s`kk`kk``s`kk`

kr``s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s``s`ks``s`kk`ks``s `` s`ks``s`kk`kk``s`kk

`ks``s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s``s`ks``s`kk`ks`` s''s`ks``s`kk`kk``s`k

k`ks``s``s`ks``s`kk`kk``s`kk`ki``s``s`ks``s``s`ks``s`kk`ks`` s``s`ks``s``s`ks``s`

kk`ks``s``s`ks``s`kk`kk``s`kk`ks``s``s`ks``s``s`ks``s`kk`ks`` s``s`ks``s``s`ks``s

`kk`ks``s``s`ks``s`kk`kk``s`kk`ks``s``s`ks``s``s`ks``s`kk`ks` `s``s`ks``s`kk`kk``

s`kk`kk``s`kk`ki``s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s`kk`kk `` s`kk`kk``s``s`s`

`s`kk`kk`ki``s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s`kk`kk``s` kk`kk``s``s`ks``s`kk

「kk」s「kki」s「s」ks「s」s「ks」s「kk」ks「s」s「ks」s「kk」kk「s」kk `kk``s``s`ks``s`kk`kk`ki

`` s''s`ks``s``s`ks``s`kk`ks``s``s`ks``s``s`ks``s`kk`ks``s` `s`ks``s`kk`kk``s`kk`k

s``s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s``s`ks``s`kk`ks``s `` s`ks``s`kk`kk``s`kk`

ks``s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s``s`ks``s`kk`ks``s `` s`ks``s`kk`kk``s`kk

`ks``s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s``s`ks``s`kk`ks`` s''s`ks``s`kk`kk``s`k

k`ks``s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s`kk`kk``s`kk`kk`` s''ks`s`kk`kk`ki`

`s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s`kk`kk``s`kk`kk``s``s `ks``s`kk`kk``s`kk`k。*

`` s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s`kk`kk``s`kk`kk``s`` s`ks``s`kk`kk``s`kk`k

i``s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s`kk`kk``s`kk`kk``s` `s`ks``s`kk`kk``s`kk`

kr``s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s``s`ks``s`kk`ks``s `` s`ks``s`kk`kk``s`kk

`ks``s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s``s`ks``s`kk`ks`` s''s`ks``s`kk`kk``s`k

k`ks``s``s`ks``s`kk`kk``s`kk`ki``s``s`ks``s``s`ks``s`kk`ks`` s``s`ks``s``s`ks``s`

kk`ks``s``s`ks``s`kk`kk``s`kk`ks``s``s`ks``s``s`ks``s`kk`ks`` s``s`ks``s``s`ks``s

`kk`ks``s``s`ks``s`kk`kk``s`kk`ks``s``s`ks``s``s`ks``s`kk`ks` `s``s`ks``s`kk`kk``

s`kk`kk``s`kk`ki``s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s`kk`kk `` s`kk`kk``s``s`s`

`s`kk`kk`ki``s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s`kk`kk``s` kk`kk``s``s`ks``s`kk

「kk」s「kki」s「s」ks「s」s「ks」s「kk」ks「s」s「ks」s「kk」kk「s」kk `kk``s``s`ks``s`kk`kk`ki

`` s''s`ks``s``s`ks``s`kk`ks``s``s`ks``s``s`ks``s`kk`ks``s` `s`ks``s`kk`kk``s`kk`k

s``s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s``s`ks``s`kk`ks``s `` s`ks``s`kk`kk``s`kk`

ks``s``s`ks``s`kk`kk``s`kk`ki``s``s`ks``s``s`ks``s`kk`ks``s` `s`ks``s`kk`kk``s`kk

`kk``s``s`ks``s`kk`kk`ki``s``s`ks``s``s`ks``s`kk`ks``s``s`ks `` s``s`ks``s`kk`ks``

s''s`ks``s`kk`kk``s`kk`ks``s``s`ks``s``s`ks``s`kk`ks``s``s` ks``s``s`ks``s`kk`ks`

`s``s`ks``s`kk`kk``s`kk`ks``s``s`ks``s``s`ks``s`kk`ks``s``s `ks``s`kk`kk``s`kk`kk

`` s`kk`ki``s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s`kk`kk``s`kk `kk``s``s`ks``s`kk`k

k`ki``s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s`kk`kk``s`kk`kk`` s''s`ks``s`kk`kk``s`kki

私は




はい、はい、私自身はずおも怖いです。 ちなみに、プログラムのアンラムダコレクションでは、 同様のコヌドはそれほど倚くのスペヌスを必芁ずしたせん。 どうやら、蚀語の䜜者は、極小で最適化されたλ蚈算からunlambdaぞの翻蚳の秘密の叀代技術を所有しおいたす。 それにもかかわらず、私は玄束を守った。 最埌たで読んでくれた人に感謝したす。



All Articles