X



トップページ自宅サーバ
196コメント82KB
Prologサーバー
0100DNS未登録さん
垢版 |
2006/04/19(水) 19:55:59ID:???
APLなどがそうだったと思うが、
素人が見ると何が書いてあるかさっぱりわからない。
達人から見るとこんな易しいものはない。

こういう言語は滅びる。Perlなどもちょっとこういう
臭いがする。
0101DNS未登録さん
垢版 |
2006/04/20(木) 08:23:05ID:???
略記法に?というものは多いが、
基本的には、
Perlはただ書けばよいだけで、
素直なものだと思うが。
0102DNS未登録さん
垢版 |
2006/04/22(土) 10:45:33ID:ENgCktJU
.NETではPrologは完全に無視されているようですが
その辺りの情報は何かありませんか。
0103DNS未登録さん
垢版 |
2006/04/22(土) 10:51:29ID:???
マイクロソフトがPrologを避けている理由や
経緯については全く知りません。内部資料と
してはその理由が記述されたものがありの
だろうから、社員が書き込んでくれると
ありがたいのですが。
0104DNS未登録さん
垢版 |
2006/04/22(土) 19:38:08ID:???
バッチ処理、Prologの負節実行をある時刻に
起動するような場合がありますね。他の
コンピュータのPrologの場合どんな手順に
なるのしょうか。
0105DNS未登録さん
垢版 |
2006/04/22(土) 19:55:13ID:???
私は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情報を付加して質問をしっぱなしの仕様です。
0106DNS未登録さん
垢版 |
2006/04/22(土) 19:56:29ID:???
concat(['chmod 777 ',F],S),

concat_atom(['chmod 777 ',F],S),
の間違いです。
0107DNS未登録さん
垢版 |
2006/04/22(土) 20:00:36ID:whEFssI9
cgi述語表現の定義も教えてください。
0110DNS未登録さん
垢版 |
2006/04/27(木) 19:32:27ID:???
この場合はそうです。
基本的にサーバーが要求するポート番号は自由です。
80を指定しているサーバーだと、多分httpを期待してる
のだろうと考えてhttpのheaderを付加して送りますね。
0112DNS未登録さん
垢版 |
2006/04/27(木) 19:38:13ID:???
遅いですw
でも、セッション数などは変わらないわけですし、
若干Headerの情報が多いという程度ですから、実際は
どんなプロトコルでも似たようなものですね。
インターネット経由の場合は。
0113DNS未登録さん
垢版 |
2006/04/27(木) 20:15:55ID:???
クライアント側でmozillaのようなブラウザを介して、
ハンドリングすると極端に遅くなりますね。
コマンドの解読はたいしたコストではないと思いますが
やはりバッファーかなんかを確保するので時間がかかる
のでしょうか。w3cなんかそんなことしてないと思うの
ですが、やはり少しかかりますね。
0114DNS未登録さん
垢版 |
2006/04/28(金) 11:45:47ID:Kl9Nx86D
socket関係が組込述語になっている処理系というと
どんなものがありますか。
0115DNS未登録さん
垢版 |
2006/04/28(金) 20:39:20ID:???
私は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
です。
0116DNS未登録さん
垢版 |
2006/04/29(土) 05:41:34ID:???
前にIF/Prologの販売は2004年で停止となったと
書きましたが、どうもヨーロッパでは販売されて
いるようです。日本のIF/PrologのB氏がそんな
ことをいっていました。
直接ヨーロッパ向けのWebサイトで購入できそうです。
ただ、個人で買うには高いですね。人に勧めるのを
躊躇する価格帯です。
0117DNS未登録さん
垢版 |
2006/06/02(金) 14:24:12ID:???
最近IF/Prologのサイトを見たが、日本SGIのマシン上では
販売を続けるらしい。日本SGIのUNIXマシンにインストール
してということなので、日本SGIの将来が不透明でこの話も
どうなるかわからない。
0118DNS未登録さん
垢版 |
2006/06/06(火) 08:57:13ID:???
GNUにPrologぐらいあるんだが。
http://pauillac.inria.fr/~diaz/gnu-prolog/

気に入らないなら、codeをcontributeしまくって、自分好み
に誘導するのがbestだよ。

