Top Banner
春なので AI を込めて Prolog 宣伝プレゼンを 作ってきました おがさわらなるひこ naruoga at gmail, twitter, wassr, hatena @ Genesis Lightning Talks #13, Feb25 th 2009
74

GLT#13 Naruhiko Ogasawara

Jul 13, 2015

Download

Documents

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: GLT#13 Naruhiko Ogasawara

春なのでAI を込めて

Prolog 宣伝プレゼンを作ってきました

おがさわらなるひこnaruoga at gmail, twitter, wassr, hatena

@ Genesis Lightning Talks #13, Feb25th 2009

Page 2: GLT#13 Naruhiko Ogasawara

"My Job WentTo India" 曰く

Chad Flower / でびあんぐるオーム社ISBN: 4274066592

Page 3: GLT#13 Naruhiko Ogasawara

「プログラマとして生き残りたければ

いろんなパラダイム

の言語を学べ」

Page 4: GLT#13 Naruhiko Ogasawara

C++ とJava とPerl と

Ruby とPython と

PHP と……

Page 5: GLT#13 Naruhiko Ogasawara

それ全部同じパラダイム

(手続き型言語)ですから!

Page 6: GLT#13 Naruhiko Ogasawara

違うパラダイム

Page 7: GLT#13 Naruhiko Ogasawara

関数型言語とかちょっと

流行ってるよね

Page 8: GLT#13 Naruhiko Ogasawara

Lisp/Schemeとか

Haskell とか

Ocamlとか

Page 9: GLT#13 Naruhiko Ogasawara

でも忘れないで

Page 10: GLT#13 Naruhiko Ogasawara

もう一つのプログラム言語

パラダイム

Page 11: GLT#13 Naruhiko Ogasawara

論理型言語!

Page 12: GLT#13 Naruhiko Ogasawara

1980 年代日本を席巻した

「第五世代コンピュータ」

みんな忘れたがってると思うが。

Page 13: GLT#13 Naruhiko Ogasawara

その中心にあったのが

「人工知能 (AI)言語

Prolog 」

Page 14: GLT#13 Naruhiko Ogasawara

今はほとんど忘れ去れれているけれども

Page 15: GLT#13 Naruhiko Ogasawara

俺はProlog って

奴が大好き大好きなんだ!

Page 16: GLT#13 Naruhiko Ogasawara

とゆことでその魅力を

愛 (AI) を以って語ります。

Page 17: GLT#13 Naruhiko Ogasawara

Prologとは

Page 18: GLT#13 Naruhiko Ogasawara

おフランス生まれの

小粋な言語

Page 19: GLT#13 Naruhiko Ogasawara

PLOgrammingIn

LOGicの略

ホントはフランス語なんだけどそんなん知らんわ。

Page 20: GLT#13 Naruhiko Ogasawara

Prolog における

プログラムとは

Page 21: GLT#13 Naruhiko Ogasawara

「論理」で表現された

「知識」

Page 22: GLT#13 Naruhiko Ogasawara

「知識」に問い合わせを

して答えをもらうのがProlog の「実行」

Page 23: GLT#13 Naruhiko Ogasawara

Page 24: GLT#13 Naruhiko Ogasawara

男 ( なるひこ ).男 ( まさと ).女 ( あつこ ).親 ( まさと , なるひこ ).親 ( あつこ , なるひこ ).人間 (X) :- 男 (X).人間 (X) :- 女 (X).父 (X,Y) :- 親 (X,Y), 男 (X).母 (X,Y) :- 親 (X,Y), 女 (X).

誰かさんの家族構成がモロバレなのは気にしないでください。

Page 25: GLT#13 Naruhiko Ogasawara

なんじゃこりゃ?

Page 26: GLT#13 Naruhiko Ogasawara

順を追って説明

しましょう。

Page 27: GLT#13 Naruhiko Ogasawara

基本概念 1述語 (predicate)

Page 28: GLT#13 Naruhiko Ogasawara

男 ( なるひこ )↓

