Prolog でまったり

このエントリーをはてなブックマークに追加
1人工無能
Cなどの言語とは全く得意分野も構造もちがうProlog。
そんなPrologについてまったり話しましょう
2名無し娘。:2000/12/11(月) 00:44
よく分からんが人工知能用の言語だっけ?
実際人工知能ってどれくらいのもの作れるの?
3名無しさん@お腹いっぱい。:2000/12/11(月) 06:28
>>1=2
1自身がよく判ってないので終了。
4(V)o\o(V):2000/12/11(月) 13:12
Prologについてわかりやすいサイトとか書籍はありますか?
ちなみに、Prologについは全くしりません
5名無しさん@お腹いっぱい。:2000/12/11(月) 13:25
おいらも知りたい。
文法すらわからん。
フリーの処理系ありますか?
6:2000/12/11(月) 14:15
>>1
1じゃね〜ぞ!!
7:2000/12/11(月) 14:15
6は >>3 の間違い
8名無しさん@お腹いっぱい。:2000/12/11(月) 15:12
ftp://ftp.lddlabs.co.jp/lang/prolog/
ここになにかあるよ。
9名無しさん@お腹いっぱい。:2000/12/11(月) 15:16
GNU も prolog 出してるよ。
10名無しさん@お腹いっぱい。:2000/12/11(月) 15:17
ま、カットの使い方がキメ手だな。
11名無しさんi486:2000/12/11(月) 17:10
12名無しさんi486:2000/12/11(月) 17:14
13名無しさん@お腹いっぱい。:2000/12/11(月) 17:31
どっか、プロログについて詳しくのってるところないかな。
歴史とか背景とか
14名無しさん@お腹いっぱい。:2000/12/11(月) 17:52
ここのなかはいろいろ書いてあるんだけど
http://www.ifcomputer.com/home_jp.html

とくにここなんかはどう?
http://www.ifcomputer.com/Products/IFProlog/Manuals/v4.1/user_guide/concept/home_en.html
158:2000/12/11(月) 18:37
16初心者ちゃん:2000/12/12(火) 11:00
プロログってシステム設計とかにしか使われないのでしょうか?
17Prolog:2000/12/13(水) 00:13
Prologはすごいと言われてるけど、C言語とかを覆すほどのすごさなのか?
18名無しさん@お腹いっぱい。:2000/12/13(水) 04:26
 少なくとも、>>15のHelloWorldじゃあ、効率悪くてCどころか
 JAVAの足元にも及ばない位、すごくないです。

19名無しさん@お腹いっぱい。:2000/12/13(水) 06:01
逆の演算(みたいなこと)もできる(場合がある)のが
Cよりもすごい
205:2000/12/13(水) 12:28
わーい さんくすー
さっそく gprolog インストール中です。
21名前ついてますか?:2000/12/13(水) 12:32
ぎゃはは、もっとも Prologらしくない >> hello.world

でも Prologって本当につかえるソース見たことないや。
パズル解くぐらいなら書いたけどねえ。
でも ICOTでは Prologマシン作ってたんだっけ?
22名無しさん@お腹いっぱい。:2000/12/13(水) 13:11
Prologでの正しい "Hell World"
と印字するプログラムを教えてください
235:2000/12/13(水) 17:03
最初のほうのサンプルは理解できるー

member(X, [X|_]).
member(X, [_|L]) :- member(X, L).

になると 理解できるけど、書けません(x_x)。
こんなの思いつきません(x_x)。

しかし.....楽しい^^)
24名無しさん@お腹いっぱい。:2000/12/13(水) 22:00
>>19
そうそう、ユニフィケーションと代入の大きな違いだね。

>>23
リストを先頭と2番目以降に分けて考えるやりかたは、
prolog出現前にlispでしゃぶりつくされた常套手段だから
当たり前のように使えるようになっておくといいよ。
25名無しさん@お腹いっぱい。:2000/12/13(水) 22:05
>>21
ICOTが作っていたのは非ノイマン型の「第五世代コンピュータ」。

色々な研究が為されて成果もあったけど、結局のところは、
「ノイマン型で高速化・高集積化する方が産業的に成功する」
という現実に叩き潰されたと思う。
26名無しさん@お腹いっぱい。 :2000/12/13(水) 22:12
ノイマンってそんなに凄いのか?
なんかで読んだけど計算機を作ったときに
「俺の次に計算の速い奴が確定した」
とか言ってた話を読んだことがあるけど
27名無しさん@お腹いっぱい。:2000/12/14(木) 01:14
今までずっとプロローグだと思ってました。
28名前ついてますか?:2000/12/14(木) 03:29
>>24 わしも Lisp(つーかLogo) やってから、member述語が理解できました。
で、調子に乗って quick sortを書くと
qsort([], []).
qsort([X|XS], YS) :-
partition(X, XS, XL, XR), qsort(XL, YL), qsort(XR, YR),
append(YL, [X|YR], XS).
partition と appendは作ってね。

でも appendなんかつくってエレガントじゃないなあ。
差分リストとか使えばかっこよくいくんでしょうか?


29名前ついてますか?:2000/12/14(木) 19:28
>>25 その非ノイマン型コンピュータのシステム記述言語が Prologじゃ?
ってもしかすると KL/1だったっけ。並列 Prologの一種の。

>>26 すごいっす。やつがいなかったら日本は被爆国になってません。
# いや、多分。
30名無しさん@お腹いっぱい。:2000/12/14(木) 21:16
>>26
ロスアラモスで、エッカート(だったかなぁ)が計算機を、
ファインマンが計算尺をそれぞれ忙しく操作している時、
傍らに座ったノイマンが暗算で最も速く答を出していた、
というようなエピソードが「御冗談でしょうファインマンさん」
に載ってる。
31名無しさん@お腹いっぱい。:2000/12/14(木) 21:27
>>29
ノイマンが爆縮レンズを考案しなかったら、
核爆弾の完成はかなり遅れただろうね。
32名無しさん@お腹いっぱい。:2000/12/14(木) 23:55
「爆縮レンズ」を Yahoo で検索して調べた。
CIAにマークされたかもしれんな。
ヤバイ情報を収集すると特殊機関にマークされるらしい。
これで俺も有名人!!
33名無しさん@お腹いっぱい。:2000/12/25(月) 23:59
C言語とPrologの違いがわかりやすい、プログラムの例があれば教えて下さい。
34名無しさん@お腹いっぱい。:2000/12/29(金) 22:30
age
35名無しさん@お腹いっぱい。:2000/12/31(日) 01:14
なんていうか、prologはCみたいに、趣味とかのプログラミングには使い
ずらいのかな
36デフォルトの名無しさん:2001/01/01(月) 00:44
>>33

member(_, []) :- false.
member(Ans, [Ans|Tail]).
member(Ans, [_|Tail]) :- member(Ans, Tail).


bool member(const vector<int>& vec, const int ans)
{
for (vector<int>::iterator it=vec.begin(); it!=vec.end(); it++) {
if (*it == ans)
return true;
}
return false;
}Prologならmember判定できるだけでなく

?- member(X, [1,2,3,4,5]).

のようにすると

X = 1;
X = 2;
X = 3;
X = 4;
X = 5;

のようにmemberを一つ一つ取り出す事ができる。
37デフォルトの名無しさん:2001/01/01(月) 01:25
>>36
それだけじゃ、で?って感じだけど...
もっとPrologならではっての無いの?
38デフォルトの名無しさん:2001/01/01(月) 01:31
爆縮ってなんですか?
Prologで解答をお願いします。
39デフォルトの名無しさん:2001/01/01(月) 01:34
PrologとCを比較するのはナンセンスだよ。
40デフォルトの名無しさん:2001/01/01(月) 01:38
理由を説明せよ>39
41デフォルトの名無しさん:2001/01/01(月) 03:47
>>37
Prologの特徴を十二分に表現してると思うけど。
42デフォルトの名無しさん:2001/01/01(月) 05:01
ふむふむ。なんか面白くなってきた。
ちなみに、36さんの奴をcにするとどうなるの?
43デフォルトの名無しさん:2001/01/01(月) 05:48
どれが特徴なんですか?>41
44デフォルトの名無しさん:2001/01/01(月) 08:13
Cなどの手続き型言語あるいは命令型と呼ばれる言語は命令を並べる事がプログラミング。
Prologでは関係の記述がプログラミング。

命令の記述とは(全てではないが)データの流れの制御。
Prologではデータの流れは結果として起こる事でありプログラムがデータの流れを記述しているわけではない。
そのためmemberのようにある変数が入力ともなり得るし出力ともなり得る。
45名無しさん@:2001/01/01(月) 20:04
Prolog++ってなんじゃ?
http://www.lpa.co.uk/ppp.htm
46名前ついてますか:2001/01/02(火) 23:09
Lispスレッドに触発されて書いた sortの定義。
algorithmを書かないようにしてみたけど、当然実用的ではない。(O(n!))

% sortの定義
% Xの bsortが Yであるとは、Yが Xの並び替えで、かつ Yが整列しているとき。
bsort(X, Y) :- permutation(X, Y), sorted(Y).

% permutation(並び替え)
% Yが Xの並び替えであるとは
permutation([], []).
permutation([X|Xs], Y) :- permutation(Xs, Ys), insert(X, Ys, Y).

insert(X, Ys, [X|Ys]).
insert(X, [Y|Ys], [Y|Yss]) :- insert(X, Ys, Yss).

% sorted(整列?)
% Yが整列しているとは、その先頭の 2つが順になっていて、
% かつ、先頭を除いた残りも整列になっているとき
sorted([]).
sorted([X]).
sorted([X0, X1|Xs]) :- X0 =< X1, sorted([X1|Xs]).
47デフォルトの名無しさん:2001/01/02(火) 23:53
>>46
う〜む。なにか、人間の言葉みたいだけど、
なぜだかかえってわかりにくいな・・・
48デフォルトの名無しさん:2001/01/04(木) 18:49
>>47
同意します。
頭がそっちに入ってる時には非常に分かりやすく感じるんだけど、突然見せられるとなかなか難解。
このあたりがPrologが普及しなかった(すでに過去形・・・)最大の理由だと思う。
結局人間にとっては手続き的思考の方が容易という事なのであろうか。
49デフォルトの名無しさん:2001/01/04(木) 18:59
慣れ、だ〜よ〜
50名前ついてますか?:2001/01/06(土) 03:40
多分、宣言的に書くほうが本当はわかりやすいんだけど、
でも実はそれじゃ使い物にならなくて (46の sortみたいな)
動作に依存した手続き的な書き方をしなきゃいけない場面も多くて。
そこらへんの切り替えが慣れないと大変なのかなあ。と思いました。
51Pure Cer:2001/01/06(土) 11:05
>>46
なななな、何をやってるのかさっぱりわからない。
52デフォルトの名無しさん:2001/01/08(月) 02:44
8パズル問題を解くPrologプログラムの例などがのってる
HPを知ってるかた居ませんでしょうか?
53デフォルトの名無しさん:2001/01/08(月) 10:06
8パズル問題って何?
54デフォルトの名無しさん:2001/01/08(月) 11:22
http://alpha.c.oka-pu.ac.jp/~yokota/ai/03.htm
こういう問題のことです、はい。
55デフォルトの名無しさん:2001/01/09(火) 23:10
もっとprologのことしたいばい。
HP教えてクレクレタコら
56デフォルトの名無しさん:2001/01/10(水) 06:54
Prologでぐったり
57タケ:2001/02/19(月) 00:10
・宣言的に記述できるのは、非常に有用。
ともかく「性質」をならべるだけでいいのだから。
・大量のデータをファクトで置いとくときの
探索は非常に強力
・手続き的な部分が必要な場合、例えば、
解を複数出したくないときは!をどうしても
使わないといけない。
・ある述語が必ず成功するのか、失敗することも
あるのかを考えないといけない。
・他の手続き的言語とうまく組み合わせることが大事
なんじゃないかなあ。

以上!!
58デフォルトの名無しさん:2001/02/24(土) 17:19
カットの存在で萎えました。
59デフォルトの名無しさん:2001/04/13(金) 04:13
あげ
60デフォルトの名無しさん:2001/04/13(金) 13:23
61デフォルトの名無しさん:2001/04/13(金) 18:13
むかーし処理系書いたけど、面白いよ。
つーかプログラムか?あれ?SQLの方が
近いのではないかしらん。
62>61:2001/04/13(金) 22:10
面白いのはいいから
使い道おしえてくれ
63デフォルトの名無しさん:2001/04/17(火) 17:32
データベースの操作とかも出来るらしいです。
第五世代コンピュータの開発に用いられたらしいですけど・・・
64デフォルトの名無しさん:2001/05/08(火) 20:18
同値関係(反射律、対称律、推移律)ってPrologでどう書くの?
65デフォルトの名無しさん:2001/05/08(火) 21:09
その質問の答えがここで返ってくると思うか?>64
66デフォルトの名無しさん:2001/05/08(火) 21:26
>64
言葉の意味をおせーてくれ!たのむ!!
67デフォルトの名無しさん:2001/05/08(火) 21:59
はんしゃ率 R(X,X).
タイショウ率 R(Y,X) :- R(X,Y).
水位率 R(X,Z) :- R(X,Y),R(Y,Z).
かな〜
68デフォルトの名無しさん:2001/05/09(水) 09:54
それだと止まらなくなるんじゃないか?
69デフォルトの名無しさん:2001/05/09(水) 14:59
人工知能やるにはやっぱりlispとprolog、両方極めるべきですか?
70デフォルトの名無しさん:2001/05/09(水) 16:14
>>67
そのまま書けばいいんでない?処理系によるけど。
71デフォルトの名無しさん:2001/05/09(水) 21:25
つーかlispでprolog実装しろ>69
72関数型牽制揚げ:2001/05/10(木) 23:38
そだね、やっぱunificationとresolutionでLisp入門だよね。
73デフォルトの名無しさん:2001/05/11(金) 00:13
74デフォルトの名無しさん:2001/06/10(日) 03:14
WIN版で日本語対応かつフリーなPrologってないでしょうか?
UNIX版では結構あるんですけど、、、
75デフォルトの名無しさん:2001/06/10(日) 03:27
>>74
windowsに移植するってのは?
(ひょっとするとcygwin環境でそのままコンパイルできるかもしれないし。)
あとは、日本語に対応したlispやschemeの上で使うとか。
scheme上で動くのはschelogってのがあった様な。
76デフォルトの名無しさん:2001/06/11(月) 02:19
>>75
レスありがとうございます。
基本的に初心者にも簡単に使用できるシステムを考えているもので、
cygwinでの動作はシステムの趣旨から反してしまうので、、、
せっかく教えていただいたのに、自分勝手ですみません。
schelogは知りませんでした。
調べてみようと思います。
77デフォルトの名無しさん:2001/07/18(水) 00:24
479まで下がってたage
78デフォルトの名無しさん:2001/08/02(木) 21:25
prologマンセー
79デフォルトの名無しさん:2001/08/02(木) 22:39
万世橋で会おう
80デフォルトの名無しさん:2001/08/02(木) 23:29
(message "Hello")
81デフォルトの名無しさん:2001/08/03(金) 05:36
駅スパートシステムってナニ?
82デフォルトの名無しさん:2001/08/10(金) 03:04
83 ◆TB25hej6 :01/09/02 22:22 ID:8hKu3S3E
prolog万歳さげ
84 :01/09/28 00:35
マンセ
85デフォルトの名無しさん:01/09/28 00:39
Prolog+オブジェクト指向
って可能?
86デフォルトの名無しさん:01/09/28 00:43
そういや、
Plorog
Soralis
て間違えそうだな。
きをつけないと!
87デフォルトの名無しさん:01/09/28 00:45
>>85
OOですか?
試してみれば?
8885:01/09/28 00:47
Object LISPができたように
Object Prolog もできないかな〜ってことです。
なにをするの?
90デフォルトの名無しさん:01/09/28 00:51
ESP ってなかったっけ。と名前だけ挙げてみる。
9185:01/09/28 00:52
OOであったらいいなあ〜と卒研のとき思ったので・・・
なんだ学生か…
93デフォルトの名無しさん:01/09/28 01:26
卒研でやったのにhttp://www.afm.sbu.ac.uk/logic-prog/を見てないのか
大丈夫だったか?その卒研。
94デフォルトの名無しさん:01/09/28 01:33
>Object Prolog

