このディレクトリの索引

% 以下のサイトは # 出典:: C/C++の宿題片付けます 127代目 #413 # # 演習 # 今日は友引の火曜日である。今日からN日後までに仏滅ではない日曜日が何日あるか求めるプログラムを作成せよ。 # 六曜:先勝,友引,先負,仏滅,大安,赤口 '日付の六曜・曜日を得る'(_8桁の日付文字列,_六曜,_曜日) :- '日付から整数の年・月・日を得る'(_8桁の日付文字列,_年,_月,_日), '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日を答えよ'(_年,_月,_日,_六曜,_曜日),!. '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日を答えよ'(_年,_月,_日,_六曜,_曜日) :- '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日'(2015,10,15,大安,木曜,_年,_月,_日,_六曜,_曜日). '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日'(_年,_月,_日,_六曜,_曜日,_年,_月,_日,_六曜,_曜日). '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年,_月,_日,_六曜,_曜日) :- '2015年10月15日以後の_年、_月、_日の六曜と曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年,_月,_日,_六曜,_曜日). '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年,_月,_日,_六曜,_曜日) :- '2015年10月15日より前の_年、_月、_日の六曜と曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年,_月,_日,_六曜,_曜日). '2015年10月15日以後の_年、_月、_日の六曜と曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年,_月,_日,_六曜,_曜日) :- [_年_1,_月_1,_日_1] @>= [2015,10,15], '翌日の六曜、曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年_2,_月_2,_日_2,_六曜_2,_曜日_2), '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日'(_年_2,_月_2,_日_2,_六曜_2,_曜日_2,_年,_月,_日,_六曜,_曜日). '2015年10月15日より前の_年、_月、_日の六曜と曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年,_月,_日,_六曜,_曜日) :- [_年_1,_月_1,_日_1] @< [2015,10,15], '翌日の六曜、曜日'(_年_2,_月_2,_日_2,_六曜_2,_曜日_2,_年_1,_月_1,_日_1,_六曜_1,_曜日_1), '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日'(_年_2,_月_2,_日_2,_六曜_2,_曜日_2,_年,_月,_日,_六曜,_曜日). '翌日の六曜、曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年_2,_月_2,_日_2,_六曜_2,_曜日_2) :- 翌日(_年_1,_月_1,_日_1,_年_2,_月_2,_日_2), 六曜連鎖(_六曜_1,_六曜_2), 曜日連鎖(_曜日_1,_曜日_2). '前日の六曜、曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年_2,_月_2,_日_2,_六曜_2,_曜日_2) :- 翌日(_年_2,_月_2,_日_2,_年_1,_月_1,_日_1), 六曜連鎖(_六曜_2,_六曜_1), 曜日連鎖(_曜日_2,_曜日_1). 六曜連鎖(先勝,友引). 六曜連鎖(友引,先負). 六曜連鎖(先負,仏滅). 六曜連鎖(仏滅,大安). 六曜連鎖(大安,赤口). 六曜連鎖(赤口,先勝). 曜日連鎖(月曜,火曜). 曜日連鎖(火曜,水曜). 曜日連鎖(水曜,木曜). 曜日連鎖(木曜,金曜). 曜日連鎖(金曜,土曜). 曜日連鎖(土曜,日曜). 曜日連鎖(日曜,月曜). 翌日(_年,12,31,_翌年の年,1,1) :- succ(_年,_翌年の年),!. 翌日(_年,2,29,_年,3,1) :- うるう年(_年),!. 翌日(_年,2,28,_年,3,1) :- \+(うるう年(_年)),!. 翌日(_年,_月,30,_年,_翌日の月,1) :- member(_月,[4,6,9,11]), succ(_月,_翌日の月),!. 翌日(_年,_月,31,_年,_翌日の月,1) :- member(_月,[1,3,5,7,8,10,12]), succ(_月,_翌日の月),!. 翌日(_年,_月,_日,_年,_月,_翌日の日) :- succ(_日,_翌日の日). うるう年(_うるう年) :- 0 is _うるう年 mod 400,!. うるう年(_うるう年) :- 0 is _うるう年 mod 100,!,fail. うるう年(_うるう年) :- 0 is _うるう年 mod 4. '日付から整数の年・月・日を得る'(_日付,_年,_月,_日) :- 日付から整数年を得る(_日付,_年), 日付から整数月を得る(_日付,_月), 日付から整数日を得る(_日付,_日). 日付から整数年を得る(_日付,_整数年) :- sub_atom(_日付,0,4,_,_年文字列), atom_number(_年文字列,_整数月). 日付から整数月を得る(_日付,_整数月) :- sub_atom(_日付,4,2,_,_月文字列), atom_number(_月文字列,_整数月). 日付から整数日を得る(_日付,_整数日) :- sub_atom(_日付,6,2,_,_日文字列), atom_number(_日文字列,_整数日). % 以下のサイトは # 出典:: C/C++の宿題片付けます 127代目 #413 # # 演習 # 今日は友引の火曜日である。今日からN日後までに仏滅ではない日曜日が何日あるか求めるプログラムを作成せよ。 # 六曜:先勝,友引,先負,仏滅,大安,赤口 六曜連鎖(先勝,友引). 六曜連鎖(友引,先負). 六曜連鎖(先負,仏滅). 六曜連鎖(仏滅,大安). 六曜連鎖(大安,赤口). 六曜連鎖(赤口,先勝). 曜日連鎖(月曜,火曜). 曜日連鎖(火曜,水曜). 曜日連鎖(水曜,木曜). 曜日連鎖(木曜,金曜). 曜日連鎖(金曜,土曜). 曜日連鎖(土曜,日曜). 曜日連鎖(日曜,月曜). '日付の六曜・曜日を得る'(_日付,_六曜,_曜日) :- '日付から整数の年・月・日を得る'(_日付,_年,_月,_日), '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日を答えよ'(_年,_月,_日,_六曜,_曜日). '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日を答えよ'(_年,_月,_日,_六曜,_曜日) :- '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日'(2015,10,15,大安,木曜,_年,_月,_日,_六曜,_曜日),!. '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日'(_年,_月,_日,_六曜,_曜日,_年,_月,_日,_六曜,_曜日) :- !. '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年,_月,_日,_六曜,_曜日) :- '2015年10月15日以後の_年、_月、_日の六曜と曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年,_月,_日,_六曜,_曜日). '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年,_月,_日,_六曜,_曜日) :- '2015年10月15日より前の_年、_月、_日の六曜と曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年,_月,_日,_六曜,_曜日). '2015年10月15日以後の_年、_月、_日の六曜と曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年,_月,_日,_六曜,_曜日) :- [_年_1,_月_1,_日_1] @>= [2015,10,15], '翌日の六曜、曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年_2,_月_2,_日_2,_六曜_2,_曜日_2), '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日'(_年_2,_月_2,_日_2,_六曜_2,_曜日_2,_年,_月,_日,_六曜,_曜日). '2015年10月15日より前の_年、_月、_日の六曜と曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年,_月,_日,_六曜,_曜日) :- [_年_1,_月_1,_日_1] @< [2015,10,15], '翌日の六曜、曜日'(_年_2,_月_2,_日_2,_六曜_2,_曜日_2,_年_1,_月_1,_日_1,_六曜_1,_曜日_1), '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日'(_年_2,_月_2,_日_2,_六曜_2,_曜日_2,_年,_月,_日,_六曜,_曜日). '翌日の六曜、曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年_2,_月_2,_日_2,_六曜_2,_曜日_2) :- 翌日(_年_1,_月_1,_日_1,_年_2,_月_2,_日_2), 六曜連鎖(_六曜_1,_六曜_2), 曜日連鎖(_曜日_1,_曜日_2). '前日の六曜、曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年_2,_月_2,_日_2,_六曜_2,_曜日_2) :- 翌日(_年_2,_月_2,_日_2,_年_1,_月_1,_日_1), 六曜連鎖(_六曜_2,_六曜_1), 曜日連鎖(_曜日_2,_曜日_1). 翌日(_年,12,31,_翌年の年,1,1) :- succ(_年,_翌年の年),!. 翌日(_年,2,29,_年,3,1) :- うるう年(_年),!. 翌日(_年,2,28,_年,3,1) :- \+(うるう年(_年)),!. 翌日(_年,_月,30,_年,_翌日の月,1) :- member(_月,[4,6,9,11]), succ(_月,_翌日の月),!. 翌日(_年,_月,31,_年,_翌日の月,1) :- member(_月,[1,3,5,7,8,10,12]), succ(_月,_翌日の月),!. 翌日(_年,_月,_日,_年,_月,_翌日の日) :- succ(_日,_翌日の日). うるう年(_うるう年) :- 0 is _うるう年 mod 400,!. うるう年(_うるう年) :- 0 is _うるう年 mod 100,!,fail. うるう年(_うるう年) :- 0 is _うるう年 mod 4. '日付から整数の年・月・日を得る'(_日付,_年,_月,_日) :- 日付から整数年を得る(_日付,_年), 日付から整数月を得る(_日付,_月), 日付から整数日を得る(_日付,_日). 日付から整数年を得る(_日付,_整数年) :- sub_atom(_日付,0,4,_,_年文字列), atom_number(_年文字列,_整数月). 日付から整数月を得る(_日付,_整数月) :- sub_atom(_日付,4,2,_,_月文字列), atom_number(_月文字列,_整数月). 日付から整数日を得る(_日付,_整数日) :- sub_atom(_日付,6,2,_,_日文字列), atom_number(_日文字列,_整数日). % 以下のサイトは '2012年はうるう年である'. %%%%%%%%%%%%%%%%%%%%%%%%%%%%% うるう年(2012). % 以下のサイトは '2012年はうるう年である' :- うるう年(2012). うるう年(_年) :- うるう年とは4で割り切れる年の中で例外となる年を除いたものである(_年). うるう年とは4で割り切れる年の中で例外となる年を除いたものである(_年) :- うるう年とは4で割り切れる年の中で(_年), 例外となる年を除いたものである(_年). うるう年とは4で割り切れる年の中で(_年) :- 0 is _年 mod 4. 例外となる年を除いたものである(_年) :- \+(例外となる年(_年)). 例外となる年(_年) :- 0 is _年 mod 100, \+(0 is _年 mod 400). % 以下のサイトは '2012年はうるう年である' :- '2012年は4で割り切れる年の中でうるう年の例外となる年を除いたものにあたる'. '2012年は4で割り切れる年の中でうるう年の例外となる年を除いたものにあたる' :- '2012年は4で割り切れ', '2012年はうるう年の例外となる年ではない'. '2012年は4で割り切れ' :- 0 is 2012 mod 4. '2012年はうるう年の例外となる年ではない' :- \+('2012年はうるう年の例外となる年'). '2012年はうるう年の例外となる年' :- 0 is 2012 mod 100, \+(0 is 2012 mod 400). % 以下のサイトは '2012年はうるう年である'(2012) :- '2012年は4で割り切れる年の中でうるう年の例外となる年を除いたものにあたる'(2012). '2012年は4で割り切れる年の中でうるう年の例外となる年を除いたものにあたる'(2012) :- '2012年は4で割り切れ'(2012), '2012年はうるう年の例外となる年ではない'(2012). '2012年は4で割り切れ'(2012) :- 0 is 2012 mod 4. '2012年はうるう年の例外となる年ではない'(2012) :- \+('2012年はうるう年の例外となる年'(2012)). '2012年はうるう年の例外となる年'(2012) :- 0 is 2012 mod 100, \+(0 is 2012 mod 400). % 以下のサイトは うるう年(_年) :- うるう年とは4で割り切れる年の中で例外となる年を除いたものである(_年). うるう年とは4で割り切れる年の中で例外となる年を除いたものである(_年) :- うるう年とは4で割り切れる年の中で(_年), 例外となる年を除いたものである(_年). うるう年とは4で割り切れる年の中で(_年) :- 0 is _年 mod 4. 例外となる年を除いたものである(_年) :- \+(例外となる年(_年)). 例外となる年(_年) :- 0 is _年 mod 100, \+(0 is _年 mod 400). % 以下のサイトは % [1] 授業単元:C言語演習課題 % http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9422.txt % 問題 % 年と月を「YYYY/MM」と入力し、入力された月のカレンダーを表示しなさい。 % % 1752年10月以前、及び10000年1月以降はエラーを返す。 % % 出力形式は以下のとおり % ・1行目は該当月の1日が月曜日でなければ、前月の最終月曜日から表示。 % ・該当月の最終日が日曜日でなければ、翌月の第1日曜日まで表示。 % ・6行目の表示が必要ない場合は表示しない。 % % うるう年判定は以下のとおり % ・年が4で割り切れる年はうるう年。 % ・年が100で割り切れる年はうるう年でない。 % ・年が400で割り切れる年はうるう年である。 % % [出力例] % 年月日を入力:2009/07 % % 月 火 水 木 金 土 日 % 29 30 01 02 03 04 05 % 06 07 08 09 10 11 12 % 13 14 15 16 17 18 19 % 20 21 22 23 24 25 26 % 27 28 29 30 31 01 02 課題のカレンダー(_年/_月) :- not((_年/_月 >= 1752/10,_年/_月 =< 10000/1)), write('エラー: 入力された年月は範囲を逸脱しています\n'),!. 課題のカレンダー(_年/_月) :- _年/_月 @=< 2009/6,!, 曜日検索(_日付,_曜日,2009/6/13,土曜), _日付=_年/_月/1, 課題のカレンダー表示(_日付,_曜日). 課題のカレンダー(_年/_月) :- _年/_月 @>= 2009/6,!, 曜日検索(2009/6/13,土曜,_日付,_曜日), _日付=_年/_月/1, 課題のカレンダー表示(_日付,_曜日). 課題のカレンダー表示(_年/_月/_日,月曜) :- 日付候補を得る(_年/_月/_日,_年/_月/_日,月曜,_日付整数ならび), 課題のカレンダー見出し表示, 課題のカレンダー週表示(_日付整数ならび). 課題のカレンダー表示(_年/_月/_日,_曜日) :- not(_曜日=月曜), 前週の月曜日(_年/_月/_日,_曜日,_前週の月曜日), 日付候補を得る(_年/_月/_日,_前週の月曜日,月曜,_日付整数ならび), 課題のカレンダー見出し表示, 課題のカレンダー週表示(_日付整数ならび). 前週の月曜日(_年/_月/_日,_曜日,_前週の月曜日) :- 曜日検索(_前週の月曜日,_前週の曜日,_年/_月/_日,_曜日), _前週の曜日 = 月曜,!. 日付候補を得る(_年/_月/_日,_起点日付,_曜日,_日付整数ならび) :- findall(_日付,( 曜日(_起点日付,_曜日,_日付2,_),(_日付2=_年2/_月2/7,_年2/_月2 @> _年/_月,!,fail;true)),_日付整数ならび). 課題のカレンダー週表示(_日付整数ならび) :- n個組(7,_日付整数ならび,_7個組), 月曜から日曜までヘッドゼロサプライで表示(_7個組). 月曜から日曜までヘッドゼロサプライで表示([_年/_月/_日]) :- ヘッドゼロサプライ(2,_日,_日付文字列), write_formatted('%t\n',[_日文字列]),!. 月曜から日曜までヘッドゼロサプライで表示([_年/_月/_日|R]) :- ヘッドゼロサプライ(2,_日,_日付文字列), write_formatted('%t ',[_日付文字列]), 月曜から日曜までヘッドゼロサプライで表示(R). 課題のカレンダー見出し表示 :- write_formatted('月 火 水 木 金 土 日\n'). 曜日検索(_日付,_曜日,_今日,_今日の曜日) :- var(_日付), var(_曜日), 前日・今日(_日付,_曜日,_今日,_今日の曜日). 曜日検索(_日付,_曜日,_今日,_今日の曜日) :- var(_日付), var(_曜日), 前日・今日(_前日,_前日の曜日,_今日,_今日の曜日), 曜日検索(_日付,_曜日,_前日,_前日の曜日). 曜日検索(_今日,_今日の曜日,_日付,_曜日) :- var(_日付), var(_曜日), 前日・今日(_今日,_今日の曜日,_日付,_曜日). 曜日検索(_今日,_今日の曜日,_日付,_曜日) :- var(_日付), var(_曜日), 前日・今日(_今日,_今日の曜日,_翌日,_翌日の曜日), 曜日検索(_翌日,_翌日の曜日,_日付,_曜日). '曜日'(_日付,_曜日,_日付,_曜日) :- ! . '曜日'(_日付1,_曜日1,_日付2,_曜日2) :- _日付1 @> _日付2, '前日・今日'(_日付3,_曜日3,_日付1,_曜日1), '曜日'(_日付3,_曜日3,_日付2,_曜日2) . '曜日'(_日付1,_曜日1,_日付2,_曜日2) :- _日付1 @< _日付2, '前日・今日'(_日付1,_曜日1,_日付3,_曜日3), '曜日'(_日付3,_曜日3,_日付2,_曜日2) . 前日・今日(_前日の年/12/31,_前日の曜日,_年/1/1,_曜日) :- 一つ違い(_前日の年,_年), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/2/29,_前日の曜日,_年/3/1,_曜日) :- うるう年(_年), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/2/28,_前日の曜日,_年/3/1,_曜日) :- not(うるう年(_年)), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_前月/30,_前日の曜日,_年/_月/1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[4,6,9,11]), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_前月/31,_前日の曜日,_年/_月/1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[1,3,5,7,8,10,12]), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_月/_前日,_前日の曜日,_年/_月/_日,_曜日) :- 一つ違い(_前日,_日), 曜日連鎖(_前日の曜日,_曜日),!. 一つ違い(M,N) :- integer(M),!, N is M + 1. 一つ違い(M,N) :- integer(N),!, M is N - 1. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- not(0 is _年 mod 4),fail. 曜日連鎖(月曜,火曜). 曜日連鎖(火曜,水曜). 曜日連鎖(水曜,木曜). 曜日連鎖(木曜,金曜). 曜日連鎖(金曜,土曜). 曜日連鎖(土曜,日曜). 曜日連鎖(日曜,月曜). n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. ヘッドゼロサプライ(N桁,_整数,_ヘッドゼロ整数文字列) :- number_chars(_整数,_数字ならび), ヘッドゼロサプライ_1(N桁,_数字ならび,_ヘッドゼロ整数文字ならび), concat_atom(_ヘッドゼロ整数文字ならび,_ヘッドゼロ整数文字列),!. ヘッドゼロサプライ_1(N桁,L,L) :- length(L,N桁),!. ヘッドゼロサプライ_1(N桁,L,['0'|R]) :- M桁 is N桁 - 1, ヘッドゼロサプライ_1(M桁,L,R). # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1200175247/550 # # [1] 授業単元: Ruby演習 [2] 問題文、http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9426.txt # Rubyの問題がわかりません 助けてください # # (1)曜日を表す英語と日本語との対応を表すハッシュwdayを定義しなさい # # p wday["sunday"] #=> "日曜日" # p wday["monday"] #=> "月曜日" # p wday["saturday"] #=> "土曜日" # # (2)ハッシュのメソッドを使って(1)のハッシュwdayのペアの数を数えなさい # # (3)eachメソッドと(1)のハッシュwdayを使って以下の文字列を出力させてくださ い。 # 「sunday」は日曜日のことです。 # 「monday」は月曜日のことです。 # # (4)ハッシュには配列の%wのようなものがありません。そこで、空白とタブと改行(正 規表現で定義するなら「/\uff3cs+/」)で区切られた文字列をハッシュに変換するメソ ッドstr2hashを定義してください。 # # p str2hash("bule 青 white 白\uff3cnred赤"); # #=> {"bule"=>"青", "white"=>"白", "red"=>"赤"} :- op(450,xfx,(=>)). % (1) wday({ "sunday" => "日曜日","monday" => "月曜日","saturday" #=> "土曜日"}). % (2) hash_count(Hashname,Count) :- functor(P,Hashname,1), call(P), arg(1,P,H), count(H,Count). count(','(A,B),Count) :- count(B,Count2), Count is Count2 + 1. count(A,1). % (3) ?- each(wday.A=>B),write_formatted('「%t」は%tのことです。\n',[A,B]),fail;true. each(Hashname.Key=>Value) :- functor(P,Hashname,1), arg(1,P,V), each(V,Key=>Value). each(','(Key=>Value,B),Key=>Value). each(','(_,B),Key=>Value) :- each(B,Key=>Value). each(Key=>Value,Key=>Value). % (4) str2hash(Atom,Hash) :- split(Atom,[' ','\t','\n'],L), findall(U,n個組(2,L,U),L2), hashを成長させる(L2,Hash). hashを成長させる([A,B],{ A=>B }) :- !. hashを成長させる([[A,B]|R], { (A=>B,R2) }) :- hashを成長させる(R,{ R2 }). n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/103 # # 【質問テンプレ】 # [1] 授業単元: C言語演習 # [2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9753.txt # 2.入力された年月の1日が何曜日かを調べる。 #   曜日のチェックはZellerの公式を使用する。Zellerの公式は、 #    #   曜日を表す値=(y + [ y / 4 ] - [ y / 100 ] + [ y / 400 ] + [ (( 13 * m ) + 8 ) / 5 ] + d ) % 7 # #           ※ 上記の公式中の y は年、 m は月、 d は日を表し、 #             []はその数を越えない最大の整数を表す。(例: [13.6]は13になる) # #   で、曜日を表す値は次のようになっている。 # #     日曜日 = 0, 月曜日 = 1, 火曜日 = 2, 水曜日 = 3, # # 木曜日 = 4, 金曜日 = 5, 土曜日 = 6, # #   ※但し、1月と2月は前年の13月14月として計算するものとする。 % (1) 年月の入力 年月入力処理(_年,_月) :- 年入力処理(_年), 月入力処理(_月). % (2) 曜日計算 :- op(450,xfx,が),op(500,xfx,であり),op(600,xfx,ならば),op(450,xfx,は). 'Zellerの公式'(年 が Y であり 月 が M であり 日 が D ならば 曜日を表す値 は (Y + Y // 4 - Y // 100 + Y // 400 + ((( 13 * M ) + 8 ) // 5 ) + D ) mod 7). 曜日計算処理(_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日). 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を表す値を得る'(_年,_月,_日,_曜日を表す値), 曜日を表す値(_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を表す値を得る'(_年,1,_日,_曜日を表す値) :- _前年 is _年 - 1, 'Zellerの公式を用いて曜日を表す値を得る'(_前年,13,_日,_曜日を表す値),!. 'Zellerの公式を用いて曜日を表す値を得る'(_年,2,_日,_曜日を表す値) :- _前年 is _年 - 1, 'Zellerの公式を用いて曜日を表す値を得る'(_前年,14,_日,_曜日を表す値),!. 'Zellerの公式を用いて曜日を表す値を得る'(_年,_月,_日,_曜日を表す値) :- _年=Y,_月=M,_日=D, 'Zellerの公式'(年 が Y であり 月 が M であり 日 が D ならば 曜日を表す値 は _Zellerの公式), _曜日を表す値 is _Zellerの公式,!. 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). % (3) カレンダー表示 カレンダー表示 :- 年月入力処理(_年,_月), 'Zellerの公式を用いて曜日を表す値を得る'(_年,_月,1,_曜日を表す整数値), カレンダー表示データ編集(_年,_月,_曜日を表す整数値,_カレンダー表示文字列ならび), 要素に空白を挿入して全行表示(_カレンダー表示文字列ならび). カレンダー表示データ編集(_年,_月,_各月1日の曜日を表す整数値,_カレンダー表示文字列ならび) :- 年月文字列編集処理(_年,_月,_年月文字列), 月日数(_年,_月,_月日数), findall(S,for(1,N,_月日数),ヘッドゼロサプレス(2,N,S)),_表示日ならび), Length is _月日数 + _各月1日の曜日を表す整数値, M is (7 - (Length mod 7)), '7個組ならび'(Length,M,_表示日ならび,_7個組ならび), 見出しならび(_年月文字列,_見出しならび), append(_見出しならび,_7個組ならび,_カレンダー表示文字列ならび). 見出しならび(_年月文字列,[[_年月文字列],[日,月,火,水,木,金,土]]). '7個組ならび'(Length,0,_表示日ならび,_7個組ならび) :- length(L0,Length), すべての要素が(L0,' '), append(L0,_表示日ならび,L), '7個組'(L,_7個組ならび),!. '7個組ならび'(Length,M,_表示日ならび,_7個組ならび) :- not(M=0), length(L0,Length), すべての要素が(L0,' '), length(L2,M), すべての要素が(L2,' '), append(L0,_表示日ならび,L2,L), '7個組'(L,_7個組ならび),!. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- not(0 is _年 mod 4),fail. 月日数(_年,2,29) :- うるう年(_年),!. 月日数(_年,2,28) :- not(うるう年(_年)),!. 月日数(_,_月,30) :- member(_月,[4,6,9,11]). 月日数(_,_月,31) :- member(_月,[1,3,5,7,8,10,12]). % (4) 基礎述語の定義 年入力処理(_年) :- write('表示したいカレンダーは西暦何年 ? '), get_line(_行), 年入力処理の二(_行,_年), 年入力検査(_年),!. 年入力処理(_年) :- 年入力処理(_年). 年入力処理の二(_行,_年) :- atom_to_term(_行,_年), integer(_年),!. 年入力処理の二(_行,_年) :- write_formatted('この入力[ %t ]は整数ではありません\n',[_行]), fail. 年入力検査(_年) :- _年 >= 1583, _年 =< 3999,!. 年入力検査(_年) :- write_formatted('この年を表す整数%tは不正です\n',[_年]), fail. 月入力処理(_月) :- write('月は ? '), get_line(_行), 月入力処理の二(_行,_月), 月入力検査(_月),!. 月入力処理(_月) :- 月入力処理(_月). 月入力処理の二(_行,_月) :- atom_to_term(_行,_月,_), integer(_月),!. 月入力処理の二(_行,_月) :- write_formatted('この入力[ %t ]は整数ではありません\n',[_行]), fail. 月入力検査(_月) :- _月 >= 1, _月 =< 12,!. 月入力検査(_月) :- write_formatted('この月を表す整数%tは不正です\n',[_月]), fail. 日付文字列編集処理(_年,_月,_日,_日付文字列) :- ヘッドゼロサプライ(2,_年,_年文字列), ヘッドゼロサプライ(2,_月,_月文字列), ヘッドゼロサプライ(2,_日,_日文字列), concat_atom([_年文字列,_月文字列,_日文字列],_日付文字列). 年月文字列編集処理(_年,_月,_年月文字列) :- ヘッドゼロサプライ(2,_年,_年文字列), ヘッドゼロサプライ(2,_月,_月文字列), concat_atom([_年文字列,_月文字列],_年月文字列). ヘッドゼロサプライ(N桁,_整数,_ヘッドゼロ整数文字列) :- number_chars(_整数,_数字ならび), ヘッドゼロサプライ_1(N桁,_数字ならび,_ヘッドゼロ整数文字ならび), concat_atom(_ヘッドゼロ整数文字ならび,_ヘッドゼロ整数文字列),!. ヘッドゼロサプライ_1(N桁,L,L) :- length(L,N桁),!. ヘッドゼロサプライ_1(N桁,L,['0'|R]) :- M桁 is N桁 - 1, ヘッドゼロサプライ_1(M桁,L,R). ヘッドゼロサプレス(N桁,_整数,_ヘッド空白整数文字列) :- number_chars(_整数,_数字ならび), ヘッドゼロサプレス_1(N桁,_数字ならび,_ヘッド空白整数文字ならび), concat_atom(_ヘッド空白整数文字ならび,_ヘッド空白整数文字列),!. ヘッドゼロサプレス_1(N桁,L,L) :- length(L,N桁),!. ヘッドゼロサプレス_1(N桁,L,[' '|R]) :- M桁 is N桁 - 1, ヘッドゼロサプレス_1(M桁,L,R). 要素に空白を挿入して全行表示([]) :- !. 要素に空白を挿入して全行表示([L|R]) :- concat_atom(L,' ',_表示行), write_formatted('%t\n',[_表示行]), 要素に空白を挿入して全行表示(R). すべての要素が([],_). すべての要素が([V|R],V) :- すべての要素が(R,V). '7個組'([],[]) :- !. '7個組'([A,B,C,D,E,F,G|R1]),[[A,B,C,D,E,F,G]|R2]) :- '7個組'(R1,R2). n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. not(P) :- \+(P). append([],L1,L2,L) :- append(L1,L2,L) . append([A|R1],L1,L2,[A|R]) :- append(R1,L1,L2,R) . concat_atom([],'') :- !. concat_atom([A],A) :- !. concat_atom([A|R],S) :- concat_atom(R,S1), atom_concat(A,S1,S). concat_atom([],_,'') :- !. concat_atom([A],_,A) :- !. concat_atom([A|R],_区切り文字列,S) :- concat_atom(R,_区切り文字列,S1), atom_concat(A,_区切り文字列,S2), atom_concat(S2,S1,S). # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/157 # # [1] 授業単元: C++ # [2] 問題文(含コード&リンク): # http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9762.txt # # 正数による正方行列のうち、全ての行、列、斜め列の合計が同じであり、 # かつ2回以上使用される数字が存在しないものを魔方陣という。 # 下図に示すa,bに数値を設定したときに、1〜9の整数によって構成される魔方陣を # 出力するプログラムを作成せよ。 # 但し、魔方陣が作成不可能な(a,b)の組み合わせが設定された場合は、「Impossible」 # と出力するとする。 # # la_lb_l__l # l__l__l__l # l__l__l__l # 魔方陣(N枡,A,B,_行列) :- 魔方陣のための行列の生成(N枡,_行列), _行列 = [[A,B|_],_,_], 行の合計が全て一致する(_行列,S), 列の合計が全て一致する(_行列,S), 正方行列の斜め要素の合計が一致する(_行列,S). 魔方陣のための行列の生成(N枡,_行列) :- N2 is N枡 ^ 2, findall(M,for(1,M,N2),NL),!, 順列(NL,N2,_順列数字ならび), findall(_N個組,n個組(N枡,_順列数字ならび,_N個組),_行列). 行の合計が全て一致する([],S) :- !. 行の合計が全て一致する([_行|R],S) :- 魔方陣の加算(_行,0,S), 行の合計が全て一致する(R,S). 列の合計が全て一致する(_行列,S) :- 行列の転置(_行列,_転置行列), 列の合計が全て一致する(_転置行列,S),!. 正方行列の斜め要素の合計が一致する(_正方行列,S) :- length(_行列,Len), 左上から右下方向の合計(1,Len,_正方行列,0,S), 右上から左下方向の合計(1,Len,_正方行列,0,S),!. 左上から右下方向の合計(M,N,_,S,S) :- M > N,!. 左上から右下方向の合計(M,N,_行列,S1,S) :- list_nth(M,_行列,_行), list_nth(M,_行,_要素), S2 is _要素 + S1, M2 is M + 1, 左上から右下方向の合計(M2,N,_行列,S2,S),!. 右上から左下方向の合計(M,N,_,S,S) :- M > N,!. 右上から左下方向の合計(M,N,_行列,S1,S) :- M1 is N - M + 1, list_nth(M1,_行列,_行), list_nth(M1,_行,_要素), S2 is _要素 + S1, M2 is M + 1, 右上から左下方向の合計(M2,N,_行列,S2,S),!. n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. 魔方陣の加算([],X,X) :- !. 魔方陣の加算([A|R],Y,X) :- Z is A + Y, 魔方陣の加算(R,Z,X). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/566 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 番号と点数を配列に初期化して、それらを # 5段階にランク付けをして、受験番号・ランクを表示するプログラムを作成。 # ランク付けをする部分を関数Rankとして、番号と評価を表示する部分を関数Outputとすること。 # なお、ランクの評価は0〜19点をE、20〜39点をD、40〜59点をC、 # 60〜79点をB、80〜100点をAとする。 # ただし、受験者の数は、50人以下とする。 # 番号と点数は、以下の配列を使用すること。 # 番号 int no[NUMBER]={1,2,3,4,5,6,7,8,9,10}; # 点数 int tensu[NUMBER]={45,21,60,81,70,99,0,10,20,100}; # '問題文の5段階にランク付け'('ランクの評価は0〜19点をE、20〜39点をD、40〜59点をC、 60〜79点をB、80〜100点をAとする。 '). 番号の定義文('番号 int no[NUMBER]={1,2,3,4,5,6,7,8,9,10};'). 点数の定義文('点数 int tensu[NUMBER]={45,21,60,81,70,99,0,10,20,100};'). 'ランクならびの生成'(_ランクならび) :- '問題文の5段階にランク付け'(_ランク定義文), ランクの定義文解析(_ランク定義文,_ランクならび). 番号ならびの生成(_番号ならび) :- 番号の定義文(_番号の定義文), 番号の定義文解析(_番号の定義文,_番号ならび). 点数ならびの生成(_点数ならび) :- 点数の定義文(_点数の定義文), 点数の定義文解析(_点数の定義文,_点数ならび). '5段階にランク付けをして、受験番号・ランクを表示する' :- ランクならびの生成(_ランクならび), 番号ならびの生成(_番号ならび), 点数ならびの生成(_点数ならび), '5段階にランク付けをして、受験番号・ランクを表示する'(_番号ならび,_点数ならび,_ランクならび). '5段階にランク付けをして、受験番号・ランクを表示する'([],[],_). '5段階にランク付けをして、受験番号・ランクを表示する'([_番号|R1],[_点数|R2],_ランクならび) :- append(_,[[_点数下限,_点数上限,_ランク]|_],_ランクならび), _点数 >= _点数下限, _点数 =< _点数上限, writef('受験番号:%t ランク:%t\n',[_番号,_ランク]), '5段階にランク付けをして、受験番号・ランクを表示する'(R1,R2,_ランクならび). ランクの定義文解析(_ランク定義文,_ランクならび) :- 全角数字を半角数字に変換(_ランク定義文,_半角数字変換されたランク定義文), split(_半角数字変換されたランク定義文,[' ','。','、','〜','点を','とする'],L), n個組(3,L,_ランクならび). 全角数字を半角数字に変換(_ランク定義文,_半角数字変換されたランク定義文) :- atom_chars(_ランク定義文,Chars), findall(_文字_1, append(_,[_文字|_],Chars), 全角数字ならば半角数字に変換(_文字,_文字_1)), Chars2), atom_chars(_半角数字変換されたランク定義文,Chars2). 全角数字ならば半角数字に変換([_全角数字|R1],[_半角数字|R2]) :- 全角数字半角数字変換(_全角数字,_半角数字), 全角数字ならば半角数字に変換(R1,R2). 全角数字ならば半角数字に変換([_文字|R1],[_文字|R2]) :- \+(全角数字半角数字変換(_文字,_)), 全角数字ならば半角数字に変換(R1,R2). 全角数字半角数字変換(0,0). 全角数字半角数字変換(1,1). 全角数字半角数字変換(2,2). 全角数字半角数字変換(3,3). 全角数字半角数字変換(4,4). 全角数字半角数字変換(5,5). 全角数字半角数字変換(6,6). 全角数字半角数字変換(7,7). 全角数字半角数字変換(8,8). 全角数字半角数字変換(9,9). 番号の定義文解析(_番号の定義文,_番号ならび) :- split(_番号の定義文,['=',',',';'],[_|_番号ならび]). 点数の定義文解析(_点数の定義文,_点数ならび) :- split(_点数の定義文,['=',',',';'],[_|_点数ならび]). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/576 # 西暦何年かを入力するとその年に月曜日が何回あるか数え # 52回なら1を、53回なら0を出力するプログラムお願いします… # # 1回1回判定するのではなく、一気に何回か入力し、一気に判定を出力するものでお願いします # (0を入力したら終わりです) # # 入力できるのは1989〜5000です # # '西暦何年かを入力するとその年に月曜日が何回あるか数え 52回なら1を、53回なら0を出力するプログラムお願いします… 1回1回判定するのではなく、一気に何回か入力し、一気に判定を出力するものでお願いします (0を入力したら終わりです) 入力できるのは1989〜5000です' :- '西暦何年かを一気に何回か入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_西暦ならび), 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'(_西暦ならび). '西暦何年かを一気に何回か入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_西暦ならび) :- findall(_西暦,( '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'('西暦(1989~5000)を入力して下さい',_西暦), ( _西暦=0,!,fail;true)),_西暦ならび). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'([]). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'([_西暦|_残りならび]) :- 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を'(_西暦,_1または0), 出力する(_西暦,_1または0), 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'(_残りならび). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を'(_西暦,_0または1) :- 'その年に月曜日が何回あるか数え'(_西暦,_月曜日の回数), '52回なら1を、53回なら0を'(_月曜日の回数,_0または1). 'その年に月曜日が何回あるか数え'(_西暦,_月曜日の回数) :- findall(1,( 日付と曜日の生成(_西暦,1,1,_年,_月,_日,月曜), ( \+(_年 = _西暦),!,fail;true)),L), length(L,_月曜日の回数). '52回なら1を、53回なら0を'(52,1). '52回なら1を、53回なら0を'(53,0). 出力する(_西暦,_1または0) :- writef('%t年 %t\n',[_西暦,_1または0]). '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_催促文,_西暦) :- writef('%t ',[_催促文]), get_line(_入力行), '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_入力行,_西暦). '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_催促文,_西暦) :- '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_催促文,_西暦). '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'('0',0) :- !. '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_入力行,_西暦) :- read_term_from_atom(_入力行,_西暦,[]), integer(_西暦), between(1889,5000,_西暦),!. '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_入力行,_) :- writef('入力された文字列"%t"から1899年から5000年範囲の西暦が得られませんでした\n再入力をお願いします\n',[_入力行]), fail. get_line(Line) :- get_line(user_input,Line). get_line(Instream,Line) :- get_char(Instream,C), get_line_1(Instream,C,Chars), atom_chars(Line,Chars) . get_line_1(_,'\n',[]) :- !. get_line_1(_,end_of_file,[]) :- !. get_line_1(Instream,C,[C|R]) :- get_char(Instream,C2), get_line_1(Instream,C2,R). '日付と曜日の生成'(_年,_月,_日,_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日). '日付と曜日の生成'(_年_1,_月_1,_日_1,_年,_月,_日,_曜日) :- 翌日(_年_1,_月_1,_日_1,_年_2,_月_2,_日_2), '日付と曜日の生成'(_年_2,_月_2,_日_2,_年,_月,_日,_曜日). '日付と曜日の生成'(_起点年月日文字列,_年月日文字列,_曜日) :- 年月日文字列から整数年月日を得る(_起点年月日文字列,_起点年,_起点月,_起点日), '日付と曜日の生成'(_起点年,_起点月,_起点日,_年,_月,_日,_曜日), 整数から文字列(4,_年,_年文字列), 整数から文字列(2,_月,_月文字列), 整数から文字列(2,_日,_日文字列), atomic_list_concat([_年文字列,_月文字列,_日文字列],_年月日文字列). 翌日(_年,12,31,_翌日の年,1,1) :- succ(_年,_翌日の年),!. 翌日(_年,2,29,_年,3,1) :- うるう年(_年),!. 翌日(_年,2,28,_年,3,1) :- \+(うるう年(_年)),!. 翌日(_年,_月,_日,_年,_翌日の月,1) :- _翌日の月 is _月 + 1, '十二月・二月を除く月末日'(_月,_日),!. 翌日(_年,_月,_日,_年,_月,_翌日の日) :- succ(_日,_翌日の日). '十二月・二月を除く月末日'(_月,30) :- 小の月(_月),!. '十二月・二月を除く月末日'(_月,31) :- 大の月(_月). 小の月(_月) :- member(_月,[2,4,6,9,11]). 大の月(_月) :- member(_月,[1,3,5,7,8,10,12]). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 > 2, _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 曜日を表す値(_曜日を表す値,_曜日). 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 =< 2, _年_1 is _年 - 1, _月_2 is _月 + 12, 'Zellerの公式を用いて曜日を得る'(_年_1,_月_2,_日,_曜日を表す値,_曜日). 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). % 以下のサイトは '日付と曜日の生成'(_年_1,_月_1,_日_1,_起点日からの日数,_年,_月,_日,_曜日) :- '日付と曜日の生成'(_年_1,_月_1,_日_1,0,_起点日からの日数,_年,_月,_日,_曜日). '日付と曜日の生成'(_年,_月,_日,_日数,_日数,_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日). '日付と曜日の生成'(_年_1,_月_1,_日_1,_起点日からの日数_1,_起点日からの日数,_年,_月,_日,_曜日) :- 翌日(_年_1,_月_1,_日_1,_年_2,_月_2,_日_2), succ(_起点日からの日数_1,_起点日からの日数_2), '日付と曜日の生成'(_年_2,_月_2,_日_2,_起点日からの日数_2,_起点日からの日数,_年,_月,_日,_曜日). '日付と曜日の生成'(_年,_月,_日,_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日). '日付と曜日の生成'(_年_1,_月_1,_日_1,_年,_月,_日,_曜日) :- 翌日(_年_1,_月_1,_日_1,_年_2,_月_2,_日_2), '日付と曜日の生成'(_年_2,_月_2,_日_2,_年,_月,_日,_曜日). '日付と曜日の生成'(_起点年月日文字列,_年月日文字列,_曜日) :- 年月日文字列から整数年月日を得る(_起点年月日文字列,_起点年,_起点月,_起点日), '日付と曜日の生成'(_起点年,_起点月,_起点日,_年,_月,_日,_曜日), 整数から文字列(4,_年,_年文字列), 整数から文字列(2,_月,_月文字列), 整数から文字列(2,_日,_日文字列), atomic_list_concat([_年文字列,_月文字列,_日文字列],_年月日文字列). 翌日(_年,12,31,_翌日の年,1,1) :- succ(_年,_翌日の年),!. 翌日(_年,2,29,_年,3,1) :- うるう年(_年),!. 翌日(_年,2,28,_年,3,1) :- \+(うるう年(_年)),!. 翌日(_年,_月,_日,_年,_翌日の月,1) :- _翌日の月 is _月 + 1, '十二月・二月を除く月末日'(_月,_日),!. 翌日(_年,_月,_日,_年,_月,_翌日の日) :- succ(_日,_翌日の日). '十二月・二月を除く月末日'(_月,30) :- 小の月(_月),!. '十二月・二月を除く月末日'(_月,31) :- 大の月(_月). 小の月(_月) :- member(_月,[2,4,6,9,11]). 大の月(_月) :- member(_月,[1,3,5,7,8,10,12]). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 > 2, _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 曜日を表す値(_曜日を表す値,_曜日). 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 =< 2, _年_1 is _年 - 1, _月_2 is _月 + 12, 'Zellerの公式を用いて曜日を得る'(_年_1,_月_2,_日,_曜日を表す値,_曜日). 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). 整数から文字列(_文字列桁,_整数,_定数) :- '整数・文字番号変換'(_整数,_文字番号ならび), ならびの長さ(_文字番号ならび,_ならびの長さ), _不足桁 is _文字列桁 - _ならびの長さ, 頭部に零を詰める(_不足桁,_文字番号ならび,_整形された文字番号ならび), '定数・文字番号変換'(_定数,_整形された文字番号ならび),!. 年月日文字列から整数年月日を得る(_年月日文字列,_年,_月,_日) :- sub_atom(_年月日文字列,0,4,4,_年文字列), sub_atom(_年月日文字列,2,2,2,_月文字列), sub_atom(_年月日文字列,4,2,0,_日文字列), 文字列ならびから整数ならびを得る([_年文字列,_月文字列,_日文字列],[_年,_月,_日]). 文字列ならびから整数ならびを得る([],[]). 文字列ならびから整数ならびを得る([_文字列|R1],[_整数|R2]) :- get_term_from_atom(_文字列,_整数,[]), 文字列ならびから整数ならびを得る(R1,R2). ならびの長さ(_ならび,_ならびの長さ) :- length(_ならび,_ならびの長さ). '整数・文字番号変換'(_整数,_文字番号ならび) :- number_codes(_整数,_文字番号ならび). 頭部に零を詰める(0,_文字ならび,_文字ならび) :- !. 頭部に零を詰める(_桁,[_|_未決定ならび],_文字ならび) :- _桁 < 0,!, _残り桁 is _桁 + 1, 頭部に零を詰める(_残り桁,_未決定ならび,_文字ならび). 頭部に零を詰める(_桁,_文字ならび,[48|_未決定ならび]) :- _残り桁 is _桁 - 1, 頭部に零を詰める(_残り桁,_文字ならび,_未決定ならび). '定数・文字番号変換'(_定数,_文字番号ならび) :- atom_codes(_定数,_文字番号ならび). % 以下のサイトは '日付と曜日の生成'(_年,_月,_日,_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日). '日付と曜日の生成'(_年_1,_月_1,_日_1,_年,_月,_日,_曜日) :- 翌日(_年_1,_月_1,_日_1,_年_2,_月_2,_日_2), '日付と曜日の生成'(_年_2,_月_2,_日_2,_年,_月,_日,_曜日). 翌日(_年,12,31,_翌日の年,1,1) :- succ(_年,_翌日の年),!. 翌日(_年,2,29,_年,3,1) :- うるう年(_年),!. 翌日(_年,2,28,_年,3,1) :- \+(うるう年(_年)),!. 翌日(_年,_月,_日,_年,_翌日の月,1) :- _翌日の月 is _月 + 1, '十二月・二月を除く月末日'(_月,_日),!. 翌日(_年,_月,_日,_年,_月,_翌日の日) :- succ(_日,_翌日の日). '十二月・二月を除く月末日'(_月,30) :- 小の月(_月),!. '十二月・二月を除く月末日'(_月,31) :- 大の月(_月). 小の月(_月) :- member(_月,[2,4,6,9,11]). 大の月(_月) :- member(_月,[1,3,5,7,8,10,12]). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 > 2, _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 曜日を表す値(_曜日を表す値,_曜日). 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 =< 2, _年_1 is _年 - 1, _月_2 is _月 + 12, 'Zellerの公式を用いて曜日を得る'(_年_1,_月_2,_日,_曜日を表す値,_曜日). 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). % 以下のサイトは % % 年、月が与えられた時、日曜日から始まるカレンダーを表示する。 % 日曜起点カレンダー(_年,_月) :- 月末日(_年,_月,_月末日), 'Zellerの公式を用いて曜日を表す値と曜日を得る'(_年,_月,1,_曜日を表す値,_曜日), 日曜起点カレンダー(_曜日,_月末日,_カレンダー), カレンダー表示(_カレンダー). 日曜起点カレンダー(_一日の曜日,_月末日,_カレンダー) :- findall(_日,between(1,_月末日,_日),_日付ならび), 第一週の整形(_一日の曜日,_日付ならび,_第一週,_第二週以後), 最終週の整形(_第二週以後,_最終週を整形された第二週以後), _カレンダー = [_第一週|_最終週を整形された第二週以後]. 第一週の整形(日曜,[_1,_2,_3,_4,_5,_6,_7|R],[_1,_2,_3,_4,_5,_6,_7],R). 第一週の整形(月曜,[_1,_2,_3,_4,_5,_6|R],[_,_1,_2,_3,_4,_5,_6],R). 第一週の整形(火曜,[_1,_2,_3,_4,_5|R],[_,_,_1,_2,_3,_4,_5],R). 第一週の整形(水曜,[_1,_2,_3,_4|R],[_,_,_,_1,_2,_3,_4],R). 第一週の整形(木曜,[_1,_2,_3|R],[_,_,_,_,_1,_2,_3],R). 第一週の整形(金曜,[_1,_2|R],[_,_,_,_,_,_1,_2],R). 第一週の整形(土曜,[_1|R],[_,_,_,_,_,_,_1],R). 最終週の整形([_1,_2,_3,_4,_5,_6,_7|R1],[[_1,_2,_3,_4,_5,_6,_7]|R2]) :- 最終週の整形(R1,R2),!. 最終週の整形([],[]) :- !. 最終週の整形(L1,[L2]) :- length(L2,7), append(L1,_,L2). 'Zellerの公式を用いて曜日を表す値と曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を表す値と曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 > 2, 'Zellerの公式'(_年,_月,_日,_曜日を表す値), 'Zellerの公式で曜日を表す値と曜日'(_曜日を表す値,_曜日). 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 =< 2, _年_1 is _年 - 1, _月_2 is _月 + 12, 'Zellerの公式を用いて曜日を表す値と曜日を得る'(_年_1,_月_2,_日,_曜日を表す値,_曜日). 'Zellerの公式'(_年,_月,_日,_曜日を表す値) :- _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7. 'Zellerの公式で曜日を表す値と曜日'(0,日曜). 'Zellerの公式で曜日を表す値と曜日'(1,月曜). 'Zellerの公式で曜日を表す値と曜日'(2,火曜). 'Zellerの公式で曜日を表す値と曜日'(3,水曜). 'Zellerの公式で曜日を表す値と曜日'(4,木曜). 'Zellerの公式で曜日を表す値と曜日'(5,金曜). 'Zellerの公式で曜日を表す値と曜日'(6,土曜). 月末日(_年,2,29) :- うるう年(_年),!. 月末日(_年,2,28) :- !. 月末日(_,_月,31) :- member(_月,[1,3,5,7,8,10,12]). 月末日(_,_月,30) :- member(_月,[4,6,9,11]). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. カレンダー表示([]). カレンダー表示([_週|R]) :- カレンダー週表示(_週), カレンダー表示(R). カレンダー週表示([]) :- write('\n'). カレンダー週表示([A|R]) :- 表示項(A,_表示項), writef('%3R',[_表示項]), カレンダー週表示(R). 表示項(' ',' ') :- !. 表示項(N,N). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/db/1402919549/274 # よろしくお願いいたします。 # 【DBMS名とバージョン】Oracle 11g # 【テーブルデータ】 # ID   YMD # 1  20140101 # 1  20140102 # 1  20140103 # 1  20140105 # 1  20140106 # 2  20140101 # 2  20140102 # 【欲しい結果 】 # ID START_YMD END_YMD # 1 20140101 20140103 # 1 20140105 20140106 # 2 20140101 20140102 # 【説明】 # レコード単位で一日の日付を持つデータをグループかして、 # 開始日付と終了日付に集約したいです。 # ただし、一日でも間があれば、集約データ内では別レコードとして扱いたいです。 # # どなたかいいお知恵がございましたら、よろしくお願いいたしますm(_ _)m # # 'レコード単位で一日の日付を持つデータをグループかして、 開始日付と終了日付に集約したいです。 ただし、一日でも間があれば、集約データ内では別レコードとして扱いたいです。'(_id,_START_YMD,_END_YMD) :- setof(_ID,[_ID,_YMD] ^ table(_ID,_YMD),_ID候補), member(_ID,_ID候補), setof(_YMD,[_ID,_YMD] ^ table(_ID,_YMD),_YMD候補), 連続性検査(_YMD候補,_START_YMD,_END_YMD). 連続性検査(_YMD候補,_START_YMD,_END_YMD) :- append([L1,[_START_YMD|R2],L2],_YMD候補), 連続している([_START_YMD|R2],_END_YMD), 連続していない(L1,[_START_YMD]), 連続していない([_END_YMD],L2). 連続している([_END_YMD],_END_YMD) :- !. 連続している([_YMD_1,_YMD_2|R1],_END_YMD) :- 翌日(_YMD_1,_YMD_2), 連続している([_YMD_2|R1],_END_YMD). 連続していない(L1,L2) :- \+((last(L1,_YMD_1),L2 = [_YMD_2|_],翌日(_YMD_1,_YMD_2))). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 翌日(_YMD,_翌日) :- 年月日(_YMD,_年,_月,_日), 翌日(_年,_月,_日,_翌日). 年月日(_YMD,_年,_月,_日) :- sub_atom(_YMD,0,2,_,_年), sub_atom(_YMD,2,2,_,_月), sub_atom(_YMD,4,2,_,_日). 翌日(_年,_月,_日,_翌日) :- 年月換わり(年,_月,_日,_翌日),!. 翌日(_年,_月,_日,_翌日) :- 翌日の日(_日,_翌日の日), atomic_list_concat([_年,_月,_翌日の日],_翌日). 年月換わり(_年,'02',_月末日,_翌日) :- 二月月末(_年,'02',_月末日,_翌日). 年月換わり(_年,_月,_月末日,_翌日) :- 小の月の月末日の翌日(_月,_月末日,_翌日). 年月換わり(_年,_月,_月末日,_翌日) :- 大の月の月末日の翌日(_年,_月,_月末日,_翌日). 二月月末(_年,'02','29',_翌日) :- atomic_list_concat([_年,'03','01'],_翌日). 二月月末(_年,'02','28',_翌日) :- atom_number(_年,_年整数), \+(うるう年(_年整数)), atomic_list_concat([_年,'03','01'],_翌日). 小の月の月末日の翌日(_月,'30',_翌日) :- member(_月,['04','06','09','11']), 翌月(_月,_翌月), atomic_list_concat([_年,_翌月,'01'],_翌日). 大の月の月末日の翌日(_年,_月,'31',_翌日) :- member(_月,['01','03','05','07','08','10','12']), 翌月(_月,_翌月), 年換わり(_年,_月,_年_1), atomic_list_concat([_年_1,_翌月,'01'],_翌日). 年換わり(_年,'12',_翌年) :- 翌年(_年,_翌年). 年換わり(_年,_月,_年) :- \+(_月='12'). うるう年(_うるう年) :- 0 is mod _うるう年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_うるう年) :- 0 is _うるう年 mod 4. 翌月('01','02'). 翌月('02','03'). 翌月('03','04'). 翌月('04','05'). 翌月('05','06'). 翌月('06','07'). 翌月('07','08'). 翌月('08','09'). 翌月('09','10'). 翌月('10','11'). 翌月('11','12'). 翌月('12','01'). 翌日の日('01','02'). 翌日の日('02','03'). 翌日の日('03','04'). 翌日の日('04','05'). 翌日の日('05','06'). 翌日の日('06','07'). 翌日の日('07','08'). 翌日の日('08','09'). 翌日の日('09','10'). 翌日の日('10','11'). 翌日の日('11','12'). 翌日の日('12','13'). 翌日の日('13','14'). 翌日の日('14','15'). 翌日の日('15','16'). 翌日の日('16','17'). 翌日の日('17','18'). 翌日の日('18','19'). 翌日の日('19','20'). 翌日の日('20','21'). 翌日の日('21','22'). 翌日の日('22','23'). 翌日の日('23','24'). 翌日の日('24','25'). 翌日の日('25','26'). 翌日の日('26','27'). 翌日の日('27','28'). 翌日の日('28','29'). 翌日の日('29','30'). 翌日の日('30','31'). 翌年(_年,_翌年) :- atom_number(_年,_年整数), succ(_年整数,_翌年の年整数), atom_number(_翌年,_翌年の年整数). % 以下のサイトは # 出典: プログラムのお題スレ Part4 #38 # # 標準入力から与えられたフォーマットを元に年齢を求めて出力せよ # 標準入力から以下の形式で与えられます # YYYY/MM/dd # # 年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる。 '標準入力から与えられたフォーマットを元に年齢を求めて出力せよ 標準入力から以下の形式で与えられます YYYY/MM/dd 年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる。' :- '標準入力から与えられたフォーマット(YYYY/MM/dd)を元に'(_年,_月,_日), '年齢を求めて(年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる)'(_年,_月,_日,_年齢), 出力せよ(_年齢). '標準入力から与えられたフォーマット(YYYY/MM/dd)を元に'(_年,_月,_日) :- get_line(_文字列), read_term_from_atom(_文字列,_年/_月/_日,[]). '年齢を求めて(年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる)'(_年,_月,_日,_年齢) :- date(date(_今日_年,_今日_月,_今日_日)), 誕生日の前日(_今日_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日), '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢). 誕生日の前日(_年,_月,1,_前日_年,_前日_月,_前日_日) :- 誕生日の前月と月末日を得る(_年,_月,1,_前日_年,_前日_月,_前日_日). 誕生日の前日(_年,_月,_日,_年,_月,_前日_日) :- \+(_日 = 1), succ(_前日_日,_日). 誕生日の前月と月末日を得る(_誕生日の年,1,1,_誕生日の前年,12,31) :- succ(_誕生日の前年,_誕生日の年). 誕生日の前月と月末日を得る(_年,3,1,_年,2,_誕生日の前月末日) :- '3月1日はうるう年であるか否かで誕生日の前月末日が変わる'(_年,_誕生日の前月末日). 誕生日の前月と月末日を得る(_年,_誕生日の月,1,_年,_誕生日の前月,30) :- '誕生日の前月が小の月(2月を除く)'(_誕生日の月,_誕生日の前月). 誕生日の前月と月末日を得る(_年,_誕生日の月,1,_年,_誕生日の前月,31) :- '誕生日の前月が大の月(12月を除く)'(_誕生日の月,_誕生日の前月). '3月1日はうるう年であるか否かで誕生日の前月末日が変わる'(_年,29) :- うるう年(_年). '3月1日はうるう年であるか否かで誕生日の前月末日が変わる'(_年,28) :- \+(うるう年(_年)). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. '誕生日の前月が小の月(2月を除く)'(_誕生日の月,_誕生日の前月) :- succ(_誕生日の前月,_誕生日の月), member(_誕生日の前月,[4,6,9,11]). '誕生日の前月が大の月(12月を除く)'(_誕生日の月,_誕生日の前月) :- succ(_誕生日の前月,_誕生日の月), member(_誕生日の前月,[1,3,5,7,8,10]). '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- まだ誕生日の前日になっていない(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢). '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- 既に誕生日の前日を過ぎている(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢). まだ誕生日の前日になっていない(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 < _誕生日の前日_月, _年齢 is _誕生日の前日の年 - _年 - 1. まだ誕生日の前日になっていない(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 = _誕生日の前日_月, _日 < _誕生日の前日の日, _年齢 is _誕生日の前日_年 - _年 - 1. 既に誕生日の前日を過ぎている(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 > _誕生日の前日_月, _年齢 is _誕生日の前日の年 - _年. 既に誕生日の前日を過ぎている(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 = _誕生日の前日_月, _日 >= _誕生日の前日_日, _年齢 is _誕生日の前日_年 - _年. 出力せよ(_年齢) :- writef('%t歳です\n',[_年齢]). % 以下のサイトは # 出典: プログラムのお題スレ Part4 #38 # # 標準入力から与えられたフォーマットを元に年齢を求めて出力せよ # 標準入力から以下の形式で与えられます # YYYY/MM/dd # # 年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる。 '標準入力から与えられたフォーマットを元に年齢を求めて出力せよ 標準入力から以下の形式で与えられます YYYY/MM/dd 年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる。' :- '標準入力から与えられたフォーマット(YYYY/MM/dd)を元に'(_年,_月,_日), '年齢を求めて(年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる)'(_年,_月,_日,_年齢), 出力せよ(_年齢). '標準入力から与えられたフォーマット(YYYY/MM/dd)を元に'(_年,_月,_日) :- get_line(_文字列), read_term_from_atom(_文字列,_年/_月/_日,[]). '年齢を求めて(年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる)'(_年,_月,_日,_年齢) :- date(date(_今日_年,_今日_月,_今日_日)), 誕生日の前日(_今日_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日), '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢). 誕生日の前日(_年,1,1,_前日_年,12,31) :- succ(_前日_年,_年),!. 誕生日の前日(_年,3,1,_年,2,29) :- うるう年(_年),!. 誕生日の前日(_年,3,1,_年,2,28) :- \+(うるう年(_年)),!. 誕生日の前日(_年,_月,1,_年,_前日_月,31) :- member(_月,[2,4,6,9,11]), succ(_前日_月,_月),!. 誕生日の前日(_年,_月,1,_年,_前日_月,30) :- member(_月,[5,7,8,10,12]), succ(_前日_月,_月),!. 誕生日の前日(_年,_月,_日,_年,_月,_前日_日) :- succ(_前日_日,_日). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 > _誕生日の前日_月, _年齢 is _誕生日の前日の年 - _年. '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 < _誕生日の前日_月, _年齢 is _誕生日の前日の年 - _年 - 1. '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 = _誕生日の前日_月, _日 >= _誕生日の前日_日, _年齢 is _誕生日の前日_年 - _年. '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 = _誕生日の前日_月, _日 < _誕生日の前日の日, _年齢 is _誕生日の前日_年 - _年 - 1. 出力せよ(_年齢) :- writef('%t歳です\n',[_年齢]). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/103 # お題:与えられた年月のカレンダーを表示せよ。 # '与えられた年月のカレンダーを表示せよ。'(_年,_月) :- カレンダー矩形(_年,_月,_カレンダー矩形), カレンダーを表示する(_年,_月,_カレンダー矩形). カレンダー矩形(_年,_月,_カレンダー矩形) :- '1日の曜日を表す値'(_年,_月,_1日の曜日を表す値), 月末日(_年,_月,_月末日), 日付を埋めて週カレンダーならびを作る(_1日の曜日を表す値,_月末日,_カレンダー矩形). '1日の曜日を表す値'(_年,_月,_曜日を表す値) :- 'Zellerの公式を用いて曜日を表す値と曜日を得る'(_年,_月,1,_曜日を表す値,_). 'Zellerの公式'(_年,_月,_日,_曜日を表す値) :- _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7. 'Zellerの公式を用いて曜日を表す値と曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を表す値と曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 > 2, 'Zellerの公式'(_年,_月,_日,_曜日を表す値), 'Zellerの公式で曜日を表す値と曜日'(_曜日を表す値,_曜日). 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 =< 2, _年_1 is _年 - 1, _月_2 is _月 + 12, 'Zellerの公式を用いて曜日を表す値と曜日を得る'(_年_1,_月_2,_日,_曜日を表す値,_曜日). 'Zellerの公式で曜日を表す値と曜日'(0,日曜). 'Zellerの公式で曜日を表す値と曜日'(1,月曜). 'Zellerの公式で曜日を表す値と曜日'(2,火曜). 'Zellerの公式で曜日を表す値と曜日'(3,水曜). 'Zellerの公式で曜日を表す値と曜日'(4,木曜). 'Zellerの公式で曜日を表す値と曜日'(5,金曜). 'Zellerの公式で曜日を表す値と曜日'(6,土曜). 月末日(_年,2,29) :- うるう年(_年),!. 月末日(_年,2,28) :- !. 月末日(_,_月,31) :- member(_月,[1,3,5,7,8,10,12]). 月末日(_,_月,30) :- member(_月,[4,6,9,11]). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- \+(0 is _年 mod 100),!. うるう年(_年) :- 0 is _年 mod 4. 日付を埋めて週カレンダーならびを作る(_1日の曜日を表す値,_月末日,_週カレンダーならび) :- 日付を埋める(_1日の曜日を表す値,_月末日,_42日分の日枠), 週ごとに折り返す(_42日分の日枠,_週カレンダーならび). 日付を埋める(_1日の曜日を表す値,_月末日,_42日分の日枠) :- findall(A,( between(1,42,N), _日付 is N - _1日の曜日を表す値, 日付か空白を選択(_日付,_月末日,A)), _42日分の日枠). 日付か空白を選択(_日付,_月末日,' ') :- _日付 < 0,!. 日付か空白を選択(_日付,_月末日,' ') :- _日付 > _月末日,!. 日付か空白を選択(_日付,_月末日,_日付). 週ごとに折り返す([],[]). 週ごとに折り返す([_1,_2,_3,_4,_5,_6,_7|R1],[[_1,_2,_3,_4,_5,_6,_7]|R2]) :- 週ごとに折り返す(R1,R2). カレンダーを表示する(_年,_月,_週カレンダーならび) :- カレンダーの年月を表示する(_年,_月), カレンダーの日付部を表示する(_週カレンダーならび). カレンダーの年月を表示する(_年,_月) :- writef('\n%10R年%3R月 \n\n',[_年,_月]). カレンダーの日付部を表示する([]) :- !. カレンダーの日付部を表示する([_週カレンダー|R]) :- writef('%3R%3R%3R%3R%3R%3R%3R\n',_週カレンダー), カレンダーの日付部を表示する(R). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/db/1371476534/541 # 質問です教えてください # # データベース = access # テーブル名 = T_DATA # # SQLで取得したい結果は、KEYごとに日数を取得したいのですが # 重複する日数はカウントから除外したいです。 # どんなSQLを書けばいいですか? # # ・キーは、日数=5日 # ・キーは、日数=1日 # # ---------------------------------- # キー, 開始日, 終了日 # ---------------------------------- # 1, 2014/01/01, 2014/01/01 |→ 日数=1日 # 1, 2014/01/02, 2014/01/02 |→ 日数=1日 # 1, 2014/01/02, 2014/01/02 |→ 日数=0日(重複) # 1, 2014/01/03, 2014/01/03 |→ 日数=1日 # 1, 2014/01/04, 2014/01/05 |→ 日数=2日、合計=5日 # --- # 2, 2014/01/01, 2014/01/01 |→ 日数=1日 # 2, 2014/01/01, 2014/01/01 |→ 日数=0日(重複)、合計=1日 # # ↓これだと重複がカウントされてしまいます。 # SELECT # キー # ,SUM(DATEDIFF('d', 開始日, 終了日)+1) AS 日数 # FROM # T_DATA # GROUP BY # キー # 'データベース = access テーブル名 = T_DATA SQLで取得したい結果は、KEYごとに日数を取得したいのですが 重複する日数はカウントから除外したいです。'(_キーごとの日数) :- setof(_キー,[_キー,_開始日,_終了日] ^ 'T_DATA'(_キー,_開始日,_終了日),_キーならび), findall([_キー,_日数],( member(_キー,_キーならび), キーの日数を得る(_キー,_日数)), _キーごとの日数). キーの日数を得る(_キー,_日数) :- findall(_日,( 'T_DATA'(_キー,_開始日,_終了日), 整数構造に変換(_開始日,_終了日,_開始日整数構造,_終了日整数構造), 範囲の日を引出す(_開始日整数構造,_終了日整数構造,_日)), L1), 重複日を取り除いた日数(L1,_日数). 整数構造に変換(_開始日,_終了日,_開始日整数構造,_終了日整数構造) :- read_term_from_atom(_開始日,_開始日整数構造), read_term_from_atom(_終了日,_終了日整数構造). 範囲の日を引出す(_終了日,_終了日,_終了日) :- !. 範囲の日を引出す(_日,_終了日,_日). 範囲の日を引出す(_日_1,_終了日,_日) :- 翌日(_日_1,_翌日), 範囲の日を引出す(_翌日,_終了日,_日). 翌日(_年/12/_31,_翌年/1/1) :- _翌年 is _年 + 1,!. 翌日(_年/_月/_日,_年/_翌月/1) :- 月末日(_年/_月/_日), _翌月 is _月 + 1,!. 翌日(_年/_月/_日,_年/_月/_翌日の日) :- _翌日の日 is _日 + 1,!. 月末日(_年/2/29) :- うるう年(_年),!. 月末日(_年/2/28) :- \+(うるう年(_年)),!. 月末日(_年/_月/30) :- member(_月,[4,6,9,11]),!. 月末日(_年/_月/31) :- member(_月,[1,3,5,7,8,10,12]). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 重複日を取り除いた日数(L1,_日数) :- sort(L1,L2), length(L2,_日数). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/576 # 西暦何年かを入力するとその年に月曜日が何回あるか数え # 52回なら1を、53回なら0を出力するプログラムお願いします… # # 1回1回判定するのではなく、一気に何回か入力し、一気に判定を出力するものでお願いします # (0を入力したら終わりです) # # 入力できるのは1989〜5000です # # '西暦何年かを入力するとその年に月曜日が何回あるか数え 52回なら1を、53回なら0を出力するプログラムお願いします… 1回1回判定するのではなく、一気に何回か入力し、一気に判定を出力するものでお願いします (0を入力したら終わりです) 入力できるのは1989〜5000です' :- '西暦何年かを一気に何回か入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_西暦ならび), 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'(_西暦ならび). '西暦何年かを一気に何回か入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_西暦ならび) :- findall(_西暦,( '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'('西暦(1989~5000)を入力して下さい',_西暦),( _西暦=0,!,fail;true)),_西暦ならび). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'([]). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'([_西暦|_残りならび]) :- 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を'(_西暦,_0または1), writef('%t年 %t\n',[_西暦,_0または1]), 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'(_残りならび). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を'(_西暦,_0または1) :- うるう年で1月1日が日曜か月曜の時は0それ以外は1(_西暦,_0または1). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を'(_西暦,_0または1) :- うるう年でない年は1月1日が月曜の時は0それ以外は1(_西暦,_0または1). うるう年で1月1日が日曜か月曜の時は0それ以外は1(_西暦,0) :- うるう年(_西暦), '1月1日が日曜か月曜の時は'(_西暦),!. うるう年で1月1日が日曜か月曜の時は0それ以外は1(_西暦,1) :- うるう年(_西暦). '1月1日が日曜か月曜の時は'(_西暦) :- 'Zellerの公式を用いて曜日を得る'(_西暦,1,1,_曜日を表す値,_曜日), member(_曜日,[日曜,月曜]). うるう年でない年は1月1日が月曜の時は0それ以外は1(_西暦,0) :- \+(うるう年(_西暦)), 'Zellerの公式を用いて曜日を得る'(_西暦,1,1,_曜日を表す値,月曜),!. うるう年でない年は1月1日が月曜の時は0それ以外は1(_西暦,1) :- \+(うるう年(_西暦)). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 > 2, _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 曜日を表す値(_曜日を表す値,_曜日). 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 =< 2, _年_1 is _年 - 1, _月_2 is _月 + 12, 'Zellerの公式を用いて曜日を得る'(_年_1,_月_2,_日,_曜日を表す値,_曜日). 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_催促文,_西暦) :- writef('%t ',[_催促文]), get_line(_入力行), '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_入力行,_西暦). '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_催促文,_西暦) :- '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_催促文,_西暦). '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'('0',0) :- !. '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_入力行,_西暦) :- read_term_from_atom(_入力行,_西暦,[]), integer(_西暦), between(1989,5000,_西暦),!. '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_入力行,_) :- writef('入力された文字列"%t"から1899年から5000年範囲の西暦が得られませんでした\n再入力をお願いします\n',[_入力行]), fail. get_line(Line) :- get_line(user_input,Line). get_line(Instream,Line) :- get_char(Instream,C), get_line_1(Instream,C,Chars), atom_chars(Line,Chars) . get_line_1(_,'\n',[]) :- !. get_line_1(_,end_of_file,[]) :- !. get_line_1(Instream,C,[C|R]) :- get_char(Instream,C2), get_line_1(Instream,C2,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/328 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # a) 4桁の西暦を入力として受け取り # b) その年のすべての日について次の演算を行い # c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日 # (例) # 20 + 13 + 11 + 25 = 69 # d) 各日の小計を大きいものから順に # 20131231 = 76 # ... # 20131125 = 69 # ... # 20130101 = 35 # のように表示させるプログラムを作りなさい # 'a) 4桁の西暦を入力として受け取り b) その年のすべての日について次の演算を行い c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日 (例) 20 + 13 + 11 + 25 = 69 d) 各日の小計を大きいものから順に 20131231 = 76 ... 20131125 = 69 ... 20130101 = 35 のように表示させるプログラムを作りなさい '(_四桁の西暦) :- findall([_小計,_年月日整数],( 'b) その年のすべての日について'(_四桁の西暦,_年月日整数), '次の演算を行い c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日'(_年月日整数,_小計)), _小計_年月日整数ならび), 'd) 各日の小計を大きいものから順に 20131231 = 76 ... 20131125 = 69 ... 20130101 = 35 のように表示させる'(_四桁の西暦,_小計_年月日整数ならび). 'b) その年のすべての日について'(_四桁の西暦,_年月日整数) :- between(1,12,_月整数), 月末日(_四桁の西暦,_月整数,_月末日整数), between(1,_月末日整数,_日整数), _年月日整数 is _四桁の西暦 * 10000 + _月整数 * 10 + _日整数. 月末日(_年整数,_月整数,_月末日整数) :- うるう年(_年整数), nth1(_月整数,[31,29,31,30,31,30,31,31,30,31,30,31],_月末日整数). 月末日(_年整数,_月整数,_月末日整数) :- \+(うるう年(_年整数)), nth1(_月整数,[31,28,31,30,31,30,31,31,30,31,30,31],_月末日整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4. '次の演算を行い c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日'(_年月日整数,_小計) :- 年の上位2桁(_年月日整数,_年の上位2桁), 年の下位2桁(_年月日整数,_年の下位2桁), 月(_年月日整数,_月整数), 日(_年月日整数,_日整数), _小計 is _年の上位2桁 + _年の下位2桁 + _月整数 + _日整数. 年の上位2桁(_年月日整数,_年の上位2桁) :- _年の上位2桁 is _年月日整数 // 1000000. 年の下位2桁(_年月日整数,_年の下位2桁) :- _剰余 is _年月日整数 mod 10000, _年の下位2桁 is _剰余 mod 100. 月(_年月日整数,_月整数) :- _剰余 is _年月日整数 mod 10000, _月整数 is _剰余_1 // 100. 日(_年月日整数,_日整数) :- _日整数 is _年月日整数 mod 100. 'd) 各日の小計を大きいものから順に 20131231 = 76 ... 20131125 = 69 ... 20130101 = 35 のように表示させる'(_年整数,_小計_年月日整数ならび) :- 年の組みの合計(_年整数,_年の組みの合計), forall((for(43,N,2),_小計 is _年の組みの合計 + N,member([_小計,_年月日整数],_小計_年月日整数ならび)),writef('%t = %t\n',[_年月日整数,_小計])). 年の組みの合計(_年整数,_年の組みの合計) :- _年の組みの合計 is _年整数 // 100 + _年整数 mod 100. % for/3 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/328 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # a) 4桁の西暦を入力として受け取り # b) その年のすべての日について次の演算を行い # c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日 # (例) # 20 + 13 + 11 + 25 = 69 # d) 各日の小計を大きいものから順に # 20131231 = 76 # ... # 20131125 = 69 # ... # 20130101 = 35 # のように表示させるプログラムを作りなさい # 'a) 4桁の西暦を入力として受け取り b) その年のすべての日について次の演算を行い c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日 (例) 20 + 13 + 11 + 25 = 69 d) 各日の小計を大きいものから順に 20131231 = 76 ... 20131125 = 69 ... 20130101 = 35 のように表示させるプログラムを作りなさい '(_四桁の西暦) :- findall([_小計,_年月日整数],( 'b) その年のすべての日について'(_四桁の西暦,_年月日整数), '次の演算を行い c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日'(_年月日整数,_小計)), _小計_年月日整数ならび), 'd) 各日の小計を大きいものから順に 20131231 = 76 ... 20131125 = 69 ... 20130101 = 35 のように表示させる'(_小計_年月日整数ならび). 'b) その年のすべての日について'(_四桁の西暦,_年月日整数) :- between(1,12,_月整数), 月末日(_四桁の西暦,_月整数,_月末日整数), between(1,_月末日整数,_日整数), _年月日整数 is _四桁の西暦 * 10000 + _月整数 * 10 + _日整数. 月末日(_年整数,_月整数,_月末日整数) :- うるう年(_年整数), nth1(_月整数,[31,29,31,30,31,30,31,31,30,31,30,31],_月末日整数). 月末日(_年整数,_月整数,_月末日整数) :- \+(うるう年(_年整数)), nth1(_月整数,[31,28,31,30,31,30,31,31,30,31,30,31],_月末日整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4. '次の演算を行い c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日'(_年月日整数,_小計) :- 年の上位2桁(_年月日整数,_年の上位2桁), 年の下位2桁(_年月日整数,_年の下位2桁), 月(_年月日整数,_月整数), 日(_年月日整数,_日整数), _小計 is _年の上位2桁 + _年の下位2桁 + _月整数 + _日整数. 年の上位2桁(_年月日整数,_年の上位2桁) :- _年の上位2桁 is _年月日整数 // 1000000. 年の下位2桁(_年月日整数,_年の下位2桁) :- _剰余 is _年月日整数 mod 10000, _年の下位2桁 is _剰余 mod 100. 月(_年月日整数,_月整数) :- _剰余 is _年月日整数 mod 10000, _月整数 is _剰余_1 // 100. 日(_年月日整数,_日整数) :- _日整数 is _年月日整数 mod 100. 'd) 各日の小計を大きいものから順に 20131231 = 76 ... 20131125 = 69 ... 20130101 = 35 のように表示させる'(_小計_年月日整数ならび) :- 各日の小計を大きいものから順に(_小計_年月日整数ならび,_大きいものから順に整列した_小計_年月日整数ならび), forall(member([_小計,_年月日整数],_大きいものから順に整列した_小計_年月日整数ならび),writef('%t = %t\n',[_年月日整数,_小計])). 各日の小計を大きいものから順に(_小計_年月日整数ならび,_大きいものから順に整列した_小計_年月日整数ならび) :- sort(_小計_年月日整数ならび,_小さいものから順に整列した_小計_年月日整数ならび), reverse(_小さいものから順に整列した_小計_年月日整数ならび,_大きいものから順に整列した_小計_年月日整数ならび), % 以下のサイトは # 西暦年を入力してそれ以後の閏年を10個表示させる 西暦年を入力してそれ以後の閏年を10個表示させる :- 西暦年を入力して(_西暦年), それ以後の閏年を10個(_西暦年,_それ以後の閏年を10個), 表示させる(_それ以後の閏年を10個). 西暦年を入力して(_西暦年) :- write('西暦年を入力 '), read(_西暦年). それ以後の閏年を10個(_年,_それ以後の閏年を10個) :- '10個'(_それ以後の閏年を10個), それ以後の閏年を(_年,_それ以後の閏年を10個). '10個'(_10個のならび) :- length(_10個のならび,10). それ以後の閏年を(_,[]). それ以後の閏年を(_閏年,[_閏年|_残り閏年ならび]) :- 閏年(_閏年), _閏年の翌年 is _閏年 + 1, それ以後の閏年を(_閏年の翌年,_残り閏年ならび),!. それ以後の閏年を(_閏年ではない年,_残り閏年ならび) :- _閏年ではない年の翌年 is _閏年ではない年 + 1, それ以後の閏年を(_閏年ではない年の翌年,_残り閏年ならび). 表示させる(_それ以後の閏年を10個) :- atomic_list_concat(_それ以後の閏年を10個,'\n',_表示文字列), writef('%t\n',[_表示文字列]). 閏年(_閏年) :- 0 is _閏年 mod 400,!. 閏年(_閏年) :- \+(0 is _閏年 mod 100), 0 is _閏年 mod 4. % 以下のサイトは # 1)西暦年から11を引き、その値を19で割った余りを求め、11を掛ける。 # 2)月の値から、以下の表に従って値を求める。 # 月 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月 # 値 0 2 0 2 2 4 5 6 7 8 9 10 # このうち6月までの値を「おにおににし」と覚える、と、多くの暦解説書に書かれている。 # 上記1),2)の値と日の値をそれぞれ加える。 # 求めた値を30で割った余りが、その日のおおよその月齢である。 # 但し、最大2程度の誤差がある。 以下はこれを数式化したものである。 # y年m月d日の月齢a日を求める。 # 但し、%は剰余演算子とし、c(m)は上の表に従った定数とする。例、62%30=2、c(5)=2。 月齢(_年整数,_月整数,_日整数,_月齢) :- 年月日範囲検査(_年整数,_月整数,_日整数), 月齢の月係数(_月整数,_月係数), _月齢 is (((_年整数 - 11) mod 19) * 11 + _月係数 + _日整数) mod 30. 年月日範囲検査(_年整数,_月整数,_日整数) :- between(1900,2099,_年整数), between(1,12,_月整数), 月末日整数(_年整数,_月整数,_月末日整数), between(1,_月末日整数,_日整数). 月齢の月係数(1,0). 月齢の月係数(2,2). 月齢の月係数(3,0). 月齢の月係数(4,2). 月齢の月係数(5,2). 月齢の月係数(6,4). 月齢の月係数(7,5). 月齢の月係数(8,6). 月齢の月係数(9,7). 月齢の月係数(10,8), 月齢の月係数(11,9). 月齢の月係数(12,10). '月齢・月名'(1,朔). '月齢・月名'(1,新月). '月齢・月名'(2,既朔). '月齢・月名'(3,三日月). '月齢・月名'(7,上弦). '月齢・月名'(8,上弦). '月齢・月名'(13,十三夜). '月齢・月名'(14,小望月). '月齢・月名'(15,望). '月齢・月名'(15,満月). '月齢・月名'(15,望月). '月齢・月名'(16,十六夜). '月齢・月名'(16,既望). '月齢・月名'(17,立待月). '月齢・月名'(18,居待月). '月齢・月名'(19,寝待月). '月齢・月名'(19,臥待月). '月齢・月名'(20,更待月). '月齢・月名'(22,下限). '月齢・月名'(23,下限). '月齢・月名'(29,晦). '月齢・月名'(30,晦). 月末日整数(_年整数,2,29) :- うるう年(_年整数). 月末日整数(_年整数,2,28) :- \+(うるう年(_年整数)). 月末日整数(_年整数,_月整数,30) :- member(_月整数,[4,6,8,10]). 月末日整数(_年整数,_月整数,31) :- member(_月整数,[1,3,5,7,8,10,12]). うるう年(_年整数) :- 0 is _年整数 mod 400,!. うるう年(_年整数) :- \+(0 is _年整数 mod 100), 0 is _年整数 mod 4. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/874 # # ../test/read.cgi/tech/1357748713/775 # http://pc11.2ch.net/test/read.cgi/tech/1202135539/607 # [1] 授業単元:プログラミング # [2] 問題文 :キーボードから西暦と月を入力するとカレンダーを #       表示するプログラムを作成せよ # キーボードから西暦と月を入力するとカレンダーを表示する :- キーボードから西暦と月を入力すると(_西暦,_月), カレンダーを表示する(_西暦,_月). キーボードから西暦と月を入力すると(_西暦,_月) :- 整数を得る(西暦,true,_西暦), 整数を得る(月,between(1,12,_月),_月). カレンダーを表示する(_西暦,_月) :- カレンダーを(_西暦,_月,_カレンダー), 表示する(_西暦,_月,_カレンダー). カレンダーを(_西暦,_月,_カレンダー) :- 月末日(_西暦,_月,_月末日), 'Zellerの公式を用いて曜日を得る'(_年,_月,1,_曜日を表す値,_曜日), findall(D,between(1,_月末日,D),L1), カレンダーの先頭に0を詰める(L1,L2), '7個組に分解'(L2,_カレンダー). 月末日(_西暦,2,29) :- うるう年(_西暦),!. 月末日(_,2,28) :- !. 月末日(_,_月,31) :- member(_月,[1,3,5,7,8,10,12]),!. 月末日(_,_月,30) :- member(_月,[4,6,9,11]),!. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 'Zellerの公式を用いて曜日を得る'(_年,1,_日,_曜日を表す値,_曜日) :- _年_1 is _年 - 1, 'Zellerの公式を用いて曜日を得る'(_年_1,13,_日,_曜日を表す値,_曜日),!. 'Zellerの公式を用いて曜日を得る'(_年,2,_日,_曜日を表す値,_曜日) :- _年_1 is _年 - 1, 'Zellerの公式を用いて曜日を得る'(_年_1,14,_日,_曜日を表す値,_曜日),!. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 'Zellerの公式で使う曜日を表す値'(_曜日を表す値,_曜日),!. 'Zellerの公式で使う曜日を表す値'(0,日曜). 'Zellerの公式で使う曜日を表す値'(1,月曜). 'Zellerの公式で使う曜日を表す値'(2,火曜). 'Zellerの公式で使う曜日を表す値'(3,水曜). 'Zellerの公式で使う曜日を表す値'(4,木曜). 'Zellerの公式で使う曜日を表す値'(5,金曜). 'Zellerの公式で使う曜日を表す値'(6,土曜). all([],_). all([V|R],V) :- all(R,V). カレンダーの先頭に0を詰める(L1,L2) :- length(L0,_曜日を表す値), append(L0,L1,L2), all(L0,0),!. '7個組に分解'([],[]) :- !. '7個組に分解'([_1,_2,_3,_4,_5,_6,_7|R1],[[_1,_2,_3,_4,_5,_6,_7]|R2]) :- '7個組に分解'(R1,R2),!. '7個組に分解'(L,[L]). 表示する(_西暦,_月,_カレンダー) :- writef('\n%8r年 %t月\n\n',[_西暦,_月]), member(L,_カレンダー), 一行表示する(L), fail. 表示する(_西暦,_月,_カレンダー) :- write('\n'). 一行表示する([]) :- write('\n'). 一行表示する([0|R]) :- writef('%3r',[' ']), 一行表示する(R),!. 一行表示する([N|R]) :- writef('%3r',[N]), 一行表示する(R). % 以下のサイトは うるう年は何回来るか(_年起点,_年終点,_うるう年の回数) :- count(( between(_年起点,_年終点,_年), うるう年(_年)), _うるう年の回数). 'ある日から後の年のある日は何日目か(起点日と終点日はそれぞれ日数に含める)'(_年起点,_月起点,_日起点,_年終点,_月終点,_日終点,_何日目) :- 起点日と終点日はそれぞれ日数に含める, 大晦日は何日目か(_年起点,_月起点,_日起点,_大晦日は何日目), 翌年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目_1), 大晦日は何日目か(_年終点,_月終点,_日終点,_何日目_2), _何日目 is _大晦日は何日目 + _何日目_1 - _何日目_2. 'ある日から後の年のある日は何日目か(起点日と終点日はともに日数に含めない)'(_年起点,_月起点,_日起点,_年終点,_月終点,_日終点,_何日目) :- 起点日と終点日はともに日数に含めない, 大晦日は何日目か(_年起点,_月起点,_日起点,_大晦日は何日目), 翌年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目_1), 大晦日は何日目か(_年終点,_月終点,_日終点,_何日目_2), _何日目 is _大晦日は何日目 + _何日目_1 - _何日目_2 - 2. 'ある日から後の年のある日は何日目か(起点日と終点日のどちらかは日数に含めない)'(_年起点,_月起点,_日起点,_年終点,_月終点,_日終点,_何日目) :- 起点日と終点日はともに日数に含めない, 大晦日は何日目か(_年起点,_月起点,_日起点,_大晦日は何日目), 翌年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目_1), 大晦日は何日目か(_年終点,_月終点,_日終点,_何日目_2), _何日目 is _大晦日は何日目 + _何日目_1 - _何日目_2 - 1. ある年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目) :- うるう年は何回来るか(_年起点,_年終点,_うるう年の回数), '基本は一年365日で計算し、それにうるう年の回数(日数)を加える'(_年起点,_年終点,_うるう年の回数,_何日目). '基本は一年365日で計算し、それにうるう年の回数(日数)を加える'(_年起点,_年終点,_うるう年の回数,_何日目) :- _何日目 is _うるう年の回数 + 365 * (_年終点 - _年起点 + 1). 翌年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目) :- _翌年 is _年起点 + 1, ある年の元旦から後の年の大晦日は何日目か(_翌年,_年終点,_何日目). ある年の元旦から後の年のある日は何日目か(_年起点,_年終点,_月終点,_日終点,_何日目) :- _前年 is _年終点 - 1, ある年の元旦から後の年の大晦日は何日目か(_年起点,_前年,_何日目_1), ある年月日はその年の元旦から何日目か(_年終点,_月終点,_日終点,_何日目_2), _何日目 is _何日目_1 + _何日目_2. ある年月日はその年の元旦から何日目か(_年,_月,_日,_元旦から何日) :- 月日数ならび(_年,_月日数ならび), _前月 is _月 - 1, length(L0,_月), append(L0,_,_月日数ならび), sum(L0,_前月末日までの日数), _元旦から何日 is _前月末日までの日数 + _日. 大晦日は何日目か(_年,_月,_日,_大晦日は何日目) :- 月日数ならび(_年,_月日数ならび), 翌月から一日から大晦日は何日目か(_年,_月,_日,_月日数ならび,_翌月の一日から大晦日は何日目), 今日を含めて今月末日までの日数(_年,_月,_日,_月日数ならび,_今日を含めて今月の末日までの日数), _大晦日は何日目 is _今日を含めて今月の末日までの日数 + _翌月の一日から大晦日は何日目. 翌月から一日から大晦日は何日目か(_年,_月,_日,_月日数ならび,_何日目) :- length(L0,_月), append(L0,_翌月からの月日数ならび,_月日数ならび), sum(_翌月からの月日数ならび,_何日目). 今日を含めて今月末日までの日数(_年,_月,_日,_月日数ならび,_今日を含めて今月の末日までの日数) :- nth1(_月,_月日数ならび,_今月の日数), _今日を含めて今月の末日までの日数 is _今月の日数 - _日 + 1. 明日から今月末日までの日数(_年,_月,_日,_月日数ならび,_明日から今月の末日までの日数) :- nth1(_月,_月日数ならび,_今月の日数), _明日から今月の末日までの日数 is _今月の日数 - _日. 月日数ならび(_年,[31,29,31,30,31,30,31,31,30,31,30,31]) :- うるう年(_年),!. 月日数ならび(_年,[31,28,31,30,31,30,31,31,30,31,30,31]). うるう年(_年文字列) :- atom(_年文字列), atom_to_term(_年文字列,_年整数,_),!, うるう年(_年整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 起点日と終点日はそれぞれ日数に含める. 起点日と終点日はともに日数に含めない. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/94 # # [1] 授業単元: Cコーディング初級 # [2] 問題文(含コード&リンク): # # プログラムを実行した日がその年の第何週目にあるかを終了コードとして整数で返す # # [3] 環境 #  [3.1] OS: Windows #  [3.2] gcc 4.3.4 #  [3.3] 言語: C # [4] 期限: 1/17 # [5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々) time.h を使います # 週の頭は日曜から始まります # 1月1日を含む週に4日以上ある場合に第1週となります # つまり1月1日が日曜から始まっているときはその週が第1週ですが # 1月4日が日曜から始まっているときはその週が第1週になります 'プログラムを実行した日がその年の第何週目にあるかを終了コードとして整数で返す 週の頭は日曜から始まります 1月1日を含む週に4日以上ある場合に第1週となります つまり1月1日が日曜から始まっているときはその週が第1週ですが 1月4日が日曜から始まっているときはその週が第1週になります'(_その年の第何週目) :- プログラムを実行した日が(_年,_月,_日), 'その年の第何週目にあるかを終了コードとして整数で返す 1月1日を含む週に4日以上ある場合に第1週となります つまり1月1日が日曜から始まっているときはその週が第1週ですが 1月4日が日曜から始まっているときはその週が第1週になります'(_年,_月,_日,_その年の第何週目). プログラムを実行した日が(_年,_月,_日) :- date(_年,_月,_日). 'その年の第何週目にあるかを終了コードとして整数で返す 1月1日を含む週に4日以上ある場合に第1週となります つまり1月1日が日曜から始まっているときはその週が第1週ですが 1月4日が日曜から始まっているときはその週が第1週になります'(_年,_月,_日,_その年の第何週目) :- 'Zellerの公式を用いて曜日を得る'(_年,1,1,_曜日を表す値,_曜日), _曜日を表す値 >= 4, _今年に入ってからの第一週以前の日数 is 7 - _曜日を表す値, 一月一日からの累積日数(_年,_月,_日,_一月一日からの累積日数), _その年の第何週目 is (_一月一日からの累積日数 - _今年に入ってからの第一週以前の日数) // 7 + 1. 'その年の第何週目にあるかを終了コードとして整数で返す 1月1日を含む週に4日以上ある場合に第1週となります つまり1月1日が日曜から始まっているときはその週が第1週ですが 1月4日が日曜から始まっているときはその週が第1週になります'(_年,_月,_日,_その年の第何週目) :- 'Zellerの公式を用いて曜日を得る'(_年,1,1,_曜日を表す値,_曜日), _曜日を表す値 < 4, 一月一日からの累積日数(_年,_月,_日,_一月一日からの累積日数), _その年の第何週目 is _一月一日からの累積日数 // 7 + 1. 一月一日からの累積日数(_年,_月,_日,_一月一日からの累積日数) :- うるう年(_年), findsum(_日数,( nth1(_nth1,[31,29,31,30,31,30,31,31,30,31,31],_日数), _nth1 < _月), 累積日数_1), _累積日数 is _累積日数 + _日. 一月一日からの累積日数(_年,_月,_日,_一月一日からの累積日数) :- \+(うるう年(_年)), findsum(_日数,( nth1(_nth1,[31,28,31,30,31,30,31,31,30,31,31],_日数), _nth1 < _月), 累積日数_1), _累積日数 is _累積日数 + _日. 'Zellerの公式を用いて曜日を得る'(_年,1,_日,_曜日を表す値,_曜日) :- _年_1 is _年 - 1, 'Zellerの公式を用いて曜日を得る'(_年_1,13,_日,_曜日を表す値,_曜日),!. 'Zellerの公式を用いて曜日を得る'(_年,2,_日,_曜日を表す値,_曜日) :- _年_1 is _年 - 1, 'Zellerの公式を用いて曜日を得る'(_年_1,14,_日,_曜日を表す値,_曜日),!. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 'Zellerの公式で使う曜日を表す値'(_曜日を表す値,_曜日),!. 'Zellerの公式で使う曜日を表す値'(0,'日曜'). 'Zellerの公式で使う曜日を表す値'(1,'月曜'). 'Zellerの公式で使う曜日を表す値'(2,'火曜'). 'Zellerの公式で使う曜日を表す値'(3,'水曜'). 'Zellerの公式で使う曜日を表す値'(4,'木曜'). 'Zellerの公式で使う曜日を表す値'(5,'金曜'). 'Zellerの公式で使う曜日を表す値'(6,'土曜'). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100, !,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/641 # # [1] C言語 # [2] http://ime.nu/ideone.com/m8dZRの関数を利用して、 #   キーボードから日付を読み込んで、その次の日を求める #   プログラムを作成しなさい。 # # 実行例 # --------------------- # 年月日:20120913 # # 次の日は:2012/09/14 # --------------------- # # [3.1] Windows7 # [3.3] C言語 # [4] 9/13 19:00まで # # 'キーボードから日付を読み込んで、その次の日を求める' :- 'キーボードから日付を読み込んで'(_日付文字列), その次の日を求める(_日付文字列,_次の日文字列), writef('次の日は:%t\n',[_次の日文字列]). 'キーボードから日付を読み込んで'(_日付文字列) :- write('日付を文字列8桁で入力してください : '), get_line(_日付文字列), atom(_日付文字列), atom_length(_日付文字列,8),!. 'キーボードから日付を読み込んで'(_日付文字列) :- 'キーボードから日付を読み込んで'(_日付文字列). その次の日を求める(_日付文字列,_次の日文字列) :- sub_atom(_日付文字列,0,4,_,_年), sub_atom(_日付文字列,4,2,_,_月), sub_atom(_日付文字列,6,2,_,_日), その次の日を求める(_年,_月,_日,_次の日文字列). その次の日を求める(_年,'12','31',_次の日文字列) :- 翌年の一月一日(_年,_次の日文字列),!. その次の日を求める(_年,'02','29',_次の日文字列) :- 同年の三月一日(_年,_次の日文字列),!. その次の日を求める(_年,'02','28',_次の日文字列) :- \+(うるう年(_年)), 同年の三月一日(_年,_次の日文字列),!. その次の日を求める(_年,_月,'31',_次の日文字列) :- 大の月(_月), ここでは12月は除外する(_月), 翌月の一日(_年,_月,_次の文字列),!. その次の日を求める(_年,_月,'30',_次の日文字列) :- 小の月(_月), ここでは2月は除外する(_月), 翌月の一日(_年,_月,_次の日文字列),!. その次の日を求める(_年,_月,_日,_次の日文字列) :- 同年同月の次の日(_年,_月,_日,_次の日文字列). 翌年の一月一日(_年,_翌年の一月一日) :- 翌年(_年,_翌年), atomic_list_concat([_翌年,'0101'],_翌年の一月一日). 同年の三月一日(_年,_同年の三月一日) :- atomic_list_concat([_年,'0301'],_同年の三月一日). 翌月の一日(_年,_月,_翌月の一日) :- 翌月(_月,_翌月), atomic_list_concat([_年,_翌月,'01'],_翌月の一日). 同年同月の次の日(_年,_月,_日,_同年同月の次の日) :- 翌日(_日,_翌日), atomic_list_concat([_年,_月,_翌日],_同年同月の次の日). 大の月(_月) :- member(_月,['01','03','05','07','08','10','12']). 小の月(_月) :- member(_月,['02','04','06','09','11']). ここでは12月は除外する(_月) :- \+(_月 == '12'). ここでは2月は除外する(_月) :- \+(_月 == '02'). うるう年(_年文字列) :- atom(_年文字列), atom_number(_年文字列,_年整数), !, うるう年(_年整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100, !,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 翌年(_年,_翌年) :- atom_number(_年,_年整数), _翌年整数 is _年整数 + 1, 頭部零文字列に変換(4,_翌年整数,_翌年). 翌月('01','02'). 翌月('02','03'). 翌月('03','04'). 翌月('04','05'). 翌月('05','06'). 翌月('06','07'). 翌月('07','08'). 翌月('08','09'). 翌月('09','10'). 翌月('10','11'). 翌月('11','12'). 翌月('12','01'). 翌日('01','02'). 翌日('02','03'). 翌日('03','04'). 翌日('04','05'). 翌日('05','06'). 翌日('06','07'). 翌日('07','08'). 翌日('08','09'). 翌日('09','10'). 翌日('10','11'). 翌日('11','12'). 翌日('12','13'). 翌日('13','14'). 翌日('14','15'). 翌日('15','16'). 翌日('16','17'). 翌日('17','18'). 翌日('18','19'). 翌日('19','20'). 翌日('20','21'). 翌日('21','22'). 翌日('22','23'). 翌日('23','24'). 翌日('24','25'). 翌日('25','26'). 翌日('26','27'). 翌日('27','28'). 翌日('28','29'). 翌日('29','30'). 翌日('30','31'). 翌日('31','01'). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/641 # # [1] C言語 # [2] http://ime.nu/ideone.com/m8dZRの関数を利用して、 #   キーボードから日付を読み込んで、その次の日を求める #   プログラムを作成しなさい。 # # 実行例 # --------------------- # 年月日:20120913 # # 次の日は:2012/09/14 # --------------------- # # [3.1] Windows7 # [3.3] C言語 # [4] 9/13 19:00まで # # 'キーボードから日付を読み込んで、その次の日を求める' :- 'キーボードから日付を読み込んで'(_日付文字列), その次の日(_日付文字列,_次の日文字列), writef('次の日は:%t\n',[_次の日文字列]). 'キーボードから日付を読み込んで'(_日付文字列) :- write('日付を文字列8桁で入力してください : '), get_line(_日付文字列), atom(_日付文字列), atom_length(_日付文字列,8),!. 'キーボードから日付を読み込んで'(_日付文字列) :- 'キーボードから日付を読み込んで'(_日付文字列). その次の日(_日付文字列,_次の日文字列) :- sub_atom(_日付文字列,4,4,0,'1231'), 翌年の一月一日(_日付文字列,_次の日文字列). その次の日(_日付文字列,_次の日文字列) :- 二月(_日付文字列), うるう年(_日付文字列), 二十九日(_日付文字列), 同年の三月一日(_日付文字列,_次の日文字列). その次の日(_日付文字列,_次の日文字列) :- 二月(_日付文字列), \+(うるう年(_日付文字列)), 二十八日(_日付文字列), 同年の三月一日(_日付文字列,_次の日文字列). その次の日(_日付文字列,_次の日文字列) :- 大の月(_日付文字列), 三十一日(_日付文字列), 翌月の一日(_日付文字列,_次の文字列). その次の日(_日付文字列,_次の日文字列) :- 小の月(_日付文字列), 三十日(_日付文字列), 翌月の一日(_日付文字列,_次の日文字列). その次の日(_日付文字列,_次の日文字列) :- 同年同月の次の日(_日付文字列,_次の日文字列). 翌年の一月一日(_日付文字列,_翌年の一月一日) :- sub_atom(_日付文字列,0,4,_,_年), 翌年(_年,_翌年), atomic_list_concat([_翌年,'0101'],_翌年の一月一日). 同年の三月一日(_日付文字列,_同年の三月一日) :- sub_atom(_日付文字列,0,4,_,_年), atomic_list_concat([_年,'0301'],_同年の三月一日). 翌月の一日(_日付文字列,_翌月の一日) :- sub_atom(_日付文字列,0,4,_,_年), sub_atom(_日付文字列,4,2,_,_月), 翌月(_月,_翌月), atomic_list_concat([_年,_翌月,'01'],_翌月の一日). 同年同月の次の日(_日付文字列,_同年同月の次の日) :- sub_atom(_日付文字列,0,6,_年月), sub_atom(_日付文字列,6,2,_日), 翌日(_日,_翌日), atomic_list_concat([_年月,_翌日],_同年同月の次の日). 二月(_日付文字列) :- sub_atom(_日付文字列,4,2,_,'02'). 十二月(_日付文字列) :- sub_atom(_日付文字列,4,2,_,'12'). 三十一日(_日付文字列) :- sub_atom(_日付文字列,6,2,_,'31'). 三十日(_日付文字列) :- sub_atom(_日付文字列,6,2,_,'30'). 二十九日(_日付文字列) :- sub_atom(_日付文字列,6,2,_,'29'). 二十八日(_日付文字列) :- sub_atom(_日付文字列,6,2,_,'28'). 大の月(_日付文字列) :- sub_atom(_日付文字列,4,2,_,_月), member(_月,['01','03','05','07','08','10','12']), ここでは12月は除外する(_月). 小の月(_日付文字列) :- sub_atom(_日付文字列,4,2,_,_月), member(_月,['02','04','06','09','11']), ここでは2月は除外する(_月). ここでは12月は除外する(_月) :- \+(_月 == '12'). ここでは2月は除外する(_月) :- \+(_月 == '02'). うるう年(_年) :- atom(_年), atom_length(_年,4), atom_number(_年,_年整数), うるう年(_年整数) . うるう年(_日付文字列) :- atom(_日付文字列), atom_length(_日付文字列,8), sub_atom(_日付文字列,0,4,_,_年), atom_number(_年,_年整数), うるう年(_年整数) . うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100, !,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 翌年(_年,_翌年) :- atom_number(_年,_年整数), _翌年整数 is _年整数 + 1, atom_number(_翌年,_翌年整数). 翌月('01','02'). 翌月('02','03'). 翌月('03','04'). 翌月('04','05'). 翌月('05','06'). 翌月('06','07'). 翌月('07','08'). 翌月('08','09'). 翌月('09','10'). 翌月('10','11'). 翌月('11','12'). 翌月('12','01'). 翌日('01','02'). 翌日('02','03'). 翌日('03','04'). 翌日('04','05'). 翌日('05','06'). 翌日('06','07'). 翌日('07','08'). 翌日('08','09'). 翌日('09','10'). 翌日('10','11'). 翌日('11','12'). 翌日('12','13'). 翌日('13','14'). 翌日('14','15'). 翌日('15','16'). 翌日('16','17'). 翌日('17','18'). 翌日('18','19'). 翌日('19','20'). 翌日('20','21'). 翌日('21','22'). 翌日('22','23'). 翌日('23','24'). 翌日('24','25'). 翌日('25','26'). 翌日('26','27'). 翌日('27','28'). 翌日('28','29'). 翌日('29','30'). 翌日('30','31'). 翌日('31','01'). % 以下のサイトは # 出典:: http://arc002.contest.atcoder.jp/tasks/arc002_1 # # AtCoder Regular Contest #002 # A - うるう年 # 時間制限 : 2sec / スタック制限 : 10MB / メモリ制限 : 64MB # # 問題文 # # 高橋君は忘れっぽい性格なので、うるう年は 2 月 29 日の存在を毎回忘れてしまいます。 # そこで、自動でうるう年かどうかをコンピュータに教えてもらえるようにしたいと思います。 # 入力として与えられた年がうるう年かそうでないかを判断しなさい。 # # ただし、うるう年は以下の規則で決定します。 # 規則 1:4 で割り切れる年はうるう年である。 # 規則 2:100 で割り切れる年はうるう年ではない。 # 規則 3:400 で割り切れる年はうるう年である。 # 規則 4:規則 1〜3 のいずれも満たさない場合は,うるう年ではありません。 # ただし、規則 1 〜 3 の内に複数満たすものがあれば後の規則(数字の大きな規則)が優先されます。 例えば、2000 年は規則 3 を満たすのでうるう年です。 # 2100 年は規則 2 を満たしますが、規則 3 を満たさないのでうるう年ではありません。 高橋君の備忘録(うるう年,_年) :- うるう年(_年). うるう年(_年) :- 'うるう年は規則 1 〜 4 によって決定します。ただし、規則 1 〜 3 の内に複数満たすものがあれば後の規則(数字の大きな規則)が優先されます。'(_年). 'うるう年は規則 1 〜 4 によって決定します。ただし、規則 1 〜 3 の内に複数満たすものがあれば後の規則(数字の大きな規則)が優先されます。'(_年) :- '規則 3:400 で割り切れる年はうるう年である。'(_年). 'うるう年は規則 1 〜 4 によって決定します。ただし、規則 1 〜 3 の内に複数満たすものがあれば後の規則(数字の大きな規則)が優先されます。'(_年) :- '規則 2:100 で割り切れる年はうるう年ではない。'(_年),!, fail. 'うるう年は規則 1 〜 4 によって決定します。ただし、規則 1 〜 3 の内に複数満たすものがあれば後の規則(数字の大きな規則)が優先されます。'(_年) :- '規則 1:4 で割り切れる年はうるう年である。'(_年),!. 'うるう年は規則 1 〜 4 によって決定します。ただし、規則 1 〜 3 の内に複数満たすものがあれば後の規則(数字の大きな規則)が優先されます。'(_年) :- '規則 4:規則 1〜3 のいずれも満たさない場合は,うるう年ではありません。'(_年),!, fail. '規則 1:4 で割り切れる年はうるう年である。'(_年) :- 0 =:= _年 mod 4. '規則 2:100 で割り切れる年はうるう年ではない。'(_年) :- 0 =:= _年 mod 100. '規則 3:400 で割り切れる年はうるう年である。'(_年) :- 0 =:= _年 mod 400. '規則 4:規則 1〜3 のいずれも満たさない場合は,うるう年ではありません。'(_年) :- \+('規則 1:4 で割り切れる年はうるう年である。'(_年)), \+('規則 3:400 で割り切れる年はうるう年である。'(_年)), \+('規則 2:100 で割り切れる年はうるう年ではない。'(_年)),!, fail. % 以下のサイトは # 出典:: http://arc002.contest.atcoder.jp/tasks/arc002_1 # # AtCoder Regular Contest #002 # A - うるう年 # 時間制限 : 2sec / スタック制限 : 10MB / メモリ制限 : 64MB # # 問題文 # # 高橋君は忘れっぽい性格なので、うるう年は 2 月 29 日の存在を毎回忘れてしまいます。 # そこで、自動でうるう年かどうかをコンピュータに教えてもらえるようにしたいと思います。 # 入力として与えられた年がうるう年かそうでないかを判断しなさい。 # # ただし、うるう年は以下の規則で決定します。 # 規則 1:4 で割り切れる年はうるう年である。 # 規則 2:100 で割り切れる年はうるう年ではない。 # 規則 3:400 で割り切れる年はうるう年である。 # 規則 4:規則 1〜3 のいずれも満たさない場合は,うるう年ではありません。 # ただし、規則 1 〜 3 の内に複数満たすものがあれば後の規則(数字の大きな規則)が優先されます。 例えば、2000 年は規則 3 を満たすのでうるう年です。 # 2100 年は規則 2 を満たしますが、規則 3 を満たさないのでうるう年ではありません。 うるう年(_年) :- '規則 4:規則 1〜3 のいずれも満たさない場合は,うるう年ではありません。'(_年),!, fail. うるう年(_年) :- 'ただし、規則 1 〜 3 の内に複数満たすものがあれば後の規則(数字の大きな規則)が優先されます。'(_年). '規則 4:規則 1〜3 のいずれも満たさない場合は,うるう年ではありません。'(_年) :- \+('規則 1:4 で割り切れる年はうるう年である。'(_年)), \+('規則 3:400 で割り切れる年はうるう年である。'(_年)), \+('規則 2:100 で割り切れる年はうるう年ではない。'(_年)). '規則 1:4 で割り切れる年はうるう年である。'(_年) :- 0 =:= _年 mod 4. '規則 2:100 で割り切れる年はうるう年ではない。'(_年) :- 0 =:= _年 mod 100. '規則 3:400 で割り切れる年はうるう年である。'(_年) :- 0 =:= _年 mod 400. 'ただし、規則 1 〜 3 の内に複数満たすものがあれば後の規則(数字の大きな規則)が優先されます。'(_年) :- '規則 3:400 で割り切れる年はうるう年である。'(_年). 'ただし、規則 1 〜 3 の内に複数満たすものがあれば後の規則(数字の大きな規則)が優先されます。'(_年) :- '規則 2:100 で割り切れる年はうるう年ではない。'(_年),!, fail. 'ただし、規則 1 〜 3 の内に複数満たすものがあれば後の規則(数字の大きな規則)が優先されます。'(_年) :- '規則 1:4 で割り切れる年はうるう年である。'(_年). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/707 # # 問題 # 明日が何曜日なのか表示せよ。 # % % SWI-Prologで明日はどうやって取得するのか。今日は date/1 で取得できる。 % '明日が何曜日なのか表示せよ。' :- date(date(_今日の年,_今日の月,_今日の日)), 翌日(_今日の年,_今日の月,_今日の日,_翌日の年,_翌日の月,_翌日の日), day_of_the_week(date(_翌日の年,_翌日の月,_翌日の日),_曜日番号), nth0(_曜日番号,[日曜,月曜,火曜,水曜,木曜,金曜,土曜],_曜日), writef('%t',[_曜日]). 翌日(_今日の年,12,31,_翌日の年,1,1) :- _翌日の年 is _今日の年 + 1,!. 翌日(_年,_今日の月,_今日の日,_年,_翌日の月,1) :- 月末日(_年,_今日の月,_今日の日), _翌日の月 is _今日の月 + 1,!. 翌日(_年,_月,_今日の日,_年,_月,_翌日の日) :- _翌日の日 is _今日の日 + 1. 月末日(_,2,29) :- !. 月末日(_年,2,28) :- \+(うるう年(_年)),!. 月末日(_,_今日の月,31) :- !. 月末日(_,_今日の月,30) :- member(_今日の月,[4,6,9,11]),!. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. うるう年(_年) :- \+(0 is _年 mod 4). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/77 # # [1] 授業単元: 数値解析 # [2] 問題文(含コード&リンク): # 表示や入力を目的とする関数以外では、関数の中で標準入力や # 標準出力への入出力は行わないこと. # 西暦の年を引数にとり、うるう年ならば1を返し、そうでないならば0を # 返す関数intercalary_year()を作成しなさい。 # 西暦が4の倍数ならばうるう年である。 # ただし、100の倍数ならばうるう年ではなく、 # さらに、400の倍数ならばうるう年である。 # # #  [3.1] OS:Linux #  [3.2] コンパイラ名とバージョン:gcc #  [3.3] 言語: c言語 # [4] 期限: 6月20日 # お手数ですが、よろしくお願いします。 # # '西暦の年を引数にとり、うるう年ならば真、うるう年でなければ偽となる述語 うるう年/1 を作成しなさい。西暦が4の倍数ならばうるう年である。ただし、100の倍数ならばうるう年ではなく、さらに、400の倍数ならばうるう年である。'(_西暦,_診断) :- うるう年(_西暦). うるう年(_西暦) :- '西暦が4の倍数ならばうるう年である。ただし、100の倍数ならばうるう年ではなく、さらに、400の倍数ならばうるう年である。'(_西暦). '西暦が4の倍数ならばうるう年である。ただし、100の倍数ならばうるう年ではなく、さらに、400の倍数ならばうるう年である。'(_西暦) :- '西暦が4の倍数ならば'(_西暦), 'ただし、100の倍数ならばうるう年ではなく'(_西暦),!. '西暦が4の倍数ならばうるう年である。ただし、100の倍数ならばうるう年ではなく、さらに、400の倍数ならばうるう年である。'(_西暦) :- 'さらに、400の倍数ならばうるう年である'(_西暦). '西暦が4の倍数ならば'(_西暦) :- 0 is _西暦 mod 4. 'ただし、100の倍数ならばうるう年ではなく'(_西暦) :- 0 is _西暦 mod 100, fail. 'ただし、100の倍数ならばうるう年ではなく'(_西暦) :- \+(0 is _西暦 mod 100). 'さらに、400の倍数ならばうるう年である'(_西暦) :- 0 is _西暦 mod 400. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/77 # # [1] 授業単元: 数値解析 # [2] 問題文(含コード&リンク): # 表示や入力を目的とする関数以外では、関数の中で標準入力や # 標準出力への入出力は行わないこと. # 西暦の年を引数にとり、うるう年ならば1を返し、そうでないならば0を # 返す関数intercalary_year()を作成しなさい。 # 西暦が4の倍数ならばうるう年である。 # ただし、100の倍数ならばうるう年ではなく、 # さらに、400の倍数ならばうるう年である。 # # #  [3.1] OS:Linux #  [3.2] コンパイラ名とバージョン:gcc #  [3.3] 言語: c言語 # [4] 期限: 6月20日 # お手数ですが、よろしくお願いします。 # # '西暦の年を引数にとり、うるう年ならば1を返し、そうでないならば0を返す述語 うるう年/2 を作成しなさい。西暦が4の倍数ならばうるう年である。ただし、100の倍数ならばうるう年ではなく、さらに、400の倍数ならばうるう年である。'(_西暦,_診断) :- うるう年(_西暦,_診断). うるう年(_西暦,1) :- '西暦が4の倍数ならばうるう年である。ただし、100の倍数ならばうるう年ではなく、さらに、400の倍数ならばうるう年である。'(_西暦),!. うるう年(_西暦,0). '西暦が4の倍数ならばうるう年である。ただし、100の倍数ならばうるう年ではなく、さらに、400の倍数ならばうるう年である。'(_西暦) :- '西暦が4の倍数ならば'(_西暦), 'ただし、100の倍数ならばうるう年ではなく'(_西暦),!. '西暦が4の倍数ならばうるう年である。ただし、100の倍数ならばうるう年ではなく、さらに、400の倍数ならばうるう年である。'(_西暦) :- 'さらに、400の倍数ならばうるう年である'(_西暦). '西暦が4の倍数ならば'(_西暦) :- 0 is _西暦 mod 4. 'ただし、100の倍数ならばうるう年ではなく'(_西暦) :- 0 is _西暦 mod 100, fail. 'ただし、100の倍数ならばうるう年ではなく'(_西暦) :- \+(0 is _西暦 mod 100). 'さらに、400の倍数ならばうるう年である'(_西暦) :- 0 is _西暦 mod 400. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/662 # # MySQL5 # # 開始日、終了日を持ったテーブルを日付単位に表示したいです。 # tbl_job は、以下の構造です。 # # id, name, start_date, end_date # --------------------------- # 1, JOB1, 2012-04-01, 2012-04-03 # 2, JOB2, 2012-04-02, 2012-04-04 # # 上記テーブルから以下のように日付単位でJOBを表示するSQLを教えてほしいです。 # # date, id, name # -------------------- # 2012-04-01, 1, JOB1 # 2012-04-02, 1, JOB1 # 2012-04-02, 2, JOB2 # 2012-04-03, 1, JOB1 # 2012-04-03, 2, JOB2 # 2012-04-04, 2, JOB2 # # '開始日、終了日を持ったテーブルを日付単位に表示したい' :- 日付単位tbl_jobの生成(_日付単位tbl_jobならび), findsetof(_日付,( member([_date,_,_],_日付単位tbl_jobならび)), _日付ならび), 日付単位に表示する(_日付ならび,_日付単位tbl_jobならび). 日付単位tbl_jobの生成(_日付単位tbl_jobならび) :- findall(_日付,( tbl_job(_id,_name,_start_date,_end_date), 日付の生成(_start_date,_end_date,_日付)), _日付単位tbl_jobならび). 日付の生成(_終了年-_終了月-_終了日,_終了年-_終了月-_終了日,_終了年-_終了月-_終了日) :- !. 日付の生成(_開始年-_開始月-_開始日,_終了年-_終了月-_終了日,_開始年-_開始月-_開始日). 日付の生成(_開始年-_開始月-_開始日,_終了年-_終了月-_終了日,_年-_月-_日) :- 翌日(_開始年,_開始月,_開始日,_翌日年,_翌日月,_翌日日), 日付の生成(_翌日年-_翌日月-_翌日日,_終了年-_終了月-_終了日,_年-_月-_日). 翌日(_年,12,31,_翌年,1,1) :- !. 翌日(_年,_月,30,_年,_翌月,1) :- member(_月,[4,6,9,11]), _翌月 is _月 + 1,!. 翌日(_年,_月,31,_年,_翌月,1) :- _翌月 is _月 + 1,!. 翌日(_年,2,29,_年,3,1) :- !. 翌日(_年,2,28,_年,3,1) :- \+(うるう年(_年)), 翌日(_年,_月,_日,_年,_月,_翌日) :- _翌日 is _日 + 1. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 日付単位に表示する(_日付ならび,_日付単位tbl_jobならび) :- member(_日付,_日付ならび), member([_日付,_id,_name],_日付単位tbl_jobならび), 日付の形式を整えながら一行表示する(_日付,_id,_name), fail. 日付単位に表示する(_日付ならび,_日付単位tbl_jobならび). 日付の形式を整えながら一行表示する(_年-_月-_日,_id,_name) :- swritef(S,'%2r-%2r-%2r',[_年-_月-_日]), 空白を0に置換した日付文字列(S,_空白を0に置換した日付文字列), writef('%t, %t, %t\n',[_空白を0に置換した日付文字列,_id,_name). 空白を0に置換した日付文字列(S,_空白を0に置換した日付文字列) :- findall(_文字_2,( sub_atom(S,_,1,_,_文字), 空白を0に置換(_文字,_文字_2)), _空白を0に置換した日付文字列). 空白を0に置換(' ','0') :- !. 空白を0に置換(A,A). % 以下のサイトは 'その月の最終日(整数)'(_,1,31). 'その月の最終日(整数)'(_年,2,29) :- うるう年(_年). 'その月の最終日(整数)'(_年,2,28) :- \+(うるう年(_年)). 'その月の最終日(整数)'(_,3,31). 'その月の最終日(整数)'(_,4,30). 'その月の最終日(整数)'(_,5,31). 'その月の最終日(整数)'(_,6,30). 'その月の最終日(整数)'(_,7,31). 'その月の最終日(整数)'(_,8,31). 'その月の最終日(整数)'(_,9,30). 'その月の最終日(整数)'(_,10,31). 'その月の最終日(整数)'(_,11,30). 'その月の最終日(整数)'(_,12,31). うるう年(_年文字列) :- atom(_年文字列), atom_to_term(_年文字列,_年整数,_), !, うるう年(_年整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100, !, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは その月の最終日(_,'01','31'). その月の最終日(_年,'02','29') :- うるう年(_年). その月の最終日(_年,'02','28') :- \+(うるう年(_年)). その月の最終日(_,'03','31'). その月の最終日(_,'04','30'). その月の最終日(_,'05','31'). その月の最終日(_,'06','30'). その月の最終日(_,'07','31'). その月の最終日(_,'08','31'). その月の最終日(_,'09','30'). その月の最終日(_,'10','31'). その月の最終日(_,'11','30'). その月の最終日(_,'12','31'). うるう年(_年文字列) :- atom(_年文字列), atom_to_term(_年文字列,_年整数,_), !, うるう年(_年整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100, !, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/638 # # mysql 5.5.10 # # table hogehoge # inputdate data1 data2 data3 # 2012-02-16 ssssss wwwww yyyyyy # 2012-02-17 xxxxxx xxxxx xxxxx # 2012-02-18 null aaaaa vvvvv # 2012-02-19 null null null # 2012-02-20 null null null # 2012-02-21 null null null # 2012-02-22 xxxxxx ccccc fffff # # とある時に、指定日の前日のデータが欲しい # 例でいうなら # data1について、 # 2012-02-17を指定することによって2012-02-16のssssssを、 # 2012-02-22の日付を指定して2012-02-17のxxxxxxが得られ # るようにしたいのですが。 # # よろしくお願いします # 指定日の前日のデータが欲しい(_指定日,_指定日の前日,_data1,_data2,_data3) :- 指定日の前日(_指定日,_指定日の前日), hogehoge(_指定日の前日,_data1,_data2,_data3). 指定日の前日(_指定日,_指定日の前日) :- 指定日から年取得(_指定日,_年), 指定日から月取得(_指定日,_月), 指定日から日取得(_指定日,_日), 指定日の前日(_年,_月,_日,_指定日の前日). 指定日の前日(_年,'01','01',_指定日の前日) :- 前年(_年,_前年), atomic_list_concat([_前年,-,'12',-,'31'],_指定日の前日),!. 指定日の前日(_年,_月,'01',_指定日の前日) :- member(_月,['05','07','08','10','12']), 前月(_月,_前月), atomic_list_concat([_年,-,_前月,-,'30'],_指定日の前日),!. 指定日の前日(_年,_月,'01',_指定日の前日) :- member(_月,['02','04','06','09','11']), 前月(_月,_前月), atomic_list_concat([_年,-,_前月,-,'31'],_指定日の前日),!. 指定日の前日(_年,'03','01',_指定日の前日) :- atom_to_term(_年,_年整数,_), うるう年(_年整数), atomic_list_concat([_年,-,'02',-,'29'],_指定日の前日),!. 指定日の前日(_年,'03','01',_指定日の前日) :- atom_to_term(_年,_年整数,_), \+(うるう年(_年整数)), atomic_list_concat([_年,-,'02',-,'28'],_指定日の前日),!. 指定日の前日(_年,_月,_日,_指定日の前日) :- 二桁日文字列の前日文字列(_日,_前日文字列), atomic_list_concat([_年,-,_月,-,_前日文字列],_指定日の前日). 指定日から年取得(_指定日,_年) :- sub_atom(_指定日,0,4,_,_年). 指定日から月取得(_指定日,_月) :- sub_atom(_指定日,5,2,_,_月). 指定日から日取得(_指定日,_日) :- sub_atom(_指定日,8,2,_,_日). 前年(_年,_前年) :- atom_to_term(_年,_年整数), _前年整数 is _年整数 - 1, swritef(_前年,'%t',[_前年整数]). 前月('12','11'). 前月('11','10'). 前月('10','09'). 前月('09','08'). 前月('08','07'). 前月('07','06'). 前月('06','05'). 前月('05','04'). 前月('04','03'). 前月('03','02'). 前月('02','01'). 二桁日文字列の前日文字列('31','30'). 二桁日文字列の前日文字列('30','29'). 二桁日文字列の前日文字列('29','28'). 二桁日文字列の前日文字列('28','27'). 二桁日文字列の前日文字列('27','26'). 二桁日文字列の前日文字列('26','25'). 二桁日文字列の前日文字列('25','24'). 二桁日文字列の前日文字列('24','23'). 二桁日文字列の前日文字列('23','22'). 二桁日文字列の前日文字列('22','21'). 二桁日文字列の前日文字列('21','20'). 二桁日文字列の前日文字列('20','19'). 二桁日文字列の前日文字列('19','18'). 二桁日文字列の前日文字列('18','17'). 二桁日文字列の前日文字列('17','16'). 二桁日文字列の前日文字列('16','15'). 二桁日文字列の前日文字列('15','14'). 二桁日文字列の前日文字列('14','13'). 二桁日文字列の前日文字列('13','12'). 二桁日文字列の前日文字列('12','11'). 二桁日文字列の前日文字列('11','10'). 二桁日文字列の前日文字列('10','09'). 二桁日文字列の前日文字列('09','08'). 二桁日文字列の前日文字列('08','07'). 二桁日文字列の前日文字列('07','06'). 二桁日文字列の前日文字列('06','05'). 二桁日文字列の前日文字列('05','04'). 二桁日文字列の前日文字列('04','03'). 二桁日文字列の前日文字列('03','02'). 二桁日文字列の前日文字列('02','01'). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは # # localtime/8 localtime/9 を定義する # localtime(_年,_月,_日,_曜日,_累計日数,_時,_分,_秒) :- get_time(Time), グリニッヂ時と地域時間の差(_グリニッヂ時との時間差), _地域秒 is truncate(Time) + _グリニッヂ時との時間差, localtime(_地域秒,_年,_月,_日,_曜日,_累計日数,_時,_分,_秒). localtime(_地域秒,_年,_月,_日,_曜日,_累計日数,_時,_分,_秒) :- localtime(1970,0,_地域秒,L), last(L,[_年,_開始秒]), _当年累秒数 is _地域秒 - _開始秒, '_年,_月,_日,_曜日,_累計日数,_時,_分,_秒を計算する'(_当年累秒数,_年,_月,_日,_曜日,_累計日数,_時,_分,_秒),!. localtime(_年,_開始秒,_現在秒,[]) :- _開始秒 > _現在秒,!. localtime(_年,_開始秒,_現在秒,[[_年,_開始秒]|R]) :- 年間秒(_年,_年間秒), _開始秒_2 is _開始秒 + _年間秒, _年_2 is _年 + 1, localtime(_年_2,_開始秒_2,_現在秒,R). 月初めの年初来の累秒数(_年,_月,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数) :- うるう年(_年), うるう年の月の年初来の累秒数(_年,_月,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数). 月初めの年初来の累秒数(_年,_月,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数) :- \+(うるう年(_年)), うるう年でない年の月の年初来の累秒数(_年,_月,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数). うるう年の月の年初来の累秒数(_年,_月,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数) :- 月初めの累積日数(_年,_月,[0,31,29,31,30,31,30,31,31,30,31,30],_月初めの累積日数), nth1(_月,[31,29,31,30,31,30,31,31,30,31,30,31,31],_月日数), _月初めの年初来の累秒数 is 86400 * _月初めの累積日数, _月末の年初来の累秒数 is _月初めの年初来の累秒数 + 86400 * _月日数. うるう年でない年の月の年初来の累秒数(_年,_月,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数) :- 月初めの累積日数(_年,_月,[0,31,28,31,30,31,30,31,31,30,31,30],_月初めの累積日数), nth1(_月,[31,28,31,30,31,30,31,31,30,31,30,31,31],_月日数), _月初めの年初来の累秒数 is 86400 * _月初めの累積日数, _月末の年初来の累秒数 is _月初めの年初来の累秒数 + 86400 * _月日数. 月初めの累積日数(_年,_月,_0から始まる月日数ならび,_月初めの累積日数) :- findsum(_日数,( between(1,_月,N), nth1(N,_0から始まる月日数ならび,_日数)), _月初めの累積日数_1), _月初めの累積日数 is truncate(_月初めの累積日数_1). '_年,_月,_日,_曜日,_累計日数,_時,_分,_秒を計算する'(_当年累秒数,_年,_月,_日,_曜日を表す値,_累計日数,_時,_分,_秒) :- '当年累積秒と月初めの年初来の累積秒と月末の年初来の累積秒から_月を得る'(_当年累秒数,_年,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数,_月), '_当年累積秒と_月初めの年初来の累積秒から_月,_日,_時,_分,_秒,を求める'(_当年累秒数,_月初めの年初来の累秒数,_月,_日,_時,_分,_秒), _累計日数 is _月初めの累積日数 + _日, 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日),!. '当年累積秒と月初めの年初来の累積秒と月末の年初来の累積秒から_月を得る'(_当年累秒数,_年,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数,_月) :- between(1,12,_月), 月初めの年初来の累秒数(_年,_月,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数), _当年累秒数 >= _月初めの年初来の累秒数, _当年累秒数 =< _月末の年初来の累秒数,!. '_当年累積秒と_月初めの年初来の累積秒から_月,_日,_時,_分,_秒,を求める'(_当年累秒数,_月初めの年初来の累秒数,_月,_日,_時,_分,_秒) :- _今月に入っての累秒数 is _当年累秒数 - _月初めの年初来の累秒数, '_秒数から _日,_時,_分,_秒を求める'(_今月に入っての累秒数,_日,_時,_分,_秒),!. '_秒数から _日,_時,_分,_秒を求める'(_秒数,_日,_時,_分,_秒) :- 商ならびと剰余ならび(_秒数,[86400,3600,60],[_日_1,_時,_分],[_,_,_秒]), _日 is _日_1 + 1. うるう年(_年文字列) :- atom(_年文字列), atom_to_term(_年文字列,_年整数,_),!, うるう年(_年整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 年間秒(_年,31536000) :- \+(うるう年(_年)),!. 年間秒(_年,31622400) :- うるう年(_年). グリニッヂ時と地域時間の差((32400)). 'Zellerの公式を用いて曜日を得る'(_年,1,_日,_曜日を表す値,_曜日) :- _年_1 is _年 - 1, 'Zellerの公式を用いて曜日を得る'(_年_1,13,_日,_曜日を表す値,_曜日),!. 'Zellerの公式を用いて曜日を得る'(_年,2,_日,_曜日を表す値,_曜日) :- _年_1 is _年 - 1, 'Zellerの公式を用いて曜日を得る'(_年_1,14,_日,_曜日を表す値,_曜日),!. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 'Zellerの公式で使う曜日を表す値'(_曜日を表す値,_曜日),!. 'Zellerの公式を用いて曜日を得る'(_年月日,_曜日) :- atom(_年月日), atom(_曜日), '曜日'(_年月日,V), !, V = _曜日 . 'Zellerの公式を用いて曜日を得る'(_年月日,_曜日) :- atom(_年月日), var(_曜日), '8桁文字列で表された年月日を整数の年・月・日に分解'(_年月日,_年整数,_月整数,_日整数), 'Zellerの公式を用いて曜日を得る'(_年整数,_月整数,_日整数,_曜日を表す値,_曜日),!. 'Zellerの公式で使う曜日を表す値'(0,'日曜'). 'Zellerの公式で使う曜日を表す値'(1,'月曜'). 'Zellerの公式で使う曜日を表す値'(2,'火曜'). 'Zellerの公式で使う曜日を表す値'(3,'水曜'). 'Zellerの公式で使う曜日を表す値'(4,'木曜'). 'Zellerの公式で使う曜日を表す値'(5,'金曜'). 'Zellerの公式で使う曜日を表す値'(6,'土曜'). '8桁文字列で表された年月日を整数の年・月・日に分解'(_年月日,_年整数,_月整数,_日整数) :- atom_to_term(_年月日,_年月日整数,_), 商ならびと剰余ならび(_年月日整数,[10000,100],[_年整数,_月整数],[_,_日整数]). 商ならびと剰余ならび(_,[],[],[]). 商ならびと剰余ならび(_被除数,[_除数|R2],[_商|R3],[_剰余|R4]) :- 商と剰余(_被除数,_除数,_商,_剰余), 商ならびと剰余ならび(_剰余,R2,R3,R4). 商と剰余(_被除数,_除数,_商,_剰余) :- _商 is _被除数 // _除数, _剰余 is _被除数 mod _除数. findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/524 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):入力した誕生日から今日まで経過した日数・時間を表示するプログラムを作成せよ. # '入力した誕生日から今日まで経過した日数を表示する' :- 入力した誕生日(_誕生年,_誕生月,_誕生日), '今日まで経過した日数・時間を'(_誕生年,_誕生月,_誕生日,_今日まで経過した日数), 表示する(_今日まで経過した日数). 入力した誕生日(_誕生年,_誕生月,_誕生日) :- write('誕生年を入力して下さい : '), get_integer(_誕生年), write('誕生月を入力して下さい : '), get_integer(_誕生月), write('誕生日を入力して下さい : '), get_integer(_誕生日). '今日まで経過した日数を'(_誕生年,_誕生月,_誕生日,_今日まで経過した日数) :- 今日(_年,_月,_日), '今日まで経過した日数を'(_今日の年,_今日の月,_今日の日,_誕生年,_誕生月,_誕生日,_今日まで経過した日数時間). '今日まで経過した日数を'(_今日の年,_今日の月,_今日の日,_誕生年,_誕生月,_誕生日,_今日まで経過した日数) :- _今年の年 = _誕生年, _今年の月 = _誕生月, _今日まで経過した日数 is _今日の日 - _誕生日. '今日まで経過した日数を'(_今日の年,_今日の月,_今日の日,_誕生年,_誕生月,_誕生日,_今日まで経過した日数) :- 誕生年と今年の間の日数(_誕生年,_今年の年,_誕生年と今年の間の日数), 年末までの経過日数(_誕生年,_誕生月,_誕生日,_年末までの経過日数), 年初からの経過日数(_今年の年,_今年の月,_今年の日,_今年の年初からの経過日数), _今日まで経過した日数 is _誕生日から年末までの経過日数 + _今年の年初からの経過日数. 年初からの経過日数(_,1,_日,_年初からの経過日数) :- _日 = _年初からの経過日数,!. 年初からの経過日数(_年,_月,_日,_年初からの経過日数) :- 前月末日までの月末日ならび(1,_年,_月,_日,_前月末日までの月末日ならび), sum([_日|_前月末日までの月末日ならび],_年初からの経過日数). 前月末日までの月末日ならび(_月,_年,_月,_日,[]). 前月末日までの月末日ならび(N,_年,_月,_日,[_末日|R]) :- 月の末日(_年,N,_末日), N2 is N + 1, 前月末日までの月末日ならび(N,_年,_月,_日,R). 月の末日(_年,2,29) :- うるう年(_年),!. 月の末日(_年,2,28) :- \+(うるう年(_年)),!. 月の末日(_,_月,31) :- member(_月,[1,3,5,7,8,10,12]),!. 月の末日(_,_月,30) :- member(_月,[4,6,9,11]). 年末までの経過日数(_年,_月,_日,_年末までの経過日数) :- 年初からの経過日数(_年,_月,_日,_年初からの経過日数), 年末までの経過日数計算(_年,_年初からの経過日数,_年末までの経過日数). 年末までの経過日数計算(_年,_年初からの経過日数,_年末までの経過日数) :- うるう年(_年), _年末までの経過日数 is 366 - _年初からの経過日数 + 1,!. 年末までの経過日数計算(_年,_年初からの経過日数,_年末までの経過日数) :- \+(うるう年(_年)), _年末までの経過日数 is 365 - _年初からの経過日数 + 1,!. 年間日数(_年,366) :- うるう年(_年),!. 年間日数(_年,365) :- \+(うるう年(_年)). 誕生年と今年の間の日数(_誕生年,_今年,0) :- _誕生年 = _今年,!. 誕生年と今年の間の日数(_誕生年,_今年,0) :- 1 is _今年 - _誕生年,!. 誕生年と今年の間の日数(_誕生年,_今年,_誕生年と今年の間の日数) :- S is _誕生年 + 1, Max is _今年 - 1, findall(_年間日数,( for(S,_年,Max), 年間日数(_年,_年間日数)), _年間日数ならび), sum(_年間日数ならび,_誕生年と今年の間の日数). 表示する(_今日まで経過した日数) :- writef('今日まで経過した日数は %t です\n',[_今日まで経過した日数]). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4. % 以下のサイトは 国民の祝日である(_年,_月,_日) :- '国民の祝日に関する法律 第二条  「国民の祝日」を次のように定める。'(_,_,_年,_月,_日). 振替休日である(_振替休日の年,_振替休日の月,_振替休日の日) :- '国民の祝日に関する法律 第三条 2  「国民の祝日」が日曜日に当たるときは、その日後においてその日に最も近い「国民の祝日」でない日を休日とする。'(_振替休日の年,_振替休日の月,_振替休日の日). 国民の休日である(_国民の休日の年,_国民の休日の月,_国民の休日の日) :- '国民の祝日に関する法律 第三条 3  その前日及び翌日が「国民の祝日」である日(「国民の祝日」でない日に限る。)は、休日とする。'(_国民の休日の年,_国民の休日の月,_国民の休日の日). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 国民の祝日に関する法律 :- '(昭和二十三年七月二十日法律第百七十八号)', '最終改正:平成一七年五月二〇日法律第四三号', '国民の祝日に関する法律 第一条  自由と平和を求めてやまない日本国民は、美しい風習を育てつつ、よりよき社会、より豊かな生活を築きあげるために、ここに国民こぞつて祝い、感謝し、又は記念する日を定め、これを「国民の祝日」と名づける。', '国民の祝日に関する法律 第二条  「国民の祝日」を次のように定める。', '国民の祝日に関する法律 第三条  「国民の祝日」は、休日とする。'. '国民の祝日に関する法律 第三条 2  「国民の祝日」が日曜日に当たるときは、その日後においてその日に最も近い「国民の祝日」でない日を休日とする。'. '国民の祝日に関する法律 第一条  自由と平和を求めてやまない日本国民は、美しい風習を育てつつ、よりよき社会、より豊かな生活を築きあげるために、ここに国民こぞつて祝い、感謝し、又は記念する日を定め、これを「国民の祝日」と名づける。'. '国民の祝日に関する法律 第二条  「国民の祝日」を次のように定める。'. '国民の祝日に関する法律 第二条  「国民の祝日」を次のように定める。'(_祝日の名称,_条文,_年,_月,_日) :- 国民の祝日(_祝日の名称,_条文,_年,_月,_日). '国民の祝日に関する法律 第三条  「国民の祝日」は、休日とする。'. '国民の祝日に関する法律 第三条 2  「国民の祝日」が日曜日に当たるときは、その日後においてその日に最も近い「国民の祝日」でない日を休日とする。'. '国民の祝日に関する法律 第三条 2  「国民の祝日」が日曜日に当たるときは、その日後においてその日に最も近い「国民の祝日」でない日を休日とする。'(_振替休日の年,_振替休日の月,_振替休日の日) :- '祝日が日曜の場合は翌日以降の平日を振替休日にする'(_振替休日の年,_振替休日の月,_振替休日の日). '国民の祝日に関する法律 第三条 3  その前日及び翌日が「国民の祝日」である日(「国民の祝日」でない日に限る。)は、休日とする。'. '国民の祝日に関する法律 第三条 3  その前日及び翌日が「国民の祝日」である日(「国民の祝日」でない日に限る。)は、休日とする。'(_国民の休日の年,_国民の休日の月,_国民の休日の日) :- '国民の休日とは、国民の祝日にはさまれた平日を指す'(_国民の休日の年,_国民の休日の月,_国民の休日の日). '(昭和二十三年七月二十日法律第百七十八号)'. '最終改正:平成一七年五月二〇日法律第四三号'. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 国民の祝日(元日,'一月一日 年のはじめを祝う。',_,1,1). 国民の祝日(成人の日,'一月の第二月曜日 おとなになつたことを自覚し、みずから生き抜こうとする青年を祝いはげます。',_年,1,_日) :- 第二月曜日(_年,1,_日). 国民の祝日(建国記念の日,'政令で定める日 建国をしのび、国を愛する心を養う。',_年,_月,_日) :- 建国記念日の日に関する政令(_年,_月,_日). 国民の祝日(春分の日,'春分日 自然をたたえ、生物をいつくしむ。',_年,_月,_日) :- 春分の日(_年,_月,_日). 国民の祝日(昭和の日,'昭和の日 四月二十九日 激動の日々を経て、復興を遂げた昭和の時代を顧み、国の将来に思いをいたす。',_年,4,29). 国民の祝日(憲法記念日,'憲法記念日 五月三日 日本国憲法 の施行を記念し、国の成長を期する。',_年,5,3). 国民の祝日(みどりの日,'みどりの日 五月四日 自然に親しむとともにその恩恵に感謝し、豊かな心をはぐくむ。',_年,5,4). 国民の祝日(こどもの日,'こどもの日 五月五日 こどもの人格を重んじ、こどもの幸福をはかるとともに、母に感謝する。',_年,5,5). 国民の祝日(海の日,'海の日 七月の第三月曜日 海の恩恵に感謝するとともに、海洋国日本の繁栄を願う。',_年,7,_日) :- 第三月曜日(_年,7,_日). 国民の祝日(敬老の日,'敬老の日 九月の第三月曜日 多年にわたり社会につくしてきた老人を敬愛し、長寿を祝う。',_年,9,_日) :- 第三月曜日(_年,9,_日). 国民の祝日(秋分の日,'秋分の日 秋分日 祖先をうやまい、なくなつた人々をしのぶ。',_年,_月,_日) :- 秋分の日(_年,_月,_日). 国民の祝日(体育の日,'体育の日 十月の第二月曜日 スポーツにしたしみ、健康な心身をつちかう。',_年,10,_日) :- 第二月曜日(_年,10,_日). 国民の祝日(文化の日,'文化の日 十一月三日 自由と平和を愛し、文化をすすめる。',_年,11,3). 国民の祝日(勤労感謝の日,'勤労感謝の日 十一月二十三日 勤労をたつとび、生産を祝い、国民たがいに感謝しあう。',_年,11,23). 国民の祝日(天皇誕生日,'天皇誕生日 十二月二十三日 天皇の誕生日を祝う。',_年,12,23). 祝日が日曜の場合は翌日以降の平日を振替休日にする(_振替休日の年,_振替休日の月,_日) :- 国民の祝日(_,_,_振替休日の年,_振替休日の月,_日), 'Zellerの公式を用いて曜日を得る'(_振替休日の年,_振替休日の月,_日,_,日曜), 振替休日(_振替休日の年,_振替休日の月,_日,_振替休日の日). 振替休日(_振替休日の年,_振替休日の月,_日,_振替休日の日) :- between(_日,31,_振替休日の日), \+(国民の祝日(_,_,_振替休日の年,_振替休日の月,_振替休日の日)), 'Zellerの公式を用いて曜日を得る'(_振替休日の年,_振替休日の月,_振替休日の日,_,_曜日), \+(_曜日=日曜),!. '国民の休日とは、国民の祝日にはさまれた平日を指す'(_国民の休日の年,_国民の休日の月,_国民の休日の日) :- 前日(_国民の休日の年,_国民の休日の月,_国民の休日の日,_前日の年,_前日の月,_前日の日), 翌日(_国民の休日の年,_国民の休日の月,_国民の休日の日,_翌日の年,_翌日の月,_翌日の日), 国民の祝日(_,_,_前日の年,_前日の月,_前日の日), 国民の祝日(_,_,_翌日の年,_翌日の月,_翌日の日),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 第三月曜日(_年,_月,_日) :- between(15,21,_日), 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_,月曜). 第二月曜日(_年,_月,_日) :- between(8,14,_日), 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_,月曜). 春分の日(_年,_月,_日) :- '「春分の日」および「秋分の日」の日付は、前年2月1日の官報で発表される。'(_年,_月,_日),!. 春分の日(_年,3,_日) :- '国立天文台「暦象年表」に基づき', _年 >= 1980, _年 =< 2099, _日 is truncate(20.8431+0.242194*(_年-1980)-truncate((_年-1980)/4)),!. 春分の日(_年,3,23). 秋分の日(_年,_月,_日) :- '「春分の日」および「秋分の日」の日付は、前年2月1日の官報で発表される。'(_年,_月,_日),!. 秋分の日(_年,9,_日) :- '国立天文台「暦象年表」に基づき', _年 >= 1980, _年 =< 2099, _日 is truncate(23.2488+0.242194*(_年-1980)-truncate((_年-1980)/4)),!. 秋分の日(_年,9,23). 建国記念日の日に関する政令(_年,2,11). 政令で定める. '「春分の日」および「秋分の日」の日付は、前年2月1日の官報で発表される。'(_年,_月,_日) :- fail. '国立天文台「暦象年表」に基づき'. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 前日(_年,_月,_日,_前日の年,_前日の月,_前日の日) :- 前日の月がわり調整(_年,_月,_日,_前日の年,_前日の月,_前日の日). 翌日(_年,_月,_日,_翌日の年,_翌日の月,_翌日の日) :- 翌日の月がわり調整(_年,_月,_日,_翌日の年,_翌日の月,_翌日の日). 前日の月がわり調整(_整数年,1,1,_変更された整数年,12,31) :- _変更された整数年 は _整数年 - 1,!. 前日の月がわり調整(_整数年,_整数月,1,_整数年,_変更された整数月,31) :- member(_整数月,[2,4,6,8,9,11]), _変更された整数月 は _整数月 - 1,!. 前日の月がわり調整(_整数年,_整数月,1,_整数年,_変更された整数月,30) :- member(_整数月,[5,7,10,12]), _変更された整数月 は _整数月 - 1,!. 前日の月がわり調整(_整数年,3,1,_整数年,2,29) :- 0 is _整数年 mod 4,!. 前日の月がわり調整(_整数年,3,1,_整数年,2,28) :- \+(0 is _整数年 mod 4),!. 前日の月がわり調整(_整数年,_整数月,_整数日,_整数年,_整数月,_変更された整数日) :- _変更された整数日 は _整数日 - 1,!. 翌日の月がわり調整(_整数年,12,31,_変更された整数年,1,1) :- _変更された整数年 は _整数年 + 1,!. 翌日の月がわり調整(_整数年,_整数月,30,_整数年,_変更された整数月,1) :- member(_整数月,[4,6,8,9,11]), _変更された整数月 は _整数月 + 1,!. 翌日の月がわり調整(_整数年,_整数月,31,_整数年,_変更された整数月,1) :- member(_整数月,[1,3,5,7,10]), _変更された整数月 は _整数月 + 1,!. 翌日の月がわり調整(_整数年,2,29,_整数年,3,1) :- 0 is _整数年 mod 4,!. 翌日の月がわり調整(_整数年,2,28,_整数年,3,1) :- \+(うるう年(_整数年)),!. 翌日の月がわり調整(_整数年,_整数月,_整数日,_整数年,_整数月,_変更された整数日) :- _変更された整数日 は _整数日 + 1,!. 翌月(_年,12,_翌年,1) :- _翌年 is _年 + 1,!. 翌月(_年,_月,_年,_翌月) :- _翌月 is _月 + 1. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100, !, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 'Zellerの公式を用いて曜日を得る'(_年,1,_日,_曜日を表す値,_曜日) :- _年_1 is _年 - 1, 'Zellerの公式を用いて曜日を得る'(_年_1,13,_日,_曜日を表す値,_曜日),!. 'Zellerの公式を用いて曜日を得る'(_年,2,_日,_曜日を表す値,_曜日) :- _年_1 is _年 - 1, 'Zellerの公式を用いて曜日を得る'(_年_1,14,_日,_曜日を表す値,_曜日),!. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 曜日を表す値(_曜日を表す値,_曜日),!. 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). % 以下のサイトは 国民の祝日である(_年,_月,_日) :- 国民の祝日である(_,_年,_月,_日). 振替休日である(_年,_月,_日) :- 祝日が日曜の場合は翌日以降の平日を振替休日にする(_年,_月,_日). 国民の休日である(_年,_月,_日) :- '国民の休日とは、国民の祝日にはさまれた平日を指す'(_年,_月,_日). 国民の祝日である(元旦,_年,1,1). 国民の祝日である(成人の日,1,_日) :- 第二月曜日(_年,1,_日). 国民の祝日である(建国記念の日,_年,2,11) :- 政令で定める. 国民の祝日である(春分の日,_年,3,_日) :- 春分の日(_年,3,_日). 国民の祝日である(昭和の日,_年,4,29). 国民の祝日である(憲法記念日,_年,5,3). 国民の祝日である(みどりの日,_年,5,4). 国民の祝日である(こどもの日,_年,5,5). 国民の祝日である(海の日,_年,7,_日) :- 第三月曜日(_年,7,_日). 国民の祝日である(敬老の日,_年,9,_日) :- 第三月曜日(_年,9,_日). 国民の祝日である(秋分の日,_年,9,_日) :- 秋分の日(_年,9,_日). 国民の祝日である(体育の日,_年,10,_日) :- 第二月曜日(_年,10,_日). 国民の祝日である(文化の日,_年,11,3). 国民の祝日である(勤労感謝の日,_年,11,23). 国民の祝日である(天皇誕生日,_年,12,23). 祝日が日曜の場合は翌日以降の平日を振替休日にする(_振替休日の年,_振替休日の月,_振替休日の日) :- 国民の祝日である(_,_振替休日の年,_振替休日の月,_日), 'Zellerの公式を用いて曜日を得る'(_振替休日の年,_振替休日の月,_日,_,日曜), 振替休日(_振替休日の年,_振替休日の月,_日,_振替休日の日). '国民の休日とは、国民の祝日にはさまれた平日を指す'(_国民の休日の年,_国民の休日の月,_国民の休日の日) :- 前日(_国民の休日の年,_国民の休日の月,_国民の休日の日,_前日の年,_前日の月,_前日の日), 翌日(_国民の休日の年,_国民の休日の月,_国民の休日の日,_翌日の年,_翌日の月,_翌日の日), 国民の祝日である(_,_前日の年,_前日の月,_前日の日), 国民の祝日である(_,_翌日の年,_翌日の月,_翌日の日),!. 振替休日(_振替休日の年,_振替休日の月,_日,_振替休日の日) :- for(_日,_振替休日の日,31), \+(国民の祝日である(_,_振替休日の年,_振替休日の月,_振替休日の日)), 'Zellerの公式を用いて曜日を得る'(_振替休日の年,_振替休日の月,_振替休日の日,_,_曜日), \+(_曜日=日曜),!. 祝日が日曜の場合は翌日以降の平日を振替休日にする(_振替休日の年,_振替休日の月,_振替休日の日) :- 国民の祝日である(_,_振替休日の年,_振替休日の月,_日), 'Zellerの公式を用いて曜日を得る'(_振替休日の年,_振替休日の月,_日,_,日曜), 振替休日(_振替休日の年,_振替休日の月,_日,_振替休日の日). '国民の休日とは、国民の祝日にはさまれた平日を指す'(_国民の休日の年,_国民の休日の月,_国民の休日の日) :- 前日(_国民の休日の年,_国民の休日の月,_国民の休日の日,_前日の年,_前日の月,_前日の日), 翌日(_国民の休日の年,_国民の休日の月,_国民の休日の日,_翌日の年,_翌日の月,_翌日の日), 国民の祝日である(_,_前日の年,_前日の月,_前日の日), 国民の祝日である(_,_翌日の年,_翌日の月,_翌日の日),!. 振替休日(_振替休日の年,_振替休日の月,_日,_振替休日の日) :- for(_日,_振替休日の日,31), \+(国民の祝日である(_,_振替休日の年,_振替休日の月,_振替休日の日)), 'Zellerの公式を用いて曜日を得る'(_振替休日の年,_振替休日の月,_振替休日の日,_,_曜日), \+(_曜日=日曜),!. 第三月曜日(_年,_月,_日) :- for(15,_日,21), 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_,月曜). 第二月曜日(_年,_月,_日) :- for(8,_日,14), 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_,月曜). 春分の日(_年,3,_日) :- '「春分の日」および「秋分の日」の日付は、前年2月1日の官報で発表される。', fail. 春分の日(_年,3,_日) :- '国立天文台「暦象年表」に基づき', _年 >= 1980, _年 =< 2099, _日 is truncate(20.8431+0.242194*(_年-1980)-truncate((_年-1980)/4)),!. 春分の日(_年,3,23). 秋分の日(_年,9,_日) :- '「春分の日」および「秋分の日」の日付は、前年2月1日の官報で発表される。', fail. 秋分の日(_年,9,_日) :- '国立天文台「暦象年表」に基づき', _年 >= 1980, _年 =< 2099, _日 is truncate(23.2488+0.242194*(_年-1980)-truncate((_年-1980)/4)),!. 秋分の日(_年,9,23). 翌月(_年,12,_翌年,1) :- _翌年 is _年 + 1,!. 翌月(_年,_月,_年,_翌月) :- _翌月 is _月 + 1. 前日(_年,_月,_日,_前日の年,_前日の月,_前日の日) :- 前日の月がわり調整(_年,_月,_日,_前日の年,_前日の月,_前日の日). 翌日(_年,_月,_日,_翌日の年,_翌日の月,_翌日の日) :- 翌日の月がわり調整(_年,_月,_日,_翌日の年,_翌日の月,_翌日の日). 前日の月がわり調整(_整数年,1,1,_変更された整数年,12,31) :- _変更された整数年 は _整数年 - 1,!. 前日の月がわり調整(_整数年,_整数月,1,_整数年,_変更された整数月,31) :- member(_整数月,[2,4,6,8,9,11]), _変更された整数月 は _整数月 - 1,!. 前日の月がわり調整(_整数年,_整数月,1,_整数年,_変更された整数月,30) :- member(_整数月,[5,7,10,12]), _変更された整数月 は _整数月 - 1,!. 前日の月がわり調整(_整数年,3,1,_整数年,2,29) :- 0 is _整数年 mod 4,!. 前日の月がわり調整(_整数年,3,1,_整数年,2,28) :- \+(0 is _整数年 mod 4),!. 前日の月がわり調整(_整数年,_整数月,_整数日,_整数年,_整数月,_変更された整数日) :- _変更された整数日 は _整数日 - 1,!. 翌日の月がわり調整(_整数年,12,31,_変更された整数年,1,1) :- _変更された整数年 は _整数年 + 1,!. 翌日の月がわり調整(_整数年,_整数月,30,_整数年,_変更された整数月,1) :- member(_整数月,[4,6,8,9,11]), _変更された整数月 は _整数月 + 1,!. 翌日の月がわり調整(_整数年,_整数月,31,_整数年,_変更された整数月,1) :- member(_整数月,[1,3,5,7,10]), _変更された整数月 は _整数月 + 1,!. 翌日の月がわり調整(_整数年,2,29,_整数年,3,1) :- 0 is _整数年 mod 4,!. 翌日の月がわり調整(_整数年,2,28,_整数年,3,1) :- \+(うるう年(_整数年)),!. 翌日の月がわり調整(_整数年,_整数月,_整数日,_整数年,_整数月,_変更された整数日) :- _変更された整数日 は _整数日 + 1,!. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100, !, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 'Zellerの公式を用いて曜日を得る'(_年,1,_日,_曜日を表す値,_曜日) :- _年_1 is _年 - 1, 'Zellerの公式を用いて曜日を得る'(_年_1,13,_日,_曜日を表す値,_曜日),!. 'Zellerの公式を用いて曜日を得る'(_年,2,_日,_曜日を表す値,_曜日) :- _年_1 is _年 - 1, 'Zellerの公式を用いて曜日を得る'(_年_1,14,_日,_曜日を表す値,_曜日),!. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 曜日を表す値(_曜日を表す値,_曜日),!. 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). 政令で定める. '「春分の日」および「秋分の日」の日付は、前年2月1日の官報で発表される。'. '国立天文台「暦象年表」に基づき'. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1316769778/312 # # access2000で # # NEN | TUKI # 23 | 11 # ってデータがあったら # # 平成23年12月31日のように常に次月末日を返したいのですが # どのようなクエリになりますか? # '平成23年12月31日のように常に次月末日を返す'(_次月末日) :- 年月(_NEN,_TUKI), '平成23年12月31日のように常に次月末日を返す'(_NEN,_TUKI,_次月末日). '平成23年12月31日のように常に次月末日を返す'(_NEN,12,_次月末日) :- _NEN_2 is _NEN + 1, concat_atom([平成,_NEN_2,年,1,月,31,日],_次月末日),!. '平成23年12月31日のように常に次月末日を返す'(_NEN,_TUKI,_次月末日) :- member(_TUKI,[2,4,6,7,9,11]), _TUKI_2 is _TUKI + 1, concat_atom([平成,_NEN,年,_TUKI_2,月,31,日],_次月末日),!. '平成23年12月31日のように常に次月末日を返す'(_NEN,_TUKI,_次月末日) :- member(_TUKI,[3,5,8,10]), _TUKI_2 is _TUKI + 1, concat_atom([平成,_NEN,年,_TUKI_2,月,30,日],_次月末日),!. '平成23年12月31日のように常に次月末日を返す'(_NEN,1,_次月末日) :- _西暦年 is _NEN + 1988, うるう年(_西暦年), concat_atom([平成,_NEN,年,2,月,29,日],_次月末日),!. '平成23年12月31日のように常に次月末日を返す'(_NEN,1,_次月末日) :- _西暦年 is _NEN + 1988, \+(うるう年(_西暦年)), concat_atom([平成,_NEN,年,2,月,28,日],_次月末日),!. うるう年(_年文字列) :- atom(_年文字列), atom_to_term(_年文字列,_年整数,_),!, うるう年(_年整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/383 # # # [1] 授業単元:プログラミング演習 # # [2] 問題文(含コード&リンク): # # # http://ime.nu/codepad.org/bMCs37CD # # 3): # 西暦で表された、年、月、日、の3つの値が与えられていたとして、その年内で経過日数を求めるプログラムを作成する。 # ?ヶ月ごとの日数を配列に格納するが、うるう年があるため、?行?列の多次元配列を用いることとする。 # # int mdays[][12]={{日数を入れる},{うるう年の日数を入れる}}; # # 結果は標準入出力とする。 # # '西暦で表された、年、月、日、の3つの値が与えられていたとして、その年内で経過日数を求める'(_年,_月,_日,_経過日数) :- うるう年(_年), 月日数([_月日数ならび,_]), 経過日数計算(_月,_日,_月日数ならび,_経過日数). '西暦で表された、年、月、日、の3つの値が与えられていたとして、その年内で経過日数を求める'(_年,_月,_日,_経過日数) :- \+(うるう年(_年)), 月日数([_,_月日数ならび]), 経過日数計算(_月,_日,_月日数ならび,_経過日数). うるう年(_年文字列) :- atom(_年文字列), atom_to_term(_年文字列,_年整数,_),!, うるう年(_年整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 経過日数計算(_月,_日,_月日数ならび,_経過日数) :- length([_|L0],_月), append(L0,_,_月日数ならび), sum(L0,_前月末日までの経過日数), _経過日数 is _前月末日までの経過日数 + _日. 月日数([[31,29,31,30,31,30,31,31,30,31,30,31],[31,28,31,30,31,30,31,31,30,31,30,31]]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/383 # # # [1] 授業単元:プログラミング演習 # # [2] 問題文(含コード&リンク): # # # http://ime.nu/codepad.org/bMCs37CD # # # 1): # n個の実数からなるファイルを読み込み、それらの最大値、最小値、および平均値をディスプレイに出力するプログラムを作成し、動作を確認せよ。 # ただし、整数nと入力ファイル名はコマンドライン引数とすること。 # また、プログラム内ではn個の実数は配列x[]に読み込むこと、すなわち、 # double *x; # int n; # n=atoi(argv[1]); # x=(double *)malloc(sizeof(double)*n); # # 2): # #include # int main(){ # int x=100; # int y=500; # int *ptr=&x; # # printf("*ptr=%d\n",*ptr); # *ptr=400; # printf("x=%d\n",x); # printf("y=%d\n",y); # # return 0; # } # を関数化せよ。 # すなわち、実数からなる配列x[]とその要素数nが与えられたとき、それらnこの実数の最大値、採草地、および平均値を求める関数。 # void max_min_mean(double x[],int n,double *a,double *b,,double *c) # を作成し、動作を確認せよ。 # # 3): # 西暦で表された、年、月、日、の3つの値が与えられていたとして、その年内で経過日数を求めるプログラムを作成する。 # ?ヶ月ごとの日数を配列に格納するが、うるう年があるため、?行?列の多次元配列を用いることとする。 # # int mdays[][12]={{日数を入れる},{うるう年の日数を入れる}}; # # 結果は標準入出力とする。 # # # 4): # 身体検査データを構造体配列として格納し、身長の平均値と視力の分布を求めるプログラムを作成する。身長検査データは標準入力からでもプログラムに記述でもどちらでもいい。 # # 結果 平均身長 〇〇cm #    視力の分布 0.0〜:○人 #          0.1〜:○人(以下略 # # struct{ # # } 'n個の実数からなるファイルを読み込み、それらの最大値、最小値、および平均値をディスプレイに出力する'(_n個,_残り実数ならび) :- 'n個の実数からなるファイルを読み込み'(_実数ならび,_残り実数ならび), 'それらの最大値、最小値、および平均値をディスプレイに出力する'(_実数ならび). 'n個の実数からなるファイルを読み込み'(_n個,_ファイル,_実数ならび), get_lines(_ファイル,Lines), 'n個の実数ならびを生成'(_n個,Lines,_実数ならび,_残り実数ならび). 'n個の実数ならびを生成'(_n個,Lines,_実数ならび,_残り実数ならび) :- length(_実数ならび,_n個), findall(_実数,( append(L0,[_実数|_],Lines), float(_実数)), _実数ならびの一), append(_実数ならび,_残り実数ならび,_実数ならびの一),!. 'それらの最大値、最小値、および平均値をディスプレイに出力する'(_実数ならび) :- 最大値(_実数ならび,_最大値), 最小値(_実数ならび,_最小値), 平均値(_実数ならび,_平均値), writef('最大値 = %t,最小値 = %t,平均値 = %t\n',[_最大値,_最小値,_平均値]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 最大値([A|L],_最大値) :- !. 最大値(L,A,_最大値), 最大値([],_最大値,_最大値) :- !. 最大値([A|R],_最大値_1,_最大値) :- A @> _最大値_1, 最大値(R,A,_最大値). 最大値([A|R],_最大値_1,_最大値) :- 最大値(R,_最大値_1,_最大値). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 最大値([_最大値],_最大値) :- !. 最大値([A1,A2],_最大値) :- 大きい方が最大値(A1,A2,_最大値),!. 最大値(_実数ならび,_最大値) :- append(L1,L2,_実数ならび), length(L1,N), length(L2,N), 最大値(L1,Max1), 最大値(L2,Max2), 大きい方が最大値(Max1,Max2,_最大値),!. 最大値([A|_実数ならび],_最大値) :- 最大値(_実数ならび,Max1), 大きい方が最大値(A,Max1,_最大値). 大きい方が最大値(Max1,Max2,Max1) :- Max1 @>= Max2,!. 大きい方が最大値(Max1,Max2,Max2) :- Max1 @< Max2. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 最小値([A|L],_最小値) :- !. 最小値(L,A,_最小値), 最小値([],_最小値,_最小値) :- !. 最小値([A|R],_最小値_1,_最小値) :- A @< _最小値_1, 最小値(R,A,_最小値). 最小値([A|R],_最小値_1,_最小値) :- 最小値(R,_最小値_1,_最小値). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 最小値([_最小値],_最小値) :- !. 最小値([A1,A2],_最小値) :- 小きい方が最小値(A1,A2,_最小値),!. 最小値(_実数ならび,_最小値) :- append(L1,L2,_実数ならび), length(L1,N), length(L2,N), 最小値(L1,Max1), 最小値(L2,Max2), 小きい方が最小値(Max1,Max2,_最小値),!. 最小値([A|_実数ならび],_最小値) :- 最小値(_実数ならび,Max1), 小きい方が最小値(A,Max1,_最小値). 小きい方が最小値(Max1,Max2,Max1) :- Max1 @< Max2,!. 小きい方が最小値(Max1,Max2,Max2) :- Max1 @> Max2. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 平均値(L,_平均値) :- sum(L,_合計), length(L,_要素数), _平均値 is _合計 / _要素数. sum([],0). sum([A|R],S) :- sum(R,S1), S is A + S1. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/28 # # (1)c言語(2)問題:日数計算プログラムをベースに基ずいて「ここに処理が入る」というところに入力をお願いします # 実行結果:数え始める西暦を入力してください   1967,8,7 # 数え終える西暦を入力してください        2009,6,12 # 1967,8,7から2009,6,12までの日数は15285日です # ベース # #include <stdio.h> # int uruu(int y); # int monthday(int y, int m); # int main(){ # int year_a, month_a, day_a; # int year_b, month_b, day_b; # int days; # int i; # days = 0; # printf("日数計算プログラム\n"); # printf("数え始める西暦年月日を入力してください\n"); # scanf("%d,%d,%d",&year_a, &month_a, &day_a); # printf("終わりの西暦年月日を入力してください\n"); # scanf("%d,%d,%d",&year_b, &month_b, &day_b); # ここに処理が入る # printf("%d年%d月%d日から%d年%d月%d日までの日数は%d日です。\n",year_a, month_a, day_a, year_b, month_b, day_b, days); # return 0;} # int uruu(int y){ # int ret; # ここに処理が入る # return ret; # } # int monthday(int y, int m){ # int d; # ここに処理が入る # return d; # } # 日数を数える :- 数え始める西暦を入力してください(_年1,_月1,_日1), 終わりの西暦年月日を入力してください(_年2,_月2,_日2), 日数を数える(_年1,_月1,_日1,_年2,_月2,_日2,0,_日数). writef('%t年%t月%t日から%t年%t月%t日までの日数は%t日です。\n',[_年1,_月1,_日1,_年2,_月2,_日2,_日数]). 日数を数える(_年2,_月1,_日1,_年2,_月2,_日2,_日数,_日数) :- _月1 >= _月2, _日1 >= _日2,!. 日数を数える(_年1,_月1,_日1,_年2,_月2,_日2,_日数1,_日数) :- 翌日(_年1,_月1,_日1,_翌日の年,_翌日の月,_翌日の日), _日数2 is _日数1 + 1, 日数を数える(_翌日の年,_翌日の月,_翌日の日,_年2,_月2,_日2,_日数). 翌日(_年1,12,31,_翌日の年,1,1) :- _翌日の年 is _年1 + 1,!. 翌日(_年,_月1,_日1,_年,_月2,1) :- 月末日(_年1,_月1,_日1), _月2 is _月1 + 1,!. 翌日(_年,_月,_日1,_年,_月,_日2) :- _日2 is _日1 + 1. 月末日(_年,2,29) :- !. 月末日(_年,2,28) :- \+(うるう年(_年)),!. 月末日(_,_,31) :- !. 月末日(_,_,30) :- member(_月,[4,6,9,11]),!. 数え始める西暦を入力してください(_年,_月,_日) :- write('数え始める西暦を入力してください '), readln([_年,_月,_日]). 終わりの西暦年月日を入力してください(_年,_月,_日) :- write('終わりの西暦年月日を入力してください '), readln([_年,_月,_日]). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/641 # # [1] C言語演習 # [2] http://codepad.org/umohMOn3のプログラムを完成させ、 #   年と月を入力して、その月のカレンダーを表示するプログラムを作成せよ。 #   なお、http://codepad.org/qb798eoX、http://codepad.org/rPzv2BAEの #   プログラムを参考にすること。 # [3.1] Windows7 # [3.3] C言語 # [4] 7月15日 19時まで # [5] 関数呼び出しまで # わかる方よろしくお願いします。 # # '年と月を入力して、その月のカレンダーを表示する' :- '年と月を入力して'(_年,_月), '年と月を入力して、その月のカレンダーを表示する'(_年,_月). '年と月を入力して'(_年,_月) :- write('年,月をカンマ区切りで入力してください : '), readln([_年,_月]). '年と月を入力して、その月のカレンダーを表示する'(_年,_月) :- 'Zellerの公式を用いて曜日を得る'(_年,_月,1,_曜日を表す値,_曜日), 末日(_年,_月,_末日), writef(' %t年 %t月\n\n', 日 月 火 水 木 金 土\n',[_年,_月]), カレンダ日ならび(_末日,_曜日を表す値,L), カレンダ表示(L). カレンダ日ならび(_末日,_曜日を表す値,L) :- length(L0,_曜日を表す値), all(L0,' '), S is 6 - _曜日を表す値, length(L2,S), all(L2,' '), findall(_,for(1,N,_末日),L1), append(L0,L1,L2,L),!. カレンダ表示([]) :- !. カレンダ表示(L) :- length(L0,7), append(L0,R,L), カレンダ週表示(L0), write('\n'), カレンダ表示(R). カレンダ週表示([]). カレンダ週表示([A|R]) :- writef('%3r',[A]), カレンダ週表示(R),!. 末日(_,_月,31) :- member(_月,[1,3,5,7,8,10,12]),!. 末日(_,_月,30) :- member(_月,[4,6,9,11]). 末日(_年,2,29) :- うるう年(_年),!. 末日(_年,2,28) :- \+(うるう年(_年)),!. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 'Zellerの公式を用いて曜日を得る'(_年,1,_日,_曜日を表す値,_曜日) :- _年_1 is _年 - 1, 'Zellerの公式を用いて曜日を得る'(_年_1,13,_日,_曜日を表す値,_曜日),!. 'Zellerの公式を用いて曜日を得る'(_年,2,_日,_曜日を表す値,_曜日) :- _年_1 is _年 - 1, 'Zellerの公式を用いて曜日を得る'(_年_1,14,_日,_曜日を表す値,_曜日),!. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 曜日を表す値(_曜日を表す値,_曜日), !. 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/293 # # 【1】c言語 【2】二つの西暦で入力された年月日から、その間の日数を計算するプログラムを作成してください。 # ここに処理が入る というとこのプログラムをお願いします # プログラムのベース # int uruu(int y); # int monthday(int y, int m); # //---------------------------------------------------- # int main(){ # int year_a, month_a, day_a; # int year_b, month_b, day_b; # int days; # int i; # days = 0; # printf("日数計算プログラム\n"); # printf("数え始める西暦年月日を入力してください\n"); # scanf("%d,%d,%d",&year_a, &month_a, &day_a); # printf("数え終わる西暦年月日を入力してください\n"); # scanf("%d,%d,%d",&year_b, &month_b, &day_b); # ここに処理が入いる # printf("%d年%d月%d日から%d年%d月%d日までの日数は%d日です。\n", year_a, month_a, day_a, year_b, month_b, day_b, days); # return 0; } # //うるう年ならtrue(1)、そうでないならfalse(0)を返す関数 # int uruu(int y){ # int ret; # ここに処理が入る # return ret; } # //年、月を受け取り、その月の日数を返す関数 # int monthday(int y, int m){ # int d; # ここに処理が入る # return d; } # # '二つの西暦で入力された年月日から、その間の日数を計算する' :- 起点年月日の入力(_起点年,_起点月,_起点日), 終点年月日の入力(_終点年,_終点月,_終点日), count(翌日(_起点年,_起点月,_起点日,_終点年,_終点月,_終点日,_,_,_),_日数), writef('日数は %t です。\n',[_日数]). 起点年月日の入力(_起点年,_起点月,_起点日) :- write('起点となる年を入力してください : '), get_integer(_起点年), write('起点となる月を入力してください : '), get_integer(_起点月), write('起点となる日を入力してください : '), get_integer(_起点日),!. 終点年月日の入力(_終点年,_終点月,_終点日) :- write('終点となる年を入力してください : '), get_integer(_終点年), write('終点となる月を入力してください : '), get_integer(_終点月), write('終点となる日を入力してください : '), get_integer(_終点日),!. 翌日(_集点年,_終点月,_終点日,_終点年,_終点月,_終点日,_翌日の年,_翌日の月,_翌日の日) :- !,fail. 翌日(_年,_月,_日,_終点年,_終点月,_終点日,_翌日の年,_翌日の月,_翌日の日) :- 月末日の翌日(_年,_月,_日,_翌日の年,_翌日の月,_翌日の日). 翌日(_年,_月,_日,_終点年,_終点月,_終点日,_翌日の年,_翌日の月,_翌日の日) :- 月末日ではない日の翌日(_年,_月,_日,_翌日の年,_翌日の月,_翌日の日). 翌日(_年,_月,_日,_終点年,_終点月,_終点日,_翌日の年,_翌日の月,_翌日の日) :- 月末日の翌日(_年,_月,_日,_翌日の年_1,_翌日の月_1,_翌日の日_1), 翌日(_翌日の年_1,_翌日の月_1,_翌日の日_1,_終点年,_終点月,_終点日,_翌日の年,_翌日の月,_翌日の日). 翌日(_年,_月,_日,_終点年,_終点月,_終点日,_翌日の年,_翌日の月,_翌日の日) :- 月末日でないない日の翌日(_年,_月,_日,_翌日の年_1,_翌日の月_1,_翌日の日_1), 翌日(_翌日の年_1,_翌日の月_1,_翌日の日_1,_終点年,_終点月,_終点日,_翌日の年,_翌日の月,_翌日の日). 月末日の翌日(_年,2,28,_年,2,29) :- うるう年(_年),!. 月末日の翌日(_年,2,28,_年,3,1) :- \+(うるう年(_年)),!. 月末日の翌日(_年,12,31,_年_2,1,1) :- _年_2 is _年 + 1,!. 月末日の翌日(_年,_月,31,_年,_月_2,1) :- _月_2 is _月 + 1,!. 月末日の翌日(_年,_月,30,_年,_月_2,1) :- member(_月,[4,6,9,11]),!. 月末日ではない日の翌日(_年,_月,_日,_年,_月,_日_2) :- _日_2 is _日 + 1,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/240 # # 【1】c言語 【2】二つの西暦で入力された年月日から、その間の日数を計算するプログラムを作成してください。 # ここに処理が入る というとこのプログラムをお願いします # プログラムのベース # int uruu(int y); # int monthday(int y, int m); # //---------------------------------------------------- # int main(){ # int year_a, month_a, day_a; # int year_b, month_b, day_b; # int days; int i; days = 0; # printf("日数計算プログラム\n"); # printf("数え始める西暦年月日を入力してください\n"); # scanf("%d,%d,%d",&year_a, &month_a, &day_a); # printf("数え終わる西暦年月日を入力してください\n"); # scanf("%d,%d,%d",&year_b, &month_b, &day_b); # ここに処理が入いる # printf("%d年%d月%d日から%d年%d月%d日までの日数は%d日です。\n", year_a, month_a, day_a, year_b, month_b, day_b, days); # return 0; } # //うるう年ならtrue(1)、そうでないならfalse(0)を返す関数 # int uruu(int y){ # int ret; # ここに処理が入る # return ret; } # //年、月を受け取り、その月の日数を返す関数 # int monthday(int y, int m){ # int d; # ここに処理が入る # return d; } # # '日数計算プログラム' :- 数え始める西暦年月日を入力してください(_年_1,_月_1,_日_1), 数え終わる西暦年月日を入力してください(_年_2,_月_2,_日_2), 日数計算(_年_1,_月_1,_日_1,_年_2,_月_2,_日_2,_日数), writef('%d年%d月%d日から%d年%d月%d日までの日数は%d日です。',[_年_1,_月_1,_日_1,_年_2,_月_2,_日_2,_日数]). 数え始める西暦年月日を入力してください(_数え始める西暦年月日) :- write('数え始める西暦年月日を入力してください(yyyy,mm,dd) : '), 年月日の入力(_年,_月,_日). 数え終わる西暦年月日を入力してください(_年,_月,_日) :- write('数え終わる西暦年月日を入力してください(yyyy mm dd) : '), 年月日の入力(_年,_月,_日). 年月日の入力(_年,_月,_日) :- readln([_年,_月,_日]). 日数計算(_年_1,_月_1,_日_1,_年_2,_月_2,_日_2,_日数) :- _年_2 - _年_1 > 1, _開始年の翌年 is _年_1 + 1, _最終年の前年 is _年_2 - 1, findsum(_年日数,( for(_開始年の翌年,_年,_最終年の前年), 一年間の日数(_年,_年日数)), _間の年の日数合計), 翌年の正月までの日数(_年_1,_月_1,_日_1,_翌年の正月までの日数), 積算日(_年_2,_月_2,_日_2,_積算日), _日数 is truncate(_翌年の正月までの日数 + _間の年の日数合計 + _積算日). '年、月を受け取り、その月の日数を返す'(_年,_月,31) :- member(_月,[1,3,5,7,8,10,12]),!. '年、月を受け取り、その月の日数を返す'(_年,_月,30) :- member(_月,[4,6,9,11]),!. '年、月を受け取り、その月の日数を返す'(_年,2,29) :- うるう年(_年),!. '年、月を受け取り、その月の日数を返す'(_年,2,28) :- \+(うるう年(_年)). 一年間の日数(_年,365) :- \+(うるう年(_年)). 一年間の日数(_年,366) :- うるう年(_年),!. 積算日(_,1,_日,_日) :- !. 積算日(_年,_月,_日,_積算日) :- _前月 is _月 - 1, findsum(_月日数,( for(1,_月_1,_前月), '年、月を受け取り、その月の日数を返す'(_年,_月_1,_月日数)), _正月から前月末日までの積算日), _積算日 is truncate(_正月から前月末日までの積算日 + _日). 翌年の正月までの日数(_年,_月,_日,_翌年の正月までの日数) :- findsum(_月日数,( for(_月,_月_1,12), '年、月を受け取り、その月の日数を返す'(_年,_月_1,_月日数)), _当月初日から翌年正月までの日数), _翌年の正月までの日数 is truncate(_当月初日から翌年正月までの日数 - _日 + 1). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/805 # # 【1】c言語 # 【2】うるう年の判定のプログラムを関数を使って作成してください # ちなみにうるう年は4かつ100かつ400で割れる。もしくは4で割れて100で割れない年がうるう年です # なお,関数は以下の仕様とすること. # # # uruu関数の仕様 // うるう年ならture(1),そうでないならfalse(0)を返す関数   # # int uruu(int x){ # #    int ret; # #    うるう年の判定を行う    # #    return( ret ); # # } # 閏年(_年) :- 0 is _年 mod 400. 閏年(_年) :- \+(0 is _年 mod 400), 0 is _年 mod 4, \+(0 is _年 mod 100). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/235 # # [1] 授業単元:プログラミング基礎 # [2] 問題文(含コード&リンク): # キーボードから西暦を表す4桁の数字を数値として読み込み、閏年かどうか判定する。 # 入力された西暦年が1000年以上4000年いかでなければ、その旨を指示してプログラムを終了する。  # 閏年の条件:4で割り切れるが100で割り切れない年を閏年とする。ただし400で割り切れる年を閏年とする。 # それ以外の年は平年とする。 # # キーボードから西暦を表す4桁の数字を数値として読み込み、閏年かどうか判定する。 :- キーボードから西暦を表す4桁の数字を数値として読み込み(_4桁の数字), 閏年かどうか判定する(_4桁の数字,_閏年か否か). キーボードから西暦を表す4桁の数字を数値として読み込み(_4桁の数字) :- write('西暦を表す4桁の数字を入力してください : '), 西暦を表す4桁の数字を数値として読み込み(_4桁の数字),!. キーボードから西暦を表す4桁の数字を数値として読み込み(_4桁の数字) :- キーボードから西暦を表す4桁の数字を数値として読み込み(_4桁の数字). 西暦を表す4桁の数字を数値として読み込み(_4桁の数字) :- get_line(Line), 西暦を表す4桁の数字診断(Line,_4桁の数字),!. 西暦を表す4桁の数字診断(Line,_4桁の数字) :- atom_to_term(Line,_4桁の数字,_), integer(_4桁の数字), 西暦範囲検査(_4桁の数字),!. 西暦を表す4桁の数字診断(Line,_4桁の数字) :- atom_to_term(Line,_4桁の数字,_), \+(integer(_4桁の数字)), writef('入力された %t から整数が得られません。再入力をお願いします。\n',[Line]),!,fail. 西暦を表す4桁の数字診断(Line,_) :- fail. 西暦範囲検査(_4桁の数字) :- _4桁の数字 >= 1000, _4桁の数字 =< 4000,!. 西暦範囲検査(_4桁の数字) :- writef('入力された数字 %t は 1000以上4000以下の範囲にありません。再入力をお願いします。\n',[_4桁の数字]),!, fail. 閏年かどうか判定する(_4桁の数字,閏年) :- 閏年(_4桁の数字),!. 閏年かどうか判定する(_,閏年ではない). 閏年(_年,閏年) :- 0 is _年 mod 400,!. 閏年(_年,閏年) :- 0 is _年 mod 100, !,fail . 閏年(_年,閏年) :- 0 is _年 mod 4,!. 閏年(_年,閏年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/288 # # sqlite v3.6.23.1で、 # comment (text) ,postedtime (int) という形式にて掲示板を作っているのですが、 # 「最新の5コメント、但し、24時間以内の投稿については最大50個まで」を求めたくて # # SELECT comment FROM mm ORDER BY postedtime DESC LIMIT 50 # UNION # SELECT comment FROM mm WHERE postedtime > $nowtime - 3600*24 ORDER BY ptime DESC LIMIT 50 # # としてみたのですが($nowtimeには今の時間を入れてます)、 # 1st ORDER BY term does not match in the result set というエラーが出ます。 # (union前後のクエリそれぞれ単独ではエラーは出ません) # # 欲しい結果を求めるにはどのように書けばいいのでしょうか? # # '最新の5コメント、但し、24時間以内の投稿については最大50個まで'(_テーブル,_現在の時刻,P) :- split(_現在の時刻,[' ','/','-',':','.'],[_年,_月,_日,_時,_分,_秒,_]), テーブル構造(_テーブル,時刻,N), findmax(M,テーブル構造(_テーブル,_,M),Max), length(L1,Max), nth1(N,L1,_時刻), P =.. [_テーブル|L1], 選択(P,_年,_月,_日,_時,_分,_秒,L), append(_,[_時刻|_],L), call(P). 選択(P,_年,_月,_日,_時,_分,_秒,L) :- findsetof(_時刻,( call(P), 時刻が24時間以内(_年,_月,_日,_時,_分,_秒,_時刻)), L1), 要素切り取り(L1,L),!. 選択(P,_年,_月,_日,_時,_分,_秒,L) :- findall(_時刻,( call(P), 時刻が24時間以内(_年,_月,_日,_時,_分,_秒,_時刻)), L1), 整列(L1,L2), 要素切り取り(L2,L),!. 選択(P,_,_,_,_,_,_,L) :- findall(_時刻,( call(P)), L1), 整列(L1,L2), length(L,5), append(_,L,L2),!. 要素切り取り(L1,L) :- length(L1,Length), Length >= 50, length(L,50), append(_,L,L1),!. 要素切り取り(L1,L1) :- length(L1,Length), Length >= 5, length < 50,!. 時刻が24時間以内(_年,12,31,_時,_分,_秒,_時刻) :- split(_時刻,['/','-',':','.'],[_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]), _年_1 is _年 + 1, [_年_1,1,1,_時,_分,_秒,_時刻] @>= [_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]),!. 時刻が24時間以内(_年,2,29,_時,_分,_秒,_時刻) :- うるう年(_年), [_年,3,1,_時,_分,_秒,_時刻] @>= [_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]),!. 時刻が24時間以内(_年,2,28,_時,_分,_秒,_時刻) :- \+(うるう年(_年)), [_年,3,1,_時,_分,_秒,_時刻] @>= [_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]),!. 時刻が24時間以内(_年,_月,30,_時,_分,_秒,_時刻) :- append(_,[_月|_],[4,6,9,11]), _月_1 is _月 + 1, [_年,_月_1,1,_時,_分,_秒,_時刻] @>= [_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]),!. 時刻が24時間以内(_年,_月,31,_時,_分,_秒,_時刻) :- append(_,[_月|_],[1,3,5,7,8,10]), _月_1 is _月 + 1, [_年,_月_1,1,_時,_分,_秒,_時刻] @>= [_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]),!. 時刻が24時間以内(_年,_月,_日,_時,_分,_秒,_時刻) :- split(_時刻,['/','-',':','.'],[_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]), _日_1 is _日 + 1, [_年,_月,_日_1,_時,_分,_秒,_時刻] @>= [_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]),!. うるう年(_年文字列) :- atom(_年文字列), atom_to_term(_年文字列,_年整数,_), !, うるう年(_年整数) . うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100, !, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/7 # # [1] 授業単元:暇つぶし # [2] 問題文(含コード&リンク): # 下記のような2chへの書き込み時刻のログを標準入力より受け取り、 # EOF がきたら現在の !ninja レベルがいくつであるか出力せよ # # !ninja レベルについて # 最初の書き込み時にはレベル1である # 最後にレベルアップした書き込み時刻から24時間以上経過して書き込むと1レベルアップする # # 条件1 一番最初の書き込み時刻以前にはクッキーは存在しないものとする # 条件2 ●無しとする # 条件3 書き込み時刻のログは古いものから順に並んでいるものとする # # 2011/02/11 22:33:44 # 2011/02/12 01:23:45 # 2011/02/14 18:19:20 # '下記のような2chへの書き込み時刻のログを標準入力より受け取り、 EOF がきたら現在の !ninja レベルがいくつであるか出力せよ' :- 一番最初の書き込み時刻以前にはクッキーは存在しないものとする(_ninja_1), get_lines(Lines), ninjaレベルの計測(Lines,_ninja_1,_ninja), writef('現在の !ninja レベルは %t です\n',[_ninja]),!. ninjaレベルの計測([],_ninja,_ninja) :- !. ninjaレベルの計測([_],_ninja,_ninja) :- !. ninjaレベルの計測([_時刻_1,_時刻_2|R],_ninja_1,_ninja) :- '24時間以上経過'(_時刻_1,_時刻_2), _ninji_2 is _ninja_1 + 1, ninjaレベルの計測([_時刻_2|R],_ninja_2,_ninja),!. ninjaレベルの計測([_時刻_1,_時刻_2|R],_ninja_1,_ninja) :- \+('24時間以上経過'(_時刻_1,_時刻_2)), ninjaレベルの計測([_時刻_2|R],_ninja_1,_ninja),!. 一番最初の書き込み時刻以前にはクッキーは存在しないものとする(1). '24時間以上経過'(_時刻_1,_時刻_2) :- sub_atom(_時刻_1,0,10,_,_年月日_1), sub_atom(_時刻_2,0,10,_,_年月日_2), sub_atom(_時刻_1,11,8,_,_時分秒_1), sub_atom(_時刻_1,11,8,_,_時分秒_2), '24時間以上経過診断'(_年月日_1,_年月日_2,_時分秒_1,_時分秒_2), '24時間以上経過診断'(_年月日_1,_年月日_2,_時分秒_1,_時分秒_2) :- _年月日_1 @< _年月日_2, _時分秒_1 @=< _時分秒_2,!. '24時間以上経過診断'(_年月日_1,_年月日_2,_時分秒_1,_時分秒_2) :- \+(_月末日(_年月日_1)), _時分秒_1 @> _時分秒_2, 翌日(_年月日_1,_翌日_1), _翌日_1 @< _年月日_2,!. 翌日(_年月日,_翌日の表示表現) :- sub_atom(_年月日,0,4,_年), sub_atom(_年月日,5,2,_月), sub_atom(_年月日,8,2,_日), 翌日(_年,_月,_日,_翌日の表示表現). 翌日(_年,'12','31',_翌日の表示表現) :- atom_to_term(_年,_年整数,_), _年整数_2 is _年整数 + 1, concat_atom([_年整数_2,/,'01',/,'01'],_翌日の表示表現),!. 翌日(_年,_月,_日,_翌日の表示表現) :- 月末日(_月,_日), 次の数字に対応する二文字の頭部零文字列(_月,_翌月), concat_atom([_年,/,_翌月,/,'01'],_翌日の表示表現),!. 翌日(_年,_月,_日,_翌日の表示表現) :- \+(月末日(_月,_日)), 次の数字に対応する二文字の頭部零文字列(_日,_翌日), concat_atom([_年,/,_翌月,/,_翌日],_翌日の表示表現),!. 次の数字に対応する二文字の頭部零文字列(_数値文字列,_次の数値文字列) :- length(L,2), atom_to_term(_数値文字列,_整数,_), _整数_2 is _整数 + 1, number_chars(_整数_2,Chars), append(L0,Chars,L), all(L0,'0'). 月末日(_年,'02','29') :- atom_to_term(_年,_年整数,_), うるう年(_年整数),!. 月末日(_年,'02','28') :- atom_to_term(_年,_年整数,_), \+(うるう年(_年整数)),!. 月末日(_年,_月,30) :- append(_,[_月|_],['04','06','09','11']),!. 月末日(_年,_月,31) :- append(_,[_月|_],['01','03','05','07','08','10','12']),!. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail . うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは 計画停電グループ所属(グループ1,西荻). 計画停電グループ所属(グループ1,所沢). 計画停電グループ所属(グループ1,横浜南). 計画停電グループ所属(グループ1,けやき台). 計画停電グループ所属(グループ1,狭山ヶ丘). 計画停電グループ所属(グループ1,大井). 計画停電グループ所属(グループ4,上野毛). 計画停電グループ所属(グループ4,大井). 計画停電グループ所属(グループ5,埼玉). 計画停電グループ所属(グループ5,熊谷). % *** user: '計画停電' / 1 *** 計画停電(_年月日) :- 計画停電(_年月日,L), 計画停電表示(L). 計画停電表示(L) :- append(L0,[_グループ|R],L), 表示形式の取得(L0,_表示形式), 営業所並び文字列の取得(_グループ,_営業所並び文字列), wr(_表示形式,[_グループ,_営業所並び文字列]), R = []. 表示形式の取得(L0,_表示形式) :- length(L0,Len), 表示形式(Len,_表示形式). 表示形式(0,' %t 6:20-10:00; 13:50-17:30; %s\n'). 表示形式(1,' %t 9:20-13:00; 16:50-20:30; %s\n'). 表示形式(2,' %t 12:20-16:00; %s\n'). 表示形式(3,' %t 15:20-19:00; %s\n'). 表示形式(4,' %t 17:20-22:00; %s\n'). 営業所並び文字列の取得(_グループ,_営業所並び文字列) :- findall(_営業所,計画停電グループ所属(_グループ,_営業所),_営業所ならび), concat_atom(_営業所ならび,',',_営業所並び文字列). /* 計画停電(_日文字列,L) :- atom(_日文字列), sub_atom(_日文字列,_,2,_,_日文字列), 今日(_今日), 年月日から年月取得(_今日,_年月), concat_atom([_年月,_日文字列],_年月日), 計画停電(_年月日,L),!. 計画停電(_日,L) :- integer(_日), _日 =< 31, 今日(_今日), 年月日から年月取得(_今日,_年月), 整数から文字列(2,_日,_日文字列), concat_atom([_年月,_日文字列],_年月日), 計画停電(_年月日,L),!. 計画停電(_月日文字列,L) :- atom(_月日文字列), _月日文字列 @>= '0101', _月日文字列 @=< '1231', 今日(_今日), 年月日から年取得(_今日,_年), concat_atom([_年,_月日文字列],_年月日), 計画停電(_年月日,L),!. 計画停電(_月日,L) :- integer(_月日), _月日 >= 101, _月日 =< 1231, 今日(_今日), 年月日から年取得(_今日,_年), 整数から文字列(4,_月日,_月日文字列), concat_atom([_年,_月日文字列],_年月日), 計画停電(_年月日,L),!. */ 計画停電(_年月日,L) :- atom(_年月日), atom_length(_年月日,8), count((日付の発生('20110317',_年月日_1,_年月日), _年月日_1 @>= '20110317' , _年月日_1 @=< _年月日),_経過日数), ならびの回転(左方向,_経過日数,[グループ4,グループ5,グループ1,グループ2,グルーブ3],L) . ならびの回転(左方向,0,L,L) :- !. ならびの回転(左方向,N,[A|R1],L) :- N_1 is N - 1, append(R1,[A],L2), ならびの回転(左方向,N_1,L2,L). 日付の発生(_日付,_日付,_日付上限) :- _日付 @> _日付上限,!,fail. 日付の発生(_日付,_日付,_日付上限). 日付の発生(_日付の一,_日付,_日付上限) :- 年・月・日に分解(_日付の一,_年の一,_月の一,_日の一), 翌日(_年の一,_月の一,_日の一,_翌日), 日付の発生(_翌日,_日付,_日付上限). 年・月・日に分解(_年月日,_年,_月,_日) :- sub_atom(_年月日,0,4,_,_年), sub_atom(_年月日,4,2,_,_月), sub_atom(_年月日,6,2,_,_日). 翌日(_年,'12','31',_翌日) :- 翌年(_年,_翌年), concat_atom([_翌年,'01','01'],_翌日),!. 翌日(_年,_月,'31',_翌日) :- append(_,[_月|_],['01','03','05','07','08','10','12']), 翌月(_月,_翌月), concat_atom([_年,_翌月,'01'],_翌日),!. 翌日(_年,_月,'30',_翌日) :- append(_,[_月|_],['04','06','09','11']), 翌月(_月,_翌月), concat_atom([_年,_翌月,'01'],_翌日). 翌日(_年,'02','29',_翌日) :- concat_atom([_年,'03','01'],_翌日),!. 翌日(_年,'02','28',_翌日) :- \+(うるう年(_年)), concat_atom([_年,'03','01'],_翌日),!. 翌日(_年,_月,_日,_翌日) :- 翌日(_日,_翌日の日), concat_atom([_年,_月,_翌日の日],_翌日). 翌月(_月,_翌月) :- atom_to_term(_月,M,_), M2 is M + 1, 整数から文字列(2,M2,_翌月). 翌年(_年,_翌年) :- atom_to_term(_年,Y,_), Y2 is Y + 1, 整数から文字列(4,Y2,_翌年). 翌日(_日,_翌日) :- atom_to_term(_日,D,_), D2 is D + 1, 整数から文字列(2,D2,_翌日). うるう年(_年文字列) :- atom(_年文字列), atom_to_term(_年文字列,_年整数,_), !, うるう年(_年整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/371 # # [1] 授業単元:万年カレンダーの作成 # [2] 問題文(含コード&リンク): # ユーザーが指定した年・月のカレンダーを表示するアプリケーションを作る。 # ユーザーに年と月の入力させ、指定された月から4ヶ月分のカレンダーを表示させる。 # 詳しい説明・仕様 http://ime.nu/www1.axfc.net/uploader/File/so/58289 # # 1.ユーザーが指定可能な日付の範囲 # 西暦1年の1月から西暦9999年の9月まで ※表示範囲は9999年12月まで # # 2.暦の条件 # 2.1.曜日 #  西暦1年1月1日を月曜日とする。 # # 2.2.うるう年 #  ・4で割り切れる年はうるう年 #  ・ただし100で割り切れる年はうるう年ではない #  ・ただし400で割り切れる年はうるう年 # # 2.3.祝日・国民の休日 #  ・祝日が日曜の場合は翌日以降の平日を振替休日にする #  ・国民の休日とは、国民の祝日にはさまれた平日を指す 例)2009/09/22 # # 元旦     1月1日 # 成人の日   1月第2月曜日 # 建国記念日  2月11日 # 春分の日※ # 昭和の日   4月29日 # 憲法記念日  5月3日 # みどりの日  5月4日 # こどもの日  5月5日 # 海の日    7月の第3月曜日 # 敬老の日   9月の第3月曜日 # 秋分の日※ # 体育の日   10月の第2月曜日 # 文化の日   11月3日 # 勤労感謝の日 11月23日 # 天皇誕生日  12月23日 # # 春分の日・秋分の日は次の計算式によって求める。 # a)西暦1980年〜2099年 #  春分の日(3月X日) #   X=INT(20.8431+0.242194*(Year-1980)-INT((Year-1980)/4)) # 秋分の日(9月X日) #   X=INT(23.2488+0.242194*(Year-1980)-INT((Year-1980)/4)) # (Yearは西暦の年、INT()は、括弧内の小数部切り捨てを意味する) # # b)a以外の年 #  春分の日:3月23日,秋分の日:9月23日 # # 3.動作の流れ # 1)プログラムを実行 # 2)年入力をうながすメッセージの表示 ex.西暦何年のカレンダーを表示しますか? # 3)ユーザーが年情報の入力する # 4)(?)入力された年情報が1〜9999だった場合は、月情報の入力をうながすメッセージが表示される。 ex.何月から表示しますか? #  (?)未入力や、無効な数値・文字が入力された場合はエラーメッセージが表示され、再入力をうながして2)にもどる ex.年は1〜9999の範囲で入力してください # 5)ユーザーが月情報を入力する # 6)(?)入力された月情報が1〜12(9999年の場合は1〜9)だった場合は、指定された年月から4ヶ月分のカレンダーが表示される #  (?)未入力や、無効な数値・文字が入力された場合はエラーメッセージが表示され、再入力をうながして4)(?)にもどる ex.月は1〜12の範囲で入力してください # 7)続いてカレンダーを表示するかをユーザーに問う  # ex.続けて表示しますか? 1:次の4ヶ月を表示/2:年と月を指定する/9:終了する ユーザーの入力値により処理続行または終了する # # 4.出力イメージ # ・カレンダーは指定年月から4ヶ月分を一度に表示する # ・各月を横に2ヶ月ずつ、2段に表示する # ・土日祝日及び振替休日は、日付前にマークをつけ、平日と区別する # ・各月ごとのレイアウトが自由  # # # ↓コマンドプロンプトでの出力イメージ # # # 2009 9月 2009 10月 # 日 月 火 水 木 金 土  9月と同じ要領で  #    1 2 3 4 * 5 # @ 6 7 8 9 10 11 *12 # @13 14 15 16 17 18 *19 # @20 #21 $22 #23 24 25 *26 # @27 28 29 30 # # 2009 11月     2009 12月 # 9月と同じ要領で  9月と同じ要領で # # # # # # # # @:日曜日 *:土曜日 #:祝日 $:休日 &:振替休日 # # 1:次の4ヶ月を表示 2:年と月を指定する 9:終了する  カレンダー表示(_年,_月) :- 四ヶ月分のカレンダー((_年,_月,_カレンダー,_年_1,_月_1,_カレンダー_1,_年_2,_月_2,_カレンダー_2,_年_3,_月_3,_カレンダー_3), カレンダー見出し(_年,_月,_年_1,_月_1), 二ヶ月ならびカレンダー表示(_カレンダー,_カレンダー1), write('\n\n'), カレンダー見出し(_年_2,_月_2,_年_3,_月_3), 二ヶ月ならびカレンダー表示(_カレンダー_2,_カレンダー3),!. カレンダー見出し(_年_1,_月_1,_年_2,_月_2) :- write_formatted('%4d年%2d月 %4d年%2d月\n',[_年_1,_月_1,_年_2,_月_2]),!. 二ヶ月ならびカレンダー表示([],[]) :- !. 二ヶ月ならびカレンダー表示([L1|R1],[L2|R2]) :- flat(L1,S1), flat(L2,S2), write_formatted('%t %t\n',[S1,S2]), 二ヶ月ならびカレンダー表示(R1,R2). 四ヶ月分のカレンダー(_年,_月,_カレンダー,_年_1,_月_1,_カレンダー_1,_年_2,_月_2,_カレンダー_2,_年_3,_月_3,_カレンダー_3) :- カレンダー(_年,_月,_カレンダー), 翌月(_年,_月,_年_1,_月_1), カレンダー(_年_1,_月_1,_カレンダー_1), 翌月(_年_1,_月_1,_年_2,_月_2), カレンダー(_年_2,_月_2,_カレンダー_2), 翌月(_年_2,_月_2,_年_3,_月_3), カレンダー(_年_3,_月_3,_カレンダー_3),!. カレンダー(_年,_月,_カレンダー) :- length(Cal,35), 'Zellerの公式を用いて曜日を得る'(_振替休日の年,_振替休日の月,_日,_曜日を表す値,日曜), length(L0,_曜日を表す値), append(L0,L1,Cal), この月の最終日は(_最終日), 日付を振る(1,_最終日,L1), 付加する符号を振る(1,_最終日,_年,_月,L1), すべての変数に空白を埋める(Cal,_カレンダー),!. 日付を振る(N,_最終日,_) :- N > _最終日,!. 日付を振る(N,_最終日,[[_,_,_,N]|R]) :- N < 10, N2 is N + 1, 日付を振る(N2,_最終日,R),!. 日付を振る(N,_最終日,[[_,_,N10,N0]|R]) :- N >= 10, N10 is N // 10, N0 is N mod 10, N2 is N + 1, 日付を振る(N2,_最終日,R),!. 付加する符号を振る(N,_最終日,_年,_月,[[_,'#',D1,D2]|R]) :- 国民の祝日(_,_年,_月,N), N2 is N + 1, 付加する符号を振る(N2,_最終日,_年,_月,R),!. 付加する符号を振る(N,_最終日,_年,_月,[[_,'$',D1,D2]|R]) :- 国民の休日(_,_年,_月,N), N2 is N + 1, 付加する符号を振る(N2,_最終日,_年,_月,R),!. 付加する符号を振る(N,_最終日,_年,_月,[[_,'&',D1,D2]|R]) :- 振替休日(_,_年,_月,N), N2 is N + 1, 付加する符号を振る(N2,_最終日,_年,_月,R),!. 付加する符号を振る(N,_最終日,_年,_月,[[_,'@',D1,D2]|R]) :- 'Zellerの公式を用いて曜日を得る'(_振替休日の年,_振替休日の月,_日,_曜日を表す値,日曜), N2 is N + 1, 付加する符号を振る(N2,_最終日,_年,_月,R),!. 付加する符号を振る(N,_最終日,_年,_月,[[_,'*',D1,D2]|R]) :- 'Zellerの公式を用いて曜日を得る'(_振替休日の年,_振替休日の月,_日,_曜日を表す値,土曜), N2 is N + 1, 付加する符号を振る(N2,_最終日,_年,_月,R),!. 付加する符号を振る(N,_最終日,_年,_月,[_|R]) :- N2 is N + 1, 付加する符号を振る(N2,_最終日,_年,_月,R),!. すべての変数に空白を埋める([],[]) :- !. すべての変数に空白を埋める([V|R1],[[' ',' ',' ',' ']|R2]) :- var(V), すべての変数に空白を埋める(R1,R2),!. すべての変数に空白を埋める([L|R1],[L1|R2]) :- 変数を空白に変換(L,L1), すべての変数に空白を埋める(R1,R2),!. 変数を空白に変換([],[]) :- !. 変数を空白に変換([V|R1],[' '|R1]) :- var(V), 変数を空白に変換(R1,R2),!. 変数を空白に変換([V|R1],[V|R1]) :- \+(var(V)), 変数を空白に変換(R1,R2),!. この月の最終日は(_年,2,29) :- うるう年(_年),!. この月の最終日は(_年,2,28) :- \+(うるう年(_年)),!. この月の最終日は(_年,_月,31) :- append(_,[_月|_],[1,3,5,7,8,10,12]),!. この月の最終日は(_年,_月,30) :- append(_,[_月|_],[4,6,9,11]),!. 祝日が日曜の場合は翌日以降の平日を振替休日にする(_振替休日の年,_振替休日の月,_振替休日の日) :- 国民の祝日(_,_振替休日の年,_振替休日の月,_日), 'Zellerの公式を用いて曜日を得る'(_振替休日の年,_振替休日の月,_日,_,日曜), 振替休日を探す(_振替休日の年,_振替休日の月,_日,_振替休日の日). 国民の休日とは、国民の祝日にはさまれた平日を指す(_国民の休日の年,_国民の休日の月,_国民の休日の日) :- 前日(_国民の休日の年,_国民の休日の月,_国民の休日の日,_前日の年,_前日の月,_前日の日), 翌日(_国民の休日の年,_国民の休日の月,_国民の休日の日,_翌日の年,_翌日の月,_翌日の日), 国民の祝日(_,_前日の年,_前日の月,_前日の日), 国民の祝日(_,_翌日の年,_翌日の月,_翌日の日),!. 振替休日を探す(_振替休日の年,_振替休日の月,_日,_振替休日の日) :- between(_日,31,_振替休日の日), \+(国民の祝日(_,_振替休日の年,_振替休日の月,_振替休日の日)), 'Zellerの公式を用いて曜日を得る'(_振替休日の年,_振替休日の月,_振替休日の日,_,_曜日), \+(_曜日=日曜),!. 翌月(_年,12,_翌年,1) :- _翌年 is _年 + 1,!. 翌月(_年,_月,_年,_翌月) :- _翌月 is _月 + 1. 前日(_年,_月,_日,_前日の年,_前日の月,_前日の日) :- 前日のの月がわり調整(_年,_月,_日,_前日の年,_前日の月,_前日の日). 翌日(_年,_月,_日,_翌日の年,_翌日の月,_翌日の日) :- 翌日の月がわり調整(_年,_月,_日,_翌日の年,_翌日の月,_翌日の日). 前日の月がわり調整(_整数年,1,1,_変更された整数年,12,31) :- _変更された整数年 は _整数年 - 1,!. 前日の月がわり調整(_整数年,_整数月,1,_整数年,_変更された整数月,31) :- member(_整数月,[2,4,6,8,9,11]), _変更された整数月 は _整数月 - 1,!. 前日の月がわり調整(_整数年,_整数月,1,_整数年,_変更された整数月,30) :- member(_整数月,[5,7,10,12]), _変更された整数月 は _整数月 - 1,!. 前日の月がわり調整(_整数年,3,1,_整数年,2,29) :- 0 is _整数年 mod 4,!. 前日の月がわり調整(_整数年,3,1,_整数年,2,28) :- \+(0 is _整数年 mod 4),!. 前日の月がわり調整(_整数年,_整数月,_整数日,_整数年,_整数月,_変更された整数日) :- _変更された整数日 は _整数日 - 1,!. 翌日の月がわり調整(_整数年,12,31,_変更された整数年,1,1) :- _変更された整数年 は _整数年 + 1,!. 翌日の月がわり調整(_整数年,_整数月,30,_整数年,_変更された整数月,1) :- member(_整数月,[4,6,8,9,11]), _変更された整数月 は _整数月 + 1,!. 翌日の月がわり調整(_整数年,_整数月,31,_整数年,_変更された整数月,1) :- member(_整数月,[1,3,5,7,10]), _変更された整数月 は _整数月 + 1,!. 翌日の月がわり調整(_整数年,2,29,_整数年,3,1) :- 0 is _整数年 mod 4,!. 翌日の月がわり調整(_整数年,2,28,_整数年,3,1) :- \+(うるう年(_整数年)),!. 翌日の月がわり調整(_整数年,_整数月,_整数日,_整数年,_整数月,_変更された整数日) :- _変更された整数日 は _整数日 + 1,!. 祝休日の記号(日曜日,'@'). 祝休日の記号(土曜日,'*'). 祝休日の記号(国民の祝日,'#'). 祝休日の記号(国民の休日,'$'). 祝休日の記号(振替休日,'&'). 国民の祝日(元旦,_年,1,1). 国民の祝日(成人の日,1,_日) :- between(8,14,_日), 'Zellerの公式を用いて曜日を得る'(_年,1,_日,_,月曜). 国民の祝日(建国記念日,_年,2,11). 国民の祝日(春分の日,_年,3,_日) :- 春分の日(_年,3,_日). 国民の祝日(昭和の日,_年,4,29). 国民の祝日(憲法記念日,_年,5,3). 国民の祝日(みどりの日,_年,5,4). 国民の祝日(こどもの日,_年,5,5). 国民の祝日(海の日,_年,7,_日) :- between(15,21,_日), 'Zellerの公式を用いて曜日を得る'(_年,7,_日,_,月曜). 国民の祝日(敬老の日,_年,9,_日) :- between(15,21,_日), 'Zellerの公式を用いて曜日を得る'(_年,9,_日,_,月曜). 国民の祝日(秋分の日,_年,9,_日) :- 秋分の日(_年,9,_日). 国民の祝日(体育の日,_年,10,_日) :- between(8,14,_日), 'Zellerの公式を用いて曜日を得る'(_年,10,_日,_,月曜). 国民の祝日(文化の日,_年,11,3). 国民の祝日(勤労感謝の日,_年,11,23). 国民の祝日(天皇誕生日,_年,12,23). 春分の日(_年,3,_日) :- _年 >= 1980, _年 =< 2099, _日 is truncate(20.8431+0.242194*(_年-1980)-truncate((_年-1980)/4)),!. 春分の日(_年,3,23). 秋分の日(_年,9,_日) :- _年 >= 1980, _年 =< 2099, _日 is truncate(23.2488+0.242194*(_年-1980)-truncate((_年-1980)/4)),!. 秋分の日(_年,9,23). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100, !, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 'Zellerの公式を用いて曜日を得る'(_年,1,_日,_曜日を表す値,_曜日) :- _年_1 is _年 - 1, 'Zellerの公式を用いて曜日を得る'(_年_1,13,_日,_曜日を表す値,_曜日),!. 'Zellerの公式を用いて曜日を得る'(_年,2,_日,_曜日を表す値,_曜日) :- _年_1 is _年 - 1, 'Zellerの公式を用いて曜日を得る'(_年_1,14,_日,_曜日を表す値,_曜日),!. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 曜日を表す値(_曜日を表す値,_曜日),!. 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/666 # # [1] 授業単元: # [2] 問題文: http://ime.nu/ux.getuploader.com/sanada1678/download/17/%E3%82%B3%E3%83%94%E3%83%BC+%EF%BD%9E+%E8%AA%B2%E9%A1%8C.csv # # ある駐車場が昼間20分100円の料金で駐車場を貸しています。 # 左のデータは入出庫のデータです。 # 駐車時間の長さの分類はおもに # 20分,40分,1時間,2時間,6時間,12時間,24時間以上 # です。これをもとに次の問題を解決せよ。 # # 毎時00分時点での(つまり1時間ごとの) # 駐車している駐車台数を自動計算するように表計算のプログラムを作成したい。 # # 1.1時間の間(たとえばその日の13時から14時)に入場してきた車の台数 #   その時間内に清算して出場して行った台数を自動計算するように表計算の #   プログラムを作成せよ。その結果として、00分時点での駐車台数が自動計算できる #   ようにプログラムを作成せよ。 # # 2.一定期間内(例えば1日や一週間と特定して)での #   駐車時間の長さで分類した台数 #   たとえば 30分以内,1H,2H,6H,12H,24H以上 #   が自動計算できるようにプログラムを作成せよ。 # # 3.とりあえず最初に駐車していた台数を0台として表を作成せよ。 #   それが出来たら最初に駐車していた台数を任意に設定することで #   その後の駐車している台数を自動計算できるように表を作成せよ。 # # 11月、12月などのデータを入力しても瞬時に計算できるようにしておく。 # 夜間の駐車料金などもデータから推測せよ。 # # 2010/10/31 20:38,2010/10/31 23:24,,300,300,,,,,,,,, # 2010/10/31 10:47,2010/10/31 22:12,,600,600,,,,,,,,, # 2010/10/31 12:25,2010/10/31 22:06,,600,600,,,,,,,,, # 2010/10/31 19:13,2010/10/31 21:52,,500,500,,,,,,,,, # 2010/10/31 18:49,2010/10/31 21:50,,600,600,,,,,,,,, # 2010/10/31 15:30,2010/10/31 21:45,,600,600,,,,,,,,, # 2010/10/31 10:06,2010/10/31 21:37,,600,600,,,,,,,,, # 2010/10/30 21:57,2010/10/31 21:32,,600,600,,,,,,,,, # 2010/10/31 13:02,2010/10/31 21:29,,600,600,,,,,,,,, # 2010/10/31 20:25,2010/10/31 21:16,,100,100,,,,,,,,, # 2010/10/30 21:19,2010/10/31 21:02,,600,600,,,20,,,,,, # 2010/10/31 9:43,2010/10/31 20:53,,600,600,,,,,,,,, # 2010/10/31 17:45,2010/10/31 20:43,,600,600,,,,,,,,, # 2010/10/31 18:38,2010/10/31 20:38,,600,600,,,00,,,,,, # 2010/10/29 6:53,2010/10/31 20:23,,1800,1800,,,,,,,,, # 2010/10/31 8:04,2010/10/31 19:53,,600,600,,,,,,,,, # 2010/10/31 5:32,2010/10/31 19:25,,600,600,,,,,,,,, # 2010/10/31 12:19,2010/10/31 19:15,,600,600,,,,,,,,, # 2010/10/31 5:53,2010/10/31 19:09,,600,600,,,00,,,,,, /* 'ある駐車場が昼間20分100円の料金で駐車場を貸しています。'. */ '左のデータは入出庫のデータです。'(_入出庫データファイル,_入出庫データならび) :- get_split_lines(_入出庫データファイル,[','],_入出庫データならび). /* '駐車時間の長さの分類はおもに20分,40分,1時間,2時間,6時間,12時間,24時間以上です。'(_駐車開始時刻,_駐車終了時刻,_駐車時間) :- 駐車時間は同一日である(_駐車開始時刻,_駐車終了時刻). '駐車時間の長さの分類はおもに20分,40分,1時間,2時間,6時間,12時間,24時間以上です。'(_駐車開始時刻,_駐車終了時刻,_駐車時間) :- \+(駐車時間は同一日である(_駐車開始時刻,_駐車終了時刻)). */ '毎時00分時点での(つまり1時間ごとの)駐車している駐車台数を自動計算する'(_毎時00分時点での駐車している駐車台数ならび) :- '左のデータは入出庫のデータです。'(_入出庫データファイル,_入出庫データならび), '毎時00分時点での(つまり1時間ごとの)駐車している駐車台数を自動計算するように表計算のプログラムを作成したい。'(_入出庫データならび,_毎時00分時点での駐車している駐車台数ならび). '毎時00分時点での(つまり1時間ごとの)駐車している駐車台数を自動計算する'(LL,LL2) :- findsetof([_年,_月,_日,_時],( append(_,[L|R1],LL), 発生した年・月・日・時(L,_年,_月,_日,_時)), LL1), findall([_年,_月,_日,_時,_駐車台数],( append(_,[[_年,_月,_日,_時]|_],LL1), '毎時00分時点での(つまり1時間ごとの)駐車している駐車台数'(LL,_年,_月,_日,_時,_駐車台数)), LL2). 発生した年・月・日・時([_時刻|_],_年,_月,_日,_時) :- split(_時刻,[' ','/',':'],[_年,_月,_日,_時|_]). 発生した年・月・日・時([_,_時刻|_],_年,_月,_日,_時) :- split(_時刻,[' ','/',':'],[_年,_月,_日,_時|_]). '毎時00分時点での(つまり1時間ごとの)駐車している駐車台数'(LL,_年,_月,_日,_時,_駐車台数) :- count(( member([A,B|_],LL), split(A,['/',' ',':'],LA), split(B,['/',' ',':'],LB), LA @=< [_年,_月,_日,_時,0], LB @>= [_年,_月,_日,_時,0]), _駐車台数),!. '1時間の間(たとえばその日の13時から14時)に入場してきた車の台数その時間内に清算して出場して行った台数を自動計算する'(LL,_年,_月,_日,_時,_入場車数,_出場車数) :- count(( member([A|_],LL), split(A,['/',' ',':'],LA), LA @>= [_年,_月,_日,_時,0], LA @=< [_年,_月,_日,_時,59]), _入場車数), count(( member([_,A|_],LL), split(A,['/',' ',':'],LA), LA @>= [_年,_月,_日,_時,0], LA @=< [_年,_月,_日,_時,59]), _出場車数),!. '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'(LL,_時刻下限,_時刻上限,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上) :- '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'(LL,_時刻下限,_時刻上限,0,0,0,0,0,0,0,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上). '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'([],_時刻下限,_時刻上限,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上) :- !. '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'([[_入場時刻,_出場時刻|_]|R],_時刻下限,_時刻上限,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上) :- split(_入場時刻,[' ','/',':'],[_年_1,_月_1,_日_1,_時_1,_分_1]), split(_出場時刻,[' ','/',':'],[_年_2,_月_2,_日_2,_時_2,_分_2]), [_年_1,_月_1,_日_1,_時_1,_分_1] @>= _時刻下限, [_年_2,_月_2,_日_2,_時_2,_分_2] @=< _時刻上限, 入場時刻と出場時刻の時間差分単位(_入場時刻,_出場時刻,_時間差分単位), 時間差単位(_時間差分単位,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_2,_2H_2,_2H_2,_6H_2,_22H_2,_24H_2,_24H以上_2), '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'(R,_時刻下限,_時刻上限,_30分以内_2,_1H_2,_2H_2,_6H_2,_12H_2,_24H_2,_24H以上_2,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上). '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'([_|R],_時刻下限,_時刻上限,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上) :- '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'(R,_時刻下限,_時刻上限,_30分以内_1,_1H_1,_1H_1,_6H_1,_12H_1,_14H_1,_14H以上_1,_30分以内,_1H,_1H,_6H,_12H,_14H,_14H以上). 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_2,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1) :- _分 =< 30, _30分以内_2 is _30分以内_1 + 1,!. 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_2,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1) :- _分 >= 30,_分 < 60, _1H_2 is _1H_1 + 1,!. 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_1,_2H_2,_6H_1,_12H_1,_24H_1,_24H以上_1) :- _分 >= 60,_分 < 120, _2H_2 is _2H_1 + 1,!. 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_1,_2H_1,_6H_2,_12H_1,_24H_1,_24H以上_1) :- _分 >= 120,_分 < 360, _6H_2 is _6H_1 + 1,!. 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_2,_24H_1,_24H以上_1) :- _分 >= 360,_分 < 720, _12H_2 is _12H_1 + 1,!. 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_2,_24H以上_1) :- _分 >= 720,_分 < 1440, _24H_2 is _24H_1 + 1,!. 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_2) :- _分 >= 1440, _24H以上_2 is _24H以上_1 + 1,!. 'とりあえず最初に駐車していた台数を0台として表を作成せよ。それが出来たら最初に駐車していた台数を任意に設定することでその後の駐車している台数を自動計算できるように表を作成せよ。'. '11月、12月などのデータを入力しても瞬時に計算できるようにしておく。夜間の駐車料金などもデータから推測せよ。'. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 入場時刻と出場時刻の時間差分単位(_入場時刻,_出場時刻,_時間差分単位) :- atom(_入場時刻), atom(_出場時刻), split(_入場時刻,['/',' ',':'],[_年_1,_月_1,_日_1,_時_1,_分_1]), split(_出場時刻,['/',' ',':'],[_年_2,_月_2,_日_2,_時_2,_分_2]), 出場時刻と入場時刻の時間差分単位([_年_1,_月_1,_日_1,_時_1,_分_1],[_年_2,_月_2,_日_2,_時_2,_分_2],_時間差分単位). 入場時刻と出場時刻の時間差分単位([_年,_月,_日,_時,_分_1],[_年,_月,_日,_時,_分_2],_時間差分単位) :- _時間差分単位 is _分2 - _分1,!. 入場時刻と出場時刻の時間差分単位([_年,_月,_日,_時_1,_分_1],[_年,_月,_日,_時_2,_分_2],_時間差分単位) :- _時間差分単位 is (60 * _時_2 + _分_2) - (60 * _時_1 + _分1),!. 入場時刻と出場時刻の時間差分単位([_年,_月,_日_1,_時_1,_分_1],[_年,_月,_日_2,_時_2,_分_2],_時間差分単位) :- _時間差分単位 is (1440 * _日_2 + 60 * _時_2 + _分_2) - (1440 * _日_1 + 60 * _時_1 + _分1),!. 入場時刻と出場時刻の時間差分単位([_年,_月_1,_日_1,_時_1,_分_1],[_年,_月_2,_日_2,_時_2,_分_2],_時間差分単位) :- _月_2_1 is _月_2 - 1, findsum(_月日数,( for(_月_1,_月,_月_2_1), 月日数(_年_1,_月,_月日数)), _月日数合計の一), _月日数合計 is truncate(_月日数合計の一), _時間差分単位 is (1440 * _月日数合計 + 1440 * _日_2 + 60 * _時_2 + _分_2) - (1440 * _日_1 + 60 * _時_1 + _分_1),!. 入場時刻と出場時刻の時間差分単位([_年_1,_月_1,_日_1,_時_1,_分_1],[_年_2,_月_2,_日_2,_時_2,_分_2],_時間差分単位) :- _年_2_1 is _年_2 - 1, findsum(_年日数,( for(_年_1,_年,_年_2_1), 年日数(_年,_年日数)), _年日数合計の一), _年日数合計 is truncate(_年日数合計の一), _月_1_1 is _月_1 - 1, findsum(_月日数,( for(0,_月,_月_1_1), 月日数(_年_1,_月,_月日数)), _月日数合計の一), _月日数合計_1 is truncate(_月日数合計の一), _月_2_1 is _月_2 - 1, findsum(_月日数,( for(0,_月,_月_2_1), 月日数(_年_2,_月,_月日数)), _月日数合計の二), _月日数合計_2 is truncate(_月日数合計の二), _時間差分単位 is (1440 * _年日数の合計 + 1440 * _月日数合計_2 + 1440 * _日_2 + 60 * _時_2 + _分_2) - (1440 * _月日数合計_1 + 1440 * _日_1 + 60 * _時_1 + _分_1),!. 年日数(_年,366) :- うるう年(_年),!. 年日数(_年,365). 月日数(_年,2,29) :- うるう年(_年),!. 月日数(_年,2,29) :- \+(うるう年(_年)),!. 月日数(_年,_月,31) :- append(_,[_月|_],[1,3,5,7,8,10,12]),!. 月日数(_年,_月,30) :- append(_,[_月|_],[4,6,9,11]),!. 月日数(_,0,0). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail . うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/303 # # [1] 授業単元:プログラミング # # [2] 問題文(含コード&リンク): # 以下のようなカレンダープログラム mycal を作成せよ。 # ◦ 引数なしで実行されると、今月のカレンダーを出力する # ◦ 引数1個で実行されると、その引数を月とみなし、その年のその月のカレンダーを出力する # ◦ 引数2個で実行されると、第一引数を月、第二引数を年とみなしてカレンダーを出力する。 # # 私のカレンダー :- 今日(_年,_月,_), 日曜から開始するカレンダー(_年,_月). 私のカレンダー(_月) :- 今日(_年,_,_), 日曜から開始するカレンダー(_年,_月). 私のカレンダー(_月,_年) :- 日曜から開始するカレンダー(_年,_月). 日曜から開始するカレンダー(_年,_月) :- その月の日数(_年,_月,_日数), 'Zellerの公式を用いて曜日を得る'(_年,_月,1,_曜日を表す値,_曜日), length(L,35), 日付を埋める(1,_日数,L), ならびの回転(右方向,_曜日を表す値,L,L1), 日曜から開始するカレンダーを表示する(_年,_月,L1). 'Zellerの公式を用いて曜日を得る'(_年,1,_日,_曜日を表す値,_曜日) :- 前年(_年,_前年), 'Zellerの公式を用いて曜日を得る'(_前年,13,_日,_曜日を表す値,_曜日),!. 'Zellerの公式を用いて曜日を得る'(_年,2,_日,_曜日を表す値,_曜日) :- 前年(_年,_前年), 'Zellerの公式を用いて曜日を得る'(_前年,14,_日,_曜日を表す値,_曜日),!. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _曜日を表す値 is (_年 + _年 // 4 - _年 // 100 + _年 // 400 + ((13 * _月 + 8) // 5 + _日)) mod 7, 曜日を表す値(_曜日を表す値,_曜日),!. 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). その月の日数(_年,_月,31) :- append(_,[_月|_],[1,3,5,7,8,10,12]),!. その月の日数(_年,_月,30) :- append(_,[_月|_],[4,6,9,11]),!. その月の日数(_年,2,29) :- うるう年(_年),!. その月の日数(_年,2,28) :- \+(うるう年),!. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100, !,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 前年(_年,_前年) :- _前年 is _年 - 1. 日付を埋める(_日数,_日数,[_日数|_]) :- !. 日付を埋める(N,_日数,[N|R]) :- N2 is N + 1, 日付を埋める(N2,_日数,R). 日曜から開始するカレンダーを表示する(_年,_月,L) :- write_formatted(' %t 年 %t 月\n\n 日 月 火 水 木 金 土\n',[_年,_月]), カレンダーの週間表示(L). カレンダーの週間表示([]) :- !. カレンダーの週間表示([_1,_2,_3,_4,_5,_6,_7|R]) :- 日毎の表示([_1,_2,_3,_4,_5,_6,_7]), カレンダーの週間表示(R). 日毎の表示([]) :- !. 日毎の表示([D|R]) :- integer(D), write_formatted(' %2d ',[D]), 日毎の表示(R). 日毎の表示([D|R]) :- var(D), write(' '), 日毎の表示(R). 今日(_年整数,_月整数,_日整数) :- Time is time, localtime(Time,_年整数,_月整数,_日整数,_曜日番号,_年初からの経日,_時,_分,_秒). ならびの回転(右方向,N,L1,L2) :- length(R,N), append(L0,R,L1), append(R,L0,L2),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/409 # # [1] 授業単元: プログラミングおよび演習 # [2] 問題文(含コード&リンク): # 1.解答例のカレンダー(下にリンクはってます)について、dayofweek()を再帰で書き直せ。 #  ◦ある月の1日の曜日は、前の月の日数と1日の曜日から計算できる # ◦ある年の1月1日の曜日は、前の年の日数と前の年の1月1日の曜日から、あるいは、その年の日数と次の年の1月1日の曜日から計算できる # ◦2000年1月1日は土曜日である # # 2.このプログラムについて、任意の年月についてdayofweek() の呼び出し回数が何回になるかを理論的に考察せよ。また、呼び出し回数を計測し、結果が実際に理論と合致しているかを確認せよ。 # 2.ヒント:呼出し回数を数えるためにグローバル変数を使用する # # ある年・ある月の一日の曜日は(_年,_月,_曜日) :- うるう年(_年), ある年の一月一日の曜日は(_年,_曜日ならび1,_), 日めくりカレンダ(うるう年,_年,_曜日ならび1,_日めくりカレンダ), append(_,[_月/1/_曜日|_],_日めくりカレンダ),!. ある年・ある月の一日の曜日は(_年,_月,_曜日) :- \+(うるう年(_年)), ある年の一月一日の曜日は(_年,_曜日ならび1,_), 日めくりカレンダ(平年,_年,_曜日ならび1,_日めくりカレンダ), append(_,[_月/1/_曜日|_],_日めくりカレンダ),!. ある年の一月一日の曜日は(_年,_曜日ならび,_曜日) :- '2000年1月1日は土曜日である'(_曜日ならびの一). ある年の一月一日の曜日は(2000,_年,_曜日ならびの一,_曜日ならび), _曜日ならび = [_曜日|_],!. ある年の一月一日の曜日は(_年,_年,_曜日順ならび,_曜日順ならび) :- !. ある年の一月一日の曜日は(_N,_年,_曜日順ならび1,_曜日順ならび) :- _年 >= 2000, うるう年(_N), ならびの回転(左方向,366,_曜日順ならび1,_曜日順ならび2), _N2 is _N + 1, ある年の一月一日の曜日は(_N2,_年,_曜日順ならび2,_曜日順ならび). ある年の一月一日の曜日は(_N,_年,_曜日順ならび1,_曜日順ならび) :- _年 >= 2000, \+(うるう年(_N)), ならびの回転(左方向,365,_曜日順ならび1,_曜日順ならび2), _N2 is _N + 1, ある年の一月一日の曜日は(_N2,_年,_曜日順ならび2,_曜日順ならび). ある年の一月一日の曜日は(_N,_年,_曜日順ならび1,_曜日順ならび) :- _年 < 2000, _N1 is _N - 1, うるう年(_N1), ならびの回転(右方向,366,_曜日順ならび1,_曜日順ならび2), ある年の一月一日の曜日は(_N1,_年,_曜日順ならび2,_曜日順ならび). ある年の一月一日の曜日は(_N,_年,_曜日順ならび1,_曜日順ならび) :- _年 < 2000, _N1 is _N - 1, \+(うるう年(_N1)), ならびの回転(右方向,365,_曜日順ならび1,_曜日順ならび2), ある年の一月一日の曜日は(_N1,_年,_曜日順ならび2,_曜日順ならび). '2000年1月1日は土曜日である'([土,日,月,火,水,木,金]). 月日数ならび(平年,[1:31,2:28,3:31,4:30,5:31,6:30,7:31,8:31,9:30,10:31,11:30,12:31]). 月日数ならび(うるう年,[1:31,2:29,3:31,4:30,5:31,6:30,7:31,8:31,9:30,10:31,11:30,12:31]). 日めくりカレンダの生成(平年,_曜日ならび,_日めくりカレンダ) :- 月日数ならび(平年,L), 日めくりカレンダの生成(L,_曜日ならび,_日めくりカレンダの一), flat(_日めくりカレンダの一,_日めくりカレンダ). 日めくりカレンダの生成(うるう年,_曜日ならび,_日めくりカレンダ) :- 月日数ならび(うるう年,L), 日めくりカレンダの生成(L,_曜日ならび,_日めくりカレンダの一), flat(_日めくりカレンダの一,_日めくりカレンダ). 日めくりカレンダの生成([],_,[]) :- !. 日めくりカレンダの生成([[_月:_末日]|R1],_曜日ならび1,[L|R2]) :- 一ヶ月分の日めくりを生成(1,_末日,_曜日ならび1,_曜日ならび2,L), 日めくりカレンダの生成(R1,_曜日ならび2,R2). 一ヶ月分の日めくりを生成(N,_末日,_月,_曜日ならび,_曜日ならび,[]) :- N > _末日,!. 一ヶ月分の日めくりを生成(N,_末日,_月,[_曜日|R4],_曜日ならび,[_月/N/_曜日|R]) :- N2 is N + 1, ならびの回転(左方向,1,[_曜日|R4],_曜日ならび2), 一ヶ月分の日めくりを生成(N2,_末日,_月,_曜日ならび2,_曜日ならび,R). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/502 # # 元データの日付(スケジュールとかログの日付)を全件検索するとします。 # その時、「その時刻より後の18時」を取得(生成)するうまい方法はあるでしょうか。 # 言い換えると、日付の繰り上がりに対して小技があったら教えてください。 # # ターゲットデータベースはH2Databaseですが、「Oracleならこんな方法が(ry」とかでも # 勉強になりますのでお願いします。 # # 元データ # ------------------- # 2010-10-01 01:00:00 # 2010-10-03 17:00:00 # 2010-10-04 20:00:00 # ------------------- # # 欲しいデータ # ------------------- # 2010-10-01 01:00:00 2010-10-01 18:00:00 # 2010-10-03 17:00:00 2010-10-03 18:00:00 # 2010-10-04 20:00:00 2010-10-05 18:00:00 # ------------------- # '元データの日付(スケジュールとかログの日付)を全件検索するとします。その時、「その時刻より後の18時」を取得(生成)する'(_欲しいデータ) :- データベース(_元のデータ), 次の18時の時刻文字列表現(_元のデータ,_次の18時の時刻文字列表現), concat_atom([_元のデータ,' ',_次の18時の時刻文字列表現],_欲しいデータ). 次の18時の時刻文字列表現(_時刻文字列表現,_次の18時の時刻文字列表現) :- 時刻文字列表現から年、月、日、時、分、秒を得る(_時刻文字列,_年,_月,_日,_時,_分,_秒), _時 < 18, write_formatted_atom(_次の18時の時刻文字列表現,'%4d-%02d-%02d 18:00:00',[_年,_月,_日]),!. 次の18時の時刻文字列表現(_時刻文字列表現,_次の18時の時刻文字列表現) :- 翌日(_年,_月,_日,_翌日の年,_翌日の月,_翌日の日), write_formatted_atom(_次の18時の時刻文字列表現,'%4d-%02d-%02d 18:00:00',[_翌日の年,_翌日の月,_翌日の日]),!. 時刻文字列表現から年、月、日、時、分、秒を得る(_時刻文字列,_年,_月,_日,_時,_分,_秒) :- split(_時刻文字列,[' ','-',':'],[_年,_月,_日,_時,_分,_秒]), _時 < 18. 翌日(_翌日の年整数,1,31,_翌日の年整数,2,1) :- !. 翌日(_翌日の年整数,3,31,_翌日の年整数,4,1) :- !. 翌日(_翌日の年整数,4,30,_翌日の年整数,5,1) :- !. 翌日(_翌日の年整数,5,31,_翌日の年整数,6,1) :- !. 翌日(_翌日の年整数,6,30,_翌日の年整数,7,1) :- !. 翌日(_翌日の年整数,7,31,_翌日の年整数,8,1) :- !. 翌日(_翌日の年整数,8,31,_翌日の年整数,9,1) :- !. 翌日(_翌日の年整数,9,30,_翌日の年整数,10,1) :- !. 翌日(_翌日の年整数,10,31,_翌日の年整数,11,1) :- !. 翌日(_翌日の年整数,11,30,_翌日の年整数,12,1) :- !. 翌日(_翌日の年整数,2,28,_翌日の年整数,3,1) :- \+(うるう年(_翌日の年整数)),!. 翌日(_翌日の年整数,2,29,_翌日の年整数,3,1) :- うるう年(_翌日の年整数),!. 翌日(_年整数,12,31,_翌日の年整数,1,1) :- _翌日の年整数 is _年整数 + 1,!. 翌日(_翌日の年整数,_翌日の月整数,_日整数,_翌日の年整数,_翌日の月整数,_翌日の日整数) :- _翌日の日整数 is _日整数 + 1,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/800 # # [1] 授業単元:プログラミング実習 # [2] 問題文(含コード&リンク):入力された1〜2010の範囲において閏年を判断するプログラムを作成せよ。 # 閏年の場合、閏年と表示。 # 閏年でない場合、平年と表示。 # 1〜2010の範囲外であるときは判定不可と表示するようにする。 # ルール: # 入力された値が4の倍数のとき、あるいは400の倍数のときは閏年であり、 # 入力された値が100の倍数のとき(100,200,300,500・・・など)は閏年ではない。 # # '入力された1〜2010の範囲において閏年を判断する' :- '1〜2010の範囲の値を入力する'(_値), '閏年の場合、閏年と表示。閏年でない場合、平年と表示。'(_値). '1〜2010の範囲の値を入力する'(_値) :- get_line(Line), 診断(Line,_値),!. '1〜2010の範囲の値を入力する'(_値) :- '1〜2010の範囲の値を入力する'(_値). 診断(Line,_値) :- atom_to_term(Line,_値,_), integer(_値),!. 診断(Line,_値) :- write_formatted('入力された %t は整数ではありません\n再入力をお願いします\n',[Line]). '閏年の場合、閏年と表示。閏年でない場合、平年と表示。'(_値) :- '閏年の場合、閏年と表示。閏年でない場合、平年と表示。'(_値,_閏年か平年か), write_formatted('%t\n',[_閏年か平年か]), '閏年の場合、閏年と表示。閏年でない場合、平年と表示。'(_値,判定不可) :- \+((_値 >= 0,_値 =< 2010)),!. '閏年の場合、閏年と表示。閏年でない場合、平年と表示。'(_値,閏年) :- 閏年(_値),!. '閏年の場合、閏年と表示。閏年でない場合、平年と表示。'(_値,平年) :- \+(閏年(_値)),!. 閏年(_年) :- 0 is _年 mod 400,!. 閏年(_年) :- 0 is _年 mod 100,!,fail. 閏年(_年) :- 0 is _年 mod 4,!. 閏年(_年) :- \+(0 is _年 mod 4),fail. % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/500 # # MYSQLなんですけど # # date      data # 2010/01/01 hoge1 # 2010/01/05 hoge2 # # みたいなテーブルから # # 2010/01/01 hoge1 # 2010/01/02 NULL # 2010/01/03 NULL # 2010/01/04 NULL # 2010/01/05 hoge2 # # のような結果の出せるSQLを求めてます。 # # select * from table between date '2010/01/01' and '2010/01/05' # # とするとデータのある2レコードしか出ないのですが、 # データがない部分も日付を出しつつ、デフォルトのデータないよっていう文字列を出せると助かります。 # # お助けください! # 'データがない部分も日付を出しつつ、デフォルトのデータないよっていう文字列を出す'(_日付下限,_日付上限) :- 入力された日付を年、月、日整数に変換(_日付下限,_年下限整数,_月下限整数,_日下限整数), 入力された日付を年、月、日整数に変換(_日付上限,_年上限整数,_月上限整数,_日上限整数), 日付の生成(_年下限整数,_月下限整数,_日下限整数,_年整数,_月整数,_日整数,_年上限整数,_月上限整数,_日上限整数), swritef(_date,'%4r/%2r/%2r',[_年整数,_月整数,_日整数]), 生成日付のtableの組を表示する(_date), (_年整数,_月整数,_日整数) = (_年上限整数,_月上限整数,_日上限整数). 入力された日付を年、月、日整数に変換(_日付文字列,_年整数,_月整数,_日整数) :- split(_日付文字列,['/'],[_年整数,_月整数,_日整数]). 生成日付のtableの組を表示する(_date) :- table(_date,_data), write_formatted('%t %t\n',[_date,_data]),!. 生成日付のtableの組を表示する(_生成された日付) :- \+(table(_date,_)), writef('%t %t\n',[_date,'NULL']),!. 日付の生成(_年整数,_月整数,_日整数,_年整数,_月整数,_日整数,_年上限整数,_月上限整数,_日上限整数), (_年整数,_月整数,_日整数) @=< (_年上限整数,_月上限整数,_日上限整数). 日付の生成(_年下限整数,_月下限整数,_日下限整数,_年整数,_月整数,_日整数,_年上限整数,_月上限整数,_日上限整数) :- (_年整数,_月整数,_日整数) @=< (_年上限整数,_月上限整数,_日上限整数), 翌日(_年整数,_月整数,_日整数,_翌日の年整数,_翌日の月整数,_翌日の日整数), 日付の生成(翌日の年整数,_翌日の月整数,_翌日の日整数,_年整数,_月整数,_日整数,_年上限整数,_月上限整数,_日上限整数). 翌日(_翌日の年整数,1,31,_翌日の年整数,2,1) :- !. 翌日(_翌日の年整数,3,31,_翌日の年整数,4,1) :- !. 翌日(_翌日の年整数,4,30,_翌日の年整数,5,1) :- !. 翌日(_翌日の年整数,5,31,_翌日の年整数,6,1) :- !. 翌日(_翌日の年整数,6,30,_翌日の年整数,7,1) :- !. 翌日(_翌日の年整数,7,31,_翌日の年整数,8,1) :- !. 翌日(_翌日の年整数,8,31,_翌日の年整数,9,1) :- !. 翌日(_翌日の年整数,9,30,_翌日の年整数,10,1) :- !. 翌日(_翌日の年整数,10,31,_翌日の年整数,11,1) :- !. 翌日(_翌日の年整数,11,30,_翌日の年整数,12,1) :- !. 翌日(_翌日の年整数,2,28,_翌日の年整数,3,1) :- \+(うるう年(_翌日の年整数)),!. 翌日(_翌日の年整数,2,29,_翌日の年整数,3,1) :- うるう年(_翌日の年整数),!. 翌日(_年整数,12,31,_翌日の年整数,1,1) :- _翌日の年整数 is _年整数 + 1,!. 翌日(_翌日の年整数,_翌日の月整数,_日整数,_翌日の年整数,_翌日の月整数,_翌日の日整数) :- _翌日の日整数 is _日整数 + 1,!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/880 # # [1] 授業単元:計算機とアルゴリズム # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10699.txt # # 問題2 # # 整数変数 year に西暦の値を収め、そのときがうるう年かどうか判定するプログラムを作成しなさい。 # 例として、2000年の場合と1900年の場合の実行結果例を示す。 # # 実行結果(2000年の場合) # # 2000 年がうるう年かどうか判定します # うるう年です # # # 実行結果(1900年)の場合 # # 1900 年がうるう年かどうか判定します # うるう年ではありません # :- op(750,xf,年がうるう年かどうか判定します). _year 年がうるう年かどうか判定します :- integer(_year), うるう年(_year), write('うるう年です\n'),!. _year 年がうるう年かどうか判定します :- integer(_year), write('うるう年ではありません\n'). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '整数変数 year に西暦の値を収め、そのときがうるう年かどうか判定する' 催促付き整数入力('西暦の値を入力してください : ',_year), うるう年(_year), write('うるう年です\n'),!. '整数変数 year に西暦の値を収め、そのときがうるう年かどうか判定する' :- write('うるう年ではありません\n'). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4),fail. % 以下のサイトは % *** user: '西暦和暦変換' / 2 *** '西暦和暦変換'(_西暦年,_和暦年) :- atomic(_和暦年), \+(atomic(_西暦年)), atom_chars(_和暦年,L), '年漢字表現'(N,L2), append(L3,L2,L), concat_atom(L3,_元号), concat_atom(L2,_年), '西暦和暦表'(_西暦年,_元号,N,_). '西暦和暦変換'(_西暦年,_和暦年) :- atomic(_西暦年), \+(atomic(_和暦年)), '西暦和暦表'(_西暦年,_元号,_年,_), '年漢字表現'(_年,_年漢字表現文字ならび), concat_atom(_年漢字表現文字ならび,_年漢字表現), concat_atom([_元号,_年漢字表現],_和暦年). '西暦和暦変換'(_西暦年,_和暦年) :- var(_西暦年), var(_和暦年), '西暦和暦表'(_西暦年,_元号,_年,_), '年漢字表現'(_年,_年漢字表現文字ならび), concat_atom(_年漢字表現文字ならび,_年漢字表現), concat_atom([_元号,_年漢字表現],_和暦年). '西暦和暦変換'(_西暦年,_和暦年) :- var(_西暦年), var(_和暦年), '西暦和暦表'(_西暦年,_元号,_年,_), '年漢字表現'(_年,_年漢字表現文字ならび), concat_atom(_年漢字表現文字ならび,_年漢字表現), concat_atom([_元号,_年漢字表現],_和暦年). '西暦和暦変換'(_西暦年,_和暦年) :- atomic(_西暦年), atom(_和暦年), '西暦和暦表'(_西暦年,_元号,_年,_), '年漢字表現'(_年,_年漢字表現文字ならび), concat_atom(_年漢字表現文字ならび,_年漢字表現), concat_atom([_元号,_年漢字表現],_和暦年). 西暦和暦表(645,大化,1,[]). 西暦和暦表(646,大化,2,[]). 西暦和暦表(647,大化,3,[]). 西暦和暦表(648,大化,4,[]). 西暦和暦表(649,大化,5,[]). 西暦和暦表(650,大化,6,[]). 西暦和暦表(650,白雉,1,[]). 西暦和暦表(651,白雉,2,[]). 西暦和暦表(652,白雉,3,[]). 西暦和暦表(653,白雉,4,[]). 西暦和暦表(654,白雉,5,[]). 西暦和暦表(686,朱鳥,1,[]). 西暦和暦表(687,朱鳥,2,[]). 西暦和暦表(701,大宝,1,[]). 西暦和暦表(702,大宝,2,[]). 西暦和暦表(703,大宝,3,[]). 西暦和暦表(704,大宝,4,[]). 西暦和暦表(704,慶雲,1,[]). 西暦和暦表(705,慶雲,2,[]). 西暦和暦表(706,慶雲,3,[]). 西暦和暦表(707,慶雲,4,[]). 西暦和暦表(708,慶雲,5,[]). 西暦和暦表(708,和銅,1,[]). 西暦和暦表(709,和銅,2,[]). 西暦和暦表(710,和銅,3,[]). 西暦和暦表(711,和銅,4,[]). 西暦和暦表(712,和銅,5,[]). 西暦和暦表(713,和銅,6,[]). 西暦和暦表(714,和銅,7,[]). 西暦和暦表(715,和銅,8,[]). 西暦和暦表(715,霊亀,1,[]). 西暦和暦表(716,霊亀,2,[]). 西暦和暦表(717,霊亀,3,[]). 西暦和暦表(717,養老,1,[]). 西暦和暦表(718,養老,2,[]). 西暦和暦表(719,養老,3,[]). 西暦和暦表(720,養老,4,[]). 西暦和暦表(721,養老,5,[]). 西暦和暦表(722,養老,6,[]). 西暦和暦表(723,養老,7,[]). 西暦和暦表(724,養老,8,[]). 西暦和暦表(724,神亀,1,[]). 西暦和暦表(725,神亀,2,[]). 西暦和暦表(726,神亀,3,[]). 西暦和暦表(727,神亀,4,[]). 西暦和暦表(728,神亀,5,[]). 西暦和暦表(729,神亀,6,[]). 西暦和暦表(729,天平,1,[]). 西暦和暦表(730,天平,2,[]). 西暦和暦表(731,天平,3,[]). 西暦和暦表(732,天平,4,[]). 西暦和暦表(733,天平,5,[]). 西暦和暦表(734,天平,6,[]). 西暦和暦表(735,天平,7,[]). 西暦和暦表(736,天平,8,[]). 西暦和暦表(737,天平,9,[]). 西暦和暦表(738,天平,10,[]). 西暦和暦表(739,天平,11,[]). 西暦和暦表(740,天平,12,[]). 西暦和暦表(741,天平,13,[]). 西暦和暦表(742,天平,14,[]). 西暦和暦表(743,天平,15,[]). 西暦和暦表(744,天平,16,[]). 西暦和暦表(745,天平,17,[]). 西暦和暦表(746,天平,18,[]). 西暦和暦表(747,天平,19,[]). 西暦和暦表(748,天平,20,[]). 西暦和暦表(749,天平,21,[]). 西暦和暦表(749,天平感宝,1,[]). 西暦和暦表(749,天平勝宝,1,[]). 西暦和暦表(750,天平勝宝,2,[]). 西暦和暦表(751,天平勝宝,3,[]). 西暦和暦表(752,天平勝宝,4,[]). 西暦和暦表(753,天平勝宝,5,[]). 西暦和暦表(754,天平勝宝,6,[]). 西暦和暦表(755,天平勝宝,7,[]). 西暦和暦表(756,天平勝宝,8,[]). 西暦和暦表(757,天平勝宝,9,[]). 西暦和暦表(757,天平宝字,1,[]). 西暦和暦表(758,天平宝字,2,[]). 西暦和暦表(759,天平宝字,3,[]). 西暦和暦表(760,天平宝字,4,[]). 西暦和暦表(761,天平宝字,5,[]). 西暦和暦表(762,天平宝字,6,[]). 西暦和暦表(763,天平宝字,7,[]). 西暦和暦表(764,天平宝字,8,[]). 西暦和暦表(765,天平宝字,9,[]). 西暦和暦表(765,天平神護,1,[]). 西暦和暦表(766,天平神護,2,[]). 西暦和暦表(767,天平神護,3,[]). 西暦和暦表(767,神護景雲,1,[]). 西暦和暦表(768,神護景雲,2,[]). 西暦和暦表(769,神護景雲,3,[]). 西暦和暦表(770,神護景雲,4,[]). 西暦和暦表(770,宝亀,1,[]). 西暦和暦表(771,宝亀,2,[]). 西暦和暦表(772,宝亀,3,[]). 西暦和暦表(773,宝亀,4,[]). 西暦和暦表(774,宝亀,5,[]). 西暦和暦表(775,宝亀,6,[]). 西暦和暦表(776,宝亀,7,[]). 西暦和暦表(777,宝亀,8,[]). 西暦和暦表(778,宝亀,9,[]). 西暦和暦表(779,宝亀,10,[]). 西暦和暦表(780,宝亀,11,[]). 西暦和暦表(781,天応,1,[]). 西暦和暦表(782,天応,2,[]). 西暦和暦表(782,延暦,1,[]). 西暦和暦表(783,延暦,2,[]). 西暦和暦表(784,延暦,3,[]). 西暦和暦表(785,延暦,4,[]). 西暦和暦表(786,延暦,5,[]). 西暦和暦表(787,延暦,6,[]). 西暦和暦表(788,延暦,7,[]). 西暦和暦表(789,延暦,8,[]). 西暦和暦表(790,延暦,9,[]). 西暦和暦表(791,延暦,10,[]). 西暦和暦表(792,延暦,11,[]). 西暦和暦表(793,延暦,12,[]). 西暦和暦表(794,延暦,13,[]). 西暦和暦表(795,延暦,14,[]). 西暦和暦表(796,延暦,15,[]). 西暦和暦表(797,延暦,16,[]). 西暦和暦表(798,延暦,17,[]). 西暦和暦表(799,延暦,18,[]). 西暦和暦表(800,延暦,19,[]). 西暦和暦表(801,延暦,20,[]). 西暦和暦表(802,延暦,21,[]). 西暦和暦表(803,延暦,22,[]). 西暦和暦表(804,延暦,23,[]). 西暦和暦表(805,延暦,24,[]). 西暦和暦表(806,延暦,25,[]). 西暦和暦表(806,大同,1,[]). 西暦和暦表(807,大同,2,[]). 西暦和暦表(808,大同,3,[]). 西暦和暦表(809,大同,4,[]). 西暦和暦表(810,大同,5,[]). 西暦和暦表(810,弘仁,1,[]). 西暦和暦表(811,弘仁,2,[]). 西暦和暦表(812,弘仁,3,[]). 西暦和暦表(813,弘仁,4,[]). 西暦和暦表(814,弘仁,5,[]). 西暦和暦表(815,弘仁,6,[]). 西暦和暦表(816,弘仁,7,[]). 西暦和暦表(817,弘仁,8,[]). 西暦和暦表(818,弘仁,9,[]). 西暦和暦表(819,弘仁,10,[]). 西暦和暦表(820,弘仁,11,[]). 西暦和暦表(821,弘仁,12,[]). 西暦和暦表(822,弘仁,13,[]). 西暦和暦表(823,弘仁,14,[]). 西暦和暦表(824,弘仁,15,[]). 西暦和暦表(824,天長,1,[]). 西暦和暦表(825,天長,2,[]). 西暦和暦表(826,天長,3,[]). 西暦和暦表(827,天長,4,[]). 西暦和暦表(828,天長,5,[]). 西暦和暦表(829,天長,6,[]). 西暦和暦表(830,天長,7,[]). 西暦和暦表(831,天長,8,[]). 西暦和暦表(832,天長,9,[]). 西暦和暦表(833,天長,10,[]). 西暦和暦表(834,天長,11,[]). 西暦和暦表(834,承和,1,[]). 西暦和暦表(835,承和,2,[]). 西暦和暦表(836,承和,3,[]). 西暦和暦表(837,承和,4,[]). 西暦和暦表(838,承和,5,[]). 西暦和暦表(839,承和,6,[]). 西暦和暦表(840,承和,7,[]). 西暦和暦表(841,承和,8,[]). 西暦和暦表(842,承和,9,[]). 西暦和暦表(843,承和,10,[]). 西暦和暦表(844,承和,11,[]). 西暦和暦表(845,承和,12,[]). 西暦和暦表(846,承和,13,[]). 西暦和暦表(847,承和,14,[]). 西暦和暦表(848,承和,15,[]). 西暦和暦表(848,嘉祥,1,[]). 西暦和暦表(849,嘉祥,2,[]). 西暦和暦表(850,嘉祥,3,[]). 西暦和暦表(851,嘉祥,4,[]). 西暦和暦表(851,仁寿,1,[]). 西暦和暦表(852,仁寿,2,[]). 西暦和暦表(853,仁寿,3,[]). 西暦和暦表(854,仁寿,4,[]). 西暦和暦表(854,斉衡,1,[]). 西暦和暦表(855,斉衡,2,[]). 西暦和暦表(856,斉衡,3,[]). 西暦和暦表(857,斉衡,4,[]). 西暦和暦表(857,天安,1,[]). 西暦和暦表(858,天安,2,[]). 西暦和暦表(859,天安,3,[]). 西暦和暦表(859,貞観,1,[]). 西暦和暦表(860,貞観,2,[]). 西暦和暦表(861,貞観,3,[]). 西暦和暦表(862,貞観,4,[]). 西暦和暦表(863,貞観,5,[]). 西暦和暦表(864,貞観,6,[]). 西暦和暦表(865,貞観,7,[]). 西暦和暦表(866,貞観,8,[]). 西暦和暦表(867,貞観,9,[]). 西暦和暦表(868,貞観,10,[]). 西暦和暦表(869,貞観,11,[]). 西暦和暦表(870,貞観,12,[]). 西暦和暦表(871,貞観,13,[]). 西暦和暦表(872,貞観,14,[]). 西暦和暦表(873,貞観,15,[]). 西暦和暦表(874,貞観,16,[]). 西暦和暦表(875,貞観,17,[]). 西暦和暦表(876,貞観,18,[]). 西暦和暦表(877,貞観,19,[]). 西暦和暦表(877,元慶,1,[]). 西暦和暦表(878,元慶,2,[]). 西暦和暦表(879,元慶,3,[]). 西暦和暦表(880,元慶,4,[]). 西暦和暦表(881,元慶,5,[]). 西暦和暦表(882,元慶,6,[]). 西暦和暦表(883,元慶,7,[]). 西暦和暦表(884,元慶,8,[]). 西暦和暦表(885,元慶,9,[]). 西暦和暦表(885,仁和,1,[]). 西暦和暦表(886,仁和,2,[]). 西暦和暦表(887,仁和,3,[]). 西暦和暦表(888,仁和,4,[]). 西暦和暦表(889,仁和,5,[]). 西暦和暦表(889,寛平,1,[]). 西暦和暦表(890,寛平,2,[]). 西暦和暦表(891,寛平,3,[]). 西暦和暦表(892,寛平,4,[]). 西暦和暦表(893,寛平,5,[]). 西暦和暦表(894,寛平,6,[]). 西暦和暦表(895,寛平,7,[]). 西暦和暦表(896,寛平,8,[]). 西暦和暦表(897,寛平,9,[]). 西暦和暦表(898,寛平,10,[]). 西暦和暦表(898,昌泰,1,[]). 西暦和暦表(899,昌泰,2,[]). 西暦和暦表(900,昌泰,3,[]). 西暦和暦表(901,昌泰,4,[]). 西暦和暦表(901,延喜,1,[]). 西暦和暦表(902,延喜,2,[]). 西暦和暦表(903,延喜,3,[]). 西暦和暦表(904,延喜,4,[]). 西暦和暦表(905,延喜,5,[]). 西暦和暦表(906,延喜,6,[]). 西暦和暦表(907,延喜,7,[]). 西暦和暦表(908,延喜,8,[]). 西暦和暦表(909,延喜,9,[]). 西暦和暦表(910,延喜,10,[]). 西暦和暦表(911,延喜,11,[]). 西暦和暦表(912,延喜,12,[]). 西暦和暦表(913,延喜,13,[]). 西暦和暦表(914,延喜,14,[]). 西暦和暦表(915,延喜,15,[]). 西暦和暦表(916,延喜,16,[]). 西暦和暦表(917,延喜,17,[]). 西暦和暦表(918,延喜,18,[]). 西暦和暦表(919,延喜,19,[]). 西暦和暦表(920,延喜,20,[]). 西暦和暦表(921,延喜,21,[]). 西暦和暦表(922,延喜,22,[]). 西暦和暦表(923,延喜,23,[]). 西暦和暦表(923,延長,1,[]). 西暦和暦表(924,延長,2,[]). 西暦和暦表(925,延長,3,[]). 西暦和暦表(926,延長,4,[]). 西暦和暦表(927,延長,5,[]). 西暦和暦表(928,延長,6,[]). 西暦和暦表(929,延長,7,[]). 西暦和暦表(930,延長,8,[]). 西暦和暦表(931,延長,9,[]). 西暦和暦表(931,承平,1,[]). 西暦和暦表(932,承平,2,[]). 西暦和暦表(933,承平,3,[]). 西暦和暦表(934,承平,4,[]). 西暦和暦表(935,承平,5,[]). 西暦和暦表(936,承平,6,[]). 西暦和暦表(937,承平,7,[]). 西暦和暦表(938,承平,8,[]). 西暦和暦表(938,天慶,1,[]). 西暦和暦表(939,天慶,2,[]). 西暦和暦表(940,天慶,3,[]). 西暦和暦表(941,天慶,4,[]). 西暦和暦表(942,天慶,5,[]). 西暦和暦表(943,天慶,6,[]). 西暦和暦表(944,天慶,7,[]). 西暦和暦表(945,天慶,8,[]). 西暦和暦表(946,天慶,9,[]). 西暦和暦表(947,天慶,10,[]). 西暦和暦表(947,天暦,1,[]). 西暦和暦表(948,天暦,2,[]). 西暦和暦表(949,天暦,3,[]). 西暦和暦表(950,天暦,4,[]). 西暦和暦表(951,天暦,5,[]). 西暦和暦表(952,天暦,6,[]). 西暦和暦表(953,天暦,7,[]). 西暦和暦表(954,天暦,8,[]). 西暦和暦表(955,天暦,9,[]). 西暦和暦表(956,天暦,10,[]). 西暦和暦表(957,天暦,11,[]). 西暦和暦表(957,天徳,1,[]). 西暦和暦表(958,天徳,2,[]). 西暦和暦表(959,天徳,3,[]). 西暦和暦表(960,天徳,4,[]). 西暦和暦表(961,天徳,5,[]). 西暦和暦表(961,応和,1,[]). 西暦和暦表(962,応和,2,[]). 西暦和暦表(963,応和,3,[]). 西暦和暦表(964,応和,4,[]). 西暦和暦表(964,康保,1,[]). 西暦和暦表(965,康保,2,[]). 西暦和暦表(966,康保,3,[]). 西暦和暦表(967,康保,4,[]). 西暦和暦表(968,康保,5,[]). 西暦和暦表(968,安和,1,[]). 西暦和暦表(969,安和,2,[]). 西暦和暦表(970,安和,3,[]). 西暦和暦表(970,天禄,1,[]). 西暦和暦表(971,天禄,2,[]). 西暦和暦表(972,天禄,3,[]). 西暦和暦表(973,天禄,4,[]). 西暦和暦表(973,天延,1,[]). 西暦和暦表(974,天延,2,[]). 西暦和暦表(975,天延,3,[]). 西暦和暦表(976,天延,4,[]). 西暦和暦表(976,貞元,1,[]). 西暦和暦表(977,貞元,2,[]). 西暦和暦表(978,貞元,3,[]). 西暦和暦表(978,天元,1,[]). 西暦和暦表(979,天元,2,[]). 西暦和暦表(980,天元,3,[]). 西暦和暦表(981,天元,4,[]). 西暦和暦表(982,天元,5,[]). 西暦和暦表(983,天元,6,[]). 西暦和暦表(983,永観,1,[]). 西暦和暦表(984,永観,2,[]). 西暦和暦表(985,永観,3,[]). 西暦和暦表(985,寛和,1,[]). 西暦和暦表(986,寛和,2,[]). 西暦和暦表(987,寛和,3,[]). 西暦和暦表(987,永延,1,[]). 西暦和暦表(988,永延,2,[]). 西暦和暦表(989,永延,3,[]). 西暦和暦表(989,永祚,1,[]). 西暦和暦表(990,永祚,2,[]). 西暦和暦表(990,正暦,1,[]). 西暦和暦表(991,正暦,2,[]). 西暦和暦表(992,正暦,3,[]). 西暦和暦表(993,正暦,4,[]). 西暦和暦表(994,正暦,5,[]). 西暦和暦表(995,正暦,6,[]). 西暦和暦表(995,長徳,1,[]). 西暦和暦表(996,長徳,2,[]). 西暦和暦表(997,長徳,3,[]). 西暦和暦表(998,長徳,4,[]). 西暦和暦表(999,長徳,5,[]). 西暦和暦表(999,長保,1,[]). 西暦和暦表(1000,長保,2,[]). 西暦和暦表(1001,長保,3,[]). 西暦和暦表(1002,長保,4,[]). 西暦和暦表(1003,長保,5,[]). 西暦和暦表(1004,長保,6,[]). 西暦和暦表(1004,寛弘,1,[]). 西暦和暦表(1005,寛弘,2,[]). 西暦和暦表(1006,寛弘,3,[]). 西暦和暦表(1007,寛弘,4,[]). 西暦和暦表(1008,寛弘,5,[]). 西暦和暦表(1009,寛弘,6,[]). 西暦和暦表(1010,寛弘,7,[]). 西暦和暦表(1011,寛弘,8,[]). 西暦和暦表(1012,寛弘,9,[]). 西暦和暦表(1012,長和,1,[]). 西暦和暦表(1013,長和,2,[]). 西暦和暦表(1014,長和,3,[]). 西暦和暦表(1015,長和,4,[]). 西暦和暦表(1016,長和,5,[]). 西暦和暦表(1017,長和,6,[]). 西暦和暦表(1017,寛仁,1,[]). 西暦和暦表(1018,寛仁,2,[]). 西暦和暦表(1019,寛仁,3,[]). 西暦和暦表(1020,寛仁,4,[]). 西暦和暦表(1021,寛仁,5,[]). 西暦和暦表(1021,治安,1,[]). 西暦和暦表(1022,治安,2,[]). 西暦和暦表(1023,治安,3,[]). 西暦和暦表(1024,治安,4,[]). 西暦和暦表(1024,万寿,1,[]). 西暦和暦表(1025,万寿,2,[]). 西暦和暦表(1026,万寿,3,[]). 西暦和暦表(1027,万寿,4,[]). 西暦和暦表(1028,万寿,5,[]). 西暦和暦表(1028,長元,1,[]). 西暦和暦表(1029,長元,2,[]). 西暦和暦表(1030,長元,3,[]). 西暦和暦表(1031,長元,4,[]). 西暦和暦表(1032,長元,5,[]). 西暦和暦表(1033,長元,6,[]). 西暦和暦表(1034,長元,7,[]). 西暦和暦表(1035,長元,8,[]). 西暦和暦表(1036,長元,9,[]). 西暦和暦表(1037,長元,10,[]). 西暦和暦表(1037,長暦,1,[]). 西暦和暦表(1038,長暦,2,[]). 西暦和暦表(1039,長暦,3,[]). 西暦和暦表(1040,長暦,4,[]). 西暦和暦表(1040,長久,1,[]). 西暦和暦表(1041,長久,2,[]). 西暦和暦表(1042,長久,3,[]). 西暦和暦表(1043,長久,4,[]). 西暦和暦表(1044,長久,5,[]). 西暦和暦表(1044,寛徳,1,[]). 西暦和暦表(1045,寛徳,2,[]). 西暦和暦表(1046,寛徳,3,[]). 西暦和暦表(1046,永承,1,[]). 西暦和暦表(1047,永承,2,[]). 西暦和暦表(1048,永承,3,[]). 西暦和暦表(1049,永承,4,[]). 西暦和暦表(1050,永承,5,[]). 西暦和暦表(1051,永承,6,[]). 西暦和暦表(1052,永承,7,[]). 西暦和暦表(1053,永承,8,[]). 西暦和暦表(1053,天喜,1,[]). 西暦和暦表(1054,天喜,2,[]). 西暦和暦表(1055,天喜,3,[]). 西暦和暦表(1056,天喜,4,[]). 西暦和暦表(1057,天喜,5,[]). 西暦和暦表(1058,天喜,6,[]). 西暦和暦表(1058,康平,1,[]). 西暦和暦表(1059,康平,2,[]). 西暦和暦表(1060,康平,3,[]). 西暦和暦表(1061,康平,4,[]). 西暦和暦表(1062,康平,5,[]). 西暦和暦表(1063,康平,6,[]). 西暦和暦表(1064,康平,7,[]). 西暦和暦表(1065,康平,8,[]). 西暦和暦表(1065,治暦,1,[]). 西暦和暦表(1066,治暦,2,[]). 西暦和暦表(1067,治暦,3,[]). 西暦和暦表(1068,治暦,4,[]). 西暦和暦表(1069,治暦,5,[]). 西暦和暦表(1069,延久,1,[]). 西暦和暦表(1070,延久,2,[]). 西暦和暦表(1071,延久,3,[]). 西暦和暦表(1072,延久,4,[]). 西暦和暦表(1073,延久,5,[]). 西暦和暦表(1074,延久,6,[]). 西暦和暦表(1074,承保,1,[]). 西暦和暦表(1075,承保,2,[]). 西暦和暦表(1076,承保,3,[]). 西暦和暦表(1077,承保,4,[]). 西暦和暦表(1077,承暦,1,[]). 西暦和暦表(1078,承暦,2,[]). 西暦和暦表(1079,承暦,3,[]). 西暦和暦表(1080,承暦,4,[]). 西暦和暦表(1081,承暦,5,[]). 西暦和暦表(1081,永保,1,[]). 西暦和暦表(1082,永保,2,[]). 西暦和暦表(1083,永保,3,[]). 西暦和暦表(1084,永保,4,[]). 西暦和暦表(1084,応徳,1,[]). 西暦和暦表(1085,応徳,2,[]). 西暦和暦表(1086,応徳,3,[]). 西暦和暦表(1087,応徳,4,[]). 西暦和暦表(1087,寛治,1,[]). 西暦和暦表(1088,寛治,2,[]). 西暦和暦表(1089,寛治,3,[]). 西暦和暦表(1090,寛治,4,[]). 西暦和暦表(1091,寛治,5,[]). 西暦和暦表(1092,寛治,6,[]). 西暦和暦表(1093,寛治,7,[]). 西暦和暦表(1094,寛治,8,[]). 西暦和暦表(1094,嘉保,1,[]). 西暦和暦表(1095,嘉保,2,[]). 西暦和暦表(1096,嘉保,3,[]). 西暦和暦表(1096,永長,1,[]). 西暦和暦表(1097,永長,2,[]). 西暦和暦表(1097,承徳,1,[]). 西暦和暦表(1098,承徳,2,[]). 西暦和暦表(1099,承徳,3,[]). 西暦和暦表(1099,康和,1,[]). 西暦和暦表(1100,康和,2,[]). 西暦和暦表(1101,康和,3,[]). 西暦和暦表(1102,康和,4,[]). 西暦和暦表(1103,康和,5,[]). 西暦和暦表(1104,康和,6,[]). 西暦和暦表(1104,長治,1,[]). 西暦和暦表(1105,長治,2,[]). 西暦和暦表(1106,長治,3,[]). 西暦和暦表(1106,嘉承,1,[]). 西暦和暦表(1107,嘉承,2,[]). 西暦和暦表(1108,嘉承,3,[]). 西暦和暦表(1108,天仁,1,[]). 西暦和暦表(1109,天仁,2,[]). 西暦和暦表(1110,天仁,3,[]). 西暦和暦表(1110,天永,1,[]). 西暦和暦表(1111,天永,2,[]). 西暦和暦表(1112,天永,3,[]). 西暦和暦表(1113,天永,4,[]). 西暦和暦表(1113,永久,1,[]). 西暦和暦表(1114,永久,2,[]). 西暦和暦表(1115,永久,3,[]). 西暦和暦表(1116,永久,4,[]). 西暦和暦表(1117,永久,5,[]). 西暦和暦表(1118,永久,6,[]). 西暦和暦表(1118,元永,1,[]). 西暦和暦表(1119,元永,2,[]). 西暦和暦表(1120,元永,3,[]). 西暦和暦表(1120,保安,1,[]). 西暦和暦表(1121,保安,2,[]). 西暦和暦表(1122,保安,3,[]). 西暦和暦表(1123,保安,4,[]). 西暦和暦表(1124,保安,5,[]). 西暦和暦表(1124,天治,1,[]). 西暦和暦表(1125,天治,2,[]). 西暦和暦表(1126,天治,3,[]). 西暦和暦表(1126,大治,1,[]). 西暦和暦表(1127,大治,2,[]). 西暦和暦表(1128,大治,3,[]). 西暦和暦表(1129,大治,4,[]). 西暦和暦表(1130,大治,5,[]). 西暦和暦表(1131,大治,6,[]). 西暦和暦表(1131,天承,1,[]). 西暦和暦表(1132,天承,2,[]). 西暦和暦表(1132,長承,1,[]). 西暦和暦表(1133,長承,2,[]). 西暦和暦表(1134,長承,3,[]). 西暦和暦表(1135,長承,4,[]). 西暦和暦表(1135,保延,1,[]). 西暦和暦表(1136,保延,2,[]). 西暦和暦表(1137,保延,3,[]). 西暦和暦表(1138,保延,4,[]). 西暦和暦表(1139,保延,5,[]). 西暦和暦表(1140,保延,6,[]). 西暦和暦表(1141,保延,7,[]). 西暦和暦表(1141,永治,1,[]). 西暦和暦表(1142,永治,2,[]). 西暦和暦表(1142,康治,1,[]). 西暦和暦表(1143,康治,2,[]). 西暦和暦表(1144,康治,3,[]). 西暦和暦表(1144,天養,1,2 / 23). 西暦和暦表(1145,天養,2,[]). 西暦和暦表(1145,久安,1,7 / 22). 西暦和暦表(1146,久安,2,[]). 西暦和暦表(1147,久安,3,[]). 西暦和暦表(1148,久安,4,[]). 西暦和暦表(1149,久安,5,[]). 西暦和暦表(1150,久安,6,[]). 西暦和暦表(1151,久安,7,[]). 西暦和暦表(1151,仁平,1,1 / 26). 西暦和暦表(1152,仁平,2,[]). 西暦和暦表(1153,仁平,3,[]). 西暦和暦表(1154,仁平,4,[]). 西暦和暦表(1154,久寿,1,10 / 28). 西暦和暦表(1155,久寿,2,[]). 西暦和暦表(1156,久寿,3,[]). 西暦和暦表(1156,保元,1,4 / 27). 西暦和暦表(1157,保元,2,[]). 西暦和暦表(1158,保元,3,[]). 西暦和暦表(1159,保元,4,[]). 西暦和暦表(1159,平治,1,4 / 20). 西暦和暦表(1160,平治,2,[]). 西暦和暦表(1160,永暦,1,1 / 10). 西暦和暦表(1161,永暦,2,[]). 西暦和暦表(1161,応保,1,9 / 4). 西暦和暦表(1162,応保,2,[]). 西暦和暦表(1163,応保,3,[]). 西暦和暦表(1163,長寛,1,3 / 29). 西暦和暦表(1164,長寛,2,[]). 西暦和暦表(1165,長寛,3,[]). 西暦和暦表(1165,永万,1,6 / 5). 西暦和暦表(1166,永万,2,[]). 西暦和暦表(1166,仁安,1,8 / 27). 西暦和暦表(1167,仁安,2,[]). 西暦和暦表(1168,仁安,3,[]). 西暦和暦表(1169,仁安,4,[]). 西暦和暦表(1169,嘉応,1,4 / 8). 西暦和暦表(1170,嘉応,2,[]). 西暦和暦表(1171,嘉応,3,[]). 西暦和暦表(1171,承安,1,4 / 21). 西暦和暦表(1172,承安,2,[]). 西暦和暦表(1173,承安,3,[]). 西暦和暦表(1174,承安,4,[]). 西暦和暦表(1175,承安,5,[]). 西暦和暦表(1175,安元,1,7 / 28). 西暦和暦表(1176,安元,2,[]). 西暦和暦表(1177,安元,3,[]). 西暦和暦表(1177,治承,1,8 / 4). 西暦和暦表(1178,治承,2,[]). 西暦和暦表(1179,治承,3,[]). 西暦和暦表(1180,治承,4,[]). 西暦和暦表(1181,治承,5,[]). 西暦和暦表(1181,養和,1,7 / 14). 西暦和暦表(1182,養和,2,[]). 西暦和暦表(1182,寿永,1,5 / 27). 西暦和暦表(1183,寿永,2,[]). 西暦和暦表(1184,寿永,3,[]). 西暦和暦表(1185,寿永,4,[]). 西暦和暦表(1185,文治,1,8 / 14). 西暦和暦表(1186,文治,2,[]). 西暦和暦表(1187,文治,3,[]). 西暦和暦表(1188,文治,4,[]). 西暦和暦表(1189,文治,5,[]). 西暦和暦表(1190,文治,6,[]). 西暦和暦表(1190,建久,1,4 / 11). 西暦和暦表(1191,建久,2,[]). 西暦和暦表(1192,建久,3,[]). 西暦和暦表(1193,建久,4,[]). 西暦和暦表(1194,建久,5,[]). 西暦和暦表(1195,建久,6,[]). 西暦和暦表(1196,建久,7,[]). 西暦和暦表(1197,建久,8,[]). 西暦和暦表(1198,建久,9,[]). 西暦和暦表(1199,建久,10,[]). 西暦和暦表(1199,正治,1,4 / 27). 西暦和暦表(1200,正治,2,[]). 西暦和暦表(1201,正治,3,[]). 西暦和暦表(1201,建仁,1,2 / 13). 西暦和暦表(1202,建仁,2,[]). 西暦和暦表(1203,建仁,3,[]). 西暦和暦表(1204,建仁,4,[]). 西暦和暦表(1204,元久,1,2 / 20). 西暦和暦表(1205,元久,2,[]). 西暦和暦表(1206,元久,3,[]). 西暦和暦表(1206,建永,1,4 / 27). 西暦和暦表(1207,建永,2,[]). 西暦和暦表(1207,承元,1,10 / 25). 西暦和暦表(1208,承元,2,[]). 西暦和暦表(1209,承元,3,[]). 西暦和暦表(1210,承元,4,[]). 西暦和暦表(1211,承元,5,[]). 西暦和暦表(1211,建暦,1,3 / 9). 西暦和暦表(1212,建暦,2,[]). 西暦和暦表(1213,建暦,3,[]). 西暦和暦表(1213,建保,1,12 / 6). 西暦和暦表(1214,建保,2,[]). 西暦和暦表(1215,建保,3,[]). 西暦和暦表(1216,建保,4,[]). 西暦和暦表(1217,建保,5,[]). 西暦和暦表(1218,建保,6,[]). 西暦和暦表(1219,建保,7,[]). 西暦和暦表(1219,承久,1,4 / 12). 西暦和暦表(1220,承久,2,[]). 西暦和暦表(1221,承久,3,[]). 西暦和暦表(1222,承久,4,[]). 西暦和暦表(1222,貞応,1,4 / 13). 西暦和暦表(1223,貞応,2,[]). 西暦和暦表(1224,貞応,3,[]). 西暦和暦表(1224,元仁,1,11 / 20). 西暦和暦表(1225,元仁,2,[]). 西暦和暦表(1225,嘉祿,1,4 / 20). 西暦和暦表(1226,嘉祿,2,[]). 西暦和暦表(1227,嘉祿,3,[]). 西暦和暦表(1227,安貞,1,12 / 10). 西暦和暦表(1228,安貞,2,[]). 西暦和暦表(1229,安貞,3,[]). 西暦和暦表(1229,寛喜,1,3 / 5). 西暦和暦表(1230,寛喜,2,[]). 西暦和暦表(1231,寛喜,3,[]). 西暦和暦表(1232,寛喜,4,[]). 西暦和暦表(1232,貞永,1,4 / 2). 西暦和暦表(1233,貞永,2,[]). 西暦和暦表(1233,天福,1,4 / 15). 西暦和暦表(1234,天福,2,[]). 西暦和暦表(1234,文暦,1,11 / 5). 西暦和暦表(1235,文暦,2,[]). 西暦和暦表(1235,嘉禎,1,9 / 19). 西暦和暦表(1236,嘉禎,2,[]). 西暦和暦表(1237,嘉禎,3,[]). 西暦和暦表(1238,嘉禎,4,[]). 西暦和暦表(1238,暦仁,1,11 / 23). 西暦和暦表(1239,暦仁,2,[]). 西暦和暦表(1239,延応,1,2 / 7). 西暦和暦表(1240,延応,2,[]). 西暦和暦表(1240,仁治,1,7 / 16). 西暦和暦表(1241,仁治,2,[]). 西暦和暦表(1242,仁治,3,[]). 西暦和暦表(1243,仁治,4,[]). 西暦和暦表(1243,寛元,1,2 / 26). 西暦和暦表(1244,寛元,2,[]). 西暦和暦表(1245,寛元,3,[]). 西暦和暦表(1246,寛元,4,[]). 西暦和暦表(1247,寛元,5,[]). 西暦和暦表(1247,宝治,1,2 / 28). 西暦和暦表(1248,宝治,2,[]). 西暦和暦表(1249,宝治,3,[]). 西暦和暦表(1249,建長,1,3 / 18). 西暦和暦表(1250,建長,2,[]). 西暦和暦表(1251,建長,3,[]). 西暦和暦表(1252,建長,4,[]). 西暦和暦表(1253,建長,5,[]). 西暦和暦表(1254,建長,6,[]). 西暦和暦表(1255,建長,7,[]). 西暦和暦表(1256,建長,8,[]). 西暦和暦表(1256,康元,1,10 / 5). 西暦和暦表(1257,康元,2,[]). 西暦和暦表(1257,正嘉,1,3 / 14). 西暦和暦表(1258,正嘉,2,[]). 西暦和暦表(1259,正嘉,3,[]). 西暦和暦表(1259,正元,1,3 / 26). 西暦和暦表(1260,正元,2,[]). 西暦和暦表(1260,文応,1,4 / 23). 西暦和暦表(1261,文応,2,[]). 西暦和暦表(1261,弘長,1,2 / 20). 西暦和暦表(1262,弘長,2,[]). 西暦和暦表(1263,弘長,3,[]). 西暦和暦表(1264,弘長,4,[]). 西暦和暦表(1264,文永,1,2 / 28). 西暦和暦表(1265,文永,2,[]). 西暦和暦表(1266,文永,3,[]). 西暦和暦表(1267,文永,4,[]). 西暦和暦表(1268,文永,5,[]). 西暦和暦表(1269,文永,6,[]). 西暦和暦表(1270,文永,7,[]). 西暦和暦表(1271,文永,8,[]). 西暦和暦表(1272,文永,9,[]). 西暦和暦表(1273,文永,10,[]). 西暦和暦表(1274,文永,11,[]). 西暦和暦表(1275,文永,12,[]). 西暦和暦表(1275,建治,1,4 / 25). 西暦和暦表(1276,建治,2,[]). 西暦和暦表(1277,建治,3,[]). 西暦和暦表(1278,建治,4,[]). 西暦和暦表(1278,弘安,1,2 / 29). 西暦和暦表(1279,弘安,2,[]). 西暦和暦表(1280,弘安,3,[]). 西暦和暦表(1281,弘安,4,[]). 西暦和暦表(1282,弘安,5,[]). 西暦和暦表(1283,弘安,6,[]). 西暦和暦表(1284,弘安,7,[]). 西暦和暦表(1285,弘安,8,[]). 西暦和暦表(1286,弘安,9,[]). 西暦和暦表(1287,弘安,10,[]). 西暦和暦表(1288,弘安,11,[]). 西暦和暦表(1288,正応,1,4 / 28). 西暦和暦表(1289,正応,2,[]). 西暦和暦表(1290,正応,3,[]). 西暦和暦表(1291,正応,4,[]). 西暦和暦表(1292,正応,5,[]). 西暦和暦表(1293,正応,6,[]). 西暦和暦表(1293,永仁,1,8 / 5). 西暦和暦表(1294,永仁,2,[]). 西暦和暦表(1295,永仁,3,[]). 西暦和暦表(1296,永仁,4,[]). 西暦和暦表(1297,永仁,5,[]). 西暦和暦表(1298,永仁,6,[]). 西暦和暦表(1299,永仁,7,[]). 西暦和暦表(1299,正安,1,4 / 25). 西暦和暦表(1300,正安,2,[]). 西暦和暦表(1301,正安,3,[]). 西暦和暦表(1302,正安,4,[]). 西暦和暦表(1302,乾元,1,11 / 21). 西暦和暦表(1303,乾元,2,[]). 西暦和暦表(1303,嘉元,1,8 / 5). 西暦和暦表(1304,嘉元,2,[]). 西暦和暦表(1305,嘉元,3,[]). 西暦和暦表(1306,嘉元,4,[]). 西暦和暦表(1306,徳治,1,12 / 14). 西暦和暦表(1307,徳治,2,[]). 西暦和暦表(1308,徳治,3,[]). 西暦和暦表(1308,延慶,1,10 / 9). 西暦和暦表(1309,延慶,2,[]). 西暦和暦表(1310,延慶,3,[]). 西暦和暦表(1311,延慶,4,[]). 西暦和暦表(1311,応長,1,4 / 28). 西暦和暦表(1312,応長,2,[]). 西暦和暦表(1312,正和,1,3 / 20). 西暦和暦表(1313,正和,2,[]). 西暦和暦表(1314,正和,3,[]). 西暦和暦表(1315,正和,4,[]). 西暦和暦表(1316,正和,5,[]). 西暦和暦表(1317,正和,6,[]). 西暦和暦表(1317,文保,1,2 / 3). 西暦和暦表(1318,文保,2,[]). 西暦和暦表(1319,文保,3,[]). 西暦和暦表(1319,元応,1,4 / 28). 西暦和暦表(1320,元応,2,[]). 西暦和暦表(1321,元応,3,[]). 西暦和暦表(1321,元亨,1,2 / 23). 西暦和暦表(1322,元亨,2,[]). 西暦和暦表(1323,元亨,3,[]). 西暦和暦表(1324,元亨,4,[]). 西暦和暦表(1324,正中,1,12 / 9). 西暦和暦表(1325,正中,2,[]). 西暦和暦表(1326,正中,3,[]). 西暦和暦表(1326,嘉暦,1,4 / 26). 西暦和暦表(1327,嘉暦,2,[]). 西暦和暦表(1328,嘉暦,3,[]). 西暦和暦表(1329,嘉暦,4,[]). 西暦和暦表(1329,元徳,1,8 / 29). 西暦和暦表(1330,元徳,2,[]). 西暦和暦表(1331,元徳,3,[]). 西暦和暦表(1331,元弘,1,8 / 9). 西暦和暦表(1332,元弘,2,[]). 西暦和暦表(1332,正慶,1,4 / 28). 西暦和暦表(1333,正慶,2,[]). 西暦和暦表(1334,正慶,3,[]). 西暦和暦表(1334,建武,1,1 / 29). 西暦和暦表(1335,建武,2,[]). 西暦和暦表(1336,建武,3,[]). 西暦和暦表(1337,建武,4,[]). 西暦和暦表(1338,建武,5,[]). 西暦和暦表(1338,暦応,1,8 / 28). 西暦和暦表(1339,暦応,2,[]). 西暦和暦表(1340,暦応,3,[]). 西暦和暦表(1341,暦応,4,[]). 西暦和暦表(1342,暦応,5,[]). 西暦和暦表(1342,康永,1,4 / 27). 西暦和暦表(1343,康永,2,[]). 西暦和暦表(1344,康永,3,[]). 西暦和暦表(1345,康永,4,[]). 西暦和暦表(1345,貞和,1,10 / 21). 西暦和暦表(1346,貞和,2,[]). 西暦和暦表(1347,貞和,3,[]). 西暦和暦表(1348,貞和,4,[]). 西暦和暦表(1349,貞和,5,[]). 西暦和暦表(1350,貞和,6,[]). 西暦和暦表(1350,観応,1,2 / 27). 西暦和暦表(1351,観応,2,[]). 西暦和暦表(1352,観応,3,[]). 西暦和暦表(1352,文和,1,9 / 27). 西暦和暦表(1353,文和,2,[]). 西暦和暦表(1354,文和,3,[]). 西暦和暦表(1355,文和,4,[]). 西暦和暦表(1356,文和,5,[]). 西暦和暦表(1356,延文,1,3 / 28). 西暦和暦表(1357,延文,2,[]). 西暦和暦表(1358,延文,3,[]). 西暦和暦表(1359,延文,4,[]). 西暦和暦表(1360,延文,5,[]). 西暦和暦表(1361,延文,6,[]). 西暦和暦表(1361,康安,1,3 / 29). 西暦和暦表(1362,康安,2,[]). 西暦和暦表(1362,貞治,1,9 / 23). 西暦和暦表(1363,貞治,2,[]). 西暦和暦表(1364,貞治,3,[]). 西暦和暦表(1365,貞治,4,[]). 西暦和暦表(1366,貞治,5,[]). 西暦和暦表(1367,貞治,6,[]). 西暦和暦表(1368,貞治,7,[]). 西暦和暦表(1368,応安,1,2 / 18). 西暦和暦表(1369,応安,2,[]). 西暦和暦表(1370,応安,3,[]). 西暦和暦表(1371,応安,4,[]). 西暦和暦表(1372,応安,5,[]). 西暦和暦表(1373,応安,6,[]). 西暦和暦表(1374,応安,7,[]). 西暦和暦表(1375,応安,8,[]). 西暦和暦表(1375,永和,1,5 / 27). 西暦和暦表(1376,永和,2,[]). 西暦和暦表(1377,永和,3,[]). 西暦和暦表(1378,永和,4,[]). 西暦和暦表(1379,永和,5,[]). 西暦和暦表(1379,康暦,1,3 / 22). 西暦和暦表(1380,康暦,2,[]). 西暦和暦表(1381,康暦,3,[]). 西暦和暦表(1381,永徳,1,2 / 10). 西暦和暦表(1382,永徳,2,[]). 西暦和暦表(1383,永徳,3,[]). 西暦和暦表(1384,永徳,4,[]). 西暦和暦表(1384,至徳,1,4 / 28). 西暦和暦表(1385,至徳,2,[]). 西暦和暦表(1386,至徳,3,[]). 西暦和暦表(1387,至徳,4,[]). 西暦和暦表(1387,嘉慶,1,8 / 23). 西暦和暦表(1388,嘉慶,2,[]). 西暦和暦表(1389,嘉慶,3,[]). 西暦和暦表(1389,康応,1,2 / 9). 西暦和暦表(1390,康応,2,[]). 西暦和暦表(1390,明徳,1,3 / 26). 西暦和暦表(1391,明徳,2,[]). 西暦和暦表(1392,明徳,3,[]). 西暦和暦表(1393,明徳,4,[]). 西暦和暦表(1394,明徳,5,[]). 西暦和暦表(1394,応永,1,7 / 5). 西暦和暦表(1395,応永,2,[]). 西暦和暦表(1396,応永,3,[]). 西暦和暦表(1397,応永,4,[]). 西暦和暦表(1398,応永,5,[]). 西暦和暦表(1399,応永,6,[]). 西暦和暦表(1400,応永,7,[]). 西暦和暦表(1401,応永,8,[]). 西暦和暦表(1402,応永,9,[]). 西暦和暦表(1403,応永,10,[]). 西暦和暦表(1404,応永,11,[]). 西暦和暦表(1405,応永,12,[]). 西暦和暦表(1406,応永,13,[]). 西暦和暦表(1407,応永,14,[]). 西暦和暦表(1408,応永,15,[]). 西暦和暦表(1409,応永,16,[]). 西暦和暦表(1410,応永,17,[]). 西暦和暦表(1411,応永,18,[]). 西暦和暦表(1412,応永,19,[]). 西暦和暦表(1413,応永,20,[]). 西暦和暦表(1414,応永,21,[]). 西暦和暦表(1415,応永,22,[]). 西暦和暦表(1416,応永,23,[]). 西暦和暦表(1417,応永,24,[]). 西暦和暦表(1418,応永,25,[]). 西暦和暦表(1419,応永,26,[]). 西暦和暦表(1420,応永,27,[]). 西暦和暦表(1421,応永,28,[]). 西暦和暦表(1422,応永,29,[]). 西暦和暦表(1423,応永,30,[]). 西暦和暦表(1424,応永,31,[]). 西暦和暦表(1425,応永,32,[]). 西暦和暦表(1426,応永,33,[]). 西暦和暦表(1427,応永,34,[]). 西暦和暦表(1428,応永,35,[]). 西暦和暦表(1428,正長,1,4 / 27). 西暦和暦表(1429,正長,2,[]). 西暦和暦表(1429,永享,1,9 / 5). 西暦和暦表(1430,永享,2,[]). 西暦和暦表(1431,永享,3,[]). 西暦和暦表(1432,永享,4,[]). 西暦和暦表(1433,永享,5,[]). 西暦和暦表(1434,永享,6,[]). 西暦和暦表(1435,永享,7,[]). 西暦和暦表(1436,永享,8,[]). 西暦和暦表(1437,永享,9,[]). 西暦和暦表(1438,永享,10,[]). 西暦和暦表(1439,永享,11,[]). 西暦和暦表(1440,永享,12,[]). 西暦和暦表(1441,永享,13,[]). 西暦和暦表(1441,嘉吉,1,2 / 17). 西暦和暦表(1442,嘉吉,2,[]). 西暦和暦表(1443,嘉吉,3,[]). 西暦和暦表(1444,嘉吉,4,[]). 西暦和暦表(1444,文安,1,2 / 5). 西暦和暦表(1445,文安,2,[]). 西暦和暦表(1446,文安,3,[]). 西暦和暦表(1447,文安,4,[]). 西暦和暦表(1448,文安,5,[]). 西暦和暦表(1449,文安,6,[]). 西暦和暦表(1449,宝徳,1,7 / 28). 西暦和暦表(1450,宝徳,2,[]). 西暦和暦表(1451,宝徳,3,[]). 西暦和暦表(1452,宝徳,4,[]). 西暦和暦表(1452,享徳,1,7 / 25). 西暦和暦表(1453,享徳,2,[]). 西暦和暦表(1454,享徳,3,[]). 西暦和暦表(1455,享徳,4,[]). 西暦和暦表(1455,康正,1,7 / 25). 西暦和暦表(1456,康正,2,[]). 西暦和暦表(1457,康正,3,[]). 西暦和暦表(1457,長祿,1,9 / 28). 西暦和暦表(1458,長祿,2,[]). 西暦和暦表(1459,長祿,3,[]). 西暦和暦表(1460,長祿,4,[]). 西暦和暦表(1460,寛正,1,12 / 21). 西暦和暦表(1461,寛正,2,[]). 西暦和暦表(1462,寛正,3,[]). 西暦和暦表(1463,寛正,4,[]). 西暦和暦表(1464,寛正,5,[]). 西暦和暦表(1465,寛正,6,[]). 西暦和暦表(1466,寛正,7,[]). 西暦和暦表(1466,文正,1,2 / 28). 西暦和暦表(1467,文正,2,[]). 西暦和暦表(1467,応仁,1,3 / 5). 西暦和暦表(1468,応仁,2,[]). 西暦和暦表(1469,応仁,3,[]). 西暦和暦表(1469,文明,1,4 / 28). 西暦和暦表(1470,文明,2,[]). 西暦和暦表(1471,文明,3,[]). 西暦和暦表(1472,文明,4,[]). 西暦和暦表(1473,文明,5,[]). 西暦和暦表(1474,文明,6,[]). 西暦和暦表(1475,文明,7,[]). 西暦和暦表(1476,文明,8,[]). 西暦和暦表(1477,文明,9,[]). 西暦和暦表(1478,文明,10,[]). 西暦和暦表(1479,文明,11,[]). 西暦和暦表(1480,文明,12,[]). 西暦和暦表(1481,文明,13,[]). 西暦和暦表(1482,文明,14,[]). 西暦和暦表(1483,文明,15,[]). 西暦和暦表(1484,文明,16,[]). 西暦和暦表(1485,文明,17,[]). 西暦和暦表(1486,文明,18,[]). 西暦和暦表(1487,文明,19,[]). 西暦和暦表(1487,長享,1,7 / 20). 西暦和暦表(1488,長享,2,[]). 西暦和暦表(1489,長享,3,[]). 西暦和暦表(1489,延徳,1,8 / 21). 西暦和暦表(1490,延徳,2,[]). 西暦和暦表(1491,延徳,3,[]). 西暦和暦表(1492,延徳,4,[]). 西暦和暦表(1492,明応,1,7 / 19). 西暦和暦表(1493,明応,2,[]). 西暦和暦表(1494,明応,3,[]). 西暦和暦表(1495,明応,4,[]). 西暦和暦表(1496,明応,5,[]). 西暦和暦表(1497,明応,6,[]). 西暦和暦表(1498,明応,7,[]). 西暦和暦表(1499,明応,8,[]). 西暦和暦表(1500,明応,9,[]). 西暦和暦表(1501,明応,10,[]). 西暦和暦表(1501,文龜,1,2 / 29). 西暦和暦表(1502,文龜,2,[]). 西暦和暦表(1503,文龜,3,[]). 西暦和暦表(1504,文龜,4,[]). 西暦和暦表(1504,永正,1,2 / 30). 西暦和暦表(1505,永正,2,[]). 西暦和暦表(1506,永正,3,[]). 西暦和暦表(1507,永正,4,[]). 西暦和暦表(1508,永正,5,[]). 西暦和暦表(1509,永正,6,[]). 西暦和暦表(1510,永正,7,[]). 西暦和暦表(1511,永正,8,[]). 西暦和暦表(1512,永正,9,[]). 西暦和暦表(1513,永正,10,[]). 西暦和暦表(1514,永正,11,[]). 西暦和暦表(1515,永正,12,[]). 西暦和暦表(1516,永正,13,[]). 西暦和暦表(1517,永正,14,[]). 西暦和暦表(1518,永正,15,[]). 西暦和暦表(1519,永正,16,[]). 西暦和暦表(1520,永正,17,[]). 西暦和暦表(1521,永正,18,[]). 西暦和暦表(1521,大永,1,8 / 23). 西暦和暦表(1522,大永,2,[]). 西暦和暦表(1523,大永,3,[]). 西暦和暦表(1524,大永,4,[]). 西暦和暦表(1525,大永,5,[]). 西暦和暦表(1526,大永,6,[]). 西暦和暦表(1527,大永,7,[]). 西暦和暦表(1528,大永,8,[]). 西暦和暦表(1528,享祿,1,8 / 20). 西暦和暦表(1529,享祿,2,[]). 西暦和暦表(1530,享祿,3,[]). 西暦和暦表(1531,享祿,4,[]). 西暦和暦表(1532,享祿,5,[]). 西暦和暦表(1532,天文,1,7 / 29). 西暦和暦表(1533,天文,2,[]). 西暦和暦表(1534,天文,3,[]). 西暦和暦表(1535,天文,4,[]). 西暦和暦表(1536,天文,5,[]). 西暦和暦表(1537,天文,6,[]). 西暦和暦表(1538,天文,7,[]). 西暦和暦表(1539,天文,8,[]). 西暦和暦表(1540,天文,9,[]). 西暦和暦表(1541,天文,10,[]). 西暦和暦表(1542,天文,11,[]). 西暦和暦表(1543,天文,12,[]). 西暦和暦表(1544,天文,13,[]). 西暦和暦表(1545,天文,14,[]). 西暦和暦表(1546,天文,15,[]). 西暦和暦表(1547,天文,16,[]). 西暦和暦表(1548,天文,17,[]). 西暦和暦表(1549,天文,18,[]). 西暦和暦表(1550,天文,19,[]). 西暦和暦表(1551,天文,20,[]). 西暦和暦表(1552,天文,21,[]). 西暦和暦表(1553,天文,22,[]). 西暦和暦表(1554,天文,23,[]). 西暦和暦表(1555,天文,24,[]). 西暦和暦表(1555,弘治,1,10 / 23). 西暦和暦表(1556,弘治,2,[]). 西暦和暦表(1557,弘治,3,[]). 西暦和暦表(1558,弘治,4,[]). 西暦和暦表(1558,永祿,1,2 / 28). 西暦和暦表(1559,永祿,2,[]). 西暦和暦表(1560,永祿,3,[]). 西暦和暦表(1561,永祿,4,[]). 西暦和暦表(1562,永祿,5,[]). 西暦和暦表(1563,永祿,6,[]). 西暦和暦表(1564,永禄,7,[]). 西暦和暦表(1565,永禄,8,[]). 西暦和暦表(1566,永禄,9,[]). 西暦和暦表(1567,永禄,10,[]). 西暦和暦表(1568,永禄,11,[]). 西暦和暦表(1569,永禄,12,[]). 西暦和暦表(1570,永禄,13,[]). 西暦和暦表(1570,元龜,1,4 / 23). 西暦和暦表(1571,元龜,2,[]). 西暦和暦表(1572,元龜,3,[]). 西暦和暦表(1573,元龜,4,[]). 西暦和暦表(1573,天正,1,7 / 28). 西暦和暦表(1574,天正,2,[]). 西暦和暦表(1575,天正,3,[]). 西暦和暦表(1576,天正,4,[]). 西暦和暦表(1577,天正,5,[]). 西暦和暦表(1578,天正,6,[]). 西暦和暦表(1579,天正,7,[]). 西暦和暦表(1580,天正,8,[]). 西暦和暦表(1581,天正,9,[]). 西暦和暦表(1582,天正,10,[]). 西暦和暦表(1583,天正,11,[]). 西暦和暦表(1584,天正,12,[]). 西暦和暦表(1585,天正,13,[]). 西暦和暦表(1586,天正,14,[]). 西暦和暦表(1587,天正,15,[]). 西暦和暦表(1588,天正,16,[]). 西暦和暦表(1589,天正,17,[]). 西暦和暦表(1590,天正,18,[]). 西暦和暦表(1591,天正,19,[]). 西暦和暦表(1592,天正,20,[]). 西暦和暦表(1592,文禄,1,12 / 8). 西暦和暦表(1593,文禄,2,[]). 西暦和暦表(1594,文禄,3,[]). 西暦和暦表(1595,文禄,4,[]). 西暦和暦表(1596,文禄,5,[]). 西暦和暦表(1596,慶長,1,10 / 27). 西暦和暦表(1597,慶長,2,[]). 西暦和暦表(1598,慶長,3,[]). 西暦和暦表(1599,慶長,4,[]). 西暦和暦表(1600,慶長,5,[]). 西暦和暦表(1601,慶長,6,[]). 西暦和暦表(1602,慶長,7,[]). 西暦和暦表(1603,慶長,8,[]). 西暦和暦表(1604,慶長,9,[]). 西暦和暦表(1605,慶長,10,[]). 西暦和暦表(1606,慶長,11,[]). 西暦和暦表(1607,慶長,12,[]). 西暦和暦表(1608,慶長,13,[]). 西暦和暦表(1609,慶長,14,[]). 西暦和暦表(1610,慶長,15,[]). 西暦和暦表(1611,慶長,16,[]). 西暦和暦表(1612,慶長,17,[]). 西暦和暦表(1613,慶長,18,[]). 西暦和暦表(1614,慶長,19,[]). 西暦和暦表(1615,慶長,20,[]). 西暦和暦表(1615,元和,1,7 / 13). 西暦和暦表(1616,元和,2,[]). 西暦和暦表(1617,元和,3,[]). 西暦和暦表(1618,元和,4,[]). 西暦和暦表(1619,元和,5,[]). 西暦和暦表(1620,元和,6,[]). 西暦和暦表(1621,元和,7,[]). 西暦和暦表(1622,元和,8,[]). 西暦和暦表(1623,元和,9,[]). 西暦和暦表(1624,元和,10,[]). 西暦和暦表(1624,寛永,1,2 / 30). 西暦和暦表(1625,寛永,2,[]). 西暦和暦表(1626,寛永,3,[]). 西暦和暦表(1627,寛永,4,[]). 西暦和暦表(1628,寛永,5,[]). 西暦和暦表(1629,寛永,6,[]). 西暦和暦表(1630,寛永,7,[]). 西暦和暦表(1631,寛永,8,[]). 西暦和暦表(1632,寛永,9,[]). 西暦和暦表(1633,寛永,10,[]). 西暦和暦表(1634,寛永,11,[]). 西暦和暦表(1635,寛永,12,[]). 西暦和暦表(1636,寛永,13,[]). 西暦和暦表(1637,寛永,14,[]). 西暦和暦表(1638,寛永,15,[]). 西暦和暦表(1639,寛永,16,[]). 西暦和暦表(1640,寛永,17,[]). 西暦和暦表(1641,寛永,18,[]). 西暦和暦表(1642,寛永,19,[]). 西暦和暦表(1643,寛永,20,[]). 西暦和暦表(1644,寛永,21,[]). 西暦和暦表(1644,正保,1,12 / 16). 西暦和暦表(1645,正保,2,[]). 西暦和暦表(1646,正保,3,[]). 西暦和暦表(1647,正保,4,[]). 西暦和暦表(1648,正保,5,[]). 西暦和暦表(1648,慶安,1,2 / 15). 西暦和暦表(1649,慶安,2,[]). 西暦和暦表(1650,慶安,3,[]). 西暦和暦表(1651,慶安,4,[]). 西暦和暦表(1652,慶安,5,[]). 西暦和暦表(1652,承応,1,9 / 18). 西暦和暦表(1653,承応,2,[]). 西暦和暦表(1654,承応,3,[]). 西暦和暦表(1655,承応,4,[]). 西暦和暦表(1655,明暦,1,4 / 13). 西暦和暦表(1656,明暦,2,[]). 西暦和暦表(1657,明暦,3,[]). 西暦和暦表(1658,明暦,4,[]). 西暦和暦表(1658,万治,1,7 / 23). 西暦和暦表(1659,万治,2,[]). 西暦和暦表(1660,万治,3,[]). 西暦和暦表(1661,万治,4,[]). 西暦和暦表(1661,寛文,1,4 / 25). 西暦和暦表(1662,寛文,2,[]). 西暦和暦表(1663,寛文,3,[]). 西暦和暦表(1664,寛文,4,[]). 西暦和暦表(1665,寛文,5,[]). 西暦和暦表(1666,寛文,6,[]). 西暦和暦表(1667,寛文,7,[]). 西暦和暦表(1668,寛文,8,[]). 西暦和暦表(1669,寛文,9,[]). 西暦和暦表(1670,寛文,10,[]). 西暦和暦表(1671,寛文,11,[]). 西暦和暦表(1672,寛文,12,[]). 西暦和暦表(1673,寛文,13,[]). 西暦和暦表(1673,延宝,1,9 / 21). 西暦和暦表(1674,延宝,2,[]). 西暦和暦表(1675,延宝,3,[]). 西暦和暦表(1676,延宝,4,[]). 西暦和暦表(1677,延宝,5,[]). 西暦和暦表(1678,延宝,6,[]). 西暦和暦表(1679,延宝,7,[]). 西暦和暦表(1680,延宝,8,[]). 西暦和暦表(1681,延宝,9,[]). 西暦和暦表(1681,天和,1,9 / 29). 西暦和暦表(1682,天和,2,[]). 西暦和暦表(1683,天和,3,[]). 西暦和暦表(1684,天和,4,[]). 西暦和暦表(1684,貞享,1,2 / 21). 西暦和暦表(1685,貞享,2,[]). 西暦和暦表(1686,貞享,3,[]). 西暦和暦表(1687,貞享,4,[]). 西暦和暦表(1688,貞享,5,[]). 西暦和暦表(1688,元禄,1,9 / 30). 西暦和暦表(1689,元禄,2,[]). 西暦和暦表(1690,元禄,3,[]). 西暦和暦表(1691,元禄,4,[]). 西暦和暦表(1692,元禄,5,[]). 西暦和暦表(1693,元禄,6,[]). 西暦和暦表(1694,元禄,7,[]). 西暦和暦表(1695,元禄,8,[]). 西暦和暦表(1696,元禄,9,[]). 西暦和暦表(1697,元禄,10,[]). 西暦和暦表(1698,元禄,11,[]). 西暦和暦表(1699,元禄,12,[]). 西暦和暦表(1700,元禄,13,[]). 西暦和暦表(1701,元禄,14,[]). 西暦和暦表(1702,元禄,15,[]). 西暦和暦表(1703,元禄,16,[]). 西暦和暦表(1704,元禄,17,[]). 西暦和暦表(1704,宝永,1,3 / 13). 西暦和暦表(1705,宝永,2,[]). 西暦和暦表(1706,宝永,3,[]). 西暦和暦表(1707,宝永,4,[]). 西暦和暦表(1708,宝永,5,[]). 西暦和暦表(1709,宝永,6,[]). 西暦和暦表(1710,宝永,7,[]). 西暦和暦表(1711,宝永,8,[]). 西暦和暦表(1711,正徳,1,4 / 25). 西暦和暦表(1712,正徳,2,[]). 西暦和暦表(1713,正徳,3,[]). 西暦和暦表(1714,正徳,4,[]). 西暦和暦表(1715,正徳,5,[]). 西暦和暦表(1716,正徳,6,[]). 西暦和暦表(1716,享保,1,6 / 22). 西暦和暦表(1717,享保,2,[]). 西暦和暦表(1718,享保,3,[]). 西暦和暦表(1719,享保,4,[]). 西暦和暦表(1720,享保,5,[]). 西暦和暦表(1721,享保,6,[]). 西暦和暦表(1722,享保,7,[]). 西暦和暦表(1723,享保,8,[]). 西暦和暦表(1724,享保,9,[]). 西暦和暦表(1725,享保,10,[]). 西暦和暦表(1726,享保,11,[]). 西暦和暦表(1727,享保,12,[]). 西暦和暦表(1728,享保,13,[]). 西暦和暦表(1729,享保,14,[]). 西暦和暦表(1730,享保,15,[]). 西暦和暦表(1731,享保,16,[]). 西暦和暦表(1732,享保,17,[]). 西暦和暦表(1733,享保,18,[]). 西暦和暦表(1734,享保,19,[]). 西暦和暦表(1735,享保,20,[]). 西暦和暦表(1736,享保,21,[]). 西暦和暦表(1736,元文,1,4 / 28). 西暦和暦表(1737,元文,2,[]). 西暦和暦表(1738,元文,3,[]). 西暦和暦表(1739,元文,4,[]). 西暦和暦表(1740,元文,5,[]). 西暦和暦表(1741,元文,6,[]). 西暦和暦表(1741,寛保,1,2 / 27). 西暦和暦表(1742,寛保,2,[]). 西暦和暦表(1743,寛保,3,[]). 西暦和暦表(1744,寛保,4,[]). 西暦和暦表(1744,延享,1,2 / 21). 西暦和暦表(1745,延享,2,[]). 西暦和暦表(1746,延享,3,[]). 西暦和暦表(1747,延享,4,[]). 西暦和暦表(1748,延享,5,[]). 西暦和暦表(1748,寛延,1,7 / 12). 西暦和暦表(1749,寛延,2,[]). 西暦和暦表(1750,寛延,3,[]). 西暦和暦表(1751,寛延,4,[]). 西暦和暦表(1751,宝暦,1,10 / 27). 西暦和暦表(1752,宝暦,2,[]). 西暦和暦表(1753,宝暦,3,[]). 西暦和暦表(1754,宝暦,4,[]). 西暦和暦表(1755,宝暦,5,[]). 西暦和暦表(1756,宝暦,6,[]). 西暦和暦表(1757,宝暦,7,[]). 西暦和暦表(1758,宝暦,8,[]). 西暦和暦表(1759,宝暦,9,[]). 西暦和暦表(1760,宝暦,10,[]). 西暦和暦表(1761,宝暦,11,[]). 西暦和暦表(1762,宝暦,12,[]). 西暦和暦表(1763,宝暦,13,[]). 西暦和暦表(1764,宝暦,14,[]). 西暦和暦表(1764,明和,1,6 / 2). 西暦和暦表(1765,明和,2,[]). 西暦和暦表(1766,明和,3,[]). 西暦和暦表(1767,明和,4,[]). 西暦和暦表(1768,明和,5,[]). 西暦和暦表(1769,明和,6,[]). 西暦和暦表(1770,明和,7,[]). 西暦和暦表(1771,明和,8,[]). 西暦和暦表(1772,明和,9,[]). 西暦和暦表(1772,安永,1,11 / 16). 西暦和暦表(1773,安永,2,[]). 西暦和暦表(1774,安永,3,[]). 西暦和暦表(1775,安永,4,[]). 西暦和暦表(1776,安永,5,[]). 西暦和暦表(1777,安永,6,[]). 西暦和暦表(1778,安永,7,[]). 西暦和暦表(1779,安永,8,[]). 西暦和暦表(1780,安永,9,[]). 西暦和暦表(1781,安永,10,[]). 西暦和暦表(1781,天明,1,4 / 2). 西暦和暦表(1782,天明,2,[]). 西暦和暦表(1783,天明,3,[]). 西暦和暦表(1784,天明,4,[]). 西暦和暦表(1785,天明,5,[]). 西暦和暦表(1786,天明,6,[]). 西暦和暦表(1787,天明,7,[]). 西暦和暦表(1788,天明,8,[]). 西暦和暦表(1789,天明,9,[]). 西暦和暦表(1789,寛政,1,1 / 25). 西暦和暦表(1790,寛政,2,[]). 西暦和暦表(1791,寛政,3,[]). 西暦和暦表(1792,寛政,4,[]). 西暦和暦表(1793,寛政,5,[]). 西暦和暦表(1794,寛政,6,[]). 西暦和暦表(1795,寛政,7,[]). 西暦和暦表(1796,寛政,8,[]). 西暦和暦表(1797,寛政,9,[]). 西暦和暦表(1798,寛政,10,[]). 西暦和暦表(1799,寛政,11,[]). 西暦和暦表(1800,寛政,12,[]). 西暦和暦表(1801,寛政,13,[]). 西暦和暦表(1801,享和,1,2 / 5). 西暦和暦表(1802,享和,2,[]). 西暦和暦表(1803,享和,3,[]). 西暦和暦表(1804,享和,4,[]). 西暦和暦表(1804,文化,1,2 / 11). 西暦和暦表(1805,文化,2,[]). 西暦和暦表(1806,文化,3,[]). 西暦和暦表(1807,文化,4,[]). 西暦和暦表(1808,文化,5,[]). 西暦和暦表(1809,文化,6,[]). 西暦和暦表(1810,文化,7,[]). 西暦和暦表(1811,文化,8,[]). 西暦和暦表(1812,文化,9,[]). 西暦和暦表(1813,文化,10,[]). 西暦和暦表(1814,文化,11,[]). 西暦和暦表(1815,文化,12,[]). 西暦和暦表(1816,文化,13,[]). 西暦和暦表(1817,文化,14,[]). 西暦和暦表(1818,文化,15,[]). 西暦和暦表(1818,文政,1,4 / 22). 西暦和暦表(1819,文政,2,[]). 西暦和暦表(1820,文政,3,[]). 西暦和暦表(1821,文政,4,[]). 西暦和暦表(1822,文政,5,[]). 西暦和暦表(1823,文政,6,[]). 西暦和暦表(1824,文政,7,[]). 西暦和暦表(1825,文政,8,[]). 西暦和暦表(1826,文政,9,[]). 西暦和暦表(1827,文政,10,[]). 西暦和暦表(1828,文政,11,[]). 西暦和暦表(1829,文政,12,[]). 西暦和暦表(1830,文政,13,[]). 西暦和暦表(1830,天保,1,12 / 1). 西暦和暦表(1831,天保,2,[]). 西暦和暦表(1832,天保,3,[]). 西暦和暦表(1833,天保,4,[]). 西暦和暦表(1834,天保,5,[]). 西暦和暦表(1835,天保,6,[]). 西暦和暦表(1836,天保,7,[]). 西暦和暦表(1837,天保,8,[]). 西暦和暦表(1838,天保,9,[]). 西暦和暦表(1839,天保,10,[]). 西暦和暦表(1840,天保,11,[]). 西暦和暦表(1841,天保,12,[]). 西暦和暦表(1842,天保,13,[]). 西暦和暦表(1843,天保,14,[]). 西暦和暦表(1844,天保,15,[]). 西暦和暦表(1844,弘化,1,12 / 2). 西暦和暦表(1845,弘化,2,[]). 西暦和暦表(1846,弘化,3,[]). 西暦和暦表(1847,弘化,4,[]). 西暦和暦表(1848,弘化,5,[]). 西暦和暦表(1848,嘉永,1,2 / 28). 西暦和暦表(1849,嘉永,2,[]). 西暦和暦表(1850,嘉永,3,[]). 西暦和暦表(1851,嘉永,4,[]). 西暦和暦表(1852,嘉永,5,[]). 西暦和暦表(1853,嘉永,6,[]). 西暦和暦表(1854,嘉永,7,[]). 西暦和暦表(1854,安政,1,11 / 27). 西暦和暦表(1855,安政,2,[]). 西暦和暦表(1856,安政,3,[]). 西暦和暦表(1857,安政,4,[]). 西暦和暦表(1858,安政,5,[]). 西暦和暦表(1859,安政,6,[]). 西暦和暦表(1860,安政,7,[]). 西暦和暦表(1860,万延,1,3 / 18). 西暦和暦表(1861,万延,2,[]). 西暦和暦表(1861,文久,1,2 / 19). 西暦和暦表(1862,文久,2,[]). 西暦和暦表(1863,文久,3,[]). 西暦和暦表(1864,文久,4,[]). 西暦和暦表(1864,元治,1,2 / 20). 西暦和暦表(1865,元治,2,[]). 西暦和暦表(1865,慶応,1,4 / 8). 西暦和暦表(1866,慶応,2,[]). 西暦和暦表(1867,慶応,3,[]). 西暦和暦表(1868,慶応,4,[]). 西暦和暦表(1868,明治,1,9 / 8). 西暦和暦表(1869,明治,2,[]). 西暦和暦表(1870,明治,3,[]). 西暦和暦表(1871,明治,4,[]). 西暦和暦表(1872,明治,5,[]). 西暦和暦表(1873,明治,6,[]). 西暦和暦表(1874,明治,7,[]). 西暦和暦表(1875,明治,8,[]). 西暦和暦表(1876,明治,9,[]). 西暦和暦表(1877,明治,10,[]). 西暦和暦表(1878,明治,11,[]). 西暦和暦表(1879,明治,12,[]). 西暦和暦表(1880,明治,13,[]). 西暦和暦表(1881,明治,14,[]). 西暦和暦表(1882,明治,15,[]). 西暦和暦表(1883,明治,16,[]). 西暦和暦表(1884,明治,17,[]). 西暦和暦表(1885,明治,18,[]). 西暦和暦表(1886,明治,19,[]). 西暦和暦表(1887,明治,20,[]). 西暦和暦表(1888,明治,21,[]). 西暦和暦表(1889,明治,22,[]). 西暦和暦表(1890,明治,23,[]). 西暦和暦表(1891,明治,24,[]). 西暦和暦表(1892,明治,25,[]). 西暦和暦表(1893,明治,26,[]). 西暦和暦表(1894,明治,27,[]). 西暦和暦表(1895,明治,28,[]). 西暦和暦表(1896,明治,29,[]). 西暦和暦表(1897,明治,30,[]). 西暦和暦表(1898,明治,31,[]). 西暦和暦表(1899,明治,32,[]). 西暦和暦表(1900,明治,33,[]). 西暦和暦表(1901,明治,34,[]). 西暦和暦表(1902,明治,35,[]). 西暦和暦表(1903,明治,36,[]). 西暦和暦表(1904,明治,37,[]). 西暦和暦表(1905,明治,38,[]). 西暦和暦表(1906,明治,39,[]). 西暦和暦表(1907,明治,40,[]). 西暦和暦表(1908,明治,41,[]). 西暦和暦表(1909,明治,42,[]). 西暦和暦表(1910,明治,43,[]). 西暦和暦表(1911,明治,44,[]). 西暦和暦表(1912,明治,45,[]). 西暦和暦表(1912,大正,1,7 / 30). 西暦和暦表(1913,大正,2,[]). 西暦和暦表(1914,大正,3,[]). 西暦和暦表(1915,大正,4,[]). 西暦和暦表(1916,大正,5,[]). 西暦和暦表(1917,大正,6,[]). 西暦和暦表(1918,大正,7,[]). 西暦和暦表(1919,大正,8,[]). 西暦和暦表(1920,大正,9,[]). 西暦和暦表(1921,大正,10,[]). 西暦和暦表(1922,大正,11,[]). 西暦和暦表(1923,大正,12,[]). 西暦和暦表(1924,大正,13,[]). 西暦和暦表(1925,大正,14,[]). 西暦和暦表(1926,大正,15,[]). 西暦和暦表(1926,昭和,1,12 / 25). 西暦和暦表(1927,昭和,2,[]). 西暦和暦表(1928,昭和,3,[]). 西暦和暦表(1929,昭和,4,[]). 西暦和暦表(1930,昭和,5,[]). 西暦和暦表(1931,昭和,6,[]). 西暦和暦表(1932,昭和,7,[]). 西暦和暦表(1933,昭和,8,[]). 西暦和暦表(1934,昭和,9,[]). 西暦和暦表(1935,昭和,10,[]). 西暦和暦表(1936,昭和,11,[]). 西暦和暦表(1937,昭和,12,[]). 西暦和暦表(1938,昭和,13,[]). 西暦和暦表(1939,昭和,14,[]). 西暦和暦表(1940,昭和,15,[]). 西暦和暦表(1941,昭和,16,[]). 西暦和暦表(1942,昭和,17,[]). 西暦和暦表(1943,昭和,18,[]). 西暦和暦表(1944,昭和,19,[]). 西暦和暦表(1945,昭和,20,[]). 西暦和暦表(1946,昭和,21,[]). 西暦和暦表(1947,昭和,22,[]). 西暦和暦表(1948,昭和,23,[]). 西暦和暦表(1949,昭和,24,[]). 西暦和暦表(1950,昭和,25,[]). 西暦和暦表(1951,昭和,26,[]). 西暦和暦表(1952,昭和,27,[]). 西暦和暦表(1953,昭和,28,[]). 西暦和暦表(1954,昭和,29,[]). 西暦和暦表(1955,昭和,30,[]). 西暦和暦表(1956,昭和,31,[]). 西暦和暦表(1957,昭和,32,[]). 西暦和暦表(1958,昭和,33,[]). 西暦和暦表(1959,昭和,34,[]). 西暦和暦表(1960,昭和,35,[]). 西暦和暦表(1961,昭和,36,[]). 西暦和暦表(1962,昭和,37,[]). 西暦和暦表(1963,昭和,38,[]). 西暦和暦表(1964,昭和,39,[]). 西暦和暦表(1965,昭和,40,[]). 西暦和暦表(1966,昭和,41,[]). 西暦和暦表(1967,昭和,42,[]). 西暦和暦表(1968,昭和,43,[]). 西暦和暦表(1969,昭和,44,[]). 西暦和暦表(1970,昭和,45,[]). 西暦和暦表(1971,昭和,46,[]). 西暦和暦表(1972,昭和,47,[]). 西暦和暦表(1973,昭和,48,[]). 西暦和暦表(1974,昭和,49,[]). 西暦和暦表(1975,昭和,50,[]). 西暦和暦表(1976,昭和,51,[]). 西暦和暦表(1977,昭和,52,[]). 西暦和暦表(1978,昭和,53,[]). 西暦和暦表(1979,昭和,54,[]). 西暦和暦表(1980,昭和,55,[]). 西暦和暦表(1981,昭和,56,[]). 西暦和暦表(1982,昭和,57,[]). 西暦和暦表(1983,昭和,58,[]). 西暦和暦表(1984,昭和,59,[]). 西暦和暦表(1985,昭和,60,[]). 西暦和暦表(1986,昭和,61,[]). 西暦和暦表(1987,昭和,62,[]). 西暦和暦表(1988,昭和,63,[]). 西暦和暦表(1989,昭和,64,[]). 西暦和暦表(1989,平成,1,1 / 7). 西暦和暦表(1990,平成,2,[]). 西暦和暦表(1991,平成,3,[]). 西暦和暦表(1992,平成,4,[]). 西暦和暦表(1993,平成,5,[]). 西暦和暦表(1994,平成,6,[]). 西暦和暦表(1995,平成,7,[]). 西暦和暦表(1996,平成,8,[]). 西暦和暦表(1997,平成,9,[]). 西暦和暦表(1998,平成,10,[]). 西暦和暦表(1999,平成,11,[]). 西暦和暦表(2000,平成,12,[]). 西暦和暦表(2001,平成,13,[]). 西暦和暦表(2002,平成,14,[]). 西暦和暦表(2003,平成,15,[]). 西暦和暦表(2004,平成,16,[]). 西暦和暦表(2005,平成,17,[]). 西暦和暦表(2006,平成,18,[]). 西暦和暦表(2007,平成,19,[]). 西暦和暦表(2008,平成,20,[]). 西暦和暦表(2009,平成,21,[]). 西暦和暦表(2010,平成,22,[]). 西暦和暦表(2011,平成,23,[]). 西暦和暦表(2012,平成,24,[]). 西暦和暦表(2013,平成,25,[]). 西暦和暦表(2014,平成,26,[]). '年漢字表現'(1,['元','年']). '年漢字表現'(2,['二','年']). '年漢字表現'(3,['三','年']). '年漢字表現'(4,['四','年']). '年漢字表現'(5,['五','年']). '年漢字表現'(6,['六','年']). '年漢字表現'(7,['七','年']). '年漢字表現'(8,['八','年']). '年漢字表現'(9,['九','年']). '年漢字表現'(10,['十','年']). '年漢字表現'(11,['十','一','年']). '年漢字表現'(12,['十','二','年']). '年漢字表現'(13,['十','三','年']). '年漢字表現'(14,['十','四','年']). '年漢字表現'(15,['十','五','年']). '年漢字表現'(16,['十','六','年']). '年漢字表現'(17,['十','七','年']). '年漢字表現'(18,['十','八','年']). '年漢字表現'(19,['十','九','年']). '年漢字表現'(20,['二','十','年']). '年漢字表現'(21,['二','十','一','年']). '年漢字表現'(22,['二','十','二','年']). '年漢字表現'(23,['二','十','三','年']). '年漢字表現'(24,['二','十','四','年']). '年漢字表現'(25,['二','十','五','年']). '年漢字表現'(26,['二','十','六','年']). '年漢字表現'(27,['二','十','七','年']). '年漢字表現'(28,['二','十','八','年']). '年漢字表現'(29,['二','十','九','年']). '年漢字表現'(30,['三','十','年']). '年漢字表現'(31,['三','十','一','年']). '年漢字表現'(32,['三','十','二','年']). '年漢字表現'(33,['三','十','三','年']). '年漢字表現'(34,['三','十','四','年']). '年漢字表現'(35,['三','十','五','年']). '年漢字表現'(36,['三','十','六','年']). '年漢字表現'(37,['三','十','七','年']). '年漢字表現'(38,['三','十','八','年']). '年漢字表現'(39,['三','十','九','年']). '年漢字表現'(40,['四','十','年']). '年漢字表現'(41,['四','十','一','年']). '年漢字表現'(42,['四','十','二','年']). '年漢字表現'(43,['四','十','三','年']). '年漢字表現'(44,['四','十','四','年']). '年漢字表現'(45,['四','十','五','年']). '年漢字表現'(46,['四','十','六','年']). '年漢字表現'(47,['四','十','七','年']). '年漢字表現'(48,['四','十','八','年']). '年漢字表現'(49,['四','十','九','年']). '年漢字表現'(50,['五','十','年']). '年漢字表現'(51,['五','十','一','年']). '年漢字表現'(52,['五','十','二','年']). '年漢字表現'(53,['五','十','三','年']). '年漢字表現'(54,['五','十','四','年']). '年漢字表現'(55,['五','十','五','年']). '年漢字表現'(56,['五','十','六','年']). '年漢字表現'(57,['五','十','七','年']). '年漢字表現'(58,['五','十','八','年']). '年漢字表現'(59,['五','十','九','年']). '年漢字表現'(60,['六','十','年']). '年漢字表現'(61,['六','十','一','年']). '年漢字表現'(62,['六','十','二','年']). '年漢字表現'(63,['六','十','三','年']). '年漢字表現'(64,['六','十','四','年']). '年漢字表現'(65,['六','十','五','年']). '年漢字表現'(66,['六','十','六','年']). '年漢字表現'(67,['六','十','七','年']). '年漢字表現'(68,['六','十','八','年']). '年漢字表現'(69,['六','十','九','年']). '元号年の元号の頭文字,年,月および日で表記された日付を入力する'(_元号年の元号の頭文字,_年,_月,_日) :-   write('元号の頭文字,年,月,日 :'),   get_split_line([','],[_元号年の元号の頭文字,_年,_月,_日]). '元号年の元号の頭文字,年,月および日で表記された日付を入力させ,その年の元日からその日付までの日数を計算し,結果を表示する' :-   '元号年の元号の頭文字,年,月および日で表記された日付を入力する'(_元号年の元号の頭文字,_年,_月,_日),   元号の頭文字をローマ字変換した時にの最初の文字(_元号,_元号年の元号の頭文字),   元年の西暦は(_元号,_元年の西暦年),   _西暦年 is _元年の西暦年 + _年 - 1,   その年の元日からその日付までの日数を計算する(_西暦年,_月,_日,_日数),   write_formatted('その年の元旦からの日数は%t日です。\n',[_日数]). その年の元日からその日付までの日数を計算する(_西暦年,_月,_日,_日数) :-   年初から前月末日までの日数(_西暦年,_月,_前月末日までの日数),   _日数 is _前月末日までの日数 + _日. 年初から前月末日までの日数(_西暦年,_月,_前月末日までの日数) :-   N is _月 - 1,   findsum(_日数,(for(1,M,N),月の日数(_西暦年,_月,_日数)),_前月末日までの日数). 元号の頭文字をローマ字変換した時にの最初の文字(明治,m). 元号の頭文字をローマ字変換した時にの最初の文字(大正,t). 元号の頭文字をローマ字変換した時にの最初の文字(昭和,s). 元号の頭文字をローマ字変換した時にの最初の文字(平成,h). 元年の西暦は(明治,1868). 元年の西暦は(大正,1912). 元年の西暦は(大正,1926). 元年の西暦は(昭和,1989). 月の日数(_,_月,31) :- member(_月,[1,3,5,7,8,10,12]). 月の日数(_,_月,30) :- member(_月,[4,6,8,10]). 月の日数(_年,2,29) :- うるう年(_年). 月の日数(_年,2,28) :- \+(うるう年(_年)). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4),fail. 月別日数ならび(平年,[31,28,31,30,31,30,31,31,30,31,30,31]). 月別日数ならび(うるう年,[31,29,31,30,31,30,31,31,30,31,30,31]). うるう年回数(_起点西暦年,_終点西暦年,_うるう年回数) :- count((for(_起点西暦年,N,_終点西暦年),うるう年(N)),_うるう年回数). 今日は元旦から何日目(_年,_月,_日,_元旦から何日目) :- うるう年(_年), 月別日数ならび(うるう年,_月別日数ならび), N1 is _月-1, append(L1,_,_月別日数ならび), length(L1,N1), sum(L1,_前月までの合計日数), _元旦から何日目 is _前月までの合計日数 + _日,!. 今日は元旦から何日目(_年,_月,_日,_元旦から何日目) :- \+(うるう年(_年)), 月別日数ならび(平年,_月別日数ならび), N1 is _月-1, append(L1,_,_月別日数ならび), length(L1,N1), sum(L1,_前月までの合計日数), _元旦から何日目 is _前月までの合計日数 + _日,!. 今日から大晦日まで何日あるか(_年,_月,_日,_何日) :- うるう年(_年), 今日は元旦から何日目(_年,_月,_日,_元旦から何日目), _何日 is 366 - _元旦から何日 + 1. 今日から大晦日まで何日あるか(_年,_月,_日,_何日) :- \+(うるう年(_年)), 今日は元旦から何日目(_年,_月,_日,_元旦から何日目), _何日 is 365 - _元旦から何日 + 1. % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/751 # # # 年月日と金額を持ったテーブルがあります。前年度合計と今年度合計を出したいのですが、 # # 年月日 金額 # 20080402 200 # 20080404 200 # 20090401 100 # 20090401 500 # 20090404 300 # # とあった場合、↓にしたいです # # 年月日 今年度合計 前年度合計 # 20090401 600 0 # 20090402 0 200 # 20090404 300 200 # # 両年度金額が無い場合は表示無しで、年月日は8桁の数値型です。 # うるう年は考慮しなくて構いません。 年月日と金額を持ったテーブルがあります。前年度合計と今年度合計を出したいのですが :- 初めに重複しない年月日ならびを取り出します(_重複しない年月日ならび), 見出しです, 重複しない年月日ならびから順に年月日を取り出し今年度合計と前年度合計を計算して表示します(_重複しない年月日ならび). 初めに重複しない年月日ならびを取り出します(_重複しない年月日ならび) :- findsetof(_年月日,テーブル(_年月日,_),_重複しない年月日ならび). 見出しです :- write_formatted('%8s %10s %10s\n',[年月日,今年度合計,前年度合計]). 重複しない年月日ならびから順に年月日を取り出し今年度合計と前年度合計を計算して表示します([]) :- !. 重複しない年月日ならびから順に年月日を取り出し今年度合計と前年度合計を計算して表示します([_年月日|R]) :- _前年同日 is _年月日 - 10000, ある年月日の金額合計(_年月日,_今年度合計), その前年同日の金額合計(_前年同日,_前年度合計), 年月日と今年度合計と前年度合計を表示します(_年月日,_今年度合計,_前年度合計), 重複しない年月日ならびから順に年月日を取り出し今年度合計と前年度合計を計算して表示します(R). ある年月日の金額合計(_年月日,_金額合計) :- findsum(_金額,(テーブル(_年月日,_金額),_金額合計). その前年同日の金額合計(_前年同日,_前年同日金額合計) :- findsum(_前年同日金額,(テーブル(_前年同日,_前年同日金額),_前年同日金額合計). 年月日と今年度合計と前年度合計を表示します(_年月日,_今年度合計,_前年度合計) :- write_formatted('%t %10.0f %10.0f\n',[_年月日,_今年度合計,_前年度合計]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/67 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10263.txt # # 元号年の元号の頭文字,年,月および日で表記された日付を入力させ,その年の元日からその日付 # までの日数を計算し,結果を表示するプログラムを作成したい. # 明治7 年1 月32 日,大正7 年13 月14 日,昭和65 年1 月14 日,平成7年1 月14 日 # および生年月日(昭和47年3月23日)を例に動作確認しなさい(以下の実行結果を参照). # # 「元号年月日」を入力してください: M 7 1 32 # そのような元号または年月日はありません # 「元号年月日」を入力してください: T 7 13 14 # そのような元号または年月日はありません # 「元号年月日」を入力してください: S 65 1 14 # そのような元号または年月日はありません #「元号年月日」を入力してください: H 7 1 14 # 西暦1995 年1 月14 日は元日から14 日目です '元号年の元号の頭文字(ローマ字),年,月および日で表記された日付を入力させ,その年の元日からその日付までの日数を計算し,結果を表示する' :- '元号年の元号の頭文字(ローマ字),年,月および日で表記された日付を入力する'(_元号の頭文字,_年,_月,_日), 西暦の年を得る(_元号の頭文字,_年,_西暦年), 'その年の元日からその日付までの日数を計算し、結果を表示する'(_西暦年,_月,_日,_日数). '元号年の元号の頭文字,年,月および日で表記された日付を入力する'(_元号年の元号の頭文字,_年,_月,_日) :- write('元号の頭文字,年,月,日 :'), get_split_line([','],[_元号年の元号の頭文字,_年,_月,_日]). 西暦の年を得る(_元号の頭文字,_年,_西暦年) :- 元号の頭文字をローマ字変換した時の最初の文字(_元号,_元号年の元号の頭文字), 元年の西暦は(_元号,_元年の西暦年), _西暦年 is _元年の西暦年 + _年 - 1. 'その年の元日からその日付までの日数を計算し、結果を表示する'(_西暦年,_月,_日,_日数) :- 'その年の元日からその日付までの日数を計算し、'(_西暦年,_月,_日,_日数), '結果を表示する'(_日数). その年の元日からその日付までの日数を計算する(_西暦年,_月,_日,_日数) :- 年初から前月末日までの日数(_西暦年,_月,_前月末日までの日数), _日数 is _前月末日までの日数 + _日. 年初から前月末日までの日数(_西暦年,_月,_前月末日までの日数) :- N is _月 - 1, findsum(_日数,(between(1,N,M),月の日数(_西暦年,_月,_日数)),_前月末日までの日数). 元号の頭文字をローマ字変換した時にの最初の文字(明治,m). 元号の頭文字をローマ字変換した時にの最初の文字(大正,t). 元号の頭文字をローマ字変換した時にの最初の文字(昭和,s). 元号の頭文字をローマ字変換した時にの最初の文字(平成,h). 元年の西暦は(明治,1868). 元年の西暦は(大正,1912). 元年の西暦は(昭和,1926). 元年の西暦は(平成,1989). うるう年(_年) :- '400で割り切れる年はうるう年である'(_年),!. うるう年(_年) :- '4で割り切れる年で100で割り切れない年がうるう年である'(_年). '400で割り切れる年はうるう年である'(_年) :- 0 is _年 mod 400,!. '4で割り切れる年で100で割り切れない年がうるう年である'(_年) :- 0 is _年 mod 4, \+(0 is _年 mod 100). 月の日数(_,_月,_日) :- '大の月は31日、小の月は30日'(_月,_日). 月の日数(_年,2,_日) :- '二月はうるう年の場合29日、うるう年でなければ28日'(_年,_日). '大の月は31日、小の月は30日'(_月,31) :- 大の月(_月). '大の月は31日、小の月は30日'(_月,30) :- 小の月(_月). 大の月(_月) :- member(_月,[1,3,5,7,8,10,12]). 小の月(_月) :- member(_月,[4,6,9,11]). '二月はうるう年の場合29日、うるう年でなければ28日'(_年,29) :- うるう年(_年). '二月はうるう年の場合29日、うるう年でなければ28日'(_年,28) :- \+(うるう年(_年)). 元号の頭文字をローマ字変換した時の最初の文字(明治,m). 元号の頭文字をローマ字変換した時の最初の文字(大正,t). 元号の頭文字をローマ字変換した時の最初の文字(昭和,s). 元号の頭文字をローマ字変換した時の最初の文字(平成,h). '結果を表示する'(_日数) :- writef('その年の元旦からの日数は%t日です。\n',[_日数]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/10 # # [1]単元 初等C言語 # [2]問題 コンソールから、年月日時分秒に対応する整数をそれぞれ個別に不正入力時には # 再入力を促しながら読み込み、それをyyyymmddhhmmss(準グレゴリオ暦)形式の時刻表 # 現と解釈する。この処理を2回行い2つの時刻表現を取得する。それぞれが正しいフォー # マットかどうかを調べ、共に正しい場合は、日付が新しいものの順に # yyyy年mm月dd日hh時mm分ss秒の書式で出力)しその時刻差を秒単位、分単位、時間単 # 位、日単位で出力するプログラム(小数点一位以下四捨五入) # 但し1900年1月1日0時0分0秒以前の時刻は与えられないとして良い。 # また9999年12月31日23時59分59秒以後の時刻も与えられないとする。 # うるう年は400の倍数か100の倍数でない4の倍数な年であるとし、2月の末日 # にうるう日が付与されるものとする。実際の暦体系では不定期に付与されるうるう秒 # は考慮しなくて良いものとする正しい日付でない場合はその旨出力し処理を中止する 二つの時刻の時間差を表示する :- 準グレゴリオ暦入力(_準グレゴリオ暦1,_年1,_月1,_日1,_時1,_分1,_秒1), 準グレゴリオ暦入力(_準グレゴリオ暦2,_年2,_月2,_日2,_時2,_分2,_秒2), 二つの時刻の時間差を計算する(_年1,_月1,_日1,_時1,_分1,_秒1,_年2,_月2,_日2,_時2,_分2,_秒2,_総秒差,_分数,_時間数,_分数,_余り秒数,_時間数,_余り分数,_日数,_余り時間数), 時間差を表示する(_準グレゴリオ暦1,_準グレゴリオ暦2,_総秒差,_分数,_時間数,_分数,_余り秒数,_時間数,_余り分数,_日数,_余り時間数). 二つの時刻の時間差を計算する(_年1,_月1,_日1,_時1,_分1,_秒1,_年2,_月2,_日2,_時2,_分2,_秒2,_総秒差,_分数,_時間数,_分数,_余り秒数,_時間数,_余り分数,_日数,_余り時間数) :- 何日あるか(_年1,_月1,_日1,_年2,_月2,_日2,_何日1), 時・分・秒調整(_時1,_分1,_秒1,_時2,_分2,_秒2,_何日1,_何日2,_秒), _総秒数 is 38400 * _何日 + _秒, _分数 is _総秒数 // 60, _余り秒数 is _総秒数 mod 60, _時間数 is _分数 // 60, _余り分数 is _分数 mod 60, _余り時間数 is _時間 mod 38400,!. 時間差を表示する(_準グレゴリオ暦1,_準グレゴリオ暦2,_総秒差,_分数,_時間数,_分数,_余り秒数,_時間数,_余り分数,_日数,_余り時間数) :- writef('それぞれの時刻の準グレゴリオ暦表現は %t\n%t\n',[_準グレゴリオ暦1,_準グレゴリオ暦2]), writef('時刻差は秒差で%t秒\n',[_総秒差]), writef('分差で%t分と%t秒\n',[_分数,_余り秒数]), writef('時間差で%t時間と%分と%秒\n',[_時間,_余り分数,_余り秒数]), writef('日差は%t日と%t時間と%t分と%秒です\n',[_日数,_余り時間数,_余り分数,_余り秒数]),!. 準グレゴリオ暦入力(_準グレゴリオ暦,_年,_月,_日,_時,_分,_秒) :- repeat, 催促付き整数入力('西暦年 yyyy:',_年),整数から文字列(4,_年,_年文字列), 催促付き整数入力('月 mm:',_月),整数から文字列(2,_月,_月文字列), 催促付き整数入力('月 dd:',_日),整数から文字列(2,_日,_日文字列), 催促付き整数入力('月 hh:',_時),整数から文字列(2,_時,_時文字列), 催促付き整数入力('月 mi:',_分),整数から文字列(2,_分,_分文字列), 催促付き整数入力('月 ss:',_秒),整数から文字列(2,_秒,_秒文字列), その日付はありうるか(_年,_月,_日,_時,_分,_秒), concat_atom([_年文字列,_月文字列,_日文字列,_時文字列,_分文字列,_秒文字列],_準グレゴリオ歴),!. その日付はありうるか(_年,_月,_日,_時,_分,_秒) :- _年>=1900,_年=<9999, _時>=0,_時=<59, _分>=0,_分=<59, _秒>=0,_秒=<59, その日付はありうるか(_年,_月,_日),!. その日付はありうるか(_年,_月,_日,_時,_分,_秒) :- write('日付として不適切なものでした\n'),fail. その日付はありうるか(_年,2,_日) :- うるう年(_年), _日>=1,_日=<29,!. その日付はありうるか(_年,2,_日) :- \+(うるう年(_年)), _日>=1,_日=<29,!. その日付はありうるか(_年,_月,_日) :- member(_月,[1,3,5,7,8,10,12]), _日>=1,_日=<31,!. その日付はありうるか(_年,_月,_日) :- member(_月,[4,6,9,11]), _日>=1,_日=<30,!. 何日あるか(_年,_月1,_日1,_年,_月2,_日2,_何日あるか) :- 今日から大晦日まで何日あるか(_年,_月1,_日1,_何日), 今日は元旦から何日目(_年,_月2,_日2,_元旦から何日目), _何日あるか is _何日 + _元旦から何日目 - 1,!. 何日あるか(_年1,_月1,_日1,_年2,_月2,_日2) :- _年2 is _年 + 1, 今日から大晦日まで何日あるか(_年1,_月1,_日1,_何日), 今日は元旦から何日目(_年2,_月2,_日2,_元旦から何日目), _何日あるか is _何日 + _元旦から何日目,!. 何日あるか(_年1,_月1,_日1,_年2,_月2,_日2) :- _年11 is _年1 + 1, _年22 is _年2 - 1, うるう年回数(_年11,_年22,_うるう年回数), N is (_年22-_年11+1) * 365 + _うるう年回数, 今日から大晦日まで何日あるか(_年1,_月1,_日1,_何日), 今日は元旦から何日目(_年,_月,_日,_元旦から何日目), _何日あるか is _何日 + _元旦から何日目 + N,!. 時・分・秒調整(_時1,_分1,_秒1,_時2,_分2,_秒2,_何日1,_何日2,_秒) :- _時間1 is 3600 * _時1 + _分1 * 60 + _秒1, _時間2 is 3600 * _時2 + _分2 * 60 + _秒2, _秒3 is _時間2 - _時間1, ( _秒3 >= 0, _何日2 is _何日 - 1, _秒3 = _秒; _秒3 < 0, _何日2 is _何日 - 2, _秒2 is 3600*24-_秒3 ),!. 日・時変換(_日,_時) :- _時 is _日 * 24. 日・分変換(_日,_分) :- _分 is _日 * 24 * 60. 日・秒変換(_日,_秒) :- _秒 is _日 * 24 * 60 * 60. 催促付き整数入力('年 yyyy:',_年),_年>=1900,_年=<9999, 催促付き整数入力('月 mm:',_月), 催促付き整数入力('年 dd:',_日), うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4),fail. 月別日数ならび(平年,[31,28,31,30,31,30,31,31,30,31,30,31]). 月別日数ならび(うるう年,[31,29,31,30,31,30,31,31,30,31,30,31]). うるう年回数(_起点西暦年,_終点西暦年,_うるう年回数) :- count((between(_起点西暦年,_終点西暦年,N),うるう年(N)),_うるう年回数). 今日は元旦から何日目(_年,_月,_日,_元旦から何日目) :- うるう年(_年), 月別日数ならび(うるう年,_月別日数ならび), N1 is _月-1, append(L1,_,_月別日数ならび), length(L1,N1), sum(L1,_前月までの合計日数), _元旦から何日目 is _前月までの合計日数 + _日,!. 今日は元旦から何日目(_年,_月,_日,_元旦から何日目) :- \+(うるう年(_年)), 月別日数ならび(平年,_月別日数ならび), N1 is _月-1, append(L1,_,_月別日数ならび), length(L1,N1), sum(L1,_前月までの合計日数), _元旦から何日目 is _前月までの合計日数 + _日,!. 今日から大晦日まで何日あるか(_年,_月,_日,_何日) :- うるう年(_年), 今日は元旦から何日目(_年,_月,_日,_元旦から何日目), _何日 is 366 - _元旦から何日 + 1. 今日から大晦日まで何日あるか(_年,_月,_日,_何日) :- \+(うるう年(_年)), 今日は元旦から何日目(_年,_月,_日,_元旦から何日目), _何日 is 365 - _元旦から何日 + 1. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/67 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10263.txt # # 元号年の元号の頭文字,年,月および日で表記された日付を入力させ,その年の元日からその日付 # までの日数を計算し,結果を表示するプログラムを作成したい. # 明治7 年1 月32 日,大正7 年13 月14 日,昭和65 年1 月14 日,平成7年1 月14 日 # および生年月日(昭和47年3月23日)を例に動作確認しなさい(以下の実行結果を参照). # # 「元号年月日」を入力してください: M 7 1 32 # そのような元号または年月日はありません # 「元号年月日」を入力してください: T 7 13 14 # そのような元号または年月日はありません # 「元号年月日」を入力してください: S 65 1 14 # そのような元号または年月日はありません #「元号年月日」を入力してください: H 7 1 14 # 西暦1995 年1 月14 日は元日から14 日目です '元号年の元号の頭文字(ローマ字),年,月および日で表記された日付を入力させ,その年の元日からその日付までの日数を計算し,結果を表示する' :- '元号年の元号の頭文字(ローマ字),年,月および日で表記された日付を入力する'(_元号の頭文字,_年,_月,_日), 西暦の年を得る(_元号の頭文字,_年,_西暦年), 'その年の元日からその日付までの日数を計算し、結果を表示する'(_西暦年,_月,_日,_日数). '元号年の元号の頭文字,年,月および日で表記された日付を入力する'(_元号年の元号の頭文字,_年,_月,_日) :- write('元号の頭文字,年,月,日 :'), get_split_line([','],[_元号年の元号の頭文字,_年,_月,_日]). 西暦の年を得る(_元号の頭文字,_年,_西暦年) :- 元号の頭文字をローマ字変換した時の最初の文字(_元号,_元号年の元号の頭文字), 元年の西暦は(_元号,_元年の西暦年), _西暦年 is _元年の西暦年 + _年 - 1. 'その年の元日からその日付までの日数を計算し、結果を表示する'(_西暦年,_月,_日,_日数) :- 'その年の元日からその日付までの日数を計算し、'(_西暦年,_月,_日,_日数), '結果を表示する'(_日数). その年の元日からその日付までの日数を計算する(_西暦年,_月,_日,_日数) :- 年初から前月末日までの日数(_西暦年,_月,_前月末日までの日数), _日数 is _前月末日までの日数 + _日. 年初から前月末日までの日数(_西暦年,_月,_前月末日までの日数) :- N is _月 - 1, findsum(_日数,(between(1,N,M),月の日数(_西暦年,_月,_日数)),_前月末日までの日数). 元号の頭文字をローマ字変換した時にの最初の文字(明治,m). 元号の頭文字をローマ字変換した時にの最初の文字(大正,t). 元号の頭文字をローマ字変換した時にの最初の文字(昭和,s). 元号の頭文字をローマ字変換した時にの最初の文字(平成,h). 元年の西暦は(明治,1868). 元年の西暦は(大正,1912). 元年の西暦は(昭和,1926). 元年の西暦は(平成,1989). うるう年(_年) :- '400で割り切れる年はうるう年である'(_年),!. うるう年(_年) :- '4で割り切れる年で100で割り切れない年がうるう年である'(_年). '400で割り切れる年はうるう年である'(_年) :- 0 is _年 mod 400,!. '4で割り切れる年で100で割り切れない年がうるう年である'(_年) :- 0 is _年 mod 4, \+(0 is _年 mod 100). 月の日数(_,_月,_日) :- '大の月は31日、小の月は30日'(_月,_日). 月の日数(_年,2,_日) :- '二月はうるう年の場合29日、うるう年でなければ28日'(_年,_日). '大の月は31日、小の月は30日'(_月,31) :- 大の月(_月). '大の月は31日、小の月は30日'(_月,30) :- 小の月(_月). 大の月(_月) :- member(_月,[1,3,5,7,8,10,12]). 小の月(_月) :- member(_月,[4,6,9,11]). '二月はうるう年の場合29日、うるう年でなければ28日'(_年,29) :- うるう年(_年). '二月はうるう年の場合29日、うるう年でなければ28日'(_年,28) :- \+(うるう年(_年)). 元号の頭文字をローマ字変換した時の最初の文字(明治,m). 元号の頭文字をローマ字変換した時の最初の文字(大正,t). 元号の頭文字をローマ字変換した時の最初の文字(昭和,s). 元号の頭文字をローマ字変換した時の最初の文字(平成,h). '結果を表示する'(_日数) :- writef('その年の元旦からの日数は%t日です。\n',[_日数]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/10 # # [1]単元 初等C言語 # [2]問題 コンソールから、年月日時分秒に対応する整数をそれぞれ個別に不正入力時には # 再入力を促しながら読み込み、それをyyyymmddhhmmss(準グレゴリオ暦)形式の時刻表 # 現と解釈する。この処理を2回行い2つの時刻表現を取得する。それぞれが正しいフォー # マットかどうかを調べ、共に正しい場合は、日付が新しいものの順に # yyyy年mm月dd日hh時mm分ss秒の書式で出力)しその時刻差を秒単位、分単位、時間単 # 位、日単位で出力するプログラム(小数点一位以下四捨五入) # 但し1900年1月1日0時0分0秒以前の時刻は与えられないとして良い。 # また9999年12月31日23時59分59秒以後の時刻も与えられないとする。 # うるう年は400の倍数か100の倍数でない4の倍数な年であるとし、2月の末日 # にうるう日が付与されるものとする。実際の暦体系では不定期に付与されるうるう秒 # は考慮しなくて良いものとする正しい日付でない場合はその旨出力し処理を中止する 二つの時刻の時間差を表示する :- 準グレゴリオ暦入力(_準グレゴリオ暦1,_年1,_月1,_日1,_時1,_分1,_秒1), 準グレゴリオ暦入力(_準グレゴリオ暦2,_年2,_月2,_日2,_時2,_分2,_秒2), 二つの時刻の時間差を計算する(_年1,_月1,_日1,_時1,_分1,_秒1,_年2,_月2,_日2,_時2,_分2,_秒2,_総秒差,_分数,_時間数,_分数,_余り秒数,_時間数,_余り分数,_日数,_余り時間数), 時間差を表示する(_準グレゴリオ暦1,_準グレゴリオ暦2,_総秒差,_分数,_時間数,_分数,_余り秒数,_時間数,_余り分数,_日数,_余り時間数). 二つの時刻の時間差を計算する(_年1,_月1,_日1,_時1,_分1,_秒1,_年2,_月2,_日2,_時2,_分2,_秒2,_総秒差,_分数,_時間数,_分数,_余り秒数,_時間数,_余り分数,_日数,_余り時間数) :- 何日あるか(_年1,_月1,_日1,_年2,_月2,_日2,_何日1), 時・分・秒調整(_時1,_分1,_秒1,_時2,_分2,_秒2,_何日1,_何日2,_秒), _総秒数 is 38400 * _何日 + _秒, _分数 is _総秒数 // 60, _余り秒数 is _総秒数 mod 60, _時間数 is _分数 // 60, _余り分数 is _分数 mod 60, _余り時間数 is _時間 mod 38400,!. 時間差を表示する(_準グレゴリオ暦1,_準グレゴリオ暦2,_総秒差,_分数,_時間数,_分数,_余り秒数,_時間数,_余り分数,_日数,_余り時間数) :- writef('それぞれの時刻の準グレゴリオ暦表現は %t\n%t\n',[_準グレゴリオ暦1,_準グレゴリオ暦2]), writef('時刻差は秒差で%t秒\n',[_総秒差]), writef('分差で%t分と%t秒\n',[_分数,_余り秒数]), writef('時間差で%t時間と%分と%秒\n',[_時間,_余り分数,_余り秒数]), writef('日差は%t日と%t時間と%t分と%秒です\n',[_日数,_余り時間数,_余り分数,_余り秒数]),!. 準グレゴリオ暦入力(_準グレゴリオ暦,_年,_月,_日,_時,_分,_秒) :- repeat, 催促付き整数入力('西暦年 yyyy:',_年),整数から文字列(4,_年,_年文字列), 催促付き整数入力('月 mm:',_月),整数から文字列(2,_月,_月文字列), 催促付き整数入力('月 dd:',_日),整数から文字列(2,_日,_日文字列), 催促付き整数入力('月 hh:',_時),整数から文字列(2,_時,_時文字列), 催促付き整数入力('月 mi:',_分),整数から文字列(2,_分,_分文字列), 催促付き整数入力('月 ss:',_秒),整数から文字列(2,_秒,_秒文字列), その日付はありうるか(_年,_月,_日,_時,_分,_秒), concat_atom([_年文字列,_月文字列,_日文字列,_時文字列,_分文字列,_秒文字列],_準グレゴリオ歴),!. その日付はありうるか(_年,_月,_日,_時,_分,_秒) :- _年>=1900,_年=<9999, _時>=0,_時=<59, _分>=0,_分=<59, _秒>=0,_秒=<59, その日付はありうるか(_年,_月,_日),!. その日付はありうるか(_年,_月,_日,_時,_分,_秒) :- write('日付として不適切なものでした\n'),fail. その日付はありうるか(_年,2,_日) :- うるう年(_年), _日>=1,_日=<29,!. その日付はありうるか(_年,2,_日) :- \+(うるう年(_年)), _日>=1,_日=<29,!. その日付はありうるか(_年,_月,_日) :- member(_月,[1,3,5,7,8,10,12]), _日>=1,_日=<31,!. その日付はありうるか(_年,_月,_日) :- member(_月,[4,6,9,11]), _日>=1,_日=<30,!. 何日あるか(_年,_月1,_日1,_年,_月2,_日2,_何日あるか) :- 今日から大晦日まで何日あるか(_年,_月1,_日1,_何日), 今日は元旦から何日目(_年,_月2,_日2,_元旦から何日目), _何日あるか is _何日 + _元旦から何日目 - 1,!. 何日あるか(_年1,_月1,_日1,_年2,_月2,_日2) :- _年2 is _年 + 1, 今日から大晦日まで何日あるか(_年1,_月1,_日1,_何日), 今日は元旦から何日目(_年2,_月2,_日2,_元旦から何日目), _何日あるか is _何日 + _元旦から何日目,!. 何日あるか(_年1,_月1,_日1,_年2,_月2,_日2) :- _年11 is _年1 + 1, _年22 is _年2 - 1, うるう年回数(_年11,_年22,_うるう年回数), N is (_年22-_年11+1) * 365 + _うるう年回数, 今日から大晦日まで何日あるか(_年1,_月1,_日1,_何日), 今日は元旦から何日目(_年,_月,_日,_元旦から何日目), _何日あるか is _何日 + _元旦から何日目 + N,!. 時・分・秒調整(_時1,_分1,_秒1,_時2,_分2,_秒2,_何日1,_何日2,_秒) :- _時間1 is 3600 * _時1 + _分1 * 60 + _秒1, _時間2 is 3600 * _時2 + _分2 * 60 + _秒2, _秒3 is _時間2 - _時間1, ( _秒3 >= 0, _何日2 is _何日 - 1, _秒3 = _秒; _秒3 < 0, _何日2 is _何日 - 2, _秒2 is 3600*24-_秒3 ),!. 日・時変換(_日,_時) :- _時 is _日 * 24. 日・分変換(_日,_分) :- _分 is _日 * 24 * 60. 日・秒変換(_日,_秒) :- _秒 is _日 * 24 * 60 * 60. 催促付き整数入力('年 yyyy:',_年),_年>=1900,_年=<9999, 催促付き整数入力('月 mm:',_月), 催促付き整数入力('年 dd:',_日), うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4),fail. 月別日数ならび(平年,[31,28,31,30,31,30,31,31,30,31,30,31]). 月別日数ならび(うるう年,[31,29,31,30,31,30,31,31,30,31,30,31]). うるう年回数(_起点西暦年,_終点西暦年,_うるう年回数) :- count((between(_起点西暦年,_終点西暦年,N),うるう年(N)),_うるう年回数). 今日は元旦から何日目(_年,_月,_日,_元旦から何日目) :- うるう年(_年), 月別日数ならび(うるう年,_月別日数ならび), N1 is _月-1, append(L1,_,_月別日数ならび), length(L1,N1), sum(L1,_前月までの合計日数), _元旦から何日目 is _前月までの合計日数 + _日,!. 今日は元旦から何日目(_年,_月,_日,_元旦から何日目) :- \+(うるう年(_年)), 月別日数ならび(平年,_月別日数ならび), N1 is _月-1, append(L1,_,_月別日数ならび), length(L1,N1), sum(L1,_前月までの合計日数), _元旦から何日目 is _前月までの合計日数 + _日,!. 今日から大晦日まで何日あるか(_年,_月,_日,_何日) :- うるう年(_年), 今日は元旦から何日目(_年,_月,_日,_元旦から何日目), _何日 is 366 - _元旦から何日 + 1. 今日から大晦日まで何日あるか(_年,_月,_日,_何日) :- \+(うるう年(_年)), 今日は元旦から何日目(_年,_月,_日,_元旦から何日目), _何日 is 365 - _元旦から何日 + 1. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/402 # # 【 補足 】3問です。本日1日悩みましたが、わかりませんでした。 # いかなる場合でも予期しない例外が出ないこと。 # 1: コマンドライン引数に入力された日付から現在日まで何日かを計算し、「今日まで●日」と表示しなさい。 # 現在日より入力された日付が小さい場合は「-(マイナス)」をつけて表示すること。(日付その他のチェックも行う事) # 2: コマンドライン引数に入力された年と月から、その月が何日まであるかを表示しなさい。(日付その他のチェックも行う事) # 3: コマンドライン引数に入力された日付が、入力された日付の年の何番目の週かを # 「●年の●週目」と表示しなさい。(●年の"●"は入力された日付の年)(日付その他のチェックも行う事) # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/402 # # 【 形態 】1. Javaアプリケーション(main()で開始) # 1 t815_1 :-   user_parameters([_年月日]), 日付整数(今日,_今日の年整数,_今日の月整数,_今日の日整数), atom_to_term(_年月日,_年月日整数,_), 日付整数を年、月、日に分割(_年月日整数,_年整数,_月整数,_日整数), 何日前後から調べる(_今日の年整数/_今日の月整数/_今日の日整数, _年整数/_月整数/_日整数,N日後), write_formatted('入力された日付から今日まで%t日です\n',[N日後]). 日付整数を年、月、日に分割(_日付整数,_年整数,_月整数,_日整数) :- _年整数 is _日付整数 // 10000, Mod1 is _年整数 mod 10000, _月整数 is Mod1 // 100, _日整数 is Mod1 mod 100. 何日前後から調べる(_日付,_日付,0) :- !. 何日前後から調べる(_日付1,_日付2,N日後) :- _日付1 @> _日付2, 何日前後から調べる(_日付2,_日付1,N日後の一), N日後 is (-1) * _N日後の一,!. 何日前後から調べる(_日付1,_日付2,N日後) :- _日付1 @=< _日付2, 前日・今日(_日付1,_日付3), 何日前後から調べる(_日付3,_日付2,M日後), N日後 is M日後 + 1,!. # 2 コマンドライン引数に入力された年と月から、その月が何日まであるかを表示しなさい。(日付その他のチェックも行う事) t815_2 :-   user_parameters([_年,_月]),   月末日は何日(_年,_月,_月末日),   write_formatted('%t年%月の月末日は%t日です\n',[_年,_月,_月末日]). 月末日は何日(_年,'2','29') :-   atom_to_term(_年,_年整数,_),   うるう年(_年整数),!. 月末日は何日(_年,'2','28'). 月末日は何日(_年,_月,'30') :-   member(_月,['4','6','9','11']). 月末日は何日(_年,_月,'31') :-   member(_月,['1','3','5','7','8','10','12']). t815_3 :-   user_parameters([_年月日]), atom_to_term(_年月日,_年月日整数,_), 日付整数を年、月、日に分割(_年月日整数,_年整数,_月整数,_日整数), findall(X,(曜日検索(_年整数/1/1,A,X,Y),Y=A,(X @> _年整数/_月整数/_日整数,!,fail;true)),L), length(L,N週目), write_formatted('この日は1月1日から数えて第%t週目です\n',[N週目]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 日付整数(今日,_年整数,_月整数,_日整数) :- A is time, localtime(A,_年整数,_月整数,_日整数,_,_,_,_,_). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- not(0 is _年 mod 4),fail. 前日・今日(_前日の年/12/31,_前日の曜日,_年/1/1,_曜日) :- 一つ違い(_前日の年,_年), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/2/29,_前日の曜日,_年/3/1,_曜日) :- うるう年(_年), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/2/28,_前日の曜日,_年/3/1,_曜日) :- not(うるう年(_年)), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_前月/30,_前日の曜日,_年/_月/1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[4,6,9,11]), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_前月/31,_前日の曜日,_年/_月/1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[1,3,5,7,8,10,12]), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_月/_前日,_前日の曜日,_年/_月/_日,_曜日) :- 一つ違い(_前日,_日), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_前日の年/12/31,_年/1/1) :- 一つ違い(_前日の年,_年). 前日・今日(_年/2/29,_年/3/1) :- うるう年(_年). 前日・今日(_年/2/28,_年/3/1) :- not(うるう年(_年)). 前日・今日(_年/_前月/30,_年/_月/1) :- 一つ違い(_前月,_月), member(_前月,[4,6,9,11]). 前日・今日(_年/_前月/31,_年/_月/1) :- 一つ違い(_前月,_月), member(_前月,[1,3,5,7,8,10,12]). 前日・今日(_年/_月/_前日,_年/_月/_日) :- 一つ違い(_前日,_日). 曜日検索(_日付,_曜日,_今日,_今日の曜日) :- var(_日付), var(_曜日), 前日・今日(_日付,_曜日,_今日,_今日の曜日). 曜日検索(_日付,_曜日,_今日,_今日の曜日) :- var(_日付), var(_曜日), 前日・今日(_前日,_前日の曜日,_今日,_今日の曜日), 曜日検索(_日付,_曜日,_前日,_前日の曜日). 曜日検索(_今日,_今日の曜日,_日付,_曜日) :- var(_日付), var(_曜日), 前日・今日(_今日,_今日の曜日,_日付,_曜日). 曜日検索(_今日,_今日の曜日,_日付,_曜日) :- var(_日付), var(_曜日), 前日・今日(_今日,_今日の曜日,_翌日,_翌日の曜日), 曜日検索(_翌日,_翌日の曜日,_日付,_曜日). 一つ違い(M,N) :- integer(M),!, N is M + 1. 一つ違い(M,N) :- integer(N),!, M is N - 1. 曜日連鎖(月曜,火曜). 曜日連鎖(火曜,水曜). 曜日連鎖(水曜,木曜). 曜日連鎖(木曜,金曜). 曜日連鎖(金曜,土曜). 曜日連鎖(土曜,日曜). 曜日連鎖(日曜,月曜). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/103 # # 【質問テンプレ】 # [1] 授業単元: C言語演習 # [2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9753.txt # 2.入力された年月の1日が何曜日かを調べる。 #   曜日のチェックはZellerの公式を使用する。Zellerの公式は、 #    #   曜日を表す値=(y + [ y / 4 ] - [ y / 100 ] + [ y / 400 ] + [ (( 13 * m ) + 8 ) / 5 ] + d ) % 7 # #           ※ 上記の公式中の y は年、 m は月、 d は日を表し、 #             []はその数を越えない最大の整数を表す。(例: [13.6]は13になる) # #   で、曜日を表す値は次のようになっている。 # #     日曜日 = 0, 月曜日 = 1, 火曜日 = 2, 水曜日 = 3, # # 木曜日 = 4, 金曜日 = 5, 土曜日 = 6, # #   ※但し、1月と2月は前年の13月14月として計算するものとする。 % (1) 年月の入力 年月入力処理(_年,_月) :- 年入力処理(_年), 月入力処理(_月). % (2) 曜日計算 :- op(450,xfx,が),op(500,xfx,であり),op(600,xfx,ならば),op(450,xfx,は). 'Zellerの公式'(年 が Y であり 月 が M であり 日 が D ならば 曜日を表す値 は (Y + Y // 4 - Y // 100 + Y // 400 + ((( 13 * M ) + 8 ) // 5 ) + D ) mod 7). 曜日計算処理(_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日). 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を表す値を得る'(_年,_月,_日,_曜日を表す値), 曜日を表す値(_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を表す値を得る'(_年,1,_日,_曜日を表す値) :- _前年 is _年 - 1, 'Zellerの公式を用いて曜日を表す値を得る'(_前年,13,_日,_曜日を表す値),!. 'Zellerの公式を用いて曜日を表す値を得る'(_年,2,_日,_曜日を表す値) :- _前年 is _年 - 1, 'Zellerの公式を用いて曜日を表す値を得る'(_前年,14,_日,_曜日を表す値),!. 'Zellerの公式を用いて曜日を表す値を得る'(_年,_月,_日,_曜日を表す値) :- _年=Y,_月=M,_日=D, 'Zellerの公式'(年 が Y であり 月 が M であり 日 が D ならば 曜日を表す値 は _Zellerの公式), _曜日を表す値 is _Zellerの公式,!. 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). % (3) カレンダー表示 カレンダー表示 :- 年月入力処理(_年,_月), 'Zellerの公式を用いて曜日を表す値を得る'(_年,_月,1,_曜日を表す整数値), カレンダー表示データ編集(_年,_月,_曜日を表す整数値,_カレンダー表示文字列ならび), 要素に空白を挿入して全行表示(_カレンダー表示文字列ならび). カレンダー表示データ編集(_年,_月,_各月1日の曜日を表す整数値,_カレンダー表示文字列ならび) :- 年月文字列編集処理(_年,_月,_年月文字列), 月日数(_年,_月,_月日数), findall(S,for(1,N,_月日数),ヘッドゼロサプレス(2,N,S)),_表示日ならび), Length is _月日数 + _各月1日の曜日を表す整数値, M is (7 - (Length mod 7)), '7個組ならび'(Length,M,_表示日ならび,_7個組ならび), 見出しならび(_年月文字列,_見出しならび), append(_見出しならび,_7個組ならび,_カレンダー表示文字列ならび). 見出しならび(_年月文字列,[[_年月文字列],[日,月,火,水,木,金,土]]). '7個組ならび'(Length,0,_表示日ならび,_7個組ならび) :- length(L0,Length), すべての要素が(L0,' '), append(L0,_表示日ならび,L), '7個組'(L,_7個組ならび),!. '7個組ならび'(Length,M,_表示日ならび,_7個組ならび) :- not(M=0), length(L0,Length), すべての要素が(L0,' '), length(L2,M), すべての要素が(L2,' '), append(L0,_表示日ならび,L2,L), '7個組'(L,_7個組ならび),!. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- not(0 is _年 mod 4),fail. 月日数(_年,2,29) :- うるう年(_年),!. 月日数(_年,2,28) :- not(うるう年(_年)),!. 月日数(_,_月,30) :- member(_月,[4,6,9,11]). 月日数(_,_月,31) :- member(_月,[1,3,5,7,8,10,12]). % (4) 基礎述語の定義 年入力処理(_年) :- write('表示したいカレンダーは西暦何年 ? '), get_line(_行), 年入力処理の二(_行,_年), 年入力検査(_年),!. 年入力処理(_年) :- 年入力処理(_年). 年入力処理の二(_行,_年) :- atom_to_term(_行,_年), integer(_年),!. 年入力処理の二(_行,_年) :- write_formatted('この入力[ %t ]は整数ではありません\n',[_行]), fail. 年入力検査(_年) :- _年 >= 1583, _年 =< 3999,!. 年入力検査(_年) :- write_formatted('この年を表す整数%tは不正です\n',[_年]), fail. 月入力処理(_月) :- write('月は ? '), get_line(_行), 月入力処理の二(_行,_月), 月入力検査(_月),!. 月入力処理(_月) :- 月入力処理(_月). 月入力処理の二(_行,_月) :- atom_to_term(_行,_月,_), integer(_月),!. 月入力処理の二(_行,_月) :- write_formatted('この入力[ %t ]は整数ではありません\n',[_行]), fail. 月入力検査(_月) :- _月 >= 1, _月 =< 12,!. 月入力検査(_月) :- write_formatted('この月を表す整数%tは不正です\n',[_月]), fail. 日付文字列編集処理(_年,_月,_日,_日付文字列) :- ヘッドゼロサプライ(2,_年,_年文字列), ヘッドゼロサプライ(2,_月,_月文字列), ヘッドゼロサプライ(2,_日,_日文字列), concat_atom([_年文字列,_月文字列,_日文字列],_日付文字列). 年月文字列編集処理(_年,_月,_年月文字列) :- ヘッドゼロサプライ(2,_年,_年文字列), ヘッドゼロサプライ(2,_月,_月文字列), concat_atom([_年文字列,_月文字列],_年月文字列). ヘッドゼロサプライ(N桁,_整数,_ヘッドゼロ整数文字列) :- number_chars(_整数,_数字ならび), ヘッドゼロサプライ_1(N桁,_数字ならび,_ヘッドゼロ整数文字ならび), concat_atom(_ヘッドゼロ整数文字ならび,_ヘッドゼロ整数文字列),!. ヘッドゼロサプライ_1(N桁,L,L) :- length(L,N桁),!. ヘッドゼロサプライ_1(N桁,L,['0'|R]) :- M桁 is N桁 - 1, ヘッドゼロサプライ_1(M桁,L,R). ヘッドゼロサプレス(N桁,_整数,_ヘッド空白整数文字列) :- number_chars(_整数,_数字ならび), ヘッドゼロサプレス_1(N桁,_数字ならび,_ヘッド空白整数文字ならび), concat_atom(_ヘッド空白整数文字ならび,_ヘッド空白整数文字列),!. ヘッドゼロサプレス_1(N桁,L,L) :- length(L,N桁),!. ヘッドゼロサプレス_1(N桁,L,[' '|R]) :- M桁 is N桁 - 1, ヘッドゼロサプレス_1(M桁,L,R). 要素に空白を挿入して全行表示([]) :- !. 要素に空白を挿入して全行表示([L|R]) :- concat_atom(L,' ',_表示行), write_formatted('%t\n',[_表示行]), 要素に空白を挿入して全行表示(R). すべての要素が([],_). すべての要素が([V|R],V) :- すべての要素が(R,V). '7個組'([],[]) :- !. '7個組'([A,B,C,D,E,F,G|R1]),[[A,B,C,D,E,F,G]|R2]) :- '7個組'(R1,R2). n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. not(P) :- \+(P). append([],L1,L2,L) :- append(L1,L2,L) . append([A|R1],L1,L2,[A|R]) :- append(R1,L1,L2,R) . concat_atom([],'') :- !. concat_atom([A],A) :- !. concat_atom([A|R],S) :- concat_atom(R,S1), atom_concat(A,S1,S). concat_atom([],_,'') :- !. concat_atom([A],_,A) :- !. concat_atom([A|R],_区切り文字列,S) :- concat_atom(R,_区切り文字列,S1), atom_concat(A,_区切り文字列,S2), atom_concat(S2,S1,S). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1245853701/922 # # [1] 授業単元:プログラミング入門 # [2] 問題文(含コード&リンク): # if文を使って、月数に応じてコメントを表示するプログラム(1月ならばwinter、 # 3月ならspringといった具合に)を作る。 # 月は1月\uff5e12月までなので、13月以上の数値を打ち込んだ場合はerrorと表示させること。 'if文を使って、月数に応じてコメントを表示するプログラム(1月ならばwinter、3月ならspringといった具合に)を作る。月は1月\uff5e12月までなので、13月以上の数値を打ち込んだ場合はerrorと表示させること。' :- 月数に応じてコメントを表示する. 月数に応じてコメントを表示する :- 整数を得る(何月ですか,between(1,12,_月),_月), 月情報表示(_月). 月情報表示(_月) :- 表示情報の取得(_月,_漢字月,_旧暦月名,_季節感コメント,_誕生石表示,_前にちょっとだけ,_後にちょっとだけ), 'コメント・雑感等の表示'(_漢字月,_旧暦月名,_季節感コメント,_誕生石表示,_前にちょっとだけ,_後にちょっとだけ). 月情報表示(N) :- write('error: 入力された数値は月を示すものではありません\n'). '漢字月・旧暦月名を得る'(_月,_漢字月,_旧暦月名) :- 月漢字表現(_月,L), atomic_list_concat(L,_漢字月), '新暦・旧暦'(_漢字月,_旧暦月名). 表示情報の取得(_月,_漢字月,_旧暦月名,_季節感コメント,_誕生石表示,_前にちょっとだけ,_後にちょっとだけ) :- '漢字月・旧暦月名を得る'(N,_漢字月,_旧暦月名), '新暦・旧暦季節感の相違'(_漢字月,_季節感コメント), 誕生石(_漢字月,_誕生石ならび), atomic_list_concat(_誕生石ならび,','_誕生石表示), 極めて個人的な雑感(_漢字月,_極めて個人的な雑感,_前にちょっとだけ,_後にちょっとだけ). 'コメント・雑感等の表示'(_漢字月,_旧暦月名,_季節感コメント,_誕生石表示,_前にちょっとだけ,_後にちょっとだけ) :- writef('%tの情報です。\n旧暦では%tといいました。\n%t\n誕生石は%tです。\n',[_漢字月,_旧暦月名,_季節感コメント,_誕生石表示]), _前にちょっとだけ, writef('%t\n',[_極めて個人的な雑感]), _後にちょっとだけ,!. '新暦・旧暦'(一月,睦月). '新暦・旧暦'(二月,如月). '新暦・旧暦'(三月,弥生). '新暦・旧暦'(四月,卯月). '新暦・旧暦'(五月,皐月). '新暦・旧暦'(六月,水無月). '新暦・旧暦'(七月,文月). '新暦・旧暦'(八月,葉月). '新暦・旧暦'(九月,長月). '新暦・旧暦'(十月,神無月). '新暦・旧暦'(十一月,霜月). '新暦・旧暦'(十二月,師走). '新暦・旧暦季節感の相違'(_月,_季節感コメント) :- '新暦・旧暦季節感'(_月,X,X), atomic_list_concat([X,です。'新暦・旧暦に季節感の相違はありません],_季節感コメント),!. '新暦・旧暦季節感の相違'(_月,_季節感コメント) :- '新暦・旧暦季節感'(_月,_'新暦季節感,_旧暦季節感), \+(_'新暦季節感==_旧暦季節感), atomic_list_concat(['新暦の季節感では,_'新暦季節感,てすが旧暦では,_旧暦季節感,とされました],_季節感コメント). '新暦・旧暦季節感'(一月,冬,春). '新暦・旧暦季節感'(二月,冬,春). '新暦・旧暦季節感'(三月,春,春). '新暦・旧暦季節感'(四月,春,夏). '新暦・旧暦季節感'(五月,春,夏). '新暦・旧暦季節感'(六月,夏,夏). '新暦・旧暦季節感'(七月,夏,秋). '新暦・旧暦季節感'(八月,夏,秋). '新暦・旧暦季節感'(九月,秋,秋). '新暦・旧暦季節感'(十月,秋,冬). '新暦・旧暦季節感'(十一月,秋,冬). '新暦・旧暦季節感'(十二月,冬,冬). 誕生石(一月,[ガーネット]). 誕生石(二月,[アメシスト]). 誕生石(三月,[アクアマリン,コーラル,ブラッドストーン]). 誕生石(四月,[ダイヤモンド,クォーツ]). 誕生石(五月,[エメラルド,ジェイド]). 誕生石(六月,[パール,ムーンストーン]). 誕生石(七月,[ルビー,カーネリアン]). 誕生石(八月,[ペリドット,サードニックス]). 誕生石(九月,[サファイア,アイオライト]). 誕生石(十月,[オパール,トルマリン]). 誕生石(十一月,[トパーズ,シトリン]). 誕生石(十二月,[ターコイズ,ラピスラズリ,ジルコニア,タンザナイト]). 月漢字表現(1,[一,月]). 月漢字表現(2,[二,月]). 月漢字表現(3,[三,月]). 月漢字表現(4,[四,月]). 月漢字表現(5,[五,月]). 月漢字表現(6,[六,月]). 月漢字表現(7,[七,月]). 月漢字表現(8,[八,月]). 月漢字表現(9,[九,月]). 月漢字表現(10,[十,月]). 月漢字表現(11,[十,一,月]). 月漢字表現(12,[十,二,月]). 極めて個人的な雑感(一月,'私の誕生月ですね。私が生まれた二時間後に法隆寺の金堂が焼失しました',true,true). 極めて個人的な雑感(二月,'閏年のルールを確認して置きましょう',true,listing(うるう年)). 極めて個人的な雑感(四月,残酷な月です,true,true). 極めて個人的な雑感(五月,'三年前の連休に笹が峰牧場に行きました。まだ1mも雪が残っていた',true,true). 極めて個人的な雑感(六月,私は爬虫類の生まれ変わりらしくこの月の前半のじめじめ感は大好き,true,true). 極めて個人的な雑感(九月,'伊勢湾台風の晩は東京の風も尋常ではなかった。浴風園から200m田圃を越してくる風で家が揺れて何度も何度も目を覚ましました',true,true). 極めて個人的な雑感(十月,消えわびぬうつろふ人の秋の色に身を木枯らしの森の下露とはこの頃の季節感なのだろうか,true,true). 極めて個人的な雑感(_,この月の雑感はちょっと保留,true,true). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4),fail. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1245853701/764 # # [1] 授業単元:プログラミング入門 # [2] 問題文(含コード&リンク): # 問3:1週間の売り上げ一覧を表示するプログラムを作成せよ。 #    実行例  野菜の1週間の売り上げた合計数量と合計金額 #                             合計  合計 #         種類 単価 月 火 水 木 金 土 日 数量  金額 #         レタス 150 50 55 60 65 70 75 80 455  68250 #         トマト  50 20 25 30 35 40 45 50 245  12250 #         もやし  20 10 15 20 25 30 35 40 175  3500 #         ナスビ  40 5  10 15 20 25 30 35 140  5600 週計表(_起点日付,_起点曜日,_終点日付,_終点曜日) :- 週計表見出し表示(_起点日付,_起点曜日,_終点日付,_終点曜日), 週計表商品表示順(_商品名), 週計表明細表示(_商品名,_起点日付,_起点曜日,_終点日付,_終点曜日), fail. 週計表(_,_,_,_). 週計表見出し表示(_起点日付,_起点曜日,_終点日付,_終点曜日) :- write('種類 単価'), 曜日見出し文字列(_起点日付,_起点曜日,_終点日付,_終点曜日,_曜日文字列), writef('%t 数量合計 金額合計\n',[_曜日文字列]). '数量・金額合計と平均単価を得る'(_商品名,_起点日付,_終点日付,_数量合計,_金額合計,_平均単価) :- 商品別数量合計(_商品名,_起点日付,_終点日付,_数量合計), \+(_数量合計 = 0), 商品別金額合計(_商品名,_起点日付,_終点日付,_金額合計), _平均単価 is truncate(round(_金額合計 / _数量合計)),!. 週計表明細表示(_商品名,_起点日付,_起点曜日,_終点日付,_終点曜日) :- '数量・金額合計と平均単価を得る'(_商品名,_起点日付,_終点日付,_数量合計,_金額合計,_平均単価), writef('%10s %4d ',[_商品名,_平均単価]), 曜日別数量表示(_商品名,_起点日付,_起点曜日,_終点日付,_終点曜日), writef('%6d %6d\n',[_数量合計,_金額合計]),!. 曜日別数量表示(_商品名,_日付,_曜日,_日付,_曜日) :- !. 曜日別数量表示(_商品名,_日付,_曜日,_終点日付,_終点曜日) :- 日計売上(_日付,_商品名,_数量), writef('%4d ',[_数量]), '前日・今日'(_日付,_曜日,_翌日,_翌日の曜日), 曜日別数量表示(_商品名,_翌日,_翌日の曜日,_終点日付,_終点曜日). 商品別数量合計(_起点日付,_終点日付,_数量合計) :- findsum(_数量,( 日計売上(_商品名,_日付,_数量), _日付 @>= _起点日付, _日付 @=< _終点日付)), _数量合計浮動小数点数), _数量合計 is truncate(_数量合計浮動小数点数). 商品別金額合計(_起点日付,_終点上限,_金額合計) :- findsum(_金額,( 日計売上(_商品名,_日付,_数量), _日付 @>= _起点日付, _日付 @=< _終点日付), 単価取得(_商品名,_日付,_単価), _金額 is _数量 * _単価)), _金額合計浮動小数点数), _金額合計 is truncate(_金額合計浮動小数点数). 単価取得(_商品名,_商品名,_日付,_単価) :- 単価(_商品名,_日付下限,_日付上限,_単価), _日付 @>= _日付下限, _日付 @=< _日付上限,!. 単価取得(_商品名,_商品名,_日付,_単価) :- 既定単価(_商品名,_単価). 曜日見出し文字列(_終点日付,_終点曜日,_終点日付,_終点曜日,_文字列) :- concat_atom([' ',_終点曜日,' '],_文字列),!. 曜日見出し文字列(_日付,_曜日,_終点日付,_終点曜日,_文字列) :- concat_atom([' ',_曜日,' '],文字列1), '前日・今日'(_日付,_曜日,_翌日,_翌日の曜日), 曜日見出し文字列(_翌日,_翌日の曜日,_終点日付,_終点曜日,_文字列2). concat_atom([_文字列1,_文字列2],_文字列). 日計売上(2009 / 6 / 29,もやし,10). 日計売上(2009 / 6 / 29,トマト,20). 日計売上(2009 / 6 / 29,ナスビ,5). 日計売上(2009 / 6 / 29,レタス,50). 日計売上(2009 / 6 / 30,もやし,15). 日計売上(2009 / 6 / 30,トマト,25). 日計売上(2009 / 6 / 30,ナスビ,10). 日計売上(2009 / 6 / 30,レタス,55). 日計売上(2009 / 6 / 30,ルッコラ,10). 日計売上(2009 / 7 / 1,もやし,20). 日計売上(2009 / 7 / 1,トマト,30). 日計売上(2009 / 7 / 1,ナスビ,15). 日計売上(2009 / 7 / 1,レタス,60). 日計売上(2009 / 7 / 2,もやし,25). 日計売上(2009 / 7 / 2,トマト,35). 日計売上(2009 / 7 / 2,ナスビ,20). 日計売上(2009 / 7 / 2,レタス,65). 日計売上(2009 / 7 / 2,ルッコラ,5). 日計売上(2009 / 7 / 3,もやし,30). 日計売上(2009 / 7 / 3,トマト,40). 日計売上(2009 / 7 / 3,ナスビ,25). 日計売上(2009 / 7 / 3,レタス,70). 日計売上(2009 / 7 / 4,もやし,35). 日計売上(2009 / 7 / 4,トマト,45). 日計売上(2009 / 7 / 4,ナスビ,30). 日計売上(2009 / 7 / 4,レタス,75). 日計売上(2009 / 7 / 5,もやし,40). 日計売上(2009 / 7 / 5,トマト,50). 日計売上(2009 / 7 / 5,ナスビ,35). 日計売上(2009 / 7 / 5,レタス,80). 週計表商品表示順(レタス). 週計表商品表示順(トマト). 週計表商品表示順(ルッコラ). 週計表商品表示順(ルバーブ). 週計表商品表示順(ナスビ). 週計表商品表示順(もやし). 単価(レタス,2009/6/1,2009/6/30,150). 単価(レタス,2009/7/1,2009/7/10,120). 単価(トマト,2009/6/1,2009/7/3,50). 単価(トマト,2009/7/4,2009/7/10,60). 単価(もやし,2009/6/1,2009/7/10,20). 単価(ナスビ,2009/6/1,2009/7/10,40). 単価(ルッコラ,2009/6/1,2009/7/3,80). 単価(ルッコラ,2009/7/4,2009/7/10,100). 単価(ルバーブ,2009/6/1,2009/7/10,120). 既定単価(レタス,150). 既定単価(トマト,50). 既定単価(もやし,20). 既定単価(ナスビ,40). 既定単価(ルッコラ,80). 既定単価(ルバーブ,120). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '前日・今日'(_前日の年 / 12 / 31,_前日の曜日,_年 / 1 / 1,_曜日) :- 一つ違い(_前日の年,_年), 曜日連鎖(_前日の曜日,_曜日),!. '前日・今日'(_年 / 2 / 29,_前日の曜日,_年 / 3 / 1,_曜日) :- うるう年(_年), 曜日連鎖(_前日の曜日,_曜日),!. '前日・今日'(_年 / 2 / 28,_前日の曜日,_年 / 3 / 1,_曜日) :- \+('うるう年'(_年)), 曜日連鎖(_前日の曜日,_曜日),!. '前日・今日'(_年 / _前月 / 30,_前日の曜日,_年 / _月 / 1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[4,6,9,11]), 曜日連鎖(_前日の曜日,_曜日),!. '前日・今日'(_年 / _前月 / 31,_前日の曜日,_年 / _月 / 1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[1,3,5,7,8,10,12]), 曜日連鎖(_前日の曜日,_曜日),!. '前日・今日'(_年 / _月 / _前日,_前日の曜日,_年 / _月 / _日,_曜日) :- 一つ違い(_前日,_日), 曜日連鎖(_前日の曜日,_曜日),!. '前日・今日'(_前日の年 / 12 / 31,_年 / 1 / 1) :- 一つ違い(_前日の年,_年),!. '前日・今日'(_年 / 2 / 29,_年 / 3 / 1) :- 'うるう年'(_年),!. '前日・今日'(_年 / 2 / 28,_年 / 3 / 1) :- \+('うるう年'(_年)),!. '前日・今日'(_年 / _前月 / 30,_年 / _月 / 1) :- 一つ違い(_前月,_月), member(_前月,[4,6,9,11]),!. '前日・今日'(_年 / _前月 / 31,_年 / _月 / 1) :- 一つ違い(_前月,_月), member(_前月,[1,3,5,7,8,10,12]),!. '前日・今日'(_年 / _月 / _前日,_年 / _月 / _日) :- 一つ違い(_前日,_日),!. 一つ違い(M,N) :- integer(M), !, N is M + 1 . 一つ違い(M,N) :- integer(N), !, M is N - 1 . 曜日連鎖(月曜,火曜). 曜日連鎖(火曜,水曜). 曜日連鎖(水曜,木曜). 曜日連鎖(木曜,金曜). 曜日連鎖(金曜,土曜). 曜日連鎖(土曜,日曜). 曜日連鎖(日曜,月曜). うるう年(_年文字列) :- atom(_年文字列), atom_to_term(_年文字列,_年整数,_), !, うるう年(_年整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100, !, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは % *** user: 何日後 / 5 *** 何日後(0,_日,_曜日,_日,_曜日) :- !. 何日後(N,_今日,_今日の曜日,_N日後,_N日後の曜日) :- 前日・今日(_今日,_今日の曜日,_翌日,_翌日の曜日), N1 is N - 1, 何日後(N1,_翌日,_翌日の曜日,_N日後,_N日後の曜日). % *** user: 何日後 / 3 *** 何日後(0,_日,_日) :- !. 何日後(N,_今日,_N日後) :- 前日・今日(_今日,_翌日), N1 is N - 1, 何日後(N1,_翌日,_N日後). % *** user: 何日後 / 3 *** 非決定性 *** % 何日後(N,_基準日,X) :- % 何日後(0,N,_基準日,X). % % *** user: 何日後 / 4 *** 非決定性 *** % 何日後(N,N,_年/_月/_日,_年/_月/_日). % 何日後(M,N,_年_1/_月_1/_日_1,_年/_月/_日) :- % M2 is M + 1, % 後日・今日(_年_1/_月_1/_日_1,_年_2/_月_2/_日_2), % 何日後(M2,N,_年_2/_月_2/_日_2,_年/_月/_日). % *** user: 何日前 / 5 *** 何日前(0,_日,_曜日,_日,_曜日) :- !. 何日前(N,_今日,_今日の曜日,_N日前,_N日前の曜日) :- 前日・今日(_前日,_今日), N1 is N - 1, 何日前(N1,_前日,_前日の曜日,_N日前,_N日前の曜日). % *** user: 何日前 / 3 *** 何日前(0,_日,_日) :- !. 何日前(N,_今日,_N日前) :- 前日・今日(_前日,_今日), N1 is N - 1, 何日前(N1,_前日,_N日前). % *** user: 何日前 / 3 *** 非決定性 *** % 何日前(N,_基準日,X) :- % 何日前(0,N,_基準日,X). % % *** user: 何日前 / 4 *** 非決定性 *** % 何日前(N,N,_年/_月/_日,_年/_月/_日). % 何日前(M,N,_年_1/_月_1/_日_1,_年/_月/_日) :- % M2 is M + 1, % 前日・今日(_年_2/_月_2/_日_2,_年_1/_月_1/_日_1), % 何日前(M2,N,_年_2/_月_2/_日_2,_年/_月/_日). % *** user: 前日・今日 / 4 *** 前日・今日(_前日の年 / 12 / 31,_前日の曜日,_年 / 1 / 1,_曜日) :- 一つ違い(_前日の年,_年), 曜日連鎖(_前日の曜日,_曜日), !. 前日・今日(_年 / 2 / 29,_前日の曜日,_年 / 3 / 1,_曜日) :- うるう年(_年), 曜日連鎖(_前日の曜日,_曜日), !. 前日・今日(_年 / 2 / 28,_前日の曜日,_年 / 3 / 1,_曜日) :- \+(うるう年(_年)), 曜日連鎖(_前日の曜日,_曜日), !. 前日・今日(_年 / _前月 / 30,_前日の曜日,_年 / _月 / 1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[4,6,9,11]), 曜日連鎖(_前日の曜日,_曜日), !. 前日・今日(_年 / _前月 / 31,_前日の曜日,_年 / _月 / 1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[1,3,5,7,8,10,12]), 曜日連鎖(_前日の曜日,_曜日), !. 前日・今日(_年 / _月 / _前日,_前日の曜日,_年 / _月 / _日,_曜日) :- 一つ違い(_前日,_日), 曜日連鎖(_前日の曜日,_曜日), !. % *** user: 前日・今日 / 2 *** 前日・今日(_前日の年 / 12 / 31,_年 / 1 / 1) :- 一つ違い(_前日の年,_年), !. 前日・今日(_年 / 2 / 29,_年 / 3 / 1) :- うるう年(_年), !. 前日・今日(_年 / 2 / 28,_年 / 3 / 1) :- \+(うるう年(_年)), !. 前日・今日(_年 / _前月 / 30,_年 / _月 / 1) :- 一つ違い(_前月,_月), member(_前月,[4,6,9,11]), !. 前日・今日(_年 / _前月 / 31,_年 / _月 / 1) :- 一つ違い(_前月,_月), member(_前月,[1,3,5,7,8,10,12]), !. 前日・今日(_年 / _月 / _前日,_年 / _月 / _日) :- 一つ違い(_前日,_日), !. % *** user: 曜日連鎖 / 2 *** 曜日連鎖(月曜,火曜). 曜日連鎖(火曜,水曜). 曜日連鎖(水曜,木曜). 曜日連鎖(木曜,金曜). 曜日連鎖(金曜,土曜). 曜日連鎖(土曜,日曜). 曜日連鎖(日曜,月曜). % *** user: うるう年 / 1 *** うるう年(_年) :- 0 is _年 mod 400, !. うるう年(_年) :- 0 is _年 mod 100, !, fail. うるう年(_年) :- 0 is _年 mod 4, !. うるう年(_年) :- \+(0 is _年 mod 4), fail. % *** user: 一つ違い / 2 *** 一つ違い(M,N) :- integer(M), !, N is M + 1. 一つ違い(M,N) :- integer(N), !, M is N - 1. % *** user: 今日 / 1 *** 今日(YY/MM/DD,_曜日) :- A is time, localtime(A,YY,MM,DD,WD,_,_,_,_), 曜日を表す値(WD,_曜日). 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1245853701/275 # # [1] 授業単元:C言語の基礎 # [2] 問題文:年(西暦)、月、日を入力し、入力した、日時の曜日及び、経過した # 日数を表示したプログラムを作成せよ。 :- op(450,xf,日後). t321(_日付,_曜日,N 日後) :- 基準日(_基準日,_基準曜日), 曜日(_基準日,_基準曜日,_日付,_曜日,N). 基準日(2009/07/01,水曜). 曜日(_日付1,_曜日1,_日付2,_曜日2,N) :- 曜日(_日付1,_曜日1,_日付2,_曜日2,0,N). 曜日(_日付,_曜日,_日付,_曜日,N,N) :- ! . 曜日(_日付1,_曜日1,_日付2,_曜日2,N1,N) :- _日付1 @> _日付2, N2 is N - 1, 前日・今日(_日付3,_曜日3,_日付1,_曜日1), 曜日(_日付3,_曜日3,_日付2,_曜日2,N2,N) . 曜日(_日付1,_曜日1,_日付2,_曜日2,N1,N) :- _日付1 @< _日付2, N2 is N + 1, 前日・今日(_日付1,_曜日1,_日付3,_曜日3), 曜日(_日付3,_曜日3,_日付2,_曜日2,N2,N) . 前日・今日(_前日の年/12/31,_前日の曜日,_年/1/1,_曜日) :- 一つ違い(_前日の年,_年), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/2/29,_前日の曜日,_年/3/1,_曜日) :- うるう年(_年), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/2/28,_前日の曜日,_年/3/1,_曜日) :- not(うるう年(_年)), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_前月/30,_前日の曜日,_年/_月/1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[4,6,9,11]), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_前月/31,_前日の曜日,_年/_月/1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[1,3,5,7,8,10,12]), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_月/_前日,_前日の曜日,_年/_月/_日,_曜日) :- 一つ違い(_前日,_日), 曜日連鎖(_前日の曜日,_曜日),!. 一つ違い(M,N) :- integer(M),!, N is M + 1. 一つ違い(M,N) :- integer(N),!, M is N - 1. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- not(0 is _年 mod 4),fail. 曜日連鎖(月曜,火曜). 曜日連鎖(火曜,水曜). 曜日連鎖(水曜,木曜). 曜日連鎖(木曜,金曜). 曜日連鎖(金曜,土曜). 曜日連鎖(土曜,日曜). 曜日連鎖(日曜,月曜). % 以下のサイトは % [1] 授業単元:C言語演習課題 % http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9422.txt % 問題 % 年と月を「YYYY/MM」と入力し、入力された月のカレンダーを表示しなさい。 % % 1752年10月以前、及び10000年1月以降はエラーを返す。 % % 出力形式は以下のとおり % ・1行目は該当月の1日が月曜日でなければ、前月の最終月曜日から表示。 % ・該当月の最終日が日曜日でなければ、翌月の第1日曜日まで表示。 % ・6行目の表示が必要ない場合は表示しない。 % % うるう年判定は以下のとおり % ・年が4で割り切れる年はうるう年。 % ・年が100で割り切れる年はうるう年でない。 % ・年が400で割り切れる年はうるう年である。 % % [出力例] % 年月日を入力:2009/07 % % 月 火 水 木 金 土 日 % 29 30 01 02 03 04 05 % 06 07 08 09 10 11 12 % 13 14 15 16 17 18 19 % 20 21 22 23 24 25 26 % 27 28 29 30 31 01 02 課題のカレンダー(_年/_月) :- not((_年/_月 >= 1752/10,_年/_月 =< 10000/1)), write('エラー: 入力された年月は範囲を逸脱しています\n'),!. 課題のカレンダー(_年/_月) :- _年/_月 @=< 2009/6,!, 曜日検索(_日付,_曜日,2009/6/13,土曜), _日付=_年/_月/1, 課題のカレンダー表示(_日付,_曜日). 課題のカレンダー(_年/_月) :- _年/_月 @>= 2009/6,!, 曜日検索(2009/6/13,土曜,_日付,_曜日), _日付=_年/_月/1, 課題のカレンダー表示(_日付,_曜日). 課題のカレンダー表示(_年/_月/_日,月曜) :- 日付候補を得る(_年/_月/_日,_年/_月/_日,月曜,_日付整数ならび), 課題のカレンダー見出し表示, 課題のカレンダー週表示(_日付整数ならび). 課題のカレンダー表示(_年/_月/_日,_曜日) :- not(_曜日=月曜), 前週の月曜日(_年/_月/_日,_曜日,_前週の月曜日), 日付候補を得る(_年/_月/_日,_前週の月曜日,月曜,_日付整数ならび), 課題のカレンダー見出し表示, 課題のカレンダー週表示(_日付整数ならび). 前週の月曜日(_年/_月/_日,_曜日,_前週の月曜日) :- 曜日検索(_前週の月曜日,_前週の曜日,_年/_月/_日,_曜日), _前週の曜日 = 月曜,!. 日付候補を得る(_年/_月/_日,_起点日付,_曜日,_日付整数ならび) :- findall(_日付,( 曜日(_起点日付,_曜日,_日付2,_),(_日付2=_年2/_月2/7,_年2/_月2 @> _年/_月,!,fail;true)),_日付整数ならび). 課題のカレンダー週表示(_日付整数ならび) :- n個組(7,_日付整数ならび,_7個組), 月曜から日曜までヘッドゼロサプライで表示(_7個組). 月曜から日曜までヘッドゼロサプライで表示([_年/_月/_日]) :- ヘッドゼロサプライ(2,_日,_日付文字列), write_formatted('%t\n',[_日文字列]),!. 月曜から日曜までヘッドゼロサプライで表示([_年/_月/_日|R]) :- ヘッドゼロサプライ(2,_日,_日付文字列), write_formatted('%t ',[_日付文字列]), 月曜から日曜までヘッドゼロサプライで表示(R). 課題のカレンダー見出し表示 :- write_formatted('月 火 水 木 金 土 日\n'). 曜日検索(_日付,_曜日,_今日,_今日の曜日) :- var(_日付), var(_曜日), 前日・今日(_日付,_曜日,_今日,_今日の曜日). 曜日検索(_日付,_曜日,_今日,_今日の曜日) :- var(_日付), var(_曜日), 前日・今日(_前日,_前日の曜日,_今日,_今日の曜日), 曜日検索(_日付,_曜日,_前日,_前日の曜日). 曜日検索(_今日,_今日の曜日,_日付,_曜日) :- var(_日付), var(_曜日), 前日・今日(_今日,_今日の曜日,_日付,_曜日). 曜日検索(_今日,_今日の曜日,_日付,_曜日) :- var(_日付), var(_曜日), 前日・今日(_今日,_今日の曜日,_翌日,_翌日の曜日), 曜日検索(_翌日,_翌日の曜日,_日付,_曜日). '曜日'(_日付,_曜日,_日付,_曜日) :- ! . '曜日'(_日付1,_曜日1,_日付2,_曜日2) :- _日付1 @> _日付2, '前日・今日'(_日付3,_曜日3,_日付1,_曜日1), '曜日'(_日付3,_曜日3,_日付2,_曜日2) . '曜日'(_日付1,_曜日1,_日付2,_曜日2) :- _日付1 @< _日付2, '前日・今日'(_日付1,_曜日1,_日付3,_曜日3), '曜日'(_日付3,_曜日3,_日付2,_曜日2) . 前日・今日(_前日の年/12/31,_前日の曜日,_年/1/1,_曜日) :- 一つ違い(_前日の年,_年), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/2/29,_前日の曜日,_年/3/1,_曜日) :- うるう年(_年), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/2/28,_前日の曜日,_年/3/1,_曜日) :- not(うるう年(_年)), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_前月/30,_前日の曜日,_年/_月/1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[4,6,9,11]), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_前月/31,_前日の曜日,_年/_月/1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[1,3,5,7,8,10,12]), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_月/_前日,_前日の曜日,_年/_月/_日,_曜日) :- 一つ違い(_前日,_日), 曜日連鎖(_前日の曜日,_曜日),!. 一つ違い(M,N) :- integer(M),!, N is M + 1. 一つ違い(M,N) :- integer(N),!, M is N - 1. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- not(0 is _年 mod 4),fail. 曜日連鎖(月曜,火曜). 曜日連鎖(火曜,水曜). 曜日連鎖(水曜,木曜). 曜日連鎖(木曜,金曜). 曜日連鎖(金曜,土曜). 曜日連鎖(土曜,日曜). 曜日連鎖(日曜,月曜). n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. ヘッドゼロサプライ(N桁,_整数,_ヘッドゼロ整数文字列) :- number_chars(_整数,_数字ならび), ヘッドゼロサプライ_1(N桁,_数字ならび,_ヘッドゼロ整数文字ならび), concat_atom(_ヘッドゼロ整数文字ならび,_ヘッドゼロ整数文字列),!. ヘッドゼロサプライ_1(N桁,L,L) :- length(L,N桁),!. ヘッドゼロサプライ_1(N桁,L,['0'|R]) :- M桁 is N桁 - 1, ヘッドゼロサプライ_1(M桁,L,R).