5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

Prologでまったり Part4

1 :デフォルトの名無しさん:2009/02/25(水) 20:23:54
過去スレ
Prologでまったり Part3
http://pc11.2ch.net/test/read.cgi/tech/1193354806/
PrologでまったりPart 2
http://pc11.2ch.net/test/read.cgi/tech/1102664221/
Prolog でまったり
http://pc5.2ch.net/test/read.cgi/tech/976462999/
リンク集
http://www.summa.jp/lang/logic/prolog.htm
http://bach.istc.kobe-u.ac.jp/prolog/

チュートリアル
http://www.amzi.com/AdventureInProlog/
http://computing.unn.ac.uk/staff/cgpb4/prologbook/
http://www.intranet.csupomona.edu/~jrfisher/www/prolog_tutorial/pt_framer.html
http://bach.istc.kobe-u.ac.jp/prolog/intro/
http://www.geocities.jp/m_hiroi/prolog/
http://www.asahi-net.or.jp/~JF1T-YSD/prologV2/

2 :デフォルトの名無しさん:2009/02/25(水) 20:27:17
P-99: Ninety-Nine Prolog Problems
https://prof.ti.bfh.ch/hew1/informatik3/prolog/p-99/

3 :デフォルトの名無しさん:2009/02/25(水) 20:32:21
新スレおめでとうございます。

4 :デフォルトの名無しさん:2009/02/25(水) 22:16:07
404 Not Found
http://www.summa.jp/lang/logic/prolog.htm
http://www.asahi-net.or.jp/~JF1T-YSD/prologV2/

5 :デフォルトの名無しさん:2009/02/26(木) 00:35:26
乙( >>1 ).

6 :デフォルトの名無しさん:2009/02/26(木) 01:30:05
>>4
http://lang.x0.com/logic/prolog/
http://light21.s26.xrea.com/prologV2/
ほい移転先

7 :デフォルトの名無しさん:2009/03/05(木) 07:55:28
まったりしてきた

8 :デフォルトの名無しさん:2009/03/07(土) 11:57:29
以下の住所に関する事実
address([bitdiddle, ben], [slumerville, [ridge, road], 10]).
address([hacker, alyssa, p], [cambridge, [mass, ave], 78]).
address([fect, cy, d], [cambridge, [ames, street], 3]).
address([tweakit, lem, e], [boston, [bay, state, road], 22]).
address([reasoner, louis], [slumerville, [pine, tree, road], 80]).
address([warbucks, oliver], [swellesley, [top, heap, road]]).
address([scrooge, eben], [weston, [shady, lane], 10]).
address([cratchet, robert], [allston, [n, harvard, street], 16]).
address([aull, dewitt], [slumerville, [onion, square], 5]).
から、各々近場にいる人について述べる述語livesNearを作りたいのですが、
livesNear(Person1, Person2) :- address(Person1, [Town|Rest1]),
                address(Person2, [Town|Rest2]),
                not(same(Person1, Person2)).
こう作ってしまう場合、livesNear(P,Q)と問い合わせをすると(Aさん,Bさん)
という組み合わせと、(Bさん、Aさん)という入れ替えたものの2つが重複
して出てくることになります。
重複しないようにするにはどうすればいいでしょうか。

9 :デフォルトの名無しさん:2009/03/07(土) 12:00:16
sameという述語の定義は
same(X,X).
です。

10 :デフォルトの名無しさん:2009/03/07(土) 17:50:00
>>8
p(a).
p(b).
の述語定義がされているとします。
?- p(X),p(Y),not(X=Y).
X = a,
Y = b;
X = b,
Y = a;
no
の重複を回避する方法はありません。重複を回避するには、最初から、
p/1でなく、p/2を
p(1,a).
p(2,b).
のように定義して、
?- p(N1,X),p(N2,Y),N1<N2.
N1 = 1,
X = a,
N2 = 2,
Y = b;
no とするのが一案。
述語p/1のままだと、
組合せ(X,1,[A]) :- member(A,X).
組合せ([A|Y],N,[A|X]) :- N > 1,M is N - 1,組合せ(Y,M,X).
組合せ([_|Y],N,A) :- N > 1,組合せ(Y,N,A).
?- findall(U,p(U),L),組合せ(L,2,[X,Y]).
が考えられます。

