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/
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で書き換えれば双方向性を 実現できるのかなと。
156 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 20:00:57 ] >>155 演算の双方向性は>138の方式で実現可能。 encode/decodeの双方向性は十進文字列のparserを書けば可能かも。
157 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 20:22:34 ] >>156 ああ、そうだね。私が言ってるのは '2倍'(A,B) :- の定義をAの2倍がBになると書いて、 それが、自ずと、Bの2分の1がAで あるという述語定義になっている、 ということ。そのためには、最初の 定義一発にis/2を含むわけには いかないだろう、というような意味ですね。
158 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 21:54:21 ] いやこうか twice(A,B) :- pn(PA,z, A,0), pn(PA,z, B,A), !. どうでもいいw
160 名前:デフォルトの名無しさん [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 20:14:30 ] 別に以下のように引数位置の意味を定義しておくこともあります。 task管理引数位置(1,task). task管理引数位置(2,内容). task管理引数位置(3,先行task). task管理引数位置(4,期間). task管理引数位置(5,人数).
163 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 20:29:24 ] この定義があると、 ?- 期間 が 2 の _定義節 は. _定義節 = task管理(d,材料Wの加工,b,2,3); _定義節 = task管理(f,'Xの組み立て',c,d,2,2) などと答える可能性が生まれます。
164 名前:デフォルトの名無しさん mailto:sage [2008/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 [2008/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 [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 12:46:40 ] >>128 貴重な情報ありがとうございます。 購買系のシステムに適用できないか検討中でしたので参考になりました。 Prologの処理系は何か商用のものを利用されているのでしょうか?
169 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 13:15:22 ] >>168 私は20年間IF/Prologを使用してきましたが、5年前に国内では 販売を中止しました。シーメンスでは現在も販売していると思います。 日本CGIでも販売していたと思いますが、現在どうなっているか 知りません。 私はSWI-Prologへの移行準備中です。
170 名前:デフォルトの名無しさん mailto:sage [2008/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のはず. 参考: ttp://www.sics.se/sicstus/docs/latest3/html/sicstus.html/Combinatorial-Constraints.html#Combinatorial-Constraints
171 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 19:46:44 ] >130-159 ありがとうございました。結局Prologで方程式を解くには ある程度は書けるにしても、何かしらのロジックが必要になるのですね。 >141 なるほど。そんな言語もあるのですね。一応調べてはみます。
172 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 18:15:30 ] >>171 Prologでは = に、=の左側の項と右側の項を単一化するという意味を 与えたので、方程式 2 + X = 5. を与えて、そのまま解けるということは 絶対にありません。 2 + X と 5を較べて、2 + 5は複合項 5は単項ですから、単一化のルールに より偽となります。
173 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 18:27:45 ] =:= や is だとどういうルールになりますか
174 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 20:32:43 ] ですから、方程式の解法を組み込み述語として、Prologが持つようにするとなると、 = =:= is などは使えず、2 + X = 5 の = 記号をオペレータとして使われていない 記号か、オペレータとして定義されていても多義性を持たせても構わない記号に 置き換える必要があります。
176 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 23:36:29 ] かといって、述語にするにしても単純ではなさそうですね。 ユニフィケーションだけじゃ無理か。
177 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 23:51:12 ] Prologでは方程式は解けないという流れになっていますが, SWI-Prologや他の多くのPrologには,clp(R)やclp(fd)等の 制約論理プログラミングのパッケージが用意されているので, それを使えば,方程式も解けますよ.
178 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 06:09:07 ] そうか「Prologに解かせる」だから、Prolog言語と解釈する必要もなかったかもね
179 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 06:29:57 ] 底まで沈むことを楽しみにしていたのだが、agatteしまったね。あと68だったんだけど。
180 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 10:04:07 ] ム板には「なぜ、 = が 代入 を 表す 記号 に なったか?」という スレがありますが、Prologの場合も = が適切だったのかという疑問は 残ります。unify/2でなぜいけない? 論理変数を含む単一化は独特で、 これを = で示して、ひけらかしたい誘惑はあります。それと = は やはり便利ですね。
181 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 07:37:43 ] SQLのgroup by句付き集約参照に当たる組込述語の書式を募集します。 案をお持ちの方はどしどし出してください。
182 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 08:00:43 ] >>115 アトムテーブルの参照はハッシュが使えたとしても、 相当の負荷が掛かるのだろうか。最終的には必ずアトム文字列の strcmpが起こるとすると、アトム長が256バイトとか大きくなると それだけで馬鹿になりませんね。
183 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 07:43:27 ] 1億回で1秒くらいかねw
184 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 23:08:44 ] codepadにはPrologないなと思ったのでshelogが使えるか試したら動いたので報告。 >974 名前:デフォルトの名無しさん 投稿日:2008/05/19(月) 23:00:17 >schelogを使ってみた。 >Prologと考えるとトリッキーな文法だけど一応動いた。 >ただ、すぐにメモリーのリークでコケル。 >ttp://codepad.org/cgNOmn0r > > >975 名前:デフォルトの名無しさん 投稿日:2008/05/19(月) 23:02:04 >>>974 >例題はBratkoから拝借。
185 名前:デフォルトの名無しさん [2008/05/21(水) 12:27:17 ] InterlogをUNIX系OSにも移植してくれないかな?
186 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 12:54:20 ] >>185 同感。
187 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 18:16:09 ] interlogなんてHPもなくなってるジャマイカw
188 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 04:23:19 ] Prologみたく演算子を追加できる言語ってyaccのような パーザジェネレータで扱える? 扱えないとしたら、CやJavaでProlog処理系を書くとき、 パーザは自前で書くのが普通? 検索してもProlog(DCG)「で」構文解析する情報ばかりで、 Prolog「を」解析する情報が見つけられないもので…
189 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 17:26:35 ] yacc 使うんなら演算子っぽいものを優先順位なしでパースして、 後から構文木を変更していくという手法がある
190 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 18:38:14 ] >>188 Java VM などと Warren AM の違いを質問しているのかな?
191 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 18:42:00 ] >>190 エスパーですか
192 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 19:04:19 ] Prolog compiler の実装は、WAMが公開されたのでそれが主流になっている。 WAMでググってPDFファイルを熟読汁!