Objectごとに「それぞれ違う論理」を学習していき、
最終的にObject同士の対話が成り立たなくなる、
バベルの塔のようなシステムっすか?(藁
9585:01/09/28 01:36
>>93 ほんとだ沢山ありますね(--;)
おっしゃるとおり卒研ボロボロでした。
どうも失礼しました
>>94
それ素敵ですねw
97デフォルトの名無しさん:01/10/01 02:18
漏れ、大学院時代に修論で、Prologインタプリタとコンパイラの実装方法の
本読まされて、所属研究室で開発したソフトのマンマシン部分にPrologイン
タプリタをC言語で組み込むっていうのをやったんだけど、その時読んだ本
が思い出せない…
なんとかウォーレンとかいう人の書いた本(もちろん洋書)なんだけど…
原始的な処理系の実装から始めて、高速化、最適化、バイトコード化していく
という内容なんだけど。誰か、いま読んでる人いない!?
98デフォルトの名無しさん:01/10/01 22:20
ゆにふぃけーしょんage
99デフォルトの名無しさん:01/10/07 21:41
差分リストでつまずく!
100デフォルトの名無しさん:01/10/08 04:35
SQL勉強してるんだけど、Prologってデータベースと何か関係ある?
101デフォルトの名無しさん:01/10/08 04:56
prologで定義された事実=演繹データベース
SQLとは次元が異なる
SQLみたいなのは、帰納的って事だろうね
102デフォルトの名無しさん:01/10/08 05:05
演繹=えんえき
かな?難しい漢字
103デフォルトの名無しさん:01/10/08 05:22
>>97
Warren Abstract Machineか.懐かしいな.
あげちゃうぞ
105デフォルトの名無しさん:01/10/10 01:09
prolog 使えないけど一番好きな言語
なんだそりゃ。
107105:01/10/10 01:31
prolog 使える分野が実用的でない。(儲からない)
けれども個人的にはシックリくる言語
108106:01/10/10 01:38
ああ、そういう意味か。
あなたがプログラム組めないけど好き、という意味かと思った(w
109デフォルトの名無しさん:01/10/10 20:15
エキスパートシステムに使われてるんじゃないんですか?
110デフォルトの名無しさん:01/10/10 20:18
prologはチンポこするのに便利だよNE!
111デフォルトの名無しさん:01/10/10 20:23
>>110
チンポ自分でこすってるの?
おれは今こすられてるよ!ハァハァ
112デフォルトの名無しさん:01/10/10 20:24
嘘つけ!
11397:01/10/10 23:48
>>103
そう!それ!
今のProlog勉強する学生さんは読まないのかな?
>>110
なんでprologとチンポが結び付いたのかが気になる
115デフォルトの名無しさん:01/10/11 00:04
>>100
いまや(てか歴史上ずっと?)SQLしか存在しないに等しいけど、
Datalogってのがあったの。
関係論理に基づく問い合わせ言語なの。
Prologからカットをなくしたような言語だったらしいの。
動くのみたこ都内の。
116>>115:01/10/11 00:39
Warren Abstract Machine の本にたしかDatalogの話
出てたように思われ…
117デフォルトの名無しさん:01/10/11 14:06
>>100
> SQL勉強してるんだけど、Prologってデータベースと何か関係ある?

論理述語はrelationと関係が深いので大あり。

Datalogは、Prolog知る者にとっては、SQLよりずっとpretty。
"Reational" databaseという事の意味も分かりやすい。
>>100
乱暴に言えば、SQLのテーブル名がDatalogでは関係を示す
述語名になると思われ
119デフォルトの名無しさん:01/10/12 22:26
思われヤメロ
>>119
確かこんな感じと重割れ

:- 戸籍(Person, '東京'), 年齢(Person, Age), Age <= 14, アダ名(Person, 'モナー').
{ { Person = '思えモナー' }, { Person = '白松がモナー' } }

David Warrenさんの近況:
http://www.cs.sunysb.edu/~warren/
ftp://ftp.cs.sunysb.edu/pub/XSB/doc/XSB/wfswam.ps.gz
ftp://ftp.cs.sunysb.edu/pub/XSB/doc/XSB/lrdwam.ps.gz
「ワムワムだよ、人生は。」Warren
「Prologで はまったり」かとオモタヨ
123デフォルトの名無しさん:01/10/15 07:01
シンプルにて最強の人工知能言語age
124デフォルトの名無しさん:01/10/18 10:20
高階っぽいことしようとしてよくcopy_term/2つかうんだけど、
これって効率悪いのかな。
125デフォルトの名無しさん:01/10/19 01:01
『Prologの技芸』って本のカバーが渋い。
理工書か?
126デフォルトの名無しさん:01/10/20 01:53
大学の授業でやりましたよ。しかも必修。
2回も落として4回生まで残ったときは
マジで焦って勉強しました。

ハノイを解くプログラムを書け、って問題があって
筆記でガリガリ書きましたよ。
なつかしい・・・。

ちなみに、Masterでもその先生の授業を取って
詰め将棋をひたすら検索して解くプログラムとか
作りました。
127デフォルトの名無しさん:01/10/27 11:23
布教age
α-β刈り下げ
こんなのどうだろう?
http://www.cs.mu.oz.au/research/mercury/index.html

只今.NET関連言語調査中につきダウソ中。
130デフォルトの名無しさん:01/11/12 09:40
みんな、ごめん・・・
Haskellに乗り換えちゃった・・・
131デフォルトの名無しさん:01/11/12 09:50
>>129
新しいの出てるね。
これが一応.NETのProlog処理系標準となるのかな?
132デフォルトの名無しさん:01/11/12 19:24
MINERVAってどうですか?
133デフォルトの名無しさん:01/11/16 22:24
prolog処理系を作るかもしれないのですが、どんな勉強をすればいいんでしょ?
推論?
134デフォルトの名無しさん:01/11/19 12:20
>>133
言語仕様。
135デフォルトの名無しさん:01/11/19 12:48
学校に新しい人工知能 発展編 オーム社
があったので買いました。

推論の入門によさげです。
本に参考文献ってあるけど半分以上入手できない予感・・・。
136デフォルトの名無しさん:01/11/19 20:13
MercuryとかProlog++とかも調べてみるといいかもよ。
伝統的なPrologのメリデメが分るから。
137デフォルトの名無しさん:01/11/20 01:11
なぜ述語に変数が使えない。
138デフォルトの名無しさん:01/12/21 04:08
保守age
139デフォルトの名無しさん:01/12/23 17:30
age
140デフォルトの名無しさん:01/12/23 20:10
>>136
メリデメってなに
141デフォルトの名無しさん:01/12/24 00:39
メリット・デメリット?
142functor:02/01/02 12:30
老後のボケ予防に Prolog の勉強をマターリと始めようとしている者です。
おまえら、普通 cut ! の作用を「副作用」と呼ぶものでしょうか?

厨房(老後目前だけど)の漏れは,、副作用というと、解の soundness(つまり、得られた解が論理的に正しいかどうか)に影響するものを連想します。
例えば破壊的代入や、Prolog でいえば assert のようなものです。
cut をどのように使っても、得られた解は sound であることが保証されています。(もちろん得られるはずだった解が得られなくなることが起きる)

そのような、穏やかな副作用(一般用語)でも、「副作用」(コンピュータ科学用語)っていうのでしょうかゴルァ
私の感覚ではprologにおいて述語が真理値を
持つ以上の動作をすると副作用である。殆どの組み込み述語が
該当するほか、!も真であると同時に再充足を妨害するので
これを副作用と呼んでいる。
あくまで私がそう呼んでいるだけだが
144デフォルトの名無しさん:02/01/04 15:21
Prologの冒険をもう一度読みたいんだけど、どっかに売ってないかなぁ
FDのデータは家のマシンのどっかに眠ってるはずだけど....
145デフォルトの名無しさん:02/01/08 23:04
好き(俺,柳たん).

って日本語でprologってみたいんだけど。
あるの?
>>145
K-prologかSWI-prologはできてた気がします。
147デフォルトの名無しさん:02/01/16 00:43
誰か覆面算の解くプログラム作ってください

learn+linear+logic=prolog
148デフォルトの名無しさん:02/02/03 00:40
誰かPrologのスパーセト言語を総括してくれ。
イパーイありすぎて何がなんだかサパーリ分からん。
149デフォルトの名無しさん:02/02/04 21:49
他の言語に組み込むPrologのライブラリや、
Prologを組み込んだ言語などはありますか?

Prologだけで何かを書くことはむずかしいので、他の言語に組み込む形で
つかうのが現実的であると思いますがいかがでしょうか。

たとえば、MLに論理型をくっつけたらしいMercuryとか
HaskellにあるらしいPrologのライブラリですとか。
#MLもHaskellも使えないから私にはどうかわからん


JavaとかC++に組み込んで使えるものがあったらうれしいのですが。l
151デフォルトの名無しさん:02/02/07 18:58
prolog…今日試験だったよ。
問題勘違いして間違えまくった…鬱
152デフォルトの名無しさん:02/02/07 19:17
Prologだと圧倒的で、他の言語だとショボ〜ンなこととは
どんなことでしょうか?
いまいち用途が見つからずに悩んでるですが・
>152
本気で言ってる?
154デフォルトの名無しさん:02/02/07 20:55
>>152
英語の構文解析のプログラムとかはprologでやると簡単かも……。
確かに、MP3のエンコードとかそういうのには、
あまり役に立たないかも知れませんね(笑)。
> MLに論理型をくっつけたらしいMercury
「関数型言語に」であって別に「MLに」ってわけじゃないと思うよ。
つか、「論理型に関数型を」な気がしないでもない。
156ざっしょくもの:02/02/12 00:24
>>144さん
あ、Prologの冒険なつかしいすねー!持ってます!
高校時代、好奇心でPrologやってみたくて買ったです。
ただ、5インチFDを読める環境が無く、
実際にプログラム組みたくても組めなくてもんもんとした覚えです。
157デフォルトの名無しさん:02/02/12 00:36
>>154
構文解析って、他の言語でやってもそれほど骨ではないです。
他の言語では地獄を見るようなものってあるかな?
>>146

Java上のPrologならいろいろある。

アプリに組み込み可能なPrologエンジンとしては、ilogが有名。
http://www.ilog.com/
用途は、経路探索とか縦型検索問題、その他。
159デフォルトの名無しさん:02/02/12 14:02
まったりできるような言語じゃありません
160デフォルトの名無しさん:02/02/12 14:25
PrologはLogoのプロ仕様言語ですか?
EPILOG も勉強しる!
162デフォルトの名無しさん:02/02/23 00:32
SWI-Prologまんせー
まとめ=Prologは探索を記述する言語。
宿題助けて下さいな。

Artificial Intelligence
Assignment I

Question 1
Given the following medical expert system devise queries for the
following:
1. A query which will list all the diseases in the medical
database without their symptoms.
2. A query which will pick out all the symptoms of flu.
3. A query which will pick out the diseases with a symptom headache.

/ * Medical Expert System */
symptom(cold,sneezing).
symptom(cold,headache).
symptom(cold,runny_nose).
symptom(flu,headache).
symptom(flu,shivery).
symptom(flu,temperature).
symptom(brain_tumour,headache).
/* END */
宿題助けて下さいな。

Artificial Intelligence
Assignment I

Question 2
Read the following passage, and express the information it contains
in a semantic net. Convert the net to a prolog database and use it
to test
(a) whether herbivores ever hunt and
(b) whether all herbivores are hunted.

In the animal world, carnivores such as lions and leopards hunt
and eat herbivores such as zebras and wildebeest.
Thus some animals are hunters and some are hunted, and generally
speaking, carnivores hunt herbivores. However, there are many
exceptions to this rule. Elephants, which are herbivores, are rarely
hunted because of their size. Nor are bears, which are not normally
meat eaters and therefore basically herbivores. Bears will
catch and eat other animals when the opportunity arises.

宿題助けて下さいな。

Artificial Intelligence
Assignment I

Question 3
Study the attached Prolog Murder Mystery and explain how the prolog
program works, paying particular attention to the rules.
Also briefly outline the importance of backtracking to this
particular problem.

/* Victim is Celia */
body_discovered_at(60,mansion).

/* Death caused by blugeoning */
cause_of_death(blugeoning).

/* Body temperature at 10:10 was 96.4F */
body_temp_at(70,96.4).

/* Specify suspects */
suspect(maid).
suspect(colonel).
suspect(vicar).
suspect(nigel).
suspect(cynthia).


/* Everybody's physical strength rating
1 = bed ridden, 10 = strong as an ox */

physical_strength(vicar,7).
physical_strength(colonel,4).
physical_strength(maid,2).
physical_strength(nigel,8).
physical_strength(cynthia,5).

/* Where everybody lives */
lives_at(celia, vicarage).
lives_at(ronald, vicarage).
lives_at(maid, mansion).
lives_at(colonel, mansion).
lives_at(nigel, cottage).
lives_at(cynthia, cottage).
/* Fastest possbile travel times between key locations */
time_between(mansion,vicarage,12).
time_between(vicarage, mansion,12).
time_between(cottage,vicarage,18).
time_between(vicarage,cottage,18).
time_between(cottage,mansion, 24).
time_between(mansion, cottage, 24).
time_between(Anywhere, Anywhere, 0).

/* Everybody's whereabouts */
saw(vicar, celia, vicarage,0,20).
saw(vicar, nigel, vicarage, 52,52).
saw(nigel, cynthia, cottage,0,30).
saw(nigel,cynthia,cottage,90,99).
saw(colonel,vicar,vicarage,50,99).
saw(cynthia,nigel,cottage,90,99).
saw(vicar,colonel,vicarage,50,99).
saw(maid,colonel,mansion,0,35).
saw(nigel,vicar,vicarage,52,52).
saw(colonel,maid,mansion,0,35).
saw(celia,nigel,cottage,0,30).

/* Specify who's fingerprints where found */
finger_prints_found(celia).
finger_prints_found(colonel).
finger_prints_found(nigel).
finger_prints_found(cynthia).


/* This is the reasoning part, the 'inference engine' */
whodunnit(Person):-suspect(Person),
unexplained_fingerprints(Person),
not(has_alibi(Person)).

whodunnit(Person):-suspect(Person),
strong_enough(Person),not(has_alibi(Person)).


unexplained_fingerprints(Person):-
finger_prints_found(Person),
body_discovered_at(_,Scene_of_crime),
not(lives_at(Person,Scene_of_crime)).
has_alibi(Person):-
body_discovered_at(Latest,Scene_of_crime),
earliest_time_of_death(Earliest),
saw(_,Person,Somewhere,Early_time,Late_time),
time_between(Scene_of_crime, Somewhere, Travel_time),
Latest < Late_time + Travel_time,
Earliest > Early_time - Travel_time.

earliest_time_of_death(Time):-
body_temp_at(Time_temp_taken, Temp),
Time is Time_temp_taken - (98.4-Temp)*10.


strong_enough(Person):-cause_of_death(blugeoning),
physical_strength(Person,Rating),Rating >=4.
strong_enough(Person):-cause_of_death(shooting),
physical_strength(Person,Rating),Rating >=1.
strong_enough(Person):-cause_of_death(poisoning).
宿題助けて下さいな。

Artificial Intelligence
Assignment I

Question 4
Reasoning with uncertainty is an important issue with regard to
using symbolic systems to achieve AI. One such approach is to use
default logic. However another approach is to use Fuzzy logic.
Using the Internet, Books, Magazines, Journals explain in 2-3 typed
pages how fuzzy logic can be used in situations where there is
uncertainty. Give a brief explanation of the logic itself, how it
can be applied, one such area where it has been used, and any
possible future developments with the theory. Reference your work !!!!!!!!!!
お願いします。
172デフォルトの名無しさん:02/03/15 22:19
思考中。
#なんか、プログラム技術板っぽく、
#ソースコード乗せまくりで、いい感じ!
174デフォルトの名無しさん:02/03/16 00:35
どこからどこまでがコードなの?
Prolog って不思議な言語だねぇ。

ところで、Prolog って「ぷろろぐ」? それとも「ぷろろーぐ」?
>>173
え?荒らしじゃないの?
>>164
Question 1
1. ?- symptom(Disease,_).

てことか?もしこんなウォーミングアップ程度からわかんないなら、
キミ相当ヤバイ。正直、出直した方がいいだろ。

>>174
日本じゃプロログが主流と思われ。国際的にはたぶんプロローグ。
177宿題助けて下さいな:02/03/16 02:00
>>176
'?-' とかははじめからある前提でお願いします。
こっちではプロローグです。
178デフォルトの名無しさん:02/03/16 03:32
Prologのデータ構造とRDBは似ていますか?
>177
真性?
180しっぽり:02/03/16 22:30
>>164
花粉症を診断できるように改造しる!
181親切な人:02/03/16 22:34

ヤフーオークションで、凄い人気商品、発見!!!

「高性能ビデオスタビライザー」↓
http://user.auctions.yahoo.co.jp/jp/user/NEO_UURONNTYA

ヤフーオークション内では、現在、このオークション
の話題で、持ちきりです。
182デフォルトの名無しさん:02/03/17 02:18
>>157
文法をほとんどそのままDCGで書くとそれが
動いてくれるってのはイイ!くない?
183[ ◆rJF0ZGiM :02/03/19 22:03
Q1-1。
?-assert(ako(cold,diseasesaa)).
?-assert(ako(flu,diseasesaa)).
?-assert(ako(brain_tumour,diseasesaa)).
この3行を下の問題文にたして--

?-assert(symptom(cold,sneezing)).
?-assert(symptom(cold,headache)).
?-assert(symptom(cold,runny_nose)).
?-assert(symptom(flu,headache)).
?-assert(symptom(flu,shivery)).
?-assert(symptom(flu,temperature)).
?-assert(symptom(brain_tumour,headache)).

これでリストするっていうのはどうかな?
?-ako(X,diseases).

もっと簡単に出来るのある?
184挑戦 ◆rJF0ZGiM :02/03/19 22:04
Q1-2にも挑戦中...
185挑戦 ◆rJF0ZGiM :02/03/19 22:09
Q1-2.
これはこれで簡単。
?-symptom(flu,X).
Q1-3.
これもこの1行でいいんじゃないかな?
?-symptom(X,headache).
186挑戦 ◆rJF0ZGiM :02/03/19 22:11
でもQ1-1自信ない。ラインたさなくても病名だけリスト出来る方法ありそう。
187デフォルトの名無しさん:02/03/24 15:37
まじでPrologをCから呼び出せるライブラリがほしいなぁ。
Guile みたいかんじで。

Scheme で Prolog みたいな動作をさせるためには、
どんな勉強すればいいかな?
とりあえず、バックトラッキングだけでもいいんだけど。

っていうか、SchemeもPrologもまだほとんど覚えてないんだけど。
188デフォルトの名無しさん:02/03/25 00:04
Prologのいい参考書教えてください。
「Prologの技芸」に目をつけていたんですが、品切れ中の模様です。
189デフォルトの名無しさん:02/03/25 01:08
>とりあえず、バックトラッキングだけでもいいんだけど。
再帰。
深さ優先探索とか、幅優先探索とか調べて見なされ。
190デフォルトの名無しさん:02/03/25 01:31
しかしこのスレよく伸びるな。(w
>>188 昔よく売れてて、学生も買ってたみたいだから、古本屋を探したら...
192デフォルトの名無しさん:02/03/25 18:00
いい参考書かどうかは分からないけど、
『機能論理プログラミング』という
Prologを使った機械学習とかそいういうのについて書いた本を
少し前に買ってちょっとだけ読んでみた。
難しくてまだ半分も理解してない。。。
>>192
ごめん。
×『機能論理プログラミング』→○『帰納論理プログラミング』
でした。
194デフォルトの名無しさん:02/03/25 18:23
オレはカットでめげた。

制約論理プログラミングとかもあるらしいね。
方程式とか解けるのか?
195デフォルトの名無しさん:02/03/25 21:21
>>194
探索木の枝を切るって事が分かれば難しくないよ。
簡単なメタインタープリタを書いてみると良く分かると思うよ。
196デフォルトの名無しさん:02/04/09 01:36
『Prologプログラミング入門』アベ著 共立出版
を買ったけどよくわかりません。
とくにバックトラックを図で説明しているのですが、ああいうのはどうなんでしょうか。
カットにいたってはさっぱりわかりません。
198デフォルトの名無しさん:02/04/11 16:38
box modelって何?
Prologのペトリネットはみたことあるけど。
199デフォルトの名無しさん:02/04/11 16:53
最近の日経コンピュータに、どっかがPrologで人事システムを構築という
短信があったと思うがどんなんだろう。
人工知能で給料カットするんだよ、きっと
201デフォルトの名無しさん:02/04/12 01:41
すんません,prologってどこかの企業で使われてるんですか?
つまり儲かるような仕事(研究)に使える言語なんでしょうか?
202デフォルトの名無しさん:02/04/12 09:10
プロローグって3段論法を背理法で解くものだろ。
で、論理式はホーン形式に限られている。
もっと、一般の論理式の真偽を求めれるプログラムないのか。
量化子なんかもOkのやつがいいね。
タブロー法あたりをプログラム化したものないかな。
203デフォルトの名無しさん:02/04/18 02:52
書籍に良いのは無いのでしょうか?
絶版だったりどうでもいい本だったりして困ってます。

定番な良書や、この本で開眼した、というような推薦書はありませんか?
204デフォルトの名無しさん:02/04/27 04:07
Interlogってどうよ。
http://homepage2.nifty.com/logic/

http://homepage2.nifty.com/logic/ai6.htm にあるように
イベントが発生するとき、ゴールが設定されるというのは面白い。
でも、文章からはイタサが漂う。
205名無しさん@お腹いっぱい。:02/04/27 09:33
>>202
ワラタ
>>205
タワラ
207デフォルトの名無しさん:02/04/28 02:50
>>201
Windowsの一部はPrologで書かれてるとかこないだ聞いた。
具体的にどこにどう使われてるかとかは知らんけど。聞いただけの話だから。
詳しい人いたら補足レスきぼんぬ。
208デフォルトの名無しさん:02/04/28 04:19
>>207

 まさか、Windows の一部は、Prolog と Epilog で
書かれているというオチではなかろうね。
209デフォルトの名無しさん:02/04/28 04:30
 この Prolog、Epilog というのは、プログラム
言語のことじゃなくて、識別子のことね(Epilog
という一種の Prolog 言語があるから)。

210デフォルトの名無しさん:02/04/28 11:19
>>196
「論理の木構造の深さ優先探索」て理解でいいんじゃなーい?

木の根の所にカニがいて、枝の先端にある柿をたびたいと思ってる。

カニは進行方向を見て歩けないし、カニにとって木は巨大な構造体だから、事前に最短経路を考えて辿ることはできない。
しょうがないから蟹知恵で、枝の分岐点の組み合わせをシラミ潰しに探索する(深さ優先探索)。
枝先端へ行って柿がなければ、一つ前の分岐に戻って(バックトラック)別の枝を試す。

カニは柿を食ったら別の作業をしたいが、その作業が失敗したからといって柿採りに戻りたくないからカット!
211デフォルトの名無しさん:02/05/03 23:32
age
212デフォルトの名無しさん:02/05/04 00:19
Prologの実習が始まりました。
誰かユニフィケーションとバックトラックについて詳しく説明してください。
このままじゃレポートかけない・・・・・。
こちらへどうぞ。
http://www.google.com/
214厨房ですよ@Prolog:02/05/04 23:48
ユニフィケーション=単一化≒項同士が等値かどうか調べること。
調べる=項の評価し、その結果を見ること。
バックトラック=ゴールが見つかったのに、別のゴールが無いか調べること
>>210
わー、わかりやすいー。
柿を食った後の作業で失敗しても、
柿を食う前には戻らないちゅうことですね。
Prolog.NET なんて出ないだろうなぁ
217age:02/06/01 10:35
保全しときます。
218デフォルトの名無しさん :02/06/03 19:06
ぜんほあげ
219デフォルトの名無しさん:02/06/03 22:23
k-prolog ってbignumが使えるんだね。
Lisp、Schemeの専売特許じゃなかったんだ。
知らんかった〜。
220デフォルトの名無しさん:02/06/03 23:40
こんな板があるとは・・・。
学生時代にやってもう忘れたけど、マジカルバナナをするプログラムとか言うのを演習で提出した覚えがある。懐かしい・・・。
221デフォルトの名無しさん:02/06/04 20:40
中島秀之さんのProlog/KRってどうなったか知ってる人いる?
WindowsのLispで動くかな?

Prolog/KRて、和田研近辺で作られたUTILISP上で動いてて、
その後名前が裏茄子に変わったと、本に書いてあったよね。

UTILISPはかなり前にインターネット上で公開されてたと記憶。

中島秀之せんせーって、今も産総研で活躍されてるよね。
メールで聞いてみたら?
223デフォルトの名無しさん:02/06/04 22:50
>222
Common Lisp 用に書き直されてないかいな。
マジに聞いてみようか。(なんと恐れ多い)
入門書の付録のPrologはCommon Lispに書き直されたもの
が存在するんだよね。
多重世界機構かぁ。
224デフォルトの名無しさん:02/06/04 23:23
いいねぇ
225名無しさん@お腹いっぱい。:02/06/05 00:37
226デフォルトの名無しさん:02/06/14 13:33
Windowsで使える最強のプロログ処理系教えてください。
227デフォルトの名無しさん:02/06/18 00:19
228デフォルトの名無しさん:02/06/28 16:28
ナローイングってなに?
229デフォルトの名無しさん:02/06/28 17:01
すみません教えてください
PCH creation point
ってなんですか?
よろしくお願いします
宿題は、宿題スレでやれ。
231デフォルトの名無しさん:02/06/28 23:36
KLCはどうですか。
五世代プロジェクトの
>>231
> KLCはどうですか。
> 五世代プロジェクトの

KL1 ね。で、UNIXen で動くその言語処理系が KLIC。

Prolog とはかなり趣を異にするけど、これはこれで結構面白い言語だ
わな。副作用なしで入出力が扱えたりするところとかね。
233貼っとく:02/07/09 10:07
234デフォルトの名無しさん:02/07/11 17:02
なローイングってあに?
235デフォルトの名無しさん:02/07/31 14:24
あいーん
236デフォルトの名無しさん:02/08/02 21:59
Prologのコンパイラでは
実行ファイル(.EXE)は作成されないの??
>>236
Turbo Prolog では作れたよ。
238デフォルトの名無しさん:02/08/03 22:18
試してみます。
ども。
239デフォルトの名無しさん:02/08/22 08:59
本家スレage
240okd:02/09/11 10:48
SWI-PrologをWin98SEでダウンロードして使おうとしたのですが、日本語を節名や変数名に使えないのですが、何かよい方法はないでしょうか?
普通は、シングルクオート '' で囲う。そんで日本語フォントで表示させる。

しかし、シフトJISコードの2バイト目に \ とかがあると
モロ化けるので、フォントを設定するくらいではどうしようもないね。
242デフォルトの名無しさん:02/09/17 01:23
みつけた!
ここみんな必見だよ
プロログの動作原理
http://web.sfc.keio.ac.jp/~tozaki/LP/01/handout/prolog-dousa/
Prologを使いこなすとハッカーだって言うけど本当ですか?
さあ
245242:02/09/17 01:28
と思ったけど結構浅いや(汗)
スタックな図とか初めめちゃくちゃ分かりやすいと思ったんだけどね。

>>243
>>209
Prologを使いこなすとお金持ちになれるって本当ですか?
Prologを使いこなすと彼女ができるって本当ですか?
Prologを使いこなすと大学卒業できるって本当ですか?
249デフォルトの名無しさん:02/09/17 01:34
聞いてみろ。

?- available(girl,X).
no.
>>246
>>247 微妙
>>248 本当
251デフォルトの名無しさん:02/09/17 01:38
>>246-250
深夜に自作自演ですか?
閉世界仮説
>>250 嘘つき。
?- liar(>>250).
Yes.
今日からProlog始めますた
なかなか意味不明ですた
256デフォルトの名無しさん:02/10/05 12:31
お勧めの処理系は?
257デフォルトの名無しさん:02/10/05 23:21
258デフォルトの名無しさん:02/10/11 03:57
>>255
俺も始めたさー。
なかなか意味不明だよねん。
でも意味わからないままさくさく書けるようになってしまう自分も
意味不明なんよね。
まぁゆっくりいきましょか。

ちなみにうちはK-prologとProlog Cafeっす。
259 :02/10/12 02:21
SWI-PrologとEmacsプラグイン、ダウンロードしてみた。
>>259
同じく。只今いろいろといじり中
261デフォルトの名無しさん:02/10/13 02:23
SWI-Prolog で

Clauses of hoge/4 are not together in the source-file

というワーニングに苦しめられてます
hoge/4 はいっぱい書いてあんのになぁ

一応、ちゃんと動いてくれてんだけど
262デフォルトの名無しさん:02/10/13 02:28
Prologみたいな言語ってどう作ればいいんですか?
頑張って作ればよろしい。
>>261
メッセージの通り、同じ述語を定義するファクトやルールを、
同じ所に並べて書いてないんだと思われ。
hoge(1). hoge(2). hage(hage). hoge(3).
ちなみに、ワーニングと言うくらいならワーミングと言って欲しい
>>264
おお、スタイルに対して文句をいわれていたのかアレは・・・
ありがとう、おかげで綺麗に動くようにナタヨ・・・
267デフォルトの名無しさん:02/10/16 03:25
パズルの本に下のようなのがあったんだけど、Prologで表現するとどうなります?

 ・Aさん、Bさん、Cさんの3人がいる。
 ・黒髪と茶髪と金髪が1人ずつ。
 ・Cさんは黒髪じゃない。
 ・金髪はCさんじゃない。
 ・黒髪はAさんじゃない。
 Q:Aさん、Bさん、Cさんの髪はそれぞれ何色?

こんな感じでいいの?

color(c, black) :- !, fail.
color(c, blond) :- !, fail.
color(a, black) :- !, fail.
color(_, _).

ans(A, B, C) :-
 select(A, [black, brown, blond], R),
 select(B, R, [C|[]]),
 color(a, A), color(b, B), color(c, C).
否定は \+ とか \== とかを使ったほうがいいと思うけど。

?- select(A,[black,brown,blond],_BC),select(B,_BC,[C]),A \== black, C \== black, C \== blond.

A = blond
B = black
C = brown

Yes
269デフォルトの名無しさん:02/10/16 21:47
差分リストを使わないとできない事って何?
つーか、差分リストってなんか役に立つの?
270267:02/10/16 23:12
おお、1行で書けちゃうんですか。どもです。>>268

>>267で書いたやつを、ちょっと直してみました。
リストも使わないようにしてみました。
前のやつと同じようにFactの部分を外に出してはあるんですが。
(改行略)
person(a). person(b). person(c).
col(black). col(brown). col(blond).

mismatch(c, black).mismatch(c, blond).mismatch(a, black).
match(Person, Color) :- person(Person), col(Color),
  \+ mismatch(Person, Color).

ans(A, B, C) :-
  match(a, A), match(b, B), match(c, C),
  A \+ B, B \+ C, C \+ A.

こういうのが大規模になったとき、例えば色が10万色くらいに
なったときってどう管理するんですかね?
Prologソースのままがいいのか、RDBがいいのか…
271デフォルトの名無しさん:02/10/17 01:11
こんなのどうです?またパズルの本からですけど。
Prologやってる人ってこんなのも簡単に書けちゃうのかな。
始めたばっかなんで漏れには激しく難しかったんですけど。

 ・a、b、c、dの4人でレースをした。
 ・赤、緑、青、黒の服のうち、それぞれ違うのを着ている。
 ・w、x、y、zの形のブローチのうち、それぞれ違うのを着けている。
 ・赤服に続いてaがゴール。aに続いてyブローチがゴール。
 ・zブローチの次にb。bに続いて青服。
 ・wブローチの次に黒服のc。

 Q:1位、2位、3位、4位はだれで何色の服でなんのブローチか?
こういうgenerate-and-testの場合、
ふつうはまず、「順列を(全とおり)作る述語」を作ると思う。

permute(L,[Car|Cdr]) :- select(L,Car,Rest), permute(Rest,Cdr).
permute([],[]).

?- permute(['赤','緑','青','黒'],色マップ),
permute([w,x,y,z],形マップ),
permute([1,2,3,4],順位マップ).
で、a,b,c,dが1,2,3,4(リストの要素の位置)に対応してる事にする。

例:条件「赤服に続いて a がゴール」
nth1(赤服,色マップ,'赤'), % 「赤服は誰か?
nth1(赤服,順位マップ,赤服の順位), % その順位は?
赤服の次の順位 is 赤服の順位 + 1, % その次の順位は?」まで調べて、
nth1(1,順位マップ,赤服の次の順位), % 「赤服の次はa(=1)である」
もちろん、ちゃんと述語で抽象化したほうがいい
SWI-Prologのcopy_term/2はループした節に使えないんだな。
?- S = s(S), copy_term(S,T).
ひょっとして使える方が変なのか
275271:02/10/18 02:44
>>272
最初に条件同士が成り立つ組み合わせを求めて、あとで並べ替えを
当てはめてみる感じでやってみました。(test-and-generate?)

condition/1を通った時点で[X1,X2,X3,X4]が
[[○,○,z],[b,red,○],[a,blue,w],[c,black,y]]
の一通りだけに定まって、あとは単に空白を埋めるだけになると。

ちなみにもっと複雑な問題でも試してみたんですが、
最初に並べ替えを作ってから条件を通すより、かなり早いです。

?- ans([X1, X2, X3, X4]).
X1 = [d, green, z]
X2 = [b, red, x]
X3 = [a, blue, w]
X4 = [c, black, y]

次レスにソース。
276271:02/10/18 02:45
ans([X1, X2, X3, X4]) :-
condition([X1, X2, X3, X4]),
result([X1, X2, X3, X4]).

condition([X1, X2, X3, X4]) :-
subseq([[_, red, _], [a, _, _], [_, _, y]], [X1, X2, X3, X4]),
subseq([[_, _, z], [b, _, _], [_, blue, _]], [X1, X2, X3, X4]),
subseq([[_, _, w], [c, black, _]], [X1, X2, X3, X4]).

result([[P1, D1, B1], [P2, D2, B2], [P3, D3, B3], [P4, D4, B4]]) :-
perm(person, [P1, P2, P3, P4]),
perm(dress, [D1, D2, D3, D4]),
perm(brooch, [B1, B2, B3, B4]).

subseq(X, Y):- append(X, _, Y).
subseq(A, [_|B]) :- subseq(A, B).

perm(_X, []).
perm(X, [H|T]) :- perm(X, T), call(X, H), \+member(H, T).

person(a).(略) dress(red).(略) brooch(w).
>>269 計算量O(1)でappendとかできるじゃん
278デフォルトの名無しさん:02/10/18 21:12
例えばlotate([1,2,3], X)に対して、
X=[1,2,3];
X=[2,3,1];
X=[3,1,2];
X=[1,2,3];
と答えるような述語が、
lotate(A, X) :- append(M, N, A),append(N, M, X).
って書かれてるとして、
こういうのも差分リストで効率化できる?
279278:02/10/18 21:56
スマソ
rotateの間違い。
280デフォルトの名無しさん:02/10/19 12:07
面白そうだが、理解できない
281デフォルトの名無しさん:02/10/19 17:05
リストから要素の重複をなくしたリスト(集合)を得る述語が書けません…
getSet(LIST,SET).=LISTの要素の集合はSETである
addSet(OLD,X,NEW) =集合OLDの要素にXを追加したものが集合NEWである

getSet([],_).
getSet([X|XL],OLD):- addSet(OLD,X,NEW), getSet(NEW,XL).
/*OLDにXを追加して、残りの分を処理*/

これでgetset([a,b,c,b,a],X).すると
X=[a,b,c|_210],
みたいにうしろにごみが。どうすればいいのでしょう。
addSet/3の動作に不備はないのですが。
setof/3のない処理系なんで困ってます。

>>278
ううん、それで十分効率的だと思うのですが。
282281:02/10/19 19:41
ああっと。自己解決しました。
getSet(SET,[],SET).
getSet(OLD,[X|XL],NEW2):- addSet(OLD,X,NEW), getSet(NEW,XL,NEW2).

答えはgetSetにもOLD,NEWふたつつけることでした
>>278 分割と結合を分けたらできた。しかしややこしい。。
--------------------------------------
split_d(A-AX,L-L,R-R) :- A == AX, !.
split_d(A-AX,L-L,A-AX).
split_d([AH|AT]-AX,[AH|LT]-LX,R-RX) :- split_d(AT-AX,LT-LX,R-RX).
append_d(L-R,R-RX,L-RX).
rotate_d(A-AX,B-BX) :- split_d(A-AX,L-LX,R-RX), append_d(R-RX,L-LX,B-BX).
rotate(A,B) :- append(L,R,A), append(R,L,B).
sample_dlist(0,LX-LX) :- !.
sample_dlist(N,[N|LT]-LX) :- succ(NT,N), sample_dlist(NT,LT-LX).
test_rotate(N,R) :-
sample_dlist(N,L-[]), sample_dlist(N,DL-DLX),
( time(( between(1,R,_K), rotate(L,_B),
fail, writeln(_B), fail )) ; true ),
( time(( between(1,R,_K), rotate_d(DL-DLX,_DB-[]),
fail, writeln(_DB), fail )) ; true ),
true.
--------------------------------------
?- test_rotate(100,1000).
% 5,253,001 inferences in 8.51 seconds (617274 Lips)
% 404,001 inferences in 0.99 seconds (408082 Lips)
--------------------------------------
284283:02/10/20 01:23
簡略化してみた
split_lld([],[],R-R).
split_lld([H|T],[],[H|RT]-RX) :- split_lld(T,[],RT-RX).
split_lld([H|T],[H|LT],R-RX) :- split_lld(T,LT,R-RX).
rotate_using_dl(A,B) :- split_lld(A,L,B-L).
285283:02/10/20 01:25
う。。284じゃ意味ないじゃん。。なかったことに
286283:02/10/20 01:51
append_d(L-R,R-RX,L-RX).
つーかこんなの↑使わないか。
rotate_d(A-AX,B-BX) :- split_d(A-AX,L-BX,B-L).
さらにややこしく
287デフォルトの名無しさん:02/10/20 03:42
prologの日本語の優しい解説サイトありませんか?
http://bach.scitec.kobe-u.ac.jp/prolog/
ここはやさしくないのかな
289278:02/10/20 08:15
>>283
お疲れ様でした。

rotate_dに与えるAが[回転させたいリスト|Ax]になってて、
rotateの仕事量の一部を外に出して前処理しているように
見えるのがちょっと気になったんで、

rotate_d2(A, B) :- append(A, AX, As), split_d(A-AX,L-[],B-L).

こんなの追加して試行してみたんだけど、やっぱそれでも早いんですね。

?- test_rotate(100,500).
% 2,626,501 inferences in 3.79 seconds (693008 Lips)
% 151,501 inferences in 0.29 seconds (522417 Lips) <== >>286の修正版
% 202,501 inferences in 0.36 seconds (562503 Lips) <== rotate_d2

inferencesの増加が約5万なんで辻褄は合うから、てことはやはり元の
rotateの効率がよくなかったってことか。

それにしても難解…
幾何の補助線みたいに考えればいいのかな。
290278:02/10/20 08:34
たびたびスマン。・・・何やってんだ俺・・・
rotate_d2(A, B) :- append(A, AX, As), split_d(As-AX,L-[],B-L).
291デフォルトの名無しさん:02/10/22 02:25
>>288
日本語訳があるのはいいね(笑)
あと主要なbuiltin predicateが書いてあったらもっと良
日本語の入門だったらこんなのはどう?
http://web.sfc.keio.ac.jp/~tozaki/LP/02/handout/theory/lp.html

難しめの事もわりと平易に書いてる気がするんだけど。
[a,b,c] なんてリストから
[a,b,c|T]-T なんて差分リストを作りたいのだけど
どしたらいいんでしょ??
逆なら簡単なんだけど・・・
294293:02/10/25 13:35
自力解決しますた・・・逝って来ます
>>293
Tの頭にc,b,aと足し込んで行くしか思い浮かばないんですが、
O(1)でやりたいってことですよね。きっと。

できるとしたらその解でも、できないならその証明でも
どっちでも面白そうなんで、識者の方、ご教示おながいします。
296295:02/10/25 13:49
げっ。
どう解決したんですか?>294
まさかappendとか・・・
297293:02/10/25 16:11
>>296
appendデス(笑)
とは言え、私の使ってる奴は
appendが組み込みで、リストの分解
とかには使えないんで、
myappend([],L,[]).
myappend([X|L1],L2,[X|L3]):-myappend(L1,L2,L3).
list_dlist(L,H-T):-myappend(L,T,H).
です。
効率は悪いけど、殆どの処理を差分リストを用いて、
必要な部分だけ上のを使うってのでいいかなーって
思ってるのですが・・・
298デフォルトの名無しさん:02/10/27 12:03
Mercuryの悪口とか、ここに書いていいの?
保守
300300:02/10/31 19:40
>>299
なんかネタだせ。
大学の授業でPrologがあるんだけど、意味不明、、、
302デフォルトの名無しさん:02/11/01 16:07
常識かもしれないけど、SonyのAIBOの処理系はPrologで記述されてますよ。

知ってた?
303デフォルトの名無しさん:02/11/01 16:20
Prologもマンセー
>>302
知らんかった。<LISPとかだと思った。
知らなかった香具師がおれの他にもいた。よかった。
306デフォルトの名無しさん:02/11/02 18:02
>>302
知らんかった。<Cとかだと思った。
>>302
しらんかった。<中に本物の犬が入ってると思ってた。
知らんかった。<中にバイト君が入ってると思った。
座布団全部持って逝け
ソリャネーヨ
Prologで文字列のマッチングをするのはどういう方法がいいんでげしょ?
文字列もリスト構造になってるんで、有名なKMPとかを使ってもあんまり効率
は改善できそうにないし・・・

312デフォルトの名無しさん:02/11/10 00:37
>>311
Cでかく
AIBO蹴ったら「イテ」って低い声がしたけどな。
314デフォルトの名無しさん:02/11/11 01:34
>文字列もリスト構造
そうなの?
315デフォルトの名無しさん:02/11/11 11:36
Prologコンパイラについて全部教えて
バカだね
>>315
http://www.t.ring.gr.jp/pub/GNU/gprolog/gprolog-1.2.13.tar.gz
その情報ならここにあるよ。変なURLかも知れないけれど、確実。
318デフォルトの名無しさん:02/11/11 17:08
Prologマンセー
319デフォルトの名無しさん:02/11/11 20:41
gprologは、prologソースをprologを使ってwamにしてるんですか?
prologの研究をしてる振りなのでprologが読めなかったり(苦笑
320318:02/11/11 21:22
Prologやろうと思うんだどVC++が一段落しねえな。
321デフォルトの名無しさん:02/11/15 09:15
激しくなつかすぃ「Prologの冒険」
http://www.amzi.com/AdventureInProlog/
322デフォルトの名無しさん:02/11/15 09:34
リストカット
お前ら今週prologの勉強を始めた俺が初めて自力で
書いたプログラムを添削して下さいませんか?

/* 犬と、犬の主人と、
ヒンズー教の男と、牛が2頭、
イスラム教の男と、豚が2匹。
ボート(定員2)で河を渡ります。
最低一人は人間が乗らなければなりません。
主人がいないと、犬は見境無く噛み殺します。
イスラム教の男がいないと、ヒンズー教の男は豚を食べます。
ヒンズー教の男がいないと、イスラム教の男は牛を食べます。
河を渡る手順はどのようになるでしょうか? */

human( man ).
human( hindu_man ).
human( islamic_man ).

animal( dog ).
animal( cow ).
animal( pig ).

move_boat( Ca, NewCa, Cb, NewCb ) :-
select( boat, Ca, NewCa ),
append( [ boat ], Cb, TempNewCb ),
msort( TempNewCb, NewCb ).
move_human( Ca, NewCa, Cb, NewCb ) :-
select( Human, Ca, NewCa ),
human( Human ),
append( [ Human ], Cb, TempNewCb ),
msort( TempNewCb, NewCb ).

move_animal( Ca, NewCa, Cb, NewCb ) :-
select( Animal, Ca, NewCa ),
animal( Animal ),
append( [ Animal ], Cb, TempNewCb ),
msort( TempNewCb, NewCb ).

move_other( Ca, Ca, Cb, Cb ).

move_other( Ca, NewCa, Cb, NewCb ) :-
move_human( Ca, NewCa, Cb, NewCb ).

move_other( Ca, NewCa, Cb, NewCb ) :-
move_animal( Ca, NewCa, Cb, NewCb ).
fail_by_dog( C ) :-
member( dog, C ),
not( member( man, C ) ),
length( C, X ),
(member( boat, C ) -> 2 < X ; 1 < X).

fail_by_hindu_man( C ) :-
member( hindu_man, C ),
not( member( islamic_man, C ) ),
member( pig, C ).

fail_by_islamic_man( C ) :-
member( islamic_man, C ),
not( member( hindu_man, C ) ),
member( cow, C ).

print_answer( [], [] ) :- !.

print_answer( [CR | CRH], [CL | CLH] ) :-
print_answer( CRH, CLH ), write( CL ), write( CR ), nl.

solve( Sa, [ Ca | CaH ], _Sb, [ Cb | CbH ] ) :-
Sa == rightSide,
Ca == [], !, print_answer( [Ca | CaH], [Cb | CbH] ), nl.
solve( _Sa, [ Ca | CaH ], Sb, [ Cb | CbH ] ) :-
Sb == rightSide,
Cb == [], !, print_answer( [Cb | CbH], [Ca | CaH] ), nl.

solve( Sa, [ Ca | CaH ], Sb, [ Cb | CbH ] ) :-
move_boat( Ca, Ca2, Cb, Cb2 ),
move_human( Ca2, Ca3, Cb2, Cb3 ),
move_other( Ca3, NewCa, Cb3, NewCb ),
not( fail_by_dog( NewCa ) ),
not( fail_by_dog( NewCb ) ),
not( fail_by_hindu_man( NewCa ) ),
not( fail_by_hindu_man( NewCb ) ),
not( fail_by_islamic_man( NewCa ) ),
not( fail_by_islamic_man( NewCb ) ),
not( member( NewCa, CaH ) ),
not( member( NewCb, CbH ) ),
solve( Sb, [ NewCb, Cb | CbH ], Sa, [ NewCa, Ca | CaH ] ).

river_problem :-
msort( [ boat, man, dog, hindu_man, cow, cow, islamic_man, pig, pig ], Init ),
solve( rightSide, [ Init ], leftSide, [ [] ] ).
いじょ。
327デフォルトの名無しさん:02/11/16 18:17
323> 初めて自力で書いたプログラム
レベル高すぎ。俺は
mortal(ore).
mortal(omae).
とかだったぞ。
?-mortal(X)
とかやって、動いた、感動した、単位取れた、終わり、だったな。
328デフォルトの名無しさん:02/11/16 18:24
cかc++かjavaで書かれたprolog->wamコンパイラ募集中♪
329318:02/11/16 18:53
>>323
おお、激しく面白そうだ。
さすがProlog
>>323
だれ(どれ)が、(安全に?)川を渡ればいいの?
ふれーむもんだいかな?
331デフォルトの名無しさん:02/11/16 19:00
>>327

mortal っすか。
>>327
初めて自力で書いた(ある程度まとまった意味のある処理をする)プログラム
ということでよろしく。
mortal(X). で感動できたんなら、俺よりセンスありそうだ。感動は大事っす。

>>330
全員が川岸から反対の川岸まで、犠牲者を出すことなく渡ればOKっす。
こないだGNU prologダウンロードしてみましたけど、
情報学部系の人は授業などでやるようですね。

しかし仕事で使うことはまず無い言語ですよね?
Prolog, Lisp, MLは直接使わない時でもプログラミングの役に立つことでしょう。
335 :02/11/16 22:55
>>332
案外難しいですね。
ループしないように履歴をもってないといけないと。
336デフォルトの名無しさん:02/11/17 20:32
Finite Domainって知ってますか?
Infinite Justiceなら知ってるぞ
338デフォルトの名無しさん:02/11/18 00:20
>>337
なにそれ
>>338
アメリカのアフガニスタン攻撃作戦の名前でわ。
340デフォルトの名無しさん:02/11/18 01:29
んだよ
↑象牙の塔まるだし
342デフォルトの名無しさん:02/11/21 20:53
swi-prologをJavaから呼び出せるようにしようとしてるんですが、
誰か意見があればどうぞ。
>誰か意見があればどうぞ。

エッチさせろ。
>誰か意見があればどうぞ。

Could you insert your penis to my anal!
>誰か意見があればどうぞ。

C++からも呼べるようにしといて。
346デフォルトの名無しさん:02/11/21 21:07
>誰か意見があればどうぞ。

Prolog -> WAM のコンパイラをうpしてください。
ソースは、C,C++,Javaあたりでお願いします。
Prologで作ったPrologコンパイラばかりで困ってます。
347デフォルトの名無しさん:02/11/21 21:58
>>346
コンパイルの時間が遅いってこと?
348デフォルトの名無しさん:02/11/21 22:03
>>347
WAMがわからんってことです。
Prologソースも読めないし。
リストから、空リストを再帰的に削除するのってどうやるの?
[[], a, [b, [], [], c, []], [[[]]], [[[a]], [b]], []] が
[a, [b, c], [[[a]], [b]]] となる述語。
できそうでできませんでした(泣)
やってみた。いいのかな・・・

remove_empty([], []).
remove_empty([[]|T], T2) :- remove_empty(T, T2), !.
remove_empty([[H|T]|T1], T2) :- remove_empty([H|T], []), remove_empty(T1, T2), !.
remove_empty([[H|T]|T1], [H2|T2]) :- remove_empty([H|T], H2), remove_empty(T1, T2), !.
remove_empty([H|T], [H|T2]) :- remove_empty(T, T2).
をを、お見事。サンクス。
入れ子のパターンマッチングと、カットがキモでしたか…。
どうやったら、[[H|T]|T1] を思い付くんでしょう?
こんなのもどう?
remove_empty([],[]) :- !.
remove_empty([H|T],L2) :- !,
 remove_empty(H,H2), remove_empty(T,T2),
 remove_empty_aux(H2,T2,L2).
remove_empty(X,X).
remove_empty_aux([],T2,T2) :- !.
remove_empty_aux(H2,T2,[H2|T2]).
remove_empty(X,X):- リストじゃないっていう組み込み述語(X).
ってしてカットを抜いたほうがきれいかも
再挑戦してみたらできました。遅いかも。述語によってカットがあったりなかったりが謎。
is_empty( [] ).
is_empty( [A] ) :- is_empty( A ).
is_empty( [A | L] ) :- is_empty( A ),is_empty( L ).
remove_empty( X, X ) :- not( is_list( X ) ).
remove_empty( [A | X], [] ) :- is_empty( A ), is_empty( X ), !.
remove_empty( [A | X], Y ) :- is_empty( A ), not( is_empty( X ) ), remove_empty( X, Y ), !.
remove_empty( [A | X], [B] ) :- not( is_empty( A ) ), is_empty( X ), remove_empty( A, B ).
remove_empty( [A | X], [B | Y] ) :- not( is_empty( A ) ), not( is_empty( X ) ), remove_empty( A, B ), remove_empty( X, Y ).
356デフォルトの名無しさん:02/11/26 13:16
WAMについて(その動作など)詳しく知りたいのですが、よい文献などありますか?
和文が希望ですが、和文以外でもよいものがあればご教授ください。

Prologの動作の仕組みなどに興味があります。
prolog使って喜んでる奴って根暗そう。
358デフォルトの名無しさん:02/11/26 21:13
prologがjavaから呼べると何がいいんでしょうか?
>>357
ママンのtitsでも吸ってろ!
>>358
JavaからPrologを利用できる
362西門#:02/11/26 21:24
363デフォルトの名無しさん:02/11/27 08:46
>>361
冗談にしてはつまらないな。
もうちょっとまともな事書けばと思ってしまった。
参考になればいいけど
364bloom:02/11/27 09:37
365356です:02/11/27 13:46
>>362
西門#さん
ありがとうございます。
Warren's Abstract Machine<A TUTORIAL RECONSTRUCTION>[wambook.pdf]の
「Prolog in a Nutshell 91」
「The WAM at a glance 97」
がよさそうですね。日本語の文献がよかったんですが、なさそうなので
とりあえずこれを読んでみます。
ありがとうございました。
366デフォルトの名無しさん:02/11/28 22:58
prologインタプリタを作るのって簡単?
ためしに作ってみたんだけど、あまりにも簡単すぎて。
これでいいのかな。
よくわかんないけど、いいんじゃないの。
見せて見せて。
まさか Brainfuck で書いてないよね?
GNU Prolog Compilerを取ってきたので今からインストールして試してみます。
http://pauillac.inria.fr/~diaz/gnu-prolog/ から取れます。
何でもPrologプログラムをCプログラムにコンパイルしてくれるようで楽しみ。
・・・と思ったら、どうも直接アセンブリ出力をするようです。
>>356 >>365
その会話サンクス
ちょーど質問しよーとしてたとこだた
>>366
ただ動くだけのインタプリタなら、100行足らずで書けるよね。
効率よく動かそうと思うと1万行とかになるけど。
373デフォルトの名無しさん:02/11/29 04:09
100行足らずのprologきぼんぬ。
何が出来ればprologなの?
374デフォルトの名無しさん:02/11/29 04:14
prologの処理系で一番使いやすいのってswi prologってきいたんですけど本当ですか?
自分、prologすらつかったことありません・・・
100行は超えてるけど
http://www.ece.pdx.edu/~mperkows/CLASS_ROBOTICS/LISP/tanimoto/PROLOG.CL
とか?
もっと短くなりそうですけどね。

Horn節のresolutionができればPrologなんじゃない?
>>374
やはりSicstus Prologでは?
Quintus Prologだろう。
SicstusはQuintusの模造品。
execute((P,Q)) :- !, execute(P), execute(Q).
execute(P) :- predicate_property(P, built_in), !, P.
execute(P) :- my_clause((P :- Q)), execute(Q).

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

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

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

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

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

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

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

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

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

差分リスト以外は
Prologは文法的には非常に単純だが、単純過ぎて、何か複雑な事を
やらせようとすると脳内シミュレートが重荷で大変だと思った。
414デフォルトの名無しさん:02/12/04 19:07
>>406
困難から逃げるのが好きな漏れはProlog絡みの卒研を履修放棄した。
415デフォルトの名無しさん:02/12/04 22:40
>>410
テーマの内容は何?
416デフォルトの名無しさん:02/12/04 22:57
prologインタープリターを自分で作ってみたいのですが、
どうしていいかよくわかりません。
誰か救いの手をお願いします。
>>416
既存の処理系のソース読破汁!!
418デフォルトの名無しさん:02/12/05 00:04
Cでコーディングされたprologのソースコードくれよ
>>418
GNU-Prologのソースコードなら
http://gnu-prolog.inria.fr/
にあるじゃん。
全然関係無いんだが、
>>417
>読破汁!!
2ちゃん語って非常に気持ち悪いんだけど、慣れないと駄目ですか?
>>420
2ちゃんねる見なきゃ大丈夫。
422デフォルトの名無しさん:02/12/05 00:39
421がいいこといった
>>420
2ちゃん語なんてものはありません。
ただ日本語すらまともに使えていないバカが多いだけです。
424デフォルトの名無しさん:02/12/05 23:38
g-prologはやめたほうがいい
なして
Turbo Prologは強烈だったなー
427デフォルトの名無しさん:02/12/06 00:56
第5世代プロジェクトと共に消えたプrolog
428デフォルトの名無しさん:02/12/06 07:42
あのころはあれだけprologに期待をかけられていたのに、いまじゃただの藻屑とかした
429Prolog:02/12/06 15:21
(´Д⊂ヽうるせーバカチンども
430デフォルトの名無しさん:02/12/06 21:08
おまえらアルゴリズムデバッギングくらい知ってるよね?
あれってprologで実装するもの?
431416:02/12/06 21:32
公開されているソースコードを参考にして
ある程度作って、だいたい動くようになったのですが
バックトラックが上手く実装できていないのと、
あと
test(A,A).
test1(A,B):-test(A,C),test(B,C),A=1.
の単一化を実現する上手い方法が思いつきません。
誰かバックトラックの実装方法と
上記の単一化を実現する実装方法を教えてください。
>>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が返る。

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

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

>Aを仮に1としてパターンtest1を評価すると、
アフォ?
test1(A,B).
と質問した時、prologは
どうやってA=1,B=1
を見つけて来るんだよw
という俺もよくわからないけど、
内部でA=C,B=Cという表現を作ってるんだと思う。
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.
うーむ。
>>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).
とやる。
437435:02/12/07 20:32
>>436
こういうとこでcut使うんですか・・・。
いまいちcutの使い所がわかんないですな。
多分どういう動きなのか想像つかんからですが。
>>437
cutがないと、fib(0,0)にいったん成功して、その後バックトラックする時に
下の選択肢を探すことになる。(そのための情報がスタックに積まれる。)

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

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

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

そもそも自分でインタプリター作れる奴はそれ程多くないし、
2chにはたぶんいない。
454デフォルトの名無しさん:02/12/09 15:22
>>452
7行スレからパクッたのか?
455デフォルトの名無しさん:02/12/09 21:06
へ?
456デフォルトの名無しさん:02/12/09 21:36
450みせてくれ。見たい。
>>453
>そもそも自分でインタプリター作れる奴はそれ程多くないし、
>2chにはたぶんいない。

チミのレベルで他人を判断しないように。
研究者仲間でも、2ch読んでる人は多いよ最近。
457の研究者仲間ってレベル低いんでしょ?
むしろ、どういうレベルなの?
晒しあげ
460デフォルトの名無しさん:02/12/10 17:34
a
>>458
んー、チューリング賞はとれそうに無いが、
日本の学会の論文賞なら皆とっている。
462デフォルトの名無しさん:02/12/10 22:32
>>461
分野によりけりだろ。
まあ、ためしにprologインタプリターでも作ってみろって
どうせ作れないだろうけど。
>>462
それはあまりに簡単すぎる。
>>450
見せたいなら
もったいぶらずに
早く見せろやゴルァ!
465デフォルトの名無しさん:02/12/10 22:41
突然ですが、情報系院生だけど趣味でLISPインタプリタ作ったよ。

以外といろんな人が見てますよ。さすがにプロフェッサーはないだろうけども。
466デフォルトの名無しさん:02/12/10 22:49
証拠プリーズ
ネタかな?
467デフォルトの名無しさん:02/12/10 22:50
>>463
もっと難しい課題の提案よろしく
自称レベル高いだから、さぞかしすごい事ができそうだ。
prologインタプリターを自動生成するprologのプログラムとか
LISPぐらいなら素人でも作れるよ。
schemeはちょっとセンスがいる。
両方ともインタプリタのままだと無茶苦茶遅いけど。
469デフォルトの名無しさん:02/12/10 22:54
lispが一番簡単だな。
末尾再帰の最適化ってどうやるの?
パターン判定するの?
PrologインタプリタだってLispインタプリタと同じくらい簡単だろ。
>>378 にあるとおり。
>>469
Schemeで書けば、自動的に末尾再帰は最適化される。
472デフォルトの名無しさん:02/12/10 22:56
メタインタプリタとインタプリタの区別がつかないバカがいるスレですか?
>>472
それを言うならメタサーキュラーインタプリタだろ。ハズカシ…
でも、どっちもインタプリタだよ。同じ事。
まあ、実際Common Lispのインタプリタは
たいていCommon Lispで書いてあるしな。
>>474
PrologのインタプリタもフツーPrologで書くよ。

インタプリタの速度なんて誰も気にしないし、
コンパイルすればじゅうぶん速い。
476デフォルトの名無しさん:02/12/10 23:03
有名度
メタインタプリタ>>メタサーキュラーインタプリタ
同じ意味だろ。

じゃあ、perlもrubyもevalで終わりか。
作れない言い訳にしては普通すぎるというか。
>>476
ほんとに無知だな。
eval自身をその言語で書くのがメタインタプリタ。
ML作れる兵はいないのか?
479デフォルトの名無しさん:02/12/10 23:07
素人質問で申し訳ないのですが
lispでlispインタプリターを作る意味は何ですか?
>>479
それが一番楽で実際的だから。
481デフォルトの名無しさん:02/12/10 23:10
>eval自身をその言語で書くのがメタインタプリタ。
ソースキボーン
482デフォルトの名無しさん:02/12/10 23:10
さっきLISPを作ったと書いたものです、院生。
作成言語はC++ with STLです。C++の勉強のために作った代物。
実は作成したのはscheme likeなlispなのですが、同じといえば同じ。
ガベージコレクションがたいへんでした。

しかし、そんなに難しいものじゃない。効率考えなきゃ、だれでも作れるでしょう。
483デフォルトの名無しさん:02/12/10 23:11
で、ウプしないの?
ネタ?
>483
おまえ、ソースきぼんとかうぷしろとか
さっきからしつこいけど、アホだろ?
485482:02/12/10 23:15
>>483
私に言っています?
すでにあげてるのですが、研究室のサーバに挙げてるので
おしえたくねー。疑われそうではあるけど、仕方ない。

どこにあげればいい?鯖いってくれりゃ、あげまっせ。
ちなみにmainとatom以外はtemplateで書いてるから、読みにくいよー。
486デフォルトの名無しさん:02/12/10 23:15
インタプリタを作るのか
メタインタプリタを作るのか
はっきりしやがれ
メタインタプリタとメタサーキュラーインタプリタは違うよ。

「SchemeでSchemeインタプリタを書く」のはメタサーキュラーインタプリタ。
メタインタプリタは、メタレベルのインタプリタ。
インタプリトされているプログラム(オブジェクトレベル)と
インタプリタ自身(メタレベル)は、意味的に『別』の言語、『別』のデータ
で表される。
Lispインタプリタはすれ違いのような。
>>387
SchemeでSchemeコンパイラを書くのは何なんですか?
490デフォルトの名無しさん:02/12/10 23:22
C++の練習でlisp作るなんて・・・
すげー
>>490
ネタだと思われ。
>>489
何だろうね。別にメタとは言わないね。

理論屋がその言語自身のコンパイラで何かするとしたら、
「操作的意味論」と呼ぶかもな。
493デフォルトの名無しさん:02/12/10 23:26
>>490
Lispのプログラマを書いたことのある人間なら
別に意外でもないと思う。

たぶん、「型判定にvirtualメソッドを使う」とか
やってるんじゃないかな。

C++に慣れたプログラマだと「スマートポインタでGC」
とかやりたくなるかもしれないけど、それは止めたほうが無難。
495490:02/12/10 23:27
ネタかな・・・
>ちなみにmainとatom以外はtemplateで書いてるから、読みにくいよー。
この辺がネタ臭さを出してるけど、
でも、templateで書いてるなら普通にすごいかも。
496490:02/12/10 23:30
メタサーキュラーってどういうスペリングですか?
497490:02/12/10 23:31
いつの間にかウプロダが貼られてる。
期待してます。
是非、見せてください。
metacircularでは
499482:02/12/10 23:33
>>491
まじっす。まじっす。ほんとっす。

でも、defun,cons,cond,eq,car,cdr,print,terpri,...
程度の基本の基本しか実装してないです。凄いの想像したならごめんです。
入出力込みで2000行程度の代物。

もう少しすてきな感じになったら、世の知れたところに出しますので
そのときはよろしく(作ってて楽しくなった)。

キーワードは いろんなデータ構造をatomとして使えるLISP です(ありきたり)
LISP on design patterned でよろしゅうに。名前は未定さん。
500デフォルトの名無しさん:02/12/10 23:34
サーキュラーがつくかつかないかの違いは
まったく同じか、ちょっと違うかの違いだろ。
メタサーキュラーはリフレクションと関係ないだろ。

メタインタプリタはリフレクション用語。
502482:02/12/10 23:37
>>494
ごめんなさい、GCにスマートポインタをまさに使ってます。
遅い遅い。

すこしだけ、アップロードとやらをしてみます。
全部はダメぴょん。
503デフォルトの名無しさん:02/12/10 23:37
ウプまだ??
ネタ率95%
>>503
ウザイ
505デフォルトの名無しさん:02/12/10 23:39
>>502
コンパイルして動く程度はウプしないと
途中で挫折したくせに強がった厨房ケテーイ
となると思うけど

期待してるよ。
506デフォルトの名無しさん:02/12/10 23:40
>>504

>どこにあげればいい?鯖いってくれりゃ、あげまっせ。
って書いてるんだから、仕方ないのでは?
507506:02/12/10 23:41
502読み損ねた、スマン
もうちょっとでこのスレ丸2年ですね。
509デフォルトの名無しさん:02/12/10 23:43
逃げた・・・・
510482:02/12/10 23:43
あぷろだとかよくわからんので、ここにすこしだけ公開。
こんなところに書くから、根幹は秘密の関係ないとこだけ。

名前空間省略!インクルード省略!!
class LispErr {
string perr;
public:
LispErr(const string &s) {perr =s;}
string err(void){return "error :" + perr;}
};
template<class C> class Function;
class LispBool{
Condition p_cond;
public:
Condition cond(void) const {return p_cond;}
string print(void) const ;

LispBool& operator=(const LispBool& l) {p_cond = l.cond();}
LispBool(){p_cond = UNDEF;}
LispBool(Condition c){p_cond = c;}
};

template<class C> class S_EXP : public LispBool{
bool p_isatom;
bool p_isS;
bool p_isList;
bool p_isSymbol;
int p_S_num;
C p_atom;
1レスで書けるのはこの程度?
511デフォルトの名無しさん:02/12/10 23:44
結局、自称レベル高いとか言うカス研究者はどうなったんだろう(pw
512デフォルトの名無しさん:02/12/10 23:45
おいおい、zipで圧縮もできない厨房かよw
513490:02/12/10 23:47
名前
E-mail
題名
内容
URL
添付
ってなってるから
添付のところにウプしたいファイルを指定するだけだですよ。
インタプリタ書くのさえ難しいと思ってて
書いた人を神とあがめるアフォが集まるスレはここですか?
515490:02/12/10 23:47
>>514
俺にはできないけどなぁ
Lispもあまりよくわかっていなかったりする。
516デフォルトの名無しさん:02/12/10 23:48
>>514
おめーもできないだろ、カス
メタインタプリタ作ってインタプリタ作ったつもりになってるバカですか?
>>516
まだメタインタプリタとメタサーキュラーの区別がついてない厨房がいる(w
>>516
でも、遊びならともかく、PrologインタプリタはPrologで書くのが
実際的だし、SchemeインタプリタはSchemeで書くのが有利だろ。
あらゆる意味で。
519482:02/12/10 23:52
>>505
ありゃ、こんなこと書かれてる。よけい火に油を注いだ形になりそうな予感。
しかし、もし挙げたら神になれるのかしら。迷うな。

正直なところ、あまり見せたくないんだわ。
こんなに重宝な感じでいわれると、もう少し、立派なところで公開したくなりました。もしかして、これって凄いのとかいう勝手な妄想。
コピー公開とかされたらムカつくので、ライセンスとってから公開します。
お騒がせごめんなさい。

520デフォルトの名無しさん:02/12/10 23:55
>>510
インデントがないから激しく読みにくい(笑
>>519
見せなくて良いよ。
自分でインタプリタも書けないような厨房ども、どうせ見ても理解できない。

だいいちスレ違いだし(w
522デフォルトの名無しさん:02/12/10 23:59
>コピー公開とかされたらムカつくので、ライセンスとってから公開します。
ライセンス取るってお前アホ?
ライセンスってのはソースの片隅に
著作権アリって書くって意味だろうが。

作れる能力は確かにすごいだろうけど
作った物自体はたいした事ないでしょ。
同じ機能なら俺も1日あればできるよ。

その部分的なコードを見るとすごくネタなきがするんだけど・・・

心配ならsourceforge使え
523522:02/12/11 00:00
まあ、個人的にはテンプレートをどう使ったのか
くらいにしか興味ないから別にウプしなくてもいいけど。

この流れでやめたら釣り師だよな(笑)
>ライセンスってのはソースの片隅に
>著作権アリって書くって意味だろうが。

うわ、すげーアフォだ(藁
525522:02/12/11 00:04
>>518
prologなんかはバックトラックなどを実装する事に意味があると思うけど。
ふと思った、あれを幅優先で実装するとどうなるんだ?
カットを除けば、結果はかわらないだろうけど
なんか意味があるのだろうか。

>>525
もちろん結果は同じ。
空間計算量が異なる。
527522:02/12/11 00:08
>>524
あれ、違うの?
スマン、説明お願い。
528482:02/12/11 00:09
>>522
GNUライセンスなら結局そんな感じになりますがね。
でもコードに色々著作埋め込んだり、形式を一応整えたりと手間はあるんです。

ちなみにtemplateはclassをatomとして扱えるようにしてます。
結局的にatomの演算をatom自身に持たせたというところ。
簡単には足し算はatomの概念によってかわるから、うんたらみたいに。
そこをtemplateとabstruct virtual classでよいこら(ここが味噌だからさ)とね。
微妙にboostのpreprocessをつかってね。

釣り師です。以上です。
abstractだろ(ヤレヤレ
530490:02/12/11 00:13
なんか残念ですね。
気分的には
「だったら言うなよ・・・」
ってとこですが、
見せてもらう側なので文句は言えませんが。
著作権って「あり」って書かなくてもありに決まってるだろ。
なんか臆病な奴が多いようで
>>531
主張しなきゃねーよ
534522:02/12/11 00:19
>そこをtemplateとabstruct virtual classでよいこら(ここが味噌だからさ)とね。
具体性が全然ないんだけど。
無駄にtemplate使ってるだけなきがしてきたよ。
>>533
おいおい。ヴェルヌ条約加盟以前のアメリカならともかく、
日本やヨーロッパや今のアメリカは無方式主義だよ。
主張は不要。著作権は手続き無しで自動的に生じる。
>>533 ネタだろ?
537482:02/12/11 00:23
>>534
よくわかってらっしゃることで。もしかして、あなたも作ろうとしたのかな?

正味、インタプリタとして用いるならtemplateは使わない方が簡潔に書ける
と思われます。ただし書く効率は別として。

ただ、別のプログラムの内部処理に組み込むことを考えていますので、
そのためのtemplateの意味もあります。
>>533は未だにパブリックドメイソとか言っていると思われ。
539デフォルトの名無しさん:02/12/11 00:28
>主張は不要。著作権は手続き無しで自動的に生じる
そんな事ないでしょ。
ソースコードは著作物だけど
権利を主張しない限りは、勝手にコピーされても
文句は言えない
>>539
おいおい…
Copyright (C) ....
が法律的に何の意味ももたないことを本当に知らないのか?

「無方式主義」でぐぐってみろや。
541482:02/12/11 00:31
ネタでしたごめんなさい。
本当はインタープリターなんて作れないんです。
もう何も言わないでください。
542482:02/12/11 00:34
>>541
せめてインタプリタとかいてほしかった。
ネタでしたごめんなさい。
543482:02/12/11 00:35
英語のカタカナ化はどっちでもいいぽ
>>518
>でも、遊びならともかく、PrologインタプリタはPrologで書くのが
>実際的だし、SchemeインタプリタはSchemeで書くのが有利だろ。
>あらゆる意味で。

実際的って何?何が有利?
作り方のお勉強程度の意味しかないじゃん。
482は普通にウザイ
スレ違いもいいところ。
>>539
本当にそう思ってたのか????
そこまで遅れているやつがこの世にいたとは…
547482:02/12/11 00:37
>>543
いや本人がインタプリタと書いてるから(一貫してる)
そうかかなきゃ、本当っぽくみえないと思ったといってみる。
インタープリタだっけ?
俺はインタープリンタだと思ってた。プリンタの一種(w
そんな>>545が一番うざがられているワナ。
鏡みろよ、かがみ。
>>544
いや実際、製品ではそうしてるけど。
そのほうが生産性ははるかにいいし、速度もそんなに変わらんし、
だいいちインタプリタの速度を気にしてもしょうがないし。
>>544
他にどうやって書くの?
552通りすがり:02/12/11 00:43
>>540
意味がないことはない。
例えば、著作権が侵害された場合なんかは、
侵害側がその著作権の所属につき善意を主張した場合、
その抗弁として使用できる。
>>552
そういう意味はあるかもね。
でも「著作権を生じさせる手続き」としては無意味だろ。
>>550
それどういう意味?
>速度もそんなに変わらんし
インタプリタをインタプリタで駆動すんだから、
むちゃくちゃ遅くなるんじゃないの?
コンパイルするってオチですか?
>>552
2周年おめ。
>>554
オチもなにも…
まともな処理系なら*当然*コンパイラがあるだろ。
557デフォルトの名無しさん:02/12/11 00:55
C言語でprolog作れる人なら
prologでprologを作れる可能性が高いけど

prologでprologが作れても
C言語でprologを作れる気がしないので、

prologでprologを作れると自慢してる奴はアフォ。
>>554
あのなあ、
インタプリタがすでにあるんならインタプリタ書く必要ねーじゃねえか。
コンパイラにきまっとるだろヴォケ。
突然ですが。ぜんぜんまったりしていません。
>>557
自慢も何も、ふつうそうしてるし…
なぜC言語でPrologコンパイラ書けると偉いのかにゃ?
ただ余計な回り道してるだけに思えるが。
>>556 >>558
え?
>>518にインタプリタを*書く*って書いてあるけど?
PrologをC言語に落とすコンパイラならあるよ。
SchemeをCに落とすコンパイラはたくさんある。

そんなのをCで書いてたらアフォだがナー
>>561
だから、CなりPrologなりのコンパイラがまずあって、
Prologインタプリタがまだ無いときの話だろ?
頭があればそれくらい分かる。
>>562
C言語に落とすやつだと制限あるんじゃないの?
同じ動作しなかったり。
565デフォルトの名無しさん:02/12/11 01:01
VMを想定したアルゴリズムを使うインタプリタは
バイナリーにしても速度はほとんど変わらないよ。

メタインタプリタを実装してバイナリーにすると
速度がどうなるかは実際やった事ないけど、
VMと同じ様な動きになる気がするので・・・
という事は遅いとも限らないのか。
頭がこんがらがった。
>>561
まあ、黙って本格的な処理系のソース読んでみろや。
インタプリタは無かったり、コンパイラ使って書いてあったりするから。
つーか>>550が話の流れを追ってないバカって事だろ。
>>564
制限は機能よりむしろ性能だろうな。
アセンブリ言語に落とすのに比べて、どうしてもペナルティがある。
インタプリタとコンパイラの動作の違いは、
SchemeやCommon Lispなら問題にならないと思う。
Prologは知らん。ISO Prologなら大丈夫じゃないの?

>>565
なんでVMが出てくるの?
>>567
なんで?
アフォはどうみても>>544だろ。
>>567
お前がな(w
インタプリタだ、つってんのに、
なんでいきなりコンパイラの話になるんだろうね?
>>571
なぜか、インタプリタをインタプリタで書くなんていう
とんでもない想像をしたアフォがいるからだろうね。
573デフォルトの名無しさん:02/12/11 01:07
>なぜC言語でPrologコンパイラ書けると偉いのかにゃ?
そりゃ、STLがあるから線形リスト作れなくてもいいって
言ってるのと同じだな。
いい悪いじゃなくて、
能力的に、線形リストを作れる/作れない
の違いがあるだけ。

gccがあるからCコンパイラなんて作れなくても
いいというのは正論だけれど、
Cコンパイラが作れるという理由で
雇ってくれる会社はあるのでは?

要するに
PrologでPrologが作れる事は
100歩譲ってちょっとすごいと表現すれば、
CでPrologが作れる事は
かなりすごいのでは?

君が面接官で
二人の志願者からの情報が
1人がPrologでPrologつくれます。
もう一人がCでPrologつくれます。
どっちが優秀かの判定は簡単だよね?
>>572
>>518のことかな?
>>573
ああ、つまりお勉強って事ね。
既に能力のあるプログラマには関係ない話だな。

ChezやSicstusは、わざわざおべんきょのために、
Cでインタプリタ書くような無駄なことをして
能力を実証する必要など無い。
576デフォルトの名無しさん:02/12/11 01:09
>いや実際、製品ではそうしてるけど。
なんで誰も具体的な商品名と、
ベースにした処理系を聞かないんだ?
>>572
>インタプリタをインタプリタで書く
意味がわからんのだが。
PrologでPrologつくれます の方だろう。ま、センスの問題になるんだが。
>>574
いや、>>554のこと。
PrologでProlog作るのと、
LISPでProlog作るのと、
CでProlog作るのと、
どれが一番良い?
>>576
「ベースにした処理系」ってどういう意味?
582デフォルトの名無しさん:02/12/11 01:12
>>575
そうそう、勉強というか
実力を測る基準にはなるでしょ?
明らかに必要となる知識が違うしさ。
ただ時間がかかるだけじゃないよ。

あとは、やっぱり高速化って仕事もあるだろうから
C++で書いて自分で高速化したり
他の処理系が使ってる高速化アルゴリズムを知るのも
有益かもね。

>能力を実証する必要など無い。
関係ないけど、
実証しないと誰も認めてくれないよ。
>>579
もっとさかのぼって話の流れを追えよバカ。
>>582
いや、ChezやSicstusは、そんなアフォなことしないでも
みんな能力を認めてると思うんだけど(w
つーか、70年代ごろから、LispはLispで書いてあるっつーに。
MacLispもLisp Machine LispもZetaLispも、その時点で最高速
だった製品は皆そうだったYo。
586デフォルトの名無しさん:02/12/11 01:16
>>584
二人とも俺は知らないけど
(前がlispで後ろがprolog?)
他に業績があれば認めてもらえるのでは?

まあ、オベンキョにアセンブラやCでインタプリタを
書いてみるのは良いと思うよ。
コンパイラ書いたほうが勉強になると思うけど。

実用的な処理系を(低レベルルーチンだけならともかく全体を)
Cでわざわざ書いたらちょっと…
と思うけど。
>>585
>つーか、70年代ごろから、LispはLispで書いてあるっつーに。
これって、インタプリタを書くわけじゃないよね?
この辺を勘違いしてる人がいるみたいなので。
589デフォルトの名無しさん:02/12/11 01:17
>>585
単純なLispの上に複雑なLispを載せるという意味?
つまり、>>585の言う、「LispはLispで書いてある」というのは、
SICPの教科書の第4章みたいな*インタプリタではない*
ということ?
その辺ぼかして書かれると、知らんやつは誤解するぞ。
>>586
Chez SchemeはCadence ResearchのScheme製品。
Sicstus Prologはスゥェーデンコンピュータサイエンス研究所のProlog製品。
どっちもその性能で超有名。シェアもトップ。

…これらを知らないのに偉そうなこと言ってるの???
592デフォルトの名無しさん:02/12/11 01:19
>実用的な処理系を(低レベルルーチンだけならともかく全体を)
>Cでわざわざ書いたらちょっと…
処理系をインプリする事が目的なら、高速化とか拡張は不要なのでは?
実際に使うために作るのか、処理系を作って勉強してみるのかでは
ずいぶん違うと思うよ。
インタプリタ上でインタプリタを書くのはもっと研究目的だと思うんだが。
研究目的なら手早く書けるほうがいいのでprologはprolog、schemeはschemeで書く。
c/c++やjavaでも性能に目をつぶれば書くのはそんなに難しくはないけどさ。
部分評価器、コンパイラコンパイラあたりで調べてみてください。
>>588
>>588
コンパイラもインタプリタも。

ちょっと想像してみろよ。
Cコンパイラと、デバッグ用のCインタプリタをセットにした製品を売るとする。
これらを両方ともCで書いてバイナリを売るのが、そんなに不思議か?

LispやPrologでも同じ事じゃないか。いったい何を不思議がっているのか…
595デフォルトの名無しさん:02/12/11 01:22
>>591
別に俺は処理系マニアじゃないんで。
そんな事知らなくても良くない?
ダメ?

sicstus Prologは聞いたことあるけど
あれは作った人の名前なんだ。
日本の会社は日本産の有名なprologを買ってると思うんだけど
そんな事も知らない?
学生かな?
>>592
処理系作成者にとって、高速化や拡張性は重要だと思うけどなー。
597デフォルトの名無しさん:02/12/11 01:24
Lispをバイナリに落とすのもPrologをバイナリに落とすのも
ソースとインタプリタを一つのファイルに
まとめるだけじゃなかったっけ?
違ったらスマン
>>595
いや、SICSはSweden Institute of Computer Science。研究所の名前。
最初はQuintus互換の高速フリー処理系として広まったが、その後Quintusを
しのぐ製品となった。QuintusはSICSに買収された。
>>597
んなバカな。
>>597
LispやSchemeのコンパイラで関数呼び出しのベンチマーク
(例えばAckerman)とかやると、Cより速いよ。
601デフォルトの名無しさん:02/12/11 01:30
まとめると結論は2つ

Cでインタプリタを作るには
メタインタプリタを作る以上に技術が必要。


メタインタプリタも実用的に使える。
日本産の有名なPrologってなによ。まさかKABAとか(w
で、それはCで書いてあるのかい?
>>601
君の顔と同じくらい歪んでるな。
604デフォルトの名無しさん:02/12/11 01:31
Cよりどれくらい速いの?
データを教えて
605デフォルトの名無しさん:02/12/11 01:32
>>602
ググレばすぐわかるよ
>>600
つーかそのベンチ試した処理系何?
結論はこうだろ。

1. Cの実用処理系はたいていCで書いてある。Lispの実用処理系はLispで、
 Prologの実用処理系はPrologで書いてある。
2. お勉強のためにLispでCインタプリタを書いたり、CでLispインタプリタを
 書いたりする人もいる。他人が感心してくれるかどうかは疑問。
608デフォルトの名無しさん:02/12/11 01:35
Scheme→Cトランスレーターを使って
SchemeメタインタプリタをCに変換すると
何ができるの?
>>608
Schemeインタプリタだろ?
611デフォルトの名無しさん:02/12/11 01:38
>>607
1について詳しく書いてあるWEB知ってたら教えて。
612デフォルトの名無しさん:02/12/11 01:39
神戸大のなんとかって教授がプロローグオタだよね
>>600
そのベンチを試した処理系は何なの?
>>612
最近は線形論理型言語やってるのでは。
>>613
CMUCLとAllegro CLとgcc
マシンはSun Ultra-10
>615
schemeは?
617デフォルトの名無しさん:02/12/11 01:42
一番はじめのpc用のprologはなにで書いたの?
まさかオブジェクトコード生?そこの話がこんがらがってないですかな。
>>613
Chez Scheme Version 6とgcc 2.95.2。
>>617
聞き飽きた話だが、Cでも同じだろ。
最初のLispはIBM 7040のFortranで書かれた。
Prologは知らん。DEC-10のアセンブラかな?
マルセイユPrologの方が先か。Lispかもね。
>>619
会話になってねーよ。
さっきから頭痛い原因はおまえか。
>>621
いるんだよな。「クロス開発した」っていうと
「最初は?」って聞く厨房(藁
一番はじめのpc用のアセンブラはなにで書いたの?
まさかオブジェクトコード生?そこの話がこんがらがってないですかな。
>>622
なにか悔しいことでもあったんでしゅか?
>>621
わかった。ちゃんと答える。
「Cコンパイラと同様、クロス開発したものと思われ」
626デフォルトの名無しさん:02/12/11 01:50
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);
}
>>626
でも、せいぜい数マイクロ秒でしょ。
628デフォルトの名無しさん:02/12/11 01:54
なんかすっきりしないんだけど
gnu prologはC言語で書いてあるし、
prologで書かれたprologなんて無くない?

lispでかかれたlispってどれ?
実用的なものを除けば、ほとんどCで書かれてそうだけど。
>>626
それ言ったらformatだって遅いんでは。
つーかあのベンチ自体あんまり信用できないんだけど。
630デフォルトの名無しさん:02/12/11 01:56
そのベンチってコンパイルの時間込みって事はないよね・・・・
logって所を押すと・・・
CMLCLもCだよね?
LISPコンパイラはLISPで書かれてるけど。
632デフォルトの名無しさん:02/12/11 01:57
>LISPコンパイラはLISPで書かれてるけど。
ホームページがあればお願いします
633デフォルトの名無しさん:02/12/11 01:59
なんかメタインタプリタしか作れない奴の言い訳が
たくさん書かれている。
634631:02/12/11 01:59
>632
これね。
http://www.cons.org/cmucl/
>lispでかかれたlispってどれ?
>>585
636デフォルトの名無しさん:02/12/11 02:04
http://www.jah.ne.jp/~naoyuki/Writings/Writings.html
schemeの作り方だよーん。
メタインタプリタを作るのが簡単なのは、
perlで正規表現が簡単に使えるのと同じ。
正規表現のモジュールを使える事と、
正規表現のモジュールを作れる事は違います!!
637デフォルトの名無しさん:02/12/11 02:05
線形論理型言語ってやたら難しそうな響きの言語だね。
だからメタインタプリタってのはちがうっつーに…
639デフォルトの名無しさん:02/12/11 02:11
>>634
ftp://ftp.averillpark.net/cmucl/src/lisp/
C言語で作られてるみたいだけど・・・
640デフォルトの名無しさん:02/12/11 02:12
>>638
解説よろしこ
「Cが速い」っていうバイアスがかかってるやつが
多いな。
642デフォルトの名無しさん:02/12/11 02:13
lispでインタプリタ作ってわかった気になってるバカ死ね
643631:02/12/11 02:14
>>639
ちゃんと>>631とソース読んでね。
644デフォルトの名無しさん:02/12/11 02:14
Lispで作られてる実用的なLisp求む
>>636
そのschemeは末尾再帰展開しない上にやたら遅い。
学習には不向き。
Spice Lispは?
LarcenyもOrbitもSchemeで書いてあるよね。
>>647
LarcenyはランタイムがCだと思ったけど。
ランタイムはまあしょうがないよな。
Unixで走らせるなら。
650デフォルトの名無しさん:02/12/11 02:24
>Orbit
非実用的だけどね
Tは?
652デフォルトの名無しさん:02/12/11 02:29
なんでこんな時間に盛り上がる?
Tってもう誰もメンテしてないよね?
公開されてる分については。
ちなみにYale大学のT-Schemeのことだよね?
あれは何から何まで全部scheme。
ブートストラップにscheme自身が必要だったかと。
SBCLもCMUCLからブートストラップ。
Larcenyも、コンパイラやインタプリタは全部Schemeだね。
S-1 というスーパーコンピュータ上のCommon Lispは、
bignum演算からgcまで全部Lispで書いてあった。
658655:02/12/11 03:19
SBCLはランタイムがCだった。スマソ。
659デフォルトの名無しさん:02/12/11 03:26
レイジーエバリュエーションってなんでつか?得意な言語とかあるんでつか?
素人まるだちでついまちえん
怠け者評価
>>659
多少スレ違いの気もするが、マジレスすると、
関数の実引数を、値が本当に必要になるまで
評価しない方式のこと。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

今は作れないけどちょびっとずつ努力はしている。
>PerlでPerl処理系を作ったら本当にPerl処理系を作ったことになるのか?

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

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

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

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

SchemeでScehemコンパイラを書くのは激楽だよ。つか、インタプリタはともかく、
コンパイラはどの処理系もほとんどSchemeで書いてあるんでは?
いわゆる「パーザ」の部分は単に(read)と書くだけだし、
マクロ展開→最適化→コード生成まで、すべてリスト処理だからな。
680デフォルトの名無しさん:02/12/12 11:20
>…で、何が問題なんだっけ?
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を作る事は
ライブラリを利用しているだけにすぎない。

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

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

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

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

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

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

fib(X,832040).
X = 30
ってできるの?
701デフォルトの名無しさん:02/12/13 21:38
>>700
それはおそらく制約論理プログラミングの領域だと思う
702誰か:02/12/13 23:18
Prologインタプリタを作ってつまづいてるのですが、
ソースコードを見てアドバイスをしてくれる神はいますか?
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の表現が大変だけど。
704702:02/12/14 00:49
あきらめました。
凡人には無理でした。
バックトラックする時、どこまで探索したかを記録するのを
忘れていました。
705デフォルトの名無しさん:02/12/14 01:52
prologなどの実業務への適用って、ちゃんとあるんですね

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

あとは引数の受け渡しがよくわかりません。
a(A,B):-b(A,C),c(C,B).
b(A,C):-A=C
とすると
必要な変数は
ABCとなるのはわかるんですが
b(A,C)が実行された後
どういうやりとりを行えばいいのかよくわかりません。
つまりA=Cというデータを渡すにはどうすればいいのでしょうか?
708デフォルトの名無しさん:02/12/14 14:13
http://japan.pinkserver.com/under/index.html
勝手に他人のサイトを直リンク!!
「法的根拠はない!!」
「だから直リンしてます」
ハァ?
ネチケットも守れない痛い厨のサイト晒し
pinkserverってアダルトサイトじゃなかったっけ? 宣伝か?
710デフォルトの名無しさん:02/12/14 21:18
age
>>707
[A/C]という単一化のデータでいいのでは?
712デフォルトの名無しさん:02/12/15 12:11
すごい短絡的だねw
713711:02/12/15 23:29
>>712
俺に言ってる?何か間違ってること言った?
714デフォルトの名無しさん:02/12/16 10:41
f(A,B,X):-A=B,!,X=equal.
f(_,_,notequal).
これと
f(A,B,equal):-A=B,!.
f(_,_,notequal).
は同じですか?教えてください!
>>714
> は同じですか?教えてください!

同じじゃないでつ。
716デフォルトの名無しさん:02/12/16 22:59
具体的な答えが書ける奴っていないねw
717デフォルトの名無しさん:02/12/16 23:13
上は ?- f(1,1,notequal). で no となるが、
下は yes となる。
718デフォルトの名無しさん:02/12/17 00:00
f(A,B,equal):-A=B,!.
f(_,_,notequal).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

WAMでは、述語や節は、WAM機械語命令の列にコンパイルされるよ。
データとして記録はされないです。
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

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

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

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

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

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

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

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

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

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

どこかにホームページがあったので探してきます。
755デフォルトの名無しさん:02/12/23 23:36
http://www.geocities.co.jp/SiliconValley-PaloAlto/1037/technical.html
これだ。
なんか途中で読むの挫折した。
オブジェクト指向PrologってCLOSみたいな感じ?
適当なこと言ってないで755読めって?ごもっとも。
> つーか、今気づいたけど、
> 743見てなかったよ。
> 資料ってそれくらいしかないよね。
> そのPDFを読めばWAMについて全てがわかると思う。
> 図2.1って言ったのも、そのPDFの図2.1ね。
> まあ、補足する必要はないと思うけど念のため。

740, 741 がコンパイラとインタプリタを混同して,
とんちんかんな発言を繰り返している理由がわかった.

図2.1は,本当のWAMコンパイラを説明している図では
ありません.ちゃんと5章まで読んでちょーだい.

繰り返しになるがもう一度.JavaがJVMの命令にコンパイル
されるように,PrologはWAMの命令にコンパイルされる.
述語や節の内部形式(木構造)は保持されていない.

758デフォルトの名無しさん:02/12/24 00:33
>述語や節の内部形式(木構造)は保持されていない.
どういう意味?
内部形式って何?
述語が複数の節から構成されている事を木構造と呼んでるの?

で、話の流れが良くわからなくなったので
もう一度振り返ると
俺が「内部表現」という発言をして
「WAMには内部表現はない」という主張をしているんだと思うんだけど
Prologのソース=述語の定義
がいったん中間言語にコンパイルされるのはいいけど、
それをWAMインタプリタが読み込んだときにWAMインタプリタがどういう風に
それをメモリに配置するかの事を内部表現というわけだ。
つまりインタプリタに入ってくるデータは述語の定義なの。
内部表現は、述語が中間言語でどう表現されていようが
関係ないことはわかったかな?
図2.1はメモリ空間を表現してるんだよね(たぶん)

>プロログのソースコードを処理するコード+誰かが書いたプロログソースコードの
>内部表現
そういうわけで、これの意味がわかってくれたかな?
もしわからないなら、自分でProlog/Cトランスレーターを作れば
意味がわかるよ。
759デフォルトの名無しさん:02/12/24 02:49
内部構造とやらを図にして説明してくれ。
さっぱりわからん
>>758

740 で
> 述語や、節(WAMではTerm)は
> あるデータフォーマット(構造体、クラス)として
> 記録されるわけだけど。
って書いてるのがウソだと主張しています.
たとえばappend/3は,743のようにコンパイルされるわけで
マシン語やJVMと同じく,単なるビット列です.

> もしわからないなら、自分でProlog/Cトランスレーターを作れば
> 意味がわかるよ。
Prologインタプリタも,WAMへのコンパイラも,Cへのトランスレータも
作ったことあるので,ご心配なく
何かfjでの論争みたい。
知識のある人どうしで論争になると、
お互いゆずらないね。
762デフォルトの名無しさん:02/12/24 17:33
知識のある人とない人の論争。
740,741が後者だな。
自作自演カコワルイ
>>762
つーかお前は何様だ?(w
それよりちゃんと引用してくれよ。見てくるのめんどくさ
>>740-741
765デフォルトの名無しさん:02/12/24 23:53
必死だなw
やーいやーい
お前のかーチャンクラミジア
767デフォルトの名無しさん:02/12/26 01:49
記録されていないのなら
appendの定義はどうやって取り出すんだろうか・・・・
768デフォルトの名無しさん:02/12/27 23:58
>Prologインタプリタも,WAMへのコンパイラも,Cへのトランスレータも
>作ったことあるので,ご心配なく
必死さがよく伝わってくる(プ

>>768
別の分野だけどある程度能力のある人間からは別に普通に見えるがな。
文の表層を見ているだけでも >>758 より >>760 の方がまともなのは
瞭然としているのだが。
770デフォルトの名無しさん:02/12/28 01:52
また、必死だ(ププー
771738:02/12/28 12:13
>>739
>実現不可能な動作がいくつかあるようでそれらを扱っていそうな研究も
>”かつてずいぶんあった[738]”ということですのでこれらの研究と
>その実装結果に興味があります。特に実装結果に(^^;

Native code compilerの作り方についてのお気楽な方向付けですので、
実装には手間隙かかることも覚悟してください
1.オープンソースのインタプリタを1つ手に入れる。例えばSWIやGNU。
 もちろん自分で書いても良い。
2.述語のコンパイラを作り、インタプリタに述語として組み込む。
 生成するコードは次のように作ればよい。
 述語に対してWAMコンパイラが生成するWAMコードをWAMが実行するときに
 通過するコードの軌跡を求める。WAMインタプリタが Cで書かれていれば
 これはCのソースの列となる。これを部分評価してその結果を
 いくつかの関数として実現すればよい。
 注意すべきことは、WAMなどでは末尾再帰の最適化が行われるので、
 各種スタックはうまく調整されGCに耐えるようになっている。
 ナイーブに考えるとC言語のスタックをオーバーフローさせてしまう
 アーキテクチャになってしまうが、ここは、
 continuation という技法を使って凌ぐ。
/* ↑ このあたりを知りたかったのではないか? 例えば、
www-2.cs.cmu.edu/Groups/AI/html/faqs/lang/prolog/prg/part1/faq-doc-11.html から
J. L. Boyd and G. M. Karam, "Prolog in C", Carleton niversity,Ottawa, 1988.
これは実は読んでいないのだが。*/
 さらにいえば、とらんぽりんを使うことも考えられるが、とらんぽりんに
 よるPrologの実装は見たことがない。
3.コンパイル結果の関数をCコンパイラでdllにコンパイルしロードして
 インタプリタに述語として登録するための述語を組み込む。
4.これで、インタプリタに内蔵する形のnative code compilerが出来上がる。
 スタンドアローンで実行できることをお望みなのかもしれないが、
 動的に変化する述語も実行しなければいけないので、インタプリタまたは
 コンパイラを内蔵する必要があり、価値があるかどうかわからない。
772デフォルトの名無しさん:02/12/28 15:11
そんなことする意味があるのだろうか。
>>767
> 記録されていないのなら
> appendの定義はどうやって取り出すんだろうか・・・・

やっぱりインタプリタとコンパイラを混同している...

SICStus PrologでもGNU Prologでも,
コンパイルしたappendの定義は,clauseでは取り出せないです.

Cのプログラムと同じことです.
Prologコンパイラだけが特殊だと考えるのがおかしい.
774730,734,739:02/12/29 00:20
>>771
ありがとうございます、これもまた大変参考になるお話です。

>Native code compilerの作り方についてのお気楽な方向付けですので、
‥‥
>4.これで、インタプリタに内蔵する形のnative code compilerが出来上がる。
大体の趣旨は分かったつもりです‥‥
末尾再帰の問題はLisp関連の情報を時々目にしたことがあったので、
詳しい実装方法なども探せば見つけられるのではないかと思っていました。
WAM関連ではその存在も知りませんでした。
(と言うよりWAMについてはその詳細を何もまだ理解していません。
本当に素人です。)

>動的に変化する述語も実行しなければいけないので、インタプリタまたは
>コンパイラを内蔵する必要があり、価値があるかどうかわからない。
私も実行中に述語がassertされたりretractされる事を考えると
その解決策の1つとして「‥内蔵される必要があり‥」は考えました。
それでも、つぎの2つに関心がありました。
T.「価値があるかどうかわからない」そのコンパイラ
U.「‥内蔵される必要があり‥」以外の解決方法
Tに関しては、そのもの自体について
いろいろ話をしたい(伺いたい)ところですが、
それ以前に必要と思われる知識に関するソース(英文)と
キーワードを提示していただきましたので
時間を見てぼちぼち読んで理解できればと思います。
Uに関しては解決方法が無いと分かるまで考えてみたいとは思っています。
ただ、PrologにはCやFortranなどにあるコンパイラと同様なコンパイラが
見当たらない事を考えるとUに関しては考えるだけ無駄かもしれません。
T、U以外にもPrologを特徴付ける動作についてその動作とコンパイルとの
関係をよく考察できればと思います。
775774:02/12/29 00:22
今のところ私は、PrologCompilerについて知識と理解が少ないようなので
しばらくは手前で考えたり提示されたソースを読でみたいと思います。


関係ない話ですが753もわたしです。
prologの逆コンパイルは簡単。

777デフォルトの名無しさん:03/01/02 22:25
PrologっぽいインタプリタをJavaで作成中なんですが
これってsourceforgeでプロジェクト立てる価値ありますか?
778デフォルトの名無しさん:03/01/02 23:32
SDKで印刷プレビューを作るにはどうしたらいいでしょうか?
ネットやVC6についていたサンプルソースなどをあさってみたのですが
よく分かりませんでした。

ここのサンプルを見ろ!とかありましたらお願いします。
>>778
あ、2回も誤爆しました。スマソ・・・
780749:03/01/03 14:50
うっうっ(TД⊂ヽ
Prologコンパイラキボン
781777:03/01/05 22:52
とりあえず、プロジェクト立てる事にしました。
このインタプリタのメリットがなんなのかはよくわかりませんが。
しかも、prologについて無知なので、仕様は満たしていないはず。
とりあえず、0から自分で考えてみたというのがポイントかも。
782デフォルトの名無しさん:03/01/07 00:36
GHCについてのスレが見つからない・・・(ノ_<。)うっうっうっ
誘導してくれる神きぼん
「The Glasgow Haskell Compiler」のこと?
そうなら
関数型プログラミング言語Haskell
http://pc3.2ch.net/test/read.cgi/tech/1013846140/
784デフォルトの名無しさん:03/01/07 23:35
>>783
サンクス!この御恩は10分間忘れません!
もう忘れてしまったわけだが
>>782-783
prologスレでGHCって聞かれたらGuarded Horn Clausesじゃないのかよ!
ま、本人が納得してるんならいいが。
787デフォルトの名無しさん:03/01/08 00:04
>>786
すまん。
方々手を尽くして、なんとか自分で解決した後に
スレ誘導のカキコがあったから、内容を確認せずに
感謝してみた
788IP記録実験:03/01/08 21:33
IP記録実験
http://qb.2ch.net/test/read.cgi/accuse/1042013605/

1 名前:ひろゆき ◆3SHRUNYAXA @どうやら管理人 ★ 投稿日:03/01/08 17:13 ID:???
そんなわけで、qbサーバでIPの記録実験をはじめましたー。

27 名前:心得をよく読みましょう 投稿日:03/01/08 17:20 ID:yL/kYdMc
SETTING.TXT管轄でないということは全鯖導入を視野に、か?

38 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:22 ID:rLfxQ17l
>>27
鋭いです。

73 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:27 ID:rLfxQ17l
>ところで、IPが抜かれて何か今までと変わることってあるのでしょうか?
・今までより、サーバが重くなる。
・裁判所や警察からの照会があった場合にはIPを提出することがある。
                   /\        /\
                   /:::::::ヽ____/::::::::ヽ、
                  丿 ::.__  .:::::::::::::  __  ::::ヽ_
                 / /。 ヽ_ヽv /: /。ヽ  ::::::ヽ
 -┼-   丿~~~|     / / ̄ ̄√___丶  ̄ ̄\  ::::|            ■ ■
 -┼-   /~~~~/ ━━━ | .:::::::::: / / tーーー|ヽ     ..::::: ::|━━━━━━  ▼ ▼ 
  .|       丿      | .:::::.  ..: |    |ヽ        ::|            ● ●
                | :::    | |⊂ニヽ| |      :::::| \
              / /| :    | |  |:::T::::| !      .::| \ \\
             / / \:    ト--^^^^^┤      丿 \\\ \\\

                      お、大阪・・・・   
>4 名前:心得をよく読みましょう 投稿日:03/01/08 17:14 ID:OzjReOrp
>>1

>あっ!

>唇オバケだ!



ワロタ
>単純に鯖の負担は2倍

閉鎖
早くIP記録禁止法を作って、勝手にIPを記録した人間を逮捕するようにすべきだな。
793デフォルトの名無しさん:03/01/09 14:52
ID:ZBsKvw39 ID:ZBsKvw39 ID:ZBsKvw39 ID:ZBsKvw39 ID:ZBsKvw39

ID:ZBsKvw39 ID:ZBsKvw39 ID:ZBsKvw39 ID:ZBsKvw39 ID:ZBsKvw39

ID:ZBsKvw39 ID:ZBsKvw39 ID:ZBsKvw39 ID:ZBsKvw39 ID:ZBsKvw39

ID:ZBsKvw39 ID:ZBsKvw39 ID:ZBsKvw39 ID:ZBsKvw39 ID:ZBsKvw39

ID:ZBsKvw39 ID:ZBsKvw39 ID:ZBsKvw39 ID:ZBsKvw39 ID:ZBsKvw39
======2==C==H======================================================

         2ちゃんねるのお勧めな話題と
     ネットでの面白い出来事を配送したいと思ってます。。。

===============================読者数: 138720人 発行日:2003/1/9

年末年始ボケがそろそろ収まり始めた今日このごろのひろゆきです。

そんなわけで、年末に予告したIP記録ですが実験を開始しています。

「2ちゃんねる20030107」
こんな感じで各掲示板の最下部に日付が入ってるんですが、
20030107以降になってるところはログ記録実験中ですー。

んじゃ!

────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50
────────────────────────────
>>713

 ゎ
  ぁ
弱虫と優しさの協奏曲。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。





















ガンバレオマエラ
>>145
掲示板の一番下が「2ちゃんねる20030107a」
ってなってる板じゃなかったかな?
>>149
君は何がしたいんだい?(^_^;)
一番簡単そうなのは各オフなどで一人200円くらいカンパして
ひろゆきに送るのが早い気が。
>>652
いや、そんなことないって。
引用っぽくないし。

CPUクーラー総合スレッド vol.12
http://pc3.2ch.net/test/read.cgi/jisaku/1038085079/
こことか白血病UDスレとかに
 誘導です。
削除議論板雑談&質問スレ 4
http://qb.2ch.net/test/read.cgi/sakud/1036230237/l50

残り少ないレス数を更に減らさないで下さい。

復帰人さんでしたらICQぐらい持っていると
思いますが、Qの方が早いのでは?

水面下で折衝・調整が進行中みたいです。

今頃提案すること自体如何なものかと思います。


ハングルへ速やかにお帰りください
>>356
( ´_ゝ`)フーン
削除しなかったことが問題であって、IP取得は全くの見当違いだと思うんだが
それよかズボラな削除体制どーにかしろって感じだな

どさくさに紛れて都合の良い法律案を盛りこむ議会みたい
管理批判の多い板から記録してるっつーのもなんだかなあ
釣りじゃないのなら実に現実味のない意見だ
健介氏を招き、来て下さるのを待ちます

危機的にキてますので。【本来は私は2CH人員で無いのに書き込んでるのが自分自身不自然で、辛い所 素で。)

15分後程度に又。
======2==C==H======================================================

         2ちゃんねるのお勧めな話題と
     ネットでの面白い出来事を配送したいと思ってます。。。

===============================読者数: 139038人 発行日:2003/1/10

なにやら、連日メルマガだしてるひろゆきです。

そんなわけで、ログ記録実験ですが、いちいちサーバ指定するのが面倒なので、
全部のサーバに入れてみました。

重くなって落ちたりしてもご愛嬌ってことで。。。

んじゃ!

────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50
────────────────────────────
IP記録って何のことです
みたいなのを"うにゅうにゅ"するためにIP記録ができたのです。
多少。
「関係者」の発言(大学時代の成績とか)
はある程度公益。但しプライバシー。

醜態は避けるべきかも、。
本人が「いいや」て思える事ならいいし。

逆に
「本人が駄目」って云って成績悪い人とかは
品性とか出るしね。皆にも嫌われるし。

そこらへんは微妙だし
マスコミの問題とか 社会のすごい「コレから」決める事だし。

だからさっさとけんすう系統だして下さい
では。
ネットはカルトより強し。
ネットは日々進化している。
カルトに進化無し、一時の流行に過ぎんからね。
閉鎖〜閉鎖〜(´人`)ナムナム
てすと
2ちゃんねるがアクセスログ記録を始めましたが、あなたの考えは?
http://newspolls.yahoo.co.jp/public/archives/2076384460/p-ne6-7?m=r
どうも、無責任体質が身にしみている方が多いようで。
メロンパン=ソンゴクウということで民事訴訟されるわけか?ただアク禁ではたりんな!!
ひもいき
最高裁への上告は認められなくなったから、これで事実上判決確定だよ。
逆転も何もないって。
勢いで上告なんかしても一発で上告却下(門前払い)だよ。

二審も一審を支持。これに対して上告しようにも、
刑事訴訟と同様、自由に上告できるってもんでもないのです。
民事訴訟法312条 (上告の理由) 1項
「上告は、判決に憲法の解釈の誤りがあること
その他憲法の違反があることを理由とするときに、することができる。」
http://www.m-net.ne.jp/~doba/goto/hon.htm

ようするに上告しても今の制度では100%無駄。
これで完全終了ってことか。
GAっていつのまに2ちゃんねるアニメランキング1位になったんだ?(w
2ちゃんを叩く連中の主張には一辺の理もないの
アンダスタン?(^_^;)
gannbattekudasai
823山崎渉:03/01/13 19:01
(^^)
824山崎渉:03/01/15 18:14
(^^)
825C++厨:03/01/19 15:13
待て
ダット落ちはイカン
インターネプコにアイザックが出展してたよ
827山崎渉:03/01/23 20:10
(^^)
828デフォルトの名無しさん:03/01/24 03:19
フランスのエスプリとシックさが漂うPrologが
好き?・
829斉藤守:03/01/24 03:29
吉祥寺にある大検・大学受験予備校の中央高等学院
ここは、完全に狂ってる。
授業料は一年分一括前払いなので、
金が入れば、生徒は要らない
金を振り込んだら、何とかその生徒を辞めさせようと
講師どもが、あの手、この手でイヤガラセをしてきますね。
セクハラはもちろん、脈絡の無い罵倒は日常茶飯だね。
酒臭い講師もいるし・・・ 人生の最果て中央高等学院
学歴詐称、経歴詐称、合格実績詐称、デタラメ授業、
http://www.chuo-school.ac/
http://chs-f.com/index.html 中央高等学院福岡校
830デフォルトの名無しさん:03/01/24 22:29
prologで
「f(x)を満たす全てのxがg(x)を満たす」
という命題を表現できますか?
g(X) :- f(X).
じゃないのか?
832デフォルトの名無しさん:03/01/25 07:44
prologだと
全称記号とか存在記号とかはどうなるの?
存在記号 -> スコーレム化して消去
全称記号 -> すべての変数は全称記号で束縛されているとみなされるので省略
あーーーーーー、ネタがねぇぇぇぇえええ!!
?-ネタ(X).
fail.
836デフォルトの名無しさん:03/02/15 00:43
誰か本格的なオブジェクト指向Prolog知らない?
SICStusのオブジェクト指向Prologは使いにくい。
すべてprologで住所管理データベースとそれを利用した
宛名ラベル印刷ソフトを作って会社で使いたい!
データベースはフレーム型で将来容易に拡張可能な
ものにしたい。
料金別納マークなどマークも印字するので画像も
登録して利用したい!
出来ればバーコードも生成しラベルに印字できれば
郵便料金が安くなるので作りこみたいのだが、
簡単に出来ないかな?
838デフォルトの名無しさん:03/02/26 20:23
【何処も】情報科学総合スッドレ【板違い】
http://science.2ch.net/test/read.cgi/rikei/1046173479/l50




>>837

prologでやらないことが簡単な方法
SWI-Prolog インスコ中!
インスコ完了!
しかしインタプリタは常に質問モード?のままのよーだ。
対話的に事実や述語を定義することはできないのかな?
assertとか使うしかないんじゃない?
できますた。アリガト-!
844デフォルトの名無しさん:03/04/07 19:51
>>841
>>842

ふつうファイルに書いてよみこませるよ。
845山崎渉:03/04/17 15:37
(^^)
846ミ・д・ミ:03/05/08 01:43
保守。
昔、Prologで記述されたConcurrent Prologが、
bit誌に3ページくらいの大きさで紹介されてた。
当時は第五世代コンピュータがにぎやかな時代で、
ストリームベースの並列オブジェクト指向プログラミングを
実際に手元で動かせることに感動して夢中になって触っていた。
その後、就職先で制御系のシステム設計を担当したけど、
ガードや有限バッファ制御の概念は役に立ったと思う。
848デフォルトの名無しさん:03/05/17 00:45
prologを極める殊によって、日常業務で何か役に立った事って、
ありますか。仕様の矛盾に気付きやすくなったとか?
849山崎渉:03/05/22 04:43
━―━―━―━―━―━―━―━―━[JR山崎駅(^^)]━―━―━―━―━―━―━―━―━―
850デフォルトの名無しさん:03/05/28 00:11
文字列のソートってどうやったらできるんでつかね?
|?- moji_order([monar,age,giko],X).

X=[age,giko,monar]?

yes

ってかんじで。内部で使いそうなクイックソートは
実装したんですけどね。
quick( [X | Xs], Ys ) :-
partition( Xs, X, Littles, Bigs ),
quick( Littles, Ls ),
quick( Bigs, Bs ),
append( Ls, [X | Bs], Ys ).
quick( [], [] ).

partition( [X | Xs], Y, [X | Ls], Bs ) :-
X =< Y, partition( Xs, Y, Ls, Bs ).
partition( [X | Xs], Y, Ls, [X | Bs] ) :-
X > Y, partition( Xs, Y, Ls, Bs ).
partition( [], Y, [], [] ).

append( [], X, X ).
append( [X | L], Y, [X | Z] ) :- append( L, Y, Z ).
1文字ずつのソートじゃなくて、単語でソートってところが分かりません。
誰か分かる方いらっしゃいます?
name/2で文字コードのリストに分解すればいいやん
852山崎渉:03/05/28 12:33
     ∧_∧
ピュ.ー (  ^^ ) <これからも僕を応援して下さいね(^^)。
  =〔~∪ ̄ ̄〕
  = ◎――◎                      山崎渉
853デフォルトの名無しさん:03/05/28 20:28
あげとこ

http://www.swi-prolog.org/
May 27, 2003 Released SWI-Prolog 5.2.0, consolidating multi-threaded execution, many fixes and new libraries distributed in the 5.1.x beta series.
prolog って普通の(っていうと語弊があるか)プログラム書けるんですか?
例えばマルチメディア系とかネットワークとか。
まあかけんことはないがな
http://www.swi-prolog.org/packages/xpce/sc_draw.html
>>854
プッ
857デフォルトの名無しさん:03/07/07 19:37
これおもしろそう。
帰納論理プログラミングと関係データベースのSQLによる連結
http://bruch.sfc.keio.ac.jp/Ilp/ilp_rdb/ilp_rdb.html

Progol って使ってるひといるかな?
↓ここからダウンロードできます。
ftp://ftp.cs.york.ac.uk/pub/ML_GROUP/
858山崎 渉:03/07/15 10:04

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄
age
全然関係ない話ですが、
人生にバックトラックがあったらなぁって思ったことはありませんか?
もっと効率のいい探索方法の方がいいと思うぞ。
oracle。これ最強。
まあ素人はheuristicsから学んでおけってこった。
バックトラックがあったとしてどこまでさかのぼれば
勝ち組みと言うパターンにマッチさせることができるのかが
問題だ
864山崎 渉:03/08/02 02:28
(^^)
865山崎 渉:03/08/15 16:51
    (⌒V⌒)
   │ ^ ^ │<これからも僕を応援して下さいね(^^)。
  ⊂|    |つ
   (_)(_)                      山崎パン
なにをするの?
867デフォルトの名無しさん:03/09/29 16:54
これはバグですか?
SWI-Prologで、ファイルをconsultしてからlisting(member)とするとNoになる。
member以外の組み込みでも同様。
ただし、SWI-Prolog起動後にlisting(member)としてYesが返ってから
ファイルをconsultしてlisting(member)とすると、正常に表示される。

つまり、ファイルをconsultすると組み込みが使えなくなってしまう。
しかし、consult以前に組み込みを呼び出していた場合、問題は起きない。
868デフォルトの名無しさん:03/09/29 19:34
>>867
自己レスです。
どうやらファイルに
:- unknown(_,fail).
の記述があるのが原因のようです。
しかしどうしてこれが原因になるのでしょうか?
?- shuffle([a,b,c], S).
S = [b,a,c]

のようにリストをランダムにシャッフルするプログラムを作ったのですが、
ソースが以下のように異常に長くなってしまいました。
もっと簡単にする方法はないでしょうか?

shuffle_sub1([],[],[]).
shuffle_sub1([A|L],X,Y) :-
shuffle_sub1(L,X1,Y1),
(random(2) =:= 0 -> (X=[A|X1], Y=Y1);
(X=X1, Y=[A|Y1])).

shuffle_sub2(A,X,[],X,[A]) :- !.
shuffle_sub2(A,[],Y,[A],Y) :- !.
shuffle_sub2(A,X0,Y0,X,Y) :-
random(2) =:= 0 -> (X=[A|X0], Y=Y0);
(X=X0, Y=[A|Y0]).

shuffle_sub3([A|L],X,Y) :-
shuffle_sub1(L,X0,Y0),
shuffle_sub2(A,X0,Y0,X,Y).

shuffle([E],[E]).
shuffle(L,S) :-
shuffle_sub3(L,A,B),
shuffle(A,A1), shuffle(B,B1),
append(A1,B1,S), !.
870869:03/10/12 08:56
自己解決しました。
順列生成処理を応用すれば簡単に実現できることに気が付きました。
スレ汚しスマソ

select_nth(0,H,[H|L],L).
select_nth(N,E,[H|L],[H|R]) :-
    N > 0, N1 is N-1,
    select_nth(N1,E,L,R).

shuffle([],[]).
shuffle(Xs,[Z|Zs]) :-
    length(Xs,N),
    R is random(N),
    select_nth(R,Z,Xs,Ys),
    shuffle(Ys,Zs), !.
871デフォルトの名無しさん:03/10/18 21:40
初心者な質問なんですけど、下のようにデータベースに同じ物
がある場合、birth(A,B) :- person(A, Y), person(B, Y).
としてbirth(Yoko,B)とするとTadashiが3回でますよね。これを回避
するにはどうしたらいいですか?一応リストにいれてマッチさせたり
してるんだけどうまくいかないので。

person('Tadashi', 1977).
person('Yoko', 1977).
person('Tadashi', 1977).
person('Naoki', 1977).
person('Tadashi', 1977).
なんで同じもんがあんだYO。setofあたりで誤魔化せば?
オブジェクト指向prologってないでつか?
>>873
ICOTが初期にやってたESPでは、節の空間を継承で木構造に整理できました。
これをもってICOTはESPを「オブジェクト指向Prolog」と称していました。
でもオブジェクト指向の他の側面、たとえばカプセル化の概念は
とりこんでたんだっけかな...

ESPの初期だけしかみてないので、後は詳しい人続けて↓↓↓
>>873 ありますがなにか?
876875:03/10/25 21:05
うぐぅ、874読んでなかった。
877874:03/10/27 13:28
おーい、詳しい人まだぁ〜?(AA略

ICOTのことでいぢめたりしないから、おねがい来て〜(はぁと
878ミ・д・ミ:03/10/27 22:25
秋葉のLAOXの書籍コーナー移転・縮小で
AI系の本が消えた・・鬱
879デフォルトの名無しさん:03/10/28 01:47
非手続き型(バックトラックつき?)オブジェクト指向言語
ってないでつか。ちょいとしたもんつくるにはいいんじゃないかと
おもってるんだけど。
880デフォルトの名無しさん:03/11/01 23:46
881デフォルトの名無しさん:03/11/02 02:18
>>880

なんじゃこれ。
どんなもんかはわからんが

>これはUniversal Representation Aimed Novel Uranus
>System というリカーシヴな名前になっている。

ここで萎えた。。誰か代わりに読んで
883デフォルトの名無しさん:03/11/03 00:07
多重世界機構は面白い。そしてLispとPrologのハイブリッドという感じもあり。
述語論理の中に関数的な記述もできる。
884GO MAXIMA:03/11/03 21:21
>>880
でも [times 2 3] はエラーやし 動いてない部分が多いんじゃない?
有限群論をのっけようかと すこしいじったけどまだ無理みたい。
>883 動けば面白いだろうがね。
885デフォルトの名無しさん:03/11/03 23:27
Uranus V-19.8 on GCL

:(* 2 3 *x)
(* 2 3 6)
:(+ 1 2 3 4 5 *x)
(+ 1 2 3 4 5 15)
:(with Japanese (assert (first-number ichi)))
(with English (assert (first-number one)))
(with French (assert (first-number un)))
:(with english (first-number *x))
(WITH ENGLISH (FIRST-NUMBER ONE))

:(with w0 (assert (thing *x) (bird *x))
(assert (bird *x) (canary *x))
(assert (bird *x) (penguin *x))
(assert (canary Tweety))
(assert (penguin Fred)))
(with w1 (deny (fly *x)))
(with w2 (assert (fly *x) (bird *x)))
(with w3 (deny (fly *x) (penguin *x)))

:(with w0 (with w1 (with w2 (with w3 (fly Tweety)))))

(WITH W0 (WITH W1 (WITH W2 (WITH W3 (FLY TWEETY)))))
:(with w0 (with w1 (with w2 (with w3 (fly Fred)))))

NIL
:
886デフォルトの名無しさん:03/11/03 23:36
松葉崩しを体得したいのですが教えてもらえますか?
887デフォルトの名無しさん:03/11/04 00:06
(assert (perm () ()))
(assert (perm (*x . *y) *z) (perm *y *w) (insert *x *w *z))
(assert (insert (*x () *x)))
(assert (insert *x *y (*x . *y)))
(assert (insert *x (*y . *z) (*y . *w)) (insert *x *z *w))
(assert (quicksort *x *y) (qsort *x *y ()))
(assert (qsort () *y *y))
(assert (qsort (*x1 . *x2) *y1 *y2)
(partition *x1 *x2 *u1 *u2)
(qsort *u1 *y1 (*x1 . *u3))
(qsort *u2 *u3 *y2))
(assert (partition *x () () ()))
(assert (partition *x (*y . *z) (*y . *u1) *u2)
(>= *x *y)
(partition *x *z *u1 *u2))
(assert (partition *x (*y . *z) *u1 (*y . *u2))
(< *x *y)
(partition *x *z *u1 *u2))
(defun rand-sequence (n)
(if (= n 0)
'()
(cons (random 100) (rand-sequence (- n 1)))))
(assert (test *n) (eval (rand-sequence *n) *x) (time (quicksort *x *y)) (print *y))
:(test 1000)
real time : 3.600 secs
run time : 3.600 secs
(0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 5 5 5 5 5 6 6 6 6 6 6 6 6 6 7 7 7 7 7 8 8 8 8 8 . ?)
(TEST 1000)
>間違ったプランにより生成された世界は後で消せばよい。
>時系列と概念・・( ´・ω・`)
889GO MAXIMA:03/11/04 00:48
>>885 >>887
何かコンパイルに失敗していたみたいで、ファイルを再展開して
コンパイルし直したら動いた。ありがとう。
かなり面白そうだ。
890885,887:03/11/04 17:49
>>889
お役に立てて何よりです。
制約論理プログラミング考えてるんだけど、
代表的な処理系ってある?
Prolog処理系作ろうかと思っているのですが、参考になるような
最低限のセットないでしょうか?
893デフォルトの名無しさん:04/01/17 02:09
a
GO MAXIMAさん、こんなところにも顔出してるのか。
良コテの鏡のような人だからな。マジで尊敬してます。
895デフォルトの名無しさん:04/01/20 14:30
GNU hosh
896デフォルトの名無しさん:04/01/21 01:15
A . G . E .
897デフォルトの名無しさん:04/02/16 05:06
a
898デフォルトの名無しさん:04/02/16 08:11
人工知能の現状を知るべし
http://page.freett.com/intteliart/index.htm
PrologとXMLって関係深いですか?
全然
最近は「全然あり」と言う語法もあるんだが・・・
"全然あり"じゃなくて単に"全然"と言ったらどっちを指すかは暗黙の了解。

 prolog処理系をc等の他の言語で1から記述するには、どのような処理をさせたら良いか悩んでいます。
 というのも、これから勉強をかねて自分用に安易なオリジナルの言語を記述する気になりましたが、その前にどうしてもprologがどの様に処理されているのか気になってしようがないからです。
 prolog自体のコーディングはある程度わかるのですが、それがどのように処理されているのか推測できません。
 私の場合、cやpascal等であれば、形態素解析の後、文法解析を行って、アセンブラへの変換をこつこつ記述して試していくという方向性で納得してますが、prologの場合、形態素解析の後、文法解析を行ってもその後の処理のイメージが想像できあせん。
 prologの設計経験のある方がここを知っているのか、しかも、読んでいるのかさへも疑問ですが、コメントをいただけると幸いです。
経験のない方でも、コメントなりアドバイスが頂ければ嬉しく思います。
 よろしくお願いいたします。

だまされたと思って適当なLispの教科書読んでみ。
905デフォルトの名無しさん:04/03/09 23:19
> 903
素直にswi-prologや、g-prologのソースを落として、解析すれば
いいだけのような気がする。
データ型やアルゴリズムの考え方はLISPとよく似ているから
LISP勉強するのが結局早かったり。
>>903
レゾリューションは分かっているのか?
908903:04/03/10 08:29
>>906
>データ型やアルゴリズムの考え方はLISPとよく似ているから
> LISP勉強するのが結局早かったり。
そうですね。LISPだと簡単にprologがコーディングできますからprologでなくてもLISPの仕組みでも私の目的には合ってそうです。

>>905
>素直にswi-prologや、g-prologのソースを落として、解析すれば
> いいだけのような気がする。
> >素直にswi-prologや、g-prologのソースを落として、解析すれば
> いいだけのような気がする。
そうですね、今までの私はそれが面倒で避けていましたが、これからは頑張って並行してソースも見ていきます。ついでに中間言語に落とす方法とそれを使った高速化も解って面白そうですし。

>>907
>レゾリューションは分かっているのか?
いえ、(今通勤中なので)後で言葉の意味を調べてみます。(言葉は分かりませんが原理を知っていると良いのですが)

>>904
>>905
>>906
>>907
皆さんありがとうございます。
また、ご意見・コメントなど有りましたらよろしくお願いいたします。
909903:04/03/10 09:00
すいません
>>908
で、1部引用に失敗してました。

(武蔵野線が止まって時間が空いてしまいまいた。ちょうど良いのでlispの方もちょっと読んでみます。)
じゅん for Java に入っている sra.jun.goodies.prolog なんかコンパクトで読みやすいんじゃないだろうかttp://www.sra.co.jp/people/nisinaka/Jun4Java/index_ja.html
911デフォルトの名無しさん:04/04/15 13:38
プロローグについて質問です。
SWI-Prologのplwin Version5.2.13でプログラムを組んでいます。
atomに重複があれば最初のatomは残して後ろの重複したatomは消す、という
プログラムを作りたいのですが…できません。

動作は
remdup([a, b, c, a, d, c], X).

X=[a, b, c, d]
となるはずです。

本に載っていたのを試したのですが
順番が逆になってしまいます。↓

remdup(L, M) :- dupacc(L, [], M).
dupacc([], A, A).
dupacc([H|T], A, L) :- member(H, A), dupacc(T, A, L).
dupacc([H|T], A, L) :- dupacc(T, [H|A], L).

結果:
1 ?- remdup([a, b, c, a, d, c], X).
X = [d, c, b, a]

reverse()を「使わずに」どうにか完成させたいのですが
できますでしょうか?
ちなみにmember()やappend()、atomp()、listp()、last()など基本的な関数は既に作りました、
ですからそれらは使えます。
どうかお助けください。m(__)m
どうして reverse() を使いたくないの?
>>911
dupacc([H|T], A, L) :- dupacc(T, [H|A], L).

dupacc([H|T], A, L) :- append(A, [H], X), dupacc(T, X, L).
に変更する。

遅くなると思うが。
914911:04/04/16 04:54
出来ましたっ!
最初の結果の後";"を押していくと
どの順番で重複が消されたのかまで分かるおまけ付きです。
僕も人を助けられるようになりたいです。もっと勉強します。
913さん、カコイイ!!
ありがとうございました!
>>911

remdup(L,M) :- remdupdiff(L, M, M).

remdupdiff([], DH, DT) :- DT=[].
remdupdiff([H|T], DH, DT) :- memberdiff(H, DH, DT),!,remdupdiff(T, DH, DT).
remdupdiff([H|T], DH, DT) :- DT=[H|NewDT], remdupdiff(T,DH,NewDT).

memberdiff(E, DH, DT) :- DH==DT,!,fail.
memberdiff(E, [H|T], DT) :- E=H,!.
memberdiff(E, [H|T], DT) :- memberdiff(E, T, DT).
916911:04/04/27 01:00
>>915

こちらのヴァージョンも動きました。
どのように動作しているかを理解するのは僕にはまだ難しいです。
こちらは一発で[a b c d]を導き出すのですね(";"を押すとすぐにNoでExitです)。
将来どうしてもPrologの知識が必要となるのでこれからもっと勉強します。
ありがとうございました。
917デフォルトの名無しさん:04/05/10 11:41
すみません、
prime(N) っていうファンクションで、N以下の全ての素数を入れたリスト
を返すのってどうやればいいのでしょうか???
突然つまづきました。。
>>917
Prologの話ですよね?
?-prime(N).
というゴールは、失敗するか成功するかのどちらかで、
CやLispの関数のように値(ここではリスト)は返せませんよ。

多分、
primeList(N,List) ; N以下の全ての素数を入れたリストがListなら成功
のような述語を定義して、
?-primeList(100,List).
のような使い方をするのがPrologっぽいと思います。このゴールは成功して、
ついでにListに何か値が割り当てられて(unifyされて)終わるはずです。

Nが素数かどうか判定するには、√Nまでの自然数で割り切れるか調べれば
十分と知られています。だから、1〜√Nまでの自然数の倍数を全部取り除けば、
N以下の素数のリストができあがります。これをリスト操作に翻訳すればOK。
prime(X) :- prime1(X,2).

prime1(X,I) :- I*I =< X,
X mod I =\= 0,
I1 is I+1,
!, prime1(X,I1).
prime1(X,I) :- I*I =< X,
X mod I =:= 0,
!, fail.
prime1(X,I) :- I*I > X.

prime_list(N,L) :- prime_list1(2,N,L).

prime_list1(I,N,L) :- I =< N,
prime(I), L=[I | L1],
I1 is I+1,
!, prime_list1(I1, N, L1).
prime_list1(I,N,L) :- I =< N,
I1 is I+1,
!, prime_list1(I1, N, L).
prime_list1(I,N,L) :- L=[].
920919:04/05/11 02:12
字下げが全部消えてる・・・。
921GOD-:04/06/09 23:18
ちょっと考えてみ!

?- flat([[a,[b,c],[d]],e,[f,[g,f]]]).

[a,b,c,d,e,f]

と出力するflat.
!(バックトラック)とappend使うらしい・・。
922デフォルトの名無しさん:04/06/12 19:50
述語をリスト構造で取得する述語ってありますか?

listing(hoge).だとhogeのプログラムが表示されますよね。表示じゃなくてプロ
グラムを取得したいので。
923922:04/06/12 19:50
SWI-Prologを使ってます。
924デフォルトの名無しさん:04/06/12 21:09
>>922
プログラム内での述語→リスト変換なら、
X =.. f(a,b)で
(見えづらいが =.. イコールのあとにピリオド二つ)
Xに [f, a, b]がユニファイされる。
925デフォルトの名無しさん:04/06/12 21:15
>>924
間違えた。
述語=..リストだった。
正しくは f(a,b)=..X で
Xに [f, a, b]が入る
926924:04/06/13 00:48
いや、意味が違いましたね。
ファイルの入出力なら
http://www.geocities.co.jp/SiliconValley-Oakland/1680/prolog/prolog13.html
が分かりやすい
927922:04/06/25 19:04
>>924
サンクスです。
functorを使えばよかったみたいです。

今度は、変数名から値を取得する述語を探してますが、
ありますか?
928デフォルトの名無しさん:04/06/28 16:01
>>927
集合述語findallやbagofを使えば、変数に入るすべての解をリストに
集めることが出来ます。
例:
parent(tom, ann).
parent(tom, john).
があったとき
findall( X, parent(tom, X), L).
により L=[ann, john] となる
929デフォルトの名無しさん:04/06/28 19:05
>>928
( ・∀・)つ〃∩ ヘェーヘェーヘェーヘェーヘェー

その述語、どの処理系にもあるの?
とりあえずSICSTUSとBは明日試してみよう。
パターンマッチとバックトラックによるprologの実行過程と,
導出原理による充足性の判定アルゴリズムがうまく結び
つけられずにいます.

prologの実行において導出原理はどこで使われているの
でしょうか?
>>930
,
932デフォルトの名無しさん:04/07/09 18:36
2000年に生まれたスレなので記念カキコ
?-ぬるぽ.
ガッ
no
|
課題でProlog使うことになったんだが、なんだこれは。
Cとかしかやったことないから、なんだか新鮮だよ。
よし、勉強してくる!
936デフォルトの名無しさん:04/09/11 00:18:47
ところでprologってさ・・・何が出来るの?
身近で活躍しているprologのプログラムって何かあるのかな?
937デフォルトの名無しさん:04/09/13 09:20:08
>>936
SQL
938デフォルトの名無しさん:04/09/13 10:17:20
>>937
???
939デフォルトの名無しさん:04/09/13 11:49:40
 test
940デフォルトの名無しさん:04/09/13 11:50:00
test 
941デフォルトの名無しさん:04/09/13 11:50:42
 test
942デフォルトの名無しさん:04/09/13 11:52:18
test 
>>936
お前の身近ってどこよ? (w

あんまりないんじゃない?
アルゴリズムが固まってしまうと、解探索を言語に依存しないで、
他の言語で自分で書いた方が速くなるから。
アルゴリズムの研究する時は便利だけども。
944774:04/09/17 15:33:38
BPrologにおいて、Cのincludeでbprolog.hを要求されるのですが、
どこにもありません。
どこかに落ちているものなんでしょうか。
945デフォルトの名無しさん:04/09/22 10:03:59
誰か助けてください!両替の問題を解いてください.
?- ryougae([24, 11, 3], 27, X).とすると
X=[1, 0, 1]
X=[0, 0, 9] 
と答える述語を書いてください.
prolog始めて3週間で出た学校の課題です><;
946デフォルトの名無しさん:04/09/22 10:32:56
宿題は自分でやらないと意味ないよ。
947デフォルトの名無しさん:04/09/23 19:33:19
ryougae([24, 11, 3], 27, [1, 0, 1]).
ryougae([24, 11, 3], 27, [0, 0, 9]).
948デフォルトの名無しさん:04/10/06 14:58:45
変数の中身がスペースで区切られたものをリスト化することが出来る関数は無い?
A = 'a b c d e'

B = [a,b,c,d,e]
みたいに。
949デフォルトの名無しさん:04/10/06 16:07:49
あげ
950デフォルトの名無しさん:04/10/06 20:14:36
とても素人っぽいsplit。

split(A, B) :- name(A, X), split2(X, B, []).

split2([], [], []) :- !.
split2([], [D], C) :- !, name(D, C).
split2([32|T], R, []) :- !, split2(T, R, []).
split2([32|T], [D|R], C) :- !, name(D, C), split2(T, R, []).
split2([H|T], R, C) :- !, append(C, [H], D), split2(T, R, D).

玄人のスマートな解答を希望。
951デフォルトの名無しさん:04/10/08 19:48:38
Prologを始めたばかりなんですが、今悩んでる問題があります。

【問題】
3点(X1,Y1), (X2,Y2), (X3,Y3)の座標が与えられたとき,その3点を直線で結ぶと三角形になるという
関係san(X1/Y1, X2/Y2, X3/Y3)がある。

?- san(0/0,4/0,4/3). → yes
?- san(0/0,5/5,3/3). → no

という問題です。
座標の位置関係を記述することができればいいのではないかと考えているのですが、
分かりません。
誰か解いてもらえませんか?お願いしますm(_ _)m
952デフォルトの名無しさん:04/10/08 20:58:38
三角形にならない場合を考えよう。
それは3点が一直線上にあるときのみ。3点が一直線にあるなら、
一つの点から別の2点へ向かう2つのベクトルが張る面積がゼロ。
つまり内積がゼロ。

っていう論理をPrologの節にエンコードすればいいじゃんか。
953デフォルトの名無しさん:04/10/08 21:12:53
triangle_ineq(A, B, C) :- A + B > C.
distance(X1, Y1, X2, Y2, D) :- D is sqrt((X1 - X2) ** 2 + (Y1 - Y2) ** 2).
is_triangle(X1, Y1, X2, Y2, X3, Y3) :-
distance(X1, Y1, X2, Y2, A),
distance(X2, Y2, X3, Y3, B),
distance(X3, Y3, X1, Y1, C),
triangle_ineq(A, B, C),
triangle_ineq(B, C, A),
triangle_ineq(C, A, B).

ところで、
> 関係san(X1/Y1, X2/Y2, X3/Y3)がある。
ここのスラッシュはどういう意味?
954デフォルトの名無しさん:04/10/08 22:03:58
>>952
なるほど。内積を使うのか。
目から鱗というか、気づかなかった自分が情けない。



…って。内積が0なら直角三角形じゃないですか。
外積だよね。
955デフォルトの名無しさん:04/10/11 03:31:50
>>953

> 関係san(X1/Y1, X2/Y2, X3/Y3)がある。
>ここのスラッシュはどういう意味?

951ではないが、レスする。

スラッシュは本来、変数間の除算を表す記法。
ただし、数式として評価しなければ、単なる
データ構造を構成する記号の中間記法になる。
X1/X2は /(X1,X2)と同じ。 Z is X1/X2とかすると除算を実行する。

このプログラムでは point(X1,X2)とかにした方がいいと思う。


956デフォルトの名無しさん:04/10/11 09:46:53
>>955
そういうことでしたか。
ありがとうございます。
957デフォルトの名無しさん:04/10/11 13:38:59
>>950
おお、動きました。
遅くなりましたがthx.
958デフォルトの名無しさん:04/10/17 21:52:07
>>948
> 変数の中身がスペースで区切られたものをリスト化
atom_chars/2 を使って、結果のリストからスペースの分を除くのはどう?
959デフォルトの名無しさん:04/10/24 21:44:45
今prologを実習してるんですけど全然わかりません
リストの辺りでボロボロです。
初心者はココを見ろ!的なHPありませんか?
960デフォルトの名無しさん:04/10/26 09:49:34
prologの前にLISPやっとけ
961デフォルトの名無しさん:04/11/01 23:47:02
初心者ですいません。
次のように二重になってるリストの中身を置換させる
述語の書き方がわかりません。

?-replace([a,[b,c],d],b,[e,f],X).
X=[a,[[e,f],c],d].

二重になってない場合ならわかったのですが…
その先にどうしても進めません。
どなたかよろしくお願いします。
962デフォルトの名無しさん:04/11/02 08:49:51
>>961
replace([],A,B,[]) :- !.
replace([A|T],A,B,[B|C2]) :- !, replace(T,A,B,C2).
replace([H|T],A,B,[C1|C2]) :- !, replace(H,A,B,C1), replace(T,A,B,C2).
replace(A,A,B,B) :- !.
replace(D,A,B,D) :- !.

とても雑なので,参考程度に.
963961:04/11/02 12:33:24
>>962
ありがとうございました!
964デフォルトの名無しさん:04/11/05 19:29:18

算術式を入力して、それが算術式かどうか判定するプログラムを作りたいのですが
うまくいきません。教えていただけないでしょうか?


aexp( 5+7*8 ).
yes
みたいなのを。
算術式は、とりあえず、整数と、変数の+,-,*を考えています。

/*自分がかんがえたもの */

aexp(X):-number(X)
aexp(X);-var(X).
aexp(X1*X2):-aexp(X1), aexp(X2).
aexp(X1+X2):-aexp(X1), aexp(X2).
aexp(X1-X2):-aexp(X1), aexp(X2).


965デフォルトの名無しさん:04/11/05 19:54:09
>>964
若干修正してみた。

aexp(X):-number(X).
aexp(X):-atom(X).
aexp(X1*X2):-aexp(X1), aexp(X2).
aexp(X1+X2):-aexp(X1), aexp(X2).
aexp(X1-X2):-aexp(X1), aexp(X2).
966デフォルトの名無しさん:04/11/05 21:49:41
すばいやい、回答ありがとうございます。
967デフォルトの名無しさん:04/11/11 23:50:41
Prolog ではまったり
968デフォルトの名無しさん:04/11/12 17:24:50
member(X,[X|Y]).
member(X,[Y|Z]) :- member(X,Z).

remove(X,[X|Rest],Rest).
remove(X,[Y|Rest],[Y|L]):- remove(X,Rest,L).

member(),remove使って、setsubst(L1,L2,L3)
L2のリスト要素から、L1のリスト要素を取り除いた結果がL3
という述語ってどう書けばいいのでしょうか?
969デフォルトの名無しさん:04/11/12 19:24:54
setsubst([],L,L) :- !.
setsubst([H|T],L2,L4) :- member(H,L2),remove(H,L2,L3),setsubst([H|T],L3,L4),!.
setsubst([_|T],L2,L3) :- setsubst(T,L2,L3),!.

効率が良いかはわからないが、指定通りmember,removeを使ってみた。
970968:04/11/12 19:47:50
!があまりよくわかってないので、!の使いどころでハマッってました。
あとで、試してみます。
ありがとうございました。
971968:04/11/13 14:54:32
setsubst([1,2],X,[3,4])を実行したところ、無限ループになってしまいました。
setsubst([f(X,Y),f(Z,W)],[f(a,b),f(c,d),g(e,f),f(i,j)], Result).
では、Result=[f(a,b),g(e,f)], [f(c,d),g(e,f)], [g(e,f),f(i,j)]
という結果を期待したのですが、一通りしか返ってきませんでした。
うーむ、どうすればいいのやら。。。
972デフォルトの名無しさん:04/11/14 00:15:31
>>971
複数の解を期待するなら、 cut しちゃだめでしょ。
973デフォルトの名無しさん:04/11/15 20:54:16
[[7,1],[7,2],[7,3],[6,1],[6,2],[6,3],[5,1],[5,2],[5,3],[4,1],[4,2],[4,3],
[3,1],[3,2],[3,3],[2,1],[2,2],[2,3],[0,1],[0,2],[0,3]]

というリストがあるのですが、これを

@[[0,1],[2,1],[2,2],[2,3],[3,1],[3,2],[3,3],[0,2],[4,1],[4,2],[4,3],
 [5,1],[5,2],[5,3],[0,3],[6,1],[6,2],[6,3],[7,1],[7,2],[7,3]]

という順序にしたいのです。

A[[0,1],[0,2],[0,3],[2,1],[2,2],…,[7,2],[7,3]]

という場合は、クイックソートの考え方で並べ替えることができました。
しかし、@の場合だと…
どなたかよろしくお願いします。
974デフォルトの名無しさん:04/11/15 21:17:54
意味がわからない
975デフォルトの名無しさん:04/11/16 09:51:22
語彙解析
 単語の品詞と意味の表を用意し、スペースで区切られた単語列
を一行読み込み、各単語にその品詞名と意味を付けたリストにする
プログラムを教えてください
976デフォルトの名無しさん:04/11/16 17:00:58
語彙解析(_文字列,_辞書付き語彙ならび):-
  atom_chars(_文字列,_文字ならび),
  辞書付き語彙ならび(_文字ならび,_辞書付き語彙ならび).
辞書付き語彙ならび([],[]) :- !.
辞書付き語彙ならび([A|R],R2):-
  区切り文字(A),
  辞書付き語彙ならび(R,R2),!.
辞書付き語彙ならび([A|R],[[_語彙,_品詞,_語意]|R2]) :-
  区切り文字(A),
  辞書付き語彙ならび(R,R2),!.
辞書付き語彙ならび([A|R],[[_語彙,_品詞,_語意]|R2]) :-
  \+(区切り文字(A)),
  語彙の切り取り([A|R],_語彙の文字ならび,R3),
  concat_atom(_語彙の文字ならび,_語彙),
  辞書(_語彙,_品詞,_語意),辞書付き語彙ならび(R3,R2),!.
語彙の切り取り([],[],[]) :- !.
語彙の切り取り([A|R],[A|R2],R3) :-
    \+(区切り文字(A)),語彙の切り取り(R,R2,R3),!.
語彙の切り取り([A|R],[],R) :- 区切り文字(A),!.
区切り文字(' ').
辞書(prolog,[名詞],[みればわかるもの]).
辞書(run,[動詞],[歩くことと同義]).
語彙のリストを作り上げてから、改めて辞書引きするのが普通ですが
再帰的な述語の構造をはっきりさせるため、中に入れました。
977デフォルトの名無しさん:04/11/16 22:08:16
ごめんなさい。下のところ間違ってました。訂正。
辞書付き語彙ならび([A|R],R2) :-  /* ←ここです */
  区切り文字(A),
  辞書付き語彙ならび(R,R2),!.
辞書付き語彙ならび([A|R],[[_語彙,_品詞,_語意]|R2]) :-
  \+(区切り文字(A)),
  語彙の切り取り([A|R],_語彙の文字ならび,R3),
  concat_atom(_語彙の文字ならび,_語彙),
  辞書(_語彙,_品詞,_語意), /* ←改行入れました */
  辞書付き語彙ならび(R3,R2),!.
978折れ目も:04/11/17 00:37:51
979デフォルトの名無しさん:04/11/17 07:53:28
980デフォルトの名無しさん
>975 これでどうです。
語彙解析(_文字列,X):-atomic_length(X,Length),語彙解析(_文字列,1,1,0,Length,X).

語彙解析(_文字列,_,Start,W,Length,[]):-Start > Length,W=0,!.
語彙解析(_文字列,Start0,Start,W,Length,[[_語彙,_品詞,_語意]]):-
  Start > Length,W > 0,
  atom_part(_文字列,Start0,W,G),
  辞書(_語彙,_品詞,_語意),!.
語彙解析(_文字列,Start0,Start,W,Length,[[_語彙,_品詞,_語意]|R]):-
  atom_part(_文字列,Start,1,A),区切り文字(A),W>0,
  atom_part(_文字列,Start0,W,G),
  辞書(_語彙,_品詞,_語意),
  Start2 is Start+1,
  語彙解析(_文字列,Start2,Start2,0,Length,R),!.
語彙解析(_文字列,Start,Start,W,Length,X):-
  atom_part(_文字列,Start,1,A),
  区切り文字(A),W=0,
  Start2 is Start+1,
  語彙解析(_文字列,Start2,Start2,0,Length,X),!.
語彙解析(_文字列,Start0,Start,W,Length,X):-
  atom_part(_文字列,Start,1,A),
  \+(区切り文字(A)),
  Start2 is Start+1,W2 is W+1,
  語彙解析(_文字列,Start0,Start2,W2,Length,X),!.