...日本のprolog屋がC/C++なんて書けるはずもないか。
無意味な論文積み上げて、博士や大学教員になる事しか考えて
ないからな。
0119DNS未登録さん
垢版 |
2006/06/06(火) 09:59:03ID:???
>>118 書き込みありがとうございます。
私は研究者ではありませんが、C/C++はほとんど使わないので、
gやSWIの拡張は日本語処理の部分以外試みたことがありません。
これまで使ってきたものを取り上げることが多くなります。
SWI-Prologの利用の方が優勢だと思いますが、gprologも大学での
利用は多いはずです。これこれの処理をするには、
どんな組込述語を用意すると便利かの一覧を用意するといいのでしょうね。
0120DNS未登録さん
垢版 |
2006/06/17(土) 19:40:53ID:???
上の方の質問と応答が痛々しい程に自演臭い。
0121118
垢版 |
2006/06/18(日) 14:04:39ID:???
>120
てめー、腐れProlog屋と一緒にすると頃すぞ。
0122DNS未登録さん
垢版 |
2006/06/18(日) 18:45:34ID:???
>>121
「上の」じゃなくて「上の方の」だろ。

>>22〜64あたり、
やたら丁寧な記者みたいな質問と
やたら早い反応の返答。
どう考えても不自然だ。
0123DNS未登録さん
垢版 |
2006/06/21(水) 07:34:49ID:???
>>120 >>122
完全な自演ではありませんが、うちの社員との Q & A です。
質問者もかなりわかった人間です。
0124DNS未登録さん
垢版 |
2006/06/21(水) 07:49:43ID:???
要するに、
Prologを利用するときは同時に
共用Prologデータベースも立ち上げるべきだ、
という主張をしているスレなのです。
0125DNS未登録さん
垢版 |
2006/07/23(日) 09:32:55ID:???
実用上、特に重要と
思われる組込述語を列挙すると(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 かな
0126DNS未登録さん
垢版 |
2007/06/12(火) 11:06:22ID:???
PrologをServer+Clientで立ち上げるという趣旨には大賛成。
ただ、通信部分はPrologの項を生で送るのはどんなものか。
SOAPに変換したらどうだろう。
0127DNS未登録さん
垢版 |
2007/06/18(月) 16:21:26ID:qQekVywy
Linux上にIF/Prologで構築されているようですが、
WindowsでP#でもうまくいくでしょうか?
0128DNS未登録さん
垢版 |
2007/06/18(月) 17:17:59ID:???
およそ一年ぶりの書き込みになります。ageていただかなかったら
永久に気が付かなかったかも知れません
>>127
P# ! 知りません。3年くらい前にちらっとそんな話題が
あったような記憶があるのですが、マイクロソフトと関係が
あるのですか。
0129DNS未登録さん
垢版 |
2007/06/18(月) 17:26:07ID:???
>>126
XMLでのデータ授受は有力ではないでしょうか。
私はSOAPの詳細を知らないので気の利いたコメントは
できませんが、Prolog以外の言語に対してサーバーの
立場を取るとなると、クライアントの処理言語に対して
Prologの解析系を持てというのは現実的でないでしょう。
Prolog-XML変換はどこにでもあるのだから、Prolog側で
XML変換してあげればよい。
実際私は、XBRL(XMLベースのビジネス用通信形式テンプレート)と
Prolog項の変換の仕事をしたばかりです。
0130DNS未登録さん
垢版 |
2007/08/01(水) 04:14:37ID:???
  1980年代のProlog資料をまとめてあるサイトないかな。
0131DNS未登録さん
垢版 |
2007/10/31(水) 18:35:10ID:???
最近、Erlang との連携を始めました。TCP/IP経由で
Erlangをさらにサーバに見立てて、並列(平行)処理を
委託します。ただ今のところEUC-JPの漢字処理が
うまくいかず、Erlang側のプログラムはあまり凝った
ものが作れません。漢字処理が問題がある場合、
ソースに遡れば大概は上手くいくことが多いのですが、
Erlangはconfigure->make->make install で8時間くらい
かかる代物で、とても私が手を出せるものではありません。
0132訂正
垢版 |
2007/10/31(水) 18:48:23ID:???
ただ今のところ -> ただ、今のところ
漢字処理が問題がある場合、 -> 漢字処理に問題がある場合、
0133DNS未登録さん
垢版 |
2007/11/05(月) 12:10:17ID:???
何故にErlangが出てきたかという話をしておきます。
これはスケジューリング問題と関係があります。
Prologはスケジューリング問題の解決に最適な言語ですが、
これは「勤務表」のようなあまり、時間的な要求の厳しくない
領域を対象とした場合です。
ライン制御のような部分でのスケジューリングとなると
コードとしては洗練されたものになりますが、やはり、
GCによる遅延の問題がある。ラインの流れに追いつけなく
なる可能性があります。これを回避する方法はやはり、
その遅延が致命傷になる部分だけは切り離して、Prolog外で
処理するほかない。
そこで、Prologからのコード変換が容易で、小プロセスを
生成できて、並列による非同期処理が書きやすいErlangが
でてくる。
今のところは、Prolog/Erlang変換の研究の域をでませんが
相当に有望なのではないかと思います。
0134DNS未登録さん
垢版 |
2008/04/10(木) 12:24:36ID:???
INAP'96で日本では初めてのErlangチュートリアルが
あったのですが、当時10年の歴史がある言語なのに、
ほとんど知ってる人いなかったですね。最近の流行は
隔世の感ありです。
0135DNS未登録さん
垢版 |
2008/04/12(土) 10:46:47ID:???
Wijaという環境上に構築されるオーバーレイGHCというものが
あります。例の未踏ソフトの一つなのですが、PrologとGHCの
違いはありますが、やりたいことはたいへん似ているようです。
残念ながらうまく起動できなくて、今のところ私のサーバーと
混在できていません。今週はこれがテーマ。
0136DNS未登録さん
垢版 |
2008/04/30(水) 04:35:35ID:???
>>135
Wijaの方は進んで以内が、昨日、erlangサーバがevalしていなかったのを
ム板のErlangのスレのレスでのやりとりで、方法が分かったので書き換えて完成。
幸せ。
これまでは関数の機能番号と引数を一行づつ渡していた。functorで分解した
ような状態で。
0137DNS未登録さん
垢版 |
2008/06/05(木) 10:51:17ID:gGkN7ojL
Erlangサーバについてですが、
Prologサーバからさらに
Erlangサーバに要求をだすということですよね。
Erlangプログラムのuploadはどうやるの?

0138DNS未登録さん
垢版 |
2008/06/05(木) 12:36:10ID:???
>>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).
ディレクトリはそれぞれホームディレクトリだとして。
0139DNS未登録さん
垢版 |
2008/06/05(木) 12:37:44ID:???
すみません。
upload_and_eval(ErlangServer,ErlangModule,Eval_Function,X) :-
でした。
0140DNS未登録さん
垢版 |
2008/06/05(木) 13:06:17ID:???
書き直します。
upload_and_eval(ErlangServer,ErlangModule,Eval_Function,X) :-
  cp(ErlangModule.erl,ErlangServer::ErlangModule.erl),
  ErlangServer :: (c:c(ErlangModule) -> {ok,ErlangModule}),
  ErlangServer :: (ErlangModule:Eval_Function -> X).
