Prologで宿題が出たら、自分でプログラムが書くことができた
人も、思い悩んでいる人も、ここにその問題を載せてください。
宿題はその講座がどんな内容かをちょっとだけ垣間見させて
くれます。
全国の大学に100を越える講座があるといわれるProlog。
どんな宿題がでてくるのか楽しみです。
プロローグここまで
予想1 すぐ過去ログ倉庫に流れる
予想2 質問と回答の文体が一致したまま何年も存続
予想3 事務処理の問題ばかりになる
<問題> Prologでhttpdサーバーを構築しなさい。
完全なウェブサーバーを構築するとなると
ちょっと大変だなぁ。宿題の域を越えている。
HTTP1.0を実装することに絞ったとしても、数百行は必要なんじゃないか。
>>4 は少し風呂敷を広げすぎてる感じがする。
apache.conf(apache2.conf)を仕様書と見立てて、単位節を定義し、
それにルールを付加していくことでhttpdサーバーの実装を試みなさい。
なんていうのなら、面白そう。
>>8 なるほどね。それでは
<問題>
apache.confのような解説文とキーワードが区別なくコメントアウトされて
いる仕様書から、キーワード定義だけ述語として定義するためのルールを
Prolog述語として定義しなさい。
>>9 例えば、
# Include the virtual host configurations:
# Include /etc/apache2/sites-enabled/
で、上は説明。下は定義節。とどうやって切り分けるのかな。
>>8 をやってみて、それから
>>9 を試みる方がよさそうだ。
>>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').
>>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/').
>>12 確かに役にたたない。apacheのconfigってこんなに簡素なものだったかな。
全然、httpdの全体像が見えてこないね。このアプローチは失敗ということで。
以前はapache.conf一本に纏めてあったのが、現在はincludeファイルに分散している
だけの違いだろう。全部、includeしてから作業をしなくてはいけない。
<問題> 行列が単位行列であるかどうか検査する述語 単位行列/1 を定義せよ。
>>16 <問題> 単位行列であるかどうかの検査には正方行列であるかどうかの
検査も必要です。この検査述語 正方行列/1 も定義せよ。
>>17 正方行列(_正方行列) :-
length(_正方行列,_行数),
正方行列(1,_行数,_正方行列).
正方行列(N,_次数,[]) :-
N > _次数,!.
正方行列(N,_次数,[_行|R]) :-
length(_行,_次数),
N2 is N + 1,
正方行列(N2,_次数,R).
>>16 単位行列(_単位行列) :-
正方行列(_単位行列),
length(_単位行列,_次数),
単位行列(1,_次数,_単位行列).
単位行列(M,N,[]) :- M > N,!.
単位行列(M,N,[_行|R]) :-
単位行列(M,1,N,_行),
M2 is M + 1,
単位行列(M2,N,R).
>>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).
<問題> {やや、曖昧で文学的な文章を述語定義すること}
「ダンスは・・・・・・魂の原型が、いまだ男性的とも女性的とも分かれていないで、ただ≪人間的≫としか
いいあらわすことができないような・・・・・・深みとつながっている」。このマックス・テルピスの言葉(原註64)は、
とくにダンス・クラシック・アカデミックにあてはまる。ダンス・クラシックの舞踊家が完全なる人間を
表すとすれば、この舞踊家は、二つの性を兼ねた人間の原型を表しているのだ。つまり、舞踊家の中に、二つの
性をもった人間の原型が回想されるのである。
この文は『バレエ 形式と象徴』 ゲルハルト・ツァハリアス著 渡辺鴻訳 美術出版社 1965年 の中にあります。
この文の要旨のメモをProlog述語として記述するなら、どんな定義になりますか?
22 :
デフォルトの名無しさん:2010/04/29(木) 17:05:16
<問題> 森と林
森と林はどちらも樹木の集合、塊ですが、
林は、同じ種類の樹木で構成され、
森は、いろいろな種類の樹木が混ざった状態のものだと考えられます。
森と林をProlog述語として定義しなさい。
>>22 「林は概ね同じ種類の樹木で構成され」ですね。
雑木林という概念はありますがこれは例外です。この例外も
述語としての定義に含めてください。
誰の譯だか忘れたけれど、「流浪の民」の出だしは
"ブナの森の葉隠に"じゃなかったかな?
>>23 概ねの閾値(0.9).
林は概ね同じ種類の樹木で構成され(_林) :-
list(_林),
概ねの閾値(_概ねの閾値),
length(_林,_木の本数),
setof(_木,member(_木,_林),L),
findmax([Count,_木],(member(_木,L),count(member(_木,_林),Count)),[_一番多い木の本数,_一番多い木]),
_一番多い木の本数 >= truncate(_木の本数 * _概ねの閾値).
>>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).
>>26 % これだと12本以下の樹木の集合は種類を問わず「森」になってしまう。
% 少々武骨だが、以下の2副目標を加える必要がある。
森は、いろいろな種類の樹木が混ざった状態(_森) :-
list(_森),
length(_森,_樹木の本数),
_樹木の本数 >= N2,
混在の閾値(N1/N2),
length(L0,N2),
先頭から全ての連続した一定要素の中に閾値以上の混在が見られる(N1/N2,L0,_森).
>>27 まちがえた。Prologは遅延評価しないからね。
森は、いろいろな種類の樹木が混ざった状態(_森) :-
list(_森),
length(_森,_樹木の本数),
混在の閾値(N1/N2),
_樹木の本数 >= N2,
length(L0,N2),
先頭から全ての連続した一定要素の中に閾値以上の混在が見られる(N1/N2,L0,_森).
<問題> 例えば、2引数の述語fooが'foo#2.pro'というファイルに
管理されているとします。このfoo/2の最終に引数で与えられた
節を追加する述語をfassertz/2を定義しなさい。
第一引数にはファイル名、第二引数には定義節が来ることとします。
<問題> ユーザ定義述語が多数定義済みの環境を考えます。
定義済み節の本体に現れる副目標を引数に与えて、
その副目標を含む述語定義をすべて表示する述語を
定義しなさい。
>>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).
>>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).
>>29 fassertz(File,P) :-
open(File,append,Output),
writeq(Output,P),
write(Output,'.\n'),
close(Output),!.
>>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),!.
<問題>
先頭要素と同じ要素が残りに現れるリストがあります。このリストを第一引数として、この先頭要素と同じ要素の
一つ前と一つ後ろの要素が存在するならばこの3要素を第二引数にリストして返す非決定性の述語を定義しなさい。
>>35 リストの先頭要素と同じ要素の一つ前と一つ後ろの要素が存在するならばこの3要素を第二引数にリストして返す([B|R],
[A,B,C]) :-
append(_,[A,B,C|_],[B|R]).
<問題>
リストの要素として、4個目の'a'を見つけて残りのリストを返す述語を定義しなさい。
<問題>
リストの要素が変数Xで与えられるとする。N個目のXの残りのリストを返す述語を定義しなさい。
>>37 'リストの要素として、4個目のaを見つけて残りのリストを返す'(_リスト,_残りリスト) :-
append(L0,_残りリスト,_リスト),
count(append(_,[a|_],L0),4),!.
>>38 'リストの要素が変数Xで与えられるとする。N個目のXの残りのリストを返す'(N個目,X,_リスト,_残りリスト) :-
append(L0,_残りリスト,_リスト),
count(append(_,[X|_],_リスト),N個目),!.
<問題>
リストの中の要素Xの残りのリストがパターンPに適合するからどうか判定する述語を定義しなさい。
パターンとの照合はこの述語のなかでcall(P)することで実現するものとする。
>>41 リストの中の要素Xの残りのリストがパターンPに適合するからどうか判定する述語(_リスト,X,P,R) :-
append(_,[X|R],_リスト),
call(P).
% 要点は、引数にRを持つこと。そして、実際に目標とする時はPの引数の中にRが含ませる。
>>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
?-
>>43 すみません、訂正。
>>43の三番目のパターンのような使い方も可だが。
?- リストの中の要素Xの残りのリストがパターンPに適合するからどうか判定する述語([1,2,3,4,6,2,1],3,length(R,4),R).
R = [4,6,2,1]
yes
?-
<問題>
親子(義朝,頼朝).
親子(為義,義朝).
先祖(A,B) :- 親子(A,B).
先祖(A,B) :- 親子(A,C),先祖(C,B).
先祖関係をProlog述語として定義すると上記のようになるでしょう。
ところで、この定義なぜ親子関係だけ具体的な値で示されているので
しょうか。なぜルールで定義されていないのでしょうか。
どのような切り口、表現でも構いませんから、平易に説明してください。
<問題>
以下の文章は原色図鑑ライブラリー「蛾」監修 河田黨 1955年北隆館発行 からの抜粋です
ごまだらきこけが [ひとりが科]
開帳は23~32mm。体と翅は赤味がかった黄色で前翅には15個の黒い斑点がある。
発生するのは6~7月頃で普通にみられる種類である。分布は本邦はじめ広くアジアに
ひろがっている。幼虫は背に青い点を2列もった灰色の毛虫で長い毛があるひとりが科
の中でもこけがといわれる種類のものは,大部分その名の通り幼虫はコケ類を食べる。
ここで示されている情報をProlog述語として定義せよ。
>>46 % あまりにも基本的な解答例
出典('原色図鑑ライブラリー「蛾」監修 河田黨 1955年北隆館',_).
蛾(ごまだらきこけが,ひとりが科,'開帳は23~32mm。体と翅は赤味がかった黄色で前翅に
は15個の黒い斑点がある。分布は本邦はじめ広くアジアにひろがっている。幼虫は背に青
い点を2列もった灰色の毛虫で長い毛があるひとりが科の中でもこけがといわれる種類の
ものは,大部分その名の通り幼虫はコケ類を食べる。') :- 出典('原色図鑑ライブラリー「蛾」監修 河田黨 1955年北隆館',_).
<問題>
述語 蛾/3 が
>>47の形式で与えられたとして、第一引数の検索語から
和名、説明文を得る非決定性の述語 蛾検索/3 を定義しなさい。
>>41-
>>44 パターンを引数に与えて検索すること自体がPrologプログラミングと
して誤った姿勢であると思う。
常にそのパターン検出述語を定義してから、検索すること。
このことを厭うならPrologプログラマとして失格だ。
高階述語を使うのは仕様の文章に強制された場合だけ。
>>49 基本的に、その見解に賛成。
>>45の解とも重なるが、常に具体的な何かを
見据えたプログラミング姿勢が必要だと思う。
>>41はappendの利用法の勉強のための問題で、なにをやりたいかを強調するために
引数の中にその要求を埋めたように思うけれど。
>>48 蛾検索(_検索語,_和名,_説明文) :-
蛾(_和名,_科,_説明文),
蛾検索(_検索語,_説明文).
蛾検索(_検索語,_説明文) :-
sub_atom(_説明文,_,_,_,_検索語),!.
>>48 蛾検索(_検索語,_和名,_説明文) :-
蛾(_和名,_科,_説明文),
検索語が説明文の中にある(_検索語,_説明文).
検索語が説明文の中にある(_検索語,_説明文) :-
sub_atom(_説明文,_,_,_,_検索語),!.
<問題>
>>48 に於いて、
蛾検索(_検索語,_和名,_説明文) :-
蛾(_和名,_科,_説明文),
sub_atom(_説明文,_,_,_,_検索語).
としていない理由を述べなさい。
<問題>
>>52 に於いて、
蛾検索(_検索語,_和名,_説明文) :-
蛾(_和名,_科,_説明文),
sub_atom(_説明文,_,_,_,_検索語).
としていない理由を述べなさい。・・・でした。
<問題>
バラディゼールで行われた1971-72年シーズンのアルペンスキーFISワールドカップ大回転緒戦で
優勝した選手は誰か。その選手は札幌オリンピックではどんな成績をあげたか。
これをWebサイト、新聞、雑誌、書籍等で調べて、Prolog述語としてその全ての情報を定義しなさい。
<問題>
なおここで、女性の官人についても触れておくべきであろう。後宮に奉仕する女官を総称して宮人と
いうが、高級の女官は命婦といった。命婦のうちでも五位以上の階位のある者を内命婦と呼び、五位以
上の官人の妻は、自分で位をもっていなくても、夫の資格によって五位に準じて宮中に出入することを
許されていた。これを外命婦という。だから、五位以上の貴族の妻は、位階の有無にかかわらず女官で
あったと考えてよい。
-- 「律令制の基調」 村尾次郎著 塙書房 昭和35年 -- より
上記の文章をProlog述語として定義しなさい。
>>57 について
Prologの課題はそのまま文章を載せたいので、著作権の関係から出題を躊躇することが多い
けれど、この本は50年を経過しています。
村尾氏というと「右寄りの」歴史学者の先入観からあまり読んだことがなかったのですが、
論理的な文章を書かれる方だし、この本などは無限に問題を引き出すことができそうですね。
>>55 について
1971年バルディゼール大回転の優勝者はエリック・ホーケル(ハーカー)だ。この新人は
大胆なストレート内傾ターンで途中転倒したにも拘らずすぐに起き上がりこのレースで
ワールドカップ初優勝を飾る。1973年苗場で行われたワールドカップ大回転を制して
日本では特に有名な彼だが、札幌オリンピックでは大回転一本目にラップを取りながら
二本目リズムに乗れないまま、前半の急斜面で転倒棄権した。しかし、滑降では5位に
入賞している。
>>59 これは、情報を収集して、それを述語として定義する問題ですね。
そんなに簡単に完璧なヒントを出してしまったら・・・。
>>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').
>>57 宮人(_宮人) :-
奉仕する(_宮人,後宮),
女官(_宮人).
命婦(_命婦) :-
女官(_命婦),
クラス(_命婦,高級).
内命婦(_内命婦) :-
命婦(_内命婦),
位階(_内命婦,五位以上).
外命婦(_外命婦) :-
命婦(_外命婦),
夫(_外命婦,_官人),
位階(_官人,五位以上).
宮中に出入りできる(_外命婦) :- 外命婦(_外命婦).
宮中に出入りできる(_官人) :- 官人(_官人).
官人(_官人) :- 位階(_官人,五位以上).
>>57 宮人(_宮人) :- 奉仕する(_宮人,後宮),女官(_宮人).
女官(_女官) :- 官人(_女官),性別(_女官,女).
命婦(_命婦) :- 女官(_命婦),内命婦(_命婦).
命婦(_命婦) :- 女官(_命婦),外命婦(_命婦).
内命婦(_内命婦) :- 命婦(_内命婦),位階(_内命婦,五位以上).
外命婦(_外命婦) :-
命婦(_外命婦),
\+(位階(_外命婦,_五位以上)),
夫(_外命婦,_夫),
位階(_夫,_五位以上),
五位以上(_五位以上).
宮中に出入りできる(_外命婦) :- 外命婦(_外命婦).
宮中に出入りできる(_官人) :- 官人(_官人),位階(_官人,_五位以上),五位以上(_五位以上).
五位以上(_五位以上) :-
member(_五位以上,[一位,従一位,二位,従二位,三位,従三位,四位,従四位,五位,従五位]).
f(A,A):-1=1,!.
1=1を消して
このカットを引数のすぐ左に持ってくることはできますか?
>>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. は実質的に同じ意味。
ただ処理系によっては若干実行過程は異なるだろう。
>>54 説明文のなかに検索語が複数含まれていると、
その回数分、_和名、_説明文が解として取れてしまう。
sub_atomを決定性の述語として扱うために再定義して
その本体に!を付加している。
<問題> 「漁業情報学概論」小倉通男・竹内正一共著 成山堂書店刊 1990年
から、78頁の以下の文章を切り取りました。この文章からメモとして有用な
Prolog述語を定義しなさい。
カツオは南・北緯40°間に広く分布する熱帯性ないし温帯性の表層回遊魚で
ある。太平洋のカツオは西部太平洋系群と中東部太平洋系群の2つに分けられ
るが,形態による識別は困難であるといわれる。日本漁船が漁獲対象としてい
るのは,大部分が西部太平洋系群と考えられている。
68 :
デフォルトの名無しさん:2010/05/21(金) 08:58:20
<問題> ある小さな農園で自家製ジュースを販売することになりました。
バラ売りの単位として
1.. 250cc
2.. 500cc
3.. 1L
そしてケース売りの単位として、
5.. 250ccが12個
6.. 1Lが12個
7.. 250ccが60個
を用意することになりました。この単位をProlog述語 '荷姿' として定義しなさい。
>>67 生息域分類(_カツオ,_表層回遊魚) :- カツオ(_カツオ),表層回遊魚(_表層回遊魚).
分布(_カツオ,_南・北緯40°間) :- カツオ(_カツオ),南・北緯40°間(_南・北緯40°間).
環境(_カツオ,熱帯性) :- カツオ(_カツオ),生息環境(_カツオ,_環境),熱帯性(_環境).
環境(_カツオ,温帯性) :- カツオ(_カツオ),生息環境(_カツオ,_環境),温帯性(_環境).
系統(_カツオ,西部太平洋系) :- カツオ(_カツオ),特徴(_カツオ,_特徴),西部太平洋系(_カツオ,_特徴).
系統(_カツオ,中東部太平洋系) :- カツオ(_カツオ),特徴(_カツオ,_特徴),中東部太平洋系(_カツオ,_特徴).
識別困難(_系統1,_系統2) :-
カツオ(_カツオ1),特徴(_カツオ1,_特徴1),系統(_カツオ1,西部太平洋系群),
カツオ(_カツオ2),特徴(_カツオ2,_特徴2),系統(_カツオ2,中東部太平洋系群).
日本漁船の漁獲対象(_カツオ,西部太平洋群) :- カツオ(_カツオ),系統(_カツオ,西部太平洋系群).
>>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).
<問題>
誤差の大きい(正確でない)情報を積極的に利用すること。
Prologに限らないが、プログラミングの仕様のほとんどが著作権を侵害している
可能性を持っている。多くの事実としての情報が本、雑誌など過去の著作物に
由来するからだ。そこで、この問題を回避するひとつの方法は正確でない情報を
積極的に利用することが考えられる。2010年5月24日の日本経済新聞朝刊の一面に
「時価総額630兆円減」という記事がある。この中に描かれた世界の株式時価総額と
いうグラフから 述語 'MSCI世界株価指数' と 述語 時価総額 を定義しなさい。
このグラフには(注)として、このグラフの情報が国際取引連盟(WFE),MSCIのデータを
もとに作成したものであることが記されているが、ここではこの原データは得られ
ないものとする。
>>70 ケース売り(_荷姿ID) :- 荷姿(_荷姿ID,_,_*_ cc),!.
ケース売り(_荷姿ID) :- 荷姿(_荷姿ID,_,_*_ 'L'),!.
バラ売り(_荷姿ID) :- 荷姿(_荷姿ID,_,_量 cc),number(_量),!.
バラ売り(_荷姿ID) :- 荷姿(_荷姿ID,_,_量 'L'),number(_量),!.
% 第三引数に複合項を持ってきたことの弊害が顕れている。
<問題>
文字列を解析して、拡大係数行列を得るProlog述語を定義しなさい。
ただし項は例えば、3 * (a ^ 2) は 3a2 のように表現されていることとする。
<問題>
>>61は
>>55の仕様を十分に満たすものといえよう。しかし、
>>59のヒントには、
さらに豊かな情報が含まれているが述語化する中で抜け落ちてしまっている。
この新人は大胆なストレート内傾ターンで途中転倒したにも拘らずすぐに起き上がりこのレースで
ワールドカップ初優勝を飾る。
の部分だ。このような核から外れているが実は貴重な情報をさりげなく
含ませる試みとして、
>>61を書き直してください。
>>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,兆円).
>>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,兆ドル).
>>71 つづき
時価総額('201001',47,兆ドル).
時価総額('201002',46,兆ドル).
時価総額('201003',49,兆ドル).
時価総額('201004',49,兆ドル).
時価総額('201005',44,兆ドル).
>>71 日本経済新聞の紙面グラフから読み取った世界株式時価総額(_年月,_時価総額,_最大誤差,_単位) :-
情報の最大誤差(2,_単位),
時価総額(_年月,_時価総額,_単位).
情報の最大誤差(2,兆円).
>>78 (
>>71) ごめん訂正。
日本経済新聞の紙面グラフから読み取った世界株式時価総額(_年月,_時価総額,_最大誤差,_単位) :-
情報の最大誤差(_最大誤差,_単位),
時価総額(_年月,_時価総額,_単位).
情報の最大誤差(2,兆円).
>>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).
>>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).
>>74 '1971年',バルディゼール,大回転,'エリック・ホーケル(ハーカー)',新人,初優勝,大胆な,ストレート内傾ターン,転倒,
起き上がる,ワールドカップ初優勝
このくらいの要素の組み合わせで単位節を構成すればいいのかな?
ここの一節が札幌オリンピックの二本目を暗示してるのだとしたら、それはどう表現するのだろう。
<問題>
与えられた文字列に含まれる整数を表す副文字列の中で最長のものを取り出しなさい。
<問題>
与えられた文字列に含まれる数値文字列で1.0-49.0(整数であってもよい)の
範囲の数値文字列を取り出しなさい。
>>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,_副文字列).
>>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).
>>46 % Prolog
蛾(ごまだらきこけが,ひとりが科).
開帳(ごまだらきこけが,成虫,'23~32mm').
色(ごまだらきこけが,成虫,体と翅,赤味がかった黄色).
斑点(ごまだらきこけが,成虫,体と翅,前翅,'15個').
分布(ごまだらきこけが,本邦広くアジアにひろがっている).
食性(ごまだらきこけが,幼虫,コケ類).
長い毛(ごまだらきこけが,幼虫).
青い点(ごまだらきこけが,幼虫,背中に2列).
色(ごまだらきこけが,幼虫,灰色).
>>46 % Prolog
(_ごまだらきこけが,ひとりが科) :- ごまだらきこけが(_ごまだらきこけが).
開帳(_ごまだらきこけが,成虫,'23~32mm') :- ごまだらきこけが(_ごまだらきこけが).
色(_ごまだらきこけが,成虫,体と翅,赤味がかった黄色) :- ごまだらきこけが(_ごまだらきこけが).
斑点(_ごまだらきこけが,成虫,体と翅,前翅,'15個') :- ごまだらきこけが(_ごまだらきこけが).
分布(_ごまだらきこけが,本邦広くアジアにひろがっている) :- ごまだらきこけが(_ごまだらきこけが).
食性(_ごまだらきこけが,幼虫,コケ類) :- ごまだらきこけが(_ごまだらきこけが).
長い毛(_ごまだらきこけが,幼虫) :- ごまだらきこけが(_ごまだらきこけが).
青い点(_ごまだらきこけが,幼虫,背中に2列) :- ごまだらきこけが(_ごまだらきこけが).
色(_ごまだらきこけが,幼虫,灰色) :- ごまだらきこけが(_ごまだらきこけが).
>>46 % Prolog 書き直し
蛾(_ごまだらきこけが,ひとりが科) :- ごまだらきこけが(_ごまだらきこけが).
開帳(_ごまだらきこけが,成虫,'23~32mm') :- ごまだらきこけが(_ごまだらきこけが).
色(_ごまだらきこけが,成虫,体と翅,赤味がかった黄色) :- ごまだらきこけが(_ごまだらきこけが).
斑点(_ごまだらきこけが,成虫,体と翅,前翅,'15個') :- ごまだらきこけが(_ごまだらきこけが).
分布(_ごまだらきこけが,本邦広くアジアにひろがっている) :- ごまだらきこけが(_ごまだらきこけが).
食性(_ごまだらきこけが,幼虫,コケ類) :- ごまだらきこけが(_ごまだらきこけが).
長い毛(_ごまだらきこけが,幼虫) :- ごまだらきこけが(_ごまだらきこけが).
青い点(_ごまだらきこけが,幼虫,背中に2列) :- ごまだらきこけが(_ごまだらきこけが).
色(_ごまだらきこけが,幼虫,灰色) :- ごまだらきこけが(_ごまだらきこけが).
>>91 たとえば、
あるものの幼虫はコケ類を食べる。そういうあるもののひとつは、ごまだらきこけがだ。
と読めばよいと思う。
出題者ではありませんが、勝手に批評します。
>>89 同じ項構造で他の生物にも適用できるよう、項: 蛾/2 は以下の方が
命題として適切ではないかと考えます。
種(ごまだらきこけが, 蛾). % ごまだらきこけがの種は蛾である。
科(ごまだらきこけが, ひとりが). % ごまだらきこけがの科はひとりがである。
項: 色/2 と 色/3 で混在していますが、どちらかに統一すべきだと考えます。
色(ごまだらきこけが, 成虫の体と翅, 赤味がかった黄色).
色(ごまだらきこけが, 幼虫, 灰色).
または
色(ごまだらきこけが, 成虫, 体と翅, 赤味がかった黄色).
色(ごまだらきこけが, 幼虫, 全体, 灰色).
>>90 ごまだらきこけが以外の蛾も多数登録されているものとして、
食性について問い合わせる場合を考えます。
?- 食性(_蛾, _, コケ類) % コケ類を食べる蛾は何か?
_蛾=ごまだらきこけが
>>90では、変数 _蛾 がアトムにならず変数のままですから、この問い合わせには
回答できていません。従って、解答としては
>>89のほうが適切ではないかと考えます。
94 :
93:2010/06/05(土) 21:23:38
>>93を自己訂正
>項: 色/3 と 色/4 で混在していますが、どちらかに統一すべきだと考えます。
>
> 色(ごまだらきこけが, 成虫の体と翅, 赤味がかった黄色). % 色/3 で統一
> 色(ごまだらきこけが, 幼虫, 灰色).
>
>または
>
> 色(ごまだらきこけが, 成虫, 体と翅, 赤味がかった黄色). % 色/4 で統一
> 色(ごまだらきこけが, 幼虫, 全体, 灰色).
>>93 適切な批評をいただき感謝します。
色のアリティが二種類になっているのは好ましくないですね。
種、科については、可能な限り、仕様(ここでは問題文)の文面から
述語名や変数名を拾うことを旨としているので、出てきませんでした。
とはいえ、私も「食べる」を「食性」に置き換えたりしていますが、
言語、概念による補強は必要だし、そうすることで述語として「強く」
なることも事実ですね。
>>90については、途中で端折りますが、以下のようなら自然でしょうか。
ごまだらきこけが(_ごまだらきこけが) :-
色(_ごまだらきこけが,幼虫,全体,灰色),
色(_ごまだらきこけが,成虫,赤味がかった黄色).
色(ごまだらきこけが,幼虫,全体,灰色),
色(ごまだらきこけが,成虫,赤味がかった黄色).
食性(ごまだらきこけが,幼虫,コケ類).
96 :
93:2010/06/05(土) 23:11:54
>>95 >
>>90については、途中で端折りますが、以下のようなら自然でしょうか。
いいえ、不自然です。この問題(仕様)はすべてファクト(事実)から構成されています。
出題者の意図(文脈)は知りませんが、単純なのにわざわざ複雑なルール(推論)を組み込むのは、
解答として適切であるとは思えません。
もし納得できないようでしたら、いったんPrologプログラミングから離れて
数学の命題論理(初等数理論理学の一部)を勉強されることをお勧めします。
本質に迫るツッコミktkr
>>96 確かに。命題論理の勉強をします。カツオの定義など支離滅裂ですね。
私はPrologの核は単位節データベースであって、実際宿題スレでもデータベース板SQLの質問から
多数問題を採用してきました。一方、
このスレと「いろんな言語で宿題」スレに共通して、
親子(為義,義朝).
親子(義朝,頼朝).
先祖(A,B) :- 親子(A,B).
先祖(A,B) :- 親子(A,C),先祖(C,B).
という定義に於いて、先祖/2はルールなのに、親子/2はなぜ事実なの?親子もルールで
書いていくとどうなるの?という疑問に対して、何らかの答えだすという試みもして
きました。
よく分かっていないことは事実とせず、これからそれについてはルールが来るのだ、
今のところまだ未定義だけどね、というのが指摘いただいた箇所の意図であり、
奇妙な表現に拘る言い訳ということになります。
99 :
93:2010/06/06(日) 21:12:22
>>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における項「ごまだらきこけが(_)」について、
**** ごまだらきこけがは関係ではありません!! ****
ですから、これらの解答は明らかに不自然です。
100 :
93:2010/06/07(月) 00:50:12
>>99に間違いがあったので、訂正します。
> 先祖_子孫(A, B) :- 親_子(A, C), 先祖_子孫(C, B),.
> % ある人物AとBとCについて、AとCの間に親-子という関係が存在し、かつCとBの間に
> % 先祖-子孫という関係が存在するならば、AとBの間には先祖-子孫という関係が存在する。
>>95 こんな定義ならどうなんだ。
確信度(_ごまだらきこけが,ごまだらきこけが,60) :-
色(_ごまだらきこけが,_,幼虫,全体,灰色),
色(_ごまだらきこけが,_,成虫,赤味がかった黄色),
食性(_ごまだらきこけが,_,幼虫,コケ類).
色(_,ごまだらきこけが,幼虫,全体,灰色),
色(_,ごまだらきこけが,成虫,赤味がかった黄色).
食性(_,ごまだらきこけが,幼虫,コケ類).
>>99 それから、
>>95 のごまだらきこけが は関係ではなく、クラスを表現しようとしているのではないかな。
103 :
93:2010/06/07(月) 17:19:35
あまり頭ごなしに不自然だ!!ばかりを言うのもアレなので....。
>>98 >先祖/2はルールなのに、親子/2はなぜ事実なの?
>親子もルールで書いていくとどうなるの?という疑問に対して、
>何らかの答えだすという試みもしてきました。
「親-子」という関係は原始的な(これ以上は分解できない)ファクトだから、
ルールとして書くことは(私には)無理ですが、「親-子の関係」や「先祖-子孫の関係」という
関係そのものを扱えるファクト/ルールを書くことは可能です。たとえば
「AとBにはどんな関係があるか?(= AとBとの間に存在する関係は何か?)」という
問い合わせに答えることの可能な知識ベースです。
まず説明の前に、
>>99では
ファクトとルールは、どちらも「関係の存在」を表現している
と書きました。それを以下のように訂正します。
ファクトとルールは、どちらも「エンティティ(物)の存在」あるいは
「エンティティ間にある関係の存在」を表現している
エンティティとは関係の対象となるオブジェクトを意味し、
たとえば「ごまだらきこけが」や「為義」を指します。
(長いので続く)
104 :
93:2010/06/07(月) 17:21:16
(
>>103の続き)
では、以降からは知識ベースの記述を始めます。まず基礎のファクトを書きます。
人物(為義). % 為義という人物が存在する。
人物(義朝). % 義朝という人物が存在する。
人物(頼朝). % 頼朝という人物が存在する。
ここで、「親-子」と「先祖-子孫」を(関係ではなく)エンティティとして認識した上で、
ファクトとして書いてみます。
関係(親_子). % 親-子という関係が存在する。
関係(先祖_子孫). % 先祖-子孫という関係が存在する。
関係(親_子, 為義, 義朝). % 為義と義朝の間には親-子という関係が存在する。
関係(親_子, 義朝, 頼朝). % 義朝と頼朝の間には親-子という関係が存在する。
これらファクトを前提にルールを書きます。
関係(先祖_子孫, A, B) :- 人物(A), 人物(B), A¥=B, 関係(親_子, A, B).
% あるA, Bについて、AおよびBという人物が存在し、
% かつAとBの間に親-子という関係が存在するならば、
% AとBの間には先祖-子孫という関係が存在する。
関係(先祖_子孫, A, B) :-
人物(A), 人物(B), 人物(C), A ¥= B, B ¥= C, A ¥= C,
関係(親_子, A, C), 関係(先祖_子孫, C, B).
% あるA, Bについて、A、BおよびCという人物が存在し、
% かつAとCの間に親-子という関係が存在し、
% かつCとBの間に先祖-子孫という関係が存在するならば、
% AとBの間にも先祖-子孫という関係が存在する。
(まだ続く)
105 :
93:2010/06/07(月) 17:33:51
(
>>104の続き)
以下は、SWI-Prologでの実行例です。
為義と義朝は親子か?
?- 関係(親_子, 為義, 義朝).
true . % はい。
為義の子は誰か?
?- 関係(親_子, 為義, X).
X = '義朝' ; % 義朝です。
false.
為義の子孫は誰か?
?- 関係(先祖_子孫, 為義, X).
X = '義朝' ;
X = '頼朝' ; % 義朝と頼朝です。
false.
為義と義朝にはどんな関係があるか?
?- 関係(R, 為義, 義朝).
R = '親_子' ;
R = '先祖_子孫' ; % 親-子と先祖-子孫という関係があります。
false.
為義と頼朝にはどんな関係があるか?
?- 関係(R, 義朝, 頼朝).
R = '先祖_子孫' ; % 先祖-子孫という関係があります。
false.
(まだ続く。次で終わり。)
106 :
93:2010/06/07(月) 17:36:21
(
>>105の続き)
すべての関係を挙げよ。
?- 関係(R, A, B).
R = '親_子',
A = '為義',
B = '義朝' ; % 為義と義朝の間に親-子という関係が存在する。
R = '親_子',
A = '義朝',
B = '頼朝' ; % 為義と頼朝の間に親-子という関係が存在する。
R = '先祖_子孫',
A = '為義',
B = '義朝' ; % 為義と頼朝の間に先祖-子孫という関係が存在する。
R = '先祖_子孫',
A = '義朝',
B = '頼朝' ; % 義朝と頼朝の間に先祖-子孫という関係が存在する。
R = '先祖_子孫',
A = '為義',
B = '頼朝' ; % 為義と頼朝の間に先祖-子孫という関係が存在する。
false.
(これで終わり。長レス失礼。)
107 :
93:2010/06/07(月) 18:08:39
>>102 では、オブジェクト指向(あるいはフレーム理論やオントロジーのような)知識を一般化する
枠組み(フレームワーク)を
>>103-106で書いた知識ベースに導入してみます。
オブジェクト(昆虫). % 昆虫はオブジェクトである。
オブジェクト(蛾). % 蛾はオブジェクトである。
オブジェクト(ごまだらきこけが). % ごまだらきこけがはオブジェクトである。
関係(スーパークラス_サブクラス, 昆虫, 蛾). % 蛾は昆虫のサブクラスである。
関係(クラス_インスタンス, 蛾, ごまだらきこけが). % ごまだらきこけがは蛾のインスタンスである。
オブジェクト指向という枠組みの導入によって、これまで「....が存在する」と解釈していたのを、
「....である」という解釈に進化させたことに注目してください。
オブジェクト指向におけるクラスという概念は「スーパークラス-サブクラス」および
「クラス-インスタンス」という関係で表現できます。これらはそれぞれ「is-a関係(またはkind-of関係)」と
「instance-of関係」と呼ばれることもあり、知識表現レベルではどちらも関係の特別なケース(クラス)です。
以上のように、(源氏の)家系や(蛾の)体系といった比較的単純な知識表現であれば、明解な解答が得られます。
不自然な解釈や小賢しい技法(テクニック)は必要ありません。命題論理と一階述語論理の守備範囲です。
<問題>
「不意に辿り着いてしまった」と感じる検索事例を定義しなさい。
>>110 1960年代なら「逃げるを定義しなさい」かな
>>107 このスレのテーマのひとつに全く考えずにプログラミングをしていったら
どうなるか?というのがあります。ここらあたりの流れはこのテーマに
沿っています。自然言語による表現に内在する論理性が、プログラミングを
導くことはないのか、ということです。
% リストのある要素を検索して、その
n要素後の値を取り出しなさい。
>>113 'リストのある要素を検索して、そのn要素後の値を取り出す'(_対象リスト,_検索要素,_n要素後,_値) :-
append(_,[_検索要素|R],_対象リスト),
list_nth(_n要素後,R,_値).
% リストのある要素を検索して、そのm要素前の値を取り出しなさい。
>>115 リストのある要素を検索して、そのm要素前の値を取り出す(_対象リスト,_検索要素,_m要素前,_値) :-
append(L0,[_検索要素|_],_対象リスト),
length(L2,_m要素前),
L2 = [_値|_],
append(_,L2,L0).
117 :
デフォルトの名無しさん:2010/10/15(金) 13:05:27
tes
<問題>
次の日記の一節をPrologプログラムして定義しなさい。
十一月十五日 午后三時より海軍と合同中支那派遣軍編成以来の陣没者の慰霊祭を
漢口華商競馬場に催す。及川長官も亦上海より飛来す。
<問題> こちらが本題ですが、
上記日記の出典が何か、インターネット上から検索して、推定するプログラムを書きなさい。
推定が外れても仕方ありません。
121 :
sage:2010/10/18(月) 21:13:56
<問題>
全社員が売上を記録した日を求めよ。 これをPrologプログラムとして表現しなさい。
<問題>
Prologしなさい。
>>122 >>121 全社員が売上を記録した日を求めよ(_日) :-
count(社員(_社員),_社員人数),
findsetof(_日,売上(_社員,_日,_データ),L1),
append(_,[_日|R],L1),
findsetof(_社員,社員(_社員,_日,_データ),L2),
length(L2,_社員人数).
>>121 は『データベースシステムの基礎』植村俊亮著 オーム社 1979年 p124より採った
SQUAREによる表現が載っている。
URIAGE ( SYAIN )
HIZUKE S# S#
<問題>
リストX, Y とZ を繋いだ結果をリストWに格納するプログラムtriple append(X,Y,Z,W) を作
りなさい。
>>125 triple_append([],Y,Z,W) :- append(Y,Z,W).
triple_append([A|X],Y,Z,[A|W]) :- triple_append(X,Y,Z,W).
<問題>
x とy 両方ともリストL の要素の場合だけYes を返すプログラムを書きなさい。
>>127 'x とy 両方ともリストL の要素の場合だけYes を返す'(_x,_y,L) :-
append(_,[_x|_],L),
append(_,[_y|_],L).
129 :
デフォルトの名無しさん:2010/10/20(水) 13:52:04
<問題>
x とy のいずれかがリストL の要素の場合にYes を返すプログラムを書きなさい。
>>129 'x とy のいずれかがリストL の要素の場合にYes を返す'(_x,_,L) :-
append(_,[_x|_],L).
'x とy のいずれかがリストL の要素の場合にYes を返す'(_,_y,L) :-
append(_,[_y|_],L).
131 :
デフォルトの名無しさん:2010/10/20(水) 14:17:54
<問題>
リストA の要素が全てリストB の要素の場合だけYes を返すプログラムを書きなさい。
>>128 >>130 ともに、
append(_x,_y,L) の後に!を入れるか
迷うところ。素直に題意をくみとるならば、
カットを入れた方がいいだろう。
以下のような実行では具合の悪いことが起きる。
?- 'x とy のいずれかがリストL の要素の場合にYes を返す'(4,3,[1,2,4,4,3]),write(a),fail.
aaa
no.
Yesも返らないw
>>132 すみません。まちがえた。
append(_,[_x|_],L),
append(_,[_y]_],L), の後にカットを
入れるか迷うところ。 でした。
>>131 'Yes'も返すようにしてみました。
'リストA の要素が全てリストB の要素の場合だけYes を返す'(A,B,Return) :-
A = [U|R],
append(_,[U|_],B),
'リストA の要素が全てリストB の要素の場合だけYes を返す'(R,B,Return),!.
'リストA の要素が全てリストB の要素の場合だけYes を返す'([],_,'Yes') :- !.
'リストA の要素が全てリストB の要素の場合だけYes を返す'(_,_,'No').
>>131 Yesは返さないが、
'リストA の要素が全てリストB の要素の場合だけYes を返す'(A,B) :-
length(A,Length),
findall(_,(append(_,[V|_],A),append_cut(_,[V|_],B)),L),
length(L,Length).
append_cut(L1,L2,L3) :- append(L1,L2,L3),!.
% count/2 が使えるならば、更に簡単だ
'リストA の要素が全てリストB の要素の場合だけYes を返す'(A,B) :-
length(A,Length),
count((append(_,[V|_],A),append_cut(_,[V|_],B)),Length).
append_cut(L1,L2,L3) :- append(L1,L2,L3),!.
% 'Yes' 'No' を返すなら
'リストA の要素が全てリストB の要素の場合だけYes を返す'(A,B,'Yes') :-
length(A,Length),
count((append(_,[V|_],A),append_cut(_,[V|_],B)),Length),!.
'リストA の要素が全てリストB の要素の場合だけYes を返す'(A,B,'No').
append_cut(L1,L2,L3) :- append(L1,L2,L3),!.
count/2の定義は
count(P,Count) :- findall(_,P,L),length(L,Count).
<問題>
左横書き文書を右縦書き文書に変換してください。
>>138 % Prolog
左横書き文書を右縦書き文書に変換(_横書きの行ならび,_縦書きに置換された行ならび) :-
findmax(_長さ,(
append(_,[_行|_],_横書きの行ならび),
sub_atom(_行,0,_長さ,0,_行)),
_行の最大長),
findall(Chars,(
append(_,[_行|_],_横書きの行ならび),
atom_chars(_行,Chars)),
L1),
空白文字を付加して文字数一致させる(_行の最大長,L1,L2),
転置(L2,L3),
右書き用に反転(L3,_縦書きに置換された行ならび),!.
右書き用に反転([],[]) :- !.
右書き用に反転([L1|R1],[S|R2]) :-
reverse(L1,L2),
concat_atom(L2,S),
右書き用に反転(R1,R2).
空白文字を付加して文字数を一致させる(Max,LL1,LL2) :-
findall(L,(
append(_,[L1|R],LL1),
length(L,Max),
append(L1,L2,L),
all(L2,' ')),
LL2).
<問題>
A,B,Cの3人が100m競争をします。D,Eの2人が予想をしました。
D : 「きっと1等はCで2等はBだ」
E : 「ぼくは1等はAだと思う」
発表された順位を見て,2人はどちらも「まったくはずれた。」と
いいました。発表された順位はどうでしたか。
中学受験用全解シリーズ 「受験全解・算数」日能研発行 の p424 から採りました。
1.B
2.A
3.C
1.B
2.C
3.A
>>142 「まったく」が現れることに備えて節を付加した感じで
なんか変ですね。
144 :
デフォルトの名無しさん:2010/10/27(水) 09:33:16
<問題>
正の整数n の階乗の再帰式
n! = 1 (when n = 0)
n! = n*(n-1)! (when n > 0)
を利用したプログラムfactorial(N,Value) を書きなさい。
>>141 >>142 Aが一等と考えている時点でA>Cと予想している訳で
それが外れたんであればC>Aでないとおかしい
よって
1. B
2. C
3. A
>>145 自分の予想が「まったくはずれた」のだから、Eの予想の否定からはB-A-C B-C-A C-A-B C-B-A が可能なのではないか。
>>140 % 推論ルール
推論 :-
競技結果(_結果情報),
write(_結果情報), nl,
fail.
推論.
競技結果(_結果情報) :-
順位(A), 順位(B), 順位(C),
A ¥= B, A ¥= C, B ¥= C,
_結果情報 = [ a = A, b = B, c = C],
制約(_結果情報).
% 推論ファクト
順位(1).
順位(2).
順位(3).
(続く)
148 :
147:2010/10/27(水) 22:17:59
(
>>147の続き)
% ユーザ記述ルール
制約(_結果情報) :- 辞書検索(_結果情報, c, 1), 辞書検索(_結果情報, b, 2), !, fail.
制約(_結果情報) :- 辞書検索(_結果情報, a, 1), !, fail.
制約(_).
% 辞書検索(辞書, キー, 値) -- 汎用的な辞書検索ルーチン
% 入力: 辞書, キー
% 出力: 値
% 説明: 辞書に一致するキーが存在すれば値を返す。存在しなければ失敗する。
% 辞書のデータ構造は「キー = 値」を要素とするリストである。
辞書検索([_キー = _値|_], _キー, _値) :- !.
辞書検索([_|_辞書], _キー, _値) :- 辞書検索(_辞書, _キー, _値).
(実行結果 on SWI-PROLOG)
?- 推論.
[a=2, b=1, c=3]
[a=2, b=3, c=1]
[a=3, b=1, c=2]
true.
149 :
147:2010/10/27(水) 22:34:13
>>148のコメントにウソがあったので訂正。
(誤り)
>% 入力: 辞書, キー
>% 出力: 値
>% 説明: 辞書に一致するキーが存在すれば値を返す。存在しなければ失敗する。
>% 辞書のデータ構造は「キー = 値」を要素とするリストである。
(正しい)
>% 入力: 辞書, キー, 値
>% 説明: 辞書に一致する要素が存在すれば成功し、存在しなければ失敗する。
>% 辞書のデータ構造は「キー = 値」を要素とするリストである。
150 :
142:2010/10/27(水) 23:24:32
151 :
147:2010/10/27(水) 23:35:23
Dの予想について「xでy」を
>>148では「xかつy」と解釈したけど、
これを「xまたはy」と解釈するよう変更してみた。
% ユーザ記述ルール
制約(_結果情報) :- 辞書検索(_結果情報, c, 1), !, fail.
制約(_結果情報) :- 辞書検索(_結果情報, b, 2), !, fail.
制約(_結果情報) :- 辞書検索(_結果情報, a, 1), !, fail.
制約(_).
(実行結果)
- 推論.
[a=2, b=1, c=3]
[a=3, b=1, c=2]
true.
そもそもの出題(の仕様記述)が曖昧なのが混乱の原因だよね。
だから昔からテストって大ーーーーー嫌いなんだ。
152 :
140:2010/10/27(水) 23:41:06
>>151 うん、だから題材としておもしろいと思ったんだけどね。
153 :
147:2010/10/28(木) 00:39:48
>>151を更に変更。(
>>150のコードも参考にしています。)
・
>>145の指摘に従い、予測条件を狭めた(制約を強くした)。
・述語「制約/1」を「予測/1」へ変更(否定->肯定)することで、ユーザ記述ルールの表現をより自然なものとした。
・出題に合わせて、述語「競技結果/1」を「発表順位/1」に、変数「_結果情報」を「_順位情報」に変更。
・出題に合わせて、出力形式を(「競技者=順位」から)「順位=競技者」へ変更。
発表順位(_順位情報) :-
競技者(X), 競技者(Y), 競技者(Z),
X ¥= Y, X ¥= Z, Y ¥= Z,
_順位情報 = [1 = X, 2 = Y, 3 = Z],
制約(_順位情報).
制約(_順位情報) :- ¥+(予測(_順位情報)).
% 推論ファクト
競技者(a).
競技者(b).
競技者(c).
(続く)
154 :
147:2010/10/28(木) 00:50:30
(
>>153の続き)
% ユーザ記述ルール
% D:「1等はCで2等はBだ」
予測(_順位情報) :- 辞書検索(_順位情報, 1, c).
予測(_順位情報) :- 辞書検索(_順位情報, 2, b).
% E:「1等はAだ」
予測(_順位情報) :-
辞書検索(_順位情報, 1, a).
予測(_順位情報) :-
辞書検索(_順位情報, RA, a), 辞書検索(_順位情報, RB, b), 辞書検索(_順位情報, RC, c),
RA ¥= 1, RA > RB, RA > RC.
(実行結果)
?- 推論.
[1=b, 2=a, 3=c]
true.
155 :
147:2010/10/28(木) 01:09:25
>>152 この課題(
>>140)ですが、Prologの持つ一階述語論理を基礎とした推論の限界が見え隠れしていますね。
解決方法は以下の技術導入でしょうか?
・多値論理 --> 「当たり(真)/外れ(偽)」から「当たり/やや外れ/まったく外れ(多値)」への拡張
・非単調推論 --> 不完全な情報を前提にした推論への拡張(
>>145の指摘を自動化)
以下の出題を応用します。
http://hibari.2ch.net/test/read.cgi/tech/1286978599/843 # [1] 授業単元:プログラミング演習
# [2] 問題文(含コード&リンク)
# 問題2
# 桁数を指定した書式指定(%s、%d、%f)とprintf()関数を用いて、下記の一覧表を表示するプログラムを
作成しなさい。
# 【表示する表】
# 商品A 商品B 商品C
# 数量 0000012 0000345 0006789
# 重量 1.234 543.210 12.345
# *文字列、整数値や実数値の桁数を指定する方法に注意しなさい。
# *表の枠線は必要ありません。各列の先頭が揃っている必要があります。
<問題>
数量 0000012 0000345 0006789
重量 1.234 543.210 12.345
から例えば、
printf('%-9s %-012d %-012d %-12d\n',[A,B,C,D]).
printf('%-9s %-12.3f %-12.3f %-12.3f\n',[A,B,C,D]).
を導く述語を定義しなさい
ごめん、
printf('%-9s %-012d %-012d %-012d\n',[A,B,C,D]). でしたね。
四項目の12dの前の0が落ちていました。
<問題>
ノートを7冊ずつ配ると28冊余り,10冊ずつ配ると最後の一人にわたすノートは
他の半分にも達しませんでした。ノートの数と人数を求めなさい。 <開成中受験問題>
159 :
デフォルトの名無しさん:2010/11/02(火) 09:13:57
<問題>
ゼロでない整数x のn 乗xn の再帰式
x^n = 1 (when n = 0)
x^n = x * x^(n-1) (when n > 0)
を利用したプログラムを書きなさい。
以下は、
「DNS & BIND クックブック ネームサーバ管理者のためのレシピ集」Cricket Liu 著 伊藤高一監訳 田淵貴昭
訳 オライリー・ジャパン発行 オーム社発売 2003年4月 のp75から採りました。
<問題>
ネームサーバが特定の応答を一定の順序で返すように設定したい。
cyclic
これがデフォルトで、ラウンドロビンといわれることもある。レコードが返される順序は応答の
度に循環され、前回の応答で最初に返されたレコードは、その次の応答では最後に移動される。
fixed
レコードをいつも同じ順番で返答する。
random
レコードをランダムな順番で返答する。
上記の仕様を満たすように述語を定義しなさい。
>>158 (算数的解法) 引数に何を明示するかが課題。
'ノートを7冊ずつ配ると28冊余り,10冊ずつ配ると最後の一人にわたすノートは他の半分にも達しませんでした。ノートの数と人数を求めなさい。'(_ノートの数,_人数) :-
'10冊ずつ配るとひとり少ない人数分だけは完全にあるということです',
'これを _10冊を完全に配ることのできる人数 とすると',
'一旦最後ひとり分(7個)も取り崩して',
'28冊に加えてからこれを(10-7)個ずつ確実に渡すことのできる人数が_10冊を完全に配ることのできる人数ということになります'(_10冊を完全に配ることのできる人数),
余りが最後の人が受け取る冊数になり、これは10冊の半分未満でないといけません,
人数はそれに1を加えたものであり(_10冊を完全に配ることのできる人数,_人数),
本の冊数は(_人数,_本の冊数).
'28冊に加えてからこれを(10-7)個ずつ確実に渡すことのできる人数が_10冊を完全に配ることのできる人数ということになります'(_10冊を完全に配ることのできる人数) :-
_10冊を完全に配ることのできる人数 is (28 + 7) // (10 - 7).
余りが最後の人が受け取る冊数になり、これは10冊の半分未満でないといけません :-
_最後の人が受け取る冊数 is (28 + 7) mod (10 - 7),
_最後の人が受け取る冊数 < 10 // 2.
人数はそれに1を加えたものであり(_10冊を完全に配ることのできる人数,_人数) :- _人数 is _10冊を完全に配ることのできる人数 + 1.
本の冊数は(_人数,_本の冊数) :-
_本の冊数 is 7 * _人数 + 28.
%%%%%%%%%%%%%%%%%%%%%%%%% 注釈的述語 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'10冊ずつ配るとひとり少ない人数分だけは完全にあるということです' :- true.
'これを _10冊を完全に配ることのできる人数 とすると' :- true.
'一旦最後ひとり分(7個)も取り崩して' :- true.
164 :
z:2010/11/11(木) 17:03:33
{if-else文} 身長と体重のデータを読み込み、下の定義から体型を判定するプログラムを作成せよ。
定 義:身長h(cm),体重w(Kg)とすると
w < (h-95)*0.82 やせすぎ(SLIM)
w > (h-95)*1.10 ふとりすぎ(FAT)
その中間 正常(NORMAL)
>>164 身長h(cm),体重w(Kg) のh,w,cm,Kg をどうプログラムに反映するか悩みます。
:- op(250,xf,cm).
:- op(250,xf,'Kg').
体型を判定する(_h cm,_w 'Kg','やせすぎ(SLIM)') :-
_w < (_h-95) * 0.82,!.
というような定義は可能ですが、引数にリスト以外の複合項がくるのが気に入らない。
>>164 % こういう定義の仕方を最近は好んでいます。
% 身長を読み込む/1,体重を読み込み/1, は行数の関係から省略します。
% 全文は
http://nojiriko.asia/prolog/prolog_164.html を参照してください。
'定 義:身長h(cm),体重w(Kg)とすると w < (h-95)*0.82 やせすぎ(SLIM) w > (h-95)*1.10 ふとりすぎ
(FAT) その中間 正常(NORMAL) '(_体型判定) :-
身長を読み込む(_身長),
体重を読み込む(_体重),
'身長、体重から体型を判定する'(_身長,_体重,_体型判定).
'身長、体重から体型を判定する'(_身長,_体重,_体型判定) :-
'体重が (身長-95) * 0.82 より小さい時は'(_身長,_体重,_体型判定).
'身長、体重から体型を判定する'(_身長,_体重,_体型判定) :-
'体重が (身長-95) * 0.10 より大きい時は'(_身長,_体重,_体型判定).
'身長、体重から体型を判定する'(_身長,_体重,_体型判定) :-
'その中間'(_身長,_体重,_体型判定).
'体重が (身長-95) * 0.82 より小さい時は'(_身長,_体重,'やせすぎ(SLIM)') :-
_体重 < (_身長-95) * 0.82,!.
'体重が (身長-95) * 0.10 より大きい時は'(_身長,_体重,'ふとりすぎ(FAT)') :-
_体重 > (_身長-95) * 1.10,!.
'その中間'(_身長,_体重,'正常(NORNAL)') :-
_体重 >= (_身長-95) * 0.82,
_体重 =< (_身長-95) * 1.10,!.
168 :
デフォルトの名無しさん:2010/11/16(火) 10:15:32
<問題>
以下のようにスポーツができるか否かを判断するプログラムを考える。
1. 天気が晴れの場合は, テニスコードが空いているならテニスができる。
2. 天気が晴れでない場合は, 卓球室があいているなら卓球ができる。
3. 上記以外の場合はなにもしない。
ここで天気状況などの事実を次のように定義する。
weather(clear). % 天気が晴れ(これを削除すれば「天気が晴れでない」となる)
empty(tennis-court). % テニスコードが空き
......
また、スポーツができるか否かを上記事実に基つく推論する規則play-sport() は次のように定義
する。
play-sport :- weather(clear), !, empty(tennis-court), write('tennis').
play-sport :- empty(table-tennis-court), write('table tennis').
これらの規則により
weather(clear)(天気が晴れ)とempty(tennis-court)(テニスコードが空き)がともに真の
場合は, 1番目の規則が成立する。
weather(clear) が真でもempty(tennis-court) が偽の場合、1番目の規則は成立しない。しか
も既に「!」を通過したため、2 番目の推論規則がカットされ、全ての規則が成立しないこ
とになる。
weather(clear) が偽の場合は,「!」を通過せずに1番目の規則が成立しなくなるため、2 番
目の規則が適用さる。これでempty(table-tennis-court) の真偽により2番目の規則が成立す
るか否かが決まる。
:- op(650,xfx,が).
どんなスポーツをするか(テニス) :- テニスをする,!.
どんなスポーツをするか(卓球) :- 卓球をする,!.
どんなスポーツをするか(なにもしない) :- なにもしない.
テニスをする :- テニスができる.
卓球をする :- \+(天気 が 晴れ),卓球ができる.
なにもしない :-\+(テニスをする),\+(卓球をする).
テニスができる :-
'天気が晴れの場合は, テニスコードが空いているならテニスができる。'.
'天気が晴れの場合は, テニスコードが空いているならテニスができる。' :-
天気 が 晴れ,
テニスコード が 空いている.
卓球ができる :- 卓球室 が あいている.
% 例えば以下のような定義を書く。
天気 が 晴れ.
テニスコード が 空いている.
卓球室 が あいている.
:- op(750,xfx,が).
どんなスポーツをするか(テニス) :- テニスをする,!.
どんなスポーツをするか(卓球) :- 卓球をする,!.
どんなスポーツをするか(なにもしない) :- なにもしない.
テニスをする :- テニスができる.
卓球をする :- \+(天気 が 晴れ),卓球ができる.
なにもしない :-\+(テニスをする),\+(卓球をする).
テニスができる :-
'天気が晴れの場合は, テニスコードが空いているならテニスができる。'.
'天気が晴れの場合は, テニスコードが空いているならテニスができる。' :-
天気 が 晴れ,
テニスコード が 空いている.
卓球ができる :- 卓球室 が あいている.
% 例えば以下のような定義を書く。
天気 が 晴れ.
テニスコード が 空いている.
卓球室 が あいている.
なにもしない を定義したあたりが怖いのだけれども、
一応これで合っているか。
超難問を見つけた 「管理会計」C.T.ホーングレン著 小倉栄一郎・加藤勝康 共著
日本生産性本部発行 1974年 p440
<問題>
フラン社の推測によれば,もしある専用機械を原価$9,000で購入すれば,つぎの
5か年での年間の現金支出をともなう操業費を,毎年$2,500節約することができる.
存存価額は,等差級数法によって減価償却費を計算する場合には税金計算上ゼロであ
るが,$1,000であると期待される.税引後の希望最低投資利益率は10%であり,所得
税率は経常所得にたいして40%である.割引キャッシュ・フロー法を用いてこの投資
が望ましいものであるか否か示せ.
>>172 誤植 <最後の行>
が望ましいものであるか否か示せ. -->
が望ましいものであるか否かを示せ.
もう、一ヶ所誤りがあったので書き直します。
超難問を見つけた 「管理会計」C.T.ホーングレン著 小倉栄一郎・加藤勝康 共著
日本生産性本部発行 1974年 p440より
<問題>
フラン社の推測によれば,もしある専用機械を原価$9,000で購入すれば,つぎの
5か年での年間の現金支出をともなう操業費を,毎年$2,500節約することができる.
残存価額は,等差級数法によって減価償却費を計算する場合には税金計算上ゼロであ
るが,$1,000であると期待される.税引後の希望最低投資利益率は10%であり,所得
税率は経常所得にたいして40%である.割引キャッシュ・フロー法を用いてこの投資
が望ましいものであるか否かを示せ.
所得税率高すぎないか?
>>175 公民権法案の時代だから高かったなんてことないかな。
<問題>
ポーカーの役、ストレートとフラッシュについての問題です。
どちらの役が出現し難いかを示すPrologプログラムを書きなさい。
>>177 生まれて始めての Prologプログラムと思って頑張ってみたけど
フラッシュの数え上げしかできないよう
何だよストレートの組み合わせ44通りって・・・しっかりしろ俺
180 :
デフォルトの名無しさん:2010/12/01(水) 10:39:01
<問題>
not(P) :- P, !, fail.
not(P).
のnot(P) を利用しプログラムnot_and(A1,A2) を書きなさい。但しnot_and(A1,A2) は
A1,A2 ともに成立する場合だけ成立しない。以下にこのプログラムの実行結果を示す.
>>180 not_and(A,B) :- not(A),not(B).
not_and(A,B) :- not(not(A)),not(B).
not_and(A,B) :- not(A),not(not(B)).
not_and(A,B) :- not(not(A)),not(not(B)),fail.
>>180 こういう指定だったか。
not_and(A1,A2) :- not(A1),not(A2).
not_and(A1,A2) :- not(not(A1)),not(A2).
not_and(A1,A2) :- not(A1),not(not(A2)).
not_and(A1,A2) :- not(not(A1)),not(not(A2)),fail.
<問題>
慶応元年以降の和暦西暦変換述語を
書きなさい。
<問題>
8Queensを解け
186 :
デフォルトの名無しさん:2011/01/04(火) 15:38:54
<問題>
path(V,V).
path(V,U) :- link(V,W), path(W,U).
newLink :- read(X), oneLink(X).
oneLink(end_of_file) :- !.
oneLink(X) :- asserta(X), newLink.
add(F) :- asserta(link(dbmark,0)), see(F),
newLink, seen, see(user).
clear :- get_next, clear.
get_next :- retract(link(X,_)), !, X \== dbmark.
このプログラムを拡張して始点から終点までの経路を表示できるようにしなさい。
入力ファイルは以下
link(ac,gm).
link(gm,rq).
link(rq,lh).
link(lh,sh).
link(sh,lb).
link(lb,ad).
link(ad,ac).
実行例
| ?- add(map).
yes
| ?- path(ac,ad).
ac->gm->rq->lh->sh->lb->ad
yes
>>186 バックトラックが起きた時の表示の工夫をしないならば、
path(V,V) :- write('->'),write(V),nl.
path(V,U) :- link(V,W),write(V),write('->'),path(W,U).
だけでいいと思う。
>>184 誰が書いても同じようなコードになりそうな気がするが、
本当にそうであるか、主要なProlog書籍に載っている
8クィーンのソースコードを比較するサイトを準備中。
190 :
デフォルトの名無しさん:2011/01/07(金) 12:20:17
>>190 これいい本なんだよね。ほとんど知られていないのが残念。
<問題>
選手の成績順のリストと、一位からの入賞賞金のリストがあります。一位から
順に賞金を賦与するのですが、入賞者の中で同順位があった場合はその順位の
賞金と一つ下位の賞金の合計を両者で分け合います。さらに多くの同順位者が
いた場合は、同様に下位の賞金を合計していって、同順位者で分け合います。
下位の入賞者が多数いて入賞者数を超えてしまったら、該当する全員を入賞扱い
として一番下位の賞金を分け合うこととします。
このような3引数の述語 入賞賞金賦与を定義しなさい。
ペペロンチーノのレシピが以下のように定義されています。
作り方の定義の部分を同時進行を示すことができるように改めてください。
レシピ(ペペロンチーノ,材料,'塩,コショウ',6 人前,適量).
レシピ(ペペロンチーノ,材料,'オリーブ油',6 人前,200 cc).
レシピ(ペペロンチーノ,材料,'にんにく(つぶしたもの)',6 人前,3-4 片).
レシピ(ペペロンチーノ,材料,'赤とうがらし',6 人前,1 個).
レシピ(ペペロンチーノ,材料,'パセリのみじん切り',6 人前,2-3 枚 分).
レシピ(ペペロンチーノ,作り方,1,'にんにくを細かく刻む').
レシピ(ペペロンチーノ,作り方,2,'スパゲッティをやわらかくなるまでゆでる').
レシピ(ペペロンチーノ,作り方,3,'刻んだにんにくと赤とうがらしをオリーブ油で十分に炒める').
レシピ(ペペロンチーノ,作り方,4,'ゆで上がったスパゲッティの水気を切り、深いさらに入れる').
レシピ(ペペロンチーノ,作り方,5,'にんにくを炒めた鍋からオリーブ油を直接皿に注ぐ').
レシピ(ペペロンチーノ,作り方,6,'黒コショウを振りかけてよく混ぜる').
194 :
193:2011/02/17(木) 15:15:35
大事なものを落としていました。
:- op(600,xf,cc).
:- op(600,xf,片).
:- op(600,xf,枚分).
:- op(600,xf,個).
これを先頭に置く必要がありますね。
<問題>
>>193 の定義のうち、
レシピ(ペペロンチーノ,作り方,2,'スパゲッティをやわらかくなるまでゆでる').
'スパゲッティをやわらかくなるまでゆでる'を述語として
定義しなさい。将来調理ロボットがこの定義に従い、
料理することになるとして。
<問題>
リストからランダムにひとつずつ情報を取り出します。
ただし、一度取り出した情報は引かないこととします。
このような非決定性の述語を定義してください。
第一引数にリスト、第二引数に何番目の要素を引いたか、第三引数に取り出した要素,
最後の第四引数に取り出された要素以外の要素ならびを持つものとします。
<問題> --灘中入試問題--
ある4けたの整数を9倍したとき,やはり4けたの
整数で各位の数字の順序が逆になるといいます。
このとき,始めの整数の十の位の数字は何ですか。
0000
1089
>>199 算数的な解法?
1) 整数の範囲は1000~1111である
2) 最初のけたと9を掛けた最後のけたは同じ数字だから最後のけたは9である
3) 100の位は0か1にしかならないが、1だとすると1109*9しかないがこれは適合しない
4) したがって100の位は0、9を掛けた数字の10の位は0である
5) 10の位の9倍と1の位の繰り上がり8を加えものが0であるから、10の位に9を掛けたものの下一桁は
2である
6) 9倍してその下一桁が2になるのは8*9以外にない。
7) 答えは8である。
>>199 'ある4けたの整数を9倍したとき,やはり4けたの整数で各位の数字の順序が逆になるといいます。このとき,始めの整数の十の位の数字は何ですか。'(_始めの整数の十の位の数字) :-
'9倍して9999を超えない最大数'(_9倍して9999を超えない最大数),
for(1000,_ある4桁の数,_9倍して9999を超えない最大数),
number_chars(_ある4桁の数,Chars),
reverse(Chars,RChars),
_ある4桁の数の9倍の数 is _ある4桁の数 * 9,
number_chars(_ある4桁の数の9倍の数,RChars),
始めの整数の十の位の数字は(_ある4桁の数,_始めの整数の十の位の数字).
始めの整数の十の位の数字は(_ある4桁の数,_始めの整数の十の位の数字) :-
_答え is (_ある4桁の数 // 10) mod 10.
'9倍して9999を超えない最大数'(_9倍して9999を超えない最大数) :-
_9倍して9999を超えない最大数 is 9999 // 9.
203 :
デフォルトの名無しさん:2011/03/07(月) 20:22:26.24
<問題>
>>199 の問題に対し、出来る限り
>>201の考え方に
沿った述語定義によって解を示す、Prologプログラムを
書きなさい。
204 :
デフォルトの名無しさん:2011/03/09(水) 11:14:07.62
<問題>
足引之 山河之瀬之 響苗尓 弓月高 雲立渡
万葉集の第七巻(1088)に出てくる柿本人麻呂の歌です。
日めくり万葉集というテレビ番組でガンダムの安彦良和さんが
興味深いコメントをされていて、題材にしたくなりました。
さて、この歌の出来る限り詳しい解説をPrologの述語として
定義してください。
>>203 例えば、ここはどう定義すればよいのだろうか。
2) 最初のけたと9を掛けた最後のけたは同じ数字だから最後のけたは9である
206 :
デフォルトの名無しさん:2011/03/26(土) 12:28:36.89
ある4けたの整数の第一桁は1しかない。1を9倍する9であるが、
繰り上がりが生じると、4桁を維持できなくなる。
したがって繰り上がりは生じない。すなわち9である。
という論理の表現。
207 :
デフォルトの名無しさん:2011/05/25(水) 02:24:56.80
本当ににありがとうm(_ _)m
助かります。
>>204 パイプオルガンの響きが立ち昇っていくような歌だね。
211 :
デフォルトの名無しさん:2011/07/17(日) 23:14:43.69
ここで質問する内容かどうか分かりませんが
差分リストで以下の述語を書く方法はありますか?
concatmap(F,[X|Xs],Ys) :-
call(F,X,As),
concatmap(F,Xs,Bs),
append(As,Bs,Ys).
concatmap(_,[],[]).
>210
( ´,_ゝ`)プッ
>>210 弓月嶽は、伊勢に遷るまで天皇の神が祀られていた
三輪山のとなりの山で、天照大神がここに降り立ったと
少なくとも安彦さんは解釈しているようだ。
そのことを知っていた人麻呂が神々しさを感じて、この歌を
詠んだ。
たとえば、以下のような述語を定義していくことは可能だが、
>>213のような領域の述語定義となると、やはり大変。
足引之はあしひきのと読み山に掛かる枕詞である :-
枕詞(足引之),
訓み(足引之,あしひきの).
掛かり(足引之,山).
与えたリストをシャッフルするshuffle/2を実装してください。
?- shuffle([a,b,c], X).
X = [b,a,c];
false
>>215 % SWI-Prolog 仕様
shuffle(_元のカードの束,_切られたカードの束) :-
length(_元のカードの束,_カードの枚数の束),
length(Ln,100),
shuffle(Ln,_カードの枚数,_元のカードの束,_切られたカードの束).
shuffle([],_,_カードの束,_カードの束) :- !.
shuffle([_|Ln],_カードの枚数,_カードの束1,_カードの束) :-
_乱数値 is random(_カードの枚数),
length(L0,_乱数値),
append(L0,L1,_カードの束1),
append(L1,L0,_カードの束2),
shuffle(Ln,_カードの枚数,_カードの束2,_カードの束).
217 :
216:2011/07/30(土) 05:09:16.94
すみません。一ヶ所まちがえた。
>>215 % SWI-Prolog 仕様
shuffle(_元のカードの束,_切られたカードの束) :-
length(_元のカードの束,_カードの枚数),
length(Ln,100),
shuffle(Ln,_カードの枚数,_元のカードの束,_切られたカードの束).
shuffle([],_,_カードの束,_カードの束) :- !.
shuffle([_|Ln],_カードの枚数,_カードの束1,_カードの束) :-
_乱数値 is random(_カードの枚数),
length(L0,_乱数値),
append(L0,L1,_カードの束1),
append(L1,L0,_カードの束2),
shuffle(Ln,_カードの枚数,_カードの束2,_カードの束).
>>215 % 一回ずつ非決定性述語仕様で切っていくには、
shuffle(_元のカードの束,_切られたカードの束) :-
length(_元のカードの束,_カードの枚数),
_乱数値 is random(_カードの枚数),
length(L0,_乱数値),
shuffle(L0,_元のカードの束,_切られたカードの束).
shuffle(L0,_元のカードの束,_切られたカードの束) :-
append(L0,L1,_元のカードの束),
append(L1,L0,_切られたカードの束).
shuffle(L0,_元のカードの束,_切られたカードの束) :-
append(L0,L1,_元のカードの束),
append(L1,L0,_切られたカードの束1),
shuffle(_切られたカードの束1,_切られたカードの束).
>>218 実際の動作に近く、好ましくみえるのだが、これを使って
しかも、何回切るかという指定をするとなると大変むずかしい。
大域変数や一時述語を作って、assert/retractを繰り返さない限り、
不可能。
>>216 のように引数に切る回数を入れるように拡張する
必要がある。すなわち、この述語のなかにforを組み込む。
220 :
219:2011/07/30(土) 06:02:27.82
221 :
215:2011/07/30(土) 10:25:20.82
>>216 ありがとうございます。
私は組み込み述語のselectを使って作ってみました。
% SWI-Prolog
shuffle([], []) :- !.
shuffle(_入力リスト, _出力リスト) :-
length(_入力リスト, _リスト長),
_選択位置 is random(_リスト長),
nth0(_選択位置, _入力リスト, _選択要素),
select(_選択要素, _入力リスト, _残りリスト),
shuffle(_残りリスト, _出力リスト1),
_出力リスト = [_選択要素 | _出力リスト1].
222 :
215:2011/07/30(土) 10:40:31.85
「シャッフル」という言葉を、単純にランダムのリストの要素を
並び換えるという意味で使いました。
すみません。説明不足でした。
223 :
215:2011/07/30(土) 10:42:10.29
×単純にランダムのリストの要素を並び換える
○単純にリストの要素をランダムに並び換える
>>221 一番自然なコードは
shuffle_n(0,_,_リスト,_リスト) :- !.
shuffle_n(_n,_カードの枚数,_入力リスト,_出力リスト) :-
shuffle(_入力リスト,_切られたリスト),
_n_1 is _n - 1,
shuffle_n(_n_1,_カードの枚数,_切られたリスト,_出力リスト).
shuffle(_カードの枚数,_入力リスト,_出力リスト) :-
_乱数値1 is random(_カードの枚数) + 1,
_乱数値2 is random(_カードの枚数) + 1,
交換(1,[_乱数値1,_乱数値2],V1,V2,_入力リスト,_出力リスト).
交換(N,_交換位置リスト,V1,V2,[A|R1],[A|R2]) :-
\+(member(N,_交換位置リスト)),
N2 is N + 1,
交換(N2,_交換位置リスト,V1,V2,R1,R2),!.
交換(N,_交換位置リスト,V1,V2,[A|R1],[V2|R2]) :-
var(V1),
V1 = A,
N2 is N + 1,
交換(N2,_交換位置リスト,V1,V2,R1,R2),!.
交換(_,_,V1,V2,[A|R],[V1|R]) :-
var(V2),
V2 = A,!.
リストをある要素で、複数のリストに分割するsplit/3を実装せよ。
?- split([1,0,2,3,0,4,0,0,5], 0, X).
X = [[1],[2,3],[4],[],[5]]
>>226 split([],_,[]) :- !.
split(L1,_区切り文字,L2) :-
split(L1,_区切り文字,L,R),
split(R,_区切り文字,L3),
append([L],L3,L2).
split([],_,[],[]) :- !.
split([_区切り文字|R],_区切り文字,[],R) :- !.
split([A|R1],_区切り文字,[A|R2],R) :-
split(R1,_区切り文字,R2,R).
228 :
226:2011/08/01(月) 23:41:36.82
>>227 速いですね!
これから、解析させてもらいます
>>226 split(L1,_区切り文字,L2) :-
findall(L,(
split_3(L1,_区切り文字,L)),
L2).
split_3(L1,_区切り文字,L1) :-
\+(member(_区切り文字,L1)),!.
split_3(L1,_区切り文字,L0) :-
split_4(L1,_区切り文字,L0,R).
split_3(L1,_区切り文字,L0) :-
split_4(L1,_区切り文字,_,R),
split_3(R,_区切り文字,L0).
split_4(L1,_区切り文字,L0,R) :-
append(L0,[_区切り文字|R],L1),!.
>>226 ごめんなさい。
>>227はこれでよいのか。
split([],_,[]) :- !.
split(L1,_区切り文字,[L|R2]) :-
split(L1,_区切り文字,L,R),
split(R,_区切り文字,R2).
split([],_,[],[]) :- !.
split([_区切り文字|R],_区切り文字,[],R) :- !.
split([A|R1],_区切り文字,[A|R2],R) :-
split(R1,_区切り文字,R2,R).
>>226 これもありそう。
split(L1,_区切り文字,[L0|R2]) :-
split_4(L1,_区切り文字,L0,R),
split(R,_区切り文字,R2).
split(L1,_区切り文字,[L1]).
split_4(L1,_区切り文字,L0,R) :-
append(L0,[_区切り文字|R],L1),!.
232 :
226:2011/08/02(火) 00:43:24.06
ちょっと考え込んでしまいましたが、
シンプルに、こんな感じではいかがでしょうか?
split([], _, [[]]) :- !.
split([S|R], S, [[]|L]) :- split(R, S, L), !.
split([H|R], S, [[H|H1]|L]) :- split(R, S, [H1|L]), !.
233 :
226:2011/08/02(火) 00:45:53.37
アプローチとしては、リストの末尾から時間を逆戻しする感じで、
具体例を考えて、次に変数を導入するようにしてみました。
split([], 0, [[]]).
split([5], 0, [[5]]).
split([0,5], 0, [[],[5]]).
split([0,0,5], 0, [[],[],[5]]).
split([4,0,0,5], 0, [[4],[],[5]]).
>>226 非決定性述語をもうひとつ。速度効率無視。
split(L,_区切り文字,X) :-
最初に区切り文字が出現するまでの部分も対象(L,_区切り文字,X).
split(L,_区切り文字,X) :-
区切り文字と区切り文字に囲まれた部分(L,_区切り文字,X).
split(L,_区切り文字,X) :-
最後の要素は残り要素に区切り文字が出現しない(L,_区切り文字,X).
split(L,_区切り文字,L) :-
リストのなかに区切り文字が存在しないときは(L,_区切り文字).
最初に区切り文字が出現するまでの部分も対象(L,_区切り文字,X) :-
append(X,[_区切り文字|_],L),
\+(member(_区切り文字,X)).
区切り文字と区切り文字に囲まれた部分(L,_区切り文字,X) :-
append(_,[_区切り文字|X],[_区切り文字|_],L),
\+(member(_区切り文字,X)).
最後の要素は残り要素に区切り文字が出現しない(L,_区切り文字,X) :-
append(L0,[_区切り文字|X],L),
\+(member(_区切り文字,X)).
リストの中に区切り文字が存在しないときは(L,_区切り文字) :-
\+(member(_区切り文字,L)).
append([],L1,L2,L) :-
append(L1,L2,L).
append([A|R1],L1,L2,[A|R]) :-
append(R1,L1,L2,R).
>>215 shuffle(_カードの束,_切られたカードの束) :- shuffle([_,_,_,_,_],_カードの束,_切られたカードの束).
shuffle([],_カードの束,_カードの束) :- !.
shuffle([_|Ln],_カードの束,_切られたカードの束) :-
概ね分割する(_カードの束,_カードの束_1,_カードの束_2),
カードを雑に併合(1,_カードの束_1,_カードの束_2,_カードの束_3),
shuffle(Ln,_カードの束_3,_切られたカードの束).
概ね分割する(_カードの束,_カードの束_1,_カードの束_2) :-
_分割数1 is random(7) + 20,
length(_カードの束_1,_分割数1),
append(_カードの束_1,_カードの束_2,_カードの束),
カードを雑に併合(_カードの束_1,_カードの束_2,_カードの束_3),
カードを雑に併合(1,_カードの束_1,_カードの束_2,_カードの束) :-
_重なる枚数 is truncate(random(4) * 0.4 + 1),
length(L,_重なる枚数),
append(L,R1,_カードの束1),
カードを雑に併合(2,R,_カードの束_2,_カードの束_3),
append(L,_カードの束_3,_カードの束),!.
カードを雑に併合(2,_カードの束_1,_カードの束_2,_カードの束_3) :-
_重なる枚数 is truncate(random(4) * 0.4 + 1),
length(L,_重なる枚数),
append(L,R2,_カードの束2),
カードを雑に併合(1,_カードの束_1,R,_カードの束_3),
append(L,_カードの束_3,_カードの束),!.
カードを雑に併合(_,_カードの束_1,_カードの束_2,_カードの束) :-
append(_カードの束_1,_カードの束2,_カードの束),!.
>>215 shuffle(_カードの束,_切られたカードの束) :-
length(_カードの束,_カードの枚数),
_カードの枚数 > 2,
M is _カードの枚数 // 12 + 3,
_乱数値 is random(M),
length(L0,_乱数値),
append(L0,L1,_カードの束),
shuffle(L1,_カードの束_2),
append(_カードの束_2,L0,_切られたカードの束),!.
shuffle(_カードの束,_カードの束).
# 「どうでもいいけど猫同士のコミュニケーションの代数構造どうなってんすかね」 by m0h1can on twitter
#
# これにヒントを得て、
#
# 述語 「猫は回さない」 を定義せよ。
#
240 :
デフォルトの名無しさん:2011/10/07(金) 07:36:05.65
>488 名前: 365 Mail: sage 投稿日: 2011/09/29(木) 18:07:57.87
>
>>485 >Prolog で型チェック:Rainy Day Codings:So-net blog
>
http://rainyday.blog.so-net.ne.jp/2008-06-16 >
>題名は型チェックだけど、コードはまぎれもなく型推論
>
>489 名前: デフォルトの名無しさん Mail: sage 投稿日: 2011/09/29(木) 19:09:02.35
>ああPrologだから単一化で型推論が起きるのか。
>
>490 名前: デフォルトの名無しさん Mail: sage 投稿日: 2011/10/04(火) 18:43:07.61
>prologで型推定が一番楽にできそう
>しかし返値しか推定してないね
|....,,__
|_::;; ~"'ヽ
| //^''ヽ,,)
| i⌒"
| ∀`) < 誰もいない きのこるならいまのうち
|⊂
| ノ
_,,,......,,__
/_~ ,,...:::_::;; ~"'ヽ
(,, '"ヾヽ i|i //^''ヽ,,)
^ :'⌒i i⌒"
|( ´∀`) < きのこ のこーのこ げんきのこ ♪
|(ノ |つ
| |
⊂ _ ノ
""U
_,,,......,,__
/_~ ,,...:::_::;; ~"'ヽ
(,, '"ヾヽ i|i //^''ヽ,,)
^ :'⌒i i⌒"
(´∀` )| < エリンギ まいたけ ブナシメジ ♪
⊂| (ノ |
| |
ヽ _ ⊃
.U""
|
| ミ
| ミ サッ!
| ミ
|
243 :
デフォルトの名無しさん:2012/05/25(金) 08:00:45.01
>>37 'リストの要素として、4個目のaを見つけて残りのリスト'(_リスト,_残りのリスト) :-
'リストの要素として、4個目のaを見つけて残りのリスト'(1,_リスト,_残りのリスト).
'リストの要素として、4個目のaを見つけて残りのリスト'(4,[a|_残りのリスト],_残りのリスト) :- !.
'リストの要素として、4個目のaを見つけて残りのリスト'(N,[a|R1],_残りのリスト) :-
N_2 is N + 1,
'リストの要素として、4個目のaを見つけて残りのリスト'(N_2,R1,_残りのリスト),!.
'リストの要素として、4個目のaを見つけて残りのリスト'(N,[_|R1],_残りのリスト) :-
'リストの要素として、4個目のaを見つけて残りのリスト'(N,R1,_残りのリスト).
>>38 'リストの要素が変数Xで与えられるとする。N個目のXの残りのリストを返す'(N個目,X,_リスト,_残りリスト) :-
'リストの要素が変数Xで与えられるとする。N個目のXの残りのリストを返す'(1,N個目,X,_リスト,_残りリスト).
'リストの要素が変数Xで与えられるとする。N個目のXの残りのリストを返す'(N,N,X,[X|_残りリスト],_残りリスト) :- !.
'リストの要素が変数Xで与えられるとする。N個目のXの残りのリストを返す'(M,N,X,[X|R],_残りリスト) :-
M_2 is M + 1,
'リストの要素が変数Xで与えられるとする。N個目のXの残りのリストを返す'(M_2,N,X,R,_残りリスト),!.
'リストの要素が変数Xで与えられるとする。N個目のXの残りのリストを返す'(M,N,X,[_|R],_残りリスト) :-
'リストの要素が変数Xで与えられるとする。N個目のXの残りのリストを返す'(M,N,X,R,_残りリスト).