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

Prolog でまったり

■ このスレッドは過去ログ倉庫に格納されています
0001人工無能NGNG
Cなどの言語とは全く得意分野も構造もちがうProlog。
そんなPrologについてまったり話しましょう
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
0711デフォルトの名無しさんNGNG
>>707
[A/C]という単一化のデータでいいのでは?
0712デフォルトの名無しさんNGNG
すごい短絡的だねw
0713711NGNG
>>712
俺に言ってる?何か間違ってること言った?
0714デフォルトの名無しさんNGNG
f(A,B,X):-A=B,!,X=equal.
f(_,_,notequal).
これと
f(A,B,equal):-A=B,!.
f(_,_,notequal).
は同じですか?教えてください!
0715名無しさん@XEmacsNGNG
>>714
> は同じですか?教えてください!

同じじゃないでつ。
0716デフォルトの名無しさんNGNG
具体的な答えが書ける奴っていないねw
0717デフォルトの名無しさんNGNG
上は ?- f(1,1,notequal). で no となるが、
下は yes となる。
0718デフォルトの名無しさんNGNG
f(A,B,equal):-A=B,!.
f(_,_,notequal).

これのカットは不要でしょ
0719デフォルトの名無しさんNGNG
>>718
いると思う。?- f(1,1,R). でセミコロンを入れて、別解を求めると
R = notequal のほうも答えで出てきてしまう。
f(A,B,equal) :- A=B.
f(A,B,notequal) :- \+ A=B.
ならカットなしでOK。ちなみに \+ は not の意味
0720デフォルトの名無しさんNGNG
>>719
なるほど
0721デフォルトの名無しさんNGNG
not(A=B)
って、単一化のときどうなってるんだろ。
ある程度有効なんだけど。
このへんがわかってないで、prolog組んでるのは
使える便利な機能があるのに
使ってないような気分になっていや。
0722デフォルトの名無しさんNGNG
>>721
not(A=B) は、A=B に失敗したというだけの意味なので、
論理的には正しくです。たとえば
?- A=1, B=2, not(A=B). は成功するけど
?- not(A=B), A=1, B=2. は失敗してしまう。
SICStus Prolog の dif(A,B) を使えば、AとBが異なることを
論理的に正しく表現できます。
0723デフォルトの名無しさんNGNG
722 の修正
> 論理的には正しくです。たとえば
論理的には正しくないです。たとえば
0724デフォルトの名無しさんNGNG
なんでdif/2を使えば上手くできるの?
0725722NGNG
>>724
dif(A,B) は,一種の遅延評価で実現されてて,
A, Bの中身が決まるまでは,実行がブロックされてます.
だから ?- dif(A,B), A=1, B=2. でもOK!
ただし,SWI PrologやGNU Prologでは使えないと思う.
0726デフォルトの名無しさんNGNG
そうそう
なんでprologって遅延評価を積極的にとりいれないんだろうね?
基本的には
節の前後を入れ替える事には問題がないはずなのに。
0727デフォルトの名無しさんNGNG
節に順序があると非単調推論に拡張しやすいからとか
0728デフォルトの名無しさんNGNG
>>726
うーん、Prologという言語では、節の前後関係は非常に重要で、入れ替えは困難では。
節の前後関係を意識しないでPrologでプログラミングできる局面は限られると思うな。
それで論理型言語を標榜するのはおこがましいという批判はあるかもしれないけどさ。

例えばカットの入れ方なんて、節の前後関係と強く癒着してしまってるでしょ?

