prologの話をしよう - cross2012・言語cross
DESCRIPTION
Clojureの話の筈でしたTRANSCRIPT
Prologの話をしよう
esehara shigeo
お前の担当は
Clojureじゃないのかよ
あわてるな、まず話を聞け
壇上の皆さん
● いわゆる「関数型言語」と総称される皆さん○ F#, Haskell
● いわゆる「オブジェクト指向言語」と総称される皆さん○ Smalltalk, Delphi
忘れられた、
プログラミング言語パラタイム
論理型
プログラミング
論理型
プログラミング といえば……
Prolog
Prologとは
● ある要素と要素の関係を記述するためのプログラミング言語○ 例: win(goo, choki).
● それらの関係から何が導き出せるかを判別し、その値を返すことが出来る○ 例: ?- win(MYHAND, choki).
■ MYHAND = goo
じゃんけんとは
● ある要素(この場合は手)に対して、何の手に勝利しているかの関係性によって勝敗が決定するゲームである○ グー→チョキ○ チョキ→パー○ パー→グー
Prologで雑に書くとこんな感じ
win(goo, choki).win(choki, par).win(par, goo).
じゃんけんのゲームで勝敗を決定するということは、じゃんけんの勝利関係の「事実」を宣言すればいいだけの筈だ
「勝つ」とは
● ある要素(この場合は手)の関係が成り立つ場合において、何の要素と結びついているかということである○ プレイヤーの手とCPUの手という組み合わせがルール
に書いてあるなら、プレイヤーの勝ち
○ CPUの手とプレイヤーの手という組み合わせがルール
に書いてあるなら、CPUの勝ち○ どっちもないなら引き分け
Prologで雑に書くとこんな感じ
judge("プレイヤー1の勝利", P1, P2) :- win(P1, P2).judge("プレイヤー2の勝利", P1, P2) :- win(P2, P1).judge("引き分け", _, _).
?- judge(X, goo, par).X = “プレイヤー2の勝利”?- judge(X, goo, goo).X= “引き分け”
ある関係性を「解くためのロジック」を排除出来るならば、そのルール自体については、「推論」で事足りる
Clojureで論理型プログラミングが出来るか?
core.logic
元ネタ・いわゆる『手習いScheme』などの一連のシリーズの一つ
じゃんけんプログラミングの
デモンストレーションと
ソースリーディング
まとめ
JavaScriptは、突然復活し、時代の寵児になった。
関数型というパラタイムも、現在復活しつつある。
LispはJVMの力を借りて、Clojureとして復活しつつある。
論理型プログラミングは
可能性があるが、その可能性はまだ見えない。
でもパラタイムがまったく違う言語を使うと、別の視点が啓かれるのでとてもいい。
LispもいいけどPrologもね☆