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

Prolog でまったり

■ このスレッドは過去ログ倉庫に格納されています
0001人工無能NGNG
Cなどの言語とは全く得意分野も構造もちがうProlog。
そんなPrologについてまったり話しましょう
0611デフォルトの名無しさんNGNG
>>607
1について詳しく書いてあるWEB知ってたら教えて。
0612デフォルトの名無しさんNGNG
神戸大のなんとかって教授がプロローグオタだよね
0613デフォルトの名無しさんNGNG
>>600
そのベンチを試した処理系は何なの?
0614デフォルトの名無しさんNGNG
>>612
最近は線形論理型言語やってるのでは。
0615デフォルトの名無しさんNGNG
>>613
CMUCLとAllegro CLとgcc
マシンはSun Ultra-10
0616デフォルトの名無しさんNGNG
>615
schemeは?
0617デフォルトの名無しさんNGNG
一番はじめのpc用のprologはなにで書いたの?
まさかオブジェクトコード生?そこの話がこんがらがってないですかな。
0618デフォルトの名無しさんNGNG
>>613
Chez Scheme Version 6とgcc 2.95.2。
0619デフォルトの名無しさんNGNG
>>617
聞き飽きた話だが、Cでも同じだろ。
0620デフォルトの名無しさんNGNG
最初のLispはIBM 7040のFortranで書かれた。
Prologは知らん。DEC-10のアセンブラかな?
マルセイユPrologの方が先か。Lispかもね。
0621デフォルトの名無しさんNGNG
>>619
会話になってねーよ。
さっきから頭痛い原因はおまえか。
0622デフォルトの名無しさんNGNG
>>621
いるんだよな。「クロス開発した」っていうと
「最初は?」って聞く厨房(藁
0623デフォルトの名無しさんNGNG
一番はじめのpc用のアセンブラはなにで書いたの?
まさかオブジェクトコード生?そこの話がこんがらがってないですかな。
0624デフォルトの名無しさんNGNG
>>622
なにか悔しいことでもあったんでしゅか?
0625デフォルトの名無しさんNGNG
>>621
わかった。ちゃんと答える。
「Cコンパイラと同様、クロス開発したものと思われ」
0626デフォルトの名無しさんNGNG
printfってけっこう重くなかったっけ?

gccのソース
int main(int argc, char *argv[]) {
int n = ((argc == 2) ? atoi(argv[1]) : 1);

printf("Ack(3,%d): %d\n", n, Ack(3, n));
/* sleep long enough so we can measure memory usage */
sleep(1);
return(0);
}
0627デフォルトの名無しさんNGNG
>>626
でも、せいぜい数マイクロ秒でしょ。
0628デフォルトの名無しさんNGNG
なんかすっきりしないんだけど
gnu prologはC言語で書いてあるし、
prologで書かれたprologなんて無くない?

lispでかかれたlispってどれ?
実用的なものを除けば、ほとんどCで書かれてそうだけど。
0629デフォルトの名無しさんNGNG
>>626
それ言ったらformatだって遅いんでは。
つーかあのベンチ自体あんまり信用できないんだけど。
0630デフォルトの名無しさんNGNG
そのベンチってコンパイルの時間込みって事はないよね・・・・
logって所を押すと・・・
0631デフォルトの名無しさんNGNG
CMLCLもCだよね?
LISPコンパイラはLISPで書かれてるけど。
0632デフォルトの名無しさんNGNG
>LISPコンパイラはLISPで書かれてるけど。
ホームページがあればお願いします
0633デフォルトの名無しさんNGNG
なんかメタインタプリタしか作れない奴の言い訳が
たくさん書かれている。
0634631NGNG
>632
これね。
http://www.cons.org/cmucl/
0635デフォルトの名無しさんNGNG
>lispでかかれたlispってどれ?
>>585
0636デフォルトの名無しさんNGNG
http://www.jah.ne.jp/~naoyuki/Writings/Writings.html
schemeの作り方だよーん。
メタインタプリタを作るのが簡単なのは、
perlで正規表現が簡単に使えるのと同じ。
正規表現のモジュールを使える事と、
正規表現のモジュールを作れる事は違います!!
0637デフォルトの名無しさんNGNG
線形論理型言語ってやたら難しそうな響きの言語だね。
0638デフォルトの名無しさんNGNG
だからメタインタプリタってのはちがうっつーに…
0639デフォルトの名無しさんNGNG
>>634
ftp://ftp.averillpark.net/cmucl/src/lisp/
C言語で作られてるみたいだけど・・・
0640デフォルトの名無しさんNGNG
>>638
解説よろしこ
0641デフォルトの名無しさんNGNG
「Cが速い」っていうバイアスがかかってるやつが
多いな。
0642デフォルトの名無しさんNGNG
lispでインタプリタ作ってわかった気になってるバカ死ね
0643631NGNG
>>639
ちゃんと>>631とソース読んでね。
0644デフォルトの名無しさんNGNG
Lispで作られてる実用的なLisp求む
0645デフォルトの名無しさんNGNG
>>636
そのschemeは末尾再帰展開しない上にやたら遅い。
学習には不向き。
0646デフォルトの名無しさんNGNG
Spice Lispは?
0647デフォルトの名無しさんNGNG
LarcenyもOrbitもSchemeで書いてあるよね。
0648デフォルトの名無しさんNGNG
>>647
LarcenyはランタイムがCだと思ったけど。
0649デフォルトの名無しさんNGNG
ランタイムはまあしょうがないよな。
Unixで走らせるなら。
0650デフォルトの名無しさんNGNG
>Orbit
非実用的だけどね
0651デフォルトの名無しさんNGNG
Tは?
0652デフォルトの名無しさんNGNG
なんでこんな時間に盛り上がる?
0653デフォルトの名無しさんNGNG
Tってもう誰もメンテしてないよね?
公開されてる分については。
0654デフォルトの名無しさんNGNG
ちなみにYale大学のT-Schemeのことだよね?
あれは何から何まで全部scheme。
ブートストラップにscheme自身が必要だったかと。
0655デフォルトの名無しさんNGNG
SBCLもCMUCLからブートストラップ。
0656デフォルトの名無しさんNGNG
Larcenyも、コンパイラやインタプリタは全部Schemeだね。
0657デフォルトの名無しさんNGNG
S-1 というスーパーコンピュータ上のCommon Lispは、
bignum演算からgcまで全部Lispで書いてあった。
0658655NGNG
SBCLはランタイムがCだった。スマソ。
0659デフォルトの名無しさんNGNG
レイジーエバリュエーションってなんでつか?得意な言語とかあるんでつか?
素人まるだちでついまちえん
0660デフォルトの名無しさんNGNG
怠け者評価
0661デフォルトの名無しさんNGNG
>>659
多少スレ違いの気もするが、マジレスすると、
関数の実引数を、値が本当に必要になるまで
評価しない方式のこと。

詳しくはHaskellスレか関数型言語スレで聞こう。
0662デフォルトの名無しさんNGNG
d-listは遅延評価と関係ありますか?
0663デフォルトの名無しさんNGNG
prologで延滞評価はできないの?
0664デフォルトの名無しさんNGNG
「評価」ってのは関数言語の概念だから、
ぴったり当てはまるものはないんじゃないの。

似たものとしては、制約プログラミングとか?
0665デフォルトの名無しさんNGNG
>Larcenyも、コンパイラやインタプリタは全部Schemeだね。
http://www.ccs.neu.edu/home/will/Larceny/
本当だ。
Chezの上に作ってるね。
それはそうと、メタインタプリタを作る事と
インタプリタを作る事の違いが誰もわかってないみたいなので
解説する。

極端な事を言えば、メタインタプリタを作るという事は
インタプリタのソースコードが提供されていて
そのソースコードを利用してインタプリタを作る事と等価である。
prologでprologを作るというのは
3行でmainルーチンが書けてしまうようなライブラリを使って
作っているだけに過ぎない。

一方プログラムを作る一番原始的な方法は
アセンブラで書くことだけれど、
実際にはプログラミング言語を使う。
それはコードの見易さと言語に実装されている機能があるから。
あるプログラミング言語Aでプログラミング言語Bを実装するには
BにはあってAにはない言語機能を実装する事になる。
GCのある言語を使えば、GCのある別の言語を実装するのに
GCを実装する必要はない。
しかし、GCの無い言語を使う場合、必ずGCを実装しなくてはならない。
0666デフォルトの名無しさんNGNG
prologでprologを作るのは
本当にprologを作った事になるのか?
この答えは微妙である。
あるプログラムを作ったとしよう。
99%が他人の作ったライブラリーを使っている時
それを自分で作ったと言い切れるか?
ブラウザを作るのは簡単と言っているVB厨を認めるか?

個人的な意見を書けば、prologでprologを書く事に意味はないので
(有益な機能を追加したprologを作る事には意味がある)
prologを作るというのは、prologの持つ言語機能を
実装する事を指すと思う。
しかしながらアセンブラでやれとは言わない。
なぜなら、プログラミングにライブラリーはつき物だから。
でも、スタックを実装するのにVectorを使うバカはいないよね?
prolog「特有」の言語機能を持たない言語で作る事
が普通だと思う。
そうする事には意味があって、
例えばC言語でGCを実装すれば
C言語でGCが使いたい時はそれを使う事ができる。

prologでprologを作るのは
perlで正規表現モジュールを作るのと同じくらいバカげた事である。
0667デフォルトの名無しさんNGNG
最後に
メタインタプリタをネイティブコンパイラ
(あるいはトランスレーター)でコンパイルすると
何が出てくるか?
という質問があったけれど、適切な答えが無かったので。

答えはインタプリタ(コンパイラも同じ?)を作った事のある人間なら簡単。
インタプリタの実行過程を考えると、
ソースコードをまず内部表現に置き換えるわけだ。
内部表現はC++ならクラスとかに切り分けて表現されるのだけれど。
トランスレーターはそのインスタンスを実際に作った物
コンパイラはそのトランスレーターで出したコードを
コンパイルした物とほとんど変わらない。

つまり、コンパイルしても起動速度以外は
速くならない・・・理論的には。

以上
prologをlispに置き換えてもらっても同じです。
0668デフォルトの名無しさんNGNG
prologをVBでつくってうp希望
0669デフォルトの名無しさんNGNG
>>665-667
ただのアフォ?

それはそうと、メタインタプリタを作る事と
インタプリタを作る事の違いが誰もわかってないみたいなので
解説する。

>極端な事を言えば、メタインタプリタを作るという事は
>インタプリタのソースコードが提供されていて
>そのソースコードを利用してインタプリタを作る事と等価である。
>prologでprologを作るというのは
>3行でmainルーチンが書けてしまうようなライブラリを使って
>作っているだけに過ぎない。
Prologで「ちゃんとした」Prologインタプリタだって書けるが。

>個人的な意見を書けば、prologでprologを書く事に意味はないので
>(有益な機能を追加したprologを作る事には意味がある)
じゃあ、CでCを書くことにも意味は無いわけだ。何で書くの?

>メタインタプリタをネイティブコンパイラ
>(あるいはトランスレーター)でコンパイルすると
>何が出てくるか?
>という質問があったけれど、適切な答えが無かったので
>>608-610 のこと?答出てるじゃんか。

>つまり、コンパイルしても起動速度以外は
>速くならない・・・理論的には。
何と比べてるんだろ。
普通、インタプリタはコンパイルしてから実行するもんだが。
0670デフォルトの名無しさんNGNG
「PrologでPrologを書く」というのが理解できない香具師らは、
「CでCを書く」のも理解できないのか?

Cの処理系だって、(setjmpやva_argsなど)Cでは書けない部分が
たくさんあって、一部はインラインアセンブラ等でかかれている
わけだが、そうすると「Cで書いたとは呼べない」とか?
0671デフォルトの名無しさんNGNG
コンパイラ=ネイティブコンパイラだと思われ
0672デフォルトの名無しさんNGNG
>Cの処理系だって、(setjmpやva_argsなど)Cでは書けない部分が
>たくさんあって
動作を実現するだけならできると思うよ。
できないと思うオペレーションがあったら書いてみて。
0673デフォルトの名無しさんNGNG
>Prologで「ちゃんとした」Prologインタプリタだって書けるが。
「ちゃんとした」って何?
C言語で書くなら
soloveとcloseを実装するだけだけど
C言語のスタックだと解探索の途中で結果を見る事ができないから
自分でスタックを作らないと厳しいのかな。
VMクラスが提供されてるなら
vm.setGoal(clause);
vm.solve();
で終わりだけどねw
prologのソースはたくさん落ちてるから
それを使えば簡単。
Prologを使ってPrologを作るってのは
VMクラスを使ってPrologを作る事と大差ないな・・・

CでCを書くことにどんな意味があるんだろう・・・
0674672NGNG
なんかわかりにくい日本語だ。
C言語のインタプリタならC言語で作れると思うけど。
Cコンパイラの事を指してるなら、
機械語を生成するプログラムだから
また話は別だと思うよ。
コンパイラが作れれば、ソースコードをコンパイルして実行する
という過程を経てインタープリタができるという人もいるかもしれないけど
実はCPUっていうVMにあたる物を利用してるわけでして。
だから、コンパイラが作れればインタープリタが作れるというのは
ちょっと違う気がする。

それうじゃないとしても、
インタープリタとコンパイラを区別して
話を進めても問題ないよね。

ところで、C++のインタープリタって作れる人いる?
俺はたぶん無理だ。
0675引き篭もりNGNG
> prologでprologを作るのは
> 本当にprologを作った事になるのか?

PerlでPerl処理系を作ったら本当にPerl処理系を作ったことになるのか?


> ところで、C++のインタープリタって作れる人いる?

今は作れないけどちょびっとずつ努力はしている。
0676デフォルトの名無しさんNGNG
>PerlでPerl処理系を作ったら本当にPerl処理系を作ったことになるのか?

1.PerlでPerlコンパイラを書き、
2.それを使って「Perlで書いたPerlインタプリタ」をコンパイルし、
3.Perlインタプリタのバイナリが得られた。
としたら、そりゃ「本当にPerlを作った」としか言いようが無いだろ。
CもPrologも同じ。SICStusはそうやって作られている。
0677デフォルトの名無しさんNGNG
メタとかリフレクションとか、よく知らない用語を振り回す前に
問題を整理しろよ。

・PrologでPrologコンパイラは書けるか?
もちろん書けるよな。
・PrologでPrologインタプリタは書けるか?
もちろん書けるよな。
・「Prologで書いたPrologインタプリタ」をコンパイルしたものは、実用的か?
実際、代表的な処理系がそうやって作られているよな。
・「PrologでPrologインタプリタを書く」のは、Cで書くより楽か?
楽だよな。
・実用プログラムを書くとき、より楽な方法で書くのは悪いことか?
お勉強とか実力を示すとかの目的じゃなくて、できあがったプログラムが欲しい
だけなら、より楽な方法で書くほうが良いに決まってるわな。

…で、何が問題なんだっけ?
0678デフォルトの名無しさんNGNG
Squeak は Smalltalk -> C のトランスレータと処理系を Smalltalk で書いて、
C のコードをコンパイルしているらしいね。

>>676
Perl で Perl コンパイラを書くってのが怠そうだけど、C で書くよりも Perl
で書いた方が書き易いのかは気になる所。Scheme で Scheme コンパイラ書く
のは書き易いの?
0679デフォルトの名無しさんNGNG
PerlでPerlコンパイラか…
パーザを手で書くならCより楽だろうな。
でもCにはyaccがあるし。Perlを吐くパーザジェネレータってあったっけ?
パーザ以降の段階は、Perl5ならCより楽だろう。メモリ管理とか気を使わないで良いし。

SchemeでScehemコンパイラを書くのは激楽だよ。つか、インタプリタはともかく、
コンパイラはどの処理系もほとんどSchemeで書いてあるんでは?
いわゆる「パーザ」の部分は単に(read)と書くだけだし、
マクロ展開→最適化→コード生成まで、すべてリスト処理だからな。
0680デフォルトの名無しさんNGNG
>…で、何が問題なんだっけ?
PrologでPrologを作るのと
CでPrologを作る事の本質的な違い。

Prologには既にバックトラックが実装されているから
PrologでPrologを作るのにはバックトラックを実装する必要はない。

C言語にはバックトラックが実装されていないから
C言語でPrologを作るのにバックトラックを実装する必要がある。

以降同様に、データ表現になどについて同じことが言える。

ただし、C言語にバックトラックや、データ表現などに関するライブラリがある場合
C言語でPrologは3行で書ける。
solve(Goal goal,Argument arg){
prolog_solve(goal,arg);
}
結果はフックである関数が呼び出されてそこで処理する。

この事から
PrologでPrologを作る事は
ライブラリを利用しているだけにすぎない。

という事が過去ログに書いてあったよ。
0681デフォルトの名無しさんNGNG
>SchemeでScehemコンパイラを書くのは激楽だよ。
これは自分でマシン語を生成するんですか?
という事は、CPU(機械語)の知識がないと作れない?
それともマシン語生成ライブラリみたいなのが
Schemeについているから、CPUの知識は不要?
わかる人いたら教えてください。
0682デフォルトの名無しさんNGNG
あげ
0683デフォルトの名無しさんNGNG
コンパイラを書くにはCPUを知らなきゃならなくて
それが一番大変だと思うんだが。
パーサーなんてコンパイラコンパイラ使えばいいし。
0684デフォルトの名無しさんNGNG
>Prologには既にバックトラックが実装されているから
>PrologでPrologを作るのにはバックトラックを実装する必要はない。

「PrologでPrologインタプリタを書く」時についてはそのとおり。
だから、わざわざCで書くのは馬鹿馬鹿しいだけだよね。
コンパイラを書くときには(いったんWAMなどに落として)バックトラックを
実装するコードを出す。出すコードは何で実装しても同じ。

>>681
当然CPUの知識は必要。機械語じゃなくてアセンブリ言語でたいてい
間に合うけど。(CISCでコードサイズを最小化するなら、機械語が何バイト
になるか気にする必要がある。) ただ、出すコードについては何で
書こうと基本的に変わらない。Schemeのソースプログラムを操作したり、
中間表現を最適化したり、アセンブリ言語レベルでピープホール最適化を
したりするのが、CでやるよりSchemeでやったほうが楽。
0685デフォルトの名無しさんNGNG
>バックトラックを実装するコードを出す。
これはどういう意味?
WAMそのもの?
0686デフォルトの名無しさんNGNG
JavaでPrologインタプリタを作った。
次はPrologコンパイラに挑戦しよう。
0687デフォルトの名無しさんNGNG
>インタプリタを作った人
test(A,A).
test1(A,B):-not(A=B),test(A,B).
こういうのをバックトラックするとき
データ構造はどうしてますか?
0688デフォルトの名無しさんNGNG
Prologコンパイラって単独で実行できる
(WindowsでいうとEXEファイルのような)
ファイル出力できます?

Prologコンパイラの出力って単独で実行できないけど
インタプリタより速度が速い中間言語みたいのを
指すんですよね?(間違っていたらすいません)
0689デフォルトの名無しさんNGNG
prologネイティブコンパイラは実行ファイルを出す。
中間言語にコンパイルするものもある。
0690デフォルトの名無しさんNGNG
さらに質問
test(A,A).
test1(A,B):-not(test(A,B)),A=1,B=1.
とあった時

test1(A,B).
とするとNOと返ってきますが、
これはどういう風に考えればいいのですか?
0691デフォルトの名無しさんNGNG
高階のnotは標準Prologにない特殊な拡張。
Prologがきちんと扱えるのは1階述語論理だけ。
0692デフォルトの名無しさんNGNG
>>687
「こういう」も何も、Prologランタイムのデータ構造といったら、
global, local, trail, controlの4本のスタックでしょ。あとヒープ。

>>691
test(A,B)が成功した瞬間にnot(test(A,B))はfailするよね。
0693デフォルトの名無しさんNGNG
global stack=heapじゃなかったっけ?
どっかに詳しい資料ないかな・・・
0694デフォルトの名無しさんNGNG
>>693
structureは確かにglobal stackに割り付けられるが、
atomやfunctorはヒープに割り付けられる。
0695デフォルトの名無しさんNGNG
prologの実装ってなんか難しそうだな。
0696デフォルトの名無しさんNGNG
効率よい実装はそれなりに難しい。
どんな言語でも。
0697デフォルトの名無しさんNGNG
(((;゚Д゚)))ここは本当にPrologでマターリスレか?ハァハァ
0698デフォルトの名無しさんNGNG
論理プログラミングって、いまいち概要が掴めないんだが、
どんな方向に逝ってるの?
0699デフォルトの名無しさんNGNG
prologで殺伐スレです
0700デフォルトの名無しさんNGNG
fib(30,X).
X = 832040
はできるのわかるけど、

fib(X,832040).
X = 30
ってできるの?
0701デフォルトの名無しさんNGNG
>>700
それはおそらく制約論理プログラミングの領域だと思う
0702誰かNGNG
Prologインタプリタを作ってつまづいてるのですが、
ソースコードを見てアドバイスをしてくれる神はいますか?
0703デフォルトの名無しさんNGNG
0=0, 1=s(0), 2=s(s(0)),... とかいう表現形式にして
add(X, 0, X).
add(X, s(Y), s(Z)) :- add(X, Y, Z).
fib(0, s(0)).
fib(s(0), s(0)).
fib(s(s(X)), W) :- fib(X, Y), fib(s(X), Z), add(Y, Z, W).
とかやればできるかもしれない。
832040の表現が大変だけど。
0704702NGNG
あきらめました。
凡人には無理でした。
バックトラックする時、どこまで探索したかを記録するのを
忘れていました。
0705デフォルトの名無しさんNGNG
prologなどの実業務への適用って、ちゃんとあるんですね

http://www.ifcomputer.com/News/SpectaclesDesign/home_jp.html
http://www.ifcomputer.com/News/NikkeiAward/home_jp.html
0706デフォルトの名無しさんNGNG
>>702,704
バックトラックを実装するのは自分でも言ってるとおり
どこまで探索したかを保持しておけばいいんで別に難しくないが。
カットがあると多少めんどくさいけど。
0707704NGNG
>>706
そうかなー。
保持しておいて、再開する時どうすればいいのかとか
よくわからんです。
もしよければ、単純な物の概要みたいなのをソースコード風な表現で
書いてもらえるとうれしいのですが。

あとは引数の受け渡しがよくわかりません。
a(A,B):-b(A,C),c(C,B).
b(A,C):-A=C
とすると
必要な変数は
ABCとなるのはわかるんですが
b(A,C)が実行された後
どういうやりとりを行えばいいのかよくわかりません。
つまりA=Cというデータを渡すにはどうすればいいのでしょうか?
0708デフォルトの名無しさんNGNG
http://japan.pinkserver.com/under/index.html
勝手に他人のサイトを直リンク!!
「法的根拠はない!!」
「だから直リンしてます」
ハァ?
ネチケットも守れない痛い厨のサイト晒し
0709デフォルトの名無しさんNGNG
pinkserverってアダルトサイトじゃなかったっけ? 宣伝か?
0710デフォルトの名無しさんNGNG
age
■ このスレッドは過去ログ倉庫に格納されています