0141DNS未登録さん
垢版 |
2008/06/05(木) 13:09:28ID:???
upload_and_eval(ErlangServer,ErlangModule:Eval_Function -> X) :-
  cp(ErlangModule.erl,ErlangServer::ErlangModule.erl),
  ErlangServer :: (c:c(ErlangModule) -> {ok,ErlangModule}),
  ErlangServer :: (ErlangModule:Eval_Function -> X).
の方が分かり易いか。
0142DNS未登録さん
垢版 |
2008/06/05(木) 18:14:59ID:???
>>141
コピー元は自分だからPrologサーバで
  cp(ErlangModule.erl,ErlangServer::ErlangModule.erl),
を実行すると、Prologサーバのワーキングディレクトリから
ErlangModule.erlファイルをコピーしようとするはず。
これは具合が悪いから、cpはこの述語から切り離す他ないの
ではないか。
0144DNS未登録さん
垢版 |
2008/06/06(金) 04:53:10ID:???
>>142
uload_and_eval(Myhostname,ErlangServer,ErlangModule:Eval_Function -> X) :-
  cp(Myhostname::ErlangModule.erl,ErlangServer::ErlangModule.erl),
  ErlangServer :: (c:c(ErlangModule) -> {ok,ErlangModule}),
  ErlangServer :: (ErlangModule:Eval_Function -> X).
