Prologの宿題片付けます
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2010/04/23(金) 16:02:04人も、思い悩んでいる人も、ここにその問題を載せてください。
宿題はその講座がどんな内容かをちょっとだけ垣間見させて
くれます。
全国の大学に100を越える講座があるといわれるProlog。
どんな宿題がでてくるのか楽しみです。
0002デフォルトの名無しさん
2010/04/23(金) 19:56:460003デフォルトの名無しさん
2010/04/24(土) 00:01:27予想2 質問と回答の文体が一致したまま何年も存続
予想3 事務処理の問題ばかりになる
0004デフォルトの名無しさん
2010/04/25(日) 13:59:240005デフォルトの名無しさん
2010/04/26(月) 05:31:22ちょっと大変だなぁ。宿題の域を越えている。
0006デフォルトの名無しさん
2010/04/26(月) 07:17:440007デフォルトの名無しさん
2010/04/26(月) 07:30:34http://nojiriko.asia/prolog/httpd_status_code.html
この中のhttpd_status_code/3だけで36行w
0008デフォルトの名無しさん
2010/04/26(月) 08:00:11apache.conf(apache2.conf)を仕様書と見立てて、単位節を定義し、
それにルールを付加していくことでhttpdサーバーの実装を試みなさい。
なんていうのなら、面白そう。
0009デフォルトの名無しさん
2010/04/26(月) 08:19:38なるほどね。それでは
<問題>
apache.confのような解説文とキーワードが区別なくコメントアウトされて
いる仕様書から、キーワード定義だけ述語として定義するためのルールを
Prolog述語として定義しなさい。
0010デフォルトの名無しさん
2010/04/26(月) 18:16:05例えば、
# Include the virtual host configurations:
# Include /etc/apache2/sites-enabled/
で、上は説明。下は定義節。とどうやって切り分けるのかな。
0011デフォルトの名無しさん
2010/04/27(火) 06:07:410012デフォルトの名無しさん
2010/04/27(火) 19:29:14やってはみたが、何の役にも立たない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').
0013デフォルトの名無しさん
2010/04/27(火) 19:30:35'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/').
0014デフォルトの名無しさん
2010/04/27(火) 20:55:10確かに役にたたない。apacheのconfigってこんなに簡素なものだったかな。
全然、httpdの全体像が見えてこないね。このアプローチは失敗ということで。
0015デフォルトの名無しさん
2010/04/27(火) 21:00:30だけの違いだろう。全部、includeしてから作業をしなくてはいけない。
0016デフォルトの名無しさん
2010/04/28(水) 07:04:070017デフォルトの名無しさん
2010/04/28(水) 09:49:07<問題> 単位行列であるかどうかの検査には正方行列であるかどうかの
検査も必要です。この検査述語 正方行列/1 も定義せよ。
0018デフォルトの名無しさん
2010/04/28(水) 10:56:34正方行列(_正方行列) :-
length(_正方行列,_行数),
正方行列(1,_行数,_正方行列).
正方行列(N,_次数,[]) :-
N > _次数,!.
正方行列(N,_次数,[_行|R]) :-
length(_行,_次数),
N2 is N + 1,
正方行列(N2,_次数,R).
0019デフォルトの名無しさん
2010/04/28(水) 11:31:02単位行列(_単位行列) :-
正方行列(_単位行列),
length(_単位行列,_次数),
単位行列(1,_次数,_単位行列).
単位行列(M,N,[]) :- M > N,!.
単位行列(M,N,[_行|R]) :-
単位行列(M,1,N,_行),
M2 is M + 1,
単位行列(M2,N,R).
0020デフォルトの名無しさん
2010/04/28(水) 11:36:15単位行列(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).
0021デフォルトの名無しさん
2010/04/28(水) 12:06:50「ダンスは・・・・・・魂の原型が、いまだ男性的とも女性的とも分かれていないで、ただ≪人間的≫としか
いいあらわすことができないような・・・・・・深みとつながっている」。このマックス・テルピスの言葉(原註64)は、
とくにダンス・クラシック・アカデミックにあてはまる。ダンス・クラシックの舞踊家が完全なる人間を
表すとすれば、この舞踊家は、二つの性を兼ねた人間の原型を表しているのだ。つまり、舞踊家の中に、二つの
性をもった人間の原型が回想されるのである。
この文は『バレエ 形式と象徴』 ゲルハルト・ツァハリアス著 渡辺鴻訳 美術出版社 1965年 の中にあります。
この文の要旨のメモをProlog述語として記述するなら、どんな定義になりますか?
0022デフォルトの名無しさん
2010/04/29(木) 17:05:16森と林はどちらも樹木の集合、塊ですが、
林は、同じ種類の樹木で構成され、
森は、いろいろな種類の樹木が混ざった状態のものだと考えられます。
森と林をProlog述語として定義しなさい。
0023デフォルトの名無しさん
2010/04/29(木) 18:14:23「林は概ね同じ種類の樹木で構成され」ですね。
雑木林という概念はありますがこれは例外です。この例外も
述語としての定義に含めてください。
0024デフォルトの名無しさん
2010/04/30(金) 09:27:46"ブナの森の葉隠に"じゃなかったかな?
0025デフォルトの名無しさん
2010/04/30(金) 12:15:34概ねの閾値(0.9).
林は概ね同じ種類の樹木で構成され(_林) :-
list(_林),
概ねの閾値(_概ねの閾値),
length(_林,_木の本数),
setof(_木,member(_木,_林),L),
findmax([Count,_木],(member(_木,L),count(member(_木,_林),Count)),[_一番多い木の本数,_一番多い木]),
_一番多い木の本数 >= truncate(_木の本数 * _概ねの閾値).
0026デフォルトの名無しさん
2010/04/30(金) 15:41:11混在の閾値(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).
0027デフォルトの名無しさん
2010/04/30(金) 15:52:07% これだと12本以下の樹木の集合は種類を問わず「森」になってしまう。
% 少々武骨だが、以下の2副目標を加える必要がある。
森は、いろいろな種類の樹木が混ざった状態(_森) :-
list(_森),
length(_森,_樹木の本数),
_樹木の本数 >= N2,
混在の閾値(N1/N2),
length(L0,N2),
先頭から全ての連続した一定要素の中に閾値以上の混在が見られる(N1/N2,L0,_森).
0028デフォルトの名無しさん
2010/04/30(金) 15:54:17森は、いろいろな種類の樹木が混ざった状態(_森) :-
list(_森),
length(_森,_樹木の本数),
混在の閾値(N1/N2),
_樹木の本数 >= N2,
length(L0,N2),
先頭から全ての連続した一定要素の中に閾値以上の混在が見られる(N1/N2,L0,_森).
0029デフォルトの名無しさん
2010/05/01(土) 08:10:17管理されているとします。このfoo/2の最終に引数で与えられた
節を追加する述語をfassertz/2を定義しなさい。
第一引数にはファイル名、第二引数には定義節が来ることとします。
0030デフォルトの名無しさん
2010/05/01(土) 08:17:48定義済み節の本体に現れる副目標を引数に与えて、
その副目標を含む述語定義をすべて表示する述語を
定義しなさい。
0031デフォルトの名無しさん
2010/05/01(土) 11:29:14listing_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).
0032デフォルトの名無しさん
2010/05/01(土) 11:38:11listing_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).
0033デフォルトの名無しさん
2010/05/01(土) 11:41:17fassertz(File,P) :-
open(File,append,Output),
writeq(Output,P),
write(Output,'.\n'),
close(Output),!.
0034デフォルトの名無しさん
2010/05/01(土) 11:50:24fassertz(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),!.
0035デフォルトの名無しさん
2010/05/01(土) 12:25:44先頭要素と同じ要素が残りに現れるリストがあります。このリストを第一引数として、この先頭要素と同じ要素の
一つ前と一つ後ろの要素が存在するならばこの3要素を第二引数にリストして返す非決定性の述語を定義しなさい。
0036デフォルトの名無しさん
2010/05/01(土) 12:35:40リストの先頭要素と同じ要素の一つ前と一つ後ろの要素が存在するならばこの3要素を第二引数にリストして返す([B|R],
[A,B,C]) :-
append(_,[A,B,C|_],[B|R]).
0037デフォルトの名無しさん
2010/05/05(水) 05:17:32リストの要素として、4個目の'a'を見つけて残りのリストを返す述語を定義しなさい。
0038デフォルトの名無しさん
2010/05/05(水) 05:23:42リストの要素が変数Xで与えられるとする。N個目のXの残りのリストを返す述語を定義しなさい。
0039デフォルトの名無しさん
2010/05/05(水) 06:04:47'リストの要素として、4個目のaを見つけて残りのリストを返す'(_リスト,_残りリスト) :-
append(L0,_残りリスト,_リスト),
count(append(_,[a|_],L0),4),!.
0040デフォルトの名無しさん
2010/05/05(水) 06:27:52'リストの要素が変数Xで与えられるとする。N個目のXの残りのリストを返す'(N個目,X,_リスト,_残りリスト) :-
append(L0,_残りリスト,_リスト),
count(append(_,[X|_],_リスト),N個目),!.
0041デフォルトの名無しさん
2010/05/05(水) 07:18:59リストの中の要素Xの残りのリストがパターンPに適合するからどうか判定する述語を定義しなさい。
パターンとの照合はこの述語のなかでcall(P)することで実現するものとする。
0042デフォルトの名無しさん
2010/05/05(水) 07:28:04リストの中の要素Xの残りのリストがパターンPに適合するからどうか判定する述語(_リスト,X,P,R) :-
append(_,[X|R],_リスト),
call(P).
% 要点は、引数にRを持つこと。そして、実際に目標とする時はPの引数の中にRが含ませる。
0043デフォルトの名無しさん
2010/05/05(水) 08:09:26% 要点は、引数に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
?-
0044デフォルトの名無しさん
2010/05/05(水) 08:13:13すみません、訂正。>>43の三番目のパターンのような使い方も可だが。
?- リストの中の要素Xの残りのリストがパターンPに適合するからどうか判定する述語([1,2,3,4,6,2,1],3,length(R,4),R).
R = [4,6,2,1]
yes
?-
0045デフォルトの名無しさん
2010/05/05(水) 09:51:45親子(義朝,頼朝).
親子(為義,義朝).
先祖(A,B) :- 親子(A,B).
先祖(A,B) :- 親子(A,C),先祖(C,B).
先祖関係をProlog述語として定義すると上記のようになるでしょう。
ところで、この定義なぜ親子関係だけ具体的な値で示されているので
しょうか。なぜルールで定義されていないのでしょうか。
どのような切り口、表現でも構いませんから、平易に説明してください。
0046デフォルトの名無しさん
2010/05/05(水) 20:07:41以下の文章は原色図鑑ライブラリー「蛾」監修 河田黨 1955年北隆館発行 からの抜粋です
ごまだらきこけが [ひとりが科]
開帳は23~32mm。体と翅は赤味がかった黄色で前翅には15個の黒い斑点がある。
発生するのは6~7月頃で普通にみられる種類である。分布は本邦はじめ広くアジアに
ひろがっている。幼虫は背に青い点を2列もった灰色の毛虫で長い毛があるひとりが科
の中でもこけがといわれる種類のものは,大部分その名の通り幼虫はコケ類を食べる。
ここで示されている情報をProlog述語として定義せよ。
0047デフォルトの名無しさん
2010/05/06(木) 01:43:27% あまりにも基本的な解答例
出典('原色図鑑ライブラリー「蛾」監修 河田黨 1955年北隆館',_).
蛾(ごまだらきこけが,ひとりが科,'開帳は23~32mm。体と翅は赤味がかった黄色で前翅に
は15個の黒い斑点がある。分布は本邦はじめ広くアジアにひろがっている。幼虫は背に青
い点を2列もった灰色の毛虫で長い毛があるひとりが科の中でもこけがといわれる種類の
ものは,大部分その名の通り幼虫はコケ類を食べる。') :- 出典('原色図鑑ライブラリー「蛾」監修 河田黨 1955年北隆館',_).
0048デフォルトの名無しさん
2010/05/06(木) 07:09:59述語 蛾/3 が>>47の形式で与えられたとして、第一引数の検索語から
和名、説明文を得る非決定性の述語 蛾検索/3 を定義しなさい。
0049デフォルトの名無しさん
2010/05/06(木) 13:24:57パターンを引数に与えて検索すること自体がPrologプログラミングと
して誤った姿勢であると思う。
常にそのパターン検出述語を定義してから、検索すること。
このことを厭うならPrologプログラマとして失格だ。
高階述語を使うのは仕様の文章に強制された場合だけ。
0050デフォルトの名無しさん
2010/05/06(木) 18:07:50基本的に、その見解に賛成。>>45の解とも重なるが、常に具体的な何かを
見据えたプログラミング姿勢が必要だと思う。
>>41はappendの利用法の勉強のための問題で、なにをやりたいかを強調するために
引数の中にその要求を埋めたように思うけれど。
0051デフォルトの名無しさん
2010/05/06(木) 18:50:54蛾検索(_検索語,_和名,_説明文) :-
蛾(_和名,_科,_説明文),
蛾検索(_検索語,_説明文).
蛾検索(_検索語,_説明文) :-
sub_atom(_説明文,_,_,_,_検索語),!.
0052デフォルトの名無しさん
2010/05/07(金) 00:22:21蛾検索(_検索語,_和名,_説明文) :-
蛾(_和名,_科,_説明文),
検索語が説明文の中にある(_検索語,_説明文).
検索語が説明文の中にある(_検索語,_説明文) :-
sub_atom(_説明文,_,_,_,_検索語),!.
0053デフォルトの名無しさん
2010/05/07(金) 06:20:52>>48 に於いて、
蛾検索(_検索語,_和名,_説明文) :-
蛾(_和名,_科,_説明文),
sub_atom(_説明文,_,_,_,_検索語).
としていない理由を述べなさい。
0054デフォルトの名無しさん
2010/05/07(金) 06:22:37>>52 に於いて、
蛾検索(_検索語,_和名,_説明文) :-
蛾(_和名,_科,_説明文),
sub_atom(_説明文,_,_,_,_検索語).
としていない理由を述べなさい。・・・でした。
0055デフォルトの名無しさん
2010/05/07(金) 21:01:30バラディゼールで行われた1971-72年シーズンのアルペンスキーFISワールドカップ大回転緒戦で
優勝した選手は誰か。その選手は札幌オリンピックではどんな成績をあげたか。
これをWebサイト、新聞、雑誌、書籍等で調べて、Prolog述語としてその全ての情報を定義しなさい。
0056デフォルトの名無しさん
2010/05/07(金) 21:02:23バルディゼール
0057デフォルトの名無しさん
2010/05/08(土) 07:39:17なおここで、女性の官人についても触れておくべきであろう。後宮に奉仕する女官を総称して宮人と
いうが、高級の女官は命婦といった。命婦のうちでも五位以上の階位のある者を内命婦と呼び、五位以
上の官人の妻は、自分で位をもっていなくても、夫の資格によって五位に準じて宮中に出入することを
許されていた。これを外命婦という。だから、五位以上の貴族の妻は、位階の有無にかかわらず女官で
あったと考えてよい。
-- 「律令制の基調」 村尾次郎著 塙書房 昭和35年 -- より
上記の文章をProlog述語として定義しなさい。
0058デフォルトの名無しさん
2010/05/08(土) 09:47:30Prologの課題はそのまま文章を載せたいので、著作権の関係から出題を躊躇することが多い
けれど、この本は50年を経過しています。
村尾氏というと「右寄りの」歴史学者の先入観からあまり読んだことがなかったのですが、
論理的な文章を書かれる方だし、この本などは無限に問題を引き出すことができそうですね。
0059デフォルトの名無しさん
2010/05/09(日) 20:37:491971年バルディゼール大回転の優勝者はエリック・ホーケル(ハーカー)だ。この新人は
大胆なストレート内傾ターンで途中転倒したにも拘らずすぐに起き上がりこのレースで
ワールドカップ初優勝を飾る。1973年苗場で行われたワールドカップ大回転を制して
日本では特に有名な彼だが、札幌オリンピックでは大回転一本目にラップを取りながら
二本目リズムに乗れないまま、前半の急斜面で転倒棄権した。しかし、滑降では5位に
入賞している。
0060デフォルトの名無しさん
2010/05/10(月) 13:09:10これは、情報を収集して、それを述語として定義する問題ですね。
そんなに簡単に完璧なヒントを出してしまったら・・・。
0061デフォルトの名無しさん
2010/05/11(火) 05:42:45'バルディゼールで行われた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').
0062デフォルトの名無しさん
2010/05/11(火) 07:24:11宮人(_宮人) :-
奉仕する(_宮人,後宮),
女官(_宮人).
命婦(_命婦) :-
女官(_命婦),
クラス(_命婦,高級).
内命婦(_内命婦) :-
命婦(_内命婦),
位階(_内命婦,五位以上).
外命婦(_外命婦) :-
命婦(_外命婦),
夫(_外命婦,_官人),
位階(_官人,五位以上).
宮中に出入りできる(_外命婦) :- 外命婦(_外命婦).
宮中に出入りできる(_官人) :- 官人(_官人).
官人(_官人) :- 位階(_官人,五位以上).
0063デフォルトの名無しさん
2010/05/11(火) 15:52:33宮人(_宮人) :- 奉仕する(_宮人,後宮),女官(_宮人).
女官(_女官) :- 官人(_女官),性別(_女官,女).
命婦(_命婦) :- 女官(_命婦),内命婦(_命婦).
命婦(_命婦) :- 女官(_命婦),外命婦(_命婦).
内命婦(_内命婦) :- 命婦(_内命婦),位階(_内命婦,五位以上).
外命婦(_外命婦) :-
命婦(_外命婦),
\+(位階(_外命婦,_五位以上)),
夫(_外命婦,_夫),
位階(_夫,_五位以上),
五位以上(_五位以上).
宮中に出入りできる(_外命婦) :- 外命婦(_外命婦).
宮中に出入りできる(_官人) :- 官人(_官人),位階(_官人,_五位以上),五位以上(_五位以上).
五位以上(_五位以上) :-
member(_五位以上,[一位,従一位,二位,従二位,三位,従三位,四位,従四位,五位,従五位]).
0064デフォルトの名無しさん
2010/05/11(火) 22:44:041=1を消して
このカットを引数のすぐ左に持ってくることはできますか?
0065デフォルトの名無しさん
2010/05/12(水) 07:11:001)引数というのはこのばあい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. は実質的に同じ意味。
ただ処理系によっては若干実行過程は異なるだろう。
0066デフォルトの名無しさん
2010/05/13(木) 08:04:30説明文のなかに検索語が複数含まれていると、
その回数分、_和名、_説明文が解として取れてしまう。
sub_atomを決定性の述語として扱うために再定義して
その本体に!を付加している。
0067デフォルトの名無しさん
2010/05/21(金) 08:07:35から、78頁の以下の文章を切り取りました。この文章からメモとして有用な
Prolog述語を定義しなさい。
カツオは南・北緯40°間に広く分布する熱帯性ないし温帯性の表層回遊魚で
ある。太平洋のカツオは西部太平洋系群と中東部太平洋系群の2つに分けられ
るが,形態による識別は困難であるといわれる。日本漁船が漁獲対象としてい
るのは,大部分が西部太平洋系群と考えられている。
0068デフォルトの名無しさん
2010/05/21(金) 08:58:20バラ売りの単位として
1.. 250cc
2.. 500cc
3.. 1L
そしてケース売りの単位として、
5.. 250ccが12個
6.. 1Lが12個
7.. 250ccが60個
を用意することになりました。この単位をProlog述語 '荷姿' として定義しなさい。
0069デフォルトの名無しさん
2010/05/24(月) 19:48:08生息域分類(_カツオ,_表層回遊魚) :- カツオ(_カツオ),表層回遊魚(_表層回遊魚).
分布(_カツオ,_南・北緯40°間) :- カツオ(_カツオ),南・北緯40°間(_南・北緯40°間).
環境(_カツオ,熱帯性) :- カツオ(_カツオ),生息環境(_カツオ,_環境),熱帯性(_環境).
環境(_カツオ,温帯性) :- カツオ(_カツオ),生息環境(_カツオ,_環境),温帯性(_環境).
系統(_カツオ,西部太平洋系) :- カツオ(_カツオ),特徴(_カツオ,_特徴),西部太平洋系(_カツオ,_特徴).
系統(_カツオ,中東部太平洋系) :- カツオ(_カツオ),特徴(_カツオ,_特徴),中東部太平洋系(_カツオ,_特徴).
識別困難(_系統1,_系統2) :-
カツオ(_カツオ1),特徴(_カツオ1,_特徴1),系統(_カツオ1,西部太平洋系群),
カツオ(_カツオ2),特徴(_カツオ2,_特徴2),系統(_カツオ2,中東部太平洋系群).
日本漁船の漁獲対象(_カツオ,西部太平洋群) :- カツオ(_カツオ),系統(_カツオ,西部太平洋系群).
0070デフォルトの名無しさん
2010/05/24(月) 21:31:06:- 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).
0071デフォルトの名無しさん
2010/05/25(火) 04:11:19誤差の大きい(正確でない)情報を積極的に利用すること。
Prologに限らないが、プログラミングの仕様のほとんどが著作権を侵害している
可能性を持っている。多くの事実としての情報が本、雑誌など過去の著作物に
由来するからだ。そこで、この問題を回避するひとつの方法は正確でない情報を
積極的に利用することが考えられる。2010年5月24日の日本経済新聞朝刊の一面に
「時価総額630兆円減」という記事がある。この中に描かれた世界の株式時価総額と
いうグラフから 述語 'MSCI世界株価指数' と 述語 時価総額 を定義しなさい。
このグラフには(注)として、このグラフの情報が国際取引連盟(WFE),MSCIのデータを
もとに作成したものであることが記されているが、ここではこの原データは得られ
ないものとする。
0072デフォルトの名無しさん
2010/05/25(火) 04:45:04ケース売り(_荷姿ID) :- 荷姿(_荷姿ID,_,_*_ cc),!.
ケース売り(_荷姿ID) :- 荷姿(_荷姿ID,_,_*_ 'L'),!.
バラ売り(_荷姿ID) :- 荷姿(_荷姿ID,_,_量 cc),number(_量),!.
バラ売り(_荷姿ID) :- 荷姿(_荷姿ID,_,_量 'L'),number(_量),!.
% 第三引数に複合項を持ってきたことの弊害が顕れている。
0073デフォルトの名無しさん
2010/05/25(火) 07:15:24文字列を解析して、拡大係数行列を得るProlog述語を定義しなさい。
ただし項は例えば、3 * (a ^ 2) は 3a2 のように表現されていることとする。
0074デフォルトの名無しさん
2010/05/25(火) 07:39:21>>61は>>55の仕様を十分に満たすものといえよう。しかし、>>59のヒントには、
さらに豊かな情報が含まれているが述語化する中で抜け落ちてしまっている。
この新人は大胆なストレート内傾ターンで途中転倒したにも拘らずすぐに起き上がりこのレースで
ワールドカップ初優勝を飾る。
の部分だ。このような核から外れているが実は貴重な情報をさりげなく
含ませる試みとして、>>61を書き直してください。
0075デフォルトの名無しさん
2010/05/25(火) 13:10:33時価総額('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,兆円).
0076デフォルトの名無しさん
2010/05/25(火) 13:12:03時価総額('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,兆ドル).
0077デフォルトの名無しさん
2010/05/25(火) 13:12:56時価総額('201001',47,兆ドル).
時価総額('201002',46,兆ドル).
時価総額('201003',49,兆ドル).
時価総額('201004',49,兆ドル).
時価総額('201005',44,兆ドル).
0078デフォルトの名無しさん
2010/05/25(火) 14:02:55日本経済新聞の紙面グラフから読み取った世界株式時価総額(_年月,_時価総額,_最大誤差,_単位) :-
情報の最大誤差(2,_単位),
時価総額(_年月,_時価総額,_単位).
情報の最大誤差(2,兆円).
0079デフォルトの名無しさん
2010/05/25(火) 14:04:35日本経済新聞の紙面グラフから読み取った世界株式時価総額(_年月,_時価総額,_最大誤差,_単位) :-
情報の最大誤差(_最大誤差,_単位),
時価総額(_年月,_時価総額,_単位).
情報の最大誤差(2,兆円).
0080デフォルトの名無しさん
2010/05/25(火) 15:54:18日本経済新聞の紙面グラフから読み取った世界株価指数(_年月,_世界株価指数,_最大誤差) :-
世界株価指数(_年月,_世界株価指数),
世界株価指数最大誤差(_最大誤差).
世界株価指数最大誤差(20).
日本経済新聞世界株価指数記事日付('20100524').
世界株価指数('200801',370).
世界株価指数('200803',360).
世界株価指数('200804',375).
世界株価指数('200805',385).
世界株価指数('200806',355).
世界株価指数('200807',340).
世界株価指数('200808',320).
世界株価指数('200809',300).
世界株価指数('200810',275).
世界株価指数('200811',225).
世界株価指数('200812',220).
0081デフォルトの名無しさん
2010/05/25(火) 15:55:29世界株価指数('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).
0082デフォルトの名無しさん
2010/05/27(木) 04:34:59いろんな言語で宿題 第四編@プログラム板
http://pc12.2ch.net/test/read.cgi/tech/1268003943/472
三目ならびの述語 勝ちパターン/1 のソースプログラムを生成する述語を定義しなさい。
0083デフォルトの名無しさん
2010/05/27(木) 04:37:13三目ならび -> 三目ならべ
0084デフォルトの名無しさん
2010/06/02(水) 12:08:10'1971年',バルディゼール,大回転,'エリック・ホーケル(ハーカー)',新人,初優勝,大胆な,ストレート内傾ターン,転倒,
起き上がる,ワールドカップ初優勝
このくらいの要素の組み合わせで単位節を構成すればいいのかな?
ここの一節が札幌オリンピックの二本目を暗示してるのだとしたら、それはどう表現するのだろう。
0085デフォルトの名無しさん
2010/06/04(金) 09:28:52与えられた文字列に含まれる整数を表す副文字列の中で最長のものを取り出しなさい。
0086デフォルトの名無しさん
2010/06/04(金) 09:31:17与えられた文字列に含まれる数値文字列で1.0-49.0(整数であってもよい)の
範囲の数値文字列を取り出しなさい。
0087デフォルトの名無しさん
2010/06/04(金) 18:40:14% 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,_副文字列).
0088デフォルトの名無しさん
2010/06/05(土) 12:54:39% 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).
0089デフォルトの名無しさん
2010/06/05(土) 17:58:44% Prolog
蛾(ごまだらきこけが,ひとりが科).
開帳(ごまだらきこけが,成虫,'23~32mm').
色(ごまだらきこけが,成虫,体と翅,赤味がかった黄色).
斑点(ごまだらきこけが,成虫,体と翅,前翅,'15個').
分布(ごまだらきこけが,本邦広くアジアにひろがっている).
食性(ごまだらきこけが,幼虫,コケ類).
長い毛(ごまだらきこけが,幼虫).
青い点(ごまだらきこけが,幼虫,背中に2列).
色(ごまだらきこけが,幼虫,灰色).
0090デフォルトの名無しさん
2010/06/05(土) 19:41:39% Prolog
(_ごまだらきこけが,ひとりが科) :- ごまだらきこけが(_ごまだらきこけが).
開帳(_ごまだらきこけが,成虫,'23~32mm') :- ごまだらきこけが(_ごまだらきこけが).
色(_ごまだらきこけが,成虫,体と翅,赤味がかった黄色) :- ごまだらきこけが(_ごまだらきこけが).
斑点(_ごまだらきこけが,成虫,体と翅,前翅,'15個') :- ごまだらきこけが(_ごまだらきこけが).
分布(_ごまだらきこけが,本邦広くアジアにひろがっている) :- ごまだらきこけが(_ごまだらきこけが).
食性(_ごまだらきこけが,幼虫,コケ類) :- ごまだらきこけが(_ごまだらきこけが).
長い毛(_ごまだらきこけが,幼虫) :- ごまだらきこけが(_ごまだらきこけが).
青い点(_ごまだらきこけが,幼虫,背中に2列) :- ごまだらきこけが(_ごまだらきこけが).
色(_ごまだらきこけが,幼虫,灰色) :- ごまだらきこけが(_ごまだらきこけが).
0091デフォルトの名無しさん
2010/06/05(土) 19:44:04% Prolog 書き直し
蛾(_ごまだらきこけが,ひとりが科) :- ごまだらきこけが(_ごまだらきこけが).
開帳(_ごまだらきこけが,成虫,'23~32mm') :- ごまだらきこけが(_ごまだらきこけが).
色(_ごまだらきこけが,成虫,体と翅,赤味がかった黄色) :- ごまだらきこけが(_ごまだらきこけが).
斑点(_ごまだらきこけが,成虫,体と翅,前翅,'15個') :- ごまだらきこけが(_ごまだらきこけが).
分布(_ごまだらきこけが,本邦広くアジアにひろがっている) :- ごまだらきこけが(_ごまだらきこけが).
食性(_ごまだらきこけが,幼虫,コケ類) :- ごまだらきこけが(_ごまだらきこけが).
長い毛(_ごまだらきこけが,幼虫) :- ごまだらきこけが(_ごまだらきこけが).
青い点(_ごまだらきこけが,幼虫,背中に2列) :- ごまだらきこけが(_ごまだらきこけが).
色(_ごまだらきこけが,幼虫,灰色) :- ごまだらきこけが(_ごまだらきこけが).
0092デフォルトの名無しさん
2010/06/05(土) 19:49:08あるものの幼虫はコケ類を食べる。そういうあるもののひとつは、ごまだらきこけがだ。
と読めばよいと思う。
0093デフォルトの名無しさん
2010/06/05(土) 20:53:07>>89
同じ項構造で他の生物にも適用できるよう、項: 蛾/2 は以下の方が
命題として適切ではないかと考えます。
種(ごまだらきこけが, 蛾). % ごまだらきこけがの種は蛾である。
科(ごまだらきこけが, ひとりが). % ごまだらきこけがの科はひとりがである。
項: 色/2 と 色/3 で混在していますが、どちらかに統一すべきだと考えます。
色(ごまだらきこけが, 成虫の体と翅, 赤味がかった黄色).
色(ごまだらきこけが, 幼虫, 灰色).
または
色(ごまだらきこけが, 成虫, 体と翅, 赤味がかった黄色).
色(ごまだらきこけが, 幼虫, 全体, 灰色).
>>90
ごまだらきこけが以外の蛾も多数登録されているものとして、
食性について問い合わせる場合を考えます。
?- 食性(_蛾, _, コケ類) % コケ類を食べる蛾は何か?
_蛾=ごまだらきこけが
>>90では、変数 _蛾 がアトムにならず変数のままですから、この問い合わせには
回答できていません。従って、解答としては>>89のほうが適切ではないかと考えます。
009493
2010/06/05(土) 21:23:38>項: 色/3 と 色/4 で混在していますが、どちらかに統一すべきだと考えます。
>
> 色(ごまだらきこけが, 成虫の体と翅, 赤味がかった黄色). % 色/3 で統一
> 色(ごまだらきこけが, 幼虫, 灰色).
>
>または
>
> 色(ごまだらきこけが, 成虫, 体と翅, 赤味がかった黄色). % 色/4 で統一
> 色(ごまだらきこけが, 幼虫, 全体, 灰色).
0095デフォルトの名無しさん
2010/06/05(土) 22:14:49適切な批評をいただき感謝します。
色のアリティが二種類になっているのは好ましくないですね。
種、科については、可能な限り、仕様(ここでは問題文)の文面から
述語名や変数名を拾うことを旨としているので、出てきませんでした。
とはいえ、私も「食べる」を「食性」に置き換えたりしていますが、
言語、概念による補強は必要だし、そうすることで述語として「強く」
なることも事実ですね。
>>90については、途中で端折りますが、以下のようなら自然でしょうか。
ごまだらきこけが(_ごまだらきこけが) :-
色(_ごまだらきこけが,幼虫,全体,灰色),
色(_ごまだらきこけが,成虫,赤味がかった黄色).
色(ごまだらきこけが,幼虫,全体,灰色),
色(ごまだらきこけが,成虫,赤味がかった黄色).
食性(ごまだらきこけが,幼虫,コケ類).
009693
2010/06/05(土) 23:11:54>>>90については、途中で端折りますが、以下のようなら自然でしょうか。
いいえ、不自然です。この問題(仕様)はすべてファクト(事実)から構成されています。
出題者の意図(文脈)は知りませんが、単純なのにわざわざ複雑なルール(推論)を組み込むのは、
解答として適切であるとは思えません。
もし納得できないようでしたら、いったんPrologプログラミングから離れて
数学の命題論理(初等数理論理学の一部)を勉強されることをお勧めします。
0097デフォルトの名無しさん
2010/06/06(日) 13:11:460098デフォルトの名無しさん
2010/06/06(日) 16:58:56確かに。命題論理の勉強をします。カツオの定義など支離滅裂ですね。
私はPrologの核は単位節データベースであって、実際宿題スレでもデータベース板SQLの質問から
多数問題を採用してきました。一方、
このスレと「いろんな言語で宿題」スレに共通して、
親子(為義,義朝).
親子(義朝,頼朝).
先祖(A,B) :- 親子(A,B).
先祖(A,B) :- 親子(A,C),先祖(C,B).
という定義に於いて、先祖/2はルールなのに、親子/2はなぜ事実なの?親子もルールで
書いていくとどうなるの?という疑問に対して、何らかの答えだすという試みもして
きました。
よく分かっていないことは事実とせず、これからそれについてはルールが来るのだ、
今のところまだ未定義だけどね、というのが指摘いただいた箇所の意図であり、
奇妙な表現に拘る言い訳ということになります。
009993
2010/06/06(日) 21:12:22Prologの単位節は「関係の存在」というファクト(事実)を表現しています。
以下は源一族の家系の一部をファクトだけで表現した一例(の一部)です。
親_子(為義, 義朝). % 為義と義朝の間には親-子という関係が存在する。
先祖_子孫(為義, 頼朝). % 為義と義朝の間には先祖-子孫という関係が存在する。
家系が「ファクトだけで表現できる」のが分かるかと思います。
同様にごまだらきこけが(あるいは蛾という生物系)についてもファクトだけで表現できます。
ですから、単位節だけで表現できる課題(仕様)については、それだけで解答すべきであると考えます。
また、複数のファクトから新たな「関係の存在」を表現したのがルール(規則)です。
先祖_子孫(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における項「ごまだらきこけが(_)」について、
**** ごまだらきこけがは関係ではありません!! ****
ですから、これらの解答は明らかに不自然です。
010093
2010/06/07(月) 00:50:12> 先祖_子孫(A, B) :- 親_子(A, C), 先祖_子孫(C, B),.
> % ある人物AとBとCについて、AとCの間に親-子という関係が存在し、かつCとBの間に
> % 先祖-子孫という関係が存在するならば、AとBの間には先祖-子孫という関係が存在する。
0101デフォルトの名無しさん
2010/06/07(月) 08:46:50こんな定義ならどうなんだ。
確信度(_ごまだらきこけが,ごまだらきこけが,60) :-
色(_ごまだらきこけが,_,幼虫,全体,灰色),
色(_ごまだらきこけが,_,成虫,赤味がかった黄色),
食性(_ごまだらきこけが,_,幼虫,コケ類).
色(_,ごまだらきこけが,幼虫,全体,灰色),
色(_,ごまだらきこけが,成虫,赤味がかった黄色).
食性(_,ごまだらきこけが,幼虫,コケ類).
0102デフォルトの名無しさん
2010/06/07(月) 08:54:28それから、>>95 のごまだらきこけが は関係ではなく、クラスを表現しようとしているのではないかな。
010393
2010/06/07(月) 17:19:35>>98
>先祖/2はルールなのに、親子/2はなぜ事実なの?
>親子もルールで書いていくとどうなるの?という疑問に対して、
>何らかの答えだすという試みもしてきました。
「親-子」という関係は原始的な(これ以上は分解できない)ファクトだから、
ルールとして書くことは(私には)無理ですが、「親-子の関係」や「先祖-子孫の関係」という
関係そのものを扱えるファクト/ルールを書くことは可能です。たとえば
「AとBにはどんな関係があるか?(= AとBとの間に存在する関係は何か?)」という
問い合わせに答えることの可能な知識ベースです。
まず説明の前に、>>99では
ファクトとルールは、どちらも「関係の存在」を表現している
と書きました。それを以下のように訂正します。
ファクトとルールは、どちらも「エンティティ(物)の存在」あるいは
「エンティティ間にある関係の存在」を表現している
エンティティとは関係の対象となるオブジェクトを意味し、
たとえば「ごまだらきこけが」や「為義」を指します。
(長いので続く)
010493
2010/06/07(月) 17:21:16では、以降からは知識ベースの記述を始めます。まず基礎のファクトを書きます。
人物(為義). % 為義という人物が存在する。
人物(義朝). % 義朝という人物が存在する。
人物(頼朝). % 頼朝という人物が存在する。
ここで、「親-子」と「先祖-子孫」を(関係ではなく)エンティティとして認識した上で、
ファクトとして書いてみます。
関係(親_子). % 親-子という関係が存在する。
関係(先祖_子孫). % 先祖-子孫という関係が存在する。
関係(親_子, 為義, 義朝). % 為義と義朝の間には親-子という関係が存在する。
関係(親_子, 義朝, 頼朝). % 義朝と頼朝の間には親-子という関係が存在する。
これらファクトを前提にルールを書きます。
関係(先祖_子孫, 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の間にも先祖-子孫という関係が存在する。
(まだ続く)
010593
2010/06/07(月) 17:33:51以下は、SWI-Prologでの実行例です。
為義と義朝は親子か?
?- 関係(親_子, 為義, 義朝).
true . % はい。
為義の子は誰か?
?- 関係(親_子, 為義, X).
X = '義朝' ; % 義朝です。
false.
為義の子孫は誰か?
?- 関係(先祖_子孫, 為義, X).
X = '義朝' ;
X = '頼朝' ; % 義朝と頼朝です。
false.
為義と義朝にはどんな関係があるか?
?- 関係(R, 為義, 義朝).
R = '親_子' ;
R = '先祖_子孫' ; % 親-子と先祖-子孫という関係があります。
false.
為義と頼朝にはどんな関係があるか?
?- 関係(R, 義朝, 頼朝).
R = '先祖_子孫' ; % 先祖-子孫という関係があります。
false.
(まだ続く。次で終わり。)
010693
2010/06/07(月) 17:36:21すべての関係を挙げよ。
?- 関係(R, A, B).
R = '親_子',
A = '為義',
B = '義朝' ; % 為義と義朝の間に親-子という関係が存在する。
R = '親_子',
A = '義朝',
B = '頼朝' ; % 為義と頼朝の間に親-子という関係が存在する。
R = '先祖_子孫',
A = '為義',
B = '義朝' ; % 為義と頼朝の間に先祖-子孫という関係が存在する。
R = '先祖_子孫',
A = '義朝',
B = '頼朝' ; % 義朝と頼朝の間に先祖-子孫という関係が存在する。
R = '先祖_子孫',
A = '為義',
B = '頼朝' ; % 為義と頼朝の間に先祖-子孫という関係が存在する。
false.
(これで終わり。長レス失礼。)
010793
2010/06/07(月) 18:08:39では、オブジェクト指向(あるいはフレーム理論やオントロジーのような)知識を一般化する
枠組み(フレームワーク)を>>103-106で書いた知識ベースに導入してみます。
オブジェクト(昆虫). % 昆虫はオブジェクトである。
オブジェクト(蛾). % 蛾はオブジェクトである。
オブジェクト(ごまだらきこけが). % ごまだらきこけがはオブジェクトである。
関係(スーパークラス_サブクラス, 昆虫, 蛾). % 蛾は昆虫のサブクラスである。
関係(クラス_インスタンス, 蛾, ごまだらきこけが). % ごまだらきこけがは蛾のインスタンスである。
オブジェクト指向という枠組みの導入によって、これまで「....が存在する」と解釈していたのを、
「....である」という解釈に進化させたことに注目してください。
オブジェクト指向におけるクラスという概念は「スーパークラス-サブクラス」および
「クラス-インスタンス」という関係で表現できます。これらはそれぞれ「is-a関係(またはkind-of関係)」と
「instance-of関係」と呼ばれることもあり、知識表現レベルではどちらも関係の特別なケース(クラス)です。
以上のように、(源氏の)家系や(蛾の)体系といった比較的単純な知識表現であれば、明解な解答が得られます。
不自然な解釈や小賢しい技法(テクニック)は必要ありません。命題論理と一階述語論理の守備範囲です。
0108デフォルトの名無しさん
2010/06/18(金) 07:09:51その後、第五編を立てることができません。
15日の夜以降、追加または変更があったものについては、以下のアーカイブを参照してください。
http://nojiriko.asia/prolog/c136_844.html
http://nojiriko.asia/prolog/c136_847.html
http://nojiriko.asia/prolog/c136_863.html
http://nojiriko.asia/prolog/c136_874.html
http://nojiriko.asia/prolog/c136_880_1.html
http://nojiriko.asia/prolog/c136_880_2.html
http://nojiriko.asia/prolog/c136_880_3.html
http://nojiriko.asia/prolog/c136_880_4.html
http://nojiriko.asia/prolog/c136_892.html
http://nojiriko.asia/prolog/c136_899_1.html
http://nojiriko.asia/prolog/c136_899_2.html
http://nojiriko.asia/prolog/c136_904.html
http://nojiriko.asia/prolog/c136_918.html
http://nojiriko.asia/prolog/j69_157.html
http://nojiriko.asia/prolog/sql10_154.html
http://nojiriko.asia/prolog/sql9_944.html
ファイル名で問題の出所はわかると思います。
0109デフォルトの名無しさん
2010/06/18(金) 07:48:11http://ime.nu/nojiriko.asia/prolog/c136_899_1.html
http://ime.nu/nojiriko.asia/prolog/c136_899_2.html
は未回答でした
0110デフォルトの名無しさん
2010/06/25(金) 10:54:49「不意に辿り着いてしまった」と感じる検索事例を定義しなさい。
0111デフォルトの名無しさん
2010/08/15(日) 05:25:560112デフォルトの名無しさん
2010/09/19(日) 15:24:45このスレのテーマのひとつに全く考えずにプログラミングをしていったら
どうなるか?というのがあります。ここらあたりの流れはこのテーマに
沿っています。自然言語による表現に内在する論理性が、プログラミングを
導くことはないのか、ということです。
0113デフォルトの名無しさん
2010/10/04(月) 07:13:40n要素後の値を取り出しなさい。
0114デフォルトの名無しさん
2010/10/04(月) 21:56:24'リストのある要素を検索して、そのn要素後の値を取り出す'(_対象リスト,_検索要素,_n要素後,_値) :-
append(_,[_検索要素|R],_対象リスト),
list_nth(_n要素後,R,_値).
0115デフォルトの名無しさん
2010/10/04(月) 22:25:410116デフォルトの名無しさん
2010/10/05(火) 08:08:18リストのある要素を検索して、そのm要素前の値を取り出す(_対象リスト,_検索要素,_m要素前,_値) :-
append(L0,[_検索要素|_],_対象リスト),
length(L2,_m要素前),
L2 = [_値|_],
append(_,L2,L0).
0117デフォルトの名無しさん
2010/10/15(金) 13:05:270118デフォルトの名無しさん
2010/10/17(日) 18:06:37次の日記の一節をPrologプログラムして定義しなさい。
十一月十五日 午后三時より海軍と合同中支那派遣軍編成以来の陣没者の慰霊祭を
漢口華商競馬場に催す。及川長官も亦上海より飛来す。
0119デフォルトの名無しさん
2010/10/17(日) 18:28:430120デフォルトの名無しさん
2010/10/18(月) 08:20:36上記日記の出典が何か、インターネット上から検索して、推定するプログラムを書きなさい。
推定が外れても仕方ありません。
0121sage
2010/10/18(月) 21:13:56全社員が売上を記録した日を求めよ。 これをPrologプログラムとして表現しなさい。
0122デフォルトの名無しさん
2010/10/19(火) 10:10:21Prologしなさい。
0123デフォルトの名無しさん
2010/10/19(火) 10:26:30全社員が売上を記録した日を求めよ(_日) :-
count(社員(_社員),_社員人数),
findsetof(_日,売上(_社員,_日,_データ),L1),
append(_,[_日|R],L1),
findsetof(_社員,社員(_社員,_日,_データ),L2),
length(L2,_社員人数).
0124デフォルトの名無しさん
2010/10/19(火) 10:39:26SQUAREによる表現が載っている。
URIAGE ( SYAIN )
HIZUKE S# S#
0125デフォルトの名無しさん
2010/10/19(火) 19:47:33リストX, Y とZ を繋いだ結果をリストWに格納するプログラムtriple append(X,Y,Z,W) を作
りなさい。
0126デフォルトの名無しさん
2010/10/19(火) 19:59:06triple_append([],Y,Z,W) :- append(Y,Z,W).
triple_append([A|X],Y,Z,[A|W]) :- triple_append(X,Y,Z,W).
0127デフォルトの名無しさん
2010/10/19(火) 21:01:01x とy 両方ともリストL の要素の場合だけYes を返すプログラムを書きなさい。
0128デフォルトの名無しさん
2010/10/20(水) 02:31:53'x とy 両方ともリストL の要素の場合だけYes を返す'(_x,_y,L) :-
append(_,[_x|_],L),
append(_,[_y|_],L).
0129デフォルトの名無しさん
2010/10/20(水) 13:52:04x とy のいずれかがリストL の要素の場合にYes を返すプログラムを書きなさい。
0130デフォルトの名無しさん
2010/10/20(水) 14:11:35'x とy のいずれかがリストL の要素の場合にYes を返す'(_x,_,L) :-
append(_,[_x|_],L).
'x とy のいずれかがリストL の要素の場合にYes を返す'(_,_y,L) :-
append(_,[_y|_],L).
0131デフォルトの名無しさん
2010/10/20(水) 14:17:54リストA の要素が全てリストB の要素の場合だけYes を返すプログラムを書きなさい。
0132デフォルトの名無しさん
2010/10/20(水) 14:25:52append(_x,_y,L) の後に!を入れるか
迷うところ。素直に題意をくみとるならば、
カットを入れた方がいいだろう。
以下のような実行では具合の悪いことが起きる。
?- 'x とy のいずれかがリストL の要素の場合にYes を返す'(4,3,[1,2,4,4,3]),write(a),fail.
aaa
no.
Yesも返らないw
0133デフォルトの名無しさん
2010/10/20(水) 14:33:29すみません。まちがえた。
append(_,[_x|_],L),
append(_,[_y]_],L), の後にカットを
入れるか迷うところ。 でした。
0134デフォルトの名無しさん
2010/10/20(水) 15:38:08'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').
0135デフォルトの名無しさん
2010/10/20(水) 19:13:02'リスト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),!.
0136デフォルトの名無しさん
2010/10/20(水) 19:47:30'リスト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),!.
0137デフォルトの名無しさん
2010/10/20(水) 19:52:25count(P,Count) :- findall(_,P,L),length(L,Count).
0138デフォルトの名無しさん
2010/10/22(金) 12:52:50左横書き文書を右縦書き文書に変換してください。
0139デフォルトの名無しさん
2010/10/22(金) 13:44:23% 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).
0140デフォルトの名無しさん
2010/10/26(火) 19:41:26A,B,Cの3人が100m競争をします。D,Eの2人が予想をしました。
D : 「きっと1等はCで2等はBだ」
E : 「ぼくは1等はAだと思う」
発表された順位を見て,2人はどちらも「まったくはずれた。」と
いいました。発表された順位はどうでしたか。
中学受験用全解シリーズ 「受験全解・算数」日能研発行 の p424 から採りました。
0141デフォルトの名無しさん
2010/10/27(水) 07:06:082.A
3.C
1.B
2.C
3.A
0142デフォルトの名無しさん
2010/10/27(水) 09:05:23受験参考書の解答(p696)は B,A,C だけでした。ということは、
http://nojiriko.asia/prolog/prolog_140.html
かな、と。
0143デフォルトの名無しさん
2010/10/27(水) 09:28:01「まったく」が現れることに備えて節を付加した感じで
なんか変ですね。
0144デフォルトの名無しさん
2010/10/27(水) 09:33:16正の整数n の階乗の再帰式
n! = 1 (when n = 0)
n! = n*(n-1)! (when n > 0)
を利用したプログラムfactorial(N,Value) を書きなさい。
0145デフォルトの名無しさん
2010/10/27(水) 09:41:41Aが一等と考えている時点でA>Cと予想している訳で
それが外れたんであればC>Aでないとおかしい
よって
1. B
2. C
3. A
0146デフォルトの名無しさん
2010/10/27(水) 10:44:180147デフォルトの名無しさん
2010/10/27(水) 22:15:42% 推論ルール
推論 :-
競技結果(_結果情報),
write(_結果情報), nl,
fail.
推論.
競技結果(_結果情報) :-
順位(A), 順位(B), 順位(C),
A ¥= B, A ¥= C, B ¥= C,
_結果情報 = [ a = A, b = B, c = C],
制約(_結果情報).
% 推論ファクト
順位(1).
順位(2).
順位(3).
(続く)
0148147
2010/10/27(水) 22:17:59% ユーザ記述ルール
制約(_結果情報) :- 辞書検索(_結果情報, 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.
0149147
2010/10/27(水) 22:34:13(誤り)
>% 入力: 辞書, キー
>% 出力: 値
>% 説明: 辞書に一致するキーが存在すれば値を返す。存在しなければ失敗する。
>% 辞書のデータ構造は「キー = 値」を要素とするリストである。
(正しい)
>% 入力: 辞書, キー, 値
>% 説明: 辞書に一致する要素が存在すれば成功し、存在しなければ失敗する。
>% 辞書のデータ構造は「キー = 値」を要素とするリストである。
0150142
2010/10/27(水) 23:24:32http://nojiriko.asia/prolog/prolog_140.html
0151147
2010/10/27(水) 23:35:23これを「xまたはy」と解釈するよう変更してみた。
% ユーザ記述ルール
制約(_結果情報) :- 辞書検索(_結果情報, c, 1), !, fail.
制約(_結果情報) :- 辞書検索(_結果情報, b, 2), !, fail.
制約(_結果情報) :- 辞書検索(_結果情報, a, 1), !, fail.
制約(_).
(実行結果)
- 推論.
[a=2, b=1, c=3]
[a=3, b=1, c=2]
true.
そもそもの出題(の仕様記述)が曖昧なのが混乱の原因だよね。
だから昔からテストって大ーーーーー嫌いなんだ。
0153147
2010/10/28(木) 00:39:48・>>145の指摘に従い、予測条件を狭めた(制約を強くした)。
・述語「制約/1」を「予測/1」へ変更(否定->肯定)することで、ユーザ記述ルールの表現をより自然なものとした。
・出題に合わせて、述語「競技結果/1」を「発表順位/1」に、変数「_結果情報」を「_順位情報」に変更。
・出題に合わせて、出力形式を(「競技者=順位」から)「順位=競技者」へ変更。
発表順位(_順位情報) :-
競技者(X), 競技者(Y), 競技者(Z),
X ¥= Y, X ¥= Z, Y ¥= Z,
_順位情報 = [1 = X, 2 = Y, 3 = Z],
制約(_順位情報).
制約(_順位情報) :- ¥+(予測(_順位情報)).
% 推論ファクト
競技者(a).
競技者(b).
競技者(c).
(続く)
0154147
2010/10/28(木) 00:50:30% ユーザ記述ルール
% 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.
0155147
2010/10/28(木) 01:09:25この課題(>>140)ですが、Prologの持つ一階述語論理を基礎とした推論の限界が見え隠れしていますね。
解決方法は以下の技術導入でしょうか?
・多値論理 --> 「当たり(真)/外れ(偽)」から「当たり/やや外れ/まったく外れ(多値)」への拡張
・非単調推論 --> 不完全な情報を前提にした推論への拡張(>>145の指摘を自動化)
0156デフォルトの名無しさん
2010/10/29(金) 11:12:08http://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]).
を導く述語を定義しなさい
0157デフォルトの名無しさん
2010/10/29(金) 11:32:01printf('%-9s %-012d %-012d %-012d\n',[A,B,C,D]). でしたね。
四項目の12dの前の0が落ちていました。
0158デフォルトの名無しさん
2010/10/29(金) 19:15:00ノートを7冊ずつ配ると28冊余り,10冊ずつ配ると最後の一人にわたすノートは
他の半分にも達しませんでした。ノートの数と人数を求めなさい。 <開成中受験問題>
0159デフォルトの名無しさん
2010/11/02(火) 09:13:57ゼロでない整数x のn 乗xn の再帰式
x^n = 1 (when n = 0)
x^n = x * x^(n-1) (when n > 0)
を利用したプログラムを書きなさい。
0160デフォルトの名無しさん
2010/11/04(木) 16:09:54http://nojiriko.asia/prolog/prolog_159.html
0161デフォルトの名無しさん
2010/11/05(金) 15:25:51http://nojiriko.asia/prolog/prolog_158.html
算数的な解法は後に。
0162デフォルトの名無しさん
2010/11/07(日) 18:55:03「DNS & BIND クックブック ネームサーバ管理者のためのレシピ集」Cricket Liu 著 伊藤高一監訳 田淵貴昭
訳 オライリー・ジャパン発行 オーム社発売 2003年4月 のp75から採りました。
<問題>
ネームサーバが特定の応答を一定の順序で返すように設定したい。
cyclic
これがデフォルトで、ラウンドロビンといわれることもある。レコードが返される順序は応答の
度に循環され、前回の応答で最初に返されたレコードは、その次の応答では最後に移動される。
fixed
レコードをいつも同じ順番で返答する。
random
レコードをランダムな順番で返答する。
上記の仕様を満たすように述語を定義しなさい。
0163デフォルトの名無しさん
2010/11/08(月) 06:37:06'ノートを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.
0164z
2010/11/11(木) 17:03:33定 義:身長h(cm),体重w(Kg)とすると
w < (h-95)*0.82 やせすぎ(SLIM)
w > (h-95)*1.10 ふとりすぎ(FAT)
その中間 正常(NORMAL)
0165デフォルトの名無しさん
2010/11/12(金) 09:15:20身長h(cm),体重w(Kg) のh,w,cm,Kg をどうプログラムに反映するか悩みます。
0166デフォルトの名無しさん
2010/11/12(金) 09:22:59:- op(250,xf,'Kg').
体型を判定する(_h cm,_w 'Kg','やせすぎ(SLIM)') :-
_w < (_h-95) * 0.82,!.
というような定義は可能ですが、引数にリスト以外の複合項がくるのが気に入らない。
0167デフォルトの名無しさん
2010/11/13(土) 10:43:10% こういう定義の仕方を最近は好んでいます。
% 身長を読み込む/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,!.
0168デフォルトの名無しさん
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番目の規則が成立す
るか否かが決まる。
0169デフォルトの名無しさん
2010/11/16(火) 10:48:59どんなスポーツをするか(テニス) :- テニスをする,!.
どんなスポーツをするか(卓球) :- 卓球をする,!.
どんなスポーツをするか(なにもしない) :- なにもしない.
テニスをする :- テニスができる.
卓球をする :- \+(天気 が 晴れ),卓球ができる.
なにもしない :-\+(テニスをする),\+(卓球をする).
テニスができる :-
'天気が晴れの場合は, テニスコードが空いているならテニスができる。'.
'天気が晴れの場合は, テニスコードが空いているならテニスができる。' :-
天気 が 晴れ,
テニスコード が 空いている.
卓球ができる :- 卓球室 が あいている.
% 例えば以下のような定義を書く。
天気 が 晴れ.
テニスコード が 空いている.
卓球室 が あいている.
0170デフォルトの名無しさん
2010/11/16(火) 10:51:02どんなスポーツをするか(テニス) :- テニスをする,!.
どんなスポーツをするか(卓球) :- 卓球をする,!.
どんなスポーツをするか(なにもしない) :- なにもしない.
テニスをする :- テニスができる.
卓球をする :- \+(天気 が 晴れ),卓球ができる.
なにもしない :-\+(テニスをする),\+(卓球をする).
テニスができる :-
'天気が晴れの場合は, テニスコードが空いているならテニスができる。'.
'天気が晴れの場合は, テニスコードが空いているならテニスができる。' :-
天気 が 晴れ,
テニスコード が 空いている.
卓球ができる :- 卓球室 が あいている.
% 例えば以下のような定義を書く。
天気 が 晴れ.
テニスコード が 空いている.
卓球室 が あいている.
0171デフォルトの名無しさん
2010/11/16(火) 11:05:04一応これで合っているか。
0172デフォルトの名無しさん
2010/11/17(水) 04:44:42日本生産性本部発行 1974年 p440
<問題>
フラン社の推測によれば,もしある専用機械を原価$9,000で購入すれば,つぎの
5か年での年間の現金支出をともなう操業費を,毎年$2,500節約することができる.
存存価額は,等差級数法によって減価償却費を計算する場合には税金計算上ゼロであ
るが,$1,000であると期待される.税引後の希望最低投資利益率は10%であり,所得
税率は経常所得にたいして40%である.割引キャッシュ・フロー法を用いてこの投資
が望ましいものであるか否か示せ.
0173デフォルトの名無しさん
2010/11/17(水) 04:49:57が望ましいものであるか否か示せ. -->
が望ましいものであるか否かを示せ.
0174デフォルトの名無しさん
2010/11/17(水) 04:55:16超難問を見つけた 「管理会計」C.T.ホーングレン著 小倉栄一郎・加藤勝康 共著
日本生産性本部発行 1974年 p440より
<問題>
フラン社の推測によれば,もしある専用機械を原価$9,000で購入すれば,つぎの
5か年での年間の現金支出をともなう操業費を,毎年$2,500節約することができる.
残存価額は,等差級数法によって減価償却費を計算する場合には税金計算上ゼロであ
るが,$1,000であると期待される.税引後の希望最低投資利益率は10%であり,所得
税率は経常所得にたいして40%である.割引キャッシュ・フロー法を用いてこの投資
が望ましいものであるか否かを示せ.
0175デフォルトの名無しさん
2010/11/17(水) 14:18:520176デフォルトの名無しさん
2010/11/17(水) 14:27:46公民権法案の時代だから高かったなんてことないかな。
0177デフォルトの名無しさん
2010/11/19(金) 09:18:40ポーカーの役、ストレートとフラッシュについての問題です。
どちらの役が出現し難いかを示すPrologプログラムを書きなさい。
0178デフォルトの名無しさん
2010/11/22(月) 17:01:47生まれて始めての Prologプログラムと思って頑張ってみたけど
フラッシュの数え上げしかできないよう
何だよストレートの組み合わせ44通りって・・・しっかりしろ俺
0179デフォルトの名無しさん
2010/11/23(火) 09:56:33http://hibari.2ch.net/test/read.cgi/tech/1289913298/302
# [1] 授業単元:プログラミングC言語
# [2] 問題文:診断メーカー風のプログラムを作成しなさい。
# 名前を入力し、その名前に基づき何かしらの情報を出力。
# .txtファイルを読み込み出力できるものにする事。
# (オプション)日替わりで表示結果を変更。複数の組み合わせなど。
#
0180デフォルトの名無しさん
2010/12/01(水) 10:39:01not(P) :- P, !, fail.
not(P).
のnot(P) を利用しプログラムnot_and(A1,A2) を書きなさい。但しnot_and(A1,A2) は
A1,A2 ともに成立する場合だけ成立しない。以下にこのプログラムの実行結果を示す.
0181デフォルトの名無しさん
2010/12/02(木) 11:06:42not_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.
0182デフォルトの名無しさん
2010/12/02(木) 11:09:01こういう指定だったか。
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.
0183デフォルトの名無しさん
2010/12/11(土) 10:57:08慶応元年以降の和暦西暦変換述語を
書きなさい。
0184デフォルトの名無しさん
2010/12/11(土) 18:40:298Queensを解け
0185デフォルトの名無しさん
2010/12/14(火) 01:36:47http://hibari.2ch.net/test/read.cgi/tech/1286791669/539
# ../test/read.cgi/tech/1286791669/536
# prologでtwitterクローン作ったらどうなるの?
#
# どれだけ便利な言語なのか推し量るには実際のプログラムを見ないことには判断できない
#
# twitterクローンもしくは簡単なwikiでもいいわ
0186デフォルトの名無しさん
2011/01/04(火) 15:38:54path(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
0187デフォルトの名無しさん
2011/01/07(金) 05:40:47バックトラックが起きた時の表示の工夫をしないならば、
path(V,V) :- write('->'),write(V),nl.
path(V,U) :- link(V,W),write(V),write('->'),path(W,U).
だけでいいと思う。
0188デフォルトの名無しさん
2011/01/07(金) 09:00:50http://nojiriko.asia/prolog/prolog_183.html
0189デフォルトの名無しさん
2011/01/07(金) 10:45:32誰が書いても同じようなコードになりそうな気がするが、
本当にそうであるか、主要なProlog書籍に載っている
8クィーンのソースコードを比較するサイトを準備中。
0190デフォルトの名無しさん
2011/01/07(金) 12:20:17「楽しいプログラミングII 記号の世界」 中島秀之/上田和紀著
岩波書店 1992年 http://www.amazon.co.jp/dp/4000077554/
これを写し取って解説を加えるだけで、結構大仕事。
ぜひ一読を勧めます。
0191デフォルトの名無しさん
2011/01/13(木) 13:19:37これいい本なんだよね。ほとんど知られていないのが残念。
0192デフォルトの名無しさん
2011/01/27(木) 21:09:43選手の成績順のリストと、一位からの入賞賞金のリストがあります。一位から
順に賞金を賦与するのですが、入賞者の中で同順位があった場合はその順位の
賞金と一つ下位の賞金の合計を両者で分け合います。さらに多くの同順位者が
いた場合は、同様に下位の賞金を合計していって、同順位者で分け合います。
下位の入賞者が多数いて入賞者数を超えてしまったら、該当する全員を入賞扱い
として一番下位の賞金を分け合うこととします。
このような3引数の述語 入賞賞金賦与を定義しなさい。
0193デフォルトの名無しさん
2011/02/17(木) 13:44:04作り方の定義の部分を同時進行を示すことができるように改めてください。
レシピ(ペペロンチーノ,材料,'塩,コショウ',6 人前,適量).
レシピ(ペペロンチーノ,材料,'オリーブ油',6 人前,200 cc).
レシピ(ペペロンチーノ,材料,'にんにく(つぶしたもの)',6 人前,3-4 片).
レシピ(ペペロンチーノ,材料,'赤とうがらし',6 人前,1 個).
レシピ(ペペロンチーノ,材料,'パセリのみじん切り',6 人前,2-3 枚 分).
レシピ(ペペロンチーノ,作り方,1,'にんにくを細かく刻む').
レシピ(ペペロンチーノ,作り方,2,'スパゲッティをやわらかくなるまでゆでる').
レシピ(ペペロンチーノ,作り方,3,'刻んだにんにくと赤とうがらしをオリーブ油で十分に炒める').
レシピ(ペペロンチーノ,作り方,4,'ゆで上がったスパゲッティの水気を切り、深いさらに入れる').
レシピ(ペペロンチーノ,作り方,5,'にんにくを炒めた鍋からオリーブ油を直接皿に注ぐ').
レシピ(ペペロンチーノ,作り方,6,'黒コショウを振りかけてよく混ぜる').
0194193
2011/02/17(木) 15:15:35:- op(600,xf,cc).
:- op(600,xf,片).
:- op(600,xf,枚分).
:- op(600,xf,個).
これを先頭に置く必要がありますね。
0195デフォルトの名無しさん
2011/02/18(金) 06:36:27http://nojiriko.asia/prolog/prolog_192.html
0196デフォルトの名無しさん
2011/02/18(金) 07:17:37>>193 の定義のうち、
レシピ(ペペロンチーノ,作り方,2,'スパゲッティをやわらかくなるまでゆでる').
'スパゲッティをやわらかくなるまでゆでる'を述語として
定義しなさい。将来調理ロボットがこの定義に従い、
料理することになるとして。
0197デフォルトの名無しさん
2011/03/04(金) 18:36:00.34リストからランダムにひとつずつ情報を取り出します。
ただし、一度取り出した情報は引かないこととします。
このような非決定性の述語を定義してください。
第一引数にリスト、第二引数に何番目の要素を引いたか、第三引数に取り出した要素,
最後の第四引数に取り出された要素以外の要素ならびを持つものとします。
0198デフォルトの名無しさん
2011/03/05(土) 07:42:24.95要素ならび -> 要素リスト です
0199デフォルトの名無しさん
2011/03/05(土) 08:07:48.64ある4けたの整数を9倍したとき,やはり4けたの
整数で各位の数字の順序が逆になるといいます。
このとき,始めの整数の十の位の数字は何ですか。
0200デフォルトの名無しさん
2011/03/05(土) 08:49:12.361089
0201デフォルトの名無しさん
2011/03/05(土) 09:12:43.22算数的な解法?
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である。
0202デフォルトの名無しさん
2011/03/07(月) 20:07:39.26'ある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.
0203デフォルトの名無しさん
2011/03/07(月) 20:22:26.24>>199 の問題に対し、出来る限り>>201の考え方に
沿った述語定義によって解を示す、Prologプログラムを
書きなさい。
0204デフォルトの名無しさん
2011/03/09(水) 11:14:07.62足引之 山河之瀬之 響苗尓 弓月高 雲立渡
万葉集の第七巻(1088)に出てくる柿本人麻呂の歌です。
日めくり万葉集というテレビ番組でガンダムの安彦良和さんが
興味深いコメントをされていて、題材にしたくなりました。
さて、この歌の出来る限り詳しい解説をPrologの述語として
定義してください。
0205デフォルトの名無しさん
2011/03/26(土) 12:21:06.56例えば、ここはどう定義すればよいのだろうか。
2) 最初のけたと9を掛けた最後のけたは同じ数字だから最後のけたは9である
0206デフォルトの名無しさん
2011/03/26(土) 12:28:36.89繰り上がりが生じると、4桁を維持できなくなる。
したがって繰り上がりは生じない。すなわち9である。
という論理の表現。
0207デフォルトの名無しさん
2011/05/25(水) 02:24:56.80簡単で申し訳ないが助けてくれm(_ _)m
0208デフォルトの名無しさん
2011/05/25(水) 05:53:24.47http://nojiriko.asia/prolog/prolog_207.html
0209デフォルトの名無しさん
2011/05/25(水) 14:50:06.37助かります。
0210デフォルトの名無しさん
2011/07/15(金) 17:19:45.63パイプオルガンの響きが立ち昇っていくような歌だね。
0211デフォルトの名無しさん
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(_,[],[]).
0213デフォルトの名無しさん
2011/07/21(木) 06:16:09.94弓月嶽は、伊勢に遷るまで天皇の神が祀られていた
三輪山のとなりの山で、天照大神がここに降り立ったと
少なくとも安彦さんは解釈しているようだ。
そのことを知っていた人麻呂が神々しさを感じて、この歌を
詠んだ。
0214デフォルトの名無しさん
2011/07/21(木) 06:26:33.56>>213のような領域の述語定義となると、やはり大変。
足引之はあしひきのと読み山に掛かる枕詞である :-
枕詞(足引之),
訓み(足引之,あしひきの).
掛かり(足引之,山).
0215デフォルトの名無しさん
2011/07/29(金) 21:43:15.27?- shuffle([a,b,c], X).
X = [b,a,c];
false
0216デフォルトの名無しさん
2011/07/30(土) 05:05:44.82% 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,_カードの束).
0217216
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,_カードの束).
0218デフォルトの名無しさん
2011/07/30(土) 05:52:18.51% 一回ずつ非決定性述語仕様で切っていくには、
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,_切られたカードの束).
0219デフォルトの名無しさん
2011/07/30(土) 06:01:16.05実際の動作に近く、好ましくみえるのだが、これを使って
しかも、何回切るかという指定をするとなると大変むずかしい。
大域変数や一時述語を作って、assert/retractを繰り返さない限り、
不可能。
>>216 のように引数に切る回数を入れるように拡張する
必要がある。すなわち、この述語のなかにforを組み込む。
0221215
2011/07/30(土) 10:25:20.82ありがとうございます。
私は組み込み述語のselectを使って作ってみました。
% SWI-Prolog
shuffle([], []) :- !.
shuffle(_入力リスト, _出力リスト) :-
length(_入力リスト, _リスト長),
_選択位置 is random(_リスト長),
nth0(_選択位置, _入力リスト, _選択要素),
select(_選択要素, _入力リスト, _残りリスト),
shuffle(_残りリスト, _出力リスト1),
_出力リスト = [_選択要素 | _出力リスト1].
0222215
2011/07/30(土) 10:40:31.85並び換えるという意味で使いました。
すみません。説明不足でした。
0223215
2011/07/30(土) 10:42:10.29○単純にリストの要素をランダムに並び換える
0224デフォルトの名無しさん
2011/08/01(月) 08:18:45.05一番自然なコードは
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,!.
0225デフォルトの名無しさん
2011/08/01(月) 08:30:07.23この強烈な差異が、Prologの面白さでもあり、弱点でもあるのでしょう。
0226デフォルトの名無しさん
2011/08/01(月) 22:46:06.81?- split([1,0,2,3,0,4,0,0,5], 0, X).
X = [[1],[2,3],[4],[],[5]]
0227デフォルトの名無しさん
2011/08/01(月) 23:35:58.03split([],_,[]) :- !.
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).
0229デフォルトの名無しさん
2011/08/02(火) 00:19:04.36split(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),!.
0230デフォルトの名無しさん
2011/08/02(火) 00:28:15.46ごめんなさい。>>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).
0231デフォルトの名無しさん
2011/08/02(火) 00:33:39.57これもありそう。
split(L1,_区切り文字,[L0|R2]) :-
split_4(L1,_区切り文字,L0,R),
split(R,_区切り文字,R2).
split(L1,_区切り文字,[L1]).
split_4(L1,_区切り文字,L0,R) :-
append(L0,[_区切り文字|R],L1),!.
0232226
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]), !.
0233226
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]]).
0234デフォルトの名無しさん
2011/08/02(火) 00:57:12.26そうですね。それがいい。
0235デフォルトの名無しさん
2011/08/02(火) 09:48:45.44非決定性述語をもうひとつ。速度効率無視。
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).
0236デフォルトの名無しさん
2011/08/03(水) 12:33:35.25shuffle(_カードの束,_切られたカードの束) :- 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,_カードの束),!.
0237デフォルトの名無しさん
2011/08/04(木) 09:14:38.92shuffle(_カードの束,_切られたカードの束) :-
length(_カードの束,_カードの枚数),
_カードの枚数 > 2,
M is _カードの枚数 // 12 + 3,
_乱数値 is random(M),
length(L0,_乱数値),
append(L0,L1,_カードの束),
shuffle(L1,_カードの束_2),
append(_カードの束_2,L0,_切られたカードの束),!.
shuffle(_カードの束,_カードの束).
0238デフォルトの名無しさん
2011/08/04(木) 09:23:19.35トランプの場合は >>236 と >>237 の組合せで切ってると思う。
0239デフォルトの名無しさん
2011/08/05(金) 08:30:19.87#
# これにヒントを得て、
#
# 述語 「猫は回さない」 を定義せよ。
#
0240デフォルトの名無しさん
2011/10/07(金) 07:36:05.65ttp://rainyday.blog.so-net.ne.jp/2008-06-16
ただし参考例は返値しか推定できないので
返値から逆に関数の引数の型なども推定できるようにせよ
0241デフォルトの名無しさん
2011/10/08(土) 13:02:12.04>>>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で型推定が一番楽にできそう
>しかし返値しか推定してないね
0242デフォルトの名無しさん
2011/12/16(金) 00:41:29.75|_::;; ~"'ヽ
| //^''ヽ,,)
| i⌒"
| ∀`) < 誰もいない きのこるならいまのうち
|⊂
| ノ
_,,,......,,__
/_~ ,,...:::_::;; ~"'ヽ
(,, '"ヾヽ i|i //^''ヽ,,)
^ :'⌒i i⌒"
|( ´∀`) < きのこ のこーのこ げんきのこ ♪
|(ノ |つ
| |
⊂ _ ノ
""U
_,,,......,,__
/_~ ,,...:::_::;; ~"'ヽ
(,, '"ヾヽ i|i //^''ヽ,,)
^ :'⌒i i⌒"
(´∀` )| < エリンギ まいたけ ブナシメジ ♪
⊂| (ノ |
| |
ヽ _ ⊃
.U""
|
| ミ
| ミ サッ!
| ミ
|
0243デフォルトの名無しさん
2012/05/25(金) 08:00:45.01などは如何なものでしょうか?
0244デフォルトの名無しさん
2012/06/29(金) 16:45:14.54'リストの要素として、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,_残りのリスト).
0245デフォルトの名無しさん
2012/06/29(金) 16:54:54.11'リストの要素が変数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,_残りリスト).
■ このスレッドは過去ログ倉庫に格納されています