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
とかそんな感じです。
130:デフォルトの名無しさん
08/05/02 06:12:22
ピーク時7000レコード近くあったのが店を何店か閉めて減ってしまいました.
20分と書いてあるのはこのピーク時の平均でした。今朝測ったら11分。
ただし、これは皆様ご存知の事情によるものです。
131:デフォルトの名無しさん
08/05/02 06:34:58
>>129
さすがにこの方程式解くプログラムなら私にも書けそう。
変数が二個以上入る連立方程式は、変数同士の関係についての
記述であると考えられます。
この変数同士の関係のことを制約といい、制約論理型言語と
いうものがその目的には相応しいとされます。つまり、今我々が
使っているPrologはこの制約を表現するのにやや欠けた仕様だ、
ということです。いくつかのPrologは自身をもう一層高水準に拡張
して制約論理型言語であると称しています。制約論理型言語の
なかにはPrologを土台としていないものもあります。詳しくはWikiか
何かで調べてください。
132:デフォルトの名無しさん
08/05/02 06:42:24
>>129
2 + X を解析するには、
?- functor(2+5,Func,Args).
Func='+',
Args=2,
yes
?- arg(1,2+5,A).
A=2
yes
?- arg(2,2+5,A).
A=5
yes
つまり3引数の述語functor や 2引数の述語argを組み合わせてルールをかきます。
argで取り出した項が変数であるか、整数であるか、はたまたそれは式であるか、
を問いかけながらの解析ということになります。
133:デフォルトの名無しさん
08/05/02 06:44:55
ごめんなさい。2 + X のはずが2行目から以後、2 + 5 になってしまいました。
5をX に置き換えて読んでください。
134:デフォルトの名無しさん
08/05/02 08:22:33
>>129
方程式の解法(A + B = C) :- integer(A),integer(C),var(B),B is C-A.
ではだめかw
135:デフォルトの名無しさん
08/05/02 08:58:19
そりゃ反則だw
136:デフォルトの名無しさん
08/05/02 09:01:41
>>134
パターン全部書けばいいね。
でも、integerではなくnumberですね。
137:デフォルトの名無しさん
08/05/02 09:29:19
方程式の解法(A + B = C) :- number(A),number(C),var(B),B is C-A.
方程式の解法(A + B = C) :- var(A),number(B),number(C),A is C-A.
方程式の解法(A * B = C) :- number(A),number(C),var(B),B is C/A.
延々と書いていく。
一般論になるけど、Prologプログラマにはこのように
パターンを数え上げれるだけ挙げて、それから、
ルールを書こうという人と、最初からルールだけで
済まさないといられない人がいるみたいだね。
外延的な表記が好きか、内包的なのが好きかって
いうことかな。
138:デフォルトの名無しさん
08/05/02 10:07:42
理想主義的解放
en(X,_) :- var(X), !.
en(0,z) :- !.
en(N,s(X1)) :- number(N), N > 0, N1 is N - 1, en(N1,X1).
de(_,N) :- number(N), !.
de(z,0) :- !.
de(s(X),N) :- de(X,N1), N is N1 + 1.
add(X,z,X) :- !.
add(X,s(Y),s(Z)) :- add(X,Y,Z).
eq(X + Y,Z) :- en(X,X1), en(Y,Y1), en(Z,Z1), add(X1,Y1,Z1), de(X1,X), de(Y1,Y), de(Z1,Z).
enとdeが別定義なのがかっこ悪い。
139:デフォルトの名無しさん
08/05/02 10:36:17
>>129
わざわざ「Prologで~できますか」と書いているところを見ると、
Prologにそういう機能が内蔵されているか、という質問のように思えるね。
それはまあ、ありませんw
方程式を解くというのも、どちらかというと個別的な知識でしょう。
ただし、自分の知っている「式変形の規則」をだだっと書き出して、
それを堂々巡りしないように順序立てるだけで、案外そこそこ動くものができるかもね
140:デフォルトの名無しさん
08/05/02 12:47:41
>>138
何かと思えば、、
自然数の加減算ならリストを経由してappendで解くという変態技もありそうだw
141:デフォルトの名無しさん
08/05/02 12:53:53
方程式を素で解くなら Mathematica とか Maple とか使うことになるな。
142:デフォルトの名無しさん
08/05/02 12:54:29
できたw
| ?- length(Two,2), length(Five,5), append(Two,X,Five), length(X,N).
Two = [_,_]
Five = [_,_,_,_,_]
X = [_,_,_]
N = 3 ->;
no
143:デフォルトの名無しさん
08/05/02 12:55:59
頭いいなw
144:デフォルトの名無しさん
08/05/02 13:02:42
a_plus_b_is_c(A, B, C) :-
length(ListA, A),
length(ListB, B),
length(ListC, C),
append(ListA, ListB, ListC).
?- a_plus_b_is_c(2, X, 7).
X = 5
うおおおお
145:デフォルトの名無しさん
08/05/02 13:08:33
>>144
ざっと見て計算量がA×C以上になっちゃいそうだなw
146:デフォルトの名無しさん
08/05/02 13:11:57
?- a_plus_b_is_c(20000, X, 1000000). とかやったら凍ったw
147:デフォルトの名無しさん
08/05/02 14:08:28
いや、A×CじゃなくてA×B、A×(C-A)か。
あと、BのリストとCのリストの一部をユニファイする手間もあるけど。
148:デフォルトの名無しさん
08/05/02 20:36:43
>>138
> enとdeが別定義なのがかっこ悪い。
じゃあこんな感じで上昇的に
pn(P,N) :- pn(P,0, N).
pn(z,N, N).
pn(s(P1),N0, N) :- (var(N) -> true ; N0<N), N1 is N0+1, pn(P1,N1, N).
149:デフォルトの名無しさん
08/05/02 21:12:31
せっかく述語が分かれているから先に決めちゃうか
pn(P,N) :- nonvar(N), pn(P,0, N), !.
pn(P,N) :- pn(P,0, N).
pn(z,N, N).
pn(s(P1),N0, N) :- N1 is N0+1, pn(P1,N1, N).
150:デフォルトの名無しさん
08/05/03 10:44:31
>>149
これは is 評価を使わないでpnだけで行こうとすると
ループに陥るのかな?
151:デフォルトの名無しさん
08/05/03 13:26:59
無限ループに陥るのはNに自然数以外を与えたときで、
無限に成功するのは変数を与えたとき、のはずだけど、
is評価を使わずにというのは?
152:デフォルトの名無しさん
08/05/03 13:34:20
変数を
^
P、Nの両方に
153:デフォルトの名無しさん
08/05/03 15:26:12
>>151
pn/2,pn/3で加減算できるなら、add1を使わずしてpnだけで
これをできないものかと。
154:デフォルトの名無しさん
08/05/03 17:36:00
数値データと橋渡しをするには、どのみち整数の演算が必要なのでは?という話ではなくて?
155:デフォルトの名無しさん
08/05/03 18:34:40
>>154
そういう意味になる。
is/2に双方向性がないので
この述語を削りpnで書き換えれば双方向性を
実現できるのかなと。
156:デフォルトの名無しさん
08/05/03 20:00:57
>>155
演算の双方向性は>138の方式で実現可能。
encode/decodeの双方向性は十進文字列のparserを書けば可能かも。
157:デフォルトの名無しさん
08/05/03 20:22:34
>>156
ああ、そうだね。私が言ってるのは
'2倍'(A,B) :-
の定義をAの2倍がBになると書いて、
それが、自ずと、Bの2分の1がAで
あるという述語定義になっている、
ということ。そのためには、最初の
定義一発にis/2を含むわけには
いかないだろう、というような意味ですね。
158:デフォルトの名無しさん
08/05/03 21:32:31
pn/3で加減算っていうのはひょっとして、、
% P-Q = M-N
pn(P,Q, M,N) :- var(M), !, pn_aux(Q, P,N, M).
pn(P,Q, M,N) :- integer(M), integer(N), M >= N, !, pn_aux(Q, P,N, M), !.
pn_aux(Q, Q,M, M).
pn_aux(Q, s(P1),N0, M) :- N1 is N0+1, pn_aux(Q, P1,N1, M).
twice(A,B) :- pn(PA,z, A,0), pn(PB,PA, A,0), pn(PB,z, B,0), !.
| ?- twice(3,X).
X = 6 ->;
no
| ?- twice(X,4).
X = 2 ->;
no
| ?- twice(X,5).
error: stack is over.
絶対マチガッテルよこんなのw
159:デフォルトの名無しさん
08/05/03 21:54:21
いやこうか
twice(A,B) :- pn(PA,z, A,0), pn(PA,z, B,A), !.
どうでもいいw
160:デフォルトの名無しさん
08/05/04 18:39:02
質問です。以下の表をprologで書きたいのですがわかりません。
お願いします。教えてください。
task| 内容 | 先行task | 期間 | 人数
-----------------------------------------------------------
a | 設計 | なし | 1 | 2人
-----------------------------------------------------------
b | 材料rの調達 | a | 3 | 4人
-----------------------------------------------------------
c | 材料zの調達 | b | 1 | 2
-----------------------------------------------------------
d | 材料Wの加工 | b | 2 | 3
-----------------------------------------------------------
e | 部品Yの加工 | b | 2 | 3
-----------------------------------------------------------
f | Xの組み立て | c,d | 2 | 2
-----------------------------------------------------------
g | Sの組み立て、検査 | e,f | 3 | 1
161:デフォルトの名無しさん
08/05/04 19:59:12
>>160
設計指針として
1) -- と | はいらないから、削除したりカンマに置き換えます。
2)行の最後はピリオドが必要です。
3)テーブルの名前が必要です。命名します。これが述語名となります。
4)Prologの構文規則に沿うように修正します。2人 -> 2, Xの組み立て -> 'Xの組み立て'
task管理(a,設計,なし,1,2).
task管理(b,材料rの調達,a,3,4).
task管理(c,材料zの調達,b,1,2).
task管理(d,材料Wの加工,b,2,3).
task管理(e,部品Yの加工,b,2,3).
task管理(f,'Xの組み立て',c,d,2,2).
task管理(g,'Sの組み立て、検査',e,f,3,1).
見出し情報はふくみません。(task,内容,先行task,期間,人数)
これを例えば以下のように処理します。アプリケーションの中にこの情報を組み込みます。
task管理照会(_task,_内容,_先行task,_期間,_人数) :- task管理(_task,_内容,_先行task,_期間,_人数) .
162:デフォルトの名無しさん
08/05/04 20:14:30
別に以下のように引数位置の意味を定義しておくこともあります。
task管理引数位置(1,task).
task管理引数位置(2,内容).
task管理引数位置(3,先行task).
task管理引数位置(4,期間).
task管理引数位置(5,人数).
163:デフォルトの名無しさん
08/05/04 20:29:24
この定義があると、
?- 期間 が 2 の _定義節 は.
_定義節 = task管理(d,材料Wの加工,b,2,3);
_定義節 = task管理(f,'Xの組み立て',c,d,2,2)
などと答える可能性が生まれます。
164:デフォルトの名無しさん
08/05/04 20:42:42
:- op(650,xfx,が).
:- op(640,xfx,の).
:- op(850,xf,は).
_項目名 が _値 の _定義節 は :- fonctor(_定義節,task管理,5),task管理引数位置(N,_項目名),arg(N,_定義節,_値),call(_定義節).
これで >>163 の参照が可能になります。
165:160
08/05/04 20:48:15
もし人数がない場合を考える。
task| 内容 | 先行task | 期間 |
-----------------------------------------------------------
a | 設計 | なし | 1 |
-----------------------------------------------------------
b | 材料rの調達 | a | 3 |
-----------------------------------------------------------
c | 材料zの調達 | b | 1 |
-----------------------------------------------------------
d | 材料Wの加工 | b | 2 |
-----------------------------------------------------------
e | 部品Yの加工 | b | 2 |
-----------------------------------------------------------
f | Xの組み立て | c,d | 2 |
-----------------------------------------------------------
g | Sの組み立て、検査 | e,f | 3 |
次に続く。
166:160
08/05/04 20:52:13
もし人数がない場合のプログラム。
scd(StartingTimes) :-
StartingTimes = [Sa,Sb,Sc,Sd,Se,Sf,Sg],
StartingTimes :: 0..20,
Ea #= Sa+1,
Eb #= Sb+3,
Ec #= Sc+1,
Ed #= Sd+2,
Ee #= Se+2,
Ef #= Sf+2,
Sb #>= Ea,
Sc #>= Ea,
Sd #>= Eb,
Se #>= Eb,
Sf #>= Ec, Sf #>= Ed,
Sg #>= Ee, Sg #>= Ef,
labeling(StartingTimes).
となって分かるのですが人数が入った瞬間分かりません。
この人数が入った場合の>>160のプログラムを教えてください。
167:デフォルトの名無しさん
08/05/04 20:58:45
>>165 ちょっとその前に、
ごめんなさい。c,d と e,f をよみまちがえていた。
c,d e,f の意味があいまいだけれども、
'c,d' 'e,f' とするか、
[c,d] , [e,f] とするか、
はたまた、定義節を二つに分解することになる
task管理(f,'Xの組み立て',c,2,2).
task管理(f,'Xの組み立て',d,2,2).
task管理(g,'Sの組み立て、検査',e,3,1).
task管理(g,'Sの組み立て、検査',f,3,1).
この定義は意味が違うように思えるのですが。
168:デフォルトの名無しさん
08/05/05 12:46:40
>>128貴重な情報ありがとうございます。
購買系のシステムに適用できないか検討中でしたので参考になりました。
Prologの処理系は何か商用のものを利用されているのでしょうか?
169:デフォルトの名無しさん
08/05/05 13:15:22
>>168
私は20年間IF/Prologを使用してきましたが、5年前に国内では
販売を中止しました。シーメンスでは現在も販売していると思います。
日本CGIでも販売していたと思いますが、現在どうなっているか
知りません。
私はSWI-Prologへの移行準備中です。
170:デフォルトの名無しさん
08/05/05 15:34:29
>>166
cumulative制約を使えば,人数制約できると思う.
使い方は人数制限が6名なら,単に
cumulative([Sa,Sb,Sc,Sd,Se,Sf,Sg],[1,3,1,2,2,2,3],[2,4,2,3,3,2,1],6)
を付け加えればOKのはず.
参考:
URLリンク(www.sics.se)
171:デフォルトの名無しさん
08/05/05 19:46:44
>130-159
ありがとうございました。結局Prologで方程式を解くには
ある程度は書けるにしても、何かしらのロジックが必要になるのですね。
>141
なるほど。そんな言語もあるのですね。一応調べてはみます。
172:デフォルトの名無しさん
08/05/06 18:15:30
>>171
Prologでは = に、=の左側の項と右側の項を単一化するという意味を
与えたので、方程式 2 + X = 5. を与えて、そのまま解けるということは
絶対にありません。
2 + X と 5を較べて、2 + 5は複合項 5は単項ですから、単一化のルールに
より偽となります。
173:デフォルトの名無しさん
08/05/06 18:27:45
=:= や is だとどういうルールになりますか
174:デフォルトの名無しさん
08/05/06 20:21:48
>>173
= については、意味を与えてしまったので、方程式と理解する余地を失ったと
言った方が適切かもしれません。
=:= は 左項 と 右項を共に関数評価した上で左項と右項を単一化します。
is は 左項 は 関数評価せず、右項だけ関数評価してから左項と単一化します。
変数は関数評価できないとされますから、
X =:= 3+4.
は左項を評価できずエラーとなります。一方、
X is 3+4 はX に 7が単一化されます。
整数や浮動小数点数は関数評価するとその値となります。
関数定義されていないアトムは関数評価されるとエラーとなります。
関数定義されているアトムとは、たとえば、timeのようなもので、
?- X is time.
X = 1210072210
と1990年からの積算時間が得られます。なほ、
?- time =:= time.
yes
となりそうですが、これは微妙ですね。左項の評価時の積算時間と右項の評価時の
積算時間が異なる可能性があります。
175:デフォルトの名無しさん
08/05/06 20:32:43
ですから、方程式の解法を組み込み述語として、Prologが持つようにするとなると、
= =:= is などは使えず、2 + X = 5 の = 記号をオペレータとして使われていない
記号か、オペレータとして定義されていても多義性を持たせても構わない記号に
置き換える必要があります。
176:デフォルトの名無しさん
08/05/06 23:36:29
かといって、述語にするにしても単純ではなさそうですね。
ユニフィケーションだけじゃ無理か。
177:デフォルトの名無しさん
08/05/06 23:51:12
Prologでは方程式は解けないという流れになっていますが,
SWI-Prologや他の多くのPrologには,clp(R)やclp(fd)等の
制約論理プログラミングのパッケージが用意されているので,
それを使えば,方程式も解けますよ.
178:デフォルトの名無しさん
08/05/07 06:09:07
そうか「Prologに解かせる」だから、Prolog言語と解釈する必要もなかったかもね
179:デフォルトの名無しさん
08/05/07 06:29:57
底まで沈むことを楽しみにしていたのだが、agatteしまったね。あと68だったんだけど。
180:デフォルトの名無しさん
08/05/08 10:04:07
ム板には「なぜ、 = が 代入 を 表す 記号 に なったか?」という
スレがありますが、Prologの場合も = が適切だったのかという疑問は
残ります。unify/2でなぜいけない? 論理変数を含む単一化は独特で、
これを = で示して、ひけらかしたい誘惑はあります。それと = は
やはり便利ですね。
181:デフォルトの名無しさん
08/05/09 07:37:43
SQLのgroup by句付き集約参照に当たる組込述語の書式を募集します。
案をお持ちの方はどしどし出してください。
182:デフォルトの名無しさん
08/05/14 08:00:43
>>115
アトムテーブルの参照はハッシュが使えたとしても、
相当の負荷が掛かるのだろうか。最終的には必ずアトム文字列の
strcmpが起こるとすると、アトム長が256バイトとか大きくなると
それだけで馬鹿になりませんね。
183:デフォルトの名無しさん
08/05/15 07:43:27
1億回で1秒くらいかねw
184:デフォルトの名無しさん
08/05/19 23:08:44
codepadにはPrologないなと思ったのでshelogが使えるか試したら動いたので報告。
>974 名前:デフォルトの名無しさん 投稿日:2008/05/19(月) 23:00:17
>schelogを使ってみた。
>Prologと考えるとトリッキーな文法だけど一応動いた。
>ただ、すぐにメモリーのリークでコケル。
>URLリンク(codepad.org)
>
>
>975 名前:デフォルトの名無しさん 投稿日:2008/05/19(月) 23:02:04
>>>974
>例題はBratkoから拝借。
185:デフォルトの名無しさん
08/05/21 12:27:17
InterlogをUNIX系OSにも移植してくれないかな?
186:デフォルトの名無しさん
08/05/21 12:54:20
>>185
同感。
187:デフォルトの名無しさん
08/05/21 18:16:09
interlogなんてHPもなくなってるジャマイカw
188:デフォルトの名無しさん
08/05/29 04:23:19
Prologみたく演算子を追加できる言語ってyaccのような
パーザジェネレータで扱える?
扱えないとしたら、CやJavaでProlog処理系を書くとき、
パーザは自前で書くのが普通?
検索してもProlog(DCG)「で」構文解析する情報ばかりで、
Prolog「を」解析する情報が見つけられないもので…
189:デフォルトの名無しさん
08/05/29 17:26:35
yacc 使うんなら演算子っぽいものを優先順位なしでパースして、
後から構文木を変更していくという手法がある
190:デフォルトの名無しさん
08/05/29 18:38:14
>>188
Java VM などと Warren AM の違いを質問しているのかな?
191:デフォルトの名無しさん
08/05/29 18:42:00
>>190
エスパーですか
192:デフォルトの名無しさん
08/05/29 19:04:19
Prolog compiler の実装は、WAMが公開されたのでそれが主流になっている。
WAMでググってPDFファイルを熟読汁!
193:デフォルトの名無しさん
08/05/29 19:27:46
Prologを効率よく実行するためには、こういうアーキテクチャのコンピュータがあればよい、という、モデルとして、「Warrenの抽象機械(Warren's Abstrusion Machine)」というものがあります。
WAMはDavid Warrenという人が考案したものです。WAMは、そもそも、WarrenがPrologのコンパイリングの研究のために考えたものです。
そして、WAMは Prolog実行の本質をついていたので、WAM以降、 Prologマシンのアーキテクチャは強くWAMの影響を受けました。
WAM はレジスタベースの汎用マシンアーキテクチャを意識して, DEC-10 Prolog(当時主流だった Prolog 処理系)より洗練された機械語命令セットを持つコンパイル技術を提案しました。
今ではこの命令セットを持つ仮想マシンを WAM(Warren Abstract Machine) と呼びます。ちなみに標準のJavaバーチャルマシーンはスタックベースです。
WAM は,バックトラックが少なく,複雑なユニフィケーションも少ないという設計思想を前提に高速化を実現しようとしました。
David WarrenはSB-Prologの作者の一人です。SB-PrologはStony BrookにあるSUNYのDavid WarrenとSuzanne Dietrichによって作られ、メンテナンスがアリゾナ大学に移って、現在に至ります。
SB-Prologの実行系は、実は、WAMのインタープリタです。つまり、CでWAMの仮想マシン・インタープリタを記述し、実行はWAMインタープリタが行います。
SB-Prologでは、そのほとんどの機能がPrologで記述してあり、Prologのコンパイルがネイティブな機械語でなく、WAMへコンパイルします。
WAMは、極力"ごみ"データが少なくなるように工夫されていますが、大規模な応用プログラムを扱うためには Garbage Collectionが必要となってくるのでWAMを拡張した抽象マシンがいくつか研究されています。
SB-Prologのソースを読むと質問の答が得られると思います。
194:デフォルトの名無しさん
08/05/29 19:36:12
AndroidにはJavaのサブセット内で書かれたDalvik VMが含まれているが、これはレジスタベースになっている。
Dalvikは現在インタプリタ形式だが実機発売時期に合わせてJITに変更するらしい。
195:デフォルトの名無しさん
08/05/29 19:42:33
WAMの命令セットは、Prologの本質をついてるかはわからんが、暗黙的な操作が
多くて大変扱いづらい。手続き型言語の悪い所の見本のような感じ。
誰かがそろそろPrologのVMを再設計してもいい頃。
196:デフォルトの名無しさん
08/05/29 19:48:29
Prolog のコンパイルスキーム
Prologコード → WAM (Warren's Abstract Machine) コード → アセンブリコード → 実アセンブリ
WAMは、レジスタの少ないCPUには向かないのでSWI-Prologは遅いです。
それに比べるとSICStus/QUINtus は、Threaded code というのを使っているのでかなり速い。
AndroidのDalvikもたとえJITにしてもレジスタの少ないCPUでは速度がでないことはほとんど自明です。
197:デフォルトの名無しさん
08/05/29 19:52:37
>>195
>誰かがそろそろPrologのVMを再設計してもいい頃。
すでにある。
>>193
>WAMを拡張した抽象マシン
>>196
>SICStus/QUINtus は、Threaded code というのを使っている
198:デフォルトの名無しさん
08/05/29 20:34:50
WAM に問題があるというよりCPUとのマッチングの問題じゃね?
199:デフォルトの名無しさん
08/05/29 20:36:33
threaded codeは実装のテクニックであって、VM/AMの命令セット設計の話
とは無関係ですよ。
200:デフォルトの名無しさん
08/05/29 20:59:36
SICStus/QUINtus はWAMを使っていないから全く異なる命令セット設計のVM/AMになっている。
201:デフォルトの名無しさん
08/05/29 21:13:32
WAMは滅びたんだ。よかった。
202:デフォルトの名無しさん
08/05/29 21:36:16
商業ベースでは滅んだ。しかし、我々が使う全てのフリーの実装ではどうしてWAMが使われているのか?
203:デフォルトの名無しさん
08/05/29 21:45:41
>>201
こいつムカつくな
204:デフォルトの名無しさん
08/05/29 22:37:01
ああよかったよかった、Prologが滅びてw
205:デフォルトの名無しさん
08/05/30 00:19:54
>>189
トン
それだとyaccで作れる構文木って複合項とかに禿げしく限定されない?
:-とか優先度1200の演算子は任せられるか。後は単なるatom?
それだったら自前でパーザ書いても大差なさそうだな
>>190
壮絶に的外れ。
CやJavaでPrologコンパイラを書く場合に構文解析をどうするかって話。
WAMはその後の話。盛り上がってるからいいけど
>>192
MIT PRESSのWAM本は読んだ。
206:デフォルトの名無しさん
08/05/30 00:32:56
prologの授業頑張ってたけど
もっと頑張っとけばよかった・・・
207:デフォルトの名無しさん
08/05/30 00:36:57
>壮絶に的外れ。
親切にレスしてくれてるのによくこんな言葉遣いできるよな
208:デフォルトの名無しさん
08/05/30 00:48:33
Prologerには自意識過剰で人を見下す傾向がありますからw
209:デフォルトの名無しさん
08/05/30 00:51:10
ぶっちゃけ>190の読解力は目を覆わんばかり
210:デフォルトの名無しさん
08/05/30 01:55:16
WAM厨w
211:デフォルトの名無しさん
08/05/30 01:57:15
>>208
たしかにPrologerは電波出してる奴多いんだよw
212:デフォルトの名無しさん
08/05/30 13:19:23
>>209
同感w
213:デフォルトの名無しさん
08/05/30 14:59:08
ぶっちゃけ>>190はネタだと思って笑い飛ばしていたんだが、マジだったのだろうか
214:デフォルトの名無しさん
08/05/30 18:11:46
たまにスレが伸びてると思ったら喧嘩ですか。
215:デフォルトの名無しさん
08/05/30 19:57:25
こんな過疎スレにも荒らしがきてるのか。必死に自演しても見るのは数人しかいないと思うが…
216:デフォルトの名無しさん
08/05/30 20:15:17
喧嘩にはなってないだろ。>>190がフルボッコなだけw
>>190の読み違いはプギャーだが顔真っ赤にして反論しないのは大人
217:>>188=205
08/05/31 01:09:36
荒れる原因作ってスマソ
だが本題のレスが>189だけなのは残念
ここの住人はProlog処理系もPrologで書くような人達なんだろうな
参考になる資料見つけた(PDF)
THE DESIGN AND IMPLEMENTATION OF A PROLOG PARSER USING JAVACC
URLリンク(digital.library.unt.edu)
JavaCCはPCCTS由来のLL(k)パーザジェネレータで>189と同じやり方。
HaskellのパーザコンビネータParsecをJavaにポートしたJParsecでは
動的な文法が扱える。これらを試してみる
218:デフォルトの名無しさん
08/05/31 06:44:21
>ここの住人はProlog処理系もPrologで書くような人達なんだろうな
それが基本だし,今のCPUなら結構使える
他の方法使っても定数倍だろ?
219:デフォルトの名無しさん
08/05/31 07:15:42
ただし、日本語だけは勘弁な
220:デフォルトの名無しさん
08/05/31 07:24:46
こんなに人居たんだこのスレ・・・
221:デフォルトの名無しさん
08/05/31 07:33:45
>>219
?
222:デフォルトの名無しさん
08/05/31 08:22:36
Parsecねえ
URLリンク(www.lab2.kuis.kyoto-u.ac.jp)
> が、 LL(1) 文法と同等の性能を出します。
URLリンク(www.haskell.org)
> but it performs best on predictive (LL[1]) grammars.
なんか言ってること違う気がw
223:デフォルトの名無しさん
08/05/31 14:52:05
>>188
CMU Prolog Repository
URLリンク(www.cs.cmu.edu)
にPrologで書かれたPrologパーサとCで書かれたPrologパーサが
あったと思います.
224:デフォルトの名無しさん
08/05/31 14:56:02
>>193
DEC-10 PrologとWAMの作者のDavid Warrenは,David H. D. Warrenで
URLリンク(www.informatik.uni-trier.de)
SB-Prologの作者のDavid Warrenは,David Scott Warrenで別人です.
URLリンク(www.informatik.uni-trier.de)
225:デフォルトの名無しさん
08/05/31 15:25:12
URLリンク(www.cs.vu.nl)
> Note that David S. Warren is not David H.D. Warren, the author of the Warren Abstract Machine.
やべ知らなかったw
226:デフォルトの名無しさん
08/05/31 18:12:58
>>224
乙。
227:デフォルトの名無しさん
08/06/01 01:57:40
>>218
演算子を追加できる言語の代表格としてここで聞いてみただけで
対象の言語はPrologじゃないんだ。つか俺にPrologで実装は無理w
>>223
禿げしくトン。これのことかな
URLリンク(www.cs.cmu.edu)
リンク先が切れてるけどここにあった
fURLリンク(ftp.elis.rug.ac.be)
K&RのCなんて読むの久しぶりだw
228:デフォルトの名無しさん
08/06/01 06:54:55
rterm.cのreduceで順序立ててるみたいだから、結局同じなんじゃないの
229:デフォルトの名無しさん
08/06/01 22:38:10
>>228
同じって何と?>189と同じなら>205
> それだったら自前でパーザ書いても大差なさそうだな
230:デフォルトの名無しさん
08/06/02 00:14:22
「演算子っぽいもの」っていうよりも、節を構成する項の列全体(「.」まで)を一旦スタックに積む感じだったよ
231:デフォルトの名無しさん
08/06/02 00:16:44
「項の列」はちょっとまずいか。言い方わかんねw
232:デフォルトの名無しさん
08/06/02 00:36:16
>>230-231
>205の
>:-とか優先度1200の演算子は任せられるか
ってことだよね。','は優先度1000で':-'より強いから
233:デフォルトの名無しさん
08/06/03 02:54:23
>>200
> SICStus/QUINtus はWAMを使っていないから全く異なる命令セット設計のVM/AMになっている。
そのVM/AMについて調べたいのですが、どこかに情報あるでしょうか?
「Optimizing the SICStus Prolog virtual machine instruction set」
fURLリンク(ftp.sics.se)
という資料があったのですが、これはWAMを拡張したVMのようです。
234:デフォルトの名無しさん
08/06/12 08:10:51
>>188
亀レスだが。一番普通に皆がやってるのは、
SWI-Prologのソースを参照する(盗む)ことだと思う。
235:デフォルトの名無しさん
08/06/12 23:55:42
>>234
質問する前に見たw
188で質問したのは「どうパーズするか?」じゃないんだ。
「パーザジェネレータで」できるかってこと。
動的といってもたかがしれてるんだから構文解析表を
操作すればできるんじゃないかと思ったんだけどね。
236:デフォルトの名無しさん
08/06/13 20:52:51
じゃあこれで
URLリンク(en.wikipedia.org)
>$ ./parenthesise a \* b + c ^ d / e
>((((a))*((b)))+(((c)^(d))/((e))))
237:デフォルトの名無しさん
08/06/14 00:30:01
>>236
それ>188=235へのレス?
演算子順位法なんてコンパイラの本に普通に出てくるんだが。
そんなことも知らないと見下されてるわけか。バカにされたもんだな。
自前でパーズする方法を聞いてるんじゃないってことがなぜ伝わらないのか。
「○○というパーザジェネレータを使うと動的に演算子を追加できる」という情報が
あるなら教えて欲しい、それだけだ。
238:デフォルトの名無しさん
08/06/14 01:51:09
ネタってことがなぜ伝わらないのか
239:デフォルトの名無しさん
08/06/14 11:25:57
後出しジャンケンって嫌われる傾向にある
240:デフォルトの名無しさん
08/06/14 12:10:23
喧嘩腰w
241:デフォルトの名無しさん
08/06/15 01:20:34
>自前でパーズする方法を聞いてるんじゃないってことがなぜ伝わらないのか。
書き方が悪いってことがなぜ伝わらないのか。
242:デフォルトの名無しさん
08/06/15 01:26:15
>>241
少なくとも>235で伝わらないのは読み手の問題だろ。
243:デフォルトの名無しさん
08/06/15 01:48:06
自演までしてネタにマジレスカッコ悪いw
頭悪いんじゃねw
244:デフォルトの名無しさん
08/06/15 01:59:05
>>243 スマン、俺は>>241だがどこが自演なのか教えてくれないか
245:デフォルトの名無しさん
08/06/15 11:04:14
Prologの話しろよクソども
246:デフォルトの名無しさん
08/06/15 21:55:57
>>245
だいべんしてくれてありがとう
247:デフォルトの名無しさん
08/06/16 00:39:19
>>245-246
糞TALK(藁
248:デフォルトの名無しさん
08/06/16 00:44:26
バカ専用 普通 ハッカー ウィザード
┝ - - - - ┿━━┿━━┥
∩___∩ /)
| ノ ヽ ( i )))
/ ● ● | / /
| ( _●_) |ノ / 今はここら辺クマーー!!
彡、 |∪| ,/
/ ヽノ /
249:デフォルトの名無しさん
08/06/16 02:21:02
まったりするスレだってことがなぜ伝わらないのか
250:デフォルトの名無しさん
08/06/16 03:50:56
2chでスレ荒らし 普通 ハッカー ウィザード
┝ - - - - ┿━━┿━━┥
∩___∩ /)
251:デフォルトの名無しさん
08/06/16 05:36:33
Ubuntu7.1 で
Progol4_4 をmakeするとエラーに
なるのですが、なにかご存知の方、
コメントをください。
# sudo sh expand.sh
・・・解凍して展開・・・
gcc -O2 -c -o command.o command.c
command.c: In function 'c_interp':
command.c:55: error: 代入として無効な左辺値です
とメッセージがでます。
252:デフォルトの名無しさん
08/06/16 06:53:04
command.c:55: error: 代入として無効な左辺値だってことがなぜ伝わらないのか
253:デフォルトの名無しさん
08/06/16 07:07:11
>>252
それは、判るのですが、どうすればいいのでしょうか?
254:デフォルトの名無しさん
08/06/16 14:24:24
左辺値をキャストしちゃダメなんだそうで。
URLリンク(c-faq.com)
URLリンク(www.kouno.jp)
> キャスト は変換演算子であって、それは右辺値を生みだすと定義されている。
> 右辺値であるとするなら、代入することも++で足し算することもでき ないことになる
> (pccから派生したコンパイラやgccの拡張機能が上の ような式を受け付けることは例外である)。
書き直す(左辺値用のマクロを用意する?)のが正しいと思うけれど、
gccのオプションをいじればどうにかなるのかも、なんて思ったりして。
255:デフォルトの名無しさん
08/06/16 14:28:15
いや、なんか適当にポインタを取ったりすればいいのかもしれない。適当。
256:デフォルトの名無しさん
08/06/16 16:01:28
しったかぶってただけでしたw
257:デフォルトの名無しさん
08/06/16 17:02:57
>>251
URLリンク(gcc.gnu.org)
この人の場合、どうやら古いgccでコンパイルしなおしたらしい。
pagaddedって何かわかんないけど
258:デフォルトの名無しさん
08/06/16 17:45:24
そんなことも知らないと見下されてるわけか。バカにされたもんだな。
そういうことを聞いてるんじゃないってことがなぜ伝わらないのか。
情報があるなら教えて欲しい、それだけだ。
259:デフォルトの名無しさん
08/06/16 17:54:17
> By the way, I'm running the latest version of gcc on a Sunblade 100 workstation.
だからpkgadd(ed)、かな
260:デフォルトの名無しさん
08/06/16 20:42:27
command.c
> CTYPE(cclause)=pdot0;
progol.h
> typedef int BOOL, INT;
> typedef long int LONG;
> typedef double DOUBLE;
> typedef char *STRING;
> typedef char *POINTER;
:
> #define I_GET(i) ((i)->obj)
:
> #define CTYPE(c) ((LONG)I_GET(F_ELEM(2l,(c))))
:
> struct item {
:
> POINTER obj;
世の中間違ってる
261:デフォルトの名無しさん
08/06/16 20:51:16
> #define CTYPE(c) ((LONG)I_GET(F_ELEM(2l,(c))))
#define CTYPE(c) (*(LONG *)&I_GET(F_ELEM(2l,(c))))
こんなんできたっけ
262:デフォルトの名無しさん
08/06/16 21:50:26
普通 まったり 超まったり dat落ち寸前
┝ - - - - ┿━━┿━━━┥
∩___∩ /)
263:デフォルトの名無しさん
08/06/16 23:26:45
>>262
2ちゃんに「普通」なんつー概念はありえねーw
264:デフォルトの名無しさん
08/06/16 23:32:25
自分以外を「2chでスレ荒らし」と言ってる奴だから、対話は成立しないだろ。ほっとけ。
265:デフォルトの名無しさん
08/06/17 01:23:04
Prologって何の問題を解くのに向いているのでしょう?
手続き的な処理には不向きな気がします。
私はこのスレを読んでシステムの用件定義時に個別の用件の妥当性
をチェックするなどに使えるかな?と思っています。
ミナサンはどんな問題を解くのに使われていますか?
ちなみに、Javaや.Netなどから呼び出せたりするPrologってありませんか?
266:デフォルトの名無しさん
08/06/17 01:50:23
URLリンク(kaminari.scitec.kobe-u.ac.jp)
URLリンク(www.cs.kuleuven.ac.be)
267:デフォルトの名無しさん
08/06/17 02:18:30
>>264
何か誤解されているようですが。
268:デフォルトの名無しさん
08/06/17 02:48:04
P# というのもあります。
URLリンク(homepages.inf.ed.ac.uk)
Prolog から C# へのトランスレータということになります。
>>266 にでてくる PrologCafe で書かれています。
269:251
08/06/17 02:59:52
皆さんの示唆によりまして、
めでたく、Progolの起動まで漕ぎ着けました。
ひとまず、ありがとうございます。
ひとまずというのは、
>>261 はその通り直したのですが、同様にエラーのでた
(LONG) を「なんか適当にポインタを取ったり」という感じで
コメントアウトしてしまったらうまく行った、ということです。
それでは、問題があるかもしれないから、今日
(LONG)を生かす方法を試みます。
270:デフォルトの名無しさん
08/06/17 03:38:51
>>265
Prologの手続的解釈というのもあります。あくまで、Prologをどう読むかということですが。
プログラマが副作用に着目している以上、深さ優先探索を「悪用」して、
あーやって、つぎにこうやって、という具合に読んでいくことは現実味があります。
関数型ではPrologから影響を受けたErlangが似た構文を持っています。
271:デフォルトの名無しさん
08/06/17 04:37:35
>>261です
URLリンク(piza.2ch.net)
>1 名前: 厨房エログラマ 投稿日: 2000/09/12(火) 11:54
> unsigned long a = 0xcccccccc;
> (unsigned char)a = 0xff;
> このようなコードをみました。
> VC++で試したところ、拡張子CPPではエラーになりましたが、
> 拡張子Cでは問題なく通り、aの値は 0xccccccff になりました。
> この代入はC言語の規則上では正しいのでしょうか?
>10 名前: >8 投稿日: 2000/09/13(水) 08:15
> ANSIでは(unsigned char)aは左辺値じゃないから代入文の左辺に
> は置けない。これはANSIでは「処理系依存」ではない。
>
> この記述ができるコンパイラはANSIに従っていない。このため
> VC6も-ZaでこのMS拡張仕様を無効にする手段を用意している。
>
> gccではコンパイルできるが結果は0xccccccffでなく
> 0x000000ffになる。同様に-ansi -pedanticをつけて厳格に
> ANSIに準拠させるとエラーとなる。
>
> 言語仕様を(暗記せよとはいわないが)調べるぐらいしたら
sizeof(LONG) == sizeof(POINTER)
という仮定がされている、という仮定をしてしまった気がするとです