見出し画像

Retro-gaming and so on

実用Common Lispの読み方

実用Common Lispは物凄い本である。
多分こんな「プログラミングに関する」本は他には存在しない。

ANSI Common Lispと言うマイナー言語での本、ってのは残念に思うかもしれないけど、「ソフトウェアの書き方」と言う観点でトータリティを持って書かれてる本ってのはなかなか無いから、だ。
他の本で、例えば「プログラミング言語hoge入門」と言う本はたくさんあるのは知ってるだろう。「Python入門」とかな。
でも基本、そのテの本は、単なる言語仕様の「易しい説明書」の類からはみ出していない。ハッキリ言えばそれを読了したトコでプログラミングが出来るようにはならんだろ。せいぜい、良くあるパターンで言うと巻末にある2〜3例のプログラムが理解できるようになる程度である。
特に難しい、「C言語入門」だとその本を終わってからも「プログラムが書けるようになる」まで長い道のりがある。C言語は「材料」は提供するけど、「マトモなプログラム」に到達するまでは超えなきゃならないモノがまだまだ山ほどあるからだ。
そして、専門的なソフトウェアの書き方、例えば「掲示板作成入門」も掲示板さえ出来ればOKではあるが、かと言って他のプログラムの書き方が分かるわけではない。他のプログラムの書き方を知るためにはまた別の専門的なソフトウェアの書き方を学ばなければならないから、である。
それはゲームの作り方、と言う本でも同じである。
そういう意味で言うと、実用Common Lispは全く違うのである。確かに現代的なプログラミング、例えばWebプログラミングとか、欠けてる部分が無いとは言わない。
ただし、それでも、普遍的な意味に於いての「あらゆるプログラムの書き方」を指南してる本なんだ。言っちゃえば、ANSI Common Lispが「たまたま言語として選ばれてるだけ」であって、ソフトウェアを書く際の総合的な指南書になってる、ってのがこの本の恐ろしいトコなのである。
もう一度言うと、知ってる範疇で言うとこんな本は他には存在しない。
何故なんだろう。

邦題では「実用Common Lisp」と呼んでるが、原題はParadigms of Artificial Intelligence Programming、つまり「人工知能プログラミングのパラダイム」である。
要するに、この本は、古典的な人工知能プログラミング法、に関しての本だ。そして「古典的な」と言う事柄が指し示している事は、現代的ではない、と言う意味である。従って、昨今流行りの統計処理の延長線上にある「機械学習」には全く触れていない。
「ええええええ。ダッサ。」と思う向きもあるだろう。しかも「人工知能」である。そんなテーマを持ってこられても「興味がねぇよ。」と言う人も多いと思う。
しかし、それは勘違いなんだ。

まず前提として。
大まかにソフトウェアと言っても、ザックリ言えば3つくらいの潮流がある、って言って良い。
それはこの3つだ。

  1. 数値計算
  2. アーケードゲーム
  3. 人工知能やそれにまつわるテクニック
