これが最後のページです。ここまで読んでくださり、ありがとうございました!
他のページをお探しですか?
さて、前回の最後に、ラムダ村の村人は次のような質問をしました。
弁当箱にできない計算はあるのかな?
この質問に答えるためには、「そもそも弁当箱というアイデアはどこから来たのか」という質問にまず答える必要があります。
そのためには、ラムダ村の世界ではなく、現実世界の歴史を学ばないといけません。
というわけで、これから現実世界の歴史の話をします。ラムダ村の話からはいったん離れますが、このページの最後で戻ってきます。
ちなみに: これからコンピュータやコンピュータサイエンスの歴史について語りますが、簡潔さを優先するために、正確性をあえて犠牲にしたり、ほとんどの出来事を省いたりしています。
コンピュータ史に詳しい方のなかには、怒り心頭に発する方が出てくるかもしれません。雑な歴史の紹介であることをお許しください。
この記事のタイトルは「コンピュータサイエンスと魔法のYコンビネータ」ですが、はじめに、「そもそもコンピュータとは何か」という質問について考えてみましょう。
「コンピュータ」というとパソコンやタブレット、スマホ、ロボットを思い浮かべる方が多いかもしれません。
しかし、コンピュータは本質的には「計算機」なのです。
コンピュータを使えば情報を瞬時に検索できたり、美しいCGを描いたりすることができます。最近はAIを使って顔認証や会話ができるようになりました。
こういった便利な機能は、 コンピュータが大量の計算を瞬時に行えるからこそ実現されているのです。
たとえば、検索エンジンは膨大な数のデータをランク付けするために計算を行います。AIが顔認証をするときは、センサーが取り込んだ顔のデータを数値化し、それをもとに複雑な計算を行って本人かどうかを確かめているのです。
だから、コンピュータは「計算機」なのですね。
コンピュータは計算機であるからこそ、コンピュータの歴史はすなわち、計算機の歴史なのです。
歴史を振り返ると、たとえば昔の日本では、中国から伝わったそろばん が計算機の主役でしたね。
一方、海の向こうのアメリカでは、1890年に「タビュレーティングマシン」という計算機が台頭しました。
シリコンバレーのコンピュータ歴史博物館に展示されているタビュレーティングマシン(撮影: Anton Chiang, CC BY 2.0)
タビュレーティングマシンは、アメリカの国勢調査、すなわち国全体のアンケート調査を集計するために使われた計算機でした。マークシートのような紙に空いた穴を読み取って計算することで、大量のデータをすばやく集計できたのです。現代のエクセルのようなものですね。
ちなみに、この計算機の発明者であるホレリスは、IBMの前身となる会社を創業しました。IBMはさらに強力な計算機を開発し続け、1960年代に世界一のコンピュータ企業になったのです。
上記の「タビュレーティングマシン」を皮切りに、計算機は20世紀に入ってどんどん進化していきました。やがて計算機は電子化され、今の「コンピュータ」と呼ばれるような機械になっていきました。
いっぽう同時期に、計算機について科学する学問である「コンピュータサイエンス=計算機科学」 も生まれ、進化していきました。
そんなコンピュータサイエンスの研究者たちは、「コンピュータ=計算機の作り方や使い方をどう工夫すれば、より効率的に問題を解けるのか」といった問いに取り組んだのです。
そして、コンピュータサイエンスの礎を築いたと言われているのが、英国の数学者だったアラン・チューリング と、米国の数学者だったアロンゾ・チャーチ です。ふたりの研究が、学問としてのコンピュータサイエンスの大本になっているのです。
チューリングとチャーチは1930年代に、「ヒルベルトの決定問題」という、とある難しい数学の問題に別々に取り組んでいました。それがどんな問題かを説明するのは非常に難しいので省略しますが、ふたりがその問題をどのようにして解いたかが興味深かったのです。
その問題を解くために、ふたりはそれぞれ別々の「空想上の計算機」を考案する必要がありました。「空想上の計算機」とはすなわち、実際には(少なくとも1930年代の当時は)存在しないけど、もし存在したとしたら非常に複雑な計算ができる、仮想上の計算機のことです。
「もし仮にそんな計算機がこの世に存在したら…」と仮定したうえで理論を展開することで、ふたりはそれぞれ別々に、先述の問題を解くことができたのです。
実は、この時にふたりが別々に考案した、当時の技術では作ることができない「空想上の計算機」が、その後のコンピュータの開発や、プログラミング言語の開発、ひいてはコンピュータサイエンスそのものに大きな影響を与えました。
言い換えると、このふたりは「ヒルベルトの決定問題」という数学の問題を解いていたのですが、その問題を解くためにふたりが考えたアイデアが偶然にも、近代のコンピュータサイエンスの土台になったのです。
では次に、それぞれが考えた「空想上の計算機」について見ていきましょう。
1930年代半ばに、チューリングは先述の問題を解くために「チューリングマシン」という空想上の計算機を考案しました。「このチューリングマシンが仮に存在したら…」と論を展開することで、彼は先述の数学の問題を解くことができたのです。
そして、ここでは詳しく説明しませんが、このチューリングマシンの仕組みはシンプルながら、現代のコンピュータの仕組みと非常に似ており、近代的なコンピュータの発展に大きな影響を与えたのです。
一方、ほぼ時を同じくして、チャーチは先述の問題を解くために「ラムダ計算」という空想上の計算機を考案しました。では、この「ラムダ計算」とはどんな仕組みだったのでしょうか。
実は、みなさんはすでに「ラムダ計算」がどんな仕組みかを知っています。そう、 弁当箱のことです。
チャーチが考えた空想上の計算機「ラムダ計算」は、見た目は弁当箱とは違いますが、仕組みは同じでした。
たとえば、こちらが「ラムダ計算」の記述式です。一番左にある「λ」の記号はギリシャ文字で「ラムダ」と呼ぶことから、「ラムダ計算」と呼ばれています。
λA.B C
上のラムダ計算の記述式は、以下の弁当箱とまったく同じことを表しています。
λA.B C
上の弁当箱は、実行 すると になります。実行 を押してみてください:
それと同じで、先ほどの「ラムダ計算」の記述式も、実行 すると が残るのです。
λA.B C
B
もちろん、もっと複雑なラムダ計算の記述式もあります。たとえば、こちらをご覧ください。この記述式は、何を表しているか分かりますか?
λA.(λB.A(B B))(λB.A(B B))
これを弁当箱にすると、次のようになります。
もし にお寿司 を、 にサンドイッチ を当てはめると、上級編で登場したYコンビネータの弁当箱になります。
つまり、先ほどのラムダ計算の記述式はYコンビネータを表しているのです。
λA.(λB.A(B B))(λB.A(B B))
まとめると、本稿では、実はみなさんにラムダ計算を教えていたのです。ラムダ計算の記述式は見た目が複雑なので、「弁当箱のパズル 」という形で教えることで、とっつきやすくしていたというわけですね。
ここで、ラムダ村の村人の質問に戻りましょう。
弁当箱にできない計算はあるのかな?
先ほど、「弁当箱とラムダ計算は同じ」という話をしましたね。つまり、上の質問は以下のように言い換えることができます。
ラムダ計算にできない計算はあるのかな?
では、ラムダ計算にできない計算はあるのでしょうか?
結論から言うと、ラムダ計算は、現代のコンピュータが行うことができるすべての計算を行うことができます。つまり、あなたのパソコンやスマホができる計算はすべて、ラムダ計算にもできるということです。
このことは、1930年代に証明されました。「これから先にどれほど強力な計算機が登場しても、その計算機ができる計算は、理論上はラムダ計算にもできる」ということが数学的に証明されたのです。もちろん、この証明は難しすぎるので省略します。
そして、弁当箱とラムダ計算は同じなので、弁当箱も、現代のコンピュータが行えるすべての計算を行うことができるというわけですね。
ちなみに: チャーチが考案したラムダ計算だけでなく、チューリングが考案した空想上の計算機「チューリングマシン」も、現代のコンピュータが行えるすべての計算を(理論上は)行うことができます。このことも、1930年代に証明されました。
先ほど説明したように、ラムダ計算はもともと、とある数学の問題を解くためにチャーチが考案したものでした。しかし、ラムダ計算もまた、コンピュータサイエンスの発展に大きな影響を与えたのです。
特に、ラムダ計算は数々のプログラミング言語に影響を与えました。現存するプログラミング言語の多くには、ラムダ計算の名残が残っています。
たとえば、執筆時点で世界で最も人気のプログラミング言語のひとつである、Python (パイソン)という言語があります。ちなみにパイソンとは大蛇のことで、Python言語のロゴにもヘビの絵が描かれています。
このPython言語にも、「lambda (ラムダ)」という機能があります。たとえば、以下のPython言語のコードをご覧ください。(緑色で示しています)
(lambda A: A)('B')
上のPython言語のコードは、以下のラムダ計算とほぼ同じ意味です。
λA.A B
これは、弁当箱に例えると以下のようになり、実行結果は になります。
だから同じように、今回紹介したPythonのコードも、実行すると結果は 'B'
になります。
(lambda A: A)('B')
'B'
まとめると、Python言語のような人気のプログラミング言語も、1930年代に考えられたラムダ計算の影響を間接的に受けているのです。
そろそろ終わりが近づいてきましたが、最後に「コンピュータサイエンス=計算機科学」についてもう一言だけお話をさせてください。
それは、「計算機を工夫すること」が、コンピュータサイエンスではとても大事というお話です。
今回紹介したラムダ計算、すなわち弁当箱は、仕組みはとてもシンプルです。弁当箱の基本の法則は、初級その3〜5で紹介したように、非常にシンプルです。
しかし、こんなシンプルな弁当箱でも、現代のコンピュータが行えるすべての計算を行うことができるのです。それができる理由は、弁当箱を工夫すれば、四則演算や、条件分岐や、繰り返しを行うことができるからです。
たとえば今回紹介した通り、Yコンビネータの弁当箱を使えば、繰り返しを行うことができますよね。他にも工夫次第で、さまざまな計算を行うことができます。
コンピュータサイエンスは、「計算機(コンピュータ)の作り方や使い方をどう工夫すれば、より効率的に問題を解けるのか」について考える学問です。
そして、今回学んだ弁当箱は、シンプルでも工夫次第で複雑な計算ができる計算機です。そんな弁当箱には、コンピュータサイエンスのエッセンスが詰まっていると思うのです。
今回は時間の都合で、たくさんあるコンピュータサイエンスの題材のうち、ラムダ計算(弁当箱)しか紹介できませんでした。
とはいえ、コンピュータサイエンスの他の分野を学ぶときも、やることは弁当箱のときと同じです。なぜならどの分野でも、弁当箱のように「計算機(コンピュータ)を工夫して、問題を解く」ことが大事になってくるからです。
コンピュータサイエンスのどの分野でも、キーワードは「工夫」なのです。たとえば、「コンピュータをどう工夫して使えば、美しいCGや、人工知能や、仮想通貨が作れるだろう?」といった感じですね。
長くなりましたが、本稿を読んで、「コンピュータサイエンスの他の分野でも、コンピュータの工夫の仕方を学んでみたい」と思ってくだされば嬉しいです。
本稿で学んだことを短くまとめると、以下のようになります。
最後に、「その後」の話をしましょう。
まず、先述したイギリスの数学者で、空想上の計算機「チューリングマシン」を考案したアラン・チューリング。彼はチューリングマシンを考案したのち、イギリスからアメリカに渡り、ラムダ計算(弁当箱)を考案したチャーチのもとで学びました。
その後チューリングはイギリスに戻り、第2次世界大戦でドイツ軍の暗号通信「エニグマ」を解読しました。その後、彼は人工知能の分野でも先駆的な役割を果たし、「人工知能の父」とも呼ばれるようになりました。
チューリングは同性愛者で、当時のイギリスでは同性愛行為が違法でした。ある日、若い男性との性的関係を持ったことが発覚し、チューリングは有罪になりました。彼は薬品投与による「化学的去勢」を受け続け、42歳になる直前に毒物を服用して亡くなってしまいました。
チューリングが亡くなってから55年後の2009年、英政府はチューリングに対する迫害を謝罪し、2013年には亡きチューリングに恩赦が与えられました。
そしてこの記事の執筆中、2019年7月15日に、イギリスの新しい50ポンド紙幣の肖像にチューリングが採用されることになったのです。その50ポンド紙幣には、彼が考えた空想上の計算機「チューリングマシン」のイラストが載っています。(参考: BBC)
ではその後、ラムダ村はどうなったかというと…
村人たちは、何でも計算できる弁当箱を村の外の人たちに売りさばき、大金持ちになろうと悪巧み中です。
悪魔は暇になったので、日々ミニオンに新しい芸を覚えさせようとしていますが、なかなかうまくいっていません。
そして、年頃になったサヤちゃんは、好きなアーティストのコンサートにもっと参戦したいからと言って、ラムダ村を出ていきました。
以上でおしまいです!ラムダ村の名前の由来も、今回お分かりになったかと思います。ここまでお付き合いくださり、本当にありがとうございました。
本稿をお読みになったプログラマの方の中には、「これはプログラミング未経験者にとっては難しすぎるのではないか」と思われた方もいるかもしれません。そんな方に伝えたいことがあります。
お疲れ様でした!本稿の内容について質問がございましたら、メール(shu.chibicode@gmail.com)にお寄せください。
宣伝: もしご興味があれば、わたしが共訳した書籍『ファクトフルネス』や、わたしのブログもご覧ください。
重ね重ね、本稿をお読みになってくださりありがとうございました!
著者: 上杉周作 (ブログはこちら)
公開日:
ソースコード: GitHubで公開中
英語版: 英語版はこちら