このディレクトリの索引

% 以下のサイトは '現在日時が月~金の場合は"今日は仕事",土日の場合は"今日はお休み"と出力する' :- 現在日時が(_現在日時), '月~金の場合は"今日は仕事",土日の場合は"今日はお休み"と'(_現在日時,_出力文字列), 出力する(_出力文字列). 現在日時が(_現在日時) :- date(_現在日時). '月~金の場合は"今日は仕事",土日の場合は"今日はお休み"と'(_現在日時,_出力文字列) :- '月~金の場合は"今日は仕事"と'(_現在日時,_出力文字列). '月~金の場合は"今日は仕事",土日の場合は"今日はお休み"と'(_現在日時,_出力文字列) :- '土日の場合は"今日はお休み"と'(_現在日時,_出力文字列). '月~金の場合は"今日は仕事"と'(_現在日時,今日は仕事) :- 今日は何曜日(_現在日時,_曜日), '月~金'(_曜日). '土日の場合は"今日はお休み"と'(_現在日時,今日はお休み). 今日は何曜日(_現在日時,_曜日), 土日(_曜日). 今日は何曜日(_現在日時,_曜日) :- day_of_the_week(_現在日時,_曜日番号), '曜日番号・曜日'(_曜日番号,_曜日). '曜日番号・曜日'(1,月曜). '曜日番号・曜日'(2,火曜). '曜日番号・曜日'(3,水曜). '曜日番号・曜日'(4,木曜). '曜日番号・曜日'(5,金曜). '曜日番号・曜日'(6,土曜). '曜日番号・曜日'(7,日曜). '月~金'(月曜). '月~金'(火曜). '月~金'(水曜). '月~金'(木曜). '月~金'(金曜). '土日'(土曜). '土日'(日曜). 出力する(_出力文字列) :- writef('%w\n',[_出力文字列]). % 以下のサイトは '今日が月~金の場合は"今日は仕事",土日の場合は"今日はお休み"と出力する' :- 今日が(_今日), '月~金の場合は"今日は仕事",土日の場合は"今日はお休み"と'(_今日,_出力文字列), 出力する(_出力文字列). 今日が(_今日) :- date(_今日). '月~金の場合は"今日は仕事",土日の場合は"今日はお休み"と'(_今日,_出力文字列) :- '月~金の場合は"今日は仕事"と'(_今日,_出力文字列). '月~金の場合は"今日は仕事",土日の場合は"今日はお休み"と'(_今日,_出力文字列) :- '土日の場合は"今日はお休み"と'(_今日,_出力文字列). '月~金の場合は"今日は仕事"と'(_今日,今日は仕事) :- 今日は何曜日(_今日,_曜日), '月~金'(_曜日). '土日の場合は"今日はお休み"と'(_曜日,今日はお休み). 今日は何曜日(_今日,_曜日), 土日(_曜日). 今日は何曜日(_今日,_曜日) :- day_of_the_week(_今日,_曜日番号), '曜日番号・曜日'(_曜日番号,_曜日). '曜日番号・曜日'(1,月曜). '曜日番号・曜日'(2,火曜). '曜日番号・曜日'(3,水曜). '曜日番号・曜日'(4,木曜). '曜日番号・曜日'(5,金曜). '曜日番号・曜日'(6,土曜). '曜日番号・曜日'(7,日曜). '月~金'(月曜). '月~金'(火曜). '月~金'(水曜). '月~金'(木曜). '月~金'(金曜). '土日'(土曜). '土日'(日曜). 出力する(_出力文字列) :- writef('%w\n',[_出力文字列]). % 以下のサイトは '現在日時が月~金の場合は"今日は仕事",土日の場合は"今日はお休み"と出力する' :- 現在日時が(_現在日時), '月~金の場合は"今日は仕事",土日の場合は"今日はお休み"と'(_現在日時,_出力文字列), 出力する(_出力文字列). 現在日時が(_現在日時) :- date(_現在日時). '月~金の場合は"今日は仕事",土日の場合は"今日はお休み"と'(_現在日時,_出力文字列) :- '月~金の場合は"今日は仕事"と'(_現在日時,_出力文字列). '月~金の場合は"今日は仕事",土日の場合は"今日はお休み"と'(_現在日時,_出力文字列) :- '土日の場合は"今日はお休み"と'(_現在日時,_出力文字列). '月~金の場合は"今日は仕事"と'(_現在日時,今日は仕事) :- 今日は何曜日(_現在日時,_曜日), '月~金'(_曜日). '土日の場合は"今日はお休み"と'(_現在日時,今日はお休み). 今日は何曜日(_現在日時,_曜日), 土日(_曜日). 今日は何曜日(_現在日時,_曜日) :- day_of_the_week(_現在日時,_曜日番号), '曜日番号・曜日'(_曜日番号,_曜日). '曜日番号・曜日'(1,月曜). '曜日番号・曜日'(2,火曜). '曜日番号・曜日'(3,水曜). '曜日番号・曜日'(4,木曜). '曜日番号・曜日'(5,金曜). '曜日番号・曜日'(6,土曜). '曜日番号・曜日'(7,日曜). '月~金'(月曜). '月~金'(火曜). '月~金'(水曜). '月~金'(木曜). '月~金'(金曜). '土日'(土曜). '土日'(日曜). 出力する(_出力文字列) :- writef('%w\n',[_出力文字列]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/649 # # [1] 授業単元:プログラミング基礎 # [2] 問題文(含コード&リンク): # ダイエットファイルに # # 20100930,curry and rice # 20101003,kitsune soba # 20101003,rice ball # # のような形で日付とその日食べた昼食が保存されているとする. # コマンド行引数にダイエットファイル名と日付(yyyymmdd 形式) を指定して実行すると, # ファイルの中から指定した日付を含む行を検索し,その日の昼食を出力するプログラムを作成せよ. # また,引数としてファイルと文字列を指定しなかった場合に,使い方を出力して終了するようにせよ. # 日付の検索には,標準関数char *strstr(const char *str1, const char *str2); を使用するのが簡単である. # # 【実行例】 # % ./q3-3 diet.txt 20100929 # date 20100929 was not found in file diet.txt # % ./q3-3 diet.txt 20101003 # 20101003,kitsune soba # 20101003,rice ball # % ./q3-3 # Usage: ./q3-3 filename date(yyyymmdd) # % # # program :- パラメータを得る(_ファイル,_日付), get_split_lines(_ファイル,[','],LL), 日付をキーに検索する(_日付,LL,LL2), 検索した行を表示する(_日付,LL2). halt. パラメータを得る(_ファイル,_日付) :- user_paramaters(L), 診断(L,_ファイル,_日付),!. 診断([_ファイル,_日付],_ファイル,_日付) :- !. 診断(_,_,_) :- write('Usage: ./prolog filename date(yyyymmdd)\n'), halt. 日付をキーに検索する(_,[],[]) :- !. 日付をキーに検索する(_日付,[[_日付,_その日食べた昼食]|R1],[[_日付,_その日食べた昼食]|R2]) :- 日付をキーに検索する(_日付,R1,R2),!. 日付をキーに検索する(_日付,[_|R1],R2) :- 日付をキーに検索する(_日付,R1,R2),!. 検索した行を表示する([]) :- !. 検索した行を表示する([[_,_日付,_その日食べた昼食]|R]) :- write('%t,%t\n',[_日付,_その日食べた昼食]), 検索した行を表示する(R). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/477 # # [1] アルゴリズム論 # [2] Unixコマンドのgrepを実装したmygrepの作成 #   コマンドライン引数で検索文字列とファイル名をもらい、ファイル内に検索文字列が含まれる行があればその行を出力する #   正規表現に対応させる必要はない # [3] # [3.1]windows xp  # [3.2]gcc  # [3.3]c言語 # [4] 無期限 # [5] strstrは使用禁止 # # よろしくおねがいします # program :- user_paramaters([_検索文字列,_ファイル名]), open(_ファイル名,read,Instream), grep_line(Instream,_検索文字列), close(Instream), halt. grep_line(Instream,_検索文字列) :- at_end_of_stream(Instream),!. grep_line(Instream,_検索文字列) :- get_line(Stream,Line), sub_atom(Line,_,_,_,_検索文字列), writef('%t\n',[Line]), fail. grep_line(Instream,_検索文字列) :- grep_line(Instream,_検索文字列). % 以下のサイトは # 出典: プログラムのお題スレ Part4 #38 # # 標準入力から与えられたフォーマットを元に年齢を求めて出力せよ # 標準入力から以下の形式で与えられます # YYYY/MM/dd # # 年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる。 '標準入力から与えられたフォーマットを元に年齢を求めて出力せよ 標準入力から以下の形式で与えられます YYYY/MM/dd 年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる。' :- '標準入力から与えられたフォーマット(YYYY/MM/dd)を元に'(_年,_月,_日), '年齢を求めて(年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる)'(_年,_月,_日,_年齢), 出力せよ(_年齢). '標準入力から与えられたフォーマット(YYYY/MM/dd)を元に'(_年,_月,_日) :- get_line(_文字列), read_term_from_atom(_文字列,_年/_月/_日,[]). '年齢を求めて(年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる)'(_年,_月,_日,_年齢) :- date(date(_今日_年,_今日_月,_今日_日)), 誕生日の前日(_今日_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日), '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢). 誕生日の前日(_年,_月,1,_前日_年,_前日_月,_前日_日) :- 誕生日の前月と月末日を得る(_年,_月,1,_前日_年,_前日_月,_前日_日). 誕生日の前日(_年,_月,_日,_年,_月,_前日_日) :- \+(_日 = 1), succ(_前日_日,_日). 誕生日の前月と月末日を得る(_誕生日の年,1,1,_誕生日の前年,12,31) :- succ(_誕生日の前年,_誕生日の年). 誕生日の前月と月末日を得る(_年,3,1,_年,2,_誕生日の前月末日) :- '3月1日はうるう年であるか否かで誕生日の前月末日が変わる'(_年,_誕生日の前月末日). 誕生日の前月と月末日を得る(_年,_誕生日の月,1,_年,_誕生日の前月,30) :- '誕生日の前月が小の月(2月を除く)'(_誕生日の月,_誕生日の前月). 誕生日の前月と月末日を得る(_年,_誕生日の月,1,_年,_誕生日の前月,31) :- '誕生日の前月が大の月(12月を除く)'(_誕生日の月,_誕生日の前月). '3月1日はうるう年であるか否かで誕生日の前月末日が変わる'(_年,29) :- うるう年(_年). '3月1日はうるう年であるか否かで誕生日の前月末日が変わる'(_年,28) :- \+(うるう年(_年)). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. '誕生日の前月が小の月(2月を除く)'(_誕生日の月,_誕生日の前月) :- succ(_誕生日の前月,_誕生日の月), member(_誕生日の前月,[4,6,9,11]). '誕生日の前月が大の月(12月を除く)'(_誕生日の月,_誕生日の前月) :- succ(_誕生日の前月,_誕生日の月), member(_誕生日の前月,[1,3,5,7,8,10]). '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- まだ誕生日の前日になっていない(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢). '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- 既に誕生日の前日を過ぎている(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢). まだ誕生日の前日になっていない(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 < _誕生日の前日_月, _年齢 is _誕生日の前日の年 - _年 - 1. まだ誕生日の前日になっていない(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 = _誕生日の前日_月, _日 < _誕生日の前日の日, _年齢 is _誕生日の前日_年 - _年 - 1. 既に誕生日の前日を過ぎている(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 > _誕生日の前日_月, _年齢 is _誕生日の前日の年 - _年. 既に誕生日の前日を過ぎている(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 = _誕生日の前日_月, _日 >= _誕生日の前日_日, _年齢 is _誕生日の前日_年 - _年. 出力せよ(_年齢) :- writef('%t歳です\n',[_年齢]). % 以下のサイトは # 出典: プログラムのお題スレ Part4 #38 # # 標準入力から与えられたフォーマットを元に年齢を求めて出力せよ # 標準入力から以下の形式で与えられます # YYYY/MM/dd # # 年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる。 '標準入力から与えられたフォーマットを元に年齢を求めて出力せよ 標準入力から以下の形式で与えられます YYYY/MM/dd 年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる。' :- '標準入力から与えられたフォーマット(YYYY/MM/dd)を元に'(_年,_月,_日), '年齢を求めて(年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる)'(_年,_月,_日,_年齢), 出力せよ(_年齢). '標準入力から与えられたフォーマット(YYYY/MM/dd)を元に'(_年,_月,_日) :- get_line(_文字列), read_term_from_atom(_文字列,_年/_月/_日,[]). '年齢を求めて(年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる)'(_年,_月,_日,_年齢) :- date(date(_今日_年,_今日_月,_今日_日)), 誕生日の前日(_今日_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日), '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢). 誕生日の前日(_年,1,1,_前日_年,12,31) :- succ(_前日_年,_年),!. 誕生日の前日(_年,3,1,_年,2,29) :- うるう年(_年),!. 誕生日の前日(_年,3,1,_年,2,28) :- \+(うるう年(_年)),!. 誕生日の前日(_年,_月,1,_年,_前日_月,31) :- member(_月,[2,4,6,9,11]), succ(_前日_月,_月),!. 誕生日の前日(_年,_月,1,_年,_前日_月,30) :- member(_月,[5,7,8,10,12]), succ(_前日_月,_月),!. 誕生日の前日(_年,_月,_日,_年,_月,_前日_日) :- succ(_前日_日,_日). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 > _誕生日の前日_月, _年齢 is _誕生日の前日の年 - _年. '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 < _誕生日の前日_月, _年齢 is _誕生日の前日の年 - _年 - 1. '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 = _誕生日の前日_月, _日 >= _誕生日の前日_日, _年齢 is _誕生日の前日_年 - _年. '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 = _誕生日の前日_月, _日 < _誕生日の前日の日, _年齢 is _誕生日の前日_年 - _年 - 1. 出力せよ(_年齢) :- writef('%t歳です\n',[_年齢]). % 以下のサイトは # 現在日時から1時間前の日時を求めるにはどうすれば? # # 2013.03.15 14:30 ⇒ 2013.03.15 13:30 # 2013.03.15 00:30 ⇒ 2013.03.14 23:30 # 2013.01.01 00:30 ⇒ 2012.12.31 23:30 # # こんな繰り下がりを自前で計算しないとダメなの? # AddHours(-1)みたいなのはない? % % SWI-Prologに於ける時差時刻(1970年1月1日以降) % n秒前の時刻(_n秒前,_年,_月,_日,_時,_分,_秒,_年_n,_月_n,_日_n,_時_n,_分_n,_秒_n) :- _年 >= 1970, date_time_stamp(date(_年,_月,_日,_時,_分,_秒,0,-,-),Stamp), stamp_date_time(Stamp,date(_年_n,_月_n,_日_n,_時_n,_分_n,_秒_n,_,_,_),_n秒前). n秒後の時刻(_n秒後,_年,_月,_日,_時,_分,_秒,_年_n,_月_n,_日_n,_時_n,_分_n,_秒_n) :- _年 >= 1970, _n秒後_2 is _n秒後 * -1, date_time_stamp(date(_年,_月,_日,_時,_分,_秒,0,-,-),Stamp), stamp_date_time(Stamp,date(_年_n,_月_n,_日_n,_時_n,_分_n,_秒_n,_,_,_),_n秒後_2). % 以下のサイトは # 出典:: 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. % 以下のサイトは # いろんな言語で宿題 第五編 #707 # 問題 # 明日が何曜日なのか表示せよ。 # % % SWI-Prologで明日はどうやって取得するのか。今日は date/1 で取得できる。 % '明日が何曜日なのか表示せよ。' :- '今日の年、月、日を得て、翌日の、年、月、日を得る'(_翌日の年,_翌日の月,_翌日の日), 翌日が何曜日か(_翌日の年,_翌日の月,_翌日の日,_曜日), '表示せよ。'(_曜日). '今日の年、月、日を得て、翌日の、年、月、日を得る'(_翌日の年,_翌日の月,_翌日の日) :- '今日の年、月、日を得て、'(_今日の年,_今日の月,_今日の日), '翌日の、年、月、日を得る'(_今日の年,_今日の月,_今日の日,_翌日の年,_翌日の月,_翌日の日). '今日の年、月、日を得て、'(_今日の年,_今日の月,_今日の日) :- date(date(_今日の年,_今日の月,_今日の日)). '翌日の、年、月、日を得る'(_今日の年,12,31,_翌日の年,1,1) :- _翌日の年 is _今日の年 + 1,!. '翌日の、年、月、日を得る'(_年,_今日の月,_今日の日,_年,_翌日の月,1) :- 月末日(_年,_今日の月,_今日の日), _翌日の月 is _今日の月 + 1,!. '翌日の、年、月、日を得る'(_年,_月,_今日の日,_年,_月,_翌日の日) :- _翌日の日 is _今日の日 + 1. 月末日(_,2,29) :- !. 月末日(_年,2,28) :- \+(うるう年(_年)),!. 月末日(_,_今日の月,31) :- 大の月(_今月の月). 月末日(_,_今日の月,30) :- 小の月(_今月の月). 大の月(_今月の月) :- member(_今月の月,[1,3,5,7,8,10,12]). 小の月(_今月の月) :- member(_今月の月,[2,4,6,9,11]). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. うるう年(_年) :- \+(0 is _年 mod 4). 翌日が何曜日か(_翌日の年,_翌日の月,_翌日の日,_曜日) :- day_of_the_week(date(_翌日の年,_翌日の月,_翌日の日),_曜日番号), nth0(_曜日番号,[日曜,月曜,火曜,水曜,木曜,金曜,土曜],_曜日). '表示せよ。'(_曜日) :- writef('%t',[_曜日]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/647 # # #インデントが崩れる場合は http://ime.nu/pastebin.com/26BkXDHs をみてください。 # # -- # -- 商品テーブルと、 # -- # create table items ( # id serial primary key, # name varchar(255) not null, # price integer not null -- 単価 # ); # # -- # -- 販売テーブルがあるとする。 # -- # create table sales ( # id serial primary key, # item_id integer not null references items(id), # count integer not null default 1, -- 個数 # total integer not null, -- 単価 * 個数 # created_at timestamp not null default current_datetime # ) # # -- # -- 日付を指定して、その日の商品別販売金額合計を大きい順に表示したい。 # -- どういうSQLを書けばいいの? # -- こんなかんじで書けたらいいんだけど。 # -- # select items.id, items.name # from items, # (select item_id, sum(total) as sum_total # from sales # where date(created_at) = '2012-04-01' # group by item_id) as totals # where items.id = totals.item_id # order by totals.sum_total desc; # # '日付を指定して、その日の商品別販売金額合計を大きい順に表示したい' :- '日付を指定して、'(_日付), その日の商品別販売金額合計を(_日付,L1), 大きい順に表示する(L1). '日付を指定して、'(_日付) :- write('日付を8桁の整数で入力して下さい : '), get_line(Line), '日付を指定して、の診断'(Line,_日付),!. '日付を指定して、'(_日付) :- '日付を指定して、'(_日付). '日付を指定して、の診断'(Line,_日付) :- atom_to_term(Line,_8桁の整数,_), '8桁の整数'(_8桁の整数), '8桁の整数から日付を得る'(_8桁の整数,_日付),!. '日付を指定して、の診断'(Line,_日付) :- writef('入力された %t からは日付が得られませんでした。再入力をお願いします\n',[Line]), fail. '8桁の整数'(_8桁の整数) :- integer(_8桁の整数), _8桁の整数 >= 10000000, _8桁の整数 =< 99999999. '8桁の整数から日付を得る'(_8桁の整数,_日付) :- swritef(_日付文字列,'%t',[_8桁の整数]), sub_atom(_日付文字列,0,4,_,_年), sub_atom(_日付文字列,4,2,_,_月), sub_atom(_日付文字列,6,2,_,_日), atomic_list_concat([_年,'-',_月,'-',_日],_日付),!. その日の商品別販売金額合計を(_日付,L1) :- findsetof(_id,( sales(_id,_item_id,_count,_total,_日付)), L), findall([_total,_id],( append(_,[_id|R],L), 商品の販売合計(_日付,_id,_合計金額)), L1). 商品の販売合計(_日付,_id,_合計金額) :- findsum(_total,( sales(_id,_item_id,_count,_total,_日付)), _合計金額). 大きい順に表示する(L1) :- 大きい順に(L1,L2), 表示する(L2). 大きい順に(L1,L2) :- sort(L1,L3), reverse(L3,L2). 表示する(_日付,[]). 表示する(_日付,[[_合計金額,_id]|R]) :- items(_id,_name,_price), writef('%t %t %20l %10r\n',[_日付,_id,_name,_合計金額]), 表示する(_日付,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/327 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク):以下の実行例のように,プログラムの実行が初めてで # あればその旨のメッセージを表示し,実行が初めてでな # ければ,1 回前(前回)に実行したときの日付と時刻を # 表示するプログラムを作成したい.以下の要件を満たす # プログラムを作成せよ. # 「実行例」 # ./ab # 本プログラムを実行するのは初めてですね。 # # ./ab # 前回は2012 年1 月12 日17 時28 分35 秒でした。 # :- dynamic. program :- consult('ab実行履歴.pl'), 実行履歴表示, 実行履歴変更. 実行履歴表示 :- \+(実行履歴(_,_,_,_,_)), write('本プログラムを実行するのは初めてですね。 \n'),!. 実行履歴表示 :- 実行履歴(_年,_月,_日,_分,_秒), writef('前回は%t 年%t 月%t 日%t 時%t 分%t 秒でした。\n',[_年,_月,_日,_分,_秒]). 実行履歴変更 :- date(_年,_月,_日,_時,_分,S,Off,TZ,DST), 実行履歴変更(_年,_月,_日,_時,_分),!. 実行履歴変更(_年,_月,_日,_時,_分) :- retract(実行履歴(_,_,_,_,_)), tell('ab実行履歴.pl'), writef(':- dynamic(実行履歴/5).\n実行履歴(%t,%t,%t,%t,%t).\n',[_年,_月,_日,_時,_分])), told. 実行履歴変更(_年,_月,_日,_時,_分) :- writef(':- dynamic(実行履歴/5).\n実行履歴(%t,%t,%t,%t,%t).\n',[_年,_月,_日,_時,_分])), told. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/411 # # MySQL 5.1.46 # #   ≪item≫ # ───────── # id  name  category # ───────── # 1  Name1   2 # 2  Name2   1 # 3  Name3   1 # 4  Name4   6 # 5  Name5   4 # 6  Name6   8 # 7  Name7   2 # 8  Name8   2 # ───────── # # item 内のデータについて、 category が 2 のものだけ category の値を 7 に振り替えたいと思い # # UPDATE item SET category = 7 WHERE category = 2 # # を発行したのですが、うまく動作しません。 # こういう場合にうまくいく方法を教えてください。 # # 'item 内のデータについて、 category が 2 のものだけ category の値を 7 に振り替えたいと思い' :- 節順序を変更するupdate(item/3,[[3,2]],[[3,7]]). 節順序を変更するupdate(_述語名/_アリティ,_鍵情報ならび,_更新情報ならび,L) :- 節順序を変更するupdate(先頭,_述語名/_アリティ,_鍵情報ならび,_更新情報ならび,L),!. 節順序を変更するupdate(先頭,_述語名/_アリティ,_鍵情報ならび,_更新情報ならび) :- length(L1,_アリティ), 鍵情報を設定する(_鍵情報ならび,L1), _述語 =.. [_述語名|L1], findall(L2,( retract(_述語), 更新情報を設定する(_更新情報ならび,L1,L2)), L), 更新ならびを先頭に付加する(_述語名,L),!. 節順序を変更するupdate(末尾,_述語名/_アリティ,_鍵情報ならび,_更新情報ならび) :- length(L1,_アリティ), 鍵情報を設定する(_鍵情報ならび,L1), _述語 =.. [_述語名|L1], findall(L2,( retract(_述語), 更新情報を設定する(_更新情報ならび,L1,L2)), L), 更新ならびを末尾に付加する(_述語名,L),!. 更新ならびを先頭に付加する(_述語名,L) :- append(_,[L3|R],L), _述語3 =.. [_述語名|L3], asserta(_述語3), R = []. 更新ならびを末尾に付加する(_述語名,L) :- append(_,[L3|R],L), _述語3 =.. [_述語名|L3], assertz(_述語3), R = []. 鍵情報を設定する([],L). 鍵情報を設定する([[_鍵位置,_鍵]|R],L) :- nth1(_鍵位置,L,_鍵), 鍵情報を設定する(R,L). 更新情報を設定する([],L,L). 更新情報を設定する([[_更新位置,_更新値]|R1],L1,L) :- append(L0,[_|R],L1), length([_|L0],_更新位置), append(L0,[_更新値|R],L2), 更新情報を設定する(R1,L2,L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/607 # # MySQLServer5.1(WinXP)です。 # # 下記のような3種類のテーブルがあります。 # これを集計して、指定したユーザーの指定月のアクセス日時と売上げ金額を表にしたいと思っています。 # # こんな感じに。 # # +--+--------+----------+-------+-----+ # | id | username| date   | access | sales | # +--+--------+----------+-------+-----+ # | 1 | admin | 2010-11-13 |   2 | 5000 | # | 1 | admin | 2010-11-14 |   2 | 5000 | # | 1 | admin | 2010-11-15 |  1 | 20000 | # +--+--------+----------+-------+-----+ # # # SELECT u.id AS id, u.username, DATE(a.created_at) AS date, COUNT(*) AS access, SUM(s.amount) AS sales # FROM sf_guard_user u INNER JOIN sales s ON u.username = s.user_id LEFT JOIN access_log a ON u.username = a.user_id # WHERE (u.username = 'admin' AND a.created_at > '2010-11-01 00:00:00' AND a.created_at < '2010-11-30 23:59:59') GROUP BY date ORDER BY a.created_at; # とやってみたのですがダメでした;; # # # ■ユーザー情報テーブル # mysql> select id,username from user; # +--+---------+ # | id | username | # +--+---------+ # | 1 | admin   | # +--+---------+ # # ■アクセスログテーブル # mysql> select * from access_log; # +--+-------+--------+------------------+ # | id | user_id | ip     | created_at      | # +--+-------+--------+------------------+ # | 1 | admin  | 127.0.0.1 | 2010-11-13 21:56:54 | # | 2 | admin  | 127.0.0.1 | 2010-11-13 21:56:54 | # | 3 | admin  | 127.0.0.1 | 2010-11-14 21:56:54 | # | 4 | admin  | 127.0.0.1 | 2010-11-14 21:56:54 | # | 5 | admin  | 127.0.0.1 | 2010-11-15 21:56:54 | # +--+-------+--------+------------------+ # # ■売上げ金額テーブル # mysql> select * from sales; # +--+-------+------+------------------+ # | id | user_id | amount| created_at      | # +--+-------+------+------------------+ # | 1 | admin  |  5000 | 2010-11-13 21:56:54 | # | 2 | admin  |  5000 | 2010-11-14 21:56:54 | # | 3 | admin  |  5000 | 2010-11-15 21:56:54 | # | 4 | admin  |  5000 | 2010-11-15 21:56:54 | # +--+-------+------+------------------+ # # '下記のような3種類のテーブルがあります。これを集計して、指定したユーザーの指定月のアクセス日時と売上げ金額を表にしたいと思っています。'(_username) :- user(_id,_username), アクセスログテーブル_date(_username,_アクセスログ_dateならび), 売上げ金額テーブル_date(_username,_売上金額テーブル_dateならび), 共通部分(_アクセスログ_dateならび,_売上金額テーブル_dateならび,_date_共通部分), write('+--+-------+--------+------------------+ \n'), write('| id | user_id | amount| created_at      | \n'), write('+--+-------+------+------------------+ \n), append(L0,[_date|R],_date_共通部分), length(L0,Len0), _id is Len0 + 1, count(( access_log(_,_user_id,_ip,_create_at), sub_atom(_create_at,0,10,_,_create_at)), _access), findsum(_amount,( sales(_,_user_id,_amount,_create_at), sub_atom(_create_at,0,10,_,_create_at)), _sales), write_formatted('| %t | %t | %t | %t | %t |\n',[_id,_username,_date,_access,_sales]), R = [], write('+--+-------+------+------------------+\n'). アクセスログテーブル_date(_user_id,_dateならび) :- findsetof(_date,( access_log(_,_user_id,_,_created_at), sub_atom(_create_at,0,10,_,_date)), _dateならび). 売上げ金額テーブル_date(_user_id,_dateならび) :- findsetof(_date,( sales(_,_user_id,_amount,_created_at), sub_atom(_create_at,0,10,_,_date)), _dateならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/649 # # [1] 授業単元:プログラミング基礎 # [2] 問題文(含コード&リンク): # ダイエットファイルに # # 20100930,curry and rice # 20101003,kitsune soba # 20101003,rice ball # # のような形で日付とその日食べた昼食が保存されているとする. # コマンド行引数にダイエットファイル名と日付(yyyymmdd 形式) を指定して実行すると, # ファイルの中から指定した日付を含む行を検索し,その日の昼食を出力するプログラムを作成せよ. # また,引数としてファイルと文字列を指定しなかった場合に,使い方を出力して終了するようにせよ. # 日付の検索には,標準関数char *strstr(const char *str1, const char *str2); を使用するのが簡単である. # # 【実行例】 # % ./q3-3 diet.txt 20100929 # date 20100929 was not found in file diet.txt # % ./q3-3 diet.txt 20101003 # 20101003,kitsune soba # 20101003,rice ball # % ./q3-3 # Usage: ./q3-3 filename date(yyyymmdd) # % # # program :- パラメータを得る(_ファイル,_日付), get_split_lines(_ファイル,[','],LL), 日付をキーに検索する(_日付,LL,LL2), 検索した行を表示する(_日付,LL2). halt. パラメータを得る(_ファイル,_日付) :- user_paramaters(L), 診断(L,_ファイル,_日付),!. 診断([_ファイル,_日付],_ファイル,_日付) :- !. 診断(_,_,_) :- write('Usage: ./prolog filename date(yyyymmdd)\n'), halt. 日付をキーに検索する(_,[],[]) :- !. 日付をキーに検索する(_日付,[[_日付,_その日食べた昼食]|R1],[[_日付,_その日食べた昼食]|R2]) :- 日付をキーに検索する(_日付,R1,R2),!. 日付をキーに検索する(_日付,[_|R1],R2) :- 日付をキーに検索する(_日付,R1,R2),!. 検索した行を表示する([]) :- !. 検索した行を表示する([[_,_日付,_その日食べた昼食]|R]) :- write('%t,%t\n',[_日付,_その日食べた昼食]), 検索した行を表示する(R). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/290 # # tblA # pkey|value # ----+----- # 1  |a # 2  |b # # tblB # pkey|value # ----+----- # 1  |c # # ・欲しい結果 # tblA # pkey|value # ----+----- # 1  |c # 2  |b tblA(1,a). tblA(2,B). tblB(1,c). update(_対象述語/Arity1,_キー位置1,_被置換項位置,_置換指定述語/Arity2,_キー位置2,_置換項位置) :-   length(L1,Arity1),   length(L2,Arity2),   P1 =.. [_対象述語|L1],   P2 =.. [_置換指定述語|L2],   list_nth(_キー位置1,L1,A),   list_nth(_キー位置2,L2,A),   list_nth(_置換項位置,L2,B),   call(P2),   call(P1),   retract(P1),   ならびの位置指定置換(_被置換項位置,B,L1,L3),   P3 =.. [_対象述語|L3],   asserta(P3).