vieweditattachhistoryswikistopchangessearchhelp

Smalltalk の 継続 で Prolog もどき

Smalltalk継続 を使うと Prolog のバックトラックっぽい動きができるのを観ていたら、本当に Prolog っぽく見えてきたので、それっぽいものを仕込んでみました。もちろん、すでにりっぱな Smalltalk 用の Prolog インタープリタが存在するので、ただのお遊びです。

http:/collab/uploads/61/PrologModoki.st

grandparent(A,B) :- parent(A,C),parent(C,B).
father(F,C) :- male(F),parent(F,C).
parent(tom,jane).
parent(tom,jim).
parent(mary,jane).
parent(jack,sam).
parent(jane.sam).
parent(jim.bob).
parent(betty,bob).
male(tom).
male(jack).
male(jim).
male(sam).
male(bob).
female(mary).
female(jane).
female(betty).
で、これらの Prolog で書かれた知識データベースを Smalltalk の継続に置き換えて(あと、失敗や、パターンマッチング、ユニフィケーションのためのいたずらを少々加えて) PrologModoki class のメソッドとして登録しました。この状態で、
PrologModoki male: #jack and: [^ true]
などとすると
?- male(#jack).
と似たような動きで true が返ります。PrologModokiVariable なんてのを作りましたので、これのインスタンスを変数代わりに用いて、
| result results |
results _ OrderedCollection new. 
PrologModoki 
	male: (result _ PrologModokiVariable new) 
	and: [results add: result value]. 
^ results
などとすると、
?- male(X).
もどきになって、
 an OrderedCollection(#tom #jack #jim #sam #bob)
が得られます。他にも、
| results result | 
results _ OrderedCollection new. 
PrologModoki 
	father: (result _ PrologModokiVariable new) 
	of: #bob 
	and: [results add: result value]. 
^ results
(ボブの父親は誰か?)とか、
| result results | 
results _ OrderedCollection new. 
PrologModoki 
	grandParent: (result _ PrologModokiVariable new) 
	of: #sam 
	and: [results add: result value]. 
^ results
(サムの祖父母は誰か?)とかできます。階乗も
| x | 
PrologModoki factorial: 100 is: (x _ PrologModoki var new) and: [^ x value]
それっぽく動いてくれているようです。--sumim

ああ、一昼夜ながめてやっと、どうやってユニフィケーションしているか理解できました。
PrologModokiVariable>>= がミソですね。
最初に比較された相手になりきってしまうとは。参りました。--SHIMADA


どこかで出ていた変数のオブジェクト化の話をふと思い出しまして、実践してみました。読みにくいコードを読んでいただいたようで、恐縮です。

挙げていただいた文献の、騎士の巡歴 を Smalltalk で解こうとしていて、Prolog みたいに失敗すると戻って再検証するほうが格好がいいなぁ…とやっているうちにこんなことになりました。無事(でもないか…(^_^;) 紆余曲折ありましたが結果的に)、解けたので悦に入っています。
PrologModoki search: 1 position: #a path: #() and: [^ true]
PrologModoki.st も、知識データベースの追加とちょっとした手直しがあったので昨夜のと差し替えてあります。--sumim



このページを編集 (3062 bytes)


Congratulations! 以下の 1 ページから参照されています。

This page has been visited 3636 times.