Prologでまったり Par ..
263:デフォルトの名無しさん
09/06/12 11:27:20
URLリンク(blog.goo.ne.jp)
> 君のパリのアクセントが気に入らない! といいはるんですね。w
264:デフォルトの名無しさん
09/06/12 12:23:27
>>263
やっぱりコルメラウアじゃないか!
265:デフォルトの名無しさん
09/06/12 13:24:54
また新たな「確定節」解釈を発見。
『人工知能の基礎』(馬場口登・山田誠二共著)によると、
事実(fact)=単位節(unit clause)
ルール(rule)=確定節(definite clause)
質問(query)=ゴール節(goal clause)
らしい(p.75)。かなりパターンが揃ってきたねw
266:デフォルトの名無しさん
09/06/12 13:44:38
URLリンク(hagi.is.s.u-tokyo.ac.jp)
> 単位節(unit clause)
> 一つのリテラルから成る節
> 正単位節(unit clause)
> 一つの正リテラルから成る節
> 負単位節(unit clause)
> 一つの負リテラルから成る節
どうして全部unit clauseなんだろう
267:デフォルトの名無しさん
09/06/12 14:26:18
あそうか、コピペ駆動開発みたいな感じか
268:デフォルトの名無しさん
09/06/14 00:56:10
The Birth of Prolog
by Alain Colmerauer
URLリンク(citeseerx.ist.psu.edu)
269:デフォルトの名無しさん
09/06/14 05:26:20
>>268
「clause」だけ検索してみたら
・ここではdefinite clauseという言葉を使っていない
・たまに「program(の)clause」のような言い方をする程度
・そもそも、最初はホーン節という概念に着目していなかったらしい
という感触だった
270:デフォルトの名無しさん
09/06/14 08:29:53
URLリンク(alpha.c.oka-pu.ac.jp)
> 1973年エディンバラ大学のP. Hayesは,
(中略)
> 翌年さらにKowalskiは,Prologに代表される論理プログラミング一般の基礎づけをおこなった。
"Predicate logic as programming language"
URLリンク(www.doc.ic.ac.uk)
これの「6. HORN CLAUSES」のところでは、4種類のホーン節それぞれについて、
H ← B1, ..., Bn. を「procedure declaration」、
H ←. を「assertion of fact」、
← B1, ..., Bn. を「goal statement」、
←. を「halt statement」
と手続き的に解釈できるぜ、という言い方をしているね。
(下線付きなので読みやすい)
271:デフォルトの名無しさん
09/06/14 09:38:32
URLリンク(www.doc.ic.ac.uk)
site:www.doc.ic.ac.uk inurl:rak +definite
URLリンク(www.doc.ic.ac.uk)
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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/06/14 12:18:37
URLリンク(www.w3.org)
> "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.
うーんこのへんになにかありそうな…
URLリンク(foldoc.org)
> A definite clause is a Horn clause that has exactly one positive literal.
URLリンク(mathworld.wolfram.com)
> A definite clause is a Horn clause that has exactly one positive literal.
この2つのページ、かなり酷似した部分があるけど大丈夫なのかな
274:デフォルトの名無しさん
09/06/14 12:46:23
URLリンク(ale.cs.toronto.edu)
> A definite sentence has exactly one positive literal in each clause and
なるほど、導出計算方面でいうsentenceをprogramと読み替えるとdefinite program、
definite programに含まれるclauseだということでdefinite clauseなのかな
275:デフォルトの名無しさん
09/06/14 12:48:21
というかdefinite (program) clauseか
276:デフォルトの名無しさん
09/06/14 13:20:39
ともかくSLD導出のDだというのは真面目に調べればすぐ分かったはずだった気がする。
エスパー能力の限界か。。
URLリンク(en.wikipedia.org)
> The name "SLD resolution" was given by Maarten van Emden for the unnamed
> inference rule introduced by Robert Kowalski in [Kowalski 1973, 1974].
Kowalskiは名前をつけたりしないのかな
URLリンク(en.wikipedia.org)
URLリンク(en.wikipedia.org)
> A definite sentence is a Horn clause with exactly one positive literal.
これはまた違う定義というか、、
277:デフォルトの名無しさん
09/06/14 15:05:53
ついにCarl Hewitt(の恨み節みたいなの)が面白く読める程度まで予備知識がついた気がする
URLリンク(knol.google.com)
278:デフォルトの名無しさん
09/06/14 22:06:24
『Horn節は、ある条件の下で(あるいは無条件に)成り立つ事柄について、
B1”または”B2というような不確定な言い方を許さない。そこでHorn節は
確定節(definite clause)とも呼ばれる』
論理と意味 p105
直観主義論理の形式系LJの式は全部Horn節、というのもどこかで
関係するんじゃないですかね。
279:デフォルトの名無しさん
09/06/14 22:19:54
失礼。書き忘れました。B1,B2というのは
A1,A2,...An → B1,B2,...Bn
という右辺にあるそれぞれの式のことを指します。
280:デフォルトの名無しさん
09/06/15 05:15:56
LJを調べてみました。扱っている式の形はホーン節に似てはいますが、
それぞれの論理式は原子論理式である必要はないんですよね
281:デフォルトの名無しさん
09/06/15 05:18:56
>280の「式」は「→」や「,」を含む全体、「論理式」はそこで対象化されている部分です、念のため
282:デフォルトの名無しさん
09/06/15 10:41:13
>>それぞれの論理式は原子論理式である必要はないんですよね
確かにその通りです。
では、そもそもなぜHorn節(より一般に節)は、原子論理式及び原子論理式
の否定の選言で構成されないとならないのか?という疑問が湧いてきますね。
多分何かしらの変換において、要素が原子論理式でなければならないという
縛りが出てきそうです。そのラインから少し調べてみます。
283:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/06/16 23:03:56
>>283
プログラミング言語の新潮流という本では、
正のリテラルが(”高々”はつかず)一つである節を確定節(definite clause)と呼ぶ。とある。
思うに証明戦略上区分けしていると思われる。
正の節、すなわち確定節の場合、
証明戦略:SPU(selective positive unit resolution)
負の節、すなわち不確定節の場合、
証明戦略:SNL(selective negative linear resolution)。
SLD = SPU + SNL?
SLD戦略を理解するに当たって、確定節、不確定節を区分したほうが
わかりやすいから区分しているように見える。
285:デフォルトの名無しさん
09/06/16 23:08:11
LJの式がHorn節になるというのはあまり関係ないようだ。
加えて、要素が複合論理式か、原子論理式かはあまり関係なかった。
SPUなりSNLの証明戦略を用いたとすると、結局原子論理式しか出てこない。
わかりにくい言い方だが、つまり、何かしら自動証明することを考えると、
複合論理式であるかどうか、ということは特に問題ならなくなる。
286:デフォルトの名無しさん
09/06/16 23:09:53
付け加えて、SPU,SNLについては『論理と意味』に解説がある。
287:デフォルトの名無しさん
09/06/16 23:14:46
改めて読み返すと>>285の内容がおかしい。とりあえず、保留。
288:デフォルトの名無しさん
09/06/19 00:06:52
質問です
prologで
?- divide([a,b,c,d,e],L1, L2).
L1 = [a,c,e]
L2 = [b,d]
とするにはどうしたらよいのでしょうか?
289:デフォルトの名無しさん
09/06/19 00:20:52
divide([],[],[]).
divide([X|Xs],[X|Ys],Zs) :- divide(Xs,Zs,Ys).
290:デフォルトの名無しさん
09/06/19 00:39:39
>>289さん
ありがとうございます
ちなみにこれの停止条件は空リストは空リスト二つに分けろってことですか?
何で最小単位が空リストになってしまうのでしょうか? a,b見たいな感じにはならないのですか?
後再帰条件はヘッドのXをXsとYsに分けてZsが残っているか判定する、でいいのでしょうか?
prologよくわからないので日本語がおかしいかもしれないですが回答お願いします
291:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/06/19 20:46:00
うぅむ・・・。
Xというリストを分けてXsとし、残ったリストXをまた分けてYzとし、
最終的に分割できるものがなくなったら残った物をZsとして
停止条件に行き着くみたいな感じでしょうか・・・?
293:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/06/19 21:44:32
ひとつ削ると奇数偶数が反対になる、というふうに考えればいいかも
295:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/06/19 22:25:56
>>295
> リストをAとBに分けて
ちょっとまった
[A,B|Xs]
[A|[B|Xs]]
この2つが同じものだと思っていないということ?それとも直感的な解釈の違いのことを言ってるのかな
297:デフォルトの名無しさん
09/06/19 22:30:04
このスレは一体何が起きているんだ・・・。
なぜか体が震えてくる。俺だけ?
298:デフォルトの名無しさん
09/06/19 22:35:57
>>295
[10,9,8,7,...] から [10,8,...], [9,7,...] を取るとき、
[10,8,...]がほしい立場からすれば、次の9は飛ばして8を取りたい。
[9,7,...]がほしい立場からすれば、今回の10は見送って次の9を取りたい。
ちょうどニーズが交代しているという感じで捉えているけど、もうひとつ明確じゃないねこりゃ。
299:デフォルトの名無しさん
09/06/19 23:00:46
>>296さん
あ、勘違いしてました・・・。
>>297さん
僕も自分の理解力がなさ過ぎて手が震えてきました
>>298さん
おぉ!なんとなくわかってきました!
[X|Ys]ここはどうしてこうなるのでしょうか?Xを排除したものをYsとしてるんですよね?
([X|Xs],[X|Ys],Zs)ここの部分を今みたいな日本語に直すとどんな感じなのでしょうか?
頓珍漢な事ばかり書いて皆さんを惑わせてしまって申し訳ないです。もう少し付き合って下さい><
300:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/06/20 13:57:34
URLリンク(kti.mff.cuni.cz)
ここだとまず、元のリストが奇数番目から始まるか偶数番目から始まるかを
ずっと保存しながら扱っているね。
> 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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/06/20 22:53:16
ちょっとまだ言葉遣いが混乱していると思うけど、
(「[A|Ys]Xsを踏まえたうえでで」とか)
大体わかったみたいでよかったね
306:デフォルトの名無しさん
09/06/20 23:02:46
500億かけただけあってGHCは全容が見えなさ過ぎる。
調べれば調べるだけ話題が出てくる。なんなんだ、この言語。
307:デフォルトの名無しさん
09/06/20 23:11:19
皆さん、本当にありがとうございました
まだ完全ではないですが理解できました
なんだか軽く荒らし兼、笑いものになってた気がしますが寛大な心で
許してください><
308:デフォルトの名無しさん
09/06/24 10:56:16
?-g1.
input=taro.
input=jiro.
input=2
input=..
.
input=end.
yes
endが入力されるまで繰り返し、入力をしるg1を作りたいんですけど、全くわかりません。知恵を貸して下さい。
309:デフォルトの名無しさん
09/06/24 12:13:56
>>308
g1 :- repeat,write('input='),read(X),(X=end;assertz(tmp(X)),fail).
repeat.
repeat :- repeat.
310:デフォルトの名無しさん
09/06/24 12:15:59
>>308
g1(L) :- findall(X,(repeat,write('input='),read(X),(X=end,!,fail;true)),L).
311:デフォルトの名無しさん
09/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
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/06/24 20:04:27
X \= end や X = end は、
X \== end や X == end としたほうがいいかもしれない。
read/1だと変数も入力できてしまうし。
316:デフォルトの名無しさん
09/06/24 20:27:03
ごめん、>>313の再帰版にもカットが必要だった。
?- g1, X=X.などとすると余計な成功が生じているのがわかると思う。
うーん勉強になるw
317:デフォルトの名無しさん
09/06/25 04:36:56
>>316
g1 :- write('input='),read(X),X==end,!.
g1 :- g1.
がスマートで推奨版なのかな。インタプリタのトップからの使いやすさから、
repeat/0を利用してしまうが。
318:デフォルトの名無しさん
09/06/25 07:01:43
失敗駆動ループを使うならrepeatのほうがいいかと
319:デフォルトの名無しさん
09/06/25 07:03:29
えーっとつまり、値を蓄積したいなら再帰で、という
320:デフォルトの名無しさん
09/06/25 07:48:54
>>319
こういうのはあるか。
g1(X) :- write('input='),read(X).
g1(_) :- g1(_).
?- g1(X), ... ,X==end.
最後に ... の中でendが消費されてしまうのが難。
321:デフォルトの名無しさん
09/06/25 07:52:29
匿名変数だとダメなのかな。
g1(X) :- write('input='),read(X).
g1(X) :- g1(X).
でないと。
322:デフォルトの名無しさん
09/06/25 20:06:07
repeatから一歩も出てないねw
323:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/06/25 20:30:01
なんか「生成検査」という言葉の使い方を間違えた気がするw
325:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/06/25 21:05:00
引数の数が違うようですが
328:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/06/25 23:38:11
split(X, [], [], []).ではXを空リスト3つに分けているのですか?
否定(?)を利用してますがなくても問題ないですよね?
連レスすいません
333:328
09/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:デフォルトの名無しさん
09/06/26 01:22:10
>>332
まだ問題の理解が十分ではないようですね。その段階で>>325のように、
「〜というものを作りたいのですが」という言い方をするのはよくないと思います。
335:デフォルトの名無しさん
09/06/26 01:26:37
スミマセン、なんか言い過ぎましたw
そんなによくなくもないかもしれません
336:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/06/26 05:09:00
私たちって言うな
338:デフォルトの名無しさん
09/06/26 05:23:14
>>337
リストの再帰で、
[]になった場合の検証から入るプログラマって
そんなにいるかな。まあ、時間的には一瞬だけど。
もし、変数が来たらは、常に注意を張りながらだと思うけど。
339:デフォルトの名無しさん
09/06/26 05:37:18
>>338
宣言的でありたいというのがある。
できることなら停止節なんて省略したい。
こういう姿勢だから、考えないね。
340:デフォルトの名無しさん
09/06/26 05:47:30
微妙すぎる。>>332は明確に否定するのが親切だと思うけど、
そもそもどこかの宿題を乱暴に投げているだけような気配がするw
341:デフォルトの名無しさん
09/06/26 06:01:59
>>339
それだ! 停止節省略指示子の導入。
帰納論理がそこそこ行けるんだったら、
それくらい処理系にやらせたっていいじゃないか。
342:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/06/26 18:35:25
「トレースモードにして」じゃなくて「スパイ点を設定して」か
344:デフォルトの名無しさん
09/06/26 21:10:24
>>333さん
すいませんでした。
なるほど、カットするとそこで探索を停止するからですね?
>>334-335さん
おっしゃるとおりです・・・。prolog理解するのとても難しいです
>>336さん
空リストを停止条件に持っていく場合とそうでない場合の見極めが難しいです
>>337さん
落ち着いてください
>>339さん
て、停止節ですか?
>>340さん
丸投げではないです・・・。
>>342さん
すいません。僕の使ってるprologは未完成での実行はできないです
345:デフォルトの名無しさん
09/06/26 21:13:40
split(X, [H|L], B, [H|A]) :-
split(X, L, B, A).
でH =< Xではない時をマッチングさせるんでよね?
346:デフォルトの名無しさん
09/06/26 21:44:57
カット(!)はまだ勉強していない、という前提で進めた方がいいんでしょうか
347:デフォルトの名無しさん
09/06/26 21:47:54
>>332
> 否定(?)を利用してますがなくても問題ないですよね?
これはなぜそう思ったんですか
348:デフォルトの名無しさん
09/06/26 21:56:13
>>326
> /*入力した変数Nより小さい場合 */
> split([A,B|R],[A|T1],[B|T2]) :-
> A >= B,
> split(R,[A|T1],T2).
この「変数N」というようなコメントは、問題についていたヒントか何かですか
349:デフォルトの名無しさん
09/06/26 22:31:18
Prologって面白すぎ。もっと流行ればよいのに。
350:デフォルトの名無しさん
09/06/27 01:46:01
>>346さん
軽く説明された程度です
>>347さん
授業の説明だと余分なところまでマッチングしないようにするためだと聞いたので
なくてもいいのかなぁと
>>348さん
そこは自分でプログラムするときわかりやすいように書いてみただけです
>>349さん
面白いですけど難しくて頭が痛くなりますw
351:デフォルトの名無しさん
09/06/27 02:26:10
>>344
> すいません。僕の使ってるprologは未完成での実行はできないです
デバッグ機能がないというのはちょっと考えにくいので、
差し支えなければ処理系の名前を、参考までに。
一つ一つの確認を細かくしないと、Prologのプログラムはなかなか組めないんじゃないかと思います。
352:デフォルトの名無しさん
09/06/27 02:43:19
>>325 >>344
リストがそれぞれ何らかの「集合」を表していると解釈すれば自明ではないでしょうか。
・空集合の部分集合は(どんな条件がついても)空集合だけ
・空集合を表すリストは空リストだけ
353:デフォルトの名無しさん
09/06/27 06:05:07
>>350
いろんな言語で宿題スレ
スレリンク(tech板)
にPrologのプログラムが沢山載っています。
間違ってるところや、それを逐次修正していく過程が晒されている部分。
処理系依存(あるPrologでは動くが別のPrologでは述語未定義となり動かない)の
ところも多いから、いろいろな意味で勉強になると思います。
354:デフォルトの名無しさん
09/06/27 08:44:23
自演乙
355:デフォルトの名無しさん
09/06/27 11:22:10
>>351さん
terateamを使ってLinuxにアクセスしてemacsやらsicstusを入力してやってます
>>352さん
貴重なご意見感謝します
うまく見分けれるように頑張ります
>>353さん
prologの宿題スレになってますねw
こっちのスレを回ってみようと思います。情報ありがとうございました
>>354さん
いったい何と戦っているんですか?ここで自演して自分に有益になるとは到底思えませんが?
とりあえず落ち着いてください
356:353
09/06/27 16:39:14
>>354
いろんな言語で宿題スレに大量に書き込んでいるのは私ですが、
それがなにか?
これは前スレで、よそのスレに載っているプログラムや課題を
このスレでPrologに書き直そうという提唱や、
Prolog10000Tipsを目指す活動の手始めです。
357:デフォルトの名無しさん
09/06/27 23:09:40
prologプログラムの無限ループバグを防ぐtipsを教えてください。
C以上に暴走しやすい危険な言語ですね。
358:デフォルトの名無しさん
09/06/27 23:31:14
>>356
>>338-339と>>341もあなたではないかと思っているのですが、ひょっとして…?w
359:デフォルトの名無しさん
09/06/27 23:35:50
>>357
> 暴走しやすい
これはいつだか、大学の先生がPrologで作ったCGIが無限ループしてひどいことになっていたのを見て思った
360:デフォルトの名無しさん
09/06/27 23:48:12
>>356
これまでの観察によれば
・動作確認をしないことが多い。
・ISOから外れた述語を断りなく多用する。not/1など。
・勘違いを書いても明確に訂正しない。
このへんはちょっとどうかと思っています。
2ちゃんねるだからアリ、という考えなのかもしれませんが。
361:デフォルトの名無しさん
09/06/27 23:55:39
オウフ語
・”F”は、太ったものに当てはまる。
・”G”は、貪欲なものに当てはまる。
・”a”は、アルバートを表示する。
・”b”は、ベティを表示する。
・主語述語形式の文”Pn”が新であるのが、”n”が表示するものが、
”P”が当てはまるもののクラスの要素であるとき、かつ、そのときに限る。
・”¬A”という形式の文が新であるのは、文Aが真で無いとき、
かつ、そのときに限る。
・”A&B”という形式の文が新であるのは、文Aと文Bがともに新であるとき、
かつ、そのときに限る。
362:デフォルトの名無しさん
09/06/27 23:57:11
誤字多すぎた。も一回。
オウフ語
・”F”は、太ったものに当てはまる。
・”G”は、貪欲なものに当てはまる。
・”a”は、アルバートを表示する。
・”b”は、ベティを表示する。
・主語述語形式の文”Pn”が真であるのは、”n”が表示するものが、
”P”が当てはまるもののクラスの要素であるとき、かつ、そのときに限る。
・”¬A”という形式の文が真であるのは、文Aが真で無いとき、
かつ、そのときに限る。
・”A&B”という形式の文が真であるのは、文Aと文Bがともに真であるとき、
かつ、そのときに限る。
363:デフォルトの名無しさん
09/06/28 00:06:31
>>359で言ったCGIですが、今探してみたら、ちょっと様子が違いました。
URLリンク(web.sfc.keio.ac.jp)
> # 卓上計算機の実行
> # 卓上計算機 Prolog CGI ソース (calculator.cgi)
・「実行」のリンクが切れている。
・「CGI ソース」のリンク先は無限ループになるが、本来実行されないもののように見える。
364:デフォルトの名無しさん
09/06/28 00:10:06
表示的意味論付き単純言語オウフ。
例えば、アルバートを表示する、というのはアルバートという人がそこにいる
事態を指す/結びつける。
365:デフォルトの名無しさん
09/06/28 00:50:38
参考文献も表示したほうがいいのではw
366:デフォルトの名無しさん
09/06/28 01:02:45
>>363
つまりこういうことかも。
・POSTなりGETなりの方式で入力が与えられることを前提にしている。
・無入力の場合に暴走するように書いてしまっている。
・読ませるためのソースに実行可能フラグをつけてしまった。
367:デフォルトの名無しさん
09/06/28 02:35:52
用語が変だった
"実行可能フラグ" の検索結果 約 291 件中 1 - 10 件目 (0.19 秒)
> 真ということ は、実行可能フラグが立っていることを表すに過ぎません
> True indicates only that the execute flag is on.
"execute flag" -"No Execute flag" の検索結果 約 963 件中 1 - 10 件目 (0.13 秒)
「実行許可(ビット)」あたりかな
368:デフォルトの名無しさん
09/06/28 04:42:04
>>360
しっかりと、観察して下さったようで、ありがとうございます。
すでに利用していて、それを多少読みやすく書き換えたものも
ありますが、Firefoxの六行の小さな窓の中で上から書きながしたものが
ほとんどで実際動作実行をしたものはあまりありません。
Upしたものを読み返して、間違ってるなと気がついた時は訂正して
いると思いますが。C/C++の宿題スレの更新速度が急でコーヒー休憩に
少しづつ課題をUpして次の休憩にコードを書きなぐるという書き込みな
ので、実行確認は今後もしないと思います。間違いは指摘してください。
標準の組み込み述語に限定すると、2chの1レス枠に入らなくなる
課題が多いため、繰り返し使われるものについてはライブラリに
あるものとして、いちいちの定義を省略しています。
get_line/1または2、get_lines/2、split/3、concat_atom/3、append/4、
などがそれです。他の言語との比較と言う観点からはフェアでないとも
言えますが、書き込みの目的がチュートリアルの草稿としてこれを公開
することにあるのであまりその点は気にしていません。not/1は\+より
こちらの方が誰にでも意味がわかるいう理由でこれで通しています。
369:368
09/06/28 05:01:05
>>358
>>336、>>338と>>340は私だが、>>339は違うよ。この時間帯に
読んでくれているのが誰だかは知っているがw
370:デフォルトの名無しさん
09/06/28 05:08:06
と、いう人がいるので注意してください。
371:368
09/06/28 05:13:09
10000Tipsについては、著作権の問題が出てくるようで
弁護士に相談中。いちいち著作者に了解をとることは
コスト的に無理なようなので。
試しにスポーツルールの述語化をしてみようと思ったの
ですが、ただただベースボールマガジン社が発行している
著作物を編集し直した物になってしまいました。
372:デフォルトの名無しさん
09/06/28 05:15:58
>>368
>>309-312はまだちゃんと訂正していないような気が
373:デフォルトの名無しさん
09/06/28 05:30:15
>>370
ところであなたも早朝派ですか?
私は早朝ジョギング派なので3時半起きで、2chの書き込みも
その後1-2時間の間にしますが、それに関してのメールが6時前に
到着しているので驚くのですが。結構多いんですね。
374:デフォルトの名無しさん
09/06/28 05:43:54
>>311 サービスで仕様を拡張していますが、そこはそのままにすると、
g1(L) :- g1_prompt,read(X),g1_2(X,L).
g1_2(end,[]).
g1_2(A,[A|R]) :- \+(A==end),g1_prompt,read(B),g1_2(B,R).
g1_prompt :- write('input=').
ですか。
375:デフォルトの名無しさん
09/06/28 05:44:31
早朝派じゃないのに書き込んでみるテスト
Prologって研究には良さそうでも就職にはヤヴァそう
C, C++, Java辺りを必須という求人は何度も見たことはあるが
Prolog必須という求人は見たことがない
376:デフォルトの名無しさん
09/06/28 05:52:09
なぜか日本では皆無ですね。
うちがそのうちのせますが。いまはきゅうじんのよゆうなし。
377:374
09/06/28 06:15:11
何の話か明確にすると、
?- ... , g1(L), ... ,fail.
のように、一度end入力で終了したg1がバックトラックによって、
再び実行の可能性が生まれた場合に、意図通りの結果になるかと
いうことです。
378:デフォルトの名無しさん
09/06/28 07:47:04
それから、いろんな言語で宿題スレですが、私のPrologコードは
課題を示したレス番号の頭にtをつけたHTMLファイルを
nojiriko.asia/prolog/ というディレクトリに全部コピーすることに
しています。メールなどで間違っているんじゃないかと指摘を受けた
場合は、このサイトの方はできるだけ速やかに訂正しますが、宿題スレ
の方にはその旨の書き込みはしません。いつの間にか書き換わって
いることも多いのでちょっと覗いてみてください。
379:デフォルトの名無しさん
09/06/28 08:03:33
>>375
いまやビジネスの世界はひたすら論理。今まで日本は会社規則があっても
無視してたり。契約書作成しようと思うと取引先から敬遠されたりと、
論理的なことを何かと回避できる環境にあった。
んでまぁそういう時代は終わりを迎えている。
今や本屋の自己啓発本コーナに行けば論理が大事だ、という本が置かれ、
論理に対する需要と言うのはかなり上がっている。
確かに一般に普及する可能性は低いけど、上記の論理的な力を必要とする層
(金融とかコンサルとか上流の方々ね)には教育用ツールとして需要がある
可能性はある。例えば、『〜論理トレーニング』という本の内容として
prologによる論理トレーニングとか。
あとは、企業の訴訟リスクが上がっているとかなんとか理由つけて法律の
エキスパートシステム作ってみるとか。
裁判所の判例はもはや膨大で、弁護士費用は高い。とりあえず、抱えている案件に
合致する判例があるかどうか探索するシステムとか作れば結構いけるんじゃない。
法律家の助けが必要だけど。差別化は結構できるんじゃないかね。
380:デフォルトの名無しさん
09/06/28 08:08:52
あと、心理学の人と、認知科学の人、哲学の人も必須だな。
普通にやると第五世代と同じ末路になる。
あと問題は日本語文のパターンマッチかな。
381:デフォルトの名無しさん
09/06/28 08:12:55
うーん。微妙な日本語だ。
382:デフォルトの名無しさん
09/06/28 08:30:47
あと20年前と違うのはWebの発展なんだから、セマンティックウェブ関連で
なんか出来そう。
500億かけた研究結果がそのまんま公開されてて、しかもどうやらあんまり
中身を見られていないみたいなんだし、意外と宝の山かもしれないよ。
(評価計算の方法がわからないし、現在価値としては下がっているけど
少なくとも数千万ぐらいの資本価値はあると考えてもいいはず。いきなり
数千万資本をゲットできるというのはそれなりにお得な気はする。)
見直す価値がある可能性はある。
383:デフォルトの名無しさん
09/06/28 14:59:53
「いろんな言語で宿題スレ」の中で
スレリンク(tech板:168番)
スレリンク(tech板:225番)
といったProlog向き問題が未回答となっています。
どなたか、よろしくお願いします。
384:デフォルトの名無しさん
09/06/30 05:45:20
前に10000Tipsは著作権の問題が出てくるということを書いたのですが、
意味がわからんとのご意見メールをいただきました。
私の「Tip」のイメージを示します。これで2Tips。
燃ゆる頬(ラグビーの頬傷ほてる海見ては).
燃ゆる頬(車輪繕う地のたんぽゝに頬つけて).
燃ゆる頬(目つむりていても吾を統ぶ五月の鷹).
燃ゆる頬(沖もわが故郷ぞ小鳥湧き立つは).
<以下略>
句集(燃ゆる頬,寺山修司,ラグビーの頬傷ほてる海見ては).
句集(燃ゆる頬,寺山修司,車輪繕う地のたんぽゝに頬つけて).
句集(燃ゆる頬,寺山修司,目つむりていても吾を統ぶ五月の鷹).
句集(燃ゆる頬,寺山修司,沖もわが故郷ぞ小鳥湧き立つは).
<以下略>
385:デフォルトの名無しさん
09/06/30 07:48:21
----- ここまで役に立つTipなし
386:デフォルトの名無しさん
09/06/30 15:44:51
Tips というより、データベースでは?
387:デフォルトの名無しさん
09/06/30 17:06:38
>>386
Prologですからデータベースですが、それをTipという感覚でやろうということです。
福島さんが100mの日本記録出した時、何歩で走ったか。これをビデオで確認したから
述語としておこう。これでひとつ。
Googleで検索できない対象というのがありますね。一つには過去の文献や文学作品の
内容に関する部分。無尽蔵にあります。これはTipとして復活するだけで価値がある。
構造のしっかりしたデータベースである必要もないし、述語として十分に機能する
必要さえない。気楽に日常的に拾い上げられることだけが大事です。
388:デフォルトの名無しさん
09/06/30 18:55:33
天気(神奈川,20090630,晴れ).
389:デフォルトの名無しさん
09/06/30 18:58:04
好き(イチノ,理美).
390:デフォルトの名無しさん
09/06/30 21:26:12
% p(原因, 結果)
?- p(X, 俺に彼女ができる).
false
391:デフォルトの名無しさん
09/07/01 02:15:02
マル得Prologトリビア探検隊
URLリンク(gollem.science.uva.nl)
SWI-Prolog 5.6.60 Reference Manual
> \
> +/1
> /2
> 1
> =/2
> ==/2
> =@=/2
URLリンク(www.ic.unicamp.br)
SWI-Prolog 3.2.9 Reference Manual
> \
> /1
> /2
> 1
> /2
> =/2
> @=/2
\+と\=の消え方が変化している
392:387
09/07/01 05:32:35
気楽にと書きましたが、逆に徹底してとか、偏執狂的にというのも
あるでしょう。ある書物を徹底的に述語化してしまうとなどがこれ
です。古典的なものはもちろん現代の例えば白書的なものでも、
表、グラフの述語化は十分に有用で希少価値を持ちます。社会的に
文章、表、グラフなどの中立をする形式は未開拓であり、未完成に
放置しても、後に利用、発展が自然に可能なProlog述語への書き換
えは有力なものではないでしょうか。
393:デフォルトの名無しさん
09/07/01 05:59:28
>>391
わからないです(><;)
394:デフォルトの名無しさん
09/07/01 06:13:14
前スレに書いたことですが、私のインタプリタ環境で
?- 相模(X).
と質問すると答えが返ってきます。相模/1は未定義ですが。
未定義の質問が(導出の最中でも)現れると、その述語名の
性質を調べて、関係ありそうな分野からの検索します。分野には
古典文学->歴史文献->地名等 の優先順位がつけられているため
?- 相模(X).
X = 花ならぬなぐさめもなき山里に桜はしばし散らずもあらなむ;
X = なにか思ふなにをか嘆く春の野に君よりほかに菫つませじ;
X = 見わたせば波のしがらみかけてけり卯の花さける玉川の里
no という具合になります。この歌並びからこれは千人万首を
検索してるだけだなとわかってしまいますw
セマンティックウェブの話もありましたが、ウェブに頼らずこういった
情報発信を自らPrologサーバからやろうではないかということです。
多くのボランティア的献身によって(千人万首もそうだ)我々のウェブ
環境は豊かになりましたが、的確に得られる情報は未だ極々僅かです。
負担にならない蒐集・表示形式としてPrologが活躍する余地は大きい
ように思いますが如何でしょうか?
395:デフォルトの名無しさん
09/07/01 06:38:23
URLリンク(www.eng.cam.ac.uk)
> Tabbing commands
> * \= (set tab)
:
> * \+ (indent; move margin right)
URLリンク(www.eng.cam.ac.uk)
> Exceptions to this rule:
> * \ itself because \\ has its own special meaning. Use $\backslash$.
このへんだな
396:デフォルトの名無しさん
09/07/01 10:04:07
やばい>>395のLaTeX説は眉唾だった。\/が消える説明がつかない。
URLリンク(prolog.cs.vu.nl)
Perlでひたすらs/.../.../g;していたとは。。
397:デフォルトの名無しさん
09/07/01 12:16:39
split(5, [3,7,2,6,5,8], Before, After).
Before = [3,2,5] (5と同じか、小さい数のリスト)
After = [7,6,8] (5より大きい数のリスト)
このようにリストの中を与えた数より大きいか小さいかで分けたいのですが
どうすればよいのでしょうか?
398:デフォルトの名無しさん
09/07/01 12:24:08
>>325以降をどうぞ
399:デフォルトの名無しさん
09/07/02 00:01:03
>>387
opencycとかWordnetの日本版ってこと?
400:デフォルトの名無しさん
09/07/02 06:39:12
>>399
そうですねとは、さすがにいえないw まだ何も始まってないから。
ライブラリを目指すのではなく、
断簡、反古として知識、ルールの切れっ端を
可能な限り隙間なく集める。述語とする。
ありとあらゆる分野に於いて。
使い手は適宜、論理変数を補充して、自分にふさわしい
使い方を見つける。
10000Tipsとは極度に控えめに言っている。
10000があっという間ではないかと予感させる一例を。
典拠不詳(古墳多くは少年の人).
/* でも、 */
古墳多くは少年の人(求塚,世阿弥,典拠不詳).
/* でも */
述語にしておこうと思い立った人が閃いた形式で登録すればよい。
典拠不詳であることが大事なのか、世阿弥の求塚という作品に
「古墳多くは少年の人」という一節があることを伝えたいのか、
そんなことはどうでもよい。心にとまったことを書き付ける形式が
ひとつあるということだけが大事なのだ。
401:デフォルトの名無しさん
09/07/02 15:48:03
Prologトリビア探検隊・予感編
URLリンク(dspace.wul.waseda.ac.jp)
> 充足する必要のある 2 つの別の目標 (goal) からなる質問の組み合わせは、
:
> ゴールの充足が試みられたとき、箱の中にある節と適合してその節の
:
> 1. クエリーとして、hoge(F, name5)が入力されたとき、
C&M邦訳を要約したと思われる部分だけカタカナ語が少ない。
402:デフォルトの名無しさん
09/07/03 00:28:35
>>400
意図としては大体了解できたと思う。ただ、
>>ありとあらゆる分野に於いて。
というのは、気を悪くして欲しくないけど、それは危険フラグだ。
辞書爆発が問題で使い物にならないといわれているのに、
改めてそれに無策で挑むというのは、人を説得しきれない。
むしろ分野を限りなく限定させてしまったほうが面白い結果が
得られるかもしれない、と無責任に思う。
403:デフォルトの名無しさん
09/07/03 01:01:58
URLリンク(abelard.flet.keio.ac.jp)
404:デフォルトの名無しさん
09/07/03 02:44:42
言語哲学にどう接続させるか。
405:デフォルトの名無しさん
09/07/03 10:01:55
URLリンク(sourceforge.jp)
> あらゆる情報を Prolog のプログラムとして蓄積する為の基盤作りをしようと思います。
> 登録日: 2009-07-01 08:05
またそういう
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4808日前に更新/227 KB
担当:undef