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/
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の標準なのですか?
103 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 11:23:56 ] 次の場合とどうちがうのでしょうか。 ?- assertz((a(X) :- assertz(b(1)),b(X))). X = _G187 yes ?- a(X). X = 1; no となります。
104 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 15:07:15 ] >>102 ヒープエリアにb()という構造体が作られていないでしょうね。サブゴールは ヒープエリアに構造体がないと実行できないに違いない。 ここでは、コントロールスタック上にだけ、b()の構造体が現れ、しかも、 その中の2つのb()がリンクされていない! そういう解釈になりますね。 ISO標準化かどうかは英文なので私には読めません。
105 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 15:11:41 ] >>103 上の解釈が正しければ、assertzでヒープエリアにb()が作られるので、 今度は参照可になるのでしょう。ちなみにIF/Prologではどちらも参照可でした。
106 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 20:20:12 ] >>104 コントロールスタック上にある構造体相互の参照はありませんね。
107 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 21:58:40 ] >>102 dynamic b/1. をすればokだと思う
108 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 22:02:29 ] >>107 そういうのあるのですか。ありがとうございます。
109 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 07:16:32 ] prologは宣言的な言語だと言われているのに、 挙動の説明にヒープやスタックといった個別の実装モデルが必要となるのが悲しい。
110 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 07:40:17 ] >>109 それどころか、ISO標準のPrologの言語定義が 1) BNF的なもの 2)スタックモデルによる説明 の併記になっていることを知っているかい。 まあ、>>102 以下は実装レベルの話だから、確かに低レベル。
111 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 07:47:40 ] 他の言語で言えば、クロージャあたりに近い話だと思うけれど、 このassert(retract)問題は最初からPrologの弱点と見られていた ように思う。
112 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 08:41:34 ] 1980年代にはPrologでやればソフトウェアの生産性は少しはましになるん じゃないかってそこら辺中でいわれていた。坂村健のようなひとでさえ、 シンポジウムのような席でもそんなことをいっていた。若き日のビルゲイツも 基本言語への採用を考慮し、最終的に見限ってVBの開発を指示したと いわれている。 さて、それでは、どこがPrologがCOBOL等の代替言語になることを阻んだのか、 Windowsの基本言語になりえなったのか、理由をあげてほしい。 現在、Prologをやってるひとには自明なことばかりだと思うが、Prologを知らない 人にPrologを解体して見せるつもりで皆さんあげてください。
114 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 12:56:00 ] Prolog自体は広まっていないが, Prolog → 論理プログラミング → 制約論理プログラミング → 制約プログラミング という過程で,利用されていると思う. 次は,Jリーグのスケジュールの例. ttp://www.atmarkit.co.jp/news/200803/06/ilog.html ILOGの制約プログラミングシステムが利用されているようだ.
115 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 18:08:59 ] COBOLを代替できなったという点は、>>83 にちょっと出てきているが、 アトムの爆発ということだとおもう。Prologではアトムをヒープエリア 内に一旦記述して処理する戦略をとる。極めて大きな記号間の連鎖を表現しよう とする記号処理言語ではどこかに対象となる情報すなわちアトムを保持せざるを えない。この場合、初出のアトムに対し必ずメモリ内を検索し、無い事を確認して 新たに構造体を追加する。業務処理で一日一億のトランザクションを処理する ケースだとこの参照時間だけで相当のものだ。やはり破壊代入だけで済ませる 言語には太刀打ちできない。さらに再帰で処理した場合はオーバーフローの危険が あるし、バックトラックして再束縛する場合でも、ヒープエリアのGCは必ず 必要になる。実際、保険業務などをPrologで処理することを想定すると、すぐに 電話帳一冊分くらいの量のアトムが発生してしまう。 企業業務はほとんどが記号処理、シンボル処理であり、Prologはそういう意味では 極めて適した言語なのだが、残念ながら以上のような理由から、大規模な業務処理 には向いていない。
116 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 08:21:39 ] 大規模な業務処理には向いていない。 しかし、小規模な業務処理には極めて向いているし、 未開拓の対象業務だらけという状態です。この点を 知らしめる必要はあります。 自分だけ儲けるためには静かに潜行するのが上策で しょうが。
117 名前:デフォルトの名無しさん mailto:sage [2008/04/28(月) 19:16:27 ] BEST SOFTWARE WRITING ある本に興味深い文があったので紹介。 Joel Spolsky (青木 靖 翻訳) www.amazon.co.jp/dp/4798115819 (P 82) > ところで、RDFを理解する秘訣はProlog言語のチュートリアルを読むことだ。そ > のコンセプトはすっかり同じで、理解するのはそんなに難しくなく、そうして不 > 透明で不埒なRDFの仕様がはっきり分かるようになる。
118 名前:デフォルトの名無しさん mailto:sage [2008/04/28(月) 19:17:25 ] ありゃ、1行目と2行目が逆になってしまった。すみません。
119 名前:デフォルトの名無しさん mailto:sage [2008/04/28(月) 19:42:39 ] そういやこんなのあったね www.swi-prolog.org/packages/semweb.html
120 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 06:43:07 ] この頃ソースコード載りませんね。このスレこそソースを読みたいんだけどな。
121 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 09:56:22 ] データベースと組み合わせて使ってもやっぱり大規模な業務処理は無理なんですか?
122 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 03:42:35 ] >>121 create table をPrologで行うと、事情はまったく変わりませんね。 select * from を多用しても、全フィールドをアトムに変換しようとするでしょうから、 同じです。 select 商品 from 売上 ですと得られたtupplesの分のアトムが発生します。 Prologの直接のアトムの保管場所がデータベースに移るわけではないので、 本質的な差はないと考えます。 単一レベルの記憶であって、しかも巨大キャッシュメモリが存在し、データベースと メモリーの境界を感じさせないシステムが当たり前になった時には、データベースを Prologで置き換えることが可能になるでしょうから、大転回が起こると思いますが。
123 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 07:15:01 ] データベースと共用しても、PL/IやCOBOLを代替できはしない。 しかし、Prologの最も幸せなプログラミングは連想三つ組の単位節を Queryで極めて少量づつとりだし、それを組み立てて複雑な問題を 解く、というものだろう。データベースを前提にして、このような部分の プログラミングが大規模システムの一角を担うことはもちろん可能で システムの中で、論理系の部分だけ担うという現在のPrologの標準的な 立場とも合致する。現在のシステムにPrologが同居することになる。 それが可能なことなのか否かは、メインフレームのシステム管理に 知識がないから私には、これ以上何も言えないけれど、可能性は 以前から実はずーとあったのではないかと思っている。
124 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 07:39:27 ] 読みかえしてみたら意味不明のところがあったので補足します。 連想三つ組にはたいした意味はありません。強調したかったのは巨大な データベースをQueryとして絞り込み、その情報の組み合わせで世界を把握する というプログラミング態度です。巨像の表面の何か所かの要点を押さえて、 全体の意味を読み取ろうとする、そんな態度ですね。
125 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 10:22:36 ] 適材適所ですよ 今システムを構築している言語にエッセンスだけ吸収されれればこの先も生き残れる
126 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 16:04:25 ] >>125 論理式で記述するということが要点だと思います。Prologのインタプリタや コンパイラから参照することは必須ではない。JavaゃC++からでも一向に 構わないけれど、論理記述の形式としては、Prologほどのものはなかなか ないのだから、このかたちで修練を積んでほしい。
127 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 19:23:10 ] 私はビジネスロジックをPrologで組んで、データの更新とかはRDBMSにまかせようと思っているのですが無謀ですかね? アトムが爆発するというのはタプルをPrologのデータとして読み込んでしまうからで、それをやると破綻するのはどんな言語でも同じだと思っています。 カーソルを移動しつつ順番に処理していったり、必要に応じてSQLクエリを発行するという部分をPrologで書けないかと思っているのですが。
128 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 06:12:13 ] 凄く初心者質問だと思うのですが Prolog に方程式を解かせることって出来ますか? ごく簡単な式で良いんです。例えば 2 + X = 5 とかそんな感じです。
130 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 06:12:22 ] ピーク時7000レコード近くあったのが店を何店か閉めて減ってしまいました. 20分と書いてあるのはこのピーク時の平均でした。今朝測ったら11分。 ただし、これは皆様ご存知の事情によるものです。
131 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 06:34:58 ] >>129 さすがにこの方程式解くプログラムなら私にも書けそう。 変数が二個以上入る連立方程式は、変数同士の関係についての 記述であると考えられます。 この変数同士の関係のことを制約といい、制約論理型言語と いうものがその目的には相応しいとされます。つまり、今我々が 使っているPrologはこの制約を表現するのにやや欠けた仕様だ、 ということです。いくつかのPrologは自身をもう一層高水準に拡張 して制約論理型言語であると称しています。制約論理型言語の なかにはPrologを土台としていないものもあります。詳しくはWikiか 何かで調べてください。
132 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 06:44:55 ] ごめんなさい。2 + X のはずが2行目から以後、2 + 5 になってしまいました。 5をX に置き換えて読んでください。
134 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 08:22:33 ] >>129 方程式の解法(A + B = C) :- integer(A),integer(C),var(B),B is C-A. ではだめかw
135 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 08:58:19 ] そりゃ反則だw
136 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 09:01:41 ] >>134 パターン全部書けばいいね。 でも、integerではなくnumberですね。
137 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 10:36:17 ] >>129 わざわざ「Prologで〜できますか」と書いているところを見ると、 Prologにそういう機能が内蔵されているか、という質問のように思えるね。 それはまあ、ありませんw 方程式を解くというのも、どちらかというと個別的な知識でしょう。 ただし、自分の知っている「式変形の規則」をだだっと書き出して、 それを堂々巡りしないように順序立てるだけで、案外そこそこ動くものができるかもね
140 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 12:47:41 ] >>138 何かと思えば、、 自然数の加減算ならリストを経由してappendで解くという変態技もありそうだw
141 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 12:53:53 ] 方程式を素で解くなら Mathematica とか Maple とか使うことになるな。
142 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 12:55:59 ] 頭いいなw
144 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 13:08:33 ] >>144 ざっと見て計算量がA×C以上になっちゃいそうだなw
146 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 13:11:57 ] ?- a_plus_b_is_c(20000, X, 1000000). とかやったら凍ったw
147 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 14:08:28 ] いや、A×CじゃなくてA×B、A×(C−A)か。 あと、BのリストとCのリストの一部をユニファイする手間もあるけど。
148 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 10:44:31 ] >>149 これは is 評価を使わないでpnだけで行こうとすると ループに陥るのかな?
151 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 13:26:59 ] 無限ループに陥るのはNに自然数以外を与えたときで、 無限に成功するのは変数を与えたとき、のはずだけど、 is評価を使わずにというのは?
152 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 13:34:20 ] 変数を ^ P、Nの両方に
153 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 15:26:12 ] >>151 pn/2,pn/3で加減算できるなら、add1を使わずしてpnだけで これをできないものかと。
154 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:36:00 ] 数値データと橋渡しをするには、どのみち整数の演算が必要なのでは?という話ではなくて?
155 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:34:40 ] >>154 そういう意味になる。 is/2に双方向性がないので この述語を削りpnで書き換えれば双方向性を 実現できるのかなと。