本のまえがき

序章 はじめに

LISPは冗談に「計算機を誤用するための最も賢い方法」であるといわれてきた.この描写は大変な賛辞であると私は思う.この言葉によって LISPの持つ完全に自由な雰囲気が伝わってくるからである.――― LISPは,我々の最も才能のある人々が,以前は不可能であった試行を行う手助けをしてきたのである.

[Dijkstra, 1972](白井・片桐訳,1986

 

ハッカーにとって,簡潔さより大事なことがある.自分のやりたいことがやれることだ.プログラミング言語の歴史をふりかえってみると,「正しくない」と考えられる行いをプログラマがするのを防ぐために驚くべき程の努力が払われて来た.これは危険なほどにおこがましい計画である.プログラマが必要とするであろうことを,どうやって言語設計者はあらかじめ知ることが出来ると言うのだ?  言語設計者は,ユーザを自分のミスから守ってやらなきゃならないようなまぬけではなく,設計者が考えもしなかったようなことを実現できる天才と考えた方が良いと思う. 何をしようがまぬけは自分の足を撃つのだ.

[Paul Graham, 2001](川合訳, 2004

なぜ Common Lisp か?

この書籍では, Common Lispを用いて人工知能プログラミングの基礎から簡単な応用までを学ぶ.なぜ人工知能プログラミングに Common Lispかといえば,それが人工知能を学ぶのに最適な計算機言語だからである.そもそも人工知能という言葉が生まれたのは, 1956年に米国ダートマス大学で行われた会議と言われている.そこで John McCarthy は IPLという言語で書かれた Logic Theoristというはじめての人工知能プログラムを見た.それをきっかけとして, McCarthyが IPLと似た人工知能用の言語を学生と一緒に開発したのが Lispである.その後,米国では主に Lispをベースに,多くの人工知能システムが開発され,コミュニティに広がっていったが,インターネットの発達につれてそれらのプログラムがアノニマスFTPによって公開されるようになった.そのあたりの事情は人工知能学会誌記事「人工知能用言語 Lisp の今と将来」(2009年,拙共著)に詳しいが,いずれにしてもその結果,出版された多くの人工知能の教科書で, Lispによるプログラムコードが掲載された.1980年は産業界におけるAIブームを目前にしていたが,AIコミュニティが商業化直前のソフトウェアの著作権についてあまりうるさくなかった時代のことである.そういうわけで,今日でも人工知能のプログラムコードを何か参照しようとすると,圧倒的に Lispで書かれたものが多く,実際に動く人工知能システムを作ろうとすれば, Lispを学ぶのが一番手っ取り早く,便利なのである.

Lispが人工知能プログラミングに向いている理由は,上記のような歴史的理由だけではない.工業製品としてのプログラムを産出するプログラミングにおいては,最初に要求仕様を確定し,次にシステム仕様を定めてからプログラミングを行うが,人工知能研究ではそれとは異なり,研究者が色々なアイデアをプログラムで実現しようと,試行錯誤的にプログラミングを行う.これを探索的プログラミングと言うが,そこで計算機言語に要求される基本的な性能は,研究者の思考を妨げないこと,やろうと思うことは計算機上でなんでも実現できるような,柔軟でかつ研究者の思考をパワーアップするようなものであることである.松岡正剛氏は言う.「高級言語(プログラミング言語)にはいろいろのものがある.[…] これらの言語の特徴は大きくは,プログラマーの愚かな行為を防ぐような言語と,プログラマーがやりたいことを何でもできるようにする言語とに分かれる.」まさに慧眼である.愚かなプログラマーでも馬鹿なことをさせないようにする言語がJavaであり,賢いプログラマーに何でもできるようにする言語が Lispなのである.

これまで最も包括的な人工知能プログラミングの教科書であった Paradigms of Artificial Intelligence Programming (頭文字をとって俗にPAIP,パイプと呼ばれる)の中で,著者である Peter Norvigは「何が Lisp を他の言語と違うようにしたのか?」として, Lispの特徴を次のように挙げた.

  • 組込みのリスト処理
  • 自動メモリ管理
  • 動的型付け
  • 第1級の関数
  • 一様な構文
  • 対話的環境
  • 拡張性
  • 歴史

リストは Lisp生来のデータ構造であり,レンガを組み合わせて作られる建物のように, Lispシステムはセルとポインタからなるリストを基礎にできている.人工知能分野では,データはグラフ構造やツリー構造であることが多いが,これらの複雑なデータ構造もリストによって実現される.自動メモリ管理とはガーベジコレクションのことであるが, Lispは最初からガーベジコレクションありきで設計され,当初からプログラマーがメモリ管理という仕事にわずらわされることはなかった.また,今では Lispにも整数,浮動小数点数,配列,文字列,ハッシュなど,色々なデータ型が備えられているが, Lispでは型は変数につくのではなくデータにつく.そして変数にはどんな型のデータでもセットすることができる.Lispは関数型言語であるが, Lisp関数は関数に与える引数になり得る.関数を引数とする関数は高階関数と呼ばれるが,それによりプログラムを抽象化してコンパクトで理解しやすいプログラムコードにすることができる.Lispの構文はものすごく単純である.最低限必要とする構文はリストであり,その意味するところは最初の要素が関数でその他はその関数の引数になるということだけである.また,関数本体のコードもリスト構造をしており, Lispのデータもリスト構造なので,プログラムがプログラムを生成して実行するというコードが簡単に書ける.Lispのマクロ機能は他の言語には見られないほど高度である.Lispのプログラムは関数の集合であるが,そのプログラミングスタイルは,対話的環境の中で比較的短いコードを関数として定義し,それを実行・デバッグするというサイクルを早く回していくというものであった.要するにこれらの特徴すべてが,プログラマーに自由を保証し,計画なしの試行錯誤をプログラミングにおいて可能にしたのである.絵を書くときキャンバスにどのように絵を書くか計画的で学生時代に比較的よい成績を収める学生は,その後伸びないと聞くが,芸術における真の創造性は試行錯誤の中からしか生まれないとすれば,同様に, Lispはプログラミングにおいて創造的プログラミングを最大限可能にする言語なのである.

誰がこの本を読むのか?

この書籍は,実際にこれから人工知能のプログラミング方法を習得しようとする人を対象に書かれている.人工知能は言うに及ばず,計算機言語や Lispによるプログラミングの経験を何ら前提とせず, Common Lispプログラミングの初歩から初めて,一人前の AIプログラマーと言えるようになることを目標としている.ただし,次章以降の内容を読み進めるにあたって,どうしてもCommon Lispの処理系を手元に用意することが必要であり, PCや Linuxについてパッケージプログラムをダウンロードしてインストールしたり,ファイルを操作したりする程度のスキルは前提としている.Lisp の発明者である McCarthyも言うように, Lispのプログラミングは2週間ほどで学べるが,既存の imperativeな計算機言語に慣れた人ほど,かえってそれが邪魔になって習得に時間がかかる傾向がある.CやC++にどっぷりつかった人は一度頭をまっさらにして本書を読み進めるよう注意されたい.

なぜこの本が必要なのか?

現在市販されていて容易に入手可能な Lispによる人工知能プログラミングの教科書は,唯一 Peter Norvigによる PAIP のみであるが,パッケージや Common Lisp Object System (CLOS)などは使われていない.また,人工知能の教科書として最も有名な Stuart J. Russell と Norvig による Artificial Intelligence, A Modern Approach (AIMA) には疑似コードがついており, AIMAホームページには疑似コードの主なものについて Common Lisp版が掲載されているが,それも同様である.つまり,いずれも Common Lispとは言っても Common Lisp the Language 第1版(CLtL1)にとどまっており, Common Lisp the Language 第2版(CLtL2)や ANSI Common Lisp に準拠して今日 AIプログラミングの教科書として右から左にすぐ通用するものは,英語まで含めても本書以外にはないという状況である.

どの Common Lisp 処理系を使うのか?

現在 Common Lisp処理系として,複数の処理系が入手可能であるが,ここでは Allegro Common Lisp(ACL)と Steel Bank Common Lisp(SBCL) を前提として話を進める.ACLは商用の Common Lispであり,本格的なアプリ開発には商用版を購入する必要があるが,日本に販売代理店もあることから,大学・研究機関や企業で利用するには便利である.読者が本書籍の内容を学ぶためは,開発元の Franz社から無料の ACL Expressをダウンロードして利用することができる.一方, SBCLはもともとフリーなオープンソースの Common Lisp処理系であり, Linuxや PCに容易にインストールして利用することができる.どちらをインストールしたらよいか分からない,あるいはどちらでもよいという方には,ここでは ACL Expressをお勧めする.どちらかといえば ACLは初心者にやさしく, SBCLはオープンソース・ソフトウェア(OSS)愛好者に適していると言えよう.この本では付録にて ACLと SBCLの両方のインストール方法をガイドしているが,全体としては初心者を対象に ACLに基づいて説明している.Emacs Lispは Common Lispではないので,本書籍のほとんどの部分で役に立たないことを注意しておく.

この本の構成

この本は第1部と第2部に分かれており,この序章も含めて Common Lispとそのプログラミングの説明を第1部に, Common Lispを用いたAIプログラミングの部分を第2部に収めた.目的別に入手しやすいように,第1部と第2部を別々に入手可能にしたが,本来は全体として一体のものであり,第1部で第2部を引用したり,逆に第2部から第1部を引用したりすることがあることを,あらかじめお断りしておく.

通常のプログラム言語では,言語機能や装備されているデータ型の説明から始まるのが通例であるが,本書では最低限の関数定義の書き方と再帰プログラミングから説明を始め, Common Lispの豊富な諸機能の説明は第12章以降に回した.その理由は, Common Lisp の言語機能のあれこれを知るよりも, Lispの本質を理解してもらうのが先決と考えるからである.Lispの Lispたる特徴を理解するのは大変であるが,それさえ掴まえてしまえば通常の言語機能などは言語仕様書などをたよりに自分で勉強することができる.Lispプログラミングを身につけるには,最初は S式と defun さえ分かればよいのである.

第1章は Lispの導入であり,付録の記述に従って Common Lispをインストールして立ち上げたところから始まる.この章ははじめて Lispにさわる人たちを対象としているので, Emacs Lispも含めて Lispに触ったことのある人は飛ばしてもかまわない.Lispの特徴である対話型の入出力と括弧の多いS式に慣れてもらうのが目的である.

第2章では関数定義の書式を学んで, Common Lispに用意されているいくつかの述語と条件式の書き方を知り,ごく簡単なプログラミングに必要な最低限の知識を知ってもらう.実施例や問題の与え方は,順番に読んでいけば少しずつ無理なく進んでいけるように,配置してある.Common Lispのプログラミング方法は知っているという方は飛ばしてもらってもかまわない.

第3章では丸々1章分を費やして,再帰プログラムの書き方を学ぶ.再帰プログラミングこそが AIプログラミングに必須の技術であり, Lispに特徴的なところであるにもかかわらず,最近の Lispの教科書はこれについてほとんど記述していない.たとえば Peter Seibel の本はこれはこれで Common Lispの教科書としては出色のものではあるが,なんと再帰についての記述がない.なぜ再帰かといえば,それが人工知能実現に必須の技術だからなのであるが,この章の問題を順にきちんと追っていけば,いままで再帰プログラミングで挫折した人も必ずクリアできるはずである.また,今では Lisp処理系も Lispでプログラムされているが,例題を見て,問題を解いていくことで,個々の Lisp関数の Lispにおける実装も類推がつくようになるはずである.Lispを理解するためにも,再帰プログラミングは重要である.なお,この章における問題のほとんどは, The Little LISPer 第1版と  WinstonによるLISPに記載のものである.

第4章は Lispの変数束縛についてである.再帰プログラミングと並んで変数束縛も,もう一つの Lispの本質である.昔の Lisp の変数束縛方式は現在なら動的束縛と呼ばれるものであり,そのために非常にわざとらしくプログラムすると, Lispをコンパイルしないで実行した場合とコンパイルして実行した場合で結果が異なるコードを書くことができて,これを FUNARG問題という名前で呼んでいた.Common Lispでは他のプログラミング言語と同様に静的束縛が基本となって,この FUNARG 問題が一掃された.これは大きな進歩であったが,動的変数も特殊変数と宣言することで作ることができて,これが非常に有効に働く場合もあり,両者をきちんと使い分けることが Lisp プログラミングでは大事である.この章では,これらの変数の異なりを理解し,特殊変数,大域変数なるものを学んで,正しく使えるようにする.ここまでが Common Lisp初級プログラミングと言っていいかもしれない.

第5章では,それまで慎重に避けてきた副作用を伴う諸関数について学ぶ.第4章まではリストとはこういったものという紙面の字面上の理解でよかったが,ここでは consセルとポインタのモデルを学んで,そのモデル上で作用する関数の使い方を学ぶ. Common Lisp は人工知能言語のアセンブラ言語とでもいうような特徴もあり,変数の参照透明性を確保した関数プログラミングもできれば,計算性能を重視した副作用を含むプログラミングもできる.両方を学ぶことで,はじめて,バグのない効率的なコーディングができるようになる.

第6章は関数を引数に取る高階関数とMAP関数についてである.今日では多くの計算機言語がラムダ式を扱えるようになってきているが, Lispこそ ハスケル B. カリーと アロンゾ・チャーチによるラムダ計算に触発されて作られた関数型言語であり,プログラミングと Common Lisp実装の至る所で関数型言語の利点が発揮されている.また,ここでは改めて複雑な Common Lispのラムダパラメータの書き方について学ぶ.この章によって自分でも高階関数を書くことができるようになる.

第7章では理解の難しい変数のエクステントという概念を学ぶ.そのために関数閉包(クロージャ)とは何かを説明する.この章は第4章の続きと考えてもらってよいが,比較的理論的な話であるため,第4章とは分離してここに置いた.

第8章はいよいよマクロである.Ruby, Python, C#など多くの言語が Lispの先進的なプログラミング機能を取り入れて発展してきたが,いまもって Lisp のみに残されている機能が Lispのマクロである.これは Cなどでいうマクロとは機能的に全く別物である.一部の人々からは嫌われている括弧の S式であるが,データとプログラムの表現を区別しない S 式だからこそ Lispのマクロは Lisp のみが実装できる機能なのである.マクロは 再帰プログラムを書けるようになった初級プログラマーが次にチャレンジしたいと思うものであり,第6章の高階関数とこの章のマクロを身につけて,立派な中級 Lisperと言える.

第9章はコンパイラについて学ぶ.と言ってもコンパイル結果として生まれるコードには立ち入らず,コンパイル時と実行時が分離されている Common Lispの特徴を理解して, eval-whenを使えるようになるのが目的である.

第10章は末尾再帰と継続とコルーチンについて学ぶ.今では特にWeb方面でSmalltalkやRubyやJava言語によっても継続のテクニックが用いられているようだが,継続はGuy Steele, Jr.がLispによってActor理論を理解しようとするなかで偶然発見されたものであり,すべての計算機言語のアイデアをはぐくむ Lisp のパワーを見せつける章である.継続は最後の第31章の Prolog で活躍する機能である.

第11章では Common Lispを使って, Schemeの REPL (Read-Eval-Print-Loop)を実装する.これにより,関数とマクロの違いや静的変数束縛と大域変数など,それまでの章で説明してきたことが Lispシステムの実装を通じてより正確に理解されるであろう.ここではPAIPの範囲を超えてSchemeにおける動的変数束縛についても紹介している.プログラムコードのほんのわずかな実装の違いで静的にも動的にもなることを実感してほしい.

第12章では,配列,文字列,シーケンスの詳細な使い方について触れる.細かい話がどうしても多くなってしまうが, Common Lispらしいところではこれらのデータの型階層について述べており,最初は型階層に注目してざっと読むだけでもよいであろう.

第13章では, Common Lispのデータ型についてさらに学ぶ.Common Lispでは自分で特有のデータ型も定義できる.deftypeの使い方を説明するが,その部分は類書にはないものかも知れない.

第14章は構造体である.Common Lispの構造体は前章で述べた Lispの型システムと統合されており,新しく構造体を作って includeを使えば CLOSと同様な型階層を形成し,しかもそれは組み込みの型と区別なく扱うことができる.

第15章は CLOSである.構造体の機能に加えて,汎化された関数概念としての総称関数とその特殊化されたものとしてのメソッドを備えたものが, Common Lispのオブジェクトシステム CLOSである.構造体と同様に CLOSオブジェクトも Common Lispの型システムに統合されている.この章ではCLOSの標準機能について学び,さらに ANSI標準ではないが主要な Common Lisp処理系には備えられているメタオブジェクト・プロトコル(MOP)について簡単に学ぶ.CLOSについてのよい教科書が英語でも手に入らない現在では,この章が価値あると判断される人も大勢いるであろう.

第16章はCommon Lisp内のもう一つの言語と呼ばれるほど,その高機能さと複雑さを有する Format文についてである.ここではその仕様を網羅的に記述するというよりも,実用上の観点から諸機能の使い方について説明を試みた.一部からの要望により,プリティ・プリントの書き方についてもここで実用的に記載した.

第17章は Loop文について説明するが,本書を自己充足的にするために記載するものであり, Peter Seibel の22章を勉強した人には余分なところであろう.

第18章として,一部からの要望により, Common Lispのコンディションシステムについて解説する.古くからあったエラーや警告の機能は,今日ではより一般化されたコンディションシステムの一部として CLOSによって構築されているが,正直に言ってコンディションシステムの使い方はいくら仕様書を読んでも分からない.なぜならばそれはCommon Lisp実装者向けに書いてあるからである.本章ではどう使うかという観点から仕様書にはない内容を盛り込んだ.

第19章として,ここまでまとまった説明をしてこなかった,多値,ストリーム,ファイルの取り扱いなどについて述べる.

第20章で最後にパッケージやモジュール機能の使い方を学ぶ.ASDF3についても簡単に触れる.Quicklispが普及してきているので,それに依存して使う分には ASDFを学ぶ必要性は薄れてきてはいるが, SBCLで自前のシステムをQuicklispで扱ったり配布しようとすると ASDFを使うことになる.この部分もなかなか類書に記載がないところである.

ここまでがCommon Lispの部分であるが,その後ろに付録としてAllegro Common Lisp free Express と SBCL のダウンロードとインストール方法を付けた.手持ちのLisp処理系がない場合にはこちらの付録を参考にして,ACL あるいは SBCL どちらかの処理系をインストールすることになる.また,よりアドバンストな話になるが,reflectiveなLispを開発したBrian Smithの提示したLispの概念モデルを紹介して,これまでどのCommon Lisp教科書でも触れられていなかった,マクロ文字とreadtableのカスタマイズ方法についても紹介する.

第1部を読み進める方法として,二通りの道がある.一つは付録のあとに章の順番に従って読み進める方法である.この方法は言ってみればアイガー北壁に登るようなもので,一般的な言語仕様に類するものは置いておいて,他言語にはないCommon Lispの理解に進む方法であり,第11章の「Lispで作るScheme」がその頂点となる.途中まで道のりは険しいけれど,他言語と異なるCommon Lispの特徴を早く掴みたいというベテランハッカーにはお勧めである.

もう一つの方法は,付録のあと第1章から第6章の高階関数まで進み,次はCommon Lisp特有の難しいところを飛ばして第12章から20章まで進むという方法である.こちらの読み方は,通常のプログラム言語の勉強方法に近い.Lisp に慣れてから,残した章を読むというのも,早くCommon Lispのプログラミングをしたいという人にとってはいい方法であろう.こちらは初心者向きであるが,アイガー北壁に登りかけたけど,大変そうだから後回しにするという方法も正しい方法である.ただし,第2部の人工知能のプログラムでは,継続などのCommon Lisp特有のプログラミング手法を利用するものもあることを注意しておく.

第21章から31章までが第2部の人工知能プログラミングの部分である.その全体の構成はほぼ歴史的順序に並んでいる.全体としては Paradigms of Artificial Intelligence Programming (PAIP)を底本にしつつも,PAIPにはないフレームシステム(第25章)や事例ベース推論(第27章)はSchank一派のものをベースにしているし,PAIPで不十分であった述語論理はSNARKの紹介になっている.

第21章は人工知能プログラミング環境と称して, PAIP と Artificial Intelligence: Modern Approach(AIMA) の Lisp環境を紹介し,次章以降で利用する各種ユーティリティ諸関数を説明する.ただし,以下の各章の人工知能プログラムでは, 各章の独立性を高めるために,PAIPやAIMAの諸関数のうち,必須のものだけを取り出して置いていることを注意しておく.

第22章は人工知能ではない俗に人工無脳と言われる Elizaプログラムである.Web上のボットや Siriのような対話機能を実装したいと思っている人には大いに参考になるであろう.

第23章は初期の人工知能システムである一般問題解決器(GPS)の紹介である.ここでは GPSの応用例として著者自身になる宇宙ロボットにおける計画実行システムを紹介している.

第24章は探索問題である.筆者自身も人工知能に取り組みだした当初思ったことであるが, AI=探索?と思われるほど,初期のAIプログラムの基本技術は要するに探索であった.ここでは深さ優先探索,幅優先探索,前向き探索,後ろ向き探索, A*アルゴリズムなど,探索の基本について学ぶ.

第25章でフレームシステムを紹介する.過去にフレームシステムとして多くのシステムが開発されてきたが,ここでは Charniak, Riesbeck, McDermott によるXRLを紹介する.

第26章はルールベースシステムである.ルールベースシステムも過去多くのシステムが開発されてきたが,ここでは確信度を導入した典型的なルールベースシステム MYCIN を紹介する.

第27章では Riesbeck と Schank による Inside Case-based Reasoning の記述に基づいて事例ベース推論について説明する.現在の Common Lispで動く事例ベース推論システムに関する教科書はここで紹介するものだけであろう.

第28章では述語論理などこれ以降の章にて基本となる単一化(ユニフィケーション)について一章を起こして説明する.

第29章では一階述語論理について説明する.述語論理プログラミングというのは人工知能の歴史の中でも比較的新しい分野である.筆者の見るところ,現在最も包括的で「生きている」述語論理プログラムは SRIが長年開発してきた SNARKではないかと思われる.そこでこの章では PAIPや AIMAのプログラムを紹介するのではなく, SNARKについて紹介する.述語論理となると,PAIPやAIMAにも不十分さが見られるからである.

第30章はプラニングである.PAIPにはプラニングの章はないし, AIMAでは章立てて説明はあるが,掲載された疑似コードに相当する実コードはどこにもない.ここではプラニングに関する優れた教科書 Ghallab, Nau, Traverso のAutomated Planning Theory and Practice の定式化に沿った筆者のプログラミング例を紹介する.

第31章は Lispで作る Prologである.この章の内容はほぼ PAIPのそれと同じである.

最後に終章において,本書籍と人工知能プログラミングについて振り返って概観し,残されているもの,現在望まれている事項やレベルとの差異を明らかにして,将来への課題とそれに対する個人的な見通しと希望も述べることにする.

最近のAIブームとCommon Lisp

2015年に本書籍の出版を思い立って執筆を開始したが,ほぼ同時に,日本でも第三次AIブームが起こり始めた.本書執筆中にも益々この動きが熱くなって,官民あげてのAIブームとなってそれが2016年の今も続いている.このブーム到来にはいくつかの要因があるが,その最大のきっかけとなったのはGoogleがディープラーニングによって大量の画像の中から猫を自動的に認識したことにある.最近ではAIとは何かという基本的な観点を抜きにして,機械学習でなければAIではないなどという極端な意見も見られるようになった.本書ではディープラーニングについては何も教えないし,ベイズ理論などの機械学習についても何も教えない.その理由には,筆者がそれらの新しいAI技術については執筆に足るものを何も持ち合わせていないということや,本書の底本となるPAIPにも記述がないということがある.しかしそれはCommon Lispがこれらの新しい技術に向いていないということを意味してはいない.現在ディープラーニングでは大量データの処理速度を求めてGPUを用いた専用ツールがもてはやされる一方で,インタープリタしかなくて計算速度に問題があるPythonベースのツールが提供されるというちぐはぐな状況が生まれている.ディープラーニングにLispが向いていないという証拠はどこにもなく,逆にLispベースのディープラーニング・ツールがPythonベースのものより早いという結果も生まれている.要するに,現在ディープラーニングとCommon Lisp両方に精通した人材がいなくて,まだCommon Lisp+ディープラーニングの技術が蓄積されていないというだけのことである.この極端な状況は早晩改善されるであろうし,本書に取り組んだ読者の中からそういう研究者が出てくることを大いに期待している.ディープラーニングでシンボルグラウンディング問題に取り組むならば,その特徴からLispで取り組むのが最適であるというのは,分かる人には即座に了解されるところである.

本書ホームページとGitHubページ

電子書籍が紙の書籍よりも優れている点には,コードをタイプ打ちすることなく,簡単にコピー&ペーストできるということがある.とは言え,本書をKindleのようなデバイスで読みつつ,パソコンに向かっている読者もいるであろう.筆者は初心者が計算機言語を学ぶにはコピペよりも手打ちしたほうがよいと信じているが,それでも第2部の人工知能プログラミングではさすがにソースコードが提供された方が何かと便利である.また第1部でも筆者の意には反するが,ソースコードを置いてほしいという読者からの要望が出てくることは目に見えている.そのため,各章に記載されるコードを置いたGitHubページを用意した.希望者は自由にダウンロードして利用されたい.

また,本書について更新情報などを提供するホームページは,以下のとおりである.PayPalで本書を購入するなどしてこちらがメールアドレスを把握している読者には,メールアドレスによるログイン可能とする.こちらのページは出版元であるオントロノミー合同会社が管理する.書籍をPayPalで購入したが本ホームページにアクセスできないという方は,info@ontononomy.co.jpまで連絡されたい.なお,本の購入サイトは http://ontolonomy.co.jp/books/ である.

また,本書を中心としたユーザ交流の場としてのホームページも用意したので, ユーザにおかれては,是非このホームページの使い道まで含めて,活用方法を探っていただきたい.こちらについて,質問,提案などなんでも,info@cl-aip.orgまで寄せられたい.