Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog...

112
Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr) 2009.4.4 勉強会

Transcript of Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog...

Page 1: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

Love! Prolog

Naruhiko OgasararaId: naruoga (@ Hatena-dialy, gmail, Twitter)

naru01 (wassr)

2009.4.4 勉強会

Page 2: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

お詫び

Page 3: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

この資料の前半部分は

別のプレゼンからの思いっきり流用

です。

Page 4: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

YouTube やSlideShare やオイラの日記で見ちゃった人すみません。

Page 5: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

しかも分量が

倍ぐらいに増えてます (^^;)

Page 6: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

さて、気を

取り直して。

Page 7: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

"My Job WentTo India" 曰く

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

Page 8: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

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

いろんなパラダイム

の言語を学べ」

Page 9: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

C++ とJava とPerl とRuby と

Python とPHP と……

Page 10: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

それ全部同じパラダイム

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

Page 11: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

違うパラダイム

Page 12: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

関数型言語とかちょっと

流行ってるよね

Page 13: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

Lisp/Schemeとか

Haskell とか

Ocamlとか

Page 14: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

でも忘れないで

Page 15: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

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

パラダイム

Page 16: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

論理型言語!

Page 17: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

1980 年代日本を席巻した

「第五世代コンピュータ

構想」

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

Page 18: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

その中心にあったのが

「人工知能 (AI)言語

Prolog 」

Page 19: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

とゆことでその魅力を

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

Page 20: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

Prologとは

Page 21: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

おフランス生まれの

小粋な言語

Page 22: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

PROgrammingIn

LOGicの略

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

Page 23: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

openSUSE で使うには

Page 24: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

有名な処理系には

SWI-Prolog とGnu-Prolog が

あります。

Page 25: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

私はSWI-Prolog

を使ってますが

理由は特にないです (^^;)

Page 26: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

インストールはOBS で

ワンクリックインストール!

Page 27: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

実行ファイルは/usr/bin/pl です。

拡張子も .pl(Perl なんぞに

負けるな! )

Page 28: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

さておき。

Page 29: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

Prolog における

プログラムとは

Page 30: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

「論理」で表現された

「知識」

Page 31: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

「知識」に問い合わせを

して答えをもらうのが

Prolog のプログラムの「実行」

Page 32: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

Page 33: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

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

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

Page 34: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

なんじゃこりゃ?

Page 35: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

順を追って説明

しましょう。

Page 36: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

基本概念 1述語 (predicate)

Page 37: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

男 ( なるひこ )↓

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

と読む

Page 38: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

一般的にはp(a

1,a

2,……,a

n)

は「 a

1,a

2,……,a

n  は

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

Page 39: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

基本概念 2事実 (fact)

Page 40: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

述語にピリオドを打てば

それが事実。

Page 41: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

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

( Prolog 内知識では)事実」

という意味

男 ( なるひこ ).

Page 42: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

基本概念 3規則 (rule)

Page 43: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

p0 :- p

1,p

2,……,p

n.

は「 p

1,p

2,……,p

nが

すべて真であればp

0 も真」という意味

Page 44: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

p0 :- p

1,p

2,……,p

n.

は「 p

1,p

2,……,p

nが

すべて真であればp

0 も真」という意味

Page 45: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

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

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

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

Page 46: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

ほいじゃまこの

「プログラム」を

実行してみましょう

Page 47: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

デモデモ

Page 48: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

事実と規則からなる

知識からゴールに適する

答えを探索してくれる

Page 49: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

では

Page 50: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

「どんな風にこのプログラムが動くか?」

Page 51: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

をお話しします。

Page 52: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

キーワードは「ユニフィケーション

(単一化 ) 」と

「バックトラック」

Page 53: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

先ほどの知識に次のゴールを投げ込んだとき

Page 54: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

男 ( なるひこ ).

男 ( まさと ).

女 ( あつこ ).

親 ( まさと , なるひこ ).

親 ( あつこ , なるひこ ).

人間 (X) :- 男 (X).

人間 (X) :- 女 (X).

父 (X,Y) :- 親 (X,Y), 男 (X).

母 (X,Y) :- 親 (X,Y), 女 (X).

?- 母 (Mother, なるひこ ).

Page 55: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

男 ( なるひこ ).

