Prolog

retract/1とabolish/2の違い

SWI-Prologにはグローバルメモリ上からデータを削除する組み込み述語が二つある。一つが、retract/1で、もう一つがabolish/2。例えば、まず以下のようにグローバルメモリにデータを書き込んだとき ?- assert(hoge). true. ?- listing(hoge). :- dynamic hoge…

xyzzyでprolog-mode

prolog-mode.l ver.0.0.8 コメント xyzzyでprolog-modeを探したけれど、良いのがない。そしてlispをいい加減覚えようとも思った。なのでprolog-modeを作ってみた。ただし、lispを覚えるために作ったので、ソースコードそのものは全く参考にならないとだけ言…

Prologで遅延実行

組み込み述語で「freeze(変数, 実行部分)」という述語があるらしい。この述語は遅延実行を実現してくれる。遅延実行とは、「変数の中身が決まるまで、実行部分の実行はお預け」という機能。 これを使うと何ができるかというと、例えば ?- Y is X*2, X=1. は…

PrologでModuleの取り扱い(1)

PrologでModuleを使っていると、Namespaceの扱いがやや面倒になります。たとえば、「data/2」というファクトを処理する述語「process_data/1」というのを、「process」と云うModuleで定義したとします。 :-module(process,[process_data/1]). process(DataNa…

Writing style(書き方テク)

しょうもないことですが、 hoge(X):- foo(X), bar(X). と言うのを、 hoge(X):- foo(X), bar(X), true. と書くようにしておけば、Emacsで書くとき、「Ctrl+k」で述語を行単位で編集しやすいです。「,」と「.」の書き換えが面倒な人へ。

Prologの述語の書き方

Prologは「実行速度遅い」、「書きにくい」*1、「古い」*2と、三重苦な言語ですが、非常に便利で面白い言語です。 *1:ただし、慣れたら書けます *2:古いけど新しいとも云う