11 :デフォルトの名無しさん:2009/03/08(日) 02:43:41
「重複しない」という事の意味が漏れには分からない。というか課題の定義が曖昧だと思う。

述語livesNear/2の意味は「Person1の近場にPerson2が住んでいる」だよね?
もしそうなら「Aさんの近場にBさんが...」と「Bさんの近場にAさんが...」という
「重複した」結果こそ正しいと思う。両者の間には双方向な関連があるのだから。
もし問い合わせが livesNear('Aさん', P) あるいは livesNear('Bさん', P) だとしたら、
「重複しない」という述語定義に対して、>>8 はどんな結果を期待するのだろうか。

12 :デフォルトの名無しさん:2009/03/08(日) 16:24:31
>>10
どうもありがとうございます。数字と対応づけしないといけないんですか。

>>11
主として、これは疑問文として使用します。
叙述としては、確かに(Aさん、Bさん)、(Bさん、Aさん)とは
同格として扱うべきですが、疑問文として、
「この住所録の中の人物の中で、お互いに近くに住んでいる人たちは、
誰と誰ですか?」
という問の回答として、「AさんとBさん、あと、BさんとAさんです。」は、
不自然です。

13 :デフォルトの名無しさん:2009/03/08(日) 17:55:27
なんとかできました。
map([bitdiddle, ben], 0).
map([hacker, alyssa, p], 1).
map([fect, cy, d], 2).
map([tweakit, lem, e], 3).
map([reasoner, louis], 4).
map([warbucks, oliver], 5).
map([scrooge, eben], 6).
map([cratchet, robert], 7).
map([aull, dewitt], 8).
と対応をつけた上で、
livesNear(Person1, Person2) :- address(Person1, [Town|Rest1]),
               address(Person2, [Town|Rest2]),
               map(Person1,Number1),
               map(Person2,Number2),
               Number1 < Number2.
としました。

14 :デフォルトの名無しさん:2009/03/08(日) 18:47:19
>>11 です。

では、質問の意図は「(近場に住む人同士における)関連の存在」を質問しているのではなく、
「(近場に住む人々を)列挙する」ことにあると考えていいのかな?(回りくどくてゴメソ)
もしそうであれば、近場に3人以上の人が住んでいるケースでは、リストを使わないと
列挙できないから、問い合わせは livesNear(P,Q) ではなく、以下のようなコードになる。

findAllLivesNear(People) :-
 !,
 findall(Town, address(_, [Town|_]), Towns),
 reject_duplicates(Towns,T), % 重複している要素を取り除く
 findAllLivesNear(T, People).

findAllLivesNear([], []) :- !.
findAllLivesNear([T|Town], [P|People]) :-
 findall(Person, address(Person, [T|_]), P),
 length(P, Length),
 Length >= 2,
 !,
 findAllLivesNear(Town, People).
findAllLivesNear([_|Town], People) :-
 !,
 findAllLivesNear(Town, People).

15 :デフォルトの名無しさん:2009/03/08(日) 18:49:36
% リロードするんだった.....orz

>>14 実行結果は以下のとおり。ご参考まで。

?- findAllLivesNear(P).
P = [
    [[hacker, alyssa, p], [fect, cy, d]],
    [[bitdiddle, ben], [reasoner, louis], [aull, dewitt]]
].

回答は「hackerとfect、あと、bitdiddleとreasonerとaullです」となって不自然さは無い。

16 :デフォルトの名無しさん:2009/03/09(月) 14:40:11
この問題は?
例 2.2 7つの部屋がある。その内の4つの部屋を4人のプログラマの事務
室として割当て、残りの3つの部屋をコンピュータ端末機器を設置する
部屋としたい。このような割当て方は7×6×5×4=840通りある。
『組合せ構造とグラフ理論入門』C.L.リュー著 成瀬弘、秋山仁共訳 マグロウヒル好学社 p42
より、
さて、この840通りをすべて数え上げる非決定性述語を定義せよ。