一引数増やしました。
0145DNS未登録さん
垢版 |
2008/06/06(金) 08:28:45ID:???
Wijaの オーバレイ GHC 使ってみましたが、私のPrologサーバとはまったく違うものでした。
詳しい報告はあとで。
0146DNS未登録さん
垢版 |
2008/06/07(土) 05:50:01ID:???
upload_and_eval は長いから u_eval とする。
クライアントノードが c1
Prologサーバが p1
Erlangサーバが e1 として、c1がp1にe1へのu_eval()を委託する場合.
モジュールはmy 関数はappend/2とする。
?- p1::u_eval(c1,e1,(X は my:append([a,b],[c]))).
X = [a,b,c]
yes
p1を経由せず直接質問するなら
?- u_eval(c1,e1,(X は my:append([a,b],[c]))).
X = [a,b,c]
yes
となる。大分すっきりした。
0147DNS未登録さん
垢版 |
2008/06/07(土) 06:24:38ID:???
ErlangサーバにDownloadさせる仕様にできないか?
Erlangサーバの関数を d_eval() が モジュール erlang_server にあるとする。

?- X は e1::erlang_server:d_eval(c1,my:append([a,b],[c])).

これで良さそうだが、Erlang側でd_eval() を解析評価する時に、
append/2が先に評価されてしまって多分うまくいかない。
0148DNS未登録さん
垢版 |
2008/06/21(土) 05:49:22ID:???
コンパイルするべきモジュールを引数に分離して、しかも評価される関数を
文字列として渡してe_evalの中でさらに評価させる。

?- X は e1::erlang_server:d_eval(c1,my,"my:append([a,b],[c])").

すっきりしない。
0149DNS未登録さん
垢版 |
2008/06/21(土) 05:51:14ID:???
二回に分離して質問するところを、強引に一回に納めた感じだ。
0150DNS未登録さん
垢版 |
2008/09/19(金) 08:36:17ID:???
crontabなんかで質問を予約する場合もサーバにリクエストするんだよね。
どんなコマンドになるの?
0152DNS未登録さん
垢版 |
2008/09/19(金) 09:21:09ID:???
サーバがポート番号1212で立ち上がって入れば、
:- tell(foo),listing,told.
を定時に実行させたければ、
w3c http://localhost:1212/prolog.file?query=%3F-+tell%28foo%29+%2C+%28listin
g%29+%2C+told
という一行だけのバッチファイルを作ってこれをcrontab -e で登録すればいい。
予約は自分のマシンだが、実行は他のマシンと言う場合は、localhostが
実行マシンのドメイン名に置き換わるだけ。
0153DNS未登録さん
垢版 |
2008/09/19(金) 14:17:11ID:???
Prologインタプリタの質問で予約する。
毎日自分のマシンで12時に上記のlistingを行うには、
?- 予約(毎日,12,0,(tell(foo),listing,told)).
yes
yahooというドメイン上のサーバでlistingを行うには、
?- 予約(毎日,12,0,yahoo :: (tell(foo),listing,told)).
yes
予約自体をyahoo上のサーバにするには、
?- yahoo :: 予約(毎日,12,0,(tell(foo),listing,told)).
yes
0154DNS未登録さん
垢版 |
2008/09/19(金) 14:39:14ID:???
>>153 の場合はポート番号は明記されていないからDefault値が
使われる。ポート番号がDefault値以外の場合は、サーバを
(_ドメイン:_ポート番号) :: で表現する。
0155DNS未登録さん
垢版 |
2009/06/02(火) 15:22:52ID:???
長い間関数評価述語として"is"の代わりに"は"を使ってきました。
しかし、Erlangサーバが充実してきたため、表記法を改めて、
今後は"<-"に統一しようと思います。

