Prologサーバー
Prologサーバー網の構築に向けて、
・ Prologサーバーとはなにか
・ Prologサーバーの共通仕様、機能
・ プログラミング技術
・ セキュリティについて
論じましょう。
ちょっと説明を間違えました。
質問 ?- program(Goal). は親スレッドで実行され、
直ぐに終了します。
program(Goal) :- 並列実行(( true; Goal )).
のようなイメージでtrueだけ実行するのが親、
子でGoalが実行されます。 ネットワークについては全くの素人ですが、
このシステムでは現在どんなことが課題と
なっていますか。
>>39
さらに間違っていた。
親は子の終了を待つから、終了するのはソケット通信だけか。
エージェントが生息している間は、
親はひたすら、子の終了を待って、存在している。
ということですね。
program/1のコードを見直してみたら、
サーバから見るとここでいう親が既に子スレッドで、
直ぐにソケットに質問のまま返信してソケットを
shutdownしてしまっています。
Goalはサーバから見て子スレッドとして、
普通に負節として、実行されている。
ということでした。
program/1の特徴はソケットへ未解決の質問を
そのまま応答して、ソケット通信を終了して
いる点にあるようです。 >>40
・ 述語定義の管理の問題。
・ リアルタイムに参照できるグローバルなlistingシステム(述語辞書)。 他のノードにあるPrologの定義域に自分と共有するもの、
基底クラスというかコモンセンスといった方が良いか、
そんなものがあるかというと、これがほとんどない。
暗い霧のなかで未知の人に遭遇したとき、どうすうれば
よいかというようなレベルです。探りをいれていく。
すこしづつ質問していって、相手の世界の輪郭から掴んでいく。
これをPrologシステムにも適用したいのだが、きっかけからして
わからない。
「あなたは何に興味があるの」
こういう質問への答えを的確に準備したシステムに出会ったことが
ない。
自分が利用できる関数を他の定義域で探すということは
コンピュータサイエンスのどんなカテゴリーに入るのですか。 コンピュータサイエンスでですか。
プログラムパターンともちょっと違うし、
わかりません。 一番普通にはtmpファイルにlistingして
ダウンロードして解析ということになると
思いますが、ファイル転送はftpですか。 ftpdが起動されていることは必要条件ですね。
単なる負節起動の他に、Upload and Go も
基本動作としているので、ftpdを基本要件と
するのが最もコストがかからず、安定する
ようです。
私は自分のサイトとの通信では自前の
転送述語で済ませていますが。 >>47
それから、サーバー側でファイルに書かずに
質問として扱う、
?- node_1 :: 述語表示(hoge).
や
?- node_1 :: 述語表示(hoge,X).
も勿論あります。 >>45
情報(この場合述語定義)の類似性や変更の推移に関する記述というと、
フレームでカバーできますね。多層フレームなんて、面白そうです。
あるメソッドがあるオブジェクトに属しているというのは考えてみれば
面白くありませんから。
並列実行は可能ですか。
1) 複数サーバにたいするOR並列
2) Prologを拡張してのAND並列 >>51
2)はやっていません。KLIC上にこれと同じネットワークを
構築しようとしてみましたが、現在の所失敗しています。
1)はそういう述語はあります。ただ、遅くてあまり使い物には
なっていません。
各ノードで1秒かかる質問を用意して、4ノードに質問して、
全ての解を蒐集すると5秒くらい掛かってしまいますw
各サーバがログを取っていて、その書き込み量が膨大に
なるせいですが、解を蒐集するのに自分のノードのサーバに
assertしてもらう方式をとっているので、書き込まれているかな、
とポーリング方式で問い合わせが必要でこれにコストがかかって
しまっています。
1分くらいかかる作業を要求すれば1分15秒くらいで終了しますから、
これはりっぱなものですが、現実にはこういう計算って発生しませんね。
最初に解を返したノードのものを解とするケースでは結構有用です。
>>52
1分15秒というのは10ノードの並列時のことでした。
4ノードだと、1分4秒くらいですね。 Ajaxなどで非同期通信ということが喧伝されていますが、
このネットワークで非同期通信は可能ですか。 >>54
>>36 以下で述べているエージェントとサンプルの
送信がそれに当たります。エージェントの場合は
サーバ側で永続しますが、質問が解決したら終了する
モードだと非同期処理と見なせます。
Ajaxがメジャーな技術になるなら、これ経由で
質問できるようにすれば面白そうですね。
w3mは開発が終っているし、Javascriptも
組み込めないからだめですが、
オープンソースのこの手のブラウザ経由という
可能性はあります。 ところで話は変わりますが、10年くらい前に、
事務処理のデータエントリーのプログラムで、
サーバーが側から、エントリー側に画面をpushし、
入力を促して、非同期にこれを受け取るという
システムの構築に困難を感じた事があります。
現在は、
1) アプリケーションタスクはエントリー側のサーバーに
mozillaのremote処理を要請
2) エントリー側でブラウザに入力画面の表示
3) アブケーションタスクは自ノードサーバへの入力待ち合わせ
4) formにより、データ処理サーバ側にデータ送付
4) アプリケーションは自ノードサーバからデータ受け取り
で簡単に実現しています。 一般的RPCコールに比べて、Prologであることの
優位性は何でしょう。 >>58
Prologであること。としか言い様がないです。
・ 頑強なインタプリタ。
・ 簡素な構文。
・ 強力な構文解析力。
・ 強力なデータベース。
・ 強力な論理的記述力。
・ 構造変換など強力なメタプログラミング。
どれをとっても(MLの系統を除くと)比類ないものです。 プログラム言語は最終的には
MLとPrologの一騎打ちになるとお考えですか。 ICOTの成果でPrologで書かれたものが公開されて
ますよね。あれが、
?- prolog_aitec_lib :: hoge(_).
みたいな感じで簡単に利用できたらいいですね。
昨年限りで、AITECも完全に廃止となり、サイトも消滅。
私は、ほとんどダウンロードしてあるのですが、
アーカイブしとかなかったから、何がなんだかわからない。
ひとつふたつ余りREADMEを読まずに動いたものがあった。
ただし,4-5年前の記憶。 1980-2000年の間に上記のものや
単行本を含む文献上のPrologソースコード量は
膨大なのですが、実際に質問として使用できる
状態のものはほとんどありません。
著作権上の問題がありますが、これを可能な限り
生き返らせることに余生を捧げましょうw
>>60 >>61
本当に高水準言語一辺倒の時代なんて
くるんですかねー
K-Prologを使っているのですが、system述語を実行するとき
ストリームを切り替えてPrologの引数に単一化したいのですが
なにか方法はありませんか。 >>66
C言語インターフェイスを使って、
system/2を作る。他ない?
シェルコマンドの出力をあるファイルに
リダイレクトして、制御が返ってきたら、
plc側でopen()する。この場合、ファイル名
が固定されるから、2システム以上の並列だと
具合が悪い。
C言語インターフェイスでtmpnam/1作って
おいた方がよい。
やはり、popenは組み込み述語として欲しいね。
OSに依存する余地から、避けたいというのは
わかるけれど。 他のノードでsystemなどは実行できるのですか。
>>70
できます。できますが、そのノード(サーバー)の設計によります。
セキュリティを重視して拒否することはできます。
一般には
?- node1 :: shs(free,X).
X = [' total used free shared buffers cach
,'Mem: 512588 492600 19988 0 26800 230236',
+ buffers/cache: 235564 277024','Swap: 1044216 92760 95
6'].
のように使います。
?- node1 :: !pwd.
/usr/local/prolog
yes
?-
この場合はnode1でバッファーに書き出された/usr/local/prolog
がクライアント側画面にで表示されています。
上流は省略します。
応答のソケットはHeaderの後、
2行改行の後、変数解決済みの質問がきます。
?- findall(append([a,b],[c,d],X),
append([a,b],[c,d],X),
[append([a,b],[c,d],[a,b,c,d])]).
この後にサーバ側の>>71に書いたバッファーの内容が続きます。
それだけです。 >>71 の後の例ですと
?- findall(!pwd,!pwd,[!pwd]).
/usr1/local/prolog
がソケットの中身です。
ここでは>>29のサーバ側からのpush(対話応答)は
行っていません。 クライアント -> サーバも
最初に2行連続して改行された後の文を
質問と見なしてparseします。
2行改行されるまではHeaderであり、
何が書かれていてもよいというルールです。 文字コードのエンコーディングやReferURL情報等
一切なしですか・・・。
いや、Headerを解析してhttpプロトコルのHeaderだったら、
当然取得しておく。
何を以てプロトコルを認識するかは決めていない。 以前ム板で、PrologのユーザやベンダはPrologは
libraryをあまり作りたがらない、実際その時に
書けばよいから、作る必要がない。
と書いたら、「正規表現は作れますか」ときた。
Prologで正規表現なんて使わないよ。なんで
そんなの覚えなくちゃならないの?って答える
べきところをオタフタして答え損なったw。
正規表現は一種の言語だから論外としても、
辞書引き問題はこういうネットワークでは
結構深刻ですね。辞書、ここでは他ノードに
たいするlistingですが、これを引くコストは
ばかにならない。自分で書いた方がとどうしても
思ってしまう。
Prologの場合要約っていうのができないからね。
コード自体が要約だw >>79
つまりperlとかの方が開発効率が良いと言うことですね。
>>81
一般論としてですが、ライブラリが揃っていて、
その使い方を熟知している場合、開発効率は
高くなりますね。
ここでの文脈で言うと、知識(たとえば正規表現の
記法)を得るためのコストとプログラム作成時の
速度差の累計で評価しなくてはならないでしょう。
Javaのように言語を熟知していても、クラス名や
メソッド名が妙に長くて、効率が上がらないケースも
ありますが。Eclipseとかを駆使しない場合ですが。
Prologのような言語はライブラリ知識獲得のコストは
ゼロだということになります。常にその場でリスト処理で
済ませますから。 Prologで使う述語といえば
member,repeat,forの他には、
副文字列を切り出す part_atom
文字列(atom)をリストに変換する
atom_chars,atom_codes
それから複数のatomを結合する concat_atom
くらいのものです。
これだけで、他のインタプリタと同等の
速度で対話実行ができるわけですから、
少なくとも初心者向きなのはこちら
ということになります。 先輩
true,fail,not,open,close,read,get_char,get_code,
consult,reconsult,assert,retract,abolish
が抜けてますよw
まあ、これで全部か。
ハハハ
まだあるぞ。write,put_code,put_char
fuctor,argも使うね。
30個くらいにはすぐなっちゃう。
結構、知識がいるね。
この際、思惑抜きに使う述語をあげてみよう。
上記の他に、
integer,float,number,atom,atomic,var,compound,の型判定述語
is,=も述語だ。
predicate_typeなんかも使うことがある。
それから述語ではないが関数も覚えなくちゃ。
まあ、こんなものだが、7-8割が
member,fail,true,atom_part,concat_atomで済むか。 もしかすると一番重要な述語 system が抜けていた。
ファイルから情報を読み取るか、Prologプログラムとして、
あらかじめconsultしておくか、流儀はいろいろあるが、
基本的な組み込み述語の使用頻度はどんなプログラマでも
大差ないのがPrologの特徴かな。 結局、Prologも使いこなすにはそれなりの知識がいる、と。
達人を集めて競わせるとどの言語も生産性に差はでない。
でも、PerlとPrologくらい目指す方向が異なると、
初心者、初級者、中級者、上級者とそれぞれの段階で
生産性に差が出てくるような気がする。実証というのは
難しいだろうが、面白いテーマなのでちょっと研究してみる。 初心者: 試合開始1秒 面が決まりPrologの勝ち。
3時間で全ての機能を覚えられるからね。 いや、PerlだってCGI絡みにしなければそのくらいで説明できないか。 無限に拡がる軟体動物みたいなやつです。
無理ですね。 ム板なんかにプログラムの基本っていうことをいう人がいる。
私はプログラミングに基本なんてないと思うが、この人達の
いう基本以外、Prologのプログラミングでは使わない。
一方、Perlの方は、ぜんぶ応用という感じで、基本部分の抽出
なんてばかばかしくなる。そういう意味で大変魅力ある言語
だと思う。 つまり、Perlの場合全部「逆引き」で攻めていくって感じ? わかったから、sage進行にしてくれない。なにか恥ずかしい。 ところで >>93
>この人達のいう基本以外、Prologのプログラミング使わない。
なんか、日本語がヘンなようで。
この人達のいう基本しか、Prologのプログラミングでは使わない。
じゃないか。 考えてみると、Perlのような言語がPrologより
生産性が高い?という議論にマジで応対している
のだから、驚くべき事だ。20年前にはPrologの
生産性は群を抜いていた。Lispの倍くらいの
速度で仕上がっている感覚だった。
私はRubyくらいしか使わないが、これもしかすると
Prologといい勝負いけるんじゃないかと思うことが
ある。
ここ二十年のプログラム言語のの記法レベルの洗練は
相当なものだ。 APLなどがそうだったと思うが、
素人が見ると何が書いてあるかさっぱりわからない。
達人から見るとこんな易しいものはない。
こういう言語は滅びる。Perlなどもちょっとこういう
臭いがする。 略記法に?というものは多いが、
基本的には、
Perlはただ書けばよいだけで、
素直なものだと思うが。 .NETではPrologは完全に無視されているようですが
その辺りの情報は何かありませんか。 マイクロソフトがPrologを避けている理由や
経緯については全く知りません。内部資料と
してはその理由が記述されたものがありの
だろうから、社員が書き込んでくれると
ありがたいのですが。 バッチ処理、Prologの負節実行をある時刻に
起動するような場合がありますね。他の
コンピュータのPrologの場合どんな手順に
なるのしょうか。 私はLinuxなのでatコマンドで説明します。
第一にどこでatコマンドを切るかの選択があります。
自ノードでも可能ですし、リモートノードにatコマンド
を起動することも可能なわけです。
それから、ここでいう、Prologサーバーで負節を実行
するのか、それとも別にPrologを起動して実行するのかの
選択もあり得ます。どれも、可能で組み合わせは多岐に
渡りますが、私の方法を述べます。コードを書いてしまいましょう。
% *** user: '予約' / 3 ***
'予約'(_時,_分,Network :: _副目標) :-
'整数から文字列'(2,_時,_時文字列),
'整数から文字列'(2,_分,_分文字列),
'cgi述語表現'(Network,80,_副目標,_CGI述語表現),
tmpnam(F),
open(F,write,FO),
wr(FO,'w3c %t\n',[_CGI述語表現]),
close,
concat(['chmod 777 ',F],S),
system(S),
concat_atom(['echo "',F,'" | at ',_時文字列,_分文字列],S2),
system(S2),
! .
要するに自ノードでatコマンドを実行しています。ポート番号はここでは80。
w3cのURLにform情報を付加して質問をしっぱなしの仕様です。 concat(['chmod 777 ',F],S),
は
concat_atom(['chmod 777 ',F],S),
の間違いです。 cgi述語表現(Network,PORTNO,_述語,_CGI述語表現) :-
url述語表現(_述語,_URL述語表現),
concat_atom(['http://',Network,:,PORTNO,prolog_file,'?query=%3F-+',_URL述
語表現],_CGI述語表現),
! .
url述語表現は例の漢字コードの変換です。 この場合はそうです。
基本的にサーバーが要求するポート番号は自由です。
80を指定しているサーバーだと、多分httpを期待してる
のだろうと考えてhttpのheaderを付加して送りますね。 遅いですw
でも、セッション数などは変わらないわけですし、
若干Headerの情報が多いという程度ですから、実際は
どんなプロトコルでも似たようなものですね。
インターネット経由の場合は。 クライアント側でmozillaのようなブラウザを介して、
ハンドリングすると極端に遅くなりますね。
コマンドの解読はたいしたコストではないと思いますが
やはりバッファーかなんかを確保するので時間がかかる
のでしょうか。w3cなんかそんなことしてないと思うの
ですが、やはり少しかかりますね。 socket関係が組込述語になっている処理系というと
どんなものがありますか。
私はIF/Prologを使っていて、最初からsocketは組み込みでした。
それで、直ぐにWebプログラムが書けました。現在でも、
メーラーなどに不満な点があると、Prologで書き直してしまいます。
K-Prolog、SWI-Prolog、Visial-prologについて、ちょっと確かめて
からお答えします。
IF/Prologの組み込み述語は、
socket/3,current_socket/3,select/3,socket_accept/3,
socket_bind/2,socket_connect/2,socket_listen/1/2,socket_close/1,
socket_receive/2/3,socket_raw_receive/4/5,
socket_send/2/3,socket_shutdown/1/2,alarm/1
です。 前にIF/Prologの販売は2004年で停止となったと
書きましたが、どうもヨーロッパでは販売されて
いるようです。日本のIF/PrologのB氏がそんな
ことをいっていました。
直接ヨーロッパ向けのWebサイトで購入できそうです。
ただ、個人で買うには高いですね。人に勧めるのを
躊躇する価格帯です。 最近IF/Prologのサイトを見たが、日本SGIのマシン上では
販売を続けるらしい。日本SGIのUNIXマシンにインストール
してということなので、日本SGIの将来が不透明でこの話も
どうなるかわからない。 GNUにPrologぐらいあるんだが。
http://pauillac.inria.fr/~diaz/gnu-prolog/
気に入らないなら、codeをcontributeしまくって、自分好み
に誘導するのがbestだよ。
...日本のprolog屋がC/C++なんて書けるはずもないか。
無意味な論文積み上げて、博士や大学教員になる事しか考えて
ないからな。
>>118 書き込みありがとうございます。
私は研究者ではありませんが、C/C++はほとんど使わないので、
gやSWIの拡張は日本語処理の部分以外試みたことがありません。
これまで使ってきたものを取り上げることが多くなります。
SWI-Prologの利用の方が優勢だと思いますが、gprologも大学での
利用は多いはずです。これこれの処理をするには、
どんな組込述語を用意すると便利かの一覧を用意するといいのでしょうね。 >120
てめー、腐れProlog屋と一緒にすると頃すぞ。
>>121
「上の」じゃなくて「上の方の」だろ。
>>22〜64あたり、
やたら丁寧な記者みたいな質問と
やたら早い反応の返答。
どう考えても不自然だ。 >>120 >>122
完全な自演ではありませんが、うちの社員との Q & A です。
質問者もかなりわかった人間です。 要するに、
Prologを利用するときは同時に
共用Prologデータベースも立ち上げるべきだ、
という主張をしているスレなのです。 実用上、特に重要と
思われる組込述語を列挙すると(IF/Prologによる)
predicate_type/2
current_predicate/1
parse_atom/6
functor/3 (=..)/2
arg/3
op/3
current_op/3
clause_with_names/3
read_with_names/2 ほか入出力
system/2
findall/3
member/2
open/3
close/1
atom_chars/2
atom_code/2
unify述語( =/2 , ==/2 など )
型判定述語 socket関係述語
(= や unify関係は除外したけれど)
最も重要なのは parse_atom/6 と findall/3 かな
PrologをServer+Clientで立ち上げるという趣旨には大賛成。
ただ、通信部分はPrologの項を生で送るのはどんなものか。
SOAPに変換したらどうだろう。 Linux上にIF/Prologで構築されているようですが、
WindowsでP#でもうまくいくでしょうか? およそ一年ぶりの書き込みになります。ageていただかなかったら
永久に気が付かなかったかも知れません
>>127
P# ! 知りません。3年くらい前にちらっとそんな話題が
あったような記憶があるのですが、マイクロソフトと関係が
あるのですか。 >>126
XMLでのデータ授受は有力ではないでしょうか。
私はSOAPの詳細を知らないので気の利いたコメントは
できませんが、Prolog以外の言語に対してサーバーの
立場を取るとなると、クライアントの処理言語に対して
Prologの解析系を持てというのは現実的でないでしょう。
Prolog-XML変換はどこにでもあるのだから、Prolog側で
XML変換してあげればよい。
実際私は、XBRL(XMLベースのビジネス用通信形式テンプレート)と
Prolog項の変換の仕事をしたばかりです。 1980年代のProlog資料をまとめてあるサイトないかな。 最近、Erlang との連携を始めました。TCP/IP経由で
Erlangをさらにサーバに見立てて、並列(平行)処理を
委託します。ただ今のところEUC-JPの漢字処理が
うまくいかず、Erlang側のプログラムはあまり凝った
ものが作れません。漢字処理が問題がある場合、
ソースに遡れば大概は上手くいくことが多いのですが、
Erlangはconfigure->make->make install で8時間くらい
かかる代物で、とても私が手を出せるものではありません。 ただ今のところ -> ただ、今のところ
漢字処理が問題がある場合、 -> 漢字処理に問題がある場合、 何故にErlangが出てきたかという話をしておきます。
これはスケジューリング問題と関係があります。
Prologはスケジューリング問題の解決に最適な言語ですが、
これは「勤務表」のようなあまり、時間的な要求の厳しくない
領域を対象とした場合です。
ライン制御のような部分でのスケジューリングとなると
コードとしては洗練されたものになりますが、やはり、
GCによる遅延の問題がある。ラインの流れに追いつけなく
なる可能性があります。これを回避する方法はやはり、
その遅延が致命傷になる部分だけは切り離して、Prolog外で
処理するほかない。
そこで、Prologからのコード変換が容易で、小プロセスを
生成できて、並列による非同期処理が書きやすいErlangが
でてくる。
今のところは、Prolog/Erlang変換の研究の域をでませんが
相当に有望なのではないかと思います。 INAP'96で日本では初めてのErlangチュートリアルが
あったのですが、当時10年の歴史がある言語なのに、
ほとんど知ってる人いなかったですね。最近の流行は
隔世の感ありです。 Wijaという環境上に構築されるオーバーレイGHCというものが
あります。例の未踏ソフトの一つなのですが、PrologとGHCの
違いはありますが、やりたいことはたいへん似ているようです。
残念ながらうまく起動できなくて、今のところ私のサーバーと
混在できていません。今週はこれがテーマ。 >>135
Wijaの方は進んで以内が、昨日、erlangサーバがevalしていなかったのを
ム板のErlangのスレのレスでのやりとりで、方法が分かったので書き換えて完成。
幸せ。
これまでは関数の機能番号と引数を一行づつ渡していた。functorで分解した
ような状態で。
Erlangサーバについてですが、
Prologサーバからさらに
Erlangサーバに要求をだすということですよね。
Erlangプログラムのuploadはどうやるの?
>>137
Prologクライアントから直接呼ぶこともできます。
Prolog -> Erlang のバイナリーファイル転送は作ってないので、
そこは FTP か Samba のお世話になる。
upload_and_eval(ErlangServer,ErlangModule,Eval_Function) :-
cp(ErlangModule.erl,ErlangServer::ErlangModule.erl),
ErlangServer :: (c:c(ErlangModule) -> _),
ErlangServer :: (ErlangModule:Eval_Function -> X).
ディレクトリはそれぞれホームディレクトリだとして。
すみません。
upload_and_eval(ErlangServer,ErlangModule,Eval_Function,X) :-
でした。