このディレクトリの索引

% 以下のサイトは # 出典 :: #717 # [1] 授業単元: C演習 # [2] 問題文(含コード&リンク): # (問題文)http://imgur.com/bAeG1 # (途中まで書いたコード)://codepad.org/nwwt2hgU # (使用するテキストファイル、結果含む) # http://s2.muryo-de.mydns.jp/~c_cpp_homework/cgi-bin/joyful/joyful.cgi? のNo.396 # :- dynamic(転置索引/2). テキストのダウンロード(_サイトのファイル名,_出力ファイル名) :- atomic_list_concat(['w3m -dump ',_サイトのファイル名],S), popen(S,Chars), open(_出力ファイル名,write,Outstream), ファイルに書き込む(Outstream,Chars), close(Outstream). ファイルに書き込む(Outstream,[]). ファイルに書き込む(Outstream,[C|R]) :- put_char(Outstream,C), ファイルに書き込む(Outstream,R). 転置索引を作る(_ファイル名) :- open(_ファイル名,read,Instream), ストリームから転置索引を作る(Instream,0), close(Instream). ストリームから転置索引を作る(Instream,_) :- at_end_of_stream(Instream),!. ストリームから転置索引を作る(Instream,N) :- get_line(Instream,Line), N_2 is N + 1, 語彙を転置索引に登録する(Line,N), ストリームから転置索引を作る(Instream,N_2). 語彙を転置索引に登録する(Line,N) :- split(Line,[' ',',','.',':','(',')'],L), member(_語彙,L), \+(転置索引(_語彙,N)), assertz(転置索引(_語彙,N)), fail. 語彙を転置索引に登録する(_,_). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). shs(Command,X) :- popen(Command,L), shs_3(L,X). shs_3(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_3(R1,R). shs_3([],[]) :- !. shs_3(L,[S]) :- atom_chars(S,L). 項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,_区切られた文字列ならび),!. 項目区切り(_文字列,_,[_文字列]). 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,[_前文字列|R]) :- '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 項目区切り(_後文字列,_区切り文字列ならび,R). 区切り文字残し項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 先頭から区切り文字列で区切り文字残しに区切って行く(_文字列,_区切り文字列ならび,_区切られた文字列ならび),!. 区切り文字残し項目区切り(_文字列,_,[_文字列]). 先頭から区切り文字列で区切り文字残しに区切って行く(_文字列,_区切り文字列ならび,[_前文字列,_区切り文字列|R]) :- '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 区切り文字残し項目区切り(_後文字列,_区切り文字列ならび,R). '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字列ならび). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 文字列ならびの中で数値に変換可能なものは変換する(_文字列ならび,_項目ならび) :- findall(_項目,( 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目)),_項目ならび). 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目) :- member(_文字列,_文字列ならび), 数値に変換可能なものは変換する(_文字列,_項目). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 160代目 #603 # [1]C/C++プログラミング実習  # [2]問題 http://ime.nu/codepad.org/IbHwR87p # [3]visual studio 2010 # [4]11月12日 10時 # [5]ファイルを読み取って書き換えてtxtファイルに出力するというものですが #   私には難しすぎてわかません。どなたか助けてくれれば幸いです。 # # /* # あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。 # # 例 # caltech10/accordion-0001.jpg 1 0 2 0 1 0... # caltech10/accordion-0002.jpg 1 2 7 0 0 3... # caltech10/accordion-0003.jpg 0 0 2 199 0 3... # caltech10/accordion-0004.jpg 0 0 0 0 5 1... # ・ # ・ # このtxtファイルを読み取って # ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換え # txtファイルに出力するプログラムを作れ。 # # 実行例 # 1:1 3:2 5:1… # 1:1 2:2 3:7 6:3… # 3:2 4:199 6:3.... # 5:5 … # # 必ず 番号:数値?番号:数値?番号:数値?… # という形にすること # # */ # 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。 このtxtファイルを読み取って ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換え txtファイルに出力する' :- 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。このtxtファイルを読み取ってファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する'. 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。このtxtファイルを読み取ってファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する' :- get_split_lines('あるファイル.txt',[' '],LL), 'ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する'(LL). 'ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する'(LL) :- open('書き換え.txt',write,_出力), ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し出力する(_出力,LL), close(_出力). ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し出力する(_出力,[]) :- !. ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し出力する(_出力,[[_|L]|R) :- 左から順に番号を振った上で要素が0のものを削除し出力する(_出力,L), ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し出力する(_出力,R). 左から順に番号を振った上で要素が0のものを削除し出力する(_出力,L) :- 要素が0のものを削除し全要素出力する(_出力,L), 改行する(_出力). 要素が0のものを削除し全要素出力する(_出力,L) :- forall(nth1(_nth1,L,N),要素が0のものを削除し出力する(_出力,_nth,N)). 改行する(_出力) :- write('\n'). 要素が0のものを削除し出力する(_出力,_,0) :- !. 要素が0のものを削除し出力する(_出力,_nth1,N) :- 出力する(_出力,_nth1,N). 出力する(_出力,_nth1,N) :- swritef(A,'%w:%w ',[_nth1,N]), write(_出力,A). get_split_lines(_ファイル,_区切り文字列ならび,_項目区切り行ならび) :- ファイルの各行を項目区切りしてならびとする(_ファイル,_区切り文字列ならび,_項目区切り行ならび). ファイルの各行を項目区切りしてならびとする(_ファイル,_区切り文字列ならび,_項目区切り行ならび) :- open(_ファイル,read,_入力), '_入力の各行を項目区切りしてならびとする'(_入力,_区切り文字列ならび,_項目区切り行ならび). '_入力の各行を項目区切りしてならびとする'(_入力,_区切り文字列ならび,_項目区切り行ならび) :- findall(_項目区切り行,( at_end_of_streamになるまで得られる行を項目区切りする(_入力,_区切り文字列ならび,_項目区切り行)),_項目区切り行ならび). at_end_of_streamになるまで得られる行を項目区切りする(_入力,_区切り文字列ならび,_項目区切り行) :- at_end_of_streamになるまで行入力(_入力,_行), 数値変換項目区切り(_行,_区切り文字列ならび,_項目区切り行). at_end_of_streamになるまで行入力(_入力,_行) :- at_end_of_stream(_入力),!,close(_入力),fail. at_end_of_streamになるまで行入力(_入力,_行) :- 一行ずつ入力を続ける(_入力,_行). 一行ずつ入力を続ける(_入力,_行) :- 行入力(_入力,_行). 一行ずつ入力を続ける(_入力,_行) :- at_end_of_streamになるまで行入力(_入力,_行). 行入力(_入力,_行) :- read_line_to_codes(_入力,_文字コードならび), atom_codes(_行,_文字コードならび). 数値変換項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 数値変換項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび). 数値変換項目区切り('',_,[],[]) :- !. 数値変換項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび) :- '先頭から区切り文字列で区切って行く(可能なものは数値に変換する)'(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび),!. 数値変換項目区切り(_文字列,_,[],[_文字列_1]) :- 数値に変換可能なものは変換する(_文字列,_文字列_1). '先頭から区切り文字列で区切って行く(可能なものは数値に変換する)'(_文字列,_区切り文字列ならび,[_区切り文字列|R1],[_前文字列_1|R2]) :- '区切り文字列で前文字列、後文字列に区切る(前文字列は空文字ではない)'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 数値に変換可能なものは変換する(_前文字列,_前文字列_1), 数値変換項目区切り(_後文字列,_区切り文字列ならび,R1,R2). '区切り文字列で前文字列、後文字列に区切る(前文字列は空文字ではない)'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- member(_区切り文字列,_区切り文字列ならび), 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), 前文字列は空文字ではない(_前文字列). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). 前文字列は空文字ではない(_前文字列) :- _前文字列 \== ''. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 160代目 #603 # [1]C/C++プログラミング実習  # [2]問題 http://ime.nu/codepad.org/IbHwR87p # [3]visual studio 2010 # [4]11月12日 10時 # [5]ファイルを読み取って書き換えてtxtファイルに出力するというものですが #   私には難しすぎてわかません。どなたか助けてくれれば幸いです。 # # /* # あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。 # # 例 # caltech10/accordion-0001.jpg 1 0 2 0 1 0... # caltech10/accordion-0002.jpg 1 2 7 0 0 3... # caltech10/accordion-0003.jpg 0 0 2 199 0 3... # caltech10/accordion-0004.jpg 0 0 0 0 5 1... # ・ # ・ # このtxtファイルを読み取って # ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換え # txtファイルに出力するプログラムを作れ。 # # 実行例 # 1:1 3:2 5:1… # 1:1 2:2 3:7 6:3… # 3:2 4:199 6:3.... # 5:5 … # # 必ず 番号:数値?番号:数値?番号:数値?… # という形にすること # # */ # 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。 このtxtファイルを読み取って ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換え txtファイルに出力する' :- 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。このtxtファイルを読み取ってファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する'. 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。このtxtファイルを読み取ってファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する' :- get_split_lines('あるファイル.txt',[' '],LL), open('書き換え.txt',write,_出力), ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し表示する(_出力,LL), close(_出力). ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し表示する(_出力,LL) :- ファイル名を削除し左から順に番号を振った上で(LL,Nth,N,_残り行要素,_残り項目要素), 要素が0のものを削除し表示する(_出力,Nth,N), '_残り行要素が[]になったら終了する。_残り項目要素が[]の時は改行を入れる'(_出力). '_残り行要素が[]になったら終了する。_残り項目要素が[]の時は改行を入れる'(_出力,_残り行要素,_残り項目要素) :- _残り項目要素 = [], write(_出力,'\n'), _残り行要素 = []. ファイル名を削除し左から順に番号を振った上で(LL,Nth,N,_残り行要素,_残り項目要素) :- append(_,[[_|L]|_残り行要素],LL), append(L0,[N|_残り項目要素],L), length([_|L0],Nth). 要素が0のものを削除し表示する(_出力,Nth,0) :- !. 要素が0のものを削除し表示する(_出力,Nth,A) :- writef(_出力,'%t:%t ',[Nth,A]). get_split_lines(_ファイル,_区切り文字列ならび,_項目区切り行ならび) :- ファイルの各行を項目区切りしてならびとする(_ファイル,_区切り文字列ならび,_項目区切り行ならび). ファイルの各行を項目区切りしてならびとする(_ファイル,_区切り文字列ならび,_項目区切り行ならび) :- open(_ファイル,read,_入力), '_入力の各行を項目区切りしてならびとする'(_入力,_区切り文字列ならび,_項目区切り行ならび). '_入力の各行を項目区切りしてならびとする'(_入力,_区切り文字列ならび,_項目区切り行ならび) :- findall(_項目区切り行,( at_end_of_streamになるまで得られる行を項目区切りする(_入力,_区切り文字列ならび,_項目区切り行)),_項目区切り行ならび). at_end_of_streamになるまで得られる行を項目区切りする(_入力,_区切り文字列ならび,_項目区切り行) :- at_end_of_streamになるまで行入力(_入力,_行), 数値変換項目区切り(_行,_区切り文字列ならび,_項目区切り行). at_end_of_streamになるまで行入力(_入力,_行) :- at_end_of_stream(_入力),!,close(_入力),fail. at_end_of_streamになるまで行入力(_入力,_行) :- 一行ずつ入力を続ける(_入力,_行). 一行ずつ入力を続ける(_入力,_行) :- 行入力(_入力,_行). 一行ずつ入力を続ける(_入力,_行) :- at_end_of_streamになるまで行入力(_入力,_行). 行入力(_入力,_行) :- read_line_to_codes(_入力,_文字コードならび), atom_codes(_行,_文字コードならび). 数値変換項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 数値変換項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび). 数値変換項目区切り('',_,[],[]) :- !. 数値変換項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび) :- '先頭から区切り文字列で区切って行く(可能なものは数値に変換する)'(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび),!. 数値変換項目区切り(_文字列,_,[],[_文字列_1]) :- 数値に変換可能なものは変換する(_文字列,_文字列_1). '先頭から区切り文字列で区切って行く(可能なものは数値に変換する)'(_文字列,_区切り文字列ならび,[_区切り文字列|R1],[_前文字列_1|R2]) :- '区切り文字列で前文字列、後文字列に区切る(前文字列は空文字ではない)'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 数値に変換可能なものは変換する(_前文字列,_前文字列_1), 数値変換項目区切り(_後文字列,_区切り文字列ならび,R1,R2). '区切り文字列で前文字列、後文字列に区切る(前文字列は空文字ではない)'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- member(_区切り文字列,_区切り文字列ならび), 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), 前文字列は空文字ではない(_前文字列). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). 前文字列は空文字ではない(_前文字列) :- _前文字列 \== ''. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 160代目 #603 # [1]C/C++プログラミング実習  # [2]問題 http://ime.nu/codepad.org/IbHwR87p # [3]visual studio 2010 # [4]11月12日 10時 # [5]ファイルを読み取って書き換えてtxtファイルに出力するというものですが #   私には難しすぎてわかません。どなたか助けてくれれば幸いです。 # # /* # あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。 # # 例 # caltech10/accordion-0001.jpg 1 0 2 0 1 0... # caltech10/accordion-0002.jpg 1 2 7 0 0 3... # caltech10/accordion-0003.jpg 0 0 2 199 0 3... # caltech10/accordion-0004.jpg 0 0 0 0 5 1... # ・ # ・ # このtxtファイルを読み取って # ファイル名を削除し右から順に番号を振った上で要素が0のものを削除し書き換え # txtファイルに出力するプログラムを作れ。 # # 実行例 # 1:1 3:2 5:1… # 1:1 2:2 3:7 6:3… # 3:2 4:199 6:3.... # 5:5 … # # 必ず 番号:数値?番号:数値?番号:数値?… # という形にすること # # */ # 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。 このtxtファイルを読み取って ファイル名を削除し右から順に番号を振った上で要素が0のものを削除し書き換え txtファイルに出力する' :- 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。このtxtファイルを読み取ってファイル名を削除し右から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する'. 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。このtxtファイルを読み取ってファイル名を削除し右から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する' :- get_split_lines('あるファイル.txt',[' '],LL), ファイル名を削除し(LL,LL1), 右から順に番号を振った上で(LL1,LL2), 要素が0のものを削除し書き換え(LL2,LL3), 書き換えtxtファイルに出力する(LL3). ファイル名を削除し([],[]). ファイル名を削除し([[_|L1]|R1],[L1|R2]) :- ファイル名を削除し(R1,R2). 右から順に番号を振った上で([],[]). 右から順に番号を振った上で([L1|R1],[L2|R2]) :- findall(N-A,( append(_,[A|R],L1), length([_|R],N)),L2), 右から順に番号を振った上で(R1,R2). 要素が0のものを削除し書き換え([],[]). 要素が0のものを削除し書き換え([N-0|R1],R2) :- 要素が0のものを削除し書き換え(R1,R2). 要素が0のものを削除し書き換え([N:A|R1],[N-A|R2]) :- \+(A = 0), 要素が0のものを削除し書き換え(R1,R2). 書き換えtxtファイルに出力する(LL3) :- open('書き換え.txt',write,Outstream), append(_,[L|R],LL3), 行要素を出力する(Ountstream,L), R = [], close(Outstream). 行要素を出力する(Outstream,[]) :- writef(Outstream,'\n'). 行要素を出力する(Outstream,[N:A|R]) :- writef(Outstream,'%t:%t ',[N,A]), 行要素を出力する(Outstream,R). get_split_lines(_ファイル,_区切り文字列ならび,_項目区切り行ならび) :- ファイルの各行を項目区切りしてならびとする(_ファイル,_区切り文字列ならび,_項目区切り行ならび). ファイルの各行を項目区切りしてならびとする(_ファイル,_区切り文字列ならび,_項目区切り行ならび) :- open(_ファイル,read,_入力), '_入力の各行を項目区切りしてならびとする'(_入力,_区切り文字列ならび,_項目区切り行ならび). '_入力の各行を項目区切りしてならびとする'(_入力,_区切り文字列ならび,_項目区切り行ならび) :- findall(_項目区切り行,( at_end_of_streamになるまで得られる行を項目区切りする(_入力,_区切り文字列ならび,_項目区切り行)),_項目区切り行ならび). at_end_of_streamになるまで得られる行を項目区切りする(_入力,_区切り文字列ならび,_項目区切り行) :- at_end_of_streamになるまで行入力(_入力,_行), 数値変換項目区切り(_行,_区切り文字列ならび,_項目区切り行). at_end_of_streamになるまで行入力(_入力,_行) :- at_end_of_stream(_入力),!,close(_入力),fail. at_end_of_streamになるまで行入力(_入力,_行) :- 一行ずつ入力を続ける(_入力,_行). 一行ずつ入力を続ける(_入力,_行) :- 行入力(_入力,_行). 一行ずつ入力を続ける(_入力,_行) :- at_end_of_streamになるまで行入力(_入力,_行). 行入力(_入力,_行) :- read_line_to_codes(_入力,_文字コードならび), atom_codes(_行,_文字コードならび). 数値変換項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 数値変換項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび). 数値変換項目区切り('',_,[],[]) :- !. 数値変換項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび) :- '先頭から区切り文字列で区切って行く(可能なものは数値に変換する)'(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび),!. 数値変換項目区切り(_文字列,_,[],[_文字列_1]) :- 数値に変換可能なものは変換する(_文字列,_文字列_1). '先頭から区切り文字列で区切って行く(可能なものは数値に変換する)'(_文字列,_区切り文字列ならび,[_区切り文字列|R1],[_前文字列_1|R2]) :- '区切り文字列で前文字列、後文字列に区切る(前文字列は空文字ではない)'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 数値に変換可能なものは変換する(_前文字列,_前文字列_1), 数値変換項目区切り(_後文字列,_区切り文字列ならび,R1,R2). '区切り文字列で前文字列、後文字列に区切る(前文字列は空文字ではない)'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- member(_区切り文字列,_区切り文字列ならび), 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), 前文字列は空文字ではない(_前文字列). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). 前文字列は空文字ではない(_前文字列) :- _前文字列 \== ''. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #978 # [1] 授業単元:C言語演習 # [2] 問題文: # ../test/read.cgi/tech/1339338438/976のプログラムを修正して、メッセージ転送時間の平均値を計算するaverage関数を追加し、main関数側で平均メッセージ転送時間も出力するようにせよ。 # '実験データは、あるコンピュータAのメッセージ発生時刻と、そのメッセージが宛先コンピュータBに到着した時刻である。メッセージの転送時間の平均値を出力する'(_実験データファイル) :- 実験データは(_実験データファイル,_実験データ行ならび), 'あるコンピュータAのメッセージ発生時刻と、そのメッセージが宛先コンピュータBに到着した時刻である。メッセージ毎の転送時間を出力する'(_実験データ行ならび). 実験データは(_実験データファイル,_実験データ行ならび) :- open(_実験データファイル,read,_入力), 実験データを読み取る(_入力,_実験データ行ならび), close(_入力). 実験データを読み取る(_入力,[]) :- at_end_of_stream(_入力),!. 実験データを読み取る(_入力,_実験データ行ならび) :- 実験データを読み取って行く(_入力,_実験データ行ならび). 実験データを読み取って行く(_入力,[_実験データ行|_実験データ行ならび]) :- 行入力(_入力,_実験データ行), 実験データを読み取る(_入力,_実験データ行ならび). 行入力(_入力,_行) :- read_line_to_codes(_入力,_文字コードならび), atom_codes(_行,_文字コードならび). 'あるコンピュータAのメッセージ発生時刻と、そのメッセージが宛先コンピュータBに到着した時刻である。メッセージ毎の転送時間を出力する'(_実験データ行ならび) :- 'あるコンピュータAのメッセージ発生時刻と、そのメッセージが宛先コンピュータBに到着した時刻である。メッセージの転送時間の平均値を'(_実験データ行ならび,_転送時間の平均値), 出力する(_転送時間の平均値). 'あるコンピュータAのメッセージ発生時刻と、そのメッセージが宛先コンピュータBに到着した時刻である。メッセージの転送時間の平均値を'(_実験データ行ならび,_転送時間の平均値) :- findavg(_メッセージの転送時間,( 'あるコンピュータAのメッセージ発生時刻と、そのメッセージが宛先コンピュータBに到着した時刻である。'(_実験データ行ならび,_メッセージの転送時間)),_転送時間の平均値). findavg(A,_副目標,_平均値) :- '_副目標の解を集めた時の_解の数と_合計'(A,_副目標,_解の数,_合計), _平均値 is _合計 / _解の数. '_副目標の解を集めた時の_解の数と_合計'(A,_副目標,_解の数,_合計) :- '_副目標の解を集めた時の'(A,_副目標,L), '_解の数と合計'(L,_解の数,_合計). '_副目標の解を集めた時の'(A,_副目標,L) :- findall(A,_副目標,L). '_解の数と合計'(L,_解の数,_合計) :- length(L,_解の数), sum_list(L,_合計). 'あるコンピュータAのメッセージ発生時刻と、そのメッセージが宛先コンピュータBに到着した時刻である。'(_実験データ行ならび,_メッセージの転送時間) :- member(_行文字列,_実験データ行ならび), メッセージ毎の転送時間(_行文字列,_メッセージの転送時間). メッセージ毎の転送時間(_行文字列,_メッセージの転送時間) :- 数値変換項目区切り(_行文字列,[' '],[_メッセージ番号,_メッセージの発生時刻,_メッセージの到達時刻]), _メッセージの転送時間 is _メッセージの到達時刻 - _メッセージの発生時刻. 出力する(_転送時間の平均値) :- writef('転送時間の平均値は %t 秒です\n',[_転送時間の平均値]). 数値変換項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 数値変換項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび). 数値変換項目区切り('',_,[],[]) :- !. 数値変換項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび) :- '先頭から区切り文字列で区切って行く(可能なものは数値に変換する)'(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび),!. 数値変換項目区切り(_文字列,_,[],[_文字列_1]) :- 数値に変換可能なものは変換する(_文字列,_文字列_1). '先頭から区切り文字列で区切って行く(可能なものは数値に変換する)'(_文字列,_区切り文字列ならび,[_区切り文字列|R1],[_前文字列_1|R2]) :- '区切り文字列で前文字列、後文字列に区切る(前文字列は空文字ではない)'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 数値に変換可能なものは変換する(_前文字列,_前文字列_1), 数値変換項目区切り(_後文字列,_区切り文字列ならび,R1,R2). '区切り文字列で前文字列、後文字列に区切る(前文字列は空文字ではない)'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- member(_区切り文字列,_区切り文字列ならび), 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), 前文字列は空文字ではない(_前文字列). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). 前文字列は空文字ではない(_前文字列) :- _前文字列 \== ''. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 151代目 #36 # [1] 授業単元:構造体の配列利用 # [2] 問題文(含コード&リンク): # #include <stdio.h> # /* 配列arrayの要素数 */ # #define ELENUM(array) (sizeof(array) / sizeof((array)[0])) # #define SIZE_DATA (10) /* データ数 */ # # struct Address_data{ # char name[81]; # char phone[20]; # int age; # }; # # int main(void) # { # struct Address_data data[SIZE_DATA], *p = data; # printf("Input end = Ctrl + D\n"); # /* 配列初期化(入力プロンプトより前に置くべき?) */ # for (p = data; p - data < ELENUM(data); p++) { # p->age = -1; # } # /* 入力処理 */ # for (p = data; p - data < ELENUM(data); p++) { # printf("[%d]name phone age = ", p - data); # if (scanf("%s %s %d", p->name, p->phone, &p->age) != 3) { # break; # } # } # putchar('\n'); # /* 表示 */ # for (p = data; p->age >= 0; p++) { # printf("%s\t(%d)\t[%s]\n", p->name, p->age, p->phone); # } # return 0; # } # 表示を行う際に、年齢順に表示するようにしたい。 # 配列の並び替えを行なって表示するようにプログラムを拡張しなさい # データ数(10). 入力処理(L) :- データ数(_データ数), length(L,_データ数), findall([_名前,_年齢,_電話番号],( append(_,[_|_],L), '名前・年齢・電話番号の入力'(_名前,_年齢,_電話番号)),L). '名前・年齢・電話番号の入力'(_名前,_年齢,_電話番号) :- 催促後に行入力('名前・年齢・電話番号をカンマ区切りで入力してください ',_行), 項目区切り_行,[',',' '],[_名前,_年齢,_電話番号]). 催促後に行入力(_催促,_行) :- write(_催促), 行入力(_行). 行入力(_行) :- read_line_to_codes(current_input,_文字コードならび), atom_codes(_行,_文字コードならび). 年齢順にデータを表示(LL) :- 年齢をキーとする(LL,LL2), sort(LL2,LL3), キーを外す(LL3,LL4), データを表示(LL4). 年齢をキーとする(LL1,LL2) :- findall([_年齢|L], member([_名前,_年齢,_電話番号],LL1),_先頭に年齢付加されたLL). 年齢キーを外す(LL1,LL2) :- findall(L,member([_|L],LL1),LL2). データを表示(L) :- forall(member([_名前,_年齢,_電話番号],LL), writef('%w,%w,%w\n',[_名前,_年齢,_電話番号])). sort([],[]) :- !. sort([A|R1],L) :- partition(A,R1,L1,L2), sort(L1,L11), sort(L2,L22), append(L11,[A|L22],L). partition(_,[],[],[]) :- !. partition(A,[B|R1],[B|R2],R3) :- B @< A, partition(A,R1,R2,R3),!. partition(A,[B|R1],R2,[B|R3]) :- B @>= A, partition(A,R1,R2,R3),!. 項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび_1), 文字列ならびの中で数値に変換可能なものは変換する(_区切られた文字列ならび_1,_区切られた文字列ならび). 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび) :- 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび),!. 項目区切り(_文字列,_,[],[_文字列]). 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,[_区切り文字列|R1],[_前文字列|R2]) :- '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 項目区切り(_後文字列,_区切り文字列ならび,R1,R2). '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字列ならび). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 文字列ならびの中で数値に変換可能なものは変換する(_文字列ならび,_項目ならび) :- findall(_項目,( 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目)),_項目ならび). 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目) :- member(_文字列,_文字列ならび), 数値に変換可能なものは変換する(_文字列,_項目). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). % 以下のサイトは # 出典 :: 正規表現 Part8 #31 # 正規表現でとあるスレの、特定のURLを含まないレスをあぼーんにしたいと考えています # 特定のURLは"mt=8"と"hibari"が含まれたURLです # [^(mt=8)(hibari)] # と試しましたが駄目でした。どのようにすればよいのでしょうか? # # '正規表現でとあるスレの、特定のURLの要素を含まないレスをあぼーんにしたい'(_レス) :- 'URLを切り出す'(_レス,_前文字列,URL,_後文字列), アボーンしたい(URL),!. 'URLを切り出す'(_レス,_前文字列,URL,_後文字列) :- atom_concat(_前文字列,_残り文字列,_レス), atom_concat(URL,_後文字列,_残り文字列). アボーンしたい(URL) :- プロトコルを除いたURL(URL,_プロトコルを除いたURL), 特定のURLの要素を含まない(_プロトコルを除いたURL). 特定のURLの要素を含まない(_プロトコルを除いたURL) :- \+(特定のURLの要素を含む(_プロトコルを除いたURL)). プロトコルを除いたURL(URL,_プロトコルを除いたURL) :- 副文字列(URL,_,_プロトコル,_プロトコルを除いたURL), member(_プロトコル,['http','HTTP','ftp','FTP','mailto']). 特定のURLの要素を含む(_プロトコルを除いたURL) :- 項目区切り(_プロトコルを除いたURL,[' ','&','?','/','://','/'],_要素ならび), 特定のURLの要素は要素ならびに必ず含まれる(_要素ならび). 特定のURLの要素は要素ならびに必ず含まれる(_要素ならび) :- forall(特定のURLの要素(_特定のURLの要素),member(_特定のURLの要素,_要素ならび)). 特定のURLの要素('mt=8'). 特定のURLの要素(hanabi). 項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび). 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび) :- 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび),!. 項目区切り(_文字列,_,[],[_文字列]). 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,[_区切り文字列|R1],[_前文字列|R2]) :- '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 項目区切り(_後文字列,_区切り文字列ならび,R1,R2). '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字列ならび). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 文字列ならびの中で数値に変換可能なものは変換する(_文字列ならび,_項目ならび) :- findall(_項目,( 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目)),_項目ならび). 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目) :- member(_文字列,_文字列ならび), 数値に変換可能なものは変換する(_文字列,_項目). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). % 以下のサイトは # 出典 :: ★★ Java の宿題ここで答えます Part 69 ★★ #721 # 【課題】Studentというクラスを宣言するプログラムを作成せよ。インスタンス変数には、氏名、生年月日、学籍番号を記録せよ。 # ただし、学籍番号は入学年度を表す二桁の整数、学部を表す一桁の整数、残り四桁の整数を組み合わせた七桁の整数で表現されるものとする。 # インスタンスメソッドとしては、以下のものは必須とする。 # 名字を返すメソッド、名前を返すメソッド、誕生年を和暦で返すメソッド、誕生年を西暦で返すメソッド、入学年度を返すメソッド # 【形態】1. Javaアプリケーション # 【期限】1月11日 # 【ver】linux # 【補足】あまり難しくしないでください。 # データベース構造(学生,1,氏名). データベース構造(学生,2,誕生日). データベース構造(学生,3,学籍番号). 名字を返す(_学籍番号,_名字) :- 学生(_氏名,_誕生日,_学籍番号), 数値変換項目区切り(_氏名,[' ',',','-','_'],[_名字,_]). 名前を返す(_学籍番号,_名前) :- 学生(_氏名,_誕生日,_学籍番号), 数値変換項目区切り(_氏名,[' ',',','-','_'],[_,_名前]). 誕生年を和暦で返す(_学籍番号,_誕生年の和暦) :- 誕生年を西暦で返す(_学籍番号,_誕生年の西暦), 和暦西暦変換(_誕生年の和暦,_誕生年の西暦). 誕生年を西暦で返す(_学籍番号,_誕生年の西暦) :- 学生(_氏名,_誕生日の西暦,_学籍番号), _誕生年の西暦 is _誕生日の西暦 // 10000. 入学年度を返す(_学籍番号,_入学年度) :- _入学年度 is _学籍番号 // 10000. すべてが数字(_文字ならび) :- forall(member(_文字,_文字ならび),数字(_文字)). 数字('0'). 数字('1'). 数字('2'). 数字('3'). 数字('4'). 数字('5'). 数字('6'). 数字('6'). 数字('8'). 数字('9'). 数値変換項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 数値変換項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび). 数値変換項目区切り('',_,[],[]) :- !. 数値変換項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび) :- '先頭から区切り文字列で区切って行く(可能なものは数値に変換する)'(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび),!. 数値変換項目区切り(_文字列,_,[],[_文字列_1]) :- 数値に変換可能なものは変換する(_文字列,_文字列_1). '先頭から区切り文字列で区切って行く(可能なものは数値に変換する)'(_文字列,_区切り文字列ならび,[_区切り文字列|R1],[_前文字列_1|R2]) :- '区切り文字列で前文字列、後文字列に区切る(前文字列は空文字ではない)'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 数値に変換可能なものは変換する(_前文字列,_前文字列_1), 数値変換項目区切り(_後文字列,_区切り文字列ならび,R1,R2). '区切り文字列で前文字列、後文字列に区切る(前文字列は空文字ではない)'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- member(_区切り文字列,_区切り文字列ならび), 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), 前文字列は空文字ではない(_前文字列). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). 前文字列は空文字ではない(_前文字列) :- _前文字列 \== ''. 和暦西暦変換(_和暦,_西暦) :- 西暦が整数の時は西暦から和暦を得る(_和暦,_西暦). 和暦西暦変換(_和暦,_西暦) :- 和暦が文字列の時は和暦から西暦を得る(_西暦,_和暦). 西暦が整数の時は西暦から和暦を得る(_西暦,_和暦) :- 西暦が整数の時は(_西暦), 西暦から和暦を得る(_西暦,_和暦). 西暦が整数の時は(_西暦) :- integer(_西暦). 西暦から和暦を得る(_和暦,_西暦) :- 西暦から年間と年を得る(_西暦,_年間,_年), 和暦年文字列(_年間,_年,_和暦). 西暦から年間と年を得る(_西暦,_年間,_年) :- 年間(_年間,_元年,_最終年), between(_元年,_最終年,_西暦), _年 is _西暦 - _元年 + 1. 和暦が文字列の時は和暦から西暦を得る(_和暦,_西暦) :- 和暦が文字列の時は(_和暦), 和暦の年と元年の西暦を抽出(_和暦,_年間,_年,_元年), _西暦 is _元年 + _年 - 1. 和暦が文字列の時は(_和暦) :- atom(_和暦). 和暦の年と元年の西暦を抽出(_和暦,_年間,_年,_元年) :- sub_atom(_和暦,_,_,_,_年間,S2,年,L1,L2,L3), 年間(_年間,_元年,_最終年), 漢数字アラビア数字対応(L2,_年). 和暦年文字列(_年間,_年,_和暦年) :- _年 =< 10, nth1(_年,[元,二,三,四,五,六,七,八,九,十],A), concat_atom([_年間,A,年],_和暦年),!. 和暦年文字列(_年間,_年,_和暦年) :- _年 >= 11, Div is _年 // 10, Mod is (_年 mod 10) + 1, nth1(Div,['',二,三,四,五,六,七,八,九],A), nth1(Mod,['',一,二,三,四,五,六,七,八,九],B), concat_atom([_年間,A,十,B,年],_和暦年),!. 漢数字アラビア数字対応('',0). 漢数字アラビア数字対応(元,1). 漢数字アラビア数字対応(一,1). 漢数字アラビア数字対応(二,2). 漢数字アラビア数字対応(三,3). 漢数字アラビア数字対応(四,4). 漢数字アラビア数字対応(五,5). 漢数字アラビア数字対応(六,6). 漢数字アラビア数字対応(七,7). 漢数字アラビア数字対応(八,8). 漢数字アラビア数字対応(九,9). 漢数字アラビア数字対応([A,十,B],N) :- 漢数字アラビア数字対応(A,N1), 漢数字アラビア数字対応(B,N2), N is N1 * 10 + N2,!. 漢数字アラビア数字対応([A,十],N) :- 漢数字アラビア数字対応(A,N1), N is N1 * 10,!. 漢数字アラビア数字対応([十,B],N) :- 漢数字アラビア数字対応(B,N2), N is 10 + N2,!. 漢数字アラビア数字対応([十],10) :- !. 漢数字アラビア数字対応([A],N) :- 漢数字アラビア数字対応(A,N). 年間(安政,1854,1860). 年間(万延,1860,1861). 年間(文久,1861,1864). 年間(元治,1864,1865). 年間(慶応,1865,1868). 年間(明治,1868,1912). 年間(大正,1912,1926). 年間(昭和,1926,1989). 年間(平成,1989,2017). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 144代目 #937 # 【質問テンプレ】 # [1] 授業単元:画像処理学 # [2] 問題文(含コード&リンク): #   指定されたエクセルのCSVファイルの中にあるデータを読み込み #   それぞれのデータの各列に列の番号の値を加えて #   別のCSVファイルとして出力せよ. 指定されたエクセルのCSVファイルの中にあるデータを読み込みそれぞれのデータの各列に列の番号の値を加えて別のCSVファイルとして出力せよ(_指定されたCSVファイル,_別のCSVファイル) :- 指定されたエクセルのCSVファイルの中にあるデータを読み込み(_指定されたCSVファイル,LL), それぞれのデータの各列に列の番号の値を加えて別のCSVファイルとして出力せよ(LL,_別のCSVファイル). 指定されたエクセルのCSVファイルの中にあるデータを読み込み(_指定されたCSVファイル,LL) :- findall(L,( repeat, 行入力(_行),(_行=end_of_file,seen,!,fail;数値変換項目区切り(_行,[','],L))),LL). 行入力(_行) :- read_line_to_codes(current_input,_文字コードならび), atom_codes(_行,_文字コードならび). それぞれのデータの各列に列の番号の値を加えて別のCSVファイルとして出力せよ(LL,_別のCSVファイル) :- それぞれのデータの各列に列の番号の値を加えて(LL,LL_2), 別のCSVファイルとして出力せよ(LL_2,_別のCSVファイル). それぞれのデータの各列に列の番号の値を加えて(LL,LL_2) :- findall(L2,( データの各列に列の番号の値を加えて(LL,L2)),LL_2). データの各列に列の番号の値を加えて(LL,L2) :- member(L,LL), 列の番号の値を加えて(L,L2). 列の番号の値を加えて(L,L2) :- findall(_列番号を加えられた列の値,( 列の値を取り出し列番号を加える(L,_列番号を加えられた列の値)),L2). 列の値を取り出し列番号を加える(L,_列番号を加えられた列の値) :- nth1(_列番号,L,_列の値), _列番号を加えられた列の値 is _列の値 + _列番号. 別のCSVファイルとして出力せよ(LL,_別のCSVファイル) :- tell(_別のCSVファイル), 'CSVファイルとして出力'(LL), told. 'CSVファイルとして出力'(LL) :- forall(項目区切り行をカンマ区切り文字列に変換して(LL,_カンマ区切り文字列),writef('%w\n',[_カンマ区切り文字列])). 項目区切り行をカンマ区切り文字列に変換して(LL,_カンマ区切り文字列) :- member(L,LL), atomic_list_concat(L,',',_カンマ区切り文字列). 数値変換項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 数値変換項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび). 数値変換項目区切り('',_,[],[]) :- !. 数値変換項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび) :- '先頭から区切り文字列で区切って行く(可能なものは数値に変換する)'(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび),!. 数値変換項目区切り(_文字列,_,[],[_文字列_1]) :- 数値に変換可能なものは変換する(_文字列,_文字列_1). '先頭から区切り文字列で区切って行く(可能なものは数値に変換する)'(_文字列,_区切り文字列ならび,[_区切り文字列|R1],[_前文字列_1|R2]) :- '区切り文字列で前文字列、後文字列に区切る(前文字列は空文字ではない)'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 数値に変換可能なものは変換する(_前文字列,_前文字列_1), 数値変換項目区切り(_後文字列,_区切り文字列ならび,R1,R2). '区切り文字列で前文字列、後文字列に区切る(前文字列は空文字ではない)'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- member(_区切り文字列,_区切り文字列ならび), 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), 前文字列は空文字ではない(_前文字列). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). 前文字列は空文字ではない(_前文字列) :- _前文字列 \== ''. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 132台目 #365 # 【質問テンプレ】 # [1]授業単元:応用C言語演習 # [2]問題文(含コード&リンク) # 標準入力から1文字以上の英数字と'_'で構成される単語を読み込み、 # それぞれの単語が何回、何行目の何個目の単語に出現したかを単語アルファベット順 # にリストする索引作成プログラム # アルファベット順出力の後出現頻度(出現が多い単語順、同数についてはアルファベ # ット順)順についても同じ書式で出力 # 改行記号とタブ/アルファベット/数字/ '_' /空白しか標準入力されないとして良い。 # 入力行数、単語長、種数、単語辺りの出現回数に制限は無い。 # 単語の前後の区切りは単語を構成しない文字とする。(行末記号を含む) # 書式: 単語 (回数) 位置(行番号が若い順)改行 # 位置: 'L'行番号(1から開始)-行内単語番号(1から開始) # alpha (3回) L32-5 L66-4 L124-1 # beta (2回) L192-1 L276-3 # :- dynamic(単語索引/3). 文から索引の作成(_ファイル,_索引ならび) :- abolish(単語索引/3), ファイルを行ならびに変換する(_ファイル,_行ならび), 単語索引を作成(_行ならび). 単語索引を作成(_行ならび) :- '行ならびの全行に対して項目を区切って単語を取り出し、[単語,行目,行の中での位置]を引数とする節を単語索引に登録する'(_行ならび). '行ならびの全行に対して項目を区切って単語を取り出し、[単語,行目,行の中での位置]を引数とする節を単語索引に登録する'(_行ならび) :- forall( '行ならびの全行に対して'(_行ならび,_行目,_行), '項目を区切って単語を取り出し、[単語,行目,行の中での位置]を引数とする節を単語索引に登録する'(_行目,_行)). '行ならびの全行に対して'(_行ならび,_行目,_行) :- nth1(_行目,_行ならび,_行). '項目を区切って単語を取り出し、[単語,行目,行の中での位置]を引数とする節を単語索引に登録する'(_行目,_行) :- 項目区切り(_行,[' ','\t'],_単語ならび), 単語索引に登録する(_行目,_単語ならび). 単語索引に登録する(_行目,_単語ならび) :- forall( nth1(_位置,_単語ならび,_単語), assertz(単語索引(_単語,_行目,_位置))). 単語索引の全表示 :- forall(単語ごとの(_単語), '単語ごとの[_行,_位置]の明細と出現数を表示する'(_単語)). 単語ごとの(_単語) :- 単語ならびを生成し(_単語ならび), 一つずつ単語を取りだす(_単語). 単語ならびを生成し(_単語ならび) :- setof(_単語,[_単語,_行,_位置] ^ 単語索引(_単語,_行,_位置),_単語ならび). 一つずつ単語を取りだす(_単語) :- member(_単語,_単語ならび). '単語ごとの[_行,_位置]の明細と出現数を表示する'(_単語) :- '単語ごとの[_行,_位置]の明細'(_単語,_行_位置ならび), '[_行,_位置]の明細と出現数を表示する'(_単語,_行_位置_ならび). '単語ごとの[_行,_位置]の明細'(_単語,_行_位置ならび) :- findall([_行,_位置],( 単語索引(_単語,_行,_位置)),_行_位置ならび). '[_行,_位置]の明細と出現数を表示する'(_単語,_行_位置_ならび) :- length(_行_位置ならび,_度数), writef('%w\t%w\t%w\n',[_単語,_行_位置ならび,_度数]). 項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび). 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび) :- 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび),!. 項目区切り(_文字列,_,[],[_文字列]). 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,[_区切り文字列|R1],[_前文字列|R2]) :- '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 項目区切り(_後文字列,_区切り文字列ならび,R1,R2). '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字列ならび). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 文字列ならびの中で数値に変換可能なものは変換する(_文字列ならび,_項目ならび) :- findall(_項目,( 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目)),_項目ならび). 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目) :- member(_文字列,_文字列ならび), 数値に変換可能なものは変換する(_文字列,_項目). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 132代目 #157 # [1] 授業単元: アルゴリズム&アプリケーション # [2] 問題文(含コード&リンク):売掛表がcsvファイルで作られています。 # 各行の情報は、 # 顧客名,前月繰越高,当月入金高,当月売上高,締め日付 # であり、締め日付で昇順に整列していて、見出し等冗長部分はありません。 # 今回は問題を単純化するため、一人の顧客分しか扱わないことにします。 # さて更新プログラムのバグから、或る月の前月繰越高が # その前月の 前月繰越高-当月入金高+当月売上高 と不整合になってしまいました。 # 不整合になった以降の情報が正しく、 # それ以前の情報の当月入金高、当月売上高、締め日付については誤りがないとして、 # 1) 不整合部分を探し # 2) それ以前のすべての前月繰越高を全体が整合するように書き換えなさい。 # ファイルは一旦別のファイル(例えば/tmp/xxxxxx)に正しいものをつくり、 # その後、元のcsvファイルに書き戻しなさい。 # [3] 環境 #  [3.1] OS: Linux #  [3.2] コンパイラ名とバージョン: gcc 3.4 #  [3.3] 言語: C # [4] 期限: 期限はありません # [5] その他の制限: 日付などの持ち方は自由に工夫してよい。 # # 売掛表の遡行修正(_ファイル名) :- 'ファイルから数値変換項目区切り行ならびを得る'(_ファイル名,[','],LL), '不整合が生じた二行とそれ以前のならびを遡り修正した上で更新済みならびを構成する'(LL,_更新済みのLL), 更新済みならびをファイルに書き戻す(_ファイル名,_更新済みのLL). 'ファイルから数値変換項目区切り行ならびを得る'(_ファイル名,[','],LL) :- open(_ファイル名,read,_入力), 数値変換項目区切り行ならび(_入力,[','],LL), close(_入力). 数値変換項目区切り行ならび(_入力,_区切り文字列ならび,LL) :- findall(L,( repeat,(at_end_of_stream(_入力),!,fail;行入力(_入力,_行),数値変換項目区切り(_行,_区切り文字列ならび,L)),LL). 行入力(_入力,_行) :- read_line_to_codes(_入力,_文字コードならび), atom_codes(_行,_文字コードならび). '不整合が生じた二行とそれ以前のならびを遡り修正した上で更新済みならびを構成する'(LL,_更新済みのLL) :- 不整合が生じた二行を切り出し不整合を修正する(LL,_それ以前のならび,_不整合が生じた二行,_それ以後のならび,_顧客名,_遡り修正額,_修正済みの不整合が生じた二行), 'それ以前のならびの修正'(_顧客名,_遡り修正額,_それ以前のならび,_修正済みのそれ以前のならび), append([_修正済みのそれ以前のならび,_修正済みの不整合が生じた二行,_それ以後のならび],_更新済みのLL). 不整合が生じた二行を切り出し不整合を修正する(LL,_それ以前のならび,_不整合が生じた二行,_それ以後のならび,_顧客名,_遡り修正額,_修正済みの不整合が生じた二行) :- 不整合が生じた二行(LL,_それ以前のならび,_不整合が生じた二行,_それ以後のならび,_顧客名,_遡り修正額), 不整合が生じた二行の修正(_顧客名,_遡り修正額,_不整合が生じた二行,_修正済みの不整合が生じた二行). 不整合が生じた二行(LL,LL1,[[_顧客名,_前月繰越高_1,_当月入金高_1,_当月売上高_1,_締め日付_1],[_顧客名,_前月繰越高,_当月入金高,_当月売上高,_締め日付]],LL2,_顧客名,_遡り修正額) :- append([LL1,[[_顧客名,_前月繰越高_1,_当月入金高_1,_当月売上高_1,_締め日付_1],[_顧客名,_前月繰越高,_当月入金高,_当月売上高,_締め日付]],LL2],LL), '前の月の請求額と当月の繰越額が不整合である。遡り修正額が発生する。'(_前月繰越高_1,_当月入金高_1,_当月売上高_1,_締め日付_1,_前月繰越高,_遡り修正額). '前の月の請求額と当月の繰越額が不整合である。遡り修正額が発生する。'(_前月繰越高_1,_当月入金高_1,_当月売上高_1,_締め日付_1,_前月繰越高,_遡り修正額) :- '前の月の請求額と当月の繰越額が不整合である。'(_前月繰越高_1,_当月入金高_1,_当月売上高_1,_締め日付_1,_前月繰越高), '遡り修正額が発生する。'(_前月繰越高,_当月請求高_1,_遡り修正額). '前の月の請求額と当月の繰越額が不整合である。'(_前月繰越高_1,_当月入金高_1,_当月売上高_1,_締め日付_1,_前月繰越高) :- _当月請求高_1 is _前月繰越高_1 - _当月入金高_1 + _当月売上高_1, _当月請求高_1 \== _前月繰越高. '遡り修正額が発生する。'(_前月繰越高,_当月請求高_1,_遡り修正額) :- _遡り修正額 is _前月繰越高 - _当月請求高_1. '不整合が生じた二行の修正'(_顧客名,_遡り修正額,[[_顧客名,_前月繰越高_1,_当月入金高_1,_当月売上高_1,_締め日付_1],[_顧客名,_前月繰越高,_当月入金高,_当月売上高,_締め日付]],[[_顧客名,_修正済みの前月繰越高_1,_当月入金高_1,_当月売上高_1,_締め日付_1],[_顧客名,_前月繰越高,_当月入金高,_当月売上高,_締め日付]]) :- _修正済みの前月繰越高_1 is _前月繰越高_1 + _遡り修正額. 'それ以前のならびの修正'(_顧客名,_遡り修正額,_それ以前のならび,_修正済みのそれ以前のならび) :- findall([_顧客名,_前月繰越高,_当月入金高,_当月売上高,_締め日付],( 'それ以前のならびから行を取り出し、指定された顧客名の前月繰越高だけ修正する'(_顧客名,_遡り修正額,_それ以前のならび,[_顧客名,_前月繰越高,_当月入金高,_当月売上高,_締め日付])),_修正済みのそれ以前のならび). 'それ以前のならびから行を取り出し、指定された顧客名の前月繰越高だけ修正する'(_顧客名,_遡り修正額,_それ以前のならび,[_顧客名_1,_前月繰越高,_当月入金高,_当月売上高,_締め日付]) :- 'それ以前のならびから行を取り出し、'(_それ以前のならび,[_顧客名_1,_前月繰越高_1,_当月入金高,_当月売上高,_締め日付]), 指定された顧客名の前月繰越高だけ修正する(_顧客名,顧客名_1,_遡り修正額,_前月繰越高_1,_前月繰越高). 'それ以前のならびから行を取り出し、'(_それ以前のならび,[_顧客名_1,_前月繰越高_1,_当月入金高,_当月売上高,_締め日付]) :- member([_顧客名_1,_前月繰越高_1,_当月入金高,_当月売上高,_締め日付],それ以前のならび). 指定された顧客名の前月繰越高だけ修正する(_顧客名,_顧客名,_遡り修正額,_前月繰越高_1,_前月繰越高) :- _前月繰越高 is _前月繰越高_1 + _遡り修正額,!. 指定された顧客名の前月繰越高だけ修正する(_顧客名,_顧客名_1,_遡り修正額,_前月繰越高,_前月繰越高) :- _顧客名 \== _顧客名_1. 更新済みならびをファイルに書き戻す(_ファイル名,_更新済みのLL) :- tell(_ファイル名), forall(member(L,_更新済みのLL),writef('%w,%w,%w,%w,%w\n',L)), told. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 数値変換項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 数値変換項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび). 数値変換項目区切り('',_,[],[]) :- !. 数値変換項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび) :- '先頭から区切り文字列で区切って行く(可能なものは数値に変換する)'(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび),!. 数値変換項目区切り(_文字列,_,[],[_文字列_1]) :- 数値に変換可能なものは変換する(_文字列,_文字列_1). '先頭から区切り文字列で区切って行く(可能なものは数値に変換する)'(_文字列,_区切り文字列ならび,[_区切り文字列|R1],[_前文字列_1|R2]) :- '区切り文字列で前文字列、後文字列に区切る(前文字列は空文字ではない)'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 数値に変換可能なものは変換する(_前文字列,_前文字列_1), 数値変換項目区切り(_後文字列,_区切り文字列ならび,R1,R2). '区切り文字列で前文字列、後文字列に区切る(前文字列は空文字ではない)'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- member(_区切り文字列,_区切り文字列ならび), 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), 前文字列は空文字ではない(_前文字列). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). 前文字列は空文字ではない(_前文字列) :- _前文字列 \== ''. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 132代目 #97 # struct meibo {char name[20];int eigo; int kokugo;} # みたいな構造体でmeibo_t[]にループでどんどんデータを入れて生きたいのですがどうすれば良いですか? # int a= 0; meibo[a]=みたいにするとエラーがでますし、何か[0]にどんどん数字が足されてるような気がします # 名簿を読み込む(_名簿) :- findall([_名前,_英語,_国語],( 行連続入力(_行),(_行=end_of_file,!,fail;項目区切り(_行,[','],[_名前,_英語,_国語]))),_名簿). 行連続入力(_行) :- repeat, 行入力(_行). 行入力(_行) :- read_line_to_codes(current_input,_文字コードならび), atom_codes(_行,_文字コードならび). 項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび_1), 文字列ならびの中で数値に変換可能なものは変換する(_区切られた文字列ならび_1,_区切られた文字列ならび). 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび) :- 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび),!. 項目区切り(_文字列,_,[],[_文字列]). 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,[_区切り文字列|R1],[_前文字列|R2]) :- '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 項目区切り(_後文字列,_区切り文字列ならび,R1,R2). '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字列ならび). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 文字列ならびの中で数値に変換可能なものは変換する(_文字列ならび,_項目ならび) :- findall(_項目,( 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目)),_項目ならび). 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目) :- member(_文字列,_文字列ならび), 数値に変換可能なものは変換する(_文字列,_項目). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). % 以下のサイトは # 出典 :: Python の宿題ここで答えます Part 1 #964 # 1. キーボードから氏名と電話番号を読み込み,氏名をキー,電話番号を値としてディクショナリに格納する. # 2. 氏名として"END"が入力されるまで1.を繰り返す. # 3. "END"が入力されたら,ディクショナリの内容を "氏名\t電話番号\n" の形式でファイルに書き出す. # '1. キーボードから氏名と電話番号を読み込み,氏名をキー,電話番号を値としてディクショナリに格納する. 2. 氏名として"END"が入力されるまで1.を繰り返す. 3. "END"が入力されたら,ディクショナリの内容を "氏名\t電話番号\n" の形式でファイルに書き出す.'(_ディクショナリファイル) :- '1. キーボードから氏名と電話番号を読み込み,氏名をキー,電話番号を値としてディクショナリに格納する. 2. 氏名として"END"が入力されるまで1.を繰り返す.', '3. ディクショナリの内容を "氏名\t電話番号\n" の形式でファイルに書き出す.'(_ディクショナリファイル). '1. キーボードから氏名と電話番号を読み込み,氏名をキー,電話番号を値としてディクショナリに格納する. 2. 氏名として"END"が入力されるまで1.を繰り返す.' :- キーボードから(_行), '行を氏名と電話番号に分解する.氏名をキー,電話番号を値としてディクショナリに格納する.氏名として"END"が入力されるまで.'(_行). キーボードから(_行) :- 行入力(_行). 行入力(_行) :- read_line_to_codes(user_input,_コードならび), atom_codes(_行,_コードならび). '行を氏名と電話番号に分解する.氏名をキー,電話番号を値としてディクショナリに格納する.氏名として"END"が入力されるまで.'(_行) :- sub_atom(_行,0,3,_,'END'),!. '行を氏名と電話番号に分解する.氏名をキー,電話番号を値としてディクショナリに格納する.氏名として"END"が入力されるまで.'(_行) :- '行を氏名と電話番号に分解する.氏名をキー,電話番号を値としてディクショナリに格納して行く.'(_行). '行を氏名と電話番号に分解する.氏名をキー,電話番号を値としてディクショナリに格納して行く.'(_行) :- '行を氏名と電話番号に分解する.'(_行,_氏名,_電話番号), '氏名をキー,電話番号を値としてディクショナリに格納する.'(_氏名,_電話番号), '1. キーボードから氏名と電話番号を読み込み,氏名をキー,電話番号を値としてディクショナリに格納する. 2. 氏名として"END"が入力されるまで1.を繰り返す.'. '行を氏名と電話番号に分解する.'(_行,_氏名,_電話番号) :- 項目区切り(_行,[' ',','],[_氏名,_電話番号]). '氏名をキー,電話番号を値としてディクショナリに格納する.'(_氏名,_電話番号) :- assertz(ディクショナリ(_氏名,_電話番号)). '3. ディクショナリの内容を "氏名\t電話番号\n" の形式でファイルに書き出す.'(_ディクショナリファイル) :- tell(_ディクショナリファイル), 'ディクショナリの内容を "氏名\t電話番号\n" の形式でファイルに書き出す.', told. 'ディクショナリの内容を "氏名\t電話番号\n" の形式でファイルに書き出す.' :- forall( ディクショナリ(_氏名,_電話番号), writef('%t\t%t\n',[_氏名,_電話番号])). 項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび). 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび) :- 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび),!. 項目区切り(_文字列,_,[],[_文字列]). 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,[_区切り文字列|R1],[_前文字列|R2]) :- '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 項目区切り(_後文字列,_区切り文字列ならび,R1,R2). '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字列ならび). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 文字列ならびの中で数値に変換可能なものは変換する(_文字列ならび,_項目ならび) :- findall(_項目,( 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目)),_項目ならび). 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目) :- member(_文字列,_文字列ならび), 数値に変換可能なものは変換する(_文字列,_項目). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1255709298/442 # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10025.txt # 「スコアー,ステージナンバー,名前」が入っているファイルがあるとする。 # # 降順にソート済みのスコアーデータのファイルから、上位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 '降順にソート済みのスコアーデータのファイルから、上位10件を配列に読み込み、 新たに11件目のスコアーデータを入力後、スコアーの大きい順に並び替えを行い、 上位10件のデータを再度書き込むプログラムを作成せよ'(_ファイル) :- 行ならび入力(ファイル,_行ならび), findall(U,(member(A,Lines),split(A,[','],U)),LL1), 降順整列状態を保って挿入する(L,LL1,LL2), forall(member(L,LL2),(atomic_list_concat(L,',',A),writef('%w\n',[A]))). 行ならび入力(_ファイル,_行ならび) :- open(_ファイル,read,_入力), findall(_行,(repeat,(at_end_of_stream(_入力),close(_入力),!,fail; 行入力(_入力,_行))),_行ならび). 一行追加に入力する(LL1,LL2) :- 行入力(_行), 項目区切り(_行,[','],L), 降順整列状態を保って挿入する(L,LL1,LL2). 行入力(_行) :- 行入力(user_input,_行). 行入力(_入力,_行) :- read_line_to_codes(_入力,_コードならび), atom_codes(_行,_コードならび). 項目区切り(_文字列,_区切り文字ならび,[_項|_項目区切りならび]) :- '前文字列,区切り文字列,後文字列を確定し、前文字列は可能ならば数値に変換する'(_区切り文字列ならび,_文字列,_前文字列,_区切り文字列,_項), 項目区切り(_後文字列,_区切り文字列ならび,_項目区切りならび),!. 項目区切り(_文字列,_,[_項]) :- 可能ならば数値に変換(_文字列,_項). '前文字列,区切り文字列,後文字列を確定し、前文字列は可能ならば数値に変換する'(_区切り文字列ならび,_文字列,_前文字列,_区切り文字列,_変換された項) :- 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字名列ならび), 前文字列は可能ならば数値に変換する(_前文字列,_変換された項). 前文字列は可能ならば数値に変換(_前文字列,_数値に変換した前文字列) :- atom_number(_前文字列,_数値に変換した前文字列),!. 前文字列は可能ならば数値に変換(_前文字列,_前文字列). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 降順整列状態を保って挿入する(_挿入要素,L1,L2) :- 挿入点を求め挿入した上で最終要素を切り落とす(_挿入要素,L1,L2),!. 降順整列状態を保って挿入する(_挿入要素,L1,L1). 挿入点を求め挿入した上で最終要素を切り落とす(_挿入要素,L1,L2) :- 挿入点を求め(_挿入要素,L1,_1,_2,_3), 挿入した上で最終要素を切り落とす(_挿入要素,_1,_2,_3,L2). 挿入点を求め(_挿入要素,L1,_1,_2,_3) :- append(_1,[_2|_3],L1), _挿入要素 @>= _2. 挿入した上で最終要素を切り落とす(_挿入要素,_1,_2,_3,L2) :- append(_1,[_挿入要素,_2|_3],L1_1), append(L2,[_],L1_1). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 130代目 #907 # [1] C言語とアルゴリズム # [2] 選択型処理 あるお店では会員制をとっている。会員には一般会員と特別会員があり、 # 一般会員は購入金額の1割引きのサービスを、特別会員は3割引きのサービスを受けられる。 # 非会員の場合は購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。 # この店のある日のデータ(data03.dat)が与えられたとき、実行例のような出力が得られるプログラムを作成しなさい。 # ただし、data03.datには以下の形式で会員種別と購入金額が記載されているものとする。 # [会員種別(1桁) 購入金額] # ここで、会員種別は1が一般会員、2が特別会員、3が非会員を表す。 # 会員種別の判定にはswitch文を用い、一般会員は「会」、特別会員は「特」、 # 非会員は「非」と表しなさい。 # # [data03.dat] http://prolog.asia/data/data03.dat # 『実行例』 # 種別  購入金額(円)  支払い金額(円)   # 会     3200        2880    ←一般会員は1割引き # 特     2400        1680    ←特別会員は3割引き # 非     4800        4800    ←非会員は通常割り引かない # 特     6500        4550 # 会     10800 9720 # 特     18200 12740 # 非    21400 20400    ←非会員も購入金額が15000円以上なら1000円引き # 会     890 801 # 会     3900        3510 # 特     6200        4340 # ----------------------------------------- # 合計    78290        65421 ←最後の行に合計を出力すること /* date03.dat 1 3200 2 2400 3 4800 2 6500 1 10800 2 18200 3 21400 1 890 1 3900 2 6200 */ :- op(700,xfx,は). 'あるお店では会員制をとっている。会員には一般会員と特別会員があり、 一般会員は購入金額の1割引きのサービスを、特別会員は3割引きのサービスを受けられる。 非会員の場合は購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。 この店のある日のデータ(data03.dat)が与えられたとき、実行例のような出力が得られるプログラムを作成しなさい。 ただし、data03.datには以下の形式で会員種別と購入金額が記載されているものとする。 [会員種別(1桁) 購入金額] ここで、会員種別は1が一般会員、2が特別会員、3が非会員を表す。 会員種別の判定にはswitch文を用い、一般会員は「会」、特別会員は「特」、 非会員は「非」と表しなさい。' :- 全行を空白区切りしながらならびに取る('data03.dat',_入力データならび), ある日のご購入明細表を出力する(_入力データならび). ある日のご購入明細表を出力する(_入力データならび) :- '会員種別から支払い金額を計算してご購入金額表を作り、ご購入金額表明細を表示する'(_入力データならび,_ご購入金額表), 'ご購入金額表から購入金額計と支払い金額計を計算して10桁右詰めで表示する'(_ご購入金額表). '会員種別から支払い金額を計算してご購入金額表を作り、ご購入金額表明細を表示する'(_入力データならび,_ご購入金額表) :- '入力データならびからご購入金額表を作成する。 一般会員は購入金額の1割引きのサービスを、特別会員は3割引きのサービスを受けられる。 非会員の場合は購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。'(_入力データならび,_ご購入金額表), 'ご購入金額明細を見出し表示後、10桁右詰めで表示する'(_ご購入金額表). '入力データならびからご購入金額表を作成する。 一般会員は購入金額の1割引きのサービスを、特別会員は3割引きのサービスを受けられる。 非会員の場合は購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。'(_入力データならび,_ご購入金額表) :- findall([_会員略号,_購入金額,_支払い金額],( member([_会員種別番号,_購入金額],_入力データならび), '一般会員は購入金額の1割引きのサービスを、特別会員は3割引きのサービスを受けられる。 非会員の場合は購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。'(_会員種別番号,_購入金額,_会員略号,_支払い金額)),_ご購入金額表). '一般会員は購入金額の1割引きのサービスを、特別会員は3割引きのサービスを受けられる。 非会員の場合は購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。'(_会員種別番号,_購入金額,_会員略号,_支払い金額) :- '一般会員は購入金額の1割引きのサービスを、特別会員は3割引きのサービスを受けられる。'(_会員種別番号,_購入金額,_会員略号,_支払い金額). '一般会員は購入金額の1割引きのサービスを、特別会員は3割引きのサービスを受けられる。 非会員の場合は購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。'(_会員種別番号,_購入金額,_会員略号,_支払い金額) :- '非会員の場合は購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。'(_会員種別番号,_購入金額,_会員略号,_支払い金額). '一般会員は購入金額の1割引きのサービスを、特別会員は3割引きのサービスを受けられる。'(_会員種別番号,_購入金額,_会員略号,_支払い金額) :- '一般会員は購入金額の1割引きのサービスを受けられる。'(_会員種別番号,_購入金額,_会員略号,_支払い金額). '一般会員は購入金額の1割引きのサービスを、特別会員は3割引きのサービスを受けられる。'(_会員種別番号,_購入金額,_会員略号,_支払い金額) :- '特別会員は3割引きのサービスを受けられる。'(_会員種別番号,_購入金額,_会員略号,_支払い金額). '一般会員は購入金額の1割引きのサービスを受けられる。'(_会員種別番号,_購入金額,_会員略号,_支払い金額) :- 会員種別番号(_会員種別番号,一般会員,_会員略号), '購入金額の1割引きのサービスを受けられる。'(_購入金額,_支払い金額). '購入金額の1割引きのサービスを受けられる。'(_購入金額,_支払い金額) :- _支払い金額 は 四捨五入(_購入金額 * (1 - 0.1)). '特別会員は3割引きのサービスを受けられる。'(_会員種別番号,_購入金額,_会員略号,_支払い金額) :- 会員種別番号(_会員種別番号,特別会員,_会員略号), '購入金額の3割引きのサービスが受けられる。'(_購入金額,_支払い金額). '購入金額の3割引きのサービスが受けられる。'(_購入金額,_支払い金額) :- _支払い金額 は 四捨五入(_購入金額 * (1 - 0.3)). '非会員の場合は購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。'(_会員種別番号,_購入金額,_会員略号,_支払い金額) :- 会員種別番号(_会員種別番号,非会員,_会員略号), '購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。'(_購入金額,_支払い金額). '購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。'(_購入金額,_支払い金額) :- '購入金額が15000円以上の場合のみ1000円引き'(_購入金額,_支払い金額),!. '購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。'(_購入金額,_支払い金額) :- _購入金額 = _支払い金額. '購入金額が15000円以上の場合のみ1000円引き'(_購入金額,_支払い金額) :- _購入金額 >= 15000, _支払い金額 は _購入金額 - 1000. 会員種別番号(_会員種別番号,_会員種別,_会員略号) :- 会員種別番号(_会員種別番号,_会員種別), 会員略号(_会員種別,_会員略号). 会員種別番号(1,一般会員). 会員種別番号(2,特別会員). 会員種別番号(3,非会員). 会員略号(一般会員,会). 会員略号(特別会員,特). 会員略号(非会員,非). 'ご購入金額明細を見出し表示後、10桁右詰めで表示する'(_ご購入金額表) :- write('\n種別\t 購入金額(円)\t支払い金額(円)\n'), ご購入金額表明細を10桁右詰めで表示(_ご購入金額表). ご購入金額表明細を10桁右詰めで表示(_ご購入金額表) :- forall( member([_会員略号,_購入金額,_支払い金額],_ご購入金額表), '購入金額、支払金額を10桁右詰め文字列に変換して表示する'(_会員略号,_購入金額,_支払い金額)). '購入金額、支払金額を10桁右詰め文字列に変換して表示する'(_会員略号,_購入金額,_支払い金額) :- '10桁の右詰めの数値文字列に変換'(_購入金額,_支払い金額,_購入金額表示文字列,_支払い金額表示文字列), writef('%w\t%w\t%w\n',[_会員略号,_購入金額表示文字列,_支払い金額表示文字列]). 'ご購入金額表から購入金額計と支払い金額計を計算して10桁右詰めで表示する'(_ご購入金額表) :- 購入金額計と支払い金額計(_ご購入金額表,_購入金額計,_支払い金額計), '購入金額計、支払金額計を10桁右詰め文字列に変換して表示する'(_購入金額計,_支払い金額計). '購入金額計、支払金額計を10桁右詰め文字列に変換して表示する'(_購入金額計,_支払い金額計) :- '10桁の右詰めの数値文字列に変換'(_購入金額計,_支払い金額計,_購入金額計表示文字列,_支払い金額計表示文字列), writef('-----------------------------------------\n合計\t%w\t%w\n',[_購入金額計表示文字列,_支払い金額計表示文字列]). 購入金額計と支払い金額計(_ご購入金額表,_購入金額計,_支払い金額計) :- 購入金額計(_ご購入金額表,_購入金額計), 支払い金額計(_ご購入金額表,_支払い金額計). 購入金額計(_ご購入金額表,_購入金額計) :- findsum(_購入金額,( member([_,_購入金額,_],_ご購入金額表)),_購入金額計). 支払い金額計(_ご購入金額表,_支払い金額計) :- findsum(_支払い金額,( member([_,_,_支払い金額],_ご購入金額表)),_支払い金額計). 全行を空白区切りしながらならびに取る(_ファイル,_ならび) :- open(_ファイル,read,_入力), findall(_空白区切りされた行,( repeat, (at_end_of_stream(_入力),!,close(_入力),fail; 行入力(_入力,_行), 項目区切り(_行,[' '],_空白区切りされた行))),_ならび). 行入力(_入力,_行) :- read_line_to_codes(_入力,_文字コードならび), atom_codes(_行,_文字コードならび). findsum(_集約対象項,_目標,_合計) :- findall(_集約対象項,_目標,_集約対象項ならび), sum_list(_集約対象項ならび,_合計). _答え は _式 :- 関数定義(_式,_答え),!. _答え は _式 :- _答え is _式.  関数定義(四捨五入(_式),_答え) :- _答え_1 は _式, _答え is floor(_答え_1 + 0.5). '10桁の右詰めの数値文字列に変換'(_数値_1,_数値_2,_10桁の右詰めの数値文字列_1,_10桁の右詰めの数値文字列_2) :- n桁の右詰めの数値文字列に変換(10,_数値_1,_10桁の右詰めの数値文字列_1), n桁の右詰めの数値文字列に変換(10,_数値_2,_10桁の右詰めの数値文字列_2). n桁の右詰めの数値文字列に変換(_n桁,_数値,_n桁の右詰めの数値文字列) :- 数値を数値文字列に変換して先頭にn桁の空白文字列を付加する(_n桁,_数値,_一時的に空白文字列を付加された数値文字列), 末尾のn桁を切り出す(_n桁,_一時的に空白文字列を付加された数値文字列,_n桁の右詰めの数値文字列). 数値を数値文字列に変換して先頭にn桁の空白文字列を付加する(_n桁,_数値,_一時的に空白文字列を付加された数値文字列) :- 数値を数値文字列に変換して(_数値,_実質数値文字列), 先頭にn桁の空白文字列を付加する(_n桁,_実質数値文字列,_一時的に空白文字列を付加された数値文字列). 数値を数値文字列に変換して(_数値,_実質数値文字列) :- atom_number(_実質数値文字列,_数値). 先頭にn桁の空白文字列を付加する(_n桁,_実質数値文字列,_一時的に空白文字列を付加された数値文字列) :- n桁の空白文字列(_n桁,_n桁の空白文字列), atom_concat(_n桁の空白文字列,_実質数値文字列,_一時的に空白文字列を付加された数値文字列). n桁の空白文字列(_n桁,_n桁の空白文字列) :- length(_全ての要素が空白文字のならび,_n桁), 全ての要素が空白文字(_全ての要素が空白文字のならび), atom_chars(_n桁の空白文字列,_全ての要素が空白文字のならび). 全ての要素が空白文字([' ']) :- !. 全ての要素が空白文字([' '|R]) :- 全ての要素が空白文字(R). 末尾のn桁を切り出す(_n桁,_一時的に空白文字列を付加された数値文字列,_n桁の右詰めの数値文字列) :- sub_atom(_一時的に空白文字列を付加された数値文字列,_,_n桁,0,_n桁の右詰めの数値文字列). 項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび_1), 文字列ならびの中で数値に変換可能なものは変換する(_区切られた文字列ならび_1,_区切られた文字列ならび). 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび) :- 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび),!. 項目区切り(_文字列,_,[],[_文字列]). 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,[_区切り文字列|R1],[_前文字列|R2]) :- '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 項目区切り(_後文字列,_区切り文字列ならび,R1,R2). '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字列ならび). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 文字列ならびの中で数値に変換可能なものは変換する(_文字列ならび,_項目ならび) :- findall(_項目,( 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目)),_項目ならび). 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目) :- member(_文字列,_文字列ならび), 数値に変換可能なものは変換する(_文字列,_項目). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 130代目 #676 # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9965.txt # 以下のプログラムを作成せよ。 # 三科目の試験を行ったが、各科目で平均点がかなり異なってしまった状況を想定する。 # 科目間でできるだけ均等にするために、各科目の最高得点の人を100点にするように点数を変換することにした # 例えば、国語の最高得点が70点の場合、国語の点数は全て100/70倍される # このような点数の変換プログラムを考える # 達成条件は # ・ファイルin.txtを開き、変換された点数データをファイルoutput.txtに書き込んでいる。 # ・ファイルからデータを読み込んだ時に、構造体にデータを入力している # ・ファイルout.txt内では、正しく点数が変換されている。 # ・名前は最大でも半角で20文字として。配列nameの外をアクセスしていない。 t741 :- '三科目の試験を行ったが、各科目で平均点がかなり異なってしまった状況を想定する。 科目間でできるだけ均等にするために、各科目の最高得点の人を100点にするように点数を変換することにした 例えば、国語の最高得点が70点の場合、国語の点数は全て100/70倍される'. '三科目の試験を行ったが、各科目で平均点がかなり異なってしまった状況を想定する。 科目間でできるだけ均等にするために、各科目の最高得点の人を100点にするように点数を変換することにした 例えば、国語の最高得点が70点の場合、国語の点数は全て100/70倍される' :- 'in.txtを読み、[氏名,A,B,C]の組ならびとする'(L), 三科目それぞれの最高点を得て嵩上げ率の計算(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). 'in.txtを読み、[氏名,A,B,C]の組ならびとする'(L) :- 行ならびを得る('in.txt',_行ならび), findall([Name2,A1,B1,C1],( member(_行,_行ならび), 項目区切り(Line,[' ',','],[Name1,A1,B1,C1]), 名前の長さ制限(Name1,Name2)),L). 三科目それぞれの最高点を得て嵩上げ率の計算(MaxA,MaxB,MaxC,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C) :- 三科目それぞれの最高点を得て(L,MaxA,MaxB,MaxC), 嵩上げ率計算(MaxA,MaxB,MaxC,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C). 三科目それぞれの最高点を得て(L,MaxA,MaxB,MaxC) :- findmax(A,(member([_,A,_,_],L),MaxA), findmax(B,(member([_,_,B,_],L),MaxB), findmax(A,(member([_,_,_,C],L),MaxC). 嵩上げ率計算(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),!. 行ならびを得る(_ファイル,_行ならび) :- see(_ファイル), findall(_行,(repeat,行入力(_行),(_行=end_of_file,!,fail;true)),_行ならび), seen. 行入力(_行) :- read_line_to_codes(current_input,_コードならび), atom_codes(_行,_コードならび). put_lines(_ファイル,_行ならび) :- tell(_ファイル), forall(member(_行,_行ならび),writef('%w\n',[_行])), told. 項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび). 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび) :- 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび),!. 項目区切り(_文字列,_,[],[_文字列]). 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,[_区切り文字列|R1],[_前文字列|R2]) :- '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 項目区切り(_後文字列,_区切り文字列ならび,R1,R2). '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字列ならび). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 文字列ならびの中で数値に変換可能なものは変換する(_文字列ならび,_項目ならび) :- findall(_項目,( 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目)),_項目ならび). 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目) :- member(_文字列,_文字列ならび), 数値に変換可能なものは変換する(_文字列,_項目). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 130代目 #57 # [1] 授業単元:C言語プログラミング # [2] 問題文(含コード&リンク):10×10マスの碁盤の内から、scanf命令で # 入力した2値をx,y座標として、 # その座標部分を塗りつぶし四角"■"で表示しなさい。 # それ以外は"□"でマス表示するものとします。 # 両者とも0から9までが入力されるものとします(エラー判定不要)。 # 入力時の問い合わせメッセージは自由に表示させて下さい。 '10×10マスの碁盤の内から、 入力した2値をx,y座標として、 その座標部分を塗りつぶし四角"■"で表示しなさい。 それ以外は"□"でマス表示するものとします。 両者とも0から9までが入力されるものとします(エラー判定不要)。'(_着手された盤面) :- '10×10の盤面に□を埋める'(_盤面), 着手(X,Y), 現在の盤面(_盤面,X,Y,_着手された盤面). '10×10マスの碁盤の内から、 入力した2値をx,y座標として、 その座標部分を塗りつぶし四角"■"で表示しなさい。 それ以外は"□"でマス表示するものとします。 両者とも0から9までが入力されるものとします(エラー判定不要)。'(_). '10×10の盤面に□を埋める'(_盤面) :- findall(L,( 'Lに□を埋める'(L)),_盤面). 'Lに□を埋める'(L) :- between(1,10,N), length(10,L), all(L,'□'). 着手(X,Y) :- '行を得て、それからX_0,Y_0を得る'(X_0,Y_0), X is X_0 + 1, Y is Y_0 + 1,!. '行を得て、それからX_0,Y_0を得る'(X_0,Y_0) :- 行入力(_行), 項目区切り(_行,[' ',','],[X_0,Y_0]). 行入力(_行) :- read_line_to_codes(current_input,_コードならび), atom_codes(_行,_コードならび). 現在の盤面(_盤面,X,Y,_着手された盤面) :- 行列の置換(Y,X,'■',_盤面,_着手された盤面_1), 現在の盤面(_盤面,X,Y,_着手された盤面_1,_着手された盤面). 現在の盤面(_盤面,X,Y,_着手された盤面,_着手された盤面) :- 盤面表示(_着手された盤面). 現在の盤面(_盤面,X,Y,_着手された盤面_1,_着手された盤面) :- 着手して盤面を更新する(_盤面,X,Y,_着手された盤面_1,_着手された盤面). 着手して盤面を更新する(_盤面,X,Y,_着手された盤面_1,_着手された盤面) :- 着手(X2,Y2), 現在の盤面(_着手された盤面_1,X2,Y2,_着手された盤面). 盤面表示(_盤面) :- reverse(_盤面,_原点位置を左下に修正した盤面), 盤面表示の二(_原点位置を左下に修正した盤面),!. 盤面表示の二([]) :- !. 盤面表示の二(LL) :- 表示升行を順に表示する(LL). 表示升行を順に表示する([L|R]) :- 行表示(L), 盤面表示の二(R). 行表示(L) :- atomic_list_concat(L,_表示升列アトム), writef('%t\n',[_表示升列アトム]). all([],_). all([V|R],V) :- all(R,V). 項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび). 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび) :- 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび),!. 項目区切り(_文字列,_,[],[_文字列]). 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,[_区切り文字列|R1],[_前文字列|R2]) :- '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 項目区切り(_後文字列,_区切り文字列ならび,R1,R2). '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字列ならび). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 文字列ならびの中で数値に変換可能なものは変換する(_文字列ならび,_項目ならび) :- findall(_項目,( 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目)),_項目ならび). 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目) :- member(_文字列,_文字列ならび), 数値に変換可能なものは変換する(_文字列,_項目). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). % 以下のサイトは # 出典 :: #704 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9863.txt # リストを用いた成績処理 # リストを用いて個人データを格納する表を作成 # 処理番号を入力して処理の切り替えを行う # 1.成績一覧表示, 2.個人成績表示, # 3.個人平均点表示,4.科目平均点表示, # 0.終了 # リストに新たにデータを追加する時は学生番号順に並ぶように追加する. # リスト構成する要素(セル)はmalloc関数でヒープ領域から確保するものとする. # # 入力する成績データ(この順番で入れる) # 学番名前英語数学化学物理 # 106 tada 65 80 90 100 # 101 kouda 50 85 70 65 # 103 hanako 70 75 65 80 # 104 akane 60 95 80 75 # 102 tarou 90 80 85 65 # 105 nara 80 70 50 95 初期データの入力(_初期データならび) :- write('初期データを入力してください\n'), 行入力(_行), 初期データの入力(_行,[],_初期データならび),!. 初期データの入力(end_of_file,Ls,Ls) :- !. 初期データの入力(_行,Ls1,Ls2) :- 項目区切り(_行,[' '],L), insert_Ls(L,Ls1,Ls3), 行入力(_行_2), 初期データの入力(_行_2,Ls3,Ls2). insert_Ls(L,[],[L]) :- !. insert_Ls([A|R1],[[B|R2]|R3],[[A|R1],[B|R2]|R3]]) :- A @=< B,!. insert_Ls([A|R1],[[B|R2]|R3],[[B|R2]|R3]]) :- A @> B, insert_Ls([A|R1],R3,R4). 'リストを用いた成績処理 リストを用いて個人データを格納する表を作成 処理番号を入力して処理の切り替えを行う 1.成績一覧表示, 2.個人成績表示, 3.個人平均点表示,4.科目平均点表示, 0.終了 リストに新たにデータを追加する時は学生番号順に並ぶように追加する. リスト構成する要素(セル)はmalloc関数でヒープ領域から確保するものとする.' :- 初期データの入力(L), 'リストを用いた成績処理 リストを用いて個人データを格納する表を作成 処理番号を入力して処理の切り替えを行う 1.成績一覧表示, 2.個人成績表示, 3.個人平均点表示,4.科目平均点表示, 0.終了 リストに新たにデータを追加する時は学生番号順に並ぶように追加する. リスト構成する要素(セル)はmalloc関数でヒープ領域から確保するものとする.'(L,_機能), _機能 = 終了(_,_). 'リストを用いた成績処理 リストを用いて個人データを格納する表を作成 処理番号を入力して処理の切り替えを行う 1.成績一覧表示, 2.個人成績表示, 3.個人平均点表示,4.科目平均点表示, 0.終了 リストに新たにデータを追加する時は学生番号順に並ぶように追加する. リスト構成する要素(セル)はmalloc関数でヒープ領域から確保するものとする.'(L,_機能) :- repeat, 処理番号を入力して処理の切り替えを行う(L,_機能), call(_機能). 処理番号を入力して処理の切り替えを行う(L,_機能) :- 整数を得る('1. 一覧表示\n2. 個人成績表示\n3. 個人平均点表示\n4. 科目平均点表示\n0. 終了\n',true,_処理番号), 処理番号による機能選択(_処理番号,L,_機能). 処理番号による機能選択(1,L,一覧表示(L,_)). 処理番号による機能選択(2,L,個人成績表示(L,_)). 処理番号による機能選択(3,L,個人平均点表示(L,_)). 処理番号による機能選択(4,L,科目平均点表示(L,_))). 処理番号による機能選択(0,_,終了). 終了(_,_). 一覧表示(L,_) :- forall(member([A,B,C,D,E,F],L), writef('%w,%w,%w,%w,%w,%w\n',[A,B,C,D,E,F])). 個人成績表示(L,[A,B,C,D,E,F]) :- 整数を得る('検索したい学番を入れてください : ',true,A), member([A,B,C,D,E,F],L), writef('%w,%w,%w,%w,%w,%w\n',[A,B,C,D,E,F]),!. 個人平均点表示(L,[Avg]) :- findavg(U,(member([_,_,C,D,E,F],L),U is C+D+E+F),Avg), writef('個人平均点は %wです\n',[Avg]). 科目別平均点表示(L,[AvgC,AvgD,AvgE,AvgF]) :- 四科目の平均点を得る(C,D,E,F,AvgC,AvgD,AvgE,AvgF), writef('英語平均点=%w,数学=%w,化学=%w,物理=%w\n',[AvgC,AvgD,AvgE,AvgF]),!. 四科目の平均点を得る(C,D,E,F,AvgC,AvgD,AvgE,AvgF) :- findavg(C,member([_,_,C,_,_,_],L),AvgC), findavg(D,member([_,_,_,D,_,_],L),AvgD), findavg(E,member([_,_,_,_,E,_],L),AvgE), findavg(F,member([_,_,_,_,_,F],L),AvgF). 整数を得る(_催促,_評価,_整数) :- 催促後に行入力(_催促,_行), 整数入力検査(_行,_整数), 整数入力評価(_評価). 催促後に行入力(_催促,_行) :- write(_催促), 行入力(_行),!. 催促後に行入力(_催促,_行) :- 催促後に行入力(_催促,_行). 行入力(_行) :- read_line_to_codes(current_input,_コードならび), atom_codes(_行,_コードならび). 整数入力検査(_行,_整数) :- atom_number(_行,_整数), integer(_整数),!. 整数入力検査(_行,_整数) :- writef('入力された行 %w からは整数が得られません。\n',[_行]), fail. 整数入力評価(_評価) :- call(_評価),!. 整数入力評価(_評価) :- writef('整数評価 %w が偽となりました。\n',[_評価]), fail. 項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび). 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび) :- 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび),!. 項目区切り(_文字列,_,[],[_文字列]). 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,[_区切り文字列|R1],[_前文字列|R2]) :- '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 項目区切り(_後文字列,_区切り文字列ならび,R1,R2). '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字列ならび). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 文字列ならびの中で数値に変換可能なものは変換する(_文字列ならび,_項目ならび) :- findall(_項目,( 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目)),_項目ならび). 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目) :- member(_文字列,_文字列ならび), 数値に変換可能なものは変換する(_文字列,_項目). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 129代目 #256 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # ファイルの1行目に2行目以降の各行に含まれる文字列の数が記述され, # 2行目以降はその数の不定長文字列が空白で区切られているような入力 # ファイルを読み込み,各行を以下に示す構造体の単方向連結リストに # 保存するプログラムを作成せよ.ここでは,attributes が1行分のデータ # を保持する. # struct t_list { # char **attributes; # struct t_list *next; # }; # またにはソースファイルには,生成した単方向連結リストの内容を # 標準出力に出力する関数 print_tlist を含むものとしprint_tlist により各行 # に含まれる文字列を出力するものとする.動作確認には,以下のテキストを用いよ. # なお,入力ファイル名はコマンドライン # 引数で指定するものとし,入力ファイルがオープンできなかった場合の処理も # 含めること.また,プログラム自身を除く引数の数が0個, # もしくは2個以上の場合は,何もせず適切なメッセージを出力して終了するものとする # 入力ファイル:http://www.uploda.tv/v/uptv0033032.txt 'ファイルの1行目に2行目以降の各行に含まれる文字列の数が記述され, 2行目以降はその数の不定長文字列が空白で区切られているような入力 ファイルを読み込み,各行を以下に示す構造体の単方向連結リストに 保存するプログラムを作成せよ.ここでは,attributes が1行分のデータ を保持する. struct t_list { char **attributes; struct t_list *next; }; またにはソースファイルには,生成した単方向連結リストの内容を 標準出力に出力する関数print_tlistを含むものとしprint_tlistにより各行 に含まれる文字列を出力するものとする.動作確認には,以下のテキストを用いよ. なお,入力ファイル名はコマンドライン 引数で指定するものとし,入力ファイルがオープンできなかった場合の処理も 含めること.また,プログラム自身を除く引数の数が0個, もしくは2個以上の場合は,何もせず適切なメッセージを出力して終了するものとする 入力ファイル:http://www.uploda.tv/v/uptv0033032.txt' :- 入力ファイル名はコマンドライン引数で指定するものとし(ファイル名), 'ファイルの1行目に2行目以降の各行に含まれる文字列の数が記述され, 2行目以降はその数の不定長文字列が空白で区切られているような入力 ファイルを読み込み,'(_ファイル名,_2行目以降の各行に含まれる文字列の数,_その数の不定長文字列のならび). 'ファイルの1行目に2行目以降の各行に含まれる文字列の数が記述され, 2行目以降はその数の不定長文字列が空白で区切られているような入力 ファイルを読み込み,'(_ファイル名,_2行目以降の各行に含まれる文字列の数,_その数の不定長文字列のならび) :- 行入力(_行_1), atom_number(_行_1,_2行目以降の各行に含まれる文字列の数), 行入力(_行_2), その数の不定長文字列が空白で区切られているような入力ファイルを読み込み(_行_2,_その数の不定長文字列のならび), catch(open(_ファイル名,write,Output),error(E,I),open_error(_ファイル名,I)), print_tlist(Output,_その数の不定長文字列のならび), close(Output). 入力ファイル名はコマンドライン引数で指定するものとし(ファイル名) :- ユーザパラメータの取得(_ファイル名). 行入力(_行) :- read_line_to_codes(current_input,_コードならび), atom_codes(_行,_コードならび). ユーザパラメータの取得(_ファイル名) :- current_prolog_flag(argv,_ファイル名),!. ユーザパラメータの取得(_) :- error_tell(Output), write(Output,'パラメータで適切なファイル名が与えられませんでした\n'), errot_told(Output). その数の不定長文字列が空白で区切られているような入力ファイルを読み込み(end_of_file,[]) :- !. その数の不定長文字列が空白で区切られているような入力ファイルを読み込み(_行,[L|R]) :- 項目区切り(_行,[' '],L), 行入力(_行_2), その数の不定長文字列が空白で区切られているような入力ファイルを読み込み(_行_2,R). open_error(_ファイル名,Info) :- error_tell(Output), write(Output,'出力ファイル%tのオープンに失敗 :: %t\n',[_ファイル名,Info]), error_told(Output), fail. print_tlist(Output,[]) :- !. print_tlist(Output,[A|R]) :- swritef(S,'%w\n',[A]), writef(Output,S), print_tlist(Output,R). 項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,_区切られた文字列ならび),!. 項目区切り(_文字列,_,[_文字列]). 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,[_前文字列|R]) :- '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 項目区切り(_後文字列,_区切り文字列ならび,R). '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字列ならび). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 文字列ならびの中で数値に変換可能なものは変換する(_文字列ならび,_項目ならび) :- findall(_項目,( 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目)),_項目ならび). 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目) :- member(_文字列,_文字列ならび), 数値に変換可能なものは変換する(_文字列,_項目). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). % 以下のサイトは # [1] 授業単元:情報処理 # [2] 問題文(含コード&リンク): # 例えば下図に示すように,通行可能なマス目に'0'が, # 障害物があって通行不能なマス目に'+'が記されている盤がある. # 盤の左上をスタート地点,右下をゴール地点として,経路を表示する # プログラムを作りなさい. # 盤の例 # 0 0 + 0 + # + 0 0 0 + # 0 + + 0 0 # 0 0 + 0 0 # + 0 0 0 0 # # 例えばこのようなアルゴリズムが考えられる. # # 1) 現在位置を表示の後、進行方向に対して,右に進めるなら右に, # そうでなければ直進,それもだめなら左に,さらにそれもダメなら後退する. # 2) 1を繰り返してゴールに達したらその旨を表示する. # ただし,マス目の数分だけ移動してもゴールに達しない場合はその時点で終了する. # # 入力形式は、 # # %> ./a.out 00+0+ +000+ 0++00 00+00 +0000 # # とする. '例えば下図に示すように,通行可能なマス目に'0'が, 障害物があって通行不能なマス目に'+'が記されている盤がある. 盤の左上をスタート地点,右下をゴール地点として,経路を表示する プログラムを作りなさい. 盤の例 0 0 + 0 + + 0 0 0 + 0 + + 0 0 0 0 + 0 0 + 0 0 0 0 例えばこのようなアルゴリズムが考えられる. 1) 現在位置を表示の後、進行方向に対して,右に進めるなら右に, そうでなければ直進,それもだめなら左に,さらにそれもダメなら後退する. 2) 1を繰り返してゴールに達したらその旨を表示する. ただし,マス目の数分だけ移動してもゴールに達しない場合はその時点で終了する. 入力形式は、 %> ./a.out 00+0+ +000+ 0++00 00+00 +0000 とする.'(X) :- abolish(経路/2), 経路盤を描く(X). 経路探索((1,1),_終点,[(1,1)],X). 経路盤を描く(X) :- write('盤面を一行で入力しなさい '), 行入力(_行), 経路盤を描く(_行,_終点). 経路探索(_終点,_終点,Log,Log) :- !. 経路探索(A,_終点,Log,X) :- 経路(A,B), \+(member(B,Log)), 経路探索(B,_終点,[B|Log],X),!. 経路探索(A,_終点,Log,X) :- 経路(B,A), \+(member(B,Log)), 経路探索(B,_終点,[B|Log],X),!. 経路盤を描く(_行,(N,M)) :- 項目区切り(_行,[' '],L), findall(L1,(member(A,L),atom_chars(A,L1)),Ls), length(Ls,N), t340_2(1,Ls), 行列の転置(Ls,Ls2), length(Ls2,M), t340_3(1,Ls2),!. t340_2(_,[]) :- !. t340_2(N,[L|R]) :- t340_2_1(N,1,L), N2 is N + 1, t340_2(N2,R). t340_2_1(_,_,[_]) :- !. t340_2_1(N,M,['+'|R]) :- M2 is M + 1, t340_2_1(N,M2,R),!. t340_2_1(N,M,[A,B|R]) :- not(A='+'), not(B='+'), M2 is M + 1, assertz(経路((N,M),(N,M2))), t340_2_1(N,M2,[B|R]),!. t340_2_1(N,M,[A,B|R]) :- not(A='+'), B='+', M2 is M + 1, t340_2_1(N,M2,[B|R]),!. t340_3_1(_,_,[_]) :- !. t340_3_1(N,M,['+'|R]) :- M2 is M + 1, t340_3_1(N,M2,R),!. t340_3_1(N,M,[A,B|R]) :- not(A='+'), not(B='+'), M2 is M + 1, assertz(経路((M,N),(M2,N))), t340_3_1(N,M2,[B|R]),!. t340_3_1(N,M,[A,B|R]) :- not(A='+'), B='+', M2 is M + 1, t340_3_1(N,M2,[B|R]),!. 行入力(_行) :- read_line_to_codes(current_input,_コードならび), atom_codes(_行,_コードならび). 項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,_区切られた文字列ならび),!. 項目区切り(_文字列,_,[_文字列]). 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,[_前文字列|R]) :- '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 項目区切り(_後文字列,_区切り文字列ならび,R). '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字列ならび). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 文字列ならびの中で数値に変換可能なものは変換する(_文字列ならび,_項目ならび) :- findall(_項目,( 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目)),_項目ならび). 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目) :- member(_文字列,_文字列ならび), 数値に変換可能なものは変換する(_文字列,_項目). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列).