2013年17プログラム145: 【論理】Prolog【初心者】 (693)
TOP カテ一覧 スレ一覧 2ch元 削除依頼 ▼
【C++】 DirectX初心者質問スレ Part38 【C】 (107)
C/C++の宿題片付けます 165代目 (896)
【Lua】組み込み系言語総合 その6【Squirrel】 (232)
関数型プログラミング言語Haskell Part23 (480)
Androidプログラミング質問スレ Part36 (378)
日本語プログラミング言語『なでしこ』スレ5 (874)
【論理】Prolog【初心者】
1 :2010/11/06 〜 最終レス :2013/09/12 Prolog初心者のスレ これは良い言語だ…
2 : ただでさえ過疎スレなのに初心者スレが必要なのか?
3 : >>1 萌
4 : >>2 初心者を増やしていきたいじゃないか いい言語だし、もっと使われてもいいはず
5 : Prolog初心者があそびにきました 1. 日本語の通る無料の処理系 2, 初心者向けチュートリアル 3. 初心者向けおすすめ書籍(いまでも容易に手に入るもの) あたりがテンプレにあると助かります ご一考いただれば幸いです
6 : このスレッドは天才チンパンジー「アイちゃん」が 言語訓練のために立てたものです。 アイと研究員とのやり取りに利用するスレッドなので、 関係者以外は書きこまないで下さい。 京都大学霊長類研究所
7 : .NETで動く、あるいはC#コードに埋め込めるPrologがあればいいのだが
8 : Prolog# IronProlog
9 : >>8 おぉ、d
10 : >>8 p# ではなくて、prolog# か。 別のものかな。
11 : >>5 2, これはSWI-Prolog でいいでしょう。 3, http://www.amazon.co.jp/dp/4303716901
12 : ごめん処理系だから、 1, でした。 2, は素っ気ないのが多くて難しいな。
13 : >>2 これからが、Prologの時代だ。
14 : 考えてみると、Prologチュートリアルはこのスレ(別スレ立ててもいいけど)でこれから始めればよい。
15 : 「Prologの宿題片付けます」の方は、凝った問題が多くて初心者向けとは いえないから、ここは思い切りやさしい課題満載のスレになるといいね。
16 : prologこそクラウドを制することの出来る言語
17 : つーかPrologは何に向いてるのかが初心者を惑わすのだと思ふ
18 : Prolog 百夜話 引数がリストかどうか判定する述語 list/1 の定義は、 list([_|_]). です。 ?- list([1,2,3]). yes ?- list([1,2|R]). R = _13353 yes ?- list([1,[a,b],3]). yes ?- list(3). no ところで、 ?- list([]). no ?- 空リストはリストではありません。アトムです。
19 : >>17 はっきり向いていない分野がいくつかあり、 それ以外はどんな分野でも「大変に」向いている。 そういう言語です。
20 : >>17 ,19 はっきり向いていない分野が大半だけど、 ごく一部の分野に限れば「大変に」向いている、ではないかと思う。
21 : >>20 多分、定理証明のような分野を念頭に置いての書き込みだろう。 現在のPrologの衰退ぶりから見て、それが常識化しているのかも 知れない。 このスレの中でその常識が誤謬であることを証明しよう。 ありとあらゆる分野のコードを示すことで。
22 : >>18 こういう出鱈目を書く人がもう居着いてるから難しいw という冗談はともかく。 普通、空リストを含めてリストと呼ぶ。 [_|_]に適合するのはconsとか言って区別する。 よね。
23 : >>22 そうだったか! 私は20年以上、空リストはリストではないと思っていた。 list([]). list([_|_]). これが定義ですか。 アトムでかつリストというのはちょっと腑に落ちないが。
24 : 一応参考まで http://www.google.com/codesearch lang:prolog ^(is_?)?list\(\[
25 : 完全な定義は、 list(V) :- var(V),!,fail. list([]). list([H|T]) :- list(T). '.'(3,5) はリストではない。
26 : ぶっちゃけリストの定義なり扱いなりは、歴史的には処理系によりけりなりけり。 []がアトムでなくてもあまり困らないし。
27 : >>26 そういうことのようですね。
28 : 初心者にとっては難解なやりとりだったと思いますが、 list/1 という述語は integer/1 と同じく検査用の述語として使おうとしています。 ?- list([1,2]). yes ?- list(8). no ?- です。典型的な使われ方としては、 加算([],0). 加算([L|R],S) :- list(L), 加算(L,S1), 加算(R,S2), S is S1 + S2. 加算([A|R],S) :- number(A), 加算(R,S1), S is A + S1. ?- 加算([3,4,[1,2,3],2],X). X = 15 ?- となります。
29 : >>26 そりゃ、困るだろう。リスト項という型があるわけでもないし。 それなら[]は何に帰属するんだい?
30 : アトムでも複合項でもない「文字列」の型を導入している処理系だってあるし、 別に何でもいいのでは
31 : もちろんISO準拠にはならないという意味では困るけど
32 : >>29 横レスだけど、Prologの[]は、LISPでいうところのNILに相当するのではないかと ?- X=[a|[]]. X = [a]. ?- X=[she | [is | [25 | []]]]. X = [she, is, 25].
33 : そういえば、Schemeの空リスト () は型が独立している…よね?
34 : >>30 単純項と複合項 しかない というのがPrologの値打ちだったのではないかな。
35 : よくわからんけど、その「単純項」とやらの仲間に入れてやればいいじゃん 数のことを考えてあえて「アトム」とは書かなかったんでしょ
36 : >>35 単純項というのは 単項 + 変数 のことだよ。
37 : また誰も使っていない用語をw
38 : >>37 単項はさすがに無理かw 定数 + 変数 だね。
39 : その場その場で言葉を類推して作ってるんですねw
40 : >>39 うん。言葉の選択は大事だからいつもわかりやすい言い方が ないか探してはいる。単項はアトムを言い換えたのだけれども、 ここは変数との対比になるから定数でなくてはいけない。 単純項という言葉は Prolog-KABA のリファレンスマニュアルが 初出かも知れない。後に出版された単行本にも出てくるはず。 Prolog講座などの単一化の授業以外では使われないと思う。
41 : プロログ講座実施規程 第一条 JIS用語は、これを無視する。
42 : 毎日がプロローグ。だからいつも新鮮
43 : ここまでの内容をふまえて、初心者向けに ・PrologのISO規格は1995年以降。不統一な用語の亡霊が君に新鮮な毎日をもたらさんとす。 ・「アトム」は整数などを含まない。(Common Lisp用語との違い)
44 : Prologの世界は用語には無頓着で20年くらい前の話になるけど ISO規格の日本側委員だった中村克彦先生がunificationを 融合、融合とおっしゃるから、我が意を得たりで、「やはり、 融合で統一のお考えですか」と訊いたら、 「あ、全然そんなことないです。なんでもいいんです。」 だと。
45 : unificationを融合?w resolutionと混同してませんか、それ
46 : >>45 いいえ、unificationですw
47 : 「なんでもいい」というのは「統一されていれば、」というふうに解釈しますけどね私はw
48 : >>47 まあ、そうでしょう。
49 : unificationの訳語は「単一化」じゃないの?
50 : >>49 悔やまれるのは、「先生ぜひ融合で統一しましょう」と尻を押さなかったこと。その場に いたProlog協会の面々を扇動して、このように強く働きかければ、中島、後藤、古川氏等は 中村先生が説得可能だったでしょう。当時はメジャー言語の尻尾くらいにいたから、考えも しなかったけど、今思えば、単一化なんて変な用語はまずかった。 単一化しかない言語ですから。
51 : >>49 JISでは。 というか、Prolog界だけでわめいてもダメでしょう。 ISOがunificationという(論理学かぶれの)言葉を選んだ時点で。
52 : やばい、なんか気持ちが入って混乱気味の発言になった。
53 : ISOでいう「compound term」(複合項。これも論理学風)と同じ意味の「structure」の訳語としては、 「構造」より「構造体」の方がわかりやすいというか、正しいというか、そんな気がする。 少なくとも日本語では「構造物」を単に「構造」と言ったら分かりにくいんじゃないか、 というような意味で。今さらだけどw
54 : 用語ばなしの続きですが、これまで何度も使ってきた例の述語、 親子(頼朝,義朝). 親子(義朝,為義). 先祖(A,B) :- 親子(A,B). 先祖(A,B) :- 親子(A,C),先祖(C,B). でなぜ、親子にはルールがないか、という問題です。親子/2は英語で いうところのprimitiveな情報ということになります。まあ、最後に 行き着くところ、ですね。このような情報を何と呼ぶか、25年くらい 悩んできたのですが、最近これを、基(もとい)と表現することにしま した。ここで、親子/2はもといである、という風に使います。 「単一化」以上に日常から離れますが、やまと言葉に潜む力に賭けたい と思います。
55 : 実は>>26 を書いたとき、「[]を「(リストの)けり」と呼ぶことを今思いついた」と よほど付け加えようと思いましたが、やめてよかったと思いますw
56 : 親子/2は、単純に「命題」という用語でいいんじゃないのかな。 命題は西洋哲学から生まれた概念だから、やまと言葉には そぐわないかもしれないけど。 ところで、数学だと和算という言葉はあるけど、論理学には対応する やまと言葉はあるのかな?哲学は「問答(もんどう)」でいい気はするけど。
57 : >>56 命題に行き着く。それでよい。とりわけ、私が>>54 で書いた「ここで、親子/2はもといである」 では命題とほとんど同義です。ただ命題、親子/2 は頼朝と義朝が親子関係にあることは 明々白々であることを述べている。一方、私が「もとい」として拘っているのは、 親子はDNAだの、両性の性交の結果女性が妊娠して・・・等、さらに具体的にルール化できない ことはないが、ここで止めておく。この親子のように外延として記述する場合もあるが、それも 放棄して、組み込み述語を書きっぱなすにとどめることもある。そういう命題の措定のされ方に ついての意を含みたい、そういう部分です。
58 : prologは業務処理に向いているだろうか?
59 : >>58 現在のPrologは32bit以上の整数を自動で扱えますから、障碍になる 部分はありません。ライブラリを作らないコミュニティなので、 基本的に自前の必要はあります。COBOLのDATA DIVISION を解析して、 Prologに変換的なことを最も得意とする言語です。ということは、 すべてのデジタル化可能な業務文書の解析を得意とするということで あり、なぜこれまで業務処理に積極的に使われてこなかったのか、 不思議ですね.
60 : >>59 ライブラリ作ろうぜ それがないと広まらんだろーJK
61 : 本格的な業務プログラムとなると、10万述語程度の定義が 必要になる。一人のPrologプログラマの一ヶ月に定義でき る限界は、1500述語程度だから、六ヶ月でプロジェクトを 終えることを目標にすると、10人以上のPrologプログラマ を確保しなくてはならなくなる。現時点ではこれはまったく 不可能。Prologの過去の例ではICOTでのESPの開発しかない。
62 : ESP開発はもちろん業務処理ではない。
63 : ようするに、企業側からいうと、 一流大学卒のPrologプログラマをそんな業務開発などに 回せるか。という論理になる。一方、ある時期からは 学生の方も、Prologプログラマとして就職なんかして、 大丈夫かということになったから、現時点ではProlog プログラマを業務開発用に確保することは至難となって いる。
64 : >>63 向き不向きでいうと、向いていると?
65 : >>64 はい。少なくともCOBOLやPHPよりは遙かにね。 言語自体がオンメモリ・データベースですから。
66 : Prolog本スレに大規模な業務処理に使われなかった理由がありました。 Prologでまったり Part3 http://pc11.2ch.net/test/read.cgi/tech/1193354806/115 > 115 :デフォルトの名無しさん [↓] :2008/04/26(土) 18:08:59 > COBOLを代替できなったという点は、>>83 にちょっと出てきているが、 > アトムの爆発ということだとおもう。Prologではアトムをヒープエリア > 内に一旦記述して処理する戦略をとる。極めて大きな記号間の連鎖を表現しよう > とする記号処理言語ではどこかに対象となる情報すなわちアトムを保持せざるを > えない。この場合、初出のアトムに対し必ずメモリ内を検索し、無い事を確認して > 新たに構造体を追加する。業務処理で一日一億のトランザクションを処理する > ケースだとこの参照時間だけで相当のものだ。やはり破壊代入だけで済ませる > 言語には太刀打ちできない。さらに再帰で処理した場合はオーバーフローの危険が > あるし、バックトラックして再束縛する場合でも、ヒープエリアのGCは必ず > 必要になる。実際、保険業務などをPrologで処理することを想定すると、すぐに > 電話帳一冊分くらいの量のアトムが発生してしまう。 > 企業業務はほとんどが記号処理、シンボル処理であり、Prologはそういう意味では > 極めて適した言語なのだが、残念ながら以上のような理由から、大規模な業務処理 > には向いていない。
67 : >>66 はい。そうだと思いますw 実はこれは私の書き込みです。私はPrologの適性領域と限界という ことをずっと考え続けてきたので、この書き込みの内容もまた真 ではないかとぶつけました。これからのPrologは20GBを超えるメモリ での実行が当たり前のことになるでしょうし、オンメモリデータベース としても最速クラスに近いメモリ管理・データ管理が要求されること になるでしょう。
68 : 話は逸れますが、過去の業務処理を調べると、古いシステムほど、 入力検査を厳しくやっています。入力がカードや紙テープですと、 どんなとんでもないエラーが入り込むかも知れないからと、一項目 一項目、いろんな角度から検査し、どこかにエラーが見つかれば、 入力の対象とはしない。そういう設計にしました。その後POSの ような部分的に入力検査済みの装置を経るのが当たり前になり、 さらに、RDBの登場あたりからともかく入力させてしまって、削除、 修正はSQLでやればよい、と大分おおらかになったようです。 何でこの話をするかというと、COBOLだと100行以上の連続したIF文 など珍しくなかったのですが、これをPrologに移植すると100節では なくて、100述語以上に変換されるかも知れないということがある からです。 これこれこういう場合は(_検査対象,_診断) :- ... がPrologの標準スタイルであり、あっという間に10万述語なんて いってしまう理由がこんなところにもあります。
69 : 結局、現在のPrologの最大の問題は 100万節以上のデータベースを持つ場合、一節づつassertz で追加する時に、各項のアトムの既出検査で、平均すると アトム総数の半分のリンクを辿ります。いくらCPUのサイクル が高まってもこれでは時間がかかり過ぎということです。
70 : Prolog の入力述語について、 項の入力にはread/1が使われてきましたが、これは、 ・ ピリオドで終わらなくてはならない。 ・ シンタックス的に正しい項以外はエラーとなってしまう。 など、実務での使用に適しません。それで改行までの文字列を 入力として受け取る、get_line/1の定義をしておくのが普通です。 get_lineはget_char/1 または get_code/1を改行がくるまで、 繰り返し使うことによって定義します。例えば、 get_line(Line) :- get_char(Char), get_line_2(Char,L), concat_atom(L,Line). get_line_2('\n',[]) :- !. get_line_2(A,[A|R]) :- get_char(B),get_line_2(B,R). concat_atom([],''). concat_atom([A|R],S) :- concat_atom(R,S1),atom_concat(A,S1,S).
71 : ちょっと読みにくかったですね。すみません。 <Prolog の入力述語について> 項の入力にはread/1が使われてきましたが、これは、 ・ ピリオドで終わらなくてはならない。 ・ シンタックス的に正しい項以外はエラーとなってしまう。 など、実務での使用に適しません。それで改行までの文字列を 入力として受け取る、get_line/1の定義をしておくのが普通です。 get_lineはget_char/1 または get_code/1を改行がくるまで、 繰り返し使うことによって定義します。例えば、 get_line(Line) :- get_char(Char), get_line_2(Char,L), concat_atom(L,Line). get_line_2('\n',[]) :- !. get_line_2(A,[A|R]) :- get_char(B),get_line_2(B,R). get_line_2は引数が違いますから、get_lineでもいいのですが、 ちょっと理由があってこうしました。これについては後に。
72 : ストリーム付きのget_line すなわち get_line/2 >>71 でget_line/2を使わなかったのは、この述語定義のために 残して置きたいという理由からでした。 get_line(Stream,Line) :- get_char(Stream,Char), get_line_3(Stream,Char,L), concat_atom(L,Line). get_line_3(Stream,'\n',[]).. get_line_3(Stream,A,[A|R]) :- get_char(Stream,B),get_line_3(Stream,B,R). という定義であり、 ?- open(File,read,Instram),get_line(Instream,Line),close(Instream), ... の ように使います。
73 : タブで終了させたい場合もあるでしょう。 get_line(Line) :- get_char(Char), get_line_2(Char,L), concat_atom(L,Line). get_line_2('\t',[]) :- !. get_line_2('\n',[]) :- !. get_line_2(A,[A|R]) :- get_char(B),get_line_2(B,R). のように終止節を追加します。OSによっては、入力に newline の他にキャレッジリターンフィールが入力される ことがあり、これは無視するために、 get_line_2('\t',[]) :- !. get_line_2('\n',[]) :- !. get_line_2('\r',R) :- get_char(B),get_line_2(B,R),!. get_line_2(A,[A|R]) :- get_char(B),get_line_2(B,R). のように一節挿入します。
74 : 業務用途ではないけどミドルウエアでは使われているよ。 あと、なぜ殆どの人はprologを言語上の述語理論でしか考えてない/られないのかね。 まるで判ってないと思う。
75 : >>74 (工夫して)書いてみる前に判った気がしてしまう。これも、述語理論の所為から 知れないよ。
76 : 入力はなしの続きです。 Prologでは引数で値を渡す定義が普通で、標準入力からデータ受け取って、 その後の処理をするプログラムはあまりありません。しかし、C/C++の宿題は ほとんどすべてこの形式で出題されていて、このようなスタイルのPrologに ついて整理する機会を得ました。それで、次からは入力検査についての話を します。
77 : >>74 うちもWebサーバ、Proxy、メールサーバ、などはPrologだけど、 Prolog だからというよりは、自前だから便利というところだな。
78 : CGIでなくダイレクトにアプリが応答できるのはもちろん便利だけど。
79 : 最近は、原則として以下のような入力検査を必ずすることにしている。 例として、入力データが整数であることを要求されているとする。 整数データの入力(N) :- write('整数を入力してください : '), get_line(Line), 整数データの入力診断(Line,N),!. 整数データの入力(N) :- 整数データの入力(N). 整数データの入力診断(Line,N) :- atom_to_term(Line,N,_), integer(N),!. 整数データの入力診断(Line,N) :- write_formatted('入力された %t からは整数が得られませんでした。再入力をお願いします\n',[Line ]), fail. ポイントは、 ・ 整数以外のデータが入力されたら、それは捨てて、再入力を要求する。 ・ 入力のトップレベルつまりget_lineのある述語定義では診断をしない。
80 : 最近は、原則として以下のような入力検査を必ずすることにしている。 例として、入力データが整数であることを要求されているとする。 整数データの入力(N) :- write('整数を入力してください : '), get_line(Line), 整数データの入力診断(Line,N),!. 整数データの入力(N) :- 整数データの入力(N). 整数データの入力診断(Line,N) :- atom_to_term(Line,N,_), integer(N),!. 整数データの入力診断(Line,N) :- write_formatted('入力された %t からは整数が得られませんでした。再入力をお願いします\ n',[Line]), fail. ポイントは、 ・ 整数以外のデータが入力されたら、それは捨てて、再入力を要求する。 ・ 入力のトップレベルつまりget_lineのある述語定義では診断をしない。
81 : 入力のトップレベルと診断してしまうと、そこでfailになった場合、 get_line/1でせっかく入力された文字列とLineの束縛がそこで解かれて しまって、 整数データの入力(N) :- 整数データの入力(N). の引数を増やしてみても、Lineを受け取ることはできません。このため、 診断結果の表示はLineを渡された述語の中で行います。 atom_to_term は parse_atom という処理系もあり、文字列からPrologで 認識できる項を切り出す述語です。第三引数については後に説明します。
82 : 表現が適切でない部分があったため、重複しますが、書き直しました。 ポイントは、 ・ 整数以外のデータが入力されたら、それは捨てて、再入力を要求する。 ・ 入力のトップレベルつまりget_lineのある述語定義では診断をしない。 入力のトップレベルで診断してしまうと、failになった場合get_line/1で せっかく入力された文字列とLineの束縛がそこで解かれてしまって、 整数データの入力(N) :- 整数データの入力(N). の引数を増やしてみても、Lineを受け取ることはできません。このため、 診断結果の表示はLineを渡された述語 整数データの入力診断/2の中で 行います。 atom_to_term は parse_atom という処理系もあり、文字列からPrologで 認識できる項を切り出す述語です。第三引数については後に説明します。
83 : ちょっとしたシナリオの検証をするのに役に立つなー
84 : >>58 この問題を蒸し返しますが、今日、私が要求されている 業務処理の大半が、Webからの情報の安定した抜き取りで あり、そこで得られた情報の組み合わせを、保存する ことです。いわゆる、計算はほとんどありません。 このような業務処理への適性では Prolog はスーパーの クラスの中にいることは間違いありません。
85 : 昨日から Prolog を始めた初心者です。まるきり興味本位でやっています。 環境は Java6+PrologCafe1.2.5 です。 宿題スレにあった設問を自分なりに解いてみました。 http://www.dotup.org/uploda/www.dotup.org1263511.txt.html パターンの数え上げ手法はあるソースを参考にしました。 あんまりあちこち見てて、どこだったかは分からなくなってしまいました。 その他いろいろ資料をあさってやってみたのですが、 switch文だの3項演算だのが頭にちらついて、どうも汚い感じにしか組めません。 とてもじゃないけどこれを「宿題だ持って行け」とは言えない・・・ メモリ足らずで JVM様が例外はいたりするので、 計算回数減らすための処理もこちょこちょ書いてるんですが、 たぶんすごく回りくどいことしてるんだと思います。 ! もよく分からないので避けちゃってます。 もし簡単に改善できるところがあれば教えていただけると幸いです。
86 : >>58 わが社の業務処理時の手動でのPrologインタプリタの負節入力(?- から始まる質問)の 累積数は18年間に70万を超えています。ほとんどが売上伝票入力ではありますが、 不自然さは全くありません。トランザクションとしては、別にPOS経由のものがあり、 こちらの累積は21年間で3000万くらいになります。Prologとの相性という点では、 従業員30-60名くらいの小企業だからこそと言うことができるかもしれない。よくぞ 小企業でいてくれた!,が正直な感想ですね。
87 : >>85 恐縮ですが、書き込まれた解答を、 http://nojiriko.asia/prolog/prolog_177_1.html に勝手に転記させていただきました。 uploadサイトの掲載時間に制限があるためであり、著作権については可能な処置を したつもりです。
88 : >>85 ストレートフラッシュを除くフラッシュが一回目の配札で出現する確率は _確率 is 4 * (13/52) * (12/51) * (11/50) * (10/49) * (9/48). ですよね。仮に、全知全能というよりも予言者的なプレーヤーがつぎに 配られる5枚のカードを分かってしまって、フラッシュになるに相応しい 手札の取り替え戦略をとったとすると、確率はどうなるんですか?
89 : ごめん、ストレートフラッシュを含んだでした。
90 : 4枚同じマークが配られて、一枚交換して、フラッシュになる確率は、 _確率 is 4 * ((13/52) * (12/51) * (11/50) * (10/49) + (1/47)). でいいのかな?
91 : あ、大間違いw これから、夕方まで出かけるから、 その後で直します
92 : _確率 is 4 * ((13/52) * (12/51) * (11/50) * (10/49) * (39/48) * (9/47)). となるのかな? これを2-5枚とやっていって、合計がフラッシュの確立かな。 本当かね。
93 : >>92 これまた、大間違い。判りません。
94 : 論理プログラミングに最近強い関心があるので質問 1.学ぶ際にPrologを選んでも大丈夫?(念の為) 2.Wikipediaに目を通した感じではAZ-PrologやSWI-Prologが良さそうだけど、お勧めの処理系は?
95 : 1..それ以外の選択はむずかしいのではないかな。 2.. 日本語マニュアルが必要なら、AZ=Prolog。この処理系は1980年代に一世を風靡した Prolog-KABAの後継を目指して開発されたもので、オンラインマニュアルの他、 Prolog-KABAの解説本も参考書になります。 今後、多くの仲間とライブラリを分け合ったりしながら発展していくには、 SWI-Prologがお勧めです。2000年代に入って最も活性のある処理系だと思います。 以前はバージョンによっていろいろ問題がありましたが現在は日本語も制限なく使えます。 おまけ.. Prologに慣れたら、Progol(誤植ではない)という処理系をインストールて 機能論理Prologで遊んでみるといいと思います。すでに定義された節から、 どうやったら新しいルールをProgolに生成させることができるか。大変興味い テーマを楽しめます。
96 : 機能論理Prolog は 機能論理プログラミングの間違いでした。
97 : それから AZ=Prolog -> AZ-Prolog
98 : >>95 もしProgolに手を出すなら 帰納論理プログラミングの入門書もどうぞ。 帰納論理プログラミング http://furukawa.sfc.keio.ac.jp/book/ http://www.amazon.co.jp/dp/4320120140/
99 : 大変! ^ wwww 機能論理プログラミングになっている。 帰納論理プログラミングの間違いです。
100 : >>95-99 レスありがとう 処理系は俺の場合は既存の資産もないし、英語マニュアルに抵抗もないからSWI-Prologにする 帰納論理プログラミングも面白そう ちょっと違うかもしれないが論理プログラミングにおけるメタプログラミングみたいな感じ?
101 : >>100 関数型のメタプログラミングはあまり詳しくないから、そうだとも違うともいえませんが、 帰納論理プログラミングは(集合の)外延定義にヒントを与えてやると内包定義つまりルールを 生成してくるというような感じです。もちろん、外延だけでなく、内包も考慮しますから、 かなり複雑なルールの生成も可能なようです。しかし、一種のリバースエンジニアリング的な ものですから、生成されるルールの可能性が大きく成りすぎて、収拾がつかない。というのが 私のレベルですね。
102 : リバースエンジニアリング的という表現は適切でなかったので撤回します。 どういう表現が適切であるかは、もう少し考えます
103 : メタプログラミングは「ロジックを生成するロジック」または「プログラムを生成するプログラム」 帰納的にルールを導出するというのがメタプログラミング的だと思ったけど よく考えたら帰納も演繹もそうありうるような気がしてきた……
104 : むつかしい
105 : >>103 ロジックを生成する事と、隠された ロジックを発見する事は違うんじゃ ないか。
106 : 隠されたは言い過ぎだな。 せいぜい、隠れたロジック。
107 : 定義節集合から新たに論理式(述語定義)を発見するのが 帰納論理プログラミングであり、一方、我々の日常的な プログラミングの目標は、課題(仕様)の自然言語表現から、 論理式(述語定義)を発見して、Prologプログラムとして 書くこと。 仮に、コンピュータを自然言語で操作することを目標と した場合には、Prologの次善の言語としての地位は現在 も揺らいではいない。
108 : あげなさい
109 : swi-Prologを使用しています。 listingでプログラムをセーブするとき、tell(出力先)を使うしかないのでしょうか?
110 : >>109 open/3,listing/2,close/1などが使えないものか、 ということですね。私はtell/1でしか使ったことが ながったので、確かめてみました。 結論からいうと、ストリームの使用はできないようですね。
111 : 迷路で全ての経路探索とか出来るのん?
112 : 方程式を自動で解くことはできるのん?
113 : >>111 Prologでまったりスレでも何回となく示された述語先祖で考えてみます。 親子(為義,義朝). 親子(義朝,頼朝). の関係が定義されている時、先祖関係は、 先祖(A,B) :- 親子(A,B). 先祖(A,B) :- 親子(A,C),先祖(C,B). で定義できます。 これは 為義 --- 義朝 --- 頼朝 の関係ですが、 これを 為義 --- 義朝 --- 義平 |- 為朝 |- 頼朝 --- 範頼 と定義し直します。 親子(為義,義朝). 親子(為義,為朝). 親子(義朝,義平). 親子(義朝,頼朝). 親子(頼朝,範頼). ですね。先祖関係の定義もちょっとだけ手を入れて、 先祖(A,B) :- 親子(A,B),write_formatted('%t-%t\n',[A,B]),!. 先祖(A,B) :- 親子(A,C),write_formatted('%t-%t\n',[A,C]),先祖(C,B). ここで、 ?- 先祖(為義,範頼). を実行してみます。 為義-義朝 義朝-義平 義朝-頼朝 頼朝-範頼 yes で終了となります。あとで続きを書きます。
114 : 系図が歪んでしまいました。書き直し。 これは 為義 --- 義朝 --- 頼朝 の関係ですが、 これを 為義 --- 義朝 --- 義平 |- 為朝 |- 頼朝 --- 範頼
115 : >>113 で示した親子関係が迷路の回路選択を抽象したものになっていると思います。 分岐点(例えば為義)から開路である義朝に進むか、為朝に進むかの選択があります。 Prologは深さ優先選択という戦術で、次に義朝-義平の順で進んで行きます。 義平には子はいないようなので、諦めて、義朝分岐点に戻り、頼朝を選択する。 こうして、範頼にたどり着きます。
116 : 最後に強調されるべきことは、この経路選択 プログラムが 先祖(A,B) :- 親子(A,B). 先祖(A,B) :- 親子(A,C),先祖(C,B). という極めて簡素な定義によって書き切られていると いう点です。
117 : AZ-Prologの64bit版は、6Gbyte以上のメモリーを推奨していますが、SW-Prologの64bit版は、どうなんでしょうか? 4Gbyteだと、問題があるでしょうか?
118 : >>117 SWI-Prologの64bit版は使ったことがないので、 これは回答ではありません。 AZ-Prologの64bit版についてですが、これは新しい 版がマルチコア対応の並列処理機能を目玉にして いるため、必ずこの機能が使われるに相違ないとして、 保険をかけた感じで、大きなメモリーを推奨しているに 過ぎないと思います。小さいと動かなくなる理由はない はずです。
119 : >>112 これに答えるのは私の能力を超えるので簡単に。 現在のPrologの仕様で引数の評価に大きな力を持た せることは、ユニフィケーションが邪魔をして無理です。 さらに、現在のPrologの基本的に持っている能力は 変数の変域が離散的でごく限られた数である場合に、 虱潰しに変数に候補要素をあてはめて、確かめること だけだと思います。変数制約を解消していくどんな機構も 持っていません。これを解決するには、この目的のために、 開発された、制約論理型プログラム言語を利用する他ない のではないでしょうか。 多くの制約論理型言語はそのサブセットとして、Prologを 持っていますから、そういう利用が多いユーザは最初から 制約論理型言語を選択するべきでしょう。
120 : おお説明来てる が、むずい 勉強しよう
121 : >>119 詳しい解説があったのでリンクします。 制約論理プログラミング http://ja.wikipedia.org/wiki/%E5%88%B6%E7%B4%84%E8%AB%96%E7%90%86%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0 制約プログラミングのページ http://www.constraint.org/constraint_org.htm
122 : Prologの入門本の学習順序の提案 杉崎昭生著「Prologを学ぶ」(http://www.amazon.co.jp/dp/4303716901/) -> 古川康一著「Prolog入門」(http://www.amazon.co.jp/dp/4274073084/)
123 : 素人ですが、事例を検索するプログラムを考えています。 例えですが、文字列と、それを含むページについて考えます。 記号aを、この文字列として表すときは"a"とし、変数とするときはそのまま裸のaで表すことにします。 あいまいな表現になりますが、「aを含むページである」というのをPg(a)と表すと、 「Pg(a) ならば Pg(b)」 というのは、「aを含むページなら、bを含むページである」ということになります。 この式の値として、式を変形し、「¬(Pg(a)) または Pg(b)」 とし、aを含まないページの集合とbを含むページの集合の和集合を求め、そのページ数を全ページ数で割った値とします。この式の否定の値は、1との差の値になります。 式の値をこのようにするのは数学的に妥当なものなのでしょうか?
124 : >>123 「全ページのうち、命題を否定しないページと否定するページの割合」を計算しています。 数学的に妥当でない操作は行われていません。 でもaを含まないページは事例検索の利用者にとって無関係な事例でしょう。 必要なのは「aを含むページのうち、bを含むページと含まないページの割合」なのでは?
125 : >>123 Pg(a) を太宰治が現れるページ Pg(b) を文学という語が 現れるページとすると、 「この式の値として、式を変形し、「\+(Pg(a)) または Pg(b)」 とし、aを含まないページの集合とbを含むページの集合の 和集合を求め、そのページ数を全ページ数で割った値」とは (全ページ数 + 太宰治という語が現れないが文学という語の現れるページ数) / 全ページ数 ですね。この比率 - 1 は ( Pg(a),\+(Pg(b))のページ数 / 全ページ数 ではなくて ( \+Pg(a),pg(b))のページ数 / 全ページ数 なのではないか。
126 : >>125 A=太宰治がなく文学がないページ B=太宰治があり文学がないページ C=太宰治がなく文学があるページ D=太宰治があり文学があるページ とおくと、 全ページ = A+B+C+D ¬(Pg(a)) = A+C Pg(b) = C+D ¬(Pg(a)) または Pg(b) = A+C+D になります。 「aを含まないページの集合とbを含むページの集合の 和集合を求め、そのページ数を全ページ数で割った値」は (A+C+D) / (A+B+C+D) です。 全ページのうち、「太宰治を含むなら文学を含む」を否定しないページの割合です。 これは1以下になります。この割合-1は無意味です。 1-この割合は B / (A+B+C+D) です。 全ページのうち、「太宰治を含むなら文学を含む」を否定するページの割合です。 >>123 事例検索の利用者にとっては太宰治を含まないページはどうでもいいから 役に立つのは「太宰治を含むページのうち、文学をを含むページの割合」と 「太宰治を含むページのうち、文学を含まないページの割合」ではないでしょうか。
127 : 確かにそうですね。ありがとう。
128 : >>126 レスにし損なりました。もう一度、 確かにそうです。ありがとうございました。
129 : 「Prologの宿題片付けます」スレで出ている、Prologの 解説本の中に8クィーンアルゴリズムは何種類くらい あるかな、という話は現在まとめ中です。あまり、この 言語向きの課題とは思えないけど。 この言語向きの課題といえば、20年くらい前にProlog を買っていた時、本屋の立ち読みの評価基準に使って いたのが、経路問題の多寡。もちろん多いほど読み応え がある。この基準でどんな本を復活できるかやってみま しょう。
130 : どんな本を復活できるか、とは妙な言い回しですが、 もう五年以上前になりますが、本棚に眠っていた、 「Prologを学ぶ --文化とその実践--」という本を 読んでみて、気に入ったというよりよく書けているのに 感心した。Amazonで確認してみるとほとんど売れ行き は最下位近くに低迷していた。そこで、読み直したら 赤面ものの内容のないカスタマーレビューを書き、 星五つの評価を付けた。驚くべきことに、それ以降、 この無名本は常時Prolog本の売れ行き上位に入り続け 今日でも絶版にもならず、Amazonでは売り切れては 入荷をくり返している。こんなことで、忘れ去られた本 たちが復活できるなら、いくらでも労は惜しみません。
131 : 経験の事例を単純に選言標準形で表したプログラムを考えていますが、 その世界での論理値を0から1までの値にして数学的な破綻がないかどうかが気になっていました。 意味のある検索とか、推論とかも、比の論理値で色々考えてみるつもりです。
132 : ファジィ論理?
133 : >>132 初歩的な統計学の範囲だと思います。
134 : 手続きを書くのではなくて、 ぷろろぐに手続きを任せるって認識でいいのだろうかー PGは関係を定義しておくだけという で、がらがらと処理して真か偽かと
135 : 2ch ヘッドラインニュースBBY(一覧性が秀逸)http://headline.2ch.net/bbynews/ どんな難解ニュースでも掲示板の書き込みでオモシロおかしく簡単理解。 ニュースを勢い順にカテゴリー別で表示する"2NN"(2ちゃんねるニュース速報+ナビゲーター)もどうぞ。
136 : >>134 Prologはプログラムには確実に実行順序があります。 この実行順序を"意識"すると手続きになり、意識しない限りは 宣言的である(宣言的に読んでいる)といえます。 Prologの副目標(subgoalともいう)は真偽値しか返しません。これが Prologプログラミングの核心であって、プログラマは、実際には、 全部真であるに違いないという姿勢でこの本体の記述を読みます。 つまり真偽値さへも意識しないのです。そして引数の変数の遷移を 一瞥します。 Prologを読むときにすることはこれだけです。そう、これだけです。 返り値のこともあるいはそのデータ型やクラスについて思いめぐら すことは全く、ありません。
137 : ふm 肝はデータベースと見た
138 : >>137 そうです。条件のない、命題だけからなる Prologプログラミングが"理想"ですね。
139 : 別解を求めていくためにカットを使わないところがあると、別解を求めていくとき、 節を選択する条件を兼ねた命題が失敗して次の節が選ばれればいいのですが、失敗でないのに次の節に移るときがあります。 そのために、条件の否定を加える必要があるのですが、 一般的に、カットを使わないときは、カットによって省略できていた命題を加えればいいということなのでしょうか?
140 : >>139 必要なことは、a,bが条件だとすると、 p(X) :- a,b,X=1. p(X) :- a,\+(b),X=2. p(X) :- \+(a),b,X=3. p(X) :- \+(a),\+(b),X=4. のような定義を「気楽」にできること。 実際には、a,b,の中に副作用があったりして このような記述が不可能の場合もありますが。 我慢して、このような冗長なコードを書いて いると、ご利益として、ブール代数的直感が 鋭くなってきていつの間にか以前よりも正確 なコード書くことができるようになります。
141 : 問題 3つの整数があります。AとBとCの和が160,Aの2倍とBの3倍とCの和が297,Bの2倍とCの和が149で す。Bはいくつですか。 'Bはいくつですか'(N) :- length(D,160), append(A,B,C,D), length(E,297), append(A,A,A2), append(B,B,B,B3), append(A2,B3,C,E), length(F,149), append(B,B,C,F), length(B,N). ?- 'Bはいくつですか'(N). N = 42 の解がでるまでにIF/Prologインタプリタで 6分30秒かかった。
142 : 間違い。2.2GhzCPU Ubuntu10.10で242秒でした。
143 : ['X']というアトムのリストを、[X]という変数のリストにするにはどうすればいいのでしょうか?
144 : 一応、外部にリストの形の文字列を出力してから、入力しています。
145 : >>143 どういう局面で変数ラベルがプログラマの期待通り 表示されるのかという問題と考えよう。 処理系によって異なるとおもうけれど、Heap領域に 元々の変数のラベルと現在の変数の一意名(大きの 場合番号)の対応表が確保される。この対応表が Prologの処理系によって参照されるのは、 ・listingなど定義節の表示(これは否応なくHeap 領域の参照が生じる。そのついで) ・インタプリタのトップレベルのインタプリタ側が サービスとして表示する変数名。 であって、 ?- atom_to_term('X',A,Varlist),write(A),nl. を実行しても、 このトップレベルには変数Xが存在しないため、 _G24689 A = _G24689 yes としか表示されない。 つまり、トップレベルに現れる変数は例外として、 反駁途中stack領域内でのユニフィケーションに よって生じた当然の変数名は処理系がプログラマ がこの変数名に何を期待しているかというような 推論を行わなわず、したがって、スタック内の 変数ラベルをこれに置き換えるというようなコスト のかかる作業を行わないため表示されることがない。 あとで続きを書きます。
146 : >>145 ごめんなさい。まちがえました。 ?- atom_to_term('X',U,Varlist),write(U),nl. を実行すると、 _G24689 Varlist = ['X' = U] となります。注目はwriteで表示される変数はUでもXでもなく、 _G24689であるという点です。
147 : consult/1やreconsult/1でファイルからソースプログラムを 読み込むときは、読み込んだ文字列をparse_atomして、第三 引数のVarlistをヒープ領域に、変数名と定義した節構造の 中の変数Idのペア、として登録します。 ユーザがreadしてからassertする場合は、処理系によります。 assertz_with_namesのようなVarlist処理をオプションに 持った処理系の場合は, ?- ... read_with_names(P,V),assertz_with_name(P,V), ... としておくことで、後にユーザが指定したかった変数名を あくまで字面だけの問題ではありますが、「復元」するこ とができます。 このようなオプションがあれば、より高度なインタプリタを 構築したり、マクロ処理を取り入れる場合には、この復元 を使うことによって、使い易い、分かりやすい、インタブリタ やデバッガを作成することができます。 しかし、これらのことはあくまで変数を表示する際の「字面」 だけの問題であり、Prolog実行時のユニフィケーションに よる、スタックの書き換え処理では、そのすべてが無機的な 変数Idの単一化だけで処理されている、ということを理解 する必要があります。
148 : >>147 質問が不適切だったと思います。 一般的に言うと、文字列として表現した節を、プログラムとしての節に変換するにはどうすればいいかということです。 外部のテキストをプログラムとして読み込めるなら、内部で「']と「']で囲まれた文字列をプログラムとして読み込めてもいいと思います。
149 : atom_to_termという述語を使えばいいと分かりました。 まったくの素人レベルのことです。
150 : >>148 この言語で説明が最も難しい問題のひとつです。 よい質問だったと思います。 私の回答も不十分あるいは不適切なものでしたね。
151 : あげるべきだろう
152 : http://nojiriko.asia/prolog/mojiretsu.pro このサイトの後半部分は正規表現で書くことが できるものをProlog述語で定義するとどうなるかと いう課題への解答が集められています。 やはり、正規表現では1行で済むところが述語定義 では7-8行、場合によると10行以上になる場合も 少なくありません。しかし、ここで私が問いかけたいのは、 記述の効率性の問題だけではなく、これらの述語の名前と して、正規表現として正解の表現を置いたとすると、この 述語名の解説としてPrologコードがどの程度有効な ものになっているか、と言う観点です。(注1) この観点からは、Prologは相当に優秀な言語だといえる のではないか。そうであるといいなと思っています。 (注1) 残念ながら、正規表現の正解が元サイトでも 今ひとつはっきりしないため、述語名は日本語での 表現になっています。
153 : 同じサイトのこちらでは、 http://nojiriko.asia/prolog/onmemory_database.html Prolog単位節をオンメモリデータベースに見立てて、 SQLによる問い合わせと等価なProlog述語定義を 試みています。
154 : >>153 ピーター・グレイの名著 「論理・代数・データベース --知の工学の基礎--」 の 下支えとして位置付けて、このサイトを読まれるとよいと思います。
155 : 「いろんな言語で宿題スレ」での出題に 対するProlog解答を集めたWebサイト http://nojiriko.asia/prolog/ は現在1600解答を集めました。 先週、主要述語の用例集をこのサイトに集めた 解答から抜き出して追加しました。 各用例の題材は現在は出現順にならんで いますが、今後のこれを意味別に並べ直すつもりです。 解説も極く一部しかついていませんが、意味別に 大分して、それに対して解説を追加する予定です。 最終的には、さらに主要Prolog処理系の互換性を 取るための述語などをここにします。
156 : 訂正 最終行 ここにします。 -> ここに追加します。
157 : x-euc-jpはeuc-jpにして欲しい…
158 : エキスパートシステムとか書けたりする?
159 : >>158 Prologはエキスパートシステム記述するための 言語のひとつということになっている。 私が書いたことがあるか、とか、今書けるかという意味だと すると、答えは、 20年前には結構書いた。業務用も含めて。 対象が定まれば、サンプル的な短いものなら今でも書ける。 大別して前向き推論によるものと後ろ向き推論のものが あるが、私は全て後ろ向き。 Prologにとってはこちらの方が自然ということらしい。
160 : エキスパートシステム書けるのですか。 …冷静に考えればprologなればこそ書けなきゃおかしいか。 IBMがprologで自然言語処理がうんたらかんたらしてるらしいので もっと注目されてほしいなぁ。
161 : >>160 急に注目されはじめたようですよ。
162 : エキスパートシステムなんてどんな言語でも簡単に書ける。 prologはファクトの無限導出を副作用をつかって 避ける必要があるので、むしろ面倒なくらいだ。
163 : >>162 「どんな言語でも」書けるもんなら書いてくれ。
164 : どんな言語でもというと語弊があるだろうけど、そんなに難しいものでは ないという点には同意。 Prologだとappendだけで書けるレベル。かってはスタックオーバーフローや GCの頻発に悩みながらだったが、現在は、2GB以上のプロセスが当たり前で データをすべて引数で持ち回っても問題はない。 Prologの利点は、何といっても作り込みが容易なこと。業種、企業、生産現場に よって、全く異なるデータのサンプリングの方法を仕様がしっかり文章化されて いれば、簡単に述語として追加・変更できることだろう。
165 : 最近のエキスパートシステム事情には疎いのだけれど、 かっては確かにルールをシンボル化してその論理式を assert,retractしながら利用するというような手法が 使われていたと思うけど、今は、 非決定性のappend/3 を ...,apppend(L1,[A|L2],L),filter(A,B), ... のように使って、例えば、Bの排他的要素がL1,L2に存在 するか確かめながら(これもappend/3)進むというような ものがほとんどだと思う。
166 : >>164 私が今書くとすると、"Prolog Programming For Artificial Inteligence" の14章を 一度読みなおしてからということになるが、十分に難しいよ。 他の言語でやさしいかどうかは知らないが。
167 : Prolog全然使えん。簡単なループ文書くのですら一苦労だ。
168 : 斬新な用途ですね。
169 : prologが得意な人は行列積とかどんな風に書くのかな 自分で書くと、とても綺麗とはいえないコードになる
170 : 線形代数関係は、LAPACKに処理を投げるのがプログラミングの定石では? PrologからLAPACKにどうやって処理を投げるのか知らないけど。
171 : 実用にするならそうだね。 ただ、言語のプログラミングスタイルの話だから…
172 : >>169 転置も含めて、単純な再帰述語が六段くらい。 難しいところは全くないからそれでいいのでは。
173 : >>172 私が今書くとすると、"Matrix Computations 3rd Edition"を 一度読みなおしてからということになるが、十分に難しいよ。 他の言語でやさしいかどうかは知らないが。
174 : >>173 > 他の言語でやさしいかどうかは知らないが。 APLという軟弱言語なら演算子三文字。 軟弱言語巡りをしてPrologにも立ち寄っているけど、 何を書いてもエラーか無限再帰になってしまう。 未だ正しい記述が出来ない orz
175 : >>174 せめて計算環境にあわせてブロック分割くらいしようぜ
176 : >>174 こんな感じじゃないかな。個々の述語は単純だよ。 m_mult(L1,L2,X) :- m_trans(L2,L4),m_mult_1(L1,L4,X) . m_trans([],[],[]) :- !. m_trans([[A|R]|R1],[A|R2],[R|R3]) :- m_trans(R1,R2,R3) . m_trans([[]|_],[]) :- !. m_trans(L,[B|R1]) :- m_trans(L,B,R2),m_trans(R2,R1),!. m_mult_1([],_,[]) :- !. m_mult_1([A|R1],L,[S1|R3]) :- m_mult_2(A,L,S1),m_mult_1(R1,L,R3). m_mult_2(_,[],[]) :- !. m_mult_2(A,[B|R2],[C|R3]) :- m_mult_3(A,B,C), m_mult_2(A,R2,R3). m_mult_3([],[],0) :- !. m_mult_3([A|R1],[B|R2],S) :- S1 is A * B,m_mult_3(R1,R2,S2),S is S1 + S2.
177 : コピペなんですがこういうのも論理型言語で記述できるのでしょうか? > 357 :名無しさん@涙目です。(東京都):2011/05/02(月) 19:15:52.75 ID:Of9kzpjA0 > こんなのもあるな > 登場人物は4人。(男の子、女の子、アイスクリーム屋さん、お母さん) > > 男の子と女の子が公園で遊んでいると、アイスクリーム屋さんがきます。 > ふたりはアイスが食べたいが、男の子はお金を持っていません。 > アイスクリーム屋さんが「今日はずっと公園でお店やるよ。」 というので、男の子は家にお金を取りに行きます。 > 途中でアイスクリーム屋さんの気が変わり、学校でお店を出すことになり > 女の子に「男の子に学校に来るように伝えに行って」と、頼みます。 > アイスクリーム屋さんが、学校に向かう途中で、お金を取りに行った男の子に会います。 > アイスクリーム屋さんは男の子に学校にお店を出すことにした事を伝え、一緒に学校に行きます。 > その頃、家に着いた女の子はお母さんから、「男の子は、もうアイスを買いに行った」ことを、聞きます。 > > さて、ここで問題です。女の子はどこに男の子を探しに行くでしょうか?
178 : よくわからんけど、これは情報格差を見失わないでいられるか、みたいなのを確かめる試験みたいなもので、 パズルではないような
179 : 発達心理学の有名な問題で、 女の子が一定年齢以下だと公園に行くけど、一定年齢以上だと学校に行くとか、そんな話じゃなかったかと。
180 : 「女の子は男の子が学校に向かうことを知っているか?」 とかそんな形でモデル化できないこともないかな。 この場合「知らない」なので「公園に行く」になるような。 その文章が表現してる知識全部がうまくいくかどうかはわからない。 >>179 逆かな。
181 : >>179 そうそう確かコピペ元がそんなスレだったと思う 発達障害か何かで女の子の立場で考えられるかどうかを見るテストだったような 論理とは関係ないか
182 : 自然言語の曖昧さとかに依存してるなら難しいけど、 (有名な例では、 「宵の明星は金星である」「金星は宵の明星である」 「明けの明星は金星である」「金星は明けの明星である」はいずれも真である。 では、「宵の明星は明けの明星である」は真か、みたいな) 入り組んでいるだけなら論理として扱えると思うけどね。
183 : >>180 > >>179 逆かな。 なんかそんな気がする。 >>181 より単純な例示をすると以下のよう。 1.男の子と女の子が同席している場で、先生が"not(Human(Socrates))."と教える。 2.男の子が退席した後で、先生は女の子に"Human(Socrates)."と教える。 3.「男の子は"?- Human(Socrates)."という問いにどう答えるか?」と女の子に尋ねる。 年端のいかない子供は、 男の子が"Human(Socrates)."を知らないという情報をうまく処理できず、 3の問いに"Human(Socrates)."と答えてしまうのだとか。
184 : 訂正 × Socrates ○ socrates だった。 あと女の子の応答もYes/Noだ。
185 : あるリストから要素数Nの部分集合が全部ほしいんですがどうすればいいでしょうか?
186 : >>185 http://www.geocities.jp/m_hiroi/prolog/prolog02.html 部分集合の判定 selects([], Ys). selects([X | Xs], Ys) :- select(X, Ys, Ys1), selects(Xs, Ys1).
187 : >>186 はい、自分もそこを見て selects(Xs,Ys,Z):-selects(Xs,Ys),length(Xs,Z) みたいにして要素数Zの部分集合を得て、さらに並べ替えがいらないんで selects(Xs,Ys,Z):-selects(Xs,Ys),length(Xs,Z),sort(Xs,Xs). みたいにしたんですが、なんかすごくブサイクな感じなんでなんかないかなーと思いまして
188 : 全生成して要素数N以外を捨てる これが富豪か
189 : >>187 http://www.geocities.jp/m_hiroi/prolog/yapp02.html ●問題32 ?- combination(3, [a, b, c, d, e], X). X = [a, b, c] ; X = [a, b, d] ; X = [a, b, e] ; X = [a, c, d] ; X = [a, c, e] ; X = [a, d, e] ; X = [b, c, d] ; X = [b, c, e] ; X = [b, d, e] ; X = [c, d, e] ; false.
190 : >>189 うおーこんなのまで乗ってるんですね。 ありがとうございます。
191 : 今、学生がprologを学ぶ意義って何だろう? いや、個人的には活用してるけど、俺みたいな言語おたく以外の 普通の学生が、カットの挙動やら、失敗駆動ループやらを 頑張って勉強する価値はあるのかな。 たぶん、大多数はprologなんて一生使わないと思われる。
192 : この言語をマスターしたら論破できるようになるの?
193 : >>192 そもそも何を論破したいの?
194 : >>191 今後使うためとしか答えられない。我々の思考に最も 近い言語はやはりこの言語なのであって、その事が 評価される時が再び来るということだろう。 興味深いことは、結構優秀な学生にとっても Prologは決してやさしくはないということ。これが謎。
195 : >>191 それと、Prologはappendだけで書く言語です、と教えなかったら、 教えるほうが間違っている。
196 : >>195 大学の講座は論理学絡みだからね。前提が。 実務では、実際appendしか使いませんね。 append使うためにはリストに取らなくては ならないから、変換器として、findallは 多用するけどね。
197 : >>191 学ぶ意義のある言語というと、JavaとかCとか? つまらん学校だw 本当の学校ってのは、遊びに行くところ。 prologの授業受けてトラウマ/コンプレックス/やみつきになるくらいでちょうど良い。
198 : SLDNFが人間の思考に近いとは思えんなあ。 prologで普遍的な価値があるのは純粋論理の部分だけじゃないか。
199 : >>196 述語は非決定性に定義しておいて、 findallでリストに取り上げ、非決定性の appendで切りだして処理するだけ。 アセンブラよりも遙かに単純でパターン も少ない。 >>191 カットなんて、決定性にする サインとしてしか使わないし、何が 難しいのだろう。
200 : >>200 100%教え方が悪いんだろうね。大学の先生方のね。
201 : >>199 まあ、逆に言えばその程度のものでしかないから、 必要になってからハウツー本でも買って読めばいいので、 大学で教えるほどの価値はないね。
202 : >>201 私もそれで十分だと思うけど。
203 : 要は事務屋のSQL代わりってわけか。 そんなものに多大な国家予算をつぎこんだ日本って…
204 : >>203 私に関しては、言い得て妙ということになるけど。 一般論としては言語はやさしいほどよいということも 言える。第五世代プロジェクトについていうと Prologマシンに拘ったのがどうかな。
205 : >>191 >学生がprologを学ぶ意義 教養。
206 : >>194 >Prologは決してやさしくはない 手続き型がマシなだけで、関数型も論理 型も宣言型も同等にわかりにくいんだろ。 トップダウンのルールベースってのが 鬼門なんだろうな。 オレも、ややこしくなると結局、逐次的に 手続き的に処理を追っかけていくしな。
207 : appendって何?リストの追加?
208 : >>207 ?- append(L0,[X|R],[1,2,3]). L0 = [], X = 1, R = [2,3]; L0 = [1], X = 2, R = [3]; L0 = [1,2], X = 3, R = []; no. ?-
209 : >>207 ?- length(L0,3),append(L0,[X,Y|R],[1,2,3,4,5,6]). L0 = [1,2,3], X = 4, Y = 5, R = [6]; no. ?- length(L0,3),append(L0,[X,Y|R],[a,b,c,d,e,a]),append(_,[Z|_],L0),append(_,[Z|_],R). L0 = [a,b,c], X = d, Y = e, R = [a], _ = [], Z = a, _ = [b,c], _ = [], _ = []; no. ?-
210 : >>207 select(A,L,X) :- append(L0,[A|R],L),append(L0,R,X). ?- select(A,[1,2,3],X). A = 1, X = [2,3]; A = 2, X = [1,3]; A = 3, X = [1,2]; no. ?-
211 : >>207 nth/3 の定義 nth(Nth,List,X) :- length([_|L0],Nth),append(L0,[X|_],List).
212 : >>207 カンマで括られた文字列の検索(_文字列,_適合文字列) :- atom_chars(_文字列,Chars), append(_,[','|L1],Chars), append(L01,[','|_],L1), \+(append(_,[','|_],L01)), atom_chars(_適合文字列,L01).
213 : なにこれ、こわい
214 : >213 自分のやってることの意味を考えずに生きてきて、 ついにコードを見せることしかできなくなった 哀れな技術者の末路です そっとしておいてあげてください。
215 : >>203 このスレ 残滓で満ちてそう…
216 : >>214 俳句が仮に三句から構成されているとすると、 少なくとも六通りのPrologコードが書けるということ。 Prologプログラマは饒舌にならなくては。
217 : そうだね、100通りでも200通りでもかけるね。 そうやって、無意味なことに貴重な税金を無駄遣いしてきたわけか。
218 : >>217 文章の構成が変わることによって当然意味が変わる。 意味が変わったことに敏感にプログラミングできるか ということだけど。無意味と論証するのも難しいだろう。
219 : だから、その行為をどう意義づけているの? それは70年近いプログラミングの発展史のなかでどう位置づけられるの? それを語らずにコードを垂れ流しても何の意味もない。
220 : Prolog製の商用アプリケーションにGeneXusってのあるから何が出来るのか調べてみたらどうだい。 http://www.atmarkit.co.jp/im/cae/reports/0701/01.html http://www.nikkei.com/tech/business/article/g=96958A9C93819499E2EAE2E2838DE2EAE3E0E0E2E3E2E2E2E2E2E2E2 http://itpro.nikkeibp.co.jp/article/COLUMN/20101207/354963/ http://itpro.nikkeibp.co.jp/article/Watcher/20101001/352528/
221 : >[注2]「シーシャープ」と読む。CやC++をベースに米マイクロソフトが開発し、2000年6月に発表したプログラミング言語。 >従来のCやC++との違いは、インターネット経由でアプリケーション・サービスを提供するWebサービスに対応すること 日経・・・
222 : > 「プログラマはもう要らない」。 > 大手物流会社のシステム子会社で新技術の社内展開を進めるマネージャーはこう言い切る。 > ここでいうプログラマとは、企業情報システムの開発プロジェクトでプログラムを作成する担当者を指す。 お前ら、もう要らないらしいw
223 : 俺の会社は業務の要を他社に依存してます宣言かw >>221 どうして日経エレクトロニクスとか日経メカニカルとか、のようなレベルの記事を 書けないのかねぇ。
224 : この記事を使って、リストラが進められそうだな。 「ツール導入で生産性が20倍になりますので、人員を1/20に削減します」
225 : >>224 それで会社が潰れても責任は全て株主が負う。 気にするな。
226 : どんどんやって、どんどん潰れっちまえ
227 : それはいいが、prologの名前をこんないんちき商売に 使うのはやめて欲しい。
228 : >>227 使ってみたことあるのかい?
229 : >従来のCやC++との違いは、インターネット経由でアプリケーション・サービスを提供するWebサービスに対応すること .NETをインターネットの事か何かだと思ったんだろうな
230 : >>219 「発展」史については興味ないけど、 中江俊夫の「語彙集」みたいなものが、 書ければ面白いね。
231 : >>230 引数一切なし?
232 : Prologって業務ロジックを抽象的に表すのには向いているんじゃないだろうか 流行りの(?)DSLとかの代わりにならないかな
233 : >>232 これ以上向いている言語はないと思うけど。 速度を要求されない、複雑化の可能性のあるロジックに ついては、開発速度、プログラマの養成の容易さ、 保守のしやすさ、全ての点で優れている。 欠点はオブジェクト指向言語でなくて、.NETから外れて いることかな。
234 : おおすごい。 なんで普及していない/普及しなかったんだろう?
235 : swi-prolog 5.11.14 で日本語が通りません。 '親子'('茂雄', '一茂') . のような日本語述語や日本語の項はUTF-8で書いて、 クォートでくくれば読み込めるんですが listing しても文字化けしています。 日本語述語で問い合わせしても、そんな述語はないといわれます。 何か設定等必要なのでしょうか? 環境はwindows xp sp2です。
236 : 750 :デフォルトの名無しさん[sage]:2008/12/23(火) 10:10:50 >>747 http://www.swi-prolog.org/versions.html UTF-8対応は5.6.x(開発版では5.5.x)から
237 : おっと5.11.14かごめんw
238 : >>236 ハッァァアァァァァァァアァアアァァァ????????????? ゴミは何いってもゴミ ゴミが口を開くな
239 : ぷろろぐ
240 : 探索とかもろ並列処理できそうな マルチコア時代の今なら並列prologとか出てこないかしら?
241 : お好きなのをどうぞ concurrent prolog parlog ghc kl1 strand
242 : >>238 すごいなお前勘違い全く以てしないのか 人をけなす前にもっとそのスキルを社会に役立てましょう^^
243 : 統合失調症の人にそんなこと言っても無駄
244 : >>240 並列(並行)Prologということではありませんが、 AZ-Prologでは、マルチコアに割り振ることを、 処理系に委託することはできます。
245 : >>240 こういうのとか http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.21.1017
246 : >>240 http://nojiriko.asia/prolog/c135_256.html AZ-Prolog処理系作者によって書かれたMPIライクな マルチプロセス並列処理機能の使用プログラム。
247 : JVM上で動作し、Javaからも呼び出し可能なprologがあれば!
248 : prolog cafeがありますよ
249 : >>248 d javaツールに組み込んでみるんや
250 : 完全な素人です。素朴な疑問なのですが、 同じ事をする場合、手続き的言語と比べて明らかに効率が悪くなる処理とかありますか? 例えばユニフィケーションって処理的にかなり重い気がします。 他にも配列と比べるとリストでは先頭の値しか扱えないとか、再帰呼び出しで (一つ減らして)全要素を毎回コピーするとか手続き型の先入観を持ってると 効率が悪い気がするのですが、理屈の上では処理が増えるとか言う事は無いのでしょうか? 記憶領域もN^2/2とか必要になりそうですし。 ユニフィケーションのコストってどの位と見積もれるものでしょうか? 事実の数が10倍になると10倍の処理が必要なのですか? それともSQLのインデックスみたいな事、もしくはキャッシュみたいなものを持っていて それ程増えないのでしょうか? 変な事を書いているかも知れませんので、疑問自体がおかしいみたいな指摘でも結構です。 よろしくお願いします。
251 : >>250 Prologは最も速いコンパイラ言語の100倍以上遅いでしょう。 その理由の過半がユニフィケーションと変数の繰り返し出現検査に あると思います。指摘されたように配列がないこともある場合には 原因となります。それに比べればトレイルスタック等の追加的処理は 大きなコストになっていないはずです。 明らかに遅くて使えないのはビットマップの処理ですね。繰り返し 数百万のビットに対して演算する場合です。RPGも無理でしょう。 Prologはオンメモリデータベースですから、そこそこ速いのですが、 Prologが再起するためには、あなたが指摘したとおり、インデックス などによる最適化によって、定義アトムを検索する能力を高める 必要があると思います。現在のレベルでは、数百万節の検索を 掛ける気になりません。
252 : >>251 丁寧な回答ありがとうございます。 確かにエンコードなんかで大量のデータをランダムに走査するとか不得意そうですね。 100倍程度なら何とか許容出来るのかもしれません。 ただ、ユニフィケーションの実際の動作が見えないのが気になるんです。 現在の処理系では検索用のヒントみたいなのは指定出来ないと言う事ですよね?少し不安です。 全体で100万件位の事実を想定しているもので。 ユニフィケーションの速度を上げたいのですが、 事実を分割して該当しそうなもののみ指定して検索させるとか可能でしょうか? (デーブルを分割する様なイメージです) グループ分けの規則を介する事になってかえって遅くなったりします?
253 : >>252 PSI(新世代コンピュータ開発機構が開発したPrologマシン)では 確か、第一引数にハッシュでインデックスが自動付加されたように 記憶していますが、その程度のものはコンパイラにはあると思います。 しかし、全ての引数にBtreeに類するインデックスを設定できる コンパイラはないのではないか。
254 : >>253 ありがとうございます。 とすると件数を絞れる様なものを第一引数にすると良いと言う事ですね。 考慮してみます。
255 : Prologを極めることによって、ディベートに強くなれますか?
256 : NO
257 : Prologを極めると友達が一人もいなくなります
258 : むしろPrologがお友達になります
259 : Prolog極めてないのに友達がいないのですがどうすればいいですか?
260 : ロンリープログラミングですね。わかりますん
261 : >>259 定義する他ありませんね。 友達. 友達. 友達.
262 : 最近、うちの子がパソコンを眺めて「ともだち…ともだち…ウヘ」と独り言ちているのですが、どうしたらいいでしょうか。
263 : 友達を蹴ったり、食べたりしないように注意しとけ
264 : すげー今更だけど、 >>70 あたりで定義してる get_line って、 きょうびのProlog処理系だとこんな感じでいいと思う get_line(Line):- findall(C,( repeat, get_char(C), (C=='\r' -> fail ;C=='\n' -> !,fail ;true) ),Chars), atom_chars(Line,Chars). あんまり論理プログラミングっぽくはないが
265 : あと、ストリーム指定付きを作るなら、ストリーム指定付きを定義して、 ストリーム指定なしから呼び出すようにしたほうががスマート get_line(Line):- current_input(Stream), get_line(Stream,Line). get_line(Stream,Line):- 〜〜 get_char(Stream,C), 〜〜 current_input/1 が無ければ seeing/1 でも使うべし
266 : '\r'消しちゃうのはまずいような・・・ get_line(Line) :- findall(C, ( repeat, get_char(C), (C = '\n', !, fail; true)), X), (append(Y, ['\r'], X), !; Y = X), atom_chars(Line, Y).
267 : >>266 標準入力かファイルからの入力で、一行読むとき、 キャリッジリターンが行中に出てくるシチュ、 それからもし出てきたとしてそれを生かしておく意味、 というのが想像つかないので、解説よろしくお願いしますっ
268 : 個人的に意味のない良いケースだから!って言って、 内容を勝手に改変しちゃうような処理に一般的な名前を付けちゃうのはどうかと思いますっ! get_line_without_CRとでもしてはどうでしょうかっ
269 : >>268 ISO標準になっていないこのような定義は、どんなものを標準的なライブラリに 加えればよいか、まだ手探りの状態ですから、このような細かな点を議論する ことに意義があると思います。できるだけ、細部を反映するような述語名を 与えるべしとするのは卓見だと思います。
270 : なんかノリが変だ・・・ 本当に、何か見落としがあるなら教えて欲しかったし、 煽ったつもりはなかったんだけど 自分のコードは、>>73 で追加されたCR無視などを参考に、 書き方を変えただけのものなのだが、 ちゃんと 'end_of_file' を扱っていないとかアウトだ・・・ゴメン もし入出力として一般化したいなら、 一文字入力の時に改行コードがどうなるかの標準に照らして書く、 の一点だと思う。 が、標準がある項目についても沿っていない処理系も多いPrologなので、 現状、挙動にあわせて処理を書くしかないのでは? そうなると、単体CRを改行扱いした方がいい環境や、 単体LFを改行扱いしてはいけない環境もありそうだが
271 : >どんなものを標準的なライブラリに加えればよいか なんて議論の、末端にいる気持ちすらなかったし、 名前に拘りがある訳でももちろんなく、 get_line_without_CR は確かに実態に則した名前だと思うので、 そのような名前が必要な場合には各場で命名すればいいと思う。 ああ、必死だな、おれ めっちゃ恥ずかしい Prolog初心者スレって敷居高いな・・・ しばらくROMってます
272 : ROMってるとか言ってさっそくだけど、一文抜けてたので。 >現状、挙動にあわせて処理を書くしかないのでは? という段落の次に、 「だから俺自身は、実務上必要そうな実装の雛形の一提案をしたつもりでしかなかったので」 を挟んで、 >>どんなものを標準的なライブラリに加えればよいか >なんて議論の、末端にいる気持ちすらなかったし、 に続くつもり。 なんだか意味のない煽りにしか見えなかったのが、 言い訳がましく見えるようになる一文を加えさせていただいて、さようなら
273 : '\n'か'\r'か'\r\n'という問題は、環境にあまりに依存するから、現在のところ、改行は'\n'のみ、 '\r'は一応アルファベット扱いするしかないと思う。 なぜかというと、 ?- ・・・concat_atom([_行1,_行2,_行3],_区切り文字,_ファイル全体の文字列), というような処理は日常的に存在する。完全に復元するには、行に分解した際の 改行コードがなんであったかをファイルごとに出力モード引数で取得して 保存しておかなくてはならないが、これはあまりにも煩雑。 行の中に'\r'や'\n'を含めるのは実務的にさらに不可。ということになります。
274 : 単純な好奇心なんだが、prologでクイックソートってどう書くの?
275 : Wikipediaのプログラム例にあるよ
276 : wikipediaとかしばらく見てなかった・・・ ありがとう 見てくる
277 : haskellのリスト内包表記に相当する部分で複雑に見えてしまってますね・・・ (たぶん、リスト内包表記使わない方法だと同じくらいのコード量) prologにはリスト内包表記に相当するものは無いのでしょうか?
278 : findall使えばWikipediaのやつよりはHaskellっぽくなるかも(´・ω・`)こんな感じ quicksort([], []). quicksort([H|T], Sorted) :- findall(E, (member(E, T), E @> H), GTs), findall(E, (member(E, T), E @=< H), LEs), quicksort(GTs, GTs2), quicksort(LEs, LEs2), append(LEs2, [H|GTs2], Sorted).
279 : >>278 おお!! ありがとうございます アルゴリズムの読み易さは関数型言語と大差無いんじゃないかと言う予想は、当たってそうで安心しました (私にはまだまだprologの文法に馴染めてませんが)
280 : ええー、どう見たって関数型言語のほうがコードがシンプルじゃん…
281 : >>280 partitionで分解する所がPrologの値打ちなんでね。
282 : >>280 縦に長いか横に長いかの違いに見えるが。。。
283 : Prologの本領は http://nojiriko.asia/prolog/quicksort_nihongo.html のようなコードにあるので、関数型言語と比較するの適切ではない。
284 : >>283 なかなか面白いページだな http://nojiriko.asia/prolog/index.html
285 : このfor/3を実装するのに、結構試行錯誤したわ http://www.ifcomputer.com/IFProlog/Manuals/v4.1/reference/for/home_en.html Prologって全然直感的じゃないな
286 : >>285 これはC言語等の下劣な仕様に阿っているのが悪いのであって、 第二引数と第三引数を交換するだけで、 (分かりやすくするため 最終値 >= 初期値 のケースだけにする) for(_初期値_式,_最終値_式, _カウンタ) :- _初期値_式 > _最終値_式,!,fail. for(_初期値_式,_最終値_式, _カウンタ) :- _カウンタ is _初期値_式. for(_初期値_式,_最終値_式, _カウンタ) :- _初期値_式_2 is _初期値_式 + 1, for(_初期値_式_2,_最終値_式, _カウンタ). 当たり前のPrologの述語となる。強いてちょっと 気持ち悪いのは第一節の !,fail. くらい。
287 : >>285 直感的に書ける処理が手続き型とは根本的に違う、と考えたほうがいい むしろ手続き型で書き辛い処理が書きやすい言語って感じるよ俺は
288 : 一般にPrologでは foo(S,E,X) :- の形式をとり、 Sはカウンタ、X でそれを取り出す。 Eは限界値を示す。 これで数値カウンタループ述語を構成する。 for/3は repeat. repeat :- repeat. のrepeatパターンの述語。 member/2やappend/3もこのパターン。 どれも非決定性述語である。 member(A,[A|_]). member(A,[_|R]) :- member(A,R). append([],L,L). append([U|X],Y,[U|Z]) :- append(X,Y,Z). ?- append(_,_,_), ・・・ とするとrepeatと同じ機能となる。 (ただし繰り返しが多くなるとスタックオーバーフローが起きるかも知れない)
289 : >>288 すみません。一番最後から二行目 ?- append(_,_,_),・・ です。アンダースコアが飛んでしまった。
290 : ありがちなミス for(Lower,X,Upper) :- Lower = X ; for(Lower+1,X,Upper).
291 : >>287 そうですか。早くPrologの醍醐味が味わいたいっすね。 ちなみに俺のコードは、↓ % for(_初期値_式, _カウンタ, _最終値_式) for(A, A, A) :- !. for(A, A, _). for(A, R, E) :- (A < E -> B is A + 1 ; B is A - 1), for(B, R, E). やっていることは、>>286 と近いんだろうけど、 かなり趣が異なる感じ…。
292 : >>291 立派なコードだと思うけど。
293 : >>285-292 素朴な疑問だが、間に処理を入れられるように見えないんだが・・・ (そもそも、繰り返しはPrologも再帰が基本だと思うんだが・・・)
294 : >>293 ここでやってるforはCやJavaのforとは無関係で、Haskellの[from..to]みたいなもの。 処理は、 for(L,X,H), do(X,C). みたいに書いて、最後にfailさせるかメタ述語で全解生成する。 Haskellなら[ do x | x <- [from..to]]だね。
295 : >>294 そうなのか・・・ いまいちどういう結果が出るのか良くわからん・・・
296 : >>293 数値を順に生成するもの。 ?- for(1,N,3),write(a),N=3. aaa ?- for(1,N,3),write(a),fail. aaa false ?- for(1,N,3),M is N * 2,write(M),nl,N=3. 2 4 6 ?- for(1,N,3),M is N * 2,write(M),nl. 2 N = 1, M = 2; 4 N = 2, M = 4; 6 N = 3, M = 6; false % findall/3と併用。組合せや順列の処理の時しばしば使う。 ?- findall(N,for(1,N,10),L). L = [1,2,3,4,5,6,7,8,9,10]
297 : >>296 ふーむ・・・ 数列をただ生成してるだけだけど、Prologだといろんな使い方がある訳か・・・ Haskellだと数列リスト作って後から加工する形かな? for n m _ | m n == False = [] for n m s = n: for (s n) m s 使用例 *Main> mapM (print.(*2)) (for 1 (<=3) (1+)) 2 4 6 [(),(),()] 確かに、>>294 の言うとおり、リスト内包表記使う方が自然だね for n f m s fn = [fn x | x <- [n,(s n)..m], f m n == False] 使用例 *Main> for 1 (<=) 3 (1+) [1,2,3] prologの方が、手続き型のforに使い方が近くなるのか
298 : あう・・・ >for n f m s fn = [fn x | x <- [n,(s n)..m], f m n == False] の"fn"は無視して・・・
299 : >これはC言語等の下劣な仕様に阿っているのが悪いのであって は適切な書き込みでありませんでした。恐縮ですが、無いことにしてください。
300 : >>293 for/3の典型的な使い方。 findall/3 の中で使う。 ふたつ取り出す(_リスト,_一つ目,_二つ目) :- length(_リスト,_リストの長さ), findall(N,for(1,N,_リストの長さ),L), 順列(L,2,[M,N]), nth1(M,_リスト,_一つ目), nth1(N,_リスト,_二つ目). ?- ふたつ取り出す([赤,青,緑],_一つ目,_二つ目). _一つ目 = '赤', _二つ目 = '青'; _一つ目 = '赤', _二つ目 = '緑'; _一つ目 = '青', _二つ目 = '赤'; _一つ目 = '青', _二つ目 = '緑'; _一つ目 = '緑', _二つ目 = '赤'; _一つ目 = '緑', _二つ目 = '青'; false
301 : >>300 ご存知かもしれませんが、select/3を使うと、もっとシンプルに書けますよ。 choice2(L, E1, E2) :- select(E1, L, L1), select(E2, L1, _).
302 : >>285 for/3の用例集を追加しました。 http://nojiriko.asia/prolog/for_youreishuu.html
303 : ガウス行列の述語群は間違っているところがあって、 正しく実行されません。forの使い方の例として見るためのものとしてください。
304 : >>301 そうですね。nth1/3はほとんど使いませんね。
305 : >>284 素直に気合いの入ったページだと思ったけど、 その後すぐに「医者の不養生」という言葉が思い浮かんだw
306 : >>302 ページ内索引を設けるなどして、参照しやすく作られていると助かります。
307 : >>306 順不同の2300題のうち約300題を抜き取ったもので、どんな索引を 作るかなど、課題山積ですね。for/3述語から始まるループに名前が 付けられれば、索引は作りやすい。for/3は最も名前を与えにくい述語 ですが、これに限らず部分計算のかけらに適切な名前を与えることが 現在のそしてこれからのテーマです。
308 : 順不同ではなくて、何の順序付けもされていない2300題から約300題 前の方から抜き取っただけで・・・ ですね。
309 : >>307 ブログ形式にするのはいかがでしょうか? ブログのタグ機能を使えば、管理も参照もしやすくなるように思います。
310 : 仕上げのイメージは既にあって、 「英語活用大辞典」と「囲碁定石大辞典」という2つのタイプ、機能のミックスです。 1) ある述語の具体的な定義節を参照可能で 2) できるだけ多くの、出来れば公開(出版)された全てのProlog述語の定義節が網羅されて、 3) 一つのテーマ、課題をもとに詳細な変化譜を展開する 使う人がいるかどうか疑問ですが、私一代では仕上がりません。
311 : >>309 それぞれに読んだ人が部分部分にコメントをつけたり誤りを指摘したり できるから、おもしろい利用法かも知れませんね。# から始まる課題の コピーの他に要約を付けていけばいい。ただし、私は医者や紺屋ほど 専門家ではないけど、ブログって実は使ったことがない。作ったことも。
312 : 最近のは定石大事典かな。 以前は定石大辞典だった気がする。瀬越憲作名誉九段の監修。
313 : twitterへのPrologに関する日本語の書き込みがここのところ約一ヶ月 24時間で15~20ツイートを常に維持している。 4-5月ころは3~5平均だったから、相当の増加。外国語のツイートはさらに 爆発的で5倍どころではない。
314 : なんかあったの?
315 : >>314 8月から「7つの言語 7つの世界」の影響で2倍以上の書き込みになった。 外国の事情は、よく判らないけど、似たようなことが起こっているようだ。 9月後半からの急増は相乗効果ではないか。過去の遺物といった否定的な 先入観による書き込みはほとんどなくなり、面白いという書き込みが突然 増えた。
316 : 難しい。わからないも多いな。
317 : よく分からんが、関数型言語への注目が集まった波及効果によって、 宣言型言語の一つである論理型言語(Prolog)にも関心が増えたのではないかと推測 あとはCoqのような実用的な定理証明系が登場して一般人向けの情報が増えた (実用的といっても....だし、一般人といっても.....だけどね) その結果として「論理とプログラミングとの関係」について考える人が増えたのかも 物事を形式的にモデル化するには関数だけでは足りなくて、論理も必要になるから
318 : >>317 確かにそんなことをつぶやいてる人が結構いる。関数型への関心の波及効果と いうのも。対で語られることも多い。
319 : そこでCurryですよ
320 : 第五世代のころは世間的にはどんな扱いだったんだろう? 銀の弾丸みたいだったのかな
321 : >>320 過大評価されたし、バブル期でもあった。 Prologプログラマを派遣してもらうにはひとり120万/月とか。 ナレッジエンジニアの必須技術とされた。実はプログラマ数は あまり増えなかったが、一応メジャー言語の末席。bit誌などの 広告ではProlog処理系が他を圧倒していた。 企業がPrologを見限って、C++に移行して急速に衰退した。 PrologでやりかたったことをC++でできるというわけではなく、 AI技術発展のお裾分けにあずかるという目論見はその時点で 挫折。
322 : 民主党が与党から転落するシナリオのパターンをPrologを求めて
323 : swi-prologのインタプリタをコマンドプロンプト内で実行させることはできませんか?
324 : UNIXなら swipl でインタプリタが対話モードで起動するけど....
325 : >>324 すいません。今試したら、コマンドプロンプト上でswipl.exeが問題なく動作しました。 以前、あんなにはまったのは何だったのだろう…
326 : そういやちょっと前までplconだったよね 再インストールしたらswiplに変わってて焦った;;
327 : http://nojiriko.asia/prolog/findmax.html のmax/2の実装を見て、もっと簡潔に書けそうな気がしたのでチャレンジしてみました。 % max_list(_リスト, _リストの中の最大値). max_list([_唯一の要素], _唯一の要素) :- !. max_list([_先頭要素 | _残りのリスト], _最大値) :- max_list(_残りのリスト, _残りのリストの最大値), (_先頭要素 @> _残りのリストの最大値 -> _最大値 = _先頭要素 ; _最大値 = _残りのリストの最大値). accumulatorを使うか使わないかの違いしかないですね…
328 : ?- max_list([1, 30, X, 75], X). X = 75. ん?これでいいのか…?
329 : >>328 Prologの代入(単一化)とは、そういうものじゃないかと思われ
330 : >>327 要素位置番号も要求されているので一引数増えていますが、 http://nojiriko.asia/prolog/c152_883.html の方が普通の最大値述語に近いと思います。四通り作って見ました。
331 : あ、5通りでした。
332 : functor/3や=..は何かに使えそうだけど、使いどころがイマイチ分からない
333 : >>332 Lispのマクロ的な使い方や、Prologの項データを別の形式で出力する時などに便利そうですね〜 X is 2 + 3, Y is 6 + X * 3, write(6 + 5 * 3 = 6 + Y * 3). Prologはこのようにちょっとした計算でも、 ゴール間の値の橋渡しの為の変数を沢山使いますよね そこで、これを↓のようにゴール中に別のゴールを直接記述するマクロを=..で作ってみました func_style(write(6 + 5 * 3 = ^is(**, 6 + ^is(**, 2 + 3) * 3)), X), X. https://gist.github.com/1325544
334 : で、prologで何ができるの?
335 : >>334 できないものが何があるかだろう。百万回以上の繰り返しが当然の領域。 OS。数値解析。ビットマップ処理。大規模事務計算(トランザクションが1千万を超えるようなもの)。
336 : >>335 事務処理のバッチ処理でデータベースアクセス時間+Prologの演算時間として 後者にどれくらい許されるかということだろう。1時間だと2000万トランザクション 3時間だと5000万は超えるから、一部上場企業の95%以上クリアできると思うけど。
337 : ゲームとかも作れるの? prologからwin32apiとかdirectxとかで画像表示もできる?
338 : >>337 Visual Prolog という製品(昔BorlandのTurbo Prologといった)上で開発された ゲームというのは見たことがあるけど、激しく画面が動いていた記憶以外、ゲームには 関心がないからどういう種類のものかわからないし内容も覚えていない。 他の処理系もそれぞれグラフィックインターフェイスを謳っているようだけれど、 ゲームに適したものかどうかは知らない。
339 : 3D的な部分を計算する必要があるとすると、現在のProlog処理系では 時間がかかり過ぎて動かないはずだから、そういうことはしていないか、 別のからくりがあるのだと思う。
340 : prologで前向き推論は出来るの?
341 : >>340 累算器を使えば可能
342 : TIOBE INDEX NOVEMBER http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html Prologは急伸。10月は0.288 だったのが 0.353 23%上昇し、一気にHaskellを追い抜いた。
343 : >>342 6月は0.227くらいだったから、56%の上昇か。
344 : このぺースでいくと、一年位で本来の実力、0.45% 25-30位までは戻る。 そうはいかないけどねw
345 : >>344 2006年5月がPrologは0.384 で25位だから、上位に新言語や対象とする言語に 加えられた言語が入ってきたから順位が落ちたと読むことができる。 それと、Prologという語はプログラム言語以外に使われるケースが増えているから、 INDEX作成時にこれをどう除去するかで、全く数字が変わってきてしまう。 ここ数ヶ月はたしかにGoogleの検索数やtwitter数が急増しているが、 最終的にはその匙加減ということになる。
346 : >>345 元々、求人数なんかは減ってなかった。日本ではさっぱりだが。
347 : あっという間に12月。TIOBE INDEXはDecemberに更新された。 http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html Prologは 37 -> 33位とさらに続伸。 前月のシェア 0.353 -> 0.408 に、前年同月と比較すると195%の上昇。 COBOL,VB.NET,F#を抜き去った。来月はSchemeを抜くだろう。
348 : 1980年代は10位以内だから、それには遠く及ばないけど、 論理型の盟主ということで、パラダイムシフトの時期には 注目されるということだろう。関数型は分散するからね。 それにしても、近い将来のErlang,Prologの20位以内揃い踏みは 確実のようだね。
349 : >>347 0.403じゃないか?
350 : 今週から授業がPrologに入り、来週のテストまでに仕上げてくるようにと課題を渡され いろいろと考えてみてメソッドはこれで合っていると思うのですが、 肝心の再帰処理でのリストの作成がわからなくて詰まっています。 どなたか助けてもらえないでしょうか? //入力と出力 ?- nextItem( [146, 394, 882, 1730, 3082], N). N = 5106 /*メソッド 146, 394, 882, 1730, 3082 248, 488, 848, 1352 240, 360, 504 120, 144 24 隣り合う数字の差分を新しいリストに出力しつづける (248 = 394-146, 488= 882-394,...) リストの最後まで行ったら、終了 新しいリストで繰り返し同じ処理を行う リストの数列の長さが1になったら終了 今まで作成したリストの最後の数字をすべて足し算する。 N = 24 + 144 + 504 + 1352 + 3082 N = 5106 */メソッド
351 : 組み込み関数は使わずに作成せよとのことです。 数列の最後のナンバーの取り出し方や、計算部分はなんとかなったのですが 新しいリストを作成していく方法がどうにも。
352 : 組み込み関数禁止ってis/2やwrite/1も禁止なの? next_item_0([X], [], X) :- !. next_item_0([X1,X2|XS], [Y|YS], N) :- Y is X2 - X1, next_item_0([X2|XS], YS, N). next_item([], 0 ) :- !. next_item(XS, N1) :- write(XS), nl, next_item_0(XS, YS, N2), next_item(YS, N3), N1 is N2 + N3.
353 : Write/1とis/2はさすがに大丈夫です。 nextItem_0([X1,X2|XS], [Y|YS], N),の部分で差分を別のリストに入れていくんですね。 これは自力では無理でした。 これでテスト勉強に入れます、ありがとうございました。
354 : >>350 例えばということになるが、リストの要素が自然数かつ上限が決まって いるという場合は組込述語を全く使わず定義できるが。そうでないと、 is/2あるいはlength/2は必須。 問題文をできるだけ忠実に手続き的に解釈して述語を構成すると、 http://nojiriko.asia/prolog/prolog_350_1.html のようになるのではないか。
355 : >>352 next_item_0([X], [], X) :- !. next_item_0([X1,X2|XS], [Y|YS], N) :- ↑ここにカットが無いのは何か理由があるんでしょうか?
356 : そこにはカット対象が存在しないと思いますが・・・間違ってたらごめんなさい
357 : この問題、素直に書けば f [] = 0 f xs = last xs + f (diff xs) where diff [x] = [] diff (x1:x2:xs) = (x2-x1):diff xs こんな感じだろうけど、prologのコードだと全体が一様で問題の構造が みえずらいね。
358 : Haskellだっけそれ。whereいいなぁ〜
359 : >>357 ピラミッドリストを作らなくてもよいなら、 nextItem([N],N). nextItem(L,X) :- append(_,[Z],L), findall(Sub,( append(_,[N1,N2|_],L), Sub is N2 - N1), L1), nextItem(L1,Y), X is Z + Y.
360 : Prologが代表的な関数型言語に較べて若干冗長になるのはやむを得ない。その代わり、 findall(Sub,(append(_,[N1,N2|_],L),Sub is N2 - N1),L1), のようなコードで楽しめる。
361 : そのコードのどこが楽しいか教えてくれ
362 : >>361 N1,N2が対になって左から右に移動する。そういう視覚的なところ。
363 : 冗長なのはいいけど、わかりにくいのは何とかしたいな。 人にもよると思うけど、>357と>359を比べると個人的には>357の方が 頭のスタック使用量が少なくて理解しゃすい。
364 : >>363 findall/3は事実上SQLのselectだからそういうコードに慣れている人には 全然分かりにくくない。>>362 とは違った見解を述べると、変数の束縛とその解放と いうPrologの特長がfindallという枠組みのなかで明示的なバックトラックなしに 巧みに現れているという点で面白いと思う。 もうちょっと専門的にいうと、member/2ではできないことがappend/3で実現できている というところが味噌なんだけれど。
365 : ____ ━┓ / \ ┏┛ / \ ,_\. ・ / (●)゛ (●) \ | ∪ (__人__) | / ∩ノ ⊃ / ( \ / _ノ | | .\ “ /__| | \ /___ /
366 : うん、どうみても>359の方がわかりやすいな。 findAllも使ってるし。
367 : 普通findallを使ってリスト処理するときにはmember/2を使って findall(N,(member(M,[1,2,3]),N is M + 1),L), のようなリスト要素の取り出し方をするのだけれど、>>359 のように 2要素ずつ取り出す場合にはmember/2では不可能でappend/3だと うまくいく。一般に ?- member(A,L). と ?- append(_,[A|_],L). は同義と思われているが、appendの方がスーパーで あることを如実に示す例ということ。
368 : findallによるリスト処理がよくわからん # written in ruby list = [1,2,3,4,5] newlist = list.map{|e| e += 1} // written in java int[] list = new int[]{1,2,3,4,5}; int [] newlist = new int[list.length]; for(int i = 0; i < list.length; i++) newlist[i] = list[i] + 1; をfindallで書くとどうなるの?
369 : >>368 like368(List,NewList) :- findall(N2,(member(N1,List),N2 is N1 + 1),NewList). ?- like368([1,2,3,4,5],X). X = [2,3,4,5,6] findall/3は第二引数が偽になるまで第二引数全体をcallする。一回真になる度に 第一引数に指定された項をリストに積んでいく。第二引数が最終的に偽になったら リストの収集を必ず成功裏に了える。積み終わったリストは第三引数と単一化される。
370 : >>369 おお、すごいなあ.... findall/3にはこんな使い方があるんだね 勉強になったよ % >>368 とは別人desu
371 : >>369 ありがとうございます memberとfindallの挙動とにらめっこしてたらだんだん分かってきました ちなみにこれはリストの処理方法として一般的なコーディングですか? 大学の演習では習わなかった、というかrubyのArray#mapすらやり方が分からなくて困惑してました(笑
372 : >>371 最近はこの記法を使うことが多くなりました。万能ではありませんが、 この方が宣言的に読むことができる場合が多い。 >>357 が指摘されているように、再帰的な定義が読みやすい宣言的な 定義であるとは限らないのです。 注意するべき事は、第二引数に来るSubgoalが非決定的な述語で あるという点です。述語を定義するときに決定的に定義するか、 それともできる限り非決定的に定義を作って置くかいうことに成ります。 Prologの良さを引き出すためには、非決定的な定義をするスキルを 上げて、積極的にそのような定義をしていく方がいいようです。
373 : member/2を外してfindallの第二引数を定義し直してみましょう。 like368(List,NewList) :- findall(N,add_1(List,N),NewList). add_1([N1|_],N) :- N is N1 + 1. add_1([_|R],N) :- add_1(R,N). しかし、こうなるとlike368の再帰による定義は like368([],[]). like368([N1|R1],[N2|R2]) :- N2 is N1 + 1, like368(R1,R2). ですから、何をやってるのかわからない、ということにもなる。 つまり、何故findallによる定義を使うかですが、 memberやappendといった既存の高名な非決定性の再帰述語!!を 使ってadd_1のような定義を省略します。こうすることによって再帰定義の 繰り返しをひとつ回避してほんの僅かですが宣言性を高めようと しているのです。
374 : >>373 そうではないと思う。add_1/2が非決定性の述語と定義されているから あるいは、定義することに決めたから、findall/3が必然になったのだ。 データ構造の設計で、リストからリストへと展開することを基本とする なら、再帰述語中心の定義になるだろうし、 Prologの基本はデータベース述語(単位節)であって本質的に非決定性で あることは避けられないという立場からの設計なら、集約述語である findall/3の使用は必須のものとなる。 宣言性の強弱は確かにあるが些細な差であって、より重要なことはこの ような設計上の差異である。
375 : prologは非決定性を持つといえるのか? 非決定性というが、prologの場合、結果は順序まで含めて決定的。 この点ではSQLはまだ非決定性を持つが、結果を集合として考えるならやはり 決定的かな。 それと、単位節は要するに表でRDBと同じ。 その意味では、prologをprologたらしめているのは、単位節以外にあるといえる。
376 : 例えばAとBとCという概念があって,これら単体ではPrologの本質とは言えないが, これらの概念の組み合わせ方が本質だったりする場合があるので, そういう場合は、AやBやCという概念を持ついろんなモノをまとめて表にしていくとぼんやりと見えてくる. メンデレーエフが周期表を発見したときのように.
377 : >>375 Prologは非決定性モデルを、仕様の表に出さない決定的プロセスによって実装している この立場に立つ人は、Prologでは、解の出現順序が決定的でなければ困るような問題を扱ってはならない これの一番の利点はモデルを考えるとき(つまり論文を書くとき)に解を普通の集合として取り扱えること 逆に言うと、Prologの実装の決定性に依存するような問題を考えるときにはPrologの利点はなくなり、かえって実装が複雑になる (もちろん、どんな問題であれ、解を効率的に見つけるというアルゴリズムを考えるときにはPrologの決定的な側面を厳密に考慮しなくてはならない)
378 : prologの言語仕様は、解の出現順序を決定的に定義してたと思う。 ISOの規格文書が見つからないので引用できないけど。
379 : ISOのWebサイトは見づらすぎるね こちとらAdobe Readerなんてはいってないんだよ
380 : ごめん入出力はISOなのに脳みそはJISと認識してたわ
381 : >>375 Prologの単位節はもうこれ以上、書き換えることのない、どん詰まりの情報だ。 中島秀之氏はこれをプリミティブなものと表現したが。 RDBは列ごとに集合を表すが、Prologの単位節の引数にそういった意味合いは まったくない。あくまでRDBに模して(RDBとの親和性といった)、引数部分に情報 を配置することが可能というだけ。 Prologのプログラムとはこのどん詰まりに導くためにルールが書かれていると 解釈できるのであって、どちらがPrologの根幹かなどと問うこと自体無意味だ。
382 : RDBの正規化もどん詰まりの情報では? 意味合いを持たせる持たせないの話なら使い手次第では?
383 : >>382 RDBの正規化とProlog項記述の関係については「考えたこともない」状態なので 俄にはまともな返信ができません。
384 : >>381 どちらにというとそうだけど、帰納論理プログラミングなんかは、 明らかに具体的な情報を基礎にルールを見つけて組み立てるという 方向のアプローチですね。そういう方向性のようなものは個々の Prologプログラマの中にもあるということではないか。Prologを 証明器として捉える人は、ルール重視になるだろうし。
385 : prologをデータベース代わりに使う人は 単位節を主として、ルールを副と考えるよね。 このスレには昔から「prologの根幹は単位節」と唱える人がいるみたいだし。 それはprologの、ではなくデータベースの根幹だといつも思う。
386 : >>385 ルールだけでは成立しない一方、単位節だけでPrologプログラムが 成立してしまうということも言えるのではないか。
387 : >>386 ルールだけでは成立しないは言い過ぎか。なんて言えばいいのかな。
388 : >>386 ルールだけでは成立しないは言い過ぎか。なんて言えばいいのかな。
389 : 内包と外延が近い表記法でバランスよくプログラムに記述できる ところがPrologの大きな魅力だ、というくらいでいいんじゃないか。
390 : よく分からない。 ボディがtrueのルールがファクトなのでしょう? ルールはファクトを包含しているのでしょう? なら節は全てルールだけと言えるでしょう? 仮にファクトだけで成立するならそれは命題論理であって、一階述語論理ではない、つまりPrologではない。
391 : >>390 それだと、 先祖関係にはルールがあって、なぜ、親子関係には ルール(本体)がないの?という問に答えられないよ。
392 : >>375 棄て去った解候補の順序が決まっているかどうかなんて関係あるかな。
393 : Prolog Cafe 1.2.5で | ?- frend(taro,hanako). {EXISTENCE ERROR: procedure frend/2 does not exist} | ?- などといわれます。このエラーは何ですか?
394 : >>393 節データベースにfriend/2が存在しないという意味。 assert(frend(taro,hanako)). と入力すれば節データベースに追加される。 確認するには、 listing. と入力する。 assertせずにソースファイルから節データベースに読み込む場合は、 ['hogehoge.pl']. と入力する。
395 : >>393 friend(taro,hanako). と定義されているのではありませんか?
396 : データが基礎であり、則ちデータベースが基礎である。 そのデータベースを最も自然体で保持できるプログラム言語は Prologである。これだけで十分で、特に単位節がPrologの基本 などと云う必要もない。
397 : Prologは関係データベースと演繹データベースの派生として解釈できる しかし、Prologはデータベースが基礎であるというのは言い過ぎ 理由は、永続的に記録できるデータはソースファイルに書いた分だけで、稼働中に追加されたデータはただちに消えるか、Prologの仕様にない方法で記録するしかないから Prologをデータベースというのなら、C言語もデータベースということになる C言語の方はさらに表現能力が高い演繹データベースということになる
398 : >>397 Prologをオンメモリデータベースシステムとして捉えたら欠点だらけと いうことになる。ここでも指摘されているが、assertzが無闇と遅く、 初期状態の回復に時間がかかる。節順序を指定してのUPDATEが できない、等。しかし、現実にはそれを補強しながら使われている。 Prologのデータベースや単位節を強調した話題は、全部態度表明。 オブジェクト指向の初期に差分プログラミングが強調されたようなレベル。
399 : >>397 Prologデータベースについては、単一レベル記憶的なイメージの 実現を夢見るのが一番ハッピーなのではないか。あまり永続性に 拘るのもいかがなものか。その昔、コアメモリなんてものもあった。
400 : 停電したらどうしようという話でしょ。
401 : なんか話がループしてるような気がする。 暇なひとはマインドマップでも書いて見ると良い。 もちえん枝葉にはそれぞれ議論があるだろからきれいな図にはならず、 きっと面倒だろう。
402 : >>400 データベースとして使う時はPrologサーバーとして使うから、 トランザクションの度に子プロセスを生成して、そこにコピーが できるわけだから、保存ファイルにlistingするのではないかな。
403 : Prologをデータベースとしてとらえたときに、特に優れている点は、複数の関係のJoinしたときのパターンマッチングの速度の速さ 特に劣っている点がデータの更新と永続性
404 : 節の定義順を維持しようとすると、全ての節を一度retractしなくては ならない。ここらあたりの基本動作は改変しないと本格的なデータベースには 使えない。 最低限、節の定義位置の相対番号によりretract/assert指定は可能にする 必要がある。
405 : それから、永続性の問題の方は、オンメモリデータベース共通の問題だが、 停止したあとの再現が確実に行われる必要がある。現在はこれに使用する ユーティリティの作成から全てをエンドユーザ任せの水準だが、Prolog処理系が 安全で安定した動作/環境を保証する必要がある。
406 : >>403 Joinってそんなに速かったっけ? Oracleとかと比べたデータあります?
407 : >>406 正確には、演繹データベースの中ではPrologはボディ部のマッチングが特に速く、適切なホーン説が存在すればあればJoinが関係データベースよりも速くなる r(X,Y) and s(Y,Z) and t(Z) という結合を考えるとき、Oracleみたいな関係データベースは、rとsとtの全タプルの全組み合わせを生成する 一方Prologでは、例えば s(Y, "test") :- s(Y,Z),t(Z) みたいなホーン節があれば前述の結合は、rとsだけの結合の組み合わせさえ生成すればよくなる Prologは演繹データベースの中でも本体部分のマッチングがかなり高速なので、適当なホーン説があれば関係データベースを含む他のデータベースのjoinよりもPrologのjoinは速い Prologをデータベースとして利用するときには、データを定期的に走査して、データマイニング技術により、テーブル間の自然結合を高速にするホーン説をストックしている (逆にいうと、データを頻繁に更新するときにはこの利点はまったくなくなる)
408 : どこで無限ループおきてるかわからないときの デバック方法みたいなものはないのでしょうか
409 : >>408 http://www.swi-prolog.org/gtrace.html SWI-Prologなら gtrace, test_chat. とかやるとステップ実行したり変数束縛やらコールスタックを確認できる。
410 : LiLFeSの話題もここでいいの?
411 : >>410 勿論、歓迎だけど、わかる人いるかなぁ。
412 : >>411 レスが付かない場合は、twitterにここのスレへのリンクを貼ればいいんだよ。 #レス番号付きで。2ch嫌いでなければ結構答えてくれる。
413 : プログラムを中断して、その状態を保存しておいて、後で再開するにはどうすればいいのでしょうか?
414 : >>413 どう答えて良いか困惑するけれど、多分「そういうことはできない」というのが解だと思う。 この言語をそういうレベルで使ってはいけないし、サポートする組込述語もない。
415 : PrologってSchemeの list? みたいなリスト判定ってないのかしら? 入れ子になってるリストを1つのリストにまとめるのが出来なくて困ってる matome([a, b, [c, [d, e], f], g], X). X = [a, b, c, d, e, f, g] みたいなのを作りたくてappendいじくり回してるけど出来ない…
416 : >>415 パターンマッチで分岐すればいいだろ。
417 : >>415 list/1は組込述語になっている処理系が多いと思いますが定義するなら list([]) :- !. list([_|_]).
418 : >>415 まちがえました。 list(L) :- \+(var(L)),L=[]. list(L) :- \+(var(L)),L=[_|_]. でした。
419 : >>415 list/1の定義ができていれば、 平坦化([],[]). 平坦化([L|R1],L2) :- list(L), 平坦化(L,L1), append(L1,R2,L2), 平坦化(R1,R2). 平坦化([A|R1],[A|R2]) :- \+(list(A)), 平坦化(R1,R2).
420 : >>417 は意図して間違えたわけではなく、本当に間違えたのですが、 >>417 >>418 のような間違いと訂正が「残る」記述であるべきですね。 その点2chのような掲示板は大変よろしい。 書き換えられ、完成されたものには魅力がありません。
421 : >>415 ↓のflattenが参考になる http://www.geocities.jp/m_hiroi/prolog/prolog03.html
422 : 尾崎隆大ってこの世界では有名なの?
423 : >>422 本人ですが、全然有名ではないですよ。 少しPrologに貢献した時期もあったかも 知れませんが、それは1990年より前ですから。
424 : 本人だと・・・ 雷電どういうことだ!?
425 : ぬぅ ま・・・まさか まさかこの目で見ようとは
426 : 知っているのか雷電!
427 : うむ
428 : つか本人が降臨しているとはな…ついったでお世話になってますお
429 : prologは再帰を積極的に用いてループを実現していますが。 趣向の域を出ない感じがします。 再帰でなければいけない論拠ってありますか?
430 : >>429 「Prologは」というところを「論理式では」と置き換えて読み直されることを 勧めます。
431 : >>429 http://www.amazon.co.jp/dp/B000JA2VJO 「プログラムの理論」 Zohar Manna著 五十嵐滋訳 を読んでみたら、 としかいえない。
432 : Prologに限って云えば>>430 が正解のような気もするが。 元々、プログラムが停止する(解を持つ)ことを証すための形式として、 再帰が選択されている。 多分>>429 はチューリングマシンの計算表を基礎だとして、再帰はループに 変換できるのだから、再帰に終止するPrologは趣向ではないかとしたのだ と思うが、正しいプログラムを書く一つの戦略として、再帰が選ばれている、 可能な限り再帰で書かせようとするプログラム言語が存在していると考えれば いいのだろうと思う。
433 : >再帰はループに変換できる その上で何故趣向と思ったかの一つは。 同じ処理をさせるにしてもは再帰はループよりかなり効率が悪い。 再帰中はローカル変数が解放されないのでメモリの資源効率が悪い。 それにともなって実行効率も落ちます。
434 : 再帰をループに自動変換し中間言語を生成するようなアルゴリズムでも あれば凄いと思うのですが、僕の知っているprologにはそんなものは無いようです。
435 : >>433 これはPrologだけに通用する話ですが、 単一化、バックトラックといった法外にコストのかかる処理を 絶対的な基本としていて、再帰とループの効率の差など、 最初から度外視している系です。
436 : 末尾再帰をループに変換する処理系ならあるでしょ
437 : Prologだから論理プログラミングしなきゃいけないなんて誰が決めたんですか…! あなたがかきたいようにかけばいいじゃないですかぁ…!
438 : >>437 Prologは副目標、節の選択は出現順に逐次的に処理されることになっています。 このことを利用して、多くの利用者がPrologの手続き的解釈という立場に立ってこの言語を 利用しています。 ?- repeat,read(X),write(X),X=end_of_file. というような記述は一見極めて手続き的ですが、repeatの定義 repeat. repeat :- repeat. に再帰が「隠されて」います。論理式というモデルに対して何も付け加えたり変更したりして いないPrologですから、再帰から逃れることはできませんが、隠すことはできるのです。 再帰的定義が連なっている定義は決して読みやすいとは言いがたいことが多く、この読みにくさ から逃れるために情報の生成器(上の場合生成情報なしのrepeat)に再帰処理を押し込んで、 その後を手続き的に処理するという手法はごく普通のものです。
439 : とりあえず末尾再帰最適化とか、 proper tail callとか勉強してくれ。> 再帰くん
440 : >>397 「Prologの仕様にない方法で記録するしかないから」 とあるけど、これはどういう意味なのだろうか。
441 : Prologの仕様のひとつにISO規格があるけれど、 あまり逸脱しないための枠組みくらいの意味しか ない。そのくらい無視されている。
442 : ISO規格の日本語訳が必要だね。それへのリンクをWikipediaの 冒頭付近に持ってくる。
443 : 正式にPrologと名乗っていいかどうかを承認する機関とかあればいいけど そこまでしてイソイソする需要もないんだし どうしてもイソにこだわるならSWI-Prologとかならドキュンメントにイソってる述語かどうかかいてあるから イソい述語だけ使うようにすればいいんじゃないかな
444 : イソい述語が貧弱すぎるのもダメなんじゃないかな。 最小限のイソの上にPure 100% Prologな述語を作りこんでいくって言う発想は どうしても性能的に問題がでてくるでゲソ? だからイソ述語を沢山定義していったほうがいいと思うの。 Level 1, 2, 3とか段階に分けてもいいかもしれんけどね。 レベルが高いほど高機能で低いほどよりプリミティブな述語なの。
445 : >>443 少なくとも日本ではSWI-Prologが標準に近い地位にあるから、 日本語訳するとしたら、こちらの方だろうな。
446 : そういえば、SWI-Prologのdoc_serverだっけ? pldoc形式かなんかで書いたドキュメント文の末尾にピリオドが自動で付与されるから、 出力が「こんにちは。.」みたいな不恰好になっちゃうよね。
447 : もしかしてイカ娘さんの登場かな?
448 : 初心者です。 Prologのソースファイルに do :- ... do. のような記述がよくあるんですが、これってdoのbodyをdoでくるまずそのまま書いちゃだめなんでしょうか?
449 : >>448 具体的なコードをコピペしてもらえると、期待する答えがもらえやすいと思う とりあえず可能性を推測してみる ・1行目のbody部では(たとえばバックトラックを応用した)手続き型の処理が書かれていて、 必ず否定で処理が終わる でも、処理全体としては肯定で終了させたいから、2行目に必ず真となる述語が置かれている ・述語doに引数があり、複数のbody付き定義でcase文に相当する多分岐処理を記述している そして、最後のbody無しdoは(case文における)空のdefault節を表現している
450 : >>449 http://hlab.ta.chiba-u.jp/article.php?story=20090206114807903 このコードです。まったくの初心者なので支離滅裂なことを言っているかもしれませんが、 ・initCells :- hogehoge.のあとinitCells.と書いているのでgoの中でinitCellsを改めて呼び出す必要はないのでは? ・initCellsは常に否定で終わるのに、goの中の以降の処理が実行されているのはなぜ? というのが疑問です。
451 : >>450 まず最初に、コードの解説から これは>>449 で書いた最初のケースの具体例で、手続き的な2重ループ処理だね 述語between/3はバックトラックで再呼び出しされるたびに別の解を返すから、 その between(1, MX, I), between(1, MY, J), ...., fail. という部分は、 以下のCコードの処理と似ている for (i = 1; i <= mx; i++) { for (j = 1; j <= my; j++) .... } バックトラックは、initCells :- ... の最後のfail呼び出しを契機に発生し、 between x2が返す全ての解を探索し終えると(=二重ループ処理を抜けると)否定を返す でも、(>>450 で書いたように)initCells全体の処理は肯定で終わらせたいから、 最後にbody部が空な(=常に真を返す) initCells. が置かれてる Prologでしばしば見かける手続き的なコーディング技法だね(自分は好まないけど....) 次に、質問について答えよう >・initCells :- hogehoge.のあとinitCells.と書いているので > goの中でinitCellsを改めて呼び出す必要はないのでは? initCells定義のbody内でinitCellsが(再帰的に)呼ばれているのは、ループ処理を実現するため だから、そのループを開始するきっかけとしてgoからinitCellsの呼び出しが必要になる >・initCellsは常に否定で終わるのに、goの中の以降の処理が実行されているのはなぜ? 最後に置かれた(body部が空の)initCells定義が、常に肯定(真)を返すから
452 : >>450 以下のPrologプログラミング解説ページ内にある、 「繰り返し - 失敗駆動ループ」という節が参考になると思う ・M.Hiroi's Home Page / Prolog Programming http://www.geocities.jp/m_hiroi/prolog/prolog03.html#chap14
453 : >>451 理解できました。initCells.を対話シェルでの質問と同じように捉えていました。 あくまで引数なし体部なしの述語定義なんですね。
454 : >>440 Prologプログラマが自分で勝手に作った構文でパーサやデコーダを作ってデータをテキストやバイナリに変換してファイルに書き込む という意味
455 : >>454 現在のProlog処理系環境では、 listing と consult が最速。 clause や assert を使って 自前で処理すると遅くなる。 get_heap_vector 的な述語があるなら、 そういう可能性もあるだろうけれど。
456 : Prolog で、例えば eq という同値関係を記述するのに eq(X, X). eq(X, Y) :- eq(Y, X). eq(X, Z) :- eq(X, Y), eq(Y, Z). としたのですが、この関係を満たさない質問を Prolog に与えると無限ループに陥ります。 例えば ?- eq(a,a). yes ですが ?- eq(a,b). (無限ループ) となってしまいます。
457 : >>456 これは左再帰と呼ばれる問題です。 Prologが自然言語解析に向いていると期待されて、 集中して研究された始めた時にいきなりこの問題で躓きました。 p :- p, ... という定義をすると無限ループに陥ります。一番左(実効として) に pがくる再帰が不可ということになります。 >>456 の例ですと、第二節の本体からの呼び出し :- e(Y,X). で :- e(b,a). は 第一節 e(X,X). と適合せず、第二節 e(X,Y) :- e(Y,X). が適合して e(b,a) :- e(a,b). となり、 :- e(a,b). を呼び出すことになり、 最初の質問に戻ってこれを繰り返すことになります。 結論としてPrologで第二節、第三節で意図された定義は不可能です。
458 : 解決方法 1. eqを述語でなく関数とする 2. XSBのような導出節をテーブル化してくれる処理系を使う 3. マジックセット変形する
459 : おはようございます いま一筆書きゲームがブームですが Prologで一筆書きを解けますか? ただし上記ゲームには、一部の経路に ・一方通行 ・必ず2回通る経路 があり ・ワープ1つ(一方の点に入ったら他方の点に強制ワープ。何度も使える。) があります
460 : 要はそういうプログラムを書けってことね
461 : 学校の宿題は自分で考えたほうが本人の為になると思うな
462 : Prologで表現できるかできないかを聞きたいだけ できるなら自分で作るし できないなら他を当たる
463 : できない場合はできない理由を添えて提出する、までが宿題です
464 : >>462 >Prologで表現できるかできないかを聞きたいだけ 一言で言えば、「できる」 もし本気で知りたいと願うのなら、"一筆書き Prolog" でグクるくらいのことはやってみろ その上で、Prologのプログラミング技法に疑問があれば、このスレで問えばいい もしPrologにおける全解探索の一般的な表現(プログラミング)を知りたければ、 たとえば以下のサイトが参考になる(特に、パズル解きに興味があるヤシには最適) ・お気楽 Prolog プログラミング入門 http://www.geocities.jp/m_hiroi/prolog/
465 : 計算量はどうでもいいならできるだろ。 AとBがワープ関係のとき、A→B→Aのような無意味なループを発生させる経路を省けば、経路は有限だからな。総当りでいける。
466 : チューリング完全
467 : >>462 私は昨日早速その問題をやってみようと思って始めたのですが、 ワープの意味がよく分からず止めました。多分、検索すれば わかりやすい説明が見つかるのだろうけれど。 Prologにできるか、できないか、ということになると、できる。 できるどころか、何をやってるいるかを明確に示しているか という観点で評価するなら、全てのプログラム言語の中で、 最上のコードが書けるだろう。
468 : おはようございます。 ワープを図で説明してみます。一筆書きの一部を切り出した図: C… D… │ │ A─ワープX===ワープY─F… │ │ B… E… ・ABCのいずれかからワープXに入ると、強制的にワープYに移動させられる。 次の手ではDEFのいずれかに移動する。 逆に、 ・DEFのいずれかからワープYに入ると、強制的にワープXに移動させられる。 次の手ではABCのいずれかに移動する。 >>465 が言うようにワープX→ワープY→ワープXのようにループすることはない、です。 >>464 のサイトは既に見てました。パズルに興味があるので確かにおもしろそう。
469 : ワープは一方通行を使って表現できる
470 : >>468 すみません。この問題のこと忘れていました。 もっとも基本形からスタートさせてください。 % % 一方通行のみ % ワープなし % 筆のみち(b,c). 筆のみち(a,b). 筆のみち(d,c). 筆のみち(c,a). 筆のみち(a,d). 一筆書き(_起点,_順路) :- findall([A,B],( 筆のみち(A,B)), L), 一筆書き(_起点,L,[],_順路). 一筆書き(_節,[],_,[_節]). 一筆書き(_節,L1,L2,[_節|R3]) :- append(L0,[[_節,_隣]|R2],L1), \+(member([_節,_隣],L2)), append(L0,R2,L3), 一筆書き(_隣,L3,[[_節,_隣]|L2],R3).
471 : % % 一方通行のみ % 一回通行のみ % ワープなし % でした。
472 : 多分この問題、双方向なのにどちらかの方向一回しか利用できない、 ということの定義の仕方が難しいのでしょうね。 節に入っているみちの中で、一方通行がひとつだけ。このひとつがワープかな。 ワープを宣言して、他の一方通行の定義を排除したいですね。ということは、 筆のみちを定義する部分から、プログラムとした方がよさそうです。
473 : >>472 節に入っているみちの中で、一方通行がひとつだけ。このひとつがワープかな。 この部分違いました。 ワープはその他に複数回の使用が可能という規則があります。 一回使用のみは[_], 二回使用可は [_,_], で表すとしたら、この無限大に近いワープは どう表現しましょうか。変数のままにしておきましょうか。 途中既に使用したみちであるかどうか \+(member([_節,_隣],L1)), で検査していますが、 ここで使用可能数を示すリストの要素をひとつ削ることになりそうです。
474 : >>473 また間違えた。 \+(member([_節,_隣],L2)), でしたね。
475 : PPAI勉強してます.11.1にあるコード片なんだけど, s(Stacks,[Stack1,[Top1| Stack2]| OtherStacks]):- del([Top1|Stack1],Stacks,Stacks1), del(Stack2,Stacks1,OtherStacks). del(X,[X|L],L). del(X,[Y|L],[Y|L1]):- del(X,L,L1). これでs([[a,b,c],[],[]],S).って質問しても S=[[b,c],[a],[]]; S=[[b,c],[a],[]]; false. ってなる. 本にのってるようなState Spaceにならないのは何故なんでしょうか
476 : prologで変数名や術語名にL0とかfoo0とか数値を末尾に付けるのはどういう規則でつけてるんでしょう?
477 : >>476 一般には出現順に1,2,... ,n と振って行きますね。結果として第一引数が1とか。 でもここが大事というところには振らないこともある。 append(L1,L2,L3,L). は append(L1,L2,L3,L4). でも一向に構わないのだけれど、 Lに注目させようと、パターンから外す。 ?- append(L0,[A|R1],[1,2,3]). が何故L0かというと、 ?- member(A,[1,2,3]). の変形と考えているから。第一引数というより番外(0)だよと。 本当のことを言うと、このインデックス状の名付けはPrologの痛い所。 こんなことをしなくて済んで欲しいのにという意味で。Prologは数字が嫌いですから。
478 : とにかく遅い,原理的に遅くならざるをえない,に限る.ぷろろのけってんは
479 : >>478 遅いと云っても、たかだか数百倍だよ。
480 : >>479 p :- q1,q2. q1. q2. のような引数のない述語だったら、インタプリタでも全然遅くない。 まして、コンパイラなら。
481 : >>478 パターンマッチだけに注目するなら、他の言語よりも圧倒的に速い 例えば、ルールベースの条件文のマッチングとか
482 : Prologでは述語の引数に複合項はあまり使われないのでしょうか? 述語の引数の数(アリティ)が多い場合に可読性が劇落ちするので、 display(person(name(NAME), age(AGE))) :- write(NAME), write('¥t'), write(AGE), nl. のような述語が有れば、 display(person(name('Taro Yamamoto'), age(100))). となってとっても読み易いと思うのですが。
483 : >>482 そうですね。私などは徹して、引数はアトム、変数で構造体はリストだけを許しています。 これは私の流儀であり、すべてのプログラマがそうであったり、何か規則でそうなって いるわけでもありません。わかりやすく、かつ、安全なプログラミングのためには、それが 鉄則と思っているだけです。OSのように、情報源と消費地が離れていて、しかも、停止し ないプログラミングでは持ち回る引数が多くなりすぎるということは確かにあります。 かってのPrologマシンでオブジェクト指向を採用し、Objectというような名前の変数を 持ち回ったりしたのも、変数の数を減らしたいという理由も少しはあったと思います。
484 : それで、引数が10個以上にもなってしまう時はどうしているの?という話になるわけですが、 率直にいって、諦めるというのが答えですね。そういうクラスの述語をできるだけ書かなくて よいように設計する、としかいいようがありません。
485 : > 引数はアトム、変数で構造体はリストだけを許しています。 > (中略) > わかりやすく、かつ、安全なプログラミングのためには、それが鉄則と思っているだけです。 これはどういう理由なんでしょう? リスト以外の構造体を使うと「わかりにくい」「危険」なのでしょうか?
486 : >>485 この述語が正しく記述できたかは、それを読んでいる副目標の構造と、 述語の頭部を比較するのですが、その時に一瞥で正しさを判断する ためには、スカラ型データが有利だということが一番大きいと思います。 引数に複合項があり、その中に変数が含まれる場合の判断は遅くなるし 難しくなります。関数名が助けになるのではないかとの質問でしたが、 関数名を適切に与えることは結構難しく、部分構造の後からの変更は 更に難しくなります。Prologが関数型言語と比較して優位なのはこの ような関数の型評価をほとんど行わなわない、単純なユニフィケーション に終始できる可能性にあると思っています。
487 : >>486 「それを読んでいる副目標」は「それを呼んでいる副目標」の間違いです。
488 : >>486 引数に複合項を避ける理由は、やはりPrologの定義節をRDBと見做しているか、 そうありたいと思っているから。これが大きい。
489 : 単にパターンパッチングとの相性が悪いからだとも思える。
490 : >>489 フレームのような大きな構造の一部だけ変更してそれを次の引数として 渡すというような処理は苦手です。 破壊代入されませんから、構造の再構成が必須となります。
491 : しかし木構造をフラットに述語表現すると 親子のリンク関係を表すために人工的な識別子を導入する必要がある。 このように表現されたデータ構造は、もはや木構造であることが構文的に 保証されない。Cでポインタを用いる場合と同じような危険性が伴う。 複数の木を扱う場合には識別子の管理も面倒である。
492 : >>488 WANの都合ではなかろうか
493 : WAM
494 : つうか複合節はホーン節でないし。
495 : SWI-Prolog Editer を使うために32bit版のSWI-Prologをインストールしたんですが、 拡張子の関連づけをEditerのほうに変更するべきなようです。 アイコンが無関連の表示になっていたんですが、変更用のソフトを使ってみると、関連付けが食い違っていました。
496 : ___ ━┓ ___ ━┓ / ― \ ┏┛/ ―\ ┏┛ / (●) \ヽ ・. /ノ (●)\ ・ / (⌒ (●) /. | (●) ⌒)\ ____ /  ̄ヽ__) / | (__ノ ̄ | . / -- 丶、 /´ ___/ \ / . / ノ ●) ヽ┏┓ | \ \ _ノ .| (●, ,⊃ ノ ┏┛ | | /´ `\ .ゝ、 `´ .へ ・
497 : >>482 リスト以外の複合項で引数の受け手側が待ち受けるということはしませんね。一般的には そちらの方が可読性が極端に悪くなります。 再帰の場合は、受取側の引数の並びと引き渡し側の引数の並びを一瞥して比較するという ことがPrologプログラミングの仕事ですから、構造体があったのでは堪りません。 できれば、リストも避けたい。再帰さへできることなら回避したい。不要な繰り返しを 排除し、平坦に、平明さを追求するのがPrologではないでしょうか。
498 : 可読性というのは読み手に依存する性質であるから、 特別な事情がなければ一般的な読み手が慣れ親しんでいる 書き方をした方が読みやすくなるといえる。 そして読み手の多くは、構造化データのようにものごとを階層化して 整理するやり方に慣れているということを考えると、複合項を適切に 用いることで可読性が向上すると考えるのが自然である。 余談だが、これは仮名遣いにしても同様である。
499 : http://www.swi-prolog.org/pldoc/doc_for?object=exists_file/1 exists_file/1ってなんか英文法的におかしく無いですか? file_exists/1ですよね?
500 : >>499 私は知りませんが、述語+対象を原則としたところから始まったのでしょうか。 最初に concat_atom があり、後に atom_concat が生まれ、atom_concat に倣うように atomic_list_concat が生まれる。こうなると訳がわからない。
501 : concat_atomは第一引数のリストの中のアトムか整数を結合した長いアトムを第二引数にunifyする。 atom_concatは第一引数、第二引数のアトムを結合したアトムを第三引数にunifyする。 atomic_list_concatはconcat_atomと同じだが、アトムと、整数だけでなく浮動小数点を含んだ 数を公式に許した。歴史的事情によってこう命名されたのだと理解している。
502 : >>492 ちょっと間が抜けた遅レスになったが、 ここの「WAMの都合」の意味がわからなかった。どういうことだか教えてください。
503 : >>502 プログラマがWAMを意識してプログラミングするなんて考え難い。
504 : >>502 Prolog処理系 JAVAのJVMみたいなもの
505 : >>503 昔はみんな、グローバルスタックをできるだけ使わないようにしようとか 処理系の実装を意識してプログラムしてたよ
506 : ノイマン型を意識ぜずにプログラム書く奴いるのか? トイプログラムならどうでもいいだろうけど。
507 : >>506 Prologプログラマでノイマン型を意識する人がいるかの意味なら、 いないでしょう。
508 : >>507 スタックオーバーフローには注意するだろう。そのこととノイマン型と どういう関係になるかは知らないが・・・
509 : >>506 そんなこと考えたら。アウト! という世界だろ。
510 : あらゆるジャンプ先のアドレスを意識してプログラミングする奴がいるか?
511 : 配列かリストか考えるだけでもランダムアクセスメモリのこと意識するんじゃね?
512 : >>511 それは配列やリストの特性を意識するのであって、 メモリのことは意識してないのでは?
513 : >>506 Prologの計算モデルを実装するマシンはノイマン型に限定されないと思う
514 : データフローw
515 : ノイマン型を意識する人は死ぬまで1コアマシンを使ってろw
516 : マルチコアで内部的にシーケンサが複数になってもノイマン型の範疇での話。
517 : VLIWでインターロックがなくっても(略 ベクトルプロセッサで(略 何を指摘されても、どうとでも言い逃れが可能な論理ですねw
518 : http://ja.wikipedia.org/wiki/ ハーバード・アーキテクチャ
519 : >>20 を見て気になったのですが、Prologは以下の内容のデータベース構築に向いているのでしょうか? http://toro.2ch.net/test/read.cgi/tech/1341099441/265
520 : >>519 テキストが1GB以下程度で全部メモリに納まるならば、最も向いた言語でしょう。 プログラム言語自体がデータベースですから、定義、変更、条件付けなどは簡単です。 >>20 はPrologを使い込んでない人の意見で、Prologが向かないのは、ユニフィケーションの 繰り返しが短時間に多量に現れるアプリです。例えば画像の画素計算とか、数値処理などです。
521 : >>520 1GBのテキストとなると、検索で大量の「ユニフィケーションの繰り返し」が 起こるからちょっと疑問。 Prologの向き不向きの話は、ソースプログラムのドキュメントとしての表現力では 確実に他のプログラミング言語の上を行くので、少々遅かったり、書き難い点が あっても、向かないとは考えない方がよい。
522 : >>519 の内容は、単なるインデックス化テキストなんで、 (その上フレーズ検索が含まれてないという簡単仕様) こういうのが向いてない汎用言語なんて基本的にないのではないか? awkとかshだと面倒くさそうだけど。
523 : >>522 Prologの場合は、http://toro.2ch.net/test/read.cgi/tech/1341099441/265 で書かれている タグが述語ですから、タグの読み方、意味指定等、ルール付けに何の拘束もありません。プログラマの 自由であり、記述力も概ね無限です。 注釈、コメントを含めてのルール付けになりますから、単なる構造体による定義ではありません。
524 : >>523 このスレでこの課題に応えるプログラムを公開すればよい。
525 : タグが述語は余りよろしくないな。 複数タグを付けたり部分一致検索とかしずらい。
526 : >>523 が>>522 に対して何を主張してるのか分かる人いる?
527 : >>526 猫タグ、動物タグに対して、暗喩を述語に持ってくるという話だろ。 タグとタグの関係を述語として述べるのは当たり前のことだと思うが。
528 : Prologで関係データベースのテーブルを節として定義するにはどうしたらいいのでしょうか? 例えば↓みたいな表です。 personテーブル +-------------------- | id | name | address | +-------------------- | 1 | yamada | tokyo | | 2 | yamada | osaka | ←1とは同姓同名で別人 +-------------------- companyテーブル +-------------------- | id | name | address | +-------------------- | 1 | yamada | tokyo | ←紛らわしいがyamadaという会社名の会社 | 2 | yamada | osaka |←同名だが1とは別会社 +-------------------- person_companyテーブル +-------------------- | person_id | company_id | +-------------------- | 1 | 1 | | 2 | 2 | +-------------------- (続きあり)
529 : >>528 ただし、person(1, yamada, tokyo).といった定義は不可とします。 なぜなら、この節定義では、1とyamadaとtokyoの「意味」がプログラムとして定義されていないからです。 1がpersonテーブルのidだと解釈できるのはプログラム外のコメント文やドキュメントを読んだプログラマだけです。 (C言語の構造体やJavaのクラスでは変数名として意味を定義できています。) (おわり)
530 : person(id(1), name(yamada), address(tokyo)).
531 : >>530 >>482 以降のレス参照
532 : >>531 その議論に参加していたが、つまり何が言いたい?
533 : >>530 本当に必要な情報は第何引数にnameがあるかというようなもの。 テーブル情報(person,1,id,integer). テーブル情報(person,2,namae,atom). テーブル情報(person,3,address,atom). のような述語定義をする他ない。
534 : >>533 s/namae/name/
535 : >>533 >本当に必要な情報は第何引数にnameがあるかというようなもの。 そのとおりだと思うし、これがすべてだね >>529 の発想を裏返せば、 「C言語の関数やJavaのメソッドは引数と関数名(メソッド名)の意味が定義されていない」 から大問題だという話になる あるいはSmalltalk/Objective-Cのメッセージ定義やRubyのハッシュ引数などのように、 名前で引数に意味を与えることのできる言語以外は一切認めない....ように見える 自分なら>>528 は単純に書く person(1, yamada, tokyo). person(2, yamada, osaka). company(1, yamada, tokyo). company(2, yamada, osaka). person_company(1, 1). person_company(2, 2). Prologにおける>>529 の制約はナンセンスだと思う
536 : C とか Java だったらデータは構造体やクラスとして定義するわけで、関数やメソッドとしてなんか定義しない。 データと処理を明確に区別するパラダイムなの。 一方 Prolog は全部節定義でやるから、そこにぶつけた話なんでしょ。 >>533 の方式は、プログラマが読めば理解できる定義だけど、実行時にプログラムから使うのは面倒そうかな。 何番目が address なのかは取得できても、そこから簡単にクエリー組み立てられないよね。 person(name, 1, yamada). person(address, 1, tokyo). みたいな定義はどうかな。 これだとテーブル上での順番とかを考える必要はなくて、例えば address が tokyo の人を取得するのを person(address, Id, tokyo) みたいに書ける。
537 : >>536 >person(address, Id, tokyo) > >みたいに書ける。 いや、以下のように「冗長」に書く必要がある ?- person(address, Id, tokyo), person(name, Id, Name). それに対して常識的な>>535 は「簡潔」に書ける ?- person(Id, Name, tokyo). Prologにおいて、どちらが優れているかは一目瞭然だ
538 : >>536 クエリー生成(_テーブル名,_引数リスト,_クエリー) :- findall(_,テーブル情報(_テーブル名,_,_,_),_引数リスト),_クエリー =.. [_テーブル名|_引数リスト]. あとはnth1/3かnth0/3を使って自分の検索したいフィールドと変数を結びつける。
539 : >>536 > person(name, 1, yamada). > person(address, 1, tokyo). は確かに魅力的なモデルだが(Binary Data Model? 連想三つ組?)、 残念ながら、IDの管理が難しい。ここではユーザ設定のidを使うことに なりそうだが、一般的にはシステムが一意のIDを用意しなくては ならない。そういう機構をうまく組み込まないと実用にならない。
540 : 2つ質問です。 taroはコーヒーのどの種類が好きですか? という質問が作りたいのですが、どのように記述すればいいでしょうか test.pl syurui(coffee,cocoa). like(taro, cocoa). こんな感じでいけるかと思いましたが、falseでした。 ?- like(taro,syurui(coffee,X)). あと、ファイル再読み込み(Reload modified files)を頻繁に行うのですが、 ショートカットキーなどはありますか?
541 : 一番高速にprolog動かせるのって どの処理系なの?
542 : すいません、他の言語とごっちゃになってました。 質問を取り下げます。
543 : >>540 % 模範解答ではありません。私好みの定義。Prologの自由さを感じてください。 好きなコーヒー(taro,コロンビアスプレモ). 好きなコーヒー(hanako,グァテマラマラゴギーベ). 好きなコーヒー(taro,コスタリカ). 'taroはコーヒーのどの種類が好きですか?'(_コーヒーの種類のリスト,_taroの好きなコーヒーの種類) :- \+(var(_コーヒーの種類のリスト)), member(_taroの好きなコーヒーの種類,_コーヒーの種類のリスト), 好きなコーヒー(taro,_taroの好きなコーヒーの種類). 'taroはコーヒーのどの種類が好きですか?'(_コーヒーの種類のリスト,_taroの好きなコーヒーの種類) :- var(_コーヒーの種類のリスト), コーヒーの種類のリストを得る(_コーヒーの種類のリスト), 好きなコーヒー(taro,_taroの好きなコーヒーの種類). コーヒーの種類のリストを得る(_コーヒーの種類のリスト) :- findall(_コーヒーの種類,( 好きなコーヒー(_,_コーヒーの種類)), _重複を許すコーヒーの種類のリスト), sort(_重複を許すコーヒーの種類のリスト,_コーヒーの種類のリスト).
544 : >>543 ありがとうございます!
545 : >>544 どの種類の「どの」にこだわった定義です。どのというからには、 候補リストが与えられるべきだ、という考え方です。 出題の様式というようなことを軽く見て、細部を表現する定義が 私好みです。
546 : >>541 速度を追及するなら、自分でWAM実装するのが近道かと
547 : Prologを直で触る気はありません >>>Rubyから<<< Prolog操作したいな〜と思い https://github.com/preston/ruby-prolog こんなgem見つけたんですけど使い方が不明です教えてくれませんか
548 : examplesがあるじゃない。
549 : >>547 多分、SWI-PrologのsyntaxからRubyのそれへの変換プログラムを 書かないと使い物にならないと思う。Prologを使いたいと思う課題の 述語はそんなに簡単には書けない。Prologの専門家に書いてもらって それを使うか、専門の処理系で確かめてそれをRubyに移す方が確実。
550 : そうかもしれない。Prologの専門家だってこれって問題では、 http://www.amazon.co.jp/dp/0201403757 なんかのお世話になって、 書き写し、書き写し、説明を解読しながら書くものだよ。
551 : はあ?
552 : >>550 そのリンクは第3版ですが、すでに第4版が出ています。 PROLOG Programming for Artificial Intelligence http://www.amazon.co.jp/dp/0321417461
553 : 大学の演習でSchemeでProlog処理系を作らされたから、利用する機能を限定すればなればかなりのProlog処理系は自作できると思う
554 : SchemeのPrologならminiKanrenは凄い短いソースで出てきてるね Kanrenの方が使いやすいけど
555 : 沖電気のサイトにpython実装のprolog処理系の記事が掲載されてたよ
556 : 他のスレ(正規表現)での続きを書くと、 日本語で書かれてしかもPrologに触れているツイートのうち 評価を含んでいるものを調べると肯定、否定の割合は2:1くらい。 それとは別に、難しい、分からないとのツイートは多い。
557 : Prologでする画像処理なんてありましたっけ?
558 : >>557 Prologの欠点は遅いことです。それもC言語に比べて数百倍の単位で。 遅い理由は、バックトラックに備えてスタックを余分に積むことや、リストを 含む構造体のユニフィケーションの作業量の多さ、アトムテーブルの管理、 GCなどいろいろですが、これだけ遅いと対象範囲がビットマップ全体になる 計算はする気がなくなります。それで汎用システムとしての画像処理に適用 されたという話は聞いたことがありません。 Prologによる画像処理アルゴリズムの研究としては http://www.amazon.co.jp/dp/0387196471 があります。
559 : Wales大の人だな。MacPrologを改造したProlog+。 http://www.lpa.co.uk/ はまだ活動しているみたいだな。
560 : 遅い欠点をもつPrologがAIのシステムに導入されたのはなぜ? 現在ではもう時代遅れになっている言語なのかな?
561 : cutのあるバックトラックを使って、ほぼ宣言的に記述できるから。
562 : >>560 C言語などとの相対速度の差は現在の方がさらに開いていると思いますが、 AIは極めて遅い人間の脳がモデルですから、元々速度はあまり問題ありません。 最後は例えばRubyでPythonで同じくらい簡単に書けますかどうですかということ でしょう。 Prologについては、まだまだ2-3割しかその能力を引き出す努力がなされて おらず、これからどうなって行くかまったく予断はできません。
563 : なんか斜めです > 元々速度はあまり問題ありません。 > RubyでPythonで同じくらい簡単に書けます
564 : >>563 Prologでも書けませんが。
565 : >>563 今日、プログラマの水準は高く、Prologクラスの推論ならば、簡単に インタプリタのロジックを各言語に組み込む方はいます。しかし、その 人が論理学にも精通していたとしても、Prologのプログラミング程度の 単純な論理であっても、いきなりある一定単位持続して書き並べていく ことは多くの場合そんなに簡単なことではない。 だから、日常的に論理式の記述を習慣付けるためにPrologを使うのです。
566 : Prologレベルの推論エンジンは簡単に書けるなら、 ASP solver competitionにでも参加してみてくれ。 まさかPrologベースのシステムに負けないよな?
567 : 1.まずPythonでPrologを実装します
568 : >>567 そういうアプローチが全てのプログラム言語で、できるだけ多くの プログラマによって、なされることを期待します。 できれば表層はDEC-10 Prolog仕様(ISO標準も同じ)でね。
569 : ISOに合わせるように頑張ってたけど bagofが上手く実装できなくて詰んだはww
570 : >>560 AIのモデルを簡潔に記述するのが目的だったから それを何を勘違いしたのか、日本のICOTは秒あたりの推論数を競いだして自滅した
571 : 人間の脳は遅いです。ひとつのプロセッサーを見れば。ところが、1000個以上の プロセッサが協調して働けば、何十万個のプロセッサ付き記憶装置から読み出せれば 偉大な働きをする。囲碁のような単純な思考でもそうでしょう。名人は1秒間に 何千万手に相当する手を読みますが、それは画像認識に近いレベルでなされる。 浮かんだ画像をこれは、だめ。これは、可能性があると。その一瞬10^3どころではない オーダーの記憶装置付きのセルが働いている考えられる。 ICOTの目指した並行処理は間違ってはいなかったと思います。
572 : 飛行機は鳥のようにはばたかず、プロペラを回して飛ぶ。 自動車は馬のように駆けず、タイヤを回して走る。 AIは…?
573 : >>572 emotionとかethics抜きで単体のintelligenceってのが そもそも存在するのか? ないものをマネようとして失敗してるんじゃないかと思う。 いや色々な知見は得られているんだけれども。
574 : >>572 強い、弱いという分類がされますが、広義、狭義という分類も可能ですね。 馬の例えだと、馬の脚を車軸と車輪、タイヤで置き換えた。そこで止まって しまったり、そこから発展して、鳥から飛行機->ジェット機のように別の物に 進化していってしまう。そういう展開全て包容してのAIというのもあり得る。 けれども少なくとも20年前のAIブームの頃には、こういうものはAI研究の 「お零れ」と認識していた。エキスパートシステムもそう。 一時的に馬の蹄がタイヤであっても、そこに止まっていては馬の神経系や 骨格の力学的な研究とも出会うことができないから、それは所詮工業技術 じゃないか。こちらの方が一般的な見解ではないか。
575 : エキスパートシステムはロジックの部分がまさに本流なわけだけど…
576 : >>575 上の文脈からいって、エキスパートシステムは適切ではありませんでしたね。
577 : >>562 > AIは極めて遅い人間の脳がモデルですから、元々速度はあまり問題ありません。 いやでも、フレーム問題みたいなのも、 人間の脳の処理速度よりコンピュータの処理速度のほうがずっと高速だから 解決できるという見通しが当初からあったんでしょ? つまり、コンピュータの高速な処理速度にAI実現の将来の希望を託していた ことからすると、もともと処理速度は重要な問題だったわけで。
578 : >>577 でも速度に「追っかけられる」というような業務ではないです。
579 : 天気予報に使ってるエキスパートシステムは速度が重要だよ。 予報が民間に許可された今はリアルタイム予報が期待されているから。
580 : 確かにリアルタイムな天気予報は期待されてるけど、 具体的にはゲリラ豪雨みたいなイレギュラーな変化の予報。 これはエキスパートシステムのような大量の情報から引っこ抜くといった 性質のものでは無いのでは…。
581 : >>580 大気シミュの結果、各種リアルタイム測定値、過去の天候パターン記録などは、 エキスパートシステムのソースの一つなのよ。 扱う知識の一つというわけ。天候予測システムについても、 エキスパートシステム論についても知識が古過ぎ。
582 : いくら計算頑張っても元データの精度は超えないぞ。 縦横5km、高さ1kmのメッシュだからな。 せめてあと2ケタのデータ精度向上がないと、計算だけじゃ ゲリラ豪雨の予測には届かないんじゃないか。
583 : GPV以外にも観測データはありまして…
584 : Prologの宿題スレはなくなってしまったか。
585 : >>584 大分書き込まれていなかったからね。400位以下にいただろうから仕方ないね。 結構おもしろいコードもあったし、他所からリンクも張ってあったから、 保存しておけばよかった。
586 : >>585 代わりに「Prolog演習の課題を書き込みましょう」というスレを作ってみたが、 2日くらいでこれも削られた。聞くところによれば、今はテンプレの書かれていない 新スレは全部削られるらしい。スレたて荒らしの退治の余波で。
587 : 最近のSWI-Prologでは、アトムや関数名の中に改行が含まれても 構わないようだ。'\n'で表現する必要がなく、自然に改行できる。 http://nojiriko.asia/prolog/j72_387.html http://nojiriko.asia/prolog/c160_246.html の最初の述語のような定義が可能である。これでシングルクォートも 省ければすばらしいのだが。
588 : 論文とか書く人ってどのProlog処理系使ってるのだろうか…
589 : >>579 速度が必要になった時点でAIからは外れていると思います。 人間の能力を遙かにに超えたものを期待しているわけですから。
590 : >>588 処理系の研究ならASP-Prologとかが多いんじゃないでしょうかねえ。 古典的なPrologとは違いますけど。
591 : 「Prologでまったり」から始まりこのスレに至るProlog系スレは、他の スレに較べて、圧倒的にソースコード掲載の比率が高かった。 この希少な伝統を守るべく、どしどしソースを上げようではないか。
592 : 「憲法改正」は総選挙の争点になるか 安倍さんは「強い日本」「美しい日本」にしたいということで、まずは憲法9条の改正を目指す。 総裁選も盛り上がり、自民党が一気に国民の期待を集めている。 勢いに乗る安倍晋三総裁は、次期衆院選で憲法改正を争点のひとつにする意向を示している。 詳細 2012/10/21 http://www.zakzak.co.jp/society/politics/news/20121021/plt1210210709000-n1.htm
593 : zakzakの記事貼るぐらいならまだイカリソースのほうがよかった。
594 : >>592 % これを述語化しようと思ったが、結構難しく断念。 代わりに最近twitterに張ったものをここにも載せる。出典は空海の秘蔵宝鑰 暗生始 :- 生生生生. 冥生終 :- 死死死死. 暗生始(_) :- 生生生生(_). 冥生終(_) :- 死死死死(_).
595 : % これもtwitterに出したもの。バブルソート。カットが一ヶ所入るのが癪。 バブルソート(L1,L2) :- 軽い泡はちょっと浮き上がる(L1,L3), 泡が浮き上がったら最初からやり直す(L3,L2),!. バブルソート(L,L) :- 浮き上がる泡がなくなったらバブルソート終了. 軽い泡はちょっと浮き上がる(L1,L3) :- append(L0,[_重い泡,_軽い泡|R],L1), _重い泡 @> _軽い泡, append(L0,[_軽い泡,_重い泡|R],L3). 泡が浮き上がったら最初からやり直す(L3,L2) :- バブルソート(L3,L2). 浮き上がる泡がなくなったらバブルソート終了.
596 : バブルソート(L,L) :- 浮き上がる泡がなくなったらバブルソート終了. 軽い泡はちょっと浮き上がる(L1,L3) :- append(L0,[_重い泡,_軽い泡|R],L1), _重い泡 @> _軽い泡, append(L0,[_軽い泡,_重い泡|R],L3). 泡が浮き上がったら最初からやり直す(L3,L2) :- バブルソート(L3,L2). 浮き上がる泡がなくなったらバブルソート終了.
597 : 最大公約数をユークリッドの互除法で求める(M,N,_最大公約数) :- 'MがNより小さい時はNとMを置換して実行する'(M,N,_最大公約数),!. 最大公約数をユークリッドの互除法で求める(M,N,_最大公約数) :- ユークリッドの互除法は割り切れるまで除数だった数を被除数に剰余だった数を 除数として割ることを繰り返す(M,N,_最大公約数). 'MがNより小さい時はNとMを置換して実行する'(M,N,_最大公約数) :- M < N, 最大公約数をユークリッドの互除法で求める(N,M,_最大公約数). ユークリッドの互除法は割り切れるまで除数だった数を被除数に剰余だった数を除数とし て割ることを繰り返す(_被除数,_除数,_最大公約数) :- _剰余 is _被除数 mod _除数, 割り切れるまで除数だった数を被除数に剰余だった数を除数として割ることを繰 り返す(_除数,_剰余,_最大公約数). 割り切れるまで除数だった数を被除数に剰余だった数を除数として割ることを繰り返す(_ 除数,0,_最大公約数) :- 割り切れたらその時の除数が最大公約数だ(_除数,_最大公約数),!. 割り切れるまで除数だった数を被除数に剰余だった数を除数として割ることを繰り返す(_ 除数,_剰余,_最大公約数) :- '割り切れなかったら除数を被除数、剰余を除数に置き換えて計算を続ける'(_除 数,_剰余,_最大公約数). 割り切れたらその時の除数が最大公約数だ(_除数,_最大公約数) :- _除数 = _最大公約数. '割り切れなかったら除数を被除数、剰余を除数に置き換えて計算を続ける'(_除数,_剰余, _最大公約数) :- ユークリッドの互除法は割り切れるまで除数だった数を被除数に剰余だった数を 除数として割ることを繰り返す(_除数,_剰余,_最大公約数).
598 : 昨日、「Prologの宿題片付けます」スレが第二編として復活しました。 http://toro.2ch.net/test/read.cgi/tech/1350893602/ 出題-解答系はこちらに載せましょう。
599 : そういえば、「いろんな言語で宿題 第5編」スレもDat落ちしてしまった。 勝手は事実上のPrologスレといえるほど、肩入れしていたのだが最近は さっぱりで、二ヶ月近くも書き込みがなかったせいか削除された。 「いろんな言語で宿題」スレの歴史はム板の中でも秀逸だと思うが。
600 : そのスレはJのコードの量だけでもちょっと見ることができないものだった。 JはAPL後継で有名だが、ほとんど知られていない数式処理関係のプログラム言語の コードがかなり掲載されて凄いスレだったことは間違いない。私どもProlog勢が 書き込み過ぎて、Prologスレと見られてHaskell等関数型の書き込みが少なかった のが残念だったけど。
601 : いろんな言語で宿題 第五編 http://logstar.jp/toro.2ch.net/tech/1276873238/
602 : マイナー言語がハッスルするスレですね。
603 : >>602 「いろんな言語で宿題」スレは、大変マニアックなと言っては失礼に当たるかも知れ ない専門家が一人いて、5題に1題くらいの割ではあったが、次々と書き込んで くださった。私は結局覚えなかったし、ほとんど分からなかったが、十分楽しんだ。
604 : >>603 J言語が大半だったと思うけど、あの手の言語の解答だけまとめたら、 結構話題になるサイトが作れるんじゃないかな。全部合わせれば 分量も多い。
605 : 間違いないことは、この3年間に、最もプログラムがリンクを張るのでなく 直接2chに書き込まれたプログラム言語はPrologだということ。それも 圧倒的に。それではなぜ書き込むことができたかが、重要な点なのだが。
606 : 三交代の当直表を作るときなんかは便利そうなのになぁ。縦横の 条件と初期条件を満たす解を探すのなんて数独と同じだよね。 それとクリティカルパスを考えるときに、データ構造を網構造として手続き型で 処理するか、ガッサリPrologエンジンに任せるか。まだメモリ8GB程度じゃ 遅いのかねぇ?
607 : 今でも結構人気なんですね。SchemeやGoよりGitHub利用が多い。 http://jp.techcrunch.com/archives/20120912javascript-tops-latest-programming-language-popularity-ranking-from-redmonk/
608 : >>607 大体25位前後の人気のようです。アセンブラやシェルをプログラム言語と 見做すかどうかにもよりますが。米国では底固い実務的な人気があるようです。
609 : モノ珍しいので一度は触ってみるという意味での人気であって、業務で使っているとは思えない
610 : >>609 日本の場合、大学に100以上の講座があって、それを受講したら お終いなので物珍しいからに近い。あちらでは、日本でSQL枠と されている就職口が論理という枠になっていて権威もある。論理 枠の中でPrologは一定の地位を占めていて、想像以上に実務でも 使われている。
611 : 只々類似パターンの再帰の繰り返しのPrologがStackoverflowで質問数が すくないことはよくわかる。ところが何故、まったくライブラリ指向でない 言語の代表のPrologがGitHubに結構upされているのだろうか。
612 : GitHubの誤判定ではないだろうか 例えばhttps://github.com/languages/Prolog のMost Starred Overallの 上位5つのリポジトリを見てみると、 https://github.com/onyxfish/csvkit https://github.com/vangelisv/thea https://github.com/reprappro/Mendel https://github.com/Attempto/APE https://github.com/leaflabs/oak このうち実際にPrologを使っているのはtheaとAPEの2つに見える
613 : ワロタ 拡張子plをPrologプログラムと勘違いしてるらしい。 https://github.com/onyxfish/csvkit/blob/master/examples/realdata/census_2010/ilgeo2010_excerpt.pl 拡張子txtの言語作ればGitHub一位まちがいなし! ちなみに607です…
614 : 拡張子plはPerlじゃないし、GHCはHaskellのコンパイラじゃないのは世界の常識
615 : 前者はともかく後者はもう日本国内ですら通じないだろ……
616 : ここ:-を,どこだと|思って,るんだ!.
617 : ソースに使われてる言語の判定にはこれ使ってるっぽいね https://github.com/github/linguist Perl製と判定されたソフトの8割が実はProlog製だった可能性が出てきたな……
618 : あるあ・・・ねーよ
619 : 連番のエロ画像をダウンロードするスクリプトください
620 : >>619 http://nojiriko.asia/prolog/ronri_prolog_619.html
621 : >>619 エロかどうかの画像解析も必要?
622 : 必須
623 : Prologの実装がいろいろあるけど _ が任意にマッチするものと _.1 _.2 みたいにマッチする部分集合をわけるものがあるみたいですね それぞれの方式に名前がついてたりするのでしょうか
624 : >>623 私は後のケースを知りません。確かめてみたいので 処理系をご存知でしたら、教えてください。
625 : miniKanren cKanren という処理系です
626 : _1 は知ってるけど _.1 は知らない
627 : 日常の諸問題の解決にPrologを使っている人はいる?
628 : >>627 RDB使うかわりにレコードをprologのhead形式でファイルに追加して、prologの問い合わせで検索してる SQLより使い勝手がいい
629 : 過疎スレでこんなに早くレスをもらえるとは思いませんでした。 head形式とはどういうものですか?
630 : meisi(山田, xxx-xxxx, 東京都○○○○, 080-xxxx, 080-xxxx, ○○社, ○○課, 201301xx, 飲み会). memo(201302xx, 隕石落ちた). todo(201302xx, [郵便とりに行く, 印鑑確認する, 製本する, 連絡する, 掃除する, メールする/12]). みたいなのをジャンル分けずにどんどん同じファイルにアペンド 今40000タプルくらいある
631 : (・∀・)イイ! 実生活でPrologが役立っている例を始めて見ました
632 : 私は社内IRCに ?- ... と打ち込むと謹製Prologが答えてくれるボット投入してます 誰も使ってないけど
633 : 昔Java版のprologが出たときに大学の演習で作ったルールベースシステムをアプレットに移植して人工知能の会話システムを作ったけど、大して身のあるシステムにはならなかった
634 : Prologは初等教育に組み込むべきですね。プログラム言語としてではなく、 情報・知識の記述形式として。
635 : 初心者ですので初歩的な質問をさせていただきます。よろしくお願いします。 prologで単純な迷路を説くのは簡単ですが、縦横につながった升目(または碁石など)の数を数えるプログラムに難渋しています。 他の言語に習って、5個つながっているかどうかを、 heisa1(5,_,_,_,_,_,_,_):-!. heisa1(N,W,H,X,Y,Field,L0,L):- getv(W,H,X,Y,Field,V) ,(var(V)->((not(member((X,Y),L))->(adde((X,Y),L,L1),N1 is N+1);(N1=N,L1=L)) ,(X<W->(X1 is X+1,heisa1(N1,W,H,X1,Y,Field,L0,L1))) ,(Y<H->(Y1 is Y+1,heisa1(N1,W,H,X,Y1,Field,L0,L1))) ,(X>1->(X1 is X-1,heisa1(N1,W,H,X1,Y,Field,L0,L1))) ,(Y>1->(Y1 is Y-1,heisa1(N1,W,H,X,Y1,Field,L0,L1))))). のような書き方で、細部をいろいろ工夫しても、無駄なバックトラックが起こってうまくいきません。 どのように書けばよいのでしょうか。ご教示いただければ幸です。
636 : >>635 ちなみに、私は切羽詰って、 heisa(0,_,_,_,_,EL,EL):-!. heisa(_,_,_,_,[],EL,EL):-fail,!. heisa(N,W,H,Field,[Pos|Re],EL,EL2):- search(N,W,H,Field,[(1,0),(0,1),(-1,0),(0,-1)] ,Pos,Re,AL,EL),adde(Pos,EL,EL1) ,N1 is N-1,heisa(N1,W,H,Field,AL,EL1,EL2). search(_,_,_,_,[],_,AL,AL,_):-!. search(N,W,H,Field,[XY|Re],Pos,AL,AL2,EL):- (X,Y)=Pos,(X1,Y1)=XY,X2 is X+X1,Y2 is Y+Y1 ,getv(W,H,X2,Y2,Field,V) ,((nonvar(V);member((X2,Y2),AL);member((X2,Y2),EL))->AL1=AL;adde((X2,Y2),AL,AL1)) ,search(N,W,H,Field,Re,Pos,AL1,AL2,EL). getv(W,H,X,Y,Field,V):-(X>0,Y>0,X=<W,Y=<H)->(Co is (X+(Y-1)*W),arg(Co,Field,V));V=k. のような形で実現しましたが、汎用的でないようですし、境界条件があとにきているのが気にいりません。
637 : % 全然仕上がってないけど、凡そ以下のようなコードとなるはず。 連続している(_色,X1,Y1,X2,Y2) :- 隣接した石がある(_色,X1,Y1,X2,Y2). 連続している(_色,X1,Y1,X2,Y2) :- 隣接した石がある(_色,X1,Y1,X3,Y3), 連続している(_色,X3,Y3,X2,Y2). 隣接した石がある(_色,X1,Y1,X2,Y2) :- 隣接(X1,Y1,X2,Y2), 石(_色,X2,Y2). 隣接(X,Y1,X,Y2) :- 上に隣接(Y1,Y2). 隣接(X,Y1,X,Y2) :- 下に隣接(Y1,Y2). 隣接(X1,Y,X2,Y) :- 右に隣接(X1,X2). 隣接(X1,Y,X2,Y) :- 左に隣接(X1,X2). 上に隣接(Y1,Y2) :- length(L1,Y1),length([_|L1],Y2). 下に隣接(Y1,Y2) :-length(L1,Y1),[_|L2]=L1,\+(L2 = []),length(L2,Y2). 右に隣接(X1,X2) :- length(L1,X1),length([_|L1],X2). 左に隣接(X1,X2) :- length(L1,X1),[_|L2]=L1,\+(L2 = []),length(L2,X2).
638 : 升目の数を数える問題ですか。問題をよく読んでいなかった。それだと バックトラックするとダメなので、再帰で書き直す必要がありますね。 ずっと難しくなりますね。 それから、算数が嫌いなのでY2 is Y1 + 1,を複雑なリスト処理で書きましたが、 単純な算術でもちろん大丈夫です。
639 : >>638 早速ありがとうございます。 バックトラックできないところと、カンマがANDを意味するため、 成功しないと後ろにいけないところなどがネックになっています。
640 : >>634 今、ラッセルやウィトゲンシュタインみたいな分析哲学に凝っているんだけど、 知識の記述に述語論理を使うという前提を共有しているのに、 人工言語派vs.日常言語派みたいな分裂が続くあたり、 何ともいえない不思議さを感じる。
641 : 東アジアの農民は、10000年もゆったりした言語で特に深刻に悩むでもなく、 自然と共存したり、痛い目に遭わされながらつぶやいてきた。その延長の言語で あってよいから、もう少しだけ自分が生きた証しをくっきりとできればいい。 言語に内在するほんの少しの論理性の助けを借りて。だから論理プログラミング。 その程度の論理プログラミング。
642 : 論理性の無い文章だなぁ
643 : Prologでシークエント計算できますか?
644 : できるけど、50行くらいプログラミングが必要
645 : wa(you, shock).
646 : prologのバックトラックを使って 深さ優先探索のミニマックス戦略のプログラムを作れますか。 やむをえなければassert,retractを使ってもかまいません。 幅優先探索ならできるのですが。
647 : >>646 こんな定義になると思う。未定義の部分が多いけれどそのうちに書く。 n手先を評価する(_n,_局面1,_着手ならび,_評価点,_局面) :- length(Ln,_n), 手を読む(Ln,自分,_局面,[],[],_着手ならび,_評価点,_局面). 手を読む([],_,_局面,_着手ならび,_評価ならび,_着手ならび,_評価点,_局面) :- sum(_評価ならび,_評価点),!. 手を読む([_|Ln],自分,_局面1,_着手ならび1,_評価ならび1,_着手ならび,_評価点,_局面) :- findmax([_評価,_着手,_局面2],( 着手(_局面1,_局面2,_着手,評価)), [_評価,_着手,_局面2]), 手を読む(Ln,相手,_局面2,[_着手|_着手ならび1],[_評価|_評価ならび1],_着手ならび,_評価点,_局面). 手を読む([_|Ln],相手,_局面1,_着手ならび1,_評価ならび1,_着手ならび,_評価点,_局面) :- findmin([_評価,_着手,_局面2],( 着手(_局面1,_局面2,_着手,評価)), [_評価,_着手,_局面2]), 手を読む(Ln,自分,_局面2,[_着手|_着手ならび1],[_評価|_評価ならび1],_着手ならび,_評価点,_局面). 着手(_局面1,_局面2,_着手,_評価) :- 着手の選択(_局面1,_局面2,_着手), 局面の評価(_局面2,_評価).
648 : そうか。 これだと、最善手をn手続けてみただけか。 一手目を非決定性に着手してn手先まで最善手で読ませて、すべての着手を 評価して、評価点がもっとも高い着手を選ぶようにしないといけないか。
649 : >>647 ,648 深さ優先ですから、とりあえずある道筋で、最終局面まで行き、 そこで評価点を決め、それをひとつ下のレベルに下ろしておいて、 また別の最終局面に行って評価点を求め、其れを先ほどの値と比較し、 最終局面がなくなったら更に一つ下のレベルと比較...... のようなことを繰り返し、次第にレベルを下げていくことになるはずですが、 バックトラックをうまく制御できません。
650 : >>649 深さ優先といっても株は全部評価しないとどれが最高評価点かが 分かりません。それで最高点-最低点-最高点...と降りていって、 葉までたどり着いたら(つまりn手先)一つ候補が決まる。次善候補を 葉のレベルの次の評価点の候補着手とするという意味ですか?
651 : >>650 理屈からいうと、N手目の局面で評価するとすると、 あるN-1手目から派生するN手目の評価点を全て比較して、 其れをN-1手目の評価点とし、同様にあるN-2手目から派生する 全てのN-1手目について評価点を決めて其れを比較して N-2手目の評価点として........というように、 だんだん一手目まで戻っていきます。 (もちろんmini とmax交互に) これを、同じレベルの評価をfindall等を使っていっぺんに行うと 幅優先になり、行ったりきたりして評価すると深さ優先になります。 1->N->N-1->N->N-1->N->N-1->N-2->N-1->N->N-1->N->N-1->N-2........ というような感じだと思います。.
652 : 着手の選択/4と局面評価/2が未定義ですが、 http://nojiriko.asia/prolog/mini_max_senryaku.html のようなコードでしょうか。
653 : >>652 初心者ですので、他人のコードを読むのは難しいのですが、 これは基本的に幅優先のコードではないでしょうか。
654 : >>653 何か間違っていますね。 ! を削りましょう。そうすると、 着手候補の取り出し(_枝切り,_評価_着手_局面ならび_2,_評価,_着手,_局面2) :- length(L0,_枝切り), append(L0,_,_評価_着手_局面ならび_2), member([_評価,_着手,_局面2],L0). の最後memberが働いて、全解を取り出せると思います。 3手先読みの最善手は -> 次の可能な全ての手を評価して整列 -> 探索範囲を狭めるため枝切り -> 最も評価の高い手を選択 -> 相手の立場から最も評価高い手を選択 -> その局面で全ての可能な着手を評価し -> 整列して枝切り -> これで第一解が得られる バックトラックすると、 3手先読みの整列枝切り後も member/2 の次の候補が取り出されて第二解。 findmax で次々呼び出されて、最高評価点を探す。
655 : >>654 これ深さ優先でしょうか。 幅優先のような気がしてなりません。
656 : その人、悪い人じゃないんだけど、ちょっとおかしいところあるから、あまり関わらないほうがいいよ。
657 : >>655 Wikipedia の幅優先の項のグラフを借用して説明します。 http://ja.wikipedia.org/wiki/%E5%B9%85%E5%84%AA%E5%85%88%E6%8E%A2%E7%B4%A2 1 2 3 4 5 6 7 8 9 10 11 12 プログラムでは、着手評価が唯一の実効のある作用なので、着手評価によって 横方向の優先順位を決めることが幅優先に見えることは仕方ない。 [2,3,4],[5,6],[7,8],[11,12]の順序は実は動的に決められます。 しかし、実際の手の読む順序は 1 - 2 - 5 - 9 が第一解 1 - 2 - 5 - 10 が第二解 1 - 2 - 6 が第三解 のように、このノードが先に優先して評価されていきます。2-5-9,10を評価して いる時には7,8,11,12などは置いてきぼりの状態にあります。 これは幅優先ではありません。
658 : 実際の手の読まれる順序 ですね。
659 : >>657 私の求めていたアルゴリズムとは違うようですが、 これはこれで興味深いですので、何とか解読してみたいと思います。 ありがとうございました。
660 : 大学で習ったから家でもやろうかと思い立ったが、やっぱり個人で無料の場合はswi-prologなのだろうか ちなみに大学は有料の処理系つかってたみたい
661 : 教官とそのソフトの業者がつるんでるんだろうな。 でなきゃ、Prologとして十分な機能を備えているswi-prologを避ける理由が分からん。
662 : >>661 ずっと以前のバージョンで日本語に不具合があったから、 というようなことが理由になっている場合が多いと思います。
663 : macでgnu prologやってみたいのですが、「gprolog-1.4.3.tar.gz.」をダウンロードしてからが 分かりません、どなたか教えていただけませんか
664 : GNU is Need Unix
665 : >663 まさか解凍できないという話ではないでしょうね
666 : xcodeとコマンドラインツールズとhomebrewもいれららない世の中じゃ、ポイズン。
667 : ははあ、LC475かな。FPUというのがあってですね。
668 : Macportもどうぞ
669 : 【論理力テスト】次の文章は正しいようで実は論理的に間違っています。どこがどうおかしいか貴方は説明できますか→「何度学校を変わってもいじめられるのは、いじめられる側に原因がある証拠だ」…答えは「感情自己責任論」で検索
670 : >>669 検索したが分からなかった。 あなた説明して。 ∀Student[∀School{bullied(Student,School)→caused(Student)}] 全ての生徒について、その生徒があらゆる学校で虐められるならばその生徒に原因がある。 もしかして、反証可能な命題の提示ではあるが論理的な証明ではないとか言えば良い?
671 : 違うか。 > ∀Student[∀School{bullied(Student,School)→caused(Student)}] > 全ての生徒について、その生徒があらゆる学校で虐められるならばその生徒に原因がある。 ∀Student[∀School{(enroll(Student,School)∧bullied(Student,School))→caused(Student)}] 全ての生徒について、その生徒が在学したあらゆる学校で虐められるならばその生徒に原因がある。
672 : SWI-Prologって64bit版が出ていたのですね。 知らなかったが,Windows 7の64bit版に 今日インストールして使いはじめました。 気のせいか,処理速度がすこし速くなったよう に思います。
673 : Bratko さんの Prolog 本(新版)の日本語版はでないのでしょうか …原書の自炊ミスって単語一個分余計に切り落してしまい絶望中
674 : SWI-Prologの64bit版をインストールしたのだけれど SWI-Prolog-Editorと相性が悪いらしく, configurationのProlog folderに64bit版のフォルダーを していして,プログラムを書いてconsult.を押しても, prologプログラムが見当たらないというエラーメッセージ がでる。 しかたがないので,32bit版もインストールしてそちら のホルダーを指定して使っている。 64bit版でSWI-Prolog-Editorを同期して使っている方 が居られましたら,どうすべきかご教授いただけると ありがたいです。
675 : prologで作られたアプリケーションやライブラリのリンク集みたいなものはないのでしょうか prologで型推論エンジンつくろうと思ってるのですが 多分だれか既に作った人いないわけないので どこかで公開していないかと
676 : arXivで検索検索
677 : >>675 http://rainyday.blog.so-net.ne.jp/2008-06-16 ここにPrologで書いたとても簡潔な型推論コードがある
678 : 量子コンピュータが実用化されたら Prolog 大活躍するん?
679 : >>678 むしろPrologが必要なくなる方向を予想する
680 : >>679 Prologの連言が量子コンピュータ上では通じなくなるなんて ことがあるかなぁ。
681 : >>680 というか、すべての計算を探索に還元するんだから、わざわざPrologで設計する必要がないというか
682 : >>681 そういう意味での探索は実は現在のPrologにとって苦手。 遅かったり、スタックオーバーフローが起きたり。 ここの部分がアセンブラ化することはPrologにとって 御の字ではなかろうか。
683 : 量子コンピュータが実現しても、KL/1でやってることががprologのコードで書けるようになるというイメージしかない
684 : Prologがやるべきことは、人間にとって寧ろ需要な 表層の知を確認する作業。要するにシンボル操作だから、 量子コンピュータとは直接的な繋がりはないかも。
685 : SWI prologです ex.pl というファイルを ?- X is 3,X > 0. ?- append([1,2,3],[4],X),print(X),write(X). 以上のような中身とし、 コンソールで [ex]. とうつと 902 ?- [ex]. aaa+[1,2,3,4] % ex compiled 0.00 sec, 1 clauses true. のようになるんですが、これをコンソールで逐一手で入力したのと同様に、下記のように変数の同定結果まで出力させるにはどうしたらよいでしょうか? 903 ?- X is 3,X > 0. X = 3. 904 ?- append([1,2,3],[4],X),print('aaa'+ X). aaa+[1,2,3,4] X = [1, 2, 3, 4].
686 : swipl-win.exeで、日本語を入力したときにカーソル位置がズレるのですが、何か良い手はないでしょうか? version 6.4.1 (windows 64bit)版です。
687 : emacsのシェルモードで試してみてはどうか
688 : windowsなので、emacsは入れたくないです。cygwinインストールが必須らしいので。 サクラエディタ上で使えたらよいのですが、うまくいきません。
689 : >>688 emacsもmeadowもcygwin無しでOKのwindows版あるよ
690 : ありがとうございます。試しにMeadow入れてみました。 M-x shellでシェルモードにして、その中でswipl.exeを実行してみましたが、 プロンプトが表示されないなど、満足に動作しませんでした。
691 : 日本語対応が十分にできるている処理系はありますか?
692 : Prologで仕様記述できますか?
693 :2013/09/12 >>692 ルールを決めればできるでしょう。
TOP カテ一覧 スレ一覧 2ch元 削除依頼 ▲
monazilla Part 6 (722)
日本語プログラミング言語『なでしこ』スレ5 (874)
プログラム板 自治スレッド Part14 (581)
【Lisp】プログラミング言語 Clojure #2【JVM】 (967)
Jython、Groovy、JRuby - どれが一番効率的? (277)
HSPだって (193)
--log9.info------------------
パイロさんが相談に乗るスレッド 3ホロ目 (532)
【BF3】スナイパー【芋砂】 (606)
【破壊】Red Faction: Guerrilla【TPS】 part2 (921)
【PC】バイオハザード6 CHAPTER8【BIOHAZARD】 (201)
【G4W】Games for Windows総合スレ【Xbox360と対戦】 (922)
【ARMA2】DayZ 2ch Origins鯖スレ【MOD】 (977)
【F2P】Ghost Recon Online part 1【TPS】 (331)
θ PORTAL(1/2) ポータル θ Test Chamber 25 (326)
【CoD】Call of Duty: World at War Vol.21【WaW】 (786)
【HL2MOD】 No More Room In Hell 【Co-op】 (568)
Blacklight:Retribution Part10 (292)
【PC】BIOHAZARD REVELATIONS UNVEILED EDITION 3 (155)
■□ HALF-LIFE □■Part44 (578)
【DF:AF】NOVALOGIC総合スレ その2【DF:X2】 (706)
【OFP2】 Operation Flashpoint: Dragon Rising #16 (556)
Trials Evolution Gold Edition Vol.1 (616)
--log55.com------------------
【韓国】 中国人女性の韓流ブームは冷めつつある、だが「ベトナム人女性が後に続いている」と中国メディア[08/25]
【米国】トランプ氏「金正恩氏は『韓国が戦争ゲームしている』と不満を漏らしていた。私も米韓軍事演習は不要だと思う」★3[08/25]
【中央日報】サムスン・LGテレビに中華圏LCDが「半数」…QLEDも台湾製パネル[9/4]
◆スレッド作成&継続依頼スレッド★212◆ 立て子キャップを取得したいコテ(トリップ付)募集中!
【東京五輪】「旭日旗」問題で中国メディアが論評=「日本人の情熱は理解できるがアジア人にとっては挑発」[09/06]
【韓国】 最大の反日施設『独立記念館』に潜入! 閲覧注意レベルの怖い日本人、拷問股裂き、慰安婦再現模型も [09/07]
【韓国】 日本は「普通国家」を望む資格があるのか?いやない[09/06]
【韓国】日本の輸出規制から2カ月 半導体生産に支障なし[9/8]