SWI-Prolog
2009年 07月 28日
最近また、SWI-Prolog という Prolog 処理系で、ちょこちょこやってます。
完全に私用の、ちょこっとしたデータベースとして使っているわけですが、その過程で、ちょこちょこと汎用性の高いMy Library述語(他言語で言うところのプロシージャ)が出来上がっていくのが嬉しいです。機会があったら公開したいと思うのですが、まだ先でしょうねー。
Prologは、ある処理が失敗した時に以降に進まない、別候補で再試行する、というのが極自然な処理フローを持つ言語なので、エラー判定・回復処理とかで if 文の山を築く箇所が、だいぶ減るのが嬉しいです。論理型プログラミングとはおおよそ似つかわしくない感想かもしれないけど、高度なことをしなくても利点を享受できるケースもある、と思います。・・・やってる人が高度なことばかりやろうとするから、難しく見えると思うんですよね、アカデミックな言語って。
簡単な例だとこんな感じ。
atom(A),(Prefix='http://';Prefix='ftp://'),sub_atom(A,0,_,_,Prefix),!,何らかの処理.
変数Aのデータ型がatom(文字列みたいな型)で、なおかつ http:// または ftp:// で始まっていたら、「SomeProcess」を行う、というプログラムです。ここではまず、Prefixという変数を http:// に単一化(束縛とか代入とかみたいなもの)してから、AがPrefixの内容で始まっているかテストして、そうじゃなかったら、Prefix に ftp:// を単一化しなおして、もう一回テストしてみる、という処理になります。
; という記号は OR を表すのですが、これは処理フローそのものの「枝分かれ」を意味しているところが、他の処理系で言う論理ORとはずいぶんと違うところです。
! という記号に関しては、カットという仕組みで、面倒なのでめちゃくちゃ大雑把に言うと、「今まで通ってきた道筋は合ってるから、ここより前にはもう戻らないよ!」みたいな宣言です(汗)
atom(A),(sub_atom(A,0,_,_,'http://');sub_atom(A,0,_,_,'ftp://')),!,何らかの処理.
と書いても同じように動作します。こっちのほうが少し平易で、C言語とかに近い感じかも知れません。
他にも、インタープリタ&対話モードを備えている処理系がほぼ100%で、ちょっとしたテストをかますのが簡単だ、ということがあると思います。
例えば、ある言語でRPGのメインプログラムを組むとして、各キャラクターの能力値の種類と、それから算出される実効値や扱いを定義したとします。実際にそのメインのプログラムコードでテストが開始できれば、それでいいのですが、そうでないとき、はたして戦闘シーンのバランスはどんなものか、といったテストをするコードは、多分、Prologでなら、かなり手早く書けると思います(色気のない単なるテキスト表示ですが)。手続き型のプログラミング言語よりも、「仕様データ」を「そのまんまコード化」できる部分が目立つため、慣れにもよりますが、見通し良くしやすいのがポイントです。
場合によっては、少々面倒になると思いますが、「8ターンで終わるくらいのバランス」とか「気を使わないと25%くらいの確率で誰か1人が戦闘不能になるくらい」とか、微妙なバランスを求める逆算も組めると思います。
#
by mikamikanamiyuki
| 2009-07-28 01:29
| プログラミング