トップページ⇒tech
983コメント289KB

Prolog でまったり

■ このスレッドは過去ログ倉庫に格納されています
0001人工無能NGNG
Cなどの言語とは全く得意分野も構造もちがうProlog。
そんなPrologについてまったり話しましょう
0357デフォルトの名無しさんNGNG
prolog使って喜んでる奴って根暗そう。
0358デフォルトの名無しさんNGNG
prologがjavaから呼べると何がいいんでしょうか?
0359デフォルトの名無しさんNGNG
>>357
ママンのtitsでも吸ってろ!
0360デフォルトの名無しさんNGNG
>>357
http://maid.dmz-plus.com/saitama/1033241851.jpg
0361デフォルトの名無しさんNGNG
>>358
JavaからPrologを利用できる
0362西門#NGNG
>>356
http://www.vanx.org/archive/wam/wam.html
0363デフォルトの名無しさんNGNG
>>361
冗談にしてはつまらないな。
もうちょっとまともな事書けばと思ってしまった。
参考になればいいけど
0364bloomNGNG

http://www.agemasukudasai.com/bloom/
0365356ですNGNG
>>362
西門#さん
ありがとうございます。
Warren's Abstract Machine<A TUTORIAL RECONSTRUCTION>[wambook.pdf]の
「Prolog in a Nutshell 91」
「The WAM at a glance 97」
がよさそうですね。日本語の文献がよかったんですが、なさそうなので
とりあえずこれを読んでみます。
ありがとうございました。
0366デフォルトの名無しさんNGNG
prologインタプリタを作るのって簡単?
ためしに作ってみたんだけど、あまりにも簡単すぎて。
これでいいのかな。
0367デフォルトの名無しさんNGNG
よくわかんないけど、いいんじゃないの。
0368デフォルトの名無しさんNGNG
見せて見せて。
まさか Brainfuck で書いてないよね?
0369デフォルトの名無しさんNGNG
GNU Prolog Compilerを取ってきたので今からインストールして試してみます。
http://pauillac.inria.fr/~diaz/gnu-prolog/ から取れます。
何でもPrologプログラムをCプログラムにコンパイルしてくれるようで楽しみ。
0370デフォルトの名無しさんNGNG
・・・と思ったら、どうも直接アセンブリ出力をするようです。
0371デフォルトの名無しさんNGNG
>>356 >>365
その会話サンクス
ちょーど質問しよーとしてたとこだた
0372デフォルトの名無しさんNGNG
>>366
ただ動くだけのインタプリタなら、100行足らずで書けるよね。
効率よく動かそうと思うと1万行とかになるけど。
0373デフォルトの名無しさんNGNG
100行足らずのprologきぼんぬ。
何が出来ればprologなの?
0374デフォルトの名無しさんNGNG
prologの処理系で一番使いやすいのってswi prologってきいたんですけど本当ですか?
自分、prologすらつかったことありません・・・
0375デフォルトの名無しさんNGNG
100行は超えてるけど
http://www.ece.pdx.edu/~mperkows/CLASS_ROBOTICS/LISP/tanimoto/PROLOG.CL
とか?
もっと短くなりそうですけどね。

Horn節のresolutionができればPrologなんじゃない?
0376デフォルトの名無しさんNGNG
>>374
やはりSicstus Prologでは?
0377デフォルトの名無しさんNGNG
Quintus Prologだろう。
SicstusはQuintusの模造品。
0378デフォルトの名無しさんNGNG
execute((P,Q)) :- !, execute(P), execute(Q).
execute(P) :- predicate_property(P, built_in), !, P.
execute(P) :- my_clause((P :- Q)), execute(Q).