?- X <- append([1],[a,b]).
X = [1,a,b];
no
ですね。
0156DNS未登録さん
垢版 |
2009/06/02(火) 15:47:01ID:???
失礼。適切でなかった。統一してというのではなく、
Erlangの変数へのunifyが "->" なので
これはPrologの評価述語であるということを明確にするため、
"<-"を採用しました。
0157DNS未登録さん
垢版 |
2009/06/07(日) 03:46:34ID:???
そもそもPrologに P->Q1;Q2 なんていう構文があるのが間違ってる。
0158DNS未登録さん
垢版 |
2009/12/02(水) 05:13:06ID:???
四人一首問題のつづきです。
そもそも、サーバーから一音、一音、取り手に送り出すのはどうすればよいか?
取り手が突っつけば簡単だがそれでは本当らしくない。
サーバーが送り出す。相手は、取り手付属のサーバー。
この取り手付属のサーバーと取り手はこの歌の一音情報を
共有する必要がある。
0159DNS未登録さん
垢版 |
2010/03/08(月) 07:04:50ID:???
Erlangを関数呼び出しする場合、
関数評価述語として「は」を使っているようだが、
単純に中置演算子 erlang とした方がいいんじゃないかな。
0160DNS未登録さん
垢版 |
2010/03/08(月) 08:26:05ID:???
>>159
_値 erlang _erlang関数 ですか。

  ...,
  A は _式1,
  B は _式2,
  C は _式3, ... ,

で、ある時 _式2 を _erlangサーバ::_モジュール:_eralang関数,
として評価する。こういう想定がありうるとするとやはり「は」に
統一されている方が好ましいように思います。erlangであるかどうかは
_erlangサーバの定義に係かってくることになります。
0161DNS未登録さん
垢版 |
2010/10/28(木) 10:07:28ID:???
サーバ 一単位あたりのプログラムサイズはどのくらいになるの?
0162DNS未登録さん
垢版 |
2010/12/13(月) 22:19:39ID:???
>>161
最小だと4MBくらいかな。
最初にスタックサイズを指定して起動するので、
そのデフォルト値をどう書き換えるかという問題に
なります。
0163DNS未登録さん
垢版 |
2011/02/28(月) 08:43:35.41ID:TEJDJ3BB
swi-prologを商用利用すると
どれぐらいお金いるんだろう?
0165DNS未登録さん
垢版 |
2011/03/03(木) 21:18:30.51ID:1LopfZ9I
>>164
そうだよなー。わかりにくいよ。
0166DNS未登録さん
垢版 |
2011/03/03(木) 21:20:24.17ID:1LopfZ9I
Non-free (open or proprietary) software can be produced using SWI-Prolog, although contributed pure GPL components cannot be used.
作成したものを公開すればOKってことなのか?
0167DNS未登録さん
垢版 |
2011/03/04(金) 12:51:31.34ID:???
この翻訳から離れて、私が勝手に理解して
いるつもりになっているものは、
利用者からソースコードの開示を求められた
時には公開しなくてはならない。というこの一点。
以前は商用でソースの開示は考え難いことだったが、
現在ではごく当たり前のこと。商用であっても、
GPL、LGPL規約に「違反しない限り」課金されることはない。
SWI-Prologもこの範囲内にあるソフトだと思う。
0169DNS未登録さん
垢版 |
2011/04/20(水) 18:05:41.58ID:???
?- prologサーバ :: 何してる(_何してる).
_何してる = 暇してる.
yes
?-
0170DNS未登録さん
垢版 |
2011/09/20(火) 05:56:36.56ID:???
Erlang が異様に流行りだしました。もう一度、PrologからErlangを呼び出す
インターフェイスの話をまとめてください。
0173DNS未登録さん
垢版 |
2012/10/17(水) 10:23:46.83ID:YFrysNEg
ム板でスレたて荒らしが現れた所為で、最近たてられたスレが全部DAT落ち処分されている。
ここのように平和なスレでも書き込むことはもちろん、時々はageておいた方がいいかも。
0174DNS未登録さん
垢版 |
2012/10/23(火) 10:15:12.27ID:???
Javascript上にPrologを建てて、
Prolog(Javascript) <-> Prolog <-> Prolog(Javascript)

という制御の勉強を復活させようと思います。
以前作っていたものは、ノートパソコンのディスククラッシュとともに
ほとんどが消え去ったので、もう一度作り直さなくてはならないから、
少し時間をください。
0175DNS未登録さん
垢版 |
2014/07/30(水) 18:51:27.65ID:???
永くIF/Prologを使ってきたこのサーバーもSWI-Prologへの引越しが近くなってきた。
0176DNS未登録さん
垢版 |
2015/02/21(土) 13:21:00.67ID:???
えっちぃ絵をリクエストすると誰かが描いてくれるかもしれない素敵なスレ【R-18】
http://hayabusa.o p e n 2ch.net/test/read.cgi/news4vip/1423739321/
0177DNS未登録さん
垢版 |
2016/11/17(木) 10:40:15.40ID:lo+7nJq0
>>152
最近のLinuxなんかだと、w3cが動かないものがあるようだ。

