もっと楽しむ! プログラミング言語 「豆」談義

第2回Prologをご存じですか?

官民創生の人工知能研究はムダじゃなかった!

今からおよそ30年も前の1982年。日本の通商産業省(現在の経済産業省)は、ICOT(財団法人 新世代コンピュータ開発機構)を設立し、世界に先駆けて人工知能(AI:Artificial Intelligence)を実現する第5世代コンピュータの開発を目標に掲げたプロジェクトを開始しました。

ICOTのプロジェクトは、第4世代コンピュータを一気に飛び越えて第5世代コンピュータ開発を行うという新奇性や、10年以内に人間の知能をコンピュータで実現するとした宣伝と、またこの時期は日本が半導体産業でトップに躍り出ていたことやIBMへの産業スパイ事件などの背景もあって世界的な注目を浴びました。

しかし、1992年。10年の歳月と570億円(一説には1000億)の国家予算をかけたプロジェクトは、人間の知能を実現することはおろか産業界にも何ら影響を与えず、期待はずれ感を残したまま、その幕を閉じました。

いまだに大規模失敗プロジェクトとして、IT業界の人間に語り継がれるΣ(シグマ)プロジェクトですら、最終的につぎ込んだ予算は約250億円といわれていますから、ICOTのプロジェクトのすごさがわかるというものです。

推論することができるプログラミング言語「Prolog」

さて、そのあまり評判のよろしくないICOTのプロジェクトで中核を担ったプログラミング言語が、今回取り上げる「Prolog(PROgramming in LOGic⁠⁠」です。

アメリカなどではAIを実現するための言語としてLISPが使われることが多かったのですが、自然言語の理解や知識ベースの構築などに優れていること、また、アメリカとの差別化を意図して日本はあえてPrologを選択したと言われています。

Prologは、AI分野の言語として1969年にMITのカール・ヒューイットが設計したプログラミング言語Plannerの実装であるMicro-Planner をベースに、1972年頃からカルメラウアーやコワルスキーによって開発されたフランスはマルセイユ生まれの論理型言語です。

論理型言語の論理とは、事実と規則、そして質問の3つで構成されます。論理型言語であるPrologは、述語というものでデータとデータ間の「事実」「規則」を積み上げることでプログラムを作り、プログラムに「質問」を与えることで処理を実行させ解を得ることができるのです。

百聞は一見にしかず。まずは、Prologのプログラムとプログラムへの質問がどんなものかを見てみましょう(今回のサンプルはSWI-Prologで動作確認しています⁠⁠。

たとえば「田中さんの仕事はプログラマだ」という事実をPrologの述語で記述すると以下のようになります。

job(tanaka, programmer).

この1行が記述されたプログラムに「田中さんの仕事は何ですか?」⁠仕事がプログラマなのは誰ですか」という質問をプログラムできます。

対話形式で質問する場合「?-」の後に続けて、"誰"の部分を変数X(大文字で始まる単語が変数です)にして述語を記述すればOKです。

独特なプログラムの動き!

では、実際にプログラムに質問を与えてみましょう。

1 ?- job(tanaka, X).[リターン]
X = programmer [リターン]
Yes
2 ?- job(X, programmer).[リターン]
X = tanaka [リターン]
Yes

最後に表示されている"Yes"は「質問の解を見つけたよ」という意味です。解がみつからない質問に対しては"No"が表示されます。試しに解のない質問「仕事が弁護士なのは誰ですか?」をしてみます。

3 ?-job(X, lawyer).[リターン]
No

述語は好き勝手に増やせます。⁠鈴木さんの仕事は弁護士⇒job(suzuki, lawyer).」のようにjobという述語に新しいデータを追加することができますし、⁠田中は男性⇒male(tanaka)」とか「鈴木は女性⇒female(suzuki)」と、maleやfemaleといった新しい述語を追加することも可能です。

質問から推論を導く

では、次に規則を作って、質問してみましょう。まず事実として「裕一のお父さんは裕」⁠裕二のお父さんは裕一」という事実を述語としてプログラミングします。

father(yuuichi, hiroshi).
father(yuuji, yuuichi).

この事実から「裕二のおじいちゃんは裕」ということがわかります。それは世の中に「お父さんのお父さんはおじいちゃん」という規則があるからです。その規則を述語としてプログラムに追加します。

grandfather(GC, GF) :- father(GC, F), father(F, GF).

厳密におじいちゃんといえば、母方のおじいちゃんについても述語を書く必要があるのですが、ここでは省略します。では、裕二のお父さんと、おじいちゃんが誰か、プログラムに質問してみましょう。

1 ?- father(yuuji,X).[リターン]
X = yuuichi[リターン]
Yes
2 ?- grandfather(yuuji,X).[リターン]
X = hiroshi[リターン]
Yes

どうでしょう。Prologにはこのほかにもリスト処理や四則演算、標準出力などの機能をもっていますが、Prologのプログラミングの本質は、ここまで見てきたように事実と規則による述語を自分で作り出してプログラムにすることです。述語を作るだけというと何だか、一見、簡単そうに思えますが、実はコレ、結構大変です。

実行環境は簡単に手に入ります。ぜひ、⁠風が吹いたら、儲かるのは何屋?」などのさまざまな課題をPrologでプログラミングしてみてはいかがでしょうか。

おすすめ記事

記事・ニュース一覧