3行で書けたよ。
0379デフォルトの名無しさんNGNG
スキームですか、そのprologインタープリタは・・・
C言語しかわからない。・゚・(ノД`)・゚・。 うえええん
0380デフォルトの名無しさんNGNG
>>379
PrologをCへコンパイルするコンパイラを
Prologで書けばよい。きっと百行で書ける。
0381デフォルトの名無しさんNGNG
ユーザーコンサルト画面がスクリーンエディタになっているprolog処理系は
ありませんでしょうか?
ラインエディタでは使いにくくて・・・・

外部でエディットしてconsult('filename'). 使ってファイル読み込めばいいのですけどね。
0382デフォルトの名無しさんNGNG
よーしPrologはなんか逆コンパイラに使えそうな気がしてきたぞ〜
0383デフォルトの名無しさんNGNG
気のせいだろ
0384デフォルトの名無しさんNGNG
推論系はprologが楽
0385デフォルトの名無しさんNGNG
Prolog→Cへの変換プログラムをPrologで書けば、
それを使ってC→Prologの変換もできるよね?
0386デフォルトの名無しさんNGNG
親(ママ,太郎).
親(ママ,花子).
兄弟(X,Y) :- 親(P,X),親(P,Y).
?- 兄弟(太郎,X)
太郎
兄弟(X,Y) :- 親(P,X),親(P,Y),X\=Y.
?- 兄弟(太郎,X)
花子

今はこれが精一杯。
0387デフォルトの名無しさんNGNG
>>386
性別をfactに持たせて、叔父、叔母、その他いとこやおじいさんおばあさんも
作ってみよう。
0388デフォルトの名無しさんNGNG
cutオペレータの使い所がわからない・・
ただの否定じゃ駄目なの?
0389デフォルトの名無しさんNGNG
readとかの入出力って、副作用だよね?
バックトラックで問題にならないのかな。
0390デフォルトの名無しさんNGNG
>>388
not_p(x) :- p(x), !, fail.
not_p(x) :- true.
cutがないと、上の節は必ず失敗するが、下の節があるので
結局かならず成功してしまう。

あと、双方向性がいらないときや、非決定性がいらないとき、
cutを使うと効率が良くなる。

>>389
問題になるよ。
副作用を使ったら、cutと同じく、双方向性や
非決定性が制限される。
0391デフォルトの名無しさんNGNG
親(パパ、ママ).
0392デフォルトの名無しさんNGNG
有向性グラフの問題を解く時なんか、カットオペレータがないと
勝手にバックトラックして変な解まで見つけてしまうことがある。

それとか、最初の一つの解が見つかった所で処理を止めて次
に移りたい時とか。
0393デフォルトの名無しさんNGNG
>>321
> 激しくなつかすぃ「Prologの冒険」
> http://www.amzi.com/AdventureInProlog/

日本語翻訳本は絶版っぽいので、がんばって読み始めました。
激しく面白いです。
はやくパズルとかを解けるようにがんばります。
教えてくれてありがとう!
0394デフォルトの名無しさんNGNG
>>393
図書館にあるよ
0395デフォルトの名無しさんNGNG
prologだとコンパイラとかって簡単に作れたりするの?
0396356ですNGNG
>>395
ブラトコ(?)の本(多分「Prologの技芸」)にパスカルのサブセットを
マシン語にコンパイルする例があったと思うけどやたら簡単だった。
1日も必要ない。1時間もあれば理解できるじゃないかな?

0397356ですNGNG
「Prologの技芸」はあってましたが、Leon Sterling/Ehud Shapiro 著
松田利夫 訳の本でした。ちなみに共立出版です。
(えっ、知ってた?)
0398356ですNGNG
私は、lispを使ったことが無いのですが、
lispは簡単にprologを構築できると聞いたことがあるのですが、
そのあたりご存知な方いらっしゃいますか?
0399デフォルトの名無しさんNGNG
>>398
>>375
0400デフォルトの名無しさんNGNG
>>397
LISPのは、ちょっと厚い本には大抵載ってるよ。
>>375のは主要なオペレータが揃ってなかったり不完全な気がするけど。
schemeもschelog(本体はschemeコードで500行程度)
つーのがあったり、
SICPというschemeを例にしたアルゴリズム教科書に、
非決定性や論理型プログラミングの解説がある。
0401デフォルトの名無しさんNGNG
中島秀之さんが書いた、日本で最初のPrologの本では、たしか
Lispで書いたPrologインタプリタを使ってたと思う。

だから、例題も全部Lisp風の文法。
0402デフォルトの名無しさんNGNG
だめだーーーー
サンプルプログラム読むとふむふむと理解でき(た気になれ)るけど
いざ自分で書こうとすると何書いていいかわかんなくなる
0403デフォルトの名無しさんNGNG
SWI-Prolog入れてみたんだけど、どうやって使うの?
とりあえずHello World的なプログラムを試してみたいんですが。
0404403NGNG
なんかエラーになると思ったら、
[../demo/likes].
とは書けないのね。
?- cd(../demo)
?- [likes].
でうまくいきました。
0405デフォルトの名無しさんNGNG
http://www.cs.kuleuven.ac.be/~bmd/PrologInJava/
これなんかけっこう簡単な割には
機能的には充分だと思うんだけど、どうかな?
0406デフォルトの名無しさんNGNG
卒研でGNUprologをやらされるはめに、、、あと1ヶ月もないってのにさ。
CやJavaの方がまだマシだよ。ってかCとかJavaに慣れちゃってる人には
Prologって根本的に違うからわかりづらいね。
基本的なことはわかったけど、どう応用してよいのやらわからんよ。
「Prologへの入門」あべ著にあったプログラムをコピペしても走らなかったりするしさ〜
同じような境遇の人いたら同情しまっせ。
0407デフォルトの名無しさんNGNG
大学で弄って以来 Prolog さわってないな。
0408引き篭もりNGNG
Prologやるならこれだけは読んどけなんて本ありますかm(_ _)m
0409デフォルトの名無しさんNGNG
>>406 テーマ与えられるだけマシと思えよな
0410406NGNG
>>409
テーマは強制的です。やりたくてやってたんじゃないんですよ〜
ちゃんと初めはやりたいことあったんですが「駄目だ!」と一蹴。
「うちの研究室では初めての分野だし・・・」とあーだこーだと
論点すりかえて説得され続けるのがいやになってあきらめたんです。
ツッコミ入れると面白いくらいあせってつくろうし。ガキみたいな教授です。
って愚痴ってしまってすいません。
がんばりますよ!
0411デフォルトの名無しさんNGNG
>>410
こんなとこで愚痴たれるお前の方がガキだろ。
いやなら教授殴ってやめちまえ。
0412デフォルトの名無しさんNGNG
Prologなんて二日くらいで習得できたぞ

差分リスト以外は
0413デフォルトの名無しさんNGNG
Prologは文法的には非常に単純だが、単純過ぎて、何か複雑な事を
やらせようとすると脳内シミュレートが重荷で大変だと思った。
0414デフォルトの名無しさんNGNG
>>406
困難から逃げるのが好きな漏れはProlog絡みの卒研を履修放棄した。
0415デフォルトの名無しさんNGNG
>>410
テーマの内容は何?
0416デフォルトの名無しさんNGNG
prologインタープリターを自分で作ってみたいのですが、
どうしていいかよくわかりません。
誰か救いの手をお願いします。
0417デフォルトの名無しさんNGNG
>>416
既存の処理系のソース読破汁!!
0418デフォルトの名無しさんNGNG
Cでコーディングされたprologのソースコードくれよ
0419デフォルトの名無しさんNGNG
>>418
GNU-Prologのソースコードなら
http://gnu-prolog.inria.fr/
にあるじゃん。
0420デフォルトの名無しさんNGNG
全然関係無いんだが、
>>417
>読破汁!!
2ちゃん語って非常に気持ち悪いんだけど、慣れないと駄目ですか?
0421デフォルトの名無しさんNGNG
>>420
2ちゃんねる見なきゃ大丈夫。
0422デフォルトの名無しさんNGNG
421がいいこといった
0423デフォルトの名無しさんNGNG
>>420
2ちゃん語なんてものはありません。
ただ日本語すらまともに使えていないバカが多いだけです。
0424デフォルトの名無しさんNGNG
g-prologはやめたほうがいい
0425デフォルトの名無しさんNGNG
なして
0426デフォルトの名無しさんNGNG
Turbo Prologは強烈だったなー
0427デフォルトの名無しさんNGNG
第5世代プロジェクトと共に消えたプrolog
0428デフォルトの名無しさんNGNG
あのころはあれだけprologに期待をかけられていたのに、いまじゃただの藻屑とかした
0429PrologNGNG
(´Д⊂ヽうるせーバカチンども
0430デフォルトの名無しさんNGNG
おまえらアルゴリズムデバッギングくらい知ってるよね?
あれってprologで実装するもの?
0431416NGNG
公開されているソースコードを参考にして
ある程度作って、だいたい動くようになったのですが
バックトラックが上手く実装できていないのと、
あと
test(A,A).
test1(A,B):-test(A,C),test(B,C),A=1.
の単一化を実現する上手い方法が思いつきません。
誰かバックトラックの実装方法と
上記の単一化を実現する実装方法を教えてください。
0432デフォルトの名無しさんNGNG
>>431
何が知りたいのかわからないけど、
prologのバックトラックは、パターン内の節を順に適用していって、
失敗したら他のパターンを試す処理。
これはパターンと節の二次元のテーブルで済む筈。
単一化は未確定の変数に対して値を代入する処理。

>test(A,A).
>test1(A,B):-test(A,C),test(B,C),A=1.

Aを仮に1としてパターンtest1を評価すると、
変数の初期値はA=1 B=? C=? (?は未確定)
最初の節test(A,C)からA=Cが確定(単一化)してC:=1、
testは無条件に真なのでバックトラックせずに継続、
次の節test(B,C)からB=Cが確定(単一化)してB:=1、
testは無条件に真なのでバックトラックせずに継続、
次の節A=1がtrueなのでYesが返る。

Aが1以外なら、パターンtest1の最後の節A=1で失敗し、
バックトラックに入るが、可能な他のパターンが無いのでNoが返る。

という説明じゃ駄目?
0433デフォルトの名無しさんNGNG
>>430
自信ないけど、アルゴリズムデバックじゃなく
アルゴリズミックデバッギングのように表記しない?

Prologで実装というより、対象がPrologのプログラム(というのが発祥)
なんじゃないかな。実装は特にPrologじゃなくてもいい気がする。
Prologで実装して特に楽になる部分あるかなあ。
0434デフォルトの名無しさんNGNG
>これはパターンと節の二次元のテーブルで済む筈。
この実装だと死ぬな。
ある節がfalseを出した時、どこまで戻すかの記録が微妙。
代入のデータとスタックを使うのが普通かと。

>Aを仮に1としてパターンtest1を評価すると、
アフォ?
test1(A,B).
と質問した時、prologは
どうやってA=1,B=1
を見つけて来るんだよw
という俺もよくわからないけど、
内部でA=C,B=Cという表現を作ってるんだと思う。
0435デフォルトの名無しさんNGNG
SWIprologにて
-----------fib.pl------------
fib(0, 0).
fib(1, 1).
fib(N, F) :- N > 1, N1 is N-1, fib(N1, F1), N2 is N-2, fib(N2, F2), F is F1+F2.
-----------fib.pl------------
?- [fib].
% fib compiled 0.00 sec, 748 bytes

Yes
?- fib(30,X).
ERROR: Out of local stack.
うーむ。
0436デフォルトの名無しさんNGNG
>>435
fib(0, 0):-!.
fib(1, 1):-!.
とcutを入れればよいだろう。でも、ふつーは
fib(N, _):-N < 0, !, fail.
fib(N, F):-ifib_loop(N, 0, 0, 1, F).
ifib_loop(N, N, A, _, A).
ifib_loop(N, X, A, B, F):-X1 is X + 1, AB is A + B, ifib_loop(N, X1, B, AB, F).
とやる。
0437435NGNG
>>436
こういうとこでcut使うんですか・・・。
いまいちcutの使い所がわかんないですな。
多分どういう動きなのか想像つかんからですが。
0438デフォルトの名無しさんNGNG
>>437
cutがないと、fib(0,0)にいったん成功して、その後バックトラックする時に
下の選択肢を探すことになる。(そのための情報がスタックに積まれる。)

でも、fib(0,0)に成功したならば、下の選択肢は無意味なので、cutで取り除い
てやる。
0439デフォルトの名無しさんNGNG
カットって無くてもOK?
0440デフォルトの名無しさんNGNG
理論的には無くてもOKだが、
実際には、cut無しでは実用的なプログラムが書けない。
0441デフォルトの名無しさんNGNG
ファイル入出力とか、副作用があったりするとcutみたいな
制御が無いと駄目でしょ。
0442デフォルトの名無しさんNGNG
>>435
フィボナッチを分割統治とは渋いな。
っていうか何がうーむなのか。
0443デフォルトの名無しさんNGNG
>>441
ファイル入出力は無くてもいいからね。
関数としてはカットは不要だと思う。
0444デフォルトの名無しさんNGNG
>>442
いや定義式どおりのありふれたアルゴリズムなんだけど。
指数オーダーなので実用には使っちゃ駄目なんだけど。

>>443
ファイル入出力がいるプログラムもあるんだけど。
関数じゃないんだけど。
0445デフォルトの名無しさんNGNG
>>444
計算論知ってる?
帰納関数知ってる?
0446デフォルトの名無しさんNGNG
>>445
知ってますが何か?
0447デフォルトの名無しさんNGNG
442=443=445=アフォ
0448デフォルトの名無しさんNGNG
447=引き篭もり=アフォ=キモイ
0449デフォルトの名無しさんNGNG
うるせーイチジ!
0450デフォルトの名無しさんNGNG
prologインタプリター作ったんだけど、
お前らに見せる価値はありますか?
0451デフォルトの名無しさんNGNG
>>449
ワショーイ!!
0452デフォルトの名無しさんNGNG
>>450
そんなこと言われても(´・ω・`)ショボーン
見てみないと価値なんかわからないっす。
0453デフォルトの名無しさんNGNG
>>452
インタプリターの価値じゃなくて、
評価してもらう価値あるかって事では?

まあ、俺はたぶん読めるだろうけど
過去ログからもわかるように
バックトラックの実装すらよくわかってない奴が
ほとんどだと思うから
ここで公開しても、へたれコメントしか出てこないと思われ。

そもそも自分でインタプリター作れる奴はそれ程多くないし、
2chにはたぶんいない。
0454デフォルトの名無しさんNGNG
>>452
7行スレからパクッたのか?
0455デフォルトの名無しさんNGNG
へ?
0456デフォルトの名無しさんNGNG
450みせてくれ。見たい。
■ このスレッドは過去ログ倉庫に格納されています