Prologでまったり Part3
at TECH
1:デフォルトの名無しさん
07/10/26 08:26:46
過去スレ
PrologでまったりPart 2
スレリンク(tech板)
Prolog でまったり
スレリンク(tech板)
リンク集
URLリンク(www.summa.jp)
URLリンク(bach.istc.kobe-u.ac.jp)
チュートリアル
URLリンク(www.amzi.com)
URLリンク(computing.unn.ac.uk)
URLリンク(www.intranet.csupomona.edu)
URLリンク(bach.istc.kobe-u.ac.jp)
URLリンク(www.geocities.jp)
URLリンク(www.asahi-net.or.jp)
2:デフォルトの名無しさん
07/10/26 09:09:35
2
3:デフォルトの名無しさん
07/10/26 16:18:13
最新のスレッド(Prolog) :- 3.
4:デフォルトの名無しさん
07/10/26 18:18:05
乙(1).
5:デフォルトの名無しさん
07/10/26 19:42:17
ERROR: Undefined procedure: 乙/1
6:デフォルトの名無しさん
07/10/26 23:35:24
live(乙一).
7:デフォルトの名無しさん
07/10/26 23:45:32
ERROR: Suspended writer: 乙一
8:デフォルトの名無しさん
07/10/27 04:55:15
:- 乙(>>(1)).
9:デフォルトの名無しさん
07/10/27 10:04:39
?- halt.
10:デフォルトの名無しさん
07/10/27 17:22:18
半日で(67)か。age進行のスレが多いのだな。
ちょっと質問です。
皆さんが使っているTCP/IP関連の述語を教えてください。
組込、ユーザ定義を問わず。
できれば、引数の定義域が解るといいな。
ライブラリを作ろうとか、標準化を考えようなどと
いうのではないけれど、皆さんがどのレベルまで
抽象化して使っているかは知りたい。
11:デフォルトの名無しさん
07/11/02 15:26:23
本当の意味でのPrologの第一世代は1960年生まれですね。
大学卒業時にICOTの活動が始まったという世代です。
この人達が、リタイアするのは2020年以降。ここから
Prologの再興が始まるのでしょうね。具体的には、
金も少しはあり、青春時代の思い出に浸る余裕を持った
人たちが、集まって論理プログラミングをテーマとする
会社を興す。研究会を始める。そんな動きが期待されます。
だから当分は、Prologでまったり、ですね。
12:デフォルトの名無しさん
07/11/03 00:39:09
最近prologを勉強し始めました。
疑問なのですが、prologで作ったプログラムをGUI化することはできるのでしょうか?
javaでプログラムのGUI化はしたことがあるんですが、
prologはどうやればいいのか見当もつきません。
どなたか教えて頂けませんでしょうか?
13:デフォルトの名無しさん
07/11/03 06:35:48
>>12
ISOの標準ではグラフィックについての言及はありません。したがって、
個々の処理系対応ということになります。
・ Windows環境のみですが最もグラフィック述語の完備しているのはVisualPrologでしょう
・ SWI-PrologはXPCEというグラフィックライブラリを最初に付加インストールしておけば
・ MinervaやPrologCafeといったJava系PrologはJavaのクラスを呼びだすことによって可能だと思います。
・ K-PrologだとTCK/TLのインターフェイスがあるのでこれを使うのでしょう。
write等CUI用の述語を含む定義を ?- cui2gui(foo/0). のように一発で
GUI対応のひな形に変換する述語や外部コマンドの存在は聞いたことがありません。
なお、VisualProlog,Minerva,K-Prolog は有料です。
14:デフォルトの名無しさん
07/11/03 07:26:31
SICStus-Prologやgprolog(GNU-Prolog)も広く使われていますが私は知りません。
AZ-PrologはProlog-KABA互換から発展してきたものですが、Windows版には
GUI述語があるようです。 URLリンク(www.sofnec.co.jp)
15:デフォルトの名無しさん
07/11/05 08:33:14
>>13 >>14
に代表的なProlog処理系を挙げたと思うのですが、この中で、
日本語処理が満足な水準なのは、
SWI-Prolog K-Prolog Minerva IF/Prolog(上にはない) AZ-Prolog
で他はだめですね。私にとってはこれは絶対的な条件ですから、
他のPrologは興味がありません。
16:デフォルトの名無しさん
07/11/05 14:52:44
悲しむべきお知らせ。
"PROLOG Programming for Artificail Intelligence" Ivan Bratko著の
最新版の出版が来年の五月に延びてしまいました。
17:デフォルトの名無しさん
07/11/05 17:27:20
1980年代から90年代にかけて、Prologが全盛期であったことは
大方の認めるところ。この時期に書かれたPrologの記事は
その微妙な時期的な問題から、今日Web上で参照することが
難しい。著作権、版権の問題があり、勝手に公開することは
勿論できません。しかし、これは残念なことです。
今日も、"Functional Grammer in Prolog" Simon C.Dik著と
いう本を開いてため息をついてしまいました。本を開いたら、
いきなりヒバリのさえずりが聞こえた、という例えがあり
ますが、そんな本です。ああ、こんな本を、Webが良いというなら
そこに公開してあげたいな。そっくり、タイプするくらいの
手間なら厭わないのに。残念。
Prologの本って、和書も含めて、そんな本だらけです。当時は
ちょっと馬鹿にして読まなかった本が実に工夫されて良く書けて
いる。どれも味があります。
私、もうすぐ死ぬのかな?
18:デフォルトの名無しさん
07/11/05 17:30:13
例え ではなくて 譬えか
19:デフォルトの名無しさん
07/11/06 03:57:12
>>15 で日本語処理という話がでましたが
極めて簡単な日本語処理テストの方法を書いておきます。
?- assertz((山田(_太郎) :- write(_太郎))).
yes
?- 山田(太郎).
太郎
yes
?-
この通り動けばほぼ合格とみてよいでしょう。
ただ、文字コードのある領域だけエラーになると
いう例もあったので、完全ではありません。
20:12
07/11/06 07:57:26
皆様ありがとうございます。
prologで作ったプログラムはHTMLで表示可能なのでしょうか?
現在、prologで旅行経路検索プログラムを作っているのですが、
これをWeb上でクリックや数字を入力して利用できるようにしたいのです。
やはり素人には難しいですか?
21:デフォルトの名無しさん
07/11/07 01:58:30
ラッパー被せたらなにも問題ないと思うけど、、
まあ、標準出力のはじめにヘッダー吐くようにしておけば、あとは普通に標準出力でかまわないね。
ただ、インタラクティブな操作はすこし難儀そうだ。
22:デフォルトの名無しさん
07/11/07 04:31:17
自宅サーバの場合は問題ないが、サーバがプロバイダの環境にあるときは、
サーバサイドでPrologが使えることが条件。一番簡単な方法は
CGIをPerlでやって、その中でsystem("Prolog ... ")でPrologを呼びだす。
引数の中にtmpnam(一時的なファイル名)を含めておく。
GETメソッドの入力情報はそのままQUERY_STRINGをPrologでgetenvすればよい。
Prologは受け取った情報を解析して(splitの処理)利用し、結果を ...
?- atom_append(TMPNAM,'.html',HTMLファイル名),
open(HTMLファイル名,write,Output), ... ,write(Output,'<html>\n'), ... ,write(Output,'</html>\n'),
close(Output),halt.
これで、Perl側のsystem("prolog ... ") は終了するから、
print "Location: tmpnamのURL " print ".html\n\n"
までやってそれからPerlを終了させればよい。POSTメソッドの場合は
後で。GETを使うかPOSTを使うかはあなたに主導権があるから、
一応これでできるはず。
23:デフォルトの名無しさん
07/11/07 05:10:20
QUERY_STRINGから受け取った情報はPrologで読める形式に戻す
必要がある。
使うPrologにライブラリがあれば別だが、ないと、
以下のようなパーツが必要になる。
% *** user: replace_query_2 / 3 ***
replace_query_2('2','F',/) :- ! .
replace_query_2('2','8','(') :- ! .
replace_query_2('2','9',')') :- ! .
replace_query_2('2','B',+) :- ! .
replace_query_2('2','D',-) :- ! .
replace_query_2('2','7','''') :- ! .
replace_query_2('2','7','''') :- ! .
<略>
漢字コードの変換はさらに面倒。
これは長くなるので、どうしても必要なら、
スレリンク(mysv板)
で質問してください。
24:デフォルトの名無しさん
07/11/07 05:16:29
漢字コードを極力使わないためにはHTMLファイルの
selectタグを
<select name="ekimei">
<option value="shibuya">渋谷</option>
<option value="shinjuku">新宿</option>
</select>
のように返ってくる値をローマ字に変換すればよい。
勿論inputタグは使わない。
これに徹すればPrologの解析部分は随分と楽です。
25:デフォルトの名無しさん
07/11/07 14:19:38
tuPrologがなかなかいい件
26:デフォルトの名無しさん
07/11/07 16:11:51
>>25
私は使い方が全くわからず放棄したまま。
27:23
07/11/07 16:34:28
リンクを間違えました。(答えが長くなりそうな質問は、)
スレリンク(mysv板)
でした。随分前に私が立てたスレです。ソースコードを
どんどん貼り付けて構いません。
28:デフォルトの名無しさん
07/11/07 16:43:30
>>26
まぁ単体で使っていいことはないんだけどね.
俺は自前のJavaプログラムからtuPrologの機能使ってるんだが,
かなりいい感じ.Java同士だから相性抜群てとこかな.
マニュアルもしっかりしてるところも嬉しい.
Javaから使った場合は最高(使いやすさは).
使い方はダウンロード&解凍→ 2p.jarってのが実行ファイル
これがIDEっぽい感じ.
日本語は△ってとこかな.
IDE使うと日本語は書けない.
でも,テキストエディタで書いてtuPrologで読込むと
文字化けして日本語が全部"□"になってしまうんだが,
きっちり認識されてて,実行できる.
29:デフォルトの名無しさん
07/11/07 20:10:42
>>28
ありがとう。version 2.1 が動きました。
IDE風の実行環境では、
>>19 の日本語テストは完全に動きました。
OSはRedhat9なのですが、文字コードがEUCのせいですね。
30:デフォルトの名無しさん
07/11/07 20:26:27
FedoraCore5でもやってみましたが、同じ結果となりました。
一つ気になることは Output という表示で
'太郎' となることです。
?- tell(temp),山田(太郎),told.
を実行してファイルtempを見てみるとやはり、'太郎'になっています。
'を削除するというやっかいな仕事が後に残りそうです。
31:デフォルトの名無しさん
07/11/07 20:31:09
私のFedoreCore5の環境は
# mkdir $JAVA_HOME/jre/lib/fonts/fallback
# ln -s /usr/share/fonts/japanese/TruType/*.ttf $JAVA_HOME/jre/lib/fonts/fallback/.
が掛かっています。
32:31
07/11/07 20:33:22
/TruType/ ではなく /TrueType/ ですね。
33:デフォルトの名無しさん
07/11/07 21:03:10
このtuPrologを使うと、JavaServletからPrologを
呼びだすというようなことが自在になるのでしょうか。
そうだとすると、面白いですね。
MinervaだとJavaAPIの各クラスが簡単な指定で、
Prologの述語として定義できてしまいます。
tuPrologではどうでしょうか。
34:デフォルトの名無しさん
07/11/07 22:11:18
tuPrologのサイトってこれ?
URLリンク(tuprolog.alice.unibo.it)
sourceforge逝ってもここに飛ばされるけど403なんだぜ
35:デフォルトの名無しさん
07/11/07 22:54:55
>>34
俺は
URLリンク(sourceforge.net)
でダウンロードした希ガス
>>33
サーブレットは詳しくないが,サーブレットからもいけると思うよ.
tuProlog自体がJavaだからね.
あと,マニュアルのChapter 6 Accessing Java from tuProlog
あたりにPrologからJava操作するのが載ってるような
36:34
07/11/07 23:18:43
>>35
トン
37:デフォルトの名無しさん
07/11/09 07:19:56
以下のような参照をしたい場合があります。
?- _締日@>='20070901',_締日@=<'20071031',売掛(_顧客,_締日,_前残,_入金,_売上).
これは普通のPrologインタプリタではエラーとなります。それをなんとかしたい。
という場合があるということです。
?- 売掛(_顧客,_締日,_前残,入金,売上),_締日@>='20070901',_締日@=<'20071031'.
で何故だめなのか? 外部のデータベースを参照する場合具合が悪いのです。あとの質問が
?- select * into X from 売掛,
member([_顧客,_締日,_前残,_入金,_売上],X),
_締日@>='20070901',_締日@=<'20071031'.
に変換されたとします。これですと、売掛テーブルに50万タップルあったと
するとスタックオーバーフローの危険が生じます。TCP/IP経由で
これだけのデータを受け取るのには相当の時間もかかるでしょう。それで、
?- select * into X from 売掛 where 締日>='20070901' and 締日<='20071031'.
に変換したいものです。 <以下、続く>
38:デフォルトの名無しさん
07/11/09 07:27:40
?- select * into X from 売掛 where 締日>='20070901' and 締日<='20071031',
member([_顧客,_締日,_前残,_入金,_売上],X). でしたね。memberを落としてしまいました。
後の質問から、この節を導くのが難しいのですが、最初に示したエラーに
なる質問からだとそれほど難しくありません。
基本的にはtracer(debugger) の話ですが、制約論理プログラムや遅延評価への
ヒントもすこしは含む話になります。
39:デフォルトの名無しさん
07/11/09 07:52:40
Prologの内部データベースを参照しているコードでは
?- 売掛(_顧客,_締日,_前残,入金,売上),_締日@>='20070901',_締日@=<'20071031'.
の順序であり、これを外部データベース参照用に切り替えたいという要求も
当然ありますから、難しいとは言ったけれど、この話の最後に研究してみましょう。
40:デフォルトの名無しさん
07/11/09 10:21:02
Prologでまったり-2に書いたbit誌 1986年6月号に戸村哲・小方一郎 両氏による「Prolog in Prolog」と
いう引用記事を再掲します。
solve(Var,_) :- var(Var),!,fail.
solve( !,V) :- !,cut(V).
solve(true,_) :- !,true.
solve(fail,_) :- !,fail.
solve((A,B),V) :- !,solve(A,V),(var(V),solve(B,V);nonvar(V),true).
solve((A;B),V) :- !,(solve(A,V);solve(B,V)).
solve(P,V) :- functor(P,Functor,Arg),not(predicate_type(Functor/Arg,linear)),!,cal
l(P).
solve(P,V) :- !,clause(P,Q),solve(Q,W),(nonvar(W),!,fail;true).
cut(_).
cut(cut).
これに Var @>= atom がエラーにならないように細工しましょう。
solve(fail,_) :- !,fail. の後に
solve(Var @>= X,_) :- (var(Var);var(X)),!. を挿入することで
エラーになることは回避できます。しかし、これではただtrueと解釈した
ことと変わりません。Var @>= X をどこかに保存して、後で、利用したい。
41:デフォルトの名無しさん
07/11/09 13:23:28
... , 売掛(_顧客,_締め日,_前残,_入金,_売上), ... で参照(照会の方がいいか)時、
Prologデータベースに述語定義がある場合とない場合がある。ここでは話を
わかりやすくするために、述語定義のない場合のみ扱う。
solve(P,V) :- functor(P,F,A),predicate_type(F/A,undefined),solve(# P,V),!. を
solve(P,V) :- !,clause(P,Q),solve(Q,W),(nonvar(W),!,fail;true). の上に挿入する。
そして、述語 #/1 の定義を
solve(# P,V) :- !, ここにデータベース照会のBODYが来る
solve(P,V) :- functor(P,F,A),predicate_type(F/A,undefined),solve(# P,V),!.
solve(P,V) :- !,clause(P,Q),solve(Q,W),(nonvar(W),!,fail;true).
インタプリタの定義は節の構成としてはこんな感じでよい。問題は、制約情報の渡し方だ。
そして、データベース照会述語 #/1 の定義。
結論を言ってしまえば、制約情報の伝達は assertz(制約情報(_締日 @>= '20070901'))
のような述語定義で渡すことはできない。
42:デフォルトの名無しさん
07/11/09 13:31:29
この問題の簡単な実験をする。
?- X = Y,assertz(foo(Y)),foo(Z),Z==X.
no
になる。assertz時の Y に対するリンクから foo(Z) のZは
切り離されている。ただし、間違えて、
?- X = Y,assertz(foo(Y)),foo(Z),Z=X. としないように。
後でこういう失敗の例を挙げるがX,Yとは無関係であっても、
Zは単なる変数、XやYと単一化してしまう。これだと実験にならない。
43:デフォルトの名無しさん
07/11/09 14:37:11
述語定義による変数情報の受け渡しがうまくないとすると、
引数による渡しということになる。ストリームを架ける。
全ての述語定義の第一引数にこのストリームを付加すると
いう行き方もあるが、それはしたくない。
solveの変更だけですむだろうか。
solve(V1 @>= V2,V,V1 @>= V2) :- (var(V1);var(V2)),!.
solve(# P,V,L) :- !,
solve(P,V,L) :- functor(P,F,A),predicate_type(F/A,undefined),solve(# P,V,L),!.
solve(P,V,L) :- !,clause(P,Q),solve(Q,W,L),(nonvar(W),!,fail;true).
でどうか。
これだと ?- _締日 @>= '20070901',_締日 @=< '20071031', のような場合には対応できない。
Lを重リストにする、という案がすぐに浮かぶが重リスト自体初心者には
理解しにくいので、
solve(P,V,L,L) :- functor(P,F,A),not(predicate_type(F/A,undefined)),not(predicate_type(F/A,linear)),!,call(P).
solve(V1 @>= V2,V,L1,[V1 @>= V2|L1]) :- (var(V1);var(V2)),!.
solve(# P,V,L1,L2) :- !, ここで 変数情報から where 締日 >= '20070901' and 締日 <= '20071031', を生成する
solve(P,V,L1,L2) :- functor(P,F,A),predicate_type(F/A,undefined),solve(# P,V,L1,L2),!.
solve(P,V,L1,L2) :- !,clause(P,Q),solve(Q,W,L1,L2),(nonvar(W),!,fail;true).
44:デフォルトの名無しさん
07/11/09 14:39:28
これで、solveの節定義は大体できあがり。最後に、 #/1の定義。
# _副目標 :-
_副目標 =.. [_関係表名|_引数ならび],
select cname into _属性名ならび from col where tname=_関係表名,
条件の選別(_属性名ならび,_引数ならび,_条件句候補),
( not(_条件句候補=[]),
条件句の作成(_条件句候補,_条件句),
select *
into X
from _関係表名
where _条件句;
_条件句候補=[],
select *
into X
from _関係表名
),
member(_引数ならび,X).
あとは、条件の選別/4で [_締日 @>= '20070901',_締日 @=< '20071031']を
[締日 >= '20070901',締日 <= '20071031'] に変換します。
45:デフォルトの名無しさん
07/11/09 14:52:23
条件の選別([],[],[],VL) :-
! .
条件の選別([[A|_]|R1],[B|R2],[A = B|R],VL) :-
\+(var(B)),
条件の選別(R1,R2,R,VL),
! .
条件の選別([[A]|R1],[B|R2],[A >= B2|R],VL) :-
var(B),
member(B1 @>= B2,VL),
B==B1,
条件の選別(R1,R2,R,VL),
!.
条件の選別([[A]|R1],[B|R2],[A <= B2|R],VL) :-
var(B),
member(B1 @=< B2,VL),
B==B1,
条件の選別(R1,R2,R,VL),
!.
条件の選別([_|R1],[_|R2],R,VL) :-
条件の選別(R1,R2,R,VL).
条件句の生成/4 は and で繋いでいるだけです。
46:デフォルトの名無しさん
07/11/09 15:17:16
条件句の生成/4 出はなくて 条件句の作成/4 でした。
以上で大体(細部には問題有り)できあがりですが、もう一度どうして
こんなことを長々書くのか説明して終わります。
15年以上前ですが、Prolog処理系の作成者として有名なK氏とSQLの集約命令に
ついて、雑談していました。その中でK氏がSQLのgroup by 句はよくない。
あれですんなり理解できる素人は少ないとの意見を述べられました。そして、
PrologのQueryのようなもので代替するべきことを暗に指摘しました。
私もK氏とまったく同意見でその時以来これは私のテーマの一つとなり、
実務で使用するデータベース照会述語を少しずつSQLからProlog述語に置き換えて
いったのです。今回は最も単純なものを載せました。
このほかにも、中島秀之氏が提唱されたことのある「項記述」を借用したもの
などに奥行きを感じました。これは、述語呼び出しに手を入れるもので、
売掛(_顧客,{_締日|_締日@>='20070901',_締日@=<'20071031'},_前残,_入金,_売上),
のような呼び出し方になります。もとの副目標としての形式を毀してしまうので、
使いにくいのですが、考えてみれば、_締日 @>= '20070901', を呼び出しの
前に追加挿入することも同じことですから、これでよいのかも知れません。
47:デフォルトの名無しさん
07/11/09 16:12:50
乙
おもしろかった。
48:デフォルトの名無しさん
07/11/09 17:08:17
>>45
大変なミス。# _副目標 :- ... はsolve/4のインラインでないと変数情報が
渡せませんでした。
solve(# P,V,L1,L2) :-
!,
P =.. [_関係表名|_引数ならび],
select cname into _属性名ならび from col where tname=_関係表名,
条件の選別(_属性名ならび,_引数ならび,_条件句候補,L1),
( not(_条件句候補=[]),
条件句の作成(_条件句候補,_条件句),
select *
into X
from _関係表名
where _条件句;
_条件句候補=[],
select *
into X
from _関係表名
),
member(_引数ならび,X).
でなくてはいけません。ただし、( ) の部分は別述語として定義する
べきでしょう。
49:デフォルトの名無しさん
07/11/09 17:10:07
Prologの変数同士の単一化には陥穽があって、
条件の選別([[A]|R1],[B|R2],[A >= B2|R],VL) :-
var(B),
member(B1 @>= B2,VL),
B==B1,
条件の選別(R1,R2,R,VL),
! .
を
条件の選別([[A]|R1],[B|R2],[A >= B2|R]) :-
var(B),
member(B @>= B2,VL),
条件の選別(R1,R2,R,VL),
! .
とやると、
select * into X
from 売掛
where 顧客番号='20070901'
and 締日>='20070901'
and 前残>='20070901'
and 入金>='20070901'
and 売上>='20070901',
というQueryを生成して見事に失敗します。
初心者の人はなぜそうなるか考えてみてください。
50:デフォルトの名無しさん
07/11/09 17:11:29
顧客番号 ではなく 顧客 ね。
51:デフォルトの名無しさん
07/11/09 17:26:02
>>48
solve(# P,V,L1,L2) :- !,データベース呼び出し(P,L1).
データベース呼び出し(_副目標,L1) :-
_副目標 =.. [_関係表名|_引数ならび],
select cname into _属性名ならび from col where tname=_関係表名,
条件の選別(_属性名ならび,_引数ならび,_条件句候補),
...
でよいのか。
52:デフォルトの名無しさん
07/11/09 17:29:08
またしくじった!!
solve(# P,V,L1,L2) :- !,データベース呼び出し(P,L1).
データベース呼び出し(_副目標,L1) :-
_副目標 =.. [_関係表名|_引数ならび],
select cname into _属性名ならび from col where tname=_関係表名,
条件の選別(_属性名ならび,_引数ならび,_条件句候補,L1),
...
ですね。
53:デフォルトの名無しさん
07/11/09 20:13:55
どなたか、P# の使い方を教えてください。Redhat9 で mono が動いています。
# cat ap.pl
ap([],X,X).
ap([U|X],Y,[U|Z]) :- ap(X,Y,Z).
# mono /root/psharp/Psharp-1.1.3/PsharpIntrp.exe
P# 1.1.3
Copyright(C) 2003 J.J.Cook
Based on:
Prolog Cafe 0.4.4, 0.6.1
Copyright(C) 1997-2003 M.Banbara and N.Tamura
Small Prolog Interpreter
| ?- compile(ap).
{translating ap.pl into C#...}
{ap.pl translated, 1523 msec}
yes
| ?-halt.
# ls -l *.cs
-rw-r--r-- 1 root root 4290 11月 9 20:06 Ap_3.cs
# mcs /r:Psharp.dll /out:Ap_3.exe Ap_3.cs
error CS5001: Program `Ap_3.exe' does not contain a static `Main' method suitable for an entry point
Compilation failed: 1 error(s), 0 warnings
#
これは何が起きているのでしょうか。
54:デフォルトの名無しさん
07/11/10 04:24:16
>>45
友人からバグがあるとの指摘を受けました。確かに。
'条件の選別'([],[],[],_) :- ! .
'条件の選別'([[A|_]|R1],[B|R2],[A = B|R],VL) :-
\+(var(B)),
'条件の選別'(R1,R2,R,VL),
! .
'条件の選別'([[A|_]|R1],[B|R2],[U2|R],VL) :-
var(B),
member(U,VL,VR),
U =.. [Func,B1,B2],
B==B1,
関数変換(Func,A,B2,U2),
'条件の選別'([[A|_]|R1],[B|R2],R,VR),
! .
'条件の選別'([_|R1],[_|R2],R,VL) :-
'条件の選別'(R1,R2,R,VL) .
関数変換(@>=,A,B2,U2) :- U2=..[>=,A,B2],!.
関数変換(@=<,A,B2,U2) :- U2=..[<=,A,B2],!.
関数変換(=<,A,B2,U2) :- U2=..[<=,A,B2],!.
関数変換(Func,A,B2,U2) :- U2=..[Func,A,B2],!.
member(A,[A|R],R).
member(A,[_|R],R2) :- member(A,R,R2).
再帰の末尾の呼び出し方が間違ってました。一つの引数に対して
式が複数あることもありますから。
例: 締日>='20070901' and 締日<='20071031'
55:デフォルトの名無しさん
07/11/10 04:43:34
これでもだめですね。うーん。・・・ 一引数増やして・・・
'条件の選別'(A,B,C,D) :- '条件の選別'(A,B,C,D,D).
で呼びます。
'条件の選別'([],[],[],_,_) :- ! .
'条件の選別'([[A|_]|R1],[B|R2],[A = B|R],VL,VL2) :-
\+(var(B)),
'条件の選別'(R1,R2,R,VL,VL),
! .
'条件の選別'([[A|_]|R1],[B|R2],[U2|R],VL,VL2) :-
var(B),
member(U,VL2,VR),
U =.. [Func,B1,B2],
B==B1,
関数変換(Func,A,B2,U2),
'条件の選別'([[A|_]|R1],[B|R2],R,VL,VR),
! .
'条件の選別'([_|R1],[_|R2],R,VL,_) :-
'条件の選別'(R1,R2,R,VL,VL) .
一引数増やして第4引数に変数情報リストの原型を持ち回ることにしました。
一度使った情報は使わないようにしたかったのですが、引数の順序に整順に
変数情報が現れるわけではないので。
56:デフォルトの名無しさん
07/11/10 04:51:17
nbsp を入れ忘れましたね。すみません。第一引数か変化したときに
リストを原型に戻すという手法ですね。なお、引数は
_属性名リスト,_引数ならび,_解の収集欄,_変数情報リスト原型,_残りの変数情報リスト です。
57:デフォルトの名無しさん
07/11/10 05:29:34
以下は典型的なプログラムパターン。
fooの第二引数に予め、findall/3で述語定義から情報を収集しておくことが多い。
第二、第三引数を省略して述語呼び出しとバックトラックでやろうとすると失敗する。
foo([],_,_,[]).
foo([A|R1],L,L2,[B|R2]) :-
foo_2(L2,LR,A,B),
foo([A|R1],L,LR,R2).
foo([_|R],L,_,X) :-
foo(R,L,L,X).
foo_2(L,LR,A,B) :-
member([A,B],L,LR).
58:デフォルトの名無しさん
07/11/10 06:07:24
今回もバグの山、粗忽の見本となりました。Prologでまったり2で
随分ベテランらしいプログラマがエラーの連続とするということは、
Prologというのは余程不完全な言語らしい、との評もいただきました。
バグの山となるのは私の性格と能力によるものでこんなことで、
Prologの評価が下がるのは残念です。
私のスレへの書き込み環境はFirefoxの縦六行の<textarea>で全く読み返しを
しませんから(上にスクロールしたものも)ミスがでるのも仕方ないと
思っています。それどころか、Prologプログラミングの理想は
思考経路が陽に現れたものではないかとさえ思っています。誤謬も含めて、
そのプログラムを読んだ人が、ああ、この人はああ考え、こう考えて、
ここのコードを書いたのだなと解るコードこそ、論理プログラミングの
極致ではないか。コピペや参照を極力避けて、狭い窓の中での
即時的なミニマムな思考がPrologのプログラミングとして現れている、
そう人が感じてくれるコードを書きたいものです。
とんでもない、エラーや思い違いが貴重なこともあるのではないか。
このプログラミング言語が世に現れたちょうど同じ頃、サティの音楽が
街に溢れ始めました。
59:デフォルトの名無しさん
07/11/12 04:32:40
あなたをベテランだと考えている人間はごく少数だと思われます。
60:デフォルトの名無しさん
07/11/23 17:25:30
w-zero3というwillcomの携帯(WS003SH)にswi-prologをインストールされた方もしいらっしゃれば、手順を詳しく教えていただけないでしょうか?
下のページを見ながら挑戦しているのですが、いくつかあるpl.exeどれをインストール・実行しても「有効なPocketPCアプリケーションではありません」と出て実行できないのです。
URLリンク(www.rainer-keuchel.de)
また、swi-prolog以外で、windows mobile で実行できるprolog環境でおすすめのものがありましたら是非教えていただきたく思います。
61:デフォルトの名無しさん
07/11/24 10:59:43
このためだけにwilcomの携帯を購入する訳にもいかないので、この話私はパス。
62:デフォルトの名無しさん
07/11/25 13:33:54
>>61
固定つけてよ。NG登録するから。
63:prolog
07/11/25 23:31:29
こういう風にやればいいの?
64:proIog
07/11/26 07:09:30
つけてみた
65:デフォルトの名無しさん
07/12/17 23:21:04
A「私は右から二番目。Bと隣り合わせ」
B「私の隣には嘘をついてない人がいる」
C「私は嘘をつかない人だから、妬まれて2人に挟まれてる」
D「私の左は悪い人、右は良い人」
ABCDのうち、2人が嘘つき。並んでる順番を求めなさい。
ってのを見て、Prologでやろうと思ったが書き方が分からん。
66:デフォルトの名無しさん
07/12/18 17:58:46
/*
# 一度で書き込めないので、前半
A「私は右から二番目。Bと隣り合わせ」
B「私の隣には嘘をついてない人がいる」
C「私は嘘をつかない人だから、妬まれて2人に挟まれてる」 ==> 妬む2人は嘘つきということと解しておく
D「私の左は悪い人、右は良い人」 ==> 悪い人=嘘つき、良い人=嘘をつかない人と解しておく
ABCDのうち、2人が嘘つき。並んでる順番を求めなさい。
*/
% 同値の定義
% 嘘つき(fail)の言っていることは嘘,
% 嘘をつかない人(true)が言っていることは真実
% 嘘つき(fail)か嘘をつかない人(true)か、とその言明は同値
eqvalue(X,Y):- X , Y.
eqvalue(X,Y):- \+ X , \+ Y.
% すべての並び順を生成
map(Seed,A,B,C,D):- select(Seed,A,AR),select(AR,B,BR),select(BR,C,[D]).
select([A|L],A,L).
select([A|L],B,[A|R]):-select(L,B,R).
% リストの要素
member(A,[A|_]).
member(A,[_|L]):-member(A,L).
67:デフォルトの名無しさん
07/12/18 17:59:51
% 後半、タブが詰まってしまい、見づらいが。
go:-
OrderMap=[('A',AOrder,ATF),('B',BOrder,BTF),('C',COrder,CTF),('D',DOrder,DTF)], % 名前、並び順、嘘つきかどうかなど組み合わせ表
setof([A,B,C,D],map([true,true,fail,fail],A,B,C,D),L),
member([ATF,BTF,CTF,DTF],L), % A,B,C,Dの嘘つき・嘘をつかないの組み合わせを順次生成
map([1,2,3,4],AOrder,BOrder,COrder,DOrder), % A,B,C,Dの順序の組を順次生成
% 以下、各人の言明を検証する
eqvalue(ATF,(AOrder is 3,(BOrder is AOrder-1;BOrder is AOrder+1)) ), % Aは三番目(右から二番)Bは隣
eqvalue(BTF,((NextB is BOrder-1,NextB>0; NextB is BOrder+1,NextB<5), % Bの隣、前か後ろで1以上5未満の位置
member((_,NextB,true),OrderMap)) ), % Bの隣は嘘をつかない人
eqvalue(CTF,(CTF, % Cは嘘をつかない人
member(COrder,[2,3]),BeforeC is COrder -1,AfterC is COrder+1, % Cは左右に人が配置できる位置
member((_,BeforeC,fail),OrderMap),member((_,AfterC,fail),OrderMap)) ), % 左右とも嘘つき
eqvalue(DTF,(member(DOrder,[2,3]),BeforeD is DOrder -1,AfterD is DOrder+1, % Dは左右に人が配置できる位置
member((_,BeforeD,fail),OrderMap),member((_,AfterD,true),OrderMap)) ), % 左嘘つき,右嘘つきでない
write(OrderMap),nl,fail. % 結果表示。全解を求めるためにfailさせる
/*
| ?-go.
[(A,1,fail),(B,3,true),(C,4,fail),(D,2,true)]
[(A,1,fail),(B,4,true),(C,2,fail),(D,3,true)]
[(A,2,fail),(B,4,true),(C,1,fail),(D,3,true)]
[(A,4,fail),(B,3,true),(C,1,fail),(D,2,true)]
[(A,3,true),(B,2,true),(C,1,fail),(D,4,fail)]
[(A,3,true),(B,2,true),(C,4,fail),(D,1,fail)]
[(A,3,true),(B,4,true),(C,2,fail),(D,1,fail)]
no
*/
68:デフォルトの名無しさん
08/02/09 22:38:15
保守。
69:デフォルトの名無しさん
08/02/10 00:58:06
Prologを使ってる方がいらっしゃるようなのでお聞きしたいのですが、
処理系によってはギガバイトクラスのデータに対しても使えるのでしょうか?
70:デフォルトの名無しさん
08/04/07 21:30:14
これ凄い。
URLリンク(edoc.bib.ucl.ac.be:81)
3月下旬に本も出た?
URLリンク(www.amazon.co.jp)
INAPを見てもヨーロッパからの学術論文は続々。日本、本当に大丈夫なのか。
71:デフォルトの名無しさん
08/04/09 01:01:25
__t─-v-─ァ__
<:::::::::::::::::::::::::::::::>
<´:::z-r─--v、:::::::::>
く:::::{ | }ハ::}:::::〉
,...:::' ̄ヾ<::::i ィ=z z=く 〉:::>
,...::::´::::::::::::::::::V:::レ´ ! `!::/
/:::::::::::::::::::::::::::::::}rj ≡≡ ≡≡|<
. 〈:::::::::::::::::::::::::_::z-┤ u ''' i '' |ノ
ヽ:::::::::::::::::ス_r- 、`¨l、 、__ ノ マイナーですから
ヽ:::::::::::::::::::ヾ:::::`ー-{ヽー--‐ イ_..:-─::.、
\:::::::::::::::::::::::::::::::::ヽ-{チ-<::::::::::::::::l
\:::::::::::::::::::\:::::::::::|o::::::::::::::::::::::l::l
\::::::::::::::::::ヽ::::::::|::::::::::::::::::::::::l::l
. 入::::::::::::::::::::::::::|:::::::::::::::::::::::l:〈
72:デフォルトの名無しさん
08/04/09 07:55:53
P# 日本語通るようにならないかなぁ。
73:デフォルトの名無しさん
08/04/09 11:56:57
>>72
Prolog Cafeを試してみたら?
74:デフォルトの名無しさん
08/04/09 20:16:23
>>73 ありがとう。
私はmonoでOSはKbuntuをutf-8のところをEUCに使っている。これだと、
何がおきても仕方がないのだけれど、PrologCafeを起動した場合、
ほぼ日本語は満足がいくレベル。それが# mono PsharpIntrp.exe
で起動されるPrologCafeではまったくダメ。
ひとつは、Windowsだとどうなのだろうということ。(私の家にはWindowsがない)
もうひとつは、Psharp.dllを変更できないかということ。
75:デフォルトの名無しさん
08/04/10 12:47:21
>>74
WindowsXPだと日本語使えなかったよ。
76:デフォルトの名無しさん
08/04/14 09:40:33
ちょっと質問なんですが、
file2list(File,List) :- see(File),findall(X,(repeat,read(X),(X=end_of_file,!,fail;true)),List),seen.
は、随分と胡乱臭いコードなのですが、皆さんはどんな方法でさばいていますか?
77:デフォルトの名無しさん
08/04/14 11:35:35
> 胡乱臭い
妙な言い回しだな
78:デフォルトの名無しさん
08/04/14 12:36:17
胡乱な、かw
79:デフォルトの名無しさん
08/04/14 12:45:32
胡散臭い
80:デフォルトの名無しさん
08/04/14 19:20:25
胡乱臭い・・・これは面白い表現かもしれぬ!
81:デフォルトの名無しさん
08/04/14 20:54:44
repeat して findall って、確かに嫌なコードかも。
私なら再帰で書きたい。
file2list(File, List) :- see(File), file2list(List), seen.
file2list(List) :- read(Token), (Token = end_of_file -> List = [];
List = [Token|Next], file2list(Next)).
とか。
82:デフォルトの名無しさん
08/04/14 21:29:13
>>81
一般に業務システムのように大量ファイルを扱う場合、
再帰で書くとヒープ領域に解放できないアトムがたまり、
システムダウンの危険が発生する。それで、repeat failの
間で処理を済ませる。こうすることで、アトムを極力GCの
対象になるようにするのが定石です。しかし、この場合は
第二引数のListに貯めていくのだから、どちらのアルゴリズムを
採用してもリストから指されるアトムや複合項があるわけで、
あまり差がないと言えるのでしょうか。
83:デフォルトの名無しさん
08/04/14 21:31:29
リストから指されるアトムや複合項 -> スタックから指されるアトムや複合項
の方がいいですね。
84:デフォルトの名無しさん
08/04/15 04:44:47
>>16
5月に第3版の邦訳が出るということでしょうか?
85:デフォルトの名無しさん
08/04/15 05:02:22
>>84
原書第4版のことでしょ
さらに延期されて2008年11月予定になってるけど
10年以上Prologの新刊が出てない我が国じゃ翻訳は期待できないね
86:デフォルトの名無しさん
08/04/15 07:47:26
そうですね。アメリカの出版社っていうのはかなり前から
近刊を打つんでしょうかね。延期が多いですね。
87:デフォルトの名無しさん
08/04/15 13:22:35
そうなんですか。
少しいじってみたらとても面白そうなので
あちこち眺めてるところでした。
88:デフォルトの名無しさん
08/04/15 13:24:24
amazonで新刊を見ようと出版月日順にしたら
来年出版予定のがわんさか出てくるから困る
89:デフォルトの名無しさん
08/04/15 13:30:53
>>87
>>16 と "The Art of Prolog Advanced Programming Technichques"
(邦訳名はPrologの技芸)の二冊はすべてのプログラム学習書の中でも
飛び抜けた存在だと思いますよ。
90:デフォルトの名無しさん
08/04/15 17:59:08
プロログおもしろいよな
学校で学んでよかった
学校行ってなきゃLISPの方勉強してたかもしれない
せんせーあんがとー
91:デフォルトの名無しさん
08/04/15 18:00:37
どっちもどっちだろ
92:デフォルトの名無しさん
08/04/15 18:25:44
ゲーム的な感覚はプロログの方があるね。反駁と単一化というトリックに
乗せて解くパズルというか。
93:デフォルトの名無しさん
08/04/15 18:29:41
生産性も3-4割は高いでしょ。黒川利明さんが言ってたんだから
結構信憑性がある。
94:デフォルトの名無しさん
08/04/15 18:34:01
prologとocamlにはまってC忘れて就活の筆記で出された
C言語の問題を誤答しまくった俺が通りますよ
内定もらったけど最終面接で
「趣味もいいけどC,C++,Javaのどれかは常に使えるようにしとけ」と説教されたw
95:デフォルトの名無しさん
08/04/15 19:12:51
JavaやってるとC#出来なくなる
C#やってるとJavaとC出来なくなる
JavaとCやってると開放しようとしたり忘れたりする
Prologやってると手続きがボロボロになる
96:デフォルトの名無しさん
08/04/15 19:13:09
ということは、今4年?
97:デフォルトの名無しさん
08/04/15 19:30:43
筆記にC出すなんて珍しい会社だな
ってか推薦使えよ・・・
98:デフォルトの名無しさん
08/04/15 19:35:18
>>95
Prologの手続的解釈。ようするに心の持ち様。
99:デフォルトの名無しさん
08/04/15 19:54:32
>>94
「PROLOGデータベース・システム」D・リー著 安部憲広訳 近代科学社
は読んだかい?
100:デフォルトの名無しさん
08/04/16 21:17:48
URLリンク(www.ifcomputer.com)
> もし、ゴールが失敗すれば、成功し、失敗すれば、成功する。
> もし、ゴール が失敗すれば、成功し、失敗すれば、成功することである。
難しいw
101:デフォルトの名無しさん
08/04/16 22:26:35
Pは必ず失敗する、どう定義すればいいのかな。
P :- !,fail.
でよさそうに見えるが、誰かが上にこう付け加えた。
P.
P :- !,fail.
二行(節)目になった P :- !,fail. はPは必ず失敗するの意味を失うのだろうか。
注..Pの部分にはtrue,fail,!,以外の任意の項がくると考えてください。
102:デフォルトの名無しさん
08/04/25 11:06:04
質問です。SWI-Prologで以下の質問をすると、
?- assertz(b(1)),b(X).
ERROR: Undefined procedure: b/1
これがISOの標準なのですか?
103:デフォルトの名無しさん
08/04/25 11:23:56
次の場合とどうちがうのでしょうか。
?- assertz((a(X) :- assertz(b(1)),b(X))).
X = _G187
yes
?- a(X).
X = 1;
no
となります。
104:デフォルトの名無しさん
08/04/25 15:07:15
>>102
ヒープエリアにb()という構造体が作られていないでしょうね。サブゴールは
ヒープエリアに構造体がないと実行できないに違いない。
ここでは、コントロールスタック上にだけ、b()の構造体が現れ、しかも、
その中の2つのb()がリンクされていない! そういう解釈になりますね。
ISO標準化かどうかは英文なので私には読めません。
105:デフォルトの名無しさん
08/04/25 15:11:41
>>103
上の解釈が正しければ、assertzでヒープエリアにb()が作られるので、
今度は参照可になるのでしょう。ちなみにIF/Prologではどちらも参照可でした。
106:デフォルトの名無しさん
08/04/25 20:20:12
>>104
コントロールスタック上にある構造体相互の参照はありませんね。
107:デフォルトの名無しさん
08/04/25 21:58:40
>>102
dynamic b/1.
をすればokだと思う
108:デフォルトの名無しさん
08/04/25 22:02:29
>>107
そういうのあるのですか。ありがとうございます。
109:デフォルトの名無しさん
08/04/26 07:16:32
prologは宣言的な言語だと言われているのに、
挙動の説明にヒープやスタックといった個別の実装モデルが必要となるのが悲しい。
110:デフォルトの名無しさん
08/04/26 07:40:17
>>109
それどころか、ISO標準のPrologの言語定義が
1) BNF的なもの 2)スタックモデルによる説明
の併記になっていることを知っているかい。
まあ、>>102 以下は実装レベルの話だから、確かに低レベル。
111:デフォルトの名無しさん
08/04/26 07:47:40
他の言語で言えば、クロージャあたりに近い話だと思うけれど、
このassert(retract)問題は最初からPrologの弱点と見られていた
ように思う。
112:デフォルトの名無しさん
08/04/26 08:04:53
>111
それはこっちの話だろ。
?- assertz(a(1)),a(T),assertz(a(2)).
T = 1;
no
?- a(X).
X = 1;
X = 2;
no
?-
113:デフォルトの名無しさん
08/04/26 08:41:34
1980年代にはPrologでやればソフトウェアの生産性は少しはましになるん
じゃないかってそこら辺中でいわれていた。坂村健のようなひとでさえ、
シンポジウムのような席でもそんなことをいっていた。若き日のビルゲイツも
基本言語への採用を考慮し、最終的に見限ってVBの開発を指示したと
いわれている。
さて、それでは、どこがPrologがCOBOL等の代替言語になることを阻んだのか、
Windowsの基本言語になりえなったのか、理由をあげてほしい。
現在、Prologをやってるひとには自明なことばかりだと思うが、Prologを知らない
人にPrologを解体して見せるつもりで皆さんあげてください。
114:デフォルトの名無しさん
08/04/26 12:56:00
Prolog自体は広まっていないが,
Prolog → 論理プログラミング → 制約論理プログラミング → 制約プログラミング
という過程で,利用されていると思う.
次は,Jリーグのスケジュールの例.
URLリンク(www.atmarkit.co.jp)
ILOGの制約プログラミングシステムが利用されているようだ.
115:デフォルトの名無しさん
08/04/26 18:08:59
COBOLを代替できなったという点は、>>83にちょっと出てきているが、
アトムの爆発ということだとおもう。Prologではアトムをヒープエリア
内に一旦記述して処理する戦略をとる。極めて大きな記号間の連鎖を表現しよう
とする記号処理言語ではどこかに対象となる情報すなわちアトムを保持せざるを
えない。この場合、初出のアトムに対し必ずメモリ内を検索し、無い事を確認して
新たに構造体を追加する。業務処理で一日一億のトランザクションを処理する
ケースだとこの参照時間だけで相当のものだ。やはり破壊代入だけで済ませる
言語には太刀打ちできない。さらに再帰で処理した場合はオーバーフローの危険が
あるし、バックトラックして再束縛する場合でも、ヒープエリアのGCは必ず
必要になる。実際、保険業務などをPrologで処理することを想定すると、すぐに
電話帳一冊分くらいの量のアトムが発生してしまう。
企業業務はほとんどが記号処理、シンボル処理であり、Prologはそういう意味では
極めて適した言語なのだが、残念ながら以上のような理由から、大規模な業務処理
には向いていない。
116:デフォルトの名無しさん
08/04/27 08:21:39
大規模な業務処理には向いていない。
しかし、小規模な業務処理には極めて向いているし、
未開拓の対象業務だらけという状態です。この点を
知らしめる必要はあります。
自分だけ儲けるためには静かに潜行するのが上策で
しょうが。
117:デフォルトの名無しさん
08/04/28 19:16:27
BEST SOFTWARE WRITING
ある本に興味深い文があったので紹介。
Joel Spolsky (青木 靖 翻訳)
URLリンク(www.amazon.co.jp)
(P 82)
> ところで、RDFを理解する秘訣はProlog言語のチュートリアルを読むことだ。そ
> のコンセプトはすっかり同じで、理解するのはそんなに難しくなく、そうして不
> 透明で不埒なRDFの仕様がはっきり分かるようになる。
118:デフォルトの名無しさん
08/04/28 19:17:25
ありゃ、1行目と2行目が逆になってしまった。すみません。
119:デフォルトの名無しさん
08/04/28 19:42:39
そういやこんなのあったね
URLリンク(www.swi-prolog.org)
120:デフォルトの名無しさん
08/04/29 06:43:07
この頃ソースコード載りませんね。このスレこそソースを読みたいんだけどな。
121:デフォルトの名無しさん
08/04/29 09:56:22
データベースと組み合わせて使ってもやっぱり大規模な業務処理は無理なんですか?
122:デフォルトの名無しさん
08/04/30 03:42:35
>>121
create table をPrologで行うと、事情はまったく変わりませんね。
select * from を多用しても、全フィールドをアトムに変換しようとするでしょうから、
同じです。
select 商品 from 売上 ですと得られたtupplesの分のアトムが発生します。
Prologの直接のアトムの保管場所がデータベースに移るわけではないので、
本質的な差はないと考えます。
単一レベルの記憶であって、しかも巨大キャッシュメモリが存在し、データベースと
メモリーの境界を感じさせないシステムが当たり前になった時には、データベースを
Prologで置き換えることが可能になるでしょうから、大転回が起こると思いますが。
123:デフォルトの名無しさん
08/05/01 07:15:01
データベースと共用しても、PL/IやCOBOLを代替できはしない。
しかし、Prologの最も幸せなプログラミングは連想三つ組の単位節を
Queryで極めて少量づつとりだし、それを組み立てて複雑な問題を
解く、というものだろう。データベースを前提にして、このような部分の
プログラミングが大規模システムの一角を担うことはもちろん可能で
システムの中で、論理系の部分だけ担うという現在のPrologの標準的な
立場とも合致する。現在のシステムにPrologが同居することになる。
それが可能なことなのか否かは、メインフレームのシステム管理に
知識がないから私には、これ以上何も言えないけれど、可能性は
以前から実はずーとあったのではないかと思っている。
124:デフォルトの名無しさん
08/05/01 07:39:27
読みかえしてみたら意味不明のところがあったので補足します。
連想三つ組にはたいした意味はありません。強調したかったのは巨大な
データベースをQueryとして絞り込み、その情報の組み合わせで世界を把握する
というプログラミング態度です。巨像の表面の何か所かの要点を押さえて、
全体の意味を読み取ろうとする、そんな態度ですね。
125:デフォルトの名無しさん
08/05/01 10:22:36
適材適所ですよ
今システムを構築している言語にエッセンスだけ吸収されれればこの先も生き残れる
126:デフォルトの名無しさん
08/05/01 16:04:25
>>125
論理式で記述するということが要点だと思います。Prologのインタプリタや
コンパイラから参照することは必須ではない。JavaゃC++からでも一向に
構わないけれど、論理記述の形式としては、Prologほどのものはなかなか
ないのだから、このかたちで修練を積んでほしい。
127:デフォルトの名無しさん
08/05/01 19:23:10
私はビジネスロジックをPrologで組んで、データの更新とかはRDBMSにまかせようと思っているのですが無謀ですかね?
アトムが爆発するというのはタプルをPrologのデータとして読み込んでしまうからで、それをやると破綻するのはどんな言語でも同じだと思っています。
カーソルを移動しつつ順番に処理していったり、必要に応じてSQLクエリを発行するという部分をPrologで書けないかと思っているのですが。
128:デフォルトの名無しさん
08/05/01 20:48:58
>>127
>>115以降私が延々とやっているのは、汎用機で極限的な量のトランザクションを
処理している業務の代行ができるかとどうかという話です。これができないと、
大規模業務処理に向いているとはいえないからです。
一方、どのくらいまでの量のトランザクションならPrologで処理しても問題が起きないか
という視点もありえます。絶対安全な事例をあげておきます。私のところで19年間
Prolog+RDBMSで処理し続けているものです。
適用業務:石油卸+小売業の販売管理一部財務管理
一日のデータ数:平均 5300 レコード
RDBMSの最大テーブル(売上)のtupple数:max 800万
この程度だとプログラミングテクニックへの制限はまったくありません。
以前はガソリンスタンドのPOSからのデータ収集もPrologで行っていた
のですが、現在はこの部分は元売り業者が収集してくれます。
それをファイルで受け取り、sub_atomで分解しながら20のアトムに
分解してデータベースへinsertしていきます。
バッチ処理でこれに約20分かかります。あとは、Webによる参照、
インタプリタによるデータ入力、psファイルの作成、すべての帳票印刷、
これらはすべてPrologで書かれています。
:現在は売上以外のTableデータはProlog単位節として管理する
ことにしていますが、それでも一つのPrologインタプリタユニットの
平均メモリ使用量は20MBで40MBを越えることはありません。
129:デフォルトの名無しさん
08/05/02 06:12:13
凄く初心者質問だと思うのですが
Prolog に方程式を解かせることって出来ますか?
ごく簡単な式で良いんです。例えば
2 + X = 5
とかそんな感じです。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5384日前に更新/90 KB
担当:undef