Prologに遅延評価を入れたら、...
えーと、ここで例えばリスト操作で困る具体例を挙げようとしたんだけど、うぅ思いつかない。
ということは愛着や気分だけで遅延評価を嫌ってるんか?(w >俺
0729デフォルトの名無しさんNGNG
確かにカットはまずいんだけど、
カットはなくても大丈夫?なはずだから。
0730デフォルトの名無しさんNGNG
素人です。
CやPascalのコンパイラのように単独で実行できるファイルが生成できる
Prologはありますか?
本来、Prologではそのようなコンパイルには不向きですか?
0731デフォルトの名無しさんNGNG
Prologで実行ファイルって、、、
0732デフォルトの名無しさんNGNG
>>730-731
昔ボーランドが出してた Turbo Prolog は確かコンパイラ付きで
実行ファイルが生成できたが、
かなり方言のきつい処理系だった様な思い出が…。

今手に入る処理系でも探せば結構ある。
ttp://kaminari.scitec.kobe-u.ac.jp/logic/lp.html
0733デフォルトの名無しさんNGNG
ダブルクリックすれば実行できるものがほとんどだけど
それじゃダメなのかな?
インタプリタは実行ファイルだし。
0734デフォルトの名無しさんNGNG
>>732
>昔ボーランドが出してた Turbo Prolog は確かコンパイラ付きで
興味深いお話ですね。今もあれば見てみたいところです。
>今手に入る処理系でも探せば結構ある。
ありがとうございます。
見たところProlog to Cという形で変換してからコンパイルすれば
希望が達成できそうです。
ただ、Prolog to Cが出来るのに直接Prologからコンパイルは
無いんですかね?
(Prolog to Cでも出来ると分かっただけでも収穫です。)

以前K-Prologがコンパイルできると聞いて試してみると
単独で実行できなくてがっかりしました。
(これはこれで、デバッグがすんだプログラムを高速化できて
評価できるものでしたが‥‥)
0735デフォルトの名無しさんNGNG
>> 734
> 以前K-Prologがコンパイルできると聞いて試してみると
> 単独で実行できなくてがっかりしました。

dllかsoが必要だから単独では実行できないという話ですか?

> ただ、Prolog to Cが出来るのに直接Prologからコンパイルは
> 無いんですかね?
>(Prolog to Cでも出来ると分かっただけでも収穫です。)

Cにしておくと移植コストがかからないので、楽なんじゃないでしょうか。
K-Prologの中間コードはほとんどマクロみたいだから、中身を機械語に
なおせばできるかも??
0736デフォルトの名無しさんNGNG
なんかまたメタインタプリタの話がぶり返してきそうな。
Prologってのはバックトラックみたいなのが言語に組み込まれているというか
それを前提にプロログソースコードを書くわけだ。

コンパイルって言ってるのは、機械語へのコンパイルの事を指している
と思うのだが、
結局、機械語へコンパイルしても
プロログのソースコードを処理するコード+誰かが書いたプロログソースコードの
内部表現
という形になるだけなんだよ。

Prolog to Cも同じ。
結局のところ出力された機械語を最適化できないので、
ネイティブコンパイラの存在にはあまり意味がない。
(機械語の最適化なんてできないだろうけど)
って、そういう意味じゃないのかな?

>希望が達成できそうです。
つーか、何を希望しているのかよくわからない。

配布する時の事を考えているのなら、
インタプリタとソースコードをセットで配布すれば
いいのでは?
windowsならバッチファイルを使うなりすればいいと思うけど。
0737デフォルトの名無しさんNGNG
>736
>なんかまたメタインタプリタの話がぶり返してきそうな。

お前が話したいだけじゃないのか?
わざわざageやがって
0738デフォルトの名無しさんNGNG
>>736
ちょっとわからないのですが
> 結局、機械語へコンパイルしても
> プロログのソースコードを処理するコード+
> 誰かが書いたプロログソースコードの
> 内部表現
内部表現って機械語のことですか?

機械語って最適化できないのでしょうか?
WAMから変換する機械語の最適化の研究はかつてずいぶんあったように
思うのですが..
0739デフォルトの名無しさんNGNG
>>738
>WAMから変換する機械語の最適化の研究はかつてずいぶんあったように
大変興味深いお話です。
このような情報はありがたいです。

>735
>K-Prologの中間コードはほとんどマクロみたいだから、中身を機械語に
>なおせばできるかも??
これもWAMから機械語という内容が理解できれば
筋道が見えてきそうですね。

>>736
>プロログのソースコードを処理するコード+誰かが書いたプロログソースコードの
>内部表現
>という形になるだけなんだよ。
これは残念な情報です。私もこれを危惧しています。
>Prologってのはバックトラックみたいなのが言語に組み込まれているというか
>それを前提にプロログソースコードを書くわけだ。
バックトラックも含めてPrologをコンパイルするには何らかの工夫なくしては
実現不可能な動作がいくつかあるようでそれらを扱っていそうな研究も
”かつてずいぶんあった[738]”ということですのでこれらの研究と
その実装結果に興味があります。特に実装結果に(^^;
0740デフォルトの名無しさんNGNG
>>739
何をしたいのかが良くわからないから、
目的をはっきり書いてもらった方がいいかも。

俺が想像しているのは、
インタプリタにprologのソースコードを食わせるのと
コンパイラでprologのソースコードをマシン語にしたものを実行するのでは
処理内容が違うのでは?
という事を言っている気がするけど、
同じだよ。
処理の仕方が全然違うようなアルゴリズムを見つけられたら神なんだけど、
でも、コンパイラで実装できるものはインタプリタでもできるし
その逆も成り立つ。

>内部表現って機械語のことですか?
内部表現っていうのは、
例えば
述語や、節(WAMではTerm)は
あるデータフォーマット(構造体、クラス)として
記録されるわけだけど。
機械語じゃなくて、メモリへどういう形で配置するかという事。

>WAMから変換する機械語の最適化の研究はかつてずいぶんあったように
言ってる事が良くわからないけど、
WAMをベースとしたインタプリタの高速化の研究は当然合ったと思うけど
WAMが処理する中間言語を機械語へどうマッピングするかなんて
工夫しようがないけど。
0741デフォルトの名無しさんNGNG
もう少し書いてみると、
バックトラックという言葉からもなんとなく予想できるけど、
prologのソースコードの中に定義された述語が
木を構成する事は理解できるだろうか?
すなわち、prologのソースコードを書くことは
木を定義する事とほぼ見て取れる。
あとは、その探索をインタプリタがするだけ。

でも、一方で
C言語のような直線的?なプログラムを書いているような気分で
プログラムできる事も間違いなくて、
だから、そういうプログラムに対して無駄な
バックトラックを省いた(というよりもバックトラックしない)
機械語が生成できるような気がしてしまうのもわかる気がする。
でも、そうやって作った直線的なプログラムは
バックトラックのコストは小さかったりする。
すなわち、木の高さは高くても、ノード数が少ない。
0742デフォルトの名無しさんNGNG
>>740 >>741
本当にWAMの勉強したことあるの?

> 内部表現っていうのは、
> 例えば
> 述語や、節(WAMではTerm)は
> あるデータフォーマット(構造体、クラス)として
> 記録されるわけだけど。

WAMでは、述語や節は、WAM機械語命令の列にコンパイルされるよ。
データとして記録はされないです。
0743デフォルトの名無しさんNGNG
WAMの教科書のサイト
ttp://www.vanx.org/archive/wam/wam.html

下のコンパイル例を見れば明らかなように
述語や節はWAMの命令列にコンパイルされる

appendのコンパイルの例 (上記教科書の82ページ)

append/3 : switch_on_term C1a,C1,C2,fail
C1a : try_me_else C2a
C1 : get_constant [],A1
get_value A2,A3
proceed
C2a : trust_me
get_list A1
unify_variable X4
unify_variable A1
get_list A3
unify_value X4
unify_variable A3
execute append/3

0744740&741&....NGNG
>>742
俺はあまりWAMについてよく知らないけど。
資料だけはPCにあるよ(そのうち読んでみようとは思うけど)
その資料によると、Termは
クエリーを受けて、ヒープに作られるって書いてあるけど。
Figure2.1を見てくれた方がいいかと。
内部表現=内部representation
内部って何?internal?

ところで、WAMを勉強する意味って何?

>WAMでは、述語や節は、WAM機械語命令の列にコンパイルされるよ。
>データとして記録はされないです。
正直これを見た感想としては、インタプリタの内部構造について
何も知らないんだなーと。
間違ってたらスマソ。
まあ、そうであれば自分でWAMベースのインタプリタを実装してみるといいよ。
本当はWAMなんて参考にしないで、0から自分で考えるといいと思うけど。
0745デフォルトの名無しさんNGNG
WAMってなんですか?
ラストクリトリスですか?
0746デフォルトの名無しさんNGNG
warren's abstract machine
JAVAで言うVM
0747デフォルトの名無しさんNGNG
>> 744
>>WAMでは、述語や節は、WAM機械語命令の列にコンパイルされるよ。
>>データとして記録はされないです。
>正直これを見た感想としては、インタプリタの内部構造について
>何も知らないんだなーと。
>間違ってたらスマソ。

多分、744の方のPrologインタプリタ・コンパイラへの見方が狭いんじゃないかと
思います。どういう内部構造を仮定しているのでしょうか?

>>740
> WAMが処理する中間言語を機械語へどうマッピングするかなんて
> 工夫しようがないけど。
WAMについては良くご存知なのですか?
0748デフォルトの名無しさんNGNG
>どういう内部構造を仮定しているのでしょうか?
へ?
何が知りたいのかすらよくわからん。
バックトラック以外になんかあるの?
clauseとsolveの実装の仕方を聞いているの?w
どのあたりの見方が狭いのか指摘してもらえると、
参考になるんだけどな。
漠然と「狭い」って言われても、何の事を言ってるのか
よくわからん。

>WAMについては良くご存知なのですか?
そりゃ、WAMがどうこうじゃなくて中間言語の話。
逆に聞くけど、中間言語の機械語へのマッピングでどこを工夫できるの?
WAMについてよく知ってるか?っていう問いだけど
「知ってる」の意味にはいろいろあるからね。
インストラクションを覚えてたりとかはしないことは確か。
でも、資料に目を通して概要を把握している事も確か。
自分でインタプリタを作ってれば、考えている事が
似ている事も確か。

つーか、今気づいたけど、
743見てなかったよ。
資料ってそれくらいしかないよね。
そのPDFを読めばWAMについて全てがわかると思う。
図2.1って言ったのも、そのPDFの図2.1ね。
まあ、補足する必要はないと思うけど念のため。
0749初心者NGNG
ハイレベルな議論が繰り広げられているスレはここでつか?(((;゚Д゚)))ガクガク
サパリワカラン!(・∀・)
0750初心者2NGNG
>>749
俺もわからん。安心しる
0751デフォルトの名無しさんNGNG
>>750
絶望しますた。
0752デフォルトの名無しさんNGNG
レベルとかじゃなくて、
興味あるかないか
あるいは、知っているかいないかの問題だと思うけどね。
WAMについては、
http://www.vanx.org/archive/wam/wam.html
のPDFを読めばいいんだけど
英語という壁がね。
その前に、prologという言語について知る必要があるし。
0753デフォルトの名無しさんNGNG
3〜4年前のことです。
Prolog使いの方から。
Prologでプロトタイプを組んでうまくいったら
他の言語で書き直すといいというお話を伺ったことがあります。
ただあいまいな記憶で何か前提条件とか特定の場合を指していた
ような記憶があるのですが思い出せません。
そのときは、ただ納得していました。
もし、Prolog使いの方とかなんとなくわかる方がいらっしゃれば
「Prologで組んでから他の言語で」という方法が良い場合を
書き込んでいただけませんか?

余談ですが、
そのProlog使いの方は、Prologでは長い(大きい)プログラムを
いくつか構築していましたが、それらは他の言語に移植されておらず、
その方のプログラムの中では割と短い(小さい)プログラムしか
他の言語で書き直していないようでした。
(長いとか短いとか主観的な表現ですいません。)
0754デフォルトの名無しさんNGNG
俺は思いつかないかも。
でも、JAVAじゃなくてPROLOGを使いたいケースなら
思いつくけど。
やっぱり、普通(普通の意味は置いといて)のプログラムは
C++とかJAVAで書きたい。

話の途中で悪いけど
オブジェクト指向のPrologって知ってる?
どう思う?

どこかにホームページがあったので探してきます。
■ このスレッドは過去ログ倉庫に格納されています