Prolog でまったり
■ このスレッドは過去ログ倉庫に格納されています
0001人工無能
NGNGそんなPrologについてまったり話しましょう
0611デフォルトの名無しさん
NGNG1について詳しく書いてあるWEB知ってたら教えて。
0612デフォルトの名無しさん
NGNG0613デフォルトの名無しさん
NGNGそのベンチを試した処理系は何なの?
0614デフォルトの名無しさん
NGNG最近は線形論理型言語やってるのでは。
0615デフォルトの名無しさん
NGNGCMUCLとAllegro CLとgcc
マシンはSun Ultra-10
0616デフォルトの名無しさん
NGNGschemeは?
0617デフォルトの名無しさん
NGNGまさかオブジェクトコード生?そこの話がこんがらがってないですかな。
0618デフォルトの名無しさん
NGNGChez Scheme Version 6とgcc 2.95.2。
0619デフォルトの名無しさん
NGNG聞き飽きた話だが、Cでも同じだろ。
0620デフォルトの名無しさん
NGNGPrologは知らん。DEC-10のアセンブラかな?
マルセイユPrologの方が先か。Lispかもね。
0621デフォルトの名無しさん
NGNG会話になってねーよ。
さっきから頭痛い原因はおまえか。
0622デフォルトの名無しさん
NGNGいるんだよな。「クロス開発した」っていうと
「最初は?」って聞く厨房(藁
0623デフォルトの名無しさん
NGNGまさかオブジェクトコード生?そこの話がこんがらがってないですかな。
0624デフォルトの名無しさん
NGNGなにか悔しいことでもあったんでしゅか?
0625デフォルトの名無しさん
NGNGわかった。ちゃんと答える。
「Cコンパイラと同様、クロス開発したものと思われ」
0626デフォルトの名無しさん
NGNGgccのソース
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でも、せいぜい数マイクロ秒でしょ。
0628デフォルトの名無しさん
NGNGgnu prologはC言語で書いてあるし、
prologで書かれたprologなんて無くない?
lispでかかれたlispってどれ?
実用的なものを除けば、ほとんどCで書かれてそうだけど。
0629デフォルトの名無しさん
NGNGそれ言ったらformatだって遅いんでは。
つーかあのベンチ自体あんまり信用できないんだけど。
0630デフォルトの名無しさん
NGNGlogって所を押すと・・・
0631デフォルトの名無しさん
NGNGLISPコンパイラはLISPで書かれてるけど。
0632デフォルトの名無しさん
NGNGホームページがあればお願いします
0633デフォルトの名無しさん
NGNGたくさん書かれている。
0634631
NGNGこれね。
http://www.cons.org/cmucl/
0635デフォルトの名無しさん
NGNG>>585
0636デフォルトの名無しさん
NGNGschemeの作り方だよーん。
メタインタプリタを作るのが簡単なのは、
perlで正規表現が簡単に使えるのと同じ。
正規表現のモジュールを使える事と、
正規表現のモジュールを作れる事は違います!!
0637デフォルトの名無しさん
NGNG0638デフォルトの名無しさん
NGNG0639デフォルトの名無しさん
NGNGftp://ftp.averillpark.net/cmucl/src/lisp/
C言語で作られてるみたいだけど・・・
0640デフォルトの名無しさん
NGNG解説よろしこ
0641デフォルトの名無しさん
NGNG多いな。
0642デフォルトの名無しさん
NGNG0644デフォルトの名無しさん
NGNG0645デフォルトの名無しさん
NGNGそのschemeは末尾再帰展開しない上にやたら遅い。
学習には不向き。
0646デフォルトの名無しさん
NGNG0647デフォルトの名無しさん
NGNG0648デフォルトの名無しさん
NGNGLarcenyはランタイムがCだと思ったけど。
0649デフォルトの名無しさん
NGNGUnixで走らせるなら。
0650デフォルトの名無しさん
NGNG非実用的だけどね
0651デフォルトの名無しさん
NGNG0652デフォルトの名無しさん
NGNG0653デフォルトの名無しさん
NGNG公開されてる分については。
0654デフォルトの名無しさん
NGNGあれは何から何まで全部scheme。
ブートストラップにscheme自身が必要だったかと。
0655デフォルトの名無しさん
NGNG0656デフォルトの名無しさん
NGNG0657デフォルトの名無しさん
NGNGbignum演算からgcまで全部Lispで書いてあった。
0658655
NGNG0659デフォルトの名無しさん
NGNG素人まるだちでついまちえん
0660デフォルトの名無しさん
NGNG0661デフォルトの名無しさん
NGNG多少スレ違いの気もするが、マジレスすると、
関数の実引数を、値が本当に必要になるまで
評価しない方式のこと。
詳しくはHaskellスレか関数型言語スレで聞こう。
0662デフォルトの名無しさん
NGNG0663デフォルトの名無しさん
NGNG0664デフォルトの名無しさん
NGNGぴったり当てはまるものはないんじゃないの。
似たものとしては、制約プログラミングとか?
0665デフォルトの名無しさん
NGNGhttp://www.ccs.neu.edu/home/will/Larceny/
本当だ。
Chezの上に作ってるね。
それはそうと、メタインタプリタを作る事と
インタプリタを作る事の違いが誰もわかってないみたいなので
解説する。
極端な事を言えば、メタインタプリタを作るという事は
インタプリタのソースコードが提供されていて
そのソースコードを利用してインタプリタを作る事と等価である。
prologでprologを作るというのは
3行でmainルーチンが書けてしまうようなライブラリを使って
作っているだけに過ぎない。
一方プログラムを作る一番原始的な方法は
アセンブラで書くことだけれど、
実際にはプログラミング言語を使う。
それはコードの見易さと言語に実装されている機能があるから。
あるプログラミング言語Aでプログラミング言語Bを実装するには
BにはあってAにはない言語機能を実装する事になる。
GCのある言語を使えば、GCのある別の言語を実装するのに
GCを実装する必要はない。
しかし、GCの無い言語を使う場合、必ずGCを実装しなくてはならない。
0666デフォルトの名無しさん
NGNG本当にprologを作った事になるのか?
この答えは微妙である。
あるプログラムを作ったとしよう。
99%が他人の作ったライブラリーを使っている時
それを自分で作ったと言い切れるか?
ブラウザを作るのは簡単と言っているVB厨を認めるか?
個人的な意見を書けば、prologでprologを書く事に意味はないので
(有益な機能を追加したprologを作る事には意味がある)
prologを作るというのは、prologの持つ言語機能を
実装する事を指すと思う。
しかしながらアセンブラでやれとは言わない。
なぜなら、プログラミングにライブラリーはつき物だから。
でも、スタックを実装するのにVectorを使うバカはいないよね?
prolog「特有」の言語機能を持たない言語で作る事
が普通だと思う。
そうする事には意味があって、
例えばC言語でGCを実装すれば
C言語でGCが使いたい時はそれを使う事ができる。
prologでprologを作るのは
perlで正規表現モジュールを作るのと同じくらいバカげた事である。
0667デフォルトの名無しさん
NGNGメタインタプリタをネイティブコンパイラ
(あるいはトランスレーター)でコンパイルすると
何が出てくるか?
という質問があったけれど、適切な答えが無かったので。
答えはインタプリタ(コンパイラも同じ?)を作った事のある人間なら簡単。
インタプリタの実行過程を考えると、
ソースコードをまず内部表現に置き換えるわけだ。
内部表現はC++ならクラスとかに切り分けて表現されるのだけれど。
トランスレーターはそのインスタンスを実際に作った物
コンパイラはそのトランスレーターで出したコードを
コンパイルした物とほとんど変わらない。
つまり、コンパイルしても起動速度以外は
速くならない・・・理論的には。
以上
prologをlispに置き換えてもらっても同じです。
0668デフォルトの名無しさん
NGNG0669デフォルトの名無しさん
NGNGただのアフォ?
それはそうと、メタインタプリタを作る事と
インタプリタを作る事の違いが誰もわかってないみたいなので
解説する。
>極端な事を言えば、メタインタプリタを作るという事は
>インタプリタのソースコードが提供されていて
>そのソースコードを利用してインタプリタを作る事と等価である。
>prologでprologを作るというのは
>3行でmainルーチンが書けてしまうようなライブラリを使って
>作っているだけに過ぎない。
Prologで「ちゃんとした」Prologインタプリタだって書けるが。
>個人的な意見を書けば、prologでprologを書く事に意味はないので
>(有益な機能を追加したprologを作る事には意味がある)
じゃあ、CでCを書くことにも意味は無いわけだ。何で書くの?
>メタインタプリタをネイティブコンパイラ
>(あるいはトランスレーター)でコンパイルすると
>何が出てくるか?
>という質問があったけれど、適切な答えが無かったので
>>608-610 のこと?答出てるじゃんか。
>つまり、コンパイルしても起動速度以外は
>速くならない・・・理論的には。
何と比べてるんだろ。
普通、インタプリタはコンパイルしてから実行するもんだが。
0670デフォルトの名無しさん
NGNG「CでCを書く」のも理解できないのか?
Cの処理系だって、(setjmpやva_argsなど)Cでは書けない部分が
たくさんあって、一部はインラインアセンブラ等でかかれている
わけだが、そうすると「Cで書いたとは呼べない」とか?
0671デフォルトの名無しさん
NGNG0672デフォルトの名無しさん
NGNG>たくさんあって
動作を実現するだけならできると思うよ。
できないと思うオペレーションがあったら書いてみて。
0673デフォルトの名無しさん
NGNG「ちゃんとした」って何?
C言語で書くなら
soloveとcloseを実装するだけだけど
C言語のスタックだと解探索の途中で結果を見る事ができないから
自分でスタックを作らないと厳しいのかな。
VMクラスが提供されてるなら
vm.setGoal(clause);
vm.solve();
で終わりだけどねw
prologのソースはたくさん落ちてるから
それを使えば簡単。
Prologを使ってPrologを作るってのは
VMクラスを使ってPrologを作る事と大差ないな・・・
CでCを書くことにどんな意味があるんだろう・・・
0674672
NGNGC言語のインタプリタならC言語で作れると思うけど。
Cコンパイラの事を指してるなら、
機械語を生成するプログラムだから
また話は別だと思うよ。
コンパイラが作れれば、ソースコードをコンパイルして実行する
という過程を経てインタープリタができるという人もいるかもしれないけど
実はCPUっていうVMにあたる物を利用してるわけでして。
だから、コンパイラが作れればインタープリタが作れるというのは
ちょっと違う気がする。
それうじゃないとしても、
インタープリタとコンパイラを区別して
話を進めても問題ないよね。
ところで、C++のインタープリタって作れる人いる?
俺はたぶん無理だ。
0675引き篭もり
NGNG> 本当にprologを作った事になるのか?
PerlでPerl処理系を作ったら本当にPerl処理系を作ったことになるのか?
> ところで、C++のインタープリタって作れる人いる?
今は作れないけどちょびっとずつ努力はしている。
0676デフォルトの名無しさん
NGNG1.PerlでPerlコンパイラを書き、
2.それを使って「Perlで書いたPerlインタプリタ」をコンパイルし、
3.Perlインタプリタのバイナリが得られた。
としたら、そりゃ「本当にPerlを作った」としか言いようが無いだろ。
CもPrologも同じ。SICStusはそうやって作られている。
0677デフォルトの名無しさん
NGNG問題を整理しろよ。
・PrologでPrologコンパイラは書けるか?
もちろん書けるよな。
・PrologでPrologインタプリタは書けるか?
もちろん書けるよな。
・「Prologで書いたPrologインタプリタ」をコンパイルしたものは、実用的か?
実際、代表的な処理系がそうやって作られているよな。
・「PrologでPrologインタプリタを書く」のは、Cで書くより楽か?
楽だよな。
・実用プログラムを書くとき、より楽な方法で書くのは悪いことか?
お勉強とか実力を示すとかの目的じゃなくて、できあがったプログラムが欲しい
だけなら、より楽な方法で書くほうが良いに決まってるわな。
…で、何が問題なんだっけ?
0678デフォルトの名無しさん
NGNGC のコードをコンパイルしているらしいね。
>>676
Perl で Perl コンパイラを書くってのが怠そうだけど、C で書くよりも Perl
で書いた方が書き易いのかは気になる所。Scheme で Scheme コンパイラ書く
のは書き易いの?
0679デフォルトの名無しさん
NGNGパーザを手で書くならCより楽だろうな。
でもCにはyaccがあるし。Perlを吐くパーザジェネレータってあったっけ?
パーザ以降の段階は、Perl5ならCより楽だろう。メモリ管理とか気を使わないで良いし。
SchemeでScehemコンパイラを書くのは激楽だよ。つか、インタプリタはともかく、
コンパイラはどの処理系もほとんどSchemeで書いてあるんでは?
いわゆる「パーザ」の部分は単に(read)と書くだけだし、
マクロ展開→最適化→コード生成まで、すべてリスト処理だからな。
0680デフォルトの名無しさん
NGNGPrologで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これは自分でマシン語を生成するんですか?
という事は、CPU(機械語)の知識がないと作れない?
それともマシン語生成ライブラリみたいなのが
Schemeについているから、CPUの知識は不要?
わかる人いたら教えてください。
0682デフォルトの名無しさん
NGNG0683デフォルトの名無しさん
NGNGそれが一番大変だと思うんだが。
パーサーなんてコンパイラコンパイラ使えばいいし。
0684デフォルトの名無しさん
NGNG>PrologでPrologを作るのにはバックトラックを実装する必要はない。
「PrologでPrologインタプリタを書く」時についてはそのとおり。
だから、わざわざCで書くのは馬鹿馬鹿しいだけだよね。
コンパイラを書くときには(いったんWAMなどに落として)バックトラックを
実装するコードを出す。出すコードは何で実装しても同じ。
>>681
当然CPUの知識は必要。機械語じゃなくてアセンブリ言語でたいてい
間に合うけど。(CISCでコードサイズを最小化するなら、機械語が何バイト
になるか気にする必要がある。) ただ、出すコードについては何で
書こうと基本的に変わらない。Schemeのソースプログラムを操作したり、
中間表現を最適化したり、アセンブリ言語レベルでピープホール最適化を
したりするのが、CでやるよりSchemeでやったほうが楽。
0685デフォルトの名無しさん
NGNGこれはどういう意味?
WAMそのもの?
0686デフォルトの名無しさん
NGNG次はPrologコンパイラに挑戦しよう。
0687デフォルトの名無しさん
NGNGtest(A,A).
test1(A,B):-not(A=B),test(A,B).
こういうのをバックトラックするとき
データ構造はどうしてますか?
0688デフォルトの名無しさん
NGNG(WindowsでいうとEXEファイルのような)
ファイル出力できます?
Prologコンパイラの出力って単独で実行できないけど
インタプリタより速度が速い中間言語みたいのを
指すんですよね?(間違っていたらすいません)
0689デフォルトの名無しさん
NGNG中間言語にコンパイルするものもある。
0690デフォルトの名無しさん
NGNGtest(A,A).
test1(A,B):-not(test(A,B)),A=1,B=1.
とあった時
test1(A,B).
とするとNOと返ってきますが、
これはどういう風に考えればいいのですか?
0691デフォルトの名無しさん
NGNGPrologがきちんと扱えるのは1階述語論理だけ。
0692デフォルトの名無しさん
NGNG「こういう」も何も、Prologランタイムのデータ構造といったら、
global, local, trail, controlの4本のスタックでしょ。あとヒープ。
>>691
test(A,B)が成功した瞬間にnot(test(A,B))はfailするよね。
0693デフォルトの名無しさん
NGNGどっかに詳しい資料ないかな・・・
0694デフォルトの名無しさん
NGNGstructureは確かにglobal stackに割り付けられるが、
atomやfunctorはヒープに割り付けられる。
0695デフォルトの名無しさん
NGNG0696デフォルトの名無しさん
NGNGどんな言語でも。
0697デフォルトの名無しさん
NGNG0698デフォルトの名無しさん
NGNGどんな方向に逝ってるの?
0699デフォルトの名無しさん
NGNG0700デフォルトの名無しさん
NGNGX = 832040
はできるのわかるけど、
fib(X,832040).
X = 30
ってできるの?
0701デフォルトの名無しさん
NGNGそれはおそらく制約論理プログラミングの領域だと思う
0702誰か
NGNGソースコードを見てアドバイスをしてくれる神はいますか?
0703デフォルトの名無しさん
NGNGadd(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の表現が大変だけど。
0704702
NGNG凡人には無理でした。
バックトラックする時、どこまで探索したかを記録するのを
忘れていました。
0705デフォルトの名無しさん
NGNGhttp://www.ifcomputer.com/News/SpectaclesDesign/home_jp.html
http://www.ifcomputer.com/News/NikkeiAward/home_jp.html
0706デフォルトの名無しさん
NGNGバックトラックを実装するのは自分でも言ってるとおり
どこまで探索したかを保持しておけばいいんで別に難しくないが。
カットがあると多少めんどくさいけど。
0707704
NGNGそうかなー。
保持しておいて、再開する時どうすればいいのかとか
よくわからんです。
もしよければ、単純な物の概要みたいなのをソースコード風な表現で
書いてもらえるとうれしいのですが。
あとは引数の受け渡しがよくわかりません。
a(A,B):-b(A,C),c(C,B).
b(A,C):-A=C
とすると
必要な変数は
ABCとなるのはわかるんですが
b(A,C)が実行された後
どういうやりとりを行えばいいのかよくわかりません。
つまりA=Cというデータを渡すにはどうすればいいのでしょうか?
0708デフォルトの名無しさん
NGNG勝手に他人のサイトを直リンク!!
「法的根拠はない!!」
「だから直リンしてます」
ハァ?
ネチケットも守れない痛い厨のサイト晒し
0709デフォルトの名無しさん
NGNG0710デフォルトの名無しさん
NGNG■ このスレッドは過去ログ倉庫に格納されています