このディレクトリの索引
% ならびのcut 文字列はsub_atom/5でcutし易いがならびは案外面倒

cut(L,[],[]) :- !.
cut(L,[L2|R],[Y|R1])
  :-
    list(L2),
    cut(L,L2,Y),
    cut(L,R,R1),!.
cut(L,[S-(%24)|R],[Y|R1])
  :-
    length(L,Len),
    cut(L,[S-Len|R],[Y|R1]),!.
cut(L,[(^)-E|R],[Y|R1])
  :-
    cut(L,[1-E|R],[Y|R1]),!.
cut(L,[S-E|R],Y)
  :-
    list(L),
    findall(N,for(S,N,E),L2),
    append(L2,R,L3),
    cut(L,L3,Y),!.
cut(L,[S|R],[Y|R1])
  :-
    list(L),
    list_nth(S,L,Y),
    cut(L,R,R1),!.
cut(_対象文字列,_位置情報ならび,_副文字列)
  :-
    atomic(_対象文字列),
    cut(_対象文字列,_位置情報ならび,'',_副文字列),!.
cut(_対象文字列,_位置情報ならび,_区切り文字,_副文字列)
  :-
    atomic(_対象文字列),
    decompcons(_対象文字列,L),
    cut_2(L,_位置情報ならび,_部分ならび),
    concat(_部分ならび,_区切り文字,_副文字列).
cut_2(_,[],[]) :- !.
cut_2(L,[S-E|R],[B|R1])
  :-
    cut(L,[S-E],U),
    concat_atom(U,B),
    cut_2(L,R,R1),!.
cut_2(L,[P|R],[B|R1])
  :-
    cut(L,[P],U),
    concat_atom(U,B),
    cut_2(L,R,R1),!.



'BMI個人データの収集' :-
    write('+--------------------------------------+\n'),
    write('| 今から個人データを入力してもらいます |\n'),
    write('+--------------------------------------+\n'), 
    repeat,
    整数項目の取得(入力人数,'入力する人数を設定してください(1〜10)> ',_,nl,_入力人数),
    'BMI個人データの収集'(1,_入力人数),
    write(' 何かキーを押してください '),
    get_line(_キー),
    sub_atom(_キー,0,1,_,q).

'BMI個人データの収集'(N,E) :- N > E,!.
'BMI個人データの収集'(N,E) :-
    'BMI個人データの取得'(N),
    M is N+1,
    'BMI個人データの収集'(M,E),!.
'BMI個人データの収集'(N,E) :- 'BMI個人データの収集'(N,E).

'BMI個人データの取得'(N) :-
    write_formatted('*** %t人目のデータを入力してください ***\n',[N]),
    苗字の取得(_苗字),
    名前の取得(_名前),
    整数項目の取得(年齢,'・年齢を入力してください(整数)> ',_,true,_年齢),
    整数項目の取得(身長,'・身長を入力してください(整数)> ',_,nl,_身長),
    整数項目の取得(体重,'・体重を入力してください(整数)> ',_,nl,_体重),
    'BMI判定'(_身長,_体重,BMI,_判定),  
    個人データの確認(N,_苗字,_名前,_年齢,_身長,_体重,BMI,_判定),
    assertz('BMI個人データ'(_苗字,_名前,_年齢,_身長,_体重,BMI,_判定)).

個人データの確認(N,_苗字,_名前,_年齢,_身長,_体重,BMI,_判定) :-
    write('+++ 個人データを確認します +++\n'),
    write_formatted('[%t人目]\n',[N]),
    write_formatted('苗字: %t\n',[_苗字]),
    write_formatted('名前: %t\n',[_名前]),
    write_formatted('年齢: %t歳\n',[_年齢]),
    write_formatted('身長: %tcm\n',[_身長]),
    write_formatted('体重: %tkg\n',[_体重]),
    write_formatted('BMI : %t [ %t ]\n',[BMI,_判定]),
    nl,!.

'BMI判定'(_身長,_体重,BMI,_判定) :-
    BMI is _体重/_身長/_身長*10000,
    'BMI判定'(BMI,_判定).

'BMI判定'(BMI,やせてます) :- BMI =< 18.5.
'BMI判定'(BMI,普通です) :- BMI > 18.5,BMI < 25.0.
'BMI判定'(BMI,レッツエクササイズ!) :- BMI >= 25.0. 

苗字の取得(_苗字) :-
    write('・苗字を入力してください(半角ローマ字)> '),
    get_line(_苗字).

名前の取得(_名前) :-
    write('・名前を入力してください(半角ローマ字)> '),
    get_line(_名前).

整数項目の取得(_項目名,_入力促進文字列,_入力文字列,_オプション,_値) :-
    write(_入力促進文字列),
    get_line(_入力文字列),
    整数項目の取得_2(_項目名,_入力文字列,_値),
    call(_オプション),!.
整数項目の取得(_項目名,_入力促進文字列,_入力文字列,_オプション,_値) :-
    整数項目の取得(_項目名,_入力促進文字列,_入力文字列,_オプション,_値).

整数項目の取得_2(_項目名,_入力文字列,_値) :- atoi(_入力文字列,_値),!.
整数項目の取得_2(_項目名,_入力文字列,_) :-
    write_formatted('%tの入力[%t]に問題があります\n再入力してください\n',[_項目名,_入力文字列]),
    fail.

atoi(Atom,Integer) :-
    atom(Atom),
    atom_to_chars(Atom,Chars),
    number_to_chars(Integer,Chars),
    integer(Integer),!.

atoi(Atom,Integer) :-
    integer(Integer),
    number_to_chars(Integer,Chars),
    concat_atom(Chars,Atom),!.
# 【 課題 】 # 指定したフォルダの中身をフォルダの構成などを含めて完全にバックアップする # ソフトを作成すること。 # 尚、バックアップファイルには以下の機能を持つようにすること。 # ・ 対象ファイルや除外ファイルを指定できるような # 仕組みを持つこと。 # ・ バックアップ経過のログを作成すること。 # ログにはバックアップ処理の実行時間を出力すること。 # また、既にあるフォルダが指定された場合の対処についてもそれぞれ考慮して # 機能の実装を行うこと。 # 作業に余裕のある人は以下の機能を追加すること。 # ・バックアップしたファイルを圧縮する仕組みの追加。 # ・プログラムが常駐する仕組みの追加。 t111(Dir,SaveDir) :- concat_atom(['cp -R ',Dir,' ',SaveDir],S), shs(S,_). /* concat_atom(['ls -l ',Dir],S), shs(S,L), member(A,L), not(sub_atom(A,1,1,_,d)), concat_atom([Dir,/,A],FI), concat_atom([SaveDir,/,A],FO), copy(FI,FO), fail; true. */ shs(S,L) :- system(S,user_input,Input),get_lines(Input,L),close(Input). get_lines(File,Lines) :- get_chars(File,L),chars_lines(L,Lines),!. get_chars(Input,end_of_file,[]) :- !. get_chars(Input,X,[X|R]) :- get_char(Input,Y),get_chars(Input,Y,R) . get_chars(Input,L) :- get_char(Input,X),get_chars(Input,X,L),!. chars_lines([],[],[]) :- !. chars_lines(['\r'],[],[]) :- !. chars_lines(['\r',A|R],[],[A|R]) :- \+(A = '\n'),!. chars_lines(['\r','\n'|R],[],R) :- !. chars_lines(['\n'|R],[],R) :- !. chars_lines([A|R1],[A|R2],Z) :- chars_lines(R1,R2,Z). chars_lines([],[]) :- !. chars_lines(L,[A|R2]) :- chars_lines(L,U,R),concat_atom(U,A),chars_lines(R,R2). concat_atom([],'') :- !. concat_atom([A|R],S) :- concat_atom(R,S2),atom_concat(A,S2,S). % [1] 授業単元:Ruby % [2] 問題文 ファイル分割 % % 下記は、hoge.csvを均等に4分割して tmp/ 以下に書き込むプログラムである。 % % ruby split.rb hoge.csv tmp/ 4 % % 出力例 % tmp/1out.csv % tmp/2out.csv % tmp/3out.csv % tmp/4out.csv t131(_分割されるファイル,_分割数) :- get_lines(_分割されるファイル,[_先頭行|L]), length(L,Len), Div is Len // _分割数, Mod is Len mod _分割数, t131(L,Div,Mod,1,X), t131(_分割数,_先頭行,X), fail; true. t131(_分割数,_先頭行,L) :- for(1,N,_分割数), list_nth(N,L,X), concat_atom(['tmp/',N,'out.csv'],F), put_lines(F,[_先頭行|X]), N=_分割数. t131([],_,_,_,_). t131(L,Div,Mod,Gth,[X|R]) 切り取り行数(Div,Mod,Gth,M), member_n(M,X,L,RL), Gth2 is Gth+1, t131(RL,Div,Mod,Gth2,R). 切り取り行数(Div,Mod,Nth,X) :- Nth > Mod,X is Div. 切り取り行数(Div,Mod,Nth,X) :- Nth =< Mod,X is Div + 1. member_n(N,X,L,R) :- length(X,N), append(X,R,L). % [1] 授業単元:C言語演習課題 % 問題 % 年と月を「YYYY/MM」と入力し、入力された月のカレンダーを表示しなさい。 % % 1752年10月以前、及び10000年1月以降はエラーを返す。 % % 出力形式は以下のとおり % ・1行目は該当月の1日が月曜日でなければ、前月の最終月曜日から表示。 % ・該当月の最終日が日曜日でなければ、翌月の第1日曜日まで表示。 % ・6行目の表示が必要ない場合は表示しない。 % % うるう年判定は以下のとおり % ・年が4で割り切れる年はうるう年。 % ・年が100で割り切れる年はうるう年でない。 % ・年が400で割り切れる年はうるう年である。 % % [出力例] % 年月日を入力:2009/07 % % 月 火 水 木 金 土 日 % 29 30 01 02 03 04 05 % 06 07 08 09 10 11 12 % 13 14 15 16 17 18 19 % 20 21 22 23 24 25 26 % 27 28 29 30 31 01 02 課題のカレンダー(_年/_月) :- not((_年/_月 >= 1752/10,_年/_月 =< 10000/1)), write('エラー: 入力された年月は範囲を逸脱しています\n'),!. 課題のカレンダー(_年/_月) :- _年/_月 @=< 2009/6,!, 曜日検索(_日付,_曜日,2009/6/13,土曜), _日付=_年/_月/1, 課題のカレンダー表示(_日付,_曜日). 課題のカレンダー(_年/_月) :- _年/_月 @>= 2009/6,!, 曜日検索(2009/6/13,土曜,_日付,_曜日), _日付=_年/_月/1, 課題のカレンダー表示(_日付,_曜日). 課題のカレンダー表示(_年/_月/_日,月曜) :- 日付候補を得る(_年/_月/_日,_年/_月/_日,月曜,_日付整数ならび), 課題のカレンダー見出し表示, 課題のカレンダー週表示(_日付整数ならび). 課題のカレンダー表示(_年/_月/_日,_曜日) :- not(_曜日=月曜), 前週の月曜日(_年/_月/_日,_曜日,_前週の月曜日), 日付候補を得る(_年/_月/_日,_前週の月曜日,月曜,_日付整数ならび), 課題のカレンダー見出し表示, 課題のカレンダー週表示(_日付整数ならび). 前週の月曜日(_年/_月/_日,_曜日,_前週の月曜日) :- 曜日検索(_前週の月曜日,_前週の曜日,_年/_月/_日,_曜日), _前週の曜日 = 月曜,!. 日付候補を得る(_年/_月/_日,_起点日付,_曜日,_日付整数ならび) :- findall(_日付,( 曜日(_起点日付,_曜日,_日付2,_),(_日付2=_年2/_月2/7,_年2/_月2 @> _年/_月,!,fail;true)),_日付整数ならび). 課題のカレンダー週表示(_日付整数ならび) :- n個組(7,_日付整数ならび,_7個組), 月曜から日曜までヘッドゼロサプライで表示(_7個組). 月曜から日曜までヘッドゼロサプライで表示([_年/_月/_日]) :- ヘッドゼロサプライ(2,_日,_日付文字列), write_formatted('%t\n',[_日文字列]),!. 月曜から日曜までヘッドゼロサプライで表示([_年/_月/_日|R]) :- ヘッドゼロサプライ(2,_日,_日付文字列), write_formatted('%t ',[_日付文字列]), 月曜から日曜までヘッドゼロサプライで表示(R). 課題のカレンダー見出し表示 :- write_formatted('月 火 水 木 金 土 日\n'). 曜日検索(_日付,_曜日,_今日,_今日の曜日) :- var(_日付), var(_曜日), 前日・今日(_日付,_曜日,_今日,_今日の曜日). 曜日検索(_日付,_曜日,_今日,_今日の曜日) :- var(_日付), var(_曜日), 前日・今日(_前日,_前日の曜日,_今日,_今日の曜日), 曜日検索(_日付,_曜日,_前日,_前日の曜日). 曜日検索(_今日,_今日の曜日,_日付,_曜日) :- var(_日付), var(_曜日), 前日・今日(_今日,_今日の曜日,_日付,_曜日). 曜日検索(_今日,_今日の曜日,_日付,_曜日) :- var(_日付), var(_曜日), 前日・今日(_今日,_今日の曜日,_翌日,_翌日の曜日), 曜日検索(_翌日,_翌日の曜日,_日付,_曜日). '曜日'(_日付,_曜日,_日付,_曜日) :- ! . '曜日'(_日付1,_曜日1,_日付2,_曜日2) :- _日付1 @> _日付2, '前日・今日'(_日付3,_曜日3,_日付1,_曜日1), '曜日'(_日付3,_曜日3,_日付2,_曜日2) . '曜日'(_日付1,_曜日1,_日付2,_曜日2) :- _日付1 @< _日付2, '前日・今日'(_日付1,_曜日1,_日付3,_曜日3), '曜日'(_日付3,_曜日3,_日付2,_曜日2) . 前日・今日(_前日の年/12/31,_前日の曜日,_年/1/1,_曜日) :- 一つ違い(_前日の年,_年), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/2/29,_前日の曜日,_年/3/1,_曜日) :- うるう年(_年), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/2/28,_前日の曜日,_年/3/1,_曜日) :- not(うるう年(_年)), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_前月/30,_前日の曜日,_年/_月/1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[4,6,9,11]), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_前月/31,_前日の曜日,_年/_月/1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[1,3,5,7,8,10,12]), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_月/_前日,_前日の曜日,_年/_月/_日,_曜日) :- 一つ違い(_前日,_日), 曜日連鎖(_前日の曜日,_曜日),!. 一つ違い(M,N) :- integer(M),!, N is M + 1. 一つ違い(M,N) :- integer(N),!, M is N - 1. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- not(0 is _年 mod 4),fail. 曜日連鎖(月曜,火曜). 曜日連鎖(火曜,水曜). 曜日連鎖(水曜,木曜). 曜日連鎖(木曜,金曜). 曜日連鎖(金曜,土曜). 曜日連鎖(土曜,日曜). 曜日連鎖(日曜,月曜). n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. ヘッドゼロサプライ(N桁,_整数,_ヘッドゼロ整数文字列) :- number_chars(_整数,_数字ならび), ヘッドゼロサプライ_1(N桁,_数字ならび,_ヘッドゼロ整数文字ならび), concat_atom(_ヘッドゼロ整数文字ならび,_ヘッドゼロ整数文字列),!. ヘッドゼロサプライ_1(N桁,L,L) :- length(L,N桁),!. ヘッドゼロサプライ_1(N桁,L,['0'|R]) :- M桁 is N桁 - 1, ヘッドゼロサプライ_1(M桁,L,R). <<課題>> C # 1行に一つづつ表示するプログラムを作成せよ。 # 空白が2個以上連続してもうまく動作するようにすること。また、コンマ(,)、 # ピリオド(,)は表示する単語に含めないこと。 # # (実行例) # ・入力 #  This is a pen. # # ・出力 # This # is # a # pen # 文字列から切り出した単語の行表示(_文字列) :- 文字列から単語の切り出し(_文字列,_単語ならび), wrln(_単語ならび). 文字列から単語の切り出し(_文字列,_単語ならび) :- atom_chars(_文字列,_文字ならび), 文字ならびを区切り文字により分割する(_文字ならび,L), 単語ならびに変換(L,_単語ならび). 文字ならびを区切り文字により分割する([A|R1],R2) :- 区切り文字(A), 文字ならびを区切り文字により分割する(R1,R2),!. 文字ならびを区切り文字により分割する(_文字ならび,[L1|R]) :- append(L1,[A|L2],_文字ならび), 区切り文字(A), 文字ならびを区切り文字により分割する(L2,R),!. 文字ならびを区切り文字により分割する(_,[]) :- !. 区切り文字(' '). 区切り文字('\n'). 区切り文字('.'). 区切り文字(','). 単語ならびに変換([]) :- !. 単語ならびに変換([L|R1],[_単語|R2]) :- concat_atom(L,_単語), 単語ならびに変換(R1,2). wrln([]) :- !. wrln([A|R]) :- write_formatted('%t\n',[A]), wrln(R). % *** user: '西暦和暦変換' / 2 *** '西暦和暦変換'(_西暦年,_和暦年) :- atomic(_和暦年), \+(atomic(_西暦年)), atom_chars(_和暦年,L), '年漢字表現'(N,L2), append(L3,L2,L), concat_atom(L3,_元号), concat_atom(L2,_年), '西暦和暦表'(_西暦年,_元号,N,_,_,_). '西暦和暦変換'(_西暦年,_和暦年) :- atomic(_西暦年), \+(atomic(_和暦年)), '西暦和暦表'(_西暦年,_元号,_年,_,_,_), '年漢字表現'(_年,_年漢字表現文字ならび), concat_atom(_年漢字表現文字ならび,_年漢字表現), concat_atom([_元号,_年漢字表現],_和暦年). '西暦和暦変換'(_西暦年,_和暦年) :- var(_西暦年), var(_和暦年), '西暦和暦表'(_西暦年,_元号,_年,_,_,_), '年漢字表現'(_年,_年漢字表現文字ならび), concat_atom(_年漢字表現文字ならび,_年漢字表現), concat_atom([_元号,_年漢字表現],_和暦年). '西暦和暦変換'(_西暦年,_和暦年) :- var(_西暦年), var(_和暦年), '西暦和暦表'(_西暦年,_元号,_年,_,_,_), '年漢字表現'(_年,_年漢字表現文字ならび), concat_atom(_年漢字表現文字ならび,_年漢字表現), concat_atom([_元号,_年漢字表現],_和暦年). '西暦和暦変換'(_西暦年,_和暦年) :- atomic(_西暦年), atom(_和暦年), '西暦和暦表'(_西暦年,_元号,_年,_,_,_), '年漢字表現'(_年,_年漢字表現文字ならび), concat_atom(_年漢字表現文字ならび,_年漢字表現), concat_atom([_元号,_年漢字表現],_和暦年). 西暦和暦表(645,大化,1,[],[],[]). 西暦和暦表(646,大化,2,[],[],[]). 西暦和暦表(647,大化,3,[],[],[]). 西暦和暦表(648,大化,4,[],[],[]). 西暦和暦表(649,大化,5,[],[],[]). 西暦和暦表(650,大化,6,[],[],[]). 西暦和暦表(650,白雉,1,[],[],[]). 西暦和暦表(651,白雉,2,[],[],[]). 西暦和暦表(652,白雉,3,[],[],[]). 西暦和暦表(653,白雉,4,[],[],[]). 西暦和暦表(654,白雉,5,[],[],[]). 西暦和暦表(686,朱鳥,1,[],[],[]). 西暦和暦表(687,朱鳥,2,[],[],[]). 西暦和暦表(701,大宝,1,[],[],[]). 西暦和暦表(702,大宝,2,[],[],[]). 西暦和暦表(703,大宝,3,[],[],[]). 西暦和暦表(704,大宝,4,[],[],[]). 西暦和暦表(704,慶雲,1,[],[],[]). 西暦和暦表(705,慶雲,2,[],[],[]). 西暦和暦表(706,慶雲,3,[],[],[]). 西暦和暦表(707,慶雲,4,[],[],[]). 西暦和暦表(708,慶雲,5,[],[],[]). 西暦和暦表(708,和銅,1,[],[],[]). 西暦和暦表(709,和銅,2,[],[],[]). 西暦和暦表(710,和銅,3,[],[],[]). 西暦和暦表(711,和銅,4,[],[],[]). 西暦和暦表(712,和銅,5,[],[],[]). 西暦和暦表(713,和銅,6,[],[],[]). 西暦和暦表(714,和銅,7,[],[],[]). 西暦和暦表(715,和銅,8,[],[],[]). 西暦和暦表(715,霊亀,1,[],[],[]). 西暦和暦表(716,霊亀,2,[],[],[]). 西暦和暦表(717,霊亀,3,[],[],[]). 西暦和暦表(717,養老,1,[],[],[]). 西暦和暦表(718,養老,2,[],[],[]). 西暦和暦表(719,養老,3,[],[],[]). 西暦和暦表(720,養老,4,[],[],[]). 西暦和暦表(721,養老,5,[],[],[]). 西暦和暦表(722,養老,6,[],[],[]). 西暦和暦表(723,養老,7,[],[],[]). 西暦和暦表(724,養老,8,[],[],[]). 西暦和暦表(724,神亀,1,[],[],[]). 西暦和暦表(725,神亀,2,[],[],[]). 西暦和暦表(726,神亀,3,[],[],[]). 西暦和暦表(727,神亀,4,[],[],[]). 西暦和暦表(728,神亀,5,[],[],[]). 西暦和暦表(729,神亀,6,[],[],[]). 西暦和暦表(729,天平,1,[],[],[]). 西暦和暦表(730,天平,2,[],[],[]). 西暦和暦表(731,天平,3,[],[],[]). 西暦和暦表(732,天平,4,[],[],[]). 西暦和暦表(733,天平,5,[],[],[]). 西暦和暦表(734,天平,6,[],[],[]). 西暦和暦表(735,天平,7,[],[],[]). 西暦和暦表(736,天平,8,[],[],[]). 西暦和暦表(737,天平,9,[],[],[]). 西暦和暦表(738,天平,10,[],[],[]). 西暦和暦表(739,天平,11,[],[],[]). 西暦和暦表(740,天平,12,[],[],[]). 西暦和暦表(741,天平,13,[],[],[]). 西暦和暦表(742,天平,14,[],[],[]). 西暦和暦表(743,天平,15,[],[],[]). 西暦和暦表(744,天平,16,[],[],[]). 西暦和暦表(745,天平,17,[],[],[]). 西暦和暦表(746,天平,18,[],[],[]). 西暦和暦表(747,天平,19,[],[],[]). 西暦和暦表(748,天平,20,[],[],[]). 西暦和暦表(749,天平,21,[],[],[]). 西暦和暦表(749,天平感宝,1,[],[],[]). 西暦和暦表(749,天平勝宝,1,[],[],[]). 西暦和暦表(750,天平勝宝,2,[],[],[]). 西暦和暦表(751,天平勝宝,3,[],[],[]). 西暦和暦表(752,天平勝宝,4,[],[],[]). 西暦和暦表(753,天平勝宝,5,[],[],[]). 西暦和暦表(754,天平勝宝,6,[],[],[]). 西暦和暦表(755,天平勝宝,7,[],[],[]). 西暦和暦表(756,天平勝宝,8,[],[],[]). 西暦和暦表(757,天平勝宝,9,[],[],[]). 西暦和暦表(757,天平宝字,1,[],[],[]). 西暦和暦表(758,天平宝字,2,[],[],[]). 西暦和暦表(759,天平宝字,3,[],[],[]). 西暦和暦表(760,天平宝字,4,[],[],[]). 西暦和暦表(761,天平宝字,5,[],[],[]). 西暦和暦表(762,天平宝字,6,[],[],[]). 西暦和暦表(763,天平宝字,7,[],[],[]). 西暦和暦表(764,天平宝字,8,[],[],[]). 西暦和暦表(765,天平宝字,9,[],[],[]). 西暦和暦表(765,天平神護,1,[],[],[]). 西暦和暦表(766,天平神護,2,[],[],[]). 西暦和暦表(767,天平神護,3,[],[],[]). 西暦和暦表(767,神護景雲,1,[],[],[]). 西暦和暦表(768,神護景雲,2,[],[],[]). 西暦和暦表(769,神護景雲,3,[],[],[]). 西暦和暦表(770,神護景雲,4,[],[],[]). 西暦和暦表(770,宝亀,1,[],[],[]). 西暦和暦表(771,宝亀,2,[],[],[]). 西暦和暦表(772,宝亀,3,[],[],[]). 西暦和暦表(773,宝亀,4,[],[],[]). 西暦和暦表(774,宝亀,5,[],[],[]). 西暦和暦表(775,宝亀,6,[],[],[]). 西暦和暦表(776,宝亀,7,[],[],[]). 西暦和暦表(777,宝亀,8,[],[],[]). 西暦和暦表(778,宝亀,9,[],[],[]). 西暦和暦表(779,宝亀,10,[],[],[]). 西暦和暦表(780,宝亀,11,[],[],[]). 西暦和暦表(781,天応,1,[],[],[]). 西暦和暦表(782,天応,2,[],[],[]). 西暦和暦表(782,延暦,1,[],[],[]). 西暦和暦表(783,延暦,2,[],[],[]). 西暦和暦表(784,延暦,3,[],[],[]). 西暦和暦表(785,延暦,4,[],[],[]). 西暦和暦表(786,延暦,5,[],[],[]). 西暦和暦表(787,延暦,6,[],[],[]). 西暦和暦表(788,延暦,7,[],[],[]). 西暦和暦表(789,延暦,8,[],[],[]). 西暦和暦表(790,延暦,9,[],[],[]). 西暦和暦表(791,延暦,10,[],[],[]). 西暦和暦表(792,延暦,11,[],[],[]). 西暦和暦表(793,延暦,12,[],[],[]). 西暦和暦表(794,延暦,13,[],[],[]). 西暦和暦表(795,延暦,14,[],[],[]). 西暦和暦表(796,延暦,15,[],[],[]). 西暦和暦表(797,延暦,16,[],[],[]). 西暦和暦表(798,延暦,17,[],[],[]). 西暦和暦表(799,延暦,18,[],[],[]). 西暦和暦表(800,延暦,19,[],[],[]). 西暦和暦表(801,延暦,20,[],[],[]). 西暦和暦表(802,延暦,21,[],[],[]). 西暦和暦表(803,延暦,22,[],[],[]). 西暦和暦表(804,延暦,23,[],[],[]). 西暦和暦表(805,延暦,24,[],[],[]). 西暦和暦表(806,延暦,25,[],[],[]). 西暦和暦表(806,大同,1,[],[],[]). 西暦和暦表(807,大同,2,[],[],[]). 西暦和暦表(808,大同,3,[],[],[]). 西暦和暦表(809,大同,4,[],[],[]). 西暦和暦表(810,大同,5,[],[],[]). 西暦和暦表(810,弘仁,1,[],[],[]). 西暦和暦表(811,弘仁,2,[],[],[]). 西暦和暦表(812,弘仁,3,[],[],[]). 西暦和暦表(813,弘仁,4,[],[],[]). 西暦和暦表(814,弘仁,5,[],[],[]). 西暦和暦表(815,弘仁,6,[],[],[]). 西暦和暦表(816,弘仁,7,[],[],[]). 西暦和暦表(817,弘仁,8,[],[],[]). 西暦和暦表(818,弘仁,9,[],[],[]). 西暦和暦表(819,弘仁,10,[],[],[]). 西暦和暦表(820,弘仁,11,[],[],[]). 西暦和暦表(821,弘仁,12,[],[],[]). 西暦和暦表(822,弘仁,13,[],[],[]). 西暦和暦表(823,弘仁,14,[],[],[]). 西暦和暦表(824,弘仁,15,[],[],[]). 西暦和暦表(824,天長,1,[],[],[]). 西暦和暦表(825,天長,2,[],[],[]). 西暦和暦表(826,天長,3,[],[],[]). 西暦和暦表(827,天長,4,[],[],[]). 西暦和暦表(828,天長,5,[],[],[]). 西暦和暦表(829,天長,6,[],[],[]). 西暦和暦表(830,天長,7,[],[],[]). 西暦和暦表(831,天長,8,[],[],[]). 西暦和暦表(832,天長,9,[],[],[]). 西暦和暦表(833,天長,10,[],[],[]). 西暦和暦表(834,天長,11,[],[],[]). 西暦和暦表(834,承和,1,[],[],[]). 西暦和暦表(835,承和,2,[],[],[]). 西暦和暦表(836,承和,3,[],[],[]). 西暦和暦表(837,承和,4,[],[],[]). 西暦和暦表(838,承和,5,[],[],[]). 西暦和暦表(839,承和,6,[],[],[]). 西暦和暦表(840,承和,7,[],[],[]). 西暦和暦表(841,承和,8,[],[],[]). 西暦和暦表(842,承和,9,[],[],[]). 西暦和暦表(843,承和,10,[],[],[]). 西暦和暦表(844,承和,11,[],[],[]). 西暦和暦表(845,承和,12,[],[],[]). 西暦和暦表(846,承和,13,[],[],[]). 西暦和暦表(847,承和,14,[],[],[]). 西暦和暦表(848,承和,15,[],[],[]). 西暦和暦表(848,嘉祥,1,[],[],[]). 西暦和暦表(849,嘉祥,2,[],[],[]). 西暦和暦表(850,嘉祥,3,[],[],[]). 西暦和暦表(851,嘉祥,4,[],[],[]). 西暦和暦表(851,仁寿,1,[],[],[]). 西暦和暦表(852,仁寿,2,[],[],[]). 西暦和暦表(853,仁寿,3,[],[],[]). 西暦和暦表(854,仁寿,4,[],[],[]). 西暦和暦表(854,斉衡,1,[],[],[]). 西暦和暦表(855,斉衡,2,[],[],[]). 西暦和暦表(856,斉衡,3,[],[],[]). 西暦和暦表(857,斉衡,4,[],[],[]). 西暦和暦表(857,天安,1,[],[],[]). 西暦和暦表(858,天安,2,[],[],[]). 西暦和暦表(859,天安,3,[],[],[]). 西暦和暦表(859,貞観,1,[],[],[]). 西暦和暦表(860,貞観,2,[],[],[]). 西暦和暦表(861,貞観,3,[],[],[]). 西暦和暦表(862,貞観,4,[],[],[]). 西暦和暦表(863,貞観,5,[],[],[]). 西暦和暦表(864,貞観,6,[],[],[]). 西暦和暦表(865,貞観,7,[],[],[]). 西暦和暦表(866,貞観,8,[],[],[]). 西暦和暦表(867,貞観,9,[],[],[]). 西暦和暦表(868,貞観,10,[],[],[]). 西暦和暦表(869,貞観,11,[],[],[]). 西暦和暦表(870,貞観,12,[],[],[]). 西暦和暦表(871,貞観,13,[],[],[]). 西暦和暦表(872,貞観,14,[],[],[]). 西暦和暦表(873,貞観,15,[],[],[]). 西暦和暦表(874,貞観,16,[],[],[]). 西暦和暦表(875,貞観,17,[],[],[]). 西暦和暦表(876,貞観,18,[],[],[]). 西暦和暦表(877,貞観,19,[],[],[]). 西暦和暦表(877,元慶,1,[],[],[]). 西暦和暦表(878,元慶,2,[],[],[]). 西暦和暦表(879,元慶,3,[],[],[]). 西暦和暦表(880,元慶,4,[],[],[]). 西暦和暦表(881,元慶,5,[],[],[]). 西暦和暦表(882,元慶,6,[],[],[]). 西暦和暦表(883,元慶,7,[],[],[]). 西暦和暦表(884,元慶,8,[],[],[]). 西暦和暦表(885,元慶,9,[],[],[]). 西暦和暦表(885,仁和,1,[],[],[]). 西暦和暦表(886,仁和,2,[],[],[]). 西暦和暦表(887,仁和,3,[],[],[]). 西暦和暦表(888,仁和,4,[],[],[]). 西暦和暦表(889,仁和,5,[],[],[]). 西暦和暦表(889,寛平,1,[],[],[]). 西暦和暦表(890,寛平,2,[],[],[]). 西暦和暦表(891,寛平,3,[],[],[]). 西暦和暦表(892,寛平,4,[],[],[]). 西暦和暦表(893,寛平,5,[],[],[]). 西暦和暦表(894,寛平,6,[],[],[]). 西暦和暦表(895,寛平,7,[],[],[]). 西暦和暦表(896,寛平,8,[],[],[]). 西暦和暦表(897,寛平,9,[],[],[]). 西暦和暦表(898,寛平,10,[],[],[]). 西暦和暦表(898,昌泰,1,[],[],[]). 西暦和暦表(899,昌泰,2,[],[],[]). 西暦和暦表(900,昌泰,3,[],[],[]). 西暦和暦表(901,昌泰,4,[],[],[]). 西暦和暦表(901,延喜,1,[],[],[]). 西暦和暦表(902,延喜,2,[],[],[]). 西暦和暦表(903,延喜,3,[],[],[]). 西暦和暦表(904,延喜,4,[],[],[]). 西暦和暦表(905,延喜,5,[],[],[]). 西暦和暦表(906,延喜,6,[],[],[]). 西暦和暦表(907,延喜,7,[],[],[]). 西暦和暦表(908,延喜,8,[],[],[]). 西暦和暦表(909,延喜,9,[],[],[]). 西暦和暦表(910,延喜,10,[],[],[]). 西暦和暦表(911,延喜,11,[],[],[]). 西暦和暦表(912,延喜,12,[],[],[]). 西暦和暦表(913,延喜,13,[],[],[]). 西暦和暦表(914,延喜,14,[],[],[]). 西暦和暦表(915,延喜,15,[],[],[]). 西暦和暦表(916,延喜,16,[],[],[]). 西暦和暦表(917,延喜,17,[],[],[]). 西暦和暦表(918,延喜,18,[],[],[]). 西暦和暦表(919,延喜,19,[],[],[]). 西暦和暦表(920,延喜,20,[],[],[]). 西暦和暦表(921,延喜,21,[],[],[]). 西暦和暦表(922,延喜,22,[],[],[]). 西暦和暦表(923,延喜,23,[],[],[]). 西暦和暦表(923,延長,1,[],[],[]). 西暦和暦表(924,延長,2,[],[],[]). 西暦和暦表(925,延長,3,[],[],[]). 西暦和暦表(926,延長,4,[],[],[]). 西暦和暦表(927,延長,5,[],[],[]). 西暦和暦表(928,延長,6,[],[],[]). 西暦和暦表(929,延長,7,[],[],[]). 西暦和暦表(930,延長,8,[],[],[]). 西暦和暦表(931,延長,9,[],[],[]). 西暦和暦表(931,承平,1,[],[],[]). 西暦和暦表(932,承平,2,[],[],[]). 西暦和暦表(933,承平,3,[],[],[]). 西暦和暦表(934,承平,4,[],[],[]). 西暦和暦表(935,承平,5,[],[],[]). 西暦和暦表(936,承平,6,[],[],[]). 西暦和暦表(937,承平,7,[],[],[]). 西暦和暦表(938,承平,8,[],[],[]). 西暦和暦表(938,天慶,1,[],[],[]). 西暦和暦表(939,天慶,2,[],[],[]). 西暦和暦表(940,天慶,3,[],[],[]). 西暦和暦表(941,天慶,4,[],[],[]). 西暦和暦表(942,天慶,5,[],[],[]). 西暦和暦表(943,天慶,6,[],[],[]). 西暦和暦表(944,天慶,7,[],[],[]). 西暦和暦表(945,天慶,8,[],[],[]). 西暦和暦表(946,天慶,9,[],[],[]). 西暦和暦表(947,天慶,10,[],[],[]). 西暦和暦表(947,天暦,1,[],[],[]). 西暦和暦表(948,天暦,2,[],[],[]). 西暦和暦表(949,天暦,3,[],[],[]). 西暦和暦表(950,天暦,4,[],[],[]). 西暦和暦表(951,天暦,5,[],[],[]). 西暦和暦表(952,天暦,6,[],[],[]). 西暦和暦表(953,天暦,7,[],[],[]). 西暦和暦表(954,天暦,8,[],[],[]). 西暦和暦表(955,天暦,9,[],[],[]). 西暦和暦表(956,天暦,10,[],[],[]). 西暦和暦表(957,天暦,11,[],[],[]). 西暦和暦表(957,天徳,1,[],[],[]). 西暦和暦表(958,天徳,2,[],[],[]). 西暦和暦表(959,天徳,3,[],[],[]). 西暦和暦表(960,天徳,4,[],[],[]). 西暦和暦表(961,天徳,5,[],[],[]). 西暦和暦表(961,応和,1,[],[],[]). 西暦和暦表(962,応和,2,[],[],[]). 西暦和暦表(963,応和,3,[],[],[]). 西暦和暦表(964,応和,4,[],[],[]). 西暦和暦表(964,康保,1,[],[],[]). 西暦和暦表(965,康保,2,[],[],[]). 西暦和暦表(966,康保,3,[],[],[]). 西暦和暦表(967,康保,4,[],[],[]). 西暦和暦表(968,康保,5,[],[],[]). 西暦和暦表(968,安和,1,[],[],[]). 西暦和暦表(969,安和,2,[],[],[]). 西暦和暦表(970,安和,3,[],[],[]). 西暦和暦表(970,天禄,1,[],[],[]). 西暦和暦表(971,天禄,2,[],[],[]). 西暦和暦表(972,天禄,3,[],[],[]). 西暦和暦表(973,天禄,4,[],[],[]). 西暦和暦表(973,天延,1,[],[],[]). 西暦和暦表(974,天延,2,[],[],[]). 西暦和暦表(975,天延,3,[],[],[]). 西暦和暦表(976,天延,4,[],[],[]). 西暦和暦表(976,貞元,1,[],[],[]). 西暦和暦表(977,貞元,2,[],[],[]). 西暦和暦表(978,貞元,3,[],[],[]). 西暦和暦表(978,天元,1,[],[],[]). 西暦和暦表(979,天元,2,[],[],[]). 西暦和暦表(980,天元,3,[],[],[]). 西暦和暦表(981,天元,4,[],[],[]). 西暦和暦表(982,天元,5,[],[],[]). 西暦和暦表(983,天元,6,[],[],[]). 西暦和暦表(983,永観,1,[],[],[]). 西暦和暦表(984,永観,2,[],[],[]). 西暦和暦表(985,永観,3,[],[],[]). 西暦和暦表(985,寛和,1,[],[],[]). 西暦和暦表(986,寛和,2,[],[],[]). 西暦和暦表(987,寛和,3,[],[],[]). 西暦和暦表(987,永延,1,[],[],[]). 西暦和暦表(988,永延,2,[],[],[]). 西暦和暦表(989,永延,3,[],[],[]). 西暦和暦表(989,永祚,1,[],[],[]). 西暦和暦表(990,永祚,2,[],[],[]). 西暦和暦表(990,正暦,1,[],[],[]). 西暦和暦表(991,正暦,2,[],[],[]). 西暦和暦表(992,正暦,3,[],[],[]). 西暦和暦表(993,正暦,4,[],[],[]). 西暦和暦表(994,正暦,5,[],[],[]). 西暦和暦表(995,正暦,6,[],[],[]). 西暦和暦表(995,長徳,1,[],[],[]). 西暦和暦表(996,長徳,2,[],[],[]). 西暦和暦表(997,長徳,3,[],[],[]). 西暦和暦表(998,長徳,4,[],[],[]). 西暦和暦表(999,長徳,5,[],[],[]). 西暦和暦表(999,長保,1,[],[],[]). 西暦和暦表(1000,長保,2,[],[],[]). 西暦和暦表(1001,長保,3,[],[],[]). 西暦和暦表(1002,長保,4,[],[],[]). 西暦和暦表(1003,長保,5,[],[],[]). 西暦和暦表(1004,長保,6,[],[],[]). 西暦和暦表(1004,寛弘,1,[],[],[]). 西暦和暦表(1005,寛弘,2,[],[],[]). 西暦和暦表(1006,寛弘,3,[],[],[]). 西暦和暦表(1007,寛弘,4,[],[],[]). 西暦和暦表(1008,寛弘,5,[],[],[]). 西暦和暦表(1009,寛弘,6,[],[],[]). 西暦和暦表(1010,寛弘,7,[],[],[]). 西暦和暦表(1011,寛弘,8,[],[],[]). 西暦和暦表(1012,寛弘,9,[],[],[]). 西暦和暦表(1012,長和,1,[],[],[]). 西暦和暦表(1013,長和,2,[],[],[]). 西暦和暦表(1014,長和,3,[],[],[]). 西暦和暦表(1015,長和,4,[],[],[]). 西暦和暦表(1016,長和,5,[],[],[]). 西暦和暦表(1017,長和,6,[],[],[]). 西暦和暦表(1017,寛仁,1,[],[],[]). 西暦和暦表(1018,寛仁,2,[],[],[]). 西暦和暦表(1019,寛仁,3,[],[],[]). 西暦和暦表(1020,寛仁,4,[],[],[]). 西暦和暦表(1021,寛仁,5,[],[],[]). 西暦和暦表(1021,治安,1,[],[],[]). 西暦和暦表(1022,治安,2,[],[],[]). 西暦和暦表(1023,治安,3,[],[],[]). 西暦和暦表(1024,治安,4,[],[],[]). 西暦和暦表(1024,万寿,1,[],[],[]). 西暦和暦表(1025,万寿,2,[],[],[]). 西暦和暦表(1026,万寿,3,[],[],[]). 西暦和暦表(1027,万寿,4,[],[],[]). 西暦和暦表(1028,万寿,5,[],[],[]). 西暦和暦表(1028,長元,1,[],[],[]). 西暦和暦表(1029,長元,2,[],[],[]). 西暦和暦表(1030,長元,3,[],[],[]). 西暦和暦表(1031,長元,4,[],[],[]). 西暦和暦表(1032,長元,5,[],[],[]). 西暦和暦表(1033,長元,6,[],[],[]). 西暦和暦表(1034,長元,7,[],[],[]). 西暦和暦表(1035,長元,8,[],[],[]). 西暦和暦表(1036,長元,9,[],[],[]). 西暦和暦表(1037,長元,10,[],[],[]). 西暦和暦表(1037,長暦,1,[],[],[]). 西暦和暦表(1038,長暦,2,[],[],[]). 西暦和暦表(1039,長暦,3,[],[],[]). 西暦和暦表(1040,長暦,4,[],[],[]). 西暦和暦表(1040,長久,1,[],[],[]). 西暦和暦表(1041,長久,2,[],[],[]). 西暦和暦表(1042,長久,3,[],[],[]). 西暦和暦表(1043,長久,4,[],[],[]). 西暦和暦表(1044,長久,5,[],[],[]). 西暦和暦表(1044,寛徳,1,[],[],[]). 西暦和暦表(1045,寛徳,2,[],[],[]). 西暦和暦表(1046,寛徳,3,[],[],[]). 西暦和暦表(1046,永承,1,[],[],[]). 西暦和暦表(1047,永承,2,[],[],[]). 西暦和暦表(1048,永承,3,[],[],[]). 西暦和暦表(1049,永承,4,[],[],[]). 西暦和暦表(1050,永承,5,[],[],[]). 西暦和暦表(1051,永承,6,[],[],[]). 西暦和暦表(1052,永承,7,[],[],[]). 西暦和暦表(1053,永承,8,[],[],[]). 西暦和暦表(1053,天喜,1,[],[],[]). 西暦和暦表(1054,天喜,2,[],[],[]). 西暦和暦表(1055,天喜,3,[],[],[]). 西暦和暦表(1056,天喜,4,[],[],[]). 西暦和暦表(1057,天喜,5,[],[],[]). 西暦和暦表(1058,天喜,6,[],[],[]). 西暦和暦表(1058,康平,1,[],[],[]). 西暦和暦表(1059,康平,2,[],[],[]). 西暦和暦表(1060,康平,3,[],[],[]). 西暦和暦表(1061,康平,4,[],[],[]). 西暦和暦表(1062,康平,5,[],[],[]). 西暦和暦表(1063,康平,6,[],[],[]). 西暦和暦表(1064,康平,7,[],[],[]). 西暦和暦表(1065,康平,8,[],[],[]). 西暦和暦表(1065,治暦,1,[],[],[]). 西暦和暦表(1066,治暦,2,[],[],[]). 西暦和暦表(1067,治暦,3,[],[],[]). 西暦和暦表(1068,治暦,4,[],[],[]). 西暦和暦表(1069,治暦,5,[],[],[]). 西暦和暦表(1069,延久,1,[],[],[]). 西暦和暦表(1070,延久,2,[],[],[]). 西暦和暦表(1071,延久,3,[],[],[]). 西暦和暦表(1072,延久,4,[],[],[]). 西暦和暦表(1073,延久,5,[],[],[]). 西暦和暦表(1074,延久,6,[],[],[]). 西暦和暦表(1074,承保,1,[],[],[]). 西暦和暦表(1075,承保,2,[],[],[]). 西暦和暦表(1076,承保,3,[],[],[]). 西暦和暦表(1077,承保,4,[],[],[]). 西暦和暦表(1077,承暦,1,[],[],[]). 西暦和暦表(1078,承暦,2,[],[],[]). 西暦和暦表(1079,承暦,3,[],[],[]). 西暦和暦表(1080,承暦,4,[],[],[]). 西暦和暦表(1081,承暦,5,[],[],[]). 西暦和暦表(1081,永保,1,[],[],[]). 西暦和暦表(1082,永保,2,[],[],[]). 西暦和暦表(1083,永保,3,[],[],[]). 西暦和暦表(1084,永保,4,[],[],[]). 西暦和暦表(1084,応徳,1,[],[],[]). 西暦和暦表(1085,応徳,2,[],[],[]). 西暦和暦表(1086,応徳,3,[],[],[]). 西暦和暦表(1087,応徳,4,[],[],[]). 西暦和暦表(1087,寛治,1,[],[],[]). 西暦和暦表(1088,寛治,2,[],[],[]). 西暦和暦表(1089,寛治,3,[],[],[]). 西暦和暦表(1090,寛治,4,[],[],[]). 西暦和暦表(1091,寛治,5,[],[],[]). 西暦和暦表(1092,寛治,6,[],[],[]). 西暦和暦表(1093,寛治,7,[],[],[]). 西暦和暦表(1094,寛治,8,[],[],[]). 西暦和暦表(1094,嘉保,1,[],[],[]). 西暦和暦表(1095,嘉保,2,[],[],[]). 西暦和暦表(1096,嘉保,3,[],[],[]). 西暦和暦表(1096,永長,1,[],[],[]). 西暦和暦表(1097,永長,2,[],[],[]). 西暦和暦表(1097,承徳,1,[],[],[]). 西暦和暦表(1098,承徳,2,[],[],[]). 西暦和暦表(1099,承徳,3,[],[],[]). 西暦和暦表(1099,康和,1,[],[],[]). 西暦和暦表(1100,康和,2,[],[],[]). 西暦和暦表(1101,康和,3,[],[],[]). 西暦和暦表(1102,康和,4,[],[],[]). 西暦和暦表(1103,康和,5,[],[],[]). 西暦和暦表(1104,康和,6,[],[],[]). 西暦和暦表(1104,長治,1,[],[],[]). 西暦和暦表(1105,長治,2,[],[],[]). 西暦和暦表(1106,長治,3,[],[],[]). 西暦和暦表(1106,嘉承,1,[],[],[]). 西暦和暦表(1107,嘉承,2,[],[],[]). 西暦和暦表(1108,嘉承,3,[],[],[]). 西暦和暦表(1108,天仁,1,[],[],[]). 西暦和暦表(1109,天仁,2,[],[],[]). 西暦和暦表(1110,天仁,3,[],[],[]). 西暦和暦表(1110,天永,1,[],[],[]). 西暦和暦表(1111,天永,2,[],[],[]). 西暦和暦表(1112,天永,3,[],[],[]). 西暦和暦表(1113,天永,4,[],[],[]). 西暦和暦表(1113,永久,1,[],[],[]). 西暦和暦表(1114,永久,2,[],[],[]). 西暦和暦表(1115,永久,3,[],[],[]). 西暦和暦表(1116,永久,4,[],[],[]). 西暦和暦表(1117,永久,5,[],[],[]). 西暦和暦表(1118,永久,6,[],[],[]). 西暦和暦表(1118,元永,1,[],[],[]). 西暦和暦表(1119,元永,2,[],[],[]). 西暦和暦表(1120,元永,3,[],[],[]). 西暦和暦表(1120,保安,1,[],[],[]). 西暦和暦表(1121,保安,2,[],[],[]). 西暦和暦表(1122,保安,3,[],[],[]). 西暦和暦表(1123,保安,4,[],[],[]). 西暦和暦表(1124,保安,5,[],[],[]). 西暦和暦表(1124,天治,1,[],[],[]). 西暦和暦表(1125,天治,2,[],[],[]). 西暦和暦表(1126,天治,3,[],[],[]). 西暦和暦表(1126,大治,1,[],[],[]). 西暦和暦表(1127,大治,2,[],[],[]). 西暦和暦表(1128,大治,3,[],[],[]). 西暦和暦表(1129,大治,4,[],[],[]). 西暦和暦表(1130,大治,5,[],[],[]). 西暦和暦表(1131,大治,6,[],[],[]). 西暦和暦表(1131,天承,1,[],[],[]). 西暦和暦表(1132,天承,2,[],[],[]). 西暦和暦表(1132,長承,1,[],[],[]). 西暦和暦表(1133,長承,2,[],[],[]). 西暦和暦表(1134,長承,3,[],[],[]). 西暦和暦表(1135,長承,4,[],[],[]). 西暦和暦表(1135,保延,1,[],[],[]). 西暦和暦表(1136,保延,2,[],[],[]). 西暦和暦表(1137,保延,3,[],[],[]). 西暦和暦表(1138,保延,4,[],[],[]). 西暦和暦表(1139,保延,5,[],[],[]). 西暦和暦表(1140,保延,6,[],[],[]). 西暦和暦表(1141,保延,7,[],[],[]). 西暦和暦表(1141,永治,1,[],[],[]). 西暦和暦表(1142,永治,2,[],[],[]). 西暦和暦表(1142,康治,1,[],[],[]). 西暦和暦表(1143,康治,2,[],[],[]). 西暦和暦表(1144,康治,3,[],[],[]). 西暦和暦表(1144,天養,1,2 / 23,[],甲子). 西暦和暦表(1145,天養,2,[],[],甲子). 西暦和暦表(1145,久安,1,7 / 22,10,乙丑). 西暦和暦表(1146,久安,2,[],[],丙寅). 西暦和暦表(1147,久安,3,[],[],丁卯). 西暦和暦表(1148,久安,4,[],6,戊辰). 西暦和暦表(1149,久安,5,[],[],己巳). 西暦和暦表(1150,久安,6,[],[],庚午). 西暦和暦表(1151,久安,7,[],[],庚午). 西暦和暦表(1151,仁平,1,1 / 26,4,辛未). 西暦和暦表(1152,仁平,2,[],[],壬申). 西暦和暦表(1153,仁平,3,[],12,癸酉). 西暦和暦表(1154,仁平,4,[],12,癸酉). 西暦和暦表(1154,久寿,1,10 / 28,[],甲戌). 西暦和暦表(1155,久寿,2,[],[],乙亥). 西暦和暦表(1156,久寿,3,[],[],乙亥). 西暦和暦表(1156,保元,1,4 / 27,9,丙子). 西暦和暦表(1157,保元,2,[],[],丁丑). 西暦和暦表(1158,保元,3,[],[],戊寅). 西暦和暦表(1159,保元,4,[],[],戊寅). 西暦和暦表(1159,平治,1,4 / 20,5,己卯). 西暦和暦表(1160,平治,2,[],5,己卯). 西暦和暦表(1160,永暦,1,1 / 10,[],庚辰). 西暦和暦表(1161,永暦,2,[],[],庚辰). 西暦和暦表(1161,応保,1,9 / 4,[],辛巳). 西暦和暦表(1162,応保,2,[],2,壬午). 西暦和暦表(1163,応保,3,[],2,壬午). 西暦和暦表(1163,長寛,1,3 / 29,[],癸未). 西暦和暦表(1164,長寛,2,[],10,甲申). 西暦和暦表(1165,長寛,3,[],10,甲申). 西暦和暦表(1165,永万,1,6 / 5,[],乙酉). 西暦和暦表(1166,永万,2,[],[],乙酉). 西暦和暦表(1166,仁安,1,8 / 27,[],丙戌). 西暦和暦表(1167,仁安,2,[],7,丁亥). 西暦和暦表(1168,仁安,3,[],[],戊子). 西暦和暦表(1169,仁安,4,[],[],戊子). 西暦和暦表(1169,嘉応,1,4 / 8,[],己丑). 西暦和暦表(1170,嘉応,2,[],4,庚寅). 西暦和暦表(1171,嘉応,3,[],4,庚寅). 西暦和暦表(1171,承安,1,4 / 21,[],辛卯). 西暦和暦表(1172,承安,2,[],12,壬辰). 西暦和暦表(1173,承安,3,[],[],癸巳). 西暦和暦表(1174,承安,4,[],[],甲午). 西暦和暦表(1175,承安,5,[],[],甲午). 西暦和暦表(1175,安元,1,7 / 28,9,乙未). 西暦和暦表(1176,安元,2,[],[],丙申). 西暦和暦表(1177,安元,3,[],[],丙申). 西暦和暦表(1177,治承,1,8 / 4,[],丁酉). 西暦和暦表(1178,治承,2,[],6,戊戌). 西暦和暦表(1179,治承,3,[],[],己亥). 西暦和暦表(1180,治承,4,[],[],庚子). 西暦和暦表(1181,治承,5,[],[],庚子). 西暦和暦表(1181,養和,1,7 / 14,2,辛丑). 西暦和暦表(1182,養和,2,[],2,辛丑). 西暦和暦表(1182,寿永,1,5 / 27,[],壬寅). 西暦和暦表(1183,寿永,2,[],10,癸卯). 西暦和暦表(1184,寿永,3,[],[],甲辰). 西暦和暦表(1185,寿永,4,[],[],甲辰). 西暦和暦表(1185,文治,1,8 / 14,[],乙巳). 西暦和暦表(1186,文治,2,[],7,丙午). 西暦和暦表(1187,文治,3,[],[],丁未). 西暦和暦表(1188,文治,4,[],[],戊申). 西暦和暦表(1189,文治,5,[],4,己酉). 西暦和暦表(1190,文治,6,[],4,己酉). 西暦和暦表(1190,建久,1,4 / 11,[],庚戌). 西暦和暦表(1191,建久,2,[],12,辛亥). 西暦和暦表(1192,建久,3,[],[],壬子). 西暦和暦表(1193,建久,4,[],[],癸丑). 西暦和暦表(1194,建久,5,[],8,甲寅). 西暦和暦表(1195,建久,6,[],[],乙卯). 西暦和暦表(1196,建久,7,[],[],丙辰). 西暦和暦表(1197,建久,8,[],6,丁巳). 西暦和暦表(1198,建久,9,[],[],戊午). 西暦和暦表(1199,建久,10,[],[],戊午). 西暦和暦表(1199,正治,1,4 / 27,[],己未). 西暦和暦表(1200,正治,2,[],2,庚申). 西暦和暦表(1201,正治,3,[],2,庚申). 西暦和暦表(1201,建仁,1,2 / 13,[],辛酉). 西暦和暦表(1202,建仁,2,[],10,壬戌). 西暦和暦表(1203,建仁,3,[],[],癸亥). 西暦和暦表(1204,建仁,4,[],[],癸亥). 西暦和暦表(1204,元久,1,2 / 20,[],甲子). 西暦和暦表(1205,元久,2,[],7,乙丑). 西暦和暦表(1206,元久,3,[],7,乙丑). 西暦和暦表(1206,建永,1,4 / 27,[],丙寅). 西暦和暦表(1207,建永,2,[],[],丙寅). 西暦和暦表(1207,承元,1,10 / 25,[],丁卯). 西暦和暦表(1208,承元,2,[],4,戊辰). 西暦和暦表(1209,承元,3,[],[],己巳). 西暦和暦表(1210,承元,4,[],[],庚午). 西暦和暦表(1211,承元,5,[],[],庚午). 西暦和暦表(1211,建暦,1,3 / 9,1,辛未). 西暦和暦表(1212,建暦,2,[],[],壬申). 西暦和暦表(1213,建暦,3,[],[],壬申). 西暦和暦表(1213,建保,1,12 / 6,9,癸酉). 西暦和暦表(1214,建保,2,[],[],甲戌). 西暦和暦表(1215,建保,3,[],[],乙亥). 西暦和暦表(1216,建保,4,[],6,丙子). 西暦和暦表(1217,建保,5,[],[],丁丑). 西暦和暦表(1218,建保,6,[],[],戊寅). 西暦和暦表(1219,建保,7,[],[],戊寅). 西暦和暦表(1219,承久,1,4 / 12,2,己卯). 西暦和暦表(1220,承久,2,[],[],庚辰). 西暦和暦表(1221,承久,3,[],10,辛巳). 西暦和暦表(1222,承久,4,[],10,辛巳). 西暦和暦表(1222,貞応,1,4 / 13,[],壬午). 西暦和暦表(1223,貞応,2,[],[],癸未). 西暦和暦表(1224,貞応,3,[],[],癸未). 西暦和暦表(1224,元仁,1,11 / 20,7,甲申). 西暦和暦表(1225,元仁,2,[],7,甲申). 西暦和暦表(1225,嘉祿,1,4 / 20,[],乙酉). 西暦和暦表(1226,嘉祿,2,[],[],丙戌). 西暦和暦表(1227,嘉祿,3,[],[],丙戌). 西暦和暦表(1227,安貞,1,12 / 10,3,丁亥). 西暦和暦表(1228,安貞,2,[],[],戊子). 西暦和暦表(1229,安貞,3,[],[],戊子). 西暦和暦表(1229,寛喜,1,3 / 5,[],己丑). 西暦和暦表(1230,寛喜,2,[],1,庚寅). 西暦和暦表(1231,寛喜,3,[],[],辛卯). 西暦和暦表(1232,寛喜,4,[],[],辛卯). 西暦和暦表(1232,貞永,1,4 / 2,9,壬辰). 西暦和暦表(1233,貞永,2,[],9,壬辰). 西暦和暦表(1233,天福,1,4 / 15,[],癸巳). 西暦和暦表(1234,天福,2,[],[],癸巳). 西暦和暦表(1234,文暦,1,11 / 5,[],甲午). 西暦和暦表(1235,文暦,2,[],[],甲午). 西暦和暦表(1235,嘉禎,1,9 / 19,6,乙未). 西暦和暦表(1236,嘉禎,2,[],[],丙申). 西暦和暦表(1237,嘉禎,3,[],[],丁酉). 西暦和暦表(1238,嘉禎,4,[],[],丁酉). 西暦和暦表(1238,暦仁,1,11 / 23,2,戊戌). 西暦和暦表(1239,暦仁,2,[],2,戊戌). 西暦和暦表(1239,延応,1,2 / 7,[],己亥). 西暦和暦表(1240,延応,2,[],[],己亥). 西暦和暦表(1240,仁治,1,7 / 16,10,庚子). 西暦和暦表(1241,仁治,2,[],[],辛丑). 西暦和暦表(1242,仁治,3,[],[],壬寅). 西暦和暦表(1243,仁治,4,[],[],壬寅). 西暦和暦表(1243,寛元,1,2 / 26,7,癸卯). 西暦和暦表(1244,寛元,2,[],[],甲辰). 西暦和暦表(1245,寛元,3,[],[],乙巳). 西暦和暦表(1246,寛元,4,[],4,丙午). 西暦和暦表(1247,寛元,5,[],4,丙午). 西暦和暦表(1247,宝治,1,2 / 28,[],丁未). 西暦和暦表(1248,宝治,2,[],12,戊申). 西暦和暦表(1249,宝治,3,[],12,戊申). 西暦和暦表(1249,建長,1,3 / 18,[],己酉). 西暦和暦表(1250,建長,2,[],[],庚戌). 西暦和暦表(1251,建長,3,[],9,辛亥). 西暦和暦表(1252,建長,4,[],[],壬子). 西暦和暦表(1253,建長,5,[],[],癸丑). 西暦和暦表(1254,建長,6,[],5,甲寅). 西暦和暦表(1255,建長,7,[],[],乙卯). 西暦和暦表(1256,建長,8,[],[],乙卯). 西暦和暦表(1256,康元,1,10 / 5,[],丙辰). 西暦和暦表(1257,康元,2,[],[],丙辰). 西暦和暦表(1257,正嘉,1,3 / 14,3,丁巳). 西暦和暦表(1258,正嘉,2,[],[],戊午). 西暦和暦表(1259,正嘉,3,[],[],戊午). 西暦和暦表(1259,正元,1,3 / 26,10,己未). 西暦和暦表(1260,正元,2,[],10,己未). 西暦和暦表(1260,文応,1,4 / 23,[],庚申). 西暦和暦表(1261,文応,2,[],[],庚申). 西暦和暦表(1261,弘長,1,2 / 20,[],辛酉). 西暦和暦表(1262,弘長,2,[],7,壬戌). 西暦和暦表(1263,弘長,3,[],[],癸亥). 西暦和暦表(1264,弘長,4,[],[],癸亥). 西暦和暦表(1264,文永,1,2 / 28,[],甲子). 西暦和暦表(1265,文永,2,[],4,乙丑). 西暦和暦表(1266,文永,3,[],[],丙寅). 西暦和暦表(1267,文永,4,[],[],丁卯). 西暦和暦表(1268,文永,5,[],1,戊辰). 西暦和暦表(1269,文永,6,[],[],己巳). 西暦和暦表(1270,文永,7,[],9,庚午). 西暦和暦表(1271,文永,8,[],[],辛未). 西暦和暦表(1272,文永,9,[],[],壬申). 西暦和暦表(1273,文永,10,[],5,癸酉). 西暦和暦表(1274,文永,11,[],[],甲戌). 西暦和暦表(1275,文永,12,[],[],甲戌). 西暦和暦表(1275,建治,1,4 / 25,[],乙亥). 西暦和暦表(1276,建治,2,[],3,丙子). 西暦和暦表(1277,建治,3,[],[],丁丑). 西暦和暦表(1278,建治,4,[],[],丁丑). 西暦和暦表(1278,弘安,1,2 / 29,10,戊寅). 西暦和暦表(1279,弘安,2,[],[],己卯). 西暦和暦表(1280,弘安,3,[],[],庚辰). 西暦和暦表(1281,弘安,4,[],7,辛巳). 西暦和暦表(1282,弘安,5,[],[],壬午). 西暦和暦表(1283,弘安,6,[],[],癸未). 西暦和暦表(1284,弘安,7,[],4,甲申). 西暦和暦表(1285,弘安,8,[],[],乙酉). 西暦和暦表(1286,弘安,9,[],12,丙戌). 西暦和暦表(1287,弘安,10,[],[],丁亥). 西暦和暦表(1288,弘安,11,[],[],丁亥). 西暦和暦表(1288,正応,1,4 / 28,[],戊子). 西暦和暦表(1289,正応,2,[],10,己丑). 西暦和暦表(1290,正応,3,[],[],庚寅). 西暦和暦表(1291,正応,4,[],[],辛卯). 西暦和暦表(1292,正応,5,[],6,壬辰). 西暦和暦表(1293,正応,6,[],6,壬辰). 西暦和暦表(1293,永仁,1,8 / 5,[],癸巳). 西暦和暦表(1294,永仁,2,[],[],甲午). 西暦和暦表(1295,永仁,3,[],2,乙未). 西暦和暦表(1296,永仁,4,[],[],丙申). 西暦和暦表(1297,永仁,5,[],10,丁酉). 西暦和暦表(1298,永仁,6,[],[],戊戌). 西暦和暦表(1299,永仁,7,[],[],戊戌). 西暦和暦表(1299,正安,1,4 / 25,[],己亥). 西暦和暦表(1300,正安,2,[],7,庚子). 西暦和暦表(1301,正安,3,[],[],辛丑). 西暦和暦表(1302,正安,4,[],[],辛丑). 西暦和暦表(1302,乾元,1,11 / 21,[],壬寅). 西暦和暦表(1303,乾元,2,[],[],壬寅). 西暦和暦表(1303,嘉元,1,8 / 5,4,癸卯). 西暦和暦表(1304,嘉元,2,[],[],甲辰). 西暦和暦表(1305,嘉元,3,[],12,乙巳). 西暦和暦表(1306,嘉元,4,[],12,乙巳). 西暦和暦表(1306,徳治,1,12 / 14,[],丙午). 西暦和暦表(1307,徳治,2,[],[],丁未). 西暦和暦表(1308,徳治,3,[],[],丁未). 西暦和暦表(1308,延慶,1,10 / 9,8,戊申). 西暦和暦表(1309,延慶,2,[],[],己酉). 西暦和暦表(1310,延慶,3,[],[],庚戌). 西暦和暦表(1311,延慶,4,[],[],庚戌). 西暦和暦表(1311,応長,1,4 / 28,6,辛亥). 西暦和暦表(1312,応長,2,[],6,辛亥). 西暦和暦表(1312,正和,1,3 / 20,[],壬子). 西暦和暦表(1313,正和,2,[],[],癸丑). 西暦和暦表(1314,正和,3,[],3,甲寅). 西暦和暦表(1315,正和,4,[],[],乙卯). 西暦和暦表(1316,正和,5,[],10,丙辰). 西暦和暦表(1317,正和,6,[],10,丙辰). 西暦和暦表(1317,文保,1,2 / 3,[],丁巳). 西暦和暦表(1318,文保,2,[],[],戊午). 西暦和暦表(1319,文保,3,[],[],戊午). 西暦和暦表(1319,元応,1,4 / 28,7,己未). 西暦和暦表(1320,元応,2,[],[],庚申). 西暦和暦表(1321,元応,3,[],[],庚申). 西暦和暦表(1321,元亨,1,2 / 23,[],辛酉). 西暦和暦表(1322,元亨,2,[],5,壬戌). 西暦和暦表(1323,元亨,3,[],[],癸亥). 西暦和暦表(1324,元亨,4,[],[],癸亥). 西暦和暦表(1324,正中,1,12 / 9,[],甲子). 西暦和暦表(1325,正中,2,[],1,乙丑). 西暦和暦表(1326,正中,3,[],1,乙丑). 西暦和暦表(1326,嘉暦,1,4 / 26,[],丙寅). 西暦和暦表(1327,嘉暦,2,[],9,丁卯). 西暦和暦表(1328,嘉暦,3,[],[],戊辰). 西暦和暦表(1329,嘉暦,4,[],[],戊辰). 西暦和暦表(1329,元徳,1,8 / 29,[],己巳). 西暦和暦表(1330,元徳,2,[],6,庚午). 西暦和暦表(1331,元徳,3,[],6,庚午). 西暦和暦表(1331,元弘,1,8 / 9,[],辛未). 西暦和暦表(1332,元弘,2,[],[],辛未). 西暦和暦表(1332,正慶,1,4 / 28,[],壬申). 西暦和暦表(1333,正慶,2,[],2,癸酉). 西暦和暦表(1334,正慶,3,[],2,癸酉). 西暦和暦表(1334,建武,1,1 / 29,[],甲戌). 西暦和暦表(1335,建武,2,[],10,乙亥). 西暦和暦表(1336,建武,3,[],[],丙子). 西暦和暦表(1337,建武,4,[],[],丁丑). 西暦和暦表(1338,建武,5,[],[],丁丑). 西暦和暦表(1338,暦応,1,8 / 28,7,戊寅). 西暦和暦表(1339,暦応,2,[],[],己卯). 西暦和暦表(1340,暦応,3,[],[],庚辰). 西暦和暦表(1341,暦応,4,[],4,辛巳). 西暦和暦表(1342,暦応,5,[],4,辛巳). 西暦和暦表(1342,康永,1,4 / 27,[],壬午). 西暦和暦表(1343,康永,2,[],[],癸未). 西暦和暦表(1344,康永,3,[],2,甲申). 西暦和暦表(1345,康永,4,[],2,甲申). 西暦和暦表(1345,貞和,1,10 / 21,[],乙酉). 西暦和暦表(1346,貞和,2,[],9,丙戌). 西暦和暦表(1347,貞和,3,[],[],丁亥). 西暦和暦表(1348,貞和,4,[],[],戊子). 西暦和暦表(1349,貞和,5,[],6,己丑). 西暦和暦表(1350,貞和,6,[],6,己丑). 西暦和暦表(1350,観応,1,2 / 27,[],庚寅). 西暦和暦表(1351,観応,2,[],[],辛卯). 西暦和暦表(1352,観応,3,[],[],辛卯). 西暦和暦表(1352,文和,1,9 / 27,2,壬辰). 西暦和暦表(1353,文和,2,[],[],癸巳). 西暦和暦表(1354,文和,3,[],10,甲午). 西暦和暦表(1355,文和,4,[],[],乙未). 西暦和暦表(1356,文和,5,[],[],乙未). 西暦和暦表(1356,延文,1,3 / 28,[],丙申). 西暦和暦表(1357,延文,2,[],7,丁酉). 西暦和暦表(1358,延文,3,[],[],戊戌). 西暦和暦表(1359,延文,4,[],[],己亥). 西暦和暦表(1360,延文,5,[],4,庚子). 西暦和暦表(1361,延文,6,[],4,庚子). 西暦和暦表(1361,康安,1,3 / 29,[],辛丑). 西暦和暦表(1362,康安,2,[],[],辛丑). 西暦和暦表(1362,貞治,1,9 / 23,[],壬寅). 西暦和暦表(1363,貞治,2,[],1,癸卯). 西暦和暦表(1364,貞治,3,[],[],甲辰). 西暦和暦表(1365,貞治,4,[],9,乙巳). 西暦和暦表(1366,貞治,5,[],[],丙午). 西暦和暦表(1367,貞治,6,[],[],丁未). 西暦和暦表(1368,貞治,7,[],[],丁未). 西暦和暦表(1368,応安,1,2 / 18,6,戊申). 西暦和暦表(1369,応安,2,[],[],己酉). 西暦和暦表(1370,応安,3,[],[],庚戌). 西暦和暦表(1371,応安,4,[],3,辛亥). 西暦和暦表(1372,応安,5,[],[],壬子). 西暦和暦表(1373,応安,6,[],10,癸丑). 西暦和暦表(1374,応安,7,[],[],甲寅). 西暦和暦表(1375,応安,8,[],[],甲寅). 西暦和暦表(1375,永和,1,5 / 27,[],乙卯). 西暦和暦表(1376,永和,2,[],7,丙辰). 西暦和暦表(1377,永和,3,[],[],丁巳). 西暦和暦表(1378,永和,4,[],[],戊午). 西暦和暦表(1379,永和,5,[],[],戊午). 西暦和暦表(1379,康暦,1,3 / 22,4,己未). 西暦和暦表(1380,康暦,2,[],[],庚申). 西暦和暦表(1381,康暦,3,[],[],庚申). 西暦和暦表(1381,永徳,1,2 / 10,[],辛酉). 西暦和暦表(1382,永徳,2,[],1,壬戌). 西暦和暦表(1383,永徳,3,[],[],癸亥). 西暦和暦表(1384,永徳,4,[],[],癸亥). 西暦和暦表(1384,至徳,1,4 / 28,9,甲子). 西暦和暦表(1385,至徳,2,[],[],乙丑). 西暦和暦表(1386,至徳,3,[],[],丙寅). 西暦和暦表(1387,至徳,4,[],[],丙寅). 西暦和暦表(1387,嘉慶,1,8 / 23,5,丁卯). 西暦和暦表(1388,嘉慶,2,[],[],戊辰). 西暦和暦表(1389,嘉慶,3,[],[],戊辰). 西暦和暦表(1389,康応,1,2 / 9,[],己巳). 西暦和暦表(1390,康応,2,[],[],己巳). 西暦和暦表(1390,明徳,1,3 / 26,3,庚午). 西暦和暦表(1391,明徳,2,[],[],辛未). 西暦和暦表(1392,明徳,3,[],10,壬申). 西暦和暦表(1393,明徳,4,[],[],癸酉). 西暦和暦表(1394,明徳,5,[],[],癸酉). 西暦和暦表(1394,応永,1,7 / 5,[],甲戌). 西暦和暦表(1395,応永,2,[],7,乙亥). 西暦和暦表(1396,応永,3,[],[],丙子). 西暦和暦表(1397,応永,4,[],[],丁丑). 西暦和暦表(1398,応永,5,[],4,戊寅). 西暦和暦表(1399,応永,6,[],[],己卯). 西暦和暦表(1400,応永,7,[],[],庚辰). 西暦和暦表(1401,応永,8,[],1,辛巳). 西暦和暦表(1402,応永,9,[],[],壬午). 西暦和暦表(1403,応永,10,[],10,癸未). 西暦和暦表(1404,応永,11,[],[],甲申). 西暦和暦表(1405,応永,12,[],[],乙酉). 西暦和暦表(1406,応永,13,[],6,丙戌). 西暦和暦表(1407,応永,14,[],[],丁亥). 西暦和暦表(1408,応永,15,[],[],戊子). 西暦和暦表(1409,応永,16,[],3,己丑). 西暦和暦表(1410,応永,17,[],[],庚寅). 西暦和暦表(1411,応永,18,[],10,辛卯). 西暦和暦表(1412,応永,19,[],[],壬辰). 西暦和暦表(1413,応永,20,[],[],癸巳). 西暦和暦表(1414,応永,21,[],7,甲午). 西暦和暦表(1415,応永,22,[],[],乙未). 西暦和暦表(1416,応永,23,[],[],丙申). 西暦和暦表(1417,応永,24,[],5,丁酉). 西暦和暦表(1418,応永,25,[],[],戊戌). 西暦和暦表(1419,応永,26,[],[],己亥). 西暦和暦表(1420,応永,27,[],1,庚子). 西暦和暦表(1421,応永,28,[],[],辛丑). 西暦和暦表(1422,応永,29,[],10,壬寅). 西暦和暦表(1423,応永,30,[],[],癸卯). 西暦和暦表(1424,応永,31,[],[],甲辰). 西暦和暦表(1425,応永,32,[],6,乙巳). 西暦和暦表(1426,応永,33,[],[],丙午). 西暦和暦表(1427,応永,34,[],[],丁未). 西暦和暦表(1428,応永,35,[],[],丁未). 西暦和暦表(1428,正長,1,4 / 27,3,戊申). 西暦和暦表(1429,正長,2,[],3,戊申). 西暦和暦表(1429,永享,1,9 / 5,[],己酉). 西暦和暦表(1430,永享,2,[],11,庚戌). 西暦和暦表(1431,永享,3,[],[],辛亥). 西暦和暦表(1432,永享,4,[],[],壬子). 西暦和暦表(1433,永享,5,[],7,癸丑). 西暦和暦表(1434,永享,6,[],[],甲寅). 西暦和暦表(1435,永享,7,[],[],乙卯). 西暦和暦表(1436,永享,8,[],5,丙辰). 西暦和暦表(1437,永享,9,[],[],丁巳). 西暦和暦表(1438,永享,10,[],[],戊午). 西暦和暦表(1439,永享,11,[],1,己未). 西暦和暦表(1440,永享,12,[],[],庚申). 西暦和暦表(1441,永享,13,[],[],庚申). 西暦和暦表(1441,嘉吉,1,2 / 17,9,辛酉). 西暦和暦表(1442,嘉吉,2,[],[],壬戌). 西暦和暦表(1443,嘉吉,3,[],[],癸亥). 西暦和暦表(1444,嘉吉,4,[],[],癸亥). 西暦和暦表(1444,文安,1,2 / 5,6,甲子). 西暦和暦表(1445,文安,2,[],[],乙丑). 西暦和暦表(1446,文安,3,[],[],丙寅). 西暦和暦表(1447,文安,4,[],2,丁卯). 西暦和暦表(1448,文安,5,[],[],戊辰). 西暦和暦表(1449,文安,6,[],[],戊辰). 西暦和暦表(1449,宝徳,1,7 / 28,10,己巳). 西暦和暦表(1450,宝徳,2,[],[],庚午). 西暦和暦表(1451,宝徳,3,[],[],辛未). 西暦和暦表(1452,宝徳,4,[],[],辛未). 西暦和暦表(1452,享徳,1,7 / 25,8,壬申). 西暦和暦表(1453,享徳,2,[],[],癸酉). 西暦和暦表(1454,享徳,3,[],[],甲戌). 西暦和暦表(1455,享徳,4,[],[],甲戌). 西暦和暦表(1455,康正,1,7 / 25,4,乙亥). 西暦和暦表(1456,康正,2,[],[],丙子). 西暦和暦表(1457,康正,3,[],[],丙子). 西暦和暦表(1457,長祿,1,9 / 28,[],丁丑). 西暦和暦表(1458,長祿,2,[],1,戊寅). 西暦和暦表(1459,長祿,3,[],[],己卯). 西暦和暦表(1460,長祿,4,[],[],己卯). 西暦和暦表(1460,寛正,1,12 / 21,9,庚辰). 西暦和暦表(1461,寛正,2,[],[],辛巳). 西暦和暦表(1462,寛正,3,[],[],壬午). 西暦和暦表(1463,寛正,4,[],6,癸未). 西暦和暦表(1464,寛正,5,[],[],甲申). 西暦和暦表(1465,寛正,6,[],[],乙酉). 西暦和暦表(1466,寛正,7,[],[],乙酉). 西暦和暦表(1466,文正,1,2 / 28,2,丙戌). 西暦和暦表(1467,文正,2,[],2,丙戌). 西暦和暦表(1467,応仁,1,3 / 5,[],丁亥). 西暦和暦表(1468,応仁,2,[],10,戊子). 西暦和暦表(1469,応仁,3,[],10,戊子). 西暦和暦表(1469,文明,1,4 / 28,[],己丑). 西暦和暦表(1470,文明,2,[],[],庚寅). 西暦和暦表(1471,文明,3,[],8,辛卯). 西暦和暦表(1472,文明,4,[],[],壬辰). 西暦和暦表(1473,文明,5,[],[],癸巳). 西暦和暦表(1474,文明,6,[],5,甲午). 西暦和暦表(1475,文明,7,[],[],乙未). 西暦和暦表(1476,文明,8,[],[],丙申). 西暦和暦表(1477,文明,9,[],1,丁酉). 西暦和暦表(1478,文明,10,[],[],戊戌). 西暦和暦表(1479,文明,11,[],9,己亥). 西暦和暦表(1480,文明,12,[],[],庚子). 西暦和暦表(1481,文明,13,[],[],辛丑). 西暦和暦表(1482,文明,14,[],7,壬寅). 西暦和暦表(1483,文明,15,[],[],癸卯). 西暦和暦表(1484,文明,16,[],[],甲辰). 西暦和暦表(1485,文明,17,[],3,乙巳). 西暦和暦表(1486,文明,18,[],[],丙午). 西暦和暦表(1487,文明,19,[],[],丙午). 西暦和暦表(1487,長享,1,7 / 20,11,丁未). 西暦和暦表(1488,長享,2,[],[],戊申). 西暦和暦表(1489,長享,3,[],[],戊申). 西暦和暦表(1489,延徳,1,8 / 21,[],己酉). 西暦和暦表(1490,延徳,2,[],8,庚戌). 西暦和暦表(1491,延徳,3,[],[],辛亥). 西暦和暦表(1492,延徳,4,[],[],辛亥). 西暦和暦表(1492,明応,1,7 / 19,[],壬子). 西暦和暦表(1493,明応,2,[],4,癸丑). 西暦和暦表(1494,明応,3,[],[],甲寅). 西暦和暦表(1495,明応,4,[],[],乙卯). 西暦和暦表(1496,明応,5,[],2,丙辰). 西暦和暦表(1497,明応,6,[],[],丁巳). 西暦和暦表(1498,明応,7,[],10,戊午). 西暦和暦表(1499,明応,8,[],[],己未). 西暦和暦表(1500,明応,9,[],[],庚申). 西暦和暦表(1501,明応,10,[],[],庚申). 西暦和暦表(1501,文龜,1,2 / 29,6,辛酉). 西暦和暦表(1502,文龜,2,[],[],壬戌). 西暦和暦表(1503,文龜,3,[],[],癸亥). 西暦和暦表(1504,文龜,4,[],[],癸亥). 西暦和暦表(1504,永正,1,2 / 30,3,甲子). 西暦和暦表(1505,永正,2,[],[],乙丑). 西暦和暦表(1506,永正,3,[],11,丙寅). 西暦和暦表(1507,永正,4,[],[],丁卯). 西暦和暦表(1508,永正,5,[],[],戊辰). 西暦和暦表(1509,永正,6,[],8,己巳). 西暦和暦表(1510,永正,7,[],[],庚午). 西暦和暦表(1511,永正,8,[],[],辛未). 西暦和暦表(1512,永正,9,[],4,壬申). 西暦和暦表(1513,永正,10,[],[],癸酉). 西暦和暦表(1514,永正,11,[],[],甲戌). 西暦和暦表(1515,永正,12,[],2,乙亥). 西暦和暦表(1516,永正,13,[],[],丙子). 西暦和暦表(1517,永正,14,[],10,丁丑). 西暦和暦表(1518,永正,15,[],[],戊寅). 西暦和暦表(1519,永正,16,[],[],己卯). 西暦和暦表(1520,永正,17,[],6,庚辰). 西暦和暦表(1521,永正,18,[],6,庚辰). 西暦和暦表(1521,大永,1,8 / 23,[],辛巳). 西暦和暦表(1522,大永,2,[],[],壬午). 西暦和暦表(1523,大永,3,[],3,癸未). 西暦和暦表(1524,大永,4,[],[],甲申). 西暦和暦表(1525,大永,5,[],11,乙酉). 西暦和暦表(1526,大永,6,[],[],丙戌). 西暦和暦表(1527,大永,7,[],[],丁亥). 西暦和暦表(1528,大永,8,[],[],丁亥). 西暦和暦表(1528,享祿,1,8 / 20,9,戊子). 西暦和暦表(1529,享祿,2,[],[],己丑). 西暦和暦表(1530,享祿,3,[],[],庚寅). 西暦和暦表(1531,享祿,4,[],5,辛卯). 西暦和暦表(1532,享祿,5,[],5,辛卯). 西暦和暦表(1532,天文,1,7 / 29,[],壬辰). 西暦和暦表(1533,天文,2,[],[],癸巳). 西暦和暦表(1534,天文,3,[],1,甲午). 西暦和暦表(1535,天文,4,[],[],乙未). 西暦和暦表(1536,天文,5,[],10,丙申). 西暦和暦表(1537,天文,6,[],[],丁酉). 西暦和暦表(1538,天文,7,[],[],戊戌). 西暦和暦表(1539,天文,8,[],6,己亥). 西暦和暦表(1540,天文,9,[],[],庚子). 西暦和暦表(1541,天文,10,[],[],辛丑). 西暦和暦表(1542,天文,11,[],3,壬寅). 西暦和暦表(1543,天文,12,[],[],癸卯). 西暦和暦表(1544,天文,13,[],11,甲辰). 西暦和暦表(1545,天文,14,[],[],乙巳). 西暦和暦表(1546,天文,15,[],[],丙午). 西暦和暦表(1547,天文,16,[],7,丁未). 西暦和暦表(1548,天文,17,[],[],戊申). 西暦和暦表(1549,天文,18,[],[],己酉). 西暦和暦表(1550,天文,19,[],5,庚戌). 西暦和暦表(1551,天文,20,[],[],辛亥). 西暦和暦表(1552,天文,21,[],[],壬子). 西暦和暦表(1553,天文,22,[],1,癸丑). 西暦和暦表(1554,天文,23,[],[],甲寅). 西暦和暦表(1555,天文,24,[],[],甲寅). 西暦和暦表(1555,弘治,1,10 / 23,10,乙卯). 西暦和暦表(1556,弘治,2,[],[],丙辰). 西暦和暦表(1557,弘治,3,[],[],丁巳). 西暦和暦表(1558,弘治,4,[],[],丁巳). 西暦和暦表(1558,永祿,1,2 / 28,6,戊午). 西暦和暦表(1559,永祿,2,[],[],己未). 西暦和暦表(1560,永祿,3,[],[],庚申). 西暦和暦表(1561,永祿,4,[],3,辛酉). 西暦和暦表(1562,永祿,5,[],[],壬戌). 西暦和暦表(1563,永祿,6,[],12,癸亥). 西暦和暦表(1564,永禄,7,[],[],甲子). 西暦和暦表(1565,永禄,8,[],[],乙丑). 西暦和暦表(1566,永禄,9,[],8,丙寅). 西暦和暦表(1567,永禄,10,[],[],丁卯). 西暦和暦表(1568,永禄,11,[],[],戊辰). 西暦和暦表(1569,永禄,12,[],5,己巳). 西暦和暦表(1570,永禄,13,[],5,己巳). 西暦和暦表(1570,元龜,1,4 / 23,[],庚午). 西暦和暦表(1571,元龜,2,[],[],辛未). 西暦和暦表(1572,元龜,3,[],1,壬申). 西暦和暦表(1573,元龜,4,[],1,壬申). 西暦和暦表(1573,天正,1,7 / 28,[],癸酉). 西暦和暦表(1574,天正,2,[],11,甲戌). 西暦和暦表(1575,天正,3,[],[],乙亥). 西暦和暦表(1576,天正,4,[],[],丙子). 西暦和暦表(1577,天正,5,[],7,丁丑). 西暦和暦表(1578,天正,6,[],[],戊寅). 西暦和暦表(1579,天正,7,[],[],己卯). 西暦和暦表(1580,天正,8,[],3,庚辰). 西暦和暦表(1581,天正,9,[],[],辛巳). 西暦和暦表(1582,天正,10,[],[],壬午). 西暦和暦表(1583,天正,11,[],1,癸未). 西暦和暦表(1584,天正,12,[],[],甲申). 西暦和暦表(1585,天正,13,[],8,乙酉). 西暦和暦表(1586,天正,14,[],[],丙戌). 西暦和暦表(1587,天正,15,[],[],丁亥). 西暦和暦表(1588,天正,16,[],5,戊子). 西暦和暦表(1589,天正,17,[],[],己丑). 西暦和暦表(1590,天正,18,[],[],庚寅). 西暦和暦表(1591,天正,19,[],1,辛卯). 西暦和暦表(1592,天正,20,[],1,辛卯). 西暦和暦表(1592,文禄,1,12 / 8,[],壬辰). 西暦和暦表(1593,文禄,2,[],9,癸巳). 西暦和暦表(1594,文禄,3,[],[],甲午). 西暦和暦表(1595,文禄,4,[],[],乙未). 西暦和暦表(1596,文禄,5,[],[],乙未). 西暦和暦表(1596,慶長,1,10 / 27,7,丙申). 西暦和暦表(1597,慶長,2,[],[],丁酉). 西暦和暦表(1598,慶長,3,[],[],戊戌). 西暦和暦表(1599,慶長,4,[],3,己亥). 西暦和暦表(1600,慶長,5,[],[],庚子). 西暦和暦表(1601,慶長,6,[],11,辛丑). 西暦和暦表(1602,慶長,7,[],[],壬寅). 西暦和暦表(1603,慶長,8,[],[],癸卯). 西暦和暦表(1604,慶長,9,[],8,甲辰). 西暦和暦表(1605,慶長,10,[],[],乙巳). 西暦和暦表(1606,慶長,11,[],[],丙午). 西暦和暦表(1607,慶長,12,[],4,丁未). 西暦和暦表(1608,慶長,13,[],[],戊申). 西暦和暦表(1609,慶長,14,[],[],己酉). 西暦和暦表(1610,慶長,15,[],2,庚戌). 西暦和暦表(1611,慶長,16,[],[],辛亥). 西暦和暦表(1612,慶長,17,[],10,壬子). 西暦和暦表(1613,慶長,18,[],[],癸丑). 西暦和暦表(1614,慶長,19,[],[],甲寅). 西暦和暦表(1615,慶長,20,[],[],甲寅). 西暦和暦表(1615,元和,1,7 / 13,6,乙卯). 西暦和暦表(1616,元和,2,[],[],丙辰). 西暦和暦表(1617,元和,3,[],[],丁巳). 西暦和暦表(1618,元和,4,[],3,戊午). 西暦和暦表(1619,元和,5,[],[],己未). 西暦和暦表(1620,元和,6,[],12,庚申). 西暦和暦表(1621,元和,7,[],[],辛酉). 西暦和暦表(1622,元和,8,[],[],壬戌). 西暦和暦表(1623,元和,9,[],8,癸亥). 西暦和暦表(1624,元和,10,[],8,癸亥). 西暦和暦表(1624,寛永,1,2 / 30,[],甲子). 西暦和暦表(1625,寛永,2,[],[],乙丑). 西暦和暦表(1626,寛永,3,[],4,丙寅). 西暦和暦表(1627,寛永,4,[],[],丁卯). 西暦和暦表(1628,寛永,5,[],[],戊辰). 西暦和暦表(1629,寛永,6,[],2,己巳). 西暦和暦表(1630,寛永,7,[],[],庚午). 西暦和暦表(1631,寛永,8,[],10,辛未). 西暦和暦表(1632,寛永,9,[],[],壬申). 西暦和暦表(1633,寛永,10,[],[],癸酉). 西暦和暦表(1634,寛永,11,[],7,甲戌). 西暦和暦表(1635,寛永,12,[],[],乙亥). 西暦和暦表(1636,寛永,13,[],[],丙子). 西暦和暦表(1637,寛永,14,[],3,丁丑). 西暦和暦表(1638,寛永,15,[],[],戊寅). 西暦和暦表(1639,寛永,16,[],11,己卯). 西暦和暦表(1640,寛永,17,[],[],庚辰). 西暦和暦表(1641,寛永,18,[],[],辛巳). 西暦和暦表(1642,寛永,19,[],9,壬午). 西暦和暦表(1643,寛永,20,[],[],癸未). 西暦和暦表(1644,寛永,21,[],[],癸未). 西暦和暦表(1644,正保,1,12 / 16,[],甲申). 西暦和暦表(1645,正保,2,[],5,乙酉). 西暦和暦表(1646,正保,3,[],[],丙戌). 西暦和暦表(1647,正保,4,[],[],丁亥). 西暦和暦表(1648,正保,5,[],[],丁亥). 西暦和暦表(1648,慶安,1,2 / 15,1,戊子). 西暦和暦表(1649,慶安,2,[],[],己丑). 西暦和暦表(1650,慶安,3,[],10,庚寅). 西暦和暦表(1651,慶安,4,[],[],辛卯). 西暦和暦表(1652,慶安,5,[],[],辛卯). 西暦和暦表(1652,承応,1,9 / 18,[],壬辰). 西暦和暦表(1653,承応,2,[],6,癸巳). 西暦和暦表(1654,承応,3,[],[],甲午). 西暦和暦表(1655,承応,4,[],[],甲午). 西暦和暦表(1655,明暦,1,4 / 13,[],乙未). 西暦和暦表(1656,明暦,2,[],4,丙申). 西暦和暦表(1657,明暦,3,[],[],丁酉). 西暦和暦表(1658,明暦,4,[],[],丁酉). 西暦和暦表(1658,万治,1,7 / 23,12,戊戌). 西暦和暦表(1659,万治,2,[],[],己亥). 西暦和暦表(1660,万治,3,[],[],庚子). 西暦和暦表(1661,万治,4,[],[],庚子). 西暦和暦表(1661,寛文,1,4 / 25,8,辛丑). 西暦和暦表(1662,寛文,2,[],[],壬寅). 西暦和暦表(1663,寛文,3,[],[],癸卯). 西暦和暦表(1664,寛文,4,[],5,甲辰). 西暦和暦表(1665,寛文,5,[],[],乙巳). 西暦和暦表(1666,寛文,6,[],[],丙午). 西暦和暦表(1667,寛文,7,[],2,丁未). 西暦和暦表(1668,寛文,8,[],[],戊申). 西暦和暦表(1669,寛文,9,[],10,己酉). 西暦和暦表(1670,寛文,10,[],[],庚戌). 西暦和暦表(1671,寛文,11,[],[],辛亥). 西暦和暦表(1672,寛文,12,[],6,壬子). 西暦和暦表(1673,寛文,13,[],6,壬子). 西暦和暦表(1673,延宝,1,9 / 21,[],癸丑). 西暦和暦表(1674,延宝,2,[],[],甲寅). 西暦和暦表(1675,延宝,3,[],4,乙卯). 西暦和暦表(1676,延宝,4,[],[],丙辰). 西暦和暦表(1677,延宝,5,[],12,丁巳). 西暦和暦表(1678,延宝,6,[],[],戊午). 西暦和暦表(1679,延宝,7,[],[],己未). 西暦和暦表(1680,延宝,8,[],8,庚申). 西暦和暦表(1681,延宝,9,[],8,庚申). 西暦和暦表(1681,天和,1,9 / 29,[],辛酉). 西暦和暦表(1682,天和,2,[],[],壬戌). 西暦和暦表(1683,天和,3,[],5,癸亥). 西暦和暦表(1684,天和,4,[],5,癸亥). 西暦和暦表(1684,貞享,1,2 / 21,[],甲子). 西暦和暦表(1685,貞享,2,[],[],乙丑). 西暦和暦表(1686,貞享,3,[],3,丙寅). 西暦和暦表(1687,貞享,4,[],[],丁卯). 西暦和暦表(1688,貞享,5,[],[],丁卯). 西暦和暦表(1688,元禄,1,9 / 30,[],戊辰). 西暦和暦表(1689,元禄,2,[],1,己巳). 西暦和暦表(1690,元禄,3,[],[],庚午). 西暦和暦表(1691,元禄,4,[],8,辛未). 西暦和暦表(1692,元禄,5,[],[],壬申). 西暦和暦表(1693,元禄,6,[],[],癸酉). 西暦和暦表(1694,元禄,7,[],5,甲戌). 西暦和暦表(1695,元禄,8,[],[],乙亥). 西暦和暦表(1696,元禄,9,[],[],丙子). 西暦和暦表(1697,元禄,10,[],2,丁丑). 西暦和暦表(1698,元禄,11,[],[],戊寅). 西暦和暦表(1699,元禄,12,[],9,己卯). 西暦和暦表(1700,元禄,13,[],[],庚辰). 西暦和暦表(1701,元禄,14,[],[],辛巳). 西暦和暦表(1702,元禄,15,[],8,壬午). 西暦和暦表(1703,元禄,16,[],[],癸未). 西暦和暦表(1704,元禄,17,[],[],癸未). 西暦和暦表(1704,宝永,1,3 / 13,[],甲申). 西暦和暦表(1705,宝永,2,[],4,乙酉). 西暦和暦表(1706,宝永,3,[],[],丙戌). 西暦和暦表(1707,宝永,4,[],[],丁亥). 西暦和暦表(1708,宝永,5,[],1,戊子). 西暦和暦表(1709,宝永,6,[],[],己丑). 西暦和暦表(1710,宝永,7,[],8,庚寅). 西暦和暦表(1711,宝永,8,[],8,庚寅). 西暦和暦表(1711,正徳,1,4 / 25,[],辛卯). 西暦和暦表(1712,正徳,2,[],[],壬辰). 西暦和暦表(1713,正徳,3,[],5,癸巳). 西暦和暦表(1714,正徳,4,[],[],甲午). 西暦和暦表(1715,正徳,5,[],[],乙未). 西暦和暦表(1716,正徳,6,[],[],乙未). 西暦和暦表(1716,享保,1,6 / 22,2,丙申). 西暦和暦表(1717,享保,2,[],[],丁酉). 西暦和暦表(1718,享保,3,[],10,戊戌). 西暦和暦表(1719,享保,4,[],[],己亥). 西暦和暦表(1720,享保,5,[],[],庚子). 西暦和暦表(1721,享保,6,[],7,辛丑). 西暦和暦表(1722,享保,7,[],[],壬寅). 西暦和暦表(1723,享保,8,[],[],癸卯). 西暦和暦表(1724,享保,9,[],4,甲辰). 西暦和暦表(1725,享保,10,[],[],乙巳). 西暦和暦表(1726,享保,11,[],[],丙午). 西暦和暦表(1727,享保,12,[],1,丁未). 西暦和暦表(1728,享保,13,[],[],戊申). 西暦和暦表(1729,享保,14,[],9,己酉). 西暦和暦表(1730,享保,15,[],[],庚戌). 西暦和暦表(1731,享保,16,[],[],辛亥). 西暦和暦表(1732,享保,17,[],5,壬子). 西暦和暦表(1733,享保,18,[],[],癸丑). 西暦和暦表(1734,享保,19,[],[],甲寅). 西暦和暦表(1735,享保,20,[],3,乙卯). 西暦和暦表(1736,享保,21,[],3,乙卯). 西暦和暦表(1736,元文,1,4 / 28,[],丙辰). 西暦和暦表(1737,元文,2,[],11,丁巳). 西暦和暦表(1738,元文,3,[],[],戊午). 西暦和暦表(1739,元文,4,[],[],己未). 西暦和暦表(1740,元文,5,[],7,庚申). 西暦和暦表(1741,元文,6,[],7,庚申). 西暦和暦表(1741,寛保,1,2 / 27,[],辛酉). 西暦和暦表(1742,寛保,2,[],[],壬戌). 西暦和暦表(1743,寛保,3,[],4,癸亥). 西暦和暦表(1744,寛保,4,[],4,癸亥). 西暦和暦表(1744,延享,1,2 / 21,[],甲子). 西暦和暦表(1745,延享,2,[],12,乙丑). 西暦和暦表(1746,延享,3,[],[],丙寅). 西暦和暦表(1747,延享,4,[],[],丁卯). 西暦和暦表(1748,延享,5,[],[],丁卯). 西暦和暦表(1748,寛延,1,7 / 12,10,戊辰). 西暦和暦表(1749,寛延,2,[],[],己巳). 西暦和暦表(1750,寛延,3,[],[],庚午). 西暦和暦表(1751,寛延,4,[],[],庚午). 西暦和暦表(1751,宝暦,1,10 / 27,6,辛未). 西暦和暦表(1752,宝暦,2,[],[],壬申). 西暦和暦表(1753,宝暦,3,[],[],癸酉). 西暦和暦表(1754,宝暦,4,[],2,甲戌). 西暦和暦表(1755,宝暦,5,[],[],乙亥). 西暦和暦表(1756,宝暦,6,[],11,丙子). 西暦和暦表(1757,宝暦,7,[],[],丁丑). 西暦和暦表(1758,宝暦,8,[],[],戊寅). 西暦和暦表(1759,宝暦,9,[],7,己卯). 西暦和暦表(1760,宝暦,10,[],[],庚辰). 西暦和暦表(1761,宝暦,11,[],[],辛巳). 西暦和暦表(1762,宝暦,12,[],4,壬午). 西暦和暦表(1763,宝暦,13,[],[],癸未). 西暦和暦表(1764,宝暦,14,[],[],癸未). 西暦和暦表(1764,明和,1,6 / 2,12,甲申). 西暦和暦表(1765,明和,2,[],[],乙酉). 西暦和暦表(1766,明和,3,[],[],丙戌). 西暦和暦表(1767,明和,4,[],9,丁亥). 西暦和暦表(1768,明和,5,[],[],戊子). 西暦和暦表(1769,明和,6,[],[],己丑). 西暦和暦表(1770,明和,7,[],6,庚寅). 西暦和暦表(1771,明和,8,[],[],辛卯). 西暦和暦表(1772,明和,9,[],[],辛卯). 西暦和暦表(1772,安永,1,11 / 16,[],壬辰). 西暦和暦表(1773,安永,2,[],3,癸巳). 西暦和暦表(1774,安永,3,[],[],甲午). 西暦和暦表(1775,安永,4,[],12,乙未). 西暦和暦表(1776,安永,5,[],[],丙申). 西暦和暦表(1777,安永,6,[],[],丁酉). 西暦和暦表(1778,安永,7,[],7,戊戌). 西暦和暦表(1779,安永,8,[],[],己亥). 西暦和暦表(1780,安永,9,[],[],庚子). 西暦和暦表(1781,安永,10,[],[],庚子). 西暦和暦表(1781,天明,1,4 / 2,5,辛丑). 西暦和暦表(1782,天明,2,[],[],壬寅). 西暦和暦表(1783,天明,3,[],[],癸卯). 西暦和暦表(1784,天明,4,[],1,甲辰). 西暦和暦表(1785,天明,5,[],[],乙巳). 西暦和暦表(1786,天明,6,[],10,丙午). 西暦和暦表(1787,天明,7,[],[],丁未). 西暦和暦表(1788,天明,8,[],[],戊申). 西暦和暦表(1789,天明,9,[],[],戊申). 西暦和暦表(1789,寛政,1,1 / 25,6,己酉). 西暦和暦表(1790,寛政,2,[],[],庚戌). 西暦和暦表(1791,寛政,3,[],[],辛亥). 西暦和暦表(1792,寛政,4,[],2,壬子). 西暦和暦表(1793,寛政,5,[],[],癸丑). 西暦和暦表(1794,寛政,6,[],11,甲寅). 西暦和暦表(1795,寛政,7,[],[],乙卯). 西暦和暦表(1796,寛政,8,[],[],丙辰). 西暦和暦表(1797,寛政,9,[],7,丁巳). 西暦和暦表(1798,寛政,10,[],[],戊午). 西暦和暦表(1799,寛政,11,[],[],己未). 西暦和暦表(1800,寛政,12,[],4,庚申). 西暦和暦表(1801,寛政,13,[],4,庚申). 西暦和暦表(1801,享和,1,2 / 5,[],辛酉). 西暦和暦表(1802,享和,2,[],[],壬戌). 西暦和暦表(1803,享和,3,[],1,癸亥). 西暦和暦表(1804,享和,4,[],1,癸亥). 西暦和暦表(1804,文化,1,2 / 11,[],甲子). 西暦和暦表(1805,文化,2,[],8,乙丑). 西暦和暦表(1806,文化,3,[],[],丙寅). 西暦和暦表(1807,文化,4,[],[],丁卯). 西暦和暦表(1808,文化,5,[],6,戊辰). 西暦和暦表(1809,文化,6,[],[],己巳). 西暦和暦表(1810,文化,7,[],[],庚午). 西暦和暦表(1811,文化,8,[],2,辛未). 西暦和暦表(1812,文化,9,[],[],壬申). 西暦和暦表(1813,文化,10,[],11,癸酉). 西暦和暦表(1814,文化,11,[],[],甲戌). 西暦和暦表(1815,文化,12,[],[],乙亥). 西暦和暦表(1816,文化,13,[],8,丙子). 西暦和暦表(1817,文化,14,[],[],丁丑). 西暦和暦表(1818,文化,15,[],[],丁丑). 西暦和暦表(1818,文政,1,4 / 22,[],戊寅). 西暦和暦表(1819,文政,2,[],4,己卯). 西暦和暦表(1820,文政,3,[],[],庚辰). 西暦和暦表(1821,文政,4,[],[],辛巳). 西暦和暦表(1822,文政,5,[],1,壬午). 西暦和暦表(1823,文政,6,[],[],癸未). 西暦和暦表(1824,文政,7,[],8,甲申). 西暦和暦表(1825,文政,8,[],[],乙酉). 西暦和暦表(1826,文政,9,[],[],丙戌). 西暦和暦表(1827,文政,10,[],6,丁亥). 西暦和暦表(1828,文政,11,[],[],戊子). 西暦和暦表(1829,文政,12,[],[],己丑). 西暦和暦表(1830,文政,13,[],[],己丑). 西暦和暦表(1830,天保,1,12 / 1,3,庚寅). 西暦和暦表(1831,天保,2,[],[],辛卯). 西暦和暦表(1832,天保,3,[],11,壬辰). 西暦和暦表(1833,天保,4,[],[],癸巳). 西暦和暦表(1834,天保,5,[],[],甲午). 西暦和暦表(1835,天保,6,[],7,乙未). 西暦和暦表(1836,天保,7,[],[],丙申). 西暦和暦表(1837,天保,8,[],[],丁酉). 西暦和暦表(1838,天保,9,[],4,戊戌). 西暦和暦表(1839,天保,10,[],[],己亥). 西暦和暦表(1840,天保,11,[],[],庚子). 西暦和暦表(1841,天保,12,[],1,辛丑). 西暦和暦表(1842,天保,13,[],[],壬寅). 西暦和暦表(1843,天保,14,[],9,癸卯). 西暦和暦表(1844,天保,15,[],9,癸卯). 西暦和暦表(1844,弘化,1,12 / 2,[],甲辰). 西暦和暦表(1845,弘化,2,[],[],乙巳). 西暦和暦表(1846,弘化,3,[],5,丙午). 西暦和暦表(1847,弘化,4,[],[],丁未). 西暦和暦表(1848,弘化,5,[],[],丁未). 西暦和暦表(1848,嘉永,1,2 / 28,[],戊申). 西暦和暦表(1849,嘉永,2,[],4,己酉). 西暦和暦表(1850,嘉永,3,[],[],庚戌). 西暦和暦表(1851,嘉永,4,[],[],辛亥). 西暦和暦表(1852,嘉永,5,[],2,壬子). 西暦和暦表(1853,嘉永,6,[],[],癸丑). 西暦和暦表(1854,嘉永,7,[],[],癸丑). 西暦和暦表(1854,安政,1,11 / 27,7,甲寅). 西暦和暦表(1855,安政,2,[],[],乙卯). 西暦和暦表(1856,安政,3,[],[],丙辰). 西暦和暦表(1857,安政,4,[],5,丁巳). 西暦和暦表(1858,安政,5,[],[],戊午). 西暦和暦表(1859,安政,6,[],[],己未). 西暦和暦表(1860,安政,7,[],[],己未). 西暦和暦表(1860,万延,1,3 / 18,3,庚申). 西暦和暦表(1861,万延,2,[],3,庚申). 西暦和暦表(1861,文久,1,2 / 19,[],辛酉). 西暦和暦表(1862,文久,2,[],8,壬戌). 西暦和暦表(1863,文久,3,[],[],癸亥). 西暦和暦表(1864,文久,4,[],[],癸亥). 西暦和暦表(1864,元治,1,2 / 20,[],甲子). 西暦和暦表(1865,元治,2,[],[],甲子). 西暦和暦表(1865,慶応,1,4 / 8,5,乙丑). 西暦和暦表(1866,慶応,2,[],[],丙寅). 西暦和暦表(1867,慶応,3,[],[],丁卯). 西暦和暦表(1868,慶応,4,[],[],丁卯). 西暦和暦表(1868,明治,1,9 / 8,4,戊辰). 西暦和暦表(1869,明治,2,[],[],己巳). 西暦和暦表(1870,明治,3,[],10,庚午). 西暦和暦表(1871,明治,4,[],[],辛未). 西暦和暦表(1872,明治,5,[],[],壬申). 西暦和暦表(1873,明治,6,[],[],癸酉). 西暦和暦表(1874,明治,7,[],[],甲戌). 西暦和暦表(1875,明治,8,[],[],乙亥). 西暦和暦表(1876,明治,9,[],[],丙子). 西暦和暦表(1877,明治,10,[],[],丁丑). 西暦和暦表(1878,明治,11,[],[],戊寅). 西暦和暦表(1879,明治,12,[],[],己卯). 西暦和暦表(1880,明治,13,[],[],庚辰). 西暦和暦表(1881,明治,14,[],[],辛巳). 西暦和暦表(1882,明治,15,[],[],壬午). 西暦和暦表(1883,明治,16,[],[],癸未). 西暦和暦表(1884,明治,17,[],[],甲申). 西暦和暦表(1885,明治,18,[],[],乙酉). 西暦和暦表(1886,明治,19,[],[],丙戌). 西暦和暦表(1887,明治,20,[],[],丁亥). 西暦和暦表(1888,明治,21,[],[],戊子). 西暦和暦表(1889,明治,22,[],[],己丑). 西暦和暦表(1890,明治,23,[],[],庚寅). 西暦和暦表(1891,明治,24,[],[],辛卯). 西暦和暦表(1892,明治,25,[],[],壬辰). 西暦和暦表(1893,明治,26,[],[],癸巳). 西暦和暦表(1894,明治,27,[],[],甲午). 西暦和暦表(1895,明治,28,[],[],乙未). 西暦和暦表(1896,明治,29,[],[],丙申). 西暦和暦表(1897,明治,30,[],[],丁酉). 西暦和暦表(1898,明治,31,[],[],戊戌). 西暦和暦表(1899,明治,32,[],[],己亥). 西暦和暦表(1900,明治,33,[],[],庚子). 西暦和暦表(1901,明治,34,[],[],辛丑). 西暦和暦表(1902,明治,35,[],[],壬寅). 西暦和暦表(1903,明治,36,[],[],癸卯). 西暦和暦表(1904,明治,37,[],[],甲辰). 西暦和暦表(1905,明治,38,[],[],乙巳). 西暦和暦表(1906,明治,39,[],[],丙午). 西暦和暦表(1907,明治,40,[],[],丁未). 西暦和暦表(1908,明治,41,[],[],戊申). 西暦和暦表(1909,明治,42,[],[],己酉). 西暦和暦表(1910,明治,43,[],[],庚戌). 西暦和暦表(1911,明治,44,[],[],辛亥). 西暦和暦表(1912,明治,45,[],[],辛亥). 西暦和暦表(1912,大正,1,7 / 30,[],壬子). 西暦和暦表(1913,大正,2,[],[],癸丑). 西暦和暦表(1914,大正,3,[],[],甲寅). 西暦和暦表(1915,大正,4,[],[],乙卯). 西暦和暦表(1916,大正,5,[],[],丙辰). 西暦和暦表(1917,大正,6,[],[],丁巳). 西暦和暦表(1918,大正,7,[],[],戊午). 西暦和暦表(1919,大正,8,[],[],己未). 西暦和暦表(1920,大正,9,[],[],庚申). 西暦和暦表(1921,大正,10,[],[],辛酉). 西暦和暦表(1922,大正,11,[],[],壬戌). 西暦和暦表(1923,大正,12,[],[],癸亥). 西暦和暦表(1924,大正,13,[],[],甲子). 西暦和暦表(1925,大正,14,[],[],乙丑). 西暦和暦表(1926,大正,15,[],[],乙丑). 西暦和暦表(1926,昭和,1,12 / 25,[],丙寅). 西暦和暦表(1927,昭和,2,[],[],丁卯). 西暦和暦表(1928,昭和,3,[],[],戊辰). 西暦和暦表(1929,昭和,4,[],[],己巳). 西暦和暦表(1930,昭和,5,[],[],庚午). 西暦和暦表(1931,昭和,6,[],[],辛未). 西暦和暦表(1932,昭和,7,[],[],壬申). 西暦和暦表(1933,昭和,8,[],[],癸酉). 西暦和暦表(1934,昭和,9,[],[],甲戌). 西暦和暦表(1935,昭和,10,[],[],乙亥). 西暦和暦表(1936,昭和,11,[],[],丙子). 西暦和暦表(1937,昭和,12,[],[],丁丑). 西暦和暦表(1938,昭和,13,[],[],戊寅). 西暦和暦表(1939,昭和,14,[],[],己卯). 西暦和暦表(1940,昭和,15,[],[],庚辰). 西暦和暦表(1941,昭和,16,[],[],辛巳). 西暦和暦表(1942,昭和,17,[],[],壬午). 西暦和暦表(1943,昭和,18,[],[],癸未). 西暦和暦表(1944,昭和,19,[],[],甲申). 西暦和暦表(1945,昭和,20,[],[],乙酉). 西暦和暦表(1946,昭和,21,[],[],丙戌). 西暦和暦表(1947,昭和,22,[],[],丁亥). 西暦和暦表(1948,昭和,23,[],[],戊子). 西暦和暦表(1949,昭和,24,[],[],己丑). 西暦和暦表(1950,昭和,25,[],[],庚寅). 西暦和暦表(1951,昭和,26,[],[],辛卯). 西暦和暦表(1952,昭和,27,[],[],壬辰). 西暦和暦表(1953,昭和,28,[],[],癸巳). 西暦和暦表(1954,昭和,29,[],[],甲午). 西暦和暦表(1955,昭和,30,[],[],乙未). 西暦和暦表(1956,昭和,31,[],[],丙申). 西暦和暦表(1957,昭和,32,[],[],丁酉). 西暦和暦表(1958,昭和,33,[],[],戊戌). 西暦和暦表(1959,昭和,34,[],[],己亥). 西暦和暦表(1960,昭和,35,[],[],庚子). 西暦和暦表(1961,昭和,36,[],[],辛丑). 西暦和暦表(1962,昭和,37,[],[],壬寅). 西暦和暦表(1963,昭和,38,[],[],癸卯). 西暦和暦表(1964,昭和,39,[],[],甲辰). 西暦和暦表(1965,昭和,40,[],[],乙巳). 西暦和暦表(1966,昭和,41,[],[],丙午). 西暦和暦表(1967,昭和,42,[],[],丁未). 西暦和暦表(1968,昭和,43,[],[],戊申). 西暦和暦表(1969,昭和,44,[],[],己酉). 西暦和暦表(1970,昭和,45,[],[],庚戌). 西暦和暦表(1971,昭和,46,[],[],辛亥). 西暦和暦表(1972,昭和,47,[],[],壬子). 西暦和暦表(1973,昭和,48,[],[],癸丑). 西暦和暦表(1974,昭和,49,[],[],甲寅). 西暦和暦表(1975,昭和,50,[],[],乙卯). 西暦和暦表(1976,昭和,51,[],[],丙辰). 西暦和暦表(1977,昭和,52,[],[],丁巳). 西暦和暦表(1978,昭和,53,[],[],戊午). 西暦和暦表(1979,昭和,54,[],[],己未). 西暦和暦表(1980,昭和,55,[],[],庚申). 西暦和暦表(1981,昭和,56,[],[],辛酉). 西暦和暦表(1982,昭和,57,[],[],壬戌). 西暦和暦表(1983,昭和,58,[],[],癸亥). 西暦和暦表(1984,昭和,59,[],[],甲子). 西暦和暦表(1985,昭和,60,[],[],乙丑). 西暦和暦表(1986,昭和,61,[],[],丙寅). 西暦和暦表(1987,昭和,62,[],[],丁卯). 西暦和暦表(1988,昭和,63,[],[],戊辰). 西暦和暦表(1989,昭和,64,[],[],戊辰). 西暦和暦表(1989,平成,1,1 / 7,[],己巳). 西暦和暦表(1990,平成,2,[],[],庚午). 西暦和暦表(1991,平成,3,[],[],辛未). 西暦和暦表(1992,平成,4,[],[],壬申). 西暦和暦表(1993,平成,5,[],[],癸酉). 西暦和暦表(1994,平成,6,[],[],甲戌). 西暦和暦表(1995,平成,7,[],[],乙亥). 西暦和暦表(1996,平成,8,[],[],丙子). 西暦和暦表(1997,平成,9,[],[],丁丑). 西暦和暦表(1998,平成,10,[],[],戊寅). 西暦和暦表(1999,平成,11,[],[],己卯). 西暦和暦表(2000,平成,12,[],[],庚辰). 西暦和暦表(2001,平成,13,[],[],辛巳). 西暦和暦表(2002,平成,14,[],[],壬午). 西暦和暦表(2003,平成,15,[],[],癸未). 西暦和暦表(2004,平成,16,[],[],甲申). 西暦和暦表(2005,平成,17,[],[],乙酉). 西暦和暦表(2006,平成,18,[],[],丙戌). 西暦和暦表(2007,平成,19,[],[],丁亥). 西暦和暦表(2008,平成,20,[],[],戊子). 西暦和暦表(2009,平成,21,[],[],己丑). '年漢字表現'(1,['元','年']). '年漢字表現'(2,['二','年']). '年漢字表現'(3,['三','年']). '年漢字表現'(4,['四','年']). '年漢字表現'(5,['五','年']). '年漢字表現'(6,['六','年']). '年漢字表現'(7,['七','年']). '年漢字表現'(8,['八','年']). '年漢字表現'(9,['九','年']). '年漢字表現'(10,['十','年']). '年漢字表現'(11,['十','一','年']). '年漢字表現'(12,['十','二','年']). '年漢字表現'(13,['十','三','年']). '年漢字表現'(14,['十','四','年']). '年漢字表現'(15,['十','五','年']). '年漢字表現'(16,['十','六','年']). '年漢字表現'(17,['十','七','年']). '年漢字表現'(18,['十','八','年']). '年漢字表現'(19,['十','九','年']). '年漢字表現'(20,['二','十','年']). '年漢字表現'(21,['二','十','一','年']). '年漢字表現'(22,['二','十','二','年']). '年漢字表現'(23,['二','十','三','年']). '年漢字表現'(24,['二','十','四','年']). '年漢字表現'(25,['二','十','五','年']). '年漢字表現'(26,['二','十','六','年']). '年漢字表現'(27,['二','十','七','年']). '年漢字表現'(28,['二','十','八','年']). '年漢字表現'(29,['二','十','九','年']). '年漢字表現'(30,['三','十','年']). '年漢字表現'(31,['三','十','一','年']). '年漢字表現'(32,['三','十','二','年']). '年漢字表現'(33,['三','十','三','年']). '年漢字表現'(34,['三','十','四','年']). '年漢字表現'(35,['三','十','五','年']). '年漢字表現'(36,['三','十','六','年']). '年漢字表現'(37,['三','十','七','年']). '年漢字表現'(38,['三','十','八','年']). '年漢字表現'(39,['三','十','九','年']). '年漢字表現'(40,['四','十','年']). '年漢字表現'(41,['四','十','一','年']). '年漢字表現'(42,['四','十','二','年']). '年漢字表現'(43,['四','十','三','年']). '年漢字表現'(44,['四','十','四','年']). '年漢字表現'(45,['四','十','五','年']). '年漢字表現'(46,['四','十','六','年']). '年漢字表現'(47,['四','十','七','年']). '年漢字表現'(48,['四','十','八','年']). '年漢字表現'(49,['四','十','九','年']). '年漢字表現'(50,['五','十','年']). '年漢字表現'(51,['五','十','一','年']). '年漢字表現'(52,['五','十','二','年']). '年漢字表現'(53,['五','十','三','年']). '年漢字表現'(54,['五','十','四','年']). '年漢字表現'(55,['五','十','五','年']). '年漢字表現'(56,['五','十','六','年']). '年漢字表現'(57,['五','十','七','年']). '年漢字表現'(58,['五','十','八','年']). '年漢字表現'(59,['五','十','九','年']). '年漢字表現'(60,['六','十','年']). '年漢字表現'(61,['六','十','一','年']). '年漢字表現'(62,['六','十','二','年']). '年漢字表現'(63,['六','十','三','年']). '年漢字表現'(64,['六','十','四','年']). '年漢字表現'(65,['六','十','五','年']). '年漢字表現'(66,['六','十','六','年']). '年漢字表現'(67,['六','十','七','年']). '年漢字表現'(68,['六','十','八','年']). '年漢字表現'(69,['六','十','九','年']). % これは高名な和歌サイトである千人万首(よよのうたびと)から % 指定した歌人の歌のみを抽出してくるPrologプログラムです。 % 著作権を侵害している可能性がありますが、あくまでPrologによるwwwサイトの % 検索事例として受け止めていただきたい。 % 最初に実行例を示します。 ?- 千人万首表示(皇嘉門院別当). しのびねの袂は色にいでにけり心にも似ぬわが涙かな 思ひ川いはまによどむ水茎をかきながすにも袖は濡れけり うれしきもつらきも同じ涙にて逢ふ夜も袖はなほぞかわかぬ 難波江の葦のかりねの一よゆゑ身をつくしてや恋ひわたるべき かへるさは面影をのみ身にそへて涙にくらす有明の月 雲もなくなぎたる空のあさみどりむなしき色も今ぞしりぬる yes. ?- % *** user: '千人万首表示' / 1 *** '千人万首表示'(_歌人) :- abolish('千人万首リンク情報' / 3), '千人万首リンク情報の登録', '千人万首'(_歌人,X), \+(X = []), ( member(A,X), wr('%t\n\n',[A]), fail ; abolish('千人万首リンク情報' / 3) ), ! . % *** user: '千人万首リンク情報の登録' / 1 *** '千人万首リンク情報の登録'([]) :- ! . '千人万首リンク情報の登録'([<,a,' ',h,r,e,f,=,'"'|R]) :- '千人万首リンク情報の登録_1'(R,L,Y,R2), replace_all(Y,'','',Y2), replace_all(Y2,'','',_歌人), concat_atom(L,A), concat_atom(['/~sg2h-ymst/yamatouta/',A],URL), assertz('千人万首リンク情報'(_歌人,'www.asahi-net.or.jp',URL)), '千人万首リンク情報の登録'(R2), ! . '千人万首リンク情報の登録'([_|R]) :- '千人万首リンク情報の登録'(R) . % *** user: '千人万首リンク情報の登録' / 0 *** '千人万首リンク情報の登録' :- 千人万首リンク情報の登録(X),!. 千人万首リンク情報の登録(L) :- member(A,L), atom_chars(A,AL), 千人万首リンク情報の登録(AL), fail. 千人万首リンク情報の登録(_). % *** user: '千人万首' / 3 *** '千人万首'(Host,File,Y) :- findall(U,('千人万首_member'(U0,X) , (sub_atom(U0,0,16,R0,'

') , sub_atom(U0,16,R0,_,U1) ; sub_atom(U0,0,17,_,'

') , split(U0,[' '],L01) , L01 = [_,U1]) , replace(U1,'

','',U3) , split(U3,[''],L) , L = [U4|_] , replace_all(U4,'','',U5) , replace_all(U5,'','',U6) , replace_all(U6,'','',U7) , replace_all(U7,'','',U8) , replace_all(U8,'','',U9) , replace_all(U9,'','',U10) , replace_all(U10,'','',U11) , replace_all(U11,'','',U12) , replace_all(U12,'','',U13) , replace_all(U13,'','',U14) , replace_all(U14,'','',U)),Y) . % *** user: '千人万首' / 2 *** '千人万首'(_歌人,_歌ならび) :- '千人万首リンク情報'(_歌人,Host,File), '千人万首'(Host,File,_歌ならび), ! . % *** user: '千人万首' / 0 *** '千人万首' :- % *** user: '千人万首_member' / 2 *** '千人万首_member'(A,L) :- '千人万首_member_1'(A,L,R) . '千人万首_member'(A,L) :- '千人万首_member_1'(_,L,R), '千人万首_member'(A,R) . % *** user: '千人万首_member_1' / 3 *** '千人万首_member_1'(A,[A|R],R) :- '副文字列検索'(A,'

'), '副文字列検索'(A,'

') . '千人万首_member_1'(A,[A|R],R) :- '副文字列検索'(A,'

'), '副文字列検索'(A,'

') . '千人万首_member_1'(X,[A|R1],R) :- '副文字列検索'(A,'

'), \+('副文字列検索'(A,'

')), '千人万首_member_2'(X,[A|R1],R) . '千人万首_member_1'(X,[A|R1],R) :- '副文字列検索'(A,'

'), \+('副文字列検索'(A,'

')), '千人万首_member_2'(X,[A|R1],R) . '千人万首_member_1'(X,[A|R1],R) :- \+('副文字列検索'(A,'

')), \+('副文字列検索'(A,'

')), '千人万首_member_1'(X,R1,R) . % *** user: '千人万首_member_2' / 3 *** '千人万首_member_2'(X,[A,B|R1],R1) :- '副文字列検索'(B,'

'), concat_atom([A,B],X) . '千人万首_member_2'(X,[A,B|R1],R) :- \+('副文字列検索'(B,'

')), concat_atom([A,B],C), '千人万首_member_2'(X,[C|R1],R) . %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % *** user: replace_all / 4 *** replace_all('',A,B,'') :- ! . replace_all(String,S1,'',X) :- atom_chars(String,StringL), atom_chars(S1,S1L), replace_31(StringL,S1L,Y), concat_atom(Y,X), ! . replace_all(String,S1,S2,X) :- atom_chars(String,StringL), atom_chars(S1,S1L), atom_chars(S2,S2L), replace_41(StringL,S1L,S2L,Y), concat_atom(Y,X), ! . % *** user: replace_31 / 3 *** replace_31([],_,[]) :- ! . replace_31(L,L1,Y) :- append(L1,R,L), replace_31(R,L1,Y), ! . replace_31([A|R],L1,[A|R2]) :- replace_31(R,L1,R2) . % *** user: replace_41 / 4 *** replace_41([],_,_,[]) :- ! . replace_41(L,L1,L2,R2) :- append(L1,R,L), replace_41(R,L1,L2,R3), append(L2,R3,R2), ! . replace_41([A|R],L1,L2,[A|R2]) :- replace_41(R,L1,L2,R2) . % *** user: '副文字列検索' / 2 *** '副文字列検索'(_文字列,_副文字列) :- replace(_文字列,_副文字列,_副文字列,_), ! . % *** user: replace / 4 *** replace(String,S1,'',X) :- atom_chars(String,StringL), atom_chars(S1,S1L), replace_3(StringL,S1L,Y), concat_atom(Y,X), ! . replace(String,S1,S2,X) :- atom_chars(String,StringL), atom_chars(S1,S1L), atom_chars(S2,S2L), replace_4(StringL,S1L,S2L,Y), concat_atom(Y,X), ! . % *** user: replace_3 / 3 *** replace_3(L,L1,R) :- append(L1,R,L), ! . replace_3([A|R],L1,[A|R2]) :- replace_3(R,L1,R2) . % *** user: replace_4 / 4 *** replace_4(L,L1,L2,R2) :- append(L1,R,L), append(L2,R,R2), ! . replace_4([A|R],L1,L2,[A|R2]) :- replace_4(R,L1,L2,R2) . member(euc,Option_list), shs(S,L1), member(sjis,Option_list), shs(S,L1), member('本文',Option_list), \+(member('本文',Option_list)), L1 = L,!. ! . ! . % *** user: shs / 3 *** shs(Command,[],X) :- shs(Command,X), ! . shs(Command,List,X) :- tmpnam(TMPNAM), open(TMPNAM,write,Output1), wrln(Output1,List), close(Output1), concat_atom(['cat ',TMPNAM],Cat), system(Cat,user_input,Pipe), system(Command,Pipe,Output), findall(Y,(repeat , stream_reads(Output,Y) , (Y = end_of_file , (!) , fail ; true)),X), close(Pipe), close(Output), unlink(TMPNAM), ! . shs(Command,user_input,X) :- ( var(X) ; \+(var(X)), \+(X = pipe(_)) ), system(Command,user_input,Pipe), findall(S,(repeat , stream_reads(Pipe,S) , (S = end_of_file , (!) , fail ; true)),X), close(Pipe), ! . shs(Command,user_input,X) :- \+(var(X)), X = pipe(Pipe), system(Command,user_input,Pipe), ! . shs(Command,Input,Output) :- \+(var(Input)), Input = pipe(Pipe1), \+(var(Output)), Output = pipe(Pipe2), system(Command,Pipe1,Pipe2), close(Pipe1), ! . shs(Command,Input,X) :- \+(var(Input)), Input = pipe(Pipe1), ( var(X) ; \+(var(X)), \+(X = pipe(_)) ), system(Command,Pipe1,Pipe2), close(Pipe1), findall(S,(repeat , stream_reads(Pipe2,S) , (S = end_of_file , (!) , fail ; true)),X), close(Pipe2), ! . shs(Command,Input,X) :- \+(var(X)), X = pipe(Pipe), \+(var(Input)), \+(Input = pipe(_)), open(Input,read,InputStream), system(Command,InputStream,Pipe), close(InputStream), ! . shs(Command,Input,X) :- ( var(X) ; \+(var(X)), \+(X = pipe(_)) ), \+(var(Input)), \+(Input = pipe(_)), open(Input,read,InputStream), system(Command,InputStream,Pipe), close(InputStream), findall(S,(repeat , stream_reads(Pipe,S) , (S = end_of_file , (!) , fail ; true)),X), close(Pipe), ! . % *** user: shs / 2 *** shs(Command,X) :- \+(list(Command)), tmpnam(TMPNAM), open(TMPNAM,write,Output), system(Command,user_input,Output), close(Output), open(TMPNAM,read,Input), findall(S,(repeat , stream_reads(Input,S) , (S = end_of_file , (!) , fail ; true)),L), close(Input), unlink(TMPNAM), X = L, ! . shs(Command_list,X) :- list(Command_list), concat_atom(Command_list,' ',Command), shs(Command,X), ! . % *** user: shs / 1 *** shs(Command) :- \+(struct(Command)), shs(Command,X), lf(X) . shs(_). % *** user: w3c / 2 *** w3c(URL,File) :- atom(File), w3ctimeout(Timeout), concat_atom(['w3c -timeout ',Timeout,' -n "',URL,'"'],W3c), shs(W3c,X), open(File,write,Output), ( member(A,X), write_formatted(Output,'%t\n',[A]), fail ; close(Output) ), ! . w3c(URL,X) :- \+(atom(X)), w3ctimeout(Timeout), concat(['w3c -timeout ',Timeout,' -n "',URL,'"'],W3c), shs(W3c,X), ! . % *** user: w3c / 1 *** w3c(URL) :- concat_atom(['w3c -n "',URL,'"'],W3c), shs(W3c,X), ( member(A,X), wr('%t\n',[A]), fail ; true ), ! . % *** user: w3ctimeout / 1 *** w3ctimeout(60). # [1] 授業単元:ソフトウェア演習C # [2] 問題文: # 文書ないのすべての単語とその単語の頻度をメンバとして持つ構造体を定義し、 # この構造体へのポインタをノードの値として持つ二分木のノードを定義せよ # # 次に、任意のノードはその左の部分木にはそのノードの単語より辞書順で小さい単語の みがあり、その右の部分木にはより大きい単語のみがあるように保持される。 # 新たに単語がすでに木にあるかどうかを探すには、ルート(根元)から出発してそのノー ドに格納されている単語と新しい単語を比較する。 # 二つが一致したら、それで良い。 # 新しい単語が木の単語より小さいときは、探索は左の子供に対して続けられ、そうでな ければ右の子供が調べられる。 # 求める方向に子供がないときは、新しい単語は木の中にはないと言うことであり、また 実際にはその子供のないところがそれを置く場所である。 # このプロセスは再帰的である必要があり、単語の挿入を行うadd_word()関数を定義せよ 。この関数は再帰的に呼ばれて、左または右の部分木に振り分けられる。 # 単語は木の中の単語と一致する(その場合カウント(頻度)がインクリメントされる)か、 あるいはノードを作成し、木に加えなければならないことを示すヌル・ポインタと出会う 。 # 新たにノードが生成されると、この関数ではそのノードへのポインタが返され、親ノー ドに埋め込まれる。 # この関数を利用し、以下のテキストをコマンド実行時の引数として与えられたファイル を入力して二分探索木を生成し、単語と頻度のリストを表示するプログラムを作成せよ。 # # 文章: ファイル名:test.txt # University was founded in April 1998 at Iwate, # which is situated in the northeastern part of Japan. University consists of # four faculties Software and Information Science, Nursing, Social Welfare, # and policy Studies, and additionally other educational supporut centers. t191 :- get_chars('test.txt',Chars), chars_split(Chars,[' ',',','.'],WordList), 木作成(WordList). t191_2 :- 二分木から値と頻度を取り出す(1,_頻度付きの値ならび), member([_語,_頻度],_頻度付きの値ならび), write_formatted('語彙=%t,頻度=%t\n',[_語,_頻度]), fail; true. 木作成(_ならび) :- abolish(節/5), 節作成(_ならび,1,1,_). 木作成([],_,_,_). 木作成([_値|R],_節,_開始節番号,_次の節番号) :- to_lower(_値,_小文字化した値), 節作成(_小文字化した値,_節,_開始節番号,_受取節番号), 木作成(R,_節,_受取節番号,_次の節番号). 節作成(_値,_節,_受取節番号,_次の節番号) :- not(節(_節,_,_,_,_)), _左 is _受取節番号+1, _右 is _受取節番号+2, _次の節番号 is _受取節番号+3, assertz(節(_節,_左,_右,_値,1)),!. 節作成(_値,_節,_受取節番号,_次の節番号) :- 節(_節,_左,_右,_値2,_), _値 @< _値2, 節作成(_値,_左,_受取節番号,_次の節番号). 節作成(_値,_節,_受取節番号,_次の節番号) :- 節(_節,_左,_右,_値2,_), _値 @> _値2 , 節作成(_値,_右,_受取節番号,_次の節番号). 節作成(_値,_節,_受取節番号,_次の節番号) :- 節(_節,_左,_右,_値2,_頻度), _値 = _値2 , _頻度2 is _頻度 + 1, retract(節(_節,_左,_右,_値2,_頻度)), assertz(節(_節,_左,_右,_値2,_頻度2)). 二分木から値と頻度を取り出す(_節,_頻度付きの値ならび) :- findall([_値,頻度],二分木から値と頻度を取り出す(_節,_,_値,_,_頻度),_頻度付きの値ならび). 二分木から値と頻度を取り出す(_節,_値1,_値,_頻度1,_頻度) :- 節(_節,_左,_,_値2,_,_頻度2), 二分木から値と頻度を取り出す(_左,_値2,_値,_頻度2,_頻度). 二分木から値と頻度を取り出す(_節,_値1,_値,_頻度1,_頻度) :- 節(_節,_,_右,_値2,_頻度2), 二分木から値と頻度を取り出す(_右,_,_値,_,_頻度). 二分木から値と頻度を取り出す(_節,_値1,_値,_頻度1,_頻度) :- not(var(_値1)), not(var(_頻度1)), _値1=_値, _頻度1=_頻度. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_chars(File,Chars) :- open(File,read,Input), findall(X,(repeat,get_char(Input,X),(X=end_of_file,!,fail;true)),Chars), close(Input). concat_atom([A],Sep,[A]) :- !. concat_atom([A|R],Sep,X) :- concat_atom(R,Sep,Y), atom_concat(A,Sep,Y1), atom_concat(Y1,Y,X). chars_split(L,SeparatesL,WordsList) :- split_1(L,SeparatesL,WordsList),!. split_1([],SeparatersL,[]). split_1(L1,SeparatersL,[A|R]) :- not(L1=[]), split_2(L1,SeparatersL,L2,R2), not(L2=[]), atom_chars(A,L2), split_1(R2,SeparatersL,R). split_1(L1,SeparatersL,X) :- not(L1=[]), split_2(L1,SeparatersL,L2,R2), L2=[], split_1(R2,SeparatersL,X). split_2([],_,[],[]). split_2(L1,SeparatersL,[],R) :- member(L2,SeparatersL), append(L2,R,L1). split_2([A|R1],SeparatersL,[A|R2],R) :- not((member(L2,SeparatersL),append(L2,_,[A|R1]))), split_2(R1,SeparatersL,R2,R). 区切り語ならびの変形(_区切り語ならび,_降順の区切り文字ならびのならび) :- sort(_区切り語ならび,_昇順の区切り語ならび), reverse(_昇順の区切り語ならび,_降順の区切り語ならび), atomList2charsList(_降順の区切り語ならび,_降順の区切り文字ならびのならび). atomList2charsList([],[]) :- !. atomList2charsList([A|R1],[L|R2]) :- atom_chars(A,L), atomList2charsList(R1,R2). # [1]c++ # [2]2次元配列n[10][10]のすべての要素に1を代入してから、その内容を表示しなさい。 # また、対角要素だけを1を代入し、ほかはすべて0を代入してから、表示しなさい。 # ただし、対角要素は左上隅から右下隅への対角線上の要素とする。次の図は実行例であ る。 # --- (2)配列nの内容 --- # # 100000000 # 010000000 # 001000000 # 000100000 # 000010000 # 000001000 # 000000100 # 000000010 # 000000001 t284_1(LX) :- findall(L,(for(1,M,10),findall(1,for(1,N,10),L)),LX), member(U,LX), concat_atom(U,A), write_formatted('%t\n',[A]), fail; true. t284_2(LX) :- findall(L,(for(1,M,10),findall(B,(for(1,N,10),       (N=M,B=1;not(N=M),B=0))),LX), member(U,LX), concat_atom(U,A), write_formatted('%t\n',[A]), fail; true. /* for/3を使用しない定義 t284_2(LX) :- length(L,10), findall(L,ひとつだけ壱で他は全部零(L),LX), member(U,LX), concat_atom(U,A), write_formatted('%t\n',[A]), fail; true. ひとつだけ壱で他は全部零(L) :- append(L1,[1|R],L), 零ならび(L1), 零ならび(R). 零ならび([]). 零ならび([0|R]) :- 零ならび(R). */ # [1] 授業単元: C # [2] 問題文(含コード&リンク): # キーボードから入力された1以上の整数nについて、次の例に示すように行番号と*を表示するプログラムを作成せよ # 。また、0や負の数が入力された場合はプログラムが終了するようにせよ。 # 表示結果の例 # 正の整数:6 # 1****** # 2 ***** # 3 **** # 4  *** # 5 ** # 6 * t293(N) :- length(L,N), append(L1,L2,L), not(L2=[]), all(L1,' '), all(L2,'*'), length(L1,N), N2 is N + 1, concat_atom(L,S), write_formatted('%t %t\n',[N2,S]), fail; true. all([],_). all([A|R],A) :- all(R,A). # [1] 授業単元:プログラミング演習 # 課題1 スペースの挿入 # # 最大50文字のスペースを含まない文字列をターミナルから読み込み,各文字間にスペースを挿入したものを出力するプログラムを # 作成しなさい. # 課題実行においては以下の点に注意すること. # ・プログラム名は「space」とすること. # ・文字列の先頭と最後にはスペースを入れない. # ・ポインタを用いること. # # 実行結果 # ./space # abc # a b c space(_文字列,_スペースを挿入された文字列) :- atom_chars(_文字列,Chars), concat_atom(Chars,' ',_スペースを挿入された文字列). concat_atom([],_,'') :- !. concat_atom([A],_,A) :- !. concat_atom([A|R],S,X) :- concat_atom(R,S,Y), atom_concat(A,S,B), atom_concat(B,Y,X). 課題2 Inner Product (内積) # Write a program (innpro) to compute an inner product. # First, decide a degree of a vector, next input two vectors of # degree n, A and B, then the inner product is output. # The maximum degree of the vectors is 20. # Remarks. # ・The name of the program must be innpro. # ・The inner product A=(a1,a2, ... ,an) and B=(b1,b2,...,bn) is a1*b1+a2*b2+...+an*bn. # # 実行結果 # ./innpro # Degree: 5 # Data of A: 1 2 3 4 5 # Data of B: 2 3 4 5 6 # Inner Product: 70 innpro([],[],0) :- !. innpro([A|R1],[B|R2],X) :- innpro(R1,R2,Y), X is A * B + Y. # 簡単なデータベース機能を持つプログラムを作成しなさい.対象となるデータは自分で 考えてください. #   (住所録,商品の在庫,図書,ワールドカップの勝敗....) #  以下の要件を示します. # # 1. ファイルからデータを読み込む機能をつけること. # 2. データは4つ以上の項目を保持させること. #  (住所録では、「名前」「住所」「郵便番号」「電話番号」等で4項目以上) # 3. 並び替えの機能をつけること.また並び替える項目が指定できること. # 4. 各項目についてデータの検索を行う機能をつけること.また,検索条件を組み合わ せることができること. #  (住所録なら,「郵便番号」が 399 で始まって,かつ,「電話番号」が 026 で始ま る 等) # 5. データは半角英数字(英語やローマ字)で扱ってよい # 6. データの追加ができること. # 7. データの削除ができること.削除は上記の検索と組み合わせることで,ある条件に 合致したデータを削除できること. # 8. 追加・削除した結果をファイルに保存できること. 鍵項目位置(書籍名,prolog関連書籍(_書籍名,_,_,_,_,_,_,_),_書籍名). 鍵項目位置(副書籍名,prolog関連書籍(_,_副書籍名,_,_,_,_,_,_),_副書籍名). 鍵項目位置(著者名,prolog関連書籍(_,_,_著者名,_,_,_,_,_),_著者名). 鍵項目位置(翻訳者名,prolog関連書籍(_,_,_,_翻訳者名,_,_,_,_),_翻訳者名). 鍵項目位置(発行年月日,prolog関連書籍(_,_,_,_,_発行年月日,_,_,_),_発行年月日). 鍵項目位置(出版社名,prolog関連書籍(_,_,_,_,_,_出版社名,_),_出版社名), 鍵項目位置(書籍コード,prolog関連書籍(_,_,_,_,_,_,_書籍コード),_書籍コード). 項目名を指定しての参照(_述語名/_引数の数,_項目名ならび,_値ならび) :- length(L,_引数の数), P =.. [_述語名|L], findall(_項目値,( call(P), member(_項目名,_項目名ならび), 鍵項目位置(_項目名,P,_項目値)),_値ならび). 項目名を指定して節構造ならびの参照(_項目名ならび,_節構造ならび,_値ならび) :- member([_頭部,_本体],_節構造ならび), findall(_項目値,( call(_本体), /* このアサーションを実行するかが大問題 */ member(_項目名,_項目名ならび), 鍵項目位置(_項目名,_頭部,_項目値)),_値ならび). データベースへの登録(_ファイル) :- reconsult(_ファイル). データベースへの追加(_項) :- assertz(_項). データベースからの削除(_項) :- retract(_項). データベースの保存(_述語名/_引数の数,_保存ファイル名) :- tell(_保存ファイル名), listing(_述語名/_引数の数), told. 節定義の並べ替え(_述語名/_引数の数,_鍵項目,上昇順) :- 上昇順節構造(_述語名/_引数の数,_鍵項目,_上昇順に整列された節構造ならび), abolish(_述語名/引数の数), ( member([H,B],_上昇順に整列された節構造ならび), assertz((H :- B)), fail; true ). 節定義の並べ替え(_述語名/_引数の数,_鍵項目,下降順) :- 下降順節構造(_述語名/_引数の数,_鍵項目,_上昇順に整列された節構造ならび), abolish(_述語名/引数の数), ( member([H,B],_上昇順に整列された節構造ならび), assertz((H :- B)), fail; true ). 上昇順節構造(_述語名/_引数の数, _鍵項目, _上昇順に整列された節構造ならび) :- 節構造ならびの取得(_述語名/_引数の数,_節構造ならび), ならびの先頭に鍵項目を付加(_鍵項目ならび, _節構造ならび, _鍵付加き節構造ならび), 上昇順整列(_鍵付加き節構造ならび, _上昇順に整列された鍵付き節構造ならび), ならびの先頭の鍵項目を除去(_上昇順に整列された鍵付き節構造ならび, _上昇順に整列された節構造ならび),!. 下降順節構造(_述語名/_引数の数,_鍵項目,_下降順に整列された節構造ならび) :- 節構造ならびの取得(_述語名/_引数の数,_節構造ならび), ならびの先頭に鍵項目を付加(_鍵項目ならび, _節構造ならび, _鍵付加き節構造ならび), 下降順整列(_鍵付加き節構造ならび, _下降順に整列された鍵付き節構造ならび), ならびの先頭の鍵項目を除去(_下降順に整列された鍵付き節構造ならび, _下降順に整列された節構造ならび),!. 節構造ならびの取得(_述語名/_引数の数,_節構造ならび) :- length(L,_引数の数), H =.. [_述語名|L], findall([H,B],clause(H,B),_節構造ならび),!. ならびの先頭に鍵項目を付加(_,[],[]) :- !. ならびの先頭に鍵項目を付加(_鍵項目ならび, [[_頭部,_本体]|R1], [_鍵付き節構造|R2]) :- findall(_値,(member(_鍵,_鍵項目ならび),鍵項目位置(_鍵,_頭部,_値)),L), append(L,[_頭部,_本体],_鍵付き節構造), ならびの先頭の鍵項目を除去(_鍵項目ならび,_鍵付き節構造ならび,_節構造ならび) :- length(_鍵項目ならび,_除去する項数), ならびの先頭N個の鍵項目を除去(N,_鍵付き節構造ならび,_節構造ならび). ならびの先頭N個の鍵項目を除去(N,[L1|R1],[L2|R2]) :- append(L0,L2,L1), length(L0,N), ならびの先頭N個の鍵項目を除去(N,R1,R2). 上昇順に整列(L1,L2) :- 整列(上昇,L1,L2). 下降順に整列(L1,L2) :- 整列(下降,L1,L2). 整列(_,[],[]) :- !. 整列(_上昇または下降,[X|Xs],Ys) :- 配分(_上昇または下降,Xs,X,Littles,Gigs), 整列(_上昇または下降,Littles,Ls), 整列(_上昇または下降,Bigs,Bs), append(Ls,[X|Bs],Ys). 配分(_,[],Y,[],[]) :- !. 配分(上昇,[X|Xs],Y,[X|Ls],Bs) :- X @=< Y,!,配分(上昇,Xs,Y,Ls,Bs). 配分(上昇,[X|Xs],Y,Ls,[X|Bs]) :- X @> Y,!,配分(上昇,Xs,Y,Ls,Bs). 配分(下降,[X|Xs],Y,[X|Ls],Bs) :- X @>= Y,!,配分(下降,Xs,Y,Ls,Bs). 配分(下降,[X|Xs],Y,Ls,[X|Bs]) :- X @< Y,!,配分(下降,Xs,Y,Ls,Bs). 鍵項目位置定義(述語名,_項目名ならび) :- length(_項目名ならび,Len), for(1,N,Len), list_nth(N,_項目名ならび,_項目名), 変数文字列の生成(Len,N,項目名,_項目変数文字列,_変数文字列), concat_atom(['鍵項目位置(',_項目名,述語名,'(',_変数文字列,')', _項目変数文字列,')'],S), parse_atom(S,1,P,V), assertz_with_names(P,V), N = Len,!. 変数文字列の生成(N,Len,項目名,_項目変数文字列,_変数文字列) :- M is N - 1, length(L1,M), all(L1,'_'), M2 is Len - N, length(L2,M2), all(L2,'_'), atom_concat('_',項目名,_項目変数文字列), append(L1,[_項目変数文字列|L2],L), concat_atom(L,',',_変数文字列). all([],_). all([A|R],V) :- all(R,V). base64g(Atom,X) :- replace_all(Atom,' ','',Atom2), base64(X,Atom2) . base64s(Atom,X) :- \+(var(Atom)), name2(Atom,L1), base64_2(L1,Y), concat_atom(Y,X) . base64(Atom,X) :- \+(var(Atom)), atom_codes(Atom,L1), kjtoeuc(CodeList,L1), base64_2(CodeList,Y), concat_atom(Y,X),!. base64(X,Atom) :- var(X), atom_chars(Atom,List), base64_1(Y,List), concat_atom(Y,Y2), atom_codes(Y2,Codes), kjtoeuc(Codes,Y3), atom_codes(X,Y3),!. base64_1([],[]) :- !. base64_1(X,[A,B,C,=]) :- base64_table(A1,A), base64_table(B1,B), base64_table(C1,C), append(A1,B1,L1), append(L1,C1,L), base64_a2b(Y,L), base64_1(Z,R), append(Y,Z,X). base64_1(X,[A,B,=,=]) :- base64_table(A1,A), base64_table(B1,B), append(A1,B1,L), base64_a2b(Y,L), base64_1(Z,R), append(Y,Z,X). base64_1(X,[A,B,C,D|R]) :- base64_table(A1,A), base64_table(B1,B), base64_table(C1,C), base64_table(D1,D), append(A1,B1,L1), append(L1,C1,L2), append(L2,D1,L), base64_a2b(Y,L), base64_1(Z,R), append(Y,Z,X). base64_table([0,0,0,0,0,0],'A'). base64_table([0,0,0,0,0,1],'B'). base64_table([0,0,0,0,1,0],'C'). base64_table([0,0,0,0,1,1],'D'). base64_table([0,0,0,1,0,0],'E'). base64_table([0,0,0,1,0,1],'F'). base64_table([0,0,0,1,1,0],'G'). base64_table([0,0,0,1,1,1],'H'). base64_table([0,0,1,0,0,0],'I'). base64_table([0,0,1,0,0,1],'J'). base64_table([0,0,1,0,1,0],'K'). base64_table([0,0,1,0,1,1],'L'). base64_table([0,0,1,1,0,0],'M'). base64_table([0,0,1,1,0,1],'N'). base64_table([0,0,1,1,1,0],'O'). base64_table([0,0,1,1,1,1],'P'). base64_table([0,1,0,0,0,0],'Q'). base64_table([0,1,0,0,0,1],'R'). base64_table([0,1,0,0,1,0],'S'). base64_table([0,1,0,0,1,1],'T'). base64_table([0,1,0,1,0,0],'U'). base64_table([0,1,0,1,0,1],'V'). base64_table([0,1,0,1,1,0],'W'). base64_table([0,1,0,1,1,1],'X'). base64_table([0,1,1,0,0,0],'Y'). base64_table([0,1,1,0,0,1],'Z'). base64_table([0,1,1,0,1,0],a). base64_table([0,1,1,0,1,1],b). base64_table([0,1,1,1,0,0],c). base64_table([0,1,1,1,0,1],d). base64_table([0,1,1,1,1,0],e). base64_table([0,1,1,1,1,1],f). base64_table([1,0,0,0,0,0],g). base64_table([1,0,0,0,0,1],h). base64_table([1,0,0,0,1,0],i). base64_table([1,0,0,0,1,1],j). base64_table([1,0,0,1,0,0],k). base64_table([1,0,0,1,0,1],l). base64_table([1,0,0,1,1,0],m). base64_table([1,0,0,1,1,1],n). base64_table([1,0,1,0,0,0],o). base64_table([1,0,1,0,0,1],p). base64_table([1,0,1,0,1,0],q). base64_table([1,0,1,0,1,1],r). base64_table([1,0,1,1,0,0],s). base64_table([1,0,1,1,0,1],t). base64_table([1,0,1,1,1,0],u). base64_table([1,0,1,1,1,1],v). base64_table([1,1,0,0,0,0],w). base64_table([1,1,0,0,0,1],x). base64_table([1,1,0,0,1,0],y). base64_table([1,1,0,0,1,1],z). base64_table([1,1,0,1,0,0],'0'). base64_table([1,1,0,1,0,1],'1'). base64_table([1,1,0,1,1,0],'2'). base64_table([1,1,0,1,1,1],'3'). base64_table([1,1,1,0,0,0],'4'). base64_table([1,1,1,0,0,1],'5'). base64_table([1,1,1,0,1,0],'6'). base64_table([1,1,1,0,1,1],'7'). base64_table([1,1,1,1,0,0],'8'). base64_table([1,1,1,1,0,1],'9'). base64_table([1,1,1,1,1,0],+). base64_table([1,1,1,1,1,1],/). base64_table([A,B,C,D],X) :- base64_table([A,B,C,D,0,0],X). base64_table([A,B],X) :- base64_table([A,B,0,0,0,0],X). base64_a2b([],[]). base64_a2b([Atom|R],[A,B,C,D,E,F,G,H|R2]) :- atob(Atom,[A,B,C,D,E,F,G,H]), base64_a2b(R,R2). base64_2([],[]) :- !. base64_2([A,B,C|R],X) :- base64_i2b([A,B,C],L), base64_3(L,Z), base64_2(R,R2), append(Z,R2,X),!. base64_2([A,B],X) :- base64_i2b([A,B],L), base64_3(L,Z), append(Z,[=],X),!. base64_2([Y],X) :- base64_i2b([Y],L), base64_3(L,Z), append(Z,[=,=],X),!. base64_3([A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X],[Z1,Z2,Z3,Z4]) :- base64_table([A,B,C,D,E,F],Z1), base64_table([G,H,I,J,K,L],Z2), base64_table([M,N,O,P,Q,R],Z3), base64_table([S,T,U,V,W,X],Z4),!. base64_3([A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P],[Z1,Z2,Z3]) :- base64_table([A,B,C,D,E,F],Z1), base64_table([G,H,I,J,K,L],Z2), base64_table([M,N,O,P],Z3),!. base64_3([A,B,C,D,E,F,G,H],[Z1,Z2]) :- base64_table([A,B,C,D,E,F],Z1), base64_table([G,H],Z2). base64_i2b([],[]) :- !. base64_i2b([X|R],[1,B,C,D,E,F,G,H|R2]) :- var(X), itob(X,[1,B,C,D,E,F,G,H]), base64_i2b(R,R2),!. base64_i2b([X|R],[0,B,C,D,E,F,G,H|R2]) :- var(X), itob(U,[0,B,C,D,E,F,G,H]), X is U - 128, base64_i2b(R,R2),!. base64_i2b([Code|R],[A,B,C,D,E,F,G,H|R2]) :- itob(Code,[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,A,B,C,D,E,F,G,H]), base64_i2b(R,R2) . 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). itob(N,L) :- itob(N,[],L1), length(L1,Len), Len2 is 8 - Len, length(L2,Len2), all(L2,0), append(L2,L1,L). itob(0,X,X) :- !. itob(N,Y,X) :- M is N mod 2, N2 is N // 2, itob(N2,[M|Y],X). % *** user: 'URLの文字列をデコードする' / 2 *** URLの文字列をデコードする(_エンコードされたURL,_デコードされたURL) :- var(_デコードされたURL), atom(_エンコードされたURL), decompcons(_エンコードされたURL,L), replace_query_1(L,L2), concat_atom(L2,A), atom_to_term(A,_デコードされたURL,_), ! . 'URLのアンカー部分を取得する'(URL,_アンカー部分) :- split(URL,['#'],[_|R]), concat_atom(R,_アンカー部分). 'URLのファイル名を取得する'(URL,_ファイル名) :- atom_chars(URL,Chars), append(L1,['://'|L2],Chars), append(_,['/'|L3],L2), concat_atom(L2,_ファイル名). 'URLのホスト名を取得する'(URL,_ホスト名) :- atom_chars(URL,Chars), append(L1,['://'|L2],Chars), append(L3,['/'|_],L2), 'URLのホスト名を取得するの二'(L3,_ホスト名),!. 'URLのホスト名を取得するの二'(L3,_ホスト名) :- append(L4,[':'|_],L3), concat_atom(L4,_ホスト名),!. 'URLのホスト名を取得するの二'(L3,_ホスト名) :- concat_atom(L3,_ホスト名),!. 'URLのポート番号を取得する'(URL,_ポート番号) :- atom_chars(URL,Chars), append(L1,['://'|L2],Chars), append(L3,['/'|_],L2), append(_,[':'|L4],L3), concat_atom(L4,_ポート番号). 'URLのクエリー情報を取得する'(URL,_クエリー情報) :- split(URL,['?'],[_|L]), concat_atom(L,_クエリー情報). 'URLのユーザー情報を取得する'(URL,_ユーザー情報) :- atom_chars(URL,Chars), append(L1,['://'|L2],Chars), append(L3,['/'|_],L2), append(L4,['@'|_],L3), concat_atom(L4,_ユーザー情報). # [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 週計表(_起点日付,_起点曜日,_終点日付,_終点曜日) :- write('種類 単価'), 曜日見出し文字列(_起点日付,_起点曜日,_終点日付,_終点曜日,_曜日文字列), write_formatted('%t 数量合計 金額合計\n',[_曜日文字列]), 週計表商品表示順(_商品名), 商品別数量合計(_商品名,_起点日付,_終点日付,_数量合計), not(_数量合計 = 0), write_formatted('%10s ',[_商品名]), 商品別金額合計(_商品名,_起点日付,_終点日付,金額合計), _平均単価 is truncate(round(_金額合計 / _数量合計)), write_formatted('%4d ',[_平均単価]), 商品別行表示(_商品名,_起点日付,_起点曜日,_終点日付,_終点曜日), write_formatted('%6d %6d\n',[_数量合計,_金額合計]), fail; true. 商品別行表示(_商品名,_日付,_曜日,_日付,_曜日) :- !. 商品別行表示(_商品名,_日付,_曜日,_終点日付,_終点曜日) :- 日計売上(_日付,_商品名,_数量), write_formatted('%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). # 【質問テンプレ】 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): 二次元配列を使って以下のファイルを読み込み、 # 同じように表示しなさい。 #  【test.dat】 #   ** ** ** #   ** ** ** #   ** ** ** t399 :- 二次元構造の読み込み('test.dat',_二次元構造), member(L,_二次元構造), concat_atom(L,' ',S), write_formatted('%t\n',[S]), fail; true. 二次元構造の読み込み(File,_二次元構造) :- open(File,read,Input), findall(L,(repeat,get_line(Input,X),(X=end_of_file,!,fail; split(X,[' '],L))),_二次元構造), close(Input),!. # [1] 授業単元: C言語プログラミング演習 # [2] 問題文(含コード&リンク): プログラムを実行すると # 行列1: # 1,2,3 # 4,5,6 # 7,8,9 # 行列2: # 3,4,5 # 6,7,8 # 9,10,11 # と表示する。最後に行列1と行列2の積を計算し、以下のように表示 # するプログラム。 # [行列1と行列2の積は # ?,?,? # ?,?,? # ?,?,?] t432 :- _行列1 = [[1,2,3],[4,5,6],[7,8,9]], _行列2 = [[3,4,5],[6,7,8],[9,10,11]], write('行列1:\n'),行列表示(_行列1), write('行列2:\n'),行列表示(_行列2), 行列の積(_行列1,_行列2,_行列3), write('行列1と行列2の積は\n'),行列表示(_行列3). 行列表示([]). 行列表示([_行|R]) :- concat_atom(_行,',',[_表示文字列]),write_formatted('%t\n',[_表示文字列]),行列表示(R). 行列の積(L1,L2,X) :- 行列の転置(L2,L3),行列の積の一(L1,L3,X). 行列の積の一([],_,[]) :- !. 行列の積の一([A|R1],L,[S1|R3]) :- 行列の積の二(A,L,S1),行列の積の一(R1,L,R3). 行列の積の二(_,[],[]) :- !. 行列の積の二(A,[B|R2],[C|R3]) :- 行列の積の三(A,B,C),行列の積の二(A,R2,R3). 行列の積の三([],[],0) :- !. 行列の積の三([A|R1],[B|R2],S) :- S1 is A * B,行列の積の三(R1,R2,S2),S is S1 + S2 . 行列の転置([],[],[]) :- !. 行列の転置([[A|R]|R1],[A|R2],[R|R3]) :- 行列の転置(R1,R2,R3) . 行列の転置([[]|_],[]) :- !. 行列の転置(L,[B|R1]) :- 行列の転置(L,B,R2),行列の転置(R2,R1),!. # [1] 授業単元:プログラミング入門 # [2] 問題文(含コード&リンク): # if文を使って、月数に応じてコメントを表示するプログラム(1月ならばwinter、 # 3月ならspringといった具合に)を作る。 # 月は1月\uff5e12月までなので、13月以上の数値を打ち込んだ場合はerrorと表示させること。 t436 :- write_formatted('何月ですか : '), get_line(Line), atom_to_term(Line,N,_), 月情報表示(N). 月情報表示(N) :- N >= 1, N =< 12, 月漢字表現(N,L), concat_atom(L,_漢字月), 新暦・旧暦(_漢字月,_旧暦月名), 新暦・旧暦季節感の相違(_漢字月,_季節感コメント), 誕生石(_漢字月,_誕生石ならび), concat_atom(_誕生石ならび,','_誕生石表示), 極めて個人的な雑感(_漢字月,_極めて個人的な雑感,_前にちょっとだけ,_後にちょっとだけ), write_formatted('%tの情報です。\n',[_漢字月]), write_formatted('旧暦では%tといいました。\n',[_旧暦月名]), write_formatted('%t\n',[_季節感コメント]), write_formatted('誕生石は%tです。\n',[_誕生石表示]), _前にちょっとだけ, write_formatted('%t\n',[_極めて個人的な雑感]), _後にちょっとだけ,!. 月情報表示(N) :- write('error: 入力された数値は月を示すものではありません\n'). 新暦・旧暦(一月,睦月). 新暦・旧暦(二月,如月). 新暦・旧暦(三月,弥生). 新暦・旧暦(四月,卯月). 新暦・旧暦(五月,皐月). 新暦・旧暦(六月,水無月). 新暦・旧暦(七月,文月). 新暦・旧暦(八月,葉月). 新暦・旧暦(九月,長月). 新暦・旧暦(十月,神無月). 新暦・旧暦(十一月,霜月). 新暦・旧暦(十二月,師走). 新暦・旧暦季節感の相違(_月,_季節感コメント) :- 新暦・旧暦季節感(_月,X,X), concat_atom([X,です。新暦・旧暦に季節感の相違はありません],_季節感コメント),!. 新暦・旧暦季節感の相違(_月,_季節感コメント) :- 新暦・旧暦季節感(_月,_新暦季節感,_旧暦季節感), not(_新暦季節感==_旧暦季節感), concat_atom([新暦の季節感では,_新暦季節感,てすが旧暦では,_旧暦季節感,とされました],_季節感コメント). 新暦・旧暦季節感(一月,冬,春). 新暦・旧暦季節感(二月,冬,春). 新暦・旧暦季節感(三月,春,春). 新暦・旧暦季節感(四月,春,夏). 新暦・旧暦季節感(五月,春,夏). 新暦・旧暦季節感(六月,夏,夏). 新暦・旧暦季節感(七月,夏,秋). 新暦・旧暦季節感(八月,夏,秋). 新暦・旧暦季節感(九月,秋,秋). 新暦・旧暦季節感(十月,秋,冬). 新暦・旧暦季節感(十一月,秋,冬). 新暦・旧暦季節感(十二月,冬,冬). 誕生石(一月,[ガーネット]). 誕生石(二月,[アメシスト]). 誕生石(三月,[アクアマリン,コーラル,ブラッドストーン]). 誕生石(四月,[ダイヤモンド,クォーツ]). 誕生石(五月,[エメラルド,ジェイド]). 誕生石(六月,[パール,ムーンストーン]). 誕生石(七月,[ルビー,カーネリアン]). 誕生石(八月,[ペリドット,サードニックス]). 誕生石(九月,[サファイア,アイオライト]). 誕生石(十月,[オパール,トルマリン]). 誕生石(十一月,[トパーズ,シトリン]). 誕生石(十二月,[ターコイズ,ラピスラズリ,ジルコニア,タンザナイト]). 月漢字表現(1,[一,月]). 月漢字表現(2,[二,月]). 月漢字表現(3,[三,月]). 月漢字表現(4,[四,月]). 月漢字表現(5,[五,月]). 月漢字表現(6,[六,月]). 月漢字表現(7,[七,月]). 月漢字表現(8,[八,月]). 月漢字表現(9,[九,月]). 月漢字表現(10,[十,月]). 月漢字表現(11,[十,一,月]). 月漢字表現(12,[十,二,月]). 極めて個人的な雑感(一月,私の誕生月ですね。私が生まれた二時間後に法隆寺の金堂が焼失しました,true,true). 極めて個人的な雑感(二月,閏年のルールを確認して置きましょう,true,listing(うるう年)). 極めて個人的な雑感(四月,残酷な月です,true,true). 極めて個人的な雑感(五月,三年前の連休に笹が峰牧場に行きました。まだ1mも雪が残っていた,true,true). 極めて個人的な雑感(六月,私は爬虫類の生まれ変わりらしくこの月の前半のじめじめ感は大好き,true,true). 極めて個人的な雑感(九月,伊勢湾台風の晩は東京の風も尋常ではなかった。浴風園から200m田圃を越してくる風で家が揺れて何度も何度も目を覚ましました,true,true). 極めて個人的な雑感(十月,消えわびぬうつろふ人の秋の色に身を木枯らしの森の下露とはこの頃の季節感なのだろうか,true,true). 極めて個人的な雑感(_,この月の雑感はちょっと保留,true,true). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4),fail. # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): # 主語、目的語、述部が入ったデータファイルを読み込み、それらをランダムに # 組み合わせて生成した短文を20個ファイルに出力するプログラムの作成。 # 短文の構文は必ず、「(主語)は、(目的語)(述部)。」となるようにする。 # # 出力例:俺は、カレーが大好きだ。 # # データファイルは以下を使用すること。 # 主語: 俺 私 あなた 彼 彼女 先生 犬のポチ 猫のタマ ライオン # その人 政治家 ネズミ  の12個 # 目的語: カレー ご飯 肉 授業 男 女 すごいもの アレ アンパン # お金  の10個 # 述部: が大好きだ が大嫌いだ を作った をなくした が欲しい # に全力を尽くす を新しいものに交換した ?なにそれ美味いの? # について深く考えた を捨てた に塩をふりかけた の11個 t440 :- get_lines('t440_1.txt',Lines), 構造定義(Lines), findall(_語ならび,表示文(_語ならび,[]),_語ならび集), '20文をランダムに選択して表示'(_語ならび集). 表示文(_語ならび,R) :- 主部(_語ならび,R1),読点(R1,R2),目的語(R2,R3),述部(R3,R4),句点(R4,R). 主部(L,R) :- 主語(L,R1),後置詞(R1,R). 後置詞(['は'|R],R). 読点(['、'|R],R). 句点(['。'|R],R). 構造定義(Lines) :- member(_行,Lines), split(_行,[':',':',' ',' '],[F|L2]), append(L3,[_],L2), 要素定義(F,L3), fail; true. 要素定義(F,L) :- member(A,L), P =.. [F,[A|R],R], assertz(P), fail; true. '20文をランダムに選択して表示'(_語ならび集) :- length(_語ならび集,Len), tell('t440_2.txt'), 重複しない20文をランダムに選択表示(20,_語ならび集,Len,[]). told. 重複しない20文をランダムに選択表示(0,_,_,_) :- !. 重複しない20文をランダムに選択表示(N,_語ならび集,Len,_選択したnthならび) :- Nth is random mod Len + 1, not(member(Nth,_選択したnthならび)), list_nth(Nth,_語ならび集,_選択した語ならび), concat_atom(_選択した語ならび,_選択文), write_formatted('%t\n',[_選択文]), M is N - 1, 重複しない20文をランダムに選択表示(M,_語ならび集,Len,[Nth|_選択したnthならび]),!. 重複しない20文をランダムに選択表示(N,_語ならび集,Len,_選択したnthならび) :- 重複しない20文をランダムに選択表示(N,_語ならび集,Len,_選択したnthならび). # 50コのデータを利用して # 最大値と最小値を取り出すプログラムを以下の1,2の関数を用いて2つ作れ # 1 return文を用いたケース # 2 グローバル変数を用いたケース # ポインタは使用不可です #ファイル名はseiseki.txtでお願いします # 70 56 66 45 88 # 66 85 68 55 73 # 55 65 53 67 55 # 85 72 76 58 65 # 92 70 45 73 55 # 56 57 52 62 82 # 72 62 33 85 95 # 46 95 48 72 34 # 83 42 88 92 56 # 68 65 91 82 66 整数要素ファイルの最小値・最大値(_ファイル,_最小値,_最大値) :- get_chars(_ファイル,Chars), concat_atom(Chars,Atom), split(Atom,['\n',' '],[A|L]), ならびの中の最小値・最大値(L,A,A,_最小値,_最大値). ならびの中の最小値・最大値([],X,Y,X,Y) :- !. ならびの中の最小値・最大値([A|R],Min,Max,_最小値,_最大値) :- A < Min, ならびの中の最小値・最大値(R,A,Max,_最小値,_最大値). ならびの中の最小値・最大値([A|R],Min,Max,_最小値,_最大値) :- A > Max, ならびの中の最小値・最大値(R,Min,A,_最小値,_最大値). ならびの中の最小値・最大値([_|R],Min,Max,_最小値,_最大値) :- ならびの中の最小値・最大値(R,Min,Max,_最小値,_最大値). # 【質問テンプレ】 # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): # 課題: # ・キーボードから正整数を入力し、その逆数を正確に計算し、ディスプレイに # 表示させる。(循環小数である場合には、循環部分が分かるように表示を工夫する。)# 内容: # n(nは任意の正整数)の逆数を正確に計算し、計算過程で出た商、余りを逐次 # 配列に入れていく。計算途中で同じ商、余りが出たら循環小数と判定でき、 # 0が出たら割り切れると判定できる。 逆数を正確に計算(_最大桁,_正整数,_逆数表示) :- 逆数表示(_最大桁,_正整数,[[0,1]],_逆数表示),!. 逆数表示(N,_,Y,X) :- N < 0,逆数表示(Y,[],X),!. 逆数表示(N,_整数,[[D,0]|Y],X) :- 逆数表示([[D,0]|Y],[],X),!. 逆数表示(N,_整数,[[_商,_剰余]|Y],X) :- _商2 is _剰余 // _整数, _剰余2 is (_剰余 mod _整数) * 10, append(L1,[[_商2,_剰余2]|L2],[[_商,_剰余]|Y]), append([[']...',_]|L1],[[_商2,_剰余2],['[',_]|L2],Z), 逆数表示(Z,[],X),!. 逆数表示(N,_整数,[[_商,_剰余]|Y],X) :- _整数 > _剰余, _剰余2 is _剰余 * 10, N2 is N - 1, 逆数表示(N2,_整数,[[0,_剰余2],[_商,_剰余]|Y],X),!. 逆数表示(N,_整数,[[_商,_剰余]|Y],X) :- _整数 < _剰余, _商2 is _剰余 // _整数, _剰余2 is (_剰余 mod _整数) * 10, N2 is N - 1, 逆数表示(N2,_整数,[[_商2,_剰余2],[_商,_剰余]|Y],X),!. 逆数表示([],[_|X],S) :- concat_atom(['0','.'|X],S),!. 逆数表示([[A|_]|R1],Y,S) :- 逆数表示(R1,[A|Y],S). # 【 課題 】テキストファイルから文字列5行を読み込み、別のテキストへ縦書きで書き出す # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】7/14 am6:00 # 【 Ver  】Eclipse Version: 3.4.2 # 【 補足 】 # あいう # かきく # さしす # 上記のようなテキストファイルを読み込み、 # あかさ # いきし # うくす # のように別のテキストファイルに書き出す感じです。 テキストファイルから文字列5行を読み込み、別のテキストへ縦書きで書き出す(InFile,OutFile) :- open(InFile,read,Input), open(OutFile,write,Output), findall(Chars,(for(1,N,5),get_line(InFile,_行),atom_chars(_行,Chars)),LL), max(Chars,Max), 空白文字を付加して文字数一致させる(Max,LL,LL2), 行列の転置(LL2,LL3), 出力ファイルに書き出す(Output,LL3). 出力ファイルに書き出す(Output,[]) :- close(Output),!. 出力ファイルに書き出す(Output,[L|R]) :- concat_atom(L,S), write_formatted(Output,'%t\n',[S]), 出力ファイルに書き出す(Output,R). 空白文字を付加して文字数を一致させる(Max,LL1,LL2) :- findall(L,(member(L1,LL1),length(L,Max),append(L1,L2,L),all(L2,' ')),LL2). all([],_). all([V|R],V) :- all(R,V). # 【 課題 】テキストファイルから文字列5行を読み込み、別のテキストへ右縦書きで書き出す # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】7/14 am6:00 # 【 Ver  】Eclipse Version: 3.4.2 # 【 補足 】 # あいう # かきく # さしす # 上記のようなテキストファイルを読み込み、 # さかあ # しきい # すくう # のように別のテキストファイルに書き出す感じです。 テキストファイルから文字列5行を読み込み、別のテキストへ右縦書きで書き出す(InFile,OutFile) :- open(InFile,read,Input), open(OutFile,write,Output), findall(Chars,(for(1,N,5),get_line(InFile,_行),atom_chars(_行,Chars)),LL), findmax(Len,length(Chars,Len),Max), 空白文字を付加して文字数一致させる(Max,LL,LL2), 行列の転置(LL2,LL3), 右書き用に反転して出力ファイルに書き出す(Output,LL3). 右書き用に反転して出力ファイルに書き出す(Output,[]) :- close(Output),!. 右書き用に反転して出力ファイルに書き出す(Output,[L|R]) :- reverse(L,L1), concat_atom(L1,S), write_formatted(Output,'%t\n',[S]), 右書き用に反転して出力ファイルに書き出す(Output,R). 空白文字を付加して文字数を一致させる(Max,LL1,LL2) :- findall(L,(member(L1,LL1),length(L,Max),append(L1,L2,L),all(L2,' ')),LL2). all([],_). all([V|R],V) :- all(R,V). # 【質問テンプレ】 # [1] 授業単元: C言語演習 # 2.入力された年月の1日が何曜日かを調べる。 #   曜日のチェックはZellerの公式を使用する。Zellerの公式は、 #    #   曜日を表す値=(y + [ y / 4 ] - [ y / 100 ] + [ y / 400 ] + [ (( 13 * m ) + 8 ) / 5 ] + d ) % 7 # #           ※ 上記の公式中の y は年、 m は月、 d は日を表し、 #             []はその数を越えない最大の整数を表す。(例: [13.6]は13になる) # #   で、曜日を表す値は次のようになっている。 # #     日曜日 = 0, 月曜日 = 1, 火曜日 = 2, 水曜日 = 3, # # 木曜日 = 4, 金曜日 = 5, 土曜日 = 6, # #   ※但し、1月と2月は前年の13月14月として計算するものとする。 % (1) 年月の入力 年月入力処理(_年,_月) :- 年入力処理(_年), 月入力処理(_月). % (2) 曜日計算 :- op(450,xfx,が),op(500,xfx,であり),op(600,xfx,ならば),op(450,xfx,は). 'Zellerの公式'(年 が Y であり 月 が M であり 日 が D ならば 曜日を表す値 は (Y + Y // 4 - Y // 100 + Y // 400 + ((( 13 * M ) + 8 ) // 5 ) + D ) mod 7). 曜日計算処理(_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日). 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を表す値を得る'(_年,_月,_日,_曜日を表す値), 曜日を表す値(_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を表す値を得る'(_年,1,_日,_曜日を表す値) :- _前年 is _年 - 1, 'Zellerの公式を用いて曜日を表す値を得る'(_前年,13,_日,_曜日を表す値),!. 'Zellerの公式を用いて曜日を表す値を得る'(_年,2,_日,_曜日を表す値) :- _前年 is _年 - 1, 'Zellerの公式を用いて曜日を表す値を得る'(_前年,14,_日,_曜日を表す値),!. 'Zellerの公式を用いて曜日を表す値を得る'(_年,_月,_日,_曜日を表す値) :- _年=Y,_月=M,_日=D, 'Zellerの公式'(年 が Y であり 月 が M であり 日 が D ならば 曜日を表す値 は _Zellerの公式), _曜日を表す値 is _Zellerの公式,!. 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). % (3) カレンダー表示 カレンダー表示 :- 年月入力処理(_年,_月), 'Zellerの公式を用いて曜日を表す値を得る'(_年,_月,1,_曜日を表す整数値), カレンダー表示データ編集(_年,_月,_曜日を表す整数値,_カレンダー表示文字列ならび), 要素に空白を挿入して全行表示(_カレンダー表示文字列ならび). カレンダー表示データ編集(_年,_月,_各月1日の曜日を表す整数値,_カレンダー表示文字列ならび) :- 年月文字列編集処理(_年,_月,_年月文字列), 月日数(_年,_月,_月日数), findall(S,for(1,N,_月日数),ヘッドゼロサプレス(2,N,S)),_表示日ならび), Length is _月日数 + _各月1日の曜日を表す整数値, M is (7 - (Length mod 7)), '7個組ならび'(Length,M,_表示日ならび,_7個組ならび), 見出しならび(_年月文字列,_見出しならび), append(_見出しならび,_7個組ならび,_カレンダー表示文字列ならび). 見出しならび(_年月文字列,[[_年月文字列],[日,月,火,水,木,金,土]]). '7個組ならび'(Length,0,_表示日ならび,_7個組ならび) :- length(L0,Length), すべての要素が(L0,' '), append(L0,_表示日ならび,L), '7個組'(L,_7個組ならび),!. '7個組ならび'(Length,M,_表示日ならび,_7個組ならび) :- not(M=0), length(L0,Length), すべての要素が(L0,' '), length(L2,M), すべての要素が(L2,' '), append(L0,_表示日ならび,L2,L), '7個組'(L,_7個組ならび),!. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- not(0 is _年 mod 4),fail. 月日数(_年,2,29) :- うるう年(_年),!. 月日数(_年,2,28) :- not(うるう年(_年)),!. 月日数(_,_月,30) :- member(_月,[4,6,9,11]). 月日数(_,_月,31) :- member(_月,[1,3,5,7,8,10,12]). % (4) 基礎述語の定義 年入力処理(_年) :- write('表示したいカレンダーは西暦何年 ? '), get_line(_行), 年入力処理の二(_行,_年), 年入力検査(_年),!. 年入力処理(_年) :- 年入力処理(_年). 年入力処理の二(_行,_年) :- atom_to_term(_行,_年), integer(_年),!. 年入力処理の二(_行,_年) :- write_formatted('この入力[ %t ]は整数ではありません\n',[_行]), fail. 年入力検査(_年) :- _年 >= 1583, _年 =< 3999,!. 年入力検査(_年) :- write_formatted('この年を表す整数%tは不正です\n',[_年]), fail. 月入力処理(_月) :- write('月は ? '), get_line(_行), 月入力処理の二(_行,_月), 月入力検査(_月),!. 月入力処理(_月) :- 月入力処理(_月). 月入力処理の二(_行,_月) :- atom_to_term(_行,_月,_), integer(_月),!. 月入力処理の二(_行,_月) :- write_formatted('この入力[ %t ]は整数ではありません\n',[_行]), fail. 月入力検査(_月) :- _月 >= 1, _月 =< 12,!. 月入力検査(_月) :- write_formatted('この月を表す整数%tは不正です\n',[_月]), fail. 日付文字列編集処理(_年,_月,_日,_日付文字列) :- ヘッドゼロサプライ(2,_年,_年文字列), ヘッドゼロサプライ(2,_月,_月文字列), ヘッドゼロサプライ(2,_日,_日文字列), concat_atom([_年文字列,_月文字列,_日文字列],_日付文字列). 年月文字列編集処理(_年,_月,_年月文字列) :- ヘッドゼロサプライ(2,_年,_年文字列), ヘッドゼロサプライ(2,_月,_月文字列), concat_atom([_年文字列,_月文字列],_年月文字列). ヘッドゼロサプライ(N桁,_整数,_ヘッドゼロ整数文字列) :- number_chars(_整数,_数字ならび), ヘッドゼロサプライ_1(N桁,_数字ならび,_ヘッドゼロ整数文字ならび), concat_atom(_ヘッドゼロ整数文字ならび,_ヘッドゼロ整数文字列),!. ヘッドゼロサプライ_1(N桁,L,L) :- length(L,N桁),!. ヘッドゼロサプライ_1(N桁,L,['0'|R]) :- M桁 is N桁 - 1, ヘッドゼロサプライ_1(M桁,L,R). ヘッドゼロサプレス(N桁,_整数,_ヘッド空白整数文字列) :- number_chars(_整数,_数字ならび), ヘッドゼロサプレス_1(N桁,_数字ならび,_ヘッド空白整数文字ならび), concat_atom(_ヘッド空白整数文字ならび,_ヘッド空白整数文字列),!. ヘッドゼロサプレス_1(N桁,L,L) :- length(L,N桁),!. ヘッドゼロサプレス_1(N桁,L,[' '|R]) :- M桁 is N桁 - 1, ヘッドゼロサプレス_1(M桁,L,R). 要素に空白を挿入して全行表示([]) :- !. 要素に空白を挿入して全行表示([L|R]) :- concat_atom(L,' ',_表示行), write_formatted('%t\n',[_表示行]), 要素に空白を挿入して全行表示(R). すべての要素が([],_). すべての要素が([V|R],V) :- すべての要素が(R,V). '7個組'([],[]) :- !. '7個組'([A,B,C,D,E,F,G|R1]),[[A,B,C,D,E,F,G]|R2]) :- '7個組'(R1,R2). n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. not(P) :- \+(P). append([],L1,L2,L) :- append(L1,L2,L) . append([A|R1],L1,L2,[A|R]) :- append(R1,L1,L2,R) . concat_atom([],'') :- !. concat_atom([A],A) :- !. concat_atom([A|R],S) :- concat_atom(R,S1), atom_concat(A,S1,S). concat_atom([],_,'') :- !. concat_atom([A],_,A) :- !. concat_atom([A|R],_区切り文字列,S) :- concat_atom(R,_区切り文字列,S1), atom_concat(A,_区切り文字列,S2), atom_concat(S2,S1,S). # 個数Nが与えられたとき # N個の自然数の合計が10になるような組み合わせをすべて列挙する # プログラムを書け t496(N) :- 重複組合せ([1,2,3,4,5,6,7,8,9,10],N,L), sum(L,10), concat_atom(L,' + ',S), write_formatted('%t\n',[S]), fail. t496(_). sum([],0) :- !. sum([A|R],X) :- sum(R,Y),X is A + Y. # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # # 下に示すように,キーボードから二つの文字列を読み込み,どちらの文字列が # 何文字長いか # を表示するプログラムを作成せよ.なお,二つの文字列が同じ長さならば, # 「二つの文字列は同じ長さです.」と表示させること. # # 文字列A : Good # 文字列B : Morning # 文字列B の方が3 文字長いです. 入力文字列長の比較 :- write('文字列A ? '), get_line(A), write('文字列B ? '), get_line(B), 名前付き文字列長の診断(文字列A,A,文字列B,B,_診断), write_formatted('%t\n',[_診断). 名前付き文字列長の診断(_名前1,_文字列1,_名前2,_文字列2,_診断) :- atom_chars(_文字列1,L1), atom_chars(_文字列2,L2), length(L1,_長さ1), length(L2,_長さ2), _長さの差 is _長さ1 - _長さ2 名前付き文字列長の診断の二(_名前1,_名前2,_長さの差,_診断),!. 名前付き文字列長の診断の二(_,_,0,'二つの文字列は同じです。') :- !. 名前付き文字列長の診断の二(_名前1,_名前2,_長さの差,_診断) :- _長さの差 > 0, concat_atom([_名前1,の方が,_長さの差,文字長いです。],_診断),!. 名前付き文字列長の診断の二(_名前1,_名前2,_長さの差,_診断) :- _長さの差 < 0, _長さの差1 is abs(_長さの差), concat_atom([_名前2,の方が,_長さの差1,文字長いです。],_診断). # [課題] # ・23本のマッチ棒からなる山があり,2人のプレーヤが山から交互にマッチ棒を # 取り除く # ・一度に取ることのできるマッチ棒は1から3本 # ・山を空にしたプレーヤが勝ち # 人間2人でこのゲームを行なうプログラムを作成せよ. # # プログラムでは各プレーヤの手がルールに反していないかどうかのチェックと, # 勝負がついたかどうかのチェックを行なうこと。 # また,最初に山にある本数と,各回に取ることができる最大の本数をプログラムの # 最初に変数にセットしておき,そこを変えるだけで本数の変化に対応できるような # プログラムにすること。 プレーヤ(1,山下). プレーヤ(2,太田). プレーヤのデバイス(1,入力,'/dev/tty1'). プレーヤのデバイス(2,入力,'/dev/tty2'). プレーヤのデバイス(1,出力,'/var/tmp/player1'). プレーヤのデバイス(2,出力,'/var/tmp/player2'). マッチ棒の山([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_]). マッチ棒('|'). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% マッチ棒の山崩し :- プレーヤ(1,_プレーヤ1), プレーヤ(2,_プレーヤ2), マッチ棒の山(L), デバイスを開く(Instream1,Instream2,Outstream1,Outstream2), ゲームの案内(Outstream1,Outstream2), マッチ棒の山崩し(_プレーヤ1,_プレーヤ2,Instream1,Instream2,Outstream1,Outstream2,L), デバイスを閉じる(Insteam1,Instream2,Outstream1,Outstream2). マッチ棒の山崩し(_,_プレーヤ,_,_,OutstreamA,OutstreamB,[]) :- concat_atom([_プレーヤ,さんの勝ちです,'\n'],S), 同報(OutstreamA,OutstreamB,S),!. マッチ棒の山崩し(_プレーヤA,_プレーヤB,InstreamA,InstreamB,OutstreamA,OutstreamB,L) :- 取り棒の案内(_マッチ棒,L,_取り棒の案内), write_formatted(OutstreamA,'君の番だよ( %t ) : ',[_取り棒の案内]), マッチ棒を取る(InstreamA,OutstreamA,L,L1,L2), マッチ棒の山の変化を同報する(OutstreamA,OutstreamB,L,L1,L2), マッチ棒の山崩し(_プレーヤB,_プレーヤA,InstreamB,InstreamA,OutstreamB,OutstreamA,L2),!. マッチ棒を取る(Instream,_,L,L1,L2) :- get_line(Instream,S), 変数ならびに変換(S,L1), 取ったマッチ棒の診断(L,L1,L2),!. マッチ棒を取る(Instream,Outstream,L,L1,L2) :- マッチ棒を取る(Instream,Outstream,L,L1,L2). 取ったマッチ棒の診断(L,L1,L2) :- append(L1,L2,L2),!. 取ったマッチ棒の診断(L,L1,L2) :- 取り棒の案内(L,_取り棒の案内), write(Outstream,'入力形式が正しくありません。\n'), write(Outstream,'(%t) : ',[_取り棒の案内]), fail. 変数ならびに変換(S,L) :- マッチ棒(_マッチ棒), 変数ならびに変換(_マッチ棒,Chars,L), atom_chars(S,Chars). 変数ならびに変換(_マッチ棒,[_マッチ棒],[_]). 変数ならびに変換(_マッチ棒,[_マッチ棒|R1],[_|R2]) :- 変数ならびに変換(_マッチ棒,R1,R2). 取り棒の案内(L,_取り棒の案内) :- マッチ棒(_マッチ棒), 取り棒の案内(_マッチ棒,L,_取り棒の案内). 取り棒の案内(_マッチ棒,[_],_マッチ棒). 取り棒の案内(_マッチ棒,[_,_],S) :- concat_atom([_マッチ棒,' or ',_マッチ棒],S). 取り棒の案内(_マッチ棒,[_,_,_|_],S) :- concat_atom([_マッチ棒,' or ',_マッチ棒,' or ',_マッチ棒],S). マッチ棒の山の変化を同報する(Outstream1,Outstream2,L0,L1,L) :- マッチ棒(_マッチ棒), all(L0,_マッチ棒),concat_atom(L0,' ',S0), all(L1,_マッチ棒),concat_atom(L1,' ',S1), all(L,_マッチ棒),concat_atom(L,' ',S), concat_atom([S1,'\n','↑\n',S,'\n現在の山は ',S,'\n'],S2), 同報(Outstream1,Outstream2,S2), fail. マッチ棒の山の変化を同報する(_,_,_,_,_). all([],_). all([V|R],V) :- all(R,V). ゲームの案内(Outstream1,Outstream2) :- 同報(Outstream1,Outstream2,'マッチの本数の入力は\n1本 -> |<改行>\n'), 同報(Outstream1,Outstream2,'2本 -> ||<改行>\n'), 同報(Outstream1,Outstream2,'3本 -> |||<改行> という表現でお願いします\n'). 同報(Outsteam1,Outstream2,_項) :- write(Outstream1,_項), write(Outstream2,_項),!. デバイスを開く(Instream1,Instream2,Outstream1,Outstream2) :- プレーヤのデバイス(1,入力,Indevice1), プレーヤのデバイス(2,入力,Indevice2), プレーヤのデバイス(1,出力,Outdevice1), プレーヤのデバイス(2,出力,Outdevice2), open(Indevice1,read,Instream1), open(Outdevice1,append,Outstream1), open(Indevice2,read,Instream2), open(Outdevice2,append,Outstream2),!. デバイスを閉じる(Instream1,Instream2,Outstream1,Outstream2) :- close(Insteam1), close(Outstream1), close(Instream2), close(Outstream2),!. マッチ棒の山の初期状態の設定(N) :- integer(N), retract(マッチ棒の山(_)), length(L,N), asserta(マッチ棒の山(L)). プレーヤの入出力デバイスの設定(_プレーヤ1の入力デバイス,_プレーヤ2の入力デバイス,_プレーヤ1の出力デバイス,_プレーヤ2の出力デバイス) :- abolish(プレーヤのデバイス/3), assertz(プレーヤのデバイス(1,入力,_プレーヤ1の入力デバイス)), assertz(プレーヤのデバイス(2,入力,_プレーヤ2の入力デバイス)), assertz(プレーヤのデバイス(1,出力,_プレーヤ1の出力デバイス)), assertz(プレーヤのデバイス(2,出力,_プレーヤ2の出力デバイス)),!. プレーヤの設定(_プレーヤ1,_プレーヤ2) :- abolish(プレーヤ/2), assertz(プレーヤ(1,_プレーヤ1)), assertz(プレーヤ(2,_プレーヤ2)),!. get_line(Instream,X) :- get_char(Instream,C), get_line_3(Instream,C,Chars), atom_chars(X,Chars). get_line_3(_,'\n',[]) :- !. get_line_3(Instream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_3(Instream,C,[C|R]) :- get_char(Instream,C2), get_line_3(Instream,C2,R). # [1] 授業単元:コンピュータリテラシー # [2] 問題文(含コード&リンク):問題文と参考は以下です # ・試験の過程を記録 # 1,番号、得点を入力したあと平均点を計算 # 2,番号順と得点順に並べ替え(ifを使いどちらか選択できるようにする) # 3,番号、得点、平均との差を出力 # 以上のプログラムを作成 成績を記録する :- write('番号と得点をスペースで区切って一行で入力してください\n'), get_line(_行), 成績を記録する(_行). 成績を記録する(end_of_file) :- !. 成績を記録する(_行) :- split(_行,[' '],[_番号,_得点]), assertz(成績(_番号,_得点)), get_line(_次の行), 成績を記録する(_次の行). 平均点(_平均点) :- findavg(_得点,成績(_,_得点),_平均点). 番号順に並べ直し(_番号順成績ならび) :- findall([_番号,_得点],成績(_番号,_得点),_成績ならび), quicksort(_成績ならび,_番号順成績ならび). 得点順に並べ直し(_得点順成績ならび) :- findall([_得点,番号],成績(_番号,_得点),_得点・番号成績ならび), quicksort(_得点・番号成績ならび,_整列した得点・番号ならび), 項目位置を元に戻す(_整列した得点・番号ならび,_得点順成績ならび). 項目位置を元に戻す([],[]). 項目位置を元に戻す([[A,B]|R1],[[B,A]|R2]) :- 項目位置を元に戻す(R1,R2). 番号、得点、平均との差の出力 :- 平均点(_平均点), write('番号 得点 平均との差\n'), 成績(_番号,_得点), _平均との差 is _得点 - _平均点, write_formatted('%t %t %t\n',[_番号,_得点,_平均との差]), fail. 番号、得点、平均との差の出力. quicksort([],[]) :- !. quicksort([X|Xs],Ys) :- partition(Xs,X,Littles,Gigs), quicksort(Littles,Ls), quicksort(Bigs,Bs), append(Ls,[X|Bs],Ys). partition([],Y,[],[]) :- !. partition([X|Xs],Y,[X|Ls],Bs) :- X @=< Y,partition(Xs,Y,Ls,Bs). partition([X|Xs],Y,Ls,[X|Bs]) :- X @> Y,partition(Xs,Y,Ls,Bs). %%%%%%%% findavg/3 加算/2 他 %%%%%%%%%%%%%%%%%%%% :- op(A,B,は). findavg(_集約項,_項,_算術平均) :- findall(_集約項,_項,_値ならび), '加算'(_値ならび,_合計値), length(_値ならび,_ならびの長さ), _算術平均 is _合計値 / _ならびの長さ,!. 加算(trunc(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A is trunc(B)),SL),!. 加算(四捨五入(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A は 四捨五入(B)),SL),!. 加算(切捨て(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A は 切捨て(B)),SL),!. 加算(切り上げ(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A は 切り上げ(B)),SL),!. 加算([],L) :- var(L), L = 0.0e+00,!. 加算([],L) :- \+(var(L)), 加算の変数に零をおく(L),!. 加算([L|R],SL) :- ならび(L), 行列の転置([L|R],L1), 加算_2(L1,SL),!. 加算(X,S) :- 加算_1(X,0.0e+00,S) . 加算_1([],S,S) :- !. 加算_1([A|R],Y,S) :- ならび(A), ならび(Y), !, ならび加算(A,Y,Z), 加算_1(R,Z,S),!. 加算_1([A|R],Y,S) :- atom(A), atom_number(A,I), integer(I), Z is I + Y, 加算_1(R,Z,S),!. 加算_1([A|R],Y,S) :- atom(A), atom_number(A,F), real(F), Z is F + Y, 加算_1(R,Z,S),!. 加算_1([A|R],Y,S) :- atom(A), 加算_1(R,Y,S),!. 加算_1([A|R],Y,S) :- A1 は A, Z is A1 + Y, 加算_1(R,Z,S). 加算_1(A,Y,S) :- とからりすと(A,L), !, 加算_1(L,Y,S) . 加算_2([],[]) :- !. 加算_2([L|R],[S|R2]) :- 加算(L,S), 加算_2(R,R2). 加算の変数に零をおく([]) :- !. 加算の変数に零をおく([A|R]) :- 変数(A), A = 0.0e+00, 加算の変数に零をおく(R),!. とからりすと(A,[A]) :- atomic(A),!. とからりすと(A と B,C) :- とからりすと(A,A1), とからりすと(B,B1), append(A1,B1,C). 変数(_変数) :- var(_変数). ならび([_|_]). _項 は (_ネットワーク :: _式) :- _ネットワーク :: _項 は _式, ! . _評価項 は N : L :- M は N, L1 は L, list_nth(M,L1,_評価項), ! . _評価項 は prolog(_評価項) :- functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), !, error_protect(_評価項,fail) . _評価値 は [X|{P}] :- findall(X,P,_評価値), ! . _評価項 は ` _値 :- !, _評価項 = _値, ! . _項 は _式 :- var(_式), _項 = _式, ! . _項 は _式 :- error_protect(一時関数定義(_式,_項),fail) . _項 は _式 :- atom(_式), member(_式,[minint,maxint,cputtime,time,csize,cused,dbsize,dbused,gsize,gused,noptrs,ptrsued,ssize,sused,tsize,tused]), !, _項 is _式, ! . _項 は _式 :- 二項組込み関数(_式), 二項組込み関数の評価(_式,_項) . _項 は _式 :- 二項組込み関数(_式), !, fail . _項 は _式 :- functor(_式,Functor,1), arg(1,_式,Arg), Y は Arg, functor(_式_1,Functor,1), arg(1,_式_1,Y), member(Functor,[atom,real,integer,var,float,list]), !, error_protect(_式_1,fail), _項 = Y, ! . _項 は _式 :- atom(_式), error_protect(get_global(_式,_項),fail), ! . _項 は _式 :- real(_式), _項 = _式, ! . _項 は _式 :- real(_式), !, fail . _項 は _式 :- list(_式), findall(X,(member(U,_式) , X は U),_項) . _項 は _式 :- list(_式), !, fail. _項 は _erlang_module : _erlang関数 :- erlang関数評価(_erlang_module : _erlang関数,_項),!. _項 は _式 :- 関数定義(_式,_項),!. _項 は _式 :- functor(_式,_関数,_次数), function(_関数,_次数), findall(Arg,(for(1,N,_次数) , arg(N,_式,Arg)),L), 関数評価に於いて引数部分の関数評価(L,L2), _式の二 =.. [_関数|L2], error_protect(_項 is _式の二,fail) . _項 は _評価関数 :- error_protect(_項 is _評価関数,fail),!. _評価項 は prolog(_評価項) :- functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), !, error_protect(_評価項,fail),!. _項 は _評価項 :- 述語評価が可能(_評価項,_関数,_次数,_次数足す一), _評価項 =.. _評価項の項分解ならび, findall(Arg,(for(1,N,_次数) , arg(N,_評価項,Arg)),L), 関数評価に於いて引数部分の関数評価(L,L2), append(L2,[_],_変数を付加した引数ならび), _解付き評価項 =.. [_関数|_変数を付加した引数ならび], error_protect(_解付き評価項,fail), arg(_次数足す一,_解付き評価項,_項) . _項 は _評価項 :- \+(述語評価が可能(_評価項,_関数,_次数,_次数足す一)), functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), error_protect(_評価項,fail), arg(Arg,_評価項,_項) . _項 は _評価項 :- \+(述語評価が可能(_評価項,_関数,_次数,_次数足す一)), functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), \+(error_protect(_評価項,fail)), _評価項 = _項,!. _項 は _式 :- atomic(_式), \+(述語評価が可能(_式,_関数,_次数,_次数足す一)), _項 = _式,!. 述語評価が可能(_評価項,_関数,_次数,_次数足す一) :- functor(_評価項,_関数,_次数), _次数足す一 is _次数 + 1, \+(predicate_type(_関数,_次数足す一,undefined)),!. 関数評価に於いて引数部分の関数評価([],[]). 関数評価に於いて引数部分の関数評価([L|R1],[L2|R2]) :- list(L), !, 関数評価に於いて引数部分の関数評価(L,L2), 関数評価に於いて引数部分の関数評価(R1,R2), ! . 関数評価に於いて引数部分の関数評価([F|R1],[F|R2]) :- \+(error_protect(F2 は F,fail)), !, 関数評価に於いて引数部分の関数評価(R1,R2) . 関数評価に於いて引数部分の関数評価([F|R1],[F2|R2]) :- error_protect(F2 は F,fail), 関数評価に於いて引数部分の関数評価(R1,R2) . erlang関数評価(os : cmd(Command),_項) :- erlang :: (os : cmd(Command) -> _項_1), _項 は string2atom(_項_1),!. erlang関数評価(_erlang_module : _erlang関数,_項) :- erlang :: (_erlang_module : _erlang関数 -> _項),!. 関数定義(_項の一 + _項の二,_値) :- _値の一 は _項の一, number(_値の一), _値の二 は _項の二, number(_値の二), _値 is _値の一 + _値の二, !. 関数定義(_項の一 + _項の二,_値) :- _値の一 は _項の一, atomic(_値の一), _値の二 は _項の二, atomic(_値の二), concat_atom([_値の一,_値の二],_値), !. 関数定義(_ならびの一 + _ならびの二,_値) :- ( 変数(_ならびの一) ; _ならびの一 == [] ; list(_ならびの一) ; 変数(_ならびの二) ; _ならびの二 == [] ; list(_ならびの二) ), !, append(_ならびの一,_ならびの二,_値) . 関数定義(_項の一 * _項の二,_値) :- _値の一 は _項の一, list(_値の一), _値の二 は _項の二, integer(_値の二), findall(_値の一,for(1,_,_値の二),LY), concat_list(LY,_値), !. 関数定義(_項の一 * _項の二,_値) :- _値の一 は _項の一, atom(_値の一), _値の二 は _項の二, integer(_値の二), findall(_値の一,for(1,_,_値の二),L), concat_atom(L,_値), !. 関数定義(_項の一 * _項の二,_値) :- _値の一 は _項の一, atomic(_値の一), _値の二 は _項の二, atomic(_値の二), concat_atom([_値の一,_値の二],_値), !. 関数定義(_ならびの一 * _ならびの二,_値) :- ( 変数(_ならびの一) ; _ならびの一 == [] ; list(_ならびの一) ; 変数(_ならびの二) ; _ならびの二 == [] ; list(_ならびの二) ), !, append(_ならびの一,_ならびの二,_値) . 関数定義(` _値,_値) :- !. 関数定義(@ _式,_値) :- _値 は _式,!. 関数定義(四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _値の二 >= 0.0e+00, _四捨五入後の値 is floor(_値の二 + 0.5) * 1.0,!. 関数定義(四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _四捨五入後の値 is ceil(_値の二 - 0.5),!. 関数定義(切り捨て(_値),_切り捨て後の値) :- _値の二 は _値, _切り捨て後の値 は floor(_値の二) * 1.0,!. 関数定義(切り上げ(_値),_切り上げ後の値) :- _値の二 は _値, _切り上げ後の値 は ceil(_値の二),!. 関数定義(十円未満四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _四捨五入後の値 は floor(_値の二 / 10 + 0.5) * 10,!. 関数定義(十円未満切り捨て(_値),_切り捨て後の値) :- _値の二 は _値, _切り捨て後の値 は trunc(_値の二 / 10) * 10,!. 関数定義(十円未満切り上げ(_値),_切り上げ後の値) :- _値の二 は _値, _切り上げ後の値 は ceil(_値の二 / 10) * 10,!. 関数定義(百円未満四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _四捨五入後の値 は floor(_値の二 / 100 + 0.5) * 100,!. 関数定義(百円未満切り上げ(_値),_切り上げ後の値) :- _値の二 は _値, _切り上げ後の値 は ceil(_値の二 / 100) * 100,!. 関数定義(百円未満切り捨て(_値),_切り捨て後の値) :- _値の二 は _値, _切り捨て後の値 は floor(_値の二 / 100) * 100,!. 関数定義(整数化(_値),_整数化された値) :- _値の二 は _値, _整数化された値 is trunc(_値の二),!. 関数定義(char_code(_項),_値) :- ( atom(_項), atomic_length(_項,1), char_code(_項,_値) ; integer(_項), char_code(_値,_項) ; 複合項(_項), _項の一 は _項, _値 は char_code(_項の一) ), !. 関数定義($ _大域変数名,_値) :- atom(_大域変数名), get_global(_大域変数名,_値の一), _値 は _値の一,!. 関数定義(S,E) :- functor(S,select,1), to(S,E),!. 関数定義(setq(A,B),E) :- atom(A), B1 は B, set_global(A,B1), E = B1,!. 関数定義(++ A,X) :- A1 は A, list(A1), 加算(A1,X),!. 関数定義(A ++ B,X) :- C is B / A, X = A + C + B,!. 関数定義(car(A),E) :- A1 は A, A1 = [E|_],!. 関数定義(cdr(A),E) :- A1 は A, A1 = [_|E],!. 関数定義(cons(A,B),E) :- A1 は A, B1 は B, E = [A1|B1],!. 関数定義(length(A),E) :- A1 は A, list(A1), length(A1,E),!. 関数定義(decode(A,B,C,D),E) :- A1 は A, B1 は B, A1 = B1, E は C,!. 関数定義(decode(A,B,C,D),E) :- E は D,!. 関数定義(decompcons(A),E) :- A1 は A, decompcons(A1,E),!. 関数定義(substr(A,B,C),E) :- 関数定義(subatomic(A,B,C),E),!. 関数定義(subatomic(A,B,C),E) :- A1 は A, B1 は B, C1 は C, subatomic(A1,B1,C1,E),!. 関数定義(concat(A),E) :- A1 は A, concat(A1,E),!. 関数定義(concat(A,B),E) :- A1 は A, B1 は B, concat(A1,B1,E),!. 関数定義(append(A,B),E) :- A1 は A, B1 は B, append(A1,B1,E),!. 関数定義(reverse(A),E) :- A1 は A, reverse(A1,E),!. 関数定義(string2atom(A),E) :- A2 は A, flat(A2,B), atom_codes(E,B),!. 関数定義(P,E) :- functor(P,greatest,Arg), P =.. [greatest|L], findall(B,(member(A,L) , B は A),L2), max(L2,E),!. 関数定義(P,E) :- functor(P,least,Arg), P =.. [least|L], findall(B,(member(A,L) , B は A),L2), min(L2,E),!. 関数定義(cel(_列数,_行数,_行列),_解) :- _関数評価された行数 は _行数, _関数評価された列数 は _列数, list_nth(_関数評価された行数,_行列,_行), list_nth(_関数評価された列数,_行,_解),!. # [1] 授業単元: # インタラクティブッコミュニケーション # [2] 問題文(含コード&リンク): # 外部変数を使用せずに、main()から関数を呼び出し、円をドルとユーロに換算し、 # main()内のprintf()で結果を出力するプログラムを作成せよ。 # 但し、1ドル = 118円, 1ユーロ = 160円とする。また、プログラムは # 負の値が入力されるまで繰り返されるものとする。 # # の一番下の演習。 # 最終的にはこの形に '外部変数を使用せずに、main()から関数を呼び出し、円をドルとユーロに換算し、main()内のprintf()で結果を出力するプログラムを作成せよ。但し、1ドル = 118円, 1ユーロ = 160円とする。また、プログラムは負の値が入力されるまで繰り返されるものとする。' :- repeat, write('換算する円金額を入れてください(終了するときは-1)\n'), get_line(Line), atom_to_term(Line,_円金額,_), レート換算表示(_円金額), _円金額 = -1. レート換算表示(_円金額) :- _円金額 < 0.0,!. レート換算表示(_円金額) :- 円レート(ドル,USD), 円レート(ユーロ,EUR), _ドル換算金額 is _円金額 / USD, _ユーロ換算金額 is _円金額 / EUR, write_formatted('換算した金額は %tドル %tユーロになります\n',[_ドル換算金額,_ユーロ換算金額]),!. 円レート(_通貨,_円レート) :- '通貨略号'(_通貨,_通貨略号), w3c(URL,L), member(A,L), char_code(C1,60),char_code(C2,62), /* ブラウザでS1,S2を表示させるため止むを得ず */ concat_atom([C1,'span class="yjFL"',C2],S1), concat_atom([C1,'/span',C2],S2), split(A,[S1],[U1,U2]), split(U2,[S2],[_円レート|_]),!. 通貨略号(ユーロ,'EUR'). 通貨略号(ドル,'USD'). 通貨略号('アメリカドル','USD'). 通貨略号('イギリス ポンド','GBP'). 通貨略号('インド ルピー','INR'). 通貨略号('インドネシア ルピア','IDR'). 通貨略号('エクアドル スクレ','ECS'). 通貨略号('エジプト ポンド','EGP'). 通貨略号('オーストラリア ドル','AUD'). 通貨略号('カナダ ドル','CAD'). 通貨略号('韓国 ウォン','KRW'). 通貨略号('クウェート ディナール','KWD'). 通貨略号('コロンビア ペソ','COP'). 通貨略号('サウジ リアル','SAR'). 通貨略号('シンガポール ドル','SGD'). 通貨略号('スイス フラン','CHF'). 通貨略号('スウェーデン クローナ','SEK'). 通貨略号('タイ バーツ','THB'). 通貨略号('台湾 ドル','TWD'). 通貨略号('中国 元','CNY'). 通貨略号('チリ ペソ','CLP'). 通貨略号('デンマーク クローネ','DKK'). 通貨略号('トルコ リラ','TRY'). 通貨略号('日本 円','JPY'). 通貨略号('ニュージーランド ドル','NZD'). 通貨略号('ノルウェー クローネ','NOK'). 通貨略号('パラグアイ グァラニ','PYG'). 通貨略号('フィリピン ペソ','PHP'). 通貨略号('ブラジル リアル','BRL'). 通貨略号('ベネズエラ ボリバル・フエルテ','VEF'). 通貨略号('ペルー ソル','PEN'). 通貨略号('香港 ドル','HKD'). 通貨略号('マレーシア リンギ','MYR'). 通貨略号('南アフリカ ランド','ZAR'). 通貨略号('メキシコ ペソ','MXN'). 通貨略号('UAE ダーハム','AED'). 通貨略号('欧州 ユーロ','EUR'). 通貨略号('ヨルダン ディナール','JOD'). 通貨略号('ルーマニア レウ','RON'). 通貨略号('レバノン ポンド','LBP'). 通貨略号('ロシアン ルーブル','RUB'). w3c(URL,X) :- w3ctimeout(Timeout), concat(['w3c -timeout ',Timeout,' -n "',URL,'"'],W3c), shs(W3c,X),!. w3ctimeout(60). shs(Command,X) :- tmpnam(TMPNAM), open(TMPNAM,write,Output), system(Command,user_input,Output), close(Output), open(TMPNAM,read,Input), findall(S,(repeat , stream_reads(Input,S) , (S = end_of_file , (!) , fail ; true)),X), close(Input), unlink(TMPNAM),!. tmpnam(TMPNAM) :- tmpnam(6,L), concat_atom(L,A), concat_atom(['/tmp/file',A],TMPNAM), not(exists(TMPNAM,read)),!. tmpnam(TMPNAM) :- tmpnam(TMPNAM). tmpnam(0,[]) :- !. tmpnam(N,[A|R]) :- M is (random mod 122) + 1, ( M >=48,M=<57,M1 = M; M >=65,M=<90,M1 = M; M >=97,M=<122,M1 = M; M >=0,M=<26,M1 is M + 65; M >=27,M=<47,M1 is M + 38; M >=58,M=<64,M1 is M + 10; M >=91,M=<96,M1 is M + 6 ), char_code(A,M1), N2 is N - 1, tmpnam(N2,R),!. unlink(F) :- concat_atom(['rm -f ',F],S), system(S). # [1] 授業単元:プログラミング基礎 # [2] 繰り返しをwhileもしくはdo\uff5ewhile文を使って作成しなさい。 # # 任意の数字を入力し、その数字分まで1つずつ加算して表示する。 # 入力した数字までいったら逆に1になるまで表示する。 # # 例 # 8 # # * # ** # *** # **** # ***** # ****** # ******* # ******** # ******* # ****** # ***** # **** # *** # ** # * '任意の数字を入力し、その数字分まで1つずつ加算して表示する。入力した数字までいったら逆に1になるまで表示する。'(N) :- length(L,N), L = [_|Z], t537([*],Z). t537(N) :- length(L,N),L=[_|Z],t537([*],Z). t537(L,Z) :- append(L,_,Z),t537_w(L),t537([*|L],Z). t537(L,Z) :- t537_w(L),fail. t537([*],_) :- !. t537_w(L) :- concat_atom(L,S),write_formatted('%t\n',[S]). % database_domain(postgresql,mydomain,mydatabase). % database_domain(mysql,mydomain,mydatabase). 'Postgresqlコマンド読み出し'(SQL,X) :- database_domain(postgresql,Domain,Database), psql_macro(SQL,SQL_2), concat(['psql -h ',Domain,' ',Database,' -q -t -c ','"',SQL_2,'"'],S) shs(S,Y), findall(U,(member(V,Y) , not V = '' , psql_get_field(V,U)),X), ! . 'mysqlコマンド呼び出し'(SQL,X) :- database_domain(mysql,Domain,Database), psql_macro(SQL,SQL_2), replace_all(SQL_2,'"','',SQL_3), concat_atom(['mysql -h ',Domain,' ',Database,' -s -e ','"',SQL_3,'"'],S) shs(S,Y), findall(U,(member(V,Y) , not V = '' , mysql_get_field(V,U)),X),!. psql_macro(SQL,SQL2) :- subatomic(SQL,1,12,'create table'), replace_all(SQL,number,numeric,SQL2), ! . psql_macro(SQL,SQL). mysql_get_field(S,X) :- atomic_length(S,Len), findall(N,(for(1,N,Len) , subatomic(S,N,1,'\t')),_区切り位置ならび), psql_get_field_2(S,Len,[0|_区切り位置ならび],X) . psql_get_field(S,X) :- atomic_length(S,Len), findall(N,(for(1,N,Len) , subatomic(S,N,1,'|')),_区切り位置ならび), psql_get_field_2(S,Len,[0|_区切り位置ならび],X). psql_get_field_2(S,_,[],[]) :-!. psql_get_field_2(S,Len,[St],[A]) :- N2 is St + 1, Len2 is Len - St, subatomic(S,N2,Len2,A_1), erase_space(A_1,A_2), atomic_length(A_2,Len3), postgresql_parse_1(A_2,Len3,A),!. psql_get_field_2(S,Len,[N1,N2|R],[A|R2]) :- Ns is N1 + 1, Len2 is N2 - N1 - 1, subatomic(S,Ns,Len2,A_1), erase_space(A_1,A_2), atomic_length(A_2,Len3), postgresql_parse_1(A_2,Len3,A), psql_get_field_2(S,Len,[N2|R],R2) . postgresql_parse_1(A,Len,V) :- atom_number(A,V), '実数'(V),!. postgresql_parse_1(A,Len,X) :- atom_number(A,N), integer(N), '整数から文字列'(Len,N,X),!. postgresql_parse_1(A,Len,A). erase_space(S,X) :- atomic_length(S,Len), erase_space_s(1,Len,S,X1), atomic_length(X1,Len2), erase_space_e(Len2,X1,X),!. erase_space_s(St,Len,_,'') :- St > Len,!. erase_space_s(St,Len,S,X) :- subatomic(S,St,1,' '), St2 is St + 1, erase_space_s(St2,Len,S,X),!. erase_space_s(St,Len,S,X) :- subatomic(S,St,Len,X),!. erase_space_e(0,_,'') :-!. erase_space_e(St,S,X) :- subatomic(S,St,1,' '), St2 is St - 1, erase_space_e(St2,S,X),!. erase_space_e(St,S,X) :- subatomic(S,1,St,X),!. '整数から文字列'(_文字列桁,_文字列,_副文字列) :- atom(_文字列), subatomic(_文字列,1,_文字列桁,_副文字列),!. '整数から文字列'(_文字列桁,_実数,_副文字列) :- '実数'(_実数), write_formatted_atom(_文字列形式,'%%%d.0f',[_文字列桁]), write_formatted_atom(_副文字列,_文字列形式,[_実数]),!. '整数から文字列'(_文字列桁,_整数,_定数) :- '整数・文字番号変換'(_整数,_文字番号ならび), 'ならびの長さ'(_文字番号ならび,_ならびの長さ), _不足桁 is _文字列桁 - _ならびの長さ, '頭部に零を詰める'(_不足桁,_文字番号ならび,_整形された文字番号ならび), '定数・文字番号変換'(_定数,_整形された文字番号ならび),!. 'ならびの長さ'(_ならび,_ならびの長さ) :- length(_ならび,_ならびの長さ). '実数'(_項) :- real(_項). '整数・文字番号変換'(_整数,_文字番号ならび) :- number(_整数,_文字番号ならび). '頭部に零を詰める'(0,_文字ならび,_文字ならび) :- !. '頭部に零を詰める'(_桁,[_|_未決定ならび],_文字ならび) :- _桁 < 0, !, _残り桁 is _桁 + 1, '頭部に零を詰める'(_残り桁,_未決定ならび,_文字ならび). '頭部に零を詰める'(_桁,_文字ならび,[48|_未決定ならび]) :- _残り桁 is _桁 - 1, '頭部に零を詰める'(_残り桁,_文字ならび,_未決定ならび). replace_all('',A,B,'') :- !. replace_all(String,S1,'',X) :- decompcons(String,StringL), decompcons(S1,S1L), replace_31(StringL,S1L,Y), concat_atom(Y,X),!. replace_all(String,S1,S2,X) :- decompcons(String,StringL), decompcons(S1,S1L), decompcons(S2,S2L), replace_41(StringL,S1L,S2L,Y), concat_atom(Y,X),!. replace_31([],_,[]) :- !. replace_31(L,L1,Y) :- append(L1,R,L), replace_31(R,L1,Y),!. replace_31([A|R],L1,[A|R2]) :- replace_31(R,L1,R2). replace_41([],_,_,[]) :- !. replace_41(L,L1,L2,R2) :- append(L1,R,L), replace_41(R,L1,L2,R3), append(L2,R3,R2),!. replace_41([A|R],L1,L2,[A|R2]) :- replace_41(R,L1,L2,R2). shs(Command,[],X) :- shs(Command,X), ! . shs(Command,List,X) :- tmpnam(TMPNAM), open(TMPNAM,write,Output1), wrln(Output1,List), close(Output1), concat_atom(['cat ',TMPNAM],Cat), system(Cat,user_input,Pipe), system(Command,Pipe,Output), findall(Y,(repeat , get_line(Output,Y) , (Y = end_of_file , (!) , fail ; true)),X), close(Pipe), close(Output), unlink(TMPNAM), ! . shs(Command,user_input,X) :- ( var(X) ; \+(var(X)), \+(X = pipe(_)) ), system(Command,user_input,Pipe), findall(S,(repeat , get_line(Pipe,S) , (S = end_of_file , (!) , fail ; true)),X), close(Pipe), ! . shs(Command,user_input,X) :- \+(var(X)), X = pipe(Pipe), system(Command,user_input,Pipe), ! . shs(Command,Input,Output) :- \+(var(Input)), Input = pipe(Pipe1), \+(var(Output)), Output = pipe(Pipe2), system(Command,Pipe1,Pipe2), close(Pipe1), ! . shs(Command,Input,X) :- \+(var(Input)), Input = pipe(Pipe1), ( var(X) ; \+(var(X)), \+(X = pipe(_)) ), system(Command,Pipe1,Pipe2), close(Pipe1), findall(S,(repeat , get_line(Pipe2,S) , (S = end_of_file , (!) , fail ; true)),X), close(Pipe2), ! . shs(Command,Input,X) :- \+(var(X)), X = pipe(Pipe), \+(var(Input)), \+(Input = pipe(_)), open(Input,read,InputStream), system(Command,InputStream,Pipe), close(InputStream),!. shs(Command,Input,X) :- ( var(X) ; \+(var(X)), \+(X = pipe(_)) ), \+(var(Input)), \+(Input = pipe(_)), open(Input,read,InputStream), system(Command,InputStream,Pipe), close(InputStream), findall(S,(repeat , get_line(Pipe,S) , (S = end_of_file , (!) , fail ; true)),X), close(Pipe),!. shs(Command,X) :- tmpnam(TMPNAM), open(TMPNAM,write,Output), system(Command,user_input,Output), close(Output), get_lines(TMPNAM,L), concat_atom(['rm -f ',TMPNAM],S), system(S), X = L,!. shs(Command_list,X) :- list(Command_list), concat_atom(Command_list,' ',Command), shs(Command,X),!. get_lines(File,Lines) :- get_chars(File,L), chars_lines(L,Lines),!. chars_lines([],[],[]) :- !. chars_lines(['\r'],[],[]) :- !. chars_lines(['\r',A|R],[],[A|R]) :- \+(A = '\n'),!. chars_lines(['\r','\n'|R],[],R) :- !. chars_lines(['\n'|R],[],R) :- !. chars_lines([A|R1],[A|R2],Z) :- chars_lines(R1,R2,Z). chars_lines([],[]) :- !. chars_lines(L,[A|R2]) :- chars_lines(L,U,R), concat_atom(U,A), chars_lines(R,R2). tmpnam(TMPNAM) :- tmpnam_c(A), tmpnam_c(B), tmpnam_c(C), tmpnam_c(D), tmpnam_c(E), tmpnam_c(F), concat_atom(['/tmp/file',A,B,C,D,E,F],TMPNAM),!. tmpnam_c(X) :- Y is (random mod 122) + 1, tmpnam_c_2(Y,X),!. tmpnam_c(X) :- tmpnam_c(X). tmpnam_c_2(X,X) :- X >= 97,X =< 121,!. tmpnam_c_2(X,X) :- X >= 65,X =< 90,!. tmpnam_c_2(X,X) :- X >= 48,X =< 57,!. tmpnam_c_2(Y,X) :- Y >= 0,Y =< 47, X is Y + 65, \+((X >= 92,X =< 96)). # [1] C++ # [2] 問題文(含コード&リンク): # (1) 演算子+,-,*,/と整数と浮動小数点数からなる計算式の文字列から # 計算木を作成せよ。計算木は次のようなc_tree構造体を使うとする。 # # struct c_tree # { # int type; # union { int n_value; double d_value; }; # c_tree *left, *right; # }; # typeは、'+', '-', '*', '/', 'n', 'd'のいずれか。 # # (2) 優先順位に注意してc_tree構造体からなる計算木から # 計算式の文字列を作成せよ。 文字列から式の生成(_文字列,_式) :- atom_chars(_文字列,Chars), 語彙の切り出し(Chars,_語彙ならび,OpsX,_), 結合度評価(OpsX,_語彙ならび,_式). 語彙の切り出し(L,X,OpsX,R) :- 語彙の切り出しの一(L1,Y,[],OpsX,R), 数値への変換(Y,X),!. 語彙の切り出しの一([],[],OpsX,OpsX,[]) :- !. 語彙の切り出しの一([')'|L1],[],OpsX,OpsX,L1) :- !. 語彙の切り出しの一(['('|L1],[L2|R2],OpsY,OpsX,R) :- 括弧構造の解析(L1,L2,OpsY,OpsX1,R1), 語彙の切り出しの一(R1,R2,OpsX1,OpsX,R). 語彙の切り出しの一(L1,[C|R2],OpsY,OpsX,R) :- is_op(A,B,C), member([A,B,C],OpsY), atom_chars(C,Chars), append(Chars,R1,L1), 語彙の切り出しの一(R1,R2,OpsY,OpsX,R). 語彙の切り出しの一([A|R1],R2,OpsY,OpsX,R) :- member(A,[' ','\t','\n']), 語彙の切り出しの一(R1,R2,OpsY,OpsX,R),!. 語彙の切り出しの一(L1,[C|R2],OpsY,OpsX,R) :- is_op(A,B,C), not(member([A,B,C],OpsY)), atom_chars(C,Chars), append(Chars,R1,L1), 語彙の切り出しの一(R1,R2,[[A,B,C]|OpsY],OpsX,R). 語彙の切り出しの一(L1,[W|R2],OpsY,OpsX,R) :- 語彙の切り出しの二(L1,G,L2), 数値表現への変換(G,W), 語彙の切り出しの一(L2,R2,OpsY,OpsX,R). 語彙の切り出しの二([],[],[]) :- !. 語彙の切り出しの二([')'|R],[],[')'|R]) :- !. 語彙の切り出しの二([' '|R],[],R) :- !. 語彙の切り出しの二(['\t'|R],[],R) :- !. 語彙の切り出しの二(L1,[],L1) :- is_op(A,B,C), atom_chars(C,Chars), append(Chars,R,L1),!. 語彙の切り出しの二([A|R1],[A|R2],R) :- 語彙の切り出しの二(R1,R2,R). 括弧構造の解析([')'|R],[],OpsX,OpsX,R). 括弧構造の解析(L,L1,OpsY,OpsX,R) :- 語彙の切り出しの一(L,L1,OpsY,OpsX,R). 結合度評価(_式に現れるop,_語彙ならび,_項) :- sort(_式に現れるop,_整列したop), reverse(_整列したop,_結合度順op), 結合度評価の一(_結合度順op,_語彙ならび,_項). 結合度評価の一(_,[A],A) :- atomic(A),!. 結合度評価の一([[_結合度,yfx,Op]|R1],_語彙ならび,P) :- append(L1,[Op|L2],_語彙ならび), 結合度評価の一([[_結合度,yfx,Op]|R1],L1,X1), 結合度評価の一([[_結合度,yfx,Op]|R1],L2,X2), functor(P,Op,2), arg(1,P,X1), arg(2,P,X2),!. 結合度評価の一([_|R1],_語彙ならび,P) :- 結合度評価の一(R1,_語彙ならび,P). 数値へ変換(L,_数値,R) :- 整数生成(L,_数値,R,),!. 数値へ変換(L,_数値,R) :- 浮動小数点数生成(L,_数値,R),!. 整数生成([A|R],N,R) :- atom_chars(A,L), length(L,Len), 整数生成の一(L,_,N),!. 整数生成の一([],1,0) :- !. 整数生成の一([A|R1],U,X) :- 文字整数変換(A,N), 整数生成の一(R1,U2,Y), U is U2 * 10, X is N * U2 + Y,!. 文字整数変換('0',0). 文字整数変換('1',1). 文字整数変換('2',2). 文字整数変換('3',3). 文字整数変換('4',4). 文字整数変換('5',5). 文字整数変換('6',6). 文字整数変換('7',7). 文字整数変換('8',8). 文字整数変換('9',9). 浮動小数点数生成([A,(+),C|R],F,R) :- sub_atom(A,_,1,0,e), concat_atom([A,(+),C],D), atom_chars(D,L), 浮動小数点数生成の一(L,_F),!. 浮動小数点数生成([A,(-),C|R],F,R) :- sub_atom(A,_,1,0,e), concat_atom([A,(+),C],D), atom_chars(D,L), 浮動小数点数生成の一(L,_,F),!. 浮動小数点数生成([A|R],F,R) :- atom_chars(A,L), 浮動小数点数生成の一(L,_,F). 浮動小数点数生成の一(L,'e+',F) :- append(L1,['e','+'|L2],L), append(L11,['.'|L12],L1), length(L12,Len1), 浮動小数点数の一(L1,'.',F1), F is F1 * (10 ^ Len1). 浮動小数点数生成の一(L,'e-',L11,L12,L2) :- append(L1,['e','+'|L2],L), append(L11,['.'|L12],L1), length(L12,Len1), 浮動小数点数の一(L1,'.',F1), F is F1 / (10 ^ Len1). 浮動小数点数生成の一(L,'.',F) :- append(L1,['.'|L2],L), length(L2,Len), append(L1,L2,L3), 整数生成の一(L3,_,N), F is N / ( 10 ^ Len),!. is_op(400,yfx,(+)). is_op(400,yfx,(-)). is_op(500,yfx,(*)). is_op(500,yfx,(*)). # [1] 授業単元: プログラミング # [2]問題文:以下の2つの構造体を用い,sample_data2.txt を単方向連結リストに # 保存するプログラム extra8 を作成せよ.item_list 中の item は各行中の数値を # 保持し,t_list 中の itemset は1行分のデータを保持するものとする. # struct item_list { # int item; # struct item_list *next; # }; # struct t_list { # struct item_list itemset; # struct t_list *next # }; # ソースファイルの名前は extra8.c とする.また,extra8.c には, # 生成した単方向連結リストの内容を標準出力に出力する関数 print_tlist を # 含むものとし,以下の実行例のように print_tlist により各行の内容を出力 # するものとする. # なお,入力ファイル名はコマンドライン引数で指定するものとし,入力ファイルが # オープンできなかった場合の処理も含めること.また,プログラム自身を除く # 引数の数が0個,もしくは2個以上の場合は,何もせず適切なメッセージを出力して # 終了するものとする. # (実行例1) # > .\extra8 sample_data2.txt # Itemset: 1,3,9,13,23,25,34,36 # Itemset: 2,3,9,14,23,26,34,36,39,40,52,55,59 extra8 :- ユーザパラメータの取得(_ファイル名), get_lines(_ファイル名,Lines), findall(Item_list,(member(Line,Lines),split(Line,[','],Item_list)),T_list), assertz(t_list(T_list)). print_tlist :- t_list(T_list), member(Item_list,T_list), print_tlist_format(Item_list,Format), write_formatted(Format,Item_list), fail. print_tlist. print_tlist_format(Item_list,Format) :- length(Item_list,Len), length(L,Len), all(L,'%t'), concat_atom(L,',',S), concat_atom(['Items : ,S,'\n'],Format),!. ユーザパラメータの取得(_ファイル名) :- user_parameters([_ファイル名]),!. ユーザパラメータの取得(_) :- error_tell(Output), write(Output,'パラメータで適切なファイル名が与えられませんでした\n'), errot_told(Output). # [1] 授業単元:プログラミング序論演習 # [2] 問題文(含コード&リンク): CUI上で動くメーラーを作れ :- op(850,fx,rm). rm(File) :- concat_atom(['rm -f ',File],S), system(S),!. % *** user: mail / 1 *** mail(max) :- 'メール数の確認'(N), mail(N),!. mail(0) :- reconsult('listing/最終メール番号#1.pro'), 'メール数の確認'(N), '最終メール番号'(N2), M is N2 - N, ( M < 0, mail(M), retract('最終メール番号'(_)), asserta('最終メール番号'(N)), '最終メール番号の保存' ; M = 0 ; M > 0, retract('最終メール番号'(_)), asserta('最終メール番号'(N)), '最終メール番号の保存' ), !. mail(0) :- !. mail(N) :- N < 0, !, 'メール数の確認'(Max), rm tempmsg, abolish('受信先アドレス' / 1), reconsult('listing/最終メール番号#1.pro'), for(-1,M,N), open(tempmsg,append,Output), M2 is Max + M + 1, write(Output,'\n\n'), '返信入力表示'(Output,M2), close(Output), M = N, exists(tempmsg,read), cat tempmsg, '最終メール番号の保存', !. mail(N) :- N > 0, rm tempmsg, rm tempmsg2, rm tempmsg3, myhostname(Myhostname), 'メールを読む'(N), ! 'cat tempmsg | nkf -We', write('\n'), !. mail(N) :- \+(N = 0), exists(tempmsg,read), ! 'cat tempmsg | nkf -We', write('\n'), !. % *** user: mail10 / 1 *** mail10(N) :- integer(N), N < 0, 'メールの数を調べる'(Max), S is Max + N + 1, for(S,M,Max), write_formatted('\n#%t\n',[M]), mail10(M), M = Max, !. mail10(S - E) :- for(S,N,E), write_formatted('\n#%t\n',[N]), mail10(N), N = E, !. mail10(N) :- integer(N), \+(N = 0), N > 0, rm tempmsg, rm tempmsg2, rm tempmsg3, myhostname(Myhostname), 'メールを読む'(N), shs('cat tempmsg | nkf -We',L), member(A,L,R2), subatomic(A,1,7,'Status:'), for(1,M,10), list_nth(M,R2,X), write_formatted('%t\n',[X]), M = 10, !. % *** user: 'メール数の確認' / 2 *** 'メール数の確認'(_メールボックス,_メール数) :- 'メールサーバー'(_メールサーバー), 'クライアント通信確立'(_メールサーバー,110,_差し込み口), open(_差し込み口,read,_入力), open(_差し込み口,write,_出力), 'メールユーザ名の送付'(_入力,_出力), 'メールパスワードの送付'(_入力,_出力), repeat, stream_reads(_入力,C), split(C,[' '],L), list_nth(4,L,_メール数), \+(_メール数 = 'lock.'), write(_出力,'QUIT\r\n'), flush_output(_出力), close(_入力), close(_出力), socket_shutdown(_差し込み口), !. % *** user: 'メール数の確認' / 1 *** 'メール数の確認'(_メール数) :- 'メールサーバー'(_メールサーバー), 'クライアント通信確立'(_メールサーバー,110,_差し込み口), open(_差し込み口,read,_入力), open(_差し込み口,write,_出力), 'メールユーザ名の送付'(_入力,_出力), 'メールパスワードの送付'(_入力,_出力), repeat, stream_read(_入力,C), split(C,[' '],L), list_nth(4,L,_メール数), \+(_メール数 = 'lock.'), write(_出力,'QUIT\r\n'), flush_output(_出力), close(_入力), close(_出力), socket_shutdown(_差し込み口), !. % *** user: 'メールの数を調べる' / 1 *** 'メールの数を調べる'(_メールの数) :- 'メールサーバ'(_メールサーバ), 'クライアント通信確立'(_メールサーバ,110,_差し込み口), ( error_protect('私書箱'(_私書箱),fail) ; \+(error_protect('私書箱'(_),fail)), _私書箱 = takao ), open(_差し込み口,read,_入力), open(_差し込み口,write,_出力), stream_reads(_入力,A), write_formatted(_出力,'USER %t\r\n',[_私書箱]), flush_output(_出力), 'メールパスワードの送付'(_メールボックス,_入力,_出力), repeat, stream_reads(_入力,C), split(C,[' '],L), list_nth(4,L,_メールの数), \+(_メールの数 = 'lock.'), write(_出力,'QUIT\r\n'), flush_output(_出力), close(_入力), close(_出力), socket_shutdown(_差し込み口), ! . % *** user: 'メールを読む' / 6 *** 'メールを読む'(_メールボックス,N,A,B,C,X) :- integer(N), N > 0, 'メールサーバー'(_メールサーバー), 'クライアント通信確立'(_メールサーバー,110,_差し込み口), open(_差し込み口,read,_入力), open(_差し込み口,write,_出力), 'メールユーザ名の送付'(_メールボックス,_入力,_出力), 'メールパスワードの送付'(_メールボックス,_入力,_出力), stream_reads(_入力,C), write_formatted(_出力,'RETR %t\r\n',[N]), flush_output(_出力), pop3_message_get(_入力,X), write(_出力,'QUIT\r\n'), flush_output(_出力), stream_reads(_入力,D), close(_入力), close(_出力), socket_shutdown(_差し込み口), !. % *** user: 'メールを読む' / 5 *** 'メールを読む'(L,A,B,C,X) :- list(L), 'メールサーバー'(_メールサーバー), 'クライアント通信確立'(_メールサーバー,110,_差し込み口), ( error_protect('私書箱'(_私書箱),fail) ; \+(error_protect('私書箱'(_私書箱),fail)), _私書箱 = default ), open(_差し込み口,read,_入力,A), open(_差し込み口,write,_出力,B), 'メールユーザ名の送付'(_入力,_出力), 'メールパスワードの送付'(_入力,_出力), stream_reads(_入力,C), ( member(N,L), write_formatted(_出力,'RETR %t\r\n',[N]), flush_output(_出力), pop3_message_get(_入力,X), write(_出力,'QUIT\r\n'), flush_output(_出力), fail ; true ), stream_reads(_入力,D), close(_入力), close(_出力), socket_shutdown(_差し込み口), !. 'メールを読む'(N,A,B,C,X) :- integer(N), N > 0, 'メールサーバー'(_メールサーバー), 'クライアント通信確立'(_メールサーバー,110,_差し込み口), ( error_protect('私書箱'(_私書箱),fail) ; \+(error_protect('私書箱'(_私書箱),fail)), _私書箱 = default ), open(_差し込み口,read,_入力), open(_差し込み口,write,_出力), 'メールユーザ名の送付'(_入力,_出力), 'メールパスワードの送付'(_入力,_出力), pop3_message_get(_入力,X), write(_出力,'QUIT\r\n'), flush_output(_出力), stream_reads(_入力,D), close(_入力), close(_出力), socket_shutdown(_差し込み口), !. % *** user: 'メールを読む' / 2 *** 'メールを読む'(N,X) :- var(X), integer(N), N =< 0, 'メール数の確認'(_メール数), M is _メール数 + N + 1, 'メールを読む'(M,_,_,_,X), concat_atom(X,'\n',_文), open(tempmsg,append,_出力2), write_formatted(_出力2,'%t',[_文]), flush_output(_出力2), close(_出力2), !. 'メールを読む'(N,FILE) :- \+(var(FILE)), integer(N), N =< 0, 'メールサーバアドレス'(_メールサーバアドレス), 'クライアント通信確立'(_メールサーバアドレス,110,_差し込み口), ( FILE = '', tmpnam(FILE_1) ; \+(FILE = ''), FILE = FILE_1 ), open(_差し込み口,read,_入力), open(_差し込み口,write,_出力), 'メールを読むの一'(N,FILE_1,_入力,_出力), close(_入力), close(_出力), socket_shutdown(_差し込み口), !. % *** user: 'メールを読むの一' / 4 *** 'メールを読むの一'(N,FILE,_入力,_出力) :- 'メールユーザ名の送付'(_入力,_出力), 'メールパスワードの送付'(_入力,_出力), 'メール数の取得'(_入力,_メール数), _限界数 is _メール数 + N + 1, 'メールの取得'(_入力,_出力,FILE,_メール数,_限界数), 'メールサーバを切り離す'(_入力,_出力), !. % *** user: 'メールの取得' / 5 *** 'メールの取得'(_入力,_出力,FILE,Max,M) :- open(FILE,append,_出力2), for(Max,U,M), write_formatted(_出力,'RETR %t\r\n',[U]), flush_output(_出力), pop3_message_rw(_入力,_出力2), write(_出力2,'.\n'), U = M, close(_出力2), !. % *** user: pop3_message_rw / 2 *** pop3_message_rw(Input,Output) :- repeat, stream_reads(Input,S), replace_all(S,'\r','',S2), ( subatomic(S,1,1,'.') ; S = end_of_file ; S2 = [], write(Output,'\n'), fail ; \+(S2 = []), write_formatted(Output,'%t\n',[S2]), fail ),!. % *** user: pop3_message_get / 2 *** pop3_message_get(A,B) :- findall(E,(repeat , stream_reads(A,C) , replace_all(C,'\r','',D) , (sub_atom(C,0,1,'.') , (!) , fail ; C = end_of_file , (!) , fail ; D = [] , E = '\n' ; not D = [] , E = D)),B),!. % *** user: 'メール数の取得' / 2 *** 'メール数の取得'(_入力,_メール数) :- stream_reads(_入力,C), split(C,[' '],L), list_nth(4,L,_メール数). % *** user: 'メールパスワードの送付' / 3 *** 'メールパスワードの送付'(_メールボックス,_入力,_出力,B) :- メールパスワード(_メールボックス,_メールパスワード), stream_reads(_入力,B), write_formatted(_出力,'PASS %t\r\n',[_メールパスワード]), flush_output(_出力). % *** user: 'メールパスワードの送付' / 2 *** 'メールパスワードの送付'(_入力,_出力) :- メールパスワード(_メールパスワード), stream_reads(_入力,B), write_formatted(_出力,'PASS %t\r\n',[_メールパスワード]), flush_output(_出力). % *** user: 'メールユーザ名の送付' / 3 *** 'メールユーザ名の送付'(_メールボックス,_入力,_出力,A) :- メールユーザ(_メールボックス,_メールユーザ), stream_reads(_入力,A), write_formatted(_出力,'USER %t\r\n',[_メールボックス]), flush_output(_出力). 'メールユーザ名の送付'(_入力,_出力) :- メールユーザ(_メールユーザ), stream_reads(_入力,A), write_formatted(_出力,'USER %t\r\n',[_メールユーザ]), flush_output(_出力). % *** user: 'メールサーバを切り離す' / 2 *** 'メールサーバを切り離す'(_入力,_出力) :- write(_出力,'QUIT\r\n'), flush_output(_出力), stream_reads(_入力,D),!. smtp_iso(From,To,Subject,'文'(_文)) :- tmpnam(TMPNAM), tmpnam(TMPNAM2), open(TMPNAM,write,Output), write_formatted(Output,'%t\n',[_文]), close(Output), concat(['nkf -e -j ',TMPNAM,' >',TMPNAM2],S), system(S), smtp_iso(Input,Output,From,To,Subject,TMPNAM2,_診断), unlink(TMPNAM), unlink(TMPNAM2),!. smtp_iso(From,To,Subject,File) :- \+(list(File)), tmpnam(TMPFILE), concat(['nkf -e -j ',File,' >',TMPFILE],S1), base64(Subject,Subject64), sprintf('=?iso-2022-jp?B?%t?=',[Subject64],MimeSubject), smtp_server(Host), smtp_iso(Host,From,To,MimeSubject,TMPFILE,_診断), unlink(TMPFILE),!. smtp_iso(From,To,Subject,Files) :- list(Files), smtp_plus(Files,File1,Boundary), tmpnam(TMPFILE), concat(['cat ',File1,' | nkf -e -j >',TMPFILE],S1), base64(Subject,Subject64), sprintf('=?iso-2022-jp?B?%t?=',[Subject64],MimeSubject), smtp_server(Host), stmp_iso(Host,From,To,MimeSubject,TMPFILE,Boundary,_診断),!. % *** user: smtp_iso / 2 *** smtp_iso(To,(?- _質問)) :- tmpnam(TMPNAM), tell(TMPNAM), write_formatted('%q.\n',[(?- _質問)]), told, smtp_iso(To,'prolog@takao.ozaki.name','質問',TMPNAM), ! . % *** user: smtp_iso / 6 *** smtp_iso(_送信元,_送信先,MimeSubject,File,Data,_診断) :- 'メールサーバー'(_メールサーバー), 'クライアント通信確立'(_メールサーバー,38,_差し込み口), open(_差し込み口,read,_入力), open(_差し込み口,write,_出力), 'メールユーザ名の送付'(_メールボックス,_入力,_出力), 'メールパスワードの送付'(_メールボックス,_入力,_出力), send_helo(Input,Output,Domain), send_from_to(Input,Output,_送信元,_送信先), send_data(Input,Output,Subject,_送信元,_送信先,Data), send_quit(Input,Output), shutdown(_差し込み口),!. send_helo(Input,Output,Domain) :- write_formatted(Output,'HELO %t\r\n',[Domain]), read(Input,_), write_formatted(Output,'EHLO %t\r\n',[Domain]), read(Input,_),!. send_from_to(Input,Output,From,To) :- write_formatted(Output,'MAIL FROM: %t\r\n',[From]), stream_read(Input,_), write_formatted(Output,'RCPT TO: %t\r\n',[To]), stream_read(Input,_),!. send_data(Input,Output,Subject,From,To,Data) :- write_formatted('DATA\r\n',[]), stream_read(Input,_), write_formatted(Output,'Subject: %t\r\nFrom: %t\r\nTo: %t\r\n\r\n',[Subject,From,To]), write_formatted(Output,'%t',[Data]), stream_reads(Input,_),!. send_quit(Input,Output) :- write_formatted(Output,'QUIT\r\n'), stream_reads(Input,_),!. % *** user: smtp_plus / 3 *** smtp_plus(FileList,File,Boundary) :- FileList = [File1|R], tmpnam(A1), tmpnam(A2), tmpnam(A3), Boundary = '------------000402050407020604050408', smtp_plus_base64_encode(R,FileList2), tmpnam(File), tell(File), write('This is a multi-part message in MIME format.\n'), smtp_plus_1(Boundary,File1), smtp_plus_2(Boundary,FileList2,R), told,!. % *** user: smtp_plus_1 / 2 *** smtp_plus_1(Boundary,File) :- write_formatted('--%t\n',[Boundary]), write('Content-Type: text/plain; charset=EUC-JP\n'), write('Content-Transfer-Encoding: 8bit\n\n'), open(File,read,Fp), repeat, get_code(Fp,X), ( X = -1 ; name(Y,[X]), write_formatted('%t',[Y]), fail ), write('\n'), write('\n'), close(Fp),!. % *** user: smtp_plus_2 / 3 *** smtp_plus_2(Boundary,[],_) :- write_formatted('\n--%t--\n',[Boundary]), write('.\n\n'),!. smtp_plus_2(Boundary,[File|R],[File_1|R2]) :- smtp_file_suffix(File,Suffix), smtp_file_mime(Suffix,Mime), write_formatted('\n--%t\n',[Boundary]), write_formatted('Content-Type: %t;\n',[Mime]), write_formatted(' name="%t"\n',[File_1]), write('Content-Transfer-Encoding: base64\n'), write('Content-Disposition: inline;\n'), write_formatted(' filename="%t"\n\n',[File_1]), open(File,read,Fp), repeat, get_code(Fp,X), ( X = -1 ; name(Y,[X]), write_formatted('%t',[Y]), fail ), close(Fp), smtp_plus_2(Boundary,R,R2). % *** user: smtp_plus_2 / 2 *** smtp_plus_2(_,[]) :- write('.\n\n'),!. smtp_plus_2(Boundary,[File|R]) :- smtp_file_suffix(File,Suffix), smtp_file_mime(Suffix,Mime), write_formatted('--%t\n',[Boundary]), write_formatted('Content-Type: %t;\n',[Mime]), write_formatted(' name="%t"\n',[File]), write('Content-Transfer-Encoding: base64\n'), write('Content-Disposition: inline;\n'), write_formatted(' filename="%t"\n\n',[File]), open(File,read,Fp), repeat, get_code(Fp,X), ( X = -1 ; name(Y,[X]), write_formatted('%t',[Y]), fail ), close(Fp), write_formatted('\n--%t--\n',[Boundary]), smtp_plus_2(Boundary,R). % *** user: smtp_plus / 2 *** smtp_plus(FileList,File) :- FileList = [File1|R], tmpnam(A1), tmpnam(A2), tmpnam(A3), concat([--------------------,A1,A2,A3],AX), replace_all(AX,'/tmp/','',Boundary), smtp_plus_base64_encode(R,FileList2), tmpnam(File), tell(File), write('Content-Type: multipart/mixed;\n'), write_formatted(' boundary="%t"\n\n',[Boundary]), write('This is multi-part message in MIME format.\n'), smtp_plus_1(Boundary,File1), smtp_plus_2(Boundary,FileList2), told, !. % *** user: smtp_file_mime / 2 *** smtp_file_mime(jpg,'image/jpeg') :- !. smtp_file_mime(jpeg,'image/jpeg') :- !. smtp_file_mime(txt,'text/plain') :- !. smtp_file_mime(xls,xls) :- !. smtp_file_mime(csv,csv) :- !. smtp_file_mime(ps,'application/postscript') :- !. smtp_file_mime(pdf,'application/postscript') :- !. smtp_file_mime(_,'text/plain') :- !. % *** user: smtp_file_suffix / 2 *** smtp_file_suffix(File,Suffix) :- decompcons(File,L), ( smtp_file_suffix_2(L,L2), concat(L2,Suffix) ; \+(smtp_file_suffix_2(L,_)), Suffix = txt ),!. % *** user: smtp_file_suffix_2 / 2 *** smtp_file_suffix_2(['.'|R],R) :- !. smtp_file_suffix_2([_|R1],R2) :- smtp_file_suffix_2(R1,R2). % *** user: smtp_plus_base64_encode / 2 *** smtp_plus_base64_encode([],[]) :-!. smtp_plus_base64_encode([File1|R1],[File2|R2]) :- base64_file_encode(File1,File2), smtp_plus_base64_encode(R1,R2). % *** user: 'クライアント通信確立' / 3 *** 'クライアント通信確立'(_ホスト,_サービス,_差し込み口) :- '定数'(_サービス), !, net_service(_サービス,tcp,_舫), socket(internet,stream,_差し込み口), host_addr(_ホスト,Addr), socket_connect(_差し込み口,Addr : _舫). 'クライアント通信確立'(_ホスト,_舫,_差し込み口) :- '整数'(_舫), !, socket(internet,stream,_差し込み口), socket_connect(_差し込み口,_ホスト : _舫). % *** user: stream_reads / 2 *** stream_reads(Stream,S) :- error_protect(get_code(Stream,X_4),X_4 = -1), stream_reads1(Stream,X_4,L_4,[]), atom_codes(S,L_4), ! . stream_reads1(Stream,10,[],[]) :- !. stream_reads1(Stream,10,L,L2) :- !, reverse(L2,L). stream_reads1(Stream,10,L_4,[13|L1_4]) :- !, reverse(L1_4,L_4). stream_reads1(Stream,31,L_4,L1_4) :- !, reverse(L1_4,L_4). stream_reads1(Stream,-1,L,[A|L1]) :- reverse([A|L1],L). stream_reads1(Stream,-1,[101,110,100,95,111,102,95,102,105,108,101],L2) :- !. stream_reads1(Stream,X_4,L_4,L1_4) :- error_protect(get_code(Stream,Y_4),Y_4 = -1), !, stream_reads1(Stream,Y_4,L_4,[X_4|L1_4]). base64g(Atom,X) :- replace_all(Atom,' ','',Atom2), base64(X,Atom2) . base64s(Atom,X) :- \+(var(Atom)), name2(Atom,L1), base64_2(L1,Y), concat_atom(Y,X) . base64(Atom,X) :- \+(var(Atom)), atom_codes(Atom,L1), kjtoeuc(CodeList,L1), base64_2(CodeList,Y), concat_atom(Y,X),!. base64(X,Atom) :- var(X), atom_chars(Atom,List), base64_1(Y,List), concat_atom(Y,Y2), atom_codes(Y2,Codes), kjtoeuc(Codes,Y3), atom_codes(X,Y3),!. base64_1([],[]) :- !. base64_1(X,[A,B,C,=]) :- base64_table(A1,A), base64_table(B1,B), base64_table(C1,C), append(A1,B1,L1), append(L1,C1,L), base64_a2b(Y,L), base64_1(Z,R), append(Y,Z,X). base64_1(X,[A,B,=,=]) :- base64_table(A1,A), base64_table(B1,B), append(A1,B1,L), base64_a2b(Y,L), base64_1(Z,R), append(Y,Z,X). base64_1(X,[A,B,C,D|R]) :- base64_table(A1,A), base64_table(B1,B), base64_table(C1,C), base64_table(D1,D), append(A1,B1,L1), append(L1,C1,L2), append(L2,D1,L), base64_a2b(Y,L), base64_1(Z,R), append(Y,Z,X). base64_table([0,0,0,0,0,0],'A'). base64_table([0,0,0,0,0,1],'B'). base64_table([0,0,0,0,1,0],'C'). base64_table([0,0,0,0,1,1],'D'). base64_table([0,0,0,1,0,0],'E'). base64_table([0,0,0,1,0,1],'F'). base64_table([0,0,0,1,1,0],'G'). base64_table([0,0,0,1,1,1],'H'). base64_table([0,0,1,0,0,0],'I'). base64_table([0,0,1,0,0,1],'J'). base64_table([0,0,1,0,1,0],'K'). base64_table([0,0,1,0,1,1],'L'). base64_table([0,0,1,1,0,0],'M'). base64_table([0,0,1,1,0,1],'N'). base64_table([0,0,1,1,1,0],'O'). base64_table([0,0,1,1,1,1],'P'). base64_table([0,1,0,0,0,0],'Q'). base64_table([0,1,0,0,0,1],'R'). base64_table([0,1,0,0,1,0],'S'). base64_table([0,1,0,0,1,1],'T'). base64_table([0,1,0,1,0,0],'U'). base64_table([0,1,0,1,0,1],'V'). base64_table([0,1,0,1,1,0],'W'). base64_table([0,1,0,1,1,1],'X'). base64_table([0,1,1,0,0,0],'Y'). base64_table([0,1,1,0,0,1],'Z'). base64_table([0,1,1,0,1,0],a). base64_table([0,1,1,0,1,1],b). base64_table([0,1,1,1,0,0],c). base64_table([0,1,1,1,0,1],d). base64_table([0,1,1,1,1,0],e). base64_table([0,1,1,1,1,1],f). base64_table([1,0,0,0,0,0],g). base64_table([1,0,0,0,0,1],h). base64_table([1,0,0,0,1,0],i). base64_table([1,0,0,0,1,1],j). base64_table([1,0,0,1,0,0],k). base64_table([1,0,0,1,0,1],l). base64_table([1,0,0,1,1,0],m). base64_table([1,0,0,1,1,1],n). base64_table([1,0,1,0,0,0],o). base64_table([1,0,1,0,0,1],p). base64_table([1,0,1,0,1,0],q). base64_table([1,0,1,0,1,1],r). base64_table([1,0,1,1,0,0],s). base64_table([1,0,1,1,0,1],t). base64_table([1,0,1,1,1,0],u). base64_table([1,0,1,1,1,1],v). base64_table([1,1,0,0,0,0],w). base64_table([1,1,0,0,0,1],x). base64_table([1,1,0,0,1,0],y). base64_table([1,1,0,0,1,1],z). base64_table([1,1,0,1,0,0],'0'). base64_table([1,1,0,1,0,1],'1'). base64_table([1,1,0,1,1,0],'2'). base64_table([1,1,0,1,1,1],'3'). base64_table([1,1,1,0,0,0],'4'). base64_table([1,1,1,0,0,1],'5'). base64_table([1,1,1,0,1,0],'6'). base64_table([1,1,1,0,1,1],'7'). base64_table([1,1,1,1,0,0],'8'). base64_table([1,1,1,1,0,1],'9'). base64_table([1,1,1,1,1,0],+). base64_table([1,1,1,1,1,1],/). base64_table([A,B,C,D],X) :- base64_table([A,B,C,D,0,0],X). base64_table([A,B],X) :- base64_table([A,B,0,0,0,0],X). base64_a2b([],[]). base64_a2b([Atom|R],[A,B,C,D,E,F,G,H|R2]) :- atob(Atom,[A,B,C,D,E,F,G,H]), base64_a2b(R,R2). base64_2([],[]) :- !. base64_2([A,B,C|R],X) :- base64_i2b([A,B,C],L), base64_3(L,Z), base64_2(R,R2), append(Z,R2,X),!. base64_2([A,B],X) :- base64_i2b([A,B],L), base64_3(L,Z), append(Z,[=],X),!. base64_2([Y],X) :- base64_i2b([Y],L), base64_3(L,Z), append(Z,[=,=],X),!. base64_3([A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X],[Z1,Z2,Z3,Z4]) :- base64_table([A,B,C,D,E,F],Z1), base64_table([G,H,I,J,K,L],Z2), base64_table([M,N,O,P,Q,R],Z3), base64_table([S,T,U,V,W,X],Z4),!. base64_3([A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P],[Z1,Z2,Z3]) :- base64_table([A,B,C,D,E,F],Z1), base64_table([G,H,I,J,K,L],Z2), base64_table([M,N,O,P],Z3),!. base64_3([A,B,C,D,E,F,G,H],[Z1,Z2]) :- base64_table([A,B,C,D,E,F],Z1), base64_table([G,H],Z2). base64_i2b([],[]) :- !. base64_i2b([X|R],[1,B,C,D,E,F,G,H|R2]) :- var(X), itob(X,[1,B,C,D,E,F,G,H]), base64_i2b(R,R2),!. base64_i2b([X|R],[0,B,C,D,E,F,G,H|R2]) :- var(X), itob(U,[0,B,C,D,E,F,G,H]), X is U - 128, base64_i2b(R,R2),!. base64_i2b([Code|R],[A,B,C,D,E,F,G,H|R2]) :- itob(Code,[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,A,B,C,D,E,F,G,H]), base64_i2b(R,R2) . 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). itob(N,L) :- itob(N,[],L1), length(L1,Len), Len2 is 8 - Len, length(L2,Len2), all(L2,0), append(L2,L1,L). itob(0,X,X) :- !. itob(N,Y,X) :- M is N mod 2, N2 is N // 2, itob(N2,[M|Y],X). # 【 課題 】 # 以下のURLから正規表現を用いてキーワードの部分のみ抽出する # プログラムを作成せよ。 # % Prolog は正規表現をサポートしないのでここでは汎用検索述語sub_atom/10を % 使ってみる。 t571(URL,_キーワード) :- sub_atom(URL,_,_,_,_,'?q=',G,_,_,_), sub_atom(G,_,_,_,_キーワード,'&',_,_,_,_),!. % ユーティリティ述語 sub_atom/10 の提案 % % A .. 文字列 (atom) % S .. 検索文字列開始変位 (integer) % L .. 検索文字列の長さ (integer) % R .. 残り長さ (integer) % H .. 検索文字列より前側の文字列 (atom) % X .. 検索文字列 (atom) % T .. 検索文字列より後の残り文字列 (atom) % HL .. 検索文字列より前側の文字ならび (chars) % XL .. 検索文字列文字ならび (chars) % TL .. 検索文字列より後の残り文字ならび (chars) % A がvarである時はH-HL,X-XL,T-TLの3組の中にvar-varの組があってはなりません。 sub_atom(A,S,L,R,H,X,T,HL,XL,TL) :- atom(A), !, sub_atom(A,S,L,R,X), sub_atom(A,0,S,_,H), N is S + L, sub_atom(A,N,R,_,T), atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL). sub_atom(A,S,L,R,H,X,T,HL,XL,TL) :- var(A), !, atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL), length(HL,S), length(XL,L), length(TL,R), concat_atom([H,X,T],A), sub_atom(A,S,L,R,H,X,T,HL,XL,TL). # [1] C言語 # [2] 入力された英字文字列(a~z,A-Z)に、どの文字がいくつ入っているかを # 調べるプログラムcount_char.cを作成せよ。 # # 実行例 # String: cbbbAcAccZ # A: ** # Z: * # b: *** # c: **** # % t583(_文字列) :- atom_chars(_文字列,Chars), t583_1(Chars,[],QL), member([U,Q-[]],QL), concat_atom(Q,S), write_formatted('%t: %t\n',[U,S]), fail. t583(_). t583_1([],X,X). t583_1([A|R],QL,X) :- t583_2(A,QL,QL2), t583_1(R,QL2,X). t583_2(A,[],[[A,QA]]) :- 新しいキューを作る(Q), キューに要素を追加する('*',Q,QA),!. t583_2(A,[[A,QA]|R],[[A,QB],R]) :- キューに要素を追加する('*',QA,QB),!. t583_2(A,[U|R1],[U|R2]) :- t583_2(A,R1,R2). 新しいキューを作る(X-X). キューは空である(X-Y) :- X == Y. キューに要素を追加する(_要素,X-[_要素|Y],X-Y). # [2] 問題文(含コード&リンク): POSデータ解析システムを作ってみよう # K氏は、3つのコンビニエンスストア(X店、Y店、Z店)をチェーン店に持つオーナーです。コンビ # ニエンスストアの経営において、売れ筋商品と死に筋商品の的確な把握は死活問題に直結する重要な業務 # です。そこでK氏は、チェーン店に、毎日どんな商品がどれくらい売れたのかといった販売情報を、CS # Vファイルとして送るように指示していました。しかし、送られてくるデータファイルは膨大であり、そ # れらを統合して、全店を通して最も売れた商品はどれで、何が売れていないかを把握することは困難でし # た。つまり、送られてくるデータを適切に活用できないでいました。そこで、K氏はあなたに、こういっ # たことを解決するシステム(POSデータ解析システム)を開発するように頼みました。K氏は、毎日送 # られてくるX、Y、Z店の個別の販売情報を合計した一括データを入手したいそうです。 # <第1ステップ> # まず、あなたは、各店舗から送ってもらうCSV ファイル名を以下のようにするよう、お願いしました。 # X店=data-x.csv Y店=data-y.csv Z店=data-z.csv # また、商品名(全100 品種)は必ず以下の形式で入力するように指示しました。 # 「 Item-00 」から「 Item-99 」までの半角7文字 # さらに、各店から送られてくるレコードのフィールドは、以下の項目にして、売上時刻順に並べてもら # うよう、お願いしました。以下のようなCSV ファイルが送られてくることになります。 # 売上時刻 商品名 売上個数 # 0:12,Item-42,2 # 0:12,Item-03,1 # 0:49,Item-92,3 # ・ # ・ # 23:38,Item-80,1 # また、毎日送られてくるCSVファイルとは別に、単価情報が格納された tanka.csv ファイルを作りま # した。このファイルのレコードのフィールドは、次のようになっていて、商品名順に並んでいます。 # 商品名 単価 # Item-00,150 # Item-01,120 # ・ # Item-99,230 # 最後に、K 氏に提供する統合ファイル(data-all.csv)のレコードの中身は以下のようにして、商品名 # の小さい順にレコードを作りました。 # 商品名 単価 総売上個数 売上高 # ここで、大事なことは、売上情報を統合することです。例えば、単価150 円のItem-23 という商品が、 # X 店では15 個、Y 店では、25 個、Z 店では10 個売れたとすると、以下のようになっているということです。 # Item-23,150,50,7500 # また、全店舗を通して1 個も売れなかった商品情報は載せないことにしました。 # # # <第2ステップ> # K氏から、data-all.csv のレコードの中身を以下のように変更し、レコードを並べる順番も、これまで # の商品名順ではなく、売上順位の高い順にして欲しいと要望がありました。 # 売上順位 商品名 単価 総売上個数 売上高 全売上高にしめる割合(%) # 全売上高とは、全商品の売上高の合計です。全売上高にしめる割合の有効数字は4 桁(10%未満の場合は # 3 桁)にします。例えば、全売上高が100 万円で、該当商品の売上高が12,345 円だとすると、割合(%) # は 1.23 となります。 # 売上順位は、同じ売上高の場合は同一順位とします。 # 例えば、data-all.csv ファイルは次のようになります。 # 1,Item-23,150,50,7500,10.71 # 2,Item-52,240,30,7200,10.28 # 2,Item-53,360,20,7200,10.28 # 4,Item-14,230,30,6900,9.85 # ・ t589_1 :- 基礎情報を得る(TL,XL,YL,ZL), 3つのコンビニエンスストアの情報を集約する第1ステップ(XL,YL,ZL,TL,_集約ならび), _集約情報から統合ファイル出力(_集約ならび). t589_2 :- 基礎情報を得る(TL,XL,YL,ZL), 3つのコンビニエンスストアの情報を集約する第2ステップ(XL,YL,ZL,TL,_集約ならび), 集約情報から金額順位順統合ファイル出力(_集約ならび). 基礎情報を得る(TL,XL,YL,ZL) :- get_split_lines('tanka.csv',[',',' '],TL), get_split_lines('data-x.csv',[',',' '],XL), get_split_lines('data-y.csv',[',',' '],YL), get_split_lines('data-z.csv',[',',' '],ZL),!. '3つのコンビニエンスストアの情報を集約する第1ステップ'(XL,YL,ZL,TL,_集約ならび) :- append(XL,YL,ZL,L1), 売上の存在する商品名を得る(L1,_商品名ならび), findall([_商品名,_単価,_数量,_金額], ( member(_商品名,_商品名ならび), member([_商品名,_単価],TL), 商品合計数量を得る(_商品名,_合計数量), _金額 is _合計数量 * _単価), _集約ならび). '3つのコンビニエンスストアの情報を集約する第2ステップ'(XL,YL,ZL,TL,_集約ならび) :- append(XL,YL,ZL,L1), 売上の存在する商品名を得る(L1,_商品名ならび), findall([_商品名,_単価,_数量,_金額], ( member(_商品名,_商品名ならび), member([_商品名,_単価],TL), 商品合計数量を得る(_商品名,_合計数量), _金額 is _合計数量 * _単価), _集約ならびの一), rsort(_集約ならびの一,_金額合計で整列した集約ならび), 総売上金額を得る(_集約ならびの一,_総売上金額), 順位売上比率付き集約ならび(1,1,_金額合計で整列した集約ならび,_集約ならび). 総売上金額を得る(_集約ならびの一,_総売上金額) :- findsum(_金額合計,member([_金額合計,_,_,_],_集約ならびの一),_総売上金額). 順位売上比率付き集約ならび(_,_,_,[],[]) :- !. 順位売上比率付き集約ならび(M,N,_総売上金額,[[A,B,C,D],[A|R2]|R3],[[M,B,C,D,A,E]|R4]) :- E is A / _総売上金額, N2 is N + 1, 順位売上比率付き集約ならび(M,N2,[[A|R2]|R3],R4). 順位売上比率付き集約ならび(M,N,_総売上金額,[[A,B,C,D]|R3],[[M,B,C,D,A,E]|R4]) :- E is A / _総売上金額, N2 is N + 1, 順位売上比率付き集約ならび(N2,N2,R3,R4). 集約情報から統合ファイル出力(L) :- open('data-all.csv',write,Output), ( member([_商品名,_単価,_数量,_金額],L), concat_atom([_商品名,_単価,_数量,_金額],',',S), write_formatted(Output,'%t\n',[S]), fail; close(Output), ),!. 集約情報から金額順位順統合ファイル出力([]). 集約情報から金額順位順統合ファイル出力([[A,B,C,D,E,F]|R]) :- F2 is round(F * 100.0) / 100, write_formatted_atom(S,'%t,%t,%t,%t,%t,%.2f',[A,B,C,D,E,F2]), write_formatted('%t\n',[S]), 集約情報から金額順位順統合ファイル出力(R). 商品合計数量を得る(_商品名,_合計数量) :- findsum(_数量,member([_,_商品名,_数量],_合計数量). 売上の存在する商品名を得る(L1,_整列してユニークな商品名ならび) :- 商品名のみ選択(L1,L2), sort(L2,_整列してユニークな商品名ならび). 売上の存在する商品名を得る(L1,_商品名ならび), member(_商品名,_商品名ならび), findall([_商品名,_単価,_数量,_金額], ( member([_商品名,_単価],TL), member([_,_商品名,_数量],L1), _金額 is _数量 * _単価), _集約ならび). 売上の存在する商品名を得る(L1,_整列してユニークな商品名ならび) :- 商品名のみ選択(L1,L2), sort(L2,_整列してユニークな商品名ならび). 商品名のみ選択([],[]) :- !. 商品名のみ選択([[_,A,_]|R1],[A|R2]) :- 商品名のみ選択(R1,R2). rsort(L,L2) :- sort(L,L1), reverse(L1,L2). # 質問です。 # # 入退室の時間を自分で打ち込んで、それをデータとして貯めるというシステムを作りたいんですが、こういうシステムを # 作る場合はPHPとMySQLで作れるんでしょうか。よろしくお願いします。 # 入退室 :- もっとも新しい入退室保存ファイル(File), reconsult(File). 入室(_氏名) :- A is time, localtime(A,B,_月,_日,_,_,_時,_分,_秒), assertz(入退室(入室,_氏名,_年,_月,_日,_時,_分,_秒)), 入退室情報を保護する. 退室(_氏名) :- A is time, localtime(A,B,_月,_日,_,_,_時,_分,_秒), assertz(入退室(退室,_氏名,_年,_月,_日,_時,_分,_秒)), 入退室情報を保護する. 入退室情報を保護する :- 入退室保存ファイル(_,_入退室保存ファイル), tell(_入退室保存ファイル), listing(入退室), told,!. %%%% 以下はPrologデータベースのセーブ/世代管理 %%%% 入退室管理ディレクトリ('/var/nyutaishitsu/'). もっとも新しい入退室保存ファイル(File) :- 入退室管理ディレクトリ(Dir), concat_atom(['ls -N ',Dir,'listing.*.pro'],S), shs(S,L), \+(L=[]), max(L,File),!. もっとも新しい入退室保存ファイル(File) :- 入退室保存ファイル(_,File),!. 入退室保存ファイル(OldF,NewF) :- 入退室管理ディレクトリ(Dir), concat_atom(['ls -N ',Dir,'listing.*.pro'],S), shs(S,L), \+(L=[]), max(L,OldF), sub_atom(OldF,_,6,4,A), atom_to_term(A,N,_), N2 is N + 1, concat_atom([Dir,'lsiting.',N2,'.pro'],NewF),!. 入退室保存ファイル(_,NewF) :- 入退室管理ディレクトリ(Dir), concat_atom([Dir,'listing.100000.pro],NewF), tell(NewF), told. # 所謂覆面算で # 英字一文字が一桁の数字(0-9)で表されるとき # one # + nine # + twenty # + fifty # = eighty # となる組み合わせを検索してください # 各行の先頭の文字は0以外です # % 'one + nine + twenty + fifty = eighty' 覆面算(S,LX) :- 覆面算(S,_文字数,_先頭文字ならび,_左項式,_右項式), 順列([0,1,2,3,4,5,6,7,8,9],_文字数,LX2), 変数を対応させる(_先頭文字ならび,LX2,LX), A is _右項式, B is _左項式, A = B. 覆面算(S,_文字数,_先頭文字ならび,_左項式,_右項式) :- split(S,['+',' '],L), 各項の先頭文字(L,_先頭文字ならび), append(L1,LX,L), concat_atom(L,S1), atom_chars(S1,L2), 各文字に変数を割り当てる(L2,[],LV), length(LV,_文字数), 式を構成する(L1,LV,_左項式), 式を構成する(L2,LV,_右項式). 各文字に変数を割り当てる([],X,X). 各文字に変数を割り当てる([A|R1],Y,X) :- member(A,[A=_,Y]), 各文字に変数を割り当てる(R1,Y,X). 各文字に変数を割り当てる([A|R1],Y,X) :- not(member([A=_,Y])), 各文字に変数を割り当てる(R1,[A=_|Y],X). 式を構成する([],_,0). 式を構成する([A|R1],LV,_式 + Y) :- atom_chars(A,Chars), length(Chars,Len), 覆面数値式(Len,LV,Chars,_式), 式を構成する(R1,LV,Y). 覆面数値式(0,_,_,0) :- !. 覆面数値式(N,LV,[A|R1],B + C) :- member(A=V,LV), B = ((10 ^ (N-1)) * V), N2 is N - 1, 覆面数値式(N2,LV,R1,C). 変数を対応させる(_,[],[]) :- !. 変数を対応させる(_先頭文字ならび,[A|R1],[B=A|R2]) :- member(B,_先頭文字ならび),!, not(A=0), 変数を対応させる(_先頭文字ならび,R1,R2). 変数を対応させる(_先頭文字ならび,[A|R1],[B=A|R2]) :- not(member(B,_先頭文字ならび)), 変数を対応させる(_先頭文字ならび,R1,R2). 各項の先頭文字(L,_先頭文字ならび) :- findall(C,(member(A,L),sub_atom(A,0,1,_,C)),_先頭文字ならび). # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): # 以下の機能を持った関数を含むプログラムを作成せよ. # 1.正の整数n,rを読み込み,その組み合わせnCrを計算する関数を再帰呼び出しを用いて作成せよ. # 2.正の整数n,rを読み込み,その組み合わせnCrを計算する関数を再帰呼び出しを用いないで作成せよ. t606_1(N,R,X) :- nCr(N,R,X). nCr(N,R,X) :- U is N-R, 階乗(N,K1), 階乗(R,K2), 階乗(U,K3), Y is K1 // K3, X is Y // K2. % 以下は見かけ再帰を含みませんが、実はfor/3やconcat_atom/3は再帰なしには書けない・・ t606_2(N,R,X) :- Y is N-R+1, findall(N1,for(N,N1,Y),L1), findall(N2,for(R,N2,1),L2), concat_atom(L1,'*',S1), concat_atom(L2,'*',S2), atom_to_term(S1,Term1,_), atom_to_term(S2,Term2,_), X is Term1 // Term2. /* t606_2(N,R,X) :- length(L,N), findsum(1,組み合わせ(L,R,_),Y), X is truncate(Y). */ 階乗(0,1) :- !. 階乗(1,1) :- !. 階乗(N,X) :- N2 is N - 1,階乗(N2,Y),X is N * Y. # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): # 入力として与えられた文字列のアナグラム(anagram)を出力するプログラムanagram.c # を作成せよ。 # # % ./a.out # String: abc # abc acb bac bca cab cba # % # # 入力する文字数が増えると計算時間はどのように変化していくかを考えよ。 # プログラムの実行時間は、「time」コマンドを使用して計測せよ。 # timeコマンドの結果のうち、ユ ーザ時間がプログラムの実行時間になります。 # # % time ./a.out # String: abc # abc acb bac bca cab cba # # real 0m0.002s # user 0m0.000s # sys 0m0.001s root# time prologuexxx -query0 't617(abc)' real 0m0.111s user 0m0.072s sys 0m0.040s root# time prologuexxx -query0 't617(abcdef)' real 0m0.116s user 0m0.072s sys 0m0.044s root# time prologuexxx -query0 't617(abcdefghi)' real 0m3.298s user 0m2.880s sys 0m0.416s %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% t617(Atom) :- anagram(Atom,Anagram), halt,!. anagram(Atom,Anagram) :- atom_chars(Atom,Chars), length(Chars,Len), findall(S,(順列(Chars,Len,L),concat_atom(L,S)),X), concat_atom(X,' ',Anagram). # [1] 授業単元:C言語プログラミング # [2] 問題文(含コード&リンク):10×10マスの碁盤の内から、scanf命令で # 入力した2値をx,y座標として、 # その座標部分を塗りつぶし四角"■"で表示しなさい。 # それ以外は"□"でマス表示するものとします。 # 両者とも0から9までが入力されるものとします(エラー判定不要)。 # 入力時の問い合わせメッセージは自由に表示させて下さい。 t637(_着手された盤面) :- findall(L,(for(1,N,10),length(10,L),all('□',L)),_盤面), 着手(X,Y), 現在の盤面(_盤面,X,Y,_着手された盤面). t637(_). 着手(X,Y) :- get_line(Line), split(Line,[' ',','],[X_0,Y_0]), X is X_0 + 1, Y is Y_0 + 1,!. 現在の盤面(_盤面,X,Y,_着手された盤面) :- 行列の置換(Y,X,'■',_盤面,_着手された盤面), 盤面表示(_着手された盤面). 現在の盤面(_盤面,X,Y,_着手された盤面) :- 行列の置換(Y,X,'■',_盤面,_着手された盤面_1), 着手(X2,Y2), 現在の盤面(_着手された盤面_1,X2,Y2,_着手された盤面). 盤面表示(_盤面) :- reverse(_盤面,_原点位置を左下に修正した盤面), 盤面表示の二(_原点位置を左下に修正した盤面),!. 盤面表示の二([]) :- !. 盤面表示の二([L|R]) :- concat_atom(L,_表示升列アトム), write_formatted('%t\n',[_表示升列アトム]), 盤面表示の二(R). # [1] 授業単元:プログラミング演習 # [2] 問題文:構造体triangeleはメンバとして、 # 各頂点の座標を表す構造体pointのp1,p2,p3を持つ。 # また関数show_triangleはtriangleの内容を表示する。 # 乱数を利用してtriangleのインスタンスを1つ作成し、 # 関数show_trianglwを利用して、その内容を表示せよ。 :- op(700,xfx,(::)). インスタンス(0). 座標範囲(p1,0,2048). 座標範囲(p2,0,2048). 座標範囲(p3,0,2048). new_triangle(_インスタンス) :- 新しいインスタンス(_インスタンス), 新しい頂点を得る([],L1,p1,V1), assertz(_インスタンス :: triangle(point(p1,V1))), 新しい頂点を得る(L1,L2,p2,V2), assertz(_インスタンス :: triangle(point(p1,V2))), 新しい頂点を得る(L2,_,p3,V3), assertz(_インスタンス :: triangle(point(p1,V3))),!. show_triangle(_インスタンス) :- _インスタンス :: triangle(point(p1,V1))), _インスタンス :: triangle(point(p2,V2))), _インスタンス :: triangle(point(p3,V3))), write_formatted('p1 = %t\np2 = %t\np3 = %t\n',[V1,V2,V3]). 新しい頂点を得る(L1,[V|L1],P,V) :- 座標範囲(P,S,E), X is E-S, V is (random mod X) + S, \+(member(V,L1)),!. 新しい頂点を得る(L1,L2,P,V) :- 新しい頂点を得る(L1,L2,P,V). 新しいインスタンス(_インスタンス) :- retract(インスタンス(No)), No2 is No + 1, assertz(インスタンス(No2)), concat_atom(['$',No2],_インスタンス). # [1] 授業単元:C++ STLの使い方 # [2] 問題文(含コード&リンク): # STLのvectorとlistを使い、以下の文章操作を行いなさい。 # (Hint:list, vector >の様に使用する) # # a) 文章中の一行の文字をlistに挿入し、そしてそのlistはvectorの各インデック  #   スに挿入されるものとする。 # b) listとvectorのそれぞれの中にあるデータを出力できる。 # c) 2つの行番号を入力し、その行を繋げる関数を作成しなさい。 # (line:1, line:2, result: 1と2の連結、line2は空となりresultはline1になる)# d) 行番号を入力すると、その行の逆順序のものが出力される関数を作成しなさい。 # e) 文字列を与えると、その文字列の含まれるすべての行番号を出力する関数を #   作成しなさい。 t705_a(File) :- get_liens(File,Lines), 述語vectorの定義(1,Lines). 述語vectorの定義(_,[]). 述語vectorの定義(N,[A|R]) :- atom_chars(A,L), assertz(vector(N,L)), N2 is N + 1, 述語vectorの定義(N2,R). t705_b(vector) :- listing(vector). t705_b(list,_行番号) :- vector(_行番号,L), atom_chars(_行,L), write_formatted('%t\n',[_行]). t705_c(_行番号1,_行番号2) :- vector(_行番号1,L1), vector(_行番号2,L2), retract(vector(_行番号1,L1)), retract(vector(_行番号2,L2)), append(L1,L2,L3), assertz(vector(_行番号1,L3)), assertz(vector(_行番号2,[])),!. t705_d(_行番号,_行の逆順) :- vector(_行番号,L1), reverse(L1,L2), concat_atom(L2,_行の逆順). t705_e(_検索文字列,_行番号ならび) :- atom_chars(_検索文字列,L1), findall(_行番号,(vector(_行番号,L),append(_,L1,_,L)),_行番号ならび). % *** user: '文字列置換' / 5 *** '文字列置換'(_文字列,_置換述語,_要素変数,_置換変数,_置換された文字列) :- atom_chars(_文字列,_ならび), '全要素に適用して置換'(_ならび,_置換述語,_要素変数,_置換変数,_置換ならび), concat_atom(_置換ならび,_置換された文字列), ! . % *** user: '文字列置換' / 4 *** '文字列置換'(_対象文字列,_置換される副文字列,_置換する副文字列,_置換された文字列) :- replace(_対象文字列,_置換される副文字列,_置換する副文字列,_置換された文字列), ! . % *** user: replace_all / 4 *** replace_all('',A,B,'') :- ! . replace_all(String,S1,'',X) :- atom_chars(String,StringL), atom_chars(S1,S1L), replace_31(StringL,S1L,Y), concat_atom(Y,X), ! . replace_all(String,S1,S2,X) :- atom_chars(String,StringL), atom_chars(S1,S1L), atom_chars(S2,S2L), replace_41(StringL,S1L,S2L,Y), concat_atom(Y,X), ! . % *** user: replace / 4 *** replace(String,S1,'',X) :- atom_chars(String,StringL), atom_chars(S1,S1L), replace_3(StringL,S1L,Y), concat_atom(Y,X), ! . replace(String,S1,S2,X) :- atom_chars(String,StringL), atom_chars(S1,S1L), atom_chars(S2,S2L), replace_4(StringL,S1L,S2L,Y), concat_atom(Y,X), ! . % *** user: replace_3 / 3 *** replace_3(L,L1,R) :- append(L1,R,L), ! . replace_3([A|R],L1,[A|R2]) :- replace_3(R,L1,R2) . % *** user: replace_4 / 4 *** replace_4(L,L1,L2,R2) :- append(L1,R,L), append(L2,R,R2), ! . replace_4([A|R],L1,L2,[A|R2]) :- replace_4(R,L1,L2,R2) . % *** user: replace_31 / 3 *** replace_31([],_,[]) :- ! . replace_31(L,L1,Y) :- append(L1,R,L), replace_31(R,L1,Y), ! . replace_31([A|R],L1,[A|R2]) :- replace_31(R,L1,R2) . % *** user: replace_41 / 4 *** replace_41([],_,_,[]) :- ! . replace_41(L,L1,L2,R2) :- append(L1,R,L), replace_41(R,L1,L2,R3), append(L2,R3,R2), ! . replace_41([A|R],L1,L2,[A|R2]) :- replace_41(R,L1,L2,R2) . % *** user: '全要素に適用して置換' / 5 *** '全要素に適用して置換'(L,P,Element,_置換変数,X) :- length(L,Len), findall(U,(for(1,N,Len) , list_nth(N,L,A,Element,C) , (error_protect(P,fail) , U = _置換変数 ; \+(error_protect(P,fail)) , U = Element)),X) . % *** user: 'split' / 3 *** split(_文,_区切り語ならび,_区切られた語ならび) :- 区切り語ならびの変形(_区切り語ならび,SeparatersL), atom_chars(_文,_文字ならび), split_1(_文字ならび,SeparatersL,_区切られた語ならび). % *** user: 'split_1' / 3 *** split_1([],SeparatersL,[]). split_1(L1,SeparatersL,[A|R]) :- \+(L1=[]), split_2(L1,SeparatersL,L2,R2), \+(L2=[]), atom_chars(A,L2), split_1(R2,SeparatersL,R). split_1(L1,SeparatersL,X) :- \+(L1=[]), split_2(L1,SeparatersL,L2,R2), L2=[], split_1(R2,SeparatersL,X). % *** user: 'split_2' / 4 *** split_2([],_,[],[]). split_2(L1,SeparatersL,[],R) :- member(L2,SeparatersL), append(L2,R,L1). split_2([A|R1],SeparatersL,[A|R2],R) :- \+((member(L2,SeparatersL),append(L2,_,[A|R1]))), split_2(R1,SeparatersL,R2,R). % *** user: '区切り語ならびの変形' / 2 *** 区切り語ならびの変形(_区切り語ならび,_降順の区切り文字ならびのならび) :- sort(_区切り語ならび,_昇順の区切り語ならび), reverse(_昇順の区切り語ならび,_降順の区切り語ならび), atomList2charsList(_降順の区切り語ならび,_降順の区切り文字ならびのならび). % *** user: 'atomList2charsList' / 2 *** atomList2charsList([],[]) :- !. atomList2charsList([A|R1],[L|R2]) :- atom_chars(A,L), atomList2charsList(R1,R2). # [1] 授業単元: プログラミング # 以下のプログラムを作成せよ。 # 三科目の試験を行ったが、各科目で平均点がかなり異なってしまった状況を想定する。 # 科目間でできるだけ均等にするために、各科目の最高得点の人を100点にするように点数を変換することにした # 例えば、国語の最高得点が70点の場合、国語の点数は全て100/70倍される # このような点数の変換プログラムを考える # 達成条件は # ・ファイルin.txtを開き、変換された点数データをファイルoutput.txtに書き込んでいる。 # ・ファイルからデータを読み込んだ時に、構造体にデータを入力している # ・ファイルout.txt内では、正しく点数が変換されている。 # ・名前は最大でも半角で20文字として。配列nameの外をアクセスしていない。 t741 :- get_lines('in.txt',Lines), findall([Name2,A1,B1,C1],(member(Lines),split(Lines,[' ',','],[Name1,A1,B1,C1]),名前の長さ制限(Name1,Name2)),L), findmax(A,(member([_,A,_,_],L),MaxA), findmax(B,(member([_,_,B,_],L),MaxB), findmax(A,(member([_,_,_,C],L),MaxC), 嵩上げ率の計算(MaxA,MaxB,MaxC,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C), findall(S,( member([Name,A2,B2,C2],L),嵩上げ計算(A2,B2,C2,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C,AX,BX,CX),concat_atom([Name,AX,BX,CX],',',S)),L2), put_lines('out.txt',L2). 嵩上げ率計算(MaxA,MaxB,MaxC,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C) :- _嵩上げ率A is 100 / MaxA, _嵩上げ率B is 100 / MaxB, _嵩上げ率C is 100 / MaxC. 嵩上げ計算(A,B,C,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C,AX,BX,CX) :- AX is A * _嵩上げ率A, BX is B * _嵩上げ率B, CX is C * _嵩上げ率C. 名前の長さ制限(Name,NameX) :- atom_code(Name,L), 名前の長さ制限(0,L,LX), atom_codes(NameX,LX). 名前の長さ制限(M,_,[]) :- M > 20,!. 名前の長さ制限(M,[A|R1],[]) :- char_code(A,Code), Code > 255, M > 18,!. 名前の長さ制限(M,[A|R1],[A|R2]) :- char_code(A,Code), Code > 255, M < 19, M2 is M + 2, 名前の長さ制限(M2,R1,R2),!. 名前の長さ制限(M,[A|R1],[A|R2]) :- char_code(A,Code), Code < 256, M2 is M + 1, 名前の長さ制限(M2,R1,R2),!. :- 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), 印刷制御(_印刷端末,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). # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # new と deleteを使ったプログラムの作成 #  人数、名前、点数を入力し、横棒グラフを表示するプログラムを作りなさい。 # ただし、グラフは5点刻みとし、点数は0点から100点の範囲とする。 # <実行画面> # 人数 : 3 # 1人目の名前 : A # 1人目の点数 : 80 # 2人目の名前 : B # 2人目の点数 : 55 # 3人目の名前 : C # 3人目の点数 : 95 # # 名( 点 )| 50 100 # --------+---------+---------+ # A ( 80)|**************** # B ( 55)|*********** # C ( 95)|******************* # 平均 77|*************** # :- op(800,xfx,人目の名前). :- op(800,xfx,人目の点数). 1人目の名前 'A'. 1人目の点数 80. 2人目の名前 'B'. 2人目の点数 55. 3人目の名前 'C'. 3人目の点数 95. t786 :- write(' 名(点)| 50 100\n--------+---------+---------+\n'), N 人目の名前 _名前, N 人目の点数 _点数, 星表現(_点数,_星表現), write_formatted('%4s(%2d)|%t\n',[_名前,_点数,_星表現]), fail. t786 :- findavg(V,_ 人目の点数 V,_平均点), 星表現(_平均点,_星表現), write_formatted('平均(%2d)|%t\n',[_平均点,_星表現]). 星表現(_点数,_星表現) :- Y is _点数 // 5, all(Y,L,'*'), concat_atom(Y,_星表現). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% all(Length,L,A) :- length(L,Length), all(L,A). all([],_). all([A|R],A) :- all(R,A). findavg(_集約項,_項,_算術平均) :- findall(_集約項,_項,_値ならび), '加算'(_値ならび,_合計値), length(_値ならび,_ならびの長さ), _算術平均 is _合計値 / _ならびの長さ,!. 加算([],0.0). 加算([A|R1],X) :- 加算(R1,Y), X is A + Y. concat_atom([],'') :- !. concat_atom([Atom],Atom) :- !. concat_atom([Atom1|R1],Atom) :- concat_atom(R1,Atom2), atom_append(Atom1,Atom2,Atom). concat_atom([],_,'') :- !. concat_atom([Atom],_,Atom) :- !. concat_atom([Atom1|R1],_区切り文字,Atom) :- concat_atom(R1,_区切り文字,Atom2), atom_append(Atom1,_区切り文字,Atom3), atom_append(Atom3,Atom2,Atom). # 【 課題 】 # 1・コマンドライン引数で2つの文字列を入力し、1番目に指定された文字列の中に2番目に指定された文字列が存在する場合は # 「この文字列はあります。(○文字目)」と表示し、存在しない場合は「この文字列は存在しません」と表示しなさい。 入力文字数は、1番目の文字列は10文字以上とし、2番目の文字列は2文字以上4文字以内とする。 # また、文字列は先頭から検索し、最初に見つかった文字のインデックスを表示することとする。。 # # 2・任意の文字列を内部で指定し、コマンドライン引数で2つの文字列を入力する。 # もし内部で指定した文字列に、1番目に指定した文字列が存在する場合は、その文字列を # 2番目に指定した文字列と置き換えてから表示し、存在しない場合は「置き換えなし」と表示しなさい。 # 入力文字数は、1番目、2番目ともに4文字以内とする。また最初に内部指定文字列を表示し、 # 1番目の文字列が複数する場合は、すべて置き換わっていること。 # # 3・コマンドライン引数で入力された文字列が # 3文字以下なら、その文字列を20個文字列連結して表示 # 4文字以上なら”たくさん” を表示しなさい。 # 文字列連結の際はStringBufferクラスを使用しなさい # for文を使用しなさい # % 一問目 program :- user_parameters([Atom1,Atom2]), t802検査(Atom1,Atom2,_診断), write_formatted('%t\n',[_診断]). t802検査(Atom1,Atom2,_診断) :- sub_atom(Atom1,S,_,_,Atom2), S2 is S + 1, concat_atom([この文字列はあります。,S2,文字目],_診断),!. t802検査(_,_,'この文字列は存在しません。'). % 二問目 program :- user_parameters([Atom1,Atom2]), 内部で指定した置換対象文字列(_置換対象文字列), t802文字列置換(_置換対象文字列,Atom1,Atom2,X), write_formatted('%t\n',[X]). t802文字列置換(_置換対象文字列,Atom1,Atom2,置き換えなし) :- t802文字列置換の二(_置換対象文字列,Atom1,Atom2,_置換対象文字列). t802文字列置換(_置換対象文字列,Atom1,Atom2,_置換された文字列) :- t802文字列置換の二(_置換対象文字列,Atom1,Atom2,_置換された文字列). t802文字列置換の二(_置換対象文字列,Atom1,Atom2,_置換対象文字列) :- \+(sub_atom(_置換対象文字列,S,Len,R,Atom1)). t802文字列置換の二(_置換対象文字列,Atom1,Atom2,X) :- sub_atom(_置換対象文字列,S,Len,R,Atom1), sub_atom(_置換対象文字列,0,S,_,Atom0), sub_atom(_置換対象文字列,S+Len,R,_,_置換対象文字列の二), t802文字列置換の二(_置換対象文字列の二,Atom1,Atom2,Y), concat_atom([Atom0,Atom2,Y],X). 内部で指定した置換対象文字列(日暮るればうたふ乙女が声すみてとほき田面に早苗とるなり). %三問目 program :- user_parameters([Atom1]), sub_atom(Atom1,0,Len,0,Atom1), t802文字連結(Atom1,Len,X), write_formatted('%t\n',[X]). t802文字列連結(Atom,Len,たくさん) :- Len >= 4. t802文字列置換(Atom,Len,X) :- Len < 4, findall(atom,for(1,N,20),L), concat_atom(L,X). # [1] 授業単元:プログラム言語論 # [2] 問題文(含コード&リンク): # # 設問1.C言語、またはC++言語で、割り算を計算するdev(int x,int y)関数(*)を作成しなさい。 # ただし、不変表明(assert)を使って、0で除算を実行した場合にエラーを出力するようにすること。 # (*)関数devは、int型の返値を持ち、x/yを計算するものとする。 :- op(700,xfx,は). 関数定義(div(X,Y),Z) :- div(X,Y,Z). div(X,Y,Z) :- length(L1,X), length(L2,Y), div(L1,L2,DIV,MOD), length(DIV,Z). div(_,[],_,_) :- write('0除算エラー\n'),!. div(L1,L2,[_|D],MOD) :- append(L2,L3,L1), div(L3,L2,D,MOD). div(L1,L2,[],L1) :- \+(append(L2,L3,L1)). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% findavg(_集約項,_項,_算術平均) :- findall(_集約項,_項,_値ならび), '加算'(_値ならび,_合計値), length(_値ならび,_ならびの長さ), _算術平均 is _合計値 / _ならびの長さ,!. 加算(trunc(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A is trunc(B)),SL),!. 加算(四捨五入(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A は 四捨五入(B)),SL),!. 加算(切捨て(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A は 切捨て(B)),SL),!. 加算(切り上げ(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A は 切り上げ(B)),SL),!. 加算([],L) :- var(L), L = 0.0e+00,!. 加算([],L) :- \+(var(L)), 加算の変数に零をおく(L),!. 加算([L|R],SL) :- ならび(L), 行列の転置([L|R],L1), 加算_2(L1,SL),!. 加算(X,S) :- 加算_1(X,0.0e+00,S) . 加算_1([],S,S) :- !. 加算_1([A|R],Y,S) :- ならび(A), ならび(Y), !, ならび加算(A,Y,Z), 加算_1(R,Z,S),!. 加算_1([A|R],Y,S) :- atom(A), atom_number(A,I), integer(I), Z is I + Y, 加算_1(R,Z,S),!. 加算_1([A|R],Y,S) :- atom(A), atom_number(A,F), real(F), Z is F + Y, 加算_1(R,Z,S),!. 加算_1([A|R],Y,S) :- atom(A), 加算_1(R,Y,S),!. 加算_1([A|R],Y,S) :- A1 は A, Z is A1 + Y, 加算_1(R,Z,S). 加算_1(A,Y,S) :- とからりすと(A,L), !, 加算_1(L,Y,S) . 加算_2([],[]) :- !. 加算_2([L|R],[S|R2]) :- 加算(L,S), 加算_2(R,R2). 加算の変数に零をおく([]) :- !. 加算の変数に零をおく([A|R]) :- 変数(A), A = 0.0e+00, 加算の変数に零をおく(R),!. とからりすと(A,[A]) :- atomic(A),!. とからりすと(A と B,C) :- とからりすと(A,A1), とからりすと(B,B1), append(A1,B1,C). 変数(_変数) :- var(_変数). ならび([_|_]). _項 は (_ネットワーク :: _式) :- _ネットワーク :: _項 は _式, ! . _評価項 は N : L :- M は N, L1 は L, list_nth(M,L1,_評価項), ! . _評価項 は prolog(_評価項) :- functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), !, error_protect(_評価項,fail) . _評価値 は [X|{P}] :- findall(X,P,_評価値), ! . _評価項 は ` _値 :- !, _評価項 = _値, ! . _項 は _式 :- var(_式), _項 = _式, ! . _項 は _式 :- error_protect(一時関数定義(_式,_項),fail) . _項 は _式 :- atom(_式), member(_式,[minint,maxint,cputtime,time,csize,cused,dbsize,dbused,gsize,gused,noptrs,ptrsued,ssize,sused,tsize,tused]), !, _項 is _式, ! . _項 は _式 :- 二項組込み関数(_式), 二項組込み関数の評価(_式,_項) . _項 は _式 :- 二項組込み関数(_式), !, fail . _項 は _式 :- functor(_式,Functor,1), arg(1,_式,Arg), Y は Arg, functor(_式_1,Functor,1), arg(1,_式_1,Y), member(Functor,[atom,real,integer,var,float,list]), !, error_protect(_式_1,fail), _項 = Y, ! . _項 は _式 :- atom(_式), error_protect(get_global(_式,_項),fail), ! . _項 は _式 :- real(_式), _項 = _式, ! . _項 は _式 :- real(_式), !, fail . _項 は _式 :- list(_式), findall(X,(member(U,_式) , X は U),_項) . _項 は _式 :- list(_式), !, fail. _項 は _erlang_module : _erlang関数 :- erlang関数評価(_erlang_module : _erlang関数,_項),!. _項 は _式 :- 関数定義(_式,_項),!. _項 は _式 :- functor(_式,_関数,_次数), function(_関数,_次数), findall(Arg,(for(1,N,_次数) , arg(N,_式,Arg)),L), 関数評価に於いて引数部分の関数評価(L,L2), _式の二 =.. [_関数|L2], error_protect(_項 is _式の二,fail) . _項 は _評価関数 :- error_protect(_項 is _評価関数,fail),!. _評価項 は prolog(_評価項) :- functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), !, error_protect(_評価項,fail),!. _項 は _評価項 :- 述語評価が可能(_評価項,_関数,_次数,_次数足す一), _評価項 =.. _評価項の項分解ならび, findall(Arg,(for(1,N,_次数) , arg(N,_評価項,Arg)),L), 関数評価に於いて引数部分の関数評価(L,L2), append(L2,[_],_変数を付加した引数ならび), _解付き評価項 =.. [_関数|_変数を付加した引数ならび], error_protect(_解付き評価項,fail), arg(_次数足す一,_解付き評価項,_項) . _項 は _評価項 :- \+(述語評価が可能(_評価項,_関数,_次数,_次数足す一)), functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), error_protect(_評価項,fail), arg(Arg,_評価項,_項) . _項 は _評価項 :- \+(述語評価が可能(_評価項,_関数,_次数,_次数足す一)), functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), \+(error_protect(_評価項,fail)), _評価項 = _項,!. _項 は _式 :- atomic(_式), \+(述語評価が可能(_式,_関数,_次数,_次数足す一)), _項 = _式,!. 述語評価が可能(_評価項,_関数,_次数,_次数足す一) :- functor(_評価項,_関数,_次数), _次数足す一 is _次数 + 1, \+(predicate_type(_関数,_次数足す一,undefined)),!. 関数評価に於いて引数部分の関数評価([],[]). 関数評価に於いて引数部分の関数評価([L|R1],[L2|R2]) :- list(L), !, 関数評価に於いて引数部分の関数評価(L,L2), 関数評価に於いて引数部分の関数評価(R1,R2), ! . 関数評価に於いて引数部分の関数評価([F|R1],[F|R2]) :- \+(error_protect(F2 は F,fail)), !, 関数評価に於いて引数部分の関数評価(R1,R2) . 関数評価に於いて引数部分の関数評価([F|R1],[F2|R2]) :- error_protect(F2 は F,fail), 関数評価に於いて引数部分の関数評価(R1,R2) . erlang関数評価(os : cmd(Command),_項) :- erlang :: (os : cmd(Command) -> _項_1), _項 は string2atom(_項_1),!. erlang関数評価(_erlang_module : _erlang関数,_項) :- erlang :: (_erlang_module : _erlang関数 -> _項),!. 関数定義(_項の一 + _項の二,_値) :- _値の一 は _項の一, number(_値の一), _値の二 は _項の二, number(_値の二), _値 is _値の一 + _値の二, !. 関数定義(_項の一 + _項の二,_値) :- _値の一 は _項の一, atomic(_値の一), _値の二 は _項の二, atomic(_値の二), concat_atom([_値の一,_値の二],_値), !. 関数定義(_ならびの一 + _ならびの二,_値) :- ( 変数(_ならびの一) ; _ならびの一 == [] ; list(_ならびの一) ; 変数(_ならびの二) ; _ならびの二 == [] ; list(_ならびの二) ), !, append(_ならびの一,_ならびの二,_値) . 関数定義(_項の一 * _項の二,_値) :- _値の一 は _項の一, list(_値の一), _値の二 は _項の二, integer(_値の二), findall(_値の一,for(1,_,_値の二),LY), concat_list(LY,_値), !. 関数定義(_項の一 * _項の二,_値) :- _値の一 は _項の一, atom(_値の一), _値の二 は _項の二, integer(_値の二), findall(_値の一,for(1,_,_値の二),L), concat_atom(L,_値), !. 関数定義(_項の一 * _項の二,_値) :- _値の一 は _項の一, atomic(_値の一), _値の二 は _項の二, atomic(_値の二), concat_atom([_値の一,_値の二],_値), !. 関数定義(_ならびの一 * _ならびの二,_値) :- ( 変数(_ならびの一) ; _ならびの一 == [] ; list(_ならびの一) ; 変数(_ならびの二) ; _ならびの二 == [] ; list(_ならびの二) ), !, append(_ならびの一,_ならびの二,_値) . 関数定義(` _値,_値) :- !. 関数定義(@ _式,_値) :- _値 は _式,!. 関数定義(四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _値の二 >= 0.0e+00, _四捨五入後の値 is floor(_値の二 + 0.5) * 1.0,!. 関数定義(四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _四捨五入後の値 is ceil(_値の二 - 0.5),!. 関数定義(切り捨て(_値),_切り捨て後の値) :- _値の二 は _値, _切り捨て後の値 は floor(_値の二) * 1.0,!. 関数定義(切り上げ(_値),_切り上げ後の値) :- _値の二 は _値, _切り上げ後の値 は ceil(_値の二),!. 関数定義(十円未満四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _四捨五入後の値 は floor(_値の二 / 10 + 0.5) * 10,!. 関数定義(十円未満切り捨て(_値),_切り捨て後の値) :- _値の二 は _値, _切り捨て後の値 は trunc(_値の二 / 10) * 10,!. 関数定義(十円未満切り上げ(_値),_切り上げ後の値) :- _値の二 は _値, _切り上げ後の値 は ceil(_値の二 / 10) * 10,!. 関数定義(百円未満四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _四捨五入後の値 は floor(_値の二 / 100 + 0.5) * 100,!. 関数定義(百円未満切り上げ(_値),_切り上げ後の値) :- _値の二 は _値, _切り上げ後の値 は ceil(_値の二 / 100) * 100,!. 関数定義(百円未満切り捨て(_値),_切り捨て後の値) :- _値の二 は _値, _切り捨て後の値 は floor(_値の二 / 100) * 100,!. 関数定義(整数化(_値),_整数化された値) :- _値の二 は _値, _整数化された値 is trunc(_値の二),!. 関数定義(char_code(_項),_値) :- ( atom(_項), atomic_length(_項,1), char_code(_項,_値) ; integer(_項), char_code(_値,_項) ; 複合項(_項), _項の一 は _項, _値 は char_code(_項の一) ), !. 関数定義($ _大域変数名,_値) :- atom(_大域変数名), get_global(_大域変数名,_値の一), _値 は _値の一,!. 関数定義(S,E) :- functor(S,select,1), to(S,E),!. 関数定義(setq(A,B),E) :- atom(A), B1 は B, set_global(A,B1), E = B1,!. 関数定義(++ A,X) :- A1 は A, list(A1), 加算(A1,X),!. 関数定義(A ++ B,X) :- C is B / A, X = A + C + B,!. 関数定義(car(A),E) :- A1 は A, A1 = [E|_],!. 関数定義(cdr(A),E) :- A1 は A, A1 = [_|E],!. 関数定義(cons(A,B),E) :- A1 は A, B1 は B, E = [A1|B1],!. 関数定義(length(A),E) :- A1 は A, list(A1), length(A1,E),!. 関数定義(decode(A,B,C,D),E) :- A1 は A, B1 は B, A1 = B1, E は C,!. 関数定義(decode(A,B,C,D),E) :- E は D,!. 関数定義(decompcons(A),E) :- A1 は A, decompcons(A1,E),!. 関数定義(substr(A,B,C),E) :- 関数定義(subatomic(A,B,C),E),!. 関数定義(subatomic(A,B,C),E) :- A1 は A, B1 は B, C1 は C, subatomic(A1,B1,C1,E),!. 関数定義(concat(A),E) :- A1 は A, concat(A1,E),!. 関数定義(concat(A,B),E) :- A1 は A, B1 は B, concat(A1,B1,E),!. 関数定義(append(A,B),E) :- A1 は A, B1 は B, append(A1,B1,E),!. 関数定義(reverse(A),E) :- A1 は A, reverse(A1,E),!. 関数定義(string2atom(A),E) :- A2 は A, flat(A2,B), atom_codes(E,B),!. 関数定義(P,E) :- functor(P,greatest,Arg), P =.. [greatest|L], findall(B,(member(A,L) , B は A),L2), max(L2,E),!. 関数定義(P,E) :- functor(P,least,Arg), P =.. [least|L], findall(B,(member(A,L) , B は A),L2), min(L2,E),!. 関数定義(cel(_列数,_行数,_行列),_解) :- _関数評価された行数 は _行数, _関数評価された列数 は _列数, list_nth(_関数評価された行数,_行列,_行), list_nth(_関数評価された列数,_行,_解),!. # 【 課題 】[文字列"GPIB-002.70V"から文字列"-002.70"を取り出して、 #       その文字列をDoubleオブジェクトにし、それをdouble型 #       実数値に変換して数値を表示 '文字列"GPIB-002.70V"から文字列"-002.70"を取り出して、その文字列をDoubleオブジェクトにし、それをdouble型実数値に変換して数値を表示'(_文字列,_浮動小数点数値) :- atom_chars(_文字列,_文字ならび), 連続する数字候補文字ならび(_文字ならび,_数字候補文字ならび), concat_atom(_数字候補文字ならび,_数字候補文字列), atom_to_term(_数字候補文字列,_浮動小数点数値,_). 連続する数字候補文字ならび(_文字ならび,_数字候補文字ならび) :- 数値候補文字まで読み飛ばし(_文字ならび,_数値文字から始まる文字ならび), 数字候補文字ならび(_数値文字から始まる文字ならび,_数字候補文字ならび). 数字候補文字ならび([],[]). 数字候補文字ならび(['e','+',A|R1],['e','+',A|R2]) :- 数値文字候補(A), 数字候補文字ならびの二(R1,R2),!. 数字候補文字ならび(['e','-',A|R1],['e','-',A|R2]) : 数値文字候補(A),- 数字候補文字ならびの二(R1,R2),!. 数字候補文字ならび([A,'.',B|R1],[A,'.',B|R2]) :- 数値文字候補(A), 数値文字候補(B), 数字候補文字ならびの二(R1,R2),!. 数字候補文字ならび([A|R1],[A|R2]) :- 数値文字候補(A), 数字候補文字ならび(R1,R2). 数字候補文字ならび([A|R1],[]) :- \+(数値文字候補(A)). 数字候補文字ならびの二([],[]). 数字候補文字ならびの二([A|R1],[A|R2]) :- 数値文字候補(A), 数字候補文字ならびの二(R1,R2). 数字候補文字ならびの二([A|R1],[]) :- \+(数値文字候補(A)). 数値候補文字まで読み飛ばし(['+',A|R1],['+',A|R1]) :- 数値文字候補(A),!. 数値候補文字まで読み飛ばし(['-',A|R1],['-',A|R1]) :- 数値文字候補(A),!. 数値候補文字まで読み飛ばし([A|R1],[A|R1]) :- 数値文字候補(A),!. 数値候補文字まで読み飛ばし([_|R1],R2) :- 数値候補文字まで読み飛ばし(R1,R2). 数値文字候補(A) :- member(A,['0','1','2','3','4','5','6','7','8','9']). # 1.1行ずつURLが記述されたテキストファイルを読み込み、 # 2.そのURLのコンテンツを取得して # 3.タイトルとURLを画面に出力(コンソールに直接でもブラウザへでも可) # するプログラムを作ってください。 # 尚テキストファイルに記述されているURLは妥当なものと見なして構わないものとする。 一行ずつURLが記述されたテキストファイルを読み込み、そのURLのコンテンツを取得してタイトルとURLを画面に出力する(File) :- 一行ずつURLが記述されたテキストファイルを読み込み(File,Lines), そのURLのコンテンツを取得して(URL,_コンテンツ,_タイトル), タイトルとURLを画面に出力(_タイトル,URL), fail. 一行ずつURLが記述されたテキストファイルを読み込み、そのURLのコンテンツを取得してタイトルとURLを画面に出力する(_). 一行ずつURLが記述されたテキストファイルを読み込み(File,URL) :- get_chars(File,Lines), member(URL,Lines). 'そのURLのコンテンツを取得して'(URL,_コンテンツ,_タイトル) :- w3c(URL,Lines2), concat_atom(Lines,_改行を削除した全文), atom_chars(_改行を削除した全文,_コンテンツ), タイトルを得る(_コンテンツ,_タイトル). タイトルとURLを画面に出力(_タイトル,URL) :- write_formatted('%t,%t\n',[_タイトル,URL]). タイトルを得る([|R1],_タイトル) :- (A=t;A='T'),(B=i;B='I'),(C=t;C='T'),(D=l;D='L'),(E=e;E='E'), タイトル文字ならびを切り取る(R1,_タイトル文字ならび), concat_atom(_タイトル文字ならび,_タイトル). タイトルを得る([_|R1],_タイトル) :- タイトルを得る(R1,_タイトル). タイトル文字ならびを切り取る(['<','/',A,B,C,D,E,'>'|_],[]) :- (A=t;A='T'),(B=i;B='I'),(C=t;C='T'),(D=l;D='L'),(E=e;E='E'),!. タイトル文字ならびを切り取る([A|R1],[A|R2]) :- タイトル文字ならびを切り取る(R1,R2). # [1] 授業単元:プログラミング # 課題 # 整数列を右に任意数だけローテーション(右ローテーション:right rotation)する # プログラムを作りなさい.ただし,以下の点に留意すること. # # ・整数列はキーボードから入力すること. # ・入力できる整数列の最大長は 10 とし,長さ 0 以下と 11 以上を指定した場合エラー終了すること. # ・ローテーション数が整数列の長さを超える場合でも正しい処理になるようにすること t846 :- t846_入力(_整数ならび,_ローテーションする数), length(_整数ならび,_入力した要素数), t846(_ローテーションする数,_入力した要素数,_整数ならび,_ローテーションした整数ならび), concat_atom(_ローテーションした整数ならび,',',S), write_formatted('ローテーションした整数列 %t です\n',[S]),!. t846. t846(_ローテーションする数,_入力した要素数,_整数ならび,X) :- _入力した要素数>0, _入力した要素数<11, ならびの回転(右方向,_ローテーションする数,_整数ならび,X),!. t846(_ローテーションする数,_入力した要素数,_整数ならび,X) :- \+((_入力した要素数>0,_入力した要素数<11)), write_formatted('入力した要素数が適切でありません %t 個\n',[_入力した要素数]), fail. t846_入力(_,_入力した要素数,_,_) :- write('整数をカンマで区切り最大10個まで入力してください : '), get_line(Line), split(Line,[','],_整数ならび), write('ローテーションする数を入れてください : '), get_integer(_ローテーションする数),!. % *** user: ならびの回転 / 4 *** ならびの回転(左方向,1,[A|R],L) :- append(R,[A],L). ならびの回転(左方向,N,[A|R],L) :- N > 1, append(R,[A],L1), N1 is N - 1, ならびの回転(左方向,N1,L1,L). ならびの回転(右方向,1,L1,L2) :- append(L0,[A],L1), append([A],L0,L2). ならびの回転(右方向,N,L1,L2) :- N > 1, append(L0,[A],L1), append([A],L0,L3). # [1] 授業単元:C言語とアルゴリズム # ●問題1−1 反復型処理(ビット列の表示) #  符号なし32bit整数を入力して、その数を2進表示するプログラムを作成しなさい。 # さらに0のビットと1のビットの数を教示しなさい。ただし、2進表示は実行例のように4桁ずつ区切ること。 # # [実行例] # 符号なし32bit整数を入力してください. # 987654321 # 987654321 は2進表示で 0011 1010 1101 1110 0110 1000 1011 0001 です. # 0のビット数は15,1のビット数は17です. # # ●問題1−2  #  符号なし32bit整数を2つ入力して、それらを2進表示するプログラムを作成しなさい。 # さらに、実行例のようにビット反転(1の補数表示〜),ビットシフト(<<, >>), ビット論理積(&),ビット論理和(|), # ビット排他的論理和(^)を表示しなさい。ただし2進表示は4桁ずつ区切ること. # また問題1−1で作成した2進表示の関数を再利用すること。 # # [実行例] # 符号なし32bit整数2つを入力してください. # 987654321 123456789 # 987654321 は2進表示で 0011 1010 1101 1110 0110 1000 1011 0001 , # 123456789 は2進表示で 0000 0111 0101 1011 1100 1101 0001 0101 です. # 〜987654321 は2進表示で 1100 0101 0010 0001 10010111 0100 1110 , # 〜123456789 は2進表示で 1111 1000 1010 0100 0011 0010 1110 1010 です. # 987654321 << 1は2進表示で 0111 0101 1011 1100 1101 0001 0110 0010 , # 123456789 >> 1は2進表示で 0000 0011 1010 1101 1110 0110 1000 1010 です. # 987654321 & 123456879 は2進表示で 0000 0010 0101 1010 0100 1000 0001 0001 です. # 987654321 | 123456879 は2進表示で 0011 1111 1101 1111 1110 1101 1011 0101 です. # 987654321 ^ 123456879 は2進表示で 0011 1101 1000 0101 1010 0101 1010 0100 です. 符号なし32bit整数を入力して、その数を2進表示する(_10進数) :- 二進数(_10進数,L), '4文字区切り'(L,S), findsum(1,member(0,L),S0), findsum(1,member(1,L),S1), write_formatted('%t は2進表示で %t です\n0のビット数は%t,1のビット数は%tです.\n',[_10進数,S,S0,S1]). 符号なし32bit整数を2つ入力して、論理和を2進表示する(_10進数_1,_10進数_2) :- 二進数(_10進数_1,L_1), 二進数(_10進数_2,L_2), ビットの論理和(L_1,L_2,L_3), '4文字区切り'(L_3,S), write_formatted('%t は2進表示で %t ,\n%t は2進表示で %t です.\n',[_10進数_1,S_1,_10進数_2,S_2]). ビットを反転して表示(_10進数) :- 二進数(_10進数,L), ビットの反転(L,L1), '4文字区切り'(L1,S), write_formatted('〜%t は2進表示で %t です.\n',[_10進数,S]). ビットを左シフトして表示(_10進数,_シフト数) :- 二進数(_10進数,L), ビットの左シフト(_シフト数,L,L1), '4文字区切り'(L1,S), write_formatted('%t >> %t は2進表示で %t です.\n',[_10進数,_シフト数,S]). ビットを右シフトして表示(_10進数,_シフト数) :- 二進数(_10進数,L), ビットの右シフト(_シフト数,L,L1), '4文字区切り'(L1,S), write_formatted('%t >> %t は2進表示で %t です.\n',[_10進数,_シフト数,S]). 符号なし32bit整数を2つ入力して、論理和を2進表示する(_10進数_1,_10進数_2) :- 二進数(_10進数_1,L_1), 二進数(_10進数_2,L_2), ビットの論理和(L_1,L_2,L_3), '4文字区切り'(L_3,S), write_formatted('%t | %t は2進表示で %t です.\n',[_10進数_1,_10進数_2,S]). 符号なし32bit整数を2つ入力して、論理積を2進表示する(_10進数_1,_10進数_2) :- 二進数(_10進数_1,L_1), 二進数(_10進数_2,L_2), ビットの論理積(L_1,L_2,L_3), '4文字区切り'(L_3,S), write_formatted('%t & %t は2進表示で %t です.\n',[_10進数_1,_10進数_2,S]). 符号なし32bit整数を2つ入力して、排他的論理和を2進表示する(_10進数_1,_10進数_2) :- 二進数(_10進数_1,L_1), 二進数(_10進数_2,L_2), ビットの排他的論理和(L_1,L_2,L_3), '4文字区切り'(L_3,S), write_formatted('%t ^ %t は2進表示で %t です.\n',[_10進数_1,_10進数_2,S]). ビットの反転([],[]). ビットの反転([0|R1],[1|R2]) :- ビットの反転(R1,R2). ビットの反転([1|R1],[0|R2]) :- ビットの反転(R1,R2). ビットの右回転(_シフト数,_ビットならび,_シフトしたビットならび) :- ならびの回転(右方向,_シフト数,_ビットならび,_シフトしたビットならび). ビットの左回転(_シフト数,_ビットならび,_シフトしたビットならび) :- ならびの回転(左方向,_シフト数,_ビットならび,_シフトしたビットならび). ビットの左シフト(_シフト数,_ビットならび,_シフトしたビットならび) :- length(L1,_シフト数), length(L2,_シフト数), all(L2,0), append(L1,L3,_ビットならび), append(L3,L2,_シフトしたビットならび). ビットの右シフト(_シフト数,_ビットならび,_シフトしたビットならび) :- length(L1,_シフト数), length(L2,_シフト数), all(L2,0), append(L3,L1,_ビットならび), append(L2,L3,_シフトしたビットならび). ビットの論理和([],[],[]). ビットの論理和([0|R1],[0|R2],[0|R3]) :- ビットの論理和(R1,R2,R3). ビットの論理和([1|R1],[0|R2],[1|R3]) :- ビットの論理和(R1,R2,R3). ビットの論理和([0|R1],[1|R2],[1|R3]) :- ビットの論理和(R1,R2,R3). ビットの論理和([1|R1],[1|R2],[1|R3]) :- ビットの論理和(R1,R2,R3). ビットの論理積([],[],[]). ビットの論理積([0|R1],[0|R2],[0|R3]) :- ビットの論理積(R1,R2,R3). ビットの論理積([1|R1],[0|R2],[0|R3]) :- ビットの論理積(R1,R2,R3). ビットの論理積([0|R1],[1|R2],[0|R3]) :- ビットの論理積(R1,R2,R3). ビットの論理積([1|R1],[1|R2],[1|R3]) :- ビットの論理積(R1,R2,R3). ビットの論理的排他和([],[],[]). ビットの論理的排他和([0|R1],[0|R2],[0|R3]) :- ビットの論理的排他和(R1,R2,R3). ビットの論理的排他和([1|R1],[0|R2],[1|R3]) :- ビットの論理的排他和(R1,R2,R3). ビットの論理的排他和([0|R1],[1|R2],[1|R3]) :- ビットの論理的排他和(R1,R2,R3). ビットの論理的排他和([1|R1],[1|R2],[0|R3]) :- ビットの論理的排他和(R1,R2,R3). 二進数(_10進数,L) :- length(L,32), 二進数(_10進数,[],X), append(L1,X,L), all(L1,0). 二進数(J,Y,[J|Y]) :- J < 2. 二進数(J,Y,X) :- J >= 2,J2 is J // 2,M is J mod 2,二進数(J2,[M|Y],X). '4文字区切り'([],''). '4文字区切り'([A,B,C,D|R],S) :- '4文字区切り'(R,S1), concat_atom([A,B,C,D,' ',S1],S). # 問題文 # データを読み込み2進、8進、10進、16進で表示せよ。 # ただし、読み込みはgetchar()で4桁入力。表示はputchar()で必要桁数表示する。 # データが0の時処理を終了、データ入力はXXXXとする。 データを読み込み2進、8進、10進、16進で表示 :- repeat, write('4桁の数字を入力してください : '), get_char(Line), atom_to_term(Line,_10進数,_), データを読み込み2進、8進、10進、16進で表示(_10進数). データを読み込み2進、8進、10進、16進で表示(0) :- !. データを読み込み2進、8進、10進、16進で表示(_10進数) :- N進数(2,_10進数,_2進数文字列), N進数(8,_10進数,_8進数文字列), N進数(16,_10進数,_16進数文字列), write_formatted('%tの 2進数表示は %t, 8進数表示は %t, 16進数表示は %t,です\n',[_2進数文字列,_8進数文字列,_16進数文字列]), fail. N進数(N,_10進数,_N進数文字列) :- N進数(N,_10進数,[],X), concat_atom(X,_N進数文字列). N進数(N,J,Y,[M|Y]) :- J < N,N進数利用文字(J,M),!. N進数(N,J,Y,X) :- J >= N, J2 is J // N, M is J mod N, N進数利用文字(M,M2), N進数(N,J2,[M2|Y],X). N進数利用文字ならび(N,_利用文字ならび) :- length(L1,N), findall(A,N進数利用文字(_,A),L), append(L1,_,L). N進数剰余数利用文字ならび(N,_剰余数利用文字ならび) :- length(L1,N), findall([M,A],N進数利用文字(M,A),L), append(L1,_,L). N進数を利用した簡単な暗号化(N,_文,_暗号化された文) :- atom_codes(_文,Codes), Y is 65536 // N, atomic_length(Y,_桁数), N進数を利用した簡単な暗号化(N,_桁数,Codes,_暗号化された文字ならび), concat_atom(_暗号化された文字ならび,' ',_暗号化された文). N進数を利用した簡単な暗号化(_,_,[],[]). N進数を利用した簡単な暗号化(N,_桁数,[A|R1],[C|R2]) :- N進数(N,A,[],L), '頭部に零を詰める'(_桁数,L,L2), atom_chars(C,L2), N進数を利用した簡単な暗号化(N,_桁数,R1,R2). N進数利用文字(0,'0'). N進数利用文字(1,'1'). N進数利用文字(2,'2'). N進数利用文字(3,'3'). N進数利用文字(4,'4'). N進数利用文字(5,'5'). N進数利用文字(6,'6'). N進数利用文字(7,'7'). N進数利用文字(8,'8'). N進数利用文字(9,'9'). N進数利用文字(10,'A'). N進数利用文字(11,'B'). N進数利用文字(12,'C'). N進数利用文字(13,'D'). N進数利用文字(14,'E'). N進数利用文字(15,'F'). N進数利用文字(16,'G'). N進数利用文字(17,'H'). N進数利用文字(18,'I'). N進数利用文字(19,'J'). N進数利用文字(20,'K'). N進数利用文字(21,'L'). N進数利用文字(22,'M'). N進数利用文字(23,'N'). N進数利用文字(24,'O'). N進数利用文字(25,'P'). N進数利用文字(26,'Q'). N進数利用文字(27,'R'). N進数利用文字(28,'S'). N進数利用文字(29,'T'). N進数利用文字(30,'U'). N進数利用文字(31,'V'). N進数利用文字(32,'W'). N進数利用文字(33,'X'). N進数利用文字(34,'Y'). N進数利用文字(35,'Z'). N進数利用文字(36,'a'). N進数利用文字(37,'b'). N進数利用文字(38,'c'). N進数利用文字(39,'d'). N進数利用文字(40,'e'). N進数利用文字(41,'f'). N進数利用文字(42,'g'). N進数利用文字(43,'h'). N進数利用文字(44,'i'). N進数利用文字(45,'j'). N進数利用文字(46,'k'). N進数利用文字(47,'l'). N進数利用文字(48,'m'). N進数利用文字(49,'n'). N進数利用文字(50,'o'). N進数利用文字(51,'p'). N進数利用文字(52,'q'). N進数利用文字(53,'r'). N進数利用文字(54,'s'). N進数利用文字(55,'t'). N進数利用文字(56,'u'). N進数利用文字(57,'v'). N進数利用文字(58,'w'). N進数利用文字(59,'x'). N進数利用文字(60,'y'). N進数利用文字(61,'z'). # ちょっと質問 # レシピリスト #  オムレツ:卵 バター #  オムライス:卵 バター ご飯 玉葱 人参 ベーコン #  カレー:じゃがいも 人参 玉葱 牛肉 ルー #  ・・・ # 在庫リスト # 豚肉 バター じゃがいも トマト 牛乳・・・ # # というリストがあり、今の在庫でどんなものが出来るか、 # どんなものが出来そうか?を優先順位つけたい場合 # どういうやり方がスマートでしょう? # レシピリストを頭から順に、在庫リストと総当たりで比較? # 逆に在庫リストにあるものを1個ずつ拾ってレシピリストと比較? # # こういうプログラムってどっかにあるかなぁ 作ることのできるお勧め料理は(_料理ならび) :- 料理種別を選択してもらう(_種別), 現在の材料で作ることのできる料理を探す(_料理ならびの一), 確信度が高い順に並べ直す(_種別,_料理ならびの一,_料理ならび). 現在の材料で作ることのできる料理を探す([_料理|R]) :- レシピ(_料理,_材料ならび), すべての材料が在庫としてある(_材料ならび), 現在の材料で作ることのできる料理を探す(R). 現在の材料で作ることのできる料理を探す([]). すべての材料が在庫としてある([]) :- !. すべての材料が在庫としてある([_材料|R]) :- 在庫(_材料), すべての材料が在庫としてある(R). 料理種別を選択してもらう(_種別) :- write('どんな種類の料理をお望みですか\n'), get_line(_文), 料理種別を選択してもらう(_文,_種別). 料理種別を選択してもらう(_文,_種別) :- 文を解析して種別を得る(_文,_種別), member(_種別,[肉料理,魚料理,卵料理]),!. 料理種別を選択してもらう(_,_種別) :- write('申し訳ございませんが現在ご用意できるのは'), 可能な料理種別を列挙する, write('しかございません。この中からお選びください\n'), get_line(_文), 料理種別を選択してもらう(_文,_種別). 可能な料理種別を列挙する :- concat_atom([肉料理,魚料理,卵料理],と,_列挙文字列), write_formatted('%t',[_列挙文字列]). 確信度が高い順に並べ直す(_種別,_料理ならびの一,_料理ならび) :- 料理ならびに確信度を付加(_種別,_料理ならびの一,_確信度が先頭に付いた料理ならび), rsort(_確信度が先頭に付いた料理ならび,_確信度が先頭に付いた料理ならびの二), 先頭の確信度を外す(_確信度が先頭に付いた料理ならびの二,_料理ならび). 料理ならびに確信度を付加(_,[],[]) :- !. 料理ならびに確信度を付加(_種別,[_料理|R1],[[_確信度,_料理]|R2]) :- 分類確信度(_種別,_料理,_確信度), 料理ならびに確信度を付加(_種別,R1,R2),!. 料理ならびに確信度を付加(_種別,[_料理|R1],[[0,_料理]|R2]) :- 料理ならびに確信度を付加(_種別,R1,R2),!. 先頭の確信度を外す([],[]) :- !. 先頭の確信度を外す([[_|_料理]|R1],[_料理|R2]) :- 先頭の確信度を外す(R1,R2). レシピ(オムレツ,[卵,バター]). レシピ(オムライス,[卵,バター,ご飯,玉葱,人参,ベーコン]). レシピ(カレー,[じゃがいも,人参,玉葱,牛肉,ルー]). 在庫(豚肉). 在庫(バター). 在庫(じゃがいも). 在庫(トマト). 在庫(牛乳). 在庫(卵). 在庫(人参). 分類確信度(肉料理,オムレツ,20). 分類確信度(肉料理,カレー,50). 分類確信度(肉料理,ターンシチュー,90). 分類確信度(肉料理,ビーフステーキ,100). 分類確信度(卵料理,ボイルドエッグ,100). 分類確信度(卵料理,ベーコンスクランブル,80). 分類確信度(卵料理,茶碗蒸し,70). 分類確信度(卵料理,オムレツ,60). 分類確信度(魚料理,シュリンプカレー,80). 文を解析して料理種別を得る(_文,_種別) :- atom_chars(_文,_文字ならび), 料理種別を解析して得る(_文字ならび,R,_種別). 料理種別を解析して得る(_文,_残りの文,_種別) :- 料理種別(_文,_残りの文の一,_種別), 料理種別の後置詞(_残りの文の一,_残りの文), 料理種別の述部(_残りの文の二,_残りの文). 料理種別を解析して得る(_文,_残りの文,_種別) :- 料理種別(_文,_残りの文の一,_種別), 料理種別の後置詞(_残りの文の一,_残りの文),!. 料理種別を解析して得る(_文,_残りの文,_種別) :- 料理種別(_文,[],_種別),!. 料理種別([肉,料,理|R],R,肉料理). 料理種別([卵,料,理|R],R,卵料理). 料理種別([魚,料,理|R],R,魚料理). 料理種別([す,っ,ぽ,ん,料,理|R],R,すっぽん料理). 料理種別の後置詞([を|R],R). 料理種別の後置詞([が|R],R). 料理種別の述部([食,べ,た,い|R],R). 料理種別の述部([く,だ,さ,い|R],R). rsort(L1,L2) :- sort(L1,L3),reverse(L3,L2). # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク):1から999までの整数を入力 その読み方をを表示するプログラムを書け # 1から999でない場合エラーを表示せよ 数値の読み方(N,エラー) :- N < 1,!. 数値の読み方(N,エラー) :- N >= 1000,!. 数値の読み方(0,''). 数値の読み方(1,いち). 数値の読み方(2,に). 数値の読み方(3,さん). 数値の読み方(4,よん). 数値の読み方(5,ご). 数値の読み方(6,ろく). 数値の読み方(7,なな). 数値の読み方(8,はち). 数値の読み方(9,きゅう). 数値の読み方(N,S) :- N > 9,N < 20, N1 is N - 10, 数値の読み方(N1,S1), concat_atom([じゅう,S1],S). 数値の読み方(N,S) :- N > 19,N < 100, N1 is N // 10, M1 is N mod 10, 数値の読み方(N1,S1), 数値の読み方(M1,S2), concat_atom([S1,じゅう,S2],S). 数値の読み方(N,S) :- N > 99,N < 199, N1 is N - 100, 数値の読み方(N1,S1), concat_atom([ひゃく,S1],S). 数値の読み方(N,S) :- N > 799,N < 899, M1 is N mod 100, 数値の読み方(M1,S2), concat_atom([はっぴゃく,S2],S). 数値の読み方(N,S) :- N > 299,N < 399, M1 is N mod 100, 数値の読み方(M1,S2), concat_atom([さんびゃく,S2],S). 数値の読み方(N,S) :- N > 199,N < 999, \+((N > 799,N < 899)), \+((N > 299,N < 399)), N1 is N // 100, M1 is N mod 100, 数値の読み方(N1,S1), 数値の読み方(M1,S2), concat_atom([S1,ひゃく,S2],S). # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): # 「スコアー,ステージナンバー,名前」が入っているファイルがあるとする。 # # 降順にソート済みのスコアーデータのファイルから、上位10件を配列に読み込み、 # 新たに11件目のスコアーデータを入力後、スコアーの大きい順に並び替えを行い、 # 上位10件のデータを再度書き込むプログラムを作成せよ # # 999999,6,faegalr # 999976,123,aaaaaa # 999923,23,Steel # 999765,43,tyudayo # 786754,34,tyui # 713146,10,gawehgpoin # 654789,12,abaeuogn # 479136,65,gwerhja # 456789,43,tyu # 454545,45,454545 # 123456,34,ert t908(File) :- get_lines(File,Lines), findall(U,(member(A,Lines),split(A,[','],U)),L1), get_line(Line), split(Line,[','],W), 降順整列状態を保って挿入する(W,L1,L2), append(L3,[_],L2), findall(S,(member(L4,L3),concat_atom(L4,',',S)),L5), put_lines(File,L5). 降順整列状態を保って挿入する(_挿入要素,L1,L2) :- append(L3,L4,L1), append(L3,[_挿入要素|L4],L2), すべての要素が大きい(L3,_挿入要素), すべての要素が小さいか等しい(L4,_挿入要素). すべての要素が大きい([],_). すべての要素が大きい([A|R],B) :- A @> B,すべての要素が大きい(R,B). すべての要素が小さいか等しい([],_). すべての要素が小さいか等しい([A|R],B) :- A @=< B,すべての要素が小さいか等しい(R,B). # 【課題】課題は3つあります。 % 問題1 星ピラミットの表示 入力された段数になるように星文字でピラミッドを築く :- write('段数を入れてください : '), get_integer(_段数), _最終行の星数 is (_段数 - 1) * 2 + 1, length(L,_最終行の星数), for(1,N,_段数), length(L1,N), all(L1,'*'), append(L0,L1,L0,L), all(L0,' '), atom_chars(Atom,L), write_formatted(' %t \n',[Atom]), N = _段数. 乱数を使って発生させた2つの整数のたし算を5問示しそれぞれの回答診断と5問答えるのに要した時間を表示 :- _開始時刻 is time, for(1,N,5), 一問答える, N = 5, _終了時刻 is time, _回答するのに要した時間 is _終了時刻 - _開始時刻, write_formatted('5問回答までの時間は%t秒でした。\n',[_回答するのに要した時間]). 一問答える :- A is random mod 100, B is random mod 100, write_formatted('%t + %t =? ',[A,B]),get_integer(_答え), _正解 is A + B, 回答診断(_正解,_答え,_診断), write_formatted('%t\n',[_診断]). 回答診断(_正解,_正解,'正解です!!'). 回答診断(_正解,_答え,_診断) :- 1 is abs(_正解 - _答え), concat_atom(['惜しいです。正解は',_正解],_診断). 回答診断(_正解,_答え,_診断) :- \+(_答え=_正解), \+(1 is abs(_正解 - _答え)), concat_atom(['間違いです。正解は',_正解],_診断). 'ファイル名を入力させてそのファイルの行数その中に現れる小文字、大文字、その他の文字数を表示する' :- write('ファイル名を入力してください\n'), get_line(_ファイル名), get_chars(_ファイル名,Chars), '行数、小文字数、大文字数、その他文字数の集計'(Chars,_行数,_小文字数,_大文字数,_その他文字数), write_formatted('%t行ありました\n',[_行数]), write_formatted('小文字の数は%t\n',[_小文字数]), write_formatted('大文字の数は%t\n',[_大文字数]), write_formatted('その他の数は%t\n',[_その他文字数]). '行数、小文字数、大文字数、その他文字数の集計'([],0,0,0,0). '行数、小文字数、大文字数、その他文字数の集計'(['\n'|R],S1,S2,S3,S4) :- '行数、小文字数、大文字数、その他文字数の集計'(R,S11,S2,S3,S4), S1 is S11 + 1,!. '行数、小文字数、大文字数、その他文字数の集計'([A|R],S1,S2,S3,S4) :- A @>= 'a',A @=< 'x', '行数、小文字数、大文字数、その他文字数の集計'(R,S1,S21,S3,S4), S2 is S21 + 1,!. '行数、小文字数、大文字数、その他文字数の集計'([A|R],S1,S2,S3,S4) :- A @>= 'A',A @=< 'Z', '行数、小文字数、大文字数、その他文字数の集計'(R,S1,S2,S31,S4), S3 is S31 + 1,!. '行数、小文字数、大文字数、その他文字数の集計'([_|R],S1,S2,S3,S4) :- '行数、小文字数、大文字数、その他文字数の集計'(R,S1,S2,S3,S41), S4 is S41 + 1,!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_integer(N) :- repeat, get_line(Line), atom_to_term(Line,M,_), get_integer_診断(M,N),!. get_integer_診断(end_of_file,-1). get_integer_診断(N,N) :- integer(N). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). # [1] 授業単元: C言語演習 # [2] 問題文(含コード&リンク): # 正の整数nの2乗の数に、2種類の数字しか現れない # 4桁の正の整数 n をすべて挙げなさい '正の整数nの2乗の数に、2種類の数字しか現れない4桁の正の整数 n をすべて挙げる'(L) :- findall(N,'正の整数nの2乗の数に、2種類の数字しか現れない4桁の正の整数 n '(N),L). '正の整数nの2乗の数に、2種類の数字しか現れない4桁の正の整数 n '(N) :- 組合せ([0,1,2,3,4,5,6,7,8,9],2,[A,B]), length(L,9), '2種類の数字しか現れないならび'(A,B,0,0,L), concat_atom(L,Atom), atom_to_term(Atom,N1,_), N is truncate(sqrt(N1)). N >= 1000,N =< 9999, U is N * N. '2種類の数字しか現れないならび'(_,_,1,1,[]) :- !. '2種類の数字しか現れないならび'(A,B,_,K,[A|R]) :- '2種類の数字しか現れないならび'(A,B,1,K,R). '2種類の数字しか現れないならび'(A,B,K,_,[B|R]) :- '2種類の数字しか現れないならび'(A,B,K,1,R). # [1] 授業単元: C言語演習 # 以下のプログラムを作成せよ # # 9個のマスがあり、1〜9の数字が一個だけ入るとする。 # このとき、符号なし整数1つでマスにまだ入れられていない数字を記録したい。 # そこで、下位ビットから9ビット目までで1〜9がマスに入っているかどうかを表すこととする。 # 空白のマスは0で表示する。 # # 例:132584090→下位9ビット:001100000 # この場合、6もしくは7がマスに入っていないため、6ビット目と7ビット目に1が立っていることとなる。 # # 課題プログラムを実行すると、in.txtから9個の文字データを読み込み、上記のような変換をして9ビットのデータのビット列を表示する。 # 例えば132584090とin.txtに記録されていた場合、下位9ビットは # 001100000と表示される # # 手順 # 1..ビット列を記録する変数を宣言し、0で初期化する。 # 2..9個の数字を9個の変数に ファイルから読み込む # 3..各変数には0〜9の数字が入っているが、0以外の場合に対応する桁に1を立てる # 4..ビット列の 0と1を反転させる # 5..下位9ビットをprintf関数で表示する # # 6..in.txtの値をいろいろ変化させて、プログラムが正しいことを確認せよ # # 発展課題: # in.txtに9x9の以下のような数字列を入れておく. # 縦と横に必ず1から9までの数字が並ぶとする。ここで各行、各列の空白(空白は0で表す)に入りうる数字をビット列で表せ。 # # 9行、9列なので、18個の整数データとなる。 # # 次に、空白があれば、どのように処理すれば、空白に入る数字を決めることができるか、考えよ。 # # 1 2 3 4 0 6 0 8 9 # 2 3 4 5 6 7 8 9 1 # 3 4 5 0 7 0 9 1 2 # 0 5 6 7 8 9 1 2 3 # 5 6 7 8 9 1 2 3 4 # 6 7 0 9 0 2 3 4 5 # 7 8 9 1 2 3 4 5 6 # 8 0 1 2 3 4 5 0 7 # 9 1 2 3 4 5 6 7 8 # # 1行目-> 001010000 # 5列目-> 000010001 c2_949 :- get_lines('in.txt',L), findall(L2,(member(A,L),split(A,[' '],L2)),L3), findall([N,L5],(member(L4,L3),欠落した番号ビット(L4,L5)),L6), c2_949_表示(L6). 欠落した番号ビット(L1,L2) :- length(L2,9), findall(N,(for(1,N,9),\+(member(N,L1)),L3), 欠落した番号ビット(9,L3,L2). 欠落した番号ビット(N,_,[]) :- N < 1. 欠落した番号ビット(N,L,[0|R]) :-. \+(member(N,L)), N1 is N - 1, 欠落した番号ビット(N1,L,R). 欠落した番号ビット(N,L,[1|R]) :-. member(N,L), N1 is N - 1, 欠落した番号ビット(N1,L,R). c2_949_表示([]) :- !. c2_949_表示([[N,L]|R]) :- concat_atom(L,' ',S), write_formatted('%t 行目: %t\n',[S]), c2_949_表示(R). # [1] 授業単元: アルゴリズム&アプリケーション # [2] 問題文(含コード&リンク):売掛表がcsvファイルで作られています。 # 各行の情報は、 # 顧客名,前月繰越高,当月入金高,当月売上高,締め日付 # であり、締め日付で昇順に整列していて、見出し等冗長部分はありません。 # 今回は問題を単純化するため、一人の顧客分しか扱わないことにします。 # さて更新プログラムのバグから、或る月の前月繰越高が # その前月の 前月繰越高-当月入金高+当月売上高 と不整合になってしまいました。 # 不整合になった以降の情報が正しく、 # それ以前の情報の当月入金高、当月売上高、締め日付については誤りがないとして、 # 1) 不整合部分を探し # 2) それ以前のすべての前月繰越高を全体が整合するように書き換えなさい。 # ファイルは一旦別のファイル(例えば/tmp/xxxxxx)に正しいものをつくり、 # その後、元のcsvファイルに書き戻しなさい。 # [3] 環境 #  [3.1] OS: Linux #  [3.2] コンパイラ名とバージョン: gcc 3.4 #  [3.3] 言語: C # [4] 期限: 期限はありません # [5] その他の制限: 日付などの持ち方は自由に工夫してよい。 # # 売掛表の遡行修正(_ファイル名) :- get_split_lines(_ファイル名,[','],L), L = [[_,A,_,_,_]|_], 不整合が生じた行(L,A,_それ以前のならび,_不整合が生じた行,_それ以後のならび), reverse(_それ以前のならび,_逆順のそれ以前のならび), _不整合が生じた行 = [_,_前月繰越高,_,_,_], 不整合が生じる以前の行を遡って修正(_前月繰越高,_逆順のそれ以前のならび,[],L2), append(L2,[_不整合が生じた行|_それ以後のならび],_整合されたならび), 書き戻し(_ファイル名,_整合されたならび). 不整合が生じた行([[_顧客名,_前月繰越高,_当月入金高,_当月売上高,_締め日付]|R1],_前月繰越高2,[],[_顧客名,_前月繰越高,_当月入金高,_当月売上高,_締め日付],R1) :- \+(_前月繰越高2 = _前月繰越高),!. 不整合が生じた行([[_顧客名,_前月繰越高,_当月入金高,_当月売上高,_締め日付]|R1],_前月繰越高,[[_顧客名,_前月繰越高,_当月入金高,_当月売上高,_締め日付]|R2],_不整合が生じた行,R3) :- _当月繰越高 is _前月繰越高 - _当月入金高 + _当月売上高, 不整合が生じた行(R1,_当月繰越高,[[_顧客名,_前月繰越高,_当月入金高,_当月売上高,_締め日付]|R2],_不整合が生じた行,R3). 不整合が生じる以前の行を遡って修正(_,[],L,L) :- !. 不整合が生じる以前の行を遡って修正(_前月繰越高,[[_顧客名,_前月繰越高,_当月入金高,_当月売上高,_締め日付]|R1],L1,L2) :- _前々月繰越高 is _前月繰越高 - 当月売上高 + _当月入金高, 不整合が生じる以前の行を遡って修正(_前々月繰越高,[[_顧客名,_前々月繰越高,_当月入金高,_当月売上高,_締め日付]|L1],L2). 書き戻し(_ファイル名,_整合されたならび) :- tmpnam(TMPNAMFILE), open(TMPNAMFILE,write,Output), 仮ファイルに書く(Output,_整合されたならび), close(Output), cp(TMPNAMFILE,_ファイル名). 仮ファイルに書く(Output,_整合されたならび), member(L,_整合されたならび), concat_atom(L,',',S), write_formatted(Output,'%t\n',[S]), fail. 仮ファイルに書く(_,_). # 論理の問題ですが # # 95年「ここ数年で一番出来が良い」 # 96年「10年に1度の逸品」 # 97年「1976年以来の品質」 # 98年「10年に1度の当たり年」 # 99年「品質は昨年より良い」 # 00年「出来は上々で申し分の無い仕上がり」 # 01年「ここ10年で最高」 # 02年「過去10年で最高と言われた01年を上回る出来栄え」「1995年以来の出来」 # 03年「100年に1度の出来」「近年にない良い出来」 # 04年「香りが強く中々の出来栄え」 # 05年「ここ数年で最高」 # 06年「昨年同様良い出来栄え」 # 07年「柔らかく果実味が豊かで上質な味わい」 # 08年「豊かな果実味と程よい酸味が調和した味 # 09年「50年に1度の出来栄え」 # # です % とにもかくにも、こんな述語を一度構成しましょう。何をするかはそれから。 ボージョレ・ヌーボーの謳い文句('95年','ここ数年で一番出来が良い'). ボージョレ・ヌーボーの謳い文句('96年','10年に1度の逸品'). ボージョレ・ヌーボーの謳い文句('97年','1976年以来の品質'). ボージョレ・ヌーボーの謳い文句('98年','10年に1度の当たり年'). ボージョレ・ヌーボーの謳い文句('99年','品質は昨年より良い'). ボージョレ・ヌーボーの謳い文句('00年','出来は上々で申し分の無い仕上がり'). ボージョレ・ヌーボーの謳い文句('01年','ここ10年で最高'). ボージョレ・ヌーボーの謳い文句('02年','過去10年で最高と言われた01年を上回る出来栄え,1995年以来の出来'). ボージョレ・ヌーボーの謳い文句('03年','100年に1度の出来,近年にない良い出来'). ボージョレ・ヌーボーの謳い文句('04年','香りが強く中々の出来栄え'). ボージョレ・ヌーボーの謳い文句('05年','ここ数年で最高'). ボージョレ・ヌーボーの謳い文句('06年','昨年同様良い出来栄え'). ボージョレ・ヌーボーの謳い文句('07年','柔らかく果実味が豊かで上質な味わい'). ボージョレ・ヌーボーの謳い文句('08年','豊かな果実味と程よい酸味が調和した味'). ボージョレ・ヌーボーの謳い文句('09年','50年に1度の出来栄え'). ここ数年で一番出来が良い(_年産) :- 出来が良い(_年産,_出来具合), ここ数年(_年産,Term), findall(_出来具合2,(member(_年産2,Term),ボージョレ・ヌーボー(_年産2,_出来具合2)),_ここ数年のボージョレ・ヌーボー出来具合ならび), max(_ここ数年のボージョレ・ヌーボー評価ならび,_出来具合). ここ数年(_年産,_ここ数年) :- 年を切り取る(_年産,_年), 定義者の年齢(_年齢), 数年は定義者の年齢によって異なる(_年齢,_数年), _起点年 is _年 - _数年, findall(_年産2,(for(_起点年,_年2,_年),concat_atom([_年2,年],_年産2)),_ここ数年). 年を切り取る(_年産,_年) :- sub_atom(_年産,S,_,_,年), sub_atom(_年産,0,S,_,_年2), atom_to_term(_年2,_年,_). 定義者の年齢(60). 数年は定義者の年齢によって異なる(_年齢,3) :- _年齢 < 70. 数年は定義者の年齢によって異なる(_年齢,5) :- _年齢 >= 70. # # 入力した10進数の数字を表示し、10進数を2進数に、10進数を36進数に変換し、表示する。 # 36進数は{0〜9,A〜Z}の文字を使用しなければいけない。 入力した10進数の数字を表示し、10進数を2進数に、10進数を36進数に変換し、表示する(_10進数) :- N進数(2,_10進数,_2進数文字列), N進数(36,_10進数,_36進数文字列), write_formatted('10進数 %t は 2進数表現では %t 36進数表現では %t となります\n',[_10進数,_2進数,_36進数]). '2進数10進数変換'(L,N) :- reverse(L,L1), '2進数10進数変換の二'(L1,N). '2進数10進数変換の二'([],0). '2進数10進数変換の二'([A|R1],N) :- '2進数10進数変換の二'(R1,N2), N is N2 * 2 + A. N進数(N,_10進数,_N進数文字列) :- N進数(N,_10進数,[],X), concat_atom(X,_N進数文字列). N進数(N,J,Y,[M|Y]) :- J < N,N進数利用文字(J,M),!. N進数(N,J,Y,X) :- J >= N, J2 is J // N, M is J mod N, N進数利用文字(M,M2), N進数(N,J2,[M2|Y],X). N進数利用文字(0,'0'). N進数利用文字(1,'1'). N進数利用文字(2,'2'). N進数利用文字(3,'3'). N進数利用文字(4,'4'). N進数利用文字(5,'5'). N進数利用文字(6,'6'). N進数利用文字(7,'7'). N進数利用文字(8,'8'). N進数利用文字(9,'9'). N進数利用文字(10,'A'). N進数利用文字(11,'B'). N進数利用文字(12,'C'). N進数利用文字(13,'D'). N進数利用文字(14,'E'). N進数利用文字(15,'F'). N進数利用文字(16,'G'). N進数利用文字(17,'H'). N進数利用文字(18,'I'). N進数利用文字(19,'J'). N進数利用文字(20,'K'). N進数利用文字(21,'L'). N進数利用文字(22,'M'). N進数利用文字(23,'N'). N進数利用文字(24,'O'). N進数利用文字(25,'P'). N進数利用文字(26,'Q'). N進数利用文字(27,'R'). N進数利用文字(28,'S'). N進数利用文字(29,'T'). N進数利用文字(30,'U'). N進数利用文字(31,'V'). N進数利用文字(32,'W'). N進数利用文字(33,'X'). N進数利用文字(34,'Y'). N進数利用文字(35,'Z'). # [1] 授業単元:C言語 # 課題1、関数rand()を使用して0〜999の整数を10個作り、 #     画面に表示させた後、昇順(数値の小さい順)に表示させるプログラム #     (実行例) #    756、836、237、109、290、647、27、933、198、239 #     27、109、198、237、239、290、647、756、836、933 # # 課題2、関数rand()を使用して0〜9の整数を作る。これを100回実行し、各数値の出現回数をn[0]〜n[9]の #     10個の配列にセット、これを用いて次のような棒グラフを表示するプログラムを作成せよ。 #    (実行例) #     0:*************** # 1:******** # 2:************* # 3:*********** # 4:******* # 5:********* # 6:*********** # 7:******** # 8:****** # 9:************ '0〜999の整数を10個作り、画面に表示させた後、昇順(数値の小さい順)に表示'(_整列した整数ならび) :- findall(N,N is random mod 1000,L), 昇順整列(L,[],_整列した整数ならび), ならびを行出力(_整数整列ならび). 昇順整列([],X,X). 昇順整列([A|R1],L,X) :- 挿入(A,L,L1),昇順整列(R1,L1,X). 挿入(A,[],[A]) :- !. 挿入(A,[B|R1],[A,B|R1]) :- A =< B,!. 挿入(A,[B|R1],[B|R2]) :- 挿入(A,R1,R2). ならびを行出力([]). ならびを行出力([A|R]) :- write_formatted('%t\n',[A]), ならびを行出力(R). 課題2 :-   課題2(100,[0,0,0,0,0,0,0,0,0,0],L),   課題2_グラフ(L). 課題2(0,L,L) :- !. 課題2(M,Y,L) :-   N is random mod 10, N2 is N + 1,   'N番目要素をカウントアップ'(1,N2,Y,Y1),   M1 is M - 1,   課題2(M1,Y1,L). 課題2_グラフ(L) :-   for(1,N,10),   N1 is N - 1,   list_nth(N,L,_頻度),   findall('*',for(1,U,_頻度),L2),   concat_atom([N1,':'|L2],S),   write_formatted('%t\n',[S]),   N = 10. 'N番目要素をカウントアップ'(M,0,Y,Y1) :- 'N番目要素をカウントアップ'(1,10,Y,Y1). 'N番目要素をカウントアップ'(N,N,[A|R1],[B|R1]) :- B is A + 1,!. 'N番目要素をカウントアップ'(M,N,[A|R1],[A|R2]) :- M2 is M + 1,'N番目要素をカウントアップ'(M2,N,R1,R2). # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # # 2つの文字列をS1とS2の配列に読み、S1の文字列の最初からn個目にS2の文字列を挿入する。 # 例えば、文字列が12345とABでn=3の場合、123AB45となる。 # (1) 配列を用いて作る。 # (2)関数とポインターを用いて作る。 # '2つの文字列をS1とS2の配列に読み、S1の文字列の最初からn個目にS2の文字列を挿入'(S1,S2,S) :- N1 is N - 1, sub_atom(S1,0,N1,_,_,A2,A3,_,_,_), concat_atom([A2,S2,A3],S). # [1] 授業単元: プログラミング実習 # [2] 問題文(含コード&リンク): # 明治元年以降の西暦年を4桁の数で入力すると、和暦で都市を表示するプログラムを作成せよ。 # ただし、2つの元号をもつ年は両方の年を表示すること。 # # (例、1989年→昭和64年、平成元年) 年号期間(明治,1868,1912). 年号期間(大正,1912,1926). 年号期間(昭和,1926,1989). 年号期間(平成,1989,2009). 西暦和暦応答(_西暦) :- findall(_和暦,明治以降の西暦和暦変換(_西暦,_和暦),L), concat_atom(L,',',S), write_formatted('%t->%t\n',[_西暦,S]). 明治以降の西暦和暦変換(_西暦,_和暦) :- 年号期間(_年号,A,B), _西暦>=A, _西暦= _単語2, 索引に追加(_単語,_行番号,_行での相対位置,R1,R2) :- 索引の全表示([]). 索引の全表示([[_単語,_位置情報ならび,頻度]|R]) :- findall(S,(member([A,B],_位置情報ならび),concat_atom(['L',A,'-',B],S)),L), concat_atom(L,' ',S2), write_formatted('%t (%t回) %t\n',[_単語,頻度,S2]), 索引の全表示(R). 出現頻度順索引全表示(_索引ならび) :- findall([_頻度|L],(member(L,_索引ならび),last(L,_頻度)),L1), sort(L1,L2), findall(L,member([_|L],L2),L3), reverse(L3,L4), 索引の全表示(L3). 索引の保護(_文名,_保護ファイル,_索引ならび) :- 現在定義されている索引は消去(_文名), assertz(索引(_文名,_索引ならび)), tell(_保護ファイル), listing(索引), told. 索引の定義(_文名,_保護ファイル,_索引ならび) :- reconsult(_保護ファイル), 索引(_文名,_索引ならび). 現在定義されている索引は削除(_文名) :- retract(索引(_文名,_)),!. 現在定義されている索引は削除(_). # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): # 課題1、文字列、と2つの整数(それぞれ n, m とする)を入力すると # n文字目から m文字 *に変えるプログラムを書け。 # # 実行例 #   文字を入力して下さい # Toshidaigaku # nを入力して下さい # 4 # mを入力して下さい # 2 # 出力は # Tos**daigaku # # 課題2、文字列を入力すると、全ての文字を次の文字コードの文字に # 変えて、結果を表示するプログラムを書け。 # # 実行例 # # 文字を入力して下さい # Toshidaigaku # 出力は # Uptijebjhblv # # '文字列と2つの整数(それぞれ n, m とする)を入力するとn文字目からm文字*に変える'(_文字列,N,M) :- sub_atom(_文字列,N - 1,M,R,_), length(L,M), all(L,*), concat_atom(L,S), sub_atom(_文字列,0,N,_,S1), sub_atom(_文字列,N + M,R,_,S2), concat_atom([S1,S,S2],X). # 1] 授業単元: プログラミング実習 # [2] 問題文(含コード&リンク): # # 〜課題2〜 # 変数nを入力すると、以下の図のような表示を行うプログラムをそれぞれ作成せよ。ただし、図はn=5の場合である。 # 1つのプログラムとして作成せよ。 # # *   #     *** # ***** # ******* # ********* ピラミッド(N) :- length(L1,N), all(L1,' '), ピラミッド(L1,[*]). ピラミッド([],HL) :- concat_atom(HL,S),write_formatted('%t\n',[S]). ピラミッド([_|L1],HL) :- append(L1,HL,L1,L2), concat_atom(L2,S), write_formatted('%t\n',[S]), ピラミッド(L1,['**'|HL]). # [1] 授業単元: プログラミング # [問題] # 行数と列数を引数として、その行数と列数だけアスタリスクを表示させる関数showwaster()を作成する。 # 入力は正の整数だけを考えれば平気です。 # # [解らない部分] # 下のプログラム中の???の部分が解りません… # 予備ですが現在、関数の呼び出しやプロトタイプ宣言などを習っています # よろしくお願い致します showwaster(M,N) :-   waster(1,N,M,L),   showwaster(L). showwaster([]). showwaster([L|R]) :-   writeAn(L),   showwaster(R). waster(N1,N,M,[]) :- N1 > N,!. waster(N1,N,M,[L|R]) :-   length(L,M),   all(M,*),   N2 is N1 + 1,   waster(N2,N,M,R). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% writeAn(_ならび) :-   concat_atom(_ならび,Atom),   write_formatted('%t\n',[Atom]). # 【 課題 】四人一首問題。「かるた部」の練習の一環として、 # 百人一首の中から第一文字が「や」の四枚を選んで、徹底的に練習することに # しました。四枚とは、 # やすらはでねなましものをさよふけてかたぶくまでのつきをみしかな # やへむぐらしげれるやどのさびしきにひとをもみをみうらみざらまし # やまざとはふゆぞさびしさまさりけるひとめもくさもかれぬとおもへば # やまがはにかぜのかけたるしがらみはながれもあへぬもみぢなりけり # ルールは、 # 1) 二人ゲームである。 # 2) 四枚のなかから無作為に二枚を選び自分と相手の札とする。 # 3) 読み手は四枚全部読み上げる。いたがって空札(取る札がない)が二枚含まれる。 # 4) 一枚取った時点で勝負はつくが、残りの一枚も競うこととする。 # # [問題] 乱数を使ってそれぞれの持ち札を決め、それを表示します。 # つぎに、読み札の順番を決めます。これはこの段階では表示しません。 # 一首、読み、それを表示し、 # 1) 空札 : 何文字目まで読まれてそれがわかったか # 2) 相手札 : 同上 # 3) 自分札 : 同上 # を表示しなさい。これを繰り返し、取り札がなくなったらゲームオーバー。 # 4) 二つのモードで作りなさい #  1) 読まれた札を二人とも記憶している。 #  2) 読まれた札は忘れてしまう。 # 実際には取り札には下の句が書かれていますが、ここでは一首全体をお互い理解しているものとします。 # # 歌([や,す,ら,は,で,ね,な,ま,し,も,の,を,さ,よ,ふ,け,て,か,た,ぶ,く,ま,で,の,つ,き,を,み,し,か,な]). 歌([や,へ,む,ぐ,ら,し,げ,れ,る,や,ど,の,さ,び,し,き,に,ひ,と,を,も,み,を,み,う,ら,み,ざ,ら,ま,し]). 歌([や,ま,ざ,と,は,ふ,ゆ,ぞ,さ,び,し,さ,ま,さ,り,け,る,ひ,と,め,も,く,さ,も,か,れ,ぬ,と,お,も,へ,ば]). 歌([や,ま,が,は,に,か,ぜ,の,か,け,た,る,し,が,ら,み,は,な,が,れ,も,あ,へ,ぬ,も,み,ぢ,な,り,け,り]). 四人一首(_) :- findall(X,歌(X),_歌ならび), 一枚読む(_歌ならび, _歌ならび, _自分の手持ち札ならび, _相手の手持ち札ならび, _読み札, _どちら, _どんな札か, _何字目でそれがわかったか), 四人一首表示(_自分の手持ち札ならび, _相手の手持ち札ならび), _読み札, _どちら, _何字目でそれがわかったか). 一枚読む([_読み札|_残り読み札], _まだ読まれていない札ならび, _自分の手持ち札, _相手の手持ち札, _読み札, _どちら, _どんな札か, _何字目でそれがわかったか) :- 間を取る, 現在の決まり字(_まだ読ませていない札ならび,_自分の手持ち札ならび,_相手の手持ち札ならび,_決まり字ならび), 間を取る, 決まり字で空札または札を取る(_読み札,_決まり字ならび,_どんな札か,_何字目でそれがわかったか), 決まり字はどこにある(_どんな札か,_自分の手持ち札ならび,_相手の手持ち札ならび,_どちら). 一枚読む([_読み札|_残り読み札], _まだ読まれていない札ならび1, _自分の手持ち札1, _相手の手持ち札1, _読み札, _どちら, _どんな札か, _何字目でそれがわかったか) :- 現在の決まり字(_まだ読まれていない札ならび,_自分の手持ち札ならび1,_相手の手持ち札ならび1,_決まり字ならび1), 決まり字で空札または札を取る(_読み札,_決まり字ならび1,_どんな札か1,_何字目でそれがわかったか1), 決まり字はどこにある(_どんな札か1,_自分の手持ち札ならび1,_相手の手持ち札ならび1,_どちら1), ならびから削除(_読み札,_まだ読まれていない札ならび,_まだ読まれていない札ならび2), ならびから削除(_読み札,_自分の手持ち札1,_自分の手持ち札2), ならびから削除(_読み札,_相手の手持ち札1,_相手の手持ち札2), 一枚読む(_残り読み札, _まだ読まれていない札ならび2, _自分の手持ち札2, _相手の手持ち札2, _読み札, _どちら, _どんな札か, _何字目でそれがわかったか). 現在の決まり字(_まだ読まれていない札ならび,_自分の手元札ならび,_相手の手元札ならび,_決まり字ならび) :- append(_自分の手持ち札ならび,_相手の手持ち札ならび,_手持ち札として存在する札ならび), 決まり字判断(_手持ち札として存在する札ならび,_まだ読まれていない札ならび,_決まり字ならび). 決まり字判断([],_,[]) :- !. 決まり字判断([_手持ち札|R1],_まだ読まれていない札ならび,[[_手持ち札,Len,_決まり字]|R2]) :-   先頭から共通部分の次の文字までで最長のもの(_手持ち札,_まだ読まれていない札ならび,Len,_決まり字),   決まり字判断(R1,_まだ読まれていない札ならび,R2). 先頭から共通部分の次の文字までで最長のもの(_手持ち札,_まだ読まれていない札ならび,Len,_決まり字) :-   findmax([Len,_決まり字],     (  member(_札,_まだ読まれていない札ならび),       \+(_札=_手持ち札),       先頭から共通部分の次の文字まで(1,_手持ち札,_札,_決まり字,Len)),[Len,_決まり字]),!. 先頭から共通部分の次の文字までで最長のもの([_決まり字|_],_,[1,_決まり字]). 先頭から共通部分の次の文字まで(N,[A|R1],[A|R2],[A|R3],Len) :-   N2 is N + 1,   先頭から共通部分の次の文字まで(R1,R2,R3,Len),!. 先頭から共通部分の次の文字まで(Len,[A|R1],_,[A],Len). 決まり字で空札または札を取る(_読み札,_決まり字ならび,_どんな札か,_何字目でそれがわかったか) :- atom_chars(_読み札,Chars1), append(L1,[_文字|L2],Chars1), 札をとるか(L1,_文字,_決まり字ならび,_どんな札か,_何字目でそれがわかったか). 札をとるか(L1,_文字,_決まり字ならび,_どんな札か,_何字目でそれがわかったか) :- append(L1,[_文字],_決まり字), member([_どんな札か,_何字目でそれがわかったか,_決まり字],_決まり字ならび). 決まり字はどこにある(_札,_自分の手持ち札ならび,自分の手持ち札) :- member(_札,_自分の札ならび). 決まり字はどこにある(_札,_自分の手持ち札ならび,相手の手持ち札) :- member(_札,_相手の手持ち札ならび). 間を取る. 四人一首表示(_自分の手持ち札ならび, _相手の手持ち札ならび), _読み札, _どちら, _何字目でそれがわかったか) :- write('私の札は\n'), writeAln(_自分の手持ち札ならび), write('相手の札は\n'), writeAln(_相手の手持ち札ならび), write('読み札は\n'), writeAn(_読み札), write_formatted('どこにあるか %t\n何字目でそれがわかったか %t字目\n',[_どちら,_何字目でそれがわかったか]),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% writeAln([]). writeAln([L|R]) :- concat_atom(L,A),write_formatted('%t\n',[A]),writeAln(R). writeAn(L) :- concat_atom(L,A),write_formatted('%t\n',[A]). # C#の宿題助けてくださしあ><お願いします。 # Visual Studio 2005使用です。 # 問題文などはzipの中に入っています。説明不足等がありましたら補足します。 # DLキーは2chです。 # 問い1 # ・二次元配列arrayを使ってユーザーのログインページを作りなさい。 # ・ユーザー名、パスワードのエラーメッセージを表示させること # 問い2 # 問い1のプログラムを応用して、新規ユーザー登録ボタンを作りなさい。kadai_06_02_01ユーザー登録は配列を利用すること # あらかじめユーザ登録用配列は3ユーザー分の名前とパスワードをセットしておくこと。 # ユーザー登録は10名までとする。10ユーザーを超えた場合はエラーを表示させなさい。 # つまり残り7枠を登録さればよい。 # プログラムはfor、while、do whileのどれかひとつでよい。 # ユーザー名のエラーはフラグを作って表示させたいです。でないと長くなると思うので ・・・。 # デザインは作成済みです。イメージがつかみにくいかもしれませんがよろしくお願いします・・・。 # slnファイルの名前がフォルダ名と違っていますが気にしないでください。 # 配列を使わないユーザー認証ページを作ってみたのでそちらを参考にしていただければと思います。 ttylogin :- write('\nlogin: '), get_line(_ユーザー名), write('password: '), system('stty -echo raw'), get_char(X),put_char('*'), パスワードを得る(X,Password), system('stty echo -raw'), ユーザ管理(_ユーザー名,Password,_診断), assertz(ログイン情報(_ユーザー名,Password,_診断)), シェル(_ユーザー名,_診断), ttylogin. パスワードを得る('\r',[]) :- !. パスワードを得る(C,[C|R]) :- get_char(C2), put_char('*'), パスワードを得る(C2,R). ユーザ管理(_ユーザー名,Password,ok) :- concat_atom(Password,PasswordAtom), カエサル暗号(17,PasswordAtom,_暗号文), user_password(_ユーザ名,_暗号文),!. ユーザ管理(_ユーザー名,Password,'UserPassword Error') :- user_passwork(_ユーザー名,_),!. ユーザ管理(_ユーザー名,Password,S) :- concat_atom([ユーザー名,_ユーザー名,は登録がありません],S),!. user_password(tama,'Jrslif'). シェル(_,S) :- \+(S==ok),!. シェル(_,_) :- system. adduser :- write('username : '),get_line(_ユーザー名), rawmode,write('password : '),get_char(Char),put_char(*), パスワードを得る(Char,Password),norawmode, write('Retype Password : '),get_char(Char2),put_char(*), パスワードを得る(Char2,Password2), パスワードは一致する(Password,Password2), 定義枠の限界を越えていない, ユーザー登録(_ユーザー名,Password), パスワードは一致する(A,A) :- !. パスワードは一致する(A,B) :- \+(A,B),write('タイプされたパスワードは一致しません\n'),fail. ユーザー登録(_ユーザー名,Password) :- concat_atom(Password,PasswordAtom), カエサル暗号(17,PasswordAtom,PasswordAtom2), assertz(user_password(_ユーザ-名,PasswordAtom2)). 定義枠の限界を越えていない :- 定義数の数(user_password/2,N),N < 10,!. 定義枠の限界を越えていない :- write('登録ユーザーが10を越えています。\n登録できません。\n'),fail. 定義節の数(Functor / Arity,N) :- functor(P,Functor,Arity),findsum(1,clause(P,_),F),N is truncate(F). # [1] 授業単元:プログラミング演習 # [2] # 3.キーボードから次々に整数を入力し、入力のたびにそれまでに入力した数字を # 小さい順に表示するプログラムを作成せよ。数字は10個入力したらプログラムは終了するようにすること. キーボードから 垢棒或瑤鯑力し、入力のたびにそれまでに入力した数字を小さい順に表示する :- キーボードから 垢棒或瑤鯑力し、入力のたびにそれまでに入力した数字を小さい順に表示する(10,[]). キーボードから 垢棒或瑤鯑力し、入力のたびにそれまでに入力した数字を小さい順に表示する(0,_) :- !. キーボードから 垢棒或瑤鯑力し、入力のたびにそれまでに入力した数字を小さい順に表示する(N,_現在まで整列されたならび) :- get_integer(_整数), 小さい順整列ならびに挿入(_整数,_現在まで整列されたならび,_整列し直したならび), concat_atom(_整列し直したならび,' ',_整列文字列), write_formatted('%t\n',[_整列文字列]), N1 is N - 1, キーボードから 垢棒或瑤鯑力し、入力のたびにそれまでに入力した数字を小さい順に表示する(N1,_整列し直したならび). 小さい順整列ならびに挿入(N,[],[N]) :- !. 小さい順整列ならびに挿入(N,[A|R],[N,A|R]) :- N < A,!. 小さい順整列ならびに挿入(N,[A|R1],[A|R2]) :- N >= A,小さい順整列ならびに挿入(N,R1,R2). # メッセージの流れる順番は次のようになる。 # 学生オブジェクト(yamada)から # 1)教員への成績問い合わせメッセージ(askScore("0001")) # 教員オブジェクト(endo)から # 2)成績問い合わせのメッセージ(searchScore("0001")) # 事務室オブジェクト(defaultOffice)から # 3)得点または-1を返答 # 教員オブジェクト(endo)から # 4)得点または-1を返答 # # この順番でメッセージを交換し学生オブジェクトが教員オブジェクトを経由して # 自分の成績を知ることができるようにしなさい。 % Prologサーバーについては %%%%%%%%%%% 山田 サーバー %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 先生(国語,遠藤). 先生に成績を問い合わせる(国語,_応答) :-   先生(国語,_先生),   _先生 :: 国語の成績は何点でしょうか(山田,_応答). %%%%%%%%%%% 遠藤 サーバー %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 国語の成績は何点でしょうか(_生徒,_応答) :-   事務局 :: 係はだれですか(成績問い合わせ,_係),   _係 :: 生徒の成績は何点でしょうか(遠藤,_生徒,国語,_応答). %%%%%%%%%% 事務局 サーバー %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 係はだれですか(成績問い合わせ,defaultOffice). %%%%%%%%%%% defaultOffice サーバー %%%%%%%%%%%%%%%%%%%%%%%%%%%% 生徒の成績は何点でしょうか(_先生,_生徒,_科目,_応答) :-   成績簿(_生徒,_科目,_成績),   concat_atom([_生徒,の,_科目,の成績は,_成績,点です],_応答). 成績簿(山田,国語,78). 成績簿(山田,数学,57). # [1] 授業単元:C言語とアルゴリズム # # [課題1] #  100から999までの乱数が100個入った配列aの内容を10個ずつに区切って表示しなさい.さらに # 配列aのデータを基本選択法によって昇順に整列し、整列後の配列a内容を表示させなさい. # [課題2] #  100から999までの乱数が100個入った配列aの内容を10個ずつに区切って表示しなさい.さらに # 配列aのデータを基本選択法によって降順に整列し、整列後の配列a内容を表示させなさい. a([983,386,577,215,393,935,686,292,349,821,762,527,690,359,663,626,340,226, 872,236,711,468,367,529,882,630,162,923,767,335,429,802,622,958,969,967,893, 656,311,242,529,973,721,219,384,437,798,624,615,670,813,326,191,180,756,973, 762,870,896,581,205,325,384,727,336,405,746,229,113,957,424,595,982,145,714, 367,534,564,943,150,287,808,376,378,888,184,403,651,954,299,232,160,576,568, 839,812,926,586,994,939]). '100から999までの乱数が100個入った配列aの内容を10個ずつに区切って表示' :- a(L), member10(L1,L), concat_atom(L1,' ',S), write_formatted('%t\n',[S]), fail. '100から999までの乱数が100個入った配列aの内容を10個ずつに区切って表示'. member10(L1,L) :- length(L1,10),append(L1,L2,L). member10(L1,L) :- length(L3,10),append(L3,L2,L),member10(L1,L2). # [1] 授業単元:C応用 # # 関数DeleteThresholdを作成し、Threshold(閾値)の値をscanfで読み込み、 # 学生aからdの英語と数学の平均点と閾値を比較し、 # 閾値以下の学生をリストから削除するプログラムを作成する。 # 関数DeleteThreshold内で関数Printを使用する。 # また、関数Printの次の行に、〜人削除の場合は「〜人削除しました」と入力する。 # 全員削除の場合は「全員削除しました」だけを入力する。 英語(a,70). 英語(b,79). 英語(c,90). 英語(d,69). 数学(a,80). 数学(b,63). 数学(c,55). 数学(d,80). 閾値以下の学生をリストから削除する(_学生リスト,_判定後の学生リスト,_削除メッセージ) :- 閾値を読み込む(_閾値), findall([_学生,_二科目の平均], ( member(_学生,_学生リスト),英語(_学生,_英語),数学(_学生,_数学), _二科目の平均 is (_英語 + _数学) / 2),_二科目の平均ならび), findall(_学生2,(member([_学生2,_平均点2],_二科目の平均ならび),_平均点2 >= _閾値),_判定後の学生ならび), length(_学生ならび,Len1), length(_判定後の学生ならび,Len2), 削除メッセージ(Len1,Len2,_削除メッセージ). 削除メッセージ(Len,Len,'全員削除しました。') :- !. 削除メッセージ(Len1,Len2,_メッセージ) :- _削除人数 is Len2 - Len1,concat_atom([_削除人数,人削除しました。],_メッセージ). 閾値を読み込む(_閾値) :- get_integer(_閾値). # SELECT した全レコードの特定カラムを文字列連結したものを得る方法はありますか? # # SELECT C FROM T # # とやったときに AAA、BBB、CCC といった値が得られる時、AAABBBCCC のような 1つの値が欲しいです。 # さらにそれらの間に任意の区切り文字を入れて AAA:BBB:CCC のような値を得ることはできるでしょうか。 'SELECTした全レコードのN番目カラムを文字列連結したものを得る'(T/_属性の数,N,_連結した文字列) :- length(L,_属性の数), P =.. [T|L]), findall(X,(call(P),list_nth(N,L,X)),_解ならび), concat_atom(_解ならび,_連結した文字列). # ■テーブルデータ # ・IDテーブル   # ・マスターテーブル # 1, 2, 3      # 1, A # 1, 2, 4      # 2, A # 5, -1, -1     # 3, A # -1, 1, 2      # 4, B # 2, -1, 5      # -1, Z # # ■やりたいこと # マスターテーブルを参照してIDテーブルの各IDにクラス(A, B, Z)を振り当て、 # 各レコードが同一クラスに属するか否かを判定し、同一クラスに属するレコード # だけクラス付で抽出する。 # ここで「同一クラスに属する」とは、クラスA, B, Zからなるグループに対して、 # Z以外の要素が一種類しか存在しない場合に、グループはそのクラスに属すると定める。 # 最終的に欲しいデータは # # 1, 2, 3, A # 5, -1, -1, B # -1, 1, 2, A # # となります。よろしくお願いします。 'クラスA, B, Zからなるグループに対して、Z以外の要素が一種類しか存在しない' :- 'ID'(L), setof(U,(member(ID,L),マスター(ID,U),\+(U='Z')),[_クラス]), concat_atom(L,',',S), write_formatted('%t,%t\n',[S,_クラス]), fail. 'クラスA, B, Zからなるグループに対して、Z以外の要素が一種類しか存在しない'. # [1] 授業単元:c言語 # [2] 問題文(含コード&リンク): # 文字列ABCDEFGHIJKLMNに対して入力した文字列の第1文字目と第2文字目の間にある文字列を表示するプログラムを作る。 ただし標準ライブラリは使用しないこと。 # 文字列ABCDEFGHIJKLMNに対して入力した文字列の第1文字目と第2文字目の間にある文字列を表示する :-   atom_chars('ABCDEFGHIJKLMN',Chars),   write('文字列を入力してください :'),   get_line(_文字列),   sub_atom(_文字列,0,1,_,_第1文字),   sub_atom(_文字列,1,1,_,_第2文字),   append(L1,[_第1文字|L2],Chars),   第1文字目と第2文字目の間にある文字列(_第2文字,L1,L2,L),   concat_atom(L,_第1文字目と第2文字目の間にある文字列),   write_formatted('第1文字目と第2文字目の間にある文字列は %t です\n',[_第1文字目と第2文字目の間にある文字列]). 第1文字目と第2文字目の間にある文字列(_第2文字,L1,_,L) :-   append(_,[_第2文字|L],L1),!. 第1文字目と第2文字目の間にある文字列(_第2文字,_,L2,L) :-   append(L,[_第2文字|_],L2),!. # [2] 問題文(含コード&リンク): ある整数を入力し,それより小さい素数をすべて表示するプログラムを作成しなさい. ある整数を入力し,それより小さい素数をすべて表示する :- write('整数を入力してください : '), get_integer(N), N1 is N - 1, 素数生成(N1,L), concat_atom(L,',',S), write_formatted('%tより小さいすべての素数は %t です\n',[N,S]). 素数生成(N,X) :- findall(M,for(2,M,N),L), エラトステネスの篩(L,X). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). # # 問題4 # 平面上の2点(x1,y1)、(x2,y2)を入力し、それら2点間の距離を算出するプログラムを作成せよ。Aの平方根はsqrt(A)という数学関数で算出される(Aは引数でdouble型)。 # 数学関数を使用する場合、というファイルから情報を得なければならないので、#includeの # 下の行に#includeという命令文を付け加えなければならない(2つのinclude文)。実行結果の例を以下に示す。 # ------------------------------------------------ # x1:0 # y1:0 # x2:1 # y2:1 # この2点間の距離は1.414214です。 '平面上の2点(x1,y1)、(x2,y2)を入力し、それら2点間の距離を算出する' :- '2点の座標を得る'([x1,y1,x2,y2],[X1,Y1,X2,Y2]), 平面上の2点間の距離(X1,Y1,X2,Y2,_2点間の距離), write_formatted('この2点間の距離は%tです。\n',[_2点間の距離]). '2点の座標を得る'([],[]) :- !. '2点の座標を得る'([A|R1],[V|R2]) :- concat_atom([A,' :'],S), write(S), get_line(Line), atom_to_term(Line,V,_), '2点の座標を得る'(R1,R2). 平面上の2点間の距離(X1,Y1,X2,Y2,_2点間の距離) :- _2点間の距離 is sqrt((X2-X1)^2 + (Y2-Y1)^2). # [1]単元 初等C言語 # [2]問題 コンソールから、年月日時分秒に対応する整数をそれぞれ個別に不正入力時には # 再入力を促しながら読み込み、それをyyyymmddhhmmss(準グレゴリオ暦)形式の時刻表 # 現と解釈する。この処理を2回行い2つの時刻表現を取得する。それぞれが正しいフォー # マットかどうかを調べ、共に正しい場合は、日付が新しいものの順に # yyyy年mm月dd日hh時mm分ss秒の書式で出力)しその時刻差を秒単位、分単位、時間単 # 位、日単位で出力するプログラム(小数点一位以下四捨五入) # 但し1900年1月1日0時0分0秒以前の時刻は与えられないとして良い。 # また9999年12月31日23時59分59秒以後の時刻も与えられないとする。 # うるう年は400の倍数か100の倍数でない4の倍数な年であるとし、2月の末日 # にうるう日が付与されるものとする。実際の暦体系では不定期に付与されるうるう秒 # は考慮しなくて良いものとする正しい日付でない場合はその旨出力し処理を中止する 二つの時刻の時間差を表示する :- 準グレゴリオ暦入力(_準グレゴリオ暦1,_年1,_月1,_日1,_時1,_分1,_秒1), 準グレゴリオ暦入力(_準グレゴリオ暦2,_年2,_月2,_日2,_時2,_分2,_秒2), 二つの時刻の時間差を計算する(_準グレゴリオ暦1,_年1,_月1,_日1,_時1,_分1,_秒1,_何日1,_総秒差,_分数,_時間数,_分数,_余り秒数,_時間数,_余り分数,_日数,_余り時間数), _準グレゴリオ暦1,_準グレゴリオ暦2,_総秒差,_分数,_時間数,_分数,_余り秒数,_時間数,_余り分数,_日数,_余り時間数),!. 時間差を計算する(_準グレゴリオ暦1,_年1,_月1,_日1,_時1,_分1,_秒1,_何日1,_総秒差,_分数,_時間数,_分数,_余り秒数,_時間数,_余り分数,_日数,_余り時間数) :- 何日あるか(_年1,_月1,_日1,_年2,_月2,_日2,_何日1), 時・分・秒調整(_時1,_分1,_秒1,_時2,_分2,_秒2,_何日1,_何日2,_秒), _総秒数 is 38400 * _何日 + _秒, _分数 is _総秒数 // 60, _余り秒数 is _総秒数 mod 60, _時間数 is _分数 // 60, _余り分数 is _分数 mod 60, _余り時間数 is _時間 mod 38400,!. 時間差を表示する(_準グレゴリオ暦1,_準グレゴリオ暦2,_総秒差,_分数,_時間数,_分数,_余り秒数,_時間数,_余り分数,_日数,_余り時間数) :- write_formatted('それぞれの時刻の準グレゴリオ暦表現は %t\n%t\n',[_準グレゴリオ暦1,_準グレゴリオ暦2]), write_formatted('時刻差は秒差で%t秒\n',[_総秒差]), write_formatted('分差で%t分と%t秒\n',[_分数,_余り秒数]), write_formatted('時間差で%t時間と%分と%秒\n',[_時間,_余り分数,_余り秒数]), write_formatted('日差は%t日と%t時間と%t分と%秒です\n',[_日数,_余り時間数,_余り分数,_余り秒数]),!. 準グレゴリオ暦入力(_準グレゴリオ暦,_年,_月,_日,_時,_分,_秒) :- repeat, 催促付き整数入力('西暦年 yyyy:',_年),整数から文字列(4,_年,_年文字列), 催促付き整数入力('月 mm:',_月),整数から文字列(2,_月,_月文字列), 催促付き整数入力('月 dd:',_日),整数から文字列(2,_日,_日文字列), 催促付き整数入力('月 hh:',_時),整数から文字列(2,_時,_時文字列), 催促付き整数入力('月 mi:',_分),整数から文字列(2,_分,_分文字列), 催促付き整数入力('月 ss:',_秒),整数から文字列(2,_秒,_秒文字列), その日付はありうるか(_年,_月,_日,_時,_分,_秒), concat_atom([_年文字列,_月文字列,_日文字列,_時文字列,_分文字列,_秒文字列],_準グレゴリオ歴),!. その日付はありうるか(_年,_月,_日,_時,_分,_秒) :- _年>=1900,_年=<9999, _時>=0,_時=<59, _分>=0,_分=<59, _秒>=0,_秒=<59, その日付はありうるか(_年,_月,_日),!. その日付はありうるか(_年,_月,_日,_時,_分,_秒) :- write('日付として不適切なものでした\n'),fail. その日付はありうるか(_年,2,_日) :- うるう年(_年), _日>=1,_日=<29,!. その日付はありうるか(_年,2,_日) :- \+(うるう年(_年)), _日>=1,_日=<29,!. その日付はありうるか(_年,_月,_日) :- member(_月,[1,3,5,7,8,10,12]), _日>=1,_日=<31,!. その日付はありうるか(_年,_月,_日) :- member(_月,[4,6,9,11]), _日>=1,_日=<30,!. 何日あるか(_年,_月1,_日1,_年,_月2,_日2,_何日あるか) :- 今日から大晦日まで何日あるか(_年,_月1,_日1,_何日), 今日は元旦から何日目(_年,_月2,_日2,_元旦から何日目), _何日あるか is _何日 + _元旦から何日目 - 1,!. 何日あるか(_年1,_月1,_日1,_年2,_月2,_日2) :- _年2 is _年 + 1, 今日から大晦日まで何日あるか(_年1,_月1,_日1,_何日), 今日は元旦から何日目(_年2,_月2,_日2,_元旦から何日目), _何日あるか is _何日 + _元旦から何日目,!. 何日あるか(_年1,_月1,_日1,_年2,_月2,_日2) :- _年11 is _年1 + 1, _年22 is _年2 - 1, うるう年回数(_年11,_年22,_うるう年回数), N is (_年22-_年11+1) * 365 + _うるう年回数, 今日から大晦日まで何日あるか(_年1,_月1,_日1,_何日), 今日は元旦から何日目(_年,_月,_日,_元旦から何日目), _何日あるか is _何日 + _元旦から何日目 + N,!. 時・分・秒調整(_時1,_分1,_秒1,_時2,_分2,_秒2,_何日1,_何日2,_秒) :- _時間1 is 3600 * _時1 + _分1 * 60 + _秒1, _時間2 is 3600 * _時2 + _分2 * 60 + _秒2, _秒3 is _時間2 - _時間1, ( _秒3 >= 0, _何日2 is _何日 - 1, _秒3 = _秒; _秒3 < 0, _何日2 is _何日 - 2, _秒2 is 3600*24-_秒3 ),!. 日・時変換(_日,_時) :- _時 is _日 * 24. 日・分変換(_日,_分) :- _分 is _日 * 24 * 60. 日・秒変換(_日,_秒) :- _秒 is _日 * 24 * 60 * 60. 催促付き整数入力('年 yyyy:',_年),_年>=1900,_年=<9999, 催促付き整数入力('月 mm:',_月), 催促付き整数入力('年 dd:',_日), うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4),fail. 月別日数ならび(平年,[31,28,31,30,31,30,31,31,30,31,30,31]). 月別日数ならび(うるう年,[31,29,31,30,31,30,31,31,30,31,30,31]). うるう年回数(_起点西暦年,_終点西暦年,_うるう年回数) :- count((for(_起点西暦年,N,_終点西暦年),うるう年(N)),_うるう年回数). 今日は元旦から何日目(_年,_月,_日,_元旦から何日目) :- うるう年(_年), 月別日数ならび(うるう年,_月別日数ならび), N1 is _月-1, append(L1,_,_月別日数ならび), length(L1,N1), sum(L1,_前月までの合計日数), _元旦から何日目 is _前月までの合計日数 + _日,!. 今日は元旦から何日目(_年,_月,_日,_元旦から何日目) :- \+(うるう年(_年)), 月別日数ならび(平年,_月別日数ならび), N1 is _月-1, append(L1,_,_月別日数ならび), length(L1,N1), sum(L1,_前月までの合計日数), _元旦から何日目 is _前月までの合計日数 + _日,!. 今日から大晦日まで何日あるか(_年,_月,_日,_何日) :- うるう年(_年), 今日は元旦から何日目(_年,_月,_日,_元旦から何日目), _何日 is 366 - _元旦から何日 + 1. 今日から大晦日まで何日あるか(_年,_月,_日,_何日) :- \+(うるう年(_年)), 今日は元旦から何日目(_年,_月,_日,_元旦から何日目), _何日 is 365 - _元旦から何日 + 1. # 【 課題 】複数人の名前を入力してから3教科の点数を全員分入力し、各教科の平均点と、最高点と取った人の名前を表示せよ。 % 教科名が存在しないということは得点は列挙する他ない。 複数人の名前を入力してから3教科の点数を全員分入力し、各教科の平均点と、最高点と取った人の名前を表示する :- 複数人の名前を入力(_名前ならび), '3教科の点数を全員分入力する'(_名前ならび,_全員分の名前・3教科の得点ならび), 各教科の平均点と、最高点と取った人の名前を表示(_名前・教科の得点ならび,_各教科の平均点ならび,_最高点を取った名前ならび), for(1,N,3), list_nth(N,_各教科の平均点ならび,_平均点), list_nth(N,_最高点を取った名前ならび,[_,_最高点得点者ならび]), concat_atom(_最高得点者ならび,',',S), write_formatted('教科%tの平均点は%t点、最高得点者は%tです。\n',[_平均点,S]), N = 3. 複数人の名前を入力(_名前ならび) :- findall(_名前,(repeat,write('名前 : '),get_line(_名前),(_名前=end_of_file,!,fail;true)),_名前ならび). '3教科の点数を全員分入力する'(_名前ならび,_全員分の名前・3教科の得点ならび) :- findall(_名前・3教科の得点ならび,(repeat,write('名前と3教科の得点を,区切りで入力してください : '),get_split_line([' ',','],_名前・3教科の得点ならび),( 各教科の平均点と、最高点と取った人の名前を表示(_名前・教科の得点ならび,_各教科の平均点ならび,_最高点を取った名前ならび) :- 各教科の平均点(_名前・各教科の得点ならび,[_教科1_平均点,_教科2_平均点,_教科3_平均点]), 各教科の最高点を取った人の名前(1,_名前・教科の得点ならび,L). 各教科の平均点(M,N,_名前・各教科の得点ならび,[]) :- M > N,!. 各教科の平均点(M,N,_名前・各教科の得点ならび,[[M,_平均点]|R]) :- findavg(U,member(L,_名前・各教科の得点ならび),list_nth(N,L,U)),_平均点), M2 is M + 1, 各教科の平均点(M2,N,_名前・各教科の得点ならび,R). 各教科の最高点を取った人の名前(M,N,_,[]) :- !. 各教科の最高点を取った人の名前(M,N,L,[[M,_名前ならび]|R]) :- !. 各教科の最高点を取った人の名前(M,L,_名前ならび1,_名前ならび,_最高点1,_最高点), M2 is M + 1, 各教科の最高点を取った人の名前(M2,N,L,R). 各教科の最高点を取った人の名前(N,[],_名前ならび,_名前ならび,_最高点,_最高点) :- !. 各教科の最高点を取った人の名前(N,[[_名前|_教科得点ならび]|R],_名前ならび1,_名前ならび,_最高点1,_最高点2) :- list_nth(N,_教科得点ならび,_得点), 得点 > _最高点1, 各教科の最高点を取った人の名前(N,R,[[N,_名前]],_名前ならび,_得点,_最高点2),!. 各教科の最高点を取った人の名前(N,[[_名前|_教科得点ならび]|R],_名前ならび1,_名前ならび,_最高点1,_最高点2) :- list_nth(N,_教科得点ならび,_得点), 得点 = _最高点1, 各教科の最高点を取った人の名前(N,R,[_名前|_名前ならび1],_名前ならび,_得点,_最高点2),!. 各教科の最高点を取った人の名前(N,[_|R],_名前ならび1,_名前ならび,_最高点1,_最高点2) :- 各教科の最高点を取った人の名前(N,R,_名前ならび1,_名前ならび,_最高点1,_最高点2). # [1] 授業単元: プログラミング論 # [2] 問題文(含コード&リンク): # 次のA・Bの行列をA×Bの計算をして、その結果を表示するプログラムを作成しなさい。 # # A=[5 3]   B=[7 1 5 4] #   [3 8]     [1 9 2 8] #   [1 6] #   [9 1] # # 解の表示) #        [38 32 31 44] #        [29 75 31 76] #        [13 55 17 52] #        [64 18 47 44] 'A'([[5,3],[3,8],[1,6],[9,1]]). 'B'([[7,1,5,4],[1,9,2,8]]). A・Bの行列をA×Bの計算をして、その結果を表示する :- 'A'(_行列A), 'B'(_行列B), 行列の積(_行列A,_行列B,_行列C), 行列の表示(_行列C). % *** user: 行列の積 / 3 *** 行列の積(L1,L2,X) :- 行列の転置(L2,L4), 行列の積_1(L1,L4,X) . % *** user: 行列の積_1 / 3 *** 行列の積_1([],_,[]) :- !. 行列の積_1([A|R1],L,[S1|R3]) :- 行列の積_2(A,L,S1), 行列の積_1(R1,L,R3). % *** user: 行列の積_2 / 3 *** 行列の積_2(_,[],[]) :- !. 行列の積_2(A,[B|R2],[C|R3]) :- 行列の積_3(A,B,C), 行列の積_2(A,R2,R3). % *** user: 行列の積_3 / 3 *** 行列の積_3([],[],0) :- !. 行列の積_3([A|R1],[B|R2],S) :- S1 is A * B, 行列の積_3(R1,R2,S2), S is S1 + S2. % *** user: 行列の転置 / 3 *** 行列の転置([],[],[]) :- !. 行列の転置([[A|R]|R1],[A|R2],[R|R3]) :- 行列の転置(R1,R2,R3). % *** user: 行列の転置 / 2 *** 行列の転置([[]|_],[]) :- !. 行列の転置(L,[B|R1]) :- 行列の転置(L,B,R2), 行列の転置(R2,R1),!. 行列の表示(_行列) :- member(_行,_行列), concat_atom(_行,' ',S), write_formatted('[%t]\n',[S]), fail. 行列の表示(_). # # しりとりゲームをするプログラム # 第一段階ーShiritori.javaを次に掲載する。 #      これをEclipseに入力する #    ー与えられた単語の可否を判定するためのクラスReferee.javaを作成する # # 第二段階ーReferee.javaをしりとりのルールにのっとった判定をさせるように改善 # # 第一段階のRefereeの使用 # ・直前に入力された単語の末尾の文字を記憶するchar型のフィールド #    lastChar # ・次の単語がどの文字で始まらなければならないかをchar型で返すメソッド # mustBeginWith() # ・引数として与えられた単語の可否を判定し、可ならtrueを返すとともにlastCharを更新し、否ならfalseを返すメソッド #    isOK(String newWord) # とりあえずは何でもかんでも「可」とするように作る 馬名しりとり :- write('最初の馬名は :'), get_line(_語1), sub_atom(_語1,0,1,_,_最初の文字), 馬名しりとり(_最初の文字,_語1,_語,[]). 馬名しりとり(_次の文字,_語,_語,_) :- \+(sub_atom(_語,0,1,_,_次の文字)), write_formatted('ゲームオーバー %t-%t はしりとりになっていません\n',[_次の文字,_語]), fail,!. 馬名しりとり(_次の文字,_語,_語,_履歴) :- member(_語,_履歴),!, write_formatted('ゲームオーバー %tは既出です\n',[_語]), fail. 馬名しりとり(_次の文字,_語,_,_) :- 五代血統書(_語), fail. 馬名しりとり(_次の文字,_語,_語,_履歴) :- sub_atom(_語,0,1,_,_次の文字), write_formatted('%t-%t\n',[_次の文字,_語]). 馬名しりとり(_,_語1,_語,_履歴) :- 馬名しりとりルール(_語1,_次の文字1), write('次の馬名は :'), get_line(_語2), 馬名しりとり(_次の文字1,_語2,_語,[_語1|_履歴]). 馬名しりとりルール(_語,_次の文字) :- sub_atom(_語,Len,1,0,ン), Len2 is Len + 1, sub_atom(_語,0,Len2,_,_語2), 馬名しりとり次の文字(_語2,_次の文字). 馬名しりとりルール(_語,_次の文字) :- sub_atom(_語,Len,1,0,ー), Len2 is Len + 1, sub_atom(_語,0,Len2,_,_語2), 馬名しりとり次の文字(_語2,_次の文字). 馬名しりとりルール(_語,_次の文字) :- sub_atom(_語,Len,1,0,_次の文字),!. % *** user: jbis / 2 *** 五代血統書(_馬名) :- jbis(_馬名,L), 五代血統表表示(L). jbis(_馬名,_血統書) :- このサイトの馬名はSJISが使われている(_馬名,_馬名sjis), 'url述語表現'(_馬名sjis,URL1), '%27を切り取る'(URL1,URL2), jbis馬名サイト検索(URL,_馬名,_血統サイトの正確なURLならび), 馬名による血統検索(_血統サイトの正確なURLならび,_血統書). jbis馬名サイト検索(URL,_馬名,_血統サイトの正確なURLならび) :- w3c(URL,X), concat_atom(X,X2), sjis2euc(X2,X3), split(X3,['\n','\r'],X4), findall(URL2,( member(A,X4), この行には検索対象の馬名が存在する(A,_馬名), 血統サイトの正確なURLを構成する(A,URL2)),_血統サイトの正確なURLならび), !. 馬名による血統検索(_血統サイトの正確なURLならび,_血統書) :- member(URL,_血統サイトの正確なURLならび), w3c(URL,X), 取れたならびすべての行をEUCに変換(X,_EUC行ならび), findall(_先祖馬名,( member(_馬名を含む行,_EUC行ならび), 血統書の中の馬名を切り取る(_馬名を含む行,_先祖馬名)), _血統書). このサイトの馬名はSJISが使われている(_馬名,_馬名sjis) :- euc2sjis(_馬名,_馬名sjis),!. '%27を切り取る'(URL1,URL2) :- replace_all(URL1,'%27','',URL2),!. 取れたならびすべての行をEUCに変換(Y,Y4) :- concat_atom(Y,Y2), sjis2euc(Y2,Y3), split(Y3,['\n','\r'],Y4),!. この行には検索対象の馬名が存在する(_行,_馬名) :- sub_atom(_行,_,_,_,'cell-br-no sort-02'), split(_行,['','(',')','>'],L), 馬名は最後の二要素のうちのどちらかにある(L,_馬名),!. 馬名は最後の二要素のうちのどちらかにある(L,_馬名) :- append(_,[_馬名],L),!. 馬名は最後の二要素のうちのどちらかにある(L,_馬名) :- append(_,[_馬名,_],L),!. 血統サイトの正確なURLを構成する(_行,URL) :- split(_行,['"'],L), append(_,[U,_],L), 血統書の中の馬名を切り取る(_行,_先祖馬名) :- 先祖馬名を含む行はmaleという文字列を含む(_行), sub_atom(_行,Start,Len,_,''), sub_atom(_行,0,Start,_,_行1), split(_行1,['\r','>','','
    '],L), last(L,_先祖馬名),!. 先祖馬名を含む行はmaleという文字列を含む(_行) :- sub_atom(_行,_,_,_,male),!. 血統クロス(_馬名,_クロスならび) :- jbis(_馬名,L), length(L1,31),length(L2,31),append(L1,L2,L), 積集合(L1,L2,_積集合), 血統クロス(_積集合,L1,L2,_クロスならび). 血統クロス([],L1,L2,[]) :- !. 血統クロス([H|R1],L1,L2,[[_世代1,_世代2]|R2]) :- list_nth(N,L1,H), list_nth(N1,L2,H), N2 is N1 + 31, 第何世代か(N,_世代ならび1), min(_世代ならび1,_世代1), 第何世代か(N2,_世代ならび2), min(_世代ならび2,_世代2), 血統クロス(R1,L1,L2,R2). 第何世代か(N,_世代ならび) :- findall(_世代,( 五代血統表表示テーブル(_五代血統表表示テーブル), member(N,_五代血統表表示テーブル), list_nth(_世代,_五代血統表表示テーブル,N)),_世代ならび). 五代血統表表示(L) :- 五代血統表表示テーブル(L1), 五代血統表一行表示(L,L1), fail. 五代血統表表示(_). 五代血統表一行表示(_,[]) :- wr('\n'),!. 五代血統表一行表示(L,[N|R]) :- \+(N=0), list_nth(N,L,_馬名), wr('%t',[_馬名]), 五代血統表一行表示(L,R),!. 五代血統表一行表示(L,[0|R]) :- wr('%15s',[' ']), 五代血統表一行表示(L,R),!. % *** user: 五代血統表表示テーブル / 1 *** 五代血統表表示テーブル([0,0,0,0,5]). 五代血統表表示テーブル([0,0,0,4,0]). 五代血統表表示テーブル([0,0,0,0,6]). 五代血統表表示テーブル([0,0,3,0,0]). 五代血統表表示テーブル([0,0,0,0,8]). 五代血統表表示テーブル([0,0,0,7,0]). 五代血統表表示テーブル([0,0,0,0,9]). 五代血統表表示テーブル([0,2,0,0,0]). 五代血統表表示テーブル([0,0,0,0,12]). 五代血統表表示テーブル([0,0,0,11,0]). 五代血統表表示テーブル([0,0,0,0,13]). 五代血統表表示テーブル([0,0,10,0,0]). 五代血統表表示テーブル([0,0,0,0,15]). 五代血統表表示テーブル([0,0,0,14,0]). 五代血統表表示テーブル([0,0,0,0,16]). 五代血統表表示テーブル([1,0,0,0,0]). 五代血統表表示テーブル([0,0,0,0,20]). 五代血統表表示テーブル([0,0,0,19,0]). 五代血統表表示テーブル([0,0,0,0,21]). 五代血統表表示テーブル([0,0,18,0,0]). 五代血統表表示テーブル([0,0,0,0,23]). 五代血統表表示テーブル([0,0,0,22,0]). 五代血統表表示テーブル([0,0,0,0,24]). 五代血統表表示テーブル([0,17,0,0,0]). 五代血統表表示テーブル([0,0,0,0,27]). 五代血統表表示テーブル([0,0,0,26,0]). 五代血統表表示テーブル([0,0,0,0,28]). 五代血統表表示テーブル([0,0,25,0,0]). 五代血統表表示テーブル([0,0,0,0,30]). 五代血統表表示テーブル([0,0,0,29,0]). 五代血統表表示テーブル([0,0,0,0,31]). 五代血統表表示テーブル([0,0,0,0,36]). 五代血統表表示テーブル([0,0,0,35,0]). 五代血統表表示テーブル([0,0,0,0,37]). 五代血統表表示テーブル([0,0,34,0,0]). 五代血統表表示テーブル([0,0,0,0,39]). 五代血統表表示テーブル([0,0,0,38,0]). 五代血統表表示テーブル([0,0,0,0,40]). 五代血統表表示テーブル([0,33,0,0,0]). 五代血統表表示テーブル([0,0,0,0,43]). 五代血統表表示テーブル([0,0,0,42,0]). 五代血統表表示テーブル([0,0,0,0,44]). 五代血統表表示テーブル([0,0,41,0,0]). 五代血統表表示テーブル([0,0,0,0,46]). 五代血統表表示テーブル([0,0,0,45,0]). 五代血統表表示テーブル([0,0,0,0,47]). 五代血統表表示テーブル([32,0,0,0,0]). 五代血統表表示テーブル([0,0,0,0,51]). 五代血統表表示テーブル([0,0,0,50,0]). 五代血統表表示テーブル([0,0,0,0,52]). 五代血統表表示テーブル([0,0,49,0,0]). 五代血統表表示テーブル([0,0,0,0,54]). 五代血統表表示テーブル([0,0,0,53,0]). 五代血統表表示テーブル([0,0,0,0,55]). 五代血統表表示テーブル([0,48,0,0,0]). 五代血統表表示テーブル([0,0,0,0,58]). 五代血統表表示テーブル([0,0,0,57,0]). 五代血統表表示テーブル([0,0,0,0,59]). 五代血統表表示テーブル([0,0,56,0,0]). 五代血統表表示テーブル([0,0,0,0,61]). 五代血統表表示テーブル([0,0,0,60,0]). 五代血統表表示テーブル([0,0,0,0,62]). # [1]単元 初等C言語 # [2]問題 コンソールから、年月日時分秒に対応する整数をそれぞれ個別に不正入力時には # 再入力を促しながら読み込み、それをyyyymmddhhmmss(準グレゴリオ暦)形式の時刻表 # 現と解釈する。この処理を2回行い2つの時刻表現を取得する。それぞれが正しいフォー # マットかどうかを調べ、共に正しい場合は、日付が新しいものの順に # yyyy年mm月dd日hh時mm分ss秒の書式で出力)しその時刻差を秒単位、分単位、時間単 # 位、日単位で出力するプログラム(小数点一位以下四捨五入) # 但し1900年1月1日0時0分0秒以前の時刻は与えられないとして良い。 # また9999年12月31日23時59分59秒以後の時刻も与えられないとする。 # うるう年は400の倍数か100の倍数でない4の倍数な年であるとし、2月の末日 # にうるう日が付与されるものとする。実際の暦体系では不定期に付与されるうるう秒 # は考慮しなくて良いものとする正しい日付でない場合はその旨出力し処理を中止する 二つの時刻の時間差を表示する :- 準グレゴリオ暦入力(_準グレゴリオ暦1,_年1,_月1,_日1,_時1,_分1,_秒1), 準グレゴリオ暦入力(_準グレゴリオ暦2,_年2,_月2,_日2,_時2,_分2,_秒2), 二つの時刻の時間差を計算する(_準グレゴリオ暦1,_年1,_月1,_日1,_時1,_分1,_秒1,_何日1,_総秒差,_分数,_時間数,_分数,_余り秒数,_時間数,_余り分数,_日数,_余り時間数), _準グレゴリオ暦1,_準グレゴリオ暦2,_総秒差,_分数,_時間数,_分数,_余り秒数,_時間数,_余り分数,_日数,_余り時間数),!. 時間差を計算する(_準グレゴリオ暦1,_年1,_月1,_日1,_時1,_分1,_秒1,_何日1,_総秒差,_分数,_時間数,_分数,_余り秒数,_時間数,_余り分数,_日数,_余り時間数) :- 何日あるか(_年1,_月1,_日1,_年2,_月2,_日2,_何日1), 時・分・秒調整(_時1,_分1,_秒1,_時2,_分2,_秒2,_何日1,_何日2,_秒), _総秒数 is 38400 * _何日 + _秒, _分数 is _総秒数 // 60, _余り秒数 is _総秒数 mod 60, _時間数 is _分数 // 60, _余り分数 is _分数 mod 60, _余り時間数 is _時間 mod 38400,!. 時間差を表示する(_準グレゴリオ暦1,_準グレゴリオ暦2,_総秒差,_分数,_時間数,_分数,_余り秒数,_時間数,_余り分数,_日数,_余り時間数) :- write_formatted('それぞれの時刻の準グレゴリオ暦表現は %t\n%t\n',[_準グレゴリオ暦1,_準グレゴリオ暦2]), write_formatted('時刻差は秒差で%t秒\n',[_総秒差]), write_formatted('分差で%t分と%t秒\n',[_分数,_余り秒数]), write_formatted('時間差で%t時間と%分と%秒\n',[_時間,_余り分数,_余り秒数]), write_formatted('日差は%t日と%t時間と%t分と%秒です\n',[_日数,_余り時間数,_余り分数,_余り秒数]),!. 準グレゴリオ暦入力(_準グレゴリオ暦,_年,_月,_日,_時,_分,_秒) :- repeat, 催促付き整数入力('西暦年 yyyy:',_年),整数から文字列(4,_年,_年文字列), 催促付き整数入力('月 mm:',_月),整数から文字列(2,_月,_月文字列), 催促付き整数入力('月 dd:',_日),整数から文字列(2,_日,_日文字列), 催促付き整数入力('月 hh:',_時),整数から文字列(2,_時,_時文字列), 催促付き整数入力('月 mi:',_分),整数から文字列(2,_分,_分文字列), 催促付き整数入力('月 ss:',_秒),整数から文字列(2,_秒,_秒文字列), その日付はありうるか(_年,_月,_日,_時,_分,_秒), concat_atom([_年文字列,_月文字列,_日文字列,_時文字列,_分文字列,_秒文字列],_準グレゴリオ歴),!. その日付はありうるか(_年,_月,_日,_時,_分,_秒) :- _年>=1900,_年=<9999, _時>=0,_時=<59, _分>=0,_分=<59, _秒>=0,_秒=<59, その日付はありうるか(_年,_月,_日),!. その日付はありうるか(_年,_月,_日,_時,_分,_秒) :- write('日付として不適切なものでした\n'),fail. その日付はありうるか(_年,2,_日) :- うるう年(_年), _日>=1,_日=<29,!. その日付はありうるか(_年,2,_日) :- \+(うるう年(_年)), _日>=1,_日=<29,!. その日付はありうるか(_年,_月,_日) :- member(_月,[1,3,5,7,8,10,12]), _日>=1,_日=<31,!. その日付はありうるか(_年,_月,_日) :- member(_月,[4,6,9,11]), _日>=1,_日=<30,!. 何日あるか(_年,_月1,_日1,_年,_月2,_日2,_何日あるか) :- 今日から大晦日まで何日あるか(_年,_月1,_日1,_何日), 今日は元旦から何日目(_年,_月2,_日2,_元旦から何日目), _何日あるか is _何日 + _元旦から何日目 - 1,!. 何日あるか(_年1,_月1,_日1,_年2,_月2,_日2) :- _年2 is _年 + 1, 今日から大晦日まで何日あるか(_年1,_月1,_日1,_何日), 今日は元旦から何日目(_年2,_月2,_日2,_元旦から何日目), _何日あるか is _何日 + _元旦から何日目,!. 何日あるか(_年1,_月1,_日1,_年2,_月2,_日2) :- _年11 is _年1 + 1, _年22 is _年2 - 1, うるう年回数(_年11,_年22,_うるう年回数), N is (_年22-_年11+1) * 365 + _うるう年回数, 今日から大晦日まで何日あるか(_年1,_月1,_日1,_何日), 今日は元旦から何日目(_年,_月,_日,_元旦から何日目), _何日あるか is _何日 + _元旦から何日目 + N,!. 時・分・秒調整(_時1,_分1,_秒1,_時2,_分2,_秒2,_何日1,_何日2,_秒) :- _時間1 is 3600 * _時1 + _分1 * 60 + _秒1, _時間2 is 3600 * _時2 + _分2 * 60 + _秒2, _秒3 is _時間2 - _時間1, ( _秒3 >= 0, _何日2 is _何日 - 1, _秒3 = _秒; _秒3 < 0, _何日2 is _何日 - 2, _秒2 is 3600*24-_秒3 ),!. 日・時変換(_日,_時) :- _時 is _日 * 24. 日・分変換(_日,_分) :- _分 is _日 * 24 * 60. 日・秒変換(_日,_秒) :- _秒 is _日 * 24 * 60 * 60. 催促付き整数入力('年 yyyy:',_年),_年>=1900,_年=<9999, 催促付き整数入力('月 mm:',_月), 催促付き整数入力('年 dd:',_日), うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4),fail. 月別日数ならび(平年,[31,28,31,30,31,30,31,31,30,31,30,31]). 月別日数ならび(うるう年,[31,29,31,30,31,30,31,31,30,31,30,31]). うるう年回数(_起点西暦年,_終点西暦年,_うるう年回数) :- count((for(_起点西暦年,N,_終点西暦年),うるう年(N)),_うるう年回数). 今日は元旦から何日目(_年,_月,_日,_元旦から何日目) :- うるう年(_年), 月別日数ならび(うるう年,_月別日数ならび), N1 is _月-1, append(L1,_,_月別日数ならび), length(L1,N1), sum(L1,_前月までの合計日数), _元旦から何日目 is _前月までの合計日数 + _日,!. 今日は元旦から何日目(_年,_月,_日,_元旦から何日目) :- \+(うるう年(_年)), 月別日数ならび(平年,_月別日数ならび), N1 is _月-1, append(L1,_,_月別日数ならび), length(L1,N1), sum(L1,_前月までの合計日数), _元旦から何日目 is _前月までの合計日数 + _日,!. 今日から大晦日まで何日あるか(_年,_月,_日,_何日) :- うるう年(_年), 今日は元旦から何日目(_年,_月,_日,_元旦から何日目), _何日 is 366 - _元旦から何日 + 1. 今日から大晦日まで何日あるか(_年,_月,_日,_何日) :- \+(うるう年(_年)), 今日は元旦から何日目(_年,_月,_日,_元旦から何日目), _何日 is 365 - _元旦から何日 + 1. # [1] 授業単元: 基礎プログラミングおよび演習 # # あるWebページに対する24時間分の閲覧者の名前、閲覧開始時刻および閲覧継続時間を表す「閲覧データ」があるとしよう。 # 1名以上の閲覧データから、閲覧している人数がもっとも多い30分刻みでの時間帯を求め、そのときの閲覧者名を印字する # プログラムを作成せよ。状況によっては日をまたぐこともあるが、ここではどの時間帯に閲覧が多いのかを知りたいので # 日の違いは考えなくてよい。各閲覧データは標準入力から、 # # 閲覧者名 # 閲覧開始時刻 閲覧継続時間 # # の2行で与えられる。ここで閲覧者名は英小文字2文字の後に4桁の数字が続く。閲覧開始時刻は24時間制での時を100倍し、 # 分を加えた数を表す4桁の数字、閲覧継続時間は分を表す高々3桁の数字である。時刻および時間は30分刻み(つまり0分か30分) # である。たとえば、 # # ku7535 # 0130 60 # # は、名前がku7535、開始時刻が1時30分、継続時間が60分、つまり1時30分から2時30分直前まで閲覧していたことを表す。 # まず閲覧データに対する構造体 user を定義し、それを要素とする大きさNの大域的な配列 users を用意せよ(Nはマクロ # である)。次に、N人分のデータを読み込むか、閲覧者名としてアスタリスク(*)が与えられるまで、標準入力から閲覧データを # 読み込み、配列 users にセットするとともに閲覧データを返す関数 int read_users(void) を作成せよ。最後に配列 users の # 先頭からn個の閲覧データを対象に、24時間中で最大人数が閲覧している30分刻みでの時間帯と、そのときの閲覧者名を印字 # する関数 void print_prime_time(int n) を定義せよ。ただし最大閲覧者数となる時間帯は一般に複数あることに注意すること。 # さらに以下のmain関数と組み合わせてプログラムを作成せよ。 標準入力から閲覧履歴読み込む(_閲覧履歴ならび) :- get_lines(Lines), 閲覧者情報の取得(Lines,_閲覧履歴ならび), 閲覧者履歴の登録(_閲覧者履歴ならび),!. 閲覧履歴の取得と登録([],[]) :- !. 閲覧履歴の取得と登録([_閲覧者名,B|R1],[[_閲覧者名,_閲覧開始時刻,_閲覧継続時間]|R2]) :- split(B,[' '],[_閲覧開始時刻,_閲覧継続時間]), assertz(閲覧履歴(_閲覧者名,_閲覧開始時刻,_閲覧継続時間)), 閲覧履歴の取得と登録(R1,R2),!. 先頭からn個の閲覧データを対象に、24時間中で最多人数が閲覧している30分刻みでの時刻と、そのときの閲覧者名を印字(N,_時,_分,_閲覧者ならび) :- 先頭からn個の閲覧データを対象に、24時間中で最多人数が閲覧している30分刻みでの時刻と、そのときの閲覧者名(N,_閲覧履歴ならび,_時刻,_閲覧者ならび), _時 is _時刻 // 100, _分 is _時刻 mod 100, concat_atom(_閲覧者ならび,' ',_閲覧者ならび表示), write_formatted('最多閲覧時間 %t時%t分から %t\n',[_時,_分,_閲覧者ならび表示]). 先頭からn個の閲覧データを対象に、24時間中で最多人数が閲覧している30分刻みでの時刻と、そのときの閲覧者名(N,_閲覧履歴ならび,_時刻,_閲覧者ならび) :- 先頭からn個の閲覧データを対象に(N,_閲覧履歴ならび,_先頭からn個のデータ), 閲覧分布ならびを作る(_先頭からn個のデータ,_履歴分布ならび), 最多閲覧者時刻(_履歴分布ならび,_最多閲覧者時刻ならび), member(_時刻,_最多閲覧者時刻), setof(_閲覧者名,member([_閲覧者名,_時刻,_],_履歴分布ならび),_閲覧者ならびの一). 先頭からn個の閲覧データを対象に(N,_閲覧履歴ならび,_先頭からn個のデータ) :- length(_先頭からn個のデータ,N), append(_先頭からn個のデータ,_,_閲覧履歴ならび),!. 閲覧分布ならびを作る([],[]) :- !. 閲覧分布ならびを作る([[_閲覧者名,_閲覧開始時刻,_閲覧継続時間]|R1],X) :- 閲覧継続時間を30分ごとに刻む(_閲覧者名,_閲覧開始時刻,_閲覧継続時間,L), 閲覧分布ならびを作る(R1,Y), append(L,Y,X). 閲覧継続時間を30分ごとに刻む(_,_,0,[]) :- !. 閲覧継続時間を30分ごとに刻む(_閲覧者名,_閲覧開始時刻,_閲覧継続時間,[[_閲覧者名,_閲覧開始時刻,30]|R]) :- 次の30分を閲覧開始時刻とする(_閲覧開始時刻,_次の閲覧開始時刻), _閲覧継続時間2 is _閲覧継続時間 - 30, 閲覧継続時間を30分ごとに刻む(_閲覧者名,_次の閲覧開始時刻,_閲覧継続時間2,R),!. 次の30分を閲覧開始時刻とする(2330,0) :- !. 次の30分を閲覧開始時刻とする(_閲覧開始時刻,_次の閲覧開始時刻) :- 30 is _閲覧開始時刻 mod 100, _次の閲覧開始時刻 is _閲覧開始時刻 - 30 + 100,!. 次の30分を閲覧開始時刻とする(_閲覧開始時刻,_次の閲覧開始時刻) :- 0 is _閲覧開始時刻 mod 100, _次の閲覧開始時刻 is _閲覧開始時刻 + 30,!. 最多閲覧者時刻(_履歴分布ならび,_最多閲覧者時刻ならび) :- findall(L1,setof(_閲覧開始時刻,member([_,_閲覧開始時刻,_],_履歴分布ならび),L1),L2), 最多閲覧者時刻の二(L2,_履歴分布ならび,L3), findmax(Count,member([Count,_,_],L3),Max), findall([_閲覧開始時刻,_閲覧者ならび],member([Max,_閲覧開始時刻,_閲覧者ならび],L3),_最多閲覧者時刻ならび). 最多閲覧者閲覧開始時刻の二([],_,[]) :- !. 最多閲覧者閲覧開始時刻の二([[_閲覧開始時刻]|R1],_履歴分布ならび,[[Count,_閲覧開始時刻,L1]|R2]) :- findall([_閲覧者名,_閲覧開始時刻],member([_閲覧者,_閲覧開始時刻,_],_履歴分布ならび),L1), length(L1,Count), 最多閲覧者閲覧開始時刻の二(R1,_履歴分布ならび,R2). # [1] 授業単元: Cプログラム応用A # [2] 問題文(含コード&リンク): # 文字列操作の標準ライブラリ関数を使用し、指定したファイルの中で、辞書列で最初に出てくる単語と最後に出てくる単語、さらに最も長い単語をを見つけ表示せよ。 # ただし、同じ長さの単語がある場合最初に見つけた一つでいい。 # # ここでの単語とは、スペースや改行、タブで区切られた文字列のことである。 # ただし、単語の長さは100文字以内と考えていい。 # 指定したファイルの中で、辞書列で最初に出てくる単語と最後に出てくる単語、さらに最も長い単語をを見つけ表示する(_ファイル,_最初の単語,_最後の単語,_最もながい単語) :-   get_lines(_ファイル,Lines),   concat_atom(Lines,S),   split(S,[' ','\t','\n'],_単語ならび),   sort(_単語ならび,_整列された単語ならび),   append([_最初に出てくる単語|_],[_最後に出てくる単語],_整列された単語ならび),   findmax(_長さ,(member(_単語,_単語ならび),sub_atom(_単語,_,_長さ,_,_単語)),_最もながい長さ). # [1] データ構造とプログラミング # [2] # リングバッファを使って、9個のキューを作り、データを追加したり、 # データを取り出すプログラムを完成させなさい。 # 以下の添付にあるプログラムを完成させろという課題です。 # 演習問題5.2 リングバッファを使って、9 個のキュー(配列は10 元)を作り、 # データを追加したり(EnQue), データを取り出す(DeQue) プログラムを # 完成させなさい29。プログラムの動作仕様は以下のようである。 # 1. 数字を入力するとキューが伸びる # 2. d(deque) を入力するとfront を標準出力に出力 # 3. s(show) を入力するとキューを表示 # 4. キューがいっぱいだったらエラーメッセージを出す # 5. q で終了 # # 'New'(X-X). 'Enque'(_要素,X-[_要素|Y],X-Y). 'Deque'(_要素,[_要素|X]-Y,X-Y). 'Empty'(X-Y) :- X == Y. キュー操作 :- 'New'(Q1),キュー操作機能選択(Q1). キュー操作. キュー操作機能選択(Q1) :- get_line(_機能選択), キュー操作機能選択(_機能選択,Q1,Q2), キュー操作機能選択(Q2),!. キュー操作機能選択(q,_,_) :- !,fail. キュー操作機能選択(d,Q1,Q2) :- 'Deque'(_要素,Q1,Q2), write_formatted('%t\n',[_要素]),!. キュー操作機能選択(s,Q1,Q1) :- キュー表示(Q1),!. キュー操作機能選択(N,Q1,Q2) :- 'Enque'(N,Q1,Q2),!. キュー表示(X-X) :- !. キュー表示(X-Y) :- \+(var(X),var(Y),キュー表示(X-[Y]),!. キュー表示(X-Y) :- \+(var(Y)), append(U,Y,X), concat_atom(U,' ',S), write_formatted('%t\n',[S]),!. # [2] キーボードから3つの整数を受け取り大きさの小さい順に出力するプログラムを作りなさい。 # 但しmain関数内ではint変数一つだけが使えるものとします。またmain関数の再帰呼び出しも # 出来ません。(main関数の引数、argc,argvをint変数として使用することも勿論禁止します) # main関数のみで構成されるプログラムとして下さい。 # 入力される数は1から10までの範囲にあることを常にチェックし、それ以外の入力の場合は # 再入力を促して下さい。 # make :- write('main :-\n'), write(' write(''1-10の整数を空白で区切り3個入力してください : ''),\n'), write(' get_line(Line),(\n'), for(1,N1,10),for(1,N2,10),for(1,N3,10), quicksort([N1,N2,N3],L2), concat_atom(L2,' ',S), write_formatted(' Line=\'%t %t %t\',write(\'%t\\n\')',[N1,N2,N3,S]), make_1(N1,N2,N3), N3=10,N2=10,N1=10, write(' )),!.\n'), write('main :-\n'), write(' write(\'入力された数値範囲を検査してください\\n\'),'), write('\n main.\n'),!. make_1(10,10,10) :- write('\n'),!. make_1(_,_,_) :- write(';\n'),!. main :- write('1-10の整数を空白で区切り3個入力してください\n'), get_line(Line),( Line='1 1 1',write('1 1 1\n'); Line='1 1 2',write('1 1 2\n'); Line='1 1 3',write('1 1 3\n'); Line='1 1 4',write('1 1 4\n'); Line='1 1 5',write('1 1 5\n'); Line='1 1 6',write('1 1 6\n'); Line='1 1 7',write('1 1 7\n'); Line='1 1 8',write('1 1 8\n'); Line='1 1 9',write('1 1 9\n'); Line='1 1 10',write('1 1 10\n'); Line='1 2 1',write('1 1 2\n'); Line='1 2 2',write('1 2 2\n'); Line='1 2 3',write('1 2 3\n'); Line='1 2 4',write('1 2 4\n'); Line='1 2 5',write('1 2 5\n'); Line='1 2 6',write('1 2 6\n'); Line='1 2 7',write('1 2 7\n'); Line='1 2 8',write('1 2 8\n'); Line='1 2 9',write('1 2 9\n'); Line='1 2 10',write('1 2 10\n'); Line='1 3 1',write('1 1 3\n'); Line='1 3 2',write('1 2 3\n'); Line='1 3 3',write('1 3 3\n'); Line='1 3 4',write('1 3 4\n'); Line='1 3 5',write('1 3 5\n'); Line='1 3 6',write('1 3 6\n'); Line='1 3 7',write('1 3 7\n'); Line='1 3 8',write('1 3 8\n'); Line='1 3 9',write('1 3 9\n'); Line='1 3 10',write('1 3 10\n'); Line='1 4 1',write('1 1 4\n'); Line='1 4 2',write('1 2 4\n'); Line='1 4 3',write('1 3 4\n'); Line='1 4 4',write('1 4 4\n'); Line='1 4 5',write('1 4 5\n'); Line='1 4 6',write('1 4 6\n'); Line='1 4 7',write('1 4 7\n'); Line='1 4 8',write('1 4 8\n'); Line='1 4 9',write('1 4 9\n'); Line='1 4 10',write('1 4 10\n'); Line='1 5 1',write('1 1 5\n'); Line='1 5 2',write('1 2 5\n'); Line='1 5 3',write('1 3 5\n'); Line='1 5 4',write('1 4 5\n'); Line='1 5 5',write('1 5 5\n'); Line='1 5 6',write('1 5 6\n'); Line='1 5 7',write('1 5 7\n'); Line='1 5 8',write('1 5 8\n'); Line='1 5 9',write('1 5 9\n'); Line='1 5 10',write('1 5 10\n'); Line='1 6 1',write('1 1 6\n'); Line='1 6 2',write('1 2 6\n'); Line='1 6 3',write('1 3 6\n'); Line='1 6 4',write('1 4 6\n'); Line='1 6 5',write('1 5 6\n'); Line='1 6 6',write('1 6 6\n'); Line='1 6 7',write('1 6 7\n'); Line='1 6 8',write('1 6 8\n'); Line='1 6 9',write('1 6 9\n'); Line='1 6 10',write('1 6 10\n'); Line='1 7 1',write('1 1 7\n'); Line='1 7 2',write('1 2 7\n'); Line='1 7 3',write('1 3 7\n'); Line='1 7 4',write('1 4 7\n'); Line='1 7 5',write('1 5 7\n'); Line='1 7 6',write('1 6 7\n'); Line='1 7 7',write('1 7 7\n'); Line='1 7 8',write('1 7 8\n'); Line='1 7 9',write('1 7 9\n'); Line='1 7 10',write('1 7 10\n'); Line='1 8 1',write('1 1 8\n'); Line='1 8 2',write('1 2 8\n'); Line='1 8 3',write('1 3 8\n'); Line='1 8 4',write('1 4 8\n'); Line='1 8 5',write('1 5 8\n'); Line='1 8 6',write('1 6 8\n'); Line='1 8 7',write('1 7 8\n'); Line='1 8 8',write('1 8 8\n'); Line='1 8 9',write('1 8 9\n'); Line='1 8 10',write('1 8 10\n'); Line='1 9 1',write('1 1 9\n'); Line='1 9 2',write('1 2 9\n'); Line='1 9 3',write('1 3 9\n'); Line='1 9 4',write('1 4 9\n'); Line='1 9 5',write('1 5 9\n'); Line='1 9 6',write('1 6 9\n'); Line='1 9 7',write('1 7 9\n'); Line='1 9 8',write('1 8 9\n'); Line='1 9 9',write('1 9 9\n'); Line='1 9 10',write('1 9 10\n'); Line='1 10 1',write('1 1 10\n'); Line='1 10 2',write('1 2 10\n'); Line='1 10 3',write('1 3 10\n'); Line='1 10 4',write('1 4 10\n'); Line='1 10 5',write('1 5 10\n'); Line='1 10 6',write('1 6 10\n'); Line='1 10 7',write('1 7 10\n'); Line='1 10 8',write('1 8 10\n'); Line='1 10 9',write('1 9 10\n'); Line='1 10 10',write('1 10 10\n'); Line='2 1 1',write('1 1 2\n'); Line='2 1 2',write('1 2 2\n'); Line='2 1 3',write('1 2 3\n'); Line='2 1 4',write('1 2 4\n'); Line='2 1 5',write('1 2 5\n'); Line='2 1 6',write('1 2 6\n'); Line='2 1 7',write('1 2 7\n'); Line='2 1 8',write('1 2 8\n'); Line='2 1 9',write('1 2 9\n'); Line='2 1 10',write('1 2 10\n'); Line='2 2 1',write('1 2 2\n'); Line='2 2 2',write('2 2 2\n'); Line='2 2 3',write('2 2 3\n'); Line='2 2 4',write('2 2 4\n'); Line='2 2 5',write('2 2 5\n'); Line='2 2 6',write('2 2 6\n'); Line='2 2 7',write('2 2 7\n'); Line='2 2 8',write('2 2 8\n'); Line='2 2 9',write('2 2 9\n'); Line='2 2 10',write('2 2 10\n'); Line='2 3 1',write('1 2 3\n'); Line='2 3 2',write('2 2 3\n'); Line='2 3 3',write('2 3 3\n'); Line='2 3 4',write('2 3 4\n'); Line='2 3 5',write('2 3 5\n'); Line='2 3 6',write('2 3 6\n'); Line='2 3 7',write('2 3 7\n'); Line='2 3 8',write('2 3 8\n'); Line='2 3 9',write('2 3 9\n'); Line='2 3 10',write('2 3 10\n'); Line='2 4 1',write('1 2 4\n'); Line='2 4 2',write('2 2 4\n'); Line='2 4 3',write('2 3 4\n'); Line='2 4 4',write('2 4 4\n'); Line='2 4 5',write('2 4 5\n'); Line='2 4 6',write('2 4 6\n'); Line='2 4 7',write('2 4 7\n'); Line='2 4 8',write('2 4 8\n'); Line='2 4 9',write('2 4 9\n'); Line='2 4 10',write('2 4 10\n'); Line='2 5 1',write('1 2 5\n'); Line='2 5 2',write('2 2 5\n'); Line='2 5 3',write('2 3 5\n'); Line='2 5 4',write('2 4 5\n'); Line='2 5 5',write('2 5 5\n'); Line='2 5 6',write('2 5 6\n'); Line='2 5 7',write('2 5 7\n'); Line='2 5 8',write('2 5 8\n'); Line='2 5 9',write('2 5 9\n'); Line='2 5 10',write('2 5 10\n'); Line='2 6 1',write('1 2 6\n'); Line='2 6 2',write('2 2 6\n'); Line='2 6 3',write('2 3 6\n'); Line='2 6 4',write('2 4 6\n'); Line='2 6 5',write('2 5 6\n'); Line='2 6 6',write('2 6 6\n'); Line='2 6 7',write('2 6 7\n'); Line='2 6 8',write('2 6 8\n'); Line='2 6 9',write('2 6 9\n'); Line='2 6 10',write('2 6 10\n'); Line='2 7 1',write('1 2 7\n'); Line='2 7 2',write('2 2 7\n'); Line='2 7 3',write('2 3 7\n'); Line='2 7 4',write('2 4 7\n'); Line='2 7 5',write('2 5 7\n'); Line='2 7 6',write('2 6 7\n'); Line='2 7 7',write('2 7 7\n'); Line='2 7 8',write('2 7 8\n'); Line='2 7 9',write('2 7 9\n'); Line='2 7 10',write('2 7 10\n'); Line='2 8 1',write('1 2 8\n'); Line='2 8 2',write('2 2 8\n'); Line='2 8 3',write('2 3 8\n'); Line='2 8 4',write('2 4 8\n'); Line='2 8 5',write('2 5 8\n'); Line='2 8 6',write('2 6 8\n'); Line='2 8 7',write('2 7 8\n'); Line='2 8 8',write('2 8 8\n'); Line='2 8 9',write('2 8 9\n'); Line='2 8 10',write('2 8 10\n'); Line='2 9 1',write('1 2 9\n'); Line='2 9 2',write('2 2 9\n'); Line='2 9 3',write('2 3 9\n'); Line='2 9 4',write('2 4 9\n'); Line='2 9 5',write('2 5 9\n'); Line='2 9 6',write('2 6 9\n'); Line='2 9 7',write('2 7 9\n'); Line='2 9 8',write('2 8 9\n'); Line='2 9 9',write('2 9 9\n'); Line='2 9 10',write('2 9 10\n'); Line='2 10 1',write('1 2 10\n'); Line='2 10 2',write('2 2 10\n'); Line='2 10 3',write('2 3 10\n'); Line='2 10 4',write('2 4 10\n'); Line='2 10 5',write('2 5 10\n'); Line='2 10 6',write('2 6 10\n'); Line='2 10 7',write('2 7 10\n'); Line='2 10 8',write('2 8 10\n'); Line='2 10 9',write('2 9 10\n'); Line='2 10 10',write('2 10 10\n'); Line='3 1 1',write('1 1 3\n'); Line='3 1 2',write('1 2 3\n'); Line='3 1 3',write('1 3 3\n'); Line='3 1 4',write('1 3 4\n'); Line='3 1 5',write('1 3 5\n'); Line='3 1 6',write('1 3 6\n'); Line='3 1 7',write('1 3 7\n'); Line='3 1 8',write('1 3 8\n'); Line='3 1 9',write('1 3 9\n'); Line='3 1 10',write('1 3 10\n'); Line='3 2 1',write('1 2 3\n'); Line='3 2 2',write('2 2 3\n'); Line='3 2 3',write('2 3 3\n'); Line='3 2 4',write('2 3 4\n'); Line='3 2 5',write('2 3 5\n'); Line='3 2 6',write('2 3 6\n'); Line='3 2 7',write('2 3 7\n'); Line='3 2 8',write('2 3 8\n'); Line='3 2 9',write('2 3 9\n'); Line='3 2 10',write('2 3 10\n'); Line='3 3 1',write('1 3 3\n'); Line='3 3 2',write('2 3 3\n'); Line='3 3 3',write('3 3 3\n'); Line='3 3 4',write('3 3 4\n'); Line='3 3 5',write('3 3 5\n'); Line='3 3 6',write('3 3 6\n'); Line='3 3 7',write('3 3 7\n'); Line='3 3 8',write('3 3 8\n'); Line='3 3 9',write('3 3 9\n'); Line='3 3 10',write('3 3 10\n'); Line='3 4 1',write('1 3 4\n'); Line='3 4 2',write('2 3 4\n'); Line='3 4 3',write('3 3 4\n'); Line='3 4 4',write('3 4 4\n'); Line='3 4 5',write('3 4 5\n'); Line='3 4 6',write('3 4 6\n'); Line='3 4 7',write('3 4 7\n'); Line='3 4 8',write('3 4 8\n'); Line='3 4 9',write('3 4 9\n'); Line='3 4 10',write('3 4 10\n'); Line='3 5 1',write('1 3 5\n'); Line='3 5 2',write('2 3 5\n'); Line='3 5 3',write('3 3 5\n'); Line='3 5 4',write('3 4 5\n'); Line='3 5 5',write('3 5 5\n'); Line='3 5 6',write('3 5 6\n'); Line='3 5 7',write('3 5 7\n'); Line='3 5 8',write('3 5 8\n'); Line='3 5 9',write('3 5 9\n'); Line='3 5 10',write('3 5 10\n'); Line='3 6 1',write('1 3 6\n'); Line='3 6 2',write('2 3 6\n'); Line='3 6 3',write('3 3 6\n'); Line='3 6 4',write('3 4 6\n'); Line='3 6 5',write('3 5 6\n'); Line='3 6 6',write('3 6 6\n'); Line='3 6 7',write('3 6 7\n'); Line='3 6 8',write('3 6 8\n'); Line='3 6 9',write('3 6 9\n'); Line='3 6 10',write('3 6 10\n'); Line='3 7 1',write('1 3 7\n'); Line='3 7 2',write('2 3 7\n'); Line='3 7 3',write('3 3 7\n'); Line='3 7 4',write('3 4 7\n'); Line='3 7 5',write('3 5 7\n'); Line='3 7 6',write('3 6 7\n'); Line='3 7 7',write('3 7 7\n'); Line='3 7 8',write('3 7 8\n'); Line='3 7 9',write('3 7 9\n'); Line='3 7 10',write('3 7 10\n'); Line='3 8 1',write('1 3 8\n'); Line='3 8 2',write('2 3 8\n'); Line='3 8 3',write('3 3 8\n'); Line='3 8 4',write('3 4 8\n'); Line='3 8 5',write('3 5 8\n'); Line='3 8 6',write('3 6 8\n'); Line='3 8 7',write('3 7 8\n'); Line='3 8 8',write('3 8 8\n'); Line='3 8 9',write('3 8 9\n'); Line='3 8 10',write('3 8 10\n'); Line='3 9 1',write('1 3 9\n'); Line='3 9 2',write('2 3 9\n'); Line='3 9 3',write('3 3 9\n'); Line='3 9 4',write('3 4 9\n'); Line='3 9 5',write('3 5 9\n'); Line='3 9 6',write('3 6 9\n'); Line='3 9 7',write('3 7 9\n'); Line='3 9 8',write('3 8 9\n'); Line='3 9 9',write('3 9 9\n'); Line='3 9 10',write('3 9 10\n'); Line='3 10 1',write('1 3 10\n'); Line='3 10 2',write('2 3 10\n'); Line='3 10 3',write('3 3 10\n'); Line='3 10 4',write('3 4 10\n'); Line='3 10 5',write('3 5 10\n'); Line='3 10 6',write('3 6 10\n'); Line='3 10 7',write('3 7 10\n'); Line='3 10 8',write('3 8 10\n'); Line='3 10 9',write('3 9 10\n'); Line='3 10 10',write('3 10 10\n'); Line='4 1 1',write('1 1 4\n'); Line='4 1 2',write('1 2 4\n'); Line='4 1 3',write('1 3 4\n'); Line='4 1 4',write('1 4 4\n'); Line='4 1 5',write('1 4 5\n'); Line='4 1 6',write('1 4 6\n'); Line='4 1 7',write('1 4 7\n'); Line='4 1 8',write('1 4 8\n'); Line='4 1 9',write('1 4 9\n'); Line='4 1 10',write('1 4 10\n'); Line='4 2 1',write('1 2 4\n'); Line='4 2 2',write('2 2 4\n'); Line='4 2 3',write('2 3 4\n'); Line='4 2 4',write('2 4 4\n'); Line='4 2 5',write('2 4 5\n'); Line='4 2 6',write('2 4 6\n'); Line='4 2 7',write('2 4 7\n'); Line='4 2 8',write('2 4 8\n'); Line='4 2 9',write('2 4 9\n'); Line='4 2 10',write('2 4 10\n'); Line='4 3 1',write('1 3 4\n'); Line='4 3 2',write('2 3 4\n'); Line='4 3 3',write('3 3 4\n'); Line='4 3 4',write('3 4 4\n'); Line='4 3 5',write('3 4 5\n'); Line='4 3 6',write('3 4 6\n'); Line='4 3 7',write('3 4 7\n'); Line='4 3 8',write('3 4 8\n'); Line='4 3 9',write('3 4 9\n'); Line='4 3 10',write('3 4 10\n'); Line='4 4 1',write('1 4 4\n'); Line='4 4 2',write('2 4 4\n'); Line='4 4 3',write('3 4 4\n'); Line='4 4 4',write('4 4 4\n'); Line='4 4 5',write('4 4 5\n'); Line='4 4 6',write('4 4 6\n'); Line='4 4 7',write('4 4 7\n'); Line='4 4 8',write('4 4 8\n'); Line='4 4 9',write('4 4 9\n'); Line='4 4 10',write('4 4 10\n'); Line='4 5 1',write('1 4 5\n'); Line='4 5 2',write('2 4 5\n'); Line='4 5 3',write('3 4 5\n'); Line='4 5 4',write('4 4 5\n'); Line='4 5 5',write('4 5 5\n'); Line='4 5 6',write('4 5 6\n'); Line='4 5 7',write('4 5 7\n'); Line='4 5 8',write('4 5 8\n'); Line='4 5 9',write('4 5 9\n'); Line='4 5 10',write('4 5 10\n'); Line='4 6 1',write('1 4 6\n'); Line='4 6 2',write('2 4 6\n'); Line='4 6 3',write('3 4 6\n'); Line='4 6 4',write('4 4 6\n'); Line='4 6 5',write('4 5 6\n'); Line='4 6 6',write('4 6 6\n'); Line='4 6 7',write('4 6 7\n'); Line='4 6 8',write('4 6 8\n'); Line='4 6 9',write('4 6 9\n'); Line='4 6 10',write('4 6 10\n'); Line='4 7 1',write('1 4 7\n'); Line='4 7 2',write('2 4 7\n'); Line='4 7 3',write('3 4 7\n'); Line='4 7 4',write('4 4 7\n'); Line='4 7 5',write('4 5 7\n'); Line='4 7 6',write('4 6 7\n'); Line='4 7 7',write('4 7 7\n'); Line='4 7 8',write('4 7 8\n'); Line='4 7 9',write('4 7 9\n'); Line='4 7 10',write('4 7 10\n'); Line='4 8 1',write('1 4 8\n'); Line='4 8 2',write('2 4 8\n'); Line='4 8 3',write('3 4 8\n'); Line='4 8 4',write('4 4 8\n'); Line='4 8 5',write('4 5 8\n'); Line='4 8 6',write('4 6 8\n'); Line='4 8 7',write('4 7 8\n'); Line='4 8 8',write('4 8 8\n'); Line='4 8 9',write('4 8 9\n'); Line='4 8 10',write('4 8 10\n'); Line='4 9 1',write('1 4 9\n'); Line='4 9 2',write('2 4 9\n'); Line='4 9 3',write('3 4 9\n'); Line='4 9 4',write('4 4 9\n'); Line='4 9 5',write('4 5 9\n'); Line='4 9 6',write('4 6 9\n'); Line='4 9 7',write('4 7 9\n'); Line='4 9 8',write('4 8 9\n'); Line='4 9 9',write('4 9 9\n'); Line='4 9 10',write('4 9 10\n'); Line='4 10 1',write('1 4 10\n'); Line='4 10 2',write('2 4 10\n'); Line='4 10 3',write('3 4 10\n'); Line='4 10 4',write('4 4 10\n'); Line='4 10 5',write('4 5 10\n'); Line='4 10 6',write('4 6 10\n'); Line='4 10 7',write('4 7 10\n'); Line='4 10 8',write('4 8 10\n'); Line='4 10 9',write('4 9 10\n'); Line='4 10 10',write('4 10 10\n'); Line='5 1 1',write('1 1 5\n'); Line='5 1 2',write('1 2 5\n'); Line='5 1 3',write('1 3 5\n'); Line='5 1 4',write('1 4 5\n'); Line='5 1 5',write('1 5 5\n'); Line='5 1 6',write('1 5 6\n'); Line='5 1 7',write('1 5 7\n'); Line='5 1 8',write('1 5 8\n'); Line='5 1 9',write('1 5 9\n'); Line='5 1 10',write('1 5 10\n'); Line='5 2 1',write('1 2 5\n'); Line='5 2 2',write('2 2 5\n'); Line='5 2 3',write('2 3 5\n'); Line='5 2 4',write('2 4 5\n'); Line='5 2 5',write('2 5 5\n'); Line='5 2 6',write('2 5 6\n'); Line='5 2 7',write('2 5 7\n'); Line='5 2 8',write('2 5 8\n'); Line='5 2 9',write('2 5 9\n'); Line='5 2 10',write('2 5 10\n'); Line='5 3 1',write('1 3 5\n'); Line='5 3 2',write('2 3 5\n'); Line='5 3 3',write('3 3 5\n'); Line='5 3 4',write('3 4 5\n'); Line='5 3 5',write('3 5 5\n'); Line='5 3 6',write('3 5 6\n'); Line='5 3 7',write('3 5 7\n'); Line='5 3 8',write('3 5 8\n'); Line='5 3 9',write('3 5 9\n'); Line='5 3 10',write('3 5 10\n'); Line='5 4 1',write('1 4 5\n'); Line='5 4 2',write('2 4 5\n'); Line='5 4 3',write('3 4 5\n'); Line='5 4 4',write('4 4 5\n'); Line='5 4 5',write('4 5 5\n'); Line='5 4 6',write('4 5 6\n'); Line='5 4 7',write('4 5 7\n'); Line='5 4 8',write('4 5 8\n'); Line='5 4 9',write('4 5 9\n'); Line='5 4 10',write('4 5 10\n'); Line='5 5 1',write('1 5 5\n'); Line='5 5 2',write('2 5 5\n'); Line='5 5 3',write('3 5 5\n'); Line='5 5 4',write('4 5 5\n'); Line='5 5 5',write('5 5 5\n'); Line='5 5 6',write('5 5 6\n'); Line='5 5 7',write('5 5 7\n'); Line='5 5 8',write('5 5 8\n'); Line='5 5 9',write('5 5 9\n'); Line='5 5 10',write('5 5 10\n'); Line='5 6 1',write('1 5 6\n'); Line='5 6 2',write('2 5 6\n'); Line='5 6 3',write('3 5 6\n'); Line='5 6 4',write('4 5 6\n'); Line='5 6 5',write('5 5 6\n'); Line='5 6 6',write('5 6 6\n'); Line='5 6 7',write('5 6 7\n'); Line='5 6 8',write('5 6 8\n'); Line='5 6 9',write('5 6 9\n'); Line='5 6 10',write('5 6 10\n'); Line='5 7 1',write('1 5 7\n'); Line='5 7 2',write('2 5 7\n'); Line='5 7 3',write('3 5 7\n'); Line='5 7 4',write('4 5 7\n'); Line='5 7 5',write('5 5 7\n'); Line='5 7 6',write('5 6 7\n'); Line='5 7 7',write('5 7 7\n'); Line='5 7 8',write('5 7 8\n'); Line='5 7 9',write('5 7 9\n'); Line='5 7 10',write('5 7 10\n'); Line='5 8 1',write('1 5 8\n'); Line='5 8 2',write('2 5 8\n'); Line='5 8 3',write('3 5 8\n'); Line='5 8 4',write('4 5 8\n'); Line='5 8 5',write('5 5 8\n'); Line='5 8 6',write('5 6 8\n'); Line='5 8 7',write('5 7 8\n'); Line='5 8 8',write('5 8 8\n'); Line='5 8 9',write('5 8 9\n'); Line='5 8 10',write('5 8 10\n'); Line='5 9 1',write('1 5 9\n'); Line='5 9 2',write('2 5 9\n'); Line='5 9 3',write('3 5 9\n'); Line='5 9 4',write('4 5 9\n'); Line='5 9 5',write('5 5 9\n'); Line='5 9 6',write('5 6 9\n'); Line='5 9 7',write('5 7 9\n'); Line='5 9 8',write('5 8 9\n'); Line='5 9 9',write('5 9 9\n'); Line='5 9 10',write('5 9 10\n'); Line='5 10 1',write('1 5 10\n'); Line='5 10 2',write('2 5 10\n'); Line='5 10 3',write('3 5 10\n'); Line='5 10 4',write('4 5 10\n'); Line='5 10 5',write('5 5 10\n'); Line='5 10 6',write('5 6 10\n'); Line='5 10 7',write('5 7 10\n'); Line='5 10 8',write('5 8 10\n'); Line='5 10 9',write('5 9 10\n'); Line='5 10 10',write('5 10 10\n'); Line='6 1 1',write('1 1 6\n'); Line='6 1 2',write('1 2 6\n'); Line='6 1 3',write('1 3 6\n'); Line='6 1 4',write('1 4 6\n'); Line='6 1 5',write('1 5 6\n'); Line='6 1 6',write('1 6 6\n'); Line='6 1 7',write('1 6 7\n'); Line='6 1 8',write('1 6 8\n'); Line='6 1 9',write('1 6 9\n'); Line='6 1 10',write('1 6 10\n'); Line='6 2 1',write('1 2 6\n'); Line='6 2 2',write('2 2 6\n'); Line='6 2 3',write('2 3 6\n'); Line='6 2 4',write('2 4 6\n'); Line='6 2 5',write('2 5 6\n'); Line='6 2 6',write('2 6 6\n'); Line='6 2 7',write('2 6 7\n'); Line='6 2 8',write('2 6 8\n'); Line='6 2 9',write('2 6 9\n'); Line='6 2 10',write('2 6 10\n'); Line='6 3 1',write('1 3 6\n'); Line='6 3 2',write('2 3 6\n'); Line='6 3 3',write('3 3 6\n'); Line='6 3 4',write('3 4 6\n'); Line='6 3 5',write('3 5 6\n'); Line='6 3 6',write('3 6 6\n'); Line='6 3 7',write('3 6 7\n'); Line='6 3 8',write('3 6 8\n'); Line='6 3 9',write('3 6 9\n'); Line='6 3 10',write('3 6 10\n'); Line='6 4 1',write('1 4 6\n'); Line='6 4 2',write('2 4 6\n'); Line='6 4 3',write('3 4 6\n'); Line='6 4 4',write('4 4 6\n'); Line='6 4 5',write('4 5 6\n'); Line='6 4 6',write('4 6 6\n'); Line='6 4 7',write('4 6 7\n'); Line='6 4 8',write('4 6 8\n'); Line='6 4 9',write('4 6 9\n'); Line='6 4 10',write('4 6 10\n'); Line='6 5 1',write('1 5 6\n'); Line='6 5 2',write('2 5 6\n'); Line='6 5 3',write('3 5 6\n'); Line='6 5 4',write('4 5 6\n'); Line='6 5 5',write('5 5 6\n'); Line='6 5 6',write('5 6 6\n'); Line='6 5 7',write('5 6 7\n'); Line='6 5 8',write('5 6 8\n'); Line='6 5 9',write('5 6 9\n'); Line='6 5 10',write('5 6 10\n'); Line='6 6 1',write('1 6 6\n'); Line='6 6 2',write('2 6 6\n'); Line='6 6 3',write('3 6 6\n'); Line='6 6 4',write('4 6 6\n'); Line='6 6 5',write('5 6 6\n'); Line='6 6 6',write('6 6 6\n'); Line='6 6 7',write('6 6 7\n'); Line='6 6 8',write('6 6 8\n'); Line='6 6 9',write('6 6 9\n'); Line='6 6 10',write('6 6 10\n'); Line='6 7 1',write('1 6 7\n'); Line='6 7 2',write('2 6 7\n'); Line='6 7 3',write('3 6 7\n'); Line='6 7 4',write('4 6 7\n'); Line='6 7 5',write('5 6 7\n'); Line='6 7 6',write('6 6 7\n'); Line='6 7 7',write('6 7 7\n'); Line='6 7 8',write('6 7 8\n'); Line='6 7 9',write('6 7 9\n'); Line='6 7 10',write('6 7 10\n'); Line='6 8 1',write('1 6 8\n'); Line='6 8 2',write('2 6 8\n'); Line='6 8 3',write('3 6 8\n'); Line='6 8 4',write('4 6 8\n'); Line='6 8 5',write('5 6 8\n'); Line='6 8 6',write('6 6 8\n'); Line='6 8 7',write('6 7 8\n'); Line='6 8 8',write('6 8 8\n'); Line='6 8 9',write('6 8 9\n'); Line='6 8 10',write('6 8 10\n'); Line='6 9 1',write('1 6 9\n'); Line='6 9 2',write('2 6 9\n'); Line='6 9 3',write('3 6 9\n'); Line='6 9 4',write('4 6 9\n'); Line='6 9 5',write('5 6 9\n'); Line='6 9 6',write('6 6 9\n'); Line='6 9 7',write('6 7 9\n'); Line='6 9 8',write('6 8 9\n'); Line='6 9 9',write('6 9 9\n'); Line='6 9 10',write('6 9 10\n'); Line='6 10 1',write('1 6 10\n'); Line='6 10 2',write('2 6 10\n'); Line='6 10 3',write('3 6 10\n'); Line='6 10 4',write('4 6 10\n'); Line='6 10 5',write('5 6 10\n'); Line='6 10 6',write('6 6 10\n'); Line='6 10 7',write('6 7 10\n'); Line='6 10 8',write('6 8 10\n'); Line='6 10 9',write('6 9 10\n'); Line='6 10 10',write('6 10 10\n'); Line='7 1 1',write('1 1 7\n'); Line='7 1 2',write('1 2 7\n'); Line='7 1 3',write('1 3 7\n'); Line='7 1 4',write('1 4 7\n'); Line='7 1 5',write('1 5 7\n'); Line='7 1 6',write('1 6 7\n'); Line='7 1 7',write('1 7 7\n'); Line='7 1 8',write('1 7 8\n'); Line='7 1 9',write('1 7 9\n'); Line='7 1 10',write('1 7 10\n'); Line='7 2 1',write('1 2 7\n'); Line='7 2 2',write('2 2 7\n'); Line='7 2 3',write('2 3 7\n'); Line='7 2 4',write('2 4 7\n'); Line='7 2 5',write('2 5 7\n'); Line='7 2 6',write('2 6 7\n'); Line='7 2 7',write('2 7 7\n'); Line='7 2 8',write('2 7 8\n'); Line='7 2 9',write('2 7 9\n'); Line='7 2 10',write('2 7 10\n'); Line='7 3 1',write('1 3 7\n'); Line='7 3 2',write('2 3 7\n'); Line='7 3 3',write('3 3 7\n'); Line='7 3 4',write('3 4 7\n'); Line='7 3 5',write('3 5 7\n'); Line='7 3 6',write('3 6 7\n'); Line='7 3 7',write('3 7 7\n'); Line='7 3 8',write('3 7 8\n'); Line='7 3 9',write('3 7 9\n'); Line='7 3 10',write('3 7 10\n'); Line='7 4 1',write('1 4 7\n'); Line='7 4 2',write('2 4 7\n'); Line='7 4 3',write('3 4 7\n'); Line='7 4 4',write('4 4 7\n'); Line='7 4 5',write('4 5 7\n'); Line='7 4 6',write('4 6 7\n'); Line='7 4 7',write('4 7 7\n'); Line='7 4 8',write('4 7 8\n'); Line='7 4 9',write('4 7 9\n'); Line='7 4 10',write('4 7 10\n'); Line='7 5 1',write('1 5 7\n'); Line='7 5 2',write('2 5 7\n'); Line='7 5 3',write('3 5 7\n'); Line='7 5 4',write('4 5 7\n'); Line='7 5 5',write('5 5 7\n'); Line='7 5 6',write('5 6 7\n'); Line='7 5 7',write('5 7 7\n'); Line='7 5 8',write('5 7 8\n'); Line='7 5 9',write('5 7 9\n'); Line='7 5 10',write('5 7 10\n'); Line='7 6 1',write('1 6 7\n'); Line='7 6 2',write('2 6 7\n'); Line='7 6 3',write('3 6 7\n'); Line='7 6 4',write('4 6 7\n'); Line='7 6 5',write('5 6 7\n'); Line='7 6 6',write('6 6 7\n'); Line='7 6 7',write('6 7 7\n'); Line='7 6 8',write('6 7 8\n'); Line='7 6 9',write('6 7 9\n'); Line='7 6 10',write('6 7 10\n'); Line='7 7 1',write('1 7 7\n'); Line='7 7 2',write('2 7 7\n'); Line='7 7 3',write('3 7 7\n'); Line='7 7 4',write('4 7 7\n'); Line='7 7 5',write('5 7 7\n'); Line='7 7 6',write('6 7 7\n'); Line='7 7 7',write('7 7 7\n'); Line='7 7 8',write('7 7 8\n'); Line='7 7 9',write('7 7 9\n'); Line='7 7 10',write('7 7 10\n'); Line='7 8 1',write('1 7 8\n'); Line='7 8 2',write('2 7 8\n'); Line='7 8 3',write('3 7 8\n'); Line='7 8 4',write('4 7 8\n'); Line='7 8 5',write('5 7 8\n'); Line='7 8 6',write('6 7 8\n'); Line='7 8 7',write('7 7 8\n'); Line='7 8 8',write('7 8 8\n'); Line='7 8 9',write('7 8 9\n'); Line='7 8 10',write('7 8 10\n'); Line='7 9 1',write('1 7 9\n'); Line='7 9 2',write('2 7 9\n'); Line='7 9 3',write('3 7 9\n'); Line='7 9 4',write('4 7 9\n'); Line='7 9 5',write('5 7 9\n'); Line='7 9 6',write('6 7 9\n'); Line='7 9 7',write('7 7 9\n'); Line='7 9 8',write('7 8 9\n'); Line='7 9 9',write('7 9 9\n'); Line='7 9 10',write('7 9 10\n'); Line='7 10 1',write('1 7 10\n'); Line='7 10 2',write('2 7 10\n'); Line='7 10 3',write('3 7 10\n'); Line='7 10 4',write('4 7 10\n'); Line='7 10 5',write('5 7 10\n'); Line='7 10 6',write('6 7 10\n'); Line='7 10 7',write('7 7 10\n'); Line='7 10 8',write('7 8 10\n'); Line='7 10 9',write('7 9 10\n'); Line='7 10 10',write('7 10 10\n'); Line='8 1 1',write('1 1 8\n'); Line='8 1 2',write('1 2 8\n'); Line='8 1 3',write('1 3 8\n'); Line='8 1 4',write('1 4 8\n'); Line='8 1 5',write('1 5 8\n'); Line='8 1 6',write('1 6 8\n'); Line='8 1 7',write('1 7 8\n'); Line='8 1 8',write('1 8 8\n'); Line='8 1 9',write('1 8 9\n'); Line='8 1 10',write('1 8 10\n'); Line='8 2 1',write('1 2 8\n'); Line='8 2 2',write('2 2 8\n'); Line='8 2 3',write('2 3 8\n'); Line='8 2 4',write('2 4 8\n'); Line='8 2 5',write('2 5 8\n'); Line='8 2 6',write('2 6 8\n'); Line='8 2 7',write('2 7 8\n'); Line='8 2 8',write('2 8 8\n'); Line='8 2 9',write('2 8 9\n'); Line='8 2 10',write('2 8 10\n'); Line='8 3 1',write('1 3 8\n'); Line='8 3 2',write('2 3 8\n'); Line='8 3 3',write('3 3 8\n'); Line='8 3 4',write('3 4 8\n'); Line='8 3 5',write('3 5 8\n'); Line='8 3 6',write('3 6 8\n'); Line='8 3 7',write('3 7 8\n'); Line='8 3 8',write('3 8 8\n'); Line='8 3 9',write('3 8 9\n'); Line='8 3 10',write('3 8 10\n'); Line='8 4 1',write('1 4 8\n'); Line='8 4 2',write('2 4 8\n'); Line='8 4 3',write('3 4 8\n'); Line='8 4 4',write('4 4 8\n'); Line='8 4 5',write('4 5 8\n'); Line='8 4 6',write('4 6 8\n'); Line='8 4 7',write('4 7 8\n'); Line='8 4 8',write('4 8 8\n'); Line='8 4 9',write('4 8 9\n'); Line='8 4 10',write('4 8 10\n'); Line='8 5 1',write('1 5 8\n'); Line='8 5 2',write('2 5 8\n'); Line='8 5 3',write('3 5 8\n'); Line='8 5 4',write('4 5 8\n'); Line='8 5 5',write('5 5 8\n'); Line='8 5 6',write('5 6 8\n'); Line='8 5 7',write('5 7 8\n'); Line='8 5 8',write('5 8 8\n'); Line='8 5 9',write('5 8 9\n'); Line='8 5 10',write('5 8 10\n'); Line='8 6 1',write('1 6 8\n'); Line='8 6 2',write('2 6 8\n'); Line='8 6 3',write('3 6 8\n'); Line='8 6 4',write('4 6 8\n'); Line='8 6 5',write('5 6 8\n'); Line='8 6 6',write('6 6 8\n'); Line='8 6 7',write('6 7 8\n'); Line='8 6 8',write('6 8 8\n'); Line='8 6 9',write('6 8 9\n'); Line='8 6 10',write('6 8 10\n'); Line='8 7 1',write('1 7 8\n'); Line='8 7 2',write('2 7 8\n'); Line='8 7 3',write('3 7 8\n'); Line='8 7 4',write('4 7 8\n'); Line='8 7 5',write('5 7 8\n'); Line='8 7 6',write('6 7 8\n'); Line='8 7 7',write('7 7 8\n'); Line='8 7 8',write('7 8 8\n'); Line='8 7 9',write('7 8 9\n'); Line='8 7 10',write('7 8 10\n'); Line='8 8 1',write('1 8 8\n'); Line='8 8 2',write('2 8 8\n'); Line='8 8 3',write('3 8 8\n'); Line='8 8 4',write('4 8 8\n'); Line='8 8 5',write('5 8 8\n'); Line='8 8 6',write('6 8 8\n'); Line='8 8 7',write('7 8 8\n'); Line='8 8 8',write('8 8 8\n'); Line='8 8 9',write('8 8 9\n'); Line='8 8 10',write('8 8 10\n'); Line='8 9 1',write('1 8 9\n'); Line='8 9 2',write('2 8 9\n'); Line='8 9 3',write('3 8 9\n'); Line='8 9 4',write('4 8 9\n'); Line='8 9 5',write('5 8 9\n'); Line='8 9 6',write('6 8 9\n'); Line='8 9 7',write('7 8 9\n'); Line='8 9 8',write('8 8 9\n'); Line='8 9 9',write('8 9 9\n'); Line='8 9 10',write('8 9 10\n'); Line='8 10 1',write('1 8 10\n'); Line='8 10 2',write('2 8 10\n'); Line='8 10 3',write('3 8 10\n'); Line='8 10 4',write('4 8 10\n'); Line='8 10 5',write('5 8 10\n'); Line='8 10 6',write('6 8 10\n'); Line='8 10 7',write('7 8 10\n'); Line='8 10 8',write('8 8 10\n'); Line='8 10 9',write('8 9 10\n'); Line='8 10 10',write('8 10 10\n'); Line='9 1 1',write('1 1 9\n'); Line='9 1 2',write('1 2 9\n'); Line='9 1 3',write('1 3 9\n'); Line='9 1 4',write('1 4 9\n'); Line='9 1 5',write('1 5 9\n'); Line='9 1 6',write('1 6 9\n'); Line='9 1 7',write('1 7 9\n'); Line='9 1 8',write('1 8 9\n'); Line='9 1 9',write('1 9 9\n'); Line='9 1 10',write('1 9 10\n'); Line='9 2 1',write('1 2 9\n'); Line='9 2 2',write('2 2 9\n'); Line='9 2 3',write('2 3 9\n'); Line='9 2 4',write('2 4 9\n'); Line='9 2 5',write('2 5 9\n'); Line='9 2 6',write('2 6 9\n'); Line='9 2 7',write('2 7 9\n'); Line='9 2 8',write('2 8 9\n'); Line='9 2 9',write('2 9 9\n'); Line='9 2 10',write('2 9 10\n'); Line='9 3 1',write('1 3 9\n'); Line='9 3 2',write('2 3 9\n'); Line='9 3 3',write('3 3 9\n'); Line='9 3 4',write('3 4 9\n'); Line='9 3 5',write('3 5 9\n'); Line='9 3 6',write('3 6 9\n'); Line='9 3 7',write('3 7 9\n'); Line='9 3 8',write('3 8 9\n'); Line='9 3 9',write('3 9 9\n'); Line='9 3 10',write('3 9 10\n'); Line='9 4 1',write('1 4 9\n'); Line='9 4 2',write('2 4 9\n'); Line='9 4 3',write('3 4 9\n'); Line='9 4 4',write('4 4 9\n'); Line='9 4 5',write('4 5 9\n'); Line='9 4 6',write('4 6 9\n'); Line='9 4 7',write('4 7 9\n'); Line='9 4 8',write('4 8 9\n'); Line='9 4 9',write('4 9 9\n'); Line='9 4 10',write('4 9 10\n'); Line='9 5 1',write('1 5 9\n'); Line='9 5 2',write('2 5 9\n'); Line='9 5 3',write('3 5 9\n'); Line='9 5 4',write('4 5 9\n'); Line='9 5 5',write('5 5 9\n'); Line='9 5 6',write('5 6 9\n'); Line='9 5 7',write('5 7 9\n'); Line='9 5 8',write('5 8 9\n'); Line='9 5 9',write('5 9 9\n'); Line='9 5 10',write('5 9 10\n'); Line='9 6 1',write('1 6 9\n'); Line='9 6 2',write('2 6 9\n'); Line='9 6 3',write('3 6 9\n'); Line='9 6 4',write('4 6 9\n'); Line='9 6 5',write('5 6 9\n'); Line='9 6 6',write('6 6 9\n'); Line='9 6 7',write('6 7 9\n'); Line='9 6 8',write('6 8 9\n'); Line='9 6 9',write('6 9 9\n'); Line='9 6 10',write('6 9 10\n'); Line='9 7 1',write('1 7 9\n'); Line='9 7 2',write('2 7 9\n'); Line='9 7 3',write('3 7 9\n'); Line='9 7 4',write('4 7 9\n'); Line='9 7 5',write('5 7 9\n'); Line='9 7 6',write('6 7 9\n'); Line='9 7 7',write('7 7 9\n'); Line='9 7 8',write('7 8 9\n'); Line='9 7 9',write('7 9 9\n'); Line='9 7 10',write('7 9 10\n'); Line='9 8 1',write('1 8 9\n'); Line='9 8 2',write('2 8 9\n'); Line='9 8 3',write('3 8 9\n'); Line='9 8 4',write('4 8 9\n'); Line='9 8 5',write('5 8 9\n'); Line='9 8 6',write('6 8 9\n'); Line='9 8 7',write('7 8 9\n'); Line='9 8 8',write('8 8 9\n'); Line='9 8 9',write('8 9 9\n'); Line='9 8 10',write('8 9 10\n'); Line='9 9 1',write('1 9 9\n'); Line='9 9 2',write('2 9 9\n'); Line='9 9 3',write('3 9 9\n'); Line='9 9 4',write('4 9 9\n'); Line='9 9 5',write('5 9 9\n'); Line='9 9 6',write('6 9 9\n'); Line='9 9 7',write('7 9 9\n'); Line='9 9 8',write('8 9 9\n'); Line='9 9 9',write('9 9 9\n'); Line='9 9 10',write('9 9 10\n'); Line='9 10 1',write('1 9 10\n'); Line='9 10 2',write('2 9 10\n'); Line='9 10 3',write('3 9 10\n'); Line='9 10 4',write('4 9 10\n'); Line='9 10 5',write('5 9 10\n'); Line='9 10 6',write('6 9 10\n'); Line='9 10 7',write('7 9 10\n'); Line='9 10 8',write('8 9 10\n'); Line='9 10 9',write('9 9 10\n'); Line='9 10 10',write('9 10 10\n'); Line='10 1 1',write('1 1 10\n'); Line='10 1 2',write('1 2 10\n'); Line='10 1 3',write('1 3 10\n'); Line='10 1 4',write('1 4 10\n'); Line='10 1 5',write('1 5 10\n'); Line='10 1 6',write('1 6 10\n'); Line='10 1 7',write('1 7 10\n'); Line='10 1 8',write('1 8 10\n'); Line='10 1 9',write('1 9 10\n'); Line='10 1 10',write('1 10 10\n'); Line='10 2 1',write('1 2 10\n'); Line='10 2 2',write('2 2 10\n'); Line='10 2 3',write('2 3 10\n'); Line='10 2 4',write('2 4 10\n'); Line='10 2 5',write('2 5 10\n'); Line='10 2 6',write('2 6 10\n'); Line='10 2 7',write('2 7 10\n'); Line='10 2 8',write('2 8 10\n'); Line='10 2 9',write('2 9 10\n'); Line='10 2 10',write('2 10 10\n'); Line='10 3 1',write('1 3 10\n'); Line='10 3 2',write('2 3 10\n'); Line='10 3 3',write('3 3 10\n'); Line='10 3 4',write('3 4 10\n'); Line='10 3 5',write('3 5 10\n'); Line='10 3 6',write('3 6 10\n'); Line='10 3 7',write('3 7 10\n'); Line='10 3 8',write('3 8 10\n'); Line='10 3 9',write('3 9 10\n'); Line='10 3 10',write('3 10 10\n'); Line='10 4 1',write('1 4 10\n'); Line='10 4 2',write('2 4 10\n'); Line='10 4 3',write('3 4 10\n'); Line='10 4 4',write('4 4 10\n'); Line='10 4 5',write('4 5 10\n'); Line='10 4 6',write('4 6 10\n'); Line='10 4 7',write('4 7 10\n'); Line='10 4 8',write('4 8 10\n'); Line='10 4 9',write('4 9 10\n'); Line='10 4 10',write('4 10 10\n'); Line='10 5 1',write('1 5 10\n'); Line='10 5 2',write('2 5 10\n'); Line='10 5 3',write('3 5 10\n'); Line='10 5 4',write('4 5 10\n'); Line='10 5 5',write('5 5 10\n'); Line='10 5 6',write('5 6 10\n'); Line='10 5 7',write('5 7 10\n'); Line='10 5 8',write('5 8 10\n'); Line='10 5 9',write('5 9 10\n'); Line='10 5 10',write('5 10 10\n'); Line='10 6 1',write('1 6 10\n'); Line='10 6 2',write('2 6 10\n'); Line='10 6 3',write('3 6 10\n'); Line='10 6 4',write('4 6 10\n'); Line='10 6 5',write('5 6 10\n'); Line='10 6 6',write('6 6 10\n'); Line='10 6 7',write('6 7 10\n'); Line='10 6 8',write('6 8 10\n'); Line='10 6 9',write('6 9 10\n'); Line='10 6 10',write('6 10 10\n'); Line='10 7 1',write('1 7 10\n'); Line='10 7 2',write('2 7 10\n'); Line='10 7 3',write('3 7 10\n'); Line='10 7 4',write('4 7 10\n'); Line='10 7 5',write('5 7 10\n'); Line='10 7 6',write('6 7 10\n'); Line='10 7 7',write('7 7 10\n'); Line='10 7 8',write('7 8 10\n'); Line='10 7 9',write('7 9 10\n'); Line='10 7 10',write('7 10 10\n'); Line='10 8 1',write('1 8 10\n'); Line='10 8 2',write('2 8 10\n'); Line='10 8 3',write('3 8 10\n'); Line='10 8 4',write('4 8 10\n'); Line='10 8 5',write('5 8 10\n'); Line='10 8 6',write('6 8 10\n'); Line='10 8 7',write('7 8 10\n'); Line='10 8 8',write('8 8 10\n'); Line='10 8 9',write('8 9 10\n'); Line='10 8 10',write('8 10 10\n'); Line='10 9 1',write('1 9 10\n'); Line='10 9 2',write('2 9 10\n'); Line='10 9 3',write('3 9 10\n'); Line='10 9 4',write('4 9 10\n'); Line='10 9 5',write('5 9 10\n'); Line='10 9 6',write('6 9 10\n'); Line='10 9 7',write('7 9 10\n'); Line='10 9 8',write('8 9 10\n'); Line='10 9 9',write('9 9 10\n'); Line='10 9 10',write('9 10 10\n'); Line='10 10 1',write('1 10 10\n'); Line='10 10 2',write('2 10 10\n'); Line='10 10 3',write('3 10 10\n'); Line='10 10 4',write('4 10 10\n'); Line='10 10 5',write('5 10 10\n'); Line='10 10 6',write('6 10 10\n'); Line='10 10 7',write('7 10 10\n'); Line='10 10 8',write('8 10 10\n'); Line='10 10 9',write('9 10 10\n'); Line='10 10 10',write('10 10 10\n')). main :- write('入力された数値範囲を検査してください\n'), main. # [1] 授業単元:プログラミング # ポーカープログラム # # 1,二つのクラス(Card,Deck)が与えられていて、 # game1.hとgame1.cppのプラグラムを書け。 # このプログラムはデッキから5枚配る事を1回とし、 # その中に何回ペアまたはフラッシュ(同じ手札に同じマークが5枚揃う事)が # あるかの10000回の統計であり、以下を表示させること # # 何回の統計か # そのうち何個の手札がペアを持つか # そのうち何個の手札がフラッシュを持つか # ペアは全体の何%か # フラッシュは全体の何%か # # 無作為化する為に以下を必ず含める事 # stand(unsigned)time(NULL); # # #2,新しいクラスhand(hand.hとhand.cpp)と、これを実行させる為の # game2.hとgame2.cppを書け。 # これはカードの配布、ペア・フラッシュの確認、そしてデッキにカードを戻す為の # プログラムである。 # ペアまたはフラッシュの出現度数(_回数,_ペアの度数,_フラッシュの度数) :- findsum([M1,M2],(for(1,N,_回数),トランプの準備([A,B,C,D,E|R]),役([A,B,C,D,E],M1,M2)),[_ペアの度数,_フラッシュの度数]). 役(L,1,0) :- sort(L,L1),ペア(L1),!. 役([A|R],0,1) :- sub_atom(A,1,1,_,_種類),フラッシュ(_種類,R),!. ペア([A,B]) :- sub_atom(A,0,1,_,C),sub_atom(B,0,1,_,C),!. ペア([A,B,C|R]) :- sub_atom(A,0,1,_,E),sub_atom(B,0,1,_,E),sub_atom(C,0,1,_,E),ペア(R),!. ペア([A,B,C|R]) :- sub_atom(A,0,1,_,E),sub_atom(B,0,1,_,E),\+(sub_atom(C,0,1,_,E)),!. ペア([A|R]) :- ペア(R). フラッシュ(_,[]) :- !. フラッシュ(A,[B|R]) :- sub_atom(B,1,1,_,A),フラッシュ(A,R). トランプの準備(X) :- findall(U,(for(1,N,52),一枚のカードを作る(N,U)),_整列したカード), トランプを切るようにならびを切る(41,53,_整列したカード,X),!. 一枚のカードを作る(N,U) :- M is N mod 13, M2 is (N - 1) // 13, 数字カード・絵カード(M,U1), カードの種類(M2,U2), concat_atom([U1,U2],U),!. 数字カード・絵カード(1,'A') :- !. 数字カード・絵カード(10,'T') :- !. 数字カード・絵カード(11,'J') :- !. 数字カード・絵カード(12,'Q') :- !. 数字カード・絵カード(0,'K') :- !. 数字カード・絵カード(N,N). カードの種類(0,s) :- !. カードの種類(1,h) :- !. カードの種類(2,d) :- !. カードの種類(3,c) :- !. トランプを切るようにならびを切る(0,_要素数,L,L) :- !. トランプを切るようにならびを切る(N,_要素数,L,X) :- M1 is (random mod _要素数) + 1, M2 is (random mod _要素数) + 1, \+(M1=M2), swap_nth(M1,M2,L,L1), N2 is N - 1, トランプを切るようにならびを切る(N2,_要素数,L1,X),!. トランプを切るようにならびを切る(N,_要素数,L,X) :- トランプを切るようにならびを切る(N,_要素数,L,X),!. swap_nth(M,N,L1,L2) :- list_nth(M,L1,A), list_nth(N,L1,B), swap(A,B,L1,L2),!. swap(A,B,L,LX) :- append(L1,[A|L2],[B|L3],L), append(L1,[B|L2],[A|L3],LX),!. swap(A,B,L,LX) :- append(L1,[B|L2],[A|L3],L), append(L1,[A|L2],[B|L3],LX),!. # # しりとりゲームをするプログラム # 第一段階ーShiritori.javaを次に掲載する。 #      これをEclipseに入力する #    ー与えられた単語の可否を判定するためのクラスReferee.javaを作成する # # 第二段階ーReferee.javaをしりとりのルールにのっとった判定をさせるように改善 # # 第一段階のRefereeの使用 # ・直前に入力された単語の末尾の文字を記憶するchar型のフィールド #    lastChar # ・次の単語がどの文字で始まらなければならないかをchar型で返すメソッド # mustBeginWith() # ・引数として与えられた単語の可否を判定し、可ならtrueを返すとともにlastCharを更新し、否ならfalseを返すメソッド #    isOK(String newWord) # とりあえずは何でもかんでも「可」とするように作る 馬名しりとり :- write('最初の馬名は :'), get_line(_語1), sub_atom(_語1,0,1,_,_最初の文字), 馬名しりとり(_最初の文字,_語1,_語,[]). 馬名しりとり(_次の文字,_語,_語,_) :- \+(sub_atom(_語,0,1,_,_次の文字)), write_formatted('ゲームオーバー %t-%t はしりとりになっていません\n',[_次の文字,_語]), fail,!. 馬名しりとり(_次の文字,_語,_語,_履歴) :- member(_語,_履歴),!, write_formatted('ゲームオーバー %tは既出です\n',[_語]), fail. 馬名しりとり(_次の文字,_語,_,_) :- 五代血統書(_語), fail. 馬名しりとり(_次の文字,_語,_語,_履歴) :- sub_atom(_語,0,1,_,_次の文字), write_formatted('%t-%t\n',[_次の文字,_語]). 馬名しりとり(_,_語1,_語,_履歴) :- 馬名しりとりルール(_語1,_次の文字1), write('次の馬名は :'), get_line(_語2), 馬名しりとり(_次の文字1,_語2,_語,[_語1|_履歴]). 馬名しりとりルール(_語,_次の文字) :- sub_atom(_語,Len,1,0,ン), Len2 is Len + 1, sub_atom(_語,0,Len2,_,_語2), 馬名しりとり次の文字(_語2,_次の文字). 馬名しりとりルール(_語,_次の文字) :- sub_atom(_語,Len,1,0,ー), Len2 is Len + 1, sub_atom(_語,0,Len2,_,_語2), 馬名しりとり次の文字(_語2,_次の文字). 馬名しりとりルール(_語,_次の文字) :- sub_atom(_語,Len,1,0,_次の文字),!. % *** user: jbis / 2 *** 五代血統書(_馬名) :- jbis(_馬名,L), 五代血統表表示(L). jbis(_馬名,_血統書) :- このサイトの馬名はSJISが使われている(_馬名,_馬名sjis), 'url述語表現'(_馬名sjis,URL1), '%27を切り取る'(URL1,URL2), jbis馬名サイト検索(URL,_馬名,_血統サイトの正確なURLならび), 馬名による血統検索(_血統サイトの正確なURLならび,_血統書). jbis馬名サイト検索(URL,_馬名,_血統サイトの正確なURLならび) :- w3c(URL,X), concat_atom(X,X2), sjis2euc(X2,X3), split(X3,['\n','\r'],X4), findall(URL2,( member(A,X4), この行には検索対象の馬名が存在する(A,_馬名), 血統サイトの正確なURLを構成する(A,URL2)),_血統サイトの正確なURLならび), !. 馬名による血統検索(_血統サイトの正確なURLならび,_血統書) :- member(URL,_血統サイトの正確なURLならび), w3c(URL,X), 取れたならびすべての行をEUCに変換(X,_EUC行ならび), findall(_先祖馬名,( member(_馬名を含む行,_EUC行ならび), 血統書の中の馬名を切り取る(_馬名を含む行,_先祖馬名)), _血統書). このサイトの馬名はSJISが使われている(_馬名,_馬名sjis) :- euc2sjis(_馬名,_馬名sjis),!. '%27を切り取る'(URL1,URL2) :- replace_all(URL1,'%27','',URL2),!. 取れたならびすべての行をEUCに変換(Y,Y4) :- concat_atom(Y,Y2), sjis2euc(Y2,Y3), split(Y3,['\n','\r'],Y4),!. この行には検索対象の馬名が存在する(_行,_馬名) :- sub_atom(_行,_,_,_,'cell-br-no sort-02'), split(_行,['','(',')','>'],L), 馬名は最後の二要素のうちのどちらかにある(L,_馬名),!. 馬名は最後の二要素のうちのどちらかにある(L,_馬名) :- append(_,[_馬名],L),!. 馬名は最後の二要素のうちのどちらかにある(L,_馬名) :- append(_,[_馬名,_],L),!. 血統サイトの正確なURLを構成する(_行,URL) :- split(_行,['"'],L), append(_,[U,_],L), 血統書の中の馬名を切り取る(_行,_先祖馬名) :- 先祖馬名を含む行はmaleという文字列を含む(_行), sub_atom(_行,Start,Len,_,''), sub_atom(_行,0,Start,_,_行1), split(_行1,['\r','>','','
      '],L), last(L,_先祖馬名),!. 先祖馬名を含む行はmaleという文字列を含む(_行) :- sub_atom(_行,_,_,_,male),!. 血統クロス(_馬名,_クロスならび) :- nbis(_馬名,L), length(L1,31),Length(L2,31),append(L1,L2,L), 積集合(L1,L2,_積集合), 血統クロス(_積集合,L,_クロスならび). 血統クロス([],L1,L2,[]) :- !. 血統クロス([H|R1],L1,L2,[[_世代1,_世代2]|R2]) :- list_nth(N,L1,H), list_nth(N1,L2,H), N2 is N1 + 31, 第何世代か(N,_世代ならび1), min(_世代ならび1,_世代1), 第何世代か(N2,_世代ならび2), min(_世代ならび2,_世代2), 血統クロス(R1,L1,L2,R2). 第何世代か(N,_世代ならび) :- findall(_世代,( 五代血統表テーブル(_五代血統表テーブル), member(N,_五代血統表テーブル), list_nth(_世代,_五代血統表テーブル,N)),_世代ならび). 五代血統表表示(L) :- 五代血統表表示テーブル(L1), 五代血統表一行表示(L,L1), fail. 五代血統表表示(_). 五代血統表一行表示(_,[]) :- wr('\n'),!. 五代血統表一行表示(L,[N|R]) :- \+(N=0), list_nth(N,L,_馬名), wr('%t',[_馬名]), 五代血統表一行表示(L,R),!. 五代血統表一行表示(L,[0|R]) :- wr('%15s',[' ']), 五代血統表一行表示(L,R),!. % *** user: 五代血統表表示テーブル / 1 *** 五代血統表表示テーブル([0,0,0,0,5]). 五代血統表表示テーブル([0,0,0,4,0]). 五代血統表表示テーブル([0,0,0,0,6]). 五代血統表表示テーブル([0,0,3,0,0]). 五代血統表表示テーブル([0,0,0,0,8]). 五代血統表表示テーブル([0,0,0,7,0]). 五代血統表表示テーブル([0,0,0,0,9]). 五代血統表表示テーブル([0,2,0,0,0]). 五代血統表表示テーブル([0,0,0,0,12]). 五代血統表表示テーブル([0,0,0,11,0]). 五代血統表表示テーブル([0,0,0,0,13]). 五代血統表表示テーブル([0,0,10,0,0]). 五代血統表表示テーブル([0,0,0,0,15]). 五代血統表表示テーブル([0,0,0,14,0]). 五代血統表表示テーブル([0,0,0,0,16]). 五代血統表表示テーブル([1,0,0,0,0]). 五代血統表表示テーブル([0,0,0,0,20]). 五代血統表表示テーブル([0,0,0,19,0]). 五代血統表表示テーブル([0,0,0,0,21]). 五代血統表表示テーブル([0,0,18,0,0]). 五代血統表表示テーブル([0,0,0,0,23]). 五代血統表表示テーブル([0,0,0,22,0]). 五代血統表表示テーブル([0,0,0,0,24]). 五代血統表表示テーブル([0,17,0,0,0]). 五代血統表表示テーブル([0,0,0,0,27]). 五代血統表表示テーブル([0,0,0,26,0]). 五代血統表表示テーブル([0,0,0,0,28]). 五代血統表表示テーブル([0,0,25,0,0]). 五代血統表表示テーブル([0,0,0,0,30]). 五代血統表表示テーブル([0,0,0,29,0]). 五代血統表表示テーブル([0,0,0,0,31]). 五代血統表表示テーブル([0,0,0,0,36]). 五代血統表表示テーブル([0,0,0,35,0]). 五代血統表表示テーブル([0,0,0,0,37]). 五代血統表表示テーブル([0,0,34,0,0]). 五代血統表表示テーブル([0,0,0,0,39]). 五代血統表表示テーブル([0,0,0,38,0]). 五代血統表表示テーブル([0,0,0,0,40]). 五代血統表表示テーブル([0,33,0,0,0]). 五代血統表表示テーブル([0,0,0,0,43]). 五代血統表表示テーブル([0,0,0,42,0]). 五代血統表表示テーブル([0,0,0,0,44]). 五代血統表表示テーブル([0,0,41,0,0]). 五代血統表表示テーブル([0,0,0,0,46]). 五代血統表表示テーブル([0,0,0,45,0]). 五代血統表表示テーブル([0,0,0,0,47]). 五代血統表表示テーブル([32,0,0,0,0]). 五代血統表表示テーブル([0,0,0,0,51]). 五代血統表表示テーブル([0,0,0,50,0]). 五代血統表表示テーブル([0,0,0,0,52]). 五代血統表表示テーブル([0,0,49,0,0]). 五代血統表表示テーブル([0,0,0,0,54]). 五代血統表表示テーブル([0,0,0,53,0]). 五代血統表表示テーブル([0,0,0,0,55]). 五代血統表表示テーブル([0,48,0,0,0]). 五代血統表表示テーブル([0,0,0,0,58]). 五代血統表表示テーブル([0,0,0,57,0]). 五代血統表表示テーブル([0,0,0,0,59]). 五代血統表表示テーブル([0,0,56,0,0]). 五代血統表表示テーブル([0,0,0,0,61]). 五代血統表表示テーブル([0,0,0,60,0]). 五代血統表表示テーブル([0,0,0,0,62]). # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # 1.fgets関数を用いてpgmファイルの始めの2行(添付ファイルの場合, P2, 304, # 322)をそれぞれ、変数header, width, heightに格納するプログラム # 2.上記で記憶したheader, width, heightを別ファイルに書き出すプログラム # 1.と2.をそれぞれ作成せよ。 pgmファイルヘッダの読み取り(_pgmファイル,_マジックナンバー,_画像の幅方向サイズ,_画像の高さサイズ,画像の最大階調レベル) :- open(_pgmファイル,read,Input,[type(binary)]), pgmヘッダ(Input,_マジックナンバー,_画像の幅方向サイズ,_画像の高さサイズ,画像の最大階調レベル), close(Input),!. pgmファイルヘッダ(Input,_マジックナンバー,_画像の幅方向サイズ,_画像の高さサイズ,画像の最大階調レベル) :- マジックナンバー(Input,_マジックナンバー), 画像の幅方向サイズ(Input,_画像の幅方向サイズ), 画像の幅方向サイズ(Input,_画像の幅方向サイズ), 画像の高さサイズ(Input,_画像の高さサイズ),!. マジックナンバー(Input,_マジックナンバー) :- findall(Y,(repeat,get_byte(Input,X),('Whitespace'(X),!,fail;char_code(Y,X))),L), concat_atom(L,_マジックナンバー),!. 画像の幅方向サイズ(Input,_画像の幅方向サイズ) :- findall(X,(repeat,get_byte(Input,X),('Whitespace'(X),!,fail;true)),L), number_codes(_画像の幅方向サイズ,L),!. 画像の高さサイズ(Input,_画像の高さサイズ) :- findall(X,(repeat,get_byte(Input,X),('Whitespace'(X),!,fail;true)),L), number_codes(_画像の高さサイズ,L),!. 画像の最大階調レベル(Input,_画像の最大階調レベル) :- findall(X,(repeat,get_byte(Input,X),('Whitespace'(X),!,fail;true)),L), number_codes(_画像の最大階調レベル,L),!. 'Whitespace'(X) :- X < 48. 'Whitespace'(X) :- X > 57. # [1] 授業単元: ゼミ演習でのプログラミング # [2] 問題文(含コード&リンク): ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10566.zip # # [1] ヒストグラム # 0〜9の範囲内の整数を20個入力し、そのヒストグラムを求めて出力するプログラムを書きなさい# # '0〜9の範囲内の整数を20個入力し、そのヒストグラムを求めて出力する' :- 0〜9の範囲内の整数を20個入力し(1,_サンプルならび), ヒストグラム(_サンプルならび). ヒストグラム(_サンプルならび) :- 最初に縦棒の限界数を決めよう(_サンプルならび,_限界数), '次に度数表示を*のならびで表現して、0-9のならびを取る'(_サンプルならび,_限界数,_度数表示ならび), 転置(_度数表示ならび,_転置した度数表示ならび), ヒストグラム表示(_転置した度数表示ならび). 最初に縦棒の限界数を決めよう(_サンプルならび,_限界数) :- findmax(U,count(member(U,_サンプルならび)),_限界数). '次に度数表示を*のならびで表現して、0-9のならびを取る'(_サンプルならび,_限界数,_度数表示ならび) :- findall(_度数表示, (for(0,N,9),count(member(N,_サンプルならび),_度数), '空白が先に来るように反転した*ならびの生成'(_度数,1,_限界数,[],_度数表示)), _度数表示ならび). '空白が先に来るように反転した*ならびの生成'(_,N,_限界数,X,X) :- N > _限界数,!. '空白が先に来るように反転した*ならびの生成'(_度数,N,_限界数,Y,X) :- N > _度数, N2 is N + 1, '空白が先に来るように反転した*ならびの生成'(_度数,N2,_限界数,[' '|Y],X). '空白が先に来るように反転した*ならびの生成'(_度数,N,_限界数,Y,X) :- N =< _度数, N2 is N + 1, '空白が先に来るように反転した*ならびの生成'(_度数,N2,_限界数,['*'|Y],X). ヒストグラム表示([]) :- !. ヒストグラム表示([L|R]) :- concat_atom(L,A),write_formatted('%t\n',[A]),ヒストグラム表示(R). 0〜9の範囲内の整数を20個入力し(M,[]) :- M > 20,!. 0〜9の範囲内の整数を20個入力し(M,[N|R]) :- write_formatted('%t個目 : ',[M]), get_integer(N), N >= 0, N =< 9, M2 is M + 1, 0〜9の範囲内の整数を20個入力し(M2,R),!. 0〜9の範囲内の整数を20個入力し(M,L) :- write('0〜9の範囲内の整数を入力してください\n'), 0〜9の範囲内の整数を20個入力し(M,L). ヒストグラム(_サンプルならび) :-    for(0,N,9),    count(member(N,_サンプルならび),_度数),    length(L,_度数),    要素はすべてアスタリスクである(L),    concat_atom(L,_星表示アトム),    write_formatted('%t %t\n',[N,_星表示アトム]),    N=9. 要素はすべてアスタリスクである(L) :- all(L,'*'). # # しりとりゲームをするプログラム # 第一段階ーShiritori.javaを次に掲載する。 #      これをEclipseに入力する #    ー与えられた単語の可否を判定するためのクラスReferee.javaを作成する # # 第二段階ーReferee.javaをしりとりのルールにのっとった判定をさせるように改善 # # 第一段階のRefereeの使用 # ・直前に入力された単語の末尾の文字を記憶するchar型のフィールド #    lastChar # ・次の単語がどの文字で始まらなければならないかをchar型で返すメソッド # mustBeginWith() # ・引数として与えられた単語の可否を判定し、可ならtrueを返すとともにlastCharを更新し、否ならfalseを返すメソッド #    isOK(String newWord) # とりあえずは何でもかんでも「可」とするように作る 馬名しりとり :- write('最初の馬名は :'), get_line(_語1), sub_atom(_語1,0,1,_,_最初の文字), 馬名しりとり(_最初の文字,_語1,_語,[]). 馬名しりとり(_次の文字,_語,_語,_) :- \+(sub_atom(_語,0,1,_,_次の文字)), write_formatted('ゲームオーバー %t-%t はしりとりになっていません\n',[_次の文字,_語]), fail,!. 馬名しりとり(_次の文字,_語,_語,_履歴) :- member(_語,_履歴),!, write_formatted('ゲームオーバー %tは既出です\n',[_語]), fail. 馬名しりとり(_次の文字,_語,_,_) :- 五代血統書(_語), fail. 馬名しりとり(_次の文字,_語,_語,_履歴) :- sub_atom(_語,0,1,_,_次の文字), write_formatted('%t-%t\n',[_次の文字,_語]). 馬名しりとり(_,_語1,_語,_履歴) :- 馬名しりとりルール(_語1,_次の文字1), write('次の馬名は :'), get_line(_語2), 馬名しりとり(_次の文字1,_語2,_語,[_語1|_履歴]). 馬名しりとりルール(_語,_次の文字) :- sub_atom(_語,Len,1,0,ン), Len2 is Len + 1, sub_atom(_語,0,Len2,_,_語2), 馬名しりとり次の文字(_語2,_次の文字). 馬名しりとりルール(_語,_次の文字) :- sub_atom(_語,Len,1,0,ー), Len2 is Len + 1, sub_atom(_語,0,Len2,_,_語2), 馬名しりとり次の文字(_語2,_次の文字). 馬名しりとりルール(_語,_次の文字) :- sub_atom(_語,Len,1,0,_次の文字),!. % *** user: jbis / 2 *** 五代血統書(_馬名) :- jbis(_馬名,L), 五代血統表表示(L). jbis(_馬名,_血統書) :- このサイトの馬名はSJISが使われている(_馬名,_馬名sjis), 'url述語表現'(_馬名sjis,URL1), '%27を切り取る'(URL1,URL2), jbis馬名サイト検索(URL,_馬名,_血統サイトの正確なURLならび), 馬名による血統検索(_血統サイトの正確なURLならび,_血統書). jbis馬名サイト検索(URL,_馬名,_血統サイトの正確なURLならび) :- w3c(URL,X), concat_atom(X,X2), sjis2euc(X2,X3), split(X3,['\n','\r'],X4), findall(URL2,( member(A,X4), この行には検索対象の馬名が存在する(A,_馬名), 血統サイトの正確なURLを構成する(A,URL2)),_血統サイトの正確なURLならび), !. 馬名による血統検索(_血統サイトの正確なURLならび,_血統書) :- member(URL,_血統サイトの正確なURLならび), w3c(URL,X), 取れたならびすべての行をEUCに変換(X,_EUC行ならび), findall(_先祖馬名,( member(_馬名を含む行,_EUC行ならび), 血統書の中の馬名を切り取る(_馬名を含む行,_先祖馬名)), _血統書). このサイトの馬名はSJISが使われている(_馬名,_馬名sjis) :- euc2sjis(_馬名,_馬名sjis),!. '%27を切り取る'(URL1,URL2) :- replace_all(URL1,'%27','',URL2),!. 取れたならびすべての行をEUCに変換(Y,Y4) :- concat_atom(Y,Y2), sjis2euc(Y2,Y3), split(Y3,['\n','\r'],Y4),!. この行には検索対象の馬名が存在する(_行,_馬名) :- sub_atom(_行,_,_,_,'cell-br-no sort-02'), split(_行,['','(',')','>'],L), 馬名は最後の二要素のうちのどちらかにある(L,_馬名),!. 馬名は最後の二要素のうちのどちらかにある(L,_馬名) :- append(_,[_馬名],L),!. 馬名は最後の二要素のうちのどちらかにある(L,_馬名) :- append(_,[_馬名,_],L),!. 血統サイトの正確なURLを構成する(_行,URL) :- split(_行,['"'],L), append(_,[U,_],L), 血統書の中の馬名を切り取る(_行,_先祖馬名) :- 先祖馬名を含む行はmaleという文字列を含む(_行), sub_atom(_行,Start,Len,_,''), sub_atom(_行,0,Start,_,_行1), split(_行1,['\r','>','','
        '],L), last(L,_先祖馬名),!. 先祖馬名を含む行はmaleという文字列を含む(_行) :- sub_atom(_行,_,_,_,male),!. 血統クロス(_馬名,_クロスならび) :- jbis(_馬名,L), length(L1,31),length(L2,31),append(L1,L2,L), 積集合(L1,L2,_積集合), 血統クロス(_積集合,L1,L2,_クロスならび). 血統クロス([],L1,L2,[]) :- !. 血統クロス([H|R1],L1,L2,[[_世代1,_世代2]|R2]) :- list_nth(N,L1,H), list_nth(N1,L2,H), N2 is N1 + 31, 第何世代か(N,_世代ならび1), min(_世代ならび1,_世代1), 第何世代か(N2,_世代ならび2), min(_世代ならび2,_世代2), 血統クロス(R1,L1,L2,R2). 第何世代か(N,_世代ならび) :- findall(_世代,( 五代血統表表示テーブル(_五代血統表表示テーブル), member(N,_五代血統表表示テーブル), list_nth(_世代,_五代血統表表示テーブル,N)),_世代ならび). 五代血統表表示(L) :- 五代血統表表示テーブル(L1), 五代血統表一行表示(L,L1), fail. 五代血統表表示(_). 五代血統表一行表示(_,[]) :- wr('\n'),!. 五代血統表一行表示(L,[N|R]) :- \+(N=0), list_nth(N,L,_馬名), wr('%t',[_馬名]), 五代血統表一行表示(L,R),!. 五代血統表一行表示(L,[0|R]) :- wr('%15s',[' ']), 五代血統表一行表示(L,R),!. % *** user: 五代血統表表示テーブル / 1 *** 五代血統表表示テーブル([0,0,0,0,5]). 五代血統表表示テーブル([0,0,0,4,0]). 五代血統表表示テーブル([0,0,0,0,6]). 五代血統表表示テーブル([0,0,3,0,0]). 五代血統表表示テーブル([0,0,0,0,8]). 五代血統表表示テーブル([0,0,0,7,0]). 五代血統表表示テーブル([0,0,0,0,9]). 五代血統表表示テーブル([0,2,0,0,0]). 五代血統表表示テーブル([0,0,0,0,12]). 五代血統表表示テーブル([0,0,0,11,0]). 五代血統表表示テーブル([0,0,0,0,13]). 五代血統表表示テーブル([0,0,10,0,0]). 五代血統表表示テーブル([0,0,0,0,15]). 五代血統表表示テーブル([0,0,0,14,0]). 五代血統表表示テーブル([0,0,0,0,16]). 五代血統表表示テーブル([1,0,0,0,0]). 五代血統表表示テーブル([0,0,0,0,20]). 五代血統表表示テーブル([0,0,0,19,0]). 五代血統表表示テーブル([0,0,0,0,21]). 五代血統表表示テーブル([0,0,18,0,0]). 五代血統表表示テーブル([0,0,0,0,23]). 五代血統表表示テーブル([0,0,0,22,0]). 五代血統表表示テーブル([0,0,0,0,24]). 五代血統表表示テーブル([0,17,0,0,0]). 五代血統表表示テーブル([0,0,0,0,27]). 五代血統表表示テーブル([0,0,0,26,0]). 五代血統表表示テーブル([0,0,0,0,28]). 五代血統表表示テーブル([0,0,25,0,0]). 五代血統表表示テーブル([0,0,0,0,30]). 五代血統表表示テーブル([0,0,0,29,0]). 五代血統表表示テーブル([0,0,0,0,31]). 五代血統表表示テーブル([0,0,0,0,36]). 五代血統表表示テーブル([0,0,0,35,0]). 五代血統表表示テーブル([0,0,0,0,37]). 五代血統表表示テーブル([0,0,34,0,0]). 五代血統表表示テーブル([0,0,0,0,39]). 五代血統表表示テーブル([0,0,0,38,0]). 五代血統表表示テーブル([0,0,0,0,40]). 五代血統表表示テーブル([0,33,0,0,0]). 五代血統表表示テーブル([0,0,0,0,43]). 五代血統表表示テーブル([0,0,0,42,0]). 五代血統表表示テーブル([0,0,0,0,44]). 五代血統表表示テーブル([0,0,41,0,0]). 五代血統表表示テーブル([0,0,0,0,46]). 五代血統表表示テーブル([0,0,0,45,0]). 五代血統表表示テーブル([0,0,0,0,47]). 五代血統表表示テーブル([32,0,0,0,0]). 五代血統表表示テーブル([0,0,0,0,51]). 五代血統表表示テーブル([0,0,0,50,0]). 五代血統表表示テーブル([0,0,0,0,52]). 五代血統表表示テーブル([0,0,49,0,0]). 五代血統表表示テーブル([0,0,0,0,54]). 五代血統表表示テーブル([0,0,0,53,0]). 五代血統表表示テーブル([0,0,0,0,55]). 五代血統表表示テーブル([0,48,0,0,0]). 五代血統表表示テーブル([0,0,0,0,58]). 五代血統表表示テーブル([0,0,0,57,0]). 五代血統表表示テーブル([0,0,0,0,59]). 五代血統表表示テーブル([0,0,56,0,0]). 五代血統表表示テーブル([0,0,0,0,61]). 五代血統表表示テーブル([0,0,0,60,0]). 五代血統表表示テーブル([0,0,0,0,62]). # 【 課題 】 # ○県、市別に男女の人数をクロス集計するプログラムを作成せよ。 # # 千葉県 柏市 男 # 千葉県 松戸市 男 # 埼玉県 さいたま市 女 # 千葉県 柏市 男 # 埼玉県 越谷市 男 # 千葉県 松戸市 男 # 埼玉県 岩槻市 女 # 千葉県 柏市 女 # 埼玉県 さいたま市 女 # # [実行例](男の場合) # ,柏市,松戸市,さいたま市,越谷市,岩槻市 # 千葉県,2,2,0,0,0 # 埼玉県,0,0,0,1,0 # # [実行例](女の場合) # ,柏市,松戸市,さいたま市,越谷市,岩槻市 # 千葉県,1,0,0,0,0 # 埼玉県,0,0,2,0,1 # # 【 形態 】1. Javaアプリケーション # # 【 期限 】3/28まで # # 【 Ver  】java version "1.5.0_05" # # # CSVへの出力やファイル入出力といったことはできますが、クロス集計のアルゴリズムに苦戦しています。 # よろしくお願い致します。 # # ○県、市別に男女の人数をクロス集計する(_性別) :- findall(_県名,県・市・男女(_県,_,_),_重複を許した県名ならび), sort(_重複を許した県名ならび,_整列した重複しない県名ならび), findall(_都市名,県・市・男女(_,_都市名,_),_重複を許した都市名ならび), sort(_重複を許した県名ならび,_整列した重複しない都市名ならび), concat_atom(_整列した重複しない都市名ならび,',',_都市名行表示), write_formatted(',%t\n',[_都市名行表示]), member(_県名,_整列した重複しない県名ならび), findall(_人数,( member(_都市名,_整列した重複しない都市名), count(_県名,_都市名,_性別),_人数)), _人数ならび), concat_atom([_県名|_人数ならび],_行表示), write_formatted('%t\n',[_行表示]), fail. ○県、市別に男女の人数をクロス集計する(_性別). マジックナンバー(Input,_マジックナンバー) :- findall(Y,(repeat,get_byte(Input,X),('Whitespace'(X),!,fail;char_code(Y,X))),L), concat_atom(L,_マジックナンバー),!. 画像の幅方向サイズ(Input,_画像の幅方向サイズ) :- repeat, get_byte(C), \+('Whitespace'(C)), findall(X,(repeat,get_byte(Input,X),('Whitespace'(X),!,fail;true)),L), number_codes(_画像の幅方向サイズ,[C|L]),!.