まず、「弾道計算」等の数値計算を扱う分野。これはコンピュータが元々作られた目的から言っても実は一番簡単な分野である。いやマジで。
大学生とかだと、「数値微分」とか「数値積分」とかやらされるんで、ある意味お馴染みのテーマなんだけど、実の事言うと、「元々コンピュータはそのために作られた」わけで、さして難しい事はない。ハッキリ言っちゃえば、決まりきったフォーマットで問題を言語に適用させて書き下せばいいだけ、なんで数学的理解なんかとは全然関係がないのだ。
「え、うそ?」とか思うかもしれんけどマジだ。初学者は良くこのテの事で混乱するが、「扱ってるプログラミング言語が簡単/難しい」と言うのと「問題をプログラミングとして表現する」のが「簡単/難しい」と言うのはさして関係はない。「数式を解読出来るか出来ないか」、と言うのと「特定のパターンに従ってプログラムを記述出来る/出来ない」と言うのも実は全く関係がない。
言い換えると、パターンを把握して「捻りもなく」言われた通りに書けばいいだけ、なんで工夫が入る余地なんざ基本的に無いし、数学的素養もクソも全く関係ないのである。
大体、貴方自身が計算するわけでもねぇし、そもそも「計算機に計算させる」だけなんで貴方の数学的能力は全くアテにされてないのだ・・・電卓が貴方の数学能力を要求すると思う?と考えれば答えは自ずとから明らかだろう。
ただ、大学だと一応「学問として」語らなアカンので、一見難しそうに言ってるだけ、なのである・・・・・・。うん、ホント。ここでバラしていいのかどうかは知らんが(笑)。
そして大体、簡単なトピックじゃないと初学者にこんなテーマを与えるわけがないのである。皆「数学」って聞いただけで「難しい」と勝手に思い込んで騙されてるだけ、なんだよ。
2番目は例えばシューティングゲームとかアクションゲームの類だよな。これらはルーツはさておき、一般的にはアカデミックな分野とはかけ離れた市井で発展してきたジャンルだ。従って、取り立ててノウハウとしてまとまったモノがあるわけでもなく、これはその「ゲームの形式」に従って学ばないとならないと思う。ある意味、「ソフトウェアを作る」って観点だと一番難しいジャンルだろう。
よって、ここでは置いておく。
残りは3番目。人工知能である。実のことを言うと1、2の分野を除いて、あと「その他モロモロ」を除くと、いわゆる「ソフトウェアを作る」事に一番多大な影響を与えてる分野はこの分野なんだ。
アドベンチャーゲームと人工知能」と言う記事でも紹介したけど、元々のテキストアドベンチャーゲームの成立はこの分野での研究の応用、と言う側面が強い。そしてアカデミックな分野では、数値計算を除くと、そのテの「自在なテキスト処理」が研究テーマとして早い段階から取り組まれてきたわけだ。
言い換えると、一見PCで発達したように見える「思考型ゲーム」はこの辺の研究無しでは成り立ってないのである。
そして一見、関係なさそうに見える将棋ソフトやチェスソフトしかり、である。これらは人工知能研究で培われた「探索」と言う技術無しでは成立しない。
と言うわけで、「人工知能」と言いながら、かなり広範な範囲に渡っての「ソフトウェアを作る」ノウハウはここに集約されている。結果、「実用Common Lisp」は「AIの本」と言いながらも、事実上、かなりの範囲で「普遍的なソフトウェア構築技術」を解説する本になってしまってるわけだ。
だから「こんな本」は他に存在しない理由にもなってるわけ。

さて、とは言ってもゴメン。実は僕自身この本を通読した事がない。っつーか、ここまで読んできた勘のいい人は気づいてるだろうが、殆どこの本は「ソフトウェアHow to」の総覧と言って良い本となってる為、どっちかっつーと辞書的に使う事が可能となってるのだ。
「以前書いたユーティリティを使う」側面は絶対出てくるんだけど、それを省くと意外と各章は独立してて、1章ないしは2章で「一つのソフトウェアを書き上げる」スタイルになっている。
従って、何か困った時には「参照しつつ読む」事が可能となってんだな。それがこの本がまた優秀なトコだと逆に思ってるんだ。
そして各章が独立してる、と言う意味は、結局、良くある本のように「進めば進むほど難しい内容になっていってる」って訳でもない、って事だ。どっちかっつーと互いに独立したトピックで各章がフラットに並んでる、ってカンジである。そこがまたこの本の良いトコなんだ。
とは言っても、辞書的に使おうとすればコツが要る。
そこで、ここでは概要を説明しようと思う。

基本的に、この本は、ネタとしては5つのネタに分けられると思う。

  1. 人工知能プログラムの実例
  2. プログラミング言語の実装
  3. ゲームの実装
  4. 自然言語解析
  5. ソフトウェア最適化等の小ネタ
だ。

1. 人工知能プログラムの実例

まず1番目の人工知能プログラムの実例、から。
ここでは人工知能プログラムの黎明期(1950年代後半から1960年代にかけて)で「実際に作られたソフトウェア」の再実装を行っている。
大まかに言うとここで取り上げられてるネタとなったソフトウェアは以下の通りである。

うん、実は大まかに言うとこの3つしかない。そしてそれで充分なんだ。
まず1つ目のエキスパートシステム。
エキスパートシステム、とここではザックリ言ったが、これも本書の中では何段階かに分けて取り上げられている。
いずれにせよ、エキスパートシステム、とは大雑把に言うと「問題を入力するとその問題を自動的に解いてくれる」ソフトウェアだ。ここではその「問題」が何を指すのか、ってのは取り敢えずは問わないけどね。
例えば(ちょっと違うが)いわゆるソルバーと言われるタイプのソフトはここに準じるだろう。数独を解くソフト、とかだな。でも数独を解くソフトは数独を解くだけ、なんだけど、エキスパートシステムと言うのはもうちょっと一般的な、つまり(数独も解けるにせよ)数独に限定されてないソルバーの設計をどうするか、と言うトピックである。

2番めは以前の記事でも書いた通り、実はテキストアドベンチャーゲームの基礎技術の塊である。しかもGNU Emacsと言うテキストエディタでは「実際に目の前で動く」対話型の人工無能ソフトにお目にかかれる。twitterなんかで人工無能のチャット・ボットを作ってみたい、なんて人にはオススメのネタだ。
そして、以前紹介した通り、Emmyと言う会話ソフトや、あるいはエニックスからかつて販売された「Tokyo ナンパストリート」なんかの遠い親戚にあたる。
ちょっと凝ったエロゲを書いてみたい、って人にはオススメのネタになるだろう。

3番目が恐らく、一般的な意味では、古典的な人工知能研究の一番の成功例だろう。電卓では出来ない「方程式を解く」ソフトウェアの開発法である。
プロに愛用されている、商用ソフトのMathematica及びMapleはこの分野のソフトウェアである。買えば100万円はくだらないソフトウェアがここでは「自作」出来る。
そして、実際目の前で動くフリーソフトウェアとしてMaximaがある。そしてそのMaxima自体がCommon Lispで書かれてるのだ。

2. プログラミング言語の実装

そして次に、この本ではプログラミング言語を実装する。しかも2つもだ。

  1. Prolog
  2. Scheme
人工知能が問題解決のためのソフトウェアならプログラミング言語は問題解決のためのソフトウェアを書く問題を解決するソフトウェアである(笑)。ややこしいが。
いずれにせよ、「人工知能を開発するにもっとラクなプログラミング言語を使う」のはターゲットとしては間違いないんだが、この本は「使う」のではなく「作ってしまおう」とする。
Prologは・・・知ってる人いるんかな、少なくとも1980年代にはLispと双璧を成した、フランス生まれの「人工知能用」プログラミング言語である・・・しかし、特異、と言う意味に於いてはLispより特異であり、一般的なプログラミング言語とも決定的に違う言語だ。もっと言っちゃうと、この言語自体がある種「人工知能のような」プログラミング言語である。
Prologのもう一面は、ある意味「データベース問い合わせ」言語でもある。今フツーに有名なSQLなんかより遥かに強力な、である。
いずれにせよ、この本ではこのPrologをANSI Common Lispで実装しようとする。
ところで何でプログラミング言語を「作る」と言う話になってんだろ?とか不思議に思うかもしんない。僕もかつてはそうだった。
しかし、原理的な話をすると「あらゆるソフトウェアはRead-Eval-Print loopを持ってる」。そのパースペクティブでこの本は書かれてるのだ。ソフトウェアを書く上では、REPLと言う仕組みを知ってるか知ってないか、は大きく違うのだ(じゃなきゃ意味不明なループ構文だらけ、printだらけ、のソフトしか作れないだろう・・・そういうソースコードを読んだ事がある)。
そして実の事を言うと原理的にはGUIもその例に漏れない。
人工知能のソフトウェアも「入力」->「評価」->「印字」の繰り返しプロセスで成り立っている。だから「プログラミング言語」がそのプロセスと関係ない、って事はないのだ。むしろガワは全く共通している。
この本はその視点を気づかせてくれるようになっている。
だからむしろ書くべき、なのだ。
残りはSchemeだが、「LispでLispを書く」と言う典型例からもこの本は離れていない。しかも、類書でやってる事よりも遥かに強力で綺麗なコードをこの本は紹介している。かつ、類書では「マクロ実装」に関してはスルーしてるケースが多いが、この本はそこにも踏み込んでいる。非常に優秀な本である。
また、通常は「インタプリタ」を書くだけで終わるが、この本はなんと「コンパイラの書き方」まで指南しようとする。類書でコンパイラの書き方まで言及する本はない。コンパイラはコンパイラで・・・と専門書が要る範疇まで踏み込んでいくのだ。偉い。

3. ゲームの実装

そして3番目に、ソフトウェアとしてはゲームがあるが、この本ではオセロゲームの実装を取り上げる「だけ」、となる。
だけ、とは言ってもここで語ってる技法は強力だ。と言うか、ある意味「コンピュータ・サイエンス」が教える技法のある意味代表的な骨格だ。それを「探索」と言う。
元々、「ゲーム」を考える場合、歴史的には「対人対戦」が基本だった。ビデオゲームもその例に漏れず、事実、もっとも最初に人々に受け入れられたゲームは「ポン」だった・・・・・・エアーホッケーを抽象化したようなビデオゲームである(※1)。
つまり、ビデオゲームも最初は「対人戦の場」を提供するだけ、だったのである。
そして、後のブロック崩し(Breakout)では物理法則的なプログラムが書かれたが、ある意味「決まりきった返し」をするプログラムである。そして、インベーダーからシューティングゲームが発達するが、原則、ここで見られる「デザイン」はAIではない。敵機がどう現れて進行してくるか、と言うのは最初から決まってる。せいぜい敵が打つ弾が自機の座標を目標として動いてくるだけで、「コンピュータが自ら考えて自機を殲滅する為に動いて」いるわけではないのだ。