男 ( まさと ).

女 ( あつこ ).

親 ( まさと , なるひこ ).

親 ( あつこ , なるひこ ).

人間 (X) :- 男 (X).

人間 (X) :- 女 (X).

父 (X,Y) :- 親 (X,Y), 男 (X).

母 (X,Y) :- 親 (X,Y), 女 (X).

?- 親 (Mother, なるひこ ), 女 (Mother).

これがユニフィケーション

(単一化)

Page 56: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

男 ( なるひこ ).

男 ( まさと ).

女 ( あつこ ).

親 ( まさと , なるひこ ).

親 ( あつこ , なるひこ ).

人間 (X) :- 男 (X).

人間 (X) :- 女 (X).

父 (X,Y) :- 親 (X,Y), 男 (X).

母 (X,Y) :- 親 (X,Y), 女 (X).

?- 親 ( まさと , なるひこ ), 女 ( まさと ).

これは別のユニフィケーション

(単一化)

ゴール前半に対応する候補を発見

Page 57: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

男 ( なるひこ ).

男 ( まさと ).

女 ( あつこ ).

親 ( まさと , なるひこ ).

親 ( あつこ , なるひこ ).

人間 (X) :- 男 (X).

人間 (X) :- 女 (X).

父 (X,Y) :- 親 (X,Y), 男 (X).

母 (X,Y) :- 親 (X,Y), 女 (X).

?- 親 ( まさと , なるひこ ), 女 ( まさと ).

”女 (まさと )” に対応する

知識がない=問い合わせ失敗!!!

Page 58: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

男 ( なるひこ ).

男 ( まさと ).

女 ( あつこ ).

親 ( まさと , なるひこ ).

親 ( あつこ , なるひこ ).

人間 (X) :- 男 (X).

人間 (X) :- 女 (X).

父 (X,Y) :- 親 (X,Y), 男 (X).

母 (X,Y) :- 親 (X,Y), 女 (X).

?- 親 ( あつこ , なるひこ ), 女 ( あつこ ).

(2)の問い合わせは失敗したので遡って新しい解を探す

(バックトラック)

3 '

Page 59: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

男 ( なるひこ ).

男 ( まさと ).

女 ( あつこ ).

親 ( まさと , なるひこ ).

親 ( あつこ , なるひこ ).

人間 (X) :- 男 (X).

人間 (X) :- 女 (X).

父 (X,Y) :- 親 (X,Y), 男 (X).

母 (X,Y) :- 親 (X,Y), 女 (X).

?- 親 ( あつこ , なるひこ ), 女 ( あつこ ).

”女 (あつこ )” に対応する知識あり=問い合わせ

成功!!!

4’

Page 60: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

男 ( なるひこ ).

男 ( まさと ).

女 ( あつこ ).

親 ( まさと , なるひこ ).

親 ( あつこ , なるひこ ).

人間 (X) :- 男 (X).

人間 (X) :- 女 (X).

父 (X,Y) :- 親 (X,Y), 男 (X).

母 (X,Y) :- 親 (X,Y), 女 (X).

?- 母 (Mother, なるひこ ).Mother = あつこ

Page 61: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

バックトラックとユニフィケーション

がProlog の

真骨頂なのです。

Page 62: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

バックトラックをうまく使うと欲しい解を

全部得られる

Page 63: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

「失敗駆動ループ」ってのが

あるんですが時間の都合で割愛です (T_T)

Page 64: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

話変わりまして。

Page 65: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

Lispご存知な方挙手

してください!

Page 66: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

Lisp といえばList Processor

の略であり

Page 67: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

リスト処理なら任せろ!って言語ですが

Page 68: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

Prolog のリスト処理も

ちょっとすごいよ?

Page 69: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

例題1:append

二つのリストを結合する

append([1,2,3],[4,5,6],X)X = [1,2,3,4,5,6]

Page 70: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

Prolog 版: my_append([], A, A). my_append([A1|A2], B, [A1|C]) :-

my_append(A2, B, C).

Lisp 版: (defun my_append (L1 L2) (if (null L1) L2 (cons (car L1) (append (cdr L1) L2))))

Page 71: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

例題 2 :member

リストの中に要素が含まれるか調べる

