Prologサーバー
Prologサーバー網の構築に向けて、
・ Prologサーバーとはなにか
・ Prologサーバーの共通仕様、機能
・ プログラミング技術
・ セキュリティについて
論じましょう。
------------このスレッドは終了しました-------------- ソケットとstream通信の機構があればどんなPrologでもサーバーの
構築は簡単ですが、問題は、
サーバー側にどんな資源(述語)が定義済みであるかがわからない。
それを探るというのは現実的でない。やはり、XMLのDOMファイル
みたいなものを第一段して、送り込んでおかないとうまくいかないの
ではないか。そこら辺のプロトコルをどう設定するかですね。
以下質問ではこれこれの述語を使います。あなたのサーバーに未定義のときは
どこそこからロードしなさいとURLでも渡す。
それより、まず共通ライブラリを決めて、お互いにPrologサーバーモジュールの
中に定義することとの方が先でしょう。
Apacheの代わりにPrologでWebサーバー書いてるのだけど
そういうのはPrologサーバーって云わないの? httpプロトコルも当然ありえますね。すこし重いけど。
ブラウザもPrologで書いたらおもしろそう。
Prologは大学でして以来一度も触れてない。なつかし〜
けど利点はあるの? LISPなどもそうですが、基本的にインタプリタの系です。
例外なくどの処理系もそうなっていて、?- 以下の質問に答える、
作りになっています。
既存のプログラムもその形式に沿うように短く作られていますから、
入力と出力をソケットにするだけで、PtoPでお互いに乗り入れられます。
あえて、Prologサーバーといい、自宅サーバーのカテゴリーの
中で話題にしようとするのはそんな性質があるからです。
もう一つ追加すると、オンメモリーのリレーショナルデータベースで
あるという点も、お互いが情報を開示しあうためには最もふさわしい
系であるという根拠になるように思われます。
>>8
Prologなんてもう記憶のかなただが...
> オンメモリーのリレーショナルデータベース
これだけで十分ギャグだよ。運用できないじゃん。
Prolog使うと楽に解ける問題はあるだろうけど、それなら
web serverをI/Fにすればよい訳で。
どうしてもやりたいなら、Prologサーバでしかできない応用例を
一つでいいから出してみな。
#クラスタリングして並列Prologエンジンなんつー化け物なら
作る意味もありそうだが、それは自宅サーバ板で話す話題じゃ
ないだろ。
> これだけで十分ギャグだよ。運用できないじゃん。
鋭いですね。実際、UNIX(LINUX)のサーバでfork()で処理すると
セッション終了とともにデータベースの書き換えが無効になってしまう。
このため、バックエンドにもう一つデータベース用のPrologを立ち上げる
ことになります。 >8 で書いたように単純にはいきませんね。
ネットワーク上でのデータの一貫性などできようはずがありません。
ただ、リレーショナルデータベースとRDBMSとは概念がずれます。
集合論に基づくデータモデルがリレーショナルデータベース、
Prologはそれを含んでいます。二項モデルや連想三つ組など
自分独自のデータモデルや環境を簡単に実現できることに
少々は意義がありましょう。
セキュリティ、信頼性とかを一切無視して、ネットワーク上で
お互いの資源にもぐりこんで使いあいましょう、という話には
Prologはぴったりですよということです。
アナーキーなネットワークのモデルを担えるかも、ということです。
>10
象牙の塔の中で言ってる分には別に構わないけど、それで何か
意味があるのかい?
一時期流行ったmobile agentも結局実用にならなかったじゃないか。
Prologインタプリタをcgiで動かす以上の意味があるとは到底思えない。 >11 うーん、実用になるかどうかですか。
参加する人がいるか、いないかでしょ。
Prologに拘るのは構造のないフラットなモデルでやりたい、という
ことです。
>9-11 実用(応用)ということになると、
Prologは記号処理言語なので、事務処理向きですね。
Adobe PhotoShopのようなソフトがPrologで書き直されることは
絶対無い。そういう意味で汎用言語とはいえないでしょう。
Prologサーバと観点からすると、スクリプト言語として、で十分
だと思います。複雑なことはいつでも書こうと思えば書ける。
>13
ということは、"Prolog Server"は不要って事だね。
単にサーバーにProlog Interpreterが載っていればOKなんだろ? >14 サーバの全てをPrologで書いてある必要はないです。
"Prolog Server"の定義がそういうものだとしたら、御免なさい、ですね。
そういう部分から議論したいと思ってこのスレを立ち上げたのですが、
私はPrologの項の形式で質問して、答えとしてPrologの項を返すことが
できれば、"Prolog Server"と考えていいと思っています。
ApacheのCGI経由でも一向に構いません。軽い重いはありますが。
項(=論理式)の形式で返せないとなるとPrologのありがたみが
でません。条件はそこです。
実は、C++やPerlで書かれていても、項の解釈ができて、
その形式で答えることができるなら、実装がどうであれ、
立派にPrologです。
>15
だからね、世の中や学術用語では、そういうのはPrologサーバとは
言わないの。
名称問題はこれでいいとして、Prologって何に向いてるの?専門用語
を使わずに説明してごらん。 >16 私は15年以上事務計算プログラムをPrologで書き続けてきている
ので、事務処理には一番だと思っています。
構造がないとか云ったのとは矛盾するかもしれませんが、
木構造で管理できる部、課、係等の情報を扱うには向いています。
本来集約演算が苦手ですが、真っ先にそういう述語から書きますから、
特に不自由することはありません。
中小企業で管理者が直接プログラミングして、可能な限り仕様書を
書かない(せない)時、圧倒的なコストパフォーマンスを発揮します。
既知のやりたいことをただ「述べれ」ばよいだけですから。
大企業向きの言語ではないですね。
*********************************************************
SMTP,POP3,TELNET,HTTPに対応したサーバをPrologで書いて複数
ノードで分散して運用していますが、世界中にそういう環境を
期待するのは現実的でないですね。
Prolog同士で、サーバ、クライアントを構成することは、
現在、ほとんどの処理系にDEMOとしてTCP/IP経由のものが
ついているので、Prologユーザはやってはみたことがあります。
しかし、外部に公開するとなると、モジュールに関する仕様、
データのロードに関する技術等、整備しておかなくてはならない
部分が多々あります。
クライアント独自のデータベースで実行されるのか、共用環境で
実行されるのか、定義域の宣言や切り替えが必要でしょう。
外部ノードの参照に関する述語自体標準はありません。
?- .... ,node101 :: testpredicate(A,B), ...
のような形式が候補に挙がるでしょうが、既にモジュール管理に
使用している処理系もありそうです。
一般にPrologクライアントから要求Pを出すときには全解探索を考慮して、
findall(P,P,L),
のように包んで要求します。上の記法を使えば node1 :: findall(P,P,L),
サーバから解のリストLが返されますから
member(X,L), でXに一つづつ解を取り出すことになります。
これが普通のやり方ですが、これを標準としてよいか。
こんなことを議論したり、確認したいということです。
自分の環境を自由に利用させることは、エロサイトを立ち上げることより
遥かに危険なことです。そんなことを相手にしてもらえるカテゴリーを
探したら、自宅サーバ以外になさそうだったのでこの板をここに
作ってみました。
自己レス
>サーバから解のリストLが返されますから
失礼、サーバから返されるのも、findall(P,P,L)です。ただし、
変数LがリストLとして具体化されています。 >>17-19
なんだか言ってる事が思いっきり眉唾物なんだが、
本当にそんなことやってるなら、論文書けよ。研究会発表
でも構わんからさ。 Prologサーバーでググったらここにきた。こんな板にこんなものがあるとは。
それにしても偏ってるというか、怪しいというか。Telnetサーバーって
なんのことかね。
でも、P2Pの感覚でPrologをお互い乗り入れるというのはおもしろい。
マジでレスすると、
こういうことをやるには、Modula-2のMonitorのような機構が必要で
けっこう難しいと思っていたが。 質問です。ここに書かれているPrologサーバーというのは
プログラム板の「Prologでまったり」スレの中にでてくる
Prolog共用データベースのことだと考えてよいのでしょうか。
はい。私はLinuxなのですが、これでTelnetか何かでPrologを
起動し、利用するとします。この環境を外部から割り込んできて
利用できるかというと、否です。利用者の主体はどうしても
このような環境にあり、共用データベースは時に登録すると
いうことになりがちですから、不本意です。しかし、これらのマルチユーザー、
マルチタスクの一つ一つが交信の対象になるためには、個々のProlog本体に
外部からの割り込みを受け入れる機構が必要になります。あるいは
Subgoalの実行ごとにSocketの着信を検査するというような仕組みが
必要かも知れません。
>>21の最後の部分はこのことだと思います。(私はModula-2を知りませんが)
このような複雑なPrologの拡張なしに、サーバーを立ち上げてみようと
いうのがここでの私のやり方です。
よくわかんないけど、メッセージをふつうに構造体で表現すればいいんじゃまいか。 構造体の解析をいちいち書かなくても良いように、
項(構造体)の解析系が強力なPrologを使いましょう
という話なのですが。 >>26
サーバーの振る舞いは
ソケットに得た情報を
1 ストリームから読み込みアトム(文字列)とする
2 そのアトムをparseしてPrologの項とする
3 この項をcallする(Lispのeval)
4 (論理変数が具体化された)項を文字列化する
5 ストリーム-ソケットを介してこの文字列を返送
となります。
受け取り項(構造体)のタイプは無限で、これに対処できて
いるのはparseのおかげということになります。
これまで、サーバーはクライアントの質問に答えるだけでした。
これを質問に対してサーバーが質問し返す仕様に変更してみましょ
%クライアント側 w3prolog/2は既に定義済みとします
対話質問(Network,Port,_質問) :-
w3prolog(Network,Port,対話(_質問,_応答)),
call(_応答).
myhostname(client1).
%サーバー側 shs/2はshellの標準出力からリストを構成する述語
対話(_質問,_応答) :-
対話応答項(_質問,_応答),
call(_質問).
対話応答項(pwd(_),(myhostname(client1),system(cal))).
pwd(X) :- shs(pwd,X).
%運用例 クライアントがclient1であることを確かめてから、
calはクライアント側資源として実行されます
?- 対話質問(server1,54211,pwd(X)).
3月 2006
日 月 火 水 木 金 土
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
X = ['/usr/prolog'].
yes.
?- クライアント側にも応答質問項/2を定義すれば
会話を継続する仕様へ変更することも簡単です。
何が書かれているのかさっぱりわかりません。
解説つきでお願いします。 >>30 このスレは、
1・・自分のProlog実行環境の他にProlog共用データベースを立てる
2・・この共用データベースに対してPrologクライアントは自由に
質問し、解を得ることができる。
3・・この質問-回答におけるメッセージ交換をPrologの項で行う。
このようなネットワークを築くための基礎について議論するところです。
>>29は質問-回答系がすでに築けているとして、
質問に対して、回答を返すほかに、サーバー側から、更に質問をプッシュし
この質問のクライアント側での実行を約束事とすることにより、
クライアントの環境に応じて、回答の条件付けをする可能性を図るものです。
たとえば、
「あなたの環境がこれこれの場合は私の回答は有効だが、そうでない場合は
偽と見なしなさい。」というようなアサーションなどが考えられます。
内容の解説は順次述べます。
サーバー名と質問(メソッド?)の間が::で区切られて
いますが、なぜ普通に:ではだめなのですか。
>>32
現在のPrologの規格(たとえばISO規格)では、
A:BだとAモジュールのB述語の意味となり、ここでの
サーバーの意味とは異なります。
Aをクラスと考えても、モジュールと理解しても、ノードと
解釈しても、意味的には近いと思いますが、処理系に
モジュールと先に解釈されてしまうと仮にモジュール定義
がされていなくても、エラーになってしまうのが普通です。
それで、モジュールと衝突しないようにオペレータを::に
してあります。 この環境だと、エージェントを
送り込んだり(受け入れたり)、
それを自由に移動させたりできる
ように思いますが、
ライブラリやサンプルプログラムは
ありますか。
>>34
エージェントについては詳しくありません。
一つ言えることは、イントラネットのように
管理者が端末の起動状態を完全に把握している場合は
よいのですが、このネットワークのように
何時、各ノードが電源offになるか解らない環境では
駐在型のエージェントというのは難しいのでは
ないかということです。長期間にわたり
他のノードでサンプリングを続けるためには、
そのマシン内でバッチタスクとして動作しなくては
なりません。セキュリティの問題もあり、
このようなことが安定して行えるかどうか疑問です。 サーバーに対し、
?- (reconsult(Local::File),program(Goal)).
と言う質問をすることによって、
クライアントのファイルをサーバー側にreconsultして、
指定のGoalを実行するということはできます。
このスレを立てた理由のひとつとして、
このとき、reconsultされる述語が既にサーバーに
定義されている場合の処置について規定を定めたい、
ということがあります。
つまり、現在はこの点が決まっていません。
エージェントの動作としてはこのGoalから始まる
サンプリングの中で、local(クライアント)側のサーバーに
対して蒐集したデータをassertすることで、エージェントを
送り込んだクライアントとは非同期に動作することが
できます。
>>36Goalの実行終了をクライアント側が待ち続けることになってしまいませんか。 そうですね。
述語program/1 は一般にProlog処理系は起動後の
最初の案の実行を :- program. と規定しています。
この規定を模して作った述語です。
それで、本当はprogramにしたかったのですが、
本来の述語と衝突してしまうため、利用者が自由に
この起動述語を定義できるように,program/1を
設けました。program/1はクライアントと通信して
いるスレッドに対し、子スレッドとして動作する
ようになっていて、質問Goalはこの子スレッドの
実行とは切り離されて、子スレッド起動後すぐに
終了してしまいます。Goalのなかに束縛されていない
論理変数があっても、解決されないまま、
クライアントに解として返されます。