「なるひこ」は「男」である

と読む

Page 29: GLT#13 Naruhiko Ogasawara

一般的にはp(a

1,a

2,……,a

n)

は「 a

1,a

2,……,a

n  は

p ( という関係 ) 」と読める

Page 30: GLT#13 Naruhiko Ogasawara

Prolog ではすべての論理を

述語で表現するので

「述語論理言語」

Page 31: GLT#13 Naruhiko Ogasawara

詳しくはコンピュータ

言語意味論とか勉強してね

Robert Harper: Practical Foundations for Programming Languages. とか

Page 32: GLT#13 Naruhiko Ogasawara

基本概念 2事実 (fact)

Page 33: GLT#13 Naruhiko Ogasawara

述語にピリオドを打てば

それが事実。

Page 34: GLT#13 Naruhiko Ogasawara

「なるひこは男、というのは

( Prolog 内知識では)事実」

という意味

男 ( なるひこ ).

Page 35: GLT#13 Naruhiko Ogasawara

基本概念 3規則 (rule)

Page 36: GLT#13 Naruhiko Ogasawara

p0 :- p

1,p

2,……,p

n.

は「 p

1,p

2,……,p

nが

すべて真であればp

0 も真」という意味

Page 37: GLT#13 Naruhiko Ogasawara

「 X が男なら、X は人間」

「 X が Y の親で、 X が女なら、 X は Y の母」

人間 (X) :- 男 (X).……母 (X,Y) :- 親 (X,Y), 女 (X).

Page 38: GLT#13 Naruhiko Ogasawara

ほいじゃまこの

「プログラム」を

実行してみましょう

Page 39: GLT#13 Naruhiko Ogasawara

失敗が怖いので弱気に

結果だけコピペします (^^;)

Page 40: GLT#13 Naruhiko Ogasawara