# w3m -debug http://localhost:1212/・・・

でよいのかな。
0178DNS未登録さん
垢版 |
2016/11/25(金) 11:07:28.04ID:???
SWI-PrologのPrologサーバのトップ

サーバ(_ポート) :-
tcpソケットの準備(_ソケット,_ポート),
接続されたらソケットを開く(_ソケット, AcceptFd, _),
tcpインタプリタ(AcceptFd).


tcpソケットの準備(_ソケット,_ポート) :-
tcp_socket(_ソケット),
tcp_bind(_ソケット, _ポート),
tcp_listen(_ソケット, 5).

接続されたらソケットを開く(AcceptFd,_ソケット,_Peer,In,Out) :-
tcp_accept(AcceptFd, _ソケット, _Peer),
tcp_open_socket(_ソケット, In, Out).


tcpインタプリタ(AcceptFd) :-
repeat,
行を読みだして実行(AcceptFd),
fail.
0179DNS未登録さん
垢版 |
2016/11/25(金) 11:12:57.76ID:???
>>178 冒頭に以下の行が入るのだった。

:- use_module(library(socket)).

サーバ(_ポート) :-
・・・
0180DNS未登録さん
垢版 |
2016/11/25(金) 11:18:10.14ID:???
% 以下つづく。本当は親タスクにassertできたりするがここでは省略。

tcpインタプリタ(AcceptFd) :-
repeat,
行を読みだして実行(AcceptFd),
fail.

行を読みだして実行(AcceptFd) :-
接続されたらソケットを開く(AcceptFd,_ソケット,_Peer,In,Out),
一行読み出し項に変換(In,_項),
インタプリタの実行(_ソケット,In,Out,_項).

インタプリタの実行(_ソケット,In,Out,_項) :-
thread_create(項を実行して結果を返す(In, Out, _項),_,[]).

項を実行して結果を返す(In, Out, _項) :-
( catch(_項,_エラー情報,エラー情報の送信(Out,_エラー情報));
_項=false),!,
情報を送信する(Out,_項),
ストリームを閉じる(In,Out).
0181DNS未登録さん
垢版 |
2016/11/25(金) 11:20:15.37ID:???
一行読み出し項に変換(In,_項,_エラー情報) :-
行入力(In,_行),
行を解析して項を得る(_行,_項,_エラー情報).

行を解析して項を得る(_行,_項,_エラー情報) :-
catch(read_term_from_atom(_行,_項,[]),_エラー情報,_項 = false).


行入力(In,_行) :-
read_line_to_codes(In,Codes),
atom_codes(_行,Codes).

エラー情報の送信(Out,_エラー情報) :-
format('~w\n',[_エラー情報]),
format(Out,'~w\n',[_エラー情報]).

情報を送信する(Out,_項) :-
項を文字列に変換する(_項,_文字列),
書き出す(Out,_文字列).

書き出す(Out,_文字列) :-
format(Out,'~w\n',[_文字列]),
flush_output(Out).

項を文字列に変換する(_項,_文字列) :-
swritef(String,'%t',[_項]),
string_to_atom(String,_文字列).

ストリームを閉じる(In,Out) :-
close(In),
close(Out).

送信項と受信項の単一化(_項,_項).

