1 名前:デフォルトの名無しさん [2007/10/26(金) 08:26:46 ] 過去スレ PrologでまったりPart 2 pc11.2ch.net/test/read.cgi/tech/1102664221/ Prolog でまったり pc5.2ch.net/test/read.cgi/tech/976462999/ リンク集 www.summa.jp/lang/logic/prolog.htm bach.istc.kobe-u.ac.jp/prolog/ チュートリアル www.amzi.com/AdventureInProlog/ computing.unn.ac.uk/staff/cgpb4/prologbook/ www.intranet.csupomona.edu/~jrfisher/www/prolog_tutorial/pt_framer.html bach.istc.kobe-u.ac.jp/prolog/intro/ www.geocities.jp/m_hiroi/prolog/ www.asahi-net.or.jp/~JF1T-YSD/prologV2/
2 名前:デフォルトの名無しさん [2007/10/26(金) 09:09:35 ] 2
3 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 16:18:13 ] 最新のスレッド(Prolog) :- 3.
4 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 18:18:05 ] 乙(1).
5 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 19:42:17 ] ERROR: Undefined procedure: 乙/1
6 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 23:35:24 ] live(乙一).
7 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 23:45:32 ] ERROR: Suspended writer: 乙一
8 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 04:55:15 ] :- 乙(>>(1)).
9 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 10:04:39 ] ?- halt.
10 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 17:22:18 ] 半日で(67)か。age進行のスレが多いのだな。 ちょっと質問です。 皆さんが使っているTCP/IP関連の述語を教えてください。 組込、ユーザ定義を問わず。 できれば、引数の定義域が解るといいな。 ライブラリを作ろうとか、標準化を考えようなどと いうのではないけれど、皆さんがどのレベルまで 抽象化して使っているかは知りたい。
11 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 15:26:23 ] 本当の意味でのPrologの第一世代は1960年生まれですね。 大学卒業時にICOTの活動が始まったという世代です。 この人達が、リタイアするのは2020年以降。ここから Prologの再興が始まるのでしょうね。具体的には、 金も少しはあり、青春時代の思い出に浸る余裕を持った 人たちが、集まって論理プログラミングをテーマとする 会社を興す。研究会を始める。そんな動きが期待されます。 だから当分は、Prologでまったり、ですね。
12 名前:デフォルトの名無しさん [2007/11/03(土) 00:39:09 ] 最近prologを勉強し始めました。 疑問なのですが、prologで作ったプログラムをGUI化することはできるのでしょうか? javaでプログラムのGUI化はしたことがあるんですが、 prologはどうやればいいのか見当もつきません。 どなたか教えて頂けませんでしょうか?
13 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 07:26:31 ] SICStus-Prologやgprolog(GNU-Prolog)も広く使われていますが私は知りません。 AZ-PrologはProlog-KABA互換から発展してきたものですが、Windows版には GUI述語があるようです。 ttp://www.sofnec.co.jp/az-demo/
15 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 08:33:14 ] >>13 >>14 に代表的なProlog処理系を挙げたと思うのですが、この中で、 日本語処理が満足な水準なのは、 SWI-Prolog K-Prolog Minerva IF/Prolog(上にはない) AZ-Prolog で他はだめですね。私にとってはこれは絶対的な条件ですから、 他のPrologは興味がありません。
16 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 14:52:44 ] 悲しむべきお知らせ。 "PROLOG Programming for Artificail Intelligence" Ivan Bratko著の 最新版の出版が来年の五月に延びてしまいました。
17 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 17:27:20 ] 1980年代から90年代にかけて、Prologが全盛期であったことは 大方の認めるところ。この時期に書かれたPrologの記事は その微妙な時期的な問題から、今日Web上で参照することが 難しい。著作権、版権の問題があり、勝手に公開することは 勿論できません。しかし、これは残念なことです。 今日も、"Functional Grammer in Prolog" Simon C.Dik著と いう本を開いてため息をついてしまいました。本を開いたら、 いきなりヒバリのさえずりが聞こえた、という例えがあり ますが、そんな本です。ああ、こんな本を、Webが良いというなら そこに公開してあげたいな。そっくり、タイプするくらいの 手間なら厭わないのに。残念。 Prologの本って、和書も含めて、そんな本だらけです。当時は ちょっと馬鹿にして読まなかった本が実に工夫されて良く書けて いる。どれも味があります。 私、もうすぐ死ぬのかな?
18 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 17:30:13 ] 例え ではなくて 譬えか
19 名前:デフォルトの名無しさん [2007/11/06(火) 03:57:12 ] >>15 で日本語処理という話がでましたが 極めて簡単な日本語処理テストの方法を書いておきます。 ?- assertz((山田(_太郎) :- write(_太郎))). yes ?- 山田(太郎). 太郎 yes ?- この通り動けばほぼ合格とみてよいでしょう。 ただ、文字コードのある領域だけエラーになると いう例もあったので、完全ではありません。
20 名前:12 mailto:sage [2007/11/06(火) 07:57:26 ] 皆様ありがとうございます。 prologで作ったプログラムはHTMLで表示可能なのでしょうか? 現在、prologで旅行経路検索プログラムを作っているのですが、 これをWeb上でクリックや数字を入力して利用できるようにしたいのです。 やはり素人には難しいですか?
21 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 01:58:30 ] ラッパー被せたらなにも問題ないと思うけど、、 まあ、標準出力のはじめにヘッダー吐くようにしておけば、あとは普通に標準出力でかまわないね。 ただ、インタラクティブな操作はすこし難儀そうだ。
22 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/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','''') :- ! . <略> 漢字コードの変換はさらに面倒。 これは長くなるので、どうしても必要なら、 pc11.2ch.net/test/read.cgi/mysv/1188833105/ で質問してください。
24 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 05:16:29 ] 漢字コードを極力使わないためにはHTMLファイルの selectタグを <select name="ekimei"> <option value="shibuya">渋谷</option> <option value="shinjuku">新宿</option> </select> のように返ってくる値をローマ字に変換すればよい。 勿論inputタグは使わない。 これに徹すればPrologの解析部分は随分と楽です。
25 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 14:19:38 ] tuPrologがなかなかいい件
26 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 16:11:51 ] >>25 私は使い方が全くわからず放棄したまま。
27 名前:23 mailto:sage [2007/11/07(水) 16:34:28 ] リンクを間違えました。(答えが長くなりそうな質問は、) pc11.2ch.net/test/read.cgi/mysv/1102662133/ でした。随分前に私が立てたスレです。ソースコードを どんどん貼り付けて構いません。
28 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 16:43:30 ] >>26 まぁ単体で使っていいことはないんだけどね. 俺は自前のJavaプログラムからtuPrologの機能使ってるんだが, かなりいい感じ.Java同士だから相性抜群てとこかな. マニュアルもしっかりしてるところも嬉しい. Javaから使った場合は最高(使いやすさは). 使い方はダウンロード&解凍→ 2p.jarってのが実行ファイル これがIDEっぽい感じ. 日本語は△ってとこかな. IDE使うと日本語は書けない. でも,テキストエディタで書いてtuPrologで読込むと 文字化けして日本語が全部"□"になってしまうんだが, きっちり認識されてて,実行できる.
29 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 20:10:42 ] >>28 ありがとう。version 2.1 が動きました。 IDE風の実行環境では、 >>19 の日本語テストは完全に動きました。 OSはRedhat9なのですが、文字コードがEUCのせいですね。
30 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 20:26:27 ] FedoraCore5でもやってみましたが、同じ結果となりました。 一つ気になることは Output という表示で '太郎' となることです。 ?- tell(temp),山田(太郎),told. を実行してファイルtempを見てみるとやはり、'太郎'になっています。 'を削除するというやっかいな仕事が後に残りそうです。
31 名前:デフォルトの名無しさん mailto:sage [2007/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 mailto:sage [2007/11/07(水) 20:33:22 ] /TruType/ ではなく /TrueType/ ですね。
33 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 21:03:10 ] このtuPrologを使うと、JavaServletからPrologを 呼びだすというようなことが自在になるのでしょうか。 そうだとすると、面白いですね。 MinervaだとJavaAPIの各クラスが簡単な指定で、 Prologの述語として定義できてしまいます。 tuPrologではどうでしょうか。
34 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 22:11:18 ] tuPrologのサイトってこれ? ttp://tuprolog.alice.unibo.it/ sourceforge逝ってもここに飛ばされるけど403なんだぜ
35 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 22:54:55 ] >>34 俺は sourceforge.net/projects/tuprolog でダウンロードした希ガス >>33 サーブレットは詳しくないが,サーブレットからもいけると思うよ. tuProlog自体がJavaだからね. あと,マニュアルのChapter 6 Accessing Java from tuProlog あたりにPrologからJava操作するのが載ってるような
36 名前:34 mailto:sage [2007/11/07(水) 23:18:43 ] >>35 トン
37 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 07:27:40 ] ?- select * into X from 売掛 where 締日>='20070901' and 締日<='20071031', member([_顧客,_締日,_前残,_入金,_売上],X). でしたね。memberを落としてしまいました。 後の質問から、この節を導くのが難しいのですが、最初に示したエラーに なる質問からだとそれほど難しくありません。 基本的にはtracer(debugger) の話ですが、制約論理プログラムや遅延評価への ヒントもすこしは含む話になります。
39 名前:デフォルトの名無しさん [2007/11/09(金) 07:52:40 ] Prologの内部データベースを参照しているコードでは ?- 売掛(_顧客,_締日,_前残,入金,売上),_締日@>='20070901',_締日@=<'20071031'. の順序であり、これを外部データベース参照用に切り替えたいという要求も 当然ありますから、難しいとは言ったけれど、この話の最後に研究してみましょう。
40 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 15:17:16 ] 条件句の生成/4 出はなくて 条件句の作成/4 でした。 以上で大体(細部には問題有り)できあがりですが、もう一度どうして こんなことを長々書くのか説明して終わります。 15年以上前ですが、Prolog処理系の作成者として有名なK氏とSQLの集約命令に ついて、雑談していました。その中でK氏がSQLのgroup by 句はよくない。 あれですんなり理解できる素人は少ないとの意見を述べられました。そして、 PrologのQueryのようなもので代替するべきことを暗に指摘しました。 私もK氏とまったく同意見でその時以来これは私のテーマの一つとなり、 実務で使用するデータベース照会述語を少しずつSQLからProlog述語に置き換えて いったのです。今回は最も単純なものを載せました。 このほかにも、中島秀之氏が提唱されたことのある「項記述」を借用したもの などに奥行きを感じました。これは、述語呼び出しに手を入れるもので、 売掛(_顧客,{_締日|_締日@>='20070901',_締日@=<'20071031'},_前残,_入金,_売上), のような呼び出し方になります。もとの副目標としての形式を毀してしまうので、 使いにくいのですが、考えてみれば、_締日 @>= '20070901', を呼び出しの 前に追加挿入することも同じことですから、これでよいのかも知れません。
47 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 16:12:50 ] 乙 おもしろかった。
48 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 17:11:29 ] 顧客番号 ではなく 顧客 ね。
51 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 17:26:02 ] >>48 solve(# P,V,L1,L2) :- !,データベース呼び出し(P,L1). データベース呼び出し(_副目標,L1) :- _副目標 =.. [_関係表名|_引数ならび], select cname into _属性名ならび from col where tname=_関係表名, 条件の選別(_属性名ならび,_引数ならび,_条件句候補), ... でよいのか。
52 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 17:29:08 ] またしくじった!! solve(# P,V,L1,L2) :- !,データベース呼び出し(P,L1). データベース呼び出し(_副目標,L1) :- _副目標 =.. [_関係表名|_引数ならび], select cname into _属性名ならび from col where tname=_関係表名, 条件の選別(_属性名ならび,_引数ならび,_条件句候補,L1), ... ですね。
53 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 04:51:17 ] nbsp を入れ忘れましたね。すみません。第一引数か変化したときに リストを原型に戻すという手法ですね。なお、引数は _属性名リスト,_引数ならび,_解の収集欄,_変数情報リスト原型,_残りの変数情報リスト です。
57 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 06:07:24 ] 今回もバグの山、粗忽の見本となりました。Prologでまったり2で 随分ベテランらしいプログラマがエラーの連続とするということは、 Prologというのは余程不完全な言語らしい、との評もいただきました。 バグの山となるのは私の性格と能力によるものでこんなことで、 Prologの評価が下がるのは残念です。 私のスレへの書き込み環境はFirefoxの縦六行の<textarea>で全く読み返しを しませんから(上にスクロールしたものも)ミスがでるのも仕方ないと 思っています。それどころか、Prologプログラミングの理想は 思考経路が陽に現れたものではないかとさえ思っています。誤謬も含めて、 そのプログラムを読んだ人が、ああ、この人はああ考え、こう考えて、 ここのコードを書いたのだなと解るコードこそ、論理プログラミングの 極致ではないか。コピペや参照を極力避けて、狭い窓の中での 即時的なミニマムな思考がPrologのプログラミングとして現れている、 そう人が感じてくれるコードを書きたいものです。 とんでもない、エラーや思い違いが貴重なこともあるのではないか。 このプログラミング言語が世に現れたちょうど同じ頃、サティの音楽が 街に溢れ始めました。
59 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 04:32:40 ] あなたをベテランだと考えている人間はごく少数だと思われます。
60 名前:デフォルトの名無しさん [2007/11/23(金) 17:25:30 ] w-zero3というwillcomの携帯(WS003SH)にswi-prologをインストールされた方もしいらっしゃれば、手順を詳しく教えていただけないでしょうか? 下のページを見ながら挑戦しているのですが、いくつかあるpl.exeどれをインストール・実行しても「有効なPocketPCアプリケーションではありません」と出て実行できないのです。 ttp://www.rainer-keuchel.de/wince/swi-prolog.html また、swi-prolog以外で、windows mobile で実行できるprolog環境でおすすめのものがありましたら是非教えていただきたく思います。
61 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 10:59:43 ] このためだけにwilcomの携帯を購入する訳にもいかないので、この話私はパス。
62 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 13:33:54 ] >>61 固定つけてよ。NG登録するから。
63 名前:prolog mailto:sage [2007/11/25(日) 23:31:29 ] こういう風にやればいいの?
64 名前:proIog mailto:sage [2007/11/26(月) 07:09:30 ] つけてみた
65 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 23:21:04 ] A「私は右から二番目。Bと隣り合わせ」 B「私の隣には嘘をついてない人がいる」 C「私は嘘をつかない人だから、妬まれて2人に挟まれてる」 D「私の左は悪い人、右は良い人」 ABCDのうち、2人が嘘つき。並んでる順番を求めなさい。 ってのを見て、Prologでやろうと思ったが書き方が分からん。
66 名前:デフォルトの名無しさん [2007/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 名前:デフォルトの名無しさん [2007/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 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 22:38:15 ] 保守。
69 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 00:58:06 ] Prologを使ってる方がいらっしゃるようなのでお聞きしたいのですが、 処理系によってはギガバイトクラスのデータに対しても使えるのでしょうか?
70 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 21:30:14 ] これ凄い。 ttp://edoc.bib.ucl.ac.be:81/ETD-db/collection/available/BelnUcetd-12032007-095411/unrestricted/thesis.pdf 3月下旬に本も出た? ttp://www.amazon.co.jp/Towards-Putting-Abstract-Interpretation-Practice/dp/3836488582/ref=sr_1_3?ie=UTF8&s=english-books&qid=1207570620 INAPを見てもヨーロッパからの学術論文は続々。日本、本当に大丈夫なのか。
71 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 07:55:53 ] P# 日本語通るようにならないかなぁ。
73 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 11:56:57 ] >>72 Prolog Cafeを試してみたら?
74 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 20:16:23 ] >>73 ありがとう。 私はmonoでOSはKbuntuをutf-8のところをEUCに使っている。これだと、 何がおきても仕方がないのだけれど、PrologCafeを起動した場合、 ほぼ日本語は満足がいくレベル。それが# mono PsharpIntrp.exe で起動されるPrologCafeではまったくダメ。 ひとつは、Windowsだとどうなのだろうということ。(私の家にはWindowsがない) もうひとつは、Psharp.dllを変更できないかということ。
75 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 12:47:21 ] >>74 WindowsXPだと日本語使えなかったよ。
76 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 09:40:33 ] ちょっと質問なんですが、 file2list(File,List) :- see(File),findall(X,(repeat,read(X),(X=end_of_file,!,fail;true)),List),seen. は、随分と胡乱臭いコードなのですが、皆さんはどんな方法でさばいていますか?
77 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 11:35:35 ] > 胡乱臭い 妙な言い回しだな
78 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 12:36:17 ] 胡乱な、かw
79 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 12:45:32 ] 胡散臭い
80 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 19:20:25 ] 胡乱臭い・・・これは面白い表現かもしれぬ!
81 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 21:29:13 ] >>81 一般に業務システムのように大量ファイルを扱う場合、 再帰で書くとヒープ領域に解放できないアトムがたまり、 システムダウンの危険が発生する。それで、repeat failの 間で処理を済ませる。こうすることで、アトムを極力GCの 対象になるようにするのが定石です。しかし、この場合は 第二引数のListに貯めていくのだから、どちらのアルゴリズムを 採用してもリストから指されるアトムや複合項があるわけで、 あまり差がないと言えるのでしょうか。
83 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 21:31:29 ] リストから指されるアトムや複合項 -> スタックから指されるアトムや複合項 の方がいいですね。
84 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 04:44:47 ] >>16 5月に第3版の邦訳が出るということでしょうか?
85 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 05:02:22 ] >>84 原書第4版のことでしょ さらに延期されて2008年11月予定になってるけど 10年以上Prologの新刊が出てない我が国じゃ翻訳は期待できないね
86 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 07:47:26 ] そうですね。アメリカの出版社っていうのはかなり前から 近刊を打つんでしょうかね。延期が多いですね。
87 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 13:22:35 ] そうなんですか。 少しいじってみたらとても面白そうなので あちこち眺めてるところでした。
88 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 13:24:24 ] amazonで新刊を見ようと出版月日順にしたら 来年出版予定のがわんさか出てくるから困る
89 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 13:30:53 ] >>87 >>16 と "The Art of Prolog Advanced Programming Technichques" (邦訳名はPrologの技芸)の二冊はすべてのプログラム学習書の中でも 飛び抜けた存在だと思いますよ。
90 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 17:59:08 ] プロログおもしろいよな 学校で学んでよかった 学校行ってなきゃLISPの方勉強してたかもしれない せんせーあんがとー
91 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 18:00:37 ] どっちもどっちだろ
92 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 18:25:44 ] ゲーム的な感覚はプロログの方があるね。反駁と単一化というトリックに 乗せて解くパズルというか。
93 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 18:29:41 ] 生産性も3-4割は高いでしょ。黒川利明さんが言ってたんだから 結構信憑性がある。
94 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 18:34:01 ] prologとocamlにはまってC忘れて就活の筆記で出された C言語の問題を誤答しまくった俺が通りますよ 内定もらったけど最終面接で 「趣味もいいけどC,C++,Javaのどれかは常に使えるようにしとけ」と説教されたw
95 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 19:12:51 ] JavaやってるとC#出来なくなる C#やってるとJavaとC出来なくなる JavaとCやってると開放しようとしたり忘れたりする Prologやってると手続きがボロボロになる
96 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 19:13:09 ] ということは、今4年?
97 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 19:30:43 ] 筆記にC出すなんて珍しい会社だな ってか推薦使えよ・・・
98 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 19:35:18 ] >>95 Prologの手続的解釈。ようするに心の持ち様。
99 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 19:54:32 ] >>94 「PROLOGデータベース・システム」D・リー著 安部憲広訳 近代科学社 は読んだかい?
100 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 21:17:48 ] ttp://www.ifcomputer.com/MINERVA/Manual/Reference/Predicates/logic_and_control/not_provable/home_jp.html > もし、ゴールが失敗すれば、成功し、失敗すれば、成功する。 > もし、ゴール が失敗すれば、成功し、失敗すれば、成功することである。 難しいw
101 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 22:26:35 ] Pは必ず失敗する、どう定義すればいいのかな。 P :- !,fail. でよさそうに見えるが、誰かが上にこう付け加えた。 P. P :- !,fail. 二行(節)目になった P :- !,fail. はPは必ず失敗するの意味を失うのだろうか。 注..Pの部分にはtrue,fail,!,以外の任意の項がくると考えてください。
102 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 11:06:04 ] 質問です。SWI-Prologで以下の質問をすると、 ?- assertz(b(1)),b(X). ERROR: Undefined procedure: b/1 これがISOの標準なのですか?