17 :デフォルトの名無しさん:2009/03/09(月) 18:05:15
処理系に依存する問題をひとつ。
「千人万首 ―よよのうたびと―」という高名な和歌サイト
http://www.asahi-net.or.jp/~SG2H-YMST/yamatouta/sennin.html
から情報を引き出し、
第一引数に作者名を与えると、第二引数にその作者の歌が
一首づつとりだせる述語 千人万首/2 を定義しなさい。
ただし、取り出すのは歌本体のみで題や解説、類歌、本歌などは
削ぎ落としてください。

18 :デフォルトの名無しさん:2009/03/09(月) 19:10:48
まあ、こんな感じで「Prolog述語 1000Tips」を目指します。

19 :デフォルトの名無しさん:2009/03/09(月) 20:16:58
>>18
1000分野、10000Tips行きましょう。


20 :デフォルトの名無しさん:2009/03/10(火) 05:42:50
1/10000Tips
どんな情報源でもよいから、そらで覚えていれば勿論それでよいから、
和暦、西暦変換述語を作れ。

21 :デフォルトの名無しさん:2009/03/10(火) 05:45:04
1/10000Tips


22 :デフォルトの名無しさん:2009/03/10(火) 05:48:32
1/10000Tips
ジョギングシュミレーター(サイト)を参考にして、
体重、走行距離、タイムから、消費エネルギーと脂肪燃焼量を得る述語を
定義せよ。

23 :デフォルトの名無しさん:2009/03/10(火) 06:00:11
>>18->>22
出典の記載ルール等を決めておかないといけない。
オブジェクト指向的な枠組みがないから、
述語で定義するとして、標準的な述語構成例が欲しい。


24 :デフォルトの名無しさん:2009/03/10(火) 06:10:29
それから、問題を出すときは、
1/10000Tips (解答準備済み/解答準備未了)
等のコメントを入れて、未解決問題がスレに大量に残ることを避けよう。
解答準備済みで出題した人は様子を見て、良いタイミングで模範?解答を
載せるべし。


25 :デフォルトの名無しさん:2009/03/10(火) 07:28:55
>>23
述語定義して公開するなると、著作権の問題が出てきます。
Prologの書籍50冊分の巻末参考文献を全部sortして述語として
公開するとする。私はその文献の内2%くらいしか目を通した
ことがない。それでも誰も文句をいわないだろう。ところが、
古川康一著「Prolog入門」の参考文献だけを述語定義して載せた
場合はどうなのか?これは問題になるかな。

26 :デフォルトの名無しさん:2009/03/11(水) 06:49:31
httpd_status_code(100,'Continue','この応答はクライアントへの仮の応答です。多くの
場合、プロキシーやサーバーは、最終的な応答を返すまでにはまだ時間がかかる場合にこ
のコードを使います。'
httpd_status_code(101,'Switching Protocols','HTTP/1.1では現在は使われていません
が、準拠しているアプリケーションがUpgradeヘッダーに示される、より有利なプロトコ
ルや効果的なプロトコルに切り替えようとしていることを示します。').
httpd_status_code(200,'OK','全般的に成功したことを示します。').
httpd_status_code(201,'Created','このコードは、PUTリクエストへのレスポンスで用い
ることができるコードで、新しいリソースが作成されて利用可能であることを示します')
.
<以下略>
この述語の場合は、http://www.amazon.co.jp/dp/4894710412/ からの
全コピーであることは明らかです。実際、Prolog述語はこういうのだらけ。
前スレにちょっとだけ著作権の話がでたと思うけど書物を写し取った述語の
公開できるのはどの範囲か。Webサイトの場合はどうか。

27 :デフォルトの名無しさん:2009/03/11(水) 07:14:52
ちょっと話が逸れますが、>>26の場合は10年近く前に本を傍らに置いて
タイプした。ところが今はこのくらいの情報はWebから入手できる。
そういう変化は、Prolog言語の意味をも決定的に変えたと思う。以前は
単位節データベースとルール節はある程度バランスを保っていたが、
現在では、99%以上が単位節、しかも>>26に見られるように、将来の利用に
含みを残して、原文そのままを引数に取り込む。Prologの解説書で示される
開発手法やプログラミング事例とは全く違う。10000Tipsの狙いは、そういう
ことをはっきり示すことでもあります。

28 :デフォルトの名無しさん:2009/03/11(水) 08:00:34
>>27
10000Tipsにしても、ここよりも日本Prolog協会のメーリングリストで提起する方が
相応しい課題ではないかな。


29 :デフォルトの名無しさん:2009/03/11(水) 17:35:35
>>27
徹底して非形式的なデータ蒐集に努めるというのは面白いかも。
例えば、述語名が衝突したらその時点で何か解決策を捜す。


30 :デフォルトの名無しさん:2009/03/13(金) 11:16:14
>>27
以前はPrologプログラムの開発時間はプログラマのタイプ時間に
近似していたのだが、最近は検索ルールを書く時間に近くなった
ことは確かだな。


31 :デフォルトの名無しさん:2009/03/13(金) 11:34:02
Prologって結局、「とまり木言語」なのかも知れない。
最終的にはデータベースやXMLファイルとして振り分けられるでしょ。
考えてみればAI言語を標榜していた頃からずっとそうじゃないか。


32 :デフォルトの名無しさん:2009/03/14(土) 05:55:59
>>27
ルール節って書かない?


33 :デフォルトの名無しさん:2009/03/15(日) 06:04:24
>>32
書かない。負節は書くw
このスレでも強調されているように、結局Prologプログラミングは
member/2,append/3,findall/3の繰り返し。少し前に出てきた組合せ系
の述語などがライブラリ化していると、もうほとんどルールを書く
必要はない。負節のログに頭部を付加してライブラリに加えることは
ある。
以前は**コードなどの処理も書いたから、1342という口座番号を
'0001342'にするヘッドゼロサプライ処理などが文字列からparse_atom
する度に発生した。それで手続的決まり文句も随分と書いたが、10年
くらいまえに書き尽くした。

34 :デフォルトの名無しさん:2009/03/15(日) 06:46:09
自動仕訳ルールの追加というようなことは日常的に発生するが、それも
銀行口座の明細から取得するような場合は、すでに形式化しているから、
単位節一節の追加だし、摘要的な記述からの場合もS,V,Oが確定すれば
ほぼ決定的になる。この場合、本体に2副目標を持つルール節を一つ追加。

35 :デフォルトの名無しさん:2009/03/15(日) 07:15:04
ごめん。本体に1副目標を持つルール節一つを追加。でした。

36 :デフォルトの名無しさん:2009/03/15(日) 17:48:02
>>33
むかしエキスパートシステムに書いたような簡単なif-thenルールなら、
今でも書くと思うけど。subgoalが1-3個くらいのやつ。


37 :35:2009/03/16(月) 04:15:51
Oが複数でてくることもあり、やはり本体1副目標では決まらず
2~3副目標になることも多いようです。

38 :デフォルトの名無しさん:2009/03/17(火) 07:43:36
頭痛がしてきた

39 :デフォルトの名無しさん:2009/03/17(火) 07:45:42
1/10000Tips



40 :デフォルトの名無しさん:2009/03/17(火) 08:57:53
一向に中身のあるTipは現れないw
初心者のための言語スレに誤爆してしまった

41 :デフォルトの名無しさん:2009/03/22(日) 05:44:26
本でも読めば。

42 :デフォルトの名無しさん:2009/03/22(日) 10:10:04
入門者です。前スレにでていたPrologで学ぶAIプログラミングを買ってみました。
二章のLHKあたりで既に挫折しそう…

15 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)