シューティングゲームの金字塔「グラディウス」。
しかし、敵がどこから登場するか、どういう動きをするか、の殆どは「予め」決まっていて、だからこそ「覚えゲー」として攻略が可能だ、と言う事も出来る。
そしてそこに、人為的な「ゲームデザイン」が存在する。
言い換えると、別にコンピュータが「現状に即しての、自機を滅する為の最適解」を考えてるわけではない、と言う事だ。

反対に、将棋やチェス、あるいは「実用Common Lisp」で取り上げられているオセロは「決まりきった行動をする」わけにはいかない。人間に対して如何にも「思考してる」と言うフリをしてくれないとゲームにはならないのだ。
ここでオセロが取り上げられてるのは、思考型ゲームとしては一番ルールがシンプルで、簡単だから、だ。
そしてこのテの「思考型ゲーム」の基礎技術を「探索」と言う。そう、実用Common Lispではオセロを題材にして「探索」を語っているのだ(※2)。

4. 自然言語解析

ここでは「言語をどうやって解析するのか」と言う大きなネタを扱っている。
「プログラミング言語」をプログラムする際にも構文解析は必要だが、もうちょっと大きな観点から見た「構文解析」のチュートリアルである。

5. ソフトウェア最適化等の小ネタ

実用Common Lispの残りのネタは、ソフトウェア開発に関しての様々な小ネタが散りばめられている。
例えばユーティリティの作り方をどうするか。ソフトウェアの計算スピードを上げる為の「最適化」をどうするのか、オブジェクト指向とは何なのか、とまさしくソフトウェア開発に於ける「実用的なネタ」が含まれている。

いずれにせよ、先にも書いた通り、「古典的人工知能技術」と言うのは特殊な技術ではなく、その後、パソコンでのソフトウェア開発でも使われる「プログラミングテクニック」を発展させた非常に重要な分野である。
そして、通常のプログラミング指南書に於ける「スクリプト」程度のプログラムをこの本では紹介しない。基本的にどのプログラムも「Read-Eval-Print Loop」を備えた「ホンモノの」プログラムである。
そして「ホンモノのプログラム」の書き方を指南する本は極めて少ないのだ。
だから本音を言うと、ヘナチョコな「プログラミング言語X入門」を買って読むよりこの本を買って読んだ方が遥かに良いと思っている。
・・・・・・いや、実際、10,000円超えの本を薦めるのは心苦しい、って事はあるんだけど、一方、プログラミング入門書が3,000円します、なんつーのは珍しくない。そして先にも書いたけど「言語X入門」を買って読了してもプログラムが書けるようにはならんのだ・・・結果、追加でアレ買ってコレ買って・・・なんてやってたら簡単に10,000円なんざ超えるだろう。
それで言うと「実用Common Lisp」なら「一冊で済む」のだ。何度も言うが、これ程強力な本はない。

そして総覧的な使い方、に付いてはここで書いた。「辞書的に使いたい」いや、むしろ「使うべきだ」と思うし、どう拾い読みするのか、の手がかりとしてここでネタの大まかな分類をしたのである。

  • ANSI Common Lisp入門 -> 第1章、第2章、第3章、第24章、第25章
  • 人工知能プログラムの実例:
    1. エキスパートシステム -> 第4章、第16章
    2. 人工無能/対話ソフトウェア -> 第5章
    3. 数式処理システム -> 第7章、第8章、第15章
  • プログラミング言語の実装:
    1. Prolog -> 第11章、第12章、第14章
    2. Scheme -> 第22章、第23章
  • ゲームの実装 -> 第18章
  • 自然言語解析 -> 第19章、第20章、第21章
  • ソフトウェア最適化等の小ネタ -> 第6章、第9章、第10章、第13章、第17章

※1: 実際はポンもエアホッケーも同時期(1972年)に登場している。
結局アイディア的には似通ってたが、片方は物理的に、もう片方は電子的に実装した、と言う事だ。
不思議な偶然もあったものである。


※2: 実はネタバラシをすると、Land of Lispと言う本も「ゲームを書こうぜ」と言う本ではない。本当は、ゲームと言う題材を取り扱うように見せかけて、大きなテーマは「探索技術とその周辺」と言う、コンピュータサイエンスに於ける重要なトピックを取り上げて伝えようとしている。
  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最近の「プログラミング」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事