member(1, [2,3,4])fail.

Page 72: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

Prolog 版: my_member(A, [A|_]). my_member(A, [_|C]) :- my_member(A, C).

Lisp 版: (defun my_member (X L) (cond ((null L) nil) ((= (car L) X) t) (t (my_member X (cdr L)))))

Page 73: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

共通点もあります。

Page 74: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

1. 再帰処理をつかっていること

Page 75: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

2. 「リストの先頭要素」と

「それ以降」という表記があること

Prolog: [A|B]Lisp: (cons (car L) (cdr L))

Page 76: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

でも Prolog にはLisp にはない特徴がある!

Page 77: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

それは!

Page 78: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

逆演算!

Page 79: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

デモデモ

Page 80: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

これはProlog の表現が

「論理的にどうある」を

記載するので

Page 81: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

逆の答えが得られるように勝手に

なってしまう!のです。

Page 82: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

さて。

Page 83: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

今まで敢えて

Page 84: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

「知識」と「事実」と

いう言葉を使ってきましたが。

Page 85: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

Prolog は知識の

論理記述だけにしか使えない

言語なの?

Page 86: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

否!

Page 87: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

今までのProlog の解釈は

「宣言的」

Page 88: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

それに対して「手続的」解釈も可能

Page 89: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

p0 :- p

1,p

2,……,p

n.

「 p1,p

2,……,p

nが

すべて真であればp

0 も真」:

宣言的解釈

Page 90: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

p0 :- p

1,p

2,……,p

n.

「 p0 という処理は

p1,p

2,……,p

nを

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

Page 91: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

宣言的に考えた方が

Prolog らしいですが

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

Page 92: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

長いですね。後もうちょいです。許してください。

Page 93: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

Prolog の人工知能言語

たる所以

Page 94: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

「自己増殖機能」

Page 95: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

自分自身で事実や規則

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

いける

Page 96: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

例えばさっきの

知識空間にこんなことを

してみましょう。

Page 97: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

?- assert( 親 ( まさと , ちかげ )).true.

?- assert((兄弟 (X,Y):- 親 (P,X), 親 (P,Y))).true.

?- 兄弟 (X, なるひこ ).X = ' なるひこ ' ;X = ' なるひこ ' ;X = ' ちかげ ' ;false.

Page 98: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

?- listing.

:- dynamic' 親 '/2.

' 親 '(' まさと ', ' ちかげ ').

...

:- dynamic'兄弟 '/2.

'兄弟 '(A, C) :-' 親 '(B, A),' 親 '(B, C).

true.

Page 99: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

assert という組み込み述語を

使うことで知識空間に

規則や知識を追加できる!

Page 100: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

つまりプログラムそのものをガンガン

拡張できる!

Page 101: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

文字列でコード作って

eval とかクソだぜクソ!

(下品でごめん)

Page 102: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

応用例:Animals

Page 103: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

質問に答えることで

どんどん動物の知識を増やしていく

コンピュータソフト

Page 104: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

例:

動物を一種類思い浮かべてください。それを当ててみましょう。

それは人間ですね? nそれはなんですか? 象象と人間を区別する質問は? 足は4本ですか?

ではもう一度。動物を一種類思い浮かべてください。それを当ててみましょう。

足は4本ですか?  yそれは象ですね?  nそれは何ですか? 馬馬と象を区別する質問は? 鼻は短いですか?

...

Page 105: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

動物と質問の知識を

assert でどんどん増やせばいいだけだから

簡単!

Page 106: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

というわりに作って

こなかったのは私の怠慢が悪いんです><

Page 107: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

あとでブログで

公開するから遊びにきてね。

Page 108: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

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

たっぷりな超高水準言語

Prolog 。

Page 109: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

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

お加えください。

Page 110: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

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

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

Page 111: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

ご清聴ありがとうございました。

Page 112: Love! Prologimage01w.seesaawiki.jp/o/e/opensuse/ee8f3dd9bb069e10.pdf · 2017-10-01 · Love! Prolog Naruhiko Ogasarara Id: naruoga (@ Hatena-dialy, gmail, Twitter) naru01 (wassr)

参考URL

SWI­Prolog GPL  の Prolog  処理系

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

インストールできるよ

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

ドキュメントも充実

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

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