エラー発生時はfail扱い :-
fail.
0182DNS未登録さん
垢版 |
2016/11/25(金) 11:35:27.58ID:3qBnIHqR
>>178
ここの十数行がやはり大事で、ここさえ押さえれば、サーバプログラムは大丈夫。
同じく省略しているが 行を読みだして実行/1 の冒頭で GET/POST行の解析等が
来るから、ここからの分岐は実際はもう少し重くなる。Prolog項が取れてからは
単純だが、副作用として出力をどのように処理するか、クライアントとどこまで
協調するかなど、実際の設計は難しい。
0183182
垢版 |
2016/11/25(金) 11:38:00.92ID:???
「副作用としての出力をどのように処理するか」
だな。
0184DNS未登録さん
垢版 |
2016/11/26(土) 12:19:06.52ID:???
クライアントから述語呼び出しを findall(_述語,_述語,L) に一皮被せて
対話(findall(_述語,_述語,L),Q) とするという方法もある。
サーバーはLに述語の解リストを返すが、それと共にQにクライアントが
次に取るべき行動を指示する。例えば
Q に see_other('http://xxx.org/tmp/fileaaa.html') が入ってきたりする。
このQをクライアントが受け取り、call(Q) することでサーバーが用意した
htmlファイルをクライアント側のブラウザに表示できる。
0185DNS未登録さん
垢版 |
2016/11/26(土) 17:43:46.04ID:???
これでクライアントがProlog処理系である場合はうまく行く。それでは、
クライアントがChromeのようなブラウザであり、actionでサーバアドレスや
ポートを指定し、inputやselectタグで述語引数情報を送ってくる場合は
どうか。
対話の相手がブラウザてあると、対話/2もfindall/3も理解してくれない。
この場合はhtmlファイルを直接、Socketのストリームに出力する必要が
あるだろう。もしそうだとしたら、それではクライアントがProlog処理系
であるか、ブラウザであるかはどの見分ければよいのだうか。
0186DNS未登録さん
垢版 |
2016/11/26(土) 17:52:56.95ID:???
最後の行を訂正する。「ブラウザであるかをどのように見分ければ良いのだろうか」

有力な方法としてinputとタグとしてname=定義域 value= に固有のブラウザ名~
入れておくという方法がある。サーバは定義域としてget/post情報の中の
定義域キーの情報を調べて、この中に登録済みのブラウザ名を値として発見
した場合はクライアントはブラウザとして振る舞う。これが一番簡単な解決法
であろう。
0187DNS未登録さん
垢版 |
2016/12/22(木) 06:28:13.86ID:TSmzxuJg
この話よくわからないのですが、
Prologクライアントからの質問には、質問の項を解決したものを返す。
ブラウザからの質問には、たとえば Moved Temporarily ステータスで
再度参照するべきファイル名を返す。というようなことですか。
0188DNS未登録さん
垢版 |
2016/12/26(月) 23:10:43.86ID:???
>>187
基本的にはそういう話です。
ブラウザへの応答は必ずしも別ファイルに書いてから
Moved Temporarily や See Other を返すのではなく、直接
ストリーム出力するのでもよいと思います。
ここ暫くは、最も悪影響が少なくブラウザであるか、
Prologクライアントであるかを判断させるサインの出し方の
話でした。
0189DNS未登録さん
垢版 |
2018/02/19(月) 21:25:18.65ID:???
☆ 日本の、改憲を行いましょう。現在、衆議員と参議院の
両院で、改憲議員が3分の2を超えております。
『憲法改正国民投票法』、でググってみてください。国会の発議は
すでに可能です。平和は勝ち取るものです。お願い致します。☆☆
0190DNS未登録さん
垢版 |
2019/10/31(木) 09:09:25.86ID:nkUuLbOY
目下、Prologサーバーの大幅書き換え中。
EUCだったIF/Prolog版からMTF8のSWI-Prolog版への書き換え。
0191DNS未登録さん
垢版 |
2020/10/12(月) 11:21:51.81ID:IhTUfyr+
>>177 -debug ではなくて

# w3m -dump http:// ・・・

ですね。
0192DNS未登録さん
垢版 |
2020/10/12(月) 11:26:14.81ID:IhTUfyr+
>>191
SWI-Prologだと

?- www_open_url('http://・・・').

でも行くことができます。ただこの場合、多分デスクトップにWEBブラウザが表示されてしまいますね。'.
0193DNS未登録さん
垢版 |
2021/05/21(金) 04:14:27.30ID:H190obQ3
Google ChromeからSWI-Prologで書かれたサーバーから情報取得後、
表示されたHTMLファイルを<<更新>>しないとサーバー側の接続が切れないと
いう現象が発生しているのだが、何がいけないのだろうか。Firefoxでは起こらない。
0194DNS未登録さん
垢版 |
2021/05/27(木) 13:34:30.58ID:RDLrb0eI
>>193
20年も昔には、こういうトラベルが発生するとプロキシサーバーを介してやってみたりした。そうするとなぜかうまくいったり。
0195DNS未登録さん
垢版 |
2021/05/27(木) 13:35:35.17ID:RDLrb0eI
>>194
トラブルです。すみません。
0196DNS未登録さん
垢版 |
2023/09/20(水) 04:07:05.14ID:???
どんな困難も、君なら乗り越えられるよ。
レスを投稿する


ニューススポーツなんでも実況