【論理】Prolog【初心者】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2010/11/06(土) 13:00:56これは良い言語だ…
0002デフォルトの名無しさん
2010/11/06(土) 13:04:340003デフォルトの名無しさん
2010/11/06(土) 13:26:20萌
0004デフォルトの名無しさん
2010/11/06(土) 13:28:22初心者を増やしていきたいじゃないか
いい言語だし、もっと使われてもいいはず
0005デフォルトの名無しさん
2010/11/06(土) 14:23:211. 日本語の通る無料の処理系
2, 初心者向けチュートリアル
3. 初心者向けおすすめ書籍(いまでも容易に手に入るもの)
あたりがテンプレにあると助かります
ご一考いただれば幸いです
0006デフォルトの名無しさん
2010/11/06(土) 23:55:21言語訓練のために立てたものです。
アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。
京都大学霊長類研究所
0007デフォルトの名無しさん
2010/11/07(日) 19:12:200008デフォルトの名無しさん
2010/11/07(日) 22:39:54IronProlog
0009デフォルトの名無しさん
2010/11/07(日) 23:08:05おぉ、�d
0010デフォルトの名無しさん
2010/11/09(火) 09:56:40p# ではなくて、prolog# か。
別のものかな。
0011デフォルトの名無しさん
2010/11/09(火) 10:01:412, これはSWI-Prolog でいいでしょう。
3, http://www.amazon.co.jp/dp/4303716901
001211
2010/11/09(火) 10:04:062, は素っ気ないのが多くて難しいな。
0013デフォルトの名無しさん
2010/11/09(火) 10:34:19これからが、Prologの時代だ。
0014デフォルトの名無しさん
2010/11/09(火) 12:17:580015デフォルトの名無しさん
2010/11/09(火) 14:53:12いえないから、ここは思い切りやさしい課題満載のスレになるといいね。
0016デフォルトの名無しさん
2010/11/09(火) 21:57:560017デフォルトの名無しさん
2010/11/09(火) 22:41:140018デフォルトの名無しさん
2010/11/10(水) 06:33:16引数がリストかどうか判定する述語 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
?- 空リストはリストではありません。アトムです。
0019デフォルトの名無しさん
2010/11/10(水) 11:22:34はっきり向いていない分野がいくつかあり、
それ以外はどんな分野でも「大変に」向いている。
そういう言語です。
0020デフォルトの名無しさん
2010/11/10(水) 12:59:28はっきり向いていない分野が大半だけど、
ごく一部の分野に限れば「大変に」向いている、ではないかと思う。
0021デフォルトの名無しさん
2010/11/10(水) 13:17:24多分、定理証明のような分野を念頭に置いての書き込みだろう。
現在のPrologの衰退ぶりから見て、それが常識化しているのかも
知れない。
このスレの中でその常識が誤謬であることを証明しよう。
ありとあらゆる分野のコードを示すことで。
0022デフォルトの名無しさん
2010/11/10(水) 19:51:31こういう出鱈目を書く人がもう居着いてるから難しいw
という冗談はともかく。
普通、空リストを含めてリストと呼ぶ。
[_|_]に適合するのはconsとか言って区別する。
よね。
0023デフォルトの名無しさん
2010/11/10(水) 20:20:30そうだったか!
私は20年以上、空リストはリストではないと思っていた。
list([]).
list([_|_]).
これが定義ですか。
アトムでかつリストというのはちょっと腑に落ちないが。
0024デフォルトの名無しさん
2010/11/10(水) 20:25:49http://www.google.com/codesearch
lang:prolog ^(is_?)?list\(\[
0025デフォルトの名無しさん
2010/11/10(水) 21:13:19list(V) :- var(V),!,fail.
list([]).
list([H|T]) :- list(T).
'.'(3,5) はリストではない。
0026デフォルトの名無しさん
2010/11/10(水) 21:17:44[]がアトムでなくてもあまり困らないし。
0027デフォルトの名無しさん
2010/11/10(水) 21:40:22そういうことのようですね。
0028デフォルトの名無しさん
2010/11/11(木) 08:42:20list/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
?- となります。
0029デフォルトの名無しさん
2010/11/12(金) 05:55:38そりゃ、困るだろう。リスト項という型があるわけでもないし。
それなら[]は何に帰属するんだい?
0030デフォルトの名無しさん
2010/11/12(金) 09:07:46別に何でもいいのでは
0031デフォルトの名無しさん
2010/11/12(金) 09:10:450032デフォルトの名無しさん
2010/11/12(金) 09:20:29横レスだけど、Prologの[]は、LISPでいうところのNILに相当するのではないかと
?- X=[a|[]].
X = [a].
?- X=[she | [is | [25 | []]]].
X = [she, is, 25].
0033デフォルトの名無しさん
2010/11/12(金) 09:24:510034デフォルトの名無しさん
2010/11/12(金) 09:34:34単純項と複合項 しかない というのがPrologの値打ちだったのではないかな。
0035デフォルトの名無しさん
2010/11/12(金) 09:40:55数のことを考えてあえて「アトム」とは書かなかったんでしょ
0036デフォルトの名無しさん
2010/11/12(金) 09:46:47単純項というのは
単項 + 変数 のことだよ。
0037デフォルトの名無しさん
2010/11/12(金) 09:50:200038デフォルトの名無しさん
2010/11/12(金) 10:03:18単項はさすがに無理かw
定数 + 変数 だね。
0039デフォルトの名無しさん
2010/11/12(金) 10:08:330040デフォルトの名無しさん
2010/11/12(金) 10:32:37うん。言葉の選択は大事だからいつもわかりやすい言い方が
ないか探してはいる。単項はアトムを言い換えたのだけれども、
ここは変数との対比になるから定数でなくてはいけない。
単純項という言葉は Prolog-KABA のリファレンスマニュアルが
初出かも知れない。後に出版された単行本にも出てくるはず。
Prolog講座などの単一化の授業以外では使われないと思う。
0041デフォルトの名無しさん
2010/11/12(金) 10:58:23第一条 JIS用語は、これを無視する。
0042デフォルトの名無しさん
2010/11/12(金) 11:51:210043デフォルトの名無しさん
2010/11/12(金) 14:03:34・PrologのISO規格は1995年以降。不統一な用語の亡霊が君に新鮮な毎日をもたらさんとす。
・「アトム」は整数などを含まない。(Common Lisp用語との違い)
0044デフォルトの名無しさん
2010/11/12(金) 14:42:15ISO規格の日本側委員だった中村克彦先生がunificationを
融合、融合とおっしゃるから、我が意を得たりで、「やはり、
融合で統一のお考えですか」と訊いたら、
「あ、全然そんなことないです。なんでもいいんです。」
だと。
0045デフォルトの名無しさん
2010/11/12(金) 14:51:01resolutionと混同してませんか、それ
0046デフォルトの名無しさん
2010/11/12(金) 14:57:53いいえ、unificationですw
0047デフォルトの名無しさん
2010/11/12(金) 15:03:000048デフォルトの名無しさん
2010/11/12(金) 15:22:11まあ、そうでしょう。
0049デフォルトの名無しさん
2010/11/12(金) 15:48:570050デフォルトの名無しさん
2010/11/12(金) 15:54:50悔やまれるのは、「先生ぜひ融合で統一しましょう」と尻を押さなかったこと。その場に
いたProlog協会の面々を扇動して、このように強く働きかければ、中島、後藤、古川氏等は
中村先生が説得可能だったでしょう。当時はメジャー言語の尻尾くらいにいたから、考えも
しなかったけど、今思えば、単一化なんて変な用語はまずかった。
単一化しかない言語ですから。
0051デフォルトの名無しさん
2010/11/12(金) 16:05:20JISでは。
というか、Prolog界だけでわめいてもダメでしょう。
ISOがunificationという(論理学かぶれの)言葉を選んだ時点で。
0052デフォルトの名無しさん
2010/11/12(金) 16:07:370053デフォルトの名無しさん
2010/11/12(金) 17:07:37「構造」より「構造体」の方がわかりやすいというか、正しいというか、そんな気がする。
少なくとも日本語では「構造物」を単に「構造」と言ったら分かりにくいんじゃないか、
というような意味で。今さらだけどw
0054デフォルトの名無しさん
2010/11/12(金) 21:42:03親子(頼朝,義朝).
親子(義朝,為義).
先祖(A,B) :- 親子(A,B).
先祖(A,B) :- 親子(A,C),先祖(C,B).
でなぜ、親子にはルールがないか、という問題です。親子/2は英語で
いうところのprimitiveな情報ということになります。まあ、最後に
行き着くところ、ですね。このような情報を何と呼ぶか、25年くらい
悩んできたのですが、最近これを、基(もとい)と表現することにしま
した。ここで、親子/2はもといである、という風に使います。
「単一化」以上に日常から離れますが、やまと言葉に潜む力に賭けたい
と思います。
0055デフォルトの名無しさん
2010/11/12(金) 22:03:36よほど付け加えようと思いましたが、やめてよかったと思いますw
0056デフォルトの名無しさん
2010/11/12(金) 23:30:26命題は西洋哲学から生まれた概念だから、やまと言葉には
そぐわないかもしれないけど。
ところで、数学だと和算という言葉はあるけど、論理学には対応する
やまと言葉はあるのかな?哲学は「問答(もんどう)」でいい気はするけど。
0057デフォルトの名無しさん
2010/11/13(土) 05:07:55命題に行き着く。それでよい。とりわけ、私が>>54で書いた「ここで、親子/2はもといである」
では命題とほとんど同義です。ただ命題、親子/2 は頼朝と義朝が親子関係にあることは
明々白々であることを述べている。一方、私が「もとい」として拘っているのは、
親子はDNAだの、両性の性交の結果女性が妊娠して・・・等、さらに具体的にルール化できない
ことはないが、ここで止めておく。この親子のように外延として記述する場合もあるが、それも
放棄して、組み込み述語を書きっぱなすにとどめることもある。そういう命題の措定のされ方に
ついての意を含みたい、そういう部分です。
0058デフォルトの名無しさん
2010/11/13(土) 23:36:000059デフォルトの名無しさん
2010/11/14(日) 02:34:14現在のPrologは32bit以上の整数を自動で扱えますから、障碍になる
部分はありません。ライブラリを作らないコミュニティなので、
基本的に自前の必要はあります。COBOLのDATA DIVISION を解析して、
Prologに変換的なことを最も得意とする言語です。ということは、
すべてのデジタル化可能な業務文書の解析を得意とするということで
あり、なぜこれまで業務処理に積極的に使われてこなかったのか、
不思議ですね.
0060デフォルトの名無しさん
2010/11/14(日) 17:32:07ライブラリ作ろうぜ
それがないと広まらんだろーJK
0061デフォルトの名無しさん
2010/11/15(月) 08:04:20必要になる。一人のPrologプログラマの一ヶ月に定義でき
る限界は、1500述語程度だから、六ヶ月でプロジェクトを
終えることを目標にすると、10人以上のPrologプログラマ
を確保しなくてはならなくなる。現時点ではこれはまったく
不可能。Prologの過去の例ではICOTでのESPの開発しかない。
0062デフォルトの名無しさん
2010/11/15(月) 08:05:250063デフォルトの名無しさん
2010/11/15(月) 08:31:51一流大学卒のPrologプログラマをそんな業務開発などに
回せるか。という論理になる。一方、ある時期からは
学生の方も、Prologプログラマとして就職なんかして、
大丈夫かということになったから、現時点ではProlog
プログラマを業務開発用に確保することは至難となって
いる。
0064デフォルトの名無しさん
2010/11/15(月) 09:08:24向き不向きでいうと、向いていると?
0065デフォルトの名無しさん
2010/11/15(月) 17:04:37はい。少なくともCOBOLやPHPよりは遙かにね。
言語自体がオンメモリ・データベースですから。
0066デフォルトの名無しさん
2010/11/15(月) 18:02:43Prologでまったり Part3
http://pc11.2ch.net/test/read.cgi/tech/1193354806/115
> 115 :デフォルトの名無しさん [↓] :2008/04/26(土) 18:08:59
> COBOLを代替できなったという点は、>>83にちょっと出てきているが、
> アトムの爆発ということだとおもう。Prologではアトムをヒープエリア
> 内に一旦記述して処理する戦略をとる。極めて大きな記号間の連鎖を表現しよう
> とする記号処理言語ではどこかに対象となる情報すなわちアトムを保持せざるを
> えない。この場合、初出のアトムに対し必ずメモリ内を検索し、無い事を確認して
> 新たに構造体を追加する。業務処理で一日一億のトランザクションを処理する
> ケースだとこの参照時間だけで相当のものだ。やはり破壊代入だけで済ませる
> 言語には太刀打ちできない。さらに再帰で処理した場合はオーバーフローの危険が
> あるし、バックトラックして再束縛する場合でも、ヒープエリアのGCは必ず
> 必要になる。実際、保険業務などをPrologで処理することを想定すると、すぐに
> 電話帳一冊分くらいの量のアトムが発生してしまう。
> 企業業務はほとんどが記号処理、シンボル処理であり、Prologはそういう意味では
> 極めて適した言語なのだが、残念ながら以上のような理由から、大規模な業務処理
> には向いていない。
006765
2010/11/15(月) 18:53:47はい。そうだと思いますw
実はこれは私の書き込みです。私はPrologの適性領域と限界という
ことをずっと考え続けてきたので、この書き込みの内容もまた真
ではないかとぶつけました。これからのPrologは20GBを超えるメモリ
での実行が当たり前のことになるでしょうし、オンメモリデータベース
としても最速クラスに近いメモリ管理・データ管理が要求されること
になるでしょう。
0068デフォルトの名無しさん
2010/11/16(火) 09:42:35入力検査を厳しくやっています。入力がカードや紙テープですと、
どんなとんでもないエラーが入り込むかも知れないからと、一項目
一項目、いろんな角度から検査し、どこかにエラーが見つかれば、
入力の対象とはしない。そういう設計にしました。その後POSの
ような部分的に入力検査済みの装置を経るのが当たり前になり、
さらに、RDBの登場あたりからともかく入力させてしまって、削除、
修正はSQLでやればよい、と大分おおらかになったようです。
何でこの話をするかというと、COBOLだと100行以上の連続したIF文
など珍しくなかったのですが、これをPrologに移植すると100節では
なくて、100述語以上に変換されるかも知れないということがある
からです。
これこれこういう場合は(_検査対象,_診断) :- ...
がPrologの標準スタイルであり、あっという間に10万述語なんて
いってしまう理由がこんなところにもあります。
0069デフォルトの名無しさん
2010/11/16(火) 19:47:05100万節以上のデータベースを持つ場合、一節づつassertz
で追加する時に、各項のアトムの既出検査で、平均すると
アトム総数の半分のリンクを辿ります。いくらCPUのサイクル
が高まってもこれでは時間がかかり過ぎということです。
0070デフォルトの名無しさん
2010/11/16(火) 21:54:51項の入力には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).
0071デフォルトの名無しさん
2010/11/16(火) 21:59:07<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でもいいのですが、
ちょっと理由があってこうしました。これについては後に。
0072デフォルトの名無しさん
2010/11/16(火) 22:09:40>>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), ... の
ように使います。
0073デフォルトの名無しさん
2010/11/16(火) 22:17:45get_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).
のように一節挿入します。
0074デフォルトの名無しさん
2010/11/16(火) 22:44:02あと、なぜ殆どの人はprologを言語上の述語理論でしか考えてない/られないのかね。
まるで判ってないと思う。
0075デフォルトの名無しさん
2010/11/17(水) 06:15:18(工夫して)書いてみる前に判った気がしてしまう。これも、述語理論の所為から
知れないよ。
0076デフォルトの名無しさん
2010/11/17(水) 07:31:46Prologでは引数で値を渡す定義が普通で、標準入力からデータ受け取って、
その後の処理をするプログラムはあまりありません。しかし、C/C++の宿題は
ほとんどすべてこの形式で出題されていて、このようなスタイルのPrologに
ついて整理する機会を得ました。それで、次からは入力検査についての話を
します。
0077デフォルトの名無しさん
2010/11/17(水) 08:07:05うちもWebサーバ、Proxy、メールサーバ、などはPrologだけど、
Prolog だからというよりは、自前だから便利というところだな。
0078デフォルトの名無しさん
2010/11/17(水) 08:08:360079デフォルトの名無しさん
2010/11/17(水) 09:57:09例として、入力データが整数であることを要求されているとする。
整数データの入力(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のある述語定義では診断をしない。
0080デフォルトの名無しさん
2010/11/17(水) 09:58:03例として、入力データが整数であることを要求されているとする。
整数データの入力(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のある述語定義では診断をしない。
0081デフォルトの名無しさん
2010/11/17(水) 09:59:48get_line/1でせっかく入力された文字列とLineの束縛がそこで解かれて
しまって、
整数データの入力(N) :- 整数データの入力(N).
の引数を増やしてみても、Lineを受け取ることはできません。このため、
診断結果の表示はLineを渡された述語の中で行います。
atom_to_term は parse_atom という処理系もあり、文字列からPrologで
認識できる項を切り出す述語です。第三引数については後に説明します。
0082デフォルトの名無しさん
2010/11/17(水) 10:04:42ポイントは、
・ 整数以外のデータが入力されたら、それは捨てて、再入力を要求する。
・ 入力のトップレベルつまりget_lineのある述語定義では診断をしない。
入力のトップレベルで診断してしまうと、failになった場合get_line/1で
せっかく入力された文字列とLineの束縛がそこで解かれてしまって、
整数データの入力(N) :- 整数データの入力(N).
の引数を増やしてみても、Lineを受け取ることはできません。このため、
診断結果の表示はLineを渡された述語 整数データの入力診断/2の中で
行います。
atom_to_term は parse_atom という処理系もあり、文字列からPrologで
認識できる項を切り出す述語です。第三引数については後に説明します。
0083デフォルトの名無しさん
2010/11/20(土) 16:36:400084デフォルトの名無しさん
2010/11/22(月) 19:04:17この問題を蒸し返しますが、今日、私が要求されている
業務処理の大半が、Webからの情報の安定した抜き取りで
あり、そこで得られた情報の組み合わせを、保存する
ことです。いわゆる、計算はほとんどありません。
このような業務処理への適性では Prolog はスーパーの
クラスの中にいることは間違いありません。
0085デフォルトの名無しさん
2010/11/22(月) 19:12:52環境は Java6+PrologCafe1.2.5 です。
宿題スレにあった設問を自分なりに解いてみました。
http://www.dotup.org/uploda/www.dotup.org1263511.txt.html
パターンの数え上げ手法はあるソースを参考にしました。
あんまりあちこち見てて、どこだったかは分からなくなってしまいました。
その他いろいろ資料をあさってやってみたのですが、
switch文だの3項演算だのが頭にちらついて、どうも汚い感じにしか組めません。
とてもじゃないけどこれを「宿題だ持って行け」とは言えない・・・
メモリ足らずで JVM様が例外はいたりするので、
計算回数減らすための処理もこちょこちょ書いてるんですが、
たぶんすごく回りくどいことしてるんだと思います。
! もよく分からないので避けちゃってます。
もし簡単に改善できるところがあれば教えていただけると幸いです。
0086デフォルトの名無しさん
2010/11/23(火) 06:22:55わが社の業務処理時の手動でのPrologインタプリタの負節入力(?- から始まる質問)の
累積数は18年間に70万を超えています。ほとんどが売上伝票入力ではありますが、
不自然さは全くありません。トランザクションとしては、別にPOS経由のものがあり、
こちらの累積は21年間で3000万くらいになります。Prologとの相性という点では、
従業員30-60名くらいの小企業だからこそと言うことができるかもしれない。よくぞ
小企業でいてくれた!,が正直な感想ですね。
0087デフォルトの名無しさん
2010/11/23(火) 06:50:46恐縮ですが、書き込まれた解答を、
http://nojiriko.asia/prolog/prolog_177_1.html に勝手に転記させていただきました。
uploadサイトの掲載時間に制限があるためであり、著作権については可能な処置を
したつもりです。
0088デフォルトの名無しさん
2010/11/23(火) 07:04:41ストレートフラッシュを除くフラッシュが一回目の配札で出現する確率は
_確率 is 4 * (13/52) * (12/51) * (11/50) * (10/49) * (9/48).
ですよね。仮に、全知全能というよりも予言者的なプレーヤーがつぎに
配られる5枚のカードを分かってしまって、フラッシュになるに相応しい
手札の取り替え戦略をとったとすると、確率はどうなるんですか?
008988
2010/11/23(火) 07:06:000090デフォルトの名無しさん
2010/11/23(火) 11:11:43_確率 is 4 * ((13/52) * (12/51) * (11/50) * (10/49) + (1/47)).
でいいのかな?
009190
2010/11/23(火) 11:14:46これから、夕方まで出かけるから、
その後で直します
0092デフォルトの名無しさん
2010/11/23(火) 11:31:43となるのかな? これを2-5枚とやっていって、合計がフラッシュの確立かな。
本当かね。
0094デフォルトの名無しさん
2010/11/29(月) 22:45:091.学ぶ際にPrologを選んでも大丈夫?(念の為)
2.Wikipediaに目を通した感じではAZ-PrologやSWI-Prologが良さそうだけど、お勧めの処理系は?
0095デフォルトの名無しさん
2010/11/30(火) 05:10:292.. 日本語マニュアルが必要なら、AZ=Prolog。この処理系は1980年代に一世を風靡した
Prolog-KABAの後継を目指して開発されたもので、オンラインマニュアルの他、
Prolog-KABAの解説本も参考書になります。
今後、多くの仲間とライブラリを分け合ったりしながら発展していくには、
SWI-Prologがお勧めです。2000年代に入って最も活性のある処理系だと思います。
以前はバージョンによっていろいろ問題がありましたが現在は日本語も制限なく使えます。
おまけ.. Prologに慣れたら、Progol(誤植ではない)という処理系をインストールて
機能論理Prologで遊んでみるといいと思います。すでに定義された節から、
どうやったら新しいルールをProgolに生成させることができるか。大変興味い
テーマを楽しめます。
009695
2010/11/30(火) 05:12:33009795
2010/11/30(火) 05:13:530098デフォルトの名無しさん
2010/11/30(火) 06:33:50もしProgolに手を出すなら
帰納論理プログラミングの入門書もどうぞ。
帰納論理プログラミング
http://furukawa.sfc.keio.ac.jp/book/
http://www.amazon.co.jp/dp/4320120140/
0099デフォルトの名無しさん
2010/11/30(火) 07:23:30機能論理プログラミングになっている。
帰納論理プログラミングの間違いです。
0100デフォルトの名無しさん
2010/11/30(火) 08:27:40レスありがとう
処理系は俺の場合は既存の資産もないし、英語マニュアルに抵抗もないからSWI-Prologにする
帰納論理プログラミングも面白そう
ちょっと違うかもしれないが論理プログラミングにおけるメタプログラミングみたいな感じ?
0101デフォルトの名無しさん
2010/11/30(火) 08:40:23関数型のメタプログラミングはあまり詳しくないから、そうだとも違うともいえませんが、
帰納論理プログラミングは(集合の)外延定義にヒントを与えてやると内包定義つまりルールを
生成してくるというような感じです。もちろん、外延だけでなく、内包も考慮しますから、
かなり複雑なルールの生成も可能なようです。しかし、一種のリバースエンジニアリング的な
ものですから、生成されるルールの可能性が大きく成りすぎて、収拾がつかない。というのが
私のレベルですね。
0102101
2010/11/30(火) 08:48:01どういう表現が適切であるかは、もう少し考えます
0103デフォルトの名無しさん
2010/11/30(火) 12:56:16帰納的にルールを導出するというのがメタプログラミング的だと思ったけど
よく考えたら帰納も演繹もそうありうるような気がしてきた……
0104デフォルトの名無しさん
2010/12/07(火) 03:33:250105デフォルトの名無しさん
2010/12/07(火) 09:05:15ロジックを生成する事と、隠された
ロジックを発見する事は違うんじゃ
ないか。
0106デフォルトの名無しさん
2010/12/07(火) 10:52:10せいぜい、隠れたロジック。
0107デフォルトの名無しさん
2010/12/07(火) 11:20:40帰納論理プログラミングであり、一方、我々の日常的な
プログラミングの目標は、課題(仕様)の自然言語表現から、
論理式(述語定義)を発見して、Prologプログラムとして
書くこと。
仮に、コンピュータを自然言語で操作することを目標と
した場合には、Prologの次善の言語としての地位は現在
も揺らいではいない。
0108デフォルトの名無しさん
2010/12/23(木) 15:02:410109デフォルトの名無しさん
2011/01/01(土) 18:44:51listingでプログラムをセーブするとき、tell(出力先)を使うしかないのでしょうか?
0110デフォルトの名無しさん
2011/01/01(土) 19:38:50open/3,listing/2,close/1などが使えないものか、
ということですね。私はtell/1でしか使ったことが
ながったので、確かめてみました。
結論からいうと、ストリームの使用はできないようですね。
0111デフォルトの名無しさん
2011/01/01(土) 23:19:300112デフォルトの名無しさん
2011/01/02(日) 01:17:510113デフォルトの名無しさん
2011/01/02(日) 06:59:51Prologでまったりスレでも何回となく示された述語先祖で考えてみます。
親子(為義,義朝).
親子(義朝,頼朝).
の関係が定義されている時、先祖関係は、
先祖(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 で終了となります。あとで続きを書きます。
0114デフォルトの名無しさん
2011/01/02(日) 07:04:12これは 為義 --- 義朝 --- 頼朝 の関係ですが、
これを 為義 --- 義朝 --- 義平
|- 為朝 |- 頼朝 --- 範頼
0115デフォルトの名無しさん
2011/01/02(日) 07:15:36で示した親子関係が迷路の回路選択を抽象したものになっていると思います。
分岐点(例えば為義)から開路である義朝に進むか、為朝に進むかの選択があります。
Prologは深さ優先選択という戦術で、次に義朝-義平の順で進んで行きます。
義平には子はいないようなので、諦めて、義朝分岐点に戻り、頼朝を選択する。
こうして、範頼にたどり着きます。
0116デフォルトの名無しさん
2011/01/02(日) 07:18:02プログラムが
先祖(A,B) :- 親子(A,B).
先祖(A,B) :- 親子(A,C),先祖(C,B).
という極めて簡素な定義によって書き切られていると
いう点です。
0117デフォルトの名無しさん
2011/01/02(日) 14:24:424Gbyteだと、問題があるでしょうか?
0118デフォルトの名無しさん
2011/01/02(日) 14:44:59SWI-Prologの64bit版は使ったことがないので、
これは回答ではありません。
AZ-Prologの64bit版についてですが、これは新しい
版がマルチコア対応の並列処理機能を目玉にして
いるため、必ずこの機能が使われるに相違ないとして、
保険をかけた感じで、大きなメモリーを推奨しているに
過ぎないと思います。小さいと動かなくなる理由はない
はずです。
0119デフォルトの名無しさん
2011/01/02(日) 14:57:01これに答えるのは私の能力を超えるので簡単に。
現在のPrologの仕様で引数の評価に大きな力を持た
せることは、ユニフィケーションが邪魔をして無理です。
さらに、現在のPrologの基本的に持っている能力は
変数の変域が離散的でごく限られた数である場合に、
虱潰しに変数に候補要素をあてはめて、確かめること
だけだと思います。変数制約を解消していくどんな機構も
持っていません。これを解決するには、この目的のために、
開発された、制約論理型プログラム言語を利用する他ない
のではないでしょうか。
多くの制約論理型言語はそのサブセットとして、Prologを
持っていますから、そういう利用が多いユーザは最初から
制約論理型言語を選択するべきでしょう。
0120デフォルトの名無しさん
2011/01/02(日) 23:44:13が、むずい
勉強しよう
0121デフォルトの名無しさん
2011/01/03(月) 02:58:48詳しい解説があったのでリンクします。
制約論理プログラミング
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
0122デフォルトの名無しさん
2011/01/07(金) 09:21:23杉崎昭生著「Prologを学ぶ」(http://www.amazon.co.jp/dp/4303716901/)
->
古川康一著「Prolog入門」(http://www.amazon.co.jp/dp/4274073084/)
0123デフォルトの名無しさん
2011/01/08(土) 00:35:13例えですが、文字列と、それを含むページについて考えます。
記号aを、この文字列として表すときは"a"とし、変数とするときはそのまま裸のaで表すことにします。
あいまいな表現になりますが、「aを含むページである」というのをPg(a)と表すと、
「Pg(a) ならば Pg(b)」 というのは、「aを含むページなら、bを含むページである」ということになります。
この式の値として、式を変形し、「¬(Pg(a)) または Pg(b)」 とし、aを含まないページの集合とbを含むページの集合の和集合を求め、そのページ数を全ページ数で割った値とします。この式の否定の値は、1との差の値になります。
式の値をこのようにするのは数学的に妥当なものなのでしょうか?
0124デフォルトの名無しさん
2011/01/08(土) 05:15:34「全ページのうち、命題を否定しないページと否定するページの割合」を計算しています。
数学的に妥当でない操作は行われていません。
でもaを含まないページは事例検索の利用者にとって無関係な事例でしょう。
必要なのは「aを含むページのうち、bを含むページと含まないページの割合」なのでは?
0125デフォルトの名無しさん
2011/01/08(土) 08:34:44Pg(a) を太宰治が現れるページ Pg(b) を文学という語が
現れるページとすると、
「この式の値として、式を変形し、「\+(Pg(a)) または Pg(b)」
とし、aを含まないページの集合とbを含むページの集合の
和集合を求め、そのページ数を全ページ数で割った値」とは
(全ページ数 + 太宰治という語が現れないが文学という語の現れるページ数) / 全ページ数
ですね。この比率 - 1 は
( Pg(a),\+(Pg(b))のページ数 / 全ページ数 ではなくて
( \+Pg(a),pg(b))のページ数 / 全ページ数 なのではないか。
0126124
2011/01/08(土) 10:00:12A=太宰治がなく文学がないページ
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
事例検索の利用者にとっては太宰治を含まないページはどうでもいいから
役に立つのは「太宰治を含むページのうち、文学をを含むページの割合」と
「太宰治を含むページのうち、文学を含まないページの割合」ではないでしょうか。
0127125
2011/01/08(土) 10:12:560128デフォルトの名無しさん
2011/01/08(土) 10:14:57レスにし損なりました。もう一度、
確かにそうです。ありがとうございました。
0129デフォルトの名無しさん
2011/01/08(土) 10:53:31解説本の中に8クィーンアルゴリズムは何種類くらい
あるかな、という話は現在まとめ中です。あまり、この
言語向きの課題とは思えないけど。
この言語向きの課題といえば、20年くらい前にProlog
を買っていた時、本屋の立ち読みの評価基準に使って
いたのが、経路問題の多寡。もちろん多いほど読み応え
がある。この基準でどんな本を復活できるかやってみま
しょう。
0130デフォルトの名無しさん
2011/01/08(土) 11:08:44もう五年以上前になりますが、本棚に眠っていた、
「Prologを学ぶ --文化とその実践--」という本を
読んでみて、気に入ったというよりよく書けているのに
感心した。Amazonで確認してみるとほとんど売れ行き
は最下位近くに低迷していた。そこで、読み直したら
赤面ものの内容のないカスタマーレビューを書き、
星五つの評価を付けた。驚くべきことに、それ以降、
この無名本は常時Prolog本の売れ行き上位に入り続け
今日でも絶版にもならず、Amazonでは売り切れては
入荷をくり返している。こんなことで、忘れ去られた本
たちが復活できるなら、いくらでも労は惜しみません。
0131123
2011/01/08(土) 12:30:04その世界での論理値を0から1までの値にして数学的な破綻がないかどうかが気になっていました。
意味のある検索とか、推論とかも、比の論理値で色々考えてみるつもりです。
0132デフォルトの名無しさん
2011/01/08(土) 13:02:440134デフォルトの名無しさん
2011/01/09(日) 08:49:36ぷろろぐに手続きを任せるって認識でいいのだろうかー
PGは関係を定義しておくだけという
で、がらがらと処理して真か偽かと
0135デフォルトの名無しさん
2011/01/09(日) 10:45:34どんな難解ニュースでも掲示板の書き込みでオモシロおかしく簡単理解。
ニュースを勢い順にカテゴリー別で表示する"2NN"(2ちゃんねるニュース速報+ナビゲーター)もどうぞ。
0136デフォルトの名無しさん
2011/01/11(火) 18:07:30Prologはプログラムには確実に実行順序があります。
この実行順序を"意識"すると手続きになり、意識しない限りは
宣言的である(宣言的に読んでいる)といえます。
Prologの副目標(subgoalともいう)は真偽値しか返しません。これが
Prologプログラミングの核心であって、プログラマは、実際には、
全部真であるに違いないという姿勢でこの本体の記述を読みます。
つまり真偽値さへも意識しないのです。そして引数の変数の遷移を
一瞥します。
Prologを読むときにすることはこれだけです。そう、これだけです。
返り値のこともあるいはそのデータ型やクラスについて思いめぐら
すことは全く、ありません。
0137デフォルトの名無しさん
2011/01/12(水) 23:53:14肝はデータベースと見た
0138デフォルトの名無しさん
2011/01/13(木) 05:25:54そうです。条件のない、命題だけからなる
Prologプログラミングが"理想"ですね。
0139デフォルトの名無しさん
2011/01/14(金) 12:45:05節を選択する条件を兼ねた命題が失敗して次の節が選ばれればいいのですが、失敗でないのに次の節に移るときがあります。
そのために、条件の否定を加える必要があるのですが、
一般的に、カットを使わないときは、カットによって省略できていた命題を加えればいいということなのでしょうか?
0140デフォルトの名無しさん
2011/01/14(金) 16:24:02必要なことは、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,の中に副作用があったりして
このような記述が不可能の場合もありますが。
我慢して、このような冗長なコードを書いて
いると、ご利益として、ブール代数的直感が
鋭くなってきていつの間にか以前よりも正確
なコード書くことができるようになります。
0141デフォルトの名無しさん
2011/01/15(土) 22:48:50す。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秒かかった。
0142141
2011/01/19(水) 08:31:210143デフォルトの名無しさん
2011/01/21(金) 13:07:460144143
2011/01/21(金) 14:59:500145デフォルトの名無しさん
2011/01/24(月) 06:45:38どういう局面で変数ラベルがプログラマの期待通り
表示されるのかという問題と考えよう。
処理系によって異なるとおもうけれど、Heap領域に
元々の変数のラベルと現在の変数の一意名(大きの
場合番号)の対応表が確保される。この対応表が
Prologの処理系によって参照されるのは、
・listingなど定義節の表示(これは否応なくHeap
領域の参照が生じる。そのついで)
・インタプリタのトップレベルのインタプリタ側が
サービスとして表示する変数名。
であって、
?- atom_to_term('X',A,Varlist),write(A),nl.
を実行しても、
このトップレベルには変数Xが存在しないため、
_G24689
A = _G24689
yes としか表示されない。
つまり、トップレベルに現れる変数は例外として、
反駁途中stack領域内でのユニフィケーションに
よって生じた当然の変数名は処理系がプログラマ
がこの変数名に何を期待しているかというような
推論を行わなわず、したがって、スタック内の
変数ラベルをこれに置き換えるというようなコスト
のかかる作業を行わないため表示されることがない。
あとで続きを書きます。
0146自己レス
2011/01/24(月) 07:05:00ごめんなさい。まちがえました。
?- atom_to_term('X',U,Varlist),write(U),nl. を実行すると、
_G24689
Varlist = ['X' = U]
となります。注目はwriteで表示される変数はUでもXでもなく、
_G24689であるという点です。
0147デフォルトの名無しさん
2011/01/24(月) 11:43:29読み込むときは、読み込んだ文字列をparse_atomして、第三
引数のVarlistをヒープ領域に、変数名と定義した節構造の
中の変数Idのペア、として登録します。
ユーザがreadしてからassertする場合は、処理系によります。
assertz_with_namesのようなVarlist処理をオプションに
持った処理系の場合は,
?- ... read_with_names(P,V),assertz_with_name(P,V), ...
としておくことで、後にユーザが指定したかった変数名を
あくまで字面だけの問題ではありますが、「復元」するこ
とができます。
このようなオプションがあれば、より高度なインタプリタを
構築したり、マクロ処理を取り入れる場合には、この復元
を使うことによって、使い易い、分かりやすい、インタブリタ
やデバッガを作成することができます。
しかし、これらのことはあくまで変数を表示する際の「字面」
だけの問題であり、Prolog実行時のユニフィケーションに
よる、スタックの書き換え処理では、そのすべてが無機的な
変数Idの単一化だけで処理されている、ということを理解
する必要があります。
0148143
2011/01/24(月) 22:53:06質問が不適切だったと思います。
一般的に言うと、文字列として表現した節を、プログラムとしての節に変換するにはどうすればいいかということです。
外部のテキストをプログラムとして読み込めるなら、内部で「']と「']で囲まれた文字列をプログラムとして読み込めてもいいと思います。
0149148
2011/01/24(月) 23:10:15まったくの素人レベルのことです。
0150デフォルトの名無しさん
2011/01/25(火) 18:57:10この言語で説明が最も難しい問題のひとつです。
よい質問だったと思います。
私の回答も不十分あるいは不適切なものでしたね。
0151デフォルトの名無しさん
2011/03/03(木) 19:28:07.670152デフォルトの名無しさん
2011/03/08(火) 07:50:13.35このサイトの後半部分は正規表現で書くことが
できるものをProlog述語で定義するとどうなるかと
いう課題への解答が集められています。
やはり、正規表現では1行で済むところが述語定義
では7-8行、場合によると10行以上になる場合も
少なくありません。しかし、ここで私が問いかけたいのは、
記述の効率性の問題だけではなく、これらの述語の名前と
して、正規表現として正解の表現を置いたとすると、この
述語名の解説としてPrologコードがどの程度有効な
ものになっているか、と言う観点です。(注1)
この観点からは、Prologは相当に優秀な言語だといえる
のではないか。そうであるといいなと思っています。
(注1) 残念ながら、正規表現の正解が元サイトでも
今ひとつはっきりしないため、述語名は日本語での
表現になっています。
0153デフォルトの名無しさん
2011/03/08(火) 20:45:35.91http://nojiriko.asia/prolog/onmemory_database.html
Prolog単位節をオンメモリデータベースに見立てて、
SQLによる問い合わせと等価なProlog述語定義を
試みています。
0154デフォルトの名無しさん
2011/03/08(火) 21:29:14.81ピーター・グレイの名著 「論理・代数・データベース --知の工学の基礎--」 の
下支えとして位置付けて、このサイトを読まれるとよいと思います。
0155デフォルトの名無しさん
2011/03/13(日) 04:44:42.40対するProlog解答を集めたWebサイト
http://nojiriko.asia/prolog/
は現在1600解答を集めました。
先週、主要述語の用例集をこのサイトに集めた
解答から抜き出して追加しました。
各用例の題材は現在は出現順にならんで
いますが、今後のこれを意味別に並べ直すつもりです。
解説も極く一部しかついていませんが、意味別に
大分して、それに対して解説を追加する予定です。
最終的には、さらに主要Prolog処理系の互換性を
取るための述語などをここにします。
0156155
2011/03/13(日) 04:46:48.840157デフォルトの名無しさん
2011/04/17(日) 09:16:01.110158デフォルトの名無しさん
2011/04/23(土) 15:05:55.540159デフォルトの名無しさん
2011/04/23(土) 17:33:12.15Prologはエキスパートシステム記述するための
言語のひとつということになっている。
私が書いたことがあるか、とか、今書けるかという意味だと
すると、答えは、
20年前には結構書いた。業務用も含めて。
対象が定まれば、サンプル的な短いものなら今でも書ける。
大別して前向き推論によるものと後ろ向き推論のものが
あるが、私は全て後ろ向き。
Prologにとってはこちらの方が自然ということらしい。
0160デフォルトの名無しさん
2011/04/25(月) 23:18:32.73…冷静に考えればprologなればこそ書けなきゃおかしいか。
IBMがprologで自然言語処理がうんたらかんたらしてるらしいので
もっと注目されてほしいなぁ。
0161デフォルトの名無しさん
2011/04/27(水) 18:00:50.94急に注目されはじめたようですよ。
0162デフォルトの名無しさん
2011/04/27(水) 19:57:36.82prologはファクトの無限導出を副作用をつかって
避ける必要があるので、むしろ面倒なくらいだ。
0163デフォルトの名無しさん
2011/04/27(水) 20:58:39.35「どんな言語でも」書けるもんなら書いてくれ。
0164デフォルトの名無しさん
2011/04/28(木) 11:32:17.24ないという点には同意。
Prologだとappendだけで書けるレベル。かってはスタックオーバーフローや
GCの頻発に悩みながらだったが、現在は、2GB以上のプロセスが当たり前で
データをすべて引数で持ち回っても問題はない。
Prologの利点は、何といっても作り込みが容易なこと。業種、企業、生産現場に
よって、全く異なるデータのサンプリングの方法を仕様がしっかり文章化されて
いれば、簡単に述語として追加・変更できることだろう。
0165デフォルトの名無しさん
2011/04/28(木) 11:50:39.82かっては確かにルールをシンボル化してその論理式を
assert,retractしながら利用するというような手法が
使われていたと思うけど、今は、
非決定性のappend/3 を ...,apppend(L1,[A|L2],L),filter(A,B), ...
のように使って、例えば、Bの排他的要素がL1,L2に存在
するか確かめながら(これもappend/3)進むというような
ものがほとんどだと思う。
0166デフォルトの名無しさん
2011/04/28(木) 23:29:22.17私が今書くとすると、"Prolog Programming For Artificial Inteligence" の14章を
一度読みなおしてからということになるが、十分に難しいよ。
他の言語でやさしいかどうかは知らないが。
0167デフォルトの名無しさん
2011/04/29(金) 00:45:50.540168デフォルトの名無しさん
2011/04/29(金) 12:35:51.700169デフォルトの名無しさん
2011/04/29(金) 21:02:38.40自分で書くと、とても綺麗とはいえないコードになる
0170デフォルトの名無しさん
2011/04/29(金) 22:04:54.18PrologからLAPACKにどうやって処理を投げるのか知らないけど。
0171デフォルトの名無しさん
2011/04/29(金) 22:13:50.07ただ、言語のプログラミングスタイルの話だから…
0172デフォルトの名無しさん
2011/04/30(土) 10:38:28.54転置も含めて、単純な再帰述語が六段くらい。
難しいところは全くないからそれでいいのでは。
0173デフォルトの名無しさん
2011/04/30(土) 11:22:20.41私が今書くとすると、"Matrix Computations 3rd Edition"を
一度読みなおしてからということになるが、十分に難しいよ。
他の言語でやさしいかどうかは知らないが。
0174デフォルトの名無しさん
2011/04/30(土) 12:01:22.84> 他の言語でやさしいかどうかは知らないが。
APLという軟弱言語なら演算子三文字。
軟弱言語巡りをしてPrologにも立ち寄っているけど、
何を書いてもエラーか無限再帰になってしまう。
未だ正しい記述が出来ない orz
0175デフォルトの名無しさん
2011/04/30(土) 12:21:31.48せめて計算環境にあわせてブロック分割くらいしようぜ
0176デフォルトの名無しさん
2011/04/30(土) 13:21:02.33こんな感じじゃないかな。個々の述語は単純だよ。
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.
0177デフォルトの名無しさん
2011/05/05(木) 11:19:35.03> 357 :名無しさん@涙目です。(東京都):2011/05/02(月) 19:15:52.75 ID:Of9kzpjA0
> こんなのもあるな
> 登場人物は4人。(男の子、女の子、アイスクリーム屋さん、お母さん)
>
> 男の子と女の子が公園で遊んでいると、アイスクリーム屋さんがきます。
> ふたりはアイスが食べたいが、男の子はお金を持っていません。
> アイスクリーム屋さんが「今日はずっと公園でお店やるよ。」 というので、男の子は家にお金を取りに行きます。
> 途中でアイスクリーム屋さんの気が変わり、学校でお店を出すことになり
> 女の子に「男の子に学校に来るように伝えに行って」と、頼みます。
> アイスクリーム屋さんが、学校に向かう途中で、お金を取りに行った男の子に会います。
> アイスクリーム屋さんは男の子に学校にお店を出すことにした事を伝え、一緒に学校に行きます。
> その頃、家に着いた女の子はお母さんから、「男の子は、もうアイスを買いに行った」ことを、聞きます。
>
> さて、ここで問題です。女の子はどこに男の子を探しに行くでしょうか?
0178デフォルトの名無しさん
2011/05/10(火) 17:16:11.53パズルではないような
0179デフォルトの名無しさん
2011/05/10(火) 19:26:17.19女の子が一定年齢以下だと公園に行くけど、一定年齢以上だと学校に行くとか、そんな話じゃなかったかと。
0180デフォルトの名無しさん
2011/05/10(火) 20:14:33.59とかそんな形でモデル化できないこともないかな。
この場合「知らない」なので「公園に行く」になるような。
その文章が表現してる知識全部がうまくいくかどうかはわからない。
>>179 逆かな。
0181デフォルトの名無しさん
2011/05/11(水) 18:29:25.78そうそう確かコピペ元がそんなスレだったと思う
発達障害か何かで女の子の立場で考えられるかどうかを見るテストだったような
論理とは関係ないか
0182デフォルトの名無しさん
2011/05/11(水) 18:48:08.31(有名な例では、
「宵の明星は金星である」「金星は宵の明星である」
「明けの明星は金星である」「金星は明けの明星である」はいずれも真である。
では、「宵の明星は明けの明星である」は真か、みたいな)
入り組んでいるだけなら論理として扱えると思うけどね。
0183デフォルトの名無しさん
2011/05/11(水) 21:02:08.06> >>179 逆かな。
なんかそんな気がする。
>>181
より単純な例示をすると以下のよう。
1.男の子と女の子が同席している場で、先生が"not(Human(Socrates))."と教える。
2.男の子が退席した後で、先生は女の子に"Human(Socrates)."と教える。
3.「男の子は"?- Human(Socrates)."という問いにどう答えるか?」と女の子に尋ねる。
年端のいかない子供は、
男の子が"Human(Socrates)."を知らないという情報をうまく処理できず、
3の問いに"Human(Socrates)."と答えてしまうのだとか。
0184デフォルトの名無しさん
2011/05/11(水) 21:12:23.17× Socrates
○ socrates
だった。
あと女の子の応答もYes/Noだ。
0185デフォルトの名無しさん
2011/05/21(土) 23:11:01.230186デフォルトの名無しさん
2011/05/21(土) 23:54:31.20http://www.geocities.jp/m_hiroi/prolog/prolog02.html
部分集合の判定
selects([], Ys).
selects([X | Xs], Ys) :- select(X, Ys, Ys1), selects(Xs, Ys1).
0187デフォルトの名無しさん
2011/05/22(日) 00:13:53.59はい、自分もそこを見て
selects(Xs,Ys,Z):-selects(Xs,Ys),length(Xs,Z)
みたいにして要素数Zの部分集合を得て、さらに並べ替えがいらないんで
selects(Xs,Ys,Z):-selects(Xs,Ys),length(Xs,Z),sort(Xs,Xs).
みたいにしたんですが、なんかすごくブサイクな感じなんでなんかないかなーと思いまして
0188デフォルトの名無しさん
2011/05/22(日) 00:33:02.43これが富豪か
0189デフォルトの名無しさん
2011/05/22(日) 02:41:57.82http://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.
0190デフォルトの名無しさん
2011/05/22(日) 03:13:51.21うおーこんなのまで乗ってるんですね。
ありがとうございます。
0191デフォルトの名無しさん
2011/05/27(金) 23:13:42.01いや、個人的には活用してるけど、俺みたいな言語おたく以外の
普通の学生が、カットの挙動やら、失敗駆動ループやらを
頑張って勉強する価値はあるのかな。
たぶん、大多数はprologなんて一生使わないと思われる。
0192デフォルトの名無しさん
2011/05/28(土) 00:09:52.150193デフォルトの名無しさん
2011/05/28(土) 00:13:38.05そもそも何を論破したいの?
0194デフォルトの名無しさん
2011/05/28(土) 03:31:59.08今後使うためとしか答えられない。我々の思考に最も
近い言語はやはりこの言語なのであって、その事が
評価される時が再び来るということだろう。
興味深いことは、結構優秀な学生にとっても
Prologは決してやさしくはないということ。これが謎。
0195デフォルトの名無しさん
2011/05/28(土) 05:00:47.97それと、Prologはappendだけで書く言語です、と教えなかったら、
教えるほうが間違っている。
0196デフォルトの名無しさん
2011/05/28(土) 08:26:06.18大学の講座は論理学絡みだからね。前提が。
実務では、実際appendしか使いませんね。
append使うためにはリストに取らなくては
ならないから、変換器として、findallは
多用するけどね。
0197デフォルトの名無しさん
2011/05/28(土) 08:33:14.38学ぶ意義のある言語というと、JavaとかCとか?
つまらん学校だw
本当の学校ってのは、遊びに行くところ。
prologの授業受けてトラウマ/コンプレックス/やみつきになるくらいでちょうど良い。
0198デフォルトの名無しさん
2011/05/28(土) 08:36:19.95prologで普遍的な価値があるのは純粋論理の部分だけじゃないか。
0199デフォルトの名無しさん
2011/05/28(土) 09:07:38.68述語は非決定性に定義しておいて、
findallでリストに取り上げ、非決定性の
appendで切りだして処理するだけ。
アセンブラよりも遙かに単純でパターン
も少ない。
>>191 カットなんて、決定性にする
サインとしてしか使わないし、何が
難しいのだろう。
0200デフォルトの名無しさん
2011/05/28(土) 09:22:22.26100%教え方が悪いんだろうね。大学の先生方のね。
0201デフォルトの名無しさん
2011/05/28(土) 09:54:25.63まあ、逆に言えばその程度のものでしかないから、
必要になってからハウツー本でも買って読めばいいので、
大学で教えるほどの価値はないね。
0202デフォルトの名無しさん
2011/05/28(土) 10:34:32.82私もそれで十分だと思うけど。
0203デフォルトの名無しさん
2011/05/28(土) 10:43:29.71そんなものに多大な国家予算をつぎこんだ日本って…
0204デフォルトの名無しさん
2011/05/28(土) 11:07:06.71私に関しては、言い得て妙ということになるけど。
一般論としては言語はやさしいほどよいということも
言える。第五世代プロジェクトについていうと
Prologマシンに拘ったのがどうかな。
0205デフォルトの名無しさん
2011/05/28(土) 15:33:51.21>学生がprologを学ぶ意義
教養。
0206デフォルトの名無しさん
2011/05/28(土) 15:37:15.41>Prologは決してやさしくはない
手続き型がマシなだけで、関数型も論理
型も宣言型も同等にわかりにくいんだろ。
トップダウンのルールベースってのが
鬼門なんだろうな。
オレも、ややこしくなると結局、逐次的に
手続き的に処理を追っかけていくしな。
0207デフォルトの名無しさん
2011/05/28(土) 16:29:30.760208デフォルトの名無しさん
2011/05/28(土) 16:48:35.26?- 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.
?-
0209デフォルトの名無しさん
2011/05/28(土) 18:19:29.52?- 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.
?-
0210デフォルトの名無しさん
2011/05/28(土) 18:24:29.21select(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.
?-
0211デフォルトの名無しさん
2011/05/28(土) 18:40:40.85nth/3 の定義
nth(Nth,List,X) :- length([_|L0],Nth),append(L0,[X|_],List).
0212デフォルトの名無しさん
2011/05/28(土) 19:07:00.82カンマで括られた文字列の検索(_文字列,_適合文字列) :-
atom_chars(_文字列,Chars),
append(_,[','|L1],Chars),
append(L01,[','|_],L1),
\+(append(_,[','|_],L01)),
atom_chars(_適合文字列,L01).
0213デフォルトの名無しさん
2011/05/28(土) 20:29:06.720214デフォルトの名無しさん
2011/05/28(土) 21:25:53.31自分のやってることの意味を考えずに生きてきて、
ついにコードを見せることしかできなくなった
哀れな技術者の末路です
そっとしておいてあげてください。
このスレ 残滓で満ちてそう…
0216デフォルトの名無しさん
2011/05/28(土) 22:46:02.81俳句が仮に三句から構成されているとすると、
少なくとも六通りのPrologコードが書けるということ。
Prologプログラマは饒舌にならなくては。
0217デフォルトの名無しさん
2011/05/28(土) 22:51:48.86そうやって、無意味なことに貴重な税金を無駄遣いしてきたわけか。
0218デフォルトの名無しさん
2011/05/28(土) 23:20:33.96文章の構成が変わることによって当然意味が変わる。
意味が変わったことに敏感にプログラミングできるか
ということだけど。無意味と論証するのも難しいだろう。
0219デフォルトの名無しさん
2011/05/28(土) 23:28:52.02それは70年近いプログラミングの発展史のなかでどう位置づけられるの?
それを語らずにコードを垂れ流しても何の意味もない。
0220デフォルトの名無しさん
2011/05/29(日) 03:43:12.57http://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/
0221デフォルトの名無しさん
2011/05/29(日) 06:49:35.85>従来のCやC++との違いは、インターネット経由でアプリケーション・サービスを提供するWebサービスに対応すること
日経・・・
0222デフォルトの名無しさん
2011/05/29(日) 07:38:29.49> 大手物流会社のシステム子会社で新技術の社内展開を進めるマネージャーはこう言い切る。
> ここでいうプログラマとは、企業情報システムの開発プロジェクトでプログラムを作成する担当者を指す。
お前ら、もう要らないらしいw
0223デフォルトの名無しさん
2011/05/29(日) 07:53:41.82>>221
どうして日経エレクトロニクスとか日経メカニカルとか、のようなレベルの記事を
書けないのかねぇ。
0224デフォルトの名無しさん
2011/05/29(日) 08:26:23.42「ツール導入で生産性が20倍になりますので、人員を1/20に削減します」
0225デフォルトの名無しさん
2011/05/29(日) 08:50:03.16それで会社が潰れても責任は全て株主が負う。
気にするな。
0226デフォルトの名無しさん
2011/05/29(日) 08:52:30.240227デフォルトの名無しさん
2011/05/29(日) 09:27:54.50使うのはやめて欲しい。
0228デフォルトの名無しさん
2011/05/29(日) 09:52:32.48使ってみたことあるのかい?
0229デフォルトの名無しさん
2011/05/29(日) 12:15:34.41.NETをインターネットの事か何かだと思ったんだろうな
0230デフォルトの名無しさん
2011/05/31(火) 08:36:17.56「発展」史については興味ないけど、
中江俊夫の「語彙集」みたいなものが、
書ければ面白いね。
0231デフォルトの名無しさん
2011/06/01(水) 12:41:08.980232デフォルトの名無しさん
2011/06/04(土) 16:42:06.23流行りの(?)DSLとかの代わりにならないかな
0233デフォルトの名無しさん
2011/06/04(土) 18:05:49.85これ以上向いている言語はないと思うけど。
速度を要求されない、複雑化の可能性のあるロジックに
ついては、開発速度、プログラマの養成の容易さ、
保守のしやすさ、全ての点で優れている。
欠点はオブジェクト指向言語でなくて、.NETから外れて
いることかな。
0234デフォルトの名無しさん
2011/06/04(土) 20:53:49.88なんで普及していない/普及しなかったんだろう?
0235デフォルトの名無しさん
2011/06/05(日) 06:47:44.50'親子'('茂雄', '一茂')
.
のような日本語述語や日本語の項はUTF-8で書いて、
クォートでくくれば読み込めるんですが
listing しても文字化けしています。
日本語述語で問い合わせしても、そんな述語はないといわれます。
何か設定等必要なのでしょうか?
環境はwindows xp sp2です。
0236デフォルトの名無しさん
2011/06/11(土) 18:07:04.52>>747
http://www.swi-prolog.org/versions.html
UTF-8対応は5.6.x(開発版では5.5.x)から
0237デフォルトの名無しさん
2011/06/11(土) 18:08:07.510238天使 ◆uL5esZLBSE
2011/07/01(金) 18:39:03.66ハッァァアァァァァァァアァアアァァァ?????????????
ゴミは何いってもゴミ
ゴミが口を開くな
0239デフォルトの名無しさん
2011/07/11(月) 10:57:06.090240デフォルトの名無しさん
2011/07/13(水) 20:40:07.15マルチコア時代の今なら並列prologとか出てこないかしら?
0241デフォルトの名無しさん
2011/07/13(水) 21:37:00.70concurrent prolog
parlog
ghc
kl1
strand
0242デフォルトの名無しさん
2011/07/13(水) 23:41:15.56すごいなお前勘違い全く以てしないのか
人をけなす前にもっとそのスキルを社会に役立てましょう^^
0243デフォルトの名無しさん
2011/07/14(木) 04:09:18.840244デフォルトの名無しさん
2011/07/14(木) 14:41:46.26並列(並行)Prologということではありませんが、
AZ-Prologでは、マルチコアに割り振ることを、
処理系に委託することはできます。
0245デフォルトの名無しさん
2011/07/15(金) 03:23:58.99こういうのとか
http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.21.1017
0246デフォルトの名無しさん
2011/07/15(金) 05:33:59.23http://nojiriko.asia/prolog/c135_256.html
AZ-Prolog処理系作者によって書かれたMPIライクな
マルチプロセス並列処理機能の使用プログラム。
0247デフォルトの名無しさん
2011/08/21(日) 10:38:06.340248デフォルトの名無しさん
2011/08/22(月) 09:38:53.460249デフォルトの名無しさん
2011/08/22(月) 15:03:23.52�d
javaツールに組み込んでみるんや
0250デフォルトの名無しさん
2011/09/07(水) 11:51:09.81同じ事をする場合、手続き的言語と比べて明らかに効率が悪くなる処理とかありますか?
例えばユニフィケーションって処理的にかなり重い気がします。
他にも配列と比べるとリストでは先頭の値しか扱えないとか、再帰呼び出しで
(一つ減らして)全要素を毎回コピーするとか手続き型の先入観を持ってると
効率が悪い気がするのですが、理屈の上では処理が増えるとか言う事は無いのでしょうか?
記憶領域もN^2/2とか必要になりそうですし。
ユニフィケーションのコストってどの位と見積もれるものでしょうか?
事実の数が10倍になると10倍の処理が必要なのですか?
それともSQLのインデックスみたいな事、もしくはキャッシュみたいなものを持っていて
それ程増えないのでしょうか?
変な事を書いているかも知れませんので、疑問自体がおかしいみたいな指摘でも結構です。
よろしくお願いします。
0251デフォルトの名無しさん
2011/09/07(水) 18:21:14.48Prologは最も速いコンパイラ言語の100倍以上遅いでしょう。
その理由の過半がユニフィケーションと変数の繰り返し出現検査に
あると思います。指摘されたように配列がないこともある場合には
原因となります。それに比べればトレイルスタック等の追加的処理は
大きなコストになっていないはずです。
明らかに遅くて使えないのはビットマップの処理ですね。繰り返し
数百万のビットに対して演算する場合です。RPGも無理でしょう。
Prologはオンメモリデータベースですから、そこそこ速いのですが、
Prologが再起するためには、あなたが指摘したとおり、インデックス
などによる最適化によって、定義アトムを検索する能力を高める
必要があると思います。現在のレベルでは、数百万節の検索を
掛ける気になりません。
0252250
2011/09/07(水) 19:29:25.63丁寧な回答ありがとうございます。
確かにエンコードなんかで大量のデータをランダムに走査するとか不得意そうですね。
100倍程度なら何とか許容出来るのかもしれません。
ただ、ユニフィケーションの実際の動作が見えないのが気になるんです。
現在の処理系では検索用のヒントみたいなのは指定出来ないと言う事ですよね?少し不安です。
全体で100万件位の事実を想定しているもので。
ユニフィケーションの速度を上げたいのですが、
事実を分割して該当しそうなもののみ指定して検索させるとか可能でしょうか?
(デーブルを分割する様なイメージです)
グループ分けの規則を介する事になってかえって遅くなったりします?
0253デフォルトの名無しさん
2011/09/07(水) 20:17:55.44PSI(新世代コンピュータ開発機構が開発したPrologマシン)では
確か、第一引数にハッシュでインデックスが自動付加されたように
記憶していますが、その程度のものはコンパイラにはあると思います。
しかし、全ての引数にBtreeに類するインデックスを設定できる
コンパイラはないのではないか。
0254250
2011/09/07(水) 21:39:48.53ありがとうございます。
とすると件数を絞れる様なものを第一引数にすると良いと言う事ですね。
考慮してみます。
0255デフォルトの名無しさん
2011/09/13(火) 00:06:34.910256デフォルトの名無しさん
2011/09/13(火) 00:18:33.330257デフォルトの名無しさん
2011/09/13(火) 00:21:14.760258デフォルトの名無しさん
2011/09/13(火) 00:23:26.600259デフォルトの名無しさん
2011/09/14(水) 01:28:33.810260デフォルトの名無しさん
2011/09/14(水) 01:36:13.380261デフォルトの名無しさん
2011/09/20(火) 07:51:09.68定義する他ありませんね。
友達.
友達.
友達.
0262デフォルトの名無しさん
2011/09/20(火) 08:03:20.000263デフォルトの名無しさん
2011/09/20(火) 11:25:37.870264デフォルトの名無しさん
2011/10/06(木) 20:49:10.98>>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).
あんまり論理プログラミングっぽくはないが
0265264
2011/10/06(木) 21:07:32.12ストリーム指定なしから呼び出すようにしたほうががスマート
get_line(Line):- current_input(Stream), get_line(Stream,Line).
get_line(Stream,Line):-
〜〜
get_char(Stream,C),
〜〜
current_input/1 が無ければ seeing/1 でも使うべし
0266デフォルトの名無しさん
2011/10/07(金) 20:59:08.63get_line(Line) :-
findall(C, (
repeat,
get_char(C),
(C = '\n', !, fail; true)), X),
(append(Y, ['\r'], X), !; Y = X), atom_chars(Line, Y).
0267264
2011/10/09(日) 21:23:06.10標準入力かファイルからの入力で、一行読むとき、
キャリッジリターンが行中に出てくるシチュ、
それからもし出てきたとしてそれを生かしておく意味、
というのが想像つかないので、解説よろしくお願いしますっ
0268デフォルトの名無しさん
2011/10/10(月) 09:24:01.55内容を勝手に改変しちゃうような処理に一般的な名前を付けちゃうのはどうかと思いますっ!
get_line_without_CRとでもしてはどうでしょうかっ
0269デフォルトの名無しさん
2011/10/10(月) 11:24:47.45ISO標準になっていないこのような定義は、どんなものを標準的なライブラリに
加えればよいか、まだ手探りの状態ですから、このような細かな点を議論する
ことに意義があると思います。できるだけ、細部を反映するような述語名を
与えるべしとするのは卓見だと思います。
0270264
2011/10/10(月) 18:46:18.46本当に、何か見落としがあるなら教えて欲しかったし、
煽ったつもりはなかったんだけど
自分のコードは、>>73 で追加されたCR無視などを参考に、
書き方を変えただけのものなのだが、
ちゃんと 'end_of_file' を扱っていないとかアウトだ・・・ゴメン
もし入出力として一般化したいなら、
一文字入力の時に改行コードがどうなるかの標準に照らして書く、
の一点だと思う。
が、標準がある項目についても沿っていない処理系も多いPrologなので、
現状、挙動にあわせて処理を書くしかないのでは?
そうなると、単体CRを改行扱いした方がいい環境や、
単体LFを改行扱いしてはいけない環境もありそうだが
0271264
2011/10/10(月) 18:48:13.44なんて議論の、末端にいる気持ちすらなかったし、
名前に拘りがある訳でももちろんなく、
get_line_without_CR は確かに実態に則した名前だと思うので、
そのような名前が必要な場合には各場で命名すればいいと思う。
ああ、必死だな、おれ
めっちゃ恥ずかしい
Prolog初心者スレって敷居高いな・・・
しばらくROMってます
0272264=270
2011/10/10(月) 18:57:55.89>現状、挙動にあわせて処理を書くしかないのでは?
という段落の次に、
「だから俺自身は、実務上必要そうな実装の雛形の一提案をしたつもりでしかなかったので」
を挟んで、
>>どんなものを標準的なライブラリに加えればよいか
>なんて議論の、末端にいる気持ちすらなかったし、
に続くつもり。
なんだか意味のない煽りにしか見えなかったのが、
言い訳がましく見えるようになる一文を加えさせていただいて、さようなら
0273デフォルトの名無しさん
2011/10/12(水) 10:53:53.39'\r'は一応アルファベット扱いするしかないと思う。
なぜかというと、
?- ・・・concat_atom([_行1,_行2,_行3],_区切り文字,_ファイル全体の文字列),
というような処理は日常的に存在する。完全に復元するには、行に分解した際の
改行コードがなんであったかをファイルごとに出力モード引数で取得して
保存しておかなくてはならないが、これはあまりにも煩雑。
行の中に'\r'や'\n'を含めるのは実務的にさらに不可。ということになります。
0274デフォルトの名無しさん
2011/10/18(火) 23:18:23.050275デフォルトの名無しさん
2011/10/18(火) 23:39:33.530276デフォルトの名無しさん
2011/10/19(水) 00:07:32.26ありがとう
見てくる
0277デフォルトの名無しさん
2011/10/19(水) 00:24:36.08(たぶん、リスト内包表記使わない方法だと同じくらいのコード量)
prologにはリスト内包表記に相当するものは無いのでしょうか?
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).
0279デフォルトの名無しさん
2011/10/19(水) 06:47:22.49おお!!
ありがとうございます
アルゴリズムの読み易さは関数型言語と大差無いんじゃないかと言う予想は、当たってそうで安心しました
(私にはまだまだprologの文法に馴染めてませんが)
0280デフォルトの名無しさん
2011/10/22(土) 13:46:29.580281デフォルトの名無しさん
2011/10/22(土) 14:02:35.00partitionで分解する所がPrologの値打ちなんでね。
0282デフォルトの名無しさん
2011/10/22(土) 16:30:19.49縦に長いか横に長いかの違いに見えるが。。。
0283デフォルトの名無しさん
2011/10/22(土) 16:47:53.03http://nojiriko.asia/prolog/quicksort_nihongo.html
のようなコードにあるので、関数型言語と比較するの適切ではない。
0284デフォルトの名無しさん
2011/10/22(土) 18:15:36.25なかなか面白いページだな
http://nojiriko.asia/prolog/index.html
0285デフォルトの名無しさん
2011/10/22(土) 23:23:48.25http://www.ifcomputer.com/IFProlog/Manuals/v4.1/reference/for/home_en.html
Prologって全然直感的じゃないな
0286デフォルトの名無しさん
2011/10/22(土) 23:51:13.94これはC言語等の下劣な仕様に阿っているのが悪いのであって、
第二引数と第三引数を交換するだけで、
(分かりやすくするため 最終値 >= 初期値 のケースだけにする)
for(_初期値_式,_最終値_式, _カウンタ) :-
_初期値_式 > _最終値_式,!,fail.
for(_初期値_式,_最終値_式, _カウンタ) :-
_カウンタ is _初期値_式.
for(_初期値_式,_最終値_式, _カウンタ) :-
_初期値_式_2 is _初期値_式 + 1,
for(_初期値_式_2,_最終値_式, _カウンタ).
当たり前のPrologの述語となる。強いてちょっと
気持ち悪いのは第一節の !,fail. くらい。
0287デフォルトの名無しさん
2011/10/22(土) 23:59:17.38直感的に書ける処理が手続き型とは根本的に違う、と考えたほうがいい
むしろ手続き型で書き辛い処理が書きやすい言語って感じるよ俺は
0288286
2011/10/23(日) 00:10:58.32foo(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と同じ機能となる。
(ただし繰り返しが多くなるとスタックオーバーフローが起きるかも知れない)
0290デフォルトの名無しさん
2011/10/23(日) 00:14:27.91for(Lower,X,Upper) :-
Lower = X ; for(Lower+1,X,Upper).
0291デフォルトの名無しさん
2011/10/23(日) 00:19:43.74そうですか。早く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と近いんだろうけど、 かなり趣が異なる感じ…。
0292デフォルトの名無しさん
2011/10/23(日) 00:30:08.03立派なコードだと思うけど。
0293デフォルトの名無しさん
2011/10/23(日) 03:56:31.01素朴な疑問だが、間に処理を入れられるように見えないんだが・・・
(そもそも、繰り返しはPrologも再帰が基本だと思うんだが・・・)
0294デフォルトの名無しさん
2011/10/23(日) 04:32:16.76ここでやってるforはCやJavaのforとは無関係で、Haskellの[from..to]みたいなもの。
処理は、
for(L,X,H), do(X,C).
みたいに書いて、最後にfailさせるかメタ述語で全解生成する。
Haskellなら[ do x | x <- [from..to]]だね。
0295デフォルトの名無しさん
2011/10/23(日) 04:51:07.54そうなのか・・・
いまいちどういう結果が出るのか良くわからん・・・
0296デフォルトの名無しさん
2011/10/23(日) 07:21:02.39数値を順に生成するもの。
?- 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]
0297デフォルトの名無しさん
2011/10/23(日) 11:25:08.28ふーむ・・・
数列をただ生成してるだけだけど、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に使い方が近くなるのか
0298デフォルトの名無しさん
2011/10/23(日) 11:27:36.00>for n f m s fn = [fn x | x <- [n,(s n)..m], f m n == False]
の"fn"は無視して・・・
0299286
2011/10/24(月) 08:20:39.22は適切な書き込みでありませんでした。恐縮ですが、無いことにしてください。
0300デフォルトの名無しさん
2011/10/24(月) 16:05:09.28for/3の典型的な使い方。 findall/3 の中で使う。
ふたつ取り出す(_リスト,_一つ目,_二つ目) :-
length(_リスト,_リストの長さ),
findall(N,for(1,N,_リストの長さ),L),
順列(L,2,[M,N]),
nth1(M,_リスト,_一つ目),
nth1(N,_リスト,_二つ目).
?- ふたつ取り出す([赤,青,緑],_一つ目,_二つ目).
_一つ目 = '赤',
_二つ目 = '青';
_一つ目 = '赤',
_二つ目 = '緑';
_一つ目 = '青',
_二つ目 = '赤';
_一つ目 = '青',
_二つ目 = '緑';
_一つ目 = '緑',
_二つ目 = '赤';
_一つ目 = '緑',
_二つ目 = '青';
false
0301デフォルトの名無しさん
2011/10/24(月) 19:07:03.79ご存知かもしれませんが、select/3を使うと、もっとシンプルに書けますよ。
choice2(L, E1, E2) :- select(E1, L, L1), select(E2, L1, _).
0302デフォルトの名無しさん
2011/10/24(月) 21:04:25.60for/3の用例集を追加しました。
http://nojiriko.asia/prolog/for_youreishuu.html
0303302
2011/10/24(月) 21:07:52.52正しく実行されません。forの使い方の例として見るためのものとしてください。
0304デフォルトの名無しさん
2011/10/26(水) 14:30:19.35そうですね。nth1/3はほとんど使いませんね。
0305デフォルトの名無しさん
2011/10/26(水) 17:32:24.68素直に気合いの入ったページだと思ったけど、
その後すぐに「医者の不養生」という言葉が思い浮かんだw
0306デフォルトの名無しさん
2011/10/27(木) 20:03:54.30ページ内索引を設けるなどして、参照しやすく作られていると助かります。
0307デフォルトの名無しさん
2011/10/27(木) 20:45:58.35順不同の2300題のうち約300題を抜き取ったもので、どんな索引を
作るかなど、課題山積ですね。for/3述語から始まるループに名前が
付けられれば、索引は作りやすい。for/3は最も名前を与えにくい述語
ですが、これに限らず部分計算のかけらに適切な名前を与えることが
現在のそしてこれからのテーマです。
0308デフォルトの名無しさん
2011/10/27(木) 20:52:43.37前の方から抜き取っただけで・・・ ですね。
0309デフォルトの名無しさん
2011/10/27(木) 20:56:56.62ブログ形式にするのはいかがでしょうか?
ブログのタグ機能を使えば、管理も参照もしやすくなるように思います。
0310デフォルトの名無しさん
2011/10/27(木) 21:03:23.89「英語活用大辞典」と「囲碁定石大辞典」という2つのタイプ、機能のミックスです。
1) ある述語の具体的な定義節を参照可能で
2) できるだけ多くの、出来れば公開(出版)された全てのProlog述語の定義節が網羅されて、
3) 一つのテーマ、課題をもとに詳細な変化譜を展開する
使う人がいるかどうか疑問ですが、私一代では仕上がりません。
0311デフォルトの名無しさん
2011/10/27(木) 21:17:24.15それぞれに読んだ人が部分部分にコメントをつけたり誤りを指摘したり
できるから、おもしろい利用法かも知れませんね。# から始まる課題の
コピーの他に要約を付けていけばいい。ただし、私は医者や紺屋ほど
専門家ではないけど、ブログって実は使ったことがない。作ったことも。
0312デフォルトの名無しさん
2011/10/28(金) 12:11:43.15以前は定石大辞典だった気がする。瀬越憲作名誉九段の監修。
0313デフォルトの名無しさん
2011/10/28(金) 18:22:41.9724時間で15~20ツイートを常に維持している。
4-5月ころは3~5平均だったから、相当の増加。外国語のツイートはさらに
爆発的で5倍どころではない。
0314デフォルトの名無しさん
2011/10/28(金) 18:28:01.500315デフォルトの名無しさん
2011/10/28(金) 18:53:04.118月から「7つの言語 7つの世界」の影響で2倍以上の書き込みになった。
外国の事情は、よく判らないけど、似たようなことが起こっているようだ。
9月後半からの急増は相乗効果ではないか。過去の遺物といった否定的な
先入観による書き込みはほとんどなくなり、面白いという書き込みが突然
増えた。
0316デフォルトの名無しさん
2011/10/28(金) 19:00:13.440317デフォルトの名無しさん
2011/10/28(金) 19:35:17.42宣言型言語の一つである論理型言語(Prolog)にも関心が増えたのではないかと推測
あとはCoqのような実用的な定理証明系が登場して一般人向けの情報が増えた
(実用的といっても....だし、一般人といっても.....だけどね)
その結果として「論理とプログラミングとの関係」について考える人が増えたのかも
物事を形式的にモデル化するには関数だけでは足りなくて、論理も必要になるから
0318デフォルトの名無しさん
2011/10/28(金) 20:06:42.91確かにそんなことをつぶやいてる人が結構いる。関数型への関心の波及効果と
いうのも。対で語られることも多い。
0319デフォルトの名無しさん
2011/10/28(金) 20:57:19.140320デフォルトの名無しさん
2011/10/28(金) 21:08:44.19銀の弾丸みたいだったのかな
0321デフォルトの名無しさん
2011/10/28(金) 21:28:30.72過大評価されたし、バブル期でもあった。
Prologプログラマを派遣してもらうにはひとり120万/月とか。
ナレッジエンジニアの必須技術とされた。実はプログラマ数は
あまり増えなかったが、一応メジャー言語の末席。bit誌などの
広告ではProlog処理系が他を圧倒していた。
企業がPrologを見限って、C++に移行して急速に衰退した。
PrologでやりかたったことをC++でできるというわけではなく、
AI技術発展のお裾分けにあずかるという目論見はその時点で
挫折。
0322デフォルトの名無しさん
2011/10/28(金) 23:41:01.710323デフォルトの名無しさん
2011/10/29(土) 00:26:01.260324デフォルトの名無しさん
2011/10/29(土) 00:29:29.960325デフォルトの名無しさん
2011/10/29(土) 00:36:42.49すいません。今試したら、コマンドプロンプト上でswipl.exeが問題なく動作しました。
以前、あんなにはまったのは何だったのだろう…
0326デフォルトの名無しさん
2011/10/29(土) 05:14:40.59再インストールしたらswiplに変わってて焦った;;
0327デフォルトの名無しさん
2011/10/29(土) 13:00:09.12のmax/2の実装を見て、もっと簡潔に書けそうな気がしたのでチャレンジしてみました。
% max_list(_リスト, _リストの中の最大値).
max_list([_唯一の要素], _唯一の要素) :- !.
max_list([_先頭要素 | _残りのリスト], _最大値) :-
max_list(_残りのリスト, _残りのリストの最大値),
(_先頭要素 @> _残りのリストの最大値 ->
_最大値 = _先頭要素 ;
_最大値 = _残りのリストの最大値).
accumulatorを使うか使わないかの違いしかないですね…
0328デフォルトの名無しさん
2011/10/29(土) 13:02:51.49X = 75.
ん?これでいいのか…?
0329デフォルトの名無しさん
2011/10/29(土) 13:37:42.77Prologの代入(単一化)とは、そういうものじゃないかと思われ
0330デフォルトの名無しさん
2011/10/29(土) 14:25:17.01要素位置番号も要求されているので一引数増えていますが、
http://nojiriko.asia/prolog/c152_883.html
の方が普通の最大値述語に近いと思います。四通り作って見ました。
0331330
2011/10/29(土) 14:26:44.600332デフォルトの名無しさん
2011/10/30(日) 00:29:44.58Lispのマクロ的な使い方や、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
0334デフォルトの名無しさん
2011/10/31(月) 00:52:16.750335デフォルトの名無しさん
2011/10/31(月) 05:02:43.89できないものが何があるかだろう。百万回以上の繰り返しが当然の領域。
OS。数値解析。ビットマップ処理。大規模事務計算(トランザクションが1千万を超えるようなもの)。
0336デフォルトの名無しさん
2011/10/31(月) 14:43:54.61事務処理のバッチ処理でデータベースアクセス時間+Prologの演算時間として
後者にどれくらい許されるかということだろう。1時間だと2000万トランザクション
3時間だと5000万は超えるから、一部上場企業の95%以上クリアできると思うけど。
0337デフォルトの名無しさん
2011/10/31(月) 21:47:52.41prologからwin32apiとかdirectxとかで画像表示もできる?
0338デフォルトの名無しさん
2011/10/31(月) 22:47:34.81Visual Prolog という製品(昔BorlandのTurbo Prologといった)上で開発された
ゲームというのは見たことがあるけど、激しく画面が動いていた記憶以外、ゲームには
関心がないからどういう種類のものかわからないし内容も覚えていない。
他の処理系もそれぞれグラフィックインターフェイスを謳っているようだけれど、
ゲームに適したものかどうかは知らない。
0339338
2011/10/31(月) 22:52:56.59時間がかかり過ぎて動かないはずだから、そういうことはしていないか、
別のからくりがあるのだと思う。
0340デフォルトの名無しさん
2011/11/09(水) 21:59:04.100341デフォルトの名無しさん
2011/11/09(水) 23:01:40.86累算器を使えば可能
0342デフォルトの名無しさん
2011/11/14(月) 05:29:23.97Prologは急伸。10月は0.288 だったのが 0.353
23%上昇し、一気にHaskellを追い抜いた。
0343デフォルトの名無しさん
2011/11/14(月) 06:51:58.566月は0.227くらいだったから、56%の上昇か。
0344デフォルトの名無しさん
2011/11/14(月) 06:59:23.04そうはいかないけどねw
0345デフォルトの名無しさん
2011/11/14(月) 07:24:15.362006年5月がPrologは0.384 で25位だから、上位に新言語や対象とする言語に
加えられた言語が入ってきたから順位が落ちたと読むことができる。
それと、Prologという語はプログラム言語以外に使われるケースが増えているから、
INDEX作成時にこれをどう除去するかで、全く数字が変わってきてしまう。
ここ数ヶ月はたしかにGoogleの検索数やtwitter数が急増しているが、
最終的にはその匙加減ということになる。
0346デフォルトの名無しさん
2011/11/15(火) 04:34:45.80元々、求人数なんかは減ってなかった。日本ではさっぱりだが。
0347デフォルトの名無しさん
2011/12/07(水) 06:23:03.84http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
Prologは 37 -> 33位とさらに続伸。
前月のシェア 0.353 -> 0.408 に、前年同月と比較すると195%の上昇。
COBOL,VB.NET,F#を抜き去った。来月はSchemeを抜くだろう。
0348デフォルトの名無しさん
2011/12/07(水) 07:19:36.18論理型の盟主ということで、パラダイムシフトの時期には
注目されるということだろう。関数型は分散するからね。
それにしても、近い将来のErlang,Prologの20位以内揃い踏みは
確実のようだね。
0349デフォルトの名無しさん
2011/12/07(水) 07:26:52.840.403じゃないか?
0350デフォルトの名無しさん
2011/12/07(水) 21:00:58.91いろいろと考えてみてメソッドはこれで合っていると思うのですが、
肝心の再帰処理でのリストの作成がわからなくて詰まっています。
どなたか助けてもらえないでしょうか?
//入力と出力
?- 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
*/メソッド
0351350
2011/12/07(水) 21:19:01.01数列の最後のナンバーの取り出し方や、計算部分はなんとかなったのですが
新しいリストを作成していく方法がどうにも。
0352デフォルトの名無しさん
2011/12/07(水) 23:00:04.07next_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.
0353350
2011/12/08(木) 05:38:55.07nextItem_0([X1,X2|XS], [Y|YS], N),の部分で差分を別のリストに入れていくんですね。
これは自力では無理でした。
これでテスト勉強に入れます、ありがとうございました。
0354デフォルトの名無しさん
2011/12/08(木) 06:38:02.94例えばということになるが、リストの要素が自然数かつ上限が決まって
いるという場合は組込述語を全く使わず定義できるが。そうでないと、
is/2あるいはlength/2は必須。
問題文をできるだけ忠実に手続き的に解釈して述語を構成すると、
http://nojiriko.asia/prolog/prolog_350_1.html
のようになるのではないか。
0355デフォルトの名無しさん
2011/12/08(木) 06:53:05.23next_item_0([X], [], X) :- !.
next_item_0([X1,X2|XS], [Y|YS], N) :-
↑ここにカットが無いのは何か理由があるんでしょうか?
0356デフォルトの名無しさん
2011/12/09(金) 05:27:39.340357デフォルトの名無しさん
2011/12/10(土) 08:28:41.72f [] = 0
f xs = last xs + f (diff xs)
where
diff [x] = []
diff (x1:x2:xs) = (x2-x1):diff xs
こんな感じだろうけど、prologのコードだと全体が一様で問題の構造が
みえずらいね。
0358デフォルトの名無しさん
2011/12/10(土) 13:33:08.640359デフォルトの名無しさん
2011/12/10(土) 17:16:02.19ピラミッドリストを作らなくてもよいなら、
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.
0360デフォルトの名無しさん
2011/12/10(土) 17:28:25.55findall(Sub,(append(_,[N1,N2|_],L),Sub is N2 - N1),L1),
のようなコードで楽しめる。
0361デフォルトの名無しさん
2011/12/10(土) 18:37:08.110362デフォルトの名無しさん
2011/12/10(土) 19:03:03.16N1,N2が対になって左から右に移動する。そういう視覚的なところ。
0363デフォルトの名無しさん
2011/12/10(土) 21:37:06.68人にもよると思うけど、>357と>359を比べると個人的には>357の方が
頭のスタック使用量が少なくて理解しゃすい。
0364デフォルトの名無しさん
2011/12/10(土) 22:19:54.19findall/3は事実上SQLのselectだからそういうコードに慣れている人には
全然分かりにくくない。>>362とは違った見解を述べると、変数の束縛とその解放と
いうPrologの特長がfindallという枠組みのなかで明示的なバックトラックなしに
巧みに現れているという点で面白いと思う。
もうちょっと専門的にいうと、member/2ではできないことがappend/3で実現できている
というところが味噌なんだけれど。
0365デフォルトの名無しさん
2011/12/10(土) 22:24:07.98/ \ ┏┛
/ \ ,_\. ・
/ (●)゛ (●) \
| ∪ (__人__) |
/ ∩ノ ⊃ /
( \ / _ノ | |
.\ “ /__| |
\ /___ /
0366デフォルトの名無しさん
2011/12/10(土) 22:35:49.05findAllも使ってるし。
0367デフォルトの名無しさん
2011/12/10(土) 22:38:56.29findall(N,(member(M,[1,2,3]),N is M + 1),L),
のようなリスト要素の取り出し方をするのだけれど、>>359のように
2要素ずつ取り出す場合にはmember/2では不可能でappend/3だと
うまくいく。一般に
?- member(A,L). と
?- append(_,[A|_],L). は同義と思われているが、appendの方がスーパーで
あることを如実に示す例ということ。
0368デフォルトの名無しさん
2011/12/10(土) 23:52:34.14# 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で書くとどうなるの?
0369デフォルトの名無しさん
2011/12/11(日) 00:04:24.49like368(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する。一回真になる度に
第一引数に指定された項をリストに積んでいく。第二引数が最終的に偽になったら
リストの収集を必ず成功裏に了える。積み終わったリストは第三引数と単一化される。
0370デフォルトの名無しさん
2011/12/11(日) 00:12:52.32おお、すごいなあ....
findall/3にはこんな使い方があるんだね
勉強になったよ
% >>368とは別人desu
0371デフォルトの名無しさん
2011/12/11(日) 00:18:42.22ありがとうございます
memberとfindallの挙動とにらめっこしてたらだんだん分かってきました
ちなみにこれはリストの処理方法として一般的なコーディングですか?
大学の演習では習わなかった、というかrubyのArray#mapすらやり方が分からなくて困惑してました(笑
0372デフォルトの名無しさん
2011/12/11(日) 00:42:44.59最近はこの記法を使うことが多くなりました。万能ではありませんが、
この方が宣言的に読むことができる場合が多い。
>>357が指摘されているように、再帰的な定義が読みやすい宣言的な
定義であるとは限らないのです。
注意するべき事は、第二引数に来るSubgoalが非決定的な述語で
あるという点です。述語を定義するときに決定的に定義するか、
それともできる限り非決定的に定義を作って置くかいうことに成ります。
Prologの良さを引き出すためには、非決定的な定義をするスキルを
上げて、積極的にそのような定義をしていく方がいいようです。
0373369
2011/12/11(日) 09:17:01.68like368(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のような定義を省略します。こうすることによって再帰定義の
繰り返しをひとつ回避してほんの僅かですが宣言性を高めようと
しているのです。
0374デフォルトの名無しさん
2011/12/11(日) 09:43:08.70そうではないと思う。add_1/2が非決定性の述語と定義されているから
あるいは、定義することに決めたから、findall/3が必然になったのだ。
データ構造の設計で、リストからリストへと展開することを基本とする
なら、再帰述語中心の定義になるだろうし、
Prologの基本はデータベース述語(単位節)であって本質的に非決定性で
あることは避けられないという立場からの設計なら、集約述語である
findall/3の使用は必須のものとなる。
宣言性の強弱は確かにあるが些細な差であって、より重要なことはこの
ような設計上の差異である。
0375デフォルトの名無しさん
2011/12/11(日) 11:34:15.70非決定性というが、prologの場合、結果は順序まで含めて決定的。
この点ではSQLはまだ非決定性を持つが、結果を集合として考えるならやはり
決定的かな。
それと、単位節は要するに表でRDBと同じ。
その意味では、prologをprologたらしめているのは、単位節以外にあるといえる。
0376デフォルトの名無しさん
2011/12/11(日) 13:05:16.05これらの概念の組み合わせ方が本質だったりする場合があるので,
そういう場合は、AやBやCという概念を持ついろんなモノをまとめて表にしていくとぼんやりと見えてくる.
メンデレーエフが周期表を発見したときのように.
0377デフォルトの名無しさん
2011/12/11(日) 17:39:13.48Prologは非決定性モデルを、仕様の表に出さない決定的プロセスによって実装している
この立場に立つ人は、Prologでは、解の出現順序が決定的でなければ困るような問題を扱ってはならない
これの一番の利点はモデルを考えるとき(つまり論文を書くとき)に解を普通の集合として取り扱えること
逆に言うと、Prologの実装の決定性に依存するような問題を考えるときにはPrologの利点はなくなり、かえって実装が複雑になる
(もちろん、どんな問題であれ、解を効率的に見つけるというアルゴリズムを考えるときにはPrologの決定的な側面を厳密に考慮しなくてはならない)
0378デフォルトの名無しさん
2011/12/11(日) 20:01:37.69ISOの規格文書が見つからないので引用できないけど。
0379デフォルトの名無しさん
2011/12/11(日) 20:13:59.14こちとらAdobe Readerなんてはいってないんだよ
0380379
2011/12/11(日) 20:15:03.510381デフォルトの名無しさん
2011/12/12(月) 06:57:02.61Prologの単位節はもうこれ以上、書き換えることのない、どん詰まりの情報だ。
中島秀之氏はこれをプリミティブなものと表現したが。
RDBは列ごとに集合を表すが、Prologの単位節の引数にそういった意味合いは
まったくない。あくまでRDBに模して(RDBとの親和性といった)、引数部分に情報
を配置することが可能というだけ。
Prologのプログラムとはこのどん詰まりに導くためにルールが書かれていると
解釈できるのであって、どちらがPrologの根幹かなどと問うこと自体無意味だ。
0382デフォルトの名無しさん
2011/12/12(月) 07:03:09.67意味合いを持たせる持たせないの話なら使い手次第では?
0383デフォルトの名無しさん
2011/12/12(月) 07:26:04.30RDBの正規化とProlog項記述の関係については「考えたこともない」状態なので
俄にはまともな返信ができません。
0384デフォルトの名無しさん
2011/12/12(月) 07:43:31.73どちらにというとそうだけど、帰納論理プログラミングなんかは、
明らかに具体的な情報を基礎にルールを見つけて組み立てるという
方向のアプローチですね。そういう方向性のようなものは個々の
Prologプログラマの中にもあるということではないか。Prologを
証明器として捉える人は、ルール重視になるだろうし。
0385デフォルトの名無しさん
2011/12/12(月) 08:13:19.07単位節を主として、ルールを副と考えるよね。
このスレには昔から「prologの根幹は単位節」と唱える人がいるみたいだし。
それはprologの、ではなくデータベースの根幹だといつも思う。
0386デフォルトの名無しさん
2011/12/12(月) 08:55:46.87ルールだけでは成立しない一方、単位節だけでPrologプログラムが
成立してしまうということも言えるのではないか。
0388386<- ここをまちがえた
2011/12/12(月) 09:01:39.56ルールだけでは成立しないは言い過ぎか。なんて言えばいいのかな。
0389デフォルトの名無しさん
2011/12/12(月) 09:28:02.13ところがPrologの大きな魅力だ、というくらいでいいんじゃないか。
0390デフォルトの名無しさん
2011/12/12(月) 12:59:25.07ボディがtrueのルールがファクトなのでしょう?
ルールはファクトを包含しているのでしょう?
なら節は全てルールだけと言えるでしょう?
仮にファクトだけで成立するならそれは命題論理であって、一階述語論理ではない、つまりPrologではない。
0391デフォルトの名無しさん
2011/12/12(月) 16:09:09.71それだと、
先祖関係にはルールがあって、なぜ、親子関係には
ルール(本体)がないの?という問に答えられないよ。
0392デフォルトの名無しさん
2011/12/12(月) 16:33:00.97棄て去った解候補の順序が決まっているかどうかなんて関係あるかな。
■ このスレッドは過去ログ倉庫に格納されています