naruhiko@naruhiko-ubuntu-s101:~/Prolog$ cat human.pl男 ( なるひこ ).男 ( まさと ).女 ( あつこ ).親 ( まさと , なるひこ ).親 ( あつこ , なるひこ ).人間 (X) :- 男 (X).人間 (X) :- 女 (X).父 (X,Y) :- 親 (X,Y), 男 (X).母 (X,Y) :- 親 (X,Y), 女 (X).naruhiko@naruhiko-ubuntu-s101:~/Prolog$ prologWelcome to SWI-Prolog (Multi-threaded, ......For help, use ?- help(Topic). or ?- apropos(Word).

?- [human].  ←  "?-" は質問受付。 [] はプログラムのロード。% human compiled 0.00 sec, 1,964 bytestrue.

Page 41: GLT#13 Naruhiko Ogasawara

?- 男 ( なるひこ ).  ← 単純な事実の確認true.  ← 真だったら true と返ってくる ( 偽だったら false)

?- 人間 (Who).  ← 人間なのはだれ? という質問 Who = ' なるひこ ' ; ";" ← は、別の答えはないの、の意味Who = ' まさと ' ;Who = ' あつこ '.

?- 父 ( まさと , なるひこ ).true.

?- 父 ( あつこ , なるひこ ).false.

?- 父 (Who, なるひこ ).Who = ' まさと ' ;false.

?- 父 ( まさと ,Who). ←  逆の質問もできてしまうWho = ' なるひこ '.

Page 42: GLT#13 Naruhiko Ogasawara

事実と規則からなる「知識」から

答えを探索してくれるのが

ポイント

Page 43: GLT#13 Naruhiko Ogasawara

Prolog は知識表現ができるって

ことは分かった

Page 44: GLT#13 Naruhiko Ogasawara

普通のプログラミングって

できないの ?

Page 45: GLT#13 Naruhiko Ogasawara

否!

Page 46: GLT#13 Naruhiko Ogasawara

今までのProlog の解釈は

「宣言的」

Page 47: GLT#13 Naruhiko Ogasawara

それに対して「手続的」

解釈も可能

Page 48: GLT#13 Naruhiko Ogasawara

p0 :- p

1,p

2,……,p

n.

「 p1,p

2,……,p

nが

すべて真であればp

0 も真」:

宣言的解釈

Page 49: GLT#13 Naruhiko Ogasawara

p0 :- p

1,p

2,……,p

n.

「 p0 という処理は

p1,p

2,……,p

nを

実行すること」:手続的解釈

Page 50: GLT#13 Naruhiko Ogasawara

宣言的に考えた方が

Prolog らしいですが

手続的な処理も書けます。

Page 51: GLT#13 Naruhiko Ogasawara

ところで

Page 52: GLT#13 Naruhiko Ogasawara

Prolog では変数への再代入は

できません。

Page 53: GLT#13 Naruhiko Ogasawara

「 X + 1 = X 」は論理的に

成り立たない!

?- X is 1 + 2.X = 3.

?- X is X + 1.ERROR: is/2: Arguments are not sufficiently instantiated.

Page 54: GLT#13 Naruhiko Ogasawara

Q:じゃ、ループって

どうやって書くの ?

Page 55: GLT#13 Naruhiko Ogasawara

A:再帰か

バックトラックです。

Page 56: GLT#13 Naruhiko Ogasawara

再帰は他の言語でも

使えるからとりあえず

飛ばします。

Page 57: GLT#13 Naruhiko Ogasawara

バックトラックとは?

Page 58: GLT#13 Naruhiko Ogasawara

失敗したときに次の答えを探しにいく

しくみ

Page 59: GLT#13 Naruhiko Ogasawara

?- 人間 (Who).  ← 人間なのはだれ? という質問 Who = ' なるひこ ' ; ";" ← は、別の答えはないの、の意味Who = ' まさと ' ;Who = ' あつこ '.

これもバックトラック";" の入力で

答えを失敗させて次の答えを探させる

Page 60: GLT#13 Naruhiko Ogasawara

「失敗駆動ループ」

Page 61: GLT#13 Naruhiko Ogasawara

探索の最後に無理矢理失敗させて

バックトラックで全ての解を得る

Page 62: GLT#13 Naruhiko Ogasawara

?- 人間 (X), write(X), nl, fail.なるひこまさとあつこfalse.

さっきの例を自動でやるとこんな感じ

Page 63: GLT#13 Naruhiko Ogasawara

ここはすごくProlog らしくて面白いんだけど時間の都合で割愛 (;_;)

Page 64: GLT#13 Naruhiko Ogasawara

その他の特徴

Page 65: GLT#13 Naruhiko Ogasawara

「超強力なリスト処理」

Page 66: GLT#13 Naruhiko Ogasawara

Lisp に負けるな!

Page 67: GLT#13 Naruhiko Ogasawara

「自己増殖機能」

Page 68: GLT#13 Naruhiko Ogasawara

自分自身で知識や事実を

(=プログラム)を拡張していける

Page 69: GLT#13 Naruhiko Ogasawara

文字列でコード作って

eval とかクソだぜクソ!

(下品でごめん)

Page 70: GLT#13 Naruhiko Ogasawara

そんなわけでエレガントかつキャッチーな機能

たっぷりな超高水準言語

Prolog 。

Page 71: GLT#13 Naruhiko Ogasawara

あなたの言語コレクションに

お加えください。

Page 72: GLT#13 Naruhiko Ogasawara

interest(prolog).love(Someone,       Something) :- engineer(Someone), interest(Something).

?- love(you, prolog).?- love(you, prolog).

Page 73: GLT#13 Naruhiko Ogasawara

ご清聴ありがとう

ございました。

Page 74: GLT#13 Naruhiko Ogasawara

参考URL

SWI­Prolog GPL  の Prolog  処理系

様々なプラットフォームに対応 Debian  系 Linux  なら apt­get install swi­prolog  で

インストールできるよ

Linux  版は X インタフェースやシェル呼出しも可

ドキュメントも充実

お気楽 Prolog プログラミング入門 日本語で書かれたチュートリアルとしてはかなりま

とまっていると思います。オススメ。