[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 2chのread.cgiへ]
Update time : 12/23 11:34 / Filesize : 227 KB / Number-of Response : 759
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Prologでまったり Part4



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/

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: 'と出てしまったのですがどうすればいいのでしょうか?

332 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 23:38:11 ]
split(X, [], [], []).ではXを空リスト3つに分けているのですか?
否定(?)を利用してますがなくても問題ないですよね?

連レスすいません


333 名前:328 mailto:sage [2009/06/26(金) 00:27:34 ]
>>331-332

ちょうど書き込み時間が重なったので、勘違いされたと思いますが、
>>328-329は私ですが、>>330は別の方の書き込みです。
splitの仕様は、>>325に合わせました。
* [X] - singleton variablesの警告は、1行目のsplitにおいて、左辺にあるXが
右辺で使われていませんよ、という意味です。
split(_, [], [], [])と書き直せば、この警告は消えると思います。

カットは必須ではありませんが、カットを使わない場合、
>>326のA>=B、A<Bのように背反となる条件を各々splitの定義に含める
必要があります。



334 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 01:22:10 ]
>>332
まだ問題の理解が十分ではないようですね。その段階で>>325のように、
「〜というものを作りたいのですが」という言い方をするのはよくないと思います。

335 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 01:26:37 ]
スミマセン、なんか言い過ぎましたw
そんなによくなくもないかもしれません

336 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 04:52:07 ]
>>332
なかなか、よい発想をされますね。[]の分割問題ですね。これは、
あなたが、「 []を分割してBefore=[] After=[] なんて許さん。偽だ。」と
考えるなら、この述語は
split(X,[H],[H],[]) :- H=<X,!.
split(X,[H],[],[H]) :- H>X,!.
split(X,[H|L],[H|A],B) :- H=<X,split(X,L,A,B).
split(X,[H|L],A,[H|B]) :- H>X,split(X,L,A,B).
となります。普通私たちは、
?- split(5,[],A,B).
A = [],
B = []
が好ましい仕様だと思い込んでいるのですが、
少々Prolog呆けしているのかも知れません。

337 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 05:09:00 ]
私たちって言うな

338 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 05:23:14 ]
>>337
リストの再帰で、
[]になった場合の検証から入るプログラマって
そんなにいるかな。まあ、時間的には一瞬だけど。
もし、変数が来たらは、常に注意を張りながらだと思うけど。

339 名前:デフォルトの名無しさん [2009/06/26(金) 05:37:18 ]
>>338
宣言的でありたいというのがある。
できることなら停止節なんて省略したい。
こういう姿勢だから、考えないね。


340 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 05:47:30 ]
微妙すぎる。>>332は明確に否定するのが親切だと思うけど、
そもそもどこかの宿題を乱暴に投げているだけような気配がするw

341 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 06:01:59 ]
>>339
それだ! 停止節省略指示子の導入。
帰納論理がそこそこ行けるんだったら、
それくらい処理系にやらせたっていいじゃないか。

342 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 18:33:08 ]
途中まで作って、トレースモードにして、正解を問い合わせればいい
| ?-split(5,[3,7,2,6,5,8],[3,2,5],[7,6,8]).
+ (1) 1 Call: split(5,[3,7,2,6,5,8],[3,2,5],[7,6,8]) ?l
+ (4) 2 Call: split(5,[7,2,6,5,8],[2,5],[7,6,8]) ?l
+ (5) 3 Call: split(5,[2,6,5,8],[2,5],[6,8]) ?l
+ (8) 4 Call: split(5,[6,5,8],[5],[6,8]) ?l
+ (9) 5 Call: split(5,[5,8],[5],[8]) ?l
+ (12) 6 Call: split(5,[8],[],[8]) ?l
+ (13) 7 Call: split(5,[],[],[]) ?l
+ (13) 7 Fail: split(5,[],[],[]) ?l
+ (12) 6 Fail: split(5,[8],[],[8]) ?l

343 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 18:35:25 ]
「トレースモードにして」じゃなくて「スパイ点を設定して」か



344 名前:デフォルトの名無しさん [2009/06/26(金) 21:10:24 ]
>>333さん
すいませんでした。
なるほど、カットするとそこで探索を停止するからですね?
>>334-335さん
おっしゃるとおりです・・・。prolog理解するのとても難しいです
>>336さん
空リストを停止条件に持っていく場合とそうでない場合の見極めが難しいです
>>337さん
落ち着いてください
>>339さん
て、停止節ですか?
>>340さん
丸投げではないです・・・。
>>342さん
すいません。僕の使ってるprologは未完成での実行はできないです

345 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 21:13:40 ]
split(X, [H|L], B, [H|A]) :-
split(X, L, B, A).
でH =< Xではない時をマッチングさせるんでよね?

346 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 21:44:57 ]
カット(!)はまだ勉強していない、という前提で進めた方がいいんでしょうか

347 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 21:47:54 ]
>>332
> 否定(?)を利用してますがなくても問題ないですよね?

これはなぜそう思ったんですか

348 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 21:56:13 ]
>>326
> /*入力した変数Nより小さい場合 */
> split([A,B|R],[A|T1],[B|T2]) :-
> A >= B,
> split(R,[A|T1],T2).

この「変数N」というようなコメントは、問題についていたヒントか何かですか

349 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 22:31:18 ]
Prologって面白すぎ。もっと流行ればよいのに。

350 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 01:46:01 ]
>>346さん
軽く説明された程度です
>>347さん
授業の説明だと余分なところまでマッチングしないようにするためだと聞いたので
なくてもいいのかなぁと
>>348さん
そこは自分でプログラムするときわかりやすいように書いてみただけです
>>349さん
面白いですけど難しくて頭が痛くなりますw

351 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 02:26:10 ]
>>344
> すいません。僕の使ってるprologは未完成での実行はできないです

デバッグ機能がないというのはちょっと考えにくいので、
差し支えなければ処理系の名前を、参考までに。
一つ一つの確認を細かくしないと、Prologのプログラムはなかなか組めないんじゃないかと思います。

352 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 02:43:19 ]
>>325 >>344
リストがそれぞれ何らかの「集合」を表していると解釈すれば自明ではないでしょうか。
・空集合の部分集合は(どんな条件がついても)空集合だけ
・空集合を表すリストは空リストだけ

353 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 06:05:07 ]
>>350
いろんな言語で宿題スレ
pc12.2ch.net/test/read.cgi/tech/1242876647/
にPrologのプログラムが沢山載っています。
間違ってるところや、それを逐次修正していく過程が晒されている部分。
処理系依存(あるPrologでは動くが別のPrologでは述語未定義となり動かない)の
ところも多いから、いろいろな意味で勉強になると思います。



354 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 08:44:23 ]
自演乙

355 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 11:22:10 ]
>>351さん
terateamを使ってLinuxにアクセスしてemacsやらsicstusを入力してやってます
>>352さん
貴重なご意見感謝します
うまく見分けれるように頑張ります
>>353さん
prologの宿題スレになってますねw
こっちのスレを回ってみようと思います。情報ありがとうございました
>>354さん
いったい何と戦っているんですか?ここで自演して自分に有益になるとは到底思えませんが?
とりあえず落ち着いてください






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<227KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef