1read 100read
2011年10月1期プログラムPrologの宿題片付けます
TOP カテ一覧 スレ一覧 削除依頼 ▼
・ 次のスレ
2ch規制回避手段を考える
ダメな現場にありがちなこと100個あげるスレ
【JavaScript系】 NILScript 【AutoHotkey風】
C++は糞スレ
Prologの宿題片付けます
- 1 :10/04/23 〜 最終レス :11/12/16
- Prologで宿題が出たら、自分でプログラムが書くことができた
人も、思い悩んでいる人も、ここにその問題を載せてください。
宿題はその講座がどんな内容かをちょっとだけ垣間見させて
くれます。
全国の大学に100を越える講座があるといわれるProlog。
どんな宿題がでてくるのか楽しみです。
- 2 :
- プロローグここまで
- 3 :
- 予想1 すぐ過去ログ倉庫に流れる
予想2 質問と回答の文体が一致したまま何年も存続
予想3 事務処理の問題ばかりになる
- 4 :
- <問題> Prologでhttpdサーバーを構築しなさい。
- 5 :
- 完全なウェブサーバーを構築するとなると
ちょっと大変だなぁ。宿題の域を越えている。
- 6 :
- HTTP1.0を実装することに絞ったとしても、数百行は必要なんじゃないか。
- 7 :
- >>6
http://nojiriko.asia/prolog/httpd_status_code.html
この中のhttpd_status_code/3だけで36行w
- 8 :
- >>4 は少し風呂敷を広げすぎてる感じがする。
apache.conf(apache2.conf)を仕様書と見立てて、単位節を定義し、
それにルールを付加していくことでhttpdサーバーの実装を試みなさい。
なんていうのなら、面白そう。
- 9 :
- >>8
なるほどね。それでは
<問題>
apache.confのような解説文とキーワードが区別なくコメントアウトされて
いる仕様書から、キーワード定義だけ述語として定義するためのルールを
Prolog述語として定義しなさい。
- 10 :
- >>9
例えば、
# Include the virtual host configurations:
# Include /etc/apache2/sites-enabled/
で、上は説明。下は定義節。とどうやって切り分けるのかな。
- 11 :
- >>8 をやってみて、それから >>9 を試みる方がよさそうだ。
- 12 :
- >>8
やってはみたが、何の役にも立たないw
'ServerRoot'("/etc/apache2").
'LockFile'(' /var/lock/apache2/accept.lock').
'PidFile'('/var/run/apache2.pid').
'Timeout'(300).
'KeepAlive'('On').
'MaxKeepAliveRequests'(100).
'KeepAliveTimeout'(15).
'StartServers'(5) :- 'IfModule'('mpm_prefork_module').
'MinSpareServers'(5) :- 'IfModule'('mpm_prefork_module').
'MaxSpareServers'(10) :- 'IfModule'('mpm_prefork_module').
'MaxClients'(150) :- 'IfModule'('mpm_prefork_module').
'MaxRequestsPerChild'(0) :- 'IfModule'('mpm_prefork_module').
'StartServers'(2) :- 'IfModule'('mpm_worker_module').
'MaxClients'(150) :- 'IfModule'('mpm_worker_module').
'MinSpareThreads'(25) :- 'IfModule'('mpm_worker_module').
'MaxSpareThreads'(75) :- 'IfModule'('mpm_worker_module').
'ThreadsPerChild'(25) :- 'IfModule'('mpm_worker_module').
'MaxRequestsPerChild'(0) :- 'IfModule'('mpm_worker_module').
'User'('www-data').
'Group'('www-data').
'AccessFileName'('.htaccess').
'DefaultType'('text/plain').
'HostnameLookups'('Off').
- 13 :
- >>8 続き
'ErrorLog'('/var/log/apache2/error.log').
'LogLevel'('warn').
'Include'('/etc/apache2/mods-enabled/*.load').
'Include'('/etc/apache2/mods-enabled/*.conf').
'Include'('/etc/apache2/httpd.conf').
'Include'('/etc/apache2/ports.conf').
'LogFormat'('"%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""',combined).
'LogFormat'('"%h %l %u %t \"%r\" %>s %b"',common).
'LogFormat'('"%{Referer}i -> %U"',referer).
'LogFormat'('"%{User-agent}i"',agent).
'ServerTokens'('Full').
'ServerSignature'('On').
'Include'('/etc/apache2/conf.d/').
'DocumentRoot'('/').
'order'([allow,deny]) :- 'Directory'('/').
'alow'(from(all)) :- 'Directory'('/').
'Include'('/etc/apache2/sites-enabled/').
- 14 :
- >>12
確かに役にたたない。apacheのconfigってこんなに簡素なものだったかな。
全然、httpdの全体像が見えてこないね。このアプローチは失敗ということで。
- 15 :
- 以前はapache.conf一本に纏めてあったのが、現在はincludeファイルに分散している
だけの違いだろう。全部、includeしてから作業をしなくてはいけない。
- 16 :
- <問題> 行列が単位行列であるかどうか検査する述語 単位行列/1 を定義せよ。
- 17 :
- >>16
<問題> 単位行列であるかどうかの検査には正方行列であるかどうかの
検査も必要です。この検査述語 正方行列/1 も定義せよ。
- 18 :
- >>17
正方行列(_正方行列) :-
length(_正方行列,_行数),
正方行列(1,_行数,_正方行列).
正方行列(N,_次数,[]) :-
N > _次数,!.
正方行列(N,_次数,[_行|R]) :-
length(_行,_次数),
N2 is N + 1,
正方行列(N2,_次数,R).
- 19 :
- >>16
単位行列(_単位行列) :-
正方行列(_単位行列),
length(_単位行列,_次数),
単位行列(1,_次数,_単位行列).
単位行列(M,N,[]) :- M > N,!.
単位行列(M,N,[_行|R]) :-
単位行列(M,1,N,_行),
M2 is M + 1,
単位行列(M2,N,R).
- 20 :
- >>19 一番肝心な定義が切れてしまった。
単位行列(M,N1,N,[]) :- N1 > N,!.
単位行列(M,M,N,[1|R]) :-
N2 is M + 1,
単位行列(M,N2,N,R).
単位行列(M,N1,N,[0|R]) :-
\+(N1 = M),
N2 is N1 + 1,
単位行列(M,N2,N,R).
- 21 :
- <問題> {やや、曖昧で文学的な文章を述語定義すること}
「ダンスは・・・・・・魂の原型が、いまだ男性的とも女性的とも分かれていないで、ただ≪人間的≫としか
いいあらわすことができないような・・・・・・深みとつながっている」。このマックス・テルピスの言葉(原註64)は、
とくにダンス・クラシック・アカデミックにあてはまる。ダンス・クラシックの舞踊家が完全なる人間を
表すとすれば、この舞踊家は、二つの性を兼ねた人間の原型を表しているのだ。つまり、舞踊家の中に、二つの
性をもった人間の原型が回想されるのである。
この文は『バレエ 形式と象徴』 ゲルハルト・ツァハリアス著 渡辺鴻訳 美術出版社 1965年 の中にあります。
この文の要旨のメモをProlog述語として記述するなら、どんな定義になりますか?
- 22 :
- <問題> 森と林
森と林はどちらも樹木の集合、塊ですが、
林は、同じ種類の樹木で構成され、
森は、いろいろな種類の樹木が混ざった状態のものだと考えられます。
森と林をProlog述語として定義しなさい。
- 23 :
- >>22
「林は概ね同じ種類の樹木で構成され」ですね。
雑木林という概念はありますがこれは例外です。この例外も
述語としての定義に含めてください。
- 24 :
- 誰の譯だか忘れたけれど、「流浪の民」の出だしは
"ブナの森の葉隠に"じゃなかったかな?
- 25 :
- >>23
概ねの閾値(0.9).
林は概ね同じ種類の樹木で構成され(_林) :-
list(_林),
概ねの閾値(_概ねの閾値),
length(_林,_木の本数),
setof(_木,member(_木,_林),L),
findmax([Count,_木],(member(_木,L),count(member(_木,_林),Count)),[_一番多い木の本数,_一番多い木]),
_一番多い木の本数 >= truncate(_木の本数 * _概ねの閾値).
- 26 :
- >>23
混在の閾値(3/13).
森は、いろいろな種類の樹木が混ざった状態(_森) :-
list(_森),
混在の閾値(N1/N2),
length(L0,N2),
先頭から全ての連続した一定要素の中に閾値以上の混在が見られる(N1/N2,L0,_森).
先頭から全ての連続した一定要素の中に閾値以上の混在が見られる(N1/N2,L0,L) :-
length(L,Len),
Len < N2,!.
先頭から全ての連続した一定要素の中に閾値以上の混在が見られる(N1/N2,L0,_森) :-
append(L0,L1,_森),
setof(_樹木,member(_樹木,L0),L),
length(L,Len),
Len < N1,!,fail.
先頭から全ての連続した一定要素の中に閾値以上の混在が見られる(N1/N2,L0,[_|R]) :-
先頭から全ての連続した一定要素の中に閾値以上の混在が見られる(N1/N2,L0,R).
- 27 :
- >>26
% これだと12本以下の樹木の集合は種類を問わず「森」になってしまう。
% 少々武骨だが、以下の2副目標を加える必要がある。
森は、いろいろな種類の樹木が混ざった状態(_森) :-
list(_森),
length(_森,_樹木の本数),
_樹木の本数 >= N2,
混在の閾値(N1/N2),
length(L0,N2),
先頭から全ての連続した一定要素の中に閾値以上の混在が見られる(N1/N2,L0,_森).
- 28 :
- >>27 まちがえた。Prologは遅延評価しないからね。
森は、いろいろな種類の樹木が混ざった状態(_森) :-
list(_森),
length(_森,_樹木の本数),
混在の閾値(N1/N2),
_樹木の本数 >= N2,
length(L0,N2),
先頭から全ての連続した一定要素の中に閾値以上の混在が見られる(N1/N2,L0,_森).
- 29 :
- <問題> 例えば、2引数の述語fooが'foo#2.pro'というファイルに
管理されているとします。このfoo/2の最終に引数で与えられた
節を追加する述語をfassertz/2を定義しなさい。
第一引数にはファイル名、第二引数には定義節が来ることとします。
- 30 :
- <問題> ユーザ定義述語が多数定義済みの環境を考えます。
定義済み節の本体に現れる副目標を引数に与えて、
その副目標を含む述語定義をすべて表示する述語を
定義しなさい。
- 31 :
- >>30
listing_subgoal(Subgoal) :-
listing_subgoal(Subgoal,L),
listing_subgoal_表示(L).
listing_subgoal(Subgoal,L) :-
tmpnam(File),
tell(File),
listing,
told,
see(File),
read(X),
listing_subgoal(X,Subgoal,[],L),
seen.
listing_subgoal(end_of_file,_,L1,L2) :- reverse(L1,L2),!.
listing_subgoal((Head :- Body),Subgoal,L1,L2) :-
listing_subgoal_search(Subgoal,Body),
functor(Head,F,A),
\+(member(F/A,L)),
read(X),
listing_subgoal(X,Subgoal,[F/A|L1],L2).
lilsting_subgoal(_,Subgoal,L1,L2) :-
read(X),
listing_subgoal(X,Subgoal,L1,L2).
- 32 :
- >>30 つづき
listing_subgoal_search(Subgoal,V) :- var(V),!,fail.
listing_subgoal_search(Subgoal,Subgoal) :- !.
listing_subgoal_search(Subgoal,call(P)) :- listing_subgoal_search(Subgoal,P),!.
listing_subgoal_search(Subgoal,findall(_,P,_)) :- listing_subgoal_search(Subgoal,P),!.
listing_subgoal_search(Subgoal,setof(_,P,_)) :- listing_subgoal_search(Subgoal,P),!.
listing_subgoal_search(Subgoal,bagof(_,P,_)) :- listing_subgoal_search(Subgoal,P),!.
listing_subgoal_search(Subgoal,count(P,_)) :- listing_subgoal_search(Subgoal,P),!.
listing_subgoal_search(Subgoal,max(P,_)) :- listing_subgoal_search(Subgoal,P),!.
listing_subgoal_search(Subgoal,min(P,_)) :- listing_subgoal_search(Subgoal,P),!.
listing_subgoal_search(Subgoal,avg(P,_)) :- listing_subgoal_search(Subgoal,P),!.
listing_subgoal_search(Subgoal,findmax(_,P,_)) :- listing_subgoal_search(Subgoal,P),!.
listing_subgoal_search(Subgoal,findmin(_,P,_)) :- listing_subgoal_search(Subgoal,P),!.
listing_subgoal_search(Subgoal,findavg(_,P,_)) :- listing_subgoal_search(Subgoal,P),!.
listing_subgoal_search(Subgoal,(P1,P2)) :-
listing_subgoal_search_3(Subgoal,P1,P2),!.
listing_subgoal_search(Subgoal,(P1;P2)) :-
listing_subgoal_search_3(Subgoal,P1,P2),!.
listing_subgoal_search_3(Subgoal,P1,P2) :-
listing_subgoal_search(Subgoal,P1),!.
listing_subgoal_search_3(Subgoal,P1,P2) :-
listing_subgoal_search(Subgoal,P2),!.
listing_subgoal_表示([]) :- !.
listing_subgoal_表示([F/A|R]) :- listing(F/A),listing_subgoal_表示(R).
- 33 :
- >>29
fassertz(File,P) :-
open(File,append,Output),
writeq(Output,P),
write(Output,'.\n'),
close(Output),!.
- 34 :
- >>29
fassertz(File,P) :-
reconsult(File),
assertz(P),
fassert_functor(P,F,A),
tell(File),
lisitng(F/A),
told.
fassertz_functor((Head :- Body),F,A) :-
functor(Head,F,A),!.
fassertz_functor(P,F,A) :-
functor(P,F,A),!.
- 35 :
- <問題>
先頭要素と同じ要素が残りに現れるリストがあります。このリストを第一引数として、この先頭要素と同じ要素の
一つ前と一つ後ろの要素が存在するならばこの3要素を第二引数にリストして返す非決定性の述語を定義しなさい。
- 36 :
- >>35
リストの先頭要素と同じ要素の一つ前と一つ後ろの要素が存在するならばこの3要素を第二引数にリストして返す([B|R],
[A,B,C]) :-
append(_,[A,B,C|_],[B|R]).
- 37 :
- <問題>
リストの要素として、4個目の'a'を見つけて残りのリストを返す述語を定義しなさい。
- 38 :
- <問題>
リストの要素が変数Xで与えられるとする。N個目のXの残りのリストを返す述語を定義しなさい。
- 39 :
- >>37
'リストの要素として、4個目のaを見つけて残りのリストを返す'(_リスト,_残りリスト) :-
append(L0,_残りリスト,_リスト),
count(append(_,[a|_],L0),4),!.
- 40 :
- >>38
'リストの要素が変数Xで与えられるとする。N個目のXの残りのリストを返す'(N個目,X,_リスト,_残りリスト) :-
append(L0,_残りリスト,_リスト),
count(append(_,[X|_],_リスト),N個目),!.
- 41 :
- <問題>
リストの中の要素Xの残りのリストがパターンPに適合するからどうか判定する述語を定義しなさい。
パターンとの照合はこの述語のなかでcall(P)することで実現するものとする。
- 42 :
- >>41
リストの中の要素Xの残りのリストがパターンPに適合するからどうか判定する述語(_リスト,X,P,R) :-
append(_,[X|R],_リスト),
call(P).
% 要点は、引数にRを持つこと。そして、実際に目標とする時はPの引数の中にRが含ませる。
- 43 :
- >>42
% 要点は、引数にRを持つこと。そして、実際に目標とする時はPの引数の中にRを含ませる。
?- リストの中の要素Xの残りのリストがパターンPに適合するからどうか判定する述語([1,2,3,4,6,2,1],3,max(R,6),R).
R = [4,6,2,1]
yes
?- リストの中の要素Xの残りのリストがパターンPに適合するからどうか判定する述語([1,2,3,4,6,2,1],3,max(R,2),R).
no
?- リストの中の要素Xの残りのリストがパターンPに適合するからどうか判定する述語([1,2,3,4,6,2,1],3,length(R,Len),R).
R = [4,6,2,1],
Len = 4
yes
?-
- 44 :
- >>43
すみません、訂正。>>43の三番目のパターンのような使い方も可だが。
?- リストの中の要素Xの残りのリストがパターンPに適合するからどうか判定する述語([1,2,3,4,6,2,1],3,length(R,4),R).
R = [4,6,2,1]
yes
?-
- 45 :
- <問題>
親子(義朝,頼朝).
親子(為義,義朝).
先祖(A,B) :- 親子(A,B).
先祖(A,B) :- 親子(A,C),先祖(C,B).
先祖関係をProlog述語として定義すると上記のようになるでしょう。
ところで、この定義なぜ親子関係だけ具体的な値で示されているので
しょうか。なぜルールで定義されていないのでしょうか。
どのような切り口、表現でも構いませんから、平易に説明してください。
- 46 :
- <問題>
以下の文章は原色図鑑ライブラリー「蛾」監修 河田黨 1955年北隆館発行 からの抜粋です
ごまだらきこけが [ひとりが科]
開帳は23~32mm。体と翅は赤味がかった黄色で前翅には15個の黒い斑点がある。
発生するのは6~7月頃で普通にみられる種類である。分布は本邦はじめ広くアジアに
ひろがっている。幼虫は背に青い点を2列もった灰色の毛虫で長い毛があるひとりが科
の中でもこけがといわれる種類のものは,大部分その名の通り幼虫はコケ類を食べる。
ここで示されている情報をProlog述語として定義せよ。
- 47 :
- >>46
% あまりにも基本的な解答例
出典('原色図鑑ライブラリー「蛾」監修 河田黨 1955年北隆館',_).
蛾(ごまだらきこけが,ひとりが科,'開帳は23~32mm。体と翅は赤味がかった黄色で前翅に
は15個の黒い斑点がある。分布は本邦はじめ広くアジアにひろがっている。幼虫は背に青
い点を2列もった灰色の毛虫で長い毛があるひとりが科の中でもこけがといわれる種類の
ものは,大部分その名の通り幼虫はコケ類を食べる。') :- 出典('原色図鑑ライブラリー「蛾」監修 河田黨 1955年北隆館',_).
- 48 :
- <問題>
述語 蛾/3 が>>47の形式で与えられたとして、第一引数の検索語から
和名、説明文を得る非決定性の述語 蛾検索/3 を定義しなさい。
- 49 :
- >>41->>44
パターンを引数に与えて検索すること自体がPrologプログラミングと
して誤った姿勢であると思う。
常にそのパターン検出述語を定義してから、検索すること。
このことを厭うならPrologプログラマとして失格だ。
高階述語を使うのは仕様の文章に強制された場合だけ。
- 50 :
- >>49
基本的に、その見解に賛成。>>45の解とも重なるが、常に具体的な何かを
見据えたプログラミング姿勢が必要だと思う。
>>41はappendの利用法の勉強のための問題で、なにをやりたいかを強調するために
引数の中にその要求を埋めたように思うけれど。
- 51 :
- >>48
蛾検索(_検索語,_和名,_説明文) :-
蛾(_和名,_科,_説明文),
蛾検索(_検索語,_説明文).
蛾検索(_検索語,_説明文) :-
sub_atom(_説明文,_,_,_,_検索語),!.
- 52 :
- >>48
蛾検索(_検索語,_和名,_説明文) :-
蛾(_和名,_科,_説明文),
検索語が説明文の中にある(_検索語,_説明文).
検索語が説明文の中にある(_検索語,_説明文) :-
sub_atom(_説明文,_,_,_,_検索語),!.
- 53 :
- <問題>
>>48 に於いて、
蛾検索(_検索語,_和名,_説明文) :-
蛾(_和名,_科,_説明文),
sub_atom(_説明文,_,_,_,_検索語).
としていない理由を述べなさい。
- 54 :
- <問題>
>>52 に於いて、
蛾検索(_検索語,_和名,_説明文) :-
蛾(_和名,_科,_説明文),
sub_atom(_説明文,_,_,_,_検索語).
としていない理由を述べなさい。・・・でした。
- 55 :
- <問題>
バラディゼールで行われた1971-72年シーズンのアルペンスキーFISワールドカップ大回転緒戦で
優勝した選手は誰か。その選手は札幌オリンピックではどんな成績をあげたか。
これをWebサイト、新聞、雑誌、書籍等で調べて、Prolog述語としてその全ての情報を定義しなさい。
- 56 :
- >>55 訂正
バルディゼール
- 57 :
- <問題>
なおここで、女性の官人についても触れておくべきであろう。後宮に奉仕する女官を総称して宮人と
いうが、高級の女官は命婦といった。命婦のうちでも五位以上の階位のある者を内命婦と呼び、五位以
上の官人の妻は、自分で位をもっていなくても、夫の資格によって五位に準じて宮中に出入することを
許されていた。これを外命婦という。だから、五位以上の貴族の妻は、位階の有無にかかわらず女官で
あったと考えてよい。
-- 「律令制の基調」 村尾次郎著 塙書房 昭和35年 -- より
上記の文章をProlog述語として定義しなさい。
- 58 :
- >>57 について
Prologの課題はそのまま文章を載せたいので、著作権の関係から出題を躊躇することが多い
けれど、この本は50年を経過しています。
村尾氏というと「右寄りの」歴史学者の先入観からあまり読んだことがなかったのですが、
論理的な文章を書かれる方だし、この本などは無限に問題を引き出すことができそうですね。
- 59 :
- >>55 について
1971年バルディゼール大回転の優勝者はエリック・ホーケル(ハーカー)だ。この新人は
大胆なストレート内傾ターンで途中転倒したにも拘らずすぐに起き上がりこのレースで
ワールドカップ初優勝を飾る。1973年苗場で行われたワールドカップ大回転を制して
日本では特に有名な彼だが、札幌オリンピックでは大回転一本目にラップを取りながら
二本目リズムに乗れないまま、前半の急斜面で転倒棄権した。しかし、滑降では5位に
入賞している。
- 60 :
- >>59
これは、情報を収集して、それを述語として定義する問題ですね。
そんなに簡単に完璧なヒントを出してしまったら・・・。
- 61 :
- >>55
'バルディゼールで行われた1971-72年シーズンのアルペンスキーFISワールドカップ大回転緒戦で優勝した選手は誰か。その選手は札幌オリンピックではどんな成績をあげたか。'(_誰,_札幌オリンピックでの成績) :-
'バルディゼールで行われた1971-72年シーズンのアルペンスキーFISワールドカップ大回転緒戦で優勝した選手は'(_誰),
その選手は札幌オリンピックではどんな成績をあげたか。(_誰,_札幌オリンピックでの成績).
その選手は札幌オリンピックではどんな成績をあげたか。(_誰,_札幌オリンピックでの成績) :-
資料('THE XI OLYMPIC WINTER GAMES SAPPORO 1972','http://www.la84foundation.org/6oic/OfficialReports/1972/orw1972.pdf'),
findall([_種目,_成績],オリンピック(_,札幌,_種目,成績,_誰),_札幌オリンピックでの成績).
バルディゼールで行われた1971-72年シーズンのアルペンスキーFISワールドカップ大回転緒戦で優勝した選手は(_誰) :-
資料(ヒント,'http://pc12.2ch.net/test/read.cgi/tech/1272006124/59'),
スキーワールドカップ(1971/_/_,バルディゼール,大回転,'1位',_誰).
スキーワールドカップ(1971/12/12,バルディゼール,大回転,'1位','エリック・ホーケル(ハーカー)').
オリンピック(1972/2/7,札幌,滑降,'5位','エリック・ホーケル(ハーカー)').
オリンピック(1972/2/9,札幌,大回転,'DNF','エリック・ホーケル(ハーカー)').
オリンピック(1972/2/13,札幌,回転,'DNF','エリック・ホーケル(ハーカー)').
資料('THE XI OLYMPIC WINTER GAMES SAPPORO 1972','http://www.la84foundation.org/6oic/OfficialReports/1972/orw1972.pdf').
資料(ヒント,'http://pc12.2ch.net/test/read.cgi/tech/1272006124/59').
- 62 :
- >>57
宮人(_宮人) :-
奉仕する(_宮人,後宮),
女官(_宮人).
命婦(_命婦) :-
女官(_命婦),
クラス(_命婦,高級).
内命婦(_内命婦) :-
命婦(_内命婦),
位階(_内命婦,五位以上).
外命婦(_外命婦) :-
命婦(_外命婦),
夫(_外命婦,_官人),
位階(_官人,五位以上).
宮中に出入りできる(_外命婦) :- 外命婦(_外命婦).
宮中に出入りできる(_官人) :- 官人(_官人).
官人(_官人) :- 位階(_官人,五位以上).
- 63 :
- >>57
宮人(_宮人) :- 奉仕する(_宮人,後宮),女官(_宮人).
女官(_女官) :- 官人(_女官),性別(_女官,女).
命婦(_命婦) :- 女官(_命婦),内命婦(_命婦).
命婦(_命婦) :- 女官(_命婦),外命婦(_命婦).
内命婦(_内命婦) :- 命婦(_内命婦),位階(_内命婦,五位以上).
外命婦(_外命婦) :-
命婦(_外命婦),
\+(位階(_外命婦,_五位以上)),
夫(_外命婦,_夫),
位階(_夫,_五位以上),
五位以上(_五位以上).
宮中に出入りできる(_外命婦) :- 外命婦(_外命婦).
宮中に出入りできる(_官人) :- 官人(_官人),位階(_官人,_五位以上),五位以上(_五位以上).
五位以上(_五位以上) :-
member(_五位以上,[一位,従一位,二位,従二位,三位,従三位,四位,従四位,五位,従五位]).
- 64 :
- f(A,A):-1=1,!.
1=1を消して
このカットを引数のすぐ左に持ってくることはできますか?
- 65 :
- >>64
1)引数というのはこのばあいA,Aのことになるが・・・
!,f(A,A). はダメ。
f(A,!,A).
f(!,A,A). 3引数の別の述語定義と看做される。
引数として!をこのように表記すると多分syntax errorとなる。
f(A,(!),A).
f((!),A,A). なら可。
2)質問が引数ではなくて「本体」の 1=1のことを指していると考えよう。
1=1がtrueの代用だと考えると、
f(A,A) :- !.
f(A,A) :- true,!. と
f(A,A) :- !,true. は実質的に同じ意味。
ただ処理系によっては若干実行過程は異なるだろう。
- 66 :
- >>54
説明文のなかに検索語が複数含まれていると、
その回数分、_和名、_説明文が解として取れてしまう。
sub_atomを決定性の述語として扱うために再定義して
その本体に!を付加している。
- 67 :
- <問題> 「漁業情報学概論」小倉通男・竹内正一共著 成山堂書店刊 1990年
から、78頁の以下の文章を切り取りました。この文章からメモとして有用な
Prolog述語を定義しなさい。
カツオは南・北緯40°間に広く分布する熱帯性ないし温帯性の表層回遊魚で
ある。太平洋のカツオは西部太平洋系群と中東部太平洋系群の2つに分けられ
るが,形態による識別は困難であるといわれる。日本漁船が漁獲対象としてい
るのは,大部分が西部太平洋系群と考えられている。
- 68 :
- <問題> ある小さな農園で自家製ジュースを販売することになりました。
バラ売りの単位として
1.. 250cc
2.. 500cc
3.. 1L
そしてケース売りの単位として、
5.. 250ccが12個
6.. 1Lが12個
7.. 250ccが60個
を用意することになりました。この単位をProlog述語 '荷姿' として定義しなさい。
- 69 :
- >>67
生息域分類(_カツオ,_表層回遊魚) :- カツオ(_カツオ),表層回遊魚(_表層回遊魚).
分布(_カツオ,_南・北緯40°間) :- カツオ(_カツオ),南・北緯40°間(_南・北緯40°間).
環境(_カツオ,熱帯性) :- カツオ(_カツオ),生息環境(_カツオ,_環境),熱帯性(_環境).
環境(_カツオ,温帯性) :- カツオ(_カツオ),生息環境(_カツオ,_環境),温帯性(_環境).
系統(_カツオ,西部太平洋系) :- カツオ(_カツオ),特徴(_カツオ,_特徴),西部太平洋系(_カツオ,_特徴).
系統(_カツオ,中東部太平洋系) :- カツオ(_カツオ),特徴(_カツオ,_特徴),中東部太平洋系(_カツオ,_特徴).
識別困難(_系統1,_系統2) :-
カツオ(_カツオ1),特徴(_カツオ1,_特徴1),系統(_カツオ1,西部太平洋系群),
カツオ(_カツオ2),特徴(_カツオ2,_特徴2),系統(_カツオ2,中東部太平洋系群).
日本漁船の漁獲対象(_カツオ,西部太平洋群) :- カツオ(_カツオ),系統(_カツオ,西部太平洋系群).
- 70 :
- >>68
:- op(200,xf,cc).
:- op(200,xf,'L').
荷姿(1,'250cc',250 cc).
荷姿(2,'500cc',500 cc).
荷姿(3,'1L',1 'L').
荷姿(5,'12*250cc',12*250 cc).
荷姿(6,'12*1L',12*1 'L').
荷姿(7,'60*250cc',60*250 cc).
荷姿単位変換(1,'L',0.25).
荷姿単位変換(2,'L',0.5).
荷姿単位変換(3,'L',1.0).
荷姿単位変換(5,'L',3.0).
荷姿単位変換(6,'L',12.0).
荷姿単位変換(7,'L',15.0).
荷姿単位変換(1,'cc',250).
荷姿単位変換(2,'cc',500).
荷姿単位変換(3,'cc',1000).
荷姿単位変換(5,'cc',3000).
荷姿単位変換(6,'cc',12000).
荷姿単位変換(7,'cc',15000).
- 71 :
- <問題>
誤差の大きい(正確でない)情報を積極的に利用すること。
Prologに限らないが、プログラミングの仕様のほとんどが著作権を侵害している
可能性を持っている。多くの事実としての情報が本、雑誌など過去の著作物に
由来するからだ。そこで、この問題を回避するひとつの方法は正確でない情報を
積極的に利用することが考えられる。2010年5月24日の日本経済新聞朝刊の一面に
「時価総額630兆円減」という記事がある。この中に描かれた世界の株式時価総額と
いうグラフから 述語 'MSCI世界株価指数' と 述語 時価総額 を定義しなさい。
このグラフには(注)として、このグラフの情報が国際取引連盟(WFE),MSCIのデータを
もとに作成したものであることが記されているが、ここではこの原データは得られ
ないものとする。
- 72 :
- >>70
ケース売り(_荷姿ID) :- 荷姿(_荷姿ID,_,_*_ cc),!.
ケース売り(_荷姿ID) :- 荷姿(_荷姿ID,_,_*_ 'L'),!.
バラ売り(_荷姿ID) :- 荷姿(_荷姿ID,_,_量 cc),number(_量),!.
バラ売り(_荷姿ID) :- 荷姿(_荷姿ID,_,_量 'L'),number(_量),!.
% 第三引数に複合項を持ってきたことの弊害が顕れている。
- 73 :
- <問題>
文字列を解析して、拡大係数行列を得るProlog述語を定義しなさい。
ただし項は例えば、3 * (a ^ 2) は 3a2 のように表現されていることとする。
- 74 :
- <問題>
>>61は>>55の仕様を十分に満たすものといえよう。しかし、>>59のヒントには、
さらに豊かな情報が含まれているが述語化する中で抜け落ちてしまっている。
この新人は大胆なストレート内傾ターンで途中転倒したにも拘らずすぐに起き上がりこのレースで
ワールドカップ初優勝を飾る。
の部分だ。このような核から外れているが実は貴重な情報をさりげなく
含ませる試みとして、>>61を書き直してください。
- 75 :
- >>71
時価総額('200801',54,兆円).
時価総額('200802',55,兆円).
時価総額('200803',52,兆円).
時価総額('200804',55,兆円).
時価総額('200805',54,兆円).
時価総額('200806',52,兆円).
時価総額('200807',50,兆円).
時価総額('200808',48,兆円).
時価総額('200809',43,兆円).
時価総額('200810',33,兆円).
時価総額('200811',32,兆円).
時価総額('200812',33,兆円).
時価総額('200901',32,兆円).
時価総額('200902',29,兆円).
時価総額('200903',30,兆円).
時価総額('200904',34,兆円).
時価総額('200905',37,兆円).
時価総額('200906',37,兆円).
時価総額('200907',41,兆円).
時価総額('200908',42,兆円).
時価総額('200909',44,兆円).
時価総額('200910',44,兆円).
時価総額('200911',46,兆円).
時価総額('200912',48,兆円).
- 76 :
- >>71 訂正
時価総額('200801',54,兆ドル).
時価総額('200802',55,兆ドル).
時価総額('200803',52,兆ドル).
時価総額('200804',55,兆ドル).
時価総額('200805',54,兆ドル).
時価総額('200806',52,兆ドル).
時価総額('200807',50,兆ドル).
時価総額('200808',48,兆ドル).
時価総額('200809',43,兆ドル).
時価総額('200810',33,兆ドル).
時価総額('200811',32,兆ドル).
時価総額('200812',33,兆ドル).
時価総額('200901',32,兆ドル).
時価総額('200902',29,兆ドル).
時価総額('200903',30,兆ドル).
時価総額('200904',34,兆ドル).
時価総額('200905',37,兆ドル).
時価総額('200906',37,兆ドル).
時価総額('200907',41,兆ドル).
時価総額('200908',42,兆ドル).
時価総額('200909',44,兆ドル).
時価総額('200910',44,兆ドル).
時価総額('200911',46,兆ドル).
時価総額('200912',48,兆ドル).
- 77 :
- >>71 つづき
時価総額('201001',47,兆ドル).
時価総額('201002',46,兆ドル).
時価総額('201003',49,兆ドル).
時価総額('201004',49,兆ドル).
時価総額('201005',44,兆ドル).
- 78 :
- >>71
日本経済新聞の紙面グラフから読み取った世界株式時価総額(_年月,_時価総額,_最大誤差,_単位) :-
情報の最大誤差(2,_単位),
時価総額(_年月,_時価総額,_単位).
情報の最大誤差(2,兆円).
- 79 :
- >>78 (>>71) ごめん訂正。
日本経済新聞の紙面グラフから読み取った世界株式時価総額(_年月,_時価総額,_最大誤差,_単位) :-
情報の最大誤差(_最大誤差,_単位),
時価総額(_年月,_時価総額,_単位).
情報の最大誤差(2,兆円).
- 80 :
- >>71
日本経済新聞の紙面グラフから読み取った世界株価指数(_年月,_世界株価指数,_最大誤差) :-
世界株価指数(_年月,_世界株価指数),
世界株価指数最大誤差(_最大誤差).
世界株価指数最大誤差(20).
日本経済新聞世界株価指数記事日付('20100524').
世界株価指数('200801',370).
世界株価指数('200803',360).
世界株価指数('200804',375).
世界株価指数('200805',385).
世界株価指数('200806',355).
世界株価指数('200807',340).
世界株価指数('200808',320).
世界株価指数('200809',300).
世界株価指数('200810',275).
世界株価指数('200811',225).
世界株価指数('200812',220).
- 81 :
- >>71 つづき
世界株価指数('200901',230).
世界株価指数('200902',210).
世界株価指数('200903',190).
世界株価指数('200904',200).
世界株価指数('200905',225).
世界株価指数('200906',240).
世界株価指数('200907',240).
世界株価指数('200908',285).
世界株価指数('200909',285).
世界株価指数('200910',295).
世界株価指数('200911',290,).
世界株価指数('200912',285).
世界株価指数('201001',295).
世界株価指数('201002',305).
世界株価指数('201003',305).
世界株価指数('201004',290).
世界株価指数('201005',270).
- 82 :
- <問題>
いろんな言語で宿題 第四編@プログラム板
http://pc12.2ch.net/test/read.cgi/tech/1268003943/472
三目ならびの述語 勝ちパターン/1 のソースプログラムを生成する述語を定義しなさい。
- 83 :
- >>82
三目ならび -> 三目ならべ
- 84 :
- >>74
'1971年',バルディゼール,大回転,'エリック・ホーケル(ハーカー)',新人,初優勝,大胆な,ストレート内傾ターン,転倒,
起き上がる,ワールドカップ初優勝
このくらいの要素の組み合わせで単位節を構成すればいいのかな?
ここの一節が札幌オリンピックの二本目を暗示してるのだとしたら、それはどう表現するのだろう。
- 85 :
- <問題>
与えられた文字列に含まれる整数を表す副文字列の中で最長のものを取り出しなさい。
- 86 :
- <問題>
与えられた文字列に含まれる数値文字列で1.0-49.0(整数であってもよい)の
範囲の数値文字列を取り出しなさい。
- 87 :
- >>85
% Prolog 小数文字列の排除を考慮しなければもっとすっきりするのだが。
与えられた文字列に含まれる整数を表す副文字列の中で最長のものを取り出す(_文字列,_整数を表す副文字列の中で最長の文字列) :-
atom_chars(_文字列,Chars),
与えられた文字列に含まれる整数を表す副文字列ならび(Chars,_副文字列とその長さならび),
findmax(_文字列長,(member([_,_文字列長],_副文字列とその長さならび),_文字列長>0),_最長文字列長),
member([_整数を表す副文字列の中で最長の文字列,_最長文字列長],_副文字列とその長さならび).
与えられた文字列に含まれる整数を表す副文字列ならび(Chars,[[_副文字列,_文字列長]|R2]) :-
append(_,[A|R],Chars),
A @>= '0',
A @=< '9',
先頭から整数を表す副文字列を切り出す([A|R],_副文字列,_残りならび),
文字列長(_副文字列,_文字列長),
与えられた文字列に含まれる整数を表す副文字列ならび(_残りならび,R2).
与えられた文字列に含まれる整数を表す副文字列ならび(_,[]).
先頭から整数を表す副文字列を切り出す(Chars,'',[B|R2]) :-
append(L1,['.'|R],Chars),
R=[A|R2],
A @>= '0',
A @=< '9',!,
append(_,[B|R2],R),
\+((B @>= '0',B @=< '9')).
先頭から整数を表す副文字列を切り出す(Chars,_副文字列,[A|R]) :-
append(L1,[A|R],Chars),
\+((A @>= '0',A @=< '9')),
concat_atom(Chars,_副文字列),!.
先頭から整数を表す副文字列を切り出す(Chars,_副文字列,[]) :- concat_atom(Chars,_副文字列).
- 88 :
- >>86
% Prolog
'与えられた文字列に含まれる数値文字列で1.0-49.0(整数であってもよい)の範囲の数値文字列を取り出す'(_文字列,_副文字列) :-
atom_chars(_文字列,Chars),
数値ならびを切り出す(Chars,L,_),
number_chars(V,L),
V >= 1.0,V =< 49.0,
concat_atom(L,_副文字列).
'与えられた文字列に含まれる数値文字列で1.0-49.0(整数であってもよい)の範囲の数値文字列を取り出す'(_文字列,_副文字列) :-
atom_chars(_文字列,Chars),
数値ならびを切り出す(Chars,L,_残りならび),
concat_atom(_残りならび,L3),
'与えられた文字列に含まれる数値文字列で1.0-49.0(整数であってもよい)の範囲の数値文字列を取り出す'(L3,_副文字列).
数値ならびを切り出す(Chars,L,_残りならび) :-
先頭が数値文字であるならびを切り出す(Chars,L1),
ひとつだけピリオドを含む数値文字ならびを切り取る(L1,L,_残りならび),!.
先頭が数値文字であるならびを切り出す(Chars,[A|R]) :- append(L0,[A|R],Chars),A @>= '0',A @=< '9',!.
一つだけピリオドを含む数値文字ならびを切り取る([],[],[]) :- !.
一つだけピリオドを含む数値文字ならびを切り取る(['.'|R1],['.'|R2],R3) :- すべてが数値文字のならびを切り取る(R1,R2,R3),\+(R2=[]),!.
一つだけピリオドを含む数値文字ならびを切り取る(['.'|R1],[],['.'|R1]) :- !.
一つだけピリオドを含む数値文字ならびを切り取る([A|R1],[],[A|R1]) :- \+((A @>= '0',A @=< '9')),!.
一つだけピリオドを含む数値文字ならびを切り取る(['.'|R1],['.'|R2],R3) :- すべてが数値文字のならびを切り取る(R1,R2,R3),!.
一つだけピリオドを含む数値文字ならびを切り取る([A|R1],[A|R2],R3) :- A @>= '0',A @=< '9',一つだけピリオドを含む数値文字ならび(R1,R2,R3).
- 89 :
- >>46
% Prolog
蛾(ごまだらきこけが,ひとりが科).
開帳(ごまだらきこけが,成虫,'23~32mm').
色(ごまだらきこけが,成虫,体と翅,赤味がかった黄色).
斑点(ごまだらきこけが,成虫,体と翅,前翅,'15個').
分布(ごまだらきこけが,本邦広くアジアにひろがっている).
食性(ごまだらきこけが,幼虫,コケ類).
長い毛(ごまだらきこけが,幼虫).
青い点(ごまだらきこけが,幼虫,背中に2列).
色(ごまだらきこけが,幼虫,灰色).
- 90 :
- >>46
% Prolog
(_ごまだらきこけが,ひとりが科) :- ごまだらきこけが(_ごまだらきこけが).
開帳(_ごまだらきこけが,成虫,'23~32mm') :- ごまだらきこけが(_ごまだらきこけが).
色(_ごまだらきこけが,成虫,体と翅,赤味がかった黄色) :- ごまだらきこけが(_ごまだらきこけが).
斑点(_ごまだらきこけが,成虫,体と翅,前翅,'15個') :- ごまだらきこけが(_ごまだらきこけが).
分布(_ごまだらきこけが,本邦広くアジアにひろがっている) :- ごまだらきこけが(_ごまだらきこけが).
食性(_ごまだらきこけが,幼虫,コケ類) :- ごまだらきこけが(_ごまだらきこけが).
長い毛(_ごまだらきこけが,幼虫) :- ごまだらきこけが(_ごまだらきこけが).
青い点(_ごまだらきこけが,幼虫,背中に2列) :- ごまだらきこけが(_ごまだらきこけが).
色(_ごまだらきこけが,幼虫,灰色) :- ごまだらきこけが(_ごまだらきこけが).
- 91 :
- >>46
% Prolog 書き直し
蛾(_ごまだらきこけが,ひとりが科) :- ごまだらきこけが(_ごまだらきこけが).
開帳(_ごまだらきこけが,成虫,'23~32mm') :- ごまだらきこけが(_ごまだらきこけが).
色(_ごまだらきこけが,成虫,体と翅,赤味がかった黄色) :- ごまだらきこけが(_ごまだらきこけが).
斑点(_ごまだらきこけが,成虫,体と翅,前翅,'15個') :- ごまだらきこけが(_ごまだらきこけが).
分布(_ごまだらきこけが,本邦広くアジアにひろがっている) :- ごまだらきこけが(_ごまだらきこけが).
食性(_ごまだらきこけが,幼虫,コケ類) :- ごまだらきこけが(_ごまだらきこけが).
長い毛(_ごまだらきこけが,幼虫) :- ごまだらきこけが(_ごまだらきこけが).
青い点(_ごまだらきこけが,幼虫,背中に2列) :- ごまだらきこけが(_ごまだらきこけが).
色(_ごまだらきこけが,幼虫,灰色) :- ごまだらきこけが(_ごまだらきこけが).
- 92 :
- >>91 たとえば、
あるものの幼虫はコケ類を食べる。そういうあるもののひとつは、ごまだらきこけがだ。
と読めばよいと思う。
- 93 :
- 出題者ではありませんが、勝手に批評します。
>>89
同じ項構造で他の生物にも適用できるよう、項: 蛾/2 は以下の方が
命題として適切ではないかと考えます。
種(ごまだらきこけが, 蛾). % ごまだらきこけがの種は蛾である。
科(ごまだらきこけが, ひとりが). % ごまだらきこけがの科はひとりがである。
項: 色/2 と 色/3 で混在していますが、どちらかに統一すべきだと考えます。
色(ごまだらきこけが, 成虫の体と翅, 赤味がかった黄色).
色(ごまだらきこけが, 幼虫, 灰色).
または
色(ごまだらきこけが, 成虫, 体と翅, 赤味がかった黄色).
色(ごまだらきこけが, 幼虫, 全体, 灰色).
>>90
ごまだらきこけが以外の蛾も多数登録されているものとして、
食性について問い合わせる場合を考えます。
?- 食性(_蛾, _, コケ類) % コケ類を食べる蛾は何か?
_蛾=ごまだらきこけが
>>90では、変数 _蛾 がアトムにならず変数のままですから、この問い合わせには
回答できていません。従って、解答としては>>89のほうが適切ではないかと考えます。
- 94 :
- >>93を自己訂正
>項: 色/3 と 色/4 で混在していますが、どちらかに統一すべきだと考えます。
>
> 色(ごまだらきこけが, 成虫の体と翅, 赤味がかった黄色). % 色/3 で統一
> 色(ごまだらきこけが, 幼虫, 灰色).
>
>または
>
> 色(ごまだらきこけが, 成虫, 体と翅, 赤味がかった黄色). % 色/4 で統一
> 色(ごまだらきこけが, 幼虫, 全体, 灰色).
- 95 :
- >>93
適切な批評をいただき感謝します。
色のアリティが二種類になっているのは好ましくないですね。
種、科については、可能な限り、仕様(ここでは問題文)の文面から
述語名や変数名を拾うことを旨としているので、出てきませんでした。
とはいえ、私も「食べる」を「食性」に置き換えたりしていますが、
言語、概念による補強は必要だし、そうすることで述語として「強く」
なることも事実ですね。
>>90については、途中で端折りますが、以下のようなら自然でしょうか。
ごまだらきこけが(_ごまだらきこけが) :-
色(_ごまだらきこけが,幼虫,全体,灰色),
色(_ごまだらきこけが,成虫,赤味がかった黄色).
色(ごまだらきこけが,幼虫,全体,灰色),
色(ごまだらきこけが,成虫,赤味がかった黄色).
食性(ごまだらきこけが,幼虫,コケ類).
- 96 :
- >>95
>>>90については、途中で端折りますが、以下のようなら自然でしょうか。
いいえ、不自然です。この問題(仕様)はすべてファクト(事実)から構成されています。
出題者の意図(文脈)は知りませんが、単純なのにわざわざ複雑なルール(推論)を組み込むのは、
解答として適切であるとは思えません。
もし納得できないようでしたら、いったんPrologプログラミングから離れて
数学の命題論理(初等数理論理学の一部)を勉強されることをお勧めします。
- 97 :
- 本質に迫るツッコミktkr
- 98 :
- >>96
確かに。命題論理の勉強をします。カツオの定義など支離滅裂ですね。
私はPrologの核は単位節データベースであって、実際宿題スレでもデータベース板SQLの質問から
多数問題を採用してきました。一方、
このスレと「いろんな言語で宿題」スレに共通して、
親子(為義,義朝).
親子(義朝,頼朝).
先祖(A,B) :- 親子(A,B).
先祖(A,B) :- 親子(A,C),先祖(C,B).
という定義に於いて、先祖/2はルールなのに、親子/2はなぜ事実なの?親子もルールで
書いていくとどうなるの?という疑問に対して、何らかの答えだすという試みもして
きました。
よく分かっていないことは事実とせず、これからそれについてはルールが来るのだ、
今のところまだ未定義だけどね、というのが指摘いただいた箇所の意図であり、
奇妙な表現に拘る言い訳ということになります。
- 99 :
- >>98
Prologの単位節は「関係の存在」というファクト(事実)を表現しています。
以下は源一族の家系の一部をファクトだけで表現した一例(の一部)です。
親_子(為義, 義朝). % 為義と義朝の間には親-子という関係が存在する。
先祖_子孫(為義, 頼朝). % 為義と義朝の間には先祖-子孫という関係が存在する。
家系が「ファクトだけで表現できる」のが分かるかと思います。
同様にごまだらきこけが(あるいは蛾という生物系)についてもファクトだけで表現できます。
ですから、単位節だけで表現できる課題(仕様)については、それだけで解答すべきであると考えます。
また、複数のファクトから新たな「関係の存在」を表現したのがルール(規則)です。
先祖_子孫(A, B) :- 親_子(A, B).
% ある人物AとBについて、AとBの間に親-子という関係が存在するならば、
% AとBの間には先祖-子孫という関係が存在する。
先祖_子孫(A, B) :- 親_子(A, C), 親_子(C, B),.
% ある人物AとBとCについて、AとCの間に親-子という関係が存在し、かつCとBの間に
% 親-子という関係が存在するならば、AとBの間には先祖-子孫という関係が存在する。
ファクト(事実)とルール(規則)は、どちらも「関係の存在」を表現しています。
Prologで記述した場合、その項の名前は関係の名前を指します。
ここで、>>90,91,95における項「ごまだらきこけが(_)」について、
**** ごまだらきこけがは関係ではありません!! ****
ですから、これらの解答は明らかに不自然です。
- 100read 1read
- 1read 100read
TOP カテ一覧 スレ一覧 削除依頼 ▲
・ 次のスレ
2ch規制回避手段を考える
ダメな現場にありがちなこと100個あげるスレ
【JavaScript系】 NILScript 【AutoHotkey風】
C++は糞スレ