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/
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ファイルを熟読汁!
193 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 19:36:12 ] AndroidにはJavaのサブセット内で書かれたDalvik VMが含まれているが、これはレジスタベースになっている。 Dalvikは現在インタプリタ形式だが実機発売時期に合わせてJITに変更するらしい。
195 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 19:42:33 ] WAMの命令セットは、Prologの本質をついてるかはわからんが、暗黙的な操作が 多くて大変扱いづらい。手続き型言語の悪い所の見本のような感じ。 誰かがそろそろPrologのVMを再設計してもいい頃。
196 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 19:52:37 ] >>195 >誰かがそろそろPrologのVMを再設計してもいい頃。 すでにある。 >>193 >WAMを拡張した抽象マシン >>196 >SICStus/QUINtus は、Threaded code というのを使っている
198 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 20:34:50 ] WAM に問題があるというよりCPUとのマッチングの問題じゃね?
199 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 20:36:33 ] threaded codeは実装のテクニックであって、VM/AMの命令セット設計の話 とは無関係ですよ。
200 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 20:59:36 ] SICStus/QUINtus はWAMを使っていないから全く異なる命令セット設計のVM/AMになっている。
201 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 21:13:32 ] WAMは滅びたんだ。よかった。
202 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 21:36:16 ] 商業ベースでは滅んだ。しかし、我々が使う全てのフリーの実装ではどうしてWAMが使われているのか?
203 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 21:45:41 ] >>201 こいつムカつくな
204 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 22:37:01 ] ああよかったよかった、Prologが滅びてw
205 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 00:19:54 ] >>189 トン それだとyaccで作れる構文木って複合項とかに禿げしく限定されない? :-とか優先度1200の演算子は任せられるか。後は単なるatom? それだったら自前でパーザ書いても大差なさそうだな >>190 壮絶に的外れ。 CやJavaでPrologコンパイラを書く場合に構文解析をどうするかって話。 WAMはその後の話。盛り上がってるからいいけど >>192 MIT PRESSのWAM本は読んだ。
206 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 00:32:56 ] prologの授業頑張ってたけど もっと頑張っとけばよかった・・・
207 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 00:36:57 ] >壮絶に的外れ。 親切にレスしてくれてるのによくこんな言葉遣いできるよな
208 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 00:48:33 ] Prologerには自意識過剰で人を見下す傾向がありますからw
209 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 00:51:10 ] ぶっちゃけ>190の読解力は目を覆わんばかり
210 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 01:55:16 ] WAM厨w
211 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 01:57:15 ] >>208 たしかにPrologerは電波出してる奴多いんだよw
212 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 13:19:23 ] >>209 同感w
213 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 14:59:08 ] ぶっちゃけ>>190 はネタだと思って笑い飛ばしていたんだが、マジだったのだろうか
214 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 18:11:46 ] たまにスレが伸びてると思ったら喧嘩ですか。
215 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 19:57:25 ] こんな過疎スレにも荒らしがきてるのか。必死に自演しても見るのは数人しかいないと思うが…
216 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 20:15:17 ] 喧嘩にはなってないだろ。>>190 がフルボッコなだけw >>190 の読み違いはプギャーだが顔真っ赤にして反論しないのは大人
217 名前:>>188=205 mailto:sage [2008/05/31(土) 01:09:36 ] 荒れる原因作ってスマソ だが本題のレスが>189だけなのは残念 ここの住人はProlog処理系もPrologで書くような人達なんだろうな 参考になる資料見つけた(PDF) THE DESIGN AND IMPLEMENTATION OF A PROLOG PARSER USING JAVACC ttp://digital.library.unt.edu/permalink/meta-dc-3251:1 JavaCCはPCCTS由来のLL(k)パーザジェネレータで>189と同じやり方。 HaskellのパーザコンビネータParsecをJavaにポートしたJParsecでは 動的な文法が扱える。これらを試してみる
218 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 06:44:21 ] >ここの住人はProlog処理系もPrologで書くような人達なんだろうな それが基本だし,今のCPUなら結構使える 他の方法使っても定数倍だろ?
219 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 07:15:42 ] ただし、日本語だけは勘弁な
220 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 07:24:46 ] こんなに人居たんだこのスレ・・・
221 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 07:33:45 ] >>219 ?
222 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 08:22:36 ] Parsecねえ www.lab2.kuis.kyoto-u.ac.jp/~hanatani/tmp/Parsec.html > が、 LL(1) 文法と同等の性能を出します。 www.haskell.org/haskellwiki/Parsec > but it performs best on predictive (LL[1]) grammars. なんか言ってること違う気がw
223 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 14:52:05 ] >>188 CMU Prolog Repository ttp://www.cs.cmu.edu/afs/cs.cmu.edu/project/ai-repository/ai/lang/prolog/0.html にPrologで書かれたPrologパーサとCで書かれたPrologパーサが あったと思います.
224 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 14:56:02 ] >>193 DEC-10 PrologとWAMの作者のDavid Warrenは,David H. D. Warrenで ttp://www.informatik.uni-trier.de/~ley/db/indices/a-tree/w/Warren:David_H=_D=.html SB-Prologの作者のDavid Warrenは,David Scott Warrenで別人です. ttp://www.informatik.uni-trier.de/~ley/db/indices/a-tree/w/Warren:David_Scott.html
225 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 15:25:12 ] www.cs.vu.nl/~dick/Summaries/CS/PrologImplementation.html > Note that David S. Warren is not David H.D. Warren, the author of the Warren Abstract Machine. やべ知らなかったw
226 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 18:12:58 ] >>224 乙。
227 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 01:57:40 ] >>218 演算子を追加できる言語の代表格としてここで聞いてみただけで 対象の言語はPrologじゃないんだ。つか俺にPrologで実装は無理w >>223 禿げしくトン。これのことかな ttp://www.cs.cmu.edu/afs/cs/project/ai-repository/ai/lang/prolog/code/parsing/lp/0.html リンク先が切れてるけどここにあった ftp://ftp.elis.rug.ac.be/prolog/prolog.parser.tar.Z K&RのCなんて読むの久しぶりだw
228 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 06:54:55 ] rterm.cのreduceで順序立ててるみたいだから、結局同じなんじゃないの
229 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 22:38:10 ] >>228 同じって何と?>189と同じなら>205 > それだったら自前でパーザ書いても大差なさそうだな
230 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 00:14:22 ] 「演算子っぽいもの」っていうよりも、節を構成する項の列全体(「.」まで)を一旦スタックに積む感じだったよ
231 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 00:16:44 ] 「項の列」はちょっとまずいか。言い方わかんねw
232 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 00:36:16 ] >>230-231 >205の >:-とか優先度1200の演算子は任せられるか ってことだよね。','は優先度1000で':-'より強いから
233 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 02:54:23 ] >>200 > SICStus/QUINtus はWAMを使っていないから全く異なる命令セット設計のVM/AMになっている。 そのVM/AMについて調べたいのですが、どこかに情報あるでしょうか? 「Optimizing the SICStus Prolog virtual machine instruction set」 ftp://ftp.sics.se/pub/SICS-reports/Reports/SICS-T--2001-01--SE.ps.Z という資料があったのですが、これはWAMを拡張したVMのようです。
234 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 08:10:51 ] >>188 亀レスだが。一番普通に皆がやってるのは、 SWI-Prologのソースを参照する(盗む)ことだと思う。
235 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 23:55:42 ] >>234 質問する前に見たw 188で質問したのは「どうパーズするか?」じゃないんだ。 「パーザジェネレータで」できるかってこと。 動的といってもたかがしれてるんだから構文解析表を 操作すればできるんじゃないかと思ったんだけどね。
236 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 20:52:51 ] じゃあこれで en.wikipedia.org/wiki/Operator-precedence_parser >$ ./parenthesise a \* b + c ^ d / e >((((a))*((b)))+(((c)^(d))/((e))))
237 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 00:30:01 ] >>236 それ>188=235へのレス? 演算子順位法なんてコンパイラの本に普通に出てくるんだが。 そんなことも知らないと見下されてるわけか。バカにされたもんだな。 自前でパーズする方法を聞いてるんじゃないってことがなぜ伝わらないのか。 「○○というパーザジェネレータを使うと動的に演算子を追加できる」という情報が あるなら教えて欲しい、それだけだ。
238 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 01:51:09 ] ネタってことがなぜ伝わらないのか
239 名前:デフォルトの名無しさん [2008/06/14(土) 11:25:57 ] 後出しジャンケンって嫌われる傾向にある
240 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 12:10:23 ] 喧嘩腰w
241 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 01:20:34 ] >自前でパーズする方法を聞いてるんじゃないってことがなぜ伝わらないのか。 書き方が悪いってことがなぜ伝わらないのか。
242 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 01:26:15 ] >>241 少なくとも>235で伝わらないのは読み手の問題だろ。
243 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 01:48:06 ] 自演までしてネタにマジレスカッコ悪いw 頭悪いんじゃねw
244 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 01:59:05 ] >>243 スマン、俺は>>241 だがどこが自演なのか教えてくれないか
245 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 11:04:14 ] Prologの話しろよクソども
246 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 21:55:57 ] >>245 だいべんしてくれてありがとう
247 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 00:39:19 ] >>245-246 糞TALK(藁
248 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 00:44:26 ] バカ専用 普通 ハッカー ウィザード ┝ - - - - ┿━━━┿━━━┥ ∩___∩ /) | ノ ヽ ( i ))) / ● ● | / / | ( _●_) |ノ / 今はここら辺クマーー!! 彡、 |∪| ,/ / ヽノ /
249 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 02:21:02 ] まったりするスレだってことがなぜ伝わらないのか
250 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 03:50:56 ] 2chでスレ荒らし 普通 ハッカー ウィザード ┝ - - - - ┿━━━┿━━━┥ ∩___∩ /)
251 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 06:53:04 ] command.c:55: error: 代入として無効な左辺値だってことがなぜ伝わらないのか
253 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 07:07:11 ] >>252 それは、判るのですが、どうすればいいのでしょうか?
254 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 14:24:24 ] 左辺値をキャストしちゃダメなんだそうで。 c-faq.com/ptrs/castincr.html www.kouno.jp/home/c_faq/c4.html#5 > キャスト は変換演算子であって、それは右辺値を生みだすと定義されている。 > 右辺値であるとするなら、代入することも++で足し算することもでき ないことになる > (pccから派生したコンパイラやgccの拡張機能が上の ような式を受け付けることは例外である)。 書き直す(左辺値用のマクロを用意する?)のが正しいと思うけれど、 gccのオプションをいじればどうにかなるのかも、なんて思ったりして。
255 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 14:28:15 ] いや、なんか適当にポインタを取ったりすればいいのかもしれない。適当。
256 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 16:01:28 ] しったかぶってただけでしたw
257 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 17:02:57 ] >>251 gcc.gnu.org/ml/gcc-help/2007-05/msg00082.html この人の場合、どうやら古いgccでコンパイルしなおしたらしい。 pagaddedって何かわかんないけど
258 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 17:45:24 ] そんなことも知らないと見下されてるわけか。バカにされたもんだな。 そういうことを聞いてるんじゃないってことがなぜ伝わらないのか。 情報があるなら教えて欲しい、それだけだ。
259 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 17:54:17 ] > By the way, I'm running the latest version of gcc on a Sunblade 100 workstation. だからpkgadd(ed)、かな
260 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 21:50:26 ] 普通 まったり 超まったり dat落ち寸前 ┝ - - - - ┿━━━━┿━━━━━┥ ∩___∩ /)
263 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 23:26:45 ] >>262 2ちゃんに「普通」なんつー概念はありえねーw
264 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 23:32:25 ] 自分以外を「2chでスレ荒らし」と言ってる奴だから、対話は成立しないだろ。ほっとけ。
265 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 01:23:04 ] Prologって何の問題を解くのに向いているのでしょう? 手続き的な処理には不向きな気がします。 私はこのスレを読んでシステムの用件定義時に個別の用件の妥当性 をチェックするなどに使えるかな?と思っています。 ミナサンはどんな問題を解くのに使われていますか? ちなみに、Javaや.Netなどから呼び出せたりするPrologってありませんか?
266 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 01:50:23 ] kaminari.scitec.kobe-u.ac.jp/PrologCafe/ www.cs.kuleuven.ac.be/~bmd/PrologInJava/
267 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 02:18:30 ] >>264 何か誤解されているようですが。
268 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 02:48:04 ] P# というのもあります。 homepages.inf.ed.ac.uk/jcook/psharp/psharp-1.1.3/dlpsharp.html Prolog から C# へのトランスレータということになります。 >>266 にでてくる PrologCafe で書かれています。
269 名前:251 mailto:sage [2008/06/17(火) 02:59:52 ] 皆さんの示唆によりまして、 めでたく、Progolの起動まで漕ぎ着けました。 ひとまず、ありがとうございます。 ひとまずというのは、 >>261 はその通り直したのですが、同様にエラーのでた (LONG) を「なんか適当にポインタを取ったり」という感じで コメントアウトしてしまったらうまく行った、ということです。 それでは、問題があるかもしれないから、今日 (LONG)を生かす方法を試みます。
270 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 03:38:51 ] >>265 Prologの手続的解釈というのもあります。あくまで、Prologをどう読むかということですが。 プログラマが副作用に着目している以上、深さ優先探索を「悪用」して、 あーやって、つぎにこうやって、という具合に読んでいくことは現実味があります。 関数型ではPrologから影響を受けたErlangが似た構文を持っています。
271 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 04:37:35 ] >>261 です piza.2ch.net/tech/kako/968/968727266.html >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) という仮定がされている、という仮定をしてしまった気がするとです