このディレクトリの索引

% 以下のサイトは % % カレンダーの形式(何曜日から始まるか)と % 月日数と1日の曜日が分かっている時 % カレンダーをならびに得る。 % 第一週と最終週を変数で補正した曜日起点月カレンダー補正(_起点曜日形式,_月日数,_1日の曜日,_カレンダー) :- 曜日起点月カレンダー(_起点曜日形式,_月日数,_1日の曜日,_カレンダー_1), 第一週と最終週を変数で補正した(_カレンダー_1,_カレンダー). 曜日起点月カレンダー(_起点曜日形式,_月日数,_1日の曜日,_カレンダー) :- findall(N,between(1,_月日数,N),_日ならび), 起点曜日番号を得る(_起点曜日形式,_月日数,_1日の曜日,_起点曜日番号), 曜日番号からカレンダーを作成する(_起点曜日番号,_日ならび,_カレンダー). 起点曜日番号を得る(_起点曜日形式,_月日数,_1日の曜日,_起点曜日番号) :- 曜日番号(_曜日番号_1,_起点曜日形式), 曜日番号(_曜日番号,_1日の曜日), _起点曜日番号 is (7 - (_曜日番号 - _曜日番号_1)) mod 7. 曜日番号からカレンダーを作成する(0,_日ならび,_カレンダー) :- 'N個組'(7,_日ならび,_カレンダー),!. 曜日番号からカレンダーを作成する(_曜日番号,_日ならび,_カレンダー) :- 先頭に変数日を付加して曜日番号からカレンダーを作成する(_曜日番号,_日ならび,_カレンダー). 先頭に変数日を付加して曜日番号からカレンダーを作成する(_曜日番号,_日ならび,[L0|LL]) :- length(L0,_曜日番号), append(L0,L1,_日ならび), 'N個組'(7,L1,LL). 曜日番号(0,日曜) :- !. 曜日番号(1,月曜) :- !. 曜日番号(2,火曜) :- !. 曜日番号(3,水曜) :- !. 曜日番号(4,木曜) :- !. 曜日番号(5,金曜) :- !. 曜日番号(6,土曜) :- !. 'N個組'(_,[],[]) :- !. 'N個組'(N,L,[U|R]) :- 先頭からN個(N,L,U,R1), 'N個組'(N,R1,R). 先頭からN個(N,L1,L2,R) :- 'L1の要素数はN個以上'(N,L1,L2,R),!. 先頭からN個(_,L,L,[]). 'L1の要素数はN個以上'(N,L1,L2,R) :- length(L2,N), append(L2,R,L1). 第一週と最終週を変数で補正した([L|LL1],[[_1,_2,_3,_4,_5,_6,_7]|LL2]) :- 第一週を変数で補正(L,[_1,_2,_3,_4,_5,_6,_7]), 最終週を変数で補正(LL1,LL2). 第一週を変数で補正(L,[_1,_2,_3,_4,_5,_6,_7]) :- append(_,L,[_1,_2,_3,_4,_5,_6,_7]). 最終週を変数で補正(LL1,LL2) :- append(LL1_1,[L_2],LL1), append(L_2,_,[_11,_12,_13,_14,_15,_16,_17]), append(LL1_1,[[_11,_12,_13,_14,_15,_16,_17]],LL2). 変数だけ値を詰める([],_). 変数だけ値を詰める([A|R],V) :- 変数だけ値を詰める(A,R,V). 変数だけ値を詰める(A,R,V) :- '_1が変数の場合は_2になる'(A,V), 変数だけ値を詰める(R,V). '_1が変数の場合は_2になる'(V,V) :- !. '_1が変数の場合は_2になる'(_,_). % 以下のサイトは # 出典:: 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(_日文字列,_整数日). % 以下のサイトは # 出題場所 :: 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,土曜). % 以下のサイトは 日曜起点カレンダー(_一日の曜日,_末日整数,_カレンダー) :- 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,[_最終週]) :- 一週間は七日だ(_最終週), append(L1,_,_最終週). 一週間は七日だ([_,_,_,_,_,_,_]). % 以下のサイトは 日曜起点カレンダー(_年,_月) :- 一日の曜日(_年,_月,_一日の曜日), 月末日の曜日(_年,_月,_月末日,_), 日曜起点カレンダー(_一日の曜日,_月末日,_カレンダー), カレンダー表示(_カレンダー). 日曜起点カレンダー(_一日の曜日,_月末日,_カレンダー) :- 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). カレンダー表示([]). カレンダー表示([_週|R]) :- カレンダー週表示(_週), カレンダー表示(R). カレンダー週表示([]) :- write('\n'). カレンダー週表示([A|R]) :- 表示項(A,_表示項), writef('%3R',[_表示項]), カレンダー週表示(R). 表示項(' ',' ') :- !. 表示項(N,N). 一日の曜日(1970,1,木曜). 一日の曜日(1970,2,日曜). 一日の曜日(1970,3,日曜). 一日の曜日(1970,4,水曜). 一日の曜日(1970,5,金曜). 一日の曜日(1970,6,月曜). 一日の曜日(1970,7,水曜). 一日の曜日(1970,8,土曜). 一日の曜日(1970,9,火曜). 一日の曜日(1970,10,木曜). 一日の曜日(1970,11,日曜). 一日の曜日(1970,12,火曜). 一日の曜日(1971,1,金曜). 一日の曜日(1971,2,月曜). 一日の曜日(1971,3,月曜). 一日の曜日(1971,4,木曜). 一日の曜日(1971,5,土曜). 一日の曜日(1971,6,火曜). 一日の曜日(1971,7,木曜). 一日の曜日(1971,8,日曜). 一日の曜日(1971,9,水曜). 一日の曜日(1971,10,金曜). 一日の曜日(1971,11,月曜). 一日の曜日(1971,12,水曜). 一日の曜日(1972,1,土曜). 一日の曜日(1972,2,火曜). 一日の曜日(1972,3,水曜). 一日の曜日(1972,4,土曜). 一日の曜日(1972,5,月曜). 一日の曜日(1972,6,木曜). 一日の曜日(1972,7,土曜). 一日の曜日(1972,8,火曜). 一日の曜日(1972,9,金曜). 一日の曜日(1972,10,日曜). 一日の曜日(1972,11,水曜). 一日の曜日(1972,12,金曜). 一日の曜日(1973,1,月曜). 一日の曜日(1973,2,木曜). 一日の曜日(1973,3,木曜). 一日の曜日(1973,4,日曜). 一日の曜日(1973,5,火曜). 一日の曜日(1973,6,金曜). 一日の曜日(1973,7,日曜). 一日の曜日(1973,8,水曜). 一日の曜日(1973,9,土曜). 一日の曜日(1973,10,月曜). 一日の曜日(1973,11,木曜). 一日の曜日(1973,12,土曜). 一日の曜日(1974,1,火曜). 一日の曜日(1974,2,金曜). 一日の曜日(1974,3,金曜). 一日の曜日(1974,4,月曜). 一日の曜日(1974,5,水曜). 一日の曜日(1974,6,土曜). 一日の曜日(1974,7,月曜). 一日の曜日(1974,8,木曜). 一日の曜日(1974,9,日曜). 一日の曜日(1974,10,火曜). 一日の曜日(1974,11,金曜). 一日の曜日(1974,12,日曜). 一日の曜日(1975,1,水曜). 一日の曜日(1975,2,土曜). 一日の曜日(1975,3,土曜). 一日の曜日(1975,4,火曜). 一日の曜日(1975,5,木曜). 一日の曜日(1975,6,日曜). 一日の曜日(1975,7,火曜). 一日の曜日(1975,8,金曜). 一日の曜日(1975,9,月曜). 一日の曜日(1975,10,水曜). 一日の曜日(1975,11,土曜). 一日の曜日(1975,12,月曜). 一日の曜日(1976,1,木曜). 一日の曜日(1976,2,日曜). 一日の曜日(1976,3,月曜). 一日の曜日(1976,4,木曜). 一日の曜日(1976,5,土曜). 一日の曜日(1976,6,火曜). 一日の曜日(1976,7,木曜). 一日の曜日(1976,8,日曜). 一日の曜日(1976,9,水曜). 一日の曜日(1976,10,金曜). 一日の曜日(1976,11,月曜). 一日の曜日(1976,12,水曜). 一日の曜日(1977,1,土曜). 一日の曜日(1977,2,火曜). 一日の曜日(1977,3,火曜). 一日の曜日(1977,4,金曜). 一日の曜日(1977,5,日曜). 一日の曜日(1977,6,水曜). 一日の曜日(1977,7,金曜). 一日の曜日(1977,8,月曜). 一日の曜日(1977,9,木曜). 一日の曜日(1977,10,土曜). 一日の曜日(1977,11,火曜). 一日の曜日(1977,12,木曜). 一日の曜日(1978,1,日曜). 一日の曜日(1978,2,水曜). 一日の曜日(1978,3,水曜). 一日の曜日(1978,4,土曜). 一日の曜日(1978,5,月曜). 一日の曜日(1978,6,木曜). 一日の曜日(1978,7,土曜). 一日の曜日(1978,8,火曜). 一日の曜日(1978,9,金曜). 一日の曜日(1978,10,日曜). 一日の曜日(1978,11,水曜). 一日の曜日(1978,12,金曜). 一日の曜日(1979,1,月曜). 一日の曜日(1979,2,木曜). 一日の曜日(1979,3,木曜). 一日の曜日(1979,4,日曜). 一日の曜日(1979,5,火曜). 一日の曜日(1979,6,金曜). 一日の曜日(1979,7,日曜). 一日の曜日(1979,8,水曜). 一日の曜日(1979,9,土曜). 一日の曜日(1979,10,月曜). 一日の曜日(1979,11,木曜). 一日の曜日(1979,12,土曜). 一日の曜日(1980,1,火曜). 一日の曜日(1980,2,金曜). 一日の曜日(1980,3,土曜). 一日の曜日(1980,4,火曜). 一日の曜日(1980,5,木曜). 一日の曜日(1980,6,日曜). 一日の曜日(1980,7,火曜). 一日の曜日(1980,8,金曜). 一日の曜日(1980,9,月曜). 一日の曜日(1980,10,水曜). 一日の曜日(1980,11,土曜). 一日の曜日(1980,12,月曜). 一日の曜日(1981,1,木曜). 一日の曜日(1981,2,日曜). 一日の曜日(1981,3,日曜). 一日の曜日(1981,4,水曜). 一日の曜日(1981,5,金曜). 一日の曜日(1981,6,月曜). 一日の曜日(1981,7,水曜). 一日の曜日(1981,8,土曜). 一日の曜日(1981,9,火曜). 一日の曜日(1981,10,木曜). 一日の曜日(1981,11,日曜). 一日の曜日(1981,12,火曜). 一日の曜日(1982,1,金曜). 一日の曜日(1982,2,月曜). 一日の曜日(1982,3,月曜). 一日の曜日(1982,4,木曜). 一日の曜日(1982,5,土曜). 一日の曜日(1982,6,火曜). 一日の曜日(1982,7,木曜). 一日の曜日(1982,8,日曜). 一日の曜日(1982,9,水曜). 一日の曜日(1982,10,金曜). 一日の曜日(1982,11,月曜). 一日の曜日(1982,12,水曜). 一日の曜日(1983,1,土曜). 一日の曜日(1983,2,火曜). 一日の曜日(1983,3,火曜). 一日の曜日(1983,4,金曜). 一日の曜日(1983,5,日曜). 一日の曜日(1983,6,水曜). 一日の曜日(1983,7,金曜). 一日の曜日(1983,8,月曜). 一日の曜日(1983,9,木曜). 一日の曜日(1983,10,土曜). 一日の曜日(1983,11,火曜). 一日の曜日(1983,12,木曜). 一日の曜日(1984,1,日曜). 一日の曜日(1984,2,水曜). 一日の曜日(1984,3,木曜). 一日の曜日(1984,4,日曜). 一日の曜日(1984,5,火曜). 一日の曜日(1984,6,金曜). 一日の曜日(1984,7,日曜). 一日の曜日(1984,8,水曜). 一日の曜日(1984,9,土曜). 一日の曜日(1984,10,月曜). 一日の曜日(1984,11,木曜). 一日の曜日(1984,12,土曜). 一日の曜日(1985,1,火曜). 一日の曜日(1985,2,金曜). 一日の曜日(1985,3,金曜). 一日の曜日(1985,4,月曜). 一日の曜日(1985,5,水曜). 一日の曜日(1985,6,土曜). 一日の曜日(1985,7,月曜). 一日の曜日(1985,8,木曜). 一日の曜日(1985,9,日曜). 一日の曜日(1985,10,火曜). 一日の曜日(1985,11,金曜). 一日の曜日(1985,12,日曜). 一日の曜日(1986,1,水曜). 一日の曜日(1986,2,土曜). 一日の曜日(1986,3,土曜). 一日の曜日(1986,4,火曜). 一日の曜日(1986,5,木曜). 一日の曜日(1986,6,日曜). 一日の曜日(1986,7,火曜). 一日の曜日(1986,8,金曜). 一日の曜日(1986,9,月曜). 一日の曜日(1986,10,水曜). 一日の曜日(1986,11,土曜). 一日の曜日(1986,12,月曜). 一日の曜日(1987,1,木曜). 一日の曜日(1987,2,日曜). 一日の曜日(1987,3,日曜). 一日の曜日(1987,4,水曜). 一日の曜日(1987,5,金曜). 一日の曜日(1987,6,月曜). 一日の曜日(1987,7,水曜). 一日の曜日(1987,8,土曜). 一日の曜日(1987,9,火曜). 一日の曜日(1987,10,木曜). 一日の曜日(1987,11,日曜). 一日の曜日(1987,12,火曜). 一日の曜日(1988,1,金曜). 一日の曜日(1988,2,月曜). 一日の曜日(1988,3,火曜). 一日の曜日(1988,4,金曜). 一日の曜日(1988,5,日曜). 一日の曜日(1988,6,水曜). 一日の曜日(1988,7,金曜). 一日の曜日(1988,8,月曜). 一日の曜日(1988,9,木曜). 一日の曜日(1988,10,土曜). 一日の曜日(1988,11,火曜). 一日の曜日(1988,12,木曜). 一日の曜日(1989,1,日曜). 一日の曜日(1989,2,水曜). 一日の曜日(1989,3,水曜). 一日の曜日(1989,4,土曜). 一日の曜日(1989,5,月曜). 一日の曜日(1989,6,木曜). 一日の曜日(1989,7,土曜). 一日の曜日(1989,8,火曜). 一日の曜日(1989,9,金曜). 一日の曜日(1989,10,日曜). 一日の曜日(1989,11,水曜). 一日の曜日(1989,12,金曜). 一日の曜日(1990,1,月曜). 一日の曜日(1990,2,木曜). 一日の曜日(1990,3,木曜). 一日の曜日(1990,4,日曜). 一日の曜日(1990,5,火曜). 一日の曜日(1990,6,金曜). 一日の曜日(1990,7,日曜). 一日の曜日(1990,8,水曜). 一日の曜日(1990,9,土曜). 一日の曜日(1990,10,月曜). 一日の曜日(1990,11,木曜). 一日の曜日(1990,12,土曜). 一日の曜日(1991,1,火曜). 一日の曜日(1991,2,金曜). 一日の曜日(1991,3,金曜). 一日の曜日(1991,4,月曜). 一日の曜日(1991,5,水曜). 一日の曜日(1991,6,土曜). 一日の曜日(1991,7,月曜). 一日の曜日(1991,8,木曜). 一日の曜日(1991,9,日曜). 一日の曜日(1991,10,火曜). 一日の曜日(1991,11,金曜). 一日の曜日(1991,12,日曜). 一日の曜日(1992,1,水曜). 一日の曜日(1992,2,土曜). 一日の曜日(1992,3,日曜). 一日の曜日(1992,4,水曜). 一日の曜日(1992,5,金曜). 一日の曜日(1992,6,月曜). 一日の曜日(1992,7,水曜). 一日の曜日(1992,8,土曜). 一日の曜日(1992,9,火曜). 一日の曜日(1992,10,木曜). 一日の曜日(1992,11,日曜). 一日の曜日(1992,12,火曜). 一日の曜日(1993,1,金曜). 一日の曜日(1993,2,月曜). 一日の曜日(1993,3,月曜). 一日の曜日(1993,4,木曜). 一日の曜日(1993,5,土曜). 一日の曜日(1993,6,火曜). 一日の曜日(1993,7,木曜). 一日の曜日(1993,8,日曜). 一日の曜日(1993,9,水曜). 一日の曜日(1993,10,金曜). 一日の曜日(1993,11,月曜). 一日の曜日(1993,12,水曜). 一日の曜日(1994,1,土曜). 一日の曜日(1994,2,火曜). 一日の曜日(1994,3,火曜). 一日の曜日(1994,4,金曜). 一日の曜日(1994,5,日曜). 一日の曜日(1994,6,水曜). 一日の曜日(1994,7,金曜). 一日の曜日(1994,8,月曜). 一日の曜日(1994,9,木曜). 一日の曜日(1994,10,土曜). 一日の曜日(1994,11,火曜). 一日の曜日(1994,12,木曜). 一日の曜日(1995,1,日曜). 一日の曜日(1995,2,水曜). 一日の曜日(1995,3,水曜). 一日の曜日(1995,4,土曜). 一日の曜日(1995,5,月曜). 一日の曜日(1995,6,木曜). 一日の曜日(1995,7,土曜). 一日の曜日(1995,8,火曜). 一日の曜日(1995,9,金曜). 一日の曜日(1995,10,日曜). 一日の曜日(1995,11,水曜). 一日の曜日(1995,12,金曜). 一日の曜日(1996,1,月曜). 一日の曜日(1996,2,木曜). 一日の曜日(1996,3,金曜). 一日の曜日(1996,4,月曜). 一日の曜日(1996,5,水曜). 一日の曜日(1996,6,土曜). 一日の曜日(1996,7,月曜). 一日の曜日(1996,8,木曜). 一日の曜日(1996,9,日曜). 一日の曜日(1996,10,火曜). 一日の曜日(1996,11,金曜). 一日の曜日(1996,12,日曜). 一日の曜日(1997,1,水曜). 一日の曜日(1997,2,土曜). 一日の曜日(1997,3,土曜). 一日の曜日(1997,4,火曜). 一日の曜日(1997,5,木曜). 一日の曜日(1997,6,日曜). 一日の曜日(1997,7,火曜). 一日の曜日(1997,8,金曜). 一日の曜日(1997,9,月曜). 一日の曜日(1997,10,水曜). 一日の曜日(1997,11,土曜). 一日の曜日(1997,12,月曜). 一日の曜日(1998,1,木曜). 一日の曜日(1998,2,日曜). 一日の曜日(1998,3,日曜). 一日の曜日(1998,4,水曜). 一日の曜日(1998,5,金曜). 一日の曜日(1998,6,月曜). 一日の曜日(1998,7,水曜). 一日の曜日(1998,8,土曜). 一日の曜日(1998,9,火曜). 一日の曜日(1998,10,木曜). 一日の曜日(1998,11,日曜). 一日の曜日(1998,12,火曜). 一日の曜日(1999,1,金曜). 一日の曜日(1999,2,月曜). 一日の曜日(1999,3,月曜). 一日の曜日(1999,4,木曜). 一日の曜日(1999,5,土曜). 一日の曜日(1999,6,火曜). 一日の曜日(1999,7,木曜). 一日の曜日(1999,8,日曜). 一日の曜日(1999,9,水曜). 一日の曜日(1999,10,金曜). 一日の曜日(1999,11,月曜). 一日の曜日(1999,12,水曜). 一日の曜日(2000,1,土曜). 一日の曜日(2000,2,火曜). 一日の曜日(2000,3,水曜). 一日の曜日(2000,4,土曜). 一日の曜日(2000,5,月曜). 一日の曜日(2000,6,木曜). 一日の曜日(2000,7,土曜). 一日の曜日(2000,8,火曜). 一日の曜日(2000,9,金曜). 一日の曜日(2000,10,日曜). 一日の曜日(2000,11,水曜). 一日の曜日(2000,12,金曜). 一日の曜日(2001,1,月曜). 一日の曜日(2001,2,木曜). 一日の曜日(2001,3,木曜). 一日の曜日(2001,4,日曜). 一日の曜日(2001,5,火曜). 一日の曜日(2001,6,金曜). 一日の曜日(2001,7,日曜). 一日の曜日(2001,8,水曜). 一日の曜日(2001,9,土曜). 一日の曜日(2001,10,月曜). 一日の曜日(2001,11,木曜). 一日の曜日(2001,12,土曜). 一日の曜日(2002,1,火曜). 一日の曜日(2002,2,金曜). 一日の曜日(2002,3,金曜). 一日の曜日(2002,4,月曜). 一日の曜日(2002,5,水曜). 一日の曜日(2002,6,土曜). 一日の曜日(2002,7,月曜). 一日の曜日(2002,8,木曜). 一日の曜日(2002,9,日曜). 一日の曜日(2002,10,火曜). 一日の曜日(2002,11,金曜). 一日の曜日(2002,12,日曜). 一日の曜日(2003,1,水曜). 一日の曜日(2003,2,土曜). 一日の曜日(2003,3,土曜). 一日の曜日(2003,4,火曜). 一日の曜日(2003,5,木曜). 一日の曜日(2003,6,日曜). 一日の曜日(2003,7,火曜). 一日の曜日(2003,8,金曜). 一日の曜日(2003,9,月曜). 一日の曜日(2003,10,水曜). 一日の曜日(2003,11,土曜). 一日の曜日(2003,12,月曜). 一日の曜日(2004,1,木曜). 一日の曜日(2004,2,日曜). 一日の曜日(2004,3,月曜). 一日の曜日(2004,4,木曜). 一日の曜日(2004,5,土曜). 一日の曜日(2004,6,火曜). 一日の曜日(2004,7,木曜). 一日の曜日(2004,8,日曜). 一日の曜日(2004,9,水曜). 一日の曜日(2004,10,金曜). 一日の曜日(2004,11,月曜). 一日の曜日(2004,12,水曜). 一日の曜日(2005,1,土曜). 一日の曜日(2005,2,火曜). 一日の曜日(2005,3,火曜). 一日の曜日(2005,4,金曜). 一日の曜日(2005,5,日曜). 一日の曜日(2005,6,水曜). 一日の曜日(2005,7,金曜). 一日の曜日(2005,8,月曜). 一日の曜日(2005,9,木曜). 一日の曜日(2005,10,土曜). 一日の曜日(2005,11,火曜). 一日の曜日(2005,12,木曜). 一日の曜日(2006,1,日曜). 一日の曜日(2006,2,水曜). 一日の曜日(2006,3,水曜). 一日の曜日(2006,4,土曜). 一日の曜日(2006,5,月曜). 一日の曜日(2006,6,木曜). 一日の曜日(2006,7,土曜). 一日の曜日(2006,8,火曜). 一日の曜日(2006,9,金曜). 一日の曜日(2006,10,日曜). 一日の曜日(2006,11,水曜). 一日の曜日(2006,12,金曜). 一日の曜日(2007,1,月曜). 一日の曜日(2007,2,木曜). 一日の曜日(2007,3,木曜). 一日の曜日(2007,4,日曜). 一日の曜日(2007,5,火曜). 一日の曜日(2007,6,金曜). 一日の曜日(2007,7,日曜). 一日の曜日(2007,8,水曜). 一日の曜日(2007,9,土曜). 一日の曜日(2007,10,月曜). 一日の曜日(2007,11,木曜). 一日の曜日(2007,12,土曜). 一日の曜日(2008,1,火曜). 一日の曜日(2008,2,金曜). 一日の曜日(2008,3,土曜). 一日の曜日(2008,4,火曜). 一日の曜日(2008,5,木曜). 一日の曜日(2008,6,日曜). 一日の曜日(2008,7,火曜). 一日の曜日(2008,8,金曜). 一日の曜日(2008,9,月曜). 一日の曜日(2008,10,水曜). 一日の曜日(2008,11,土曜). 一日の曜日(2008,12,月曜). 一日の曜日(2009,1,木曜). 一日の曜日(2009,2,日曜). 一日の曜日(2009,3,日曜). 一日の曜日(2009,4,水曜). 一日の曜日(2009,5,金曜). 一日の曜日(2009,6,月曜). 一日の曜日(2009,7,水曜). 一日の曜日(2009,8,土曜). 一日の曜日(2009,9,火曜). 一日の曜日(2009,10,木曜). 一日の曜日(2009,11,日曜). 一日の曜日(2009,12,火曜). 一日の曜日(2010,1,金曜). 一日の曜日(2010,2,月曜). 一日の曜日(2010,3,月曜). 一日の曜日(2010,4,木曜). 一日の曜日(2010,5,土曜). 一日の曜日(2010,6,火曜). 一日の曜日(2010,7,木曜). 一日の曜日(2010,8,日曜). 一日の曜日(2010,9,水曜). 一日の曜日(2010,10,金曜). 一日の曜日(2010,11,月曜). 一日の曜日(2010,12,水曜). 一日の曜日(2011,1,土曜). 一日の曜日(2011,2,火曜). 一日の曜日(2011,3,火曜). 一日の曜日(2011,4,金曜). 一日の曜日(2011,5,日曜). 一日の曜日(2011,6,水曜). 一日の曜日(2011,7,金曜). 一日の曜日(2011,8,月曜). 一日の曜日(2011,9,木曜). 一日の曜日(2011,10,土曜). 一日の曜日(2011,11,火曜). 一日の曜日(2011,12,木曜). 一日の曜日(2012,1,日曜). 一日の曜日(2012,2,水曜). 一日の曜日(2012,3,木曜). 一日の曜日(2012,4,日曜). 一日の曜日(2012,5,火曜). 一日の曜日(2012,6,金曜). 一日の曜日(2012,7,日曜). 一日の曜日(2012,8,水曜). 一日の曜日(2012,9,土曜). 一日の曜日(2012,10,月曜). 一日の曜日(2012,11,木曜). 一日の曜日(2012,12,土曜). 一日の曜日(2013,1,火曜). 一日の曜日(2013,2,金曜). 一日の曜日(2013,3,金曜). 一日の曜日(2013,4,月曜). 一日の曜日(2013,5,水曜). 一日の曜日(2013,6,土曜). 一日の曜日(2013,7,月曜). 一日の曜日(2013,8,木曜). 一日の曜日(2013,9,日曜). 一日の曜日(2013,10,火曜). 一日の曜日(2013,11,金曜). 一日の曜日(2013,12,日曜). 一日の曜日(2014,1,水曜). 一日の曜日(2014,2,土曜). 一日の曜日(2014,3,土曜). 一日の曜日(2014,4,火曜). 一日の曜日(2014,5,木曜). 一日の曜日(2014,6,日曜). 一日の曜日(2014,7,火曜). 一日の曜日(2014,8,金曜). 一日の曜日(2014,9,月曜). 一日の曜日(2014,10,水曜). 一日の曜日(2014,11,土曜). 一日の曜日(2014,12,月曜). 一日の曜日(2015,1,木曜). 一日の曜日(2015,2,日曜). 一日の曜日(2015,3,日曜). 一日の曜日(2015,4,水曜). 一日の曜日(2015,5,金曜). 一日の曜日(2015,6,月曜). 一日の曜日(2015,7,水曜). 一日の曜日(2015,8,土曜). 一日の曜日(2015,9,火曜). 一日の曜日(2015,10,木曜). 一日の曜日(2015,11,日曜). 一日の曜日(2015,12,火曜). 一日の曜日(2016,1,金曜). 一日の曜日(2016,2,月曜). 一日の曜日(2016,3,火曜). 一日の曜日(2016,4,金曜). 一日の曜日(2016,5,日曜). 一日の曜日(2016,6,水曜). 一日の曜日(2016,7,金曜). 一日の曜日(2016,8,月曜). 一日の曜日(2016,9,木曜). 一日の曜日(2016,10,土曜). 一日の曜日(2016,11,火曜). 一日の曜日(2016,12,木曜). 一日の曜日(2017,1,日曜). 一日の曜日(2017,2,水曜). 一日の曜日(2017,3,水曜). 一日の曜日(2017,4,土曜). 一日の曜日(2017,5,月曜). 一日の曜日(2017,6,木曜). 一日の曜日(2017,7,土曜). 一日の曜日(2017,8,火曜). 一日の曜日(2017,9,金曜). 一日の曜日(2017,10,日曜). 一日の曜日(2017,11,水曜). 一日の曜日(2017,12,金曜). 一日の曜日(2018,1,月曜). 一日の曜日(2018,2,木曜). 一日の曜日(2018,3,木曜). 一日の曜日(2018,4,日曜). 一日の曜日(2018,5,火曜). 一日の曜日(2018,6,金曜). 一日の曜日(2018,7,日曜). 一日の曜日(2018,8,水曜). 一日の曜日(2018,9,土曜). 一日の曜日(2018,10,月曜). 一日の曜日(2018,11,木曜). 一日の曜日(2018,12,土曜). 一日の曜日(2019,1,火曜). 一日の曜日(2019,2,金曜). 一日の曜日(2019,3,金曜). 一日の曜日(2019,4,月曜). 一日の曜日(2019,5,水曜). 一日の曜日(2019,6,土曜). 一日の曜日(2019,7,月曜). 一日の曜日(2019,8,木曜). 一日の曜日(2019,9,日曜). 一日の曜日(2019,10,火曜). 一日の曜日(2019,11,金曜). 一日の曜日(2019,12,日曜). 一日の曜日(2020,1,水曜). 一日の曜日(2020,2,土曜). 一日の曜日(2020,3,日曜). 一日の曜日(2020,4,水曜). 一日の曜日(2020,5,金曜). 一日の曜日(2020,6,月曜). 一日の曜日(2020,7,水曜). 一日の曜日(2020,8,土曜). 一日の曜日(2020,9,火曜). 一日の曜日(2020,10,木曜). 一日の曜日(2020,11,日曜). 一日の曜日(2020,12,火曜). 月末日の曜日(1970,1,31,土曜). 月末日の曜日(1970,2,28,土曜). 月末日の曜日(1970,3,31,火曜). 月末日の曜日(1970,4,30,木曜). 月末日の曜日(1970,5,31,日曜). 月末日の曜日(1970,6,30,火曜). 月末日の曜日(1970,7,31,金曜). 月末日の曜日(1970,8,31,月曜). 月末日の曜日(1970,9,30,水曜). 月末日の曜日(1970,10,31,土曜). 月末日の曜日(1970,11,30,月曜). 月末日の曜日(1970,12,31,木曜). 月末日の曜日(1971,1,31,日曜). 月末日の曜日(1971,2,28,日曜). 月末日の曜日(1971,3,31,水曜). 月末日の曜日(1971,4,30,金曜). 月末日の曜日(1971,5,31,月曜). 月末日の曜日(1971,6,30,水曜). 月末日の曜日(1971,7,31,土曜). 月末日の曜日(1971,8,31,火曜). 月末日の曜日(1971,9,30,木曜). 月末日の曜日(1971,10,31,日曜). 月末日の曜日(1971,11,30,火曜). 月末日の曜日(1971,12,31,金曜). 月末日の曜日(1972,1,31,月曜). 月末日の曜日(1972,2,29,火曜). 月末日の曜日(1972,3,31,金曜). 月末日の曜日(1972,4,30,日曜). 月末日の曜日(1972,5,31,水曜). 月末日の曜日(1972,6,30,金曜). 月末日の曜日(1972,7,31,月曜). 月末日の曜日(1972,8,31,木曜). 月末日の曜日(1972,9,30,土曜). 月末日の曜日(1972,10,31,火曜). 月末日の曜日(1972,11,30,木曜). 月末日の曜日(1972,12,31,日曜). 月末日の曜日(1973,1,31,水曜). 月末日の曜日(1973,2,28,水曜). 月末日の曜日(1973,3,31,土曜). 月末日の曜日(1973,4,30,月曜). 月末日の曜日(1973,5,31,木曜). 月末日の曜日(1973,6,30,土曜). 月末日の曜日(1973,7,31,火曜). 月末日の曜日(1973,8,31,金曜). 月末日の曜日(1973,9,30,日曜). 月末日の曜日(1973,10,31,水曜). 月末日の曜日(1973,11,30,金曜). 月末日の曜日(1973,12,31,月曜). 月末日の曜日(1974,1,31,木曜). 月末日の曜日(1974,2,28,木曜). 月末日の曜日(1974,3,31,日曜). 月末日の曜日(1974,4,30,火曜). 月末日の曜日(1974,5,31,金曜). 月末日の曜日(1974,6,30,日曜). 月末日の曜日(1974,7,31,水曜). 月末日の曜日(1974,8,31,土曜). 月末日の曜日(1974,9,30,月曜). 月末日の曜日(1974,10,31,木曜). 月末日の曜日(1974,11,30,土曜). 月末日の曜日(1974,12,31,火曜). 月末日の曜日(1975,1,31,金曜). 月末日の曜日(1975,2,28,金曜). 月末日の曜日(1975,3,31,月曜). 月末日の曜日(1975,4,30,水曜). 月末日の曜日(1975,5,31,土曜). 月末日の曜日(1975,6,30,月曜). 月末日の曜日(1975,7,31,木曜). 月末日の曜日(1975,8,31,日曜). 月末日の曜日(1975,9,30,火曜). 月末日の曜日(1975,10,31,金曜). 月末日の曜日(1975,11,30,日曜). 月末日の曜日(1975,12,31,水曜). 月末日の曜日(1976,1,31,土曜). 月末日の曜日(1976,2,29,日曜). 月末日の曜日(1976,3,31,水曜). 月末日の曜日(1976,4,30,金曜). 月末日の曜日(1976,5,31,月曜). 月末日の曜日(1976,6,30,水曜). 月末日の曜日(1976,7,31,土曜). 月末日の曜日(1976,8,31,火曜). 月末日の曜日(1976,9,30,木曜). 月末日の曜日(1976,10,31,日曜). 月末日の曜日(1976,11,30,火曜). 月末日の曜日(1976,12,31,金曜). 月末日の曜日(1977,1,31,月曜). 月末日の曜日(1977,2,28,月曜). 月末日の曜日(1977,3,31,木曜). 月末日の曜日(1977,4,30,土曜). 月末日の曜日(1977,5,31,火曜). 月末日の曜日(1977,6,30,木曜). 月末日の曜日(1977,7,31,日曜). 月末日の曜日(1977,8,31,水曜). 月末日の曜日(1977,9,30,金曜). 月末日の曜日(1977,10,31,月曜). 月末日の曜日(1977,11,30,水曜). 月末日の曜日(1977,12,31,土曜). 月末日の曜日(1978,1,31,火曜). 月末日の曜日(1978,2,28,火曜). 月末日の曜日(1978,3,31,金曜). 月末日の曜日(1978,4,30,日曜). 月末日の曜日(1978,5,31,水曜). 月末日の曜日(1978,6,30,金曜). 月末日の曜日(1978,7,31,月曜). 月末日の曜日(1978,8,31,木曜). 月末日の曜日(1978,9,30,土曜). 月末日の曜日(1978,10,31,火曜). 月末日の曜日(1978,11,30,木曜). 月末日の曜日(1978,12,31,日曜). 月末日の曜日(1979,1,31,水曜). 月末日の曜日(1979,2,28,水曜). 月末日の曜日(1979,3,31,土曜). 月末日の曜日(1979,4,30,月曜). 月末日の曜日(1979,5,31,木曜). 月末日の曜日(1979,6,30,土曜). 月末日の曜日(1979,7,31,火曜). 月末日の曜日(1979,8,31,金曜). 月末日の曜日(1979,9,30,日曜). 月末日の曜日(1979,10,31,水曜). 月末日の曜日(1979,11,30,金曜). 月末日の曜日(1979,12,31,月曜). 月末日の曜日(1980,1,31,木曜). 月末日の曜日(1980,2,29,金曜). 月末日の曜日(1980,3,31,月曜). 月末日の曜日(1980,4,30,水曜). 月末日の曜日(1980,5,31,土曜). 月末日の曜日(1980,6,30,月曜). 月末日の曜日(1980,7,31,木曜). 月末日の曜日(1980,8,31,日曜). 月末日の曜日(1980,9,30,火曜). 月末日の曜日(1980,10,31,金曜). 月末日の曜日(1980,11,30,日曜). 月末日の曜日(1980,12,31,水曜). 月末日の曜日(1981,1,31,土曜). 月末日の曜日(1981,2,28,土曜). 月末日の曜日(1981,3,31,火曜). 月末日の曜日(1981,4,30,木曜). 月末日の曜日(1981,5,31,日曜). 月末日の曜日(1981,6,30,火曜). 月末日の曜日(1981,7,31,金曜). 月末日の曜日(1981,8,31,月曜). 月末日の曜日(1981,9,30,水曜). 月末日の曜日(1981,10,31,土曜). 月末日の曜日(1981,11,30,月曜). 月末日の曜日(1981,12,31,木曜). 月末日の曜日(1982,1,31,日曜). 月末日の曜日(1982,2,28,日曜). 月末日の曜日(1982,3,31,水曜). 月末日の曜日(1982,4,30,金曜). 月末日の曜日(1982,5,31,月曜). 月末日の曜日(1982,6,30,水曜). 月末日の曜日(1982,7,31,土曜). 月末日の曜日(1982,8,31,火曜). 月末日の曜日(1982,9,30,木曜). 月末日の曜日(1982,10,31,日曜). 月末日の曜日(1982,11,30,火曜). 月末日の曜日(1982,12,31,金曜). 月末日の曜日(1983,1,31,月曜). 月末日の曜日(1983,2,28,月曜). 月末日の曜日(1983,3,31,木曜). 月末日の曜日(1983,4,30,土曜). 月末日の曜日(1983,5,31,火曜). 月末日の曜日(1983,6,30,木曜). 月末日の曜日(1983,7,31,日曜). 月末日の曜日(1983,8,31,水曜). 月末日の曜日(1983,9,30,金曜). 月末日の曜日(1983,10,31,月曜). 月末日の曜日(1983,11,30,水曜). 月末日の曜日(1983,12,31,土曜). 月末日の曜日(1984,1,31,火曜). 月末日の曜日(1984,2,29,水曜). 月末日の曜日(1984,3,31,土曜). 月末日の曜日(1984,4,30,月曜). 月末日の曜日(1984,5,31,木曜). 月末日の曜日(1984,6,30,土曜). 月末日の曜日(1984,7,31,火曜). 月末日の曜日(1984,8,31,金曜). 月末日の曜日(1984,9,30,日曜). 月末日の曜日(1984,10,31,水曜). 月末日の曜日(1984,11,30,金曜). 月末日の曜日(1984,12,31,月曜). 月末日の曜日(1985,1,31,木曜). 月末日の曜日(1985,2,28,木曜). 月末日の曜日(1985,3,31,日曜). 月末日の曜日(1985,4,30,火曜). 月末日の曜日(1985,5,31,金曜). 月末日の曜日(1985,6,30,日曜). 月末日の曜日(1985,7,31,水曜). 月末日の曜日(1985,8,31,土曜). 月末日の曜日(1985,9,30,月曜). 月末日の曜日(1985,10,31,木曜). 月末日の曜日(1985,11,30,土曜). 月末日の曜日(1985,12,31,火曜). 月末日の曜日(1986,1,31,金曜). 月末日の曜日(1986,2,28,金曜). 月末日の曜日(1986,3,31,月曜). 月末日の曜日(1986,4,30,水曜). 月末日の曜日(1986,5,31,土曜). 月末日の曜日(1986,6,30,月曜). 月末日の曜日(1986,7,31,木曜). 月末日の曜日(1986,8,31,日曜). 月末日の曜日(1986,9,30,火曜). 月末日の曜日(1986,10,31,金曜). 月末日の曜日(1986,11,30,日曜). 月末日の曜日(1986,12,31,水曜). 月末日の曜日(1987,1,31,土曜). 月末日の曜日(1987,2,28,土曜). 月末日の曜日(1987,3,31,火曜). 月末日の曜日(1987,4,30,木曜). 月末日の曜日(1987,5,31,日曜). 月末日の曜日(1987,6,30,火曜). 月末日の曜日(1987,7,31,金曜). 月末日の曜日(1987,8,31,月曜). 月末日の曜日(1987,9,30,水曜). 月末日の曜日(1987,10,31,土曜). 月末日の曜日(1987,11,30,月曜). 月末日の曜日(1987,12,31,木曜). 月末日の曜日(1988,1,31,日曜). 月末日の曜日(1988,2,29,月曜). 月末日の曜日(1988,3,31,木曜). 月末日の曜日(1988,4,30,土曜). 月末日の曜日(1988,5,31,火曜). 月末日の曜日(1988,6,30,木曜). 月末日の曜日(1988,7,31,日曜). 月末日の曜日(1988,8,31,水曜). 月末日の曜日(1988,9,30,金曜). 月末日の曜日(1988,10,31,月曜). 月末日の曜日(1988,11,30,水曜). 月末日の曜日(1988,12,31,土曜). 月末日の曜日(1989,1,31,火曜). 月末日の曜日(1989,2,28,火曜). 月末日の曜日(1989,3,31,金曜). 月末日の曜日(1989,4,30,日曜). 月末日の曜日(1989,5,31,水曜). 月末日の曜日(1989,6,30,金曜). 月末日の曜日(1989,7,31,月曜). 月末日の曜日(1989,8,31,木曜). 月末日の曜日(1989,9,30,土曜). 月末日の曜日(1989,10,31,火曜). 月末日の曜日(1989,11,30,木曜). 月末日の曜日(1989,12,31,日曜). 月末日の曜日(1990,1,31,水曜). 月末日の曜日(1990,2,28,水曜). 月末日の曜日(1990,3,31,土曜). 月末日の曜日(1990,4,30,月曜). 月末日の曜日(1990,5,31,木曜). 月末日の曜日(1990,6,30,土曜). 月末日の曜日(1990,7,31,火曜). 月末日の曜日(1990,8,31,金曜). 月末日の曜日(1990,9,30,日曜). 月末日の曜日(1990,10,31,水曜). 月末日の曜日(1990,11,30,金曜). 月末日の曜日(1990,12,31,月曜). 月末日の曜日(1991,1,31,木曜). 月末日の曜日(1991,2,28,木曜). 月末日の曜日(1991,3,31,日曜). 月末日の曜日(1991,4,30,火曜). 月末日の曜日(1991,5,31,金曜). 月末日の曜日(1991,6,30,日曜). 月末日の曜日(1991,7,31,水曜). 月末日の曜日(1991,8,31,土曜). 月末日の曜日(1991,9,30,月曜). 月末日の曜日(1991,10,31,木曜). 月末日の曜日(1991,11,30,土曜). 月末日の曜日(1991,12,31,火曜). 月末日の曜日(1992,1,31,金曜). 月末日の曜日(1992,2,29,土曜). 月末日の曜日(1992,3,31,火曜). 月末日の曜日(1992,4,30,木曜). 月末日の曜日(1992,5,31,日曜). 月末日の曜日(1992,6,30,火曜). 月末日の曜日(1992,7,31,金曜). 月末日の曜日(1992,8,31,月曜). 月末日の曜日(1992,9,30,水曜). 月末日の曜日(1992,10,31,土曜). 月末日の曜日(1992,11,30,月曜). 月末日の曜日(1992,12,31,木曜). 月末日の曜日(1993,1,31,日曜). 月末日の曜日(1993,2,28,日曜). 月末日の曜日(1993,3,31,水曜). 月末日の曜日(1993,4,30,金曜). 月末日の曜日(1993,5,31,月曜). 月末日の曜日(1993,6,30,水曜). 月末日の曜日(1993,7,31,土曜). 月末日の曜日(1993,8,31,火曜). 月末日の曜日(1993,9,30,木曜). 月末日の曜日(1993,10,31,日曜). 月末日の曜日(1993,11,30,火曜). 月末日の曜日(1993,12,31,金曜). 月末日の曜日(1994,1,31,月曜). 月末日の曜日(1994,2,28,月曜). 月末日の曜日(1994,3,31,木曜). 月末日の曜日(1994,4,30,土曜). 月末日の曜日(1994,5,31,火曜). 月末日の曜日(1994,6,30,木曜). 月末日の曜日(1994,7,31,日曜). 月末日の曜日(1994,8,31,水曜). 月末日の曜日(1994,9,30,金曜). 月末日の曜日(1994,10,31,月曜). 月末日の曜日(1994,11,30,水曜). 月末日の曜日(1994,12,31,土曜). 月末日の曜日(1995,1,31,火曜). 月末日の曜日(1995,2,28,火曜). 月末日の曜日(1995,3,31,金曜). 月末日の曜日(1995,4,30,日曜). 月末日の曜日(1995,5,31,水曜). 月末日の曜日(1995,6,30,金曜). 月末日の曜日(1995,7,31,月曜). 月末日の曜日(1995,8,31,木曜). 月末日の曜日(1995,9,30,土曜). 月末日の曜日(1995,10,31,火曜). 月末日の曜日(1995,11,30,木曜). 月末日の曜日(1995,12,31,日曜). 月末日の曜日(1996,1,31,水曜). 月末日の曜日(1996,2,29,木曜). 月末日の曜日(1996,3,31,日曜). 月末日の曜日(1996,4,30,火曜). 月末日の曜日(1996,5,31,金曜). 月末日の曜日(1996,6,30,日曜). 月末日の曜日(1996,7,31,水曜). 月末日の曜日(1996,8,31,土曜). 月末日の曜日(1996,9,30,月曜). 月末日の曜日(1996,10,31,木曜). 月末日の曜日(1996,11,30,土曜). 月末日の曜日(1996,12,31,火曜). 月末日の曜日(1997,1,31,金曜). 月末日の曜日(1997,2,28,金曜). 月末日の曜日(1997,3,31,月曜). 月末日の曜日(1997,4,30,水曜). 月末日の曜日(1997,5,31,土曜). 月末日の曜日(1997,6,30,月曜). 月末日の曜日(1997,7,31,木曜). 月末日の曜日(1997,8,31,日曜). 月末日の曜日(1997,9,30,火曜). 月末日の曜日(1997,10,31,金曜). 月末日の曜日(1997,11,30,日曜). 月末日の曜日(1997,12,31,水曜). 月末日の曜日(1998,1,31,土曜). 月末日の曜日(1998,2,28,土曜). 月末日の曜日(1998,3,31,火曜). 月末日の曜日(1998,4,30,木曜). 月末日の曜日(1998,5,31,日曜). 月末日の曜日(1998,6,30,火曜). 月末日の曜日(1998,7,31,金曜). 月末日の曜日(1998,8,31,月曜). 月末日の曜日(1998,9,30,水曜). 月末日の曜日(1998,10,31,土曜). 月末日の曜日(1998,11,30,月曜). 月末日の曜日(1998,12,31,木曜). 月末日の曜日(1999,1,31,日曜). 月末日の曜日(1999,2,28,日曜). 月末日の曜日(1999,3,31,水曜). 月末日の曜日(1999,4,30,金曜). 月末日の曜日(1999,5,31,月曜). 月末日の曜日(1999,6,30,水曜). 月末日の曜日(1999,7,31,土曜). 月末日の曜日(1999,8,31,火曜). 月末日の曜日(1999,9,30,木曜). 月末日の曜日(1999,10,31,日曜). 月末日の曜日(1999,11,30,火曜). 月末日の曜日(1999,12,31,金曜). 月末日の曜日(2000,1,31,月曜). 月末日の曜日(2000,2,29,火曜). 月末日の曜日(2000,3,31,金曜). 月末日の曜日(2000,4,30,日曜). 月末日の曜日(2000,5,31,水曜). 月末日の曜日(2000,6,30,金曜). 月末日の曜日(2000,7,31,月曜). 月末日の曜日(2000,8,31,木曜). 月末日の曜日(2000,9,30,土曜). 月末日の曜日(2000,10,31,火曜). 月末日の曜日(2000,11,30,木曜). 月末日の曜日(2000,12,31,日曜). 月末日の曜日(2001,1,31,水曜). 月末日の曜日(2001,2,28,水曜). 月末日の曜日(2001,3,31,土曜). 月末日の曜日(2001,4,30,月曜). 月末日の曜日(2001,5,31,木曜). 月末日の曜日(2001,6,30,土曜). 月末日の曜日(2001,7,31,火曜). 月末日の曜日(2001,8,31,金曜). 月末日の曜日(2001,9,30,日曜). 月末日の曜日(2001,10,31,水曜). 月末日の曜日(2001,11,30,金曜). 月末日の曜日(2001,12,31,月曜). 月末日の曜日(2002,1,31,木曜). 月末日の曜日(2002,2,28,木曜). 月末日の曜日(2002,3,31,日曜). 月末日の曜日(2002,4,30,火曜). 月末日の曜日(2002,5,31,金曜). 月末日の曜日(2002,6,30,日曜). 月末日の曜日(2002,7,31,水曜). 月末日の曜日(2002,8,31,土曜). 月末日の曜日(2002,9,30,月曜). 月末日の曜日(2002,10,31,木曜). 月末日の曜日(2002,11,30,土曜). 月末日の曜日(2002,12,31,火曜). 月末日の曜日(2003,1,31,金曜). 月末日の曜日(2003,2,28,金曜). 月末日の曜日(2003,3,31,月曜). 月末日の曜日(2003,4,30,水曜). 月末日の曜日(2003,5,31,土曜). 月末日の曜日(2003,6,30,月曜). 月末日の曜日(2003,7,31,木曜). 月末日の曜日(2003,8,31,日曜). 月末日の曜日(2003,9,30,火曜). 月末日の曜日(2003,10,31,金曜). 月末日の曜日(2003,11,30,日曜). 月末日の曜日(2003,12,31,水曜). 月末日の曜日(2004,1,31,土曜). 月末日の曜日(2004,2,29,日曜). 月末日の曜日(2004,3,31,水曜). 月末日の曜日(2004,4,30,金曜). 月末日の曜日(2004,5,31,月曜). 月末日の曜日(2004,6,30,水曜). 月末日の曜日(2004,7,31,土曜). 月末日の曜日(2004,8,31,火曜). 月末日の曜日(2004,9,30,木曜). 月末日の曜日(2004,10,31,日曜). 月末日の曜日(2004,11,30,火曜). 月末日の曜日(2004,12,31,金曜). 月末日の曜日(2005,1,31,月曜). 月末日の曜日(2005,2,28,月曜). 月末日の曜日(2005,3,31,木曜). 月末日の曜日(2005,4,30,土曜). 月末日の曜日(2005,5,31,火曜). 月末日の曜日(2005,6,30,木曜). 月末日の曜日(2005,7,31,日曜). 月末日の曜日(2005,8,31,水曜). 月末日の曜日(2005,9,30,金曜). 月末日の曜日(2005,10,31,月曜). 月末日の曜日(2005,11,30,水曜). 月末日の曜日(2005,12,31,土曜). 月末日の曜日(2006,1,31,火曜). 月末日の曜日(2006,2,28,火曜). 月末日の曜日(2006,3,31,金曜). 月末日の曜日(2006,4,30,日曜). 月末日の曜日(2006,5,31,水曜). 月末日の曜日(2006,6,30,金曜). 月末日の曜日(2006,7,31,月曜). 月末日の曜日(2006,8,31,木曜). 月末日の曜日(2006,9,30,土曜). 月末日の曜日(2006,10,31,火曜). 月末日の曜日(2006,11,30,木曜). 月末日の曜日(2006,12,31,日曜). 月末日の曜日(2007,1,31,水曜). 月末日の曜日(2007,2,28,水曜). 月末日の曜日(2007,3,31,土曜). 月末日の曜日(2007,4,30,月曜). 月末日の曜日(2007,5,31,木曜). 月末日の曜日(2007,6,30,土曜). 月末日の曜日(2007,7,31,火曜). 月末日の曜日(2007,8,31,金曜). 月末日の曜日(2007,9,30,日曜). 月末日の曜日(2007,10,31,水曜). 月末日の曜日(2007,11,30,金曜). 月末日の曜日(2007,12,31,月曜). 月末日の曜日(2008,1,31,木曜). 月末日の曜日(2008,2,29,金曜). 月末日の曜日(2008,3,31,月曜). 月末日の曜日(2008,4,30,水曜). 月末日の曜日(2008,5,31,土曜). 月末日の曜日(2008,6,30,月曜). 月末日の曜日(2008,7,31,木曜). 月末日の曜日(2008,8,31,日曜). 月末日の曜日(2008,9,30,火曜). 月末日の曜日(2008,10,31,金曜). 月末日の曜日(2008,11,30,日曜). 月末日の曜日(2008,12,31,水曜). 月末日の曜日(2009,1,31,土曜). 月末日の曜日(2009,2,28,土曜). 月末日の曜日(2009,3,31,火曜). 月末日の曜日(2009,4,30,木曜). 月末日の曜日(2009,5,31,日曜). 月末日の曜日(2009,6,30,火曜). 月末日の曜日(2009,7,31,金曜). 月末日の曜日(2009,8,31,月曜). 月末日の曜日(2009,9,30,水曜). 月末日の曜日(2009,10,31,土曜). 月末日の曜日(2009,11,30,月曜). 月末日の曜日(2009,12,31,木曜). 月末日の曜日(2010,1,31,日曜). 月末日の曜日(2010,2,28,日曜). 月末日の曜日(2010,3,31,水曜). 月末日の曜日(2010,4,30,金曜). 月末日の曜日(2010,5,31,月曜). 月末日の曜日(2010,6,30,水曜). 月末日の曜日(2010,7,31,土曜). 月末日の曜日(2010,8,31,火曜). 月末日の曜日(2010,9,30,木曜). 月末日の曜日(2010,10,31,日曜). 月末日の曜日(2010,11,30,火曜). 月末日の曜日(2010,12,31,金曜). 月末日の曜日(2011,1,31,月曜). 月末日の曜日(2011,2,28,月曜). 月末日の曜日(2011,3,31,木曜). 月末日の曜日(2011,4,30,土曜). 月末日の曜日(2011,5,31,火曜). 月末日の曜日(2011,6,30,木曜). 月末日の曜日(2011,7,31,日曜). 月末日の曜日(2011,8,31,水曜). 月末日の曜日(2011,9,30,金曜). 月末日の曜日(2011,10,31,月曜). 月末日の曜日(2011,11,30,水曜). 月末日の曜日(2011,12,31,土曜). 月末日の曜日(2012,1,31,火曜). 月末日の曜日(2012,2,29,水曜). 月末日の曜日(2012,3,31,土曜). 月末日の曜日(2012,4,30,月曜). 月末日の曜日(2012,5,31,木曜). 月末日の曜日(2012,6,30,土曜). 月末日の曜日(2012,7,31,火曜). 月末日の曜日(2012,8,31,金曜). 月末日の曜日(2012,9,30,日曜). 月末日の曜日(2012,10,31,水曜). 月末日の曜日(2012,11,30,金曜). 月末日の曜日(2012,12,31,月曜). 月末日の曜日(2013,1,31,木曜). 月末日の曜日(2013,2,28,木曜). 月末日の曜日(2013,3,31,日曜). 月末日の曜日(2013,4,30,火曜). 月末日の曜日(2013,5,31,金曜). 月末日の曜日(2013,6,30,日曜). 月末日の曜日(2013,7,31,水曜). 月末日の曜日(2013,8,31,土曜). 月末日の曜日(2013,9,30,月曜). 月末日の曜日(2013,10,31,木曜). 月末日の曜日(2013,11,30,土曜). 月末日の曜日(2013,12,31,火曜). 月末日の曜日(2014,1,31,金曜). 月末日の曜日(2014,2,28,金曜). 月末日の曜日(2014,3,31,月曜). 月末日の曜日(2014,4,30,水曜). 月末日の曜日(2014,5,31,土曜). 月末日の曜日(2014,6,30,月曜). 月末日の曜日(2014,7,31,木曜). 月末日の曜日(2014,8,31,日曜). 月末日の曜日(2014,9,30,火曜). 月末日の曜日(2014,10,31,金曜). 月末日の曜日(2014,11,30,日曜). 月末日の曜日(2014,12,31,水曜). 月末日の曜日(2015,1,31,土曜). 月末日の曜日(2015,2,28,土曜). 月末日の曜日(2015,3,31,火曜). 月末日の曜日(2015,4,30,木曜). 月末日の曜日(2015,5,31,日曜). 月末日の曜日(2015,6,30,火曜). 月末日の曜日(2015,7,31,金曜). 月末日の曜日(2015,8,31,月曜). 月末日の曜日(2015,9,30,水曜). 月末日の曜日(2015,10,31,土曜). 月末日の曜日(2015,11,30,月曜). 月末日の曜日(2015,12,31,木曜). 月末日の曜日(2016,1,31,日曜). 月末日の曜日(2016,2,29,月曜). 月末日の曜日(2016,3,31,木曜). 月末日の曜日(2016,4,30,土曜). 月末日の曜日(2016,5,31,火曜). 月末日の曜日(2016,6,30,木曜). 月末日の曜日(2016,7,31,日曜). 月末日の曜日(2016,8,31,水曜). 月末日の曜日(2016,9,30,金曜). 月末日の曜日(2016,10,31,月曜). 月末日の曜日(2016,11,30,水曜). 月末日の曜日(2016,12,31,土曜). 月末日の曜日(2017,1,31,火曜). 月末日の曜日(2017,2,28,火曜). 月末日の曜日(2017,3,31,金曜). 月末日の曜日(2017,4,30,日曜). 月末日の曜日(2017,5,31,水曜). 月末日の曜日(2017,6,30,金曜). 月末日の曜日(2017,7,31,月曜). 月末日の曜日(2017,8,31,木曜). 月末日の曜日(2017,9,30,土曜). 月末日の曜日(2017,10,31,火曜). 月末日の曜日(2017,11,30,木曜). 月末日の曜日(2017,12,31,日曜). 月末日の曜日(2018,1,31,水曜). 月末日の曜日(2018,2,28,水曜). 月末日の曜日(2018,3,31,土曜). 月末日の曜日(2018,4,30,月曜). 月末日の曜日(2018,5,31,木曜). 月末日の曜日(2018,6,30,土曜). 月末日の曜日(2018,7,31,火曜). 月末日の曜日(2018,8,31,金曜). 月末日の曜日(2018,9,30,日曜). 月末日の曜日(2018,10,31,水曜). 月末日の曜日(2018,11,30,金曜). 月末日の曜日(2018,12,31,月曜). 月末日の曜日(2019,1,31,木曜). 月末日の曜日(2019,2,28,木曜). 月末日の曜日(2019,3,31,日曜). 月末日の曜日(2019,4,30,火曜). 月末日の曜日(2019,5,31,金曜). 月末日の曜日(2019,6,30,日曜). 月末日の曜日(2019,7,31,水曜). 月末日の曜日(2019,8,31,土曜). 月末日の曜日(2019,9,30,月曜). 月末日の曜日(2019,10,31,木曜). 月末日の曜日(2019,11,30,土曜). 月末日の曜日(2019,12,31,火曜). 月末日の曜日(2020,1,31,金曜). 月末日の曜日(2020,2,29,土曜). 月末日の曜日(2020,3,31,火曜). 月末日の曜日(2020,4,30,木曜). 月末日の曜日(2020,5,31,日曜). 月末日の曜日(2020,6,30,火曜). 月末日の曜日(2020,7,31,金曜). 月末日の曜日(2020,8,31,月曜). 月末日の曜日(2020,9,30,水曜). 月末日の曜日(2020,10,31,土曜). 月末日の曜日(2020,11,30,月曜). 月末日の曜日(2020,12,31,木曜). % 以下のサイトは % % 年、月が与えられた時、日曜日から始まるカレンダーを表示する。 % 日曜起点カレンダー(_年,_月) :- 月末日(_年,_月,_月末日), '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). % 以下のサイトは 日曜起点カレンダー(_一日の曜日,_末日整数,_カレンダー) :- 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). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/811 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # :午前:午後:夜間 # 月曜:診療:診療:診療 # 火曜:休診:診療:診療 # 水曜:休診:診療:休診 # 木曜:診療:診療:診療 # 金曜:診療:診療:診療 # 土曜:診療:休診:休診 # 日曜:休診:休診:休診 # *表の時間外も休診とする # 上記のような病院の診療スケジュールがある # その表をもとに、曜日と時間が入力されるので、 # 診療時間(診療)であれば、Practiceと表示、 # 診療時間外(休診)であれば、is closedと表示すること # 午前:09:00-12:00 # 午後:14:00-17:00 # 夜間:18:00-20:00 # 曜日の入力値 # 月曜:0 火曜:1 水曜:2 # 木曜:3 金曜:4 土曜:5 # 日曜:6 # 実行例) # 0 10:00 入力 # Practice 出力 # 2 18:30 入力 # is closed 出力 # 5 10:30 入力 # Practice 出力 # [月曜:診療:診療:診療]. [火曜:休診:診療:診療]. [水曜:休診:診療:休診]. [木曜:診療:診療:診療]. [金曜:診療:診療:診療]. [土曜:診療:休診:休診]. [日曜:休診:休診:休診]. [午前:09:00-12:00]. [午後:14:00-17:00]. [夜間:18:00-20:00]. 曜日の入力値(月曜,0). 曜日の入力値(火曜,1). 曜日の入力値(水曜,2). 曜日の入力値(目曜,3). 曜日の入力値(金曜,4). 曜日の入力値(土曜,5). 曜日の入力値(日曜,6). ':午前:午後:夜間 月曜:診療:診療:診療 火曜:休診:診療:診療 水曜:休診:診療:休診 木曜:診療:診療:診療 金曜:診療:診療:診療 土曜:診療:休診:休診 日曜:休診:休診:休診 *表の時間外も休診とする 上記のような病院の診療スケジュールがある その表をもとに、曜日と時間が入力されるので、 診療時間(診療)であれば、Practiceと表示、 診療時間外(休診)であれば、is closedと表示すること 午前:09:00-12:00 午後:14:00-17:00 夜間:18:00-20:00 曜日の入力値 月曜:0 火曜:1 水曜:2 木曜:3 金曜:4 土曜:5 日曜:6'(_曜日の入力値,_時間の入力値) :- '診療時間(診療)であれば、Practiceと表示、診療時間外(休診)であれば、is closedと表示すること'(_曜日の入力値,_時間の入力値). '診療時間(診療)であれば、Practiceと表示、診療時間外(休診)であれば、is closedと表示すること'(_曜日の入力値,_時間の入力値) :- read_term_from_atom(_時間の入力値,_時:_分,[]), 曜日の入力値(_曜日,_曜日の入力値), '診療/休診判定'(_曜日,_時,_分,_判定), '診療時間(診療)であれば、Practiceと表示、診療時間外(休診)であれば、is closedと表示すること'(_判定). '診療/休診判定'(_曜日,_時,_分,_判定) :- 時間(_時,_分,_時間), '診療/休診判定'(_曜日,_時間,_判定). '診療/休診判定'(_曜日,午前,_判定) :- [_曜日,_判定,_,_]. '診療/休診判定'(_曜日,午後,_判定) :- [_曜日,_,_判定,_]. '診療/休診判定'(_曜日,夜間,_判定) :- [_曜日,_,_,_判定]. '診療/休診判定'(_曜日,時間外,休診). 時間(_時,_分,_時間) :- [_時間:_時下限:_点下限-_時上限:_分上限], [_時,_分] @>= [_時下限,_分下限], [_時,_分] @=< [_時上限,_分上限],!. 時間(_時,_分,時間外). '診療時間(診療)であれば、Practiceと表示、診療時間外(休診)であれば、is closedと表示すること'(診療) :- write('Practice\n'). '診療時間(診療)であれば、Practiceと表示、診療時間外(休診)であれば、is closedと表示すること'(休診) :- write('is closed\n'). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1402622093/577 # コードゴルフ # # 月の終わりの曜日(W)と日にち(D)が与えられるので、月の初めの曜日を英語の短縮表記(日曜ならSun、月曜ならMon)を出力せよ # 標準入力から以下の形式で与えられる # D W # # '月の終わりの曜日(W)と日にち(D)が与えられるので、月の初めの曜日を英語の短縮表記(日曜ならSun、月曜ならMon)を出力せよ 標準入力から以下の形式で与えられる D W ' :- '標準入力から以下の形式で与えられる D W '(D,W), '月の終わりの曜日(W)と日にち(D)が与えられるので、月の初めの曜日を英語の短縮表記(日曜ならSun、月曜ならMon)を出力せよ'(D,W). '標準入力から以下の形式で与えられる D W '(D,W) :- get_line(_行), split(_行,[' '],[D,W]). '月の終わりの曜日(W)と日にち(D)が与えられるので、月の初めの曜日を英語の短縮表記(日曜ならSun、月曜ならMon)を出力せよ'(D,W) :- sub_atom(土金木水火月日,U,1,_,W), M is ((D + U - 1) mod 7) * 3, sub_atom('SatFriThrWedTueMonSun',M,3,_,X), wirte(X). % コードゴルフ参加 p(W,D):-sub_atom(土金木水火月日,U,1,_,W),M is ((D+U-1) mod 7)*3,sub_atom('SatFriThrWedTueMonSun',M,3,_,X),wirte(X). % 以下のサイトは % % カレンダー矩形/3 % '年カレンダー'(_年) :- 横並びカレンダーを表示する(_年,[1,2,3]), 横並びカレンダーを表示する(_年,[4,5,6]), 横並びカレンダーを表示する(_年,[7,8,9]), 横並びカレンダーを表示する(_年,[10,11,12]). 横並びカレンダーを表示する(_年,_月ならび) :- 月カレンダーを直列する(_年,_月ならび,LL1), 見出し表示(_年,_月ならび), カレンダー行の表示(LL2). 月カレンダーを直列する(_,[],[]). 月カレンダーを直列する(_年,[_月|R],LL) :- カレンダー矩形(_年,_月,LL1), 月カレンダーを直列する(_年,R,LL2), append(LL1,LL2,LL). 見出し表示(_年,_月ならび) :- write('\n'), forall(member(_月,_月ならび),writef('%6c%4r年 %2r月%8c')), write('\n\n'). カレンダー行の表示(_月カレンダー矩形ならび) :- between(1,7,_行), forall(member(_月カレンダー矩形,_月カレンダー矩形ならび), 週表示(_行,_月カレンダー矩形)), write('\n'), _行 = 7,!. 週表示(_行,_月カレンダー矩形) :- nth1(_行,_月カレンダー矩形,[_1,_2,_3,_4,_5,_6,_7]), writef('%3r%3r%3r%3r%3r%3r%3r '). % 以下のサイトは # 出題場所 :: 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). % 以下のサイトは % % Zellerの公式 % '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,土曜). % 以下のサイトは % % Zellerの公式 % 'Zellerの公式を用いて曜日を表す値と曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を表す値と曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 > 2, _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, '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,土曜). % 以下のサイトは # 出題場所 :: 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). % 以下のサイトは % % カレンダーの形式(何曜日から始まるか)と % 月日数と1日の曜日が分かっている時 % カレンダーをならびに得る。 % 第一週と最終週を変数で補正した曜日起点月カレンダー補正(_起点曜日形式,_月日数,_1日の曜日,_カレンダー) :- 曜日起点月カレンダー(_起点曜日形式,_月日数,_1日の曜日,_カレンダー_1), 第一週と最終週を変数で補正した(_カレンダー_1,_カレンダー). 曜日起点月カレンダー(_起点曜日形式,_月日数,_1日の曜日,_カレンダー) :- findall(N,between(1,_月日数,N),_日ならび), 起点曜日番号を得る(_起点曜日形式,_月日数,_1日の曜日,_起点曜日番号), 曜日番号からカレンダーを作成する(_起点曜日番号,_日ならび,_カレンダー). 起点曜日番号を得る(_起点曜日形式,_月日数,_1日の曜日,_起点曜日番号) :- 曜日番号(_曜日番号_1,_起点曜日形式), 曜日番号(_曜日番号,_1日の曜日), _起点曜日番号 is (7 - (_曜日番号 - _曜日番号_1)) mod 7. 曜日番号からカレンダーを作成する(0,_日ならび,_カレンダー) :- 'N個組'(7,_日ならび,_カレンダー),!. 曜日番号からカレンダーを作成する(_曜日番号,_日ならび,[L0|LL]) :- length(L0,_曜日番号), append(L0,L1,_日ならび), 'N個組'(7,L1,LL). 曜日番号(0,日曜) :- !. 曜日番号(1,月曜) :- !. 曜日番号(2,火曜) :- !. 曜日番号(3,水曜) :- !. 曜日番号(4,木曜) :- !. 曜日番号(5,金曜) :- !. 曜日番号(6,土曜) :- !. 'N個組'(_,[],[]) :- !. 'N個組'(N,L,[U|R]) :- 先頭からN個(N,L,U,R1), 'N個組'(N,R1,R). 先頭からN個(_,[],[],[]) :- !. 先頭からN個(0,L,[],L) :- !. 先頭からN個(N,[A|R1],[A|R2],R) :- M is N - 1, 先頭からN個(M,R1,R2,R). 第一週と最終週を変数で補正した([L|LL1],[[_1,_2,_3,_4,_5,_6,_7]|LL2]) :- 第一週を変数で補正(L,[_1,_2,_3,_4,_5,_6,_7]), 最終週を変数で補正(LL1,LL2). 第一週を変数で補正(L,[_1,_2,_3,_4,_5,_6,_7]) :- append(_,L,[_1,_2,_3,_4,_5,_6,_7]). 最終週を変数で補正(LL1,LL2) :- append(LL1_1,[L_2],LL1), append(L_2,_,[_11,_12,_13,_14,_15,_16,_17]), append(LL1_1,[[_11,_12,_13,_14,_15,_16,_17]],LL2),!. 変数だけ値を詰める([],_). 変数だけ値を詰める([V|R],V) :- 変数だけ値を詰める(R,V),!. 変数だけ値を詰める([_|R],V) :- 変数だけ値を詰める(R,V). 変数だけ要素位置番号を詰める([],_). 変数だけ要素位置番号を詰める([N|R],N) :- N_2 is N + 1, 変数だけ要素位置番号を詰める(R,N_2),!. 変数だけ要素位置番号を詰める([_|R],N) :- N_2 is N + 1, 変数だけ要素位置番号を詰める(R,N_2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/754 # # 会議室予約のようなシステムを作っています。 # # 前提として、 # Username,Email,Passwordなどのカラムを持つUserテーブルがあり、 # # さらに、それぞれのユーザーが # # Aさん # # 10日月曜日 13:00-14:00 # 13日木曜日 15:00-16:00 # 14日金曜日 20:00-21:00 # 。 # 。 # # などのように時間の枠をいくつか指定して予約できるようにしたいです。 # # この場合、こうやった時間のデータをどのように保持するのが理想でしょうか # # 使用しているデータベースはmysqlです。 # # :- dynamic(['User'/3,会議室予約/3]). '会議室予約のようなシステムを作っています。 前提として、 Username,Email,Passwordなどのカラムを持つUserテーブルがあり、 さらに、それぞれのユーザーが Aさん 10日月曜日 13:00-14:00 13日木曜日 15:00-16:00 14日金曜日 20:00-21:00 。 。 などのように時間の枠をいくつか指定して予約できるようにしたいです。'(_Username,_利用開始時刻,_利用終了時刻) :- 会議室予約の照会(_Username,_利用開始時刻,_利用終了時刻). 会議室予約の照会(_Username,_利用開始時刻,_利用終了時刻) :- 'User'(_Username,_Email,_Password), 会議室予約(_Username,_利用開始時刻,_利用終了時刻). 会議室を予約する(_Username,_利用開始時刻,_利用終了時刻) :- 会議室予約(_Username_1,_利用開始時刻_1,_利用終了時刻_1), 予約期間の会議室は既に予約済みである(_Username,_利用開始時刻,_利用終了時刻,_Username_1,_利用開始時刻_1,_利用終了時刻_1), writef('%tから%tまでの期間は既に予約済みです\n',[_利用開始時刻,_利用終了時刻]),!. 会議室を予約する(_Username,_利用開始時刻,_利用終了時刻) :- assertz(会議室予約(_Username,_利用開始時刻,_利用終了時刻)), writef('%tから%tまでの期間の予約を完了しました。\n',[_利用開始時刻,_利用終了時刻]). 予約期間の会議室は既に予約済みである(_Username,_利用開始時刻,_利用終了時刻,_Username_1,_利用開始時刻_1,_利用終了時刻_1) :- _利用開始時刻_1 @>= _利用開始時刻, _利用開始時刻_1 @< _利用終了時刻,!. 予約期間の会議室は既に予約済みである(_Username,_利用開始時刻,_利用終了時刻,_Username_1,_利用開始時刻_1,_利用終了時刻_1) :- _利用終了時刻_1 @=< _利用終了時刻, _利用終了時刻_1 @> _利用開始時刻,!. % 以下のサイトは # [1] 授業単元:著作権 # [2] 問題文(含コード&リンク): # # 標準入力から西暦(グレゴリオ暦)を受け取り、 # その年のイースターの日を計算するプログラムを作成してください。 # 結果の表示はしてもしなくてもかまいません。 # # [3] 環境 #  [3.1] OS: (Windows/Linux/等々) #  [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) #  [3.3] 言語: (C/C++/どちらでも可 のいずれか) # [4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか) # # [5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々) # # # イースターの日の決め方 # # イースターの日の決め方の単純な定義は「春分の日の次の満月の後の最初の日曜日」ということになります。 # 尚、その満月の日が日曜日の場合は翌日曜日がイースターとなります。 # # しかしながら、厳密に申しますとこの定義は正しくありません。 # まず、ここでいう「春分の日」は天文学的な意味での春分の日ではなく常に3月21日とします。 # 「満月の日」というのも天文学的な意味での満月の日ではなくMetonic cycleという周期に基づいたものなのです。 # # この理由は、地球上の経度の違い、即ちタイムゾーンの違いによって地域によってイースターの日が変ってしまうという混乱を防ぐためなのです。 # イースターの日を決めるということはそもそも礼拝式典の必要から生じてきました。 # 8世紀までは決め方に関する定まった方法はありませんでしたが、 # AD325年のニカヤ会議による方法が徐々に取り入れられていったようです。 # グレゴリオ暦の採択によって幾分かの修正が必要となりましたが基本的には同じです。 # # 逆に言うと、Metonic cycleさえ知っていれば、将来のイースターの日を計算することが可能なのです。 # # 試してみたい方は、次のようなアルゴリズムによって1900年から2099年までのイースターの日が計算できます。 # # 1.まず調べたい年の西暦年を19で割った余りを計算します。 # # (例えば2006年の場合は19で割って余りが11) # # 2.その余りに11をかけて225から引いた数字をDとします。 # # (D=225-11×11= 104) # # 3.もしDが51以上の時は51未満になるまで30で引き、改めてそれをDとします。 # # (D=104-30-30=44) # # 4.もし、Dが48よりも大きい時はそれから1を引きます。 # # (D=44なのでそのまま) # # 5.西暦年と、西暦年を4で割った数字(小数点以下切り捨て)と、D+1とを足し、それを7で割った余りをEとします。 # # (2006+501+44+1=2552となり7で割ると余りが4なのでE=4) # # 6.Dに7を足してEで引き、それをQとします。 # # (Q=44+7-4=47) # # 7.もし、Qが31以下の時はイースターは3月でその数字がイースター日付を表わします。Qが32以上の場合はイースターは4月でQから31を引いた数字が日付を表わします。 # # (Qは47なので、イースターは4月そして日付は47-31=16日) # # 堺福音教会東京チャペル # tokyo@jec-net.org # TEL.03-3642-5242/FAX.03-3642-5479 # 〒135-0042 東京都江東区木場2丁目17-10-301 # のサイトからの引用 'イースターの日の決め方 イースターの日の決め方の単純な定義は「春分の日の次の満月の後の最初の日曜日」ということになります。 尚、その満月の日が日曜日の場合は翌日曜日がイースターとなります。 しかしながら、厳密に申しますとこの定義は正しくありません。 まず、ここでいう「春分の日」は天文学的な意味での春分の日ではなく常に3月21日とします。 「満月の日」というのも天文学的な意味での満月の日ではなくMetonic cycleという周期に基づいたものなのです。 この理由は、地球上の経度の違い、即ちタイムゾーンの違いによって地域によって イースターの日が変ってしまうという混乱を防ぐためなのです。 イースターの日を決めるということはそもそも礼拝式典の必要から生じてきました。 8世紀までは決め方に関する定まった方法はありませんでしたが、 AD325年のニカヤ会議による方法が徐々に取り入れられていったようです。 グレゴリオ暦の採択によって幾分かの修正が必要となりましたが基本的には同じです。 試してみたい方は、次のようなアルゴリズムによって1900年から2099年までのイースターの日が計算できます。 1.まず調べたい年の西暦年を19で割った余りを計算します。 (例えば2006年の場合は19で割って余りが11) 2.その余りに11をかけて225から引いた数字をDとします。 (D=225-11×11= 104) 3.もしDが51以上の時は51未満になるまで30で引き、改めてそれをDとします。 (D=104-30-30=44) 4.もし、Dが48よりも大きい時はそれから1を引きます。 (D=44なのでそのまま) 5.西暦年と、西暦年を4で割った数字(小数点以下切り捨て)と、D+1とを足し、それを7で割った余りをEとします。 (2006+501+44+1=2552となり7で割ると余りが4なのでE=4) 6.Dに7を足してEで引き、それをQとします。 (Q=44+7-4=47) 7.もし、Qが31以下の時はイースターは3月でその数字がイースター日付を表わします。Qが32以上の場合はイースターは4月でQから31を引いた数字が日付を表わします。 (Qは47なので、イースターは4月そして日付は47-31=16日)' :- 堺福音教会東京チャペルのサイトからの引用. '標準入力から西暦(グレゴリオ暦)を受け取り、 その年のイースターの日を計算するプログラムを作成してください。 結果の表示はしてもしなくてもかまいません。'(_西暦,_月,_日) :- '標準入力から西暦(グレゴリオ暦)を受け取り、'(_西暦), 'Metonic cycleを使ってその年のイースターの日を計算する'(_西暦,_月,_日). '標準入力から西暦(グレゴリオ暦)を受け取り、'(_西暦) :- 整数を得る('西暦(グレゴリオ暦)',グレゴリオ歴(_西暦),_西暦). 'Metonic cycleを使ってその年のイースターの日を計算する'(_西暦,_月,_日) :- 'まず調べたい年の西暦年を19で割った余りを計算します。その余りに11をかけて225から引いた数字をDとします。'(_西暦,D), 'もしDが51以上の時は51未満になるまで30で引き、それをD_2とします。もし、Dが48よりも大きい時はそれから1を引きます。'(D,D_2), '西暦年と、西暦年を4で割った数字(小数点以下切り捨て)と、D_2 + 1 とを足し、それを7で割った余りをEとします。'(_西暦,D_2,E), 'D_2に7を足してEで引き、それをQとします。'(D_2,E,Q), 'もし、Qが31以下の時はイースターは3月でその数字がイースター日付を表わします。Qが32以上の場合はイースターは4月でQから31を引いた数字が日付を表わします。'(Q,_月,_日). 'まず調べたい年の西暦年を19で割った余りを計算します。その余りに11をかけて225から引いた数字をDとします。'(_西暦,D) :- _19で割った余り is _西暦 mod 19, D is 255 - _19で割った余り * 11. 'もしDが51以上の時は51未満になるまで30で引き、それをD_2とします。もし、Dが48よりも大きい時はそれから1を引きます。'(D,D_2) :- 'もしDが51以上の時は'(D), '51未満になるまで30で引き、それをD_2とします。'(D,D_2). 'もしDが51以上の時は51未満になるまで30で引き、それをD_2とします。もし、Dが48よりも大きい時はそれから1を引きます。'(D,D_2) :- 'もし、Dが48よりも大きい時は'(D), 'それから1を引きます。'(D,D_2). 'もしDが51以上の時は'(D,D_2) :- D >= 51. '51未満になるまで30で引き、それをD_2とします。'(D,D_2) :- D_2 is ((D - 51) // 30) + 1) * 30. 'もし、Dが48よりも大きい時は'(D) :- between(48,50,D). 'それから1を引きます。'(D,D_2) :- D_2 is D - 1. '西暦年と、西暦年を4で割った数字(小数点以下切り捨て)と、D_2 + 1 とを足し、それを7で割った余りをEとします。'(_西暦,D_2,E) :- _西暦年を4で割った数字 is _西暦 // 4, E is (_西暦年を4で割った数字 + D_2 + 1) mod 7. 'D_2に7を足してEで引き、それをQとします。'(D_2,E,Q) :- Q is D_2 + 7 - E. 'もし、Qが31以下の時はイースターは3月でその数字がイースター日付を表わします。Qが32以上の場合はイースターは4月でQから31を引いた数字が日付を表わします。'(Q,3,Q) :- Q =< 31,!. 'もし、Qが31以下の時はイースターは3月でその数字がイースター日付を表わします。Qが32以上の場合はイースターは4月でQから31を引いた数字が日付を表わします。'(Q,4,_日) :- Q >= 32, _日 is Q - 31. グレゴリオ歴(_西暦) :- true. % 以下のサイトは # 出典:: 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). % 以下のサイトは # 出典:: 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/1354070278/188 # # [1]C言語 # [2]hashについて # 問題文 http://ime.nu/www.dotup.org/uploda/www.dotup.org3723526.jpg # [3]Linux # [3.1]gcc C言語 # [4]木曜日6:00まで # [5]宜しくお願いします… # # # 問題1. 整数データに対してハッシュ探索を行うことを考える。 # (1) 1~50までの値の乱数を20回呼び出し、テーブル長が23のハッシュテーブル # にチェイン法によってデータを格納せよ。ここでハッシュ関数は(mod23)と # する。 # (2) hash表の内容をすべて画面表示する関数print_hashを定義して、確認しな # さい。 # (3) (2)によって格納されたデータに対して各i(1=% 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/119 # # [1]C言語 # [2]http://ime.nu/www.dotup.org/uploda/www.dotup.org3700396.jpg # 探索木についての課題です # 問題1. データ 6,4,3,8,5,9,7 がこの順に与えられたとき、これを2分探索木として表しなさい。 # # 問題2. 前問をプログラムとして、表示しなさい。表示する関数は再帰的に書きなさい。 # 左の子(部分木) を print,node を print, 右の子 (部分木) を print のように表示することをDFS 中間順と言います。 # # 問題3. 標準入力から文字を入力させ、その文字によって2分探索木に対して以下の動作をするプログラムを作成せよ。 # s ---> 数を1つ標準入力から入力されてデータが存在するか表示 # i ---> 数を1つ標準入力から入力させて2分探索木に追加 # p ---> 今まで入力された数をすべて表示 (DFS中間順で) # q ---> quit # # 問題4. 0から9999の整数の乱数を10000個生成して、2分探索木を作り、データの # 総数、木の深さの最大値、データの最小値と最大値を求めるプログラムを作成し # て確認せよ。 # # [3]ubuntu # gcc # c言語 # [4]期限:木曜日6:00 # 宜しくお願いします。 # :- dynamic([木/3,根/1,二分探索木ラベル/2]). 二分探索木ラベルの生成(_値ならび,_ラベルならび) :- findall(_ラベル,( member(_値,_値ならび), 二分探索木ラベルの候補(_ラベル), assertz(二分探索木ラベル(_ラベル,_値))), _ラベルならび). 二分探索木ラベルの候補(_ラベル) :- N is random(900000) + 100000, atomic_list_concat(['L',N],_ラベル), \+(二分探索木ラベル(_ラベル,_)),!. 二分探索木ラベルの候補(_ラベル) :- 二分探索木ラベルの候補(_ラベル). 根を作る(_値,_ラベル) :- asserta((根(_ラベル) :- !)), 木を作る(_値,_ラベル). 木を作る(_値,_ラベル) :- 二分探索木ラベル(_ラベル,_値), asserta(木([],_ラベル,[])). 木に追加(_根のラベル,_値のラベル) :- 二分探索木ラベル(_根のラベル,_根の値), 二分探索木ラベル(_値のラベル,_値), 木に追加(_根のラベル,_値のラベル,_根の値,_値). 木に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @< _根の値, retract(木([],_根のラベル,_右枝)), 木を作る(_値のラベル), asserta(木(_値のラベル,_根のラベル,_右枝)),!. 木に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @< _根の値, 木(_左枝,_根,_右枝), 木に追加(_左枝,_値). 木に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @>= _根の値, retract(木(_左枝,_根,[])), 木を作る(_値のラベル), asserta(木(_左枝,_根のラベル,_値のラベル)),!. 木に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @>= _根の値, 木(_左枝,_根のラベル,_右枝), 木に追加(_右枝,_値のラベル). 'データ 6,4,3,8,5,9,7 がこの順に与えられたとき、これを2分探索木として表しなさい。' :- 二分探索木ラベルの生成([6,4,3,8,5,9,7],[_根のラベル|_ラベルならび]), 根を作る(_先頭のラベル), append(_,[N|R],_ラベルならび), 木に追加(_根のラベル,N), R = []. 二分探索木全体を表示する :- 根(_根のラベル), 木を表示する(_根のラベル). 木を表示する([]) :- !. 木を表示する(_木の根のラベル) :- 木(_左枝,_木の根のラベル,_右枝), 木を表示する(_左枝,_木の根のラベル,_右枝). 木を表示する(_左の枝,_木の根,_右の枝) :- 二分木探索ラベル(_木の根ラベル,_木の根の値), 木を表示する(_左枝), writef('%t ',[_木の根の値]), 木を表示する(_右枝). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/119 # # [1]C言語 # [2]http://ime.nu/www.dotup.org/uploda/www.dotup.org3700396.jpg # 探索木についての課題です # 問題1. データ 6,4,3,8,5,9,7 がこの順に与えられたとき、これを2分探索木として表しなさい。 # # 問題2. 前問をプログラムとして、表示しなさい。表示する関数は再帰的に書きなさい。 # 左の子(部分木) を print,node を print, 右の子 (部分木) を print のように表示することをDFS 中間順と言います。 # # 問題3. 標準入力から文字を入力させ、その文字によって2分探索木に対して以下の動作をするプログラムを作成せよ。 # s ---> 数を1つ標準入力から入力されてデータが存在するか表示 # i ---> 数を1つ標準入力から入力させて2分探索木に追加 # p ---> 今まで入力された数をすべて表示 (DFS中間順で) # q ---> quit # # 問題4. 0から9999の整数の乱数を10000個生成して、2分探索木を作り、データの # 総数、木の深さの最大値、データの最小値と最大値を求めるプログラムを作成し # て確認せよ。 # # [3]ubuntu # gcc # c言語 # [4]期限:木曜日6:00 # 宜しくお願いします。 # 二分探索木ラベルの生成(_値ならび) :- nth1(_nth1,_値ならび,_値), atomic_list_concat(['L','_',_nth1],_ラベル), assertz(二分探索木ラベル(_ラベル,_値)), fail. 二分探索木ラベルの生成(_). 根を作る(_値,_ラベル) :- 二分探索木ラベル(_ラベル,_値), asserta(根(_ラベル,[],[])). 枝を作る(_値,_ラベル) :- 二分探索木ラベル(_ラベル,_値), asserta(枝(_ラベル,[],[])). 枝に追加(_根のラベル,_値) :- 二分探索木ラベル(_根のラベル,_根の値), 二分探索木ラベル(_値のラベル,_値), 枝に追加(_根のラベル,_値のラベル,_根の値,_値). 枝に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @< _根の値, retract(枝(_根のラベル,[],_右枝)), 枝を作る(_値), asserta(根(_根のラベル,_値のラベル,_右枝)),!. 枝に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @< _根の値, 枝(_根,_左枝,_右枝), 枝に追加(_左枝,_値). 枝に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @>= _根の値, retract(枝(_根,_左枝,[])), 枝を作る(_値), asserta(根(_根のラベル,_左枝,_値のラベル)),!. 枝に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @>= _根の値, 枝(_根のラベル,_左枝,_右枝), 枝に追加(_右枝,_値). 'データ 6,4,3,8,5,9,7 がこの順に与えられたとき、これを2分探索木として表しなさい。' :- 二分探索木ラベルの生成([6,4,3,8,5,9,7]), 根を作る(6,_根のラベル), append(_,[N|R],[4,3,8,5,9,7]), 枝に追加(_根のラベル,N), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/837 # # 単元 C言語配列 # 問題1 Float型配列にマクロで指定した個数の乱数(randを使う)を格納して # その平均値と最大値を出力するプログラムを作成せよ。 # # 問題2 上記の問題で結果を小さい順で表記せよ。 # 環境 Linux gcc C言語 # 期限 今週日曜日まで # よろしくお願いします # # 'ならびに指定した個数の浮動小数点数の乱数(randを使う)を格納して、小さい順で表記せよ。'(_指定した個数) :- 'ならびに指定した個数の浮動小数点数の乱数(randを使う)を格納して'(_指定した個数,_ならび), 整列(_ならび,_整列したならび), writef('%t\n',[_整列したならび]). 'ならびに指定した個数の浮動小数点数の乱数(randを使う)を格納して'(_指定した個数,_ならび) :- findall(_浮動小数点数,( between(1,_指定した個数,_), _浮動小数点数 is (-1 ^ (random(2)+1)) * random(10000) / (random(10000) + 1)), _ならび). 整列([],[]). 整列([A|R],L) :- 分割(A,R,L1,L2), 整列(L1,L1_2), 整列(L2,L2_2), append(L1_2,[A|L2_2],L). 分割(_,[],[],[]). 分割(A,[B|R1],[B|R2],R3) :- B @=< A, 分割(A,R1,R2,R3). 分割(A,[B|R1],R2,[B|R3]) :- A @< B, 分割(A,R1,R2,R3). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/837 # # 単元 C言語配列 # 問題1 Float型配列にマクロで指定した個数の乱数(randを使う)を格納して # その平均値と最大値を出力するプログラムを作成せよ。 # # 問題2 上記の問題で結果を小さい順で表記せよ。 # 環境 Linux gcc C言語 # 期限 今週日曜日まで # よろしくお願いします # # 'ならびに指定した個数の浮動小数点数の乱数(randを使う)を格納してその平均値と最大値を出力する'(_指定した個数) :- 'ならびに指定した個数の浮動小数点数の乱数(randを使う)を格納して'(_指定した個数,_ならび), その平均値と最大値を出力する(_ならび). 'ならびに指定した個数の浮動小数点数の乱数(randを使う)を格納して'(_指定した個数,_ならび) :- findall(_浮動小数点数,( between(1,_指定した個数,_), _浮動小数点数 is (-1 ^ (random(2)+1)) * random(10000) / (random(10000) + 1)), _ならび). その平均値と最大値を出力する(_指定した個数,[_第一要素|_残りならび]) :- その平均値と最大値を出力する(_指定した個数,_ならび,_第一要素,_最大値,0.0,_平均値), writef('平均値 = %t, 最大値 = %t\n',[_平均値,_最大値]). その平均値と最大値を出力する(_指定した個数,[],_最大値,_最大値,_合計,_平均値) :- _平均値 is _合計 / _指定した個数,!. その平均値と最大値を出力する(_指定した個数,[_値|R],_最大値_1,_最大値,_合計_1,_平均値) :- 最大値はどちらか(_値,_最大値_1,_最大値_2), _合計_2 is _合計_1 + _値, その平均値と最大値を出力する(_指定した個数,R,_値,_最大値,_合計_2,_平均値). 最大値はどちらか(_値,_最大値_1,_値) :- _値 > _最大値_1,!. 最大値はどちらか(_値,_最大値_1,_これまでの最大値) :- _値 =< _最大値_1. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/345 # # [1]計算機基礎実習 # [2]問題文:http://ime.nu/codepad.org/dCFDDyhz #  上記の「各桁の値の合計」を求めるプログラミングを #  用いて、3の倍数を判定する再帰プログラムを作りなさい。 # [3.1]Linux # [3.2]gcc # [3.3]C言語 # [4]10月25日 木曜日まで # よろしくお願いします。 # # # #include # # int keta(int a); //与えられた桁数を全て足して返す関数 # # int main(){ # int a; # # printf("数を入力して下さい:"); # scanf("%d",&a); # # printf("\n%dの桁数を足すと%dです.\n",a,keta(a)); # return(0); # } # # int keta(int a){ # if(a < 10)return(a); # return a % 10 + keta(a / 10); # } '「各桁の値の合計」を用いて、3の倍数を非再帰的に判定する'(_正の整数) :- number_chars(_正の整数,_数字ならび), '「各桁の値の合計」を用いて、3の倍数を判定する'(_数字ならび). '「各桁の値の合計」を用いて、3の倍数を判定する'(_数字ならび) :- 各桁の値の合計(_数字ならび,_各桁の値の合計), '3の倍数を判定する'(_各桁の値の合計). 各桁の値の合計(_数字ならび,_各桁の値の合計) :- findsum(_数値,( member(_数字アトム,_数字ならび), atom_number(_数字アトム,_数値)), _各桁の値の合計). '3の倍数を判定する'(_各桁の値の合計) :- 0 is _各桁の値の合計 mod 3. % % 非再帰版 % % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/345 # # [1]計算機基礎実習 # [2]問題文:http://ime.nu/codepad.org/dCFDDyhz #  上記の「各桁の値の合計」を求めるプログラミングを #  用いて、3の倍数を判定する再帰プログラムを作りなさい。 # [3.1]Linux # [3.2]gcc # [3.3]C言語 # [4]10月25日 木曜日まで # よろしくお願いします。 # # # #include # # int keta(int a); //与えられた桁数を全て足して返す関数 # # int main(){ # int a; # # printf("数を入力して下さい:"); # scanf("%d",&a); # # printf("\n%dの桁数を足すと%dです.\n",a,keta(a)); # return(0); # } # # int keta(int a){ # if(a < 10)return(a); # return a % 10 + keta(a / 10); # } '「各桁の値の合計」を用いて、3の倍数を判定する' :- 整数を得る('正の整数(負数入力で終了)',_正の整数), '「各桁の値の合計」を用いて、3の倍数を判定する'(_正の整数,_3の倍数であるかどうかの判定). '「各桁の値の合計」を用いて、3の倍数を判定する' :- '「各桁の値の合計」を用いて、3の倍数を判定する'. '「各桁の値の合計」を用いて、3の倍数を判定する'(_負の整数,_3の倍数であるかどうかの判定) :- _負の整数 < 0,!. '「各桁の値の合計」を用いて、3の倍数を判定する'(_正の整数,_3の倍数であるかどうかの判定) :- 各桁の値の合計(_正の整数,_各桁の値の合計), '3の倍数を判定する'(_正の整数,_各桁の値の合計,_3の倍数であるかどうかの判定), writef('%t は %t\n',[_正の整数,_3の倍数であるかどうかの判定]), fail. 各桁の値の合計(0,0) :- !. 各桁の値の合計(N_1,S) :- M is N_1 mod 10, N_2 is N_1 // 10, 各桁の値の合計(N_2,S_2), S is S_2 + M. '3の倍数を判定する'(_整数,_各桁の値の合計,3の倍数です) :- 0 is _各桁の値の合計 mod 3. '3の倍数を判定する'(_整数,_各桁の値の合計,3の倍数ではありません) :- \+(0 is _各桁の値の合計 mod 3). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/226 # # [1]C言語 繰り返し文 # [2]問題 長いのでリンクでお願いします。 # http://ime.nu/codepad.org/iaWNbokN # [3]Linux ubuntu gcc C言語 # [4]今週日曜日迄 # [5]配列 ポインタなどは習ってないですよろしくお願いします。 # # 課題1. # キーボードから2 以上の整数を1 つ入力し,その数が素数(1 とその数以外で割り切れない数) のときだけ, # その数を表示するプログラムを作成せよ.ただし,以下の条件を満たすこと. # プログラム中で,ループ回数をカウントし,入力値が素数のときにループ回数も # 表示する #  次ページに記載されているサンプルプログラムよりもループ回数が少なくなるようにする # 1)サンプルプログラムでは,入力値(n) が素数の場合のループ回数は,n - 2 回になる # 2)入力値が小さい場合(n = 2, 3 など) は,ループ回数が少なくなっていなくてもよい# # #include <stdio.h> # int main(void) # { # int n, i, count = 0; # printf("n: "); # scanf("%d", &n); # for (i = 2; i * i <= n; i++) { # count++; # if (n % i == 0) { # break; # } # } # if (i * i > n) { # printf("%d: %d\n", n, count); # } # return 0; # } # # 'キーボードから2 以上の整数を1つ入力し,その数が素数(1 とその数以外で割り切れない数) のときだけ,その数を表示する.ただし,以下の条件を満たすこと.プログラム中で,ループ回数をカウントし,入力値が素数のときにループ回数も表示する' :- 'キーボードから2 以上の整数を1つ入力し'(_2以上の整数), 'その数が素数(1 とその数以外で割り切れない数) のときだけ,その数を表示する'(_2以上の整数). 'キーボードから2 以上の整数を1 つ入力し,その数が素数(1 とその数以外で割り切れない数) のときだけ,その数を表示する.ただし,以下の条件を満たすこと.プログラム中で,ループ回数をカウントし,入力値が素数のときにループ回数も表示する' :- 'キーボードから2 以上の整数を1つ入力し,その数が素数(1 とその数以外で割り切れない数) のときだけ,その数を表示する.ただし,以下の条件を満たすこと.プログラム中で,ループ回数をカウントし,入力値が素数のときにループ回数も表示する'. 'キーボードから2 以上の整数を1つ入力し'(_2以上の整数) :- 整数を得る('2以上の整数を1つ',_2以上の整数 >= 2,_2以上の整数),!. 'その数が素数(1 とその数以外で割り切れない数) のときだけ,その数を表示する'(0) :- !. 'その数が素数(1 とその数以外で割り切れない数) のときだけ,その数を表示する'(_2以上の整数) :- 'Nは素数か'(_2以上の整数), writef('%tは素数です\n',[_2以上の整数]), fail. 'Nは素数か'(N) :- findall(M,between(2,N,M),L), 'エラトステネスの篩'(L,L2), last(L2,N),!. エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/226 # # [1]C言語 繰り返し文 # [2]問題 長いのでリンクでお願いします。 # http://ime.nu/codepad.org/iaWNbokN # [3]Linux ubuntu gcc C言語 # [4]今週日曜日迄 # [5]配列 ポインタなどは習ってないですよろしくお願いします。 # # 課題1. # #include <stdio.h> # int main(void) # { # int n, i, count = 0; # printf("n: "); # scanf("%d", &n); # for (i = 2; i * i <= n; i++) { # count++; # if (n % i == 0) { # break; # } # } # if (i * i > n) { # printf("%d: %d\n", n, count); # } # return 0; # } # # # 課題2. キーボードから10 進整数を入力し,その数を2 進数に変換した値を表示するプログラムを作成 # せよ.ただし,変換後の2 進数は正しい順序で表示すること(入力が10 ならば,1010 と表示). # # 課題3.課題1,2 のプログラムを作成するにあたり,どのように考えてプログラムを実現したのかをレ # ポートにまとめよ(プログラムの説明ではなく,問題を解くための考え方を説明する). # ※プログラムが完成していなくても,自分の考えた解き方をレポートにまとめること # */ # 'キーボードから10進整数を入力し,その数を2進数に変換した値を表示する' :- キーボードから10進整数を入力し(_10進整数), その数を2進数に変換した値を表示する(_10進整数). キーボードから10進整数を入力し(_10進整数) :- 整数を得る('10進整数',integer(_10進整数),_10進整数). その数を2進数に変換した値を表示する(_10進整数) :- その数を2進数に変換した値を(_10進整数,[],_2進数に変換した値), 表示する(_2進数に変換した値). その数を2進数に変換した値を(_10進整数,_2進数に変換した値) :- _10進整数 >= 0, その数を2進数に変換した値を(_10進整数,[],L), atomic_list_concat(L,_2進数に変換した値),!. その数を2進数に変換した値を(_10進整数,_2進数に変換した値) :- 負数を2進数に変換(_10進整数,_2進数に変換した値). その数を2進数に変換した値を(N,L1,[N|L1]) :- N < 2,!. その数を2進数に変換した値を(_10進整数,L1,L) :- M_1 is _10進整数 // 2, M_2 is _10進整数 mod 2, その数を2進数に変換した値を(M_1,[M_2|L1],L). 負数を2進数に変換(_10進整数,_2進数に変換した値) :- _10進整数_2 is abs(_10進整数) + 1, その数を2進数に変換した値を(_10進整数_2,[],L_1), 'Lを32要素に拡張して否定する'(L_1,L_2), atomic_list_concat(L_2,_2進数に変換した値). 'Lを32要素に拡張して否定する'(L_1,L_2) :- length(L,32), append(L_0,L_1,L), all(L_0,0), 各要素を反転する(L,L_2),!. 各要素を反転する([],[]). 各要素を反転する([0|R1],[1|R2]) :- 各要素を反転する(R1,R2). 各要素を反転する([1|R1],[0|R2]) :- 各要素を反転する(R1,R2). 表示する(_2進数に変換した値) :- writef('%t\n',[_2進数に変換した値]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/378 # # 課題:http://ime.nu/www.dotup.org/uploda/www.dotup.org3502064.jpg # ファイル名はKadai01.javaとする。 # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI  】制限なし # 【 期限 】10月14(日曜日まで) # 【 Ver  】javac 1.7.0_07 # # 行列A,Bに対して,和A+B,積ABおよびBAを計算するプログラムを作成し実行しなさい.ただし # # A = # 1 2 3 # 4 5 6 # 7 8 9 # # B = # 1 1 0 # 2 0 1 # 0 2 3 # # とする. # '行列A,Bに対して,和A+B,積ABおよびBAを計算するプログラムを作成し実行しなさい'(_行列A,_行列B,_行列の和,_行列の積AB,_行列の積BA) :- '和A+B'(_行列A,_行列B,_行列の和), 積AB(_行列A,_行列B,_行列の積AB), 積BA(_行列A,_行列B,_行列の積BA). '和A+B'([],[],[]). '和A+B'([L1|R1],[L2|R2],[L3|R3]) :- 列ごとに加算(L1,L2,L3), '和A+B'(R1,R2,R3). 列ごとに加算([],[],[]). 列ごとに加算([A|R1],[B|R2],[C|R3]) :- 分数を含む加算(A,B,C), 列ごとに加算(R1,R2,R3). 積AB(_行列A,_行列B,_行列の積AB) :- 行列の積(_行列A,_行列B,_行列の積AB). 積BA(_行列A,_行列B,_行列の積BA) :- 行列の積(_行列B,_行列A,_行列の積BA). 行列の積(L1,L2,X) :- 転置(L2,L4), 行列の積_1(L1,L4,X). 行列の積_1([],_,[]) :- !. 行列の積_1([A|R1],L,[S1|R3]) :- 行列の積_2(A,L,S1), 行列の積_1(R1,L,R3). 行列の積_2(_,[],[]) :- !. 行列の積_2(A,[B|R2],[C|R3]) :- 行列の積_3(A,B,C), 行列の積_2(A,R2,R3). 行列の積_3([],[],0) :- !. 行列の積_3([A1 / A2|R1],[B1 / B2|R2],S) :- S01 is A1 * B1, S02 is A2 * B2, 約分(S01 / S02,S1), 行列の積_3(R1,R2,S2), 分数を含む加算(S1,S2,S),!. 行列の積_3([A1 / A2|R1],[B|R2],S) :- S0 is A1 * B, 約分(S0 / A2,S1), 行列の積_3(R1,R2,S2), 分数を含む加算(S1,S2,S),!. 行列の積_3([A|R1],[B1 / B2|R2],S) :- S0 is A * B1, 約分(S0 / B2,S1), 行列の積_3(R1,R2,S2), 分数を含む加算(S1,S2,S),!. 行列の積_3([A|R1],[B|R2],S) :- S1 is A * B, 行列の積_3(R1,R2,S2), 分数を含む加算(S1,S2,S). 分数を含む加算(A1 / A2,B1 / B2,C) :- S1 is A1 * B2 + A2 * B1, S2 is A2 * B2, 約分(S1 / S2,C),!. 分数を含む加算(A1 / A2,B,C) :- S1 is A1 + A2 * B, 約分(S1 / A2,C),!. 分数を含む加算(A,B1 / B2,C) :- S1 is B1 + B2 * A, 約分(S1 / B2,C),!. 分数を含む加算(A,B,C) :- C is A + B. 約分(B / A,X) :- 最大公約数(B,A,C), _分子 is B // C, _分母 is A // C, 約分の二(_分子,_分母,X),!. 約分の二(_分子,1,_分子) :- !. 約分の二(_分子,1.0,_分子) :- !. 約分の二(_分子,_分母,_分子 / _分母). 最大公約数(M,N,X) :- 最大公約数をユークリッドの互除法で求める(M,N,X),!. 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4) . 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/965 # # 休憩時間が設定されているときに、指定日時より'HH:MM'後の時刻を求めたいです。 # # ・データベース:PostgreSQL 8.4 # ・テーブル: # 休憩時間 # 開始時刻 終了時刻 # 08:00 08:30 # 19:00 19:30 # 22:00 22:30 # # 使うかどうかわかりませんが、次のマスタもあります。 # カレンダー # 日付 # ... # 2012-07-26 # 2012-07-27 # 2012-07-28 # ... # # ・説明 # 指定した日時から休憩時間を除いた'HH:MM'後を計算します。 # 計算結果が休憩時間内(開始終了時刻を含む)の場合は、休憩時間終了時刻を結果とします。 # # ・欲しい結果 # '2012-07-27 09:00'の'09:00'後 => '2012-07-27 18:00'(休憩時間がないのでそのまま足す) # '2012-07-27 09:00'の'10:00'後 => '2012-07-27 19:30'(10時間後は19:00の休憩と重なるので、19:30が答え) # '2012-07-27 09:00'の'11:00'後 => '2012-07-27 20:30' # '2012-07-27 09:00'の'13:00'後 => '2012-07-27 23:00'(19:00〜と22:00〜の二回の休憩を挟む) # # '指定した日時から休憩時間を除いたHH:MM後を計算します。計算結果が休憩時間内(開始終了時刻を含む)の場合は、休憩時間終了時刻を結果とします。'(_起点時刻,_時間後,_時間後の時刻) :- 休憩時間ならびと就業時間ならびを生成する(_休憩時間ならび,_就業時間ならび), 最初に一番間近な休憩時刻までの時間を時間後から差し引き起点をその休憩後時刻にずらす(_休憩時間ならび,_起点時刻,_時間後,_更新された起点時刻,_更新された時間後), 次の就業時間の始まりまでの間の就業時間を時間後から削っていく(_更新された起点時刻,_最後の休憩終了時刻,_更新された時間後,_就業時間ならび,_時間後の時刻). 休憩時間ならびと就業時間ならびを生成する(_就業時間ならび) :- findall([_開始時刻,_終了時刻],( 休憩時間(_開始時刻,_終了時刻)), _休憩時間ならび), 就業時間ならびを生成する(L,_就業時間ならび). 就業時間ならびを生成する([],[]). 就業時間ならびを生成する([[A,B],[C,D]|R1],[[B,C]|R2]) :- 就業時間ならびを生成する([[C,D]|R1],R2). 最初に一番間近な休憩時刻までの時間を時間後から差し引き起点をその休憩後時刻にずらす([],_起点時刻,_時間後,0,_時間後の時刻) :- _時間後の時刻 is _起点時刻 + _時間後,!. 最初に一番間近な休憩時刻までの時間を時間後から差し引き起点をその休憩後時刻にずらす([[_休憩起点時刻,_休憩終了時刻]|R1],_起点時刻,0,_時間後の時刻) :- _休憩起点時刻 @>= _起点時刻, 時間の引き算(_休憩起点時刻,_起点時刻,_休憩起点時刻までの時間), _休憩起点時刻までの時間 @>= _時間後, 時間の足し算(_起点時刻,_時間後,_時間後の時刻),!. 最初に一番間近な休憩時刻までの時間を時間後から差し引き起点をその休憩後時刻にずらす([[_休憩起点時刻,_休憩終了時刻]|R1],_起点時刻,_更新された時間後,_休憩終了時刻) :- _休憩起点時刻 @>= _起点時刻, 時間の引き算(_休憩起点時刻,_起点時刻,_休憩起点時刻までの時間), _休憩起点時刻までの時間 @< _時間後, 時間の引き算(_時間後,_休憩起点時刻までの時間,_更新された時間後),!. 最初に一番間近な休憩時刻までの時間を時間後から差し引き起点をその休憩後時刻にずらす([[_休憩起点時刻,_休憩終了時刻]|R1],_起点時刻,_時間後,_更新された時間後,_更新された時間後時刻) :- \+(_休憩起点時刻 @>= _起点時刻), 最初に一番間近な休憩時刻までの時間を時間後から差し引き起点をその休憩後時刻にずらす(R1,_起点時刻,_時間後,_更新された時間後,_更新された時間後時刻). 次の就業時間の始まりまでの間の就業時間を時間後から削っていく(_時間後の時刻,_,0,_,_時間後の時刻) :- !. 次の就業時間の始まりまでの間の就業時間を時間後から削っていく(_起点時刻,_,_時間後,[],_時間後の時刻) :- 時間の足し算(_起点時刻,_時間後,_時間後の時刻),!. 次の就業時間の始まりまでの間の就業時間を時間後から削っていく(_起点時刻,_,_時間後,[[A,B]|R1],_時間後の時刻) :- 時間の引き算(B,A,_次の就業時間枠), _時間後 @=< _次の就業時間枠, 時間の足し算(A,_時間後,_時間後の時刻),!. 次の就業時間の始まりまでの間の就業時間を時間後から削っていく(_起点時刻,_最後の休憩終了時刻,_時間後,[[A,B]],_時間後の時刻) :- 時間の引き算(B,A,_次の就業時間枠), 時間の引き算(_時間後,_次の就業時間枠,_更新された時間後), 時間の足し算(_最後の休憩終了時刻 +_時間後,_時間後の時刻),!. 次の就業時間の始まりまでの間の就業時間を時間後から削っていく(_起点時刻,_最後の休憩終了時刻,_時間後,[[A,B],[C,D]|R1],_時間後の時刻) :- 時間の引き算(B,A,_次の就業時間枠), 時間の引き算(_時間後,_次の就業時間枠,_更新された時間後), 時間の足し算(C,_時間後,_時間後の時刻),!. 時間の引き算(_時刻_1,_時刻_2,_時刻_3) :- '時刻から年・月・日・時・分を得る'(_時刻_1,_年_1,_月_1,_日_1,_時_1,_分_1), '時刻から年・月・日・時・分を得る'(_時刻_2,_年_2,_月_2,_日_2,_時_2,_分_2), 時間の引き算(_時刻_1,_年_1,_月_1,_日_1,_時_1,_分_1,_年_2,_月_2,_日_2,_時_2,_分_2,_年,_月,_日,_時,_分), atomic_list_concat([_年,-,_月,-,_日,' ',_時,':',_分],_時刻_3). 時間の足し算(_時刻_1,_時刻_2,_時刻_3) :- '時刻から年・月・日・時・分を得る'(_時刻_1,_年_1,_月_1,_日_1,_時_1,_分_1), '時刻から年・月・日・時・分を得る'(_時刻_2,_年_2,_月_2,_日_2,_時_2,_分_2), 時間の足し算(_時刻_1,_年_1,_月_1,_日_1,_時_1,_分_1,_年_2,_月_2,_日_2,_時_2,_分_2,_年,_月,_日,_時,_分), atomic_list_concat([_年,-,_月,-,_日,' ',_時,':',_分],_時刻_3). '時刻から年・月・日・時・分を得る'(_時刻,_年,_月,_日,_時,_分) :- split(_時刻,['-',':',' '],[_年,_月,_日,_時,_分]),!. 時間の足し算(_年_1,_月_1,_日_1,_時_1,_分_1,_年_2,_月_2,_日_2,_時_2,_分_2,_年,_月,_日,_時,_分) :- _年_3 is _年_1 + _年_2, _月_3 is _月_1 + _月_2, _日_3 is _日_1 + _日_2, _時_3 is _時_1 + _時_2, _分_3 is _分_1 + _分_2, 時間の補正(_年_3,_月_3,_日_3,_時_3,_分_3,_年,_月,_日,_時,_分). 時間の補正(_年_3,_月_3,_日_3,_時_3,_分_3,_年,_月,_日,_時,_分) :- _分_3 >= 60, _分_4 is _分_3 - 60, _時_4 is _時_3 + 1, 時間の補正(_年_3,_月_3,_日_3,_時_4,_分_4,_年,_月,_日,_時,_分),!. 時間の補正(_年_3,_月_3,_日_3,_時_3,_分_3,_年,_月,_日,_時,_分) :- _時_3 >= 24, _時_4 is _時_3 - 24, _日_4 is _日_3 + 1, 時間の補正(_年_3,_月_3,_日_4,_時_4,_分_3,_年,_月,_日,_時,_分),!. 時間の補正(_年_3,_月_3,_日_3,_時_3,_分_3,_年,_月,_日,_時,_分) :- 月末補正(_年_3,_月_3,_日_3,_月_4,_日_4), 時間の補正(_年_3,_月_4,_日_4,_時_3,_分_3,_年,_月,_日,_時,_分). 時間の補正(_年_3,_月_3,_日_3,_時_3,_分_3,_年,_月,_日,_時,_分) :- _月_3 > 12, _年_4 is _年_3 + 1, 時間の補正(_年_4,1,_日_3,_時_3,_分_3,_年,_月,_日,_時,_分),!. 時間の補正(_年,_月,_日,_時,_分,_年,_月,_日,_時,_分). 月末補正(_年_3,_月_3,_日_3,_月_4,_日_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/1252060267/747 # # 指定時刻に何かしたい! # 例えば・・・・ # 10時00分00秒に「イヤン!」と言う。 # 11時00分00秒に「バカン!」と言う。 # 12時00分00秒に「あなた、エッチね・・・・」と言う。 # こんな感じです! # 何か良い方法ありますか? # 上手にやってる方いますか?? # よろしくお願いします。 # # :- op(500,xf,と). :- op(600,xf,言う). '指定時刻に何かしたい!' :- localtime(_年,_月,_日,_曜日,_累計日数,_時,_分,_秒), '指定時刻に何かしたい!'(_時-_分-_秒). '指定時刻に何かしたい!'(10-00-00) :- 'イヤン!' と 言う. '指定時刻に何かしたい!'(11-00-00) :- 'バカン!' と 言う. '指定時刻に何かしたい!'(12-00-00) :- 'エッチ!' と 言う. _なになに と 言う :- writef('%t',[_なになに]). % % localtime/8 % % 以下のサイトは # # 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). % 以下のサイトは 国民の祝日である(_年,_月,_日) :- '国民の祝日に関する法律 第二条  「国民の祝日」を次のように定める。'(_,_,_年,_月,_日). 振替休日である(_振替休日の年,_振替休日の月,_振替休日の日) :- '国民の祝日に関する法律 第三条 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://toro.2ch.net/test/read.cgi/db/1316769778/344 # # MySQL 5.1 使用しています。 # # 出勤カレンダーを作って、工程表を作りたいのですが、出勤日テーブルに # 出勤日テーブルは以下のようにして # # T_出勤日 # # 日にち, 出勤 # ---------------- # 1月5日  ○ # 1月6日  ○ # 1月7日  × # 1月8日  × # 1月9日  ○ # # 「今日」が出勤日(○)として、「今日の前の出勤日からはじめて、 # 今後の出勤日」を抜き出すSQL文はどう書いたらよいのでしょう? # つまり、「今日」が2番目に来るような抜き出し方です。 # 一応、考えたのは # # (SELECT 日にち FROM T_出勤日 WHERE 出勤='○' AND 日にち<DATE() LIMIT 1) # UNION # (SELECT 日にち FROM T_出勤日 WHERE 出勤='○' AND 日にち>=DATE() # ORDER BY 日にち ASC); # # これより簡潔に書けるでしょうか? # '出勤カレンダーを作って、工程表を作りたい。「今日」が出勤日(○)として、「今日の前の出勤日からはじめて、今後の出勤日」を抜き出す'(_今日,[_前回の出勤日,_今日|_今後の出勤日ならび]) :- findall(_日にち,( 'T_出勤'(_日にち,○)), L1), sort(L1,L2), append(_,[_前回の出勤日,_今日|_今後の出勤日ならび],L2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/174 # # [1] 授業単元:文字列 # [2] 問題文(含コード&リンク): # 入力した時間と分を長針と短針で示す # アナログ時計を作れ。 # 長針の長さ(200). 単身の長さ(140). 中心X座標(240). 中心Y座標(240). アナログ時計(_時,_分) :- _時_1 is _時 mod 12, アナログ時計描画(_時_1,_分). アナログ時計描画(_時,_分) :- 時分をラジアン角度で表現する(_時,_分,_ラジアン角度_時,_ラジアン角度_分), 長針の長さ(_長針の長さ), 短針の長さ(_短針の長さ), グラフィック描画(_中心X座標,_中心Y座標,_長針の長さ,_短針の長さ,_ラジアン角度_分,_ラジアン角度_時). 時分をラジアン角度で表現する(_時,_分,_ラジアン角度_時,_ラジアン角度_分) :- _ラジアン角度_時 is 2 * pi * ( 1 - _時 / 12) + pi / 2, _ラジアン角度_分 is 2 * pi * ( 1 - _分 / 60) + pi / 2. グラフィック描画(_中心X座標,_中心Y座標,_長針の長さ,_短針の長さ,_長針の角度,_短針の角度) :- newpath, 時計の円周装飾を描画(_中心X座標,_中心Y座標,_半径), 長針の描画(_中心X座標,_中心Y座標,_長針の長さ,_長針の角度), 短針の描画(_中心X座標,_中心Y座標,_短針の長さ,_短針の角度), showpage. 長針の描画(_中心X座標,_中心Y座標,_長針の長さ,_長針の角度) :- moveto(_中心X座標,_中心Y座標), X_1 is truncate(_長針の長さ * cos(_長針の角度)), Y_1 is truncate(_長針の長さ * sin(_長針の角度)), setlinewidth(3), rlineto(X_1,Y_1), stroke. 短針の描画(_中心X座標,_中心Y座標,_短針の長さ,_短針の角度) :- moveto(_中心X座標,_中心Y座標), X_2 is truncate(_短針の長さ * cos(_短針の角度)), Y_2 is truncate(_短針の長さ * sin(_短針の角度)), setlinewidth(3), rlineto(X_2,Y_2), stroke. 時計の円周装飾を描画(_中心X座標,_中心Y座標,_半径) :- setlinewidth(1), arc(_中心X座標,_中心Y座標,_半径,0,360), stroke. %%%%%%% ポストスクリプト述語 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% pswr(G,X) :- pswr_2(G,X),!. pswr(P) :- functor(P,F,A), pswr_1(1,A,P,L1,L2), ( L1=[], G0=''; not(L1=[]), concat_atom(L1,' ',G0) ), concat_atom([G0,' ',F,'\n'],G1), pswr_2(G1,L2),!. pswr_1(N,A,_,[],[]) :- N>A,!. pswr_1(N,E,P,['%t'|R1],[X|R2]) :- arg(N,P,X), M is N+1, pswr_1(M,E,P,R1,R2). pswr_2(G,L) :- telling(user), e_printf(G,L),!. pswr_2(G,L) :- telling(screen), fopen('temp.ps','a+',F), sprintf(G,L,S), fputs(S,F), fclose(F),!. pswr_2(G,L) :- write_formatted(G,L). pstell(F) :- slush_op(F,F1), tell(F1), write('%!'), write('Adobe-PS'),nl,!. arc(_中心X座標,_中心Y座標,_半径,_開始角度,_弧角度) :- _中心X座標の二 is _中心X座標, _中心Y座標の二 is _中心Y座標, stroke, pswr(arc(_中心X座標の二,_中心Y座標の二,_半径,_開始角度,_弧角度)),!. save :- pswr(' /saveobj save def\n'),!. restore :- pswr(' saveobj restore\n'),!. stroke :- pswr(stroke),!. closepath :- pswr(closepath),!. setrgbcolor(Red,Green,Blue) :- pswr(setrgbcolor(Red,Green,Blue)),!. sethsbcolor(Hue,Saturation,Brightness) :- pswr(sethsbcolor(Hue,Saturation,Brightness)),!. setlinewidth(N) :- pswr(setlinewidth(N)),!. rlineto(X,Y) :- X1 is X, Y1 is Y, pswr(rlineto(X1,Y1)),!. lineto(X,Y) :- X1 is X, Y1 is Y, pswr(lineto(X1,Y1)),!. curveto([]) :- !. curveto([A|R]) :- not(list(A)), concat([A|R],' ',L), wr(' %t curveto\n',[L]),!. curveto([[X1,Y1,X2,Y2,X3,Y3]|R]) :- curveto(X1,Y1,X2,Y2,X3,Y3), curveto(R),!. curveto([[X1,Y1]|R]) :- flat([[X1,Y1]|R],L), curveto(L),!. curveto(X1,Y1,X2,Y2,X3,Y3) :- pswr(curveto(X1,Y1,X2,Y2,X3,Y3)),!. rcurveto([]) :- !. rcurveto([A|R]) :- not(list(A)), concat([A|R],' ',L), wr(' %t rcurveto\n',[L]),!. rcurveto([[X1,Y1,X2,Y2,X3,Y3]|R]) :- rcurveto(X1,Y1,X2,Y2,X3,Y3), rcurveto(R),!. rcurveto([[X1,Y1]|R]) :- flat([[X1,Y1]|R],L), rcurveto(L),!. rcurveto(X1,Y1,X2,Y2,X3,Y3) :- pswr(rcurveto(X1,Y1,X2,Y2,X3,Y3)),!. setdash([],Y) :- pswr(setdash([],Y)),!. setdash([A|R],Y) :- concat([A|R],' ',X0), concat(['[',X0,']'],X), pswr(setdash(X,Y)),!. setdash(X,Y) :- pswr(setdash(X,Y)),!. setlinecap(X) :- pswr(setlinecap(X)),!. setlinejoin(X) :- pswr(setlinejoin(X)),!. matrix :- pswr(matrix),!. setmatrix(Matrix) :- flat(Matrix,FlatMatrix), concat(FlatMatrix,' ',X0), concat(['[',X0,']'],X), pswr(setdash(X,Y)),!. setscreen(Frequency,Angle,Proc) :- pswr(setscreen(Frequency,Angle,Proc)),!. stroke :- pswr(stroke),!. moveto(X+X1,Y+Y1) :- var(X), var(Y), integer(X1), integer(Y1), pswr('currentpoint exch \n'), concat([X1,' add exch'],S), pswr(S), concat([Y1,' add moveto\n'],S2), pswr(S2),!. moveto(X+X1,Y) :- var(X), integer(X1), var(Y), pswr('currentpoint exch \n'), concat([X1,' add exch moveto'],S), pswr(S),!. moveto(X,Y+Y1) :- var(X), integer(Y1), var(Y), pswr('currentpoint \n'), concat([Y1,' add moveto'],S), pswr(S),!. moveto(X,Y) :- var(X), Y1 is Y, pswr('currentpoint pop \n'), pswr(moveto(Y1)),!. moveto(X,Y) :- var(Y), X1 is X, concat([X1,' exch moveto'],S), pswr('currentpoint exch pop \n'), pswr(S),!. moveto(X,Y) :- X1 is X, Y1 is Y, pswr(moveto(X1,Y1)),!. showpage :- pswr(showpage),!. copypage :- pswr(copypage),!. erasepage :- pswr(erasepage),!. fill :- pswr(fill),!. ps2pdf(FO) :- concat(['/usr/local/Adobe/Acrobat7.0/bin/acroread ',FO2],S), system(S),!. newpath :- pswr(newpath),!. xpos(Y) :- Y1 is Y, pswr('/xpos %d def\n',[Y1]),!. ypos(Y) :- Y1 is Y, pswr('/ypos %d def\n',[Y1]),!. image(_スキャン長,_スキャンライン数,_ビット数,_変換配列,_16進数ならび文字列) :- sprintf('[%t %t %t %t %t %t]',_変換配列,_変換配列文字列), sprintf(' %t %t %t %t {<%t>} image ',[_スキャン長,_スキャンライン数,_ビット数,_変換配列文字列,_16進数ならび文字列],S), pswr(S),!. scale(X,Y) :- X1 is X, Y1 is Y, pswr(scale(X,Y)),!. translate(X,Y) :- X1 is X, Y1 is Y, pswr(translate(X1,Y1)),!. rotate(R) :- R1 is R, pswr(rotate(R1)),!. p_point(X,Y) :- X1 is X, Y1 is Y, moveto(X1,Y1), rlineto(1,0), stroke,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/853 # # [1] 授業単元:プログラミング基礎 # [2] 問題文(含コード&リンク):(列挙体) # Sunday, Monday, Tuesday, Wednesday, Thursday, # Friday, Saturday という曜日を表す列挙体 # enum Days を定義せよ.以下の実行例のように, # 曜日を入力すると,enum Days の列挙定数を利用して # 週末,平日,それ以外の場合にそれぞれメッセージを # 表示するプログラムを作成せよ. # 例 % ./q3-3 # 曜日を入力して下さい # (0:日1:月2:火3:水4:木5:金6:土):0 # やった!週末だ # # 曜日を入力して下さい # (0:日1:月2:火3:水4:木5:金6:土):5 # 今日も講義頑張ろう! # # 曜日を入力して下さい # (0:日1:月2:火3:水4:木5:金6:土):7 # この日はないぞう... # 曜日([日,月,火,水,木,金,土]). '曜日を入力すると,曜日 の列挙定数を利用して 週末,平日,それ以外の場合にそれぞれメッセージを表示する' :- 曜日を入力すると(_曜日), '曜日 の列挙定数を利用して 週末,平日,それ以外の場合にそれぞれメッセージを'(_曜日,_メッセージ), 表示する'(_メッセージ),!. 曜日を入力すると(_曜日) :- write('曜日を入力してください [日,月,火,水,木,金,土] : '), get_line(_曜日),!. '曜日 の列挙定数を利用して 週末,平日,それ以外の場合にそれぞれメッセージを'(_曜日,週末は一家揃って中央競馬) :- 曜日から曜日番号を得る(_曜日,_曜日番号), 週末だ(_曜日番号),!. '曜日 の列挙定数を利用して 週末,平日,それ以外の場合にそれぞれメッセージを'(_曜日,平日も一家揃って公営競馬) :- 曜日から曜日番号を得る(_曜日,_曜日番号), 平日だ(_曜日番号),!. '曜日 の列挙定数を利用して 週末,平日,それ以外の場合にそれぞれメッセージを'(_曜日,_メッセージ) :- atomic_list_concat(['入力された ',_曜日,' は 日,月,火,水,木,金,土 のいずれでもありません],_メッセージ),!. 曜日から曜日番号を得る(_曜日,_曜日番号), 曜日(_曜日ならび), nth0(_曜日番号,_曜日ならび,_曜日). 週末だ(_曜日番号) :- 0 is _曜日番号 mod 6. 平日だ(_曜日番号) :- \+(0 is _曜日番号 mod 6). 表示する(_メッセージ) :- writef('%t\n',[_メッセージ]). % 以下のサイトは # http://http://stackoverflow.com/questions/7569337/ # 私は次のようなプロローグが割り当てられています。 # # ピーターは、天気予報によると週末は何をするかを決めます。 # # これは、入手可能な情報です:土曜日は晴れになる、日曜日は不確実になります。 # それが晴れた場合は常に、ピーターは、ビーチに行く。それは雨の時はいつでも # 彼は自宅にとどまります。天候が不確かなとき、それは日によって異なります。 # 土曜日は彼が彼が彼の家族と散歩に行く日曜日、映画館に行くのプロローグで、 # 前の文を表す。 # 以下の質問に答えることができる # ピーターは次何をしますか? # 土曜日は? # ピーターは次日曜日に家 # 天候(土曜日,晴れ). 天候(日曜日,不確実). ピーターは(晴れ,_,ビーチに行く). ピーターは(雨,_,自宅にとどまる). ピーターは(不確実,土曜日,家族と散歩に行く). ピーターは(不確実,日曜日,映画館に行く). ピーターは何をする(_曜日,_何をする) :- 天候(_曜日,_天候), ピーターは(_天候,_曜日,_何をする). % この解答では「述語定義に於いては関数部分に何が来るかなどにあまり % 拘る必要はない」ということを暗に示している。この例では、文法的には % 述語が来そうな位置を主格が占めている。関数・引数全体で題意が伝わる % ようにのびのびと自由に表現すればよい。 % 以下のサイトは # 出典:: 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,土曜). % 以下のサイトは # もう一度。テーブルtableにキーAの列とキーBの列がある。 # キーBは時系列で、例えば2011年5月6日なら20110506みたいな感じ。 # 昨日なら20110505だな。つまりプライマリではある。 # こいつをキーA毎に上位5つずつ抜き出したデータテーブル(VIEW)を作りたい # 曜日ごとに、日付の早い順5tuplesをとりだす。 # # 曜日(金曜,'20110401'). # 曜日(月曜,'20110404'). # 曜日(火曜,'20110405'). # 曜日(水曜,'20110406'). # 曜日(金曜,'20110408'). # 曜日(土曜,'20110409'). # 曜日(月曜,'20110411'). # 曜日(火曜,'20110412'). # 曜日(木曜,'20110414'). # 曜日(金曜,'20110415'). # 曜日(土曜,'20110416'). # 曜日(日曜,'20110417'). # 曜日(月曜,'20110418'). # 曜日(火曜,'20110419'). # 曜日(木曜,'20110421'). # 曜日(金曜,'20110422'). # 曜日(土曜,'20110423'). # 曜日(月曜,'20110425'). # 曜日(火曜,'20110426'). # 曜日(水曜,'20110427'). # 曜日(木曜,'20110428'). # 曜日(日曜,'20110501'). # 曜日(月曜,'20110502'). # 曜日(火曜,'20110503'). # 曜日(水曜,'20110504'). # 曜日(木曜,'20110505'). # 曜日(土曜,'20110507'). # 曜日(日曜,'20110508'). # 曜日(月曜,'20110509'). # 曜日(火曜,'20110510'). # 曜日(金曜,'20110513'). # 曜日(土曜,'20110514'). # 曜日(日曜,'20110515'). # 曜日(火曜,'20110517'). # 曜日(水曜,'20110518'). # 曜日(木曜,'20110519'). # 曜日(日曜,'20110522'). # 曜日(月曜,'20110523'). # 曜日(火曜,'20110524'). # 曜日(水曜,'20110525'). # 曜日(木曜,'20110526'). # 曜日(金曜,'20110527'). # 曜日(土曜,'20110528'). # 曜日(日曜,'20110529'). # 曜日(月曜,'20110530'). # 曜日(火曜,'20110531'). 曜日ごとの最初の五つの日付(_曜日,_最初の五つの日付ならび) :- eachsetof(_曜日,曜日(_曜日,_日付),_曜日_1), setof(_日付_1,曜日(_曜日_1,_日付_1),L), limit_n(5,L,_最初の五つの日付ならび). %%%% 汎用述語(ユーザ定義) %%%% limit_n(N,L,_limit_n_L) :- length(L,Len), Len < N, L = _limit_n_L),!. limit_n(N,L,_limit_n_L) :- length(_limit_n_L,N), append(_limit_n_L,_,L). eachsetof(A,B,E) :- findsetof(A,B,L), append(_,[E|_],L). findsetof(A,B,L) :- findall(A,B,C), setof(A,member(A,C),L). % 以下のサイトは # 出典:: 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/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/747 # # [1] 授業単元:C言語 # [2] # 1.コピー元のファイル名とコピー先のファイル名を指定すると、ファイルの内容をコピーするプログラムを作成せよ。コピー元のファイルが存在しない場合と、コピー先が存在する場合は、その旨のメッセージを表示し処理を中止するようにせよ。 # 例:mycopysource.txt dest.txt # →source.txtの内容がdest.txtにコピーされる。 # 2.コマンドラインでファイル名、年、月を指定し、そのファイルにその年・月のカレンダーを出力するプログラムを作成せよ。 # 例:calendar cal1012.txt 2010 12 # →ファイルcal1012.txt に2010年12月のカレンダーを出力する(このファイルも添付して提出すること) # program :- user_parameters([_コピー元のファイル名,_コピー先のファイル名]), ファイルの内容をコピー(_コピー元のファイル名,_コピー先のファイル名). ファイルの内容をコピー(_コピー元のファイル名,_コピー先のファイル名) :- 読み出し可能(_コピー元のファイル名), 書き出し可能(_コピー先のファイル名), open(_コピー先のファイル名,read,Instream,[type(binary)]), open(_コピー先のファイル名,write,Outstream,[type(binary)]), get_byte(Instream,Code), ファイルの内容をコピー(Instream,Outstream,Code), close(Outstream), close(Instream),!. ファイルの内容をコピー(_コピー元のファイル名,_コピー先のファイル名). 読み出し可能(_コピー元のファイル名) :- get_file_info(_コピー元のファイル名,_), file_test(_コピー元のファイル名,read),!. 読み出し可能(_コピー元のファイル名) :- \+(get_file_info(_コピー元のファイル名,_)), write('コピー元のファイル %t が存在しません。\n',[_コピー元のファイル名]),!, faii. 読み出し可能(_コピー元のファイル名) :- get_file_info(_コピー元のファイル名,_), write('コピー元のファイル %t は存在しますが読み出し不能です。\n',[_コピー元のファイル名]),!, fail. 書き出し可能(_コピー先のファイル名) :- get_file_info(_コピー先のファイル名,_),!, write_formatted('コピー先のファイル %t は既に存在するため作業を中止します。\n',[_コピー先のファイル名]),!, fail. 書き出し可能(_コピー先のファイル名) :- \+(get_file_info(_コピー先のファイル名,_)), file_test(_コピー先のファイル名,write),!. 書き出し可能(_コピー先のファイル名) :- write_formatted('コピー先のファイル パス %t が存在しません。\n',[_コピー先のファイル名]),!, fail. ファイルの内容をコピー(Instream,Outstream,-1) :- !. ファイルの内容をコピー(Instream,Outstream,Code) :- put_byte(Outstream,Code), get_byte(Instream,Code2), ファイルの内容をコピー(Instream,Outstream,Code2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/635 # # 宜しくお願いします。 # # ・DBMS名とバージョン # Oracle10g # # ・テーブルデータ # SALES # +------------+------+ # | 日時 | 数量 | # +------------+------+ # | 2010/03/01 | 1 | # | 2010/03/02 | 1 | # | 2010/03/23 | 2 | # | 2010/03/24 | 1 | # | 2010/04/05 | 5 | # | 2010/04/05 | 2 | # +------------+------+ # # ・欲しい結果 # テーブルから週毎(月曜基準)に合算した数量を取得したい。 # 但しデータがない週も0で表示したい。 # # ・説明 # 週毎に合算した数量は以下のSQLで取得できましたが、 # データがない週も表示する方法がわかりません。 # # SELECT NEXT_DAY(TO_DATE(日時,'yyyy/mm/dd'),2)-7 AS 日時, SUM(数量) # FROM SALES # GROUP BY NEXT_DAY(TO_DATE(日時,'yyyy/mm/dd'),2)-7; # # 宜しくお願い致します。 'テーブルから週毎(月曜基準)に合算した数量を取得したい。但しデータがない週も0で表示したい。'(_週区間下限,_週区間上限,_数量合計) :- 週グループを生成(_週区間ならび), 週区間ごとに数量を合計する(_週区間ならび,_週合計ならび), append(_,[[_週区間下限,_週区間上限,_数量合計]|R],_集合計ならび). 週グループを生成(_週区間ならび) :- findmin(_日時,'SALES'(_日時,_),_日付下限), findmax(_日時,'SALES'(_日時,_),_日付上限), 最も直前の月曜日(_日付下限,_日付下限の一), 最も直前の月曜日(_日付上限,_日付上限の一), findall([_月曜日,_直後の日曜日],( 週の切り取り(_日付下限の一,_月曜日,_日付上限の一), 直後の日曜日(_月曜日,_直後の日曜日)), _週区間ならび), length(_週区間ならび,Len),!. 週区間ごとに数量を合計する([],[]) :- !. 週区間ごとに数量を合計する([[_週区間下限,_週区間上限]|R1],[[_週区間下限,_週区間上限,_数量合計]|R2]) :- findsum(_数量,( 'SALES'(_日時,_数量),_数量合計), _日時 @>= _週区間下限, _日時 @=< _週区間上限), _数量合計), 週区間ごとに数量を合計する(R1,R2). 週の切り取り(_月曜日,_月曜日,_日付上限) :- _月曜日 @=< _日付上限. 週の切り取り(_月曜日の一,_月曜日,_日付上限) :- 直後の月曜日(_月曜日の一,_直後の月曜日), 週の切り取り(_直後の月曜日,_月曜日,_日付上限). % 以下のサイトは # 出典:: 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://pc12.2ch.net/test/read.cgi/tech/1197620454/581 # # 問題4:1月1日が金曜日の平年(たとえば2010年)について、月日の入力データから、曜日を求めるプログラム。 # (実行結果例) # 月を入力してください:9 # 日を入力してください:15 # 9月15日は、水曜日です。 # # 以上4問です。どうか回答よろしくお願い致します # '1月1日が金曜日の平年(たとえば2010年)について、月日の入力データから、曜日を求める' :- 曜日番号(_曜日番号_1,金曜), write('任意の月日を月と日を空白で区切り入力してください : '), get_split_line(Line,[' '],[_月,_日]), findall([_月_1,_日数_1],(平年の月は何日あるか(_月_1,_日数_1),_月_1 =< _月),L), 前月までの日数の合計は(L,0,_前月までの日数の合計), _曜日番号 is (_前月までの日数の合計 + _日 + (_曜日番号_1 - 1)) mod 7, 曜日番号(_曜日番号,_曜日), write_formatted('%t月%t日は、%tです。\n',[_月,_日,_曜日]). 平年の月は何日あるか(1,31). 平年の月は何日あるか(2,28). 平年の月は何日あるか(3,31). 平年の月は何日あるか(4,30). 平年の月は何日あるか(3,31). 平年の月は何日あるか(4,30). 平年の月は何日あるか(5,31). 平年の月は何日あるか(6,30). 平年の月は何日あるか(7,31). 平年の月は何日あるか(8,31). 平年の月は何日あるか(9,30). 平年の月は何日あるか(10,31). 平年の月は何日あるか(11,30). 平年の月は何日あるか(12,31). 前月までの日数の合計は([_],_前月までの日数の合計,_前月までの日数の合計) :- !. 前月までの日数の合計は([[_,N]|R],S1,S) :- S2 is S1 + N, 前月までの日数の合計は(R,S2,S). 曜日番号(0,日曜). 曜日番号(1,月曜). 曜日番号(2,火曜). 曜日番号(3,水曜). 曜日番号(4,木曜). 曜日番号(5,金曜). 曜日番号(6,土曜). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1280653311/60 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):標準入力から西暦、月、日を表す整数を読み込み、その日が何曜日かを #                判定するプログラムを作成せよ。 #                ※年をy,月をm,日をdとする #                ※曜日はr=( y + y/4 - y/100 + y/400 + (13m+8)/ 5 + d ) % 7 # ※r=0が日曜日、r=1が月曜日・・・・のようになる #                ※ただし1月と2月は前の年の13月、14月として計算する # # '標準入力から西暦、月、日を表す整数を読み込み、その日が何曜日かを 判定する' :- '標準入力から西暦、月、日を表す整数を読み込み、'(_西暦,_月,_日), R is (_西暦 + _西暦 // 4 - _西暦 // 100 + _西暦 // 400 + (13 * _月 + 8) // 5 + _日) mod 7, 曜日番号曜日変換(R,_曜日), write_formatted('%t年%t月%t日 は %t曜日です\n',[_西暦,_月,_日,_曜日]),!. '標準入力から西暦、月、日を表す整数を読み込み、'(_西暦,_月,_日) :- 項目名付き整数入力(西暦,_西暦), 項目名付き整数入力(月,_月), 項目名付き整数入力(日,_日),!. 項目名付き整数入力(_項目名,N) :- write_formatted_atom(_催促表示,'%tを入力してください : ',[_項目名]), 催促付き整数入力(_催促表示,N). 催促付き整数入力(_催促表示,N) :- write(_催促表示), get_line(Line), atom_to_term(Line,N,_), 催促付き整数入力判定(N),!. 催促付き整数入力(_催促表示,N) :- 催促付き整数入力(_催促表示,N). 催促付き整数入力判定(N) :- integer(N),!. 催促付き整数入力判定(N) :- \+(integer(N)), write_formatted('%tは整数ではありません\n',[N]),!, fail. 曜日番号曜日変換(0,日曜). 曜日番号曜日変換(1,月曜). 曜日番号曜日変換(2,火曜). 曜日番号曜日変換(3,水曜). 曜日番号曜日変換(4,木曜). 曜日番号曜日変換(5,金曜). 曜日番号曜日変換(6,土曜). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1280653311/273 # # [1] 授業単元: Cコーディング初級 # [2] 問題文(含コード&リンク): # プログラムを実行した日がその年の第何週目にあるかを終了コードとして整数で返す # 週の頭は日曜から始まります # 1月1日を含む週に4日以上ある場合に第1週となります # つまり1月1日が日曜から始まっているときはその週が第1週ですが # 1月4日が日曜から始まっているときはその週が第1週になります プログラムを実行した日がその年の第何週目にあるかを終了コードとして整数で返す(_何週目) :- _時刻 is time, localtime(_時刻,_,_,_,_曜日番号,_何日目,_,_,_), _最初の日曜日 is (_何日目-_曜日番号) mod 7, '何週目か。1月1日が日曜から始まっているときはその週が第1週ですが1月4日が日曜から始まっているときはその週が第1週になります'(_1月最初の日曜日,_何日目,_曜日番号,_何週目). '何週目か。1月1日が日曜から始まっているときはその週が第1週ですが1月4日が日曜から始まっているときはその週が第1週になります'(_1月最初の日曜日,_何日目,_曜日番号,_何週目) :- 何週目か(_1月最初の日曜日,_何日目,_曜日番号,_何週目). 何週目か(_1月最初の日曜日,_何日目,_曜日番号,0) :- _1月最初の日曜日 > 3, _何日目 < _1月最初の日曜日,!. 何週目か(_1月最初の日曜日,_何日目,_曜日番号,1) :- _1月最初の日曜日 < 4, _何日目 < _1月最初の日曜日,!. 何週目か(_1月最初の日曜日,_何日目,_曜日番号,_何週目) :- _1月最初の日曜日 < 4, _何週目 is (_何日目 - _曜日番号 - _1月最初の日曜日) // 7 + 2,!. 何週目か(_1月最初の日曜日,_何日目,_曜日番号,_何週目) :- _1月最初の日曜日 > 3, _何週目 is (_何日目 - _曜日番号 - _1月最初の日曜日) // 7 + 1,!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/217 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 午前四時から正午までは Good Morning! と、 # 正午から午後八時までは Good Afternoon! と、 # 午後八時から午前四時までは Good Evening! と、表示するプログラムを書け。ただし、境界の時刻は前の時間帯に含まれるものとする # 挨拶 :- '午前四時から正午までは Good Morning! と、正午から午後八時までは Good Afternoon! と、午後八時から午前四時までは Good Evening! と、表示する'. '午前四時から正午までは Good Morning! と、正午から午後八時までは Good Afternoon! と、午後八時から午前四時までは Good Evening! と、表示する' :- _時刻 is time, localtime(_時刻,_年,_月,_日,_曜日番号,_通算日数,_時,_分,_秒), 挨拶を表示する(_時,_分,_秒),!. 挨拶を表示する(_時,_分,_秒) :- [_時,_分,_秒] @> [4,0,0], [_時,_分,_秒] @=< [12,0,0], write(' Good Mornig! \n'). 挨拶を表示する(_時,_分,_秒) :- [_時,_分,_秒] @> [12,0,0], [_時,_分,_秒] @=< [20,0,0], write(' Good Afternoon! \n'). 挨拶を表示する(_時,_分,_秒) :- [_時,_分,_秒] @> [20,0,0], write(' Good Evening! \n'). 挨拶を表示する(_時,_分,_秒) :- [_時,_分,_秒] @=< [4,0,0], write(' Good Evening! \n'). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1267796762/94 # # 【 課題 】※出力結果 # java Kadai3 1 2 3 # わん # にゃー # ぶー # # java Kadai3 2 1 1 # にゃー # わん # わん # # ※条件 # クラスは5つ # 配列を使用 # # 【 形態 】1. Javaアプリケーション(main()で開始)? # 【 GUI  】 # 【 期限 】 火曜日に提出 # 【 Ver  】java version "1.6.0_16" # Java(TM) SE Runtime Environment (build 1.6.0_16-b01) # Java HotSpot(TM) Client VM (build 14.2-b01, mixed mode, sharing) # # 【 補足 】 なんか凄く初歩的で申し訳ない・・ # 自分なりに考えた結果のソースを上げときました # 何か勘違いしてそうですが。 # 何かしら助け舟をくださるとありがたいです。 # よろしくお願いします # # http://ime.nu/rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/969.zip # # 鳴き声('1',わん). 鳴き声('2',にゃー). 鳴き声('3',ぶー). program :- user_parameters(_ユーザ引数ならび), append(_,[_ユーザ引数|R],_ユーザ引数ならび), 鳴き声(_ユーザ引数,_鳴き声), write_formatted('%t\n',[_鳴き声]), R=[]. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/744 # [1]プログラミング演習 # [2]asciiコード表を出力しなさい。(main関数、プロトタイプ宣言、関数定義を全て書くこと。) # [3]windowsでコンパイラはborland C++ 5.5.1、C言語です。 # [4]火曜日まで # # よろしくお願いします。 # asciiコード表 :- asciiコード表先頭見出し, for(0,M,15), 二進数(4,M,[_m1,_m2,_m3,_m4]), write_formatted('%01d%01d%01d%01d %4d ',[_m1,_m2,_m3,_m4,M]), for(0,N,7), asciiコード表行表示(M,N), N = 7, write('\n'), M = 15. asciiコード表先頭見出し :- asciiコード表文字列最大byte長(_asciiコード表文字列最大byte長), _asciiコード表文字列最大byte長_2 is _asciiコード表文字列最大byte長 + 2, for(0,N1,7), 二進数(4,7,[_n1,_n2,_n3,_n4]), asciiコード表先頭見出し_1(_asciiコード表文字列最大byte長_2,N1,_n1,_n2,_n3,_n4), N1 = 7, write('\n'), for(0,N2,7), asciiコード表先頭見出し_2(N2), N1 = 7, write('\n'),!. asciiコード表先頭見出し_1(_欄の枠,N,_n1,_n2,_n3,_n4) :- N >= 0,N =< 1, write_formatted_atom('%01d%01d%01d%01d',[_n1,_n2,_n3,_n4],A), 文字列を欄の中心に据えて表示(_欄の枠,A),!. asciiコード表先頭見出し_1(_,N,_n1,_n2,_n3,_n4) :- N > 1, write_formatted_atom('%01d%01d%01d%01d',[_n1,_n2,_n3,_n4],A), 文字列を欄の中心に据えて表示(8,A),!. asciiコード表先頭見出し_2(N) :- N >= 0,N =< 1, write_formatted_atom('%1d',[N],A), 文字列を欄の中心に据えて表示(35,A),!. asciiコード表先頭見出し_2(N) :- N > 1, write_formatted_atom('%1d',[N],A), 文字列を欄の中心に据えて表示(8,A),!. asciiコード表行表示(M,N) :- M >=0,M =<1, _アスキーコード is 16 * M + N, asciiコード表(_アスキーコード,_,_文字列), 文字列を欄の中心に据えて表示(35,_文字列),!. asciiコード表行表示(M,N) :- M > 1, _アスキーコード is 16 * M + N, asciiコード表(_アスキーコード,_,_文字列), 文字列を欄の中心に据えて表示(8,_文字列),!. 文字列を欄の中心に据えて表示(_欄の桁,_文字列) :- name2(_文字列,L), length(L,_文字列長), _頭部の空白数 is (_欄の桁 - _文字列長) // 2, _尾部の空白数 is (_欄の桁 - _文字列長 - _頭部の空白数), concat_atom(['%',_頭部の空白数,s,'%s%',_尾部の空白数],F), writef(F,[' ',_文字列,' ']),!. asciiコード表文字列最大byte長(_asciiコード表文字列最大byte長) :- findmax(Byte長,(asciiコード表(_,_,_文字列),name(_文字列,L),length(L,Byte長)),_asciiコード表文字列最大byte長). asciiコード表(0,'0x00','NUL(null文字) '). asciiコード表(1,'0x01','SOH(ヘッダ開始)'). asciiコード表(2,'0x02','STX(テキスト開始)'). asciiコード表(3,'0x03','ETX(テキスト終了)'). asciiコード表(4,'0x04','EOT(転送終了)'). asciiコード表(5,'0x05','ENQ(照会)'). asciiコード表(6,'0x06','ACK(受信OK)'). asciiコード表(7,'0x07','BEL(警告)'). asciiコード表(8,'0x08','BS(後退)'). asciiコード表(9,'0x09','HT(水平タブ)'). asciiコード表(10,'0x0a','LF(改行)'). asciiコード表(11,'0x0b','VT(垂直タブ)'). asciiコード表(12,'0x0c','FF(改頁)'). asciiコード表(13,'0x0d','CR(復帰)'). asciiコード表(14,'0x0e','SO(シフトアウト)'). asciiコード表(15,'0x0f','SI(シフトイン)'). asciiコード表(16,'0x10','DLE(データリンクエスケープ)'). asciiコード表(17,'0x11','DC1(装置制御1)'). asciiコード表(18,'0x12','DC2(装置制御2)'). asciiコード表(19,'0x13','DC3(装置制御3)'). asciiコード表(20,'0x14','DC4(装置制御4)'). asciiコード表(21,'0x15','NAK(受信失敗)'). asciiコード表(22,'0x16','SYN(同期)'). asciiコード表(23,'0x17','ETB(転送ブロック終了)'). asciiコード表(24,'0x18','CAN(とりけし)'). asciiコード表(25,'0x19','EM(メディア終了)'). asciiコード表(26,'0x1a','SUB(置換)'). asciiコード表(27,'0x1b','ESC(エスケープ)'). asciiコード表(28,'0x1c','FS(フォーム区切り)'). asciiコード表(29,'0x1d','GS(グループ区切り)'). asciiコード表(30,'0x1e','RS(レコード区切り)'). asciiコード表(31,'0x1f','US(ユニット区切り)'). asciiコード表(32,'0x20','(スペース)'). asciiコード表(33,'0x21',!). asciiコード表(34,'0x22','"'). asciiコード表(35,'0x23',#). asciiコード表(36,'0x24',$). asciiコード表(37,'0x25','%'). asciiコード表(38,'0x26','&'). asciiコード表(39,'0x27',''''). asciiコード表(40,'0x28','('). asciiコード表(41,'0x29',')'). asciiコード表(42,'0x2a',*). asciiコード表(43,'0x2b',+). asciiコード表(44,'0x2c',','). asciiコード表(45,'0x2d',-). asciiコード表(46,'0x2e','.'). asciiコード表(47,'0x2f',/). asciiコード表(48,'0x30','0'). asciiコード表(49,'0x31','1'). asciiコード表(50,'0x32','2'). asciiコード表(51,'0x33','3'). asciiコード表(52,'0x34','4'). asciiコード表(53,'0x35','5'). asciiコード表(54,'0x36','6'). asciiコード表(55,'0x37','7'). asciiコード表(56,'0x38','8'). asciiコード表(57,'0x39','9'). asciiコード表(58,'0x3a',:). asciiコード表(59,'0x3b',;). asciiコード表(60,'0x3c',<). asciiコード表(61,'0x3d',=). asciiコード表(62,'0x3e',>). asciiコード表(63,'0x3f',?). asciiコード表(64,'0x40',@). asciiコード表(65,'0x41','A'). asciiコード表(66,'0x42','B'). asciiコード表(67,'0x43','C'). asciiコード表(68,'0x44','D'). asciiコード表(69,'0x45','E'). asciiコード表(70,'0x46','F'). asciiコード表(71,'0x47','G'). asciiコード表(72,'0x48','H'). asciiコード表(73,'0x49','I'). asciiコード表(74,'0x4a','J'). asciiコード表(75,'0x4b','K'). asciiコード表(76,'0x4c','L'). asciiコード表(77,'0x4d','M'). asciiコード表(78,'0x4e','N'). asciiコード表(79,'0x4f','O'). asciiコード表(80,'0x50','P'). asciiコード表(81,'0x51','Q'). asciiコード表(82,'0x52','R'). asciiコード表(83,'0x53','S'). asciiコード表(84,'0x54','T'). asciiコード表(85,'0x55','U'). asciiコード表(86,'0x56','V'). asciiコード表(87,'0x57','W'). asciiコード表(88,'0x58','X'). asciiコード表(89,'0x59','Y'). asciiコード表(90,'0x5a','Z'). asciiコード表(91,'0x5b','['). asciiコード表(92,'0x5c',\). asciiコード表(93,'0x5d',']'). asciiコード表(94,'0x5e',^). asciiコード表(95,'0x5f','_'). asciiコード表(96,'0x60',`). asciiコード表(97,'0x61',a). asciiコード表(98,'0x62',b). asciiコード表(99,'0x63',c). asciiコード表(100,'0x64',d). asciiコード表(101,'0x65',e). asciiコード表(102,'0x66',f). asciiコード表(103,'0x67',g). asciiコード表(104,'0x68',h). asciiコード表(105,'0x69',i). asciiコード表(106,'0x6a',j). asciiコード表(107,'0x6b',k). asciiコード表(108,'0x6c',l). asciiコード表(109,'0x6d',m). asciiコード表(110,'0x6e',n). asciiコード表(111,'0x6f',o). asciiコード表(112,'0x70',p). asciiコード表(113,'0x71',q). asciiコード表(114,'0x72',r). asciiコード表(115,'0x73',s). asciiコード表(116,'0x74',t). asciiコード表(117,'0x75',u). asciiコード表(118,'0x76',v). asciiコード表(119,'0x77',w). asciiコード表(120,'0x78',x). asciiコード表(121,'0x79',y). asciiコード表(122,'0x7a',z). asciiコード表(123,'0x7b','{'). asciiコード表(124,'0x7c','|'). asciiコード表(125,'0x7d','}'). asciiコード表(126,'0x7e',~). asciiコード表(127,'0x7f','DEL(削除)'). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% name2(X,Y) :- atom(X), strlen(X,Len), findall(N,(for(1,M,Len) , char_code1(X,M,N1) , (N1 < 0 , N is N1 + 256 ; N1 >= 0 , N = N1)),Y),!. name2(A,[N]) :- atomic(A), name(A,[N]),!. name2(A,L) :- var(A), name21(L,L2), atom_codes(A,L2),!. name21([],[]) :- !. name21([N1,N2|R],[N|R2]) :- N1 > 127, N2 > 127, N is N1 * 256 + N2, name21(R,R2),!. name21([N1,N2|R],[N|R2]) :- N1 > 127, N2 < 128, N is N1 * 256 + N2, name21(R,R2),!. name21([N1|R],[N1|R2]) :- name21(R,R2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1267796762/38 # # 【 課題 】 http://ime.nu/rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/958.txt # 月〜土までの時間割を多次元配列を用い作成する。その後出力をする。 # なお作成にはメソッドを複数使用し、クラスは1つだけとする。 # '月〜土'([月曜,火曜,水曜,木曜,金曜,土曜]). '月〜土までの時間割を多次元配列を用い作成する。その後出力をする。' :- '月〜土'(_曜日ならび), '月〜土までの時間割を多次元配列を用い作成する。'(_曜日ならび,_時間割), 'その後出力する。'(_曜日ならび,_時間割). '月〜土までの時間割を多次元配列を用い作成する。'([],[]) :- !. '月〜土までの時間割を多次元配列を用い作成する。'([_曜日|R1],[_曜日ごとの時間割|R2]) :- write_formatted('%t日の時限数を入力してください : ',[_曜日]),get_integer(_時限数), write_formatted('%t時限の教科名を順に入力してください\n',[N]), 時限ごとの教科名の入力(1,_時限数,_曜日ごとの時間割), '月〜土までの時間割を多次元配列を用い作成する。'(R1,R2). 時限ごとの教科名の入力(N,_時限数,[]) :- N > _時限数,!. 時限ごとの教科名の入力(N,_時限数,[_教科名|R]) :- write_formatted('%t時限目 : ',[_教科名]),get_line(_教科名), N2 is N + 1, 時限ごとの教科名の入力(N2,_時限数,R). 'その後出力する'([],[]) :- !. 'その後出力する'([_曜日|R1],[L|R2]) :- length(L,_時限数), concat_atom(L,',',_教科名ならび文字列), write_formatted('%t日 : %t時間 %t\n',[_曜日,_時限数,_教科名ならび文字列]), 'その後出力する'(R1,R2). % 以下のサイトは # 出典:: 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/1200175247/672 # # よろしくお願いします # [1] 授業単元:関数の復習と応用 # [2] 問題文(含コード&リンク):() # 曜日計算をします。曜日を2つ入力してください。 # 曜日1:水曜 # 曜日2:木曜 # # 水曜 + 木曜 = 日曜 t789 :- write('曜日を二つ入力します\n曜日1: '), get_line(_曜日1), 曜日番号(_曜日1,_曜日番号1), write('曜日2: '), get_line(_曜日2), 曜日番号(_曜日2,_曜日番号2), _曜日番号 is (_曜日番号1 + _曜日番号2) mod 7, 曜日番号(_曜日,_曜日番号), write_formatted('%t + %t = %t\n',[_曜日1,_曜日2,_曜日]). 曜日番号(日曜,0). 曜日番号(月曜,1). 曜日番号(火曜,2). 曜日番号(水曜,3). 曜日番号(木曜,4). 曜日番号(金曜,5). 曜日番号(土曜,6). % 第二案 t789 :- write('曜日を二つ入力します\n曜日1: '), get_line(_曜日1), write('曜日2: '), get_line(_曜日2), 曜日加算(_曜日1,_曜日2,_曜日), write_formatted('%t + %t = %t\n',[_曜日1,_曜日2,_曜日]). 曜日加算(_曜日1,_曜日2,_曜日) :- L = [日曜,月曜,火曜,水曜,木曜,金曜,土曜], append(L1,[_曜日2|_],L), append(L,L1,L2), 曜日加算(L2,_曜日1,L2,_曜日2,_曜日). 曜日加算([_曜日1|R1],_曜日1,L2,_曜日2,_曜日) :- 曜日加算の二([_曜日1|R1],L2,_曜日2,_曜日). 曜日加算([Y|R1],_曜日1,L2,_曜日2,_曜日) :- 曜日加算(R1,_曜日1,L2,_曜日2,_曜日). 曜日加算の二([_曜日X|_],[_曜日2|_],_曜日2,_曜日). 曜日加算の二([_|R1],[Y|R2],_曜日2,_曜日) :- 曜日加算の二(R1,R2,_曜日2,_曜日). % 以下のサイトは :- nonotify. :- op(850,fx,(^)). ( ^ P) :- wr('%%/%q. ',[P]). pswr(G,X) :- pswr_2(G,X),!. pswr(P) :- functor(P,F,A), pswr_1(1,A,P,L1,L2), ( L1=[], G0=''; not(L1=[]), concat_atom(L1,' ',G0) ), concat_atom([G0,' ',F,'\n'],G1), pswr_2(G1,L2),!. pswr_1(N,A,_,[],[]) :- N>A,!. pswr_1(N,E,P,['%t'|R1],[X|R2]) :- arg(N,P,X), M is N+1, pswr_1(M,E,P,R1,R2). pswr_2(G,L) :- telling(user), e_printf(G,L),!. pswr_2(G,L) :- telling(screen), fopen('temp.ps','a+',F), sprintf(G,L,S), fputs(S,F), fclose(F),!. pswr_2(G,L) :- write_formatted(G,L). pstell(F) :- slush_op(F,F1), tell(F1), write('%!'), write('Adobe-PS'),nl,!. acroread実行ファイル('/usr/local/Adobe/Acrobat7.0/bin/acroread'). newpath :- pswr(newpath),!. xpos(Y) :- Y1 は Y, pswr('/xpos %d def\n',[Y1]),!. ypos(Y) :- Y1 は Y, pswr('/ypos %d def\n',[Y1]),!. image(_スキャン長,_スキャンライン数,_ビット数,_変換配列,_16進数ならび文字列) :- sprintf('[%t %t %t %t %t %t]',_変換配列,_変換配列文字列), sprintf(' %t %t %t %t {<%t>} image ',[_スキャン長,_スキャンライン数,_ビット数,_変換配列文字列,_16進数ならび文字列],S), pswr(S),!. scale(X,Y) :- X1 は X, Y1 は Y, pswr(scale(X,Y)),!. translate(X,Y) :- X1 は X, Y1 は Y, pswr(translate(X1,Y1)),!. rotate(R) :- R1 は R, pswr(rotate(R1)),!. p_point(X,Y) :- X1 は X, Y1 は Y, moveto(X1,Y1), rlineto(1,0), stroke,!. helvetica(Style) :- asciiフォント名変換(helvetica,Style,_フォント名) , 一時asciiフォント名(_フォント名) , (!) . times(Style) :- asciiフォント名変換(times,Style,_フォント名) , 一時asciiフォント名(_フォント名) , (!) . courier(Style) :- asciiフォント名変換(courier,Style,_フォント名) , 一時asciiフォント名(_フォント名) , (!) . asciiフォント名変換(Name,[],_フォント名) :- atomic_length(Name,Len1) , Len2 is Len1 - 1 , subatomic(Name,1,1,A1) , subatomic(Name,2,Len2,A2) , to_upper(A1,A11), concat([A11,A2],_フォント名) , (!) . asciiフォント名変換(Name,Style,_フォント名) :- atomic_length(Name,Len1) , Len2 is Len1 - 1 , atomic_length(Style,Len3) , Len4 is Len3 - 1 , subatomic(Name,1,1,A1) , subatomic(Name,2,Len2,A2) , subatomic(Style,1,1,B1) , subatomic(Style,2,Len4,B2) , to_upper(A1,A11), to_upper(B1,B11), concat([A11,A2,(-),B11,B2],_フォント名) , (!) . to_upper(A,B) :- atomic_length(A,Len), findall(Y, ( for(1,N,Len), subatomic(A,N,1,X), char_code(X,C), ( ( C > 96, C < 123 ), C2 is C-32, char_code(Y,C2); ((C<97);(C>122)), char_code(Y,C) ) ),L), concat_atom(L,B),!. 明朝 :- 一時全角フォント名(明朝), 一時半角フォント名(明朝),!. ゴチック :- 一時全角フォント名(ゴチック), 一時半角フォント名(ゴチック), 一時asciiフォント名('Helvetica-Bold'),!. 一時全角フォント名(明朝) :- get_global(印刷端末文字コード,euc), pswr('/tzfont { /%t } def\n',['Ryumin-Light-78-EUC-H']),!. 一時全角フォント名(明朝) :- get_global(印刷端末文字コード,sjis), pswr('/tzfont { /%t } def\n',['Ryumin-Light-83pv-RKSJ-H']),!. 一時全角フォント名(ゴチック) :- get_global(印刷端末文字コード,euc), pswr('/tzfont { /%t } def\n',['GothicBBB-Medium-78-EUC-H']),!. 一時全角フォント名(ゴチック) :- get_global(印刷端末文字コード,sjis), pswr('/tzfont { /%t } def\n',['GothicBBB-Medium-83pv-RKSJ-H']),!. 一時全角フォント名(_フォント名) :- pswr('/tzfont { /%t } def\n',[_フォント名]),!. 一時半角フォント名(明朝) :- pswr('/thfont { /%t } def\n',['Ryumin-Light.Hankaku']),!. 一時半角フォント名(ゴチック) :- pswr('/thfont { /%t } def\n',['GothicBBB-Medium.Hankaku']),!. 一時半角フォント名(_フォント名) :- pswr('/thfont { /%t } def\n',[_フォント名]),!. 一時asciiフォント名('Times-Roman') :- pswr('/tafont { /%t } def\n',['Times-Roman']),!. 一時asciiフォント名(_フォント名) :- pswr('/tafont { /%t } def\n',[_フォント名]),!. 一時改行定義(_改行名) :- pswr('/tnl { %t } def\n',[_改行名]),!. 一時全角定義(_サイズ) :- integer(_サイズ), concat([zenkaku,_サイズ],_全角定義名), pswr('/%t { tzfont findfont %d scalefont setfont 0 0 3 2 roll lscape-test} def\n',[_全角定義名,_サイズ]), pswr('/tz { %t } def\n',[_全角定義名]),!. 一時半角定義(_サイズ) :- integer(_サイズ), concat([hankaku,_サイズ],_半角定義名), pswr('/%t { thfont findfont %d scalefont setfont 0 0 3 2 roll lscape-test} def\n',[_半角定義名,_サイズ]), pswr('/th { %t } def\n',[_半角定義名]),!. 一時ascii定義(_サイズ) :- integer(_サイズ), concat([ascii,_サイズ],_ascii定義名), pswr('/%t { tafont findfont %d scalefont setfont 0 0 3 2 roll lscape-test} def\n',[_ascii定義名,_サイズ]), pswr('/ta { %t } def\n',[_ascii定義名]),!. 一時全角定義(_全角定義名) :- not(integer(_全角定義名)), pswr('/tz { %t } def\n',[_全角定義名]),!. 一時半角定義(_半角定義名) :- not(integer(_半角定義名)), pswr('/th { %t } def\n',[_半角定義名]),!. 一時ascii定義(_ascii定義名) :- not(integer(_ascii定義名)), pswr('/ta { %t } def\n',[_ascii定義名]),!. 一時定義(_サイズ) :- 一時全角定義(_サイズ), 一時半角定義(_サイズ), 一時ascii定義(_サイズ),!. 改行定義(_改行名,ポートレート,_X座標,_文字開始変位,_行間隔,_下線名,_破線名) :- get_global(印刷形式,ポートレート), ( 書式定義(標準改行名,_,_改行名);true), ( 書式定義(固定軸座標,ポートレート,_X座標);true), ( 書式定義(文字開始変位,ポートレート,_文字開始変位);true), ( 書式定義(行間隔,ポートレート,_行間隔);true), ( 書式定義(標準下線名,_,_下線名);true), ( 書式定義(標準破線名,_,_破線名);true), 改行定義の二(_改行名,ポートレート,_X座標,_文字開始変位,_行間隔,_下線名,_破線名),!. 改行定義(_改行名,ランドスケープ,_Y座標,_文字開始変位,_行間隔,_下線名,_破線名) :- get_global(印刷形式,ランドスケープ), ( 書式定義(標準改行名,_,_改行名);true), ( 書式定義(固定軸座標,ランドスケープ,_Y座標);true), ( 書式定義(文字開始変位,ランドスケープ,_文字開始変位);true), ( 書式定義(行間隔,ランドスケープ,_行間隔);true), ( 書式定義(標準下線名,_,_下線名);true), ( 書式定義(標準破線名,_,_破線名);true), 改行定義の二(_改行名,ランドスケープ,_Y座標,_文字開始変位,_行間隔,_下線名,_破線名),!. 改行定義の二(_改行名,ポートレート,_X座標,_文字開始変位,_行間隔,_下線名,_破線名) :- concat([_下線名,'-offset'],_下線変位名), concat([_破線名,'-def'],_破線宣言名), concat([_下線名,'-def'],_下線宣言名), pswr('%t%t %t %t %t %t %t %t %t %t %t %t %t %t %t %t %t %t %t %t\n',['/',_改行名,'{',_X座標,ypos,_下線変位名,'sub moveto',_破線名,'1 eq {',_破線宣言名,' } if',_下線名,'1 eq {',_下線宣言名,'stroke} if /ypos ypos',_行間隔,'sub def',_X座標,_文字開始変位,'add ypos moveto} def']),!. 改行定義の二(_改行名,ランドスケープ,_Y座標,_文字開始変位,_行間隔,_下線名,_破線名) :- concat([_下線名,'-offset'],_下線変位名), concat([_破線名,'-def'],_破線宣言名), concat([_下線名,'-def'],_下線宣言名), pswr('%t%t %t %t %t %t %t %t %t %t %t %t %t %t %t %t %t %t %t %t %t %t\n',['/',_改行名,'{','gsave xpos ',_下線変位名,'add',_Y座標,moveto,_破線名,'1 eq {',_破線宣言名,' } if',_下線名,'1 eq { 90 rotate',_下線宣言名,'stroke} if grestore /xpos xpos',_行間隔,'add def',xpos,_Y座標,_文字開始変位,'add moveto} def']),!. 行間隔(_行間隔) :- 改行定義(_,_,_,_,_行間隔,_,_),!. ypos保存定義 :- pswr('/ypos-save {currentpoint pop /ypos exch def} def\n'),!. 白抜きフォント定義(_フォント名,_フォント範疇,_フォント,_ポイント) :- ( 書式定義(標準フォント名,_フォント範疇,_フォント名);true), ( 書式定義(標準フォント,_フォント範疇,_フォント);true), ( 書式定義(ポイント,_,_ポイント);true), pswr('%t%t %t%t %t %t %t\n',['/',_フォント名,'{ /',_フォント,findfont,_ポイント,'scalefont setfont outline-show} def']),!. フォント定義(_フォント名,_フォント範疇,_フォント,_ポイント,_x軸文字間空白,_y軸文字間空白) :- ( 書式定義(標準フォント名,_フォント範疇,_フォント名);true), ( 書式定義(標準フォント,_フォント範疇,_フォント);true), ( 書式定義(ポイント,_,_ポイント);true), ( 書式定義(x軸文字間空白,_,_x軸文字間空白);true), ( 書式定義(y軸文字間空白,_,_y軸文字間空白);true), フォント定義の二(_フォント名,_フォント,_ポイント,_x軸文字間空白,_y軸文字間空白),!. フォント定義の二(_フォント名,_フォント,_ポイント,_x軸文字間空白,_y軸文字間空白) :- pswr('%t%t %t%t %t %d %t %d %d %t\n',['/',_フォント名,'{ /',_フォント,findfont,_ポイント,'scalefont setfont',_x軸文字間空白,_y軸文字間空白,'3 2 roll lscape-test} def']),!. zenkaku_font(_ポイント,_行間隔) :- retract(書式定義(行間隔,_,_)), asserta(書式定義(行間隔,_,_ポイント)), 改行定義(newline,_,_,_,_行間隔,_,_), フォント定義(zenkaku,全角,_,_ポイント,0,0),!. hankaku_font(_ポイント,_行間隔) :- retract(書式定義(行間隔,_,_)), asserta(書式定義(行間隔,_,_ポイント)), 改行定義(newline,_,_,_,_行間隔,_,_), フォント定義(zenkaku,半角,_,_ポイント,0,0),!. ascii_font(_ポイント,_行間隔) :- retract(書式定義(行間隔,_,_)), asserta(書式定義(行間隔,_,_ポイント)), 改行定義(newline,_,_,_,_行間隔,_,_), フォント定義(zenkaku,ascii,_,_ポイント,0,0),!. ポストスクリプト矩形(_左上x座標,_左上y座標,_右下x座標,_右下y座標,_線幅,_オプション) :- moveto(_左上x座標,_左上y座標), _幅 は _右下x座標 - _左上x座標, _高さ は _左上y座標-_右下y座標, _幅マイナス は -_幅, _高さマイナス は -_高さ, rlineto(_幅,0), rlineto(0,_高さマイナス), rlineto(_幅マイナス,0), rlineto(0,_高さ), closepath, setlinewidth(_線幅), _オプション,!. ポストスクリプト矩形角丸め(_左上X座標,_左上Y座標,_右下X座標,_右下Y座標,_線幅,_オプション,_丸め幅) :- setlinewidth(_線幅), X2 is _左上X座標 + _丸め幅, moveto(X2,_左上Y座標), wr('%t %t %t %t %t arcto 4 {pop} repeat\n',[_右下X座標,_左上Y座標,_右下X座標,_右下Y座標,_丸め幅]), wr('%t %t %t %t %t arcto 4 {pop} repeat\n',[_右下X座標,_右下Y座標,_左上X座標,_右下Y座標,_丸め幅]), wr('%t %t %t %t %t arcto 4 {pop} repeat\n',[_左上X座標,_右下Y座標,_左上X座標,_左上Y座標,_丸め幅]), wr('%t %t %t %t %t arcto 4 {pop} repeat\n',[_左上X座標,_左上Y座標,_右下X座標,_左上Y座標,_丸め幅]), closepath, setlinewidth(_線幅), call(_オプション),!. ポストスクリプト罫線(_,_左上y座標,_,_右下y座標,0,_y軸方向間隔,_) :- Y は _左上y座標 - _y軸方向間隔, Y =< _右下y座標,!. ポストスクリプト罫線(_左上x座標,_左上y座標,_右下x座標,_右下y座標,0,_y軸方向間隔,_線幅) :- Len は _右下x座標 - _左上x座標, Y は _左上y座標 - _y軸方向間隔, moveto(_左上x座標,Y), setlinewidth(_線幅), rlineto(Len,0), stroke, ポストスクリプト罫線(_左上x座標,Y,_右下x座標,_右下y座標,0,_y軸方向間隔,_線幅),!. ポストスクリプト罫線(_左上x座標,_,_右下x座標,_,_x軸方向間隔,0,_) :- X は _左上x座標 + _x軸方向間隔, X >= _右下x座標,!. ポストスクリプト罫線(_左上x座標,_左上y座標,_右下x座標,_右下y座標,_x軸方向間隔,0,_線幅) :- Len は _左上y座標 - _右下y座標, X は _左上x座標 + _x軸方向間隔, moveto(X,_右下y座標), setlinewidth(_線幅), rlineto(0,Len), stroke, ポストスクリプト罫線(X,_左上y座標,_右下x座標,_右下y座標,_x軸方向間隔,0,_線幅),!. arc(_中心X座標,_中心Y座標,_半径,_開始角度,_弧角度) :- _中心X座標の二 は _中心X座標, _中心Y座標の二 は _中心Y座標, stroke, pswr(arc(_中心X座標の二,_中心Y座標の二,_半径,_開始角度,_弧角度)),!. save :- pswr(' /saveobj save def\n'),!. restore :- pswr(' saveobj restore\n'),!. stroke :- pswr(stroke),!. closepath :- pswr(closepath),!. setrgbcolor(Red,Green,Blue) :- pswr(setrgbcolor(Red,Green,Blue)),!. sethsbcolor(Hue,Saturation,Brightness) :- pswr(sethsbcolor(Hue,Saturation,Brightness)),!. setlinewidth(N) :- pswr(setlinewidth(N)),!. rlineto(X,Y) :- X1 は X, Y1 は Y, pswr(rlineto(X1,Y1)),!. lineto(X,Y) :- X1 は X, Y1 は Y, pswr(lineto(X1,Y1)),!. curveto([]) :- !. curveto([A|R]) :- not(list(A)), concat([A|R],' ',L), wr(' %t curveto\n',[L]),!. curveto([[X1,Y1,X2,Y2,X3,Y3]|R]) :- curveto(X1,Y1,X2,Y2,X3,Y3), curveto(R),!. curveto([[X1,Y1]|R]) :- flat([[X1,Y1]|R],L), curveto(L),!. curveto(X1,Y1,X2,Y2,X3,Y3) :- pswr(curveto(X1,Y1,X2,Y2,X3,Y3)),!. rcurveto([]) :- !. rcurveto([A|R]) :- not(list(A)), concat([A|R],' ',L), wr(' %t rcurveto\n',[L]),!. rcurveto([[X1,Y1,X2,Y2,X3,Y3]|R]) :- rcurveto(X1,Y1,X2,Y2,X3,Y3), rcurveto(R),!. rcurveto([[X1,Y1]|R]) :- flat([[X1,Y1]|R],L), rcurveto(L),!. rcurveto(X1,Y1,X2,Y2,X3,Y3) :- pswr(rcurveto(X1,Y1,X2,Y2,X3,Y3)),!. ベジェ曲線(T,_刻み_,_,_,_,_,_,_,_,[]) :- T > 1.0,!. ベジェ曲線(T,_刻み,X1,Y1,X2,Y2,X3,Y3,X4,Y4,[[X,Y]|R]) :- T2 is T + _刻み, X is (1-T) * (1-T) * (1-T) * X1 + 3 * (1-T) * (1-T) * T * X2 + 3 * (1-T) * T * T * X3 + T * T * T + X4, Y is (1-T) * (1-T) * (1-T) * Y1 + 3 * (1-T) * (1-T) * T * Y2 + 3 * (1-T) * T * T * Y3 + T * T * T * Y4, ベジェ曲線(T2,_刻み,X1,Y1,X2,Y2,X3,Y3,X4,Y4,R). setdash([],Y) :- pswr(setdash([],Y)),!. setdash([A|R],Y) :- concat([A|R],' ',X0), concat(['[',X0,']'],X), pswr(setdash(X,Y)),!. setdash(X,Y) :- pswr(setdash(X,Y)),!. setlinecap(X) :- pswr(setlinecap(X)),!. setlinejoin(X) :- pswr(setlinejoin(X)),!. matrix :- pswr(matrix),!. setmatrix(Matrix) :- flat(Matrix,FlatMatrix), concat(FlatMatrix,' ',X0), concat(['[',X0,']'],X), pswr(setdash(X,Y)),!. setscreen(Frequency,Angle,Proc) :- pswr(setscreen(Frequency,Angle,Proc)),!. stroke :- pswr(stroke),!. fill :- pswr(fill),!. setgray(0) :- pswr(setgray('.0')),!. setgray(F) :- sprintf('%1.2f',[F],S), subatomic(S,2,3,S1), pswr(setgray(S)),!. pvector([],[]) :- stroke,!. pvector([],[[_X座標位置,_Y座標位置,_ベクター長|_オプション]|_R],_線幅,_破線形式,_白色度) :- 線属性(_オプション,_線幅,_破線形式,_白色度), moveto(_X座標位置,_Y座標位置), rlineto(0,_ベクター長), 線属性の二(_オプション,[_線幅,_破線形式,_白色度]), pvector([],R,_線幅,_破線形式,_白色度),!. pvector([[_X座標位置,_Y座標位置,_ベクター長|_オプション]|_R],R1,_線幅,_破線形式,_白色度) :- 線属性の一(_オプション,[_線幅,_破線形式,_白色度]), moveto(_X座標位置,_Y座標位置), rlineto(_ベクター長,0), 線属性の二(_オプション,[_線幅,_破線形式,_白色度]), pvector(R,R1,_線幅,_破線形式,_白色度),!. 下線定義(_下線名,_印刷形式,_下線変位,_下線長,_下線幅) :- ( 書式定義(標準下線名,_,_下線名);true), ( 書式定義(下線変位,_,_下線変位);true), ( 書式定義(下線長,_印刷形式,_下線長);true), ( 書式定義(下線幅,_,_下線幅);true), 下線定義の二(_下線名,_下線変位,_下線長,_下線幅),!. us :- 下線定義(_,_,_,_,0). us(N) :- 下線定義(_,_,_,_,N). 下線 :- us,!. 下線定義の二(_下線名,_下線変位,_下線長,_下線幅) :- concat([_下線名,'-offset'],_下線変位名), concat([_下線名,'-length'],_下線長名), concat([_下線名,'-width'],_下線幅名), concat([_下線名,'-def'],_下線宣言名), pswr('%t%t %t\n',['/',_下線名,'1 def']), pswr('%t%t %t %t\n',['/',_下線長名,_下線長,def]), pswr('%t%t %t %t\n',['/',_下線幅名,_下線幅,def]), pswr('%t%t %t %t\n',['/',_下線変位名,_下線変位,def]), pswr('%t%t %t %t %t %t %t\n',['/',_下線宣言名,'{',_下線長名,'0 rlineto',_下線幅名,'setlinewidth} def']),!. 下線解除(_下線名) :- ( 書式定義(標準下線名,_,_下線名);true), pswr('%t%t %t\n',['/',_下線名,'0 def']),!. 破線定義(_破線名,_破線形式,_破線開始変位,_破線幅) :- ( 書式定義(標準破線名,_,_破線名);true), ( 書式定義(破線形式,_,_破線形式);true), ( 書式定義(破線開始変位,_,_破線開始変位);true), ( 書式定義(破線幅,_,_破線幅);true), 破線定義の二(_破線名,_破線形式,_破線開始変位,_破線幅),!. 破線定義の二(_破線名,_破線形式,_破線開始変位,_破線幅) :- concat([_破線名,'-type'],_破線形式名), concat([_破線名,'-startpos'],_破線変位名), concat([_破線名,'-width'],_破線幅名), concat(_破線形式,' ',_破線形式の二), concat(['[',_破線形式の二,']'],_破線形式の三), concat([_破線名,'-def'],_破線宣言名), pswr('%t%t %t\n',['/',_破線名,'1 def']), pswr('%t%t %t %t\n',['/',_破線形式名,_破線形式の三,def]), pswr('%t%t %t %t\n',['/',_破線変位名,_破線開始変位,def]), pswr('%t%t %t %t\n',['/',_破線幅名,_破線幅,def]), pswr('%t%t %t %t %t %t %t %t\n',['/',_破線宣言名,'{',_破線形式名,_破線変位名,'setdash',_破線幅名,'setlinewidth } def']),!. 破線解除(_破線名) :- ( 書式定義(標準破線名,_,_破線名);true), pswr('%t%t %t\n',['/',_破線名,'0 def']),!. 破線描画定義(_名,_破線パターン,_破線パターン開始位置,_線幅) :- 破線パターン文字列(_破線パターン,_破線パターン文字列), pswr('%t%t %t %t %t %t %t %t %t\n',['/',_名,'{ [,_破線パターン文字列',']',_破線パターン開始位置,setdash,_線幅,'setlinewidth} def']),!. 破線パターン文字列(L,L1) :- concat(L,' ',L1),!. ランドスケープ表示定義 :- pswr('/lscape-show { gsave 90 rotate ashow ypos-save grestore xpos ypos moveto} def\n'),!. ランドスケープ検査定義 :- pswr('/lscape-test {lscape 1 eq {lscape-show} {ashow} ifelse} def\n'),!. ランドスケープ :- set_global(印刷形式,ランドスケープ), pswr('/lscape 1 def\n /portlate 0 def\n'),!. ポートレート :- set_global(印刷形式,ポートレート), pswr('/portlate 1 def\n/lscape 0 def\n'),!. 肖像画 :- set_global(印刷形式,ポートレート), !. 風景画 :- set_global(印刷形式,ランドスケープ), !. moveto(X+X1,Y+Y1) :- var(X), var(Y), integer(X1), integer(Y1), pswr('currentpoint exch \n'), concat([X1,' add exch'],S), pswr(S), concat([Y1,' add moveto\n'],S2), pswr(S2),!. moveto(X+X1,Y) :- var(X), integer(X1), var(Y), pswr('currentpoint exch \n'), concat([X1,' add exch moveto'],S), pswr(S),!. moveto(X,Y+Y1) :- var(X), integer(Y1), var(Y), pswr('currentpoint \n'), concat([Y1,' add moveto'],S), pswr(S),!. moveto(X,Y) :- var(X), Y1 は Y, pswr('currentpoint pop \n'), pswr(moveto(Y1)),!. moveto(X,Y) :- var(Y), X1 は X, concat([X1,' exch moveto'],S), pswr('currentpoint exch pop \n'), pswr(S),!. moveto(X,Y) :- X1 は X, Y1 は Y, pswr(moveto(X1,Y1)),!. showpage :- pswr(showpage), get_global(印刷形式,_印刷形式), 書式定義(初期x座標,_印刷形式,_初期x座標), 書式定義(初期y座標,_印刷形式,_初期y座標), moveto(_初期x座標,_初期y座標),!. copypage :- pswr(copypage),!. erasepage :- pswr(erasepage),!. 文字開始位置(ポートレート,_文字開始変位,_初期x座標,_初期y座標,_文字開始x座標,_文字開始y座標) :- _文字開始y座標 は _初期y座標, _文字開始x座標 は _初期x座標 + _文字開始変位,!. 文字開始位置(ランドスケープ,_文字開始変位,_初期x座標,_初期y座標,_文字開始x座標,_文字開始y座標) :- _文字開始x座標 は _初期x座標, _文字開始y座標 は _初期y座標 + _文字開始変位,!. 背景色なし :- retract(書式定義(背景色,_,_)), assertz(書式定義(背景色,_, (-1))),!. ポストスクリプト背景 :- 書式定義(背景色,_, -1),!. ポストスクリプト背景 :- get_global(印刷形式,_印刷形式), 書式定義(背景色,_,_白色度), 書式定義(下線長,_,_下線長), 書式定義(行間隔,_,_行間隔), 書式定義(制限行数,_印刷形式,_制限行数), 書式定義(初期x座標,_印刷形式,_初期x座標), 書式定義(初期y座標,_印刷形式,_初期y座標), setgray(_白色度), X4 は _初期x座標 + _下線長, Y40 は '*'(_行間隔,_制限行数), Y4 は _初期y座標 - Y40, Y1 は _初期y座標 + _行間隔, ポストスクリプト矩形(_初期x座標,Y1,X4,Y4,0,fill), setgray(0),!. ポストスクリプト汎用定義 :- get_global(印刷形式,_印刷形式), ypos保存定義, call(_印刷形式), ランドスケープ表示定義, ランドスケープ検査定義, 下線定義(_,_印刷形式,_,_,_), 破線定義(_,_,_,_), 改行定義(_改行名,_印刷形式,_,_,_,_,_), 一時改行定義(_改行名), retract(書式定義(標準改行名,_,_)), asserta(書式定義(標準改行名,_,tnl)), フォント定義(_,全角,_,_,4,0), フォント定義(_,半角,_,_,2,0), フォント定義(_,ascii,_,_,2,0),!. 適用業務標準設定(_印刷形式,_初期x座標,_初期y座標,_文字開始変位,_制限行数,_文字名ならび) :- get_global(印刷形式,_印刷形式), 書式定義(初期x座標,_印刷形式,_初期x座標), 書式定義(初期y座標,_印刷形式,_初期y座標), 書式定義(文字開始変位,_,_文字開始変位), 書式定義(制限行数,_印刷形式,_制限行数), 書式定義(標準フォント名,ascii,_asciiフォント名), 書式定義(標準フォント名,全角,_全角フォント名), 書式定義(標準フォント名,半角,_半角フォント名), 一時全角定義(_全角フォント名), 一時半角定義(_半角フォント名), 一時ascii定義(_asciiフォント名), (retract(書式定義(標準フォント名,_,_)),fail;true), asserta(書式定義(標準フォント名,ascii,ta)), asserta(書式定義(標準フォント名,全角,tz)), asserta(書式定義(標準フォント名,半角,th)), _文字名ならび = [ta,tz,th], !. ポストスクリプト見出し(1,_,_初期化情報) :- midashi, call(_初期化情報),!. ポストスクリプト見出し(_,_,_). setup(F) :- seeing(FILE), see(F), repeat, get0(X), ( X = -1;put(X),fail), seen, see(FILE),!. ail3(FILE) :- seeing(CurrentFile), see(FILE), repeat, reads(X), ( X=end_of_file; ail3_1(X) ), seen, see(CurrentFile),!. ail3_1(X) :- subatomic(X,1,2,'%%'), !,fail. ail3_1(X) :- subatomic(X,1,5,gsave), atomic_length(X,N), M is N-7, subatomic(X,M,8,showpage), !,fail. ail3_1(X) :- wr('%t\n',[X]), fail. % *** user: p_print / 7 *** p_print(FI,P_DEFAULT,P_DEF,MIDASHI,_制御命令,FO,TTY) :- r_consult(P_DEFAULT), p_print_def(FI,P_DEFAULT,P_DEF,MIDASHI), open(P_DEF,read,Input_1) , repeat , read(Input_1,P) , ( P = end_of_file ; P = (書式定義(ARG1,ARG2,ARG3) :- T) , retract((書式定義(ARG1,ARG2,_) :- T)) , asserta((書式定義(ARG1,ARG2,ARG3) :- T)) , fail ; not P = (書式定義(ARG1,ARG2,ARG3) :- _) , P = 書式定義(ARG1,ARG2,ARG3) , retract((書式定義(ARG1,ARG2,_) :- _)) , asserta(書式定義(ARG1,ARG2,ARG3)) , fail ) , close(Input_1), r_consult(MIDASHI), slush_op(FI,FI_2), ( atom(FO), not(FO=user_output), tell(FO); not(atom(FO)), tmpnam(FO), tell(FO); FO=user_output ), ( atom(FI_2), not(FI_2=user_input), see(FI_2); atom(FI_2), FI_2=user_input ), wr '%%!\n', '一時全角フォント名'('明朝'), '一時半角フォント名'('ゴチック'), '一時asciiフォント名'('Times-Roman'), 'ポストスクリプト汎用定義', '適用業務標準設定'(_印刷形式,_初期x座標,_初期y座標,_文字開始変位,_制限行数,_文字名ならび), set_global('制限行数',_制限行数), get_global('印刷端末文字コード',_文字コード), 'p_print_フォント定義'(_文字コード), ( '書式定義'('下線幅',_,-1), '書式定義'('標準下線名',_,_標準下線名), '下線解除'(_標準下線名) ; true ), call(_制御命令), set_global(page,1), repeat, xpos(_初期x座標), ypos(_初期y座標), ( _印刷形式=ポートレート, _仮x座標 is _初期x座標 + _文字開始変位, _仮y座標 = _初期y座標; _印刷形式=ランドスケープ, _仮x座標 = _初期x座標, _仮y座標 is _初期y座標 + _文字開始変位 ), moveto(_仮x座標,_仮y座標), newpath, 'ポストスクリプト背景', set_global('頁換え',off), p_print_0(_制限行数,_印刷形式,_文字開始変位,_初期x座標,_初期y座標,_文字開始x座標,_文字開始y座標,_文字名ならび,X), X = end_of_file, seen, told, ! . % *** user: p_print / 5 *** p_print(FI,P_DEFAULT,P_DEF,MIDASHI,_制御命令) :- tty(TTY_1), concat(['/usr2/',TTY_1,'.pst'],SaveSystem), save_system(SaveSystem), 印刷端末(_印刷端末), p_print(FI,P_DEFAULT,P_DEF,MIDASHI,_制御命令,FO,TTY), '印刷制御'(_印刷端末,FO,_), ! . % *** user: p_print / 4 *** p_print(FI,P_DEFAULT,P_DEF,MIDASHI) :- slush_op(FI,FI_2), p_print(FI_2,P_DEFAULT,P_DEF,MIDASHI,true), ! . % *** user: p_print / 2 *** p_print(FI,_制御命令) :- slush_op(FI,FI_2), p_print(FI_2,'p_default.pro','p_def.pro','midashi.pro',_制御命令), ! . % *** user: p_print / 1 *** p_print(Network :: FI) :- hosts(_,Network,_,sjis), tmpnam(F), tmpnam(F2), cp(Network :: FI,F), concat(['sjtoeuc ',F,' >',F2],S), system(S), p_print(F2), unlink(F), unlink(F2), ! . p_print(FI) :- slush_op(FI,FI_2), p_print(FI_2,'p_default.pro','p_def.pro','midashi.pro',true), ! . p_print_フォント定義(euc) :- 白抜きフォント定義(zenkaku4,全角,'Ryumin-Light-78-EUC-H',30), 白抜きフォント定義(hankaku4,半角,'Ryumin-Light.Hankaku',30), 白抜きフォント定義('ascii-code4',ascii,'Courier',30), フォント定義(ascii7,ascii,'Times-Roman',7,0,0), フォント定義(zenkaku7,全角,'GothicBBB-Medium-78-EUC-H',7,0,0), フォント定義(hankaku7,半角,'GothicBBB-Medium.Hankaku',7,0,0), フォント定義(ascii8,ascii,'Times-Roman',8,0,0), フォント定義(zenkaku8,全角,'GothicBBB-Medium-78-EUC-H',8,0,0), フォント定義(hankaku8,半角,'GothicBBB-Medium.Hankaku',8,0,0), フォント定義(zenkaku6,全角,'Ryumin-Light-78-EUC-H',6,0,0), フォント定義(hankaku6,半角,'Ryumin-Light.Hankaku',6,0,0), フォント定義(ascii6,ascii,'Times-Roman',6,0,0), フォント定義(zenkaku16,全角,'Ryumin-Light-78-EUC-H',16,0,0), フォント定義(ascii16,ascii,'Times-Roman',16,0,0), フォント定義(hankaku16,半角,'Ryumin-Light.Hankaku',16,0,0), フォント定義(zenkaku25,全角,'Ryumin-Light-78-EUC-H',25,0,0), フォント定義(ascii25,ascii,'Times-Roman',25,0,0), フォント定義(hankaku25,半角,'Ryumin-Light.Hankaku',25,0,0), フォント定義(ascii30,ascii,'Times-Roman',30,0,0), フォント定義(zenkaku30,全角,'Ryumin-Light-78-EUC-H',30,0,0), フォント定義(hankaku30,半角,'GothicBBB-Medium.Hankaku',30,0,0),!. p_print_フォント定義(sjis) :- 白抜きフォント定義(zenkaku4,全角,'Ryumin-Light-83pv-RKSJ-H',30), 白抜きフォント定義(hankaku4,半角,'Ryumin-Light.Hankaku',30), 白抜きフォント定義('ascii-code4',ascii,'Courier',30), フォント定義(ascii7,ascii,'Times-Roman',7,0,0), フォント定義(zenkaku7,全角,'GothicBBB-Medium-83pv-RKSJ-H',7,0,0), フォント定義(hankaku7,半角,'GothicBBB-Medium.Hankaku',7,0,0), フォント定義(ascii8,ascii,'Times-Roman',8,0,0), フォント定義(zenkaku8,全角,'GothicBBB-Medium-83pv-RKSJ-H',8,0,0), フォント定義(hankaku8,半角,'GothicBBB-Medium.Hankaku',8,0,0), フォント定義(zenkaku6,全角,'Ryumin-Light-83pv-RKSJ-H',6,0,0), フォント定義(hankaku6,半角,'Ryumin-Light.Hankaku',6,0,0), フォント定義(ascii6,ascii,'Times-Roman',6,0,0), フォント定義(zenkakuG8,全角,'GothicBBB-Medium-83pv-RKSJ-H',8,0,0), フォント定義(asciiG8,ascii,'Helvetica-Bold',8,0,0), フォント定義(hankakuG8,半角,'GothicBBB-Medium.Hankaku',8,0,0), フォント定義(zenkaku12,全角,'GothicBBB-Medium-83pv-RKSJ-H',12,0,0), フォント定義(ascii12,ascii,'Helvetica-Bold',12,0,0), フォント定義(hankaku12,半角,'Gothic-Medium.Hankaku',12,0,0), /* フォント定義(zenkaku16,全角,'Ryumin-Light-83pv-RKSJ-H',16,0,0), フォント定義(ascii16,ascii,'Times-Roman',16,0,0), フォント定義(hankaku16,半角,'Ryumin-Light.Hankaku',16,0,0), */ フォント定義(zenkaku16,全角,'GothicBBB-Medium-83pv-RKSJ-H',16,0,0), フォント定義(ascii16,ascii,'Helvetica-Bold',16,0,0), フォント定義(hankaku16,半角,'Gothic-Medium.Hankaku',16,0,0), フォント定義(ascii20,ascii,'Times-Roman',20,0,0), フォント定義(zenkaku20,全角,'Ryumin-Light-83pv-RKSJ-H',20,0,0), フォント定義(hankaku20,半角,'GothicBBB-Medium.Hankaku',20,0,0), フォント定義(zenkaku25,全角,'Ryumin-Light-83pv-RKSJ-H',25,0,0), フォント定義(ascii25,ascii,'Times-Roman',25,0,0), フォント定義(hankaku25,半角,'Ryumin-Light.Hankaku',25,0,0), フォント定義(ascii30,ascii,'Times-Roman',30,0,0), フォント定義(zenkaku30,全角,'Ryumin-Light-83pv-RKSJ-H',30,0,0), フォント定義(hankaku30,半角,'GothicBBB-Medium.Hankaku',30,0,0),!. /* 白抜きフォント定義(zenkaku4,全角,'Ryumin-Light-KL',30), 白抜きフォント定義(hankaku4,半角,'Ryumin-Light.Hankaku',30), 白抜きフォント定義('ascii-code4',ascii,Courier,30), フォント定義(ascii7,ascii,'Times-Roman',7,0,0), フォント定義(zenkaku7,全角,'GothicBBB-Midium',7,0,0), フォント定義(hankaku7,半角,'GothicBBB-Midium.Hankaku',7,0,0), フォント定義(ascii8,ascii,'Times-Roman',8,0,0), フォント定義(zenkaku8,全角,'GothicBBB-Midium',8,0,0), フォント定義(hankaku8,半角,'GothicBBB-Midium.Hankaku',8,0,0), フォント定義(zenkaku6,全角,'Ryumin-Light-KL',6,0,0), フォント定義(hankaku6,半角,'Ryumin-Light.Hankaku',6,0,0), フォント定義(ascii6,ascii,'Times-Roman',6,0,0), フォント定義(zenkaku16,全角,'Ryumin-Light-KL',16,0,0), フォント定義(ascii16,ascii,'Times-Roman',16,0,0), フォント定義(hankaku16,半角,'Ryumin-Light.Hankaku',16,0,0), フォント定義(zenkaku25,全角,'Ryumin-Light-KL',25,0,0), フォント定義(ascii25,ascii,'Times-Roman',25,0,0), フォント定義(hankaku25,半角,'Ryumin-Light.Hankaku',25,0,0), フォント定義(ascii30,ascii,'Times-Roman',30,0,0), フォント定義(zenkaku30,全角,'Ryumin-Light-KL',30,0,0), フォント定義(hankaku30,半角,'GothicBBB-Midium.Hankaku',30,0,0),!. */ p_print_4(ttyz02,_一時ファイル) :- cp(_一時ファイル,ttyz02 :: prn), unlink(_一時ファイル),!. p_print_4(ttyz03,_一時ファイル) :- cp(_一時ファイル,ttyz03 :: prn), unlink(_一時ファイル),!. p_print_4(_印刷端末,_印刷端末) :- !. p_print_4(_印刷端末,_一時ファイル) :- cp(_一時ファイル,_印刷端末 :: prn), unlink(_一時ファイル), !. p_print_def(FI,P_DEFAULT,P_DEF,MIDASHI) :- ( 変数(P_DEFAULT), P_DEFAULT = 'p_default.pro'; 変数(P_DEF), P_DEF = 'p_def.pro'; 変数(MIDASHI), MIDASHI = 'midashi.pro' ), p_print_def(FI,P_DEFAULT,P_DEF,MIDASHI),!. p_print_def(_,_,_,_). 印刷端末取得(xview,_一時ファイル) :- get_global(印刷端末,xview), tmpnam(_一時ファイル),!. 印刷端末取得(_印刷端末,_一時ファイル) :- get_global(印刷端末,_印刷端末), subatomic(_印刷端末,1,3,tty), tmpnam(_一時ファイル),!. 印刷端末取得(_印刷端末,_印刷端末) :- get_global(印刷端末,_印刷端末). p_print_copy(F,F1) :- tmpnam(F1), tell(F1), see(F), repeat, reads(X), ( X=end_of_file; atomic_length(X,LEN), p_print_copy_2(X,LEN), fail ), seen, told,!. p_print_copy_2(X,LEN) :- get_global(印刷形式,ポートレート), 書式定義(初期x座標,ポートレート,_初期x座標), 書式定義(文字開始変位,_,_文字開始変位), 書式定義(ポイント,_,_ポイント), 書式定義(下線長,ポートレート,_下線長), N は '-'(_下線長,'*'(_文字開始変位,2)), LEN2 は (_下線長 / _ポイント), p_print_copy_3(X,LEN,LEN2),!. p_print_copy_3(X,LEN,LEN2) :- LEN>=LEN2, write(X),nl,!. p_print_copy_3(X,LEN,LEN2) :- eucsubstr(X,1,LEN2,Y), write(Y),nl, LEN3 は LEN2-LEN, N3 は LEN2 + 1, eucsubstr(X,N3,LEN3,Z), write(Z),nl,!. % *** user: p_print_0 / 9 *** p_print_0(_制限行数,_印刷形式,_文字開始変位,_初期x座標,_初期y座標,_文字開始x座標,_文字開始y座標,_文字名ならび,X) :- char_code(A,12), /* set_global('制限行数',_制限行数), */ pct_for(1,N), reads(X), ( X = end_of_file, N = 1 ; X = end_of_file, \+(N = 1), 'pct_頁表示', showpage ; N = 1, ( subatomic(X,1,1,A), subatomic(X,2,2,'%/'), SP1 = 4 ; subatomic(X,1,11,'%/showpage.'), subatomic(X,13,2,'%/'), SP1 = 15 ), error_protect(parse_atom(X,SP1,_,T,_,_),fail), ( \+(T = end_of_file), \+(T = []), error_protect(T,fail) ; T = end_of_file ), fail ; \+(N = 1), ( subatomic(X,1,1,A), SP2 = 2 ; subatomic(X,1,11,'%/showpage.'), SP2 = 13 ), get_global('制限行数',_制限行数の二), \+(0 is N mod _制限行数の二), !, 'pct_頁表示', showpage, subatomic(X,SP2,2,'%/'), SP3 is SP2 + 2, error_protect(parse_atom(X,SP3,_,T,_,_),fail), ( \+(T = end_of_file), error_protect(T,fail) ; T = end_of_file ), !, fail ; get_global('制限行数',_制限行数の二), 'ポストスクリプト見出し'(N,_制限行数の二,(xpos(_初期x座標) , ypos(_初期y座標) , setdash('[1 0]',0) , '文字開始位置'(_印刷形式,_文字開始変位,_初期x座標,_初期y座標,_文字開始x座標,_文字開始y座標) , moveto(_文字開始x座標,_文字開始y座標))), setgray(0), concat([X,'\n'],Y), 'ポストスクリプト文字列'(_文字名ならび,_,Y,Z), wr('%t\n',[Z]), 0 'は' N mod _制限行数の二, 'pct_頁表示', showpage ), ! . /* p_print_0(_制限行数,_印刷形式,_文字開始変位,_初期x座標,_初期y座標,_文字開始x座標,_文字開始y座標,_文字名ならび,X) :- char_code(A,12) , set_global(制限行数,_制限行数) , pct_for(1,N) , ( N=1, moveto(_文字開始x座標,_文字開始y座標); not(N=1) ), reads(X) , ( X = end_of_file , N = 1 ; X = end_of_file , not N = 1 , pct_頁表示 , showpage ; N = 1 , ( subatomic(X,1,1,A), subatomic(X,2,2,'%/'), SP1=4; subatomic(X,1,11,'%/showpage.'), subatomic(X,13,2,'%/'), SP1=15 ), moveto(_文字開始x座標,_文字開始y座標), error_protect(parse_atom(X,SP1,_,T,_,_),fail), ( not T = end_of_file , not(T = []), error_protect(T,fail) ; T = end_of_file ) , fail ; not N = 1 , ( subatomic(X,1,1,A), SP2=2, moveto(_文字開始x座標,_文字開始y座標); subatomic(X,1,11,'%/showpage.'), SP2=13, moveto(_文字開始x座標,_文字開始y座標) ), get_global(制限行数,_制限行数の二), not(0 is N mod _制限行数の二), pct_頁表示, showpage, subatomic(X,SP2,2,'%/'), SP3 is SP2+2, error_protect(parse_atom(X,SP3,_,T,_,_),fail), ( not T = end_of_file , error_protect(T,fail) ; T = end_of_file ) , (!) , fail ; get_global(制限行数,_制限行数の二) , ポストスクリプト見出し(N,_制限行数の二,(xpos(_初期x座標) , ypos(_初期y座標) , setdash('[1 0]',0) , 文字開始位置(_印刷形式,_文字開始変位,_初期x座標,_初期y座標,_文字開始x座標,_文字開始y座標) , moveto(_文字開始x座標,_文字開始y座標))) , setgray(0) , concat([X,'\n'],Y) , ポストスクリプト文字列(_文字名ならび,_,Y,Z) , wr('%t\n',[Z]), 0 は N mod _制限行数の二 , pct_頁表示 , showpage ) , (!) . */ pct_頁表示 :- get_global(頁表示,off),!. pct_頁表示 :- get_global(印刷形式,ポートレート), get_global(page,PAGE), PAGE1 is PAGE+1, set_global(page,PAGE1), /* atoi(Page,PAGE), */ lpad(PAGE,2,' ',Page), moveto(300,60), ポストスクリプト文字列(['ascii-code',zenkaku,hankaku],_,Page,W2), wr('%t\n',[W2]),!. pct_頁表示 :- get_global(印刷形式,ランドスケープ), get_global(page,PAGE), PAGE1 is PAGE+1, set_global(page,PAGE1), /* atoi(Page,PAGE), */ lpad(PAGE,2,' ',Page), moveto(565,416), ポストスクリプト文字列(['ascii-code',zenkaku,hankaku],_,Page,W2), wr('%t\n',[W2]),!. pct_for(A,_) :- get_global(制限行数,_制限行数), _制限行数 < A,!,fail. pct_for(A,A). pct_for(A,B) :- A2 is A+1, pct_for(A2,B). %/実線,下線定義(_,_,_,_,0). 実線 :- retract(書式定義(破線形式,_,_)), asserta(書式定義(破線形式,_,[1,0])). 行数(_行数) :- set_global(制限行数,_行数). 印刷制御(アクロバット,FO,_保護ファイル) :- ペーパーサイズ(PAPERSIZE), 印刷制御保護ファイル(FO4,FO40,FO43,FO44), concat(['ps2pdf -sPAPERSIZE=',PAPERSIZE,' ',FO,' ',FO44],S), system(S), cp(FO44,FO43), set_global(html,jump),!. 印刷制御(_印刷端末,FO,_) :- concat(['lpr -P',_印刷端末,' ',FO],SYSTEM), system(SYSTEM), !. 印刷制御保護ファイル(FO4,FO40,FO43,FO44) :- subatomic(FO4,1,5,'/tmp/'), replace_all(FO4,'/tmp/','',FO40), concat(['/tmp/',FO40,'.pdf'],FO43), set_global(tmpnam,FO43), concat(['/home/takao/tmp/',FO40,'.pdf'],FO44),!. 印刷制御保護ファイル(FO4,FO40,FO43,FO44) :- not(subatomic(FO4,1,5,'/tmp/')), make_list(FO4,['/'],L), last(L,FO40), concat(['/tmp/',FO40,'.pdf'],FO43), set_global(tmpnam,FO43), concat(['/home/takao/tmp/',FO40,'.pdf'],FO44),!. ローカル印刷端末(ttyz06) :- !. ペーパーサイズ(a4). ペーパーサイズ(_旧,_新) :- ペーパーサイズ(_旧), retract(ペーパーサイズ(_旧)), assertz(ペーパーサイズ(_新)),!. 印刷制御_acrobat_server_待ち合わせ(F) :- アクロバットサーバー(AcrobatServer), atomic_length(F,Len), for(1,N,30), sleep(1), anonymousdir(AcrobatServer,'/out',X), member(A,X), atom_suffix(A,Len,F), split(A,[' '],[_,_,_,_,Size,Mon,Day,_,_]), ( \+(Size = 0), sleep(2); Size = 0, sleep(5) ), N < 10,!. 大域変数を取得(Key,Value) :- error_protect(get_global(Key,Value),fail). % 以下のサイトは # 出典:: 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) :- findnsols(N,A,member(A,L),X). 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/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) :- findnsols(N,A,member(A,L),X). % 以下のサイトは # 出典:: 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. 曜日連鎖(月曜,火曜). 曜日連鎖(火曜,水曜). 曜日連鎖(水曜,木曜). 曜日連鎖(木曜,金曜). 曜日連鎖(金曜,土曜). 曜日連鎖(土曜,日曜). 曜日連鎖(日曜,月曜). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1200175247/550 # # # (1)曜日を表す英語と日本語との対応を表すハッシュwdayを定義しなさい # # p wday["sunday"] #=> "日曜日" # p wday["monday"] #=> "月曜日" # p wday["saturday"] #=> "土曜日" # # (2)ハッシュのメソッドを使って(1)のハッシュwdayのペアの数を数えなさい # # (3)eachメソッドと(1)のハッシュwdayを使って以下の文字列を出力させてくださ い。 # 「sunday」は日曜日のことです。 # 「monday」は月曜日のことです。 # … # # (4)ハッシュには配列の%wのようなものがありません。そこで、空白とタブと改行 # (正規表現で定義するなら「/\s+/」)で区切られた文字列をハッシュに変換するメ ソッド # str2hashを定義してください。 # # p str2hash("bule 青 white 白\nred赤"); # #=> {"bule"=>"青", "white"=>"白", "red"=>"赤"} % (1) wday(sunday,日曜日). wday(monday,月曜日). wday(saturday,土曜日). % (2) wdayの節数(_節数) :- 節数(wday(_,_),_節数). 節数(_節形式,_節数) :- findall(1,_節形式,L), length(L,_節数). % (3) '(3)' :- forall(wday(A,B), writef('「%t」は%tのことです。\n',[A,B])). % (4) str2hash(S,_述語名) :- split(S,['\n'],L), member(A,L), split(A,['\t',' '],L1), str2hash(L1). str2hash([]). str2hash([_述語名,_値|R]) :- P =.. [_述語名,_値], assertz(P), str2has(R). % 以下のサイトは # 出典:: C/C++の宿題片付けます 127代目 #413 # # 演習 # 今日は友引の火曜日である。今日からN日後までに仏滅ではない日曜日が何日あるか求めるプログラムを作成せよ。 # 六曜:先勝,友引,先負,仏滅,大安,赤口 六曜連鎖(先勝,友引). 六曜連鎖(友引,先負). 六曜連鎖(先負,仏滅). 六曜連鎖(仏滅,大安). 六曜連鎖(大安,赤口). 六曜連鎖(赤口,先勝). 曜日連鎖(月曜,火曜). 曜日連鎖(火曜,水曜). 曜日連鎖(水曜,木曜). 曜日連鎖(木曜,金曜). 曜日連鎖(金曜,土曜). 曜日連鎖(土曜,日曜). 曜日連鎖(日曜,月曜). '今日は大安の木曜日である。今日からN日後までに仏滅ではない日曜日が何日あるか求める。'(_N日後,_何日) :- 仏滅ではない日曜日が何日あるか(0,_N日後,大安,木曜,0,_何日). 仏滅ではない日曜日が何日あるか(_日数_1,_日数限度,_,_,_度数,_度数) :- _日数_1 > _日数限度,!. 仏滅ではない日曜日が何日あるか(_日数_1,_日数限度,_六曜_1,_曜日_1,_度数_1,_度数) :- '_日数_1が_日数限度以下の間の、仏滅ではない日曜日の度数'(_日数_1,_日数限度,_六曜_1,_曜日_1,_度数_1,_度数). '_日数_1が_日数限度以下の間の、仏滅ではない日曜日の度数'(_日数_1,_日数限度,_六曜_1,_曜日_1,_度数_1,_度数) :- '仏滅ではない日曜日の場合だけ、度数を加える'(_六曜_1,_曜日_1,_度数_1,_度数_2), 次の日(_日数_1,_六曜_1,_曜日_1,_日数_2,_六曜_2,_曜日_2), 仏滅ではない日曜日が何日あるか(_日数_2,_日数限度,_六曜_2,_曜日_2,_度数_2,_度数). 次の日(_日数_1,_六曜_1,_曜日_1,_日数_2,_六曜_2,_曜日_2) :- succ(_日数_1,_日数_2), 六曜連鎖(_六曜_1,_六曜_2), 曜日連鎖(_曜日_1,_曜日_2). '仏滅ではない日曜日の場合だけ、度数を加える'(_六曜,日曜,_度数_1,_度数_2) :- \+(_六曜 = 仏滅), succ(_度数_1,_度数_2),!. '仏滅ではない日曜日の場合だけ、度数を加える'(_,_,_度数_1,_度数_1). % 以下のサイトは % [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) :- findnsols(N,A,member(A,L),X). ヘッドゼロサプライ(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).