はじめに
前回,PrologでNoSQLなサーバを立てました.ソースコード中に適当な事実を幾つか定義しておいて,TCP通信で投げた質問から結果を返すようなことをやりました.これにより,データベースを簡単に作ることができ,なおかつ簡単にその結果を受け取ることができるようになりました.
一方で,現在の方法では,事実をあらかじめソースコード中に書いておかなければなりません.そのため,静的な情報しか扱えず,動的にデータの追加や削除が難しい問題がありました.
今回の記事では,Prologサーバでデータの追加や削除ができるようになるな規則を作ります.動的に事実の追加・削除ができるようになることで,一般的なデータベースと同じように扱えるようになることを目指します.
Prologでの追加と削除
サーバ側の実装は前回の記事を参考にしてください.クライアント側の実装も同じです.
Prologで事実を追加できるようにするためには,dynamic関数によって特定の述語が追加可能であることを指定します.
:- dynamic(tag/2).
例えば,上記のソースコードだと,引数が2つ存在する述語tagを,dynamicにする,という意味になります.
とりあえず,上記の状態でプログラムだけ起動して,以下のような質問を投げてみてください.
1 ?- tag(X, Y).
false,
2 ?- assertz(tag(oppai, yamada)).
true.
3 ?- tag(X, Y).
X = oppai.
Y = yamada.
最初,何もない状態なので,推論しても失敗していますが,2つ目の質問でasserta関数を使うことで,述語tagの事実を追加しています.そして,3つ目の質問で,追加できているかどうか確認しています.
例えば,サーバ側の実装で,以下のような述語を定義すると,面白いかもしれません.
% ここから上はサーバのソースコード
:- dynamic(tag/2).
add(TagName, PicName) :-
assertz(tag(TagName, PicName)).
これで,タグを追加するためのクエリが発行できるようになります.
これだけだと,タグを追加するだけの人生になってしまいますので,タグを削除するような規則も作っておきます.
:- dynamic(tag/2).
add(TagName, PicName) :-
assertz(tag(TagName, PicName)).
remove(TagName, PicName) :-
retract(tag(TagName, PicName)).
truncate(_) :-
retractall(tag(_, _)).
これで,登録した事実を削除することもできるようになりました.
例えば,この状態でクライアントを立ち上げて以下を入力すると,ちゃんと登録されているかどうか確認することができます.
add(oppai, yamada).
add(buikini, yamada).
tag(X, Y).
おわりに
今回の記事で,Prologサーバに動的に事実を追加したり削除したりする機能を実装してみました.これで少しはPrologサーバがより実用的になったのではないかと思います.
ただ,問題があるとすれば,ログとかそういうのは全く取っていないので,サーバがシャットダウンされると,せっかく登録した内容が削除されてしまうことでしょうか.この辺りは,事実を追加するついでに,ログを記録しておくようなコードを書けば実現できそうな気がします.今後の課題ですね.
ログそのものがPrologのソースコードだったりすれば,これもまた面白いんじゃないかなと思います.さしずめバックアップを取っておけるオンメモリ型のNoSQLでしょうか? 案外,頑張っておけば実用化可能になるんじゃないでしょうか.
というわけで,今回の記事はこれで終わりにしておきます.