1 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 20:23:54 ] 過去スレ Prologでまったり Part3 pc11.2ch.net/test/read.cgi/tech/1193354806/ PrologでまったりPart 2 pc11.2ch.net/test/read.cgi/tech/1102664221/ Prolog でまったり pc5.2ch.net/test/read.cgi/tech/976462999/ リンク集 www.summa.jp/lang/logic/prolog.htm bach.istc.kobe-u.ac.jp/prolog/ チュートリアル www.amzi.com/AdventureInProlog/ computing.unn.ac.uk/staff/cgpb4/prologbook/ www.intranet.csupomona.edu/~jrfisher/www/prolog_tutorial/pt_framer.html bach.istc.kobe-u.ac.jp/prolog/intro/ www.geocities.jp/m_hiroi/prolog/ www.asahi-net.or.jp/~JF1T-YSD/prologV2/
231 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 09:01:54 ] >Prologは、導出において節を以下に述べる頭部が一つの命題からのみなる >ホーン節に限定したものととらえる事が出来る。 この文、変だよね。
232 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 09:06:20 ] "からのみなる" の検索結果 約 915 件中 1 - 10 件目 (0.21 秒)
233 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 09:38:12 ] "nominal horn clause"の検索結果 8 件中 1 - 8 件目 (0.28 秒)
234 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 09:42:59 ] >>231 確かに難解な文だな。 Prologでは導出される対象を頭部が一つの項に限定されたホーン節と 呼ばれる命題に限定している。 と言いたいのですか?
235 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 09:56:02 ] ちょっとかじった人なら読み飛ばして何事もなしだが…… 詰め込みすぎたか、あとで書く予定が面倒になったか。
236 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 10:17:36 ] >>234 私も素人なのだが。 ( P ∧ Q ) も一つの項でしょ。 そうすると (p1 ∧ p2) :- q1 ∧ q2 ∧ .... も許される事になっちゃうんじゃないの。
237 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 10:43:16 ] Prolog的混乱が生じてるねへっへっへ 「原子論理式」という言葉があるよ
238 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 11:22:05 ] ものの本によると、アタマのないやつも「ホーン節」のうちみたいよ。 質問とか、計算中の目標(ゴール)として現れるやつ。 アタマのあるやつ(Q∧R⇒P、P∨¬Q∨¬R、{P,¬Q,R}、P:-Q,R.)は 「頭部つきのホーン節」とか「プログラム節」とかいうらしい。
239 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 11:22:56 ] やべ × {P,¬Q,R} ○ {P,¬Q,¬R}
240 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 13:01:54 ] 古川康一著の「Prolog入門」より。 # ホーン論理とは,一階述語論理の命題をA1 ∨ A2 ∨ ... ∨ An ← B1 ∧ B2 ∧ ... ∧ Bm の # 形(節形式)であらわしたときに,左辺の句がたかだか一つしか現れないような命題のみ扱う論理 # である(ここで,A1,A2, ... ,An,B1,B2, ...,Bm は正の句である). すなわち,左辺に句が # 一つ現れるのか定義節であり,そこが空になるのがゴール節である(ゴール節を":-"から始めても # よいのは,そのためである).
241 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 13:05:44 ] >>240 句・・・か・・
242 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 13:19:13 ] 原子論理式、基本論理式、リテラル、句 は微妙に違いがあるのかな。リテラルは否定形を含むとか。
243 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 21:23:51 ] リテラルはそうでしょう
244 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 21:24:50 ] 「正の句」と言っているから 句=リテラル なのか
245 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 22:59:16 ] そうか「頭部つき」=「確定節」(DCGのDC)ということか
246 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:17:58 ] definite(明確な、限定的な など) definitive(確実な、限定的な、明確な、限定詞 など) definitional(definitionの形容詞形) definition(限定、明確化、定義、解像力 など) ややこしい
247 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 00:40:12 ] 第129回技術委員会議事録 www.itscj.ipsj.or.jp/protect/gijutsu/0606rpt.html > 1) SC22/WG17 SC22N4049 (投票期限: 2006-07-26) > (資料31) > Programming Language Prolog -- Definite clause grammar rules > 「プログラム言語Prologのための確定節文法規則」 > Q.1〜Q.3にYES,Q.4〜Q.6にNOとする回答案は,原案どおり承認された.(後藤SC22専門委員会幹事) この場では「確定節」なんだね
248 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 01:02:05 ] 小ネタ: FGHC(Flat GHC)をGDC(Guarded Definite Clauses)と呼ぶことがあるらしい
249 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 01:33:11 ] Logic for applications 著者: Anil Nerode, Richard A. Shore > (Ordered clauses are sometimes referred to as definite clauses, hence んー?これはなんか集合論の用語みたいな…
250 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 09:03:10 ] Prologなら使用人口も少ないだろうし、 論文ネタがゴマンとあって書きやすいんじゃないかと思って手を出そうとしてるところ 実際、どう?
251 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 09:15:34 ] >>250 あくまでも、プログラム言語であるという視点で、 ・ Prologのプログラムパターン ・ Prologのプログラミングスタイル ・ 得手とする領域とその典型的なプログラム の記述を重視して。 お願いします!!
252 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 09:20:45 ] >>250 ごめん、間違えた。勉強しようという話ですね。 論文ネタなら、ICOTの検証だけで事実上無限にあります。
253 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 09:34:53 ] >>251-252 >論文ネタなら、ICOTの検証だけで事実上無限にあります。 ウホッ、予感的中!感謝感激雨霰! マジで 人 生 賭 け て 研 究 す る 所 存 で あ り ま す でも、その前に紙の上での記号論理学や形式言語をもっと勉強しなければ、と今勉強中です
254 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 11:40:45 ] DCGトリビア発見 www.cs.kuleuven.ac.be/~dtai/projects/ALP/newsletter/may01/nav/nettalk.html > The reasons we concocted the term "definite clause grammar" had to do with the fact that (以下略)
255 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 04:00:35 ] ttp://www.hamid2.soft.iwate-pu.ac.jp/hamid1/professor/kure/Lecture/Prolog.pdf > Prolog のプログラムは、確定節(Definite clause)と呼ばれる節形式で、すべて記述する。 : > Prolog のなかで利用される確定節は、H とBiの数によって、ル−ル節、ファクト節、ゴ−ル節に分けられる。 > またル−ル節とファクト節をまとめて、定義節と呼ぶ。 ここでは確定節=ホーン節みたいに扱ってるね。 ただし一般論じゃなくてPrologに絞った話だからアレだけど。
256 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 07:37:38 ] >>215-217 何気にスルーしちゃったけど、「Colmerauer」はフランス語の発音の原則だと 「コルメロエ」みたいになると思うけど、そのへんどうなんだろう。
257 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 07:44:05 ] クルルァ
258 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 07:51:02 ] ○○が近いが△△あるいは□□とも書かれてきた
259 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 07:53:17 ] ちなみにおなじみC&M邦訳では「コルメロエ」だった
260 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 09:59:40 ] >>258 カタカナ表記の揺れの問題じゃなくて、 フランス語読みと英語読みの違いでしょ。
261 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 10:29:21 ] 仏語:コルムローエル 英語:コルマローアー では?
262 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 11:12:07 ] ttp://blog.livedoor.jp/drlingua_fr/archives/51177902.html ttp://blog.livedoor.jp/drlingua_fr/archives/51190690.html > 1)「ə」の発音となる場合 > @「e」の後ろに子音字が1つしか続かない場合(但し、単語末は除く) > ex) demain [dəmɛ̃] なるほど 語末rはきっと漏れには聞こえないのではないだろうか
263 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 11:27:20 ] blog.goo.ne.jp/lumieremondiale/e/e5b1b21b53807b0763ea239ffad4fc45 > 君のパリのアクセントが気に入らない! といいはるんですね。w
264 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 12:23:27 ] >>263 やっぱりコルメラウアじゃないか!
265 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 13:24:54 ] また新たな「確定節」解釈を発見。 『人工知能の基礎』(馬場口登・山田誠二共著)によると、 事実(fact)=単位節(unit clause) ルール(rule)=確定節(definite clause) 質問(query)=ゴール節(goal clause) らしい(p.75)。かなりパターンが揃ってきたねw
266 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 13:44:38 ] hagi.is.s.u-tokyo.ac.jp/pub/staff/hagiya/kougiroku/ronri/4.txt > 単位節(unit clause) > 一つのリテラルから成る節 > 正単位節(unit clause) > 一つの正リテラルから成る節 > 負単位節(unit clause) > 一つの負リテラルから成る節 どうして全部unit clauseなんだろう
267 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 14:26:18 ] あそうか、コピペ駆動開発みたいな感じか
268 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 00:56:10 ] The Birth of Prolog by Alain Colmerauer citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.85.7438
269 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 05:26:20 ] >>268 「clause」だけ検索してみたら ・ここではdefinite clauseという言葉を使っていない ・たまに「program(の)clause」のような言い方をする程度 ・そもそも、最初はホーン節という概念に着目していなかったらしい という感触だった
270 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 08:29:53 ] alpha.c.oka-pu.ac.jp/~yokota/paper/godel_jrnl0 > 1973年エディンバラ大学のP. Hayesは, (中略) > 翌年さらにKowalskiは,Prologに代表される論理プログラミング一般の基礎づけをおこなった。 "Predicate logic as programming language" ttp://www.doc.ic.ac.uk/~rak/papers/IFIP%2074.pdf これの「6. HORN CLAUSES」のところでは、4種類のホーン節それぞれについて、 H ← B1, ..., Bn. を「procedure declaration」、 H ←. を「assertion of fact」、 ← B1, ..., Bn. を「goal statement」、 ←. を「halt statement」 と手続き的に解釈できるぜ、という言い方をしているね。 (下線付きなので読みやすい)
271 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 09:38:32 ] www.doc.ic.ac.uk/~rak/ site:www.doc.ic.ac.uk inurl:rak +definite ttp://www.doc.ic.ac.uk/~rak/papers/British%20Nationality%20Act.pdf THE BRITISH NATIONALITY ACT AS A LOGIC PROGRAM May 1986 > (The terminology “Horn clauses” is used here to cover both > definite Horn clauses and Horn clause queries.) 「definite Horn clause」がやっと出てきた。 けど、これ以外には見当たらない。Kowalskiの用語にはなさそう?
272 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 10:42:22 ] Programming in Prolog 著者: William F. Clocksin, Christopher S. Mellish 27 ページ > Structures are called "compound terms" in Standard Prolog, but > in this book we use the word "structure" because it is shorter and > more easily distinguished ... 2003年版より。てっきりISOの用語に統一されたんだろうなと思っていたので意外だった。漢だ。
273 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 12:18:37 ] www.w3.org/2005/rules/wg/wiki/Horn_Logic > "definite program" [1] : > SLD-resolution (Linear resolution with Selection function for Definite clauses [1]) : > [1] J.W. Lloyd, Foundations of Logic Programming, Springer-Verlag, 1987. うーんこのへんになにかありそうな… foldoc.org/Horn+clause > A definite clause is a Horn clause that has exactly one positive literal. mathworld.wolfram.com/HornClause.html > A definite clause is a Horn clause that has exactly one positive literal. この2つのページ、かなり酷似した部分があるけど大丈夫なのかな
274 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 12:46:23 ] ale.cs.toronto.edu/docs/ref/ale_trale_ref/ale_trale_ref-node44.html > A definite sentence has exactly one positive literal in each clause and なるほど、導出計算方面でいうsentenceをprogramと読み替えるとdefinite program、 definite programに含まれるclauseだということでdefinite clauseなのかな
275 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 12:48:21 ] というかdefinite (program) clauseか
276 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 13:20:39 ] ともかくSLD導出のDだというのは真面目に調べればすぐ分かったはずだった気がする。 エスパー能力の限界か。。 en.wikipedia.org/wiki/SLD_resolution > The name "SLD resolution" was given by Maarten van Emden for the unnamed > inference rule introduced by Robert Kowalski in [Kowalski 1973, 1974]. Kowalskiは名前をつけたりしないのかな en.wikipedia.org/w/index.php?title=SLD_resolution&oldid=135876212 en.wikipedia.org/w/index.php?title=SLD_resolution&diff=156253104&oldid=152306415 > A definite sentence is a Horn clause with exactly one positive literal. これはまた違う定義というか、、
277 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 15:05:53 ] ついにCarl Hewitt(の恨み節みたいなの)が面白く読める程度まで予備知識がついた気がする knol.google.com/k/carl-hewitt-see-httpcarlhewittinfo/middle-history-of-logic-programming/pcxtp4rx7g1t/3?domain=knol.google.com&locale=ja#
278 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 22:06:24 ] 『Horn節は、ある条件の下で(あるいは無条件に)成り立つ事柄について、 B1”または”B2というような不確定な言い方を許さない。そこでHorn節は 確定節(definite clause)とも呼ばれる』 論理と意味 p105 直観主義論理の形式系LJの式は全部Horn節、というのもどこかで 関係するんじゃないですかね。
279 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 22:19:54 ] 失礼。書き忘れました。B1,B2というのは A1,A2,...An → B1,B2,...Bn という右辺にあるそれぞれの式のことを指します。
280 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 05:15:56 ] LJを調べてみました。扱っている式の形はホーン節に似てはいますが、 それぞれの論理式は原子論理式である必要はないんですよね
281 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 05:18:56 ] >280の「式」は「→」や「,」を含む全体、「論理式」はそこで対象化されている部分です、念のため
282 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 10:41:13 ] >>それぞれの論理式は原子論理式である必要はないんですよね 確かにその通りです。 では、そもそもなぜHorn節(より一般に節)は、原子論理式及び原子論理式 の否定の選言で構成されないとならないのか?という疑問が湧いてきますね。 多分何かしらの変換において、要素が原子論理式でなければならないという 縛りが出てきそうです。そのラインから少し調べてみます。
283 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 08:18:09 ] Qualitative spatial reasoning with topological information Jochen Renz著 - 2002 17 ページ > A Horn clause without a positive literal is called > indefinite Horn clause, otherwise it is a definite Horn clause. mjd?
284 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 23:03:56 ] >>283 プログラミング言語の新潮流という本では、 正のリテラルが(”高々”はつかず)一つである節を確定節(definite clause)と呼ぶ。とある。 思うに証明戦略上区分けしていると思われる。 正の節、すなわち確定節の場合、 証明戦略:SPU(selective positive unit resolution) 負の節、すなわち不確定節の場合、 証明戦略:SNL(selective negative linear resolution)。 SLD = SPU + SNL? SLD戦略を理解するに当たって、確定節、不確定節を区分したほうが わかりやすいから区分しているように見える。
285 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 23:08:11 ] LJの式がHorn節になるというのはあまり関係ないようだ。 加えて、要素が複合論理式か、原子論理式かはあまり関係なかった。 SPUなりSNLの証明戦略を用いたとすると、結局原子論理式しか出てこない。 わかりにくい言い方だが、つまり、何かしら自動証明することを考えると、 複合論理式であるかどうか、ということは特に問題ならなくなる。
286 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 23:09:53 ] 付け加えて、SPU,SNLについては『論理と意味』に解説がある。
287 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 23:14:46 ] 改めて読み返すと>>285 の内容がおかしい。とりあえず、保留。
288 名前:デフォルトの名無しさん mailto:sage [2009/06/19(金) 00:06:52 ] 質問です prologで ?- divide([a,b,c,d,e],L1, L2). L1 = [a,c,e] L2 = [b,d] とするにはどうしたらよいのでしょうか?
289 名前:デフォルトの名無しさん mailto:sage [2009/06/19(金) 00:20:52 ] divide([],[],[]). divide([X|Xs],[X|Ys],Zs) :- divide(Xs,Zs,Ys).
290 名前:デフォルトの名無しさん mailto:sage [2009/06/19(金) 00:39:39 ] >>289 さん ありがとうございます ちなみにこれの停止条件は空リストは空リスト二つに分けろってことですか? 何で最小単位が空リストになってしまうのでしょうか? a,b見たいな感じにはならないのですか? 後再帰条件はヘッドのXをXsとYsに分けてZsが残っているか判定する、でいいのでしょうか? prologよくわからないので日本語がおかしいかもしれないですが回答お願いします
291 名前:デフォルトの名無しさん mailto:sage [2009/06/19(金) 11:02:21 ] divide([],[],[]) divide([a],[a],[]) divide([a,b],[a],[b]) divide([a,b,c],[a,c],[b]) divide([],[],[]) divide([1],[1],[]) divide([2,1],[2],[1]) divide([3,2,1],[3,1],[2])
292 名前:デフォルトの名無しさん mailto:sage [2009/06/19(金) 20:46:00 ] うぅむ・・・。 Xというリストを分けてXsとし、残ったリストXをまた分けてYzとし、 最終的に分割できるものがなくなったら残った物をZsとして 停止条件に行き着くみたいな感じでしょうか・・・?
293 名前:デフォルトの名無しさん mailto:sage [2009/06/19(金) 21:34:39 ] divide([A,B|Xs],[A|Ys],[B|Zs]) :- divide(Xs,Ys,Zs). divide([A|[B|Xs]],[A|Ys],[B|Zs]) :- divide(Xs,Ys,Zs). divide([A|Xs0],[A|Ys],Zs0) :- [Xs0,Zs0] = [[B|Xs],[B|Zs]], divide(Xs,Ys,Zs). divide([A|Xs0],[A|Ys0],Zs0) :- [Xs0,Ys0,Zs0] = [[B|Xs],Ys,[B|Zs]], divide(Xs,Ys,Zs). divide([A|Xs0],[A|Ys0],Zs0) :- [Xs0,Zs0,Ys0] = [[B|Xs],[B|Zs],Ys], divide(Xs,Ys,Zs). divide([A|Xs0],[A|Ys0],Zs0) :- divide(Xs0,Zs0,Ys0) = divide([B|Xs],[B|Zs],Ys), divide(Xs,Ys,Zs). divide([A|Xs0],[A|Zs0],Ys0) :- divide(Xs0,Ys0,Zs0) = divide([B|Xs],[B|Zs],Ys), divide(Xs,Ys,Zs). divide([A|Xs0],[A|Zs0],Ys0) :- divide(Xs0,Ys0,Zs0). divide([B|Xs],[B|Zs],Ys) :- divide(Xs,Ys,Zs). ほら、簡単でしょう(ボブ)
294 名前:デフォルトの名無しさん mailto:sage [2009/06/19(金) 21:44:32 ] ひとつ削ると奇数偶数が反対になる、というふうに考えればいいかも
295 名前:デフォルトの名無しさん mailto:sage [2009/06/19(金) 22:16:47 ] >>293 さんもといボブさん divide([A,B|Xs],[A|Ys],[B|Zs]) は リストをAとBに分けてそれをまたそれぞれYsとZsに分けるんですよね? divide([A|[B|Xs]],[A|Ys],[B|Zs])はAを抜き出して次に[Bという先頭を抜き出し余ったものをXsとしてるんですよね? >>294 さん [a,b,c,d,e].だったらaをとったらL1に行き 次のbはL2に行きっていうのを繰り返すんですよね? これがaを奇数とすると奇数を取ったら次は偶数ってことですか? 疑問詞ばかりで申し訳ないです 頭がおかしくなって死にそうです・・・。
296 名前:デフォルトの名無しさん mailto:sage [2009/06/19(金) 22:25:56 ] >>295 > リストをAとBに分けて ちょっとまった [A,B|Xs] [A|[B|Xs]] この2つが同じものだと思っていないということ?それとも直感的な解釈の違いのことを言ってるのかな
297 名前:デフォルトの名無しさん mailto:sage [2009/06/19(金) 22:30:04 ] このスレは一体何が起きているんだ・・・。 なぜか体が震えてくる。俺だけ?
298 名前:デフォルトの名無しさん mailto:sage [2009/06/19(金) 22:35:57 ] >>295 [10,9,8,7,...] から [10,8,...], [9,7,...] を取るとき、 [10,8,...]がほしい立場からすれば、次の9は飛ばして8を取りたい。 [9,7,...]がほしい立場からすれば、今回の10は見送って次の9を取りたい。 ちょうどニーズが交代しているという感じで捉えているけど、もうひとつ明確じゃないねこりゃ。
299 名前:デフォルトの名無しさん mailto:sage [2009/06/19(金) 23:00:46 ] >>296 さん あ、勘違いしてました・・・。 >>297 さん 僕も自分の理解力がなさ過ぎて手が震えてきました >>298 さん おぉ!なんとなくわかってきました! [X|Ys]ここはどうしてこうなるのでしょうか?Xを排除したものをYsとしてるんですよね? ([X|Xs],[X|Ys],Zs)ここの部分を今みたいな日本語に直すとどんな感じなのでしょうか? 頓珍漢な事ばかり書いて皆さんを惑わせてしまって申し訳ないです。もう少し付き合って下さい><
300 名前:デフォルトの名無しさん mailto:sage [2009/06/20(土) 12:15:56 ] > [X|Ys]ここはどうしてこうなるのでしょうか?Xを排除したものをYsとしてるんですよね? XとYsから[X|Ys]を作っている、と読むのが自然じゃないかな divide([A,B|Xs],[A|Ys],[B|Zs]) :- divide(Xs,Ys,Zs). divide([A,B|CDEF…],[A|CE…],[B|DF…]) :- divide(CDEF…,CE…,DF…). divide([X|Xs],[X|Ys],Zs) :- divide(Xs,Zs,Ys). divide([A|BCDE…],[A|CE…],BD…) :- divide(BCDE…,BD…,CE…). こう書き直せばわかる気がする
301 名前:デフォルトの名無しさん mailto:sage [2009/06/20(土) 12:50:30 ] >>299 [X|Ys] Prologでは(注1)これは二通りの意味に解釈します。 1)・・Xはリストの最初の要素である。ただしリストとは [X|Ys] のことです。 2)・・リストYsに最初の要素としてXを付加する。できたリストは [X|Ys] です。 [X|Ys] の表現は99% 1) か 2) の意味で使われていますから、 どちらの意味であるか読み抜きましょう。 注1)・・Ysがリストでない例えば X=3,Ys=5, で [3|5] というものもあり得るのですが、 Prologではほとんど使うことがないのでこの際無視しましょう。
302 名前:デフォルトの名無しさん mailto:sage [2009/06/20(土) 13:57:34 ] kti.mff.cuni.cz/~bartak/prolog/recursion.html ここだとまず、元のリストが奇数番目から始まるか偶数番目から始まるかを ずっと保存しながら扱っているね。 > even_odd(L,E,O):-odd(L,E,O). 最初は1番、つまり奇数番と考えてodd/3を呼ぶ、と。 > odd([],[],[]). > odd([H|T],E,[H|O]):-even(T,E,O). > > even([],[],[]). > even([H|T],[H|E],O):-odd(T,E,O).
303 名前:デフォルトの名無しさん mailto:sage [2009/06/20(土) 14:07:07 ] つまり、偶数番どうし、奇数番どうしの対応に注目するなら… divide([A|BCDE…],[A|CE…],BD…) :- divide(BCDE…,BD…,CE…). divide([A|BABA…],[A|AA…],BB…) :- divide(BABA…,BB…,AA…).
304 名前:デフォルトの名無しさん mailto:sage [2009/06/20(土) 22:13:33 ] >>300 さん なるほど([A,B|Xs]でリストXsをつくり次に [A|Ys]Xsを踏まえたうえでで奇数番をつくり [B|Zs])で偶数番を作るんですね!? >>301 さん [X|Ys] に二種類の解釈があるということをうまく理解できていませんでした。ありがとうございます >>302 さん >>303 さん 貴重な書き込みありがとうございます divide([A|BABA…],[A|AA…],BB…) :- divide(BABA…,BB…,AA…). は偶数と奇数に分けている事を強調して書いてあるんですね?
305 名前:デフォルトの名無しさん mailto:sage [2009/06/20(土) 22:53:16 ] ちょっとまだ言葉遣いが混乱していると思うけど、 (「[A|Ys]Xsを踏まえたうえでで」とか) 大体わかったみたいでよかったね
306 名前:デフォルトの名無しさん mailto:sage [2009/06/20(土) 23:02:46 ] 500億かけただけあってGHCは全容が見えなさ過ぎる。 調べれば調べるだけ話題が出てくる。なんなんだ、この言語。
307 名前:デフォルトの名無しさん mailto:sage [2009/06/20(土) 23:11:19 ] 皆さん、本当にありがとうございました まだ完全ではないですが理解できました なんだか軽く荒らし兼、笑いものになってた気がしますが寛大な心で 許してください><
308 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 10:56:16 ] ?-g1. input=taro. input=jiro. input=2 input=.. . input=end. yes endが入力されるまで繰り返し、入力をしるg1を作りたいんですけど、全くわかりません。知恵を貸して下さい。
309 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 12:13:56 ] >>308 g1 :- repeat,write('input='),read(X),(X=end;assertz(tmp(X)),fail). repeat. repeat :- repeat.
310 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 12:15:59 ] >>308 g1(L) :- findall(X,(repeat,write('input='),read(X),(X=end,!,fail;true)),L).
311 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 12:18:38 ] >>308 g1(L) :- g1_prompt,read(X),g1_2(X,L). g1_2(end,[]). g1_2(A,[A|R]) :- g1_prompt,read(B),g1_2(B,R). g1_prompt :- write('input=').
312 名前:311 mailto:sage [2009/06/24(水) 12:23:19 ] >>308 この方が自然かな。 g1(L) :- g1_read(X),g1_2(X,L). g1_2(end,[]). g1_2(A,[A|R]) :- g1_read(B),g1_2(B,R). g1_read(X) :- write('input='),read(X).
313 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 17:42:30 ] >>308 g1 :- repeat, write('input='), read(X), X = end, !. 終わったらrepeatへの後戻りをカットしないとまずいかもしれないよ。 g1 :- write('input='), read(X), X \= end, g1. g1. おまけの再帰版。
314 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 17:50:28 ] おっと「知恵を貸して」か。なら… >>308 g1 :- repeat, write('input='), read(X), fail. g1 :- write('input='), read(X), g1. こうすると止まらない。そこで… ・X=endのとき止めるには、条件をどこにどのように課せばいいか。 ・止まったとき成功するようにするには、どうすればいいか。 ・?- g1, fail.と呼び出したとき困ることはないか、困るならどう回避するか。 (もう遅いってw)
315 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 20:04:27 ] X \= end や X = end は、 X \== end や X == end としたほうがいいかもしれない。 read/1だと変数も入力できてしまうし。
316 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 20:27:03 ] ごめん、>>313 の再帰版にもカットが必要だった。 ?- g1, X=X.などとすると余計な成功が生じているのがわかると思う。 うーん勉強になるw
317 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 04:36:56 ] >>316 g1 :- write('input='),read(X),X==end,!. g1 :- g1. がスマートで推奨版なのかな。インタプリタのトップからの使いやすさから、 repeat/0を利用してしまうが。
318 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 07:01:43 ] 失敗駆動ループを使うならrepeatのほうがいいかと
319 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 07:03:29 ] えーっとつまり、値を蓄積したいなら再帰で、という
320 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 07:48:54 ] >>319 こういうのはあるか。 g1(X) :- write('input='),read(X). g1(_) :- g1(_). ?- g1(X), ... ,X==end. 最後に ... の中でendが消費されてしまうのが難。
321 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 07:52:29 ] 匿名変数だとダメなのかな。 g1(X) :- write('input='),read(X). g1(X) :- g1(X). でないと。
322 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 20:06:07 ] repeatから一歩も出てないねw
323 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 20:24:52 ] 表面上カットを使わない方法を挙げると、 g1 :- once(( repeat, write('input='), read(X), X == end )). あるいは g1 :- \+ \+ ( repeat, write('input='), read(X), X == end ). いわゆる「生成検査戦略」の枠組み \+ ( 生成(X), \+ ( 検査(X) ) ) で考えてもおもしろいのでは。 g1 :- \+ \+ ( repeat, write('input='), read(X), \+ ( X \== end ) ). (証明終了までに入力されるXはすべて X \== end を満たす、わけでもない、ということを証明する)
324 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 20:30:01 ] なんか「生成検査」という言葉の使い方を間違えた気がするw
325 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 20:49:31 ] <実行結果> split(5, [3,7,2,6,5,8], Before, After). Before = [3,2,5] (5と同じか、小さい数のリスト) After = [7,6,8] (5より大きい数のリスト) となるのを作りたいのですがどうしたら良いのでしょうか?
326 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 20:50:19 ] /*停止条件*/ split([],[],[]). split([A],[A],[]). /*再帰条件*/ /*入力した変数Nより小さい場合 */ split([A,B|R],[A|T1],[B|T2]) :- A >= B, split(R,[A|T1],T2). /* 入力した変数Nより大きい場合 */ split([A,B|R],[A|T1],[B|T2]) :- A < B, split(R,T1,[B|T2]). と作ってみたのですが・・・・。だめでした
327 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 21:05:00 ] 引数の数が違うようですが
328 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 21:10:09 ] >>325-326 swi-prologで作ってみました。 参考にしてみてください。 split(_, [], [], []). split(X, [H|L], [H|B], A) :- H =< X, !, split(X, L, B, A). split(X, [H|L], B, [H|A]) :- split(X, L, B, A).
329 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 21:11:22 ] すみません。見づらいので、張りなおします。 split(X, [], [], []). split(X, [H|L], [H|B], A) :- H =< X, !, split(X, L, B, A). split(X, [H|L], B, [H|A]) :- split(X, L, B, A).
330 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 21:11:46 ] split(5,[3, ... この辺を見て「3 =< 5」、つまり3は小さい側だな、と判断 split(5,[3, ...],[3, ...],[...]) ここまで決まる split(N,[H|L1],[H|Before1],After) :- H =< N, ... 変数に置き換えて考える こんな感じでは
331 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 23:36:42 ] >>327 さん ご指摘ありがとうございます >>328-330 さん split(X, [], [], []). split(X, [H|L], [H|B], A) :- H =< X, !, split(X, L, B, A). split(X, [H|L], B, [H|A]) :- split(X, L, B, A). と入れたら * [X] - singleton variables in user:split/4 * Approximate lines: 1-2, file: 'と出てしまったのですがどうすればいいのでしょうか?