新スレおめでとうございます。
まったりしてきた
以下の住所に関する事実
address([bitdiddle, ben], [slumerville, [ridge, road], 10]).
address([hacker, alyssa, p], [cambridge, [mass, ave], 78]).
address([fect, cy, d], [cambridge, [ames, street], 3]).
address([tweakit, lem, e], [boston, [bay, state, road], 22]).
address([reasoner, louis], [slumerville, [pine, tree, road], 80]).
address([warbucks, oliver], [swellesley, [top, heap, road]]).
address([scrooge, eben], [weston, [shady, lane], 10]).
address([cratchet, robert], [allston, [n, harvard, street], 16]).
address([aull, dewitt], [slumerville, [onion, square], 5]).
から、各々近場にいる人について述べる述語livesNearを作りたいのですが、
livesNear(Person1, Person2) :- address(Person1, [Town|Rest1]),
address(Person2, [Town|Rest2]),
not(same(Person1, Person2)).
こう作ってしまう場合、livesNear(P,Q)と問い合わせをすると(Aさん,Bさん)
という組み合わせと、(Bさん、Aさん)という入れ替えたものの2つが重複
して出てくることになります。
重複しないようにするにはどうすればいいでしょうか。
sameという述語の定義は
same(X,X).
です。
>>8 p(a).
p(b).
の述語定義がされているとします。
?- p(X),p(Y),not(X=Y).
X = a,
Y = b;
X = b,
Y = a;
no
の重複を回避する方法はありません。重複を回避するには、最初から、
p/1でなく、p/2を
p(1,a).
p(2,b).
のように定義して、
?- p(N1,X),p(N2,Y),N1<N2.
N1 = 1,
X = a,
N2 = 2,
Y = b;
no とするのが一案。
述語p/1のままだと、
組合せ(X,1,[A]) :- member(A,X).
組合せ([A|Y],N,[A|X]) :- N > 1,M is N - 1,組合せ(Y,M,X).
組合せ([_|Y],N,A) :- N > 1,組合せ(Y,N,A).
?- findall(U,p(U),L),組合せ(L,2,[X,Y]).
が考えられます。
「重複しない」という事の意味が漏れには分からない。というか課題の定義が曖昧だと思う。
述語livesNear/2の意味は「Person1の近場にPerson2が住んでいる」だよね?
もしそうなら「Aさんの近場にBさんが...」と「Bさんの近場にAさんが...」という
「重複した」結果こそ正しいと思う。両者の間には双方向な関連があるのだから。
もし問い合わせが livesNear('Aさん', P) あるいは livesNear('Bさん', P) だとしたら、
「重複しない」という述語定義に対して、
>>8 はどんな結果を期待するのだろうか。
>>10 どうもありがとうございます。数字と対応づけしないといけないんですか。
>>11 主として、これは疑問文として使用します。
叙述としては、確かに(Aさん、Bさん)、(Bさん、Aさん)とは
同格として扱うべきですが、疑問文として、
「この住所録の中の人物の中で、お互いに近くに住んでいる人たちは、
誰と誰ですか?」
という問の回答として、「AさんとBさん、あと、BさんとAさんです。」は、
不自然です。
なんとかできました。
map([bitdiddle, ben], 0).
map([hacker, alyssa, p], 1).
map([fect, cy, d], 2).
map([tweakit, lem, e], 3).
map([reasoner, louis], 4).
map([warbucks, oliver], 5).
map([scrooge, eben], 6).
map([cratchet, robert], 7).
map([aull, dewitt], 8).
と対応をつけた上で、
livesNear(Person1, Person2) :- address(Person1, [Town|Rest1]),
address(Person2, [Town|Rest2]),
map(Person1,Number1),
map(Person2,Number2),
Number1 < Number2.
としました。
>>11 です。
では、質問の意図は「(近場に住む人同士における)関連の存在」を質問しているのではなく、
「(近場に住む人々を)列挙する」ことにあると考えていいのかな?(回りくどくてゴメソ)
もしそうであれば、近場に3人以上の人が住んでいるケースでは、リストを使わないと
列挙できないから、問い合わせは livesNear(P,Q) ではなく、以下のようなコードになる。
findAllLivesNear(People) :-
!,
findall(Town, address(_, [Town|_]), Towns),
reject_duplicates(Towns,T), % 重複している要素を取り除く
findAllLivesNear(T, People).
findAllLivesNear([], []) :- !.
findAllLivesNear([T|Town], [P|People]) :-
findall(Person, address(Person, [T|_]), P),
length(P, Length),
Length >= 2,
!,
findAllLivesNear(Town, People).
findAllLivesNear([_|Town], People) :-
!,
findAllLivesNear(Town, People).
% リロードするんだった.....orz
>>14 実行結果は以下のとおり。ご参考まで。
?- findAllLivesNear(P).
P = [
[[hacker, alyssa, p], [fect, cy, d]],
[[bitdiddle, ben], [reasoner, louis], [aull, dewitt]]
].
回答は「hackerとfect、あと、bitdiddleとreasonerとaullです」となって不自然さは無い。
この問題は?
例 2.2 7つの部屋がある。その内の4つの部屋を4人のプログラマの事務
室として割当て、残りの3つの部屋をコンピュータ端末機器を設置する
部屋としたい。このような割当て方は7×6×5×4=840通りある。
『組合せ構造とグラフ理論入門』C.L.リュー著 成瀬弘、秋山仁共訳 マグロウヒル好学社 p42
より、
さて、この840通りをすべて数え上げる非決定性述語を定義せよ。
まあ、こんな感じで「Prolog述語 1000Tips」を目指します。
>>18 1000分野、10000Tips行きましょう。
1/10000Tips
どんな情報源でもよいから、そらで覚えていれば勿論それでよいから、
和暦、西暦変換述語を作れ。
1/10000Tips
1/10000Tips
ジョギングシュミレーター(サイト)を参考にして、
体重、走行距離、タイムから、消費エネルギーと脂肪燃焼量を得る述語を
定義せよ。
>>18-
>>22 出典の記載ルール等を決めておかないといけない。
オブジェクト指向的な枠組みがないから、
述語で定義するとして、標準的な述語構成例が欲しい。
それから、問題を出すときは、
1/10000Tips (解答準備済み/解答準備未了)
等のコメントを入れて、未解決問題がスレに大量に残ることを避けよう。
解答準備済みで出題した人は様子を見て、良いタイミングで模範?解答を
載せるべし。
>>23 述語定義して公開するなると、著作権の問題が出てきます。
Prologの書籍50冊分の巻末参考文献を全部sortして述語として
公開するとする。私はその文献の内2%くらいしか目を通した
ことがない。それでも誰も文句をいわないだろう。ところが、
古川康一著「Prolog入門」の参考文献だけを述語定義して載せた
場合はどうなのか?これは問題になるかな。
httpd_status_code(100,'Continue','この応答はクライアントへの仮の応答です。多くの
場合、プロキシーやサーバーは、最終的な応答を返すまでにはまだ時間がかかる場合にこ
のコードを使います。'
httpd_status_code(101,'Switching Protocols','HTTP/1.1では現在は使われていません
が、準拠しているアプリケーションがUpgradeヘッダーに示される、より有利なプロトコ
ルや効果的なプロトコルに切り替えようとしていることを示します。').
httpd_status_code(200,'OK','全般的に成功したことを示します。').
httpd_status_code(201,'Created','このコードは、PUTリクエストへのレスポンスで用い
ることができるコードで、新しいリソースが作成されて利用可能であることを示します')
.
<以下略>
この述語の場合は、
http://www.amazon.co.jp/dp/4894710412/ からの
全コピーであることは明らかです。実際、Prolog述語はこういうのだらけ。
前スレにちょっとだけ著作権の話がでたと思うけど書物を写し取った述語の
公開できるのはどの範囲か。Webサイトの場合はどうか。
ちょっと話が逸れますが、
>>26の場合は10年近く前に本を傍らに置いて
タイプした。ところが今はこのくらいの情報はWebから入手できる。
そういう変化は、Prolog言語の意味をも決定的に変えたと思う。以前は
単位節データベースとルール節はある程度バランスを保っていたが、
現在では、99%以上が単位節、しかも
>>26に見られるように、将来の利用に
含みを残して、原文そのままを引数に取り込む。Prologの解説書で示される
開発手法やプログラミング事例とは全く違う。10000Tipsの狙いは、そういう
ことをはっきり示すことでもあります。
>>27 10000Tipsにしても、ここよりも日本Prolog協会のメーリングリストで提起する方が
相応しい課題ではないかな。
>>27 徹底して非形式的なデータ蒐集に努めるというのは面白いかも。
例えば、述語名が衝突したらその時点で何か解決策を捜す。
>>27 以前はPrologプログラムの開発時間はプログラマのタイプ時間に
近似していたのだが、最近は検索ルールを書く時間に近くなった
ことは確かだな。
31 :
デフォルトの名無しさん:2009/03/13(金) 11:34:02
Prologって結局、「とまり木言語」なのかも知れない。
最終的にはデータベースやXMLファイルとして振り分けられるでしょ。
考えてみればAI言語を標榜していた頃からずっとそうじゃないか。
32 :
デフォルトの名無しさん:2009/03/14(土) 05:55:59
>>32 書かない。負節は書くw
このスレでも強調されているように、結局Prologプログラミングは
member/2,append/3,findall/3の繰り返し。少し前に出てきた組合せ系
の述語などがライブラリ化していると、もうほとんどルールを書く
必要はない。負節のログに頭部を付加してライブラリに加えることは
ある。
以前は**コードなどの処理も書いたから、1342という口座番号を
'0001342'にするヘッドゼロサプライ処理などが文字列からparse_atom
する度に発生した。それで手続的決まり文句も随分と書いたが、10年
くらいまえに書き尽くした。
自動仕訳ルールの追加というようなことは日常的に発生するが、それも
銀行口座の明細から取得するような場合は、すでに形式化しているから、
単位節一節の追加だし、摘要的な記述からの場合もS,V,Oが確定すれば
ほぼ決定的になる。この場合、本体に2副目標を持つルール節を一つ追加。
ごめん。本体に1副目標を持つルール節一つを追加。でした。
36 :
デフォルトの名無しさん:2009/03/15(日) 17:48:02
>>33 むかしエキスパートシステムに書いたような簡単なif-thenルールなら、
今でも書くと思うけど。subgoalが1-3個くらいのやつ。
37 :
35:2009/03/16(月) 04:15:51
Oが複数でてくることもあり、やはり本体1副目標では決まらず
2~3副目標になることも多いようです。
38 :
デフォルトの名無しさん:2009/03/17(火) 07:43:36
頭痛がしてきた
39 :
デフォルトの名無しさん:2009/03/17(火) 07:45:42
1/10000Tips
一向に中身のあるTipは現れないw
初心者のための言語スレに誤爆してしまった
本でも読めば。
入門者です。前スレにでていたPrologで学ぶAIプログラミングを買ってみました。
二章のLHKあたりで既に挫折しそう…
>>8 > 重複しないようにするにはどうすればいいでしょうか。
最初見たとき
livesNear(P,Q), P @< Q
と書いて「いや、それはちょっと…」という反応を見たいと思ったのに規制のせいで
なるほど。でした・・・
>>44 この話題から外れるけれど・・
アトム(文字列)の大小比較は、集約(鍵)問題を扱ったとき場合を以外には、
実務的にあまり使う機会はなかったのですが、最近、古庄普二著 東大総研刊
「汎用超高速データベース処理技術 多様なデータ構造と超並列への普遍的アプローチ RealTimeVIDP」
を読んでPrologのデータ構造の中に値の順序性をもう少し取り入れる余地は
ないかなど気になっていた。
49 :
47:2009/03/28(土) 14:59:44
古庄晋二著でした
>>48 はっきり変だと思えるのは?_の扱い。関数ab、fb(束縛の追加と検索?)あたりでは
無名変数もどきというか、単一化されない扱いになってるんだけど、
実際には、?xなどのローカルな変数名をgensymで作ったグローバルな名前に
書き換えるとき、何も特別扱いされていないから、意味がないんじゃないかっていう。
そろそろSWI-Prolog Reference Manual の邦訳が欲しくなってきた。
SWI-Prologの動きが活発になってきて、参照機会が急に増えた。
こうなってくると、常に楽に参照できる「ベース」が欲しい。
精神力が異常。
53 :
デフォルトの名無しさん:2009/05/07(木) 08:08:13
prologで同じ解を出さないようにするにはどうするの?誰か教えて><
Prolog用語を整理しかけたら、変なことに気づいた。
ISO、JISではどうやら、
'' は null atom(空アトム)
[] は empty list(空リスト)
らしい。
null と empty の使い分けもまあ微妙だけど、もし
http://www.weblio.jp/category/computer/prolg が五十音順だとすると、ひょっとして
空(から)アトム
空(くう)リスト
と読み分けるんだろうか、という疑問が湧いたw
ISLISP (JIS X 3012) の訳語対照表では
「く」の位置に
空リスト empty list
空リスト null
とあるな。
ISLISP では null と empty list が同一視されるから、このような訳しかたを
選んだようだが。
57 :
デフォルトの名無しさん:2009/05/09(土) 10:54:13
prologでちょっと複雑なことさせようとするとプログラミングするのがかなり難しい><
これも慣れると簡単になるのだろうか
>>57 どのような部分で難しいと感じるか、教えてください。
できればソースプログラムを見せてください。
59 :
デフォルトの名無しさん:2009/05/10(日) 10:10:05
>>59 ソートはちょっと違うかも知れないけど・・・。
Prologのプログラミングはただひたすら、appendだけで
プログラムを書くつもりで行けばよい。
>>60 repeat.
repeat :- repeat. は
append([],X,X).
append([U|X],Y,[U|Z]) :- append(X,Y,Z).
実は同一パターン。
member(A,[A|_]).
member(A,[_|R]) :- member(A,R). は
?- ..., repeat, ... は ?- ..., append(_,_,_), ... でいけそうだが、
スタックオーバーフローを起こすだろうから実用にはならない。
member(A,L) :- append(L1,[A|L2],L). だから、
?- ... ,member(A,L), は ?- ... , append(_,[A|_],L), でよい。
member/2を使っていると、member/3
member(A,[A|R],R).
member(A,[_|R1],R) :- member(A,R1,R). や member/4が欲しくなる。
member(A,[],[A|R],R).
member(A,[B|R1],[B|R2],R) :- member(A,R1,R2,R). ここまでくると
引数の位置が違うだけでappend/3と同じ述語と考えてよい。つまり、
Prologプログラムの大半にmember/2が絡んでくるがこれは全部append/3でよい。
62 :
60:2009/05/11(月) 05:51:47
すみません。ちょっと編集をまちがえた。
repeat.
repeat :- repeat. は
append([],X,X).
append([U|X],Y,[U|Z]) :- append(X,Y,Z). と
実は同一パターン。
?- ..., repeat, ... は ?- ..., append(_,_,_), ... でいけそうだが、
スタックオーバーフローを起こすだろうから実用にはならない。
member(A,[A|_]).
member(A,[_|R]) :- member(A,R). は
... <以下略>
が正しい順序でした。
63 :
60:2009/05/11(月) 05:55:25
64 :
60:2009/05/11(月) 06:09:03
どこまで、副目標としてappend/3を使うか、それとも
別述語を定義して使うのかは指針があるわけでもなく、
迷うけどね。
>>57 なんでappendの話に飛ばしたかというと、Prologプログラムは8割方が
簡易オンメモリデータベース。残りの2割の内、7割くらいが
findall/3 と append/3 (member/2) の組み合わせ。(fail;trueもありますね)。
残りの6%くらいが入出力とかsplit,atom_codesのような文字列処理。
こんな配分です。つまり、"データこそすべて"プログラミングに
findall append を粘り強く積み重ねるだけで、ほとんどの難しい
ところはなくなってしまいます。
あなたが指摘した"複雑なこと"のプログラミングは極めて例外的な
部分ではないかと思います。
>>66 Kbuntu 7.1 でコンパイルしてみたら、
syserr.c:31:21: error: ncurses.h: No such file or directory
syserr.c: In function 'void syserr(char*, ...)':
syserr.c:59: error: 'endwin' was not declared in this scope
make: *** [syserr.o] エラー 1
となりうまくいかない。どうすればいいの?
と、思わず一つ勉強になっちゃったぜ
えへへ
>>67 結論としては、作者にこのスレを教えてあげるとかw
>>67 ちょっとソース見たけど、ncursesがなかった場合に対応できるような感じではなかったから、
どのみちncursesを入れなきゃダメなんだろうね
>>72 ncurses.hは Kbuntu Ubuntu にはなくて、私がすぐ手に入るのは、
FC5のncurses.hディレクトリなんだけど、これをコピーすれぱいいのかな?
やってみよう。
ディレクトリはncurses.h ではなくてncursesだった。続いて、
readlineディレクトリが無いときた。これもコピーと・・・
c++ -g -O2 -o descartes pl.o pllex.o unify.o bin_node.o gc.o var.o \
pred.o syserr.o builtin.o expression.o context.o module.o let.o regex.o \
token.o func.o timeout.o utf8.o euc.o sjis.o code.o help.o mkstemp.o \
cwd.o sysmodule.o format.o sleep.o complx.o lisp.o compiler.o matrix.o \
ncurlib.o lib_include.o opcall.o
syserr.o: In function `syserr(char*, ...)':
/home/k1/descartes/syserr.c:59: undefined reference to `endwin'
sysmodule.o: In function `GetlineEval()':
/home/k1/descartes/sysmodule.c:2409: undefined reference to `readline'
/home/k1/descartes/sysmodule.c:2411: undefined reference to `add_history'
sysmodule.o: In function `GetLine(Context*, Node*, List*)':
以下、大量にエラーがでて撃沈。
てゆーかもうさすがにスレ違いかと
デカルト言語のキーワードの一つは「オレオレ」かな
オレ惟ふ故にオレオレ
:- op(850,xfx,>>).
?- もう少し本格的な生成文法でなんとかならないの
>>76.
85 :
84:2009/05/17(日) 08:31:59
学生さん!
どなたかこの本、邦訳してくださらないか。
"Building Expert Systems in Prolog" Dennis Merritt著
1989年 Springer-Verlag ISBN 0-387-97016-9
>>87 エキスパートシステムって、実用化までたどり着けなかったシステムと
聞いてますけど、いまさら翻訳する意味あるんですか。
駅スパアトなら使ってるけど?
>>88 金字塔的な書籍は何でも読みたい。
ロジカルアプローチは世界的に再評価の時期に入っているから、
読み直しの要求は出てくるよ。
>>88 エキスパートシステムは漸く事業化の時期に来たのではないか。
20年(一世代)待ったということになる。
エージェントアプローチ + エキスパートシステムでリプレース
できるアプリケーションは無限にあるよ。
比較的最近"眺めた"本で翻訳して欲しいなぁと思った本を列挙。
"Towards Putting Abstract Interpretation of Prolog into Practice"
F.Gobert著 2008 年 VDM Verlag ISDN:978-3-8364-8858-7
"Clause and Effect" --Prolog Programming for the Working Programmer--
William F.Clocksin著 1997年 Springer Verlag ISBN:3-540-62971-8
"Intelligent Image Processing in Prolog" Bruce Batchelor著
1991年 Springer-Verlag ISBN:3-540-19647-1 (この本は初心者言語スレで
紹介したところ何故か罵倒された)
"AI Algorithms, Data Structures, and Idioms in Prolog,Lisp, and Java"
George F.Luger William A.Stubblefield共著 2009年 Addison Wesley
ISBN-13:978-0-13-607047-4 (この本はAI携帯スレで紹介した)
三重野博司著の「人事情報エキスパートシステム」という本に210くらいの
質問事例が載っています。ほとんど揺らぎとでも表現したいくらいの微妙な
差異のif-thenルールを積み重ねているのですが大変参考になりました。
それで感じたのはエキスパートシステムを能率よく構築するためには
質問文やif-thenルールの自動生成が欠かせないのではないか、という
ことでした。
94 :
93:2009/05/19(火) 09:49:21
210くらいのif-thenルールが載っています。 でした・・
オントロジーは?
オントロロロギッタンディスカー
>>93 最初に言語のクラスを定義しておいて、組み合わせで
文を生成していくというようなことかな。
エキスパートシステムにそういう部分が必須であると
いう意味ですか?
言語クラスの定義、辞書の定義まで、すべてのアプリ
ケーションのリプレースに必要とまでの主張だとすると
多少はオントロジーとも無関係ではないかもしれないw
100 :
デフォルトの名無しさん:2009/05/20(水) 05:29:18
Prologって今から思えても意味ありますか?
特技みたいに思ってもらえたりするでしょうか?
102 :
デフォルトの名無しさん:2009/05/20(水) 07:14:59
>>100 私がPrologを使うのは生産性が高いからですよ。
それ以外のことは、まあどうでもいいです。
>>100 あなたが、今プログラミングをしたことのない60才だとします。
"Prolog以外"のプログラム言語をこれから覚えて使いこなすのは
不可能といっていいでしょう。これが答えです。
Prolog始まっ・・・そんなものはとっくに始まってるさ
企業経営という観点からいうと、
反射的にコストを考えてしまう社員は要らない。反利速的な経営の
基礎となる情報システムは記号処理言語を基礎に上層を築き直さな
くてはならない。Prologをアセンブラとして使う。
is/2には死んでもらうw
>>106 経路問題だけで業務ソフト作るのは難しいよw
リンクだけ張っても仕方ない。
SWI-PrologでIF/Prologのparse_atom/2のような事を行いたいのですが、
どのようにすれば良いかご存知の方いらっしゃいませんか。
111 :
110:2009/05/20(水) 14:29:57
補足です。
やろうとしている(というか移植しようとしている)内容を簡単に書くと
do_all:-
(rule->
>>110 ?- atom_to_term('append([1],[2],L).',X,Y).
X = append([1], [2], _G261)
Y = ['L'=_G261]
113 :
110:2009/05/20(水) 14:35:42
途中で送信してしまいました、すいません。
do_all:-
data(D),
(
rule(D)->
true;
create_rule(D,R_str),
parse_atom(R_str,R),
assertz((R))
),
fail;true.
あるデータセットを処理可能なルールが既にあれば良し、
なければ新しいルールを作って追加、
という内容です。
何卒よろしくお願いします。
>>113 create_rule/2 でなぜ直接Rを生成しないのか疑問ですが。
115 :
110:2009/05/20(水) 14:45:05
>>112さま
できました! ありがとうございます!
116 :
110:2009/05/20(水) 14:54:25
>>114さま
すいません、直接ルールを生成するというのはどのようなことなのでしょうか。
今のところは文字列処理でルール文を生成しています。
ほとんど独学なのでPrologの事は知っているようでよくわからなかったりします・・
data(筋肉は使い過ぎると傷害を起こす) だとします。
この文を解析して 筋肉,使い過ぎ,傷害を起こす という要素を得て、
?- ... create_rule(_文,'筋肉(使い過ぎ,障害を起こす)'), ...
生成できたのだとすると,
?- ... create_rule(_文,筋肉(使い過ぎ,障害を起こす)), ...
を直接生成できるのではないか。
118 :
110:2009/05/20(水) 17:51:16
>>117さま
string(atom)で返しているのは、assert以外に、ルール文をファイル保存等、
テキスト処理を行いたいため、そのようになっています。
※
parse_atom/2には直接関係無いため、記述を省略しておりました。
わかりにくくて申し訳ありません。
ruleの直接生成については、ご指摘の通りだと思います。
ただ、create_ruleでは複雑な処理を行っているのので、
今回は無理をせずにatom_to_termで行きたいと思います。
ご指摘ありがとうございました。
>>118 そうでしょうね。項とともにテキストの生成を意識することは
よい設計だと思います。あなたはご存知だと思いますが、
ruleの生成で私が書いた述語らしからぬ筋肉という関数の部分に
変数がくる、つまりその文によってここを変化させたい場合は、
functor/3,arg/3 または (=..)/2 を使います。メタ述語ですね。
>>120 利速的とは、売上、利益の伸び率などが今どういう傾向に
微分的に変化しつつあるかについて、もっとも注視すること。
反利速的ですから、計量的微分的な量りから遠ざかる、
そういうことに囚われない経営態度。
初心者のプログラミング言語ガイドスレで見て来ました。
ーー文化と実践ーーっていう本が薦められていて探してみようと思います。
処理系はSWI-Prologで良いですか?
というか、処理系によって言語仕様(でいいのかな)とかが違ったりするのでしょうか?
>>122 すみません。--文化とその実践-- でした。あちらのスレでも訂正をしておきました。
処理系はSWI-Prologで十分でしょう。Prologは残念ながら、処理系によっての差が
かなりあります。しかし、1995年にISO規格が制定されて、少なくとも各処理系が
この述語群は共通にサポートする方向ですから、できるだけこの規格に沿った述語を
選択して利用する方がよいでしょう。
>>123 ここの前スレで紹介があったのですが、
SWI-Prologは比較的最近のバージョンからYES ではなく true. と
表示されるようになりました。trueの後のピリオドにも注目です。
これで、実行ログが完全に項としてreadできるようになりました。
一時的な思いつきなのか永久にこの仕様になったのか分からない
のですが、多くのPrologプログラマは好意的に受け止めています。
この言語将来性なさそう・・・大丈夫か?
>>126ほとんどのプログラム言語が死に絶えた時に最期まで生き残っているのが論理型言語なのさ。Prologであるとは言わないけど。
機械語なんていわれるとピンとこないなぁ。
James L. Hein;Prolog Experiments in Discrete Mathematics,Logic, and Computability
が公開されてるのをみつけた。
132 :
デフォルトの名無しさん:2009/05/21(木) 16:11:33
>>129 何を言いたいのかよくわからないけどせめて「並行」と書いてくれ。
第五世代ではKL1が機械語という位置づけだったんだっけ?
このスレってさ、まったりとか描いてる割には内容が高度すぎて読む気に慣れねーわ。
つーか、読んでも意味ワカンネーし。
やる気無くなるし。
>>134 すまん、漏れが親しみやすいトリビア集めをさぼっているばかりに…
「WAMにあたる」じゃないな
WAMコード、WAMの機械語にあたる、か
平行論理世界へようこそ
つーことは
>>129の「それが機械語」は言い過ぎかな
WAMの命令セットが論理型言語と言えるならKL1-Bも並行論理型言語で
それが(仮想機械の)機械語と言えるかもしれんが
将来ロボットが出現するだろうから、それらをプログラムする言語はPrologになるってことか。
それなら納得した。
>>140 20世紀は石油。
21世紀はロボットの世紀だからね。
当面、情報家電のUIはPrologインタプリタでなくちゃいけないのだが・・・
>>142 JAVAでもしょうがないとは思うがPrologの項をparse_atomできる
関数をライブラリに持っていて欲しい。
>>134 だから第五世代計画は失敗した、という面もある。
この言語でプログラミングやるんだったらPython始めた方が良いよ
じゃあ君はPythonやればいい。
147 :
デフォルトの名無しさん:2009/05/21(木) 23:34:31
僕は、 KL-1 が素晴らしいと思ったので、今、勉強中です。
PythonとPrologって、主にどうちがうんですか?
150 :
デフォルトの名無しさん:2009/05/22(金) 02:39:04
Pythonってjavaの代わりって感じ?
>>124 その本、あちらのスレでは在庫無しと書いてらっしゃいましたが、
まだ流通あるようですよ。ヤフオクの7アンドYでポチりました。
>>152 ありがとう。まだ大丈夫でしたか。
私は用心に去年二冊目を買いました。人に貸せるように。
Prologの本は昨年の赤間さんの本以外はいつ絶版になっても
しかたがないというのが多くて・・・
>>95 突然、ミケランジェロがでてきたような感じなんだよね。
最初に読んだPrologの本が中島秀之先生の本だった影響で
今でもProlog/KRに愛着があります。GCLで動かしています。
S式が扱えるPrologが好きです。
>>153 今日届きました。最初の連言標準形・・・あたりから既に付いていけてない・・・T_T
158 :
デフォルトの名無しさん:2009/05/25(月) 11:41:23
prologで微分する述語を作ったんだが x^(-1) を微分すると -1*x^ -2*1 と括弧が外れてしまう
せめて -1*x^(-2)*1 くらいは括弧が欲しい
どうやら x^ -1 と単一化されるのが原因らしい 微分述語を定義するときに括弧をつけても外されてしまう
これって回避する方法って無いの?
>>158 > どうやら x^ -1 と単一化されるのが原因らしい
このへんがちょっとよくわからない
160 :
デフォルトの名無しさん:2009/05/25(月) 18:26:57
>>159 例えば test((A),((A))). という述語を定義しても listing. すると test(A,A). になります
括弧を記号と考えて処理する方法は無いの?
>>160 なるほど。それは実は面白いかも。
もし仮に「冗長な括弧は、主関数子を'()'/1とする複合項を構成する」みたいなルールを決めるなら…
1 + (2 + 3) = +(1, +(2, 3))
1 + 2 + 3 = +(+(1, 2), 3)
1 + ((2 + 3)) = +(1, ()(+(2, 3)))
(1 + 2) + 3 = +(()(+(1, 2)), 3)
こんな楽しいPrologが…!たぶん使うのが難しいと思うけどw
>>160 えーとつまり、括弧をデータとして扱うことの問題点は感じてもらえるのでは
163 :
デフォルトの名無しさん:2009/05/25(月) 22:06:50
再起処理で一番上流だけを求めるってできる?
165 :
デフォルトの名無しさん:2009/05/26(火) 07:59:25
>>164 up(a,b).up(b,c),up(c,d).up(d,e).のとき
top(X,e).と聞くとX=aだけを返すようなプログラムができる?
後戻りを再起処理と言っていたのかw
エスパーの勉強になった
167 :
166:2009/05/26(火) 08:31:58
おっとすまん、勘違いだったようだ
168 :
166:2009/05/26(火) 08:37:29
>>165 aの特徴は、\+ up(_,a)というところだよね
そのへんが切り口なのでは
>>165 top(Top,End) :- up(A,End),top(Top,A).
top(Top,Top) :- up(Top,_).
170 :
169:2009/05/26(火) 08:51:19
なるほど、これだとだめなのか。
171 :
169:2009/05/26(火) 08:53:18
top(Top,End) :- up(A,End),top(Top,A),!.
top(Top,Top) :- up(Top,_).
かな。
172 :
169:2009/05/26(火) 09:14:07
top(Top,Top) :- up(Top,_),not(up(_,Top)).
top(Top,End) :- up(A,End),top(Top,A).
確かにこの方がよい。
これは2段階の手続きにしたほうが自然なのでは
top(Top,X) :- upper(Top,X), \+ up(_,Top).
upper(X,X).
upper(X,X0) :- up(X1,X0), upper(X,X1).
ところで、探索の向きがちょっと…w
>>173だとあれか、top(z,z)とかもあれしちゃうか
そのケースが閃くかどうかだ。Prologの弱点も垣間見える。
「いい問題」だね。
でも実際には孤立した点を含む集合を考えているかも知れないけどね
順序集合の概念を知ってるかどうかで
top(X,X0) :- \+ up(_,X0), !, X=X0.
top(X,X0) :- up(X1,X0), top(X,X1).
こんな形を考えたよ。意味的には
>>173系。
最初
top(X,X) :- \+ up(_,X), !.
というふうに考えてしまったのが反省点。
>>178 やっぱりまずいんではないか。
up(a,b).
up(b,c).
up(c,d).
top(X,X0) :- \+ up(_,X0), !, X=X0.
top(X,X0) :- up(X1,X0), top(X,X1).
?- top(X,z).
X = z;
no
というよりも、up(X,_)を満たすものだけを対象にすべきかどうかはっきりしない
もっと言えば、up/2で言及されない元がないとはいえない
うーん、つくづく、いい問題、いい仕様(
>>165)、だな。
よく読んでみると、一番上流と言う言葉の解説として、
>>165 が呈示されているので、やはり少し無理があるか。
なんかSWIのマニュアルが動的になって、静的な索引が見当たらなくなった。
くそーそんなにキーワードを入力させたいのか
186 :
185:2009/05/27(水) 20:38:25
<超>Prologトリビア探検隊
中村克彦訳『Prologプログラミング』(いわゆるClocksin & Mellish)の
索引の「く〜け」の所ではなく「か」の所に、「空リスト」を発見…!
さあ、お手持ちの本の情報もぜひw
なにそれこわい
>>187 劣勢でないかと予想した「唐派」も健闘しています。
「述語論理と論理プログラミング」 有川節夫・原口誠共著 オーム社
「MICRO-PROGRAM」 サラム著 山田和美訳 啓学出版
「体験学習 ビジネスマンのための Prologプログラミング入門」 高橋三雄著 オーム社
「Prolog入門」 太細孝・鈴木克志・伊藤ひとみ・佐藤祐幸共著 啓学出版
「はじめてのProlog」 舟本奨著 ナツメ社
「RUN/Prologとその応用」 杉原敏夫著 工学図書株式会社
「RUN/PROLOG入門」 小島政行著 アムコインターナショナル
「PROLOGデーベース・システム」 リー著 安倍憲広訳 近代科学社
「RUN/Arity Prologプログラミング入門」 大原茂之著 オーム社
「RUN/Prologを用いた Prologプログラミング入門」 鑰山徹著 工学図書株式会社
「Prolog詳説」 バラス著 斎藤重光・舟本奨訳
「楽しいプログラミングII 記号の世界」 中島秀之・上田和紀共著 岩波書店
「Prologプログラミング」 Clocksin・Mellish共著 中村克彦訳 マイクロソフトウェア
バラスの本は啓学出版ですね。
「食う派」は15本見つけました。
「知識・代数・データベース」 グレイ著 田中穂積・徳永健伸訳 産業図書
「人工知能の基礎理論」 赤間世紀著 電気書院
「法律家のためのコンピュータ利用法」 加賀山茂著 有斐閣
「Prologマシン」 金田悠紀夫著 森北出版
「Prolog ユーティリティライブラリ」 フィリピッチ著 中野誠・伊藤哲郎訳
「Prologのソフトウェア作法」 黒川利明著 岩波書店
「Prologプログラミング入門」 安倍憲広著 共立出版
「論理による問題の解法」 コワルスキ著 浦昭二監修 山田眞一・菊池光昭・桑野龍夫訳
「Prologで学ぶ AIプログラミング」 赤間世紀著 工学社
「PROLOG入門」 後藤滋樹著 サイエンス社
「Prologランニングブック上」 横井与次郎著 ラジオ出版社
「わかる:-Prolog」塚本龍男著 共立出版
「例題演習 Prolog入門」 細野充著 オーム社
「情報学概論 Prologプログラミング」 吉田要著 八千代出版
「TURBO PROLOG入門」Townsend著 倉谷直臣・酒見高広訳 オーム社
赤間氏は確信を持って「食う」のようです。
「論理プログラミングの基礎」 J.W.ロイド著 佐藤雅彦・森下真一訳 産業図書株式会社
では「空節」が「か」に分類されています。これはさすがに。
このような場合もっとも重んじられるProlog本と思われる
「Prolog入門」 古川康一著 オーム社
の索引には"空リスト"はなかった。
えっ
ソラ派の俺はどうしたら
この手の話で盛り上がるのは、廃れつつある言語の典型ですなあ
>>189 PROLOGデーベース・システム」はもちろん誤りで正しくは「PROLOGデータベースシステム」です。
>>190 出版社に漏れがありました。
「Prolog ユーティリティライブラリ」は海文堂、
「論理による問題の解法」は培風館です。
「Prolog ユーティリティライブラリ」の索引は独特で、これは確信を以っての「食う派」ですね。
さすがに「あ」とか「す」はなさそうだね
199 :
197:2009/05/30(土) 12:17:05
確信を以って -> 確信を持って ですね。
>>163 その質問は「下流」ならできるけど、という話に見えるのがひっかけかな
帰ってきたPrologトリビア探検隊FX
『Prologの冒険』(Dennis Merritt著)の「まえがき」の「訳注」より。
> [1] Programming in Prolog(W.F. Clocksin and C.S. Mellish/Springer-Verlag, 1981)
> =邦訳:『Prologプログラミング』(中村克彦訳/マイクロソフトウェア,1983)。
> 本書は1987年に第3版が出版されているが,その邦訳はまだ存在しない。
1987年 「プログラミング」原書第3版
1988年 「プログラミング」改訂第3版 ←持ってます
1990年 「冒険」原書初版
1992年 「冒険」初版 ←持ってます
203 :
デフォルトの名無しさん:2009/06/05(金) 08:13:10
他に質問にするところがないので、ここでさせてください。
今、Visual Prologでこの
ttp://wiki.visual-prolog.com/index.php?title=A_Beginners_Guide_to_Visual_Prolog サイトの
A Beginners Guide to Visual Prolog (PDF format, English 275 pages).
というチュートリアルを読みながら勉強しています。
163ページから166ページまでの階乗の例がエラーのせいでビルドできません。
e631: The predicate 'factorial::fac/2 (i,o),
which is declared as 'procedure', is actually 'multi'
…というエラーで、helpには
compiler optionの/warning:procedure- or /warning:631-のオプションを外せ
と書いてあるんですけど、わざわざVisual Prologのbinまでこれらのファイルを移動して
コマンドラインからVIP7Compiler /warning:procedure- factorial.proとやったんですけど、
error c223: A class declaration is not found for the implementaion 'factorial'
と怒られました。
(自分以外でVisual Prologなんて使っている人いるのか不安ですが)
先輩方、どおぅにかしてビルドする方法はないですか?
似たような状況
http://discuss.visual-prolog.com/viewtopic.php?t=7806 > So, after unpacking family1.zip, you should use Build/Run in Window
よくわからないけど、classのdeclarationとimplementationが別のファイルにあって、
それらがプロジェクトの中で関連づけられたものだと認識されていないということでは。
たぶん、プロジェクトの設定がどこかにあるはずなのに、それがコンパイラに伝わっていないとか。
> implementaion
○implementation
手で打ちましたねへっへっへ
「別のファイルにあって」は
「別々のファイルにあって」ですねスミマセン
>>202 逐次型推論マシンPSIは論理型プログラムPrologを高速に実行するのに最適化して設計
された,ワーク・ステーションである。次のような特徴を持っている。
・タグの採用
・最大16Mワード(80Mバイト)の実メモリ
・8Kワード(40Kバイト)のキャッシュ・メモリ
・高水準ビット・マップ・ディスプレイとマウスを装備
・高水準機械命令(KL0)とファームウェアによりKL0インタプリタ
・メモリ管理,一部のプロセス管理のファームウェア化
・ガーベッジ・コレクション機能のファームウェア化
PSIの基本処理装置の実行制御は,マイクロプログラム制御で行われる。このファーム
ウェアシステムは,マイクロ・インタプリとも呼ばれるPSIの機械語KL0を直接解釈実行
する。またファームウェアは,割込み制御,プロセス管理,メモリ管理,入出力制御等の
システム制御の機能を持ち,オペレーティング・システムによる資源管理の効率化が計られ
ている。
-- KL0 システム制御説明書 1-1 -- より
<PSI探方 KL0機械命令編> データ操作 命令コード 28
set_vector_element(H_V,Position,Element)
ヒープ・ベクタH_VのPosition番目(0オリジンで指示)にElementを上書きする。上書きされ
た結果は,バックトラックにより,undoされない。
[入力条件]
H_V : ヒープ・ベクタ
Position : 整数 (0≦Position≦ (H_Vの長さ-1) )
Element : 未定義とスタック・ベクタを除く任意のデータ型
[成功条件]
常に成功する。
[例外事項]
illegal input: (a) H_Vがヒープ・ベクタでない。
(b) Positionが整数でない。
(c) Elementが未定義またはスタック・ベクタである。
out of bounds: (a) 0≦Position< (H_Vの長さ−1) を満たさない。
(b) H_Vが空ベクタである。
210 :
203:2009/06/07(日) 05:48:53
>>204-205 ∧
>>207-208 レス、ありがとうございます。
Build Optionsはもういじりましたが何も起こりませんでした
(エラーは起こったかも…今は違うパソからなんで確認できませんが)。
そこまで「検索→推測」でレスしてくださるならいっそ、実際に
A Beginners Guide to Visual Prolog (PDF format, English 275 pages).
の163〜166ページのfactorialの例を試してくださいませんか?
VIP6でも同じ症状が出るのではないでしょうか?
いや、単にエスパー能力試しなのでお気になさらず
「インストールしたくないオーラ」を感じていただければw
>>どちらかが間違っているという部分もあるし。
ってどこ?
>>214 The language was first conceived by a group around Alain Colmerauer in Marseille
, France, in the early 1970s. According to Robert Kowalski, the first Prolog sys
tem was developed in 1972 by Alain Colmerauer and Phillipe Roussel.[1]
1972年ごろにフランスのカルメラウアーとコワルスキーによって考案された。
216 :
215:2009/06/09(火) 04:34:16
ごめん。対応するのは、Historyの中にある以下の方かな。
It was created around 1972 by Alain Colmerauer with Philippe Roussel, based on Robert Kowalski's procedural interpretation of Horn clauses.
It was motivated in part by the desire to reconcile the use of logic as a declarative knowledge representation language with the procedural representation of knowledge that was popular in North America in the late 1960s and early 1970s.
これだと、jp.wikipedia の解釈も可能。
>>215 エッカート博士のストアード・プログラム方式の最初のアイデアに関する
裁判などを見ても、最初のアイデアを出したのが誰か、そして、本人がそれを
主張するか、などなかなか微妙。マルセイユグループとコワルスキとの間に
何かあるか、あるいは何もないのか、知らないが・・・
カルメラウア側の情報に終始するProlog生成の物語に、ある種の客観性を
与えるため、
According to Robert Kowalski,
以下があるのだと思う。カルメラウアが示唆を受けたと表明しているこの分野の
最高権威がお墨付きを与えているとして文献が示されている。
en.wikipedeaのここの部分の書き手とHistoryの書き手は異なるのかもしれない。
218 :
217:2009/06/09(火) 08:27:54
ついでに云ってしまうと、en.wikipedia は非常によく書けていると思う。
誰か翻訳して、jp.wikipediaを全面下記潰していただけないだろうか。
219 :
203:2009/06/09(火) 08:45:29
>>211-212 Visual Prologの元祖スレで質問して
カットを一つ入れたら治りました。
一応報告まで。
元祖スレというのが何を指しているかわかりませんが
よかったですね
>>218 手間と予想される悶着を考えると、とりあえずリンクを張って
あとは「独自研究」とか「雑多な内容」とかで
よく書けていると評価できる位なら独自に全部書けるだろwww
とか一瞬思ってしまった
>>222 プログラミングテクニックについてならいくらでも書けるけどね。
現在のWikipediaの構造を維持したら整合しない。だからといって、
Prologの歴史や述語論理との関係についてまで解説するのは、荷が
重い。
この項目はあまりよく書けていない可能性があります。
ノートでの議論と記事の発展への協力をお願いします(Template:よく書けていない)。
226 :
デフォルトの名無しさん:2009/06/09(火) 22:23:54
このスレで、記事をまとめて、
それを Wikipedia にアップさせれば良いのでは?
著作権が曖昧になると嫌がられるよ
翻訳はやりたいけど、今のjaのPrologの記事を書き潰すと一悶着ありそうだな…
匿名で書けるんだから面倒なことになったらトンズラすれば?
全部書き潰す必要はないし、ルールに従ってやればいいのだけれど、
Googleの検索でWikipediaが先頭にくるようになってからは、
大半のPrologのことを知りたい人がこのサイトを読んで引き返して
しまっていることは確かだ。しかも、そういう人のためのサイトに
全くなっていない。誰のために書いてあるのか分からないサイトと
言ってよいだろう。やはり、相当手を入れないといけない。
>Prologは、導出において節を以下に述べる頭部が一つの命題からのみなる
>ホーン節に限定したものととらえる事が出来る。
この文、変だよね。
"からのみなる" の検索結果 約 915 件中 1 - 10 件目 (0.21 秒)
"nominal horn clause"の検索結果 8 件中 1 - 8 件目 (0.28 秒)
>>231 確かに難解な文だな。
Prologでは導出される対象を頭部が一つの項に限定されたホーン節と
呼ばれる命題に限定している。
と言いたいのですか?
ちょっとかじった人なら読み飛ばして何事もなしだが……
詰め込みすぎたか、あとで書く予定が面倒になったか。
>>234 私も素人なのだが。
( P ∧ Q ) も一つの項でしょ。
そうすると (p1 ∧ p2) :- q1 ∧ q2 ∧ ....
も許される事になっちゃうんじゃないの。
Prolog的混乱が生じてるねへっへっへ
「原子論理式」という言葉があるよ
ものの本によると、アタマのないやつも「ホーン節」のうちみたいよ。
質問とか、計算中の目標(ゴール)として現れるやつ。
アタマのあるやつ(Q∧R⇒P、P∨¬Q∨¬R、{P,¬Q,R}、P:-Q,R.)は
「頭部つきのホーン節」とか「プログラム節」とかいうらしい。
やべ
× {P,¬Q,R}
○ {P,¬Q,¬R}
古川康一著の「Prolog入門」より。
# ホーン論理とは,一階述語論理の命題をA1 ∨ A2 ∨ ... ∨ An ← B1 ∧ B2 ∧ ... ∧ Bm の
# 形(節形式)であらわしたときに,左辺の句がたかだか一つしか現れないような命題のみ扱う論理
# である(ここで,A1,A2, ... ,An,B1,B2, ...,Bm は正の句である). すなわち,左辺に句が
# 一つ現れるのか定義節であり,そこが空になるのがゴール節である(ゴール節を":-"から始めても
# よいのは,そのためである).
原子論理式、基本論理式、リテラル、句
は微妙に違いがあるのかな。リテラルは否定形を含むとか。
リテラルはそうでしょう
「正の句」と言っているから
句=リテラル
なのか
そうか「頭部つき」=「確定節」(DCGのDC)ということか
definite(明確な、限定的な など)
definitive(確実な、限定的な、明確な、限定詞 など)
definitional(definitionの形容詞形)
definition(限定、明確化、定義、解像力 など)
ややこしい
第129回技術委員会議事録
http://www.itscj.ipsj.or.jp/protect/gijutsu/0606rpt.html > 1) SC22/WG17 SC22N4049 (投票期限: 2006-07-26)
> (資料31)
> Programming Language Prolog -- Definite clause grammar rules
> 「プログラム言語Prologのための確定節文法規則」
> Q.1〜Q.3にYES,Q.4〜Q.6にNOとする回答案は,原案どおり承認された.(後藤SC22専門委員会幹事)
この場では「確定節」なんだね
小ネタ:
FGHC(Flat GHC)をGDC(Guarded Definite Clauses)と呼ぶことがあるらしい
Logic for applications
著者: Anil Nerode, Richard A. Shore
> (Ordered clauses are sometimes referred to as definite clauses, hence
んー?これはなんか集合論の用語みたいな…
Prologなら使用人口も少ないだろうし、
論文ネタがゴマンとあって書きやすいんじゃないかと思って手を出そうとしてるところ
実際、どう?
>>250 あくまでも、プログラム言語であるという視点で、
・ Prologのプログラムパターン
・ Prologのプログラミングスタイル
・ 得手とする領域とその典型的なプログラム
の記述を重視して。
お願いします!!
>>250 ごめん、間違えた。勉強しようという話ですね。
論文ネタなら、ICOTの検証だけで事実上無限にあります。
>>251-252 >論文ネタなら、ICOTの検証だけで事実上無限にあります。
ウホッ、予感的中!感謝感激雨霰!
マジで
人 生 賭 け て 研 究 す る 所 存 で あ り ま す
でも、その前に紙の上での記号論理学や形式言語をもっと勉強しなければ、と今勉強中です
>>215-217 何気にスルーしちゃったけど、「Colmerauer」はフランス語の発音の原則だと
「コルメロエ」みたいになると思うけど、そのへんどうなんだろう。
クルルァ
○○が近いが△△あるいは□□とも書かれてきた
ちなみにおなじみC&M邦訳では「コルメロエ」だった
>>258 カタカナ表記の揺れの問題じゃなくて、
フランス語読みと英語読みの違いでしょ。
仏語:コルムローエル
英語:コルマローアー
では?
また新たな「確定節」解釈を発見。
『人工知能の基礎』(馬場口登・山田誠二共著)によると、
事実(fact)=単位節(unit clause)
ルール(rule)=確定節(definite clause)
質問(query)=ゴール節(goal clause)
らしい(p.75)。かなりパターンが揃ってきたねw
あそうか、コピペ駆動開発みたいな感じか
>>268 「clause」だけ検索してみたら
・ここではdefinite clauseという言葉を使っていない
・たまに「program(の)clause」のような言い方をする程度
・そもそも、最初はホーン節という概念に着目していなかったらしい
という感触だった
Programming in Prolog
著者: William F. Clocksin, Christopher S. Mellish
27 ページ
> Structures are called "compound terms" in Standard Prolog, but
> in this book we use the word "structure" because it is shorter and
> more easily distinguished ...
2003年版より。てっきりISOの用語に統一されたんだろうなと思っていたので意外だった。漢だ。
というかdefinite (program) clauseか
『Horn節は、ある条件の下で(あるいは無条件に)成り立つ事柄について、
B1”または”B2というような不確定な言い方を許さない。そこでHorn節は
確定節(definite clause)とも呼ばれる』
論理と意味 p105
直観主義論理の形式系LJの式は全部Horn節、というのもどこかで
関係するんじゃないですかね。
失礼。書き忘れました。B1,B2というのは
A1,A2,...An → B1,B2,...Bn
という右辺にあるそれぞれの式のことを指します。
LJを調べてみました。扱っている式の形はホーン節に似てはいますが、
それぞれの論理式は原子論理式である必要はないんですよね
>280の「式」は「→」や「,」を含む全体、「論理式」はそこで対象化されている部分です、念のため
>>それぞれの論理式は原子論理式である必要はないんですよね
確かにその通りです。
では、そもそもなぜHorn節(より一般に節)は、原子論理式及び原子論理式
の否定の選言で構成されないとならないのか?という疑問が湧いてきますね。
多分何かしらの変換において、要素が原子論理式でなければならないという
縛りが出てきそうです。そのラインから少し調べてみます。
Qualitative spatial reasoning with topological information
Jochen Renz著 - 2002
17 ページ
> A Horn clause without a positive literal is called
> indefinite Horn clause, otherwise it is a definite Horn clause.
mjd?
>>283 プログラミング言語の新潮流という本では、
正のリテラルが(”高々”はつかず)一つである節を確定節(definite clause)と呼ぶ。とある。
思うに証明戦略上区分けしていると思われる。
正の節、すなわち確定節の場合、
証明戦略:SPU(selective positive unit resolution)
負の節、すなわち不確定節の場合、
証明戦略:SNL(selective negative linear resolution)。
SLD = SPU + SNL?
SLD戦略を理解するに当たって、確定節、不確定節を区分したほうが
わかりやすいから区分しているように見える。
LJの式がHorn節になるというのはあまり関係ないようだ。
加えて、要素が複合論理式か、原子論理式かはあまり関係なかった。
SPUなりSNLの証明戦略を用いたとすると、結局原子論理式しか出てこない。
わかりにくい言い方だが、つまり、何かしら自動証明することを考えると、
複合論理式であるかどうか、ということは特に問題ならなくなる。
付け加えて、SPU,SNLについては『論理と意味』に解説がある。
改めて読み返すと
>>285の内容がおかしい。とりあえず、保留。
質問です
prologで
?- divide([a,b,c,d,e],L1, L2).
L1 = [a,c,e]
L2 = [b,d]
とするにはどうしたらよいのでしょうか?
divide([],[],[]).
divide([X|Xs],[X|Ys],Zs) :- divide(Xs,Zs,Ys).
>>289さん
ありがとうございます
ちなみにこれの停止条件は空リストは空リスト二つに分けろってことですか?
何で最小単位が空リストになってしまうのでしょうか? a,b見たいな感じにはならないのですか?
後再帰条件はヘッドのXをXsとYsに分けてZsが残っているか判定する、でいいのでしょうか?
prologよくわからないので日本語がおかしいかもしれないですが回答お願いします
divide([],[],[])
divide([a],[a],[])
divide([a,b],[a],[b])
divide([a,b,c],[a,c],[b])
divide([],[],[])
divide([1],[1],[])
divide([2,1],[2],[1])
divide([3,2,1],[3,1],[2])
うぅむ・・・。
Xというリストを分けてXsとし、残ったリストXをまた分けてYzとし、
最終的に分割できるものがなくなったら残った物をZsとして
停止条件に行き着くみたいな感じでしょうか・・・?
divide([A,B|Xs],[A|Ys],[B|Zs]) :- divide(Xs,Ys,Zs).
divide([A|[B|Xs]],[A|Ys],[B|Zs]) :- divide(Xs,Ys,Zs).
divide([A|Xs0],[A|Ys],Zs0) :- [Xs0,Zs0] = [[B|Xs],[B|Zs]], divide(Xs,Ys,Zs).
divide([A|Xs0],[A|Ys0],Zs0) :- [Xs0,Ys0,Zs0] = [[B|Xs],Ys,[B|Zs]], divide(Xs,Ys,Zs).
divide([A|Xs0],[A|Ys0],Zs0) :- [Xs0,Zs0,Ys0] = [[B|Xs],[B|Zs],Ys], divide(Xs,Ys,Zs).
divide([A|Xs0],[A|Ys0],Zs0) :- divide(Xs0,Zs0,Ys0) = divide([B|Xs],[B|Zs],Ys), divide(Xs,Ys,Zs).
divide([A|Xs0],[A|Zs0],Ys0) :- divide(Xs0,Ys0,Zs0) = divide([B|Xs],[B|Zs],Ys), divide(Xs,Ys,Zs).
divide([A|Xs0],[A|Zs0],Ys0) :- divide(Xs0,Ys0,Zs0).
divide([B|Xs],[B|Zs],Ys) :- divide(Xs,Ys,Zs).
ほら、簡単でしょう(ボブ)
ひとつ削ると奇数偶数が反対になる、というふうに考えればいいかも
>>293さんもといボブさん
divide([A,B|Xs],[A|Ys],[B|Zs]) は リストをAとBに分けてそれをまたそれぞれYsとZsに分けるんですよね?
divide([A|[B|Xs]],[A|Ys],[B|Zs])はAを抜き出して次に[Bという先頭を抜き出し余ったものをXsとしてるんですよね?
>>294さん
[a,b,c,d,e].だったらaをとったらL1に行き
次のbはL2に行きっていうのを繰り返すんですよね?
これがaを奇数とすると奇数を取ったら次は偶数ってことですか?
疑問詞ばかりで申し訳ないです
頭がおかしくなって死にそうです・・・。
>>295 > リストをAとBに分けて
ちょっとまった
[A,B|Xs]
[A|[B|Xs]]
この2つが同じものだと思っていないということ?それとも直感的な解釈の違いのことを言ってるのかな
このスレは一体何が起きているんだ・・・。
なぜか体が震えてくる。俺だけ?
>>295 [10,9,8,7,...] から [10,8,...], [9,7,...] を取るとき、
[10,8,...]がほしい立場からすれば、次の9は飛ばして8を取りたい。
[9,7,...]がほしい立場からすれば、今回の10は見送って次の9を取りたい。
ちょうどニーズが交代しているという感じで捉えているけど、もうひとつ明確じゃないねこりゃ。
>>296さん
あ、勘違いしてました・・・。
>>297さん
僕も自分の理解力がなさ過ぎて手が震えてきました
>>298さん
おぉ!なんとなくわかってきました!
[X|Ys]ここはどうしてこうなるのでしょうか?Xを排除したものをYsとしてるんですよね?
([X|Xs],[X|Ys],Zs)ここの部分を今みたいな日本語に直すとどんな感じなのでしょうか?
頓珍漢な事ばかり書いて皆さんを惑わせてしまって申し訳ないです。もう少し付き合って下さい><
> [X|Ys]ここはどうしてこうなるのでしょうか?Xを排除したものをYsとしてるんですよね?
XとYsから[X|Ys]を作っている、と読むのが自然じゃないかな
divide([A,B|Xs],[A|Ys],[B|Zs]) :- divide(Xs,Ys,Zs).
divide([A,B|CDEF…],[A|CE…],[B|DF…]) :- divide(CDEF…,CE…,DF…).
divide([X|Xs],[X|Ys],Zs) :- divide(Xs,Zs,Ys).
divide([A|BCDE…],[A|CE…],BD…) :- divide(BCDE…,BD…,CE…).
こう書き直せばわかる気がする
>>299 [X|Ys] Prologでは(注1)これは二通りの意味に解釈します。
1)・・Xはリストの最初の要素である。ただしリストとは [X|Ys] のことです。
2)・・リストYsに最初の要素としてXを付加する。できたリストは [X|Ys] です。
[X|Ys] の表現は99% 1) か 2) の意味で使われていますから、
どちらの意味であるか読み抜きましょう。
注1)・・Ysがリストでない例えば X=3,Ys=5, で [3|5] というものもあり得るのですが、
Prologではほとんど使うことがないのでこの際無視しましょう。
http://kti.mff.cuni.cz/~bartak/prolog/recursion.html ここだとまず、元のリストが奇数番目から始まるか偶数番目から始まるかを
ずっと保存しながら扱っているね。
> even_odd(L,E,O):-odd(L,E,O).
最初は1番、つまり奇数番と考えてodd/3を呼ぶ、と。
> odd([],[],[]).
> odd([H|T],E,[H|O]):-even(T,E,O).
>
> even([],[],[]).
> even([H|T],[H|E],O):-odd(T,E,O).
つまり、偶数番どうし、奇数番どうしの対応に注目するなら…
divide([A|BCDE…],[A|CE…],BD…) :- divide(BCDE…,BD…,CE…).
divide([A|BABA…],[A|AA…],BB…) :- divide(BABA…,BB…,AA…).
>>300さん
なるほど([A,B|Xs]でリストXsをつくり次に
[A|Ys]Xsを踏まえたうえでで奇数番をつくり
[B|Zs])で偶数番を作るんですね!?
>>301さん
[X|Ys] に二種類の解釈があるということをうまく理解できていませんでした。ありがとうございます
>>302さん
>>303さん
貴重な書き込みありがとうございます
divide([A|BABA…],[A|AA…],BB…) :- divide(BABA…,BB…,AA…).
は偶数と奇数に分けている事を強調して書いてあるんですね?
ちょっとまだ言葉遣いが混乱していると思うけど、
(「[A|Ys]Xsを踏まえたうえでで」とか)
大体わかったみたいでよかったね
500億かけただけあってGHCは全容が見えなさ過ぎる。
調べれば調べるだけ話題が出てくる。なんなんだ、この言語。
皆さん、本当にありがとうございました
まだ完全ではないですが理解できました
なんだか軽く荒らし兼、笑いものになってた気がしますが寛大な心で
許してください><
?-g1.
input=taro.
input=jiro.
input=2
input=..
.
input=end.
yes
endが入力されるまで繰り返し、入力をしるg1を作りたいんですけど、全くわかりません。知恵を貸して下さい。
>>308 g1 :- repeat,write('input='),read(X),(X=end;assertz(tmp(X)),fail).
repeat.
repeat :- repeat.
>>308 g1(L) :- findall(X,(repeat,write('input='),read(X),(X=end,!,fail;true)),L).
>>308 g1(L) :- g1_prompt,read(X),g1_2(X,L).
g1_2(end,[]).
g1_2(A,[A|R]) :- g1_prompt,read(B),g1_2(B,R).
g1_prompt :- write('input=').
312 :
311:2009/06/24(水) 12:23:19
>>308 この方が自然かな。
g1(L) :- g1_read(X),g1_2(X,L).
g1_2(end,[]).
g1_2(A,[A|R]) :- g1_read(B),g1_2(B,R).
g1_read(X) :- write('input='),read(X).
>>308 g1 :- repeat, write('input='), read(X), X = end, !.
終わったらrepeatへの後戻りをカットしないとまずいかもしれないよ。
g1 :- write('input='), read(X), X \= end, g1.
g1.
おまけの再帰版。
おっと「知恵を貸して」か。なら…
>>308 g1 :- repeat, write('input='), read(X), fail.
g1 :- write('input='), read(X), g1.
こうすると止まらない。そこで…
・X=endのとき止めるには、条件をどこにどのように課せばいいか。
・止まったとき成功するようにするには、どうすればいいか。
・?- g1, fail.と呼び出したとき困ることはないか、困るならどう回避するか。
(もう遅いってw)
X \= end や X = end は、
X \== end や X == end としたほうがいいかもしれない。
read/1だと変数も入力できてしまうし。
ごめん、
>>313の再帰版にもカットが必要だった。
?- g1, X=X.などとすると余計な成功が生じているのがわかると思う。
うーん勉強になるw
>>316 g1 :- write('input='),read(X),X==end,!.
g1 :- g1.
がスマートで推奨版なのかな。インタプリタのトップからの使いやすさから、
repeat/0を利用してしまうが。
失敗駆動ループを使うならrepeatのほうがいいかと
えーっとつまり、値を蓄積したいなら再帰で、という
>>319 こういうのはあるか。
g1(X) :- write('input='),read(X).
g1(_) :- g1(_).
?- g1(X), ... ,X==end.
最後に ... の中でendが消費されてしまうのが難。
匿名変数だとダメなのかな。
g1(X) :- write('input='),read(X).
g1(X) :- g1(X).
でないと。
repeatから一歩も出てないねw
表面上カットを使わない方法を挙げると、
g1 :- once(( repeat, write('input='), read(X), X == end )).
あるいは
g1 :- \+ \+ ( repeat, write('input='), read(X), X == end ).
いわゆる「生成検査戦略」の枠組み
\+ ( 生成(X), \+ ( 検査(X) ) )
で考えてもおもしろいのでは。
g1 :- \+ \+ ( repeat, write('input='), read(X), \+ ( X \== end ) ).
(証明終了までに入力されるXはすべて X \== end を満たす、わけでもない、ということを証明する)
なんか「生成検査」という言葉の使い方を間違えた気がするw
<実行結果>
split(5, [3,7,2,6,5,8], Before, After).
Before = [3,2,5] (5と同じか、小さい数のリスト)
After = [7,6,8] (5より大きい数のリスト)
となるのを作りたいのですがどうしたら良いのでしょうか?
/*停止条件*/
split([],[],[]).
split([A],[A],[]).
/*再帰条件*/
/*入力した変数Nより小さい場合 */
split([A,B|R],[A|T1],[B|T2]) :-
A >= B,
split(R,[A|T1],T2).
/* 入力した変数Nより大きい場合 */
split([A,B|R],[A|T1],[B|T2]) :-
A < B,
split(R,T1,[B|T2]). と作ってみたのですが・・・・。だめでした
引数の数が違うようですが
>>325-326 swi-prologで作ってみました。
参考にしてみてください。
split(_, [], [], []).
split(X, [H|L], [H|B], A) :-
H =< X,
!,
split(X, L, B, A).
split(X, [H|L], B, [H|A]) :-
split(X, L, B, A).
すみません。見づらいので、張りなおします。
split(X, [], [], []).
split(X, [H|L], [H|B], A) :-
H =< X,
!,
split(X, L, B, A).
split(X, [H|L], B, [H|A]) :-
split(X, L, B, A).
split(5,[3, ...
この辺を見て「3 =< 5」、つまり3は小さい側だな、と判断
split(5,[3, ...],[3, ...],[...])
ここまで決まる
split(N,[H|L1],[H|Before1],After) :- H =< N, ...
変数に置き換えて考える
こんな感じでは
>>327さん
ご指摘ありがとうございます
>>328-330さん
split(X, [], [], []).
split(X, [H|L], [H|B], A) :-
H =< X,
!,
split(X, L, B, A).
split(X, [H|L], B, [H|A]) :-
split(X, L, B, A).
と入れたら
* [X] - singleton variables in user:split/4
* Approximate lines: 1-2, file: 'と出てしまったのですがどうすればいいのでしょうか?
split(X, [], [], []).ではXを空リスト3つに分けているのですか?
否定(?)を利用してますがなくても問題ないですよね?
連レスすいません
333 :
328:2009/06/26(金) 00:27:34
>>331-332 ちょうど書き込み時間が重なったので、勘違いされたと思いますが、
>>328-329は私ですが、
>>330は別の方の書き込みです。
splitの仕様は、
>>325に合わせました。
* [X] - singleton variablesの警告は、1行目のsplitにおいて、左辺にあるXが
右辺で使われていませんよ、という意味です。
split(_, [], [], [])と書き直せば、この警告は消えると思います。
カットは必須ではありませんが、カットを使わない場合、
>>326のA>=B、A<Bのように背反となる条件を各々splitの定義に含める
必要があります。
>>332 まだ問題の理解が十分ではないようですね。その段階で
>>325のように、
「〜というものを作りたいのですが」という言い方をするのはよくないと思います。
スミマセン、なんか言い過ぎましたw
そんなによくなくもないかもしれません
>>332 なかなか、よい発想をされますね。[]の分割問題ですね。これは、
あなたが、「 []を分割してBefore=[] After=[] なんて許さん。偽だ。」と
考えるなら、この述語は
split(X,[H],[H],[]) :- H=<X,!.
split(X,[H],[],[H]) :- H>X,!.
split(X,[H|L],[H|A],B) :- H=<X,split(X,L,A,B).
split(X,[H|L],A,[H|B]) :- H>X,split(X,L,A,B).
となります。普通私たちは、
?- split(5,[],A,B).
A = [],
B = []
が好ましい仕様だと思い込んでいるのですが、
少々Prolog呆けしているのかも知れません。
私たちって言うな
>>337 リストの再帰で、
[]になった場合の検証から入るプログラマって
そんなにいるかな。まあ、時間的には一瞬だけど。
もし、変数が来たらは、常に注意を張りながらだと思うけど。
339 :
デフォルトの名無しさん:2009/06/26(金) 05:37:18
>>338 宣言的でありたいというのがある。
できることなら停止節なんて省略したい。
こういう姿勢だから、考えないね。
微妙すぎる。
>>332は明確に否定するのが親切だと思うけど、
そもそもどこかの宿題を乱暴に投げているだけような気配がするw
>>339 それだ! 停止節省略指示子の導入。
帰納論理がそこそこ行けるんだったら、
それくらい処理系にやらせたっていいじゃないか。
途中まで作って、トレースモードにして、正解を問い合わせればいい
| ?-split(5,[3,7,2,6,5,8],[3,2,5],[7,6,8]).
+ (1) 1 Call: split(5,[3,7,2,6,5,8],[3,2,5],[7,6,8]) ?l
+ (4) 2 Call: split(5,[7,2,6,5,8],[2,5],[7,6,8]) ?l
+ (5) 3 Call: split(5,[2,6,5,8],[2,5],[6,8]) ?l
+ (8) 4 Call: split(5,[6,5,8],[5],[6,8]) ?l
+ (9) 5 Call: split(5,[5,8],[5],[8]) ?l
+ (12) 6 Call: split(5,[8],[],[8]) ?l
+ (13) 7 Call: split(5,[],[],[]) ?l
+ (13) 7 Fail: split(5,[],[],[]) ?l
+ (12) 6 Fail: split(5,[8],[],[8]) ?l
「トレースモードにして」じゃなくて「スパイ点を設定して」か
344 :
デフォルトの名無しさん:2009/06/26(金) 21:10:24
>>333さん
すいませんでした。
なるほど、カットするとそこで探索を停止するからですね?
>>334-335さん
おっしゃるとおりです・・・。prolog理解するのとても難しいです
>>336さん
空リストを停止条件に持っていく場合とそうでない場合の見極めが難しいです
>>337さん
落ち着いてください
>>339さん
て、停止節ですか?
>>340さん
丸投げではないです・・・。
>>342さん
すいません。僕の使ってるprologは未完成での実行はできないです
split(X, [H|L], B, [H|A]) :-
split(X, L, B, A).
でH =< Xではない時をマッチングさせるんでよね?
カット(!)はまだ勉強していない、という前提で進めた方がいいんでしょうか
>>332 > 否定(?)を利用してますがなくても問題ないですよね?
これはなぜそう思ったんですか
>>326 > /*入力した変数Nより小さい場合 */
> split([A,B|R],[A|T1],[B|T2]) :-
> A >= B,
> split(R,[A|T1],T2).
この「変数N」というようなコメントは、問題についていたヒントか何かですか
Prologって面白すぎ。もっと流行ればよいのに。
>>346さん
軽く説明された程度です
>>347さん
授業の説明だと余分なところまでマッチングしないようにするためだと聞いたので
なくてもいいのかなぁと
>>348さん
そこは自分でプログラムするときわかりやすいように書いてみただけです
>>349さん
面白いですけど難しくて頭が痛くなりますw
>>344 > すいません。僕の使ってるprologは未完成での実行はできないです
デバッグ機能がないというのはちょっと考えにくいので、
差し支えなければ処理系の名前を、参考までに。
一つ一つの確認を細かくしないと、Prologのプログラムはなかなか組めないんじゃないかと思います。
>>325 >>344 リストがそれぞれ何らかの「集合」を表していると解釈すれば自明ではないでしょうか。
・空集合の部分集合は(どんな条件がついても)空集合だけ
・空集合を表すリストは空リストだけ
自演乙
>>351さん
terateamを使ってLinuxにアクセスしてemacsやらsicstusを入力してやってます
>>352さん
貴重なご意見感謝します
うまく見分けれるように頑張ります
>>353さん
prologの宿題スレになってますねw
こっちのスレを回ってみようと思います。情報ありがとうございました
>>354さん
いったい何と戦っているんですか?ここで自演して自分に有益になるとは到底思えませんが?
とりあえず落ち着いてください
356 :
353:2009/06/27(土) 16:39:14
>>354 いろんな言語で宿題スレに大量に書き込んでいるのは私ですが、
それがなにか?
これは前スレで、よそのスレに載っているプログラムや課題を
このスレでPrologに書き直そうという提唱や、
Prolog10000Tipsを目指す活動の手始めです。
prologプログラムの無限ループバグを防ぐtipsを教えてください。
C以上に暴走しやすい危険な言語ですね。
>>357 > 暴走しやすい
これはいつだか、大学の先生がPrologで作ったCGIが無限ループしてひどいことになっていたのを見て思った
>>356 これまでの観察によれば
・動作確認をしないことが多い。
・ISOから外れた述語を断りなく多用する。not/1など。
・勘違いを書いても明確に訂正しない。
このへんはちょっとどうかと思っています。
2ちゃんねるだからアリ、という考えなのかもしれませんが。
オウフ語
・”F”は、太ったものに当てはまる。
・”G”は、貪欲なものに当てはまる。
・”a”は、アルバートを表示する。
・”b”は、ベティを表示する。
・主語述語形式の文”Pn”が新であるのが、”n”が表示するものが、
”P”が当てはまるもののクラスの要素であるとき、かつ、そのときに限る。
・”¬A”という形式の文が新であるのは、文Aが真で無いとき、
かつ、そのときに限る。
・”A&B”という形式の文が新であるのは、文Aと文Bがともに新であるとき、
かつ、そのときに限る。
誤字多すぎた。も一回。
オウフ語
・”F”は、太ったものに当てはまる。
・”G”は、貪欲なものに当てはまる。
・”a”は、アルバートを表示する。
・”b”は、ベティを表示する。
・主語述語形式の文”Pn”が真であるのは、”n”が表示するものが、
”P”が当てはまるもののクラスの要素であるとき、かつ、そのときに限る。
・”¬A”という形式の文が真であるのは、文Aが真で無いとき、
かつ、そのときに限る。
・”A&B”という形式の文が真であるのは、文Aと文Bがともに真であるとき、
かつ、そのときに限る。
表示的意味論付き単純言語オウフ。
例えば、アルバートを表示する、というのはアルバートという人がそこにいる
事態を指す/結びつける。
参考文献も表示したほうがいいのではw
>>363 つまりこういうことかも。
・POSTなりGETなりの方式で入力が与えられることを前提にしている。
・無入力の場合に暴走するように書いてしまっている。
・読ませるためのソースに実行可能フラグをつけてしまった。
用語が変だった
"実行可能フラグ" の検索結果 約 291 件中 1 - 10 件目 (0.19 秒)
> 真ということ は、実行可能フラグが立っていることを表すに過ぎません
> True indicates only that the execute flag is on.
"execute flag" -"No Execute flag" の検索結果 約 963 件中 1 - 10 件目 (0.13 秒)
「実行許可(ビット)」あたりかな
>>360 しっかりと、観察して下さったようで、ありがとうございます。
すでに利用していて、それを多少読みやすく書き換えたものも
ありますが、Firefoxの六行の小さな窓の中で上から書きながしたものが
ほとんどで実際動作実行をしたものはあまりありません。
Upしたものを読み返して、間違ってるなと気がついた時は訂正して
いると思いますが。C/C++の宿題スレの更新速度が急でコーヒー休憩に
少しづつ課題をUpして次の休憩にコードを書きなぐるという書き込みな
ので、実行確認は今後もしないと思います。間違いは指摘してください。
標準の組み込み述語に限定すると、2chの1レス枠に入らなくなる
課題が多いため、繰り返し使われるものについてはライブラリに
あるものとして、いちいちの定義を省略しています。
get_line/1または2、get_lines/2、split/3、concat_atom/3、append/4、
などがそれです。他の言語との比較と言う観点からはフェアでないとも
言えますが、書き込みの目的がチュートリアルの草稿としてこれを公開
することにあるのであまりその点は気にしていません。not/1は\+より
こちらの方が誰にでも意味がわかるいう理由でこれで通しています。
369 :
368:2009/06/28(日) 05:01:05
と、いう人がいるので注意してください。
371 :
368:2009/06/28(日) 05:13:09
10000Tipsについては、著作権の問題が出てくるようで
弁護士に相談中。いちいち著作者に了解をとることは
コスト的に無理なようなので。
試しにスポーツルールの述語化をしてみようと思ったの
ですが、ただただベースボールマガジン社が発行している
著作物を編集し直した物になってしまいました。
>>370 ところであなたも早朝派ですか?
私は早朝ジョギング派なので3時半起きで、2chの書き込みも
その後1-2時間の間にしますが、それに関してのメールが6時前に
到着しているので驚くのですが。結構多いんですね。
>>311 サービスで仕様を拡張していますが、そこはそのままにすると、
g1(L) :- g1_prompt,read(X),g1_2(X,L).
g1_2(end,[]).
g1_2(A,[A|R]) :- \+(A==end),g1_prompt,read(B),g1_2(B,R).
g1_prompt :- write('input=').
ですか。
早朝派じゃないのに書き込んでみるテスト
Prologって研究には良さそうでも就職にはヤヴァそう
C, C++, Java辺りを必須という求人は何度も見たことはあるが
Prolog必須という求人は見たことがない
なぜか日本では皆無ですね。
うちがそのうちのせますが。いまはきゅうじんのよゆうなし。
377 :
374:2009/06/28(日) 06:15:11
何の話か明確にすると、
?- ... , g1(L), ... ,fail.
のように、一度end入力で終了したg1がバックトラックによって、
再び実行の可能性が生まれた場合に、意図通りの結果になるかと
いうことです。
それから、いろんな言語で宿題スレですが、私のPrologコードは
課題を示したレス番号の頭にtをつけたHTMLファイルを
nojiriko.asia/prolog/ というディレクトリに全部コピーすることに
しています。メールなどで間違っているんじゃないかと指摘を受けた
場合は、このサイトの方はできるだけ速やかに訂正しますが、宿題スレ
の方にはその旨の書き込みはしません。いつの間にか書き換わって
いることも多いのでちょっと覗いてみてください。
>>375 いまやビジネスの世界はひたすら論理。今まで日本は会社規則があっても
無視してたり。契約書作成しようと思うと取引先から敬遠されたりと、
論理的なことを何かと回避できる環境にあった。
んでまぁそういう時代は終わりを迎えている。
今や本屋の自己啓発本コーナに行けば論理が大事だ、という本が置かれ、
論理に対する需要と言うのはかなり上がっている。
確かに一般に普及する可能性は低いけど、上記の論理的な力を必要とする層
(金融とかコンサルとか上流の方々ね)には教育用ツールとして需要がある
可能性はある。例えば、『〜論理トレーニング』という本の内容として
prologによる論理トレーニングとか。
あとは、企業の訴訟リスクが上がっているとかなんとか理由つけて法律の
エキスパートシステム作ってみるとか。
裁判所の判例はもはや膨大で、弁護士費用は高い。とりあえず、抱えている案件に
合致する判例があるかどうか探索するシステムとか作れば結構いけるんじゃない。
法律家の助けが必要だけど。差別化は結構できるんじゃないかね。
あと、心理学の人と、認知科学の人、哲学の人も必須だな。
普通にやると第五世代と同じ末路になる。
あと問題は日本語文のパターンマッチかな。
うーん。微妙な日本語だ。
あと20年前と違うのはWebの発展なんだから、セマンティックウェブ関連で
なんか出来そう。
500億かけた研究結果がそのまんま公開されてて、しかもどうやらあんまり
中身を見られていないみたいなんだし、意外と宝の山かもしれないよ。
(評価計算の方法がわからないし、現在価値としては下がっているけど
少なくとも数千万ぐらいの資本価値はあると考えてもいいはず。いきなり
数千万資本をゲットできるというのはそれなりにお得な気はする。)
見直す価値がある可能性はある。
前に10000Tipsは著作権の問題が出てくるということを書いたのですが、
意味がわからんとのご意見メールをいただきました。
私の「Tip」のイメージを示します。これで2Tips。
燃ゆる頬(ラグビーの頬傷ほてる海見ては).
燃ゆる頬(車輪繕う地のたんぽゝに頬つけて).
燃ゆる頬(目つむりていても吾を統ぶ五月の鷹).
燃ゆる頬(沖もわが故郷ぞ小鳥湧き立つは).
<以下略>
句集(燃ゆる頬,寺山修司,ラグビーの頬傷ほてる海見ては).
句集(燃ゆる頬,寺山修司,車輪繕う地のたんぽゝに頬つけて).
句集(燃ゆる頬,寺山修司,目つむりていても吾を統ぶ五月の鷹).
句集(燃ゆる頬,寺山修司,沖もわが故郷ぞ小鳥湧き立つは).
<以下略>
----- ここまで役に立つTipなし
386 :
デフォルトの名無しさん:2009/06/30(火) 15:44:51
Tips というより、データベースでは?
>>386 Prologですからデータベースですが、それをTipという感覚でやろうということです。
福島さんが100mの日本記録出した時、何歩で走ったか。これをビデオで確認したから
述語としておこう。これでひとつ。
Googleで検索できない対象というのがありますね。一つには過去の文献や文学作品の
内容に関する部分。無尽蔵にあります。これはTipとして復活するだけで価値がある。
構造のしっかりしたデータベースである必要もないし、述語として十分に機能する
必要さえない。気楽に日常的に拾い上げられることだけが大事です。
天気(神奈川,20090630,晴れ).
好き(イチノ,理美).
% p(原因, 結果)
?- p(X, 俺に彼女ができる).
false
392 :
387:2009/07/01(水) 05:32:35
気楽にと書きましたが、逆に徹底してとか、偏執狂的にというのも
あるでしょう。ある書物を徹底的に述語化してしまうとなどがこれ
です。古典的なものはもちろん現代の例えば白書的なものでも、
表、グラフの述語化は十分に有用で希少価値を持ちます。社会的に
文章、表、グラフなどの中立をする形式は未開拓であり、未完成に
放置しても、後に利用、発展が自然に可能なProlog述語への書き換
えは有力なものではないでしょうか。
前スレに書いたことですが、私のインタプリタ環境で
?- 相模(X).
と質問すると答えが返ってきます。相模/1は未定義ですが。
未定義の質問が(導出の最中でも)現れると、その述語名の
性質を調べて、関係ありそうな分野からの検索します。分野には
古典文学->歴史文献->地名等 の優先順位がつけられているため
?- 相模(X).
X = 花ならぬなぐさめもなき山里に桜はしばし散らずもあらなむ;
X = なにか思ふなにをか嘆く春の野に君よりほかに菫つませじ;
X = 見わたせば波のしがらみかけてけり卯の花さける玉川の里
no という具合になります。この歌並びからこれは千人万首を
検索してるだけだなとわかってしまいますw
セマンティックウェブの話もありましたが、ウェブに頼らずこういった
情報発信を自らPrologサーバからやろうではないかということです。
多くのボランティア的献身によって(千人万首もそうだ)我々のウェブ
環境は豊かになりましたが、的確に得られる情報は未だ極々僅かです。
負担にならない蒐集・表示形式としてPrologが活躍する余地は大きい
ように思いますが如何でしょうか?
397 :
デフォルトの名無しさん:2009/07/01(水) 12:16:39
split(5, [3,7,2,6,5,8], Before, After).
Before = [3,2,5] (5と同じか、小さい数のリスト)
After = [7,6,8] (5より大きい数のリスト)
このようにリストの中を与えた数より大きいか小さいかで分けたいのですが
どうすればよいのでしょうか?
>>387 opencycとかWordnetの日本版ってこと?
>>399 そうですねとは、さすがにいえないw まだ何も始まってないから。
ライブラリを目指すのではなく、
断簡、反古として知識、ルールの切れっ端を
可能な限り隙間なく集める。述語とする。
ありとあらゆる分野に於いて。
使い手は適宜、論理変数を補充して、自分にふさわしい
使い方を見つける。
10000Tipsとは極度に控えめに言っている。
10000があっという間ではないかと予感させる一例を。
典拠不詳(古墳多くは少年の人).
/* でも、 */
古墳多くは少年の人(求塚,世阿弥,典拠不詳).
/* でも */
述語にしておこうと思い立った人が閃いた形式で登録すればよい。
典拠不詳であることが大事なのか、世阿弥の求塚という作品に
「古墳多くは少年の人」という一節があることを伝えたいのか、
そんなことはどうでもよい。心にとまったことを書き付ける形式が
ひとつあるということだけが大事なのだ。
>>400 意図としては大体了解できたと思う。ただ、
>>ありとあらゆる分野に於いて。
というのは、気を悪くして欲しくないけど、それは危険フラグだ。
辞書爆発が問題で使い物にならないといわれているのに、
改めてそれに無策で挑むというのは、人を説得しきれない。
むしろ分野を限りなく限定させてしまったほうが面白い結果が
得られるかもしれない、と無責任に思う。
言語哲学にどう接続させるか。
人は壁にぶつかって成長していく。静かに見守ろう。
切れっ端ならtipsじゃなくてchipsだね
辞書でchipを引くとひどい意味ばかりあるw
最近まったりが足りない。
Prologではったり
この言語極めたらガンダムのハロとかオートマトン作れんの?
うん
413 :
デフォルトの名無しさん:2009/07/11(土) 09:55:54
失礼します初心者です。
Prologで(C言語的な意味で)普通の計算式ってどういう風に書くのですか。
x=50
y=100
z=x^2+2*y+5
print(z)
みたいなかんじのことをProlog風に書くとどうなるのでしょうか。
>>413 Prolog風かどうかは疑問ですが。どこが違うかよく見てください。
?-
X=50,
Y=100,
Z is X^2+2*Y+5,
write(Z).
416 :
413:2009/07/18(土) 06:57:50
遅くなりました。プロバイダがアク禁だったので。
おかげさまで計算することができました。ありがとうございました。
他スレで質問したのですが流れてしまったのでこちらで質問させてください
?- con2(2, [1,3]).
no
?- con2(1, [2,3]).
yes
と答えるようにしたいのですがどうしたらよいのでしょうか?
con2(1, [2,3])だけをyesとしたいのであれば、
con2(1, [2,3]).
と定義するだけでOK。
>>417 con2(X,Y) :- X = 1, Y = [2,3].
>>418さん
>>419さん
言葉が足りていませんでした・・・。
今、ハノイの塔の問題を作っていて
ペグの上に載るディスクは常にそのペグの最小ではならないと
移動先でもディスクは最小でないとならないって言う制約の判定をする部分を
作っていてそこに当たる部分なんですが・・・。
途中までは作って制約の部分の製作がわからなかったのでこちらで質問させて
いただきました
未完成のプログラム乗せたほうがいいですか?
>>420 一番上の円盤(B)がAより大きい
con2(A,[B|R]) :- A < B.
>>420 'Aの一番上の円盤がBの一番上の円盤より小さい'(A,B) :- A=[A1|_],B=[B1|_],A1 < B1.
'Aには現在載せられない'(A,B,C) :- A=[A1|_],B=[B1|_],C=[C1|_],A1 < B1,A1 < C1.
>>420 本当に必要な述語はどんなものかという分析ができているのかどうか
ちょっと不安
>>417 ?- con2(1,[]).
これは?
>>421さん
そのままのせてみたらエラーが出たのでcon2(A,[B|R]) :- A < B.
をcon2(A,[B|_]) :- A < B.としたらソースの読み込みはできたのですが
エラーが出てしまいました
>>422さん
それをいれて実行してみたら
Permission error: cannot redefine built_in ','とでてしまいました
(A,B) :- A=[A1|_],B=[B1|_],A1 < B1.の部分はまとめると
con2(A,[B|R]) :- A < B. となるのかなぁと思ったのですがどうでしょう?
>>423さん
なんかその通りなきがしてきました・・・。
>>424さん
申し訳ないです。そこまでは書いてなかったです
>>425です連レスすいません
:- [search].
initial_state(hanoi, [[1,2,3],[],[]]).
goal_state(hanoi, [[],[],[1,2,3]]).
operator(hanoi, left_to_right(Disk), [[Disk|RestA], B, C], [RestA, B, [Disk|C]]) :-
con2(Disk, C).
operator(hanoi, left_to_center(Disk), [[Disk|RestA], B, C], [RestA, [Disk|B], C]) :-
con2(Disk, B). % 移動先で制約2を満たしていることをチェック
operator(hanoi,center_to_left(Disk), [A, [Disk|RestB], C], [[Disk|A], RestB, C]) :-
con2(Disk, A).
operator(hanoi, center_to_right(Disk), [A, [Disk|RestB], C], [A, RestB, [Disk|C]]) :-
con2(Disk, C).
operator(hanoi, center_to_center(Disk), [A, B,[Disk|RestC]], [A, [Disk|B], RestC]) :-
con2(Disk, B).
operator(hanoi, center_to_left(Disk), [A, B,[Disk|RestC]], [[Disk|A], B, RestC]) :-
con2(Disk, A).
%-- 制約2
% 一番上にあるディスクよりも、小さいことを検査
/* ?- con2(2, [1,3]).
?- con2(1, [2,3]).
ここまでは作ったんです制約のところは
con2(X,Y) :-X > Y,con2(X,[Y|_]).と最初作ってみたのですが
| ?- search(hanoi,S,G,P,A). と聞いてもnoと答えられたので詰まってしまいました・・・。
突っ込みどころに目移りしますが、とりあえず…
>>426 > con2(X,Y) :-X > Y,con2(X,[Y|_]).と最初作ってみたのですが
その定義では
?- con2(1, [2,3]).
としたとき、1 > [2,3] という(規格上は)意味のない目標が実行されますよね。
Yとしてリスト(のみ)が与えられることを意識していないように見えます。
そもそも「一番上にあるディスクよりも、小さいことを検査」するのに、
なぜ再帰的定義を使おうと思ったのでしょうか。
428 :
デフォルトの名無しさん:2009/07/22(水) 10:20:15
質問です
学校の宿題でナンプレ(数独)を解かないといけないんですが
この言語肌似合わなくて今だにさっぱりです
できれば答、ダメなら方向性だけでも教えてください
>>428 肌に合わないなら無理してPrologで解く必要は無いよ。
自分に合った言語を使えばいいんだから。
Prologを使う事も宿題の前提の一つならあきらめなさい。
神様や天才じゃないんだからあきらめることを学ぶのも勉強。
だまには宿題ができず先生に怒られるのもいいでしょ。
それが嫌なら、まずは自分でできるところまでPrologで挑戦して、
できなかったところを具体的に自分の言葉で表現してみて。
そうすればスレの住人も返事のしようがある。
prolog使うのも条件なんです
最終レポートなんで出さないのはちょっと…
c系列なら二次元配列で表して左上はじから数字を当て嵌めてダメならバックトラックで出来ると思うんですがprologでそれをどうやっていいのか見当がつきません。
ヒントだけでもお願いできませんか?
あきらめなさい
理解してないくせに単位だけ取ろうなんて図々しいよな。
すみませんご迷惑かけました
>>433 ありがとうございます。みてみます。
436 :
429:2009/07/22(水) 12:57:12
>>430 「Nクィーン問題」というパズルは知っているかい?
数独と同様、マス目にクイーンを「あるルールのもとで配置する」というもの。
非決定性プログラミングとか全解探索問題の定番といっていいほど有名なパズルだから、
Prologの教科書を何冊かあされば(あるいはググれば)コード付きで解説されてるはず。
まずは、このパズルの解法を完璧に習得してください。
これまでの講義をまじめに受けていれば理解できるはず。
もし理解できなかったらあきらめなさい。最終レポートにもなってあわてても遅すぎる。
次に、数独はNクイーンの応用問題だから、応用するうえでのヒントを。
まず最初の数字の配置を exist(Y,X,N) で表現する。YとXはマスの行番号と列番号、
Nは置かれている数。Wikipediaの例であれば、以下のようになる。(一部だけ)
exist(1,1,5). /*「1行目の1列目には5が置かれている」という事実 */
exist(1,2,3).
exist(1,5,7).
exist(2,1,6).
exist(2,4,1). /* 以下、省略 */
あとは、
(1) <1,1>から<9,9>までの範囲内で、上記の事前配置に含まれない(つまり空のマス目の)
対(つい)を「生成」する述語
(2) 配置したい1から9の数を「生成」する述語
(3) 事前配置(制約)のもとで生成した空きマス(1)に生成した数(2)が配置可能であることを
「判定」する述語 --> これが数独のルールの実装になる
を定義していく。
>>426 > %-- 制約2
> % 一番上にあるディスクよりも、小さいことを検査
「一番上に今置こうとするディスクXよりも、その下にあるディスクYがすべて小さいことを検査」
と、強引に変形してみると、心なしか
> con2(X,Y) :-X > Y,con2(X,[Y|_]).と最初作ってみたのですが
これに近くなる。なんていうエスパー解釈はダメでしょうか…
(Yを半ば集合的にとらえるところがミソ。[Y|_]がどこか投げやりであることにも符合)
>>427さん
再帰のプログラムばかり作っていたのでつい・・・。
initial_state(hanoi, [[1,2,3],[],[]]).
goal_state(hanoi, [[],[],[1,2,3]]).の部分の数が4,5,6・・・と増えても使えるようにしないとなーとなんとなく
考えてたので再帰的に作っていました・・・。
自分の中の考えとしてはXという値とリストの先頭にあるYを比べて
って・・・・書いてる途中で気づいたんですがX > YではなくてX < Yでした・・・。
しかしそうすると
>>421さんの作ってくれたプログラムを当てはめれば動くはずなのに
エラーが出てしまうのはなぜなんでしょう?
Rが定義されていないみたいなエラーだったのでBの後ろは_として実行もしてみたんですが・・・。
理解力いまいちですいません
>>438 > Rが定義されていないみたいなエラーだったのでBの後ろは_として
この行動の説明ができれば疑問はないような気が。
これはこれでいいとして、問題は「エラー」(ではなくて警告だと思いますが)なのか、
期待通り動かないことなのか、なんだかよくわかりません。
いや、余計ではなくて「(または_で始まる(無名でない)変数)」と言い換えるべきなのかも
>>440さん
[R] - singleton variables in user:con2/2
と出ているのでRは定義されてないよ〜って言ってるんだと思うんですが
どうなんでしょう?
>>441 _X でも警告されるんじゃ婦負の? SICStus のことはよくわからんが。
>>442 R のように節のなかで一回しか使われていない変数は虚変数といって、
実効がありません。実は変数名の付け間違いという可能性が高いため
処理系からWarningがでますが、Prologの仕様としては、エラーでは
ありませんし、Prologのプログラムの中ではそんなに珍しいものでも
ありません。全く気にすることのないものです。
実効がないと書きましたが論理的に実効がないと言う意味であって、
[A|R] ではなく [_一番上の円盤|_それより下の円盤の重なり] だったら、
ドキュメントとしての実効はあります。こんなアクの強い事例は少ないで
しょうが、多少のニュアンスを残すために虚変数はよく使われます。
>>443 single_var_warningsというPrologフラグの説明によれば
> variables not beginning with `_' occurring once only
というのが警告対象なので、_から始まるものは除外されているね。
確かに昔SICStusを使ったときそんなで、利用した覚えがある。
「don't care variable」という言い方があるらしい
>>442 初心者はその警告を無視しないほうが無難だと思います。
>>442 つまりまとめると、
>>421を書いた人は「一度しか現れない変数は間違いの兆候とみなされる」という原則を
意図的に無視したか、単に動作確認せずに書いて自己弁護しているかw、
ということでしょう
>>449 なんでそんなことが長々話題になってるのか解りません。
私の処理系ではWarningも出ないだけです。
それはなおさら興味深いじゃないですかw
>>448に補足すると、
「一度しか使っていないことに気づかなかった」こと自体はどうでもよく、
単に「意図せず食い違いが生じた」ことを浮き彫りにするための手段になるということです。
>>451 ごめん。IF/Prolog自体はconsult時にWarningを出してました。
私のはもう一層上にインタプリタが被っているので。
というより、ご指摘どおり、今やってみただけで、処理系での動作確認などは
確かにしていません。
ただ、この話は私の書いた >>444-
>>445 に尽きると思いますが。
済みません。間違ってたかな・・・
虚変数というのはトップレベルになくてはいけないという定義だったかも。
cons3(A,B,C) :- A < B. の場合の C は虚変数だが、
cons3(A,[B|C]) :- A < B. の C は虚変数ではない、かな。
トップレベルってそういう解釈でいいのだろうか。
虚変数という言葉は初耳ですが、要するに、
名前をつけただけで呼ばれることがない変数(の実体)は、
実行中に名前を覚えておく必要がない(「環境」から除外できる)ということでしょう。
いや、「名前」の問題だけではないか。
とにかく一定の処理を省略できるという特質があるということでは。
anonymous variable(「無名変数」、まれに「匿名変数」)の別名として、
void variableという、「虚変数」に近い言い方があるみたいですね。
>>454 なるほど、複合項の一部に持たせるときはその記憶領域が必要ですね。
某処理系のあのバグの本質はそういうことだったのか。。
勉強になりましたw
p(X) :- Y = [H|T].
>>446 ども、ありがとうです。
>>445 みたいに使うのかな。
コメントでもいいような気もするけど。
よく考えると、自分が利用したのは、
?- findall(_X,( _X = a ),L).
のように問合せの中に使って、成功時に値を見なくていい変数であることを示す、
という効果だったような…。それは別の処理系だったかな…。
亀レスすいません
>>438です
>>437さん
レスがかなり遅れて申し訳ないです
ちょっと違いますがそういう解釈してました
>>442で質問した[R] - singleton variables in user:con2/2
は皆さんが教えてくださったとおりwarningメッセージで実行には問題なかったです
それとnoと出ていた件についてなんですが
どうやら
>>424さんが質問してきた部分が上手くいっていなかったので
noといわれていたみたいです
con2(A,[B|_]) :- A < B.
con2(A,[]).
としたら一応は解は出たのですがなんだかループしている気がします・・・。
バックトラックを何回やってもnoにならない・・・。
ハノイの塔の3つのとき方ってそんなにあるんですかね?
>>462 > ハノイの塔の3つのとき方ってそんなにあるんですかね?
無限にあるよ
initial_state(hanoi, [[1],[],[]]).
goal_state(hanoi, [[],[],[1]]).
で考えると、
左→右
左→中→左→右
左→中→左→中→左→右
左→中→左→中→左→中→左→右
:
こうなるんじゃないかな
節の並べ方によっては
左→中→左→中→左→中→左→中→…
と止まらなくなるおそれもあったのでは
>>462です
15手順目位までは特に変わりは無かったのですがその後が変わっていってました
手順は20とか23でとまっていたので手順が雪だるま式に
増えるわけではないみたいです
>>467さん
( ゚д゚)・・・・
みなさん長々とありがとうございました
Prolog は凄いな。
複雑な式
A is B + foo(C * D) / 2
がそのままデータとして扱えるなんて。
新たな演算子を自分で作れるのも、
それを組み合わせて新しい文法が定義出来るのも
(危ういと言えば危ういけど)凄いと思った。
LISP よりも Prolog の方が DSL 作るのに向いてるかも。
むしろProlog自体が異様に応用力の高いDSLなんじゃ、と思うことがある
472 :
デフォルトの名無しさん:2009/08/05(水) 16:53:08
SWIなら「=..」なんていう反則述語もあるし
?- findall(A,hoge(A),AList)
or
?- hoge(A),fail.
でhogeが成り立つAを全部持ってこれるバックトラックの便利さも異常
それに、計算量を無視するならとても綺麗に書ける
474 :
デフォルトの名無しさん:2009/08/05(水) 17:53:17
>>473 マジでw
もはや一階述語じゃないISOなのかw
制約(constraint)を扱える処理系ってどんなのがありますか?
476 :
デフォルトの名無しさん:2009/08/05(水) 18:58:12
478 :
デフォルトの名無しさん:2009/08/05(水) 22:58:18
>>477 あの述語自信はそうかも知れないけれど、
あの効果を許すとそうでなくなるのではと。
述語を作れる述語でしょ。
>>478 univは複合項とリストを単一化するだけで述語を作ったりはしませんよ
>474はfindallが一階述語じゃないこともわかってない気がする
「述語を作る」という言い方は、微妙にややこしい。
論理式を作るのなら、Goal = p(X,Y)、Clause = (p :- q)などでもできる。
項と論理式を表面上区別しないから。
例えば
findall(A,hoge(A),AList)
を論理的に考えてみると、
Findall(Hoge,x) ≡ ∀y[Hoge(y) ≡ Member(y,x)]
みたいな二階述語になると思う。(あってる?)
(=..)/2などで述語と引数をくっつけなくても、述語の引数にあたる変数を指定しさえすれば
高階の呼出しは表現できる、という例になっているんじゃないかな。
でもまあ言いたいことはわかるというか…。
> Findall(Hoge,x) ≡ ∀y[Hoge(y) ≡ Member(y,x)]
これはリストの順序とか全く無視していてかなりしょっぱかった。今は反省している。
484 :
デフォルトの名無しさん:2009/08/06(木) 04:43:20
>>480ー481
うんそうなんだけれど、特定の述語で高階化されているというのはまあ、
そう言う機能とかAPI欲しいよねってことで納得できる
中でごにょごにょしてるんだろうと。
=..が変?なのは、述語記号そのものを変数化できるということ
=..を使えば ∀X [X(Y, Z)] ってかけちゃうし
なんか言ってること微妙に間違ってる気もするがまぁいいやw
よくわからんけど、
述語論理の述語変数(や述語記号、関数記号)には個々に変数の数が決まっていて、
そもそもPrologの述語名(や関数子)とは対応していないから、
findall/3のやり方の方が、見た目は違っても述語変数を再現できている面がある。
とにかく(=..)/3がなくても一階論理を超えまくっている以上、鍵のように言うのは変だよ。
高階論理風の見た目とPrologの高階性は違う、というか。
(=..)/3じゃないや。。
?- alive(noriP).
no
そんな推測に過ぎない節を登録しないで欲しいな…
え?
登録されていない事実だから、否定してるのでは?
なるほど。
?- stayAt( noriP, Place ).
?-guilty(noriP).
493 :
デフォルトの名無しさん:2009/08/10(月) 13:32:34
自信なさそうに、ちょっとうつむき気味に挙手してるようにも見えるなw
495 :
デフォルトの名無しさん:2009/08/18(火) 19:06:04
プロロげ!Prologer!
ちょっとまったりし過ぎじゃないか?
レスもprolonger。
じゃあ別スレで出てきた覆面算でも
ONE + NINE + TWENTY + FIFTY = EIGHTY
やってみたけど、多少枝刈りしても1分以内にはできなかった。
いや、普通の環境ならできるんだろうけどw
prolonged...
誰がうまいこと言えと
Prologってコーディング標準とかないのですかね?
標準でなくてもいいのですが、よく使われている規約などあれば教えてほしいのであります。
>>503 ICOTではあったと思うけれど、資料はないだろうな。Prologはほんの一部ですが。
その後は、各企業毎に多少は決められてるだろうけど、ほとんど「ない」と
言い切っていいレベルだと思います。
私の場合は「散文的」でありたいと思ってるから、
そういう規則は設けないですね。
>>507 % Prolog
t507(1) :- write_formatted('%t\n',[ようこそC言語へ]).
t507(2) :- write_formatted('%t\n%t\n',[ようこそC言語へ,'C言語をはじめましょう']).
失礼、誤爆でした。
>>507と
>>508は「いろいろな言語で宿題スレ」に
書き込まなくていけなかった。錯覚しました。
世界の散文化はPrologでなされるのだろうか。
OS X 10.5.8にもSICS Prologってインストール可能だろうか?
なんですか偉そうに。かわりに読んでください。
どうしてそういう不安があるの
Mac OS X は、普通の Unix 系の OS だから、他の Unix 系の OS で動くアプリケーションなら、動くよ。
動かないのは、デバイスドライバとかの特殊なソフトウェアじゃないかな。
ただ、Mac OS X 用のアプリケーションは、他の OS じゃ動かないよ。
Mac OS X の独自機能だけを使ってアプリケーションを作るのが通例だろうから。
> Mac OS X は、普通の Unix 系の OS
machスレッドはpthreadとお約束が違うので
微妙に動かなくなったりするけどな
518 :
デフォルトの名無しさん:2009/10/01(木) 20:27:12
Prolog でやるエロゲー作ったら、みんな Prolog やるんじゃね?
俺は、エロゲーやらないけど
>>518 lisp ベースのゲームエンジンがあって、それを使ったゲームは
そこそこ売れているんだけど、みんなlisp やんないよね
520 :
デフォルトの名無しさん:2009/10/01(木) 20:39:50
>>519 それは、エンジンが lisp なんであって、lisp でやるわけじゃないんじゃ?
目に見えないと分からないでしょ。
Age of Empire の AI が Lisp ぽいという話はあったな
522 :
デフォルトの名無しさん:2009/10/01(木) 21:27:19
そういうチラ見せじゃなくて、
コマンドラインで Prolog 打ったら、
女の子が反応したり、
女の子に新しい何かを覚えさせたり
出来るのを考えてた
俺が喜ぶポーズを取ってみろ!
と指令を出すと、登録してある嗜好データベースで演繹して
そのシチュエーションでプレーヤーが一番喜ぶポーズを取る萌えキャラ。
subservient chickenみたいなものか
? like(you, me).
no.
〜 Fin
prologでSWAN SONG。
ピンポンピンポンピンポン!ってできたらいいなぁ。
SWI prolog はEmacsで使うとプロンプトが出ないんですが、
対処法はありますか?
Emacs22 + SWI-Prolog 5.7.15 on Linux で使ってるけどプロンプトでてるな。
環境は?昔、Windows上でつかってるときはなんか使い難かった記憶がある。
実用上問題はなかったのでそのまま使ってたけど。
>>528 Windows上でMeadow+SWI-Prolog(Version 5.6.62)です。
実用上は問題ないのですが、どうも気持ち悪かったものですから。
ファンクタに破壊的操作を加える述語ってありましたっけ?
関数子(ファンクター)をいじるというと…
例えばf(a,b)、f(123)などのfを一気にffにするとか?
述語名には影響はないんだろうか。(いや、複合項のことだろうとは思うけど)
532 :
デフォルトの名無しさん:2009/10/07(水) 05:36:52
問題.
久方のなかなる川のうかひ舟いかにちぎりてやみを待つらむ 藤原定家
この短歌に現れる枕詞「久方の」は
「なかなる川」= 京の中なる川 = 桂川 の
桂から月が連想されて、その月の光に対して、
添えられていると考えられる。
この関係を示す述語「久方のについて思い巡らし」を定義せよ。
533 :
デフォルトの名無しさん:2009/10/07(水) 07:03:07
プロログって
述語(主語や目的語や補語)
って形式だよね?
なんか自然言語の語順と一致しなくて気持ち悪いんだけど
その一因は、当時の計算機の処理能力(速度とリソース)にあると思うんだ。
いまのコンピュータ性能なら、自然言語の語順で同様のことができると思うのだけど
そういう言語でプロログに近い推論を行うものってある?
たぶんない。作ればあるだろうけど。
自然言語に近い語順、はいいけど、機械が扱うためにはきちんと形式化されてる
ことが必要だからね。
>>534 X:>自然言語に近い語順、はいいけど、
O:>自然言語に近い語順、は「どーでも」いいけど、
>>533 自然言語の語順と一致しなくて気持ちいい
気持ちがよければそれでいいのかと問いたい
問い詰めたい
自然言語にすり寄っても、論理学との関係がややこしくなったら本末転倒じゃないかな
英語的: 主語 <述語> 目的語 :- ... .
日本語的: 主語 目的語 <述語> :- ... .
この場合は述語指定に< >を使ってしまうので大小比較の時の記号表現にちょっと困る。
日本語的: (主語,目的語)述語 :- ... . とすれば現在と差なく処理できるが、
英語的: には適用できない。
relationなんで主語があるとは限らない。目的語も。
格概念への割り当てが面倒になって飽きること必至
>>533 計算機の処理能力というようなことではなく、考えに考え抜かれて、
現在の言語仕様が作られたように思うなぁ。
言語仕様はね。
構文は 述語(引数0, 引数1, ...) でなくたとえば (引数0, 引数1, ...)述語 も
ありだとはおもうけど、今の形になったのは計算機のリソースの問題とか
じゃなくて、数学の記法における慣習とか、そこらへんでないかと。
自然言語ライクな文法って、例えば Mind みたいな文法のことを
言いたいのかな?
述語が先にくる自然言語(タガログ語とか)を使えばよろしい。
545 :
デフォルトの名無しさん:2009/10/09(金) 12:34:55
op で上手く定義すれば、ある程度は自然言語に近付けられそうな気がする。
>>543 フレーゲあたりじゃない?述語論理の形式が整ったのって。
数学の関数 f(x) にヒントを得たんじゃなかろうか。
K-Prologについて教えてください。SWIに比べて制約があるようなのですが、
下記のコードはSyntaxErrorになります。
my-reverse([], []).
my-reverse([X | Xs], Ys) :-
my-reverse(Xs, Zs), append(Zs, [X], Ys).
SWI-Prologでは問題なく動くのですが。
K-Prologが本来の文法を維持しているのか?単なるバグなのか?
因みに下記だとK-Prologでも動きます。
my-reverse(R,L) :- my-reverse(R,L,[]).
my-reverse(R,[],R).
my-reverse(R,[A|L],LL):-
my-reverse(R,L,[A|LL]).
549 :
548:2009/10/12(月) 20:04:58
すみません、わかりました。K-Prologの意味不明なエラーに
悩まされていたのですが原因は単純でした。
コードの最後の行に改行がないと正しく読み取られないようです。
お騒がせしました。
最後に改行ないと本来はエラーなのかな?
>>550 SWIやYAPでは問題ないのでうっかりなのでしょう。
K-Prologはシンプルでなかなかいいです。
最近、多忙によりメンテされていないようですけど。
>>551 <終止符>は二文字で第一文字が"." 第二文字がasciiコード32以下の
文字ですから、K-prologの解釈が正しいと思います。
asciiコード32以下、という定義はちょっと面白いな。
0x1a(^Z)でもいいわけだ。
節と節の間に空白がなくて駄目だったという事態はわりとよくあると思うけど、
ファイルの終端という罠があったか。
32以下ってことは空白でもOKなのかな?
もちろんOKでしょ。最後に改行がなくても。
Prologの述語ってどの程度まで規格化されてるのでしょう?
M.Hiroiさんの順列生成のコード、K-Prologで動かないので調べてみたら
select述語の第1、第2引数の順番が逆に定義されていました。
perm([],[]).
perm(Xs, [Z | Zs]) :- select(Xs, Z, Ys), perm(Ys, Zs).
/* M.Hiroi
perm([],[]).
perm(Xs, [Z | Zs]) :- select(Z, Xs, Ys), perm(Ys, Zs).
*/
少ししらべたのでメモ。
select(X,L,<L引く[X]>)の形
・Quintus Prolog - library(lists)
・SICStus Prolog - library(lists)
・SWI-Prolog - library(lists)
・GNU Prolog
select(L,X,<L引く[X]>の形
・n-queensのプログラムにちらほら見られる(有名な本に載っている?)
Prolg-KABA では「ふろく」のプログラムの例としてQUEEN.PLが
載っていて、この中のselect/3は後者。
漏れのK-PrologからSWI-Prplog移植の経験(ほんの少し)だと、
[K] name(X, Y) が [SWI] string_to_atom(Y, X) てのがあた。
Prolog-KABAねw
Prologの場合、述語が双方向性を持つことが多いという特殊事情があり、
たとえば、member(A,L) はリストLにAが存在するかを問う場合この順序が
自然だが、Lから一要素づつ順に取り出す場合はPrologとして自然なのは
member(L,A) だろう。
Prolog-KABAか、懐かしいね。
自分はPC98買えなかったから、会社のHI-UX Prolog(超マイナー!)を触っていた。
その後、WinなPCを買ったけど、当時は日本語がまともに扱えて
個人購入できるのはK-Prologくらいだったから、重宝していたよ。
>>563 双方向性という特殊事情があるからこそ
どちらが自然であるかは一概には言えない、ってことだよね?
>>565 そうです。
もっともmember/2についていうと、append/3というスーパーセットがあり、
?- member(A,[1,2,3]). ?- foo(L),member(2,L). は
?- append(L1,[A|L2],[1,2,3]). ?- foo(L),append(L1,[2|L2],L).
と同じ意味になります。append/3くらいの地位を築いていると、
Aの位置が少々不自然でも文句を言う人はいないのかもしれない。
>>566 スマン、6年以上も昔の不正確な情報だったかもしれない。
当時作った(K-Prologの)プログラムに、以下のようなコードが残っていたから。
stringToPathList1([A|X], [B|Y]) :-
!,
name(B, A),
/* for SWI-Prolog
string_to_atom(A, B),
*/
stringToPathList1(X, Y).
ああ、昔のことだとわからないね
>>567 自分の場合、双方向性の必要の無い(入出力が明確な)リスト処理については、
関数型言語風のmap_list/select_list/if_listみたいなライブラリを作っているよ。
どれも function(入力リスト, 高階述語, 出力リスト) というスタイルで統一している。
571 :
570:2009/10/14(水) 08:54:06
>>570のif_listは間違いだ。reject_listに訂正。
if系は第2引数の高階述語向けとして定義していた。
あと、(appendに相当する)リストの結合処理は作っていないや。
もし作るとすれば、merge_list(入力リスト1, 入力リスト2, 述語, 出力リスト)
みたいな感じになると思う。
プロログで入力、出力とな!(麿のAA略
573 :
570:2009/10/14(水) 10:25:50
>>572 スマンw
ただ、並行論理型言語(KL1(GHC), Concurrent Prolog)の存在を知ってしまったから、
はたして逐次Prologにも双方向性(=非入出力)の概念が必須かどうかについて、
疑念を持ち始めていた。
もちろん、find_allといった全解探索に双方向性は必要。
でも、その後の得られた解の加工処理については、双方向性はかえって邪魔になる、
言い換えると、入出力を明確にした方がプログラムは読みやすくなると思う。
双方向性を狙って書く人は少ないと思うね。
図らずも双方向性が得られたという歓びで十分だな。
append/3 一つで済ませるをよしとするか、別述語とするかという話ですね。
Prologは基本的に単位節述語定義とappend/3だけで書くものだ、でいいと思うけど。
>>558 >>560 どうやら
select(L,<L引く[X]>,X)の形
もあるね。
% from Sterling and Shapiro, "The Art of Prolog," page 211.
と出典のあるやつ。
p右向き(X0,X) :- q(X0,X1), r(X1,X2), s(X2,X). % p右向き --> q, r, s.
p左向き(Y,Y0) :- s(Y1,Y0), r(Y2,Y1), q(Y,Y2).
あなたも順序を変えたくなーる
>>575 述語定義の中は全部appendで大いに結構だけど、ここではその一層上の
話じゃないか。ライブラリに登録する時の述語頭部の仕様のことではないか。
GoogleブックスでThe Art of Prolog(第2版)を見てみたら、
select/3は211ページ目ではなくもっと前の方に(要素先行の形で)載っていた。
ひょっとしたら1988年の初版とずれがあるとかいうオチかも。
580 :
557:2009/10/14(水) 21:37:52
みなさん、情報ありがとうございました。
http://pc12.2ch.net/test/read.cgi/tech/1254967587/486 の話ですが、こちらへ引っ越すことになりました。話の発端は
変数に情報をどこまで含ませられるか、コメントではだめなのか、でした。
A + B + C :- 売上入力検査(A,B,C,_診断), ... . と
_出荷日 + _商品番号 + _数量 :- 売上入力検査(_出荷日,_商品番号,_数量,_診断), ... .
の比較から、私が、
出荷日 A + 商品番号 B + 数量 C :- 売上入力検査(A,B,C,_診断), ... .
はPrologではできないので、としました。型出荷日のA、型商品番号のB、型数量のCが可能であるならば
_出荷日という蜻蛉のような表現よりは強いということです。
型について書いているのですが、私の視点は100%ソースコードの表現力に向けられていて、
コンパイラに於いて語られる諸問題とはほとんど無縁です。
# 自分も「美しい言語」スレから、こちらへ引っ越してきました。
>>581 最終的に実現したい事は、Prologで(「データ型機能」を実現したい!と言うよりも、)
「名前付きフィールド機能」を実現したい!という事ではないかと推測します。
たとえばRubyのメソッド定義であれば、
def 売上入力検査(出荷日, 商品番号, 数量) .... end
と記述する代わりに、ハッシュを使って
def 売上入力検査(*入力データ) .... end
と記述し、そのメソッド呼び出しを以下のように記述する事が可能です。
売上入力検査( '出荷日 => 20091016, '商品番号 => 200, '数量 => 36.4 )
これに類似した述語記述を、(更には、もし可能であれば言語レベルでの型定義/宣言/検査も)
Prologで実現したい!ということではないかと考えました。
SQL言語であれば、既にレコードとして実現されている機能ですから、
(RDBと比較して)Prologデータベースが使いづらい点だと思われます。
このような認識で合っているでしょうか?
583 :
デフォルトの名無しさん:2009/10/16(金) 17:47:05
出荷日(A) + 商品番号(B) + 数量(C) :- 売上入力診断(A, B, C, _診断結果), …
だと順番が入れ替えられないのが問題なのかな?
>>583 いや、インタプリタのトップから、
?- 20091016+200+34.6.
# 売上入力検査 true 売上 assertz(売上('20091016','0200',34.6,'2009-10-16 17:55:00.000000')) 済み
yes
?- というように使いたい。そのためには 出荷日(A) ではダメです。
Prologを拡張して、
{A | 出荷日(A)} + {B | 商品番号(B)} + {C | 数量(C)} :-
のような表現を可能にすれば、?- 20091016+200+34.6.
は実現します。これは1980年代に中島秀之氏によって「項記述」という名で
Prolog拡張の提案として出されたことがあります。
>>582 私の意図したのはどちらかというと、
>>585の型そのものですが、
この { _変数 | _型記述 } の_型記述部分にatomがくると無条件に
真となる、と定義すれば「名前付きフィールド機能」らしきものには
なります。しかし、フィールド名からどうやって呼び出すのかという
問題を解決せねばならず理論的なアプローチが必要でしょう。
587 :
582:2009/10/16(金) 18:27:58
>>584 >いや、
ということは、(
>>582の)名前付きフィールドは不要であると考え、次の質問に移ります。
>いや、インタプリタのトップから、
インタプリタのトップレベルにこだわる理由は何かありますか?
たとえば、実行例を以下であるとし、
?- read_record.
20091016+200+34.6. # <-- キーボードから入力
yes
?-
とし、述語 read_record の中で 入力値検査と assert を実行した場合、
何が問題になりますか?
588 :
582:2009/10/16(金) 18:36:21
>>587 インタプリタのトップからに拘るのは、私がそれの虜になったから
ですね。元々一覧表のようなものが嫌いで、巨像をなでるような
細部の積み重ねで本当らしきものを築き上げることを好みます。
沢山、柔軟に質問できるものをよしとします。少なくともその方が
敏感でいられます。
グラフを述語で表現しようと思っています。
e(1,2). e(3,2).
のように点を数で表し、点の接続をe(X,Y)で表そうと思います。
ところで、グラフをプログラム中から変更したいのですが、
retract(e(1,X)).
とするとエラーになります。assertしたものはOKなのですが、
予めテキストに書いて読み込んだものはエラーとなります。
こういう場合、どうするのが定石なのでしょうか?
591 :
582:2009/10/16(金) 19:41:43
>>586 2点、要求仕様に関する質問があります。
まず、
>>585の紹介してくれた中島氏の記述方式は、フィールドを前提としています。
たとえば、「変数 A の フィールド名は '出荷日' である」と宣言してます。
それに対して、
>>586のレスでは、「名前付きフィールド機能らしきものになる」と
肯定しています。
その一方で、
>>584のレスにある「いや」という表現から、「名前付きフィールド機能は
不要である」という意図のようにも読み取れるます。
これら二つの事柄は、自分の中では「矛盾」しているような気がしています。
ここから推測される意図として、以下を考えてみました。
・述語定義では名前付きフィールドを使いたい。
・ただし、問い合わせでは(フィールド名を省略した)タプルを使いたい。
この解釈で合っているでしょうか?
2点目の質問です。
# ここは
>>587の後半にある質問内容と同一ですから、省略します。
ご返答を願います。
592 :
582:2009/10/16(金) 19:48:31
# またリロードせずにカキコやっちまったゼ....orz
>>589 要求仕様について、了解しました。
# ご返答を頂いたので、
>>591にある2番目の質問は無視し、
# 先頭の質問に対するのレスだけでOKです。
GHCの処理系で今も現役のものってありますか?
また、and/or並列を自動的にやってくれるものってありますか?
>>591 一つ違うかなと思うのは、中島氏のものは後で確認しますが、私が考えているのは
出荷日(X) :-
integer(X),
今日(_今日文字列),
atom_to_term(_今日文字列,_今日整数),
X >= 20090101,
X =< _今日整数.
のような検査述語が定義されていて(20090932なども許す不完全なものだが)
{ A | 出荷日(A) } の出荷日(A)は単一化の付加機能として適用(call)される
ということです。ちょっとfindall/3の第二引数に似ています。
これで型出荷日(実は述語)と変数Aの関係が定義できます。
しかし、これは頭部による定義であり、副目標の引数にまったく同じ型の
変数は場合によると大量に発生しますから、それらの変数をD,E,F,G,H...と
置いていくと、その型についての情報はこの節の中にはないということに
なってしまいます。そのことから現在のPrologの枠組みでは型を取り入れ
それによってソースコードの情報価値を高めることはあまり期待できないと
いう結論になってしまいます。
名前付きフィールドも同様の理由から否定的にならざるをえません。
595 :
594:2009/10/16(金) 21:11:46
そもそもPrologとは論理変数のストリームを繋ぎ合わせる錬金術のことですから、
いちいち型など考えていられるか、ということになります。単純に言うと。
これは「もっとも美しいプログラミング言語は」スレで叫ぶべきことでしょうね。
>>592 と、突然正反対の結論になってしまいました。申し訳ない。
実はこの話、昔から何度も何度も持ち出してはうまく解決できず、
放棄を繰り返しているのです。
>>597 いいえ、K-PrologとSWI-Prologで試しました。
599 :
582:2009/10/16(金) 21:45:48
>>594 すいませんが、ここでレスをカキコするとスレの流れが発散しそうなので、
直接のレスは控えます。
何をしたいのか、そして実現方法としての中島氏の方式に関する質問へのレスを待ちます。
もし質問の意味に不明点や疑問があれば、質問を返してください。それには対応します。
# Prologで名前付きフィールドを実現する方法はいくつかあります。
# おそらく、中島氏の方式も、その一つであるように見えます。
# ただ、今の状況では、何も話せません。
>>590 >予めテキストに書いて読み込んだものはエラーとなります。
具体的には、どういう方法で読み込んだの?
>>593 GHCなんて超マイナーな言語を持ち出したってことは、
ICOTライブラリのサイトを見てるし、KL1という名前は知っているんだよね?
(まさかHaskellの処理系じゃないよね?w)
あと、後半の質問は知らない。
>>598 これでどうでしょうか。
ファイルの頭で :- dynamic(_述語形式リスト). を宣言します。
:- dynamic([e/2]).
e(1,2).
e(3,2).
>>601 うまくいきました。ありがとうございました。
今、ケイリーの木の公式の証明に使われているアルゴリズムを
Prologで書こうとしているところです。助かりました。
>>599 要求仕様に含まれる情報をできる限り遺漏なく、どうしたらソースコードに
盛り込めるか。これが私の課題で、型の採用は一案に留まります。
コメントでよいものか、関数名、述語名、論理変数に反映するべきなのか。
論理変数に反映したとして、どんな意味があるというのか。
それから、理論だけではなく、実務的にどれだけ有効であるか。それを測定できるか?
まったくの素人がPrologを一読して理解することがあり得るか?どうすれば可能か?
以上のような視点からの書き込みだったので一旦身を引きます。
項記述については、多分初出の第二回ロジックプログラミングコンファレンス(1984)の
Proceedingが手元にあるのでもう一度考え直して、近いうちに書き込みます。
このところの流れは単一化が邪魔してる部分の話か。
Prologの不人気の原因もそこに帰するような気もするね。
>>600 ガーン、GHCというか、ホーン節にガードを付けるって考え方はマイナーなんですか?
KLICも知ってますが、現役で開発・メンテされてる処理系ってないもんでしょうか。
Prologってもはや現実的プロジェクトでは使われることはないのかな。
マイナーというなら確かにマイナー。
GHCで表現しなくてはならないような課題を与えられた人はほとんどいない。
そういう意味でマイナー。美しさという点では一頭地を抜いてると思う。
Prologはプログラマも処理系も健在だから、いつでもプロジェクトを起こす
ことは可能だけど。
>>605 >>570だけど、逐次Prologそのもののがマイナーであることは、
このスレの寂れ具合で分かると思う。並列論理型に至っては....。
といっても、漏れは研究職でもなく、普通の職業プログラマでしかないから、
海外/国内の学会の動向を追いかけてるわけじゃない。
専門家に聞けば、また違った見解が得られると思う。
個人的には、過去に、業務でPrologでステートマシンのシミュレータを開発していたが、
そのエンジン部分をConcurrent Prologで書き換えたことがある。
処理系としてはbit誌に掲載されていたミニインタプリタに改造を加えたもの。
それ以降、活用の機会は無い。(逐次Prologは現役で、ツールとして活用しているが....。)
ただ、パイプライン構造のようにプロセスが一方向を向くシステムに限定すれば
逐次論理型言語で記述可能だけど、一般的なネットワーク構造を持つ場合には
(ストリームプログラミングによる)並列論理型言語による記述が適している。
だから、今は、システム全体を並列型で、個々のプロセス内部のアトミックな発火を
(関数としての)逐次型で記述するという、ビジネス向けシステム仕様記述技法に
応用できないかと考えている。JSD法(ジャクソンシステム開発法)に近い発想。
処理系としては、前記のミニインタプリタを復活させる予定。
608 :
デフォルトの名無しさん:2009/10/17(土) 17:49:20
Oz言語(処理系Mozart)は、どうなんだろ。
それを中心に使ってる有名な分厚い本(ゴメン題名忘れた)で、GHCとかの並列論理型言語の概念も紹介されてて、その欠点も指摘してたんだけど、
それだったら、Ozは、その欠点を克服出来るようになってないのかな。
Ozはマルチパラダイム言語であることくらいしか分かっていないけど、
問題解決の有効な一手法だと思う。その本は読んでいないけど、
おそらく並列論理型言語の問題は処理効率ではないかと想像。
ただ、論理型言語の魅力は、(処理効率を引き換えに得た)柔軟性と拡張性にあると考える。
だって、論理型言語の枠組みの中で、関係データベース、構文解析、関数、並行性、
制約解消、そしてオブジェクト指向を、次々と実現してきたんだから。
だから、プロトタイプやモデルシミュレーションといった、
処理効率の問題を無視できる用途であれば、
論理型言語(Prolog)は、まだまだ成長/発展を見込めるハズであると思う。
逆にマルチパラダイム言語は、魑魅魍魎というか混沌とした世界のように見える。
もちろんOzは触った事がないから、無知故の偏見だと思うが....。
>>582 先程から売上入力検査の部分を再考していたのですが、ドキュメントとして
ここは必要という部分だけ、型(らしきもの)を添えるというのは
やはり有効かもしれませんね。
消費税計算(商品番号 => 200,数量 => 36.4,消費税率 => 5 %,売上金額 => A,消費税 => B),
売上金額検査(A,売上金額 => C),
というようなコードだとしても、情報量は明らかに豊かになります。
消費税計算の中で金額を計算するとしている部分は不自然ですが。
>>610 Prologへの名前付きフィールド機能拡張の試みはいくつかありますが、
その一つに「レコード・プログラミング」という概念があります。
レコードとは、C言語の構造体やSQLのCERATE TABLE文のような、
<フィールド, 値>のペア(対:つい)から構成される集合を意味します。
たとえば、
消費税計算(200, 36.4, 5, A, B)
というPrologの述語記法は、以下のようなレコード記法で書き換える事ができます。
[関係→消費税計算, 商品番号→200, 数量→36.4, 消費税率→5, 売上金額→A, 消費税→B]
さらに、消費税計算 を型とすれば、以下のように表現できます。
[商品番号→200, 数量→36.4, 消費税率→5, 売上金額→A, 消費税→B]:消費税計算
'消費税計算' とは、「型(らしきもの)」なんかじゃなくて、レコード・プログラミングの世界では、
まさしく「型」なんです。型の導入によって、「個別消費税計算 is_a 消費税計算」や
「総合消費税計算 is_a 消費税計算」のような型階層(継承)の導入が容易になります。
おそらくデータ型機能(型定義/型宣言/型検査)の導入も可能になるでしょう。
そして、レコード・プログラミング自体は考え方(パラダイム)ですが、もしもその考え方を
Prolog言語へ直接的に導入したとすれば、それはまさに、
>>610のような記法になるのだと思います。
なお、このカキコのネタは、以下の書籍にある「レコード・プログラミング」の章です。
・続新しいプログラミング・パラダイム, 横田一正他著, 共立出版, 1990年
612 :
デフォルトの名無しさん:2009/10/19(月) 12:36:04
>>609 いや、指摘されてた問題点は、処理効率ではなくて、言語のモデルの方だった。
それに論理型の問題点じゃなくて、あくまで並列論理型の問題点だよ。
何かの問題では、モデルが悪くて上手く適用出来ないけど、
その原因は、並列論理型だと、並列性だったか、ストリームだったかが、自然に融合し過ぎていて操作対象として扱えないからという事だったようにと思う。
うっかりしてたけど、GHC〜KL1をやってた上田教授(?)が、それをさらに発展(?)させた言語 LMNtal をやってたよ。
日本語以外も検索する指定で google で検索すると、pukiwiki で構築されてて、英語だけで、分子っぽい図があるページが見つかると思うけど、そこが LMNtal の本拠地みたいだ。
携帯からなんで URL が書けなくてゴメン。
>>612 >並列論理型だと、並列性だったか、ストリームだったかが、自然に融合し過ぎていて操作対象として扱えない
たしかに、GHCはストリームを明示的に記述するから、それ自身は操作対象としては扱えませんね。
ただ、それ以上は(
>>608の)Oz本を入手して読まない事には何とも....。
>GHC〜KL1をやってた上田教授(?)が、それをさらに発展(?)させた言語 LMNtal をやってたよ。
LMNtalは初見でしたので、でググってみました。斜め読みですが、初対面の印象は以下の2点。
・GHCでは、プロセス間通信チャネルとして差分リストを明示的に記述する必要があったけど、
LMNtalでは、それが隠蔽されている。
・「形式的な視覚化(visual formalizm)」が可能な計算モデルである。例題のappendは面白い。
最近は並列論理型言語の動向を追いかけていなかったのですが、研究レベルでは着実に進展している
みたいですね。並列論理型言語の誕生から未来への展望については、上田教授のサイトにあった、
以下の解説が読みやすかったです。Ozも(LMNtalとは別の方向性?で)GHCの流れをくむことが見えます。
・上田和紀,論理・制約プログラミングと並行計算.コンピュータソフトウェア,Vol.25, No.3 (2008)
>>613 > たしかに、GHCはストリームを明示的に記述するから、
> それ自身は操作対象としては扱えませんね。
KL1はメタレベルアーキテクチャ持ってたよ。
OS(PIMOS)はそれで書いてた。
荘園。
Prologをほめたたえているサイトとかありませんか/
616 :
デフォルトの名無しさん:2009/10/22(木) 12:13:47
そんな過去の事より、Prologの未来の話をしましょうよ/
それと、最後のスラッシュは、なに?/
シフトキー入れ忘れて?が/になっちゃったんだろう
619 :
デフォルトの名無しさん:2009/10/24(土) 12:25:19
>>618 ; のところとかで並列に試行してるってこと?
パターンマッチングのところも?
>>619 今、Downloadが終わって、これからインストールだからw
数百節の頭部のUnifyを並列に処理して、早い者勝ちで、
候補節を得ることができるらしい。もちろんそういう指定を
した場合に。16コアなどになればかなりの高速化が期待できる
とのこと。
それはいいですね。
ところで、GHCとかICOTがらみついでなんですが、
制約付きユニフィケーションとかなんとかあったと思いますが、
あれは全然広まってないんでしょうか?
cu-Prolog(constrained-unification)というのもあったと思うんですが。
広まってたら、知ってるはずでしょw
まだ継続して研究している人はいるけれど。
多文字プログラミングの罠にはまった。
「〜が90°」のように角度の「°」をそのままアトムの名前の一部として使っていたんだけど、
元にした文書の中で半濁点と混用されていて…w
ICOTのサイトのメンテナーってどの団体なんだろうか。
研究成果のページでところどころリンク切れあるのが非常に残念。
団体って
ボランティアでしょ。
Bruce Batchelor 著 "Intelligent Image Processing in Prolog"
1991 Springer-Verlag
に出てくる述語群を適切な日本語で置き換えたら興味の尽きないものと
なりそう。こういう労作も永劫に忘れ去られていくのだろうか。
>>587 ひとついい忘れたというか書き落としたことですが、
データを入力する、
その直後に、あ、あれなんだったっけと質問する。
今入力したデータはもちろん、まったく関係ない例えば人名など。
それを解決して、次の入力。
このように進行するためには、別のWindowに移るだけでアウトですね。
同じWindowの次の行で質問して、また、元の仕事に戻る。
このためには、これからデータ入力するよと宣言した負節を起動する
のではだめです。常に質問するのに「最良の」環境を維持しなくては
ならない。インタプリタに拘る一番の理由は寧ろこちらの方でしょう。
Smalltalkという言語ができてしまって、この言葉が使えないのですが、
Prologという言語はまさにSmalltalkそのものなのですよ。
ぼそぼそと質問して、了解したら、というか了解できなくても、
またぼそぼそ。小さな質問を積み上げていくことで、少しずつ、
像を築き上げていく。そういう環境です。そのための準備をする
のがPrologプログラミングです。常にぼそぼそだかポロポロだか
わかりませんが、対話してる、それに相応しい言語がPrologです。
質問させてください
第1引数が第2引数の部分集合(リスト)であれば成功、さもなければ失敗する述語。
第1引数と第2引数はそれぞれリストで、
これらの重複部分を除いた要素すべてをリストにしたものが第3引数の値となる(和集合)
を作りたいのですがどうすればいいのでしょう・・・・。
>>630 最初の質問への答え
AがリストLのなかに存在するかどうかは
?- append(L0,[A|L1],L).
または
?- member(A,L).
で確かめることができます。それで最初の質問は
部分集合([],L).
部分集合([A|R],L) :- member(A,L),部分集合(R,L).
つまり、要素として存在しないケースの節を定義しない! ことによって実現します。
append/3とmember/2はほとんどのProlog処理系で「組み込み述語」となっているため
ユーザが定義する必要はありませんが、
append([],X,X).
append([U|X],Y,[U|Z]) :- append(X,Y,Z).
member(A,[A|_]).
member(A,[_|R]) :- member(A,R).
がそれぞれの定義です。
>>630 二番目の質問はそれぞれのリストが集合を念頭に置かれたもので
あるかどうかで、述語の定義は変わってきます。それぞれが集合の場合は、
第一引数、第二引数のそれぞれに於いては重複する要素はありませんから、
>>631のappendの定義をちょっとだけ変形して
和集合([],X,X).
和集合([U|X],Y,[U|Z]) :- \+(member(U,Y)),和集合(X,Y,Z).
和集合([U|X],Y,Z) :- member(U,Y),和集合(X,Y,Z).
で実現できてしまいます。
つぎに、第一引数と第二引数自体に重複があり得る場合は、
重複を取り除く([],[]).
重複を取り除く([A|R1],[A|R2]) :- \+(member(A,R1)),重複を取り除く(R1,R2).
重複を取り除く([A|R1],R2) :- member(A,R1),重複を取り除く(R1,R).
を定義しておいて、
和集合(L1,L2,L3) :- append(L1,L2,L4),重複を取り除く(L4,L3).
>>632 すみません、重複を取り除く/2の最後の節の最後が間違っていました。
重複を取り除く([],[]).
重複を取り除く([A|R1],[A|R2]) :- \+(member(A,R1)),重複を取り除く(R1,R2).
重複を取り除く([A|R1],R2) :- member(A,R1),重複を取り除く(R1,R2).
R2とするべきところがRになっていました。
>>629 モノローグ?
スモールトークは“軽いおしゃべり”だからボソボソってイメージじゃないので。
635 :
630です:2009/11/04(水) 13:16:27
すいません
プログラムの実行結果書くの忘れてました
?- subset([a, b, c], [a, b, c, d, e]). ⇒ yes
?- subset([a, b, c], [d, e, f, g]). ⇒ no
?- subset([a, b, c, d], [a, b, c]). ⇒ no
?- union([a, b, c], [a, b, d, e],[a,b,c,d,e]). ⇒ yes
?- subset([a, b, c], [a,b],X). X⇒ [a,b,c]
?- subset([c, d,e], [a, b, c],X). X ⇒ [c,d,e,a,b]
となります
appendとmemberはサブで使うらしいです
>>635 最後のsubset/3の二節はunion/3ではないかな
>>634 なるほど。私はネクラだから。monoっていうのはひとりということなのかな。
隠れキリシタンの末裔が講でポロポロやってるのだとするとmonologueか。
インタプリタのトップっていうのは一応会話するところなのだが・・・
>>637 でも、ボソボソって会話って感じじゃない様な
ポロポロは、会話にも、一人の発話の雰囲気にも、使わない感じが
ポロポロは田中小実昌の小説で使われた表現なんだな
実は「てんにましますわれらの・・・」とか言ってたんだろうけれど。
Prologで自然言語処理における意味解析を学んでいるものです。。
wordnetを用いてPrologでシソーラスを定義しようとしています。
しかし、いまいちwordnetをPrologで使う方法が分かりません。
どなたか詳しく説明されているサイト等ご存じないでしょうか?
圏論の創始者の一人であるマックレーンは、『数学−その形式と機能』という本の中で、
形式主義をも包括する機能的形式主義という、オントロジーの哲学みたいなことをやっているから、
当然といえば当然なのだろうけれど、実際に見ると驚いてしまう。
ただ、やっても袋小路に行き着くのが目に見えてるわ。
これもやっぱダメポ。
645 :
デフォルトの名無しさん:2009/11/19(木) 12:18:03
このスレも袋小路に入ってるね
気に触ったのなら申し訳ない。自分には使いこなせそうに無いという意味で、
否定する意図は無い。
>>625 そういえば、FTP経由で提供されていたもの(「ICOTフリーソフトウェア」など)には
すでに移転前からアクセスできなくなっていたけど、提供側も気づいてないような気がする。
Prologプログラマに質問です。
1) あなたが小さな述語を定義するとき、リピートパターンの述語の比率はどのくらいになりますか。
ここでリピートパターンとは
r.
r :- r. の型の非決定性述語であり、代表的なものとして、append/3 や member/2 があります。
2) あなたは再帰的な述語定義をする際、追加して1)のタイプの定義を作っておきますか。
質問は以上です。
649 :
648:2009/11/29(日) 07:34:25
2) は意味不明でしたね。1)は再帰的ですから。
ステッパーパターンと呼べばよかったとわかりました。
ああ、全容わかんないって言っちゃったけど、大体分かった気がする。
オントロジーやりたかっただけじゃん。
>>648 典型的には、
p(quit,_).
p(A,X) :- q(A,X).
p(A,X) :- q(A,_),!,r(A,B),p(B,X).
p(A,X) :- s(A,C),p(C,X).
のような定義かな。
完全にこの形式のものとなると少ないでしょう。
p(quit,_).
p(A,X) :- q(A,X).
p(A,X) :- q(A,B),!,p(B,X).
p(A,X) :- s(A,C),p(C,X).
という場合も多いのかな。q/2の中の副作用だけ取り除いた、
q2/2を定義して、
p(quit,_).
p(A,X) :- q(A,X).
p(A,X) :- q2(A,B),!,p(B,X).
p(A,X) :- s(A,C),p(C,X).
も考えられる。
一般型ということになると、
p(quit,_,[]).
p(A,X,[]) :- q(A,X).
p(A,X,[A|R]) :- q(A,B),!,p(B,X,R).
p(A,X,L) :- s(A,C),p(C,X,L).
も有力。
>>654 まちがえたのかな
p(quit,_,[]).
p(A,X,[A]) :- q(A,X).
p(A,X,[A|R]) :- q(A,B),!,p(B,X,R).
p(A,X,L) :- s(A,C),p(C,X,L).
第二節を訂正した。Xが取れた時に、収集リストのなかにAが
存在する必要がある。
いつの間にか、WikipediaのPrologの項が大幅に追加されている。
以前私がこのスレで難解と書いたLISPの括弧と集合の部分は削除されている。
カルメラウアーとコワルスキーの部分は変化なし。
「Trueを返す」という表現に面食らった
最近作ったプログラムの実行例
| ?- t1(3,6).
-1
---3
------6
----------10
---------------15
---------------------21
-------------------------25
---------------------------27
---------------------------27
-------------------------25
---------------------21
---------------15
----------10
------6
---3
-1
yes
副作用バリバリのプログラムを移植する練習
>>657 > Prologの処理系は、人間が入力した命題と一致する節があるか調べ、あった場合はその本体部に記述されている命題と一致する節があるか再帰的に調べる。
この部分違和感があるのだけれど、論理の世界ではこれていいの? 特に、
「あった場合はその本体部に記述されている命題と一致する節があるか再帰的に」
という部分だけど。
>>659 では違和感の無いように変更おねがいします
最初の「一致する」とあとの「一致する」では探索の対象が違うはずじゃないかということかな。
それよりまず、「一致する節」と言ってしまうと目標が(頭部だけでなく)節全体と単一化するみたいに聞こえるから、
せめて「適合する」とかちょっとずらすとごまかせるかもしれない、なんて思ったりして…
あ、ごめんなんか勘違いした。前半ナシw
本体部が Q1,Q2,Q3. だとすると、
(Q1,Q2,Q3) :-
なんていう定義節はない、ということだよね。だからといって、
Q1,Q2,Q3 を順に確かめることを再帰的にといっているわけでもなさそう。
「命題」のような言い方の問題点が
>>231以降に出ていた
GoとGo!は違う
669 :
668:2009/12/14(月) 18:38:43
Francis G.McCabe だ。不思議な名前だね。
Mcというのはゲール語で「息子」って意味。
昔アイルランド/スコットランド系の人たちには名字がなかった。
法律で名字が必要になったから、
「ローリンさんの息子のジョン」と呼ばれている人は、
John Mclauglinと名乗ることにした。
McDonaldはもちろん「ドナルドさんの息子。」
>>670 Prologとはまったく関係ないが、とても勉強になた。
親父のファリミーネームは息子と違うの?
親子3代皆違う名字?完全にスレ値だけど、すげー気になる。
おお、ありがとう。
O'ってのも息子って意味らしい。
Objective CamlがOCamlってはそんな意味にも引っ掛けてあるっぽい。
ち・ん・こ
>
>>676 その名前を書き込むなよ。
本当に来ちゃったら…
あいつはHaskellかScalaが引きとってくれるだろう。もしくはRuby。
知恵を貸してください。
今宿題で嫉妬深い恋人たちの問題をやっていて
初期状態とゴール状態をそれぞれ
initial_state(jealousy, jealousy(left,[1,2,3],[1,2,3],[ ],[ ])).
final_state(jealousy(right,[ ],[ ],[1,2,3],[1,2,3])).
と作って指し手の移動と状態変化についてはかけたのですが
状態変化したときの合法性のチェックでつまっています。
legal(jealousy(right,[[1],[1,2]], [[2,3],[3]]) ×
legal(jealousy(left,[[2,3],[2,3]], [[1],[1]]) ○
としたいのですがどうしたらいいのでしょうか?
>>679 何が疑問なのかよくわからないのだけど、右側だけだと、
legal(jealousy(_,_,_,[],[])) :- !.
legal(jealousy(_,_,_,FL,[])) :- !.
legal(jealousy(_,_,_,[],ML)) :- !.
legal(jealousy(_,_,_,FL,ML)) :- member(A,FL),member(A,ML).
で良さそうだけど。
まちがった。
legal(jealousy(_,_,_,[],[])) :- !.
legal(jealousy(_,_,_,FL,[])) :- !.
legal(jealousy(_,_,_,[],ML)) :- !.
legal(jealousy(_,_,_,[A|R],ML)) :-
member(A,ML),
legal(jealousy(_,_,_,R,ML)).
右側は誤解を生じる表現だった。状態遷移後というべきか。
下の述語定義をして、right,leftそれぞれチェックする目標を立てればいいのではないかな。
legal(jealousy(FL1,ML1,FL2,ML2)) :-
legal(jealousy(FL1,ML1)),
legal(jealousy(FL2,ML2)).
legal(jealousy([],[])) :- !.
legal(jealousy(FL,[])) :- !.
legal(jealousy([],ML)) :- !.
legal(jealousy([A|R],ML)) :-
member(A,ML),
legal(jealousy(R,ML)).
>>680-682さん
レスありがとうございます。
しかし試してみたところ何をやってもnoと出てしまうのですがどうしたらいいのでしょうか?
>>683 % legal(jealousy(left,[[2,3],[2,3]], [[1],[1]])
?- legal(jealousy([2,3],[2,3],[1],[1])).
yes
?- となりませんか。それから
>>682の定義は5節とも述語legal/1であり、
好ましくない定義でした。第一節とそれ以降の節とは構造が異なりますから、
事実上別の述語とも見なせますが。
英語がよくわからなかったのでw そのまま使ったのですが、述語定義の引数は
できるだけフラットなものにしたい。構造体はリストのレベルまでですね。
フレームなどは例外中の例外。
>>684 意味不明かな。
legal(jealousy(FL1,ML1,FL2,ML2)) :- より、
legal_jealousy(FL1,ML1,FL2,ML2) :- であるべきだということです。
英語がよくわからないので、例えば legal_jealousy という表現が英米人に
とって滑稽だったり大変不自然なものであるのかどうか私にはわからないので、
それを避けて、そのままの構造を借りたの意味。
亀レスすいません
>>683です
does not exist
とでてしまいます
>>686 字下げのための全角スペースが述語名の一部となっている?
字下げがしてありますね。2chでは2個以上の半角スペースはなぜか、一個に
まとめられてしまいます。それで、はっきりした字下げを表現するため、
半角スペースは全角のスペースに書き換えられています。もし、この状態から
copy&pasteでコードを写すと、' leagal'(jealousy( ... というような
全角二個が前に付いた述語が定義されることになってしまいます。
これだと、副目標 leagal(jealousy([2,3],[2,3],[1],[1])) はleagal/1が
存在しないとなります。そういうことがないか確かめてください。
>>687さん
亀レスで重ね重ねすいません
どうやら勘違いしていたみたいで無事できました。
本当にありがとうございました。
昨秋以降 Wikipedia のPrologの項が大幅に更新されました。
ご存知ない方のために、一度ageて広報します。
690 :
デフォルトの名無しさん:2010/01/12(火) 09:00:33
昨秋以降 Wikipedia のPrologの項が大幅に更新されました。
ご存知ない方のために、一度ageて広報します。
すみません、上げ損なったので再度書き込みます。
>>679 jelousyという構造(複合項)の形が食い違っている上に説明がないので憶測で書きますが、
legal(jealousy(_,LMs,LFs,RMs,RFs)) :- legal_bank(LMs,LFs), legal_bank(RMs,RFs), !. % RMsはright (bank) malesの略、他も同様
legal_bank(Ms,Fs) :- \+ ( member(F,Fs), \+ member(F,Ms), member(M,Ms), M =\= F ).
こんな一行勝負もどうでしょうか。
あるいは場合分けして
legal_bank([],_). % そもそも男がいない(いても女だけ)
legal_bank(Ms,Fs) :- \+ ( member(F,Fs), \+ member(F,Ms) ). % 夫と離れた女がいない(すべての女に夫がついている)
いつも間違える…
× jelousy → jealousy
126144349
1261443439 ←こっちと思われ
いろんな言語で宿題スレ 第三編
>>695 そうでした。どこで一桁落ちたのかな。ご足労掛けました。
repeatに引数を加えていくとmemberになるという内容の授業だった。
引数の付加の仕方によって、どう性質が変わるかを副目標側のからの
視点で徹底的に考える。ただそれだけ。
このスレの
>>652-655辺りも、もしかしてw
それにしてもあのスレのPrologのコードは強烈ですね。私のProlog観は
完全に打ち砕かれましたw 太宰治が書いたコードのようです。饒舌で。
もうひとり数式処理向きの関数型言語で書き込んでいる方がいて
こちらのコードは極端に短いものが多くて、際立った対照を示して
いて、見てて飽きないですよ。
>>694 そのころProlog協会の代表幹事はK-Prologの作者です。別人ですね。
>>694 Prologには帰納推論をやる一派がいたので、
近くの研究室にも、ああいうプログラム書ける人たくさんいたよ。
意外とあちこちに潜んでいるのでは?
第五世代の評価というか総括をしている文献って知りませんか?
一体第五世代計画とはなんだったのかということが非常に気になっています。
できれば、西垣通氏のルルス関連の話のように社会学関連のアプローチだと
なお嬉しいです。
>>701 そこのサイトはすでに見ました。
第五世代で宗教にアプローチなんてしていないので関連性があるなんて思ってないですよ。
そうじゃなくて、社会学的にどういう位置づけになっているのかどうかということです。
技術的な話は発散しているので必要なもの以外は追うつもりはないです。
703 :
702:2010/01/23(土) 01:51:12
でも、実際最初は自分も西垣氏の話を読解力の無さから読み違えてたので他人のことは言えません。
ちゃんと読み解くとそんなことは言ってないのですよね。
上前淳一郎が第五世代コンピュータに関するノンフィクションを書いている。
社会的背景が生き生きと描かれていて面白い。
奇妙なことはあれだけのプロジェクトにも関わらず、
出版物として総括した大冊がないことです。途中までは共立出版等から
啓蒙本が多数出版されていたのですが、肝心の並列処理に入ってから
はさっぱりでしたし、終了後にまとめがあるのかと思ったら、
研究発表以外にはない。総予算の規模からいってもバランスが悪く
異様です。手を挙げる出版社がなかったからでしょうか。
大冊を求めてるなら、知らん、としか答えられんが。
淵氏がコラム程度の分量を書いたものなら、『情報処理』で見かけた記憶はある。
707 :
702:2010/01/23(土) 12:27:02
>>704 "めざすは新世代コンピュータ?「日本の夢」に挑む頭脳集団 (角川文庫)"
ですね。これはおもしろそうです。早速読んでみます。
>>705 結局何をしたかったのかよくわからないのですよね。
啓蒙書の類も推論や言語を扱うという意外は一貫性がないです。
一番おかしいと思うのが、アーキテクチャを作るという計画のハズなのに、
アーキテクチャに関する文献が見当たらないというところです。一般向けでは
ないからかもしれないですけど、それにしても見当たらなすぎるのですよね。
本当のところ淵氏としては、認知科学やりたかったんじゃないかと、
http://www.amazon.co.jp/dp/4140014466/ >>706 「情報処理」のコラムですね。国会図書館あたりで探してみます。
もちろん、真面目な研究が行なわれていた(らしい)のはわかるけどねw
技術的にあんまり突っ込んだことを追う気はないようだが
共立出版の「続・新しいプログラミング・パラダイム」の「並行プログラミングとGHC」が
文献リストなども含めて何かの手がかりになるかもしれない
第五世代コンピュータの並列処理
滝 和男 編
発行年月:1993年06月
発売元:共立出版
というのはあったんだけどね。
最初のころの話に出ていた、データフローマシンとか、リダクションマシンとか、いわゆるノイマン型とは根本的に
違うものがつくられることを期待していたから、実際にできたのがノイマン型を並列化したものだと知ってガッカリした。
技術的にはすごいことなんだろうけどね。
”成果の具体的な内容については、報告書類が山のようにある。これは秘密では
ないので12年分を入手して検討すれば、試行錯誤を含めて全部わかるように
なっている。しかし膨大なことになるので、解読してくれるような奇特な人が
いるかどうか。”
なんとなく予感はしていたのですがJIPDECのサイトは内容についてどなたも全容を
把握していないのではないですか?
>>700 > 社会学関連のアプローチ
そもそもこれが何を意味するかはともかくとしてだw
そういうものが今になっても存在しない(?)あたりが
今も昔も産官学の限界なんだよね
で、Prologスレで手に負える話ではないのでそろそろ勘弁してもらいたい
建設的な話でもあればいいけど、怪しいですよね、おかしいですよねの列挙だったら
スレ違いかもしれないな。
実際それは挙げていったらきりがないと俺も思うがw
誰かが立てて放置されてる第五世代スレがありそうなもんだが。
それを再利用するとか。
東大や理科大行けば、論文やテクニカルレポートが全部残ってるはず。
>>705 バランスが悪いということだけど、
例えば国内外のどの研究プロジェクトと比べて、
「啓蒙書が少ない」ことが「異様」なのでしょうか。
むしろ、異常なくらい教科書的な書籍を産み出したプロジェクトだと思いますが。
>>707 Σ計画なんかもそうですが、お金が動かないと、
官僚&政治家はなかなか新しいプロジェクトを始めてくれません。
メーカーへ予算ばらまきが出来るようにするには、
ハードウェアも込みである必要があるのです。
これは研究プロジェクトというより、誠治の方の問題です。
>>716 教科書的な書籍とは共立出版の「知識情報処理シリーズ」のことですか?
ICOTの成果が出始めるのはこれからだよ。20年後かも。
>>719 Prolog は論文を書くためだけの言語
ICOTの成果として、狙い通り、論文が大量生産された
Prologを材料に論文を書くの意味ですか。
でも、あなただって携帯が故障したら、Prologのお世話に
なってるかも知れませんよ。
GHCなんかは、並列(平行)に「仕切る」ための言語という
印象が強いのだけれど、そういう位置での制御要請は
今後多くなっていくものだろうか。
>>722 個々の自動車の平行プログラミングは関数型で勝手にやらせるので済むかもしれないが、
俯瞰的な平行動作、たとえば自動車と通信しながら制御する信号の記述などでは
GHC的なものが最有力ではないか。
クラウドコンピューティングが来ている以上、GHCの並列計算が見直される
チャンスも普通に多いだろ。誰も提案しないだけで。
クラウドコンピューティングは並列計算じゃなくて分散技術や信頼性工学の話だからな…
>>721 携帯じゃなくて、ADSL回線じゃなかったっけ?
携帯の故障診断はさすがに大変じゃないかな。半端な数でないし。
ADSLでも10台以上同時に動かしてるんでしょ。それにしても、
こんな大規模な実務に使われてるのにAZ-PrologはWikipediaにも紹介
されてないね。
正直MapReduceがどうしてこれほどもてはやされてるのか分からない。
あんなん普通にやってたことっしょ?
大規模に現実に適用したからってこと?
>>727 5年以上前だと思うけれど、ソフトバンクが10人単位でPrologプログラマの
募集をした。ところが応募はなかったらしい。
ソフトバンク+Prologという組み合わせでは将来の地位が不安ということ
だったのかも知れないけど、日本の大学生も根性がないね。
威勢がいいだけならチンピラ
威勢ねぇw
Prologで実務的なプログラムを書くことができる人は四十台後半より上。
あと10年待てば大量にリタイアが始まるから供給は充分になる。
>>733 私が募集しているという記事を読んだ。こちらはたしか。
誰も来なかったというのはうわさ話。
735 :
デフォルトの名無しさん:2010/03/02(火) 21:43:53
復旧おめでとう age
>>736 ためしにやってみたら、できてしまいました。
いつもお世話になっています。
J言語などでかきこみしているものです。
これからもよろしくお願いします。
>>737 ありがとうございました。私のPrologコードは外連ですが、
あなたのプログラム群のおかげであのスレはム板の中で一番
輝いています。
"bit"は1970年代中頃から愛読していましたが、結局休刊になる
前に購読しなくなりました。配達してくれていた書店が廃業した
ので。
>>738 新しいスレ、なんか変なことになってますが、私は1番しかかいてないですよ。
「bit」は読んでいましたけど。
荒れないうちに問題をはじめましょう。
辞書なんて所詮、偽装された百科辞典だ。
Prologの現代的(?)な応用って何かある?
到達点がエキスパートシステムとか自然言語処理とか止まりだと先が無さそうに思うんだけど。
>>742 エキスパートシステムや自然言語処理が我々のプログラミングの随所に
登場という状況を知らない。まだ、そのレベルにも達していないのでは。
Prologの役割は自然言語によるプログラミングへの橋渡しをすることに
ある。まだ何も始まっていない。
当分の間始まる見込みもない
>>742 Prologの現代的な応用 : 論文を大量生産する
747 :
初心者:2010/07/04(日) 23:36:36
prologを勉強してて、以下のページの
http://mayah.jp/article/2002/reversi#toc-tplace-pl このリストがよくわからないのですが
[[X, X, X, X, X, X, X, X],
[X, X, X, X, X, X, X, X],
[X, X, X, X, X, X, X, X],
[X, X, X, X, X, X, X, X],
[X, X, X, X, X, X, X, X],
[X, X, X, X, X, X, X, X],
[X, X, X, X, X, X, X, X],
[X, X, X, X, X, X, X, X]]
わかるかたお願いします。
自分的には、
[[X, X, X, X, X, X, X, X],
[X, X, X, X, X, X, X, X]]
の縦と横のリストだけでいいのではと思うのですが。
>もともと大学の課題なので、データ構造等は結構適当に定められてしまっています。
らしいですよ
>>747 部分的な局面の思考に全局面のデータを持ち回ることはないだろう、という意味ですか?
750 :
初心者:2010/07/05(月) 17:59:40
>>749 そう思ったのですが・・・
やはり、全マスをあらわしてるのでしょうか
>>750 私は実行時のヒープ領域やスタックの実際の使われ方、動きについては詳しくないので
他の方の説明を待つとして、
・ 全局面を表すリストのリスト(8×8)を引数で渡していくことにあまりコスト(時間とメモリ)はかからないと思う。
・ 全局面のデータを単位節と定義しておいて、それを参照して、部分リストと二本取り出し、
それを加工してから、list_nthとappendを駆使して(実際には一つの述語にまとめるだろうが)元の全局面データである単位節をretract+assertするのは
結構コストがかかる選択なのではないか。
752 :
デフォルトの名無しさん:2010/07/18(日) 18:45:24
学校の宿題で、ハノイの塔の問題が出たんですが・・・棒が5本のときの組み方がわかりませんorz
誰か助けて下さい!
ちなみに3本のときは、
move(N,A,B) :- display(N), display(' from '),
display(A), display(' to '),
display(B), nl.
hanoi(1,A,B,C) :- move(1,A,C).
hanoi(N,A,B,C) :- M is N-1, hanoi(M,A,C,B),
move(N,A,C),
hanoi(M,B,A,C).
こんな感じで書きました。
手数が適当でいいなら、同じプログラムが流用できるよねw
逆に、手数を最小にせよ、のような縛りがあるなら、別にPrologに特有の宿題じゃないような気がする
754 :
デフォルトの名無しさん:2010/07/23(金) 00:31:29
>>753 先生がドSでして・・・手数を最小にするように縛りがあります;
FDって使ってます?
最近は使う機会がめったに無いね。
ただ、たまに緊急ブートで使うことがあるから確保はしてあるけど。
まさかフロッピーディスク?wwww 今時FDドライブ付いてるPC少ないだろ
>>755はCLPのFD(Finite Domain)のことじゃねーの?あれ、釣られた?
覆面算ならFDに限る
時々ICOTのリンク変えるのやめて下さい。
761 :
デフォルトの名無しさん:2010/10/26(火) 17:43:43
age
「いろんな言語で宿題」スレの解答を集めた
http://nojiriko.asia/prolog/index.html が1000解答を越えました。昨年の五月後半から
ですから約一年半。一昨年の暮れ頃に宣言した
Prolog10000Tipsの柱となるチュートリアルの
材料集めでしたが、少々時間が掛かり過ぎた。今後は
・ 誤解答の修正。
・ プログラムパターンへの分類。
・ 一つの解答にいくつかの異なったパターンの定義を追加。
・ それぞれのパターンの評価と解説。
などを継続していきます。
あンた背中がテカッてるぜ
>>765 矛盾していようがいまいが、ネチネチやっていく他はなさそうw
世界は矛盾に満ちている。しかし、我々は一節、一節、あなたの
いうことは全て正しい、という姿勢で定義していく。
当然、矛盾に満ちたものとなるから、そこから、注釈、解釈、を
定義していく。橋渡しをしていく。
そうではなくて、モデルの段階で矛盾なくと考えるから、先に進
めなくなる。
そういう意味で
>>765はすばらしい課題だと思います。
771 :
デフォルトの名無しさん:2010/11/16(火) 16:56:07
これから勉強したいのでフリーで使えるコンパイラとか教えて欲しいです
入門ならインタプリタのほうが気軽だと思うけど
>>771 個人で使う場合はAZ-Prologがおもしろいと思います。
企業で使う場合は有料です。
この処理系のコンパイラはPrologコードをメインループごと
C言語に変換します。それに手を加えて速いコードにすると
いうこともできますし、いろいろな環境とのインタフェース
を書くことが可能になります。
774 :
デフォルトの名無しさん:2010/11/17(水) 16:58:08
ありがとうございます
勉強始めます
初夢。
春に、「Programming for Artificial Intelligence」の新版がでる!
PrologTipsの人のサイトって消えちゃった?
>>776 ごめん。起動するの忘れてた。
apacheではなく、Prologサーバなんです。
>>777 わざわざありがとう
そしてPrologでサーバーまで作るとは…
ワロタw
Prologサーバーとかすごいなー
>>779 PrologインタプリタがTCP/IP経由のサーバになっていて、
たまたまポート番号80で動いているっていうだけw
781 :
780:2011/01/27(木) 13:29:27
話題にした途端、サーバ故障。
屋根からの落雪で光ファイバーケーブルが切れたかも・・・。
来週火曜日、調べに行ってきます。それまで停止します。
782 :
781:2011/01/27(木) 17:30:02
復旧しました。
NTTの故障かな。停電による一時断かも。
雷の多いところで変電所に落雷する夏には
あるんですが、真冬はめずらしいですね。
単なる停電だったようです。
ルータのことを忘れていた。停電するとここが止まるから
繋がらない。パソコンの電池は3時間以上大丈夫だから、
普通の停電なら問題ないのだが、今日はもしかすると
危なかった。すくなくとも一時間以上繋がらなかった。
冬の方が乾燥してるから落雷は多い
785 :
デフォルトの名無しさん:2011/01/30(日) 19:21:06
Visual Prologは使えるのか?
>>785 よくわからないけど、Visual Prolog 固有の統合開発環境では
全角文字が通らないような気がする。詳しい人、フォローを。
787 :
デフォルトの名無しさん:2011/02/21(月) 08:44:18.00
すみません。質問です。
SWI-Prologを使い始めたのですが、LinuxOSと
インターフェイスの取り方がよくわかりません。
shell/2述語でbashコマンドの実行はできますが、
標準出力に表示される内容をProlog項に取り込み
たいのですが、みなさんはどのようになさって
いますか?
つ pipe/1
>>788 ライブラリに
pipe/2はあったと思うけど、
shellとどう結びつけるのだろう。
openすんだよ、streamだから。
shellは関係ない。
>>790 ということは、
system(Command,X) :-
open(pipe(Command),read,Instream),
findall(C,(
repeat,
get_char(Instream,C),
(C=end_of_file,!,fail;true)),
L),
concat_atom(L,X),
close(Instream).
ですか。
いいんじゃねえの
というかやってみれば?
>>792 ありがとうございます。うまくいきました。
?- system(pwd,X).
X = '/usr/swi-prolog\n'.
?-
といっても私は最初の質問の方ではありませんw
見ているかな。
pwdならseeとかつかったサンプルがマニュアルにある。
>>791 system(Command,X) :-
system_2(Command,L),
atom_chars(X,L),!.
system_2(Command,L) :-
open(pipe(Command),read,Instream),
get_char(Instream,Char),
system_3(Instream,Char,L),
close(Instream),!.
system_3(Instream,end_of_file,[]) :- !.
system_3(Instream,Char,[Char|R]) :-
get_char(Instream,Char2),
system_3(Instream,Char2,R).
shs(Command,X) :-
system_2(Command,L),
shs_3(L,X).
shs_3(L,[S|R]) :-
append(L0,['\n'|R1],L),
atom_chars(S,L0),
shs_3(R1,R).
shs_3(L,L).
>>795 訂正
shs_3(L,[S|R]) :-
append(L0,['\n'|R1],L),
atom_chars(S,L0),
shs_3(R1,R).
shs_3([],[]) :- !.
shs_3(L,[S]) :-
atom_chars(S,L).
% 書き直し
system(Command,X) :-
system_2(Command,L),
atom_chars(X,L),!.
system_2(Command,L) :-
open(pipe(Command),read,Instream),
get_char(Instream,Char),
system_3(Instream,Char,L),
close(Instream),!.
system_3(Instream,end_of_file,[]) :- !.
system_3(Instream,Char,[Char|R]) :-
get_char(Instream,Char2),
system_3(Instream,Char2,R).
shs(Command,X) :-
system_2(Command,L),
shs_3(L,X).
shs_3(L,[S|R]) :-
append(L0,['\n'|R1],L),
atom_chars(S,L0),
shs_3(R1,R).
shs_3([],[]) :- !.
shs_3(L,[S]) :-
atom_chars(S,L).
shs_3/2 は shs_2/2 であるべきだし、
ここは split/3 を定義して、
split(L,['\n'],X).
とした方がよい。
799 :
デフォルトの名無しさん:2011/02/28(月) 08:44:20.50
swi-prologの商用利用はどれぐらい金かかるんだろう?
>>799 プログラムを保守する人員を育成する費用に比べたら無視できるくらい
801 :
デフォルトの名無しさん:2011/03/03(木) 21:17:16.01
802 :
デフォルトの名無しさん:2011/03/03(木) 21:25:33.22
XPCEのメソッドframeがあるとコンパイルエラーになってしまぅ。
だから、マニュアルにあるfileviewer demoが実行できない。
みなさんは実行できますか?
:- use_module(library(pce)).
fileviewer(Dir) :-
new(DirObj, directory(Dir)),
new(F, frame(’File Viewer’)),
send(F, append(new(B, browser))),
send(new(D, dialog), below(B)),
send(D, append(button(view,
message(@prolog, view,
DirObj, B?selection?key)))),
send(D, append(button(quit,
message(F, destroy)))),
send(B, members(DirObj?files)),
send(F, open).
view(DirObj, F) :-
send(new(V, view(F)), open),
get(DirObj, file(F), FileObj),
send(V, load(FileObj)).
803 :
デフォルトの名無しさん:2011/03/03(木) 21:45:01.39
すみません。 ’File Viewer’ここを'File'にすると
実行できました。
>>802 new(F,frame('File Viewer')), は
File Viewer の前が全角の’になっている
ようです。
805 :
デフォルトの名無しさん:2011/03/03(木) 23:03:12.84
>>804 ありがとうございます!恥ずかしいミスを・・・
>>802 私の環境はUbuntu10.10でKDE環境 入出力はkonsoleを
好んで使っていますが、エンコーディングはEUCなのです。
.bashrc ファイルに
export LANG=ja_JP.EUC-JP を書き入れて使っています。
さて、fileviewerを実行してみたところ、フレームへの日本語表示、
new(F,frame('ディレクトリ表示')), はうまくいくのですが、
肝心のファイル名表示の方は
EUC文字ファイル名もUTF8文字ファイル名も共に
化けてしまいます。これはなんとかならないものですか。
私の所は埼玉でたいしたことないんだが、
それでも驚いた。余震でもまた驚いた。
神戸のときの地震経験したけど
そのときの恐怖を初めて上回ったわ
Prologスレで何の話してんのさ…
でもこの週末はム板の書き込みが激減しているね。
それはともかく、【論理】Prolog【初心者】スレの方に
ちょっと既に書いたことだが、
http://nojiriko.asia/prolog サイトの冒頭近くに、
主要述語の用例集をまとめてみた。用例対象は
このサイト内の解答の中からに限られるから、
パターンとしては十分とは言えないが、いくつかの
述語は200-300例を越える。
現在は、問題の出現順になっていて分かりにくいが、
意味、機能順に並べ直す予定。
その上で、解説を付加する。
読みにくいから、元々の出典のURLを削ってしまったが、
著作権上の問題があり、これは復活する予定です。
>>807 6月15日には本当に発売されるようですよ。20ページくらいしか増えないようです。
"PROLOG Programming for Artificial Intelligence" お届け予定日 6月26-28日
今度こそ本当らしい。
814 :
デフォルトの名無しさん:2011/05/09(月) 11:47:36.97
"PROLOG Programming for Artificial Intelligence"
また延びた?アマゾンから変更のメールがきたけど
∨∨∨∨
((((((((( うちにはこない・・・トホホ )))))))))(キリッッッ!!!!
糖質が湧いたな
swi-prolog、UTF-8 OKと謳いながら日本語ダメだね。がっかりだ。
日本語OKというAZ-prologというのを入れてみたけど、実行環境のショボさにめまいがした。
文字列としての出力がダメということ?
別にできたんだけど
$ swipl
% library(swi_hooks) compiled into pce_swi_hooks 0.00 sec, 3,928 bytes
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 5.10.2)
Copyright (c) 1990-2010 University of Amsterdam, VU Amsterdam
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions.
Please visit
http://www.swi-prolog.org for details.
For help, use ?- help(Topic). or ?- apropos(Word).
?- format("にほんご").
にほんご
true.
>>820 発見されているものとしたは、
?- readln(X).
|: にほんご
X = ['に','ほ','ん','ご']
や
?- assertz((にほんご、えいご)).
ERROR: Syntax error: Operator expected
ERROR: assertz((にほんご
ERROR: ** here **
ERROR: 、えいご)) .
など。
822 :
821:2011/07/18(月) 04:16:01.88
>>821 readln でリストではなく文字列が欲しいという意味ならば concat_atom を使えばいいと思う
?- readln(LS), concat_atom(LS, '', L), writef(L).
|: にほんご
にほんご
LS = ['に', 'ほ', 'ん', 'ご'],
L = 'にほんご'.
あと assertz の例は意味が分からない。
何がしたいの?
>>823 最初のケースは本来の用法が使えなくなってしまう。
?- readln(X).
|: abc def
X = [abc,def]
後の方は "、"や"。"の扱いについて、他の処理系との
互換性などから、如何なものか。というところ。
>>820 単純にソースファイルに
f(りんご).
とか記述できないです。
日本語入りのときは確かUTF-8でBOM付きにしないと駄目だった。
BOM付きUTF-8と来たかw
826だが
使ったコードのエンコーディングはBOMなしのutf-8だよ
830 :
824:2011/07/20(水) 18:05:06.15
私が書いたような不備、不満は
SNS上で何度も指摘していれば、必ず
そう遠くないバージョンで直してもらえる
からあまり問題はない。
指摘することが大事。
>826はlinux?
少なくともwindowsではそうだった。
>>827 ありがとうございます。
BOMを付けるようにしたところ、日本語通りました。
833 :
825:2011/07/22(金) 21:54:44.84
>>827 おお、できた!ありがとう!
これで心置きなく死ねる
Erlang人気に引っ張られて、Prologも復活しつつあるな。
>>835 「7つの言語 7つの世界」が受けてますから。
>>836 そうか。控えめに見ても数百人がPrologの勉強を始めたことになる。
ずるずる遅れてた "PROLOG Programming for Artificial Intelligence" の
予定より早くお届けできることになりましたメール来た
839 :
デフォルトの名無しさん:2011/09/07(水) 12:01:39.53
>>838 どの辺が変わったのか分かったら教えてください。
丁度これから読もうとしているのだけど
おそらくそれの初版(1986)の和訳である「AIプログラミング」って読む価値あります?
大差無いなら日本語だし手元にあるからこれで済まそうと思うのですが。
840 :
デフォルトの名無しさん:2011/09/07(水) 12:13:01.13
>>838 情報が少なすぎましたね。
ちなみに全くの初心者です。
英文を解釈するプログラムのプロトタイプをPROLOGで書けたら修正が楽かなと、
安易な考えを持っています。
それ以前に論理プログラムの頭になれそうも無いので無駄な気もしてきましたが。
みなさんは、本に書かれている様なパターン化した処理以外のものをスクラッチから書ける様になるまで
どの位かりましたか?自分に適性があるのかも判断したいので。
841 :
840:2011/09/07(水) 12:46:20.89
連投で申し訳ありません。
初心者なんで初心者スレなのかも知れませんし、実はPROLOGの話とも外れます。
PROLOGを(真、偽、UNKNOWNみたいな)三値論理に拡張した様な言語はありませんでしょうか?
出来ればこれらを例えば-1から1の数値として「確からしさ」として推論出来るとベストなのですが。
上に拘らず、PROLOGライクなお勧めの言語がありましたら教えて下さい。
>>839 私は
>>838さんではありませんが、新版が出ようが出まいが、
「AIプログラミング」は現時点で和書では最良のProlog書です。
843 :
840:2011/09/07(水) 18:39:52.99
>>842 ありがと。そこまで言われるなら読んでみますね。理解出来るかは別だけど。
PROLOGの学習が目的じゃないんで両方読むのは避けたかったんです。
>>841 Prolog使いじゃないのだけど、Prologって真かそれ以外しかないのでは?
>出来ればこれらを例えば-1から1の数値として「確からしさ」として推論出来るとベストなのですが。
よくわからないけど、Progolっていうものはあるみたい
そうじゃないならベイジアンネットワークのようなものとか
845 :
840:2011/09/07(水) 21:28:41.51
>>844 >Prolog使いじゃないのだけど、Prologって真かそれ以外しかないのでは?
そうですね。真偽と言いますけど実質は真かそれ以外って事ですよね。
私の目的だと「そう」「それ以外」より「そう」「違う」「わからない」とあった方が便利なもので。
実装としては偽を証明する規則も作る事になるはずです。
(その「分からない」具合を規則や事実に重み付けして「確からしさ」として数値として扱えると良いなと)
>そうじゃないならベイジアンネットワークのようなものとか
あくまで感覚的なものですけど確率で決定するのは違う気がする一方
学習させたら最後は確率に落ち着く様な気もします。この辺のモデルをいろいろ変えたかったので
手続き型の言語で作り始めるのを躊躇していました。確率で問題ないなら最初から考慮しておくべきですね。
>よくわからないけど、Progolっていうものはあるみたい
ググってみたのですが帰納論理プログラミング用の言語ですかね?
確かに自分は三値論理を使って実は帰納的な事をしたかったのかもしれないなと。
全く門外漢なのでキーワードだけでも助かります。ありがと。
>>845 Prologって基本は非決定性なので、まさに「わからない」なんじゃないのかな。
外部からの介入に頼るってことでしょ。
?- member(A,[1,2]).
A = 1 の状態がまさにわからない状態では?
ソクラテスは人間である。
では、アリストテレスは人間か?
という問いに対して、Noと言い切る世界観に違和感を感じる。
>>847 覚えさせ方が悪いだけだろ
無垢すぎる子供と思え
閉世界仮説が成り立つためには、世界で成り立つ規則は余すこと無く記述されなければいけない。
多くの人間は
>>847の問いにYesと答えるのだけど、
ソクラテスは人間である。
では、ピテカントロプスは人間か?
と問われると、答えに詰まるな。
この「答えに詰まる」を人間的な反応と見なすべきなのか。
ソクラテスは人間である。
では、サイクロプスは人間か?
いやだから、間に哲学者は人間であるとか入れろよ
確かに、ピテカントロプスにも哲学者がいたかも知れない。
サイクロプスに哲学者がいなかったとも言い切れない。
これこそ人間の持つ知恵の計り知れなさだ。
哲学というのはものごとの共通性をみてとれるようになってはじめて可能になる学問です。
頭脳活動がそのレベルに達するには歴史の積み重ねが必要であり、
有史以前の人類の頭脳には不可能なことでした。
855 :
840:2011/09/09(金) 18:01:18.64
>>846 実は「分からない」としたまま、より上位の推論を行って「推測」する事を考えています。
なので3値論理に拡張したPROLOGみたいなものは無いのかなと。
PROLOGの「真」「わからない」だと推論を止められなくなるもので。
全部結局は二値演算です。
857 :
840:2011/09/09(金) 18:33:59.41
>>856 二値演算って言葉をググっても見つけられなかったんだけど、
二進数って事?二項演算って事?二値論理って事?
858 :
846:2011/09/09(金) 19:46:31.26
>>855 私が書いたことは嘘なんだが、非決定性という意味を考える上では
役立つと思ったから書いてみた。現在のPrologでは真は進め、偽は戻れ。
わからないは上か下へどけておく、くらいの意味なら追加可能だろう。
遅延評価の類だが、遅延評価となると、並列Prologの類がガードを導入して
非決定性の制御を排除したように、現在の体系で考えるのは困難になる。
単純な非決定性導入については第五世代の頃に決着ついていて、
評価戦略を上手く論理型に導入するために、今は制約を考えているわけです。
制約は簡約戦略と見なしたり、簡約戦略を導出したり出来ますから。
その決着はどういうものだったの?
xxxベンチマークで効率が悪すぎる、みたいな感じ?
それともoooプログラムが書きにくい?
861 :
840:2011/09/09(金) 23:27:18.49
ググりながら必死に書いてます。
「偽」を「わからない」と解するのは全ての規則が分かっていない事を前提にすれば成立するよね?
(誤りを含む)情報より自己学習するモデルを想定していたもので、完全な事実や規則は記述出来ないとの立場でした。
正直非決定性との説明は無視してしまったのですが、
今思うと「わからない」の解釈に誤解を与えてしまったのかもしれません。
「わからない」は真値を取る(推論出来た;真値となる)領域として理解されていたのですね?
私は推論に失敗した(推論できなかった;非真値となる)領域として説明していました。
>>858 非決定性とは解(真値)を扱う際の振る舞い。ガードとはその規則が成立する前提の事でしょうか。
バックトラック何かを排除する為にガードがあると言う事でしょうか?
三値論理にするなら偽で止まれ。真なら進め、わからないなら(後で補間した事が分かる形で)変数に置き換えて進め。って感じかと。
>>859 制約は変数の条件みたいなものですよね?
制約があると、より決定的となるようなルールを書きやすいとか言う意味なら理解出来ますが、
解釈が間違えていますでしょうか?
PROLOGの勉強を始めたばかりなんで、頓珍漢な事書いてます?
862 :
840:2011/09/09(金) 23:46:19.87
>>861 補足です。
3値論理で「分からない」になるのは、真の推論、偽の推論共に真もしくは共に偽の時です。
私のモデルでは偽となる規則を別途定義する事になります。
ええと。
そういう自然言語による散発的なテーゼじゃなくて、きちんと三値の真理値表を書いて、
きちんと理詰めでやってかないと、意味わかんないと思うよ。
一人でやってるんじゃなかろうな。
なんにせよ、ググって書くような人の思いつきが
先人の思いつきより有益だったら
ほんとに素敵な話だよな
865 :
840:2011/09/10(土) 01:27:01.42
>>863 表書く事も考えたんだけど、俺のロジックの説明なんか興味あるのかな?
真の規則 偽の規則 真理値
===========================
偽 偽 わからない
偽 真 偽
真 偽 真
真 真 わからない
>>861 おそらくこのスレでは普通のPrologについての正確なアドバイスはされると思うけど、
あなたの考える三値論理の理論は、あなた自身で一度正しく構築してみないと、
他の誰も知らないし説明できないと思うよ。
結果的にその理論にとってPrologが適切な手段かどうかについても、同じ事が言えるんじゃないかな?
それを踏まえた上でアドバイスすると、840さんは一度普通のPrologの処理系の仕組みを勉強されたほうがいいのでは?
Prolog自体は単純だからすぐに作れるし、理解が深まる。そうすれば、あなたの理論の役に立つかはどうかも分かりやすいんじゃないのかな?
867 :
858:2011/09/10(土) 06:37:15.53
>>861 >>861 並列(並行)論理プログラミングに現れるガードは、節をガード部と本体部に
分けます。Prologだと頭部と本体に分けますよね。ガード部は頭部+簡単なロジックです。
簡単なというのは、ユーザが定義した複雑な述語定義ではなく、integer(X)とか、X >= 3 のようなゴールという意味です。
このような並列言語では、頭部のある変数が具体化されるまで遅延して待つのですが、
変数が具体化され、しかも、ガード部のロジックが真になると、
「この節が唯一選択されて」本体部の実行に入ります。この述語の待ち合わせ中の他の節は
もはや決して選択されることはなく、捨て去られます。この点がバックトラックに備えているPrologとは
異なります。非決定性は捨て去られています。
こういう戦略をとらないと、本体部のAND関係のsubgoalに順序性がなく実行され、ガード部のすべての節(OR)が
生きた状態で、待ってしまいますから、必要メモリー量、通信量、待ち合わせ機構の管理データの量、
遅延時間の積など、多くの点で、大きなプログラムを実行することが不可能になってしまいます。
>>861 それから、もうひとつ。
>>858で前に書いた
>>846の非決定性の記述を嘘としました。このことの説明。
確かに、Prologシステムから見て、どの解だか「わからない」状態は存在します。それで外部からの
介入を待つのですが、外部からの介入(通信)は「真」か「偽」に限られています。結果として、
前に進むか後ろに戻るかという点ではやはり二値論理となっています。あなたの書かれた「わからない」
とは大きく異なる「わからない」なのです。
真偽値以外の全く、異なった動作を生む何かを受け入れるようにできないものかとは、Prologプログラマ
なら誰しも考えることですが、どんなものでしょうか。
>>861 Prolog で、実用的なプログラムが書きにくいというのも、真、偽の二値でやっている
ところにあります。
データベースに無いというのが、偽が返り、入出力のエラーでも、偽が返ってくるので、
エラー処理を別処理できないというのが実用的なプログラムを作りにくくくしている大きな
原因の一つとなっています。
パターンマッチングを使える関数型言語のHaskellやScalaなどは、Prologの代替になるうる?
バックトラック相当なくていいなら幾らでもあるだろ。
HaskellやScalaのパターンマッチは、Prologのパターンマッチである単一化とは違う。
>>870 代替えにはならない
関数型言語と論理型言語は全く別
関数型論理型言語のcurryとかなら代替えになるかも知らんが
>>870 Prologの持つ素直なデータベース検索の雰囲気だけはこの言語だけのもの。
プログラム生産の場でのそれがどれだけ効いてくるかといえば、実はたいした
ことではないだろうけれど、プログラミングの楽しさという観点からは段違い。
>>870 相当に日本語がおかしい書き込みになったので書きなおし。
Prologの持つ素直なデータベース検索の雰囲気はこの言語だけのもの。
実際のプログラミングの効率等にそのことがどれだけ効いてくるもので
あるかはよく判らないけど、楽しさという観点からいえば、段違い。
876 :
uy:2011/09/11(日) 16:59:55.54
Prologにはゴミしかいない
以前、俺が幼き頃 一度、俺のblogにもPrologの宣伝しにきたゴミカスがいたんだよ
はぁ?www って思ったね
俺はC++やってんだよ 相手の力もわからないカス君が
本当におめでたかった 学生か社会人かで区別する奴はゴミ
Prolog厨はそんなのしかいない ゴミ言語乙
>>876 私もPrologの話をする時に「学生」という言葉は使うが、それは、現在のPrologの現役であり
この言語を学ぼうとしている95%以上が、学生だからだ。どんな講座を受けながら、Prologが
難しいと感じているかは我々にとって関心事のひとつ。
>>859 まだいますか?
決着の内容をわかる範囲で教えてくれたら嬉しいです。
880 :
uy:2011/09/11(日) 21:48:13.25
>>877 こういうゴミみたいなしゃべり方するゴミは早く死ねばいいと思う
気持ちが悪いなあ
>難しいと感じているかは我々にとって関心事のひとつ。
悪いんだけど、お前「 中学生レベルの国語 」 からやり直したほうがいいよ
まじで気持ち悪いな お前 ゴミだな
881 :
uy:2011/09/11(日) 21:56:21.02
>>877 こういうゴミみたいなしゃべり方するゴミは早く死ねばいいと思う
気持ちが悪いなあ
なんかあぼ〜んが多いと思ったらこんなスレにまで来てるのか…
暇人だな(笑)
883 :
uy:2011/09/13(火) 05:30:36.80
そう
「こんなスレ」って表現がただしいね
見る価値もない
きてやってるだけ感謝しろよ
Prologの授業を受けながらのツイートが結構ある。きまって「Prologわかんねー」という文面。
せめて何がわからないか、つぶやいてくれれば、教官の目を覚ます質問を考えてあげられるのに。
わかんねー=やりたくない
やる人は黙って取り組んでる
わかった!
なんて一々言って回らないよな
検索TL見ながら講義すると面白いよ。地域で絞れば意外と引っかかって、
「えー、@hogeさん。それはですねー」って説明したら顔真っ赤にしてて笑った。
?- 年齢(俺, X).
X = 40
?- 童卒年齢(俺, X).
false
>>889 ?- 童卒年齢(俺, X)..
X = 80.
だろ
>>890 Prologで「死ぬまで**することはない」はどのように表現するの?
>>891 ?- 初めてセックスした(Person, Year), 他のあれこれ.
false
Prologの節データベースにProlog以外の言語でアクセスするのって面倒ですよね。
現状、Prologはマイナー言語なんで、他の言語からの再利用を考えた節形式にしたほうがいいですよね。
例えば、↓みたいな節を、Prolog以外で取り出すなんて想像しただけでクラッとくるので、
foo(BAR) :- hoge, fuga.
「データ」としての意味合が強くて、かつそのデータを他の言語からも利用する場合が
想定される節は、変数を含めないようにするとか、、考えないとだめですね。
ユニファイなんてPrologライクな言語以外にサポートしてませんからねぇ。
んで、
foo :- bar, baz.
とかなら、barとbazというカラムを持ったfooというテーブルのレコード、として扱えますよね。
とかPrologの扱いに慣れた人は普通にやってたりするんでしょうかね?
なんかPrologを習うときはPrologの世界に閉じた説明ばっかりで、実用が想定されてないので良くわからんのですわ。
補足
ここでの実用ってのは、既に存在するシステムとの連携、という意味ですかね。
Prologの処理系何使ってるの?
>>893 Prologをpopenできて、pipe入力で解を貰えればよいのでは。
Goalはprologコマンドの引数で渡せばよい。変数があっても問題なし。
parse_atom(Argv,P,_),call(P),writef('%q',[P]),
でPrologの標準出力をpipe経由で受け取り、引数に渡した元の文字列と
比較して差異をとれば "童卒年齢(俺, X)" -> "童卒年齢(俺, 80)" から X = 80が簡単に解析できる。
>>896 Prologの各処理系は起動時にスタック領域の確保など大きな仕事をする傾向があり、
他の言語に較べると起動に時間がかか。AZのようにコンパイルした時に小さめの
ユニットになるならば、問題はないだろうけど。
>>892 始めてセックスした(俺,31).
が定義済だとして通過しても、他にあれこれでfailしたら、
やはり結果はfalse
>>889あたりから延々とやってる奴
ほんとにそれだけしかアイディアが出ないのなら
計算機科学は無理だな
ネタレス応酬の流れで何を言っているんだ
?- 有意義(
>>899のコメント).
false
この言語の強みって何処にあるんだ?充足補充問題とか、その辺かえ?
現実的な場面での利用法を教えておくれ
>>902 スモールビジネスを補足すると、金融業のような多量なデータを
比較的短時間に捌くことはできないですね。ですから、スモール。
ビジネスは契約であり、つまり言語処理ですから、短文の記述、
解析に強いPrologは向いています。
事務計算も特に問題はありません。ただ、様式出力のライブラリと
いったものはまったくといってよいほどありませんから、他の系に
渡して処理することになります。
バックトラックとユニフィケーションの特徴は関係するのか?
金融って、haskellとかocamlの方が流行ってない?
>>906 どちらもPrologが遅い理由としてあげられます。
他には述語の定義節数が非常に多くなると追加・削除が遅くなります。
50万節を超えるような述語など。
Prologが処理の遅さなんか問題にならないくらい人間の思考にマッチした言語で、
二日酔いや40℃の高熱のときでも、かなり高度な機能をコーディングできるように
なればよいのに。
>>908 人間の方が数学人間に変われば、Haskellなんかは有力。現状の
国語人間ばかりだと、Prologはもっともましな言語。
910 :
デフォルトの名無しさん:2011/10/05(水) 06:42:37.61
Prologで書かれたフリーソフトウェアで有名なのをいくつか教えて欲しいんですが…
オープンソースでもかまいません。
>>910 私は全然知らない。神戸大学の田村先生の研究室か、九州工大あたりに
問い合わせれば、いい答えが出てくると思いますが。
フリーじゃないけどたとえば論文で
Evaluation of Behavior Description Based CAD System Used in Prolog Machine Logic Design
>>893 >Prologの節データベースにProlog以外の言語でアクセスするのって面倒ですよね。
schekog の %is
>>913 >schekog の %is
schelog の %is
>>835 ひとつの書籍がこれほどまでに流れを変えるとは。驚き。
8月以降twitter上のProlog情報が数倍に増える。
ああ、Erlnagのパターンマッチ渡しから、Prologに思いを馳せる訳か。
arity/prolog は、2テラバイトの仮想記憶、b-tree の採用などで、
比較的大規模なシステムも構築できたんだが、どうして普通の
Prologなんかは、そんな方向を採用しないんだろうか?
>>917 その答えは私にはわかりませんが、
大規模オンメモリデータベースとしてしか、Prologの生き残るスペースは
ないかも知れない。
グルー言語としてはどうですかね?
>>919 元々極めて有力ですね。ただ、そういう低レベルで使う発想は初めからなかった。
もうひとつ、Prologのプログラミング作法は大規模なスタックサイズを前提にした
ものが多かった。このような用途で最小サイズでの使用を要求されると、
スタックオーバーフロー等の懸念がなくはない。立ち上がりが遅いというより、
そちらの懸念から使われてこなかったということは言える。
>>919 全然駄目なのでは?
結局各言語で特化された推論エンジンライブラリが実装されていって、
Prologの活躍する場はなくなった。
>>921 推論エンジンとグルーとは関係がないでしょう。
>>921 全然関係ない話だけど、推論エンジンなんて、日常的に使っていてこそ、
いざと云う場合使えるので、そういう意味では、ライブラリで実装されたからと
いって誰でもが使えるものではない。
>>923 推論を日常化する。つまり、訓練の場だからね。Prologは。
それでも、うまく書けない。推論エンジンが丸々Prologだと
しても、日常的に書いていなくては、書けません。
>>924 日常化というのは違和感がある。空気のように意識しないものにする、くらいだろう。
苦節十年、息をするように自然にカットが入れられるようになった。
鰻職人の「串打ち3年、裂き8年、焼き一生」で言えばやっと串打ちができた段階ですな。
>>926 Pureな論理式の世界から解脱するのに十年か。
>>928 25年以上やってるけど、論理式の世界から解脱できない・・・。もっと
俗にまみれなくてはね。
まずはassert/retractの利用に対する罪悪感をなくすところからだね
遂に Prologブーム が来た。ブームっていうのは怖いけどね。
ききかじってプロログスゲーおわり、で収束しそう
何年に一回くらいこれからプロログって聞くけど実際は...
>>931 海外ではstackoverflowサイトの質問数の急増があるし、
国内では、twitterの書き込みの急増。
さらに、Tiobeのインデックスの急伸。ErlangやHaskellを再び抜き返す勢いだ。
もともと、授業を受けたことのある人だけで国内で一万人を遙かに超えるのだから、
潜在人口はある。どれだけ持続するかだな。
>>933 日本は「7つの言語 7つの世界」だと思う。海外は、よく判らないが、
4月かなIBMがワトソンの言語解析に関係して、わざわざPrologを強調した。これも謎。
今更って感じで受け止めた人が多かったようだけど、影響はあるのだと思う。
Prologの授業を受けたり、講習会にでたことが有る人の総計は2-3万人くらいでしょう。
さらに自習者も加えて3万人だとすると、そのうち現在プログラマをしている人は少なくとも1000人はいる。
この人たちの何人を復活させることができるかでしょうね。100人単位で復活してくれば影響力は十分あります。
>>935 WikipediaのPrologも丁寧すぎるくらいに充実して、元々文法が簡素なPrologの
学習サイトとしては、あれで十分という声もある。情報が少ないという弱点は
解消されつつある。準備は整ったというところか。
wikipedia程度で…
技芸レベルの本の翻訳が数冊ないと。
939 :
938:2011/10/15(土) 11:10:37.23
Prologは実際のコードを見て見様見真似だけで進むべき言語で、
それができない場合は(例えば再帰が理解できないなど)向いていないから
断念した方がよいと思う。
それはなぜ?
>>940 他のプログラミング言語と際立って異なる点は、
ユニフィケーションと導出以外に学ぶべきことがないと云う点。
「学ばない姿勢」がむしろ必要。
Prologとは単純なクイズです。
論理の授業で取り上げる場合違ったアプローチになるのは
仕方有りません。しかし、ほとんどの場合、それはPrologの
普及という観点からは「マイナスであった」と断じてよいと
思います。
つ チラ裏
>>938 技芸が初心者にとって難しすぎるということはあるかも知れない。それから、
一般にPrologの参考書の課題が足早に進みすぎるとか。だけど、リストについて
全く知識のない初心者がプログラムを見るだけで、 X = [A|B], のような部分を
理解するということは、やはり考えにくい。そういうレベルからWikiのような所で
書くわけにもいかないのだから、適切な導入テキストは必要だと思う。
Prologブーム再燃って、ソースどこ?
:-)
>>944 このスレw
>>933 かな。
Tiebe Index で2月51位からこの二ヶ月で39位まで上昇したのは確か。
ただ、以前の計測が誤りで、修正しただけ、という説も。Prologはプログラム言語の他に歌のグループや
Car racing さらに、アニメやゲームなどにも現れるから、見極めが難しいのかも知れない。
947 :
946:2011/10/15(土) 22:33:35.99
処理対象を述語で表すか項で表すか、はどうやって使い分けてますか?
たとえばツリーは
parent(1,2).
parent(1,3).
parent(2,4).
のようにも表せるし
node(1,[node(2,leaf(4),()),leaf(3)]).
のようにも表せますよね。
>>948 項で表すことはしません。全部述語、単位節。
引数としてリスト以外の複合項を渡すこともないですね。
述語はグローバル変数のようなものだから、
引数として項で入力データを渡す方が綺麗だよね。
遅いけど。
>>948 問題解決にノード間の関連が重要な場合は、迷わず命題(単位節)で書く。
そうすることで、grand_parent(X, Y) :- parent(X, Z), parent(Z, Y). のような述語と
その述語を使った演繹(推論)が可能になる。
それは項を使ってもできるでしょ。
ただ述語の引数がひとつ増えるだけで。
953 :
951:2011/10/16(日) 02:55:55.11
>>952 もちろん項表現でもコードは書けます。
ただし「問題解決にノード間の関連が重要な場合」には、
命題として定義するのが望ましいという話です。
項表現が望ましい場合もあります、
たとえば、単純にデータ構造としての直積(C言語の構造体)を表現したいのなら、
項表現を用いるのが望ましいと思います。
この場合には親要素と子要素との間に存在する「親子関係」は無視されますが、
それはそれでかまわないという応用は多々あるでしょう。
述語定義の以前的に構造が決まっている場合がある。例えば行列。それ以前の部分はPrologが関与しない。
句構造文法における辞書とか、あるいは一般的にフレームとか。こういう場合は、構造体を定義する。
変化する部分が少数に特定できる場合は、引数に選択したアトムを指定し持ち回る。
特定できない場合は、フレームが典型ですが、構造体で渡す。そうでないと要素数64のフレームは
64 * 2 = 128 引数以上必要になり煩瑣だ。
つまり、推論のどん詰まり、プリミティブな情報を何に求めるか。構造体であることも有りうる。
しかし、あくまで基本はアトム。集合の外延的記述データ。これを単位節の引数に列記する。
項の場合に親子関係が無視されるというのがわからない。
項表現の利点は
・処理対象データが局所的なこと(物理的にでなく、論理的な意味で)
・prologの持つ一階性の制約を受けないこと(全解計算に集合述語不要)
欠点は
・データを受け渡す記述の手間
・実行効率
だと思う。
基本的に、Haskellのような関数型言語の利点と欠点がそのままあてはまる。
手元の本をみると、技芸は伝統的な述語表現派、Bratkoは項表現派だね。
957 :
951:2011/10/16(日) 06:39:39.60
>>955 解決すべき問題に「ノード間の関連が重要」だとして、以下のように項で表現したとする。(
>>948から引用)
node(1,[node(2,leaf(4),()),leaf(3)]).
この場合、述語 grand_parent/2 を、
>>955はどのようにコード化するのだろうか?
% もしも述語表現であれば、
>>951のように「論理的に簡潔」なコード化ができる。
>>955 findall/3, setof/3, bagof/3 のようなメタ述語。述語で指定されたデータからリストへの変換は
Prologそのものであると認識する必要がある。これなくしては、Prologの能力を半分も利用できない。
使用を絶対にためらわないこと。述語定義の作法に悪影響がでる。
960 :
951:2011/10/16(日) 07:10:07.20
>>957の補足。
>>951でも書いたが、項表現を全面的に禁止すべきとまでは考えていないので、誤解しないでほしい。
解決すべき問題が関連(親子/隣接/参照...etc)としてモデル化される場合、それらは命題として表現すべきと考える。
ただし、それらから演繹(推論)導かれた結果を処理するのは、(直積構造としての)項表現が望ましいと思っている。
現実の応用には様々な階層的なデータ構造がある。たとえばCSV/JSON/XMLのように。
演繹の結果をそれら応用に合わせて項として処理(コード化)する事については、何ら反論する気は無い。
961 :
954:2011/10/16(日) 07:13:01.91
Prologの得意とする領域は、
>>954で書いてみた以前的な部分ではないか。
それ以後は関数型で書いても差が出ない。現実のデータがどう抽象されるか、
問題の言語的な認識がどう述語として整理できるか、そこら辺にPrologの本領は
あると思う。
962 :
951:2011/10/16(日) 07:33:10.41
関数型言語と比較して、論理型言語であるPrologが優位である点は
関連(relationship)を簡潔に表現できる点にあると思う。
簡単に言うと、与えられた課題が「1対n の単方向写像」として表現(モデル化)できるのなら、
その課題は関数型言語で簡潔に記述できるし、処理効率の面でPROLOGに勝ち目は無い。(...と言い切る)
それに対して、課題が「m対n の双方向写像」であるなら、論路型言語が絶対的に優位となる。
これはデータベースのE-R図やUMLのクラス図を知っていれば、日常的な例であると理解できるはずだ。
ルールを記述する場合においては有利なんじゃないかな。
例えばメールフィルターの設定とかに応用できないかな?
思い付きだけど。
これからソフトウェアはますますインテリジェンスが要求される。
ユーザーは、チェックボックスとかテキストエリアなどに入力した簡単な設定をするだけでなく、
ルールを設定してある程度ソフトウェアに自動化してもらいたいのね。
>>962 なるほどね。
関連を簡潔に表現という部分に補足するなら、返り値が事実上ないと云う点が大きいと思う。
常にデータ構造を平坦に保てる。本体部分のSubgoalも並記されたものとして読めばよい。
だからそれを押し進めて、引数はアトムでありたい、と云うことだと思う。
表現力の話なら述語表現で出来て項表現にできないことはないだろう。
単に述語のリストを作ればいいだけ。
parent(1,2).
parent(2,3).
...
というファクトの集合は
[parent(1,2),parent(2,3)]
という項のリストで表せる。
論点は、効率を取るか、モジュール性や理論的な美しさを取るかの違い。
余談だが、経験的に言うと、項表現の方が述語を双方向的にしやすい。
述語表現ではどうしても副作用に頼る部分がでてくる。
まあリストで持つのは効率悪すぎだから、インデックスがきくような
データ構造を作って、モジュール化してしまうのがいいだろうね。
横からだけど、すごい参考になった。Bratkoって最近四版がでたアレだよな。
Art of Prolog しか持ってないのでちょっと注文してくる。
>>955 > 項表現の利点は (全部略)
> 基本的に、Haskellのような関数型言語の利点と欠点がそのままあてはまる。
全然違うだろ。
文法的には関数型言語はC言語風でも全く問題ない。
ML以降の流れでああなっているというだけで。
Prologはそうじゃない。歴史を無視しても制約がある。
横レスだけど、
>>955のカキコ内容が自分にはまるで意味不明 .
しかも、そこからどうやってHaskellうんぬんにつながるのか、まるで分からんw
この流れは
>>948 から続いているのかな。そうだとすると、
>>948のレスとして、
Prologは述語の節定義を基礎にバックトラックを使ってのプログラミングと、
リストデータを使っての再帰的プログラミングの組合せで書くものだ、という
当たり前のことをはっきり述べるべきではないかな。
巡回問題など木構造を扱うものは、リスト構造を取らず再帰的に書けるが、
これはプログラマが節をまたぐ論理的な連関を仕組んだからで、その努力なしに
書くためのPrologのサービスはリストしかない。
その上で、リストの中に複雑な項(複合項)を書かない理由を述べれば良いのだと思う。
>>971 > これはプログラマが節をまたぐ論理的な連関を仕組んだからで、その努力なしに
> 書くためのPrologのサービスはリストしかない。
トイ・プログラムしか書いたことない人?
Prologはトイ・ランゲージ
>>974 functor/3による分解があるということなのでしょう。
DSLを定義して、これの上でアプリ開発、それをPrologで解析して実行というのは
考えらるし、確かに項の読み込みで終始する。でも、そんなことなら最初から
Prologで書きたい。
Prologで自然演繹はできますか?
Prologって普通に書いてておもしろい言語だから!!
一番好きな言語がprolog
大学の頃、出会ってよかったと思う。
だからこんなブームが来ると逆に・・・・。
Prologのパズルゲームとかあると面白いかも。
じわじわと迫ってくるインタプリタが来る前に節を追加削除してゴールに誘導するみたいな。
SWI-PrologとGNU Prologってどっちがよく使われてるの?
このすれでSWIとGNUで検索した限りではSWIっぽい。
日本でPrologがもう一度流行るかどうかは、SWI-PrologとXPCEグラフィックライブラリの
非常によくできた日本語マニュアルが作られるかどうかにかかっている。現在ある、英語版
つまり本家のマニュアルはあまりできがよくないから、これを翻訳したのではだめ。
マニュアル云々より日本語使うと表示が崩れるのはなんとかならんのかね?
開発環境が不満
今どきEmacsでちまちまやってられん
Eclupseみたいに述語一覧とかリファクタリングとか「まともに動く」IDEないのかな
Eclipseみたいな機能、述語一覧とかリファクタリングとかできる、「まともに動く」IDEないのかな
IDEの開発には無茶苦茶労力がかかるし、Eclipse以前以後どんだけ死屍累々だと思ってるんだか。
簡単に言うなって。
Eclipseで動作するProlog開発環境を幾つか試してみたけど、あんまり機能が無くて、これじゃEmacsでいいやってレベルだな。
プログラマがPrologにも手を出す時はIDEをのぞむけれど、
全くのプログラミング初心者の場合は関係ない話だな。
問題は言語が理解しやすいかどうかだろうから。
>>992 実務で利用する人にとっては、開発環境なんてどうでもよく、
サバクラをどう構築するかとか、他の言語インターフェイスは
どんな手段がありうるかといった情報が重要。Prolog単独使用
のケースは少なく、呼ぶか、呼び出されるかという選択になる。
それぞれのケースでどんな問題があるかなどの判断材料が欲しい。
そういうものがしっかりあるかどうかでPrologを採用するか
どうかにも影響がでる。
マニュアルというより、SWI-Prolog詳説といった書き物ね。
それはどうだろう。
理解には試行錯誤が有効。
IDEは試行錯誤を支援してくれる。
例えばプログラミング初心者にJavaを教えるときは、
いきなりIDEをさらわせてHallo Worldを書かせる。
プログラミングという行為において、効率的な意味で開発環境と開発言語は切り離せなくなってきている。
>>993 確かに、内容の過半が主要なメジャー言語とのインタフェイスに取られていて、
Prologと相手言語の間て授受するデータ構造の提案と、その解析の方法が
書かれている大冊の全書本(PDFファイルであっても)があったらすばらしい。