このディレクトリの索引

% 以下のサイトは # 出典 :: ★★ Java の宿題ここで答えます Part 69 ★★ #415 # 【 課題 】 # 生徒の成績を管理するプログラムを作成する。 # 生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。 # 内容は # 数学:70 # 英語:80 # 国語:75 # 理科:80 # 社会:60 # となっている # このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】8/10 # 【 Ver  】1.6.0_06 # 【 補足 】 # # '生徒の成績を管理するプログラムを作成する。 生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。 内容は 数学:70 英語:80 国語:75 理科:80 社会:60 となっている このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する' :- '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。'(_テキストファイル名ならび), '指定した科目と点数を得る'(_指定した科目,_指定した点数), 指定した科目で指定した点数の存在する生徒の出席番号を全て表示する(_テキストファイル名ならび,_指定した科目,_指定した点数). '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。'(_テキストファイル名ならび) :- shs('ls -N *.txt',_テキストファイル名ならび). '指定した科目と点数を得る'(_指定した科目,_指定した点数) :- '指定した科目を得る。科目名は数学、英語、国語、社会、理科のどれか'(_指定した科目), '指定した点数を得る。点数は整数。'(_指定した点数). 指定した科目で指定した点数の存在する生徒の出席番号を全て表示する([],_,_) :- !. 指定した科目で指定した点数の存在する生徒の出席番号を全て表示する(_テキストファイル名,_指定した科目,_指定した点数) :- 指定した科目で指定した点数の生徒の場合は出席番号を表示して行く(_テキストファイル名,_指定した科目,_指定した点数). 指定した科目で指定した点数の生徒の場合は出席番号を表示して行く([_テキストファイル名|R],_指定した科目,_指定した点数) :- 指定した科目で指定した点数の生徒の場合は出席番号を表示する([_テキストファイル名|R],_指定した科目,_指定した点数), 指定した科目で指定した点数の存在する生徒の出席番号を全て表示する(R,_指定した科目,_指定した点数). 指定した科目で指定した点数の生徒の場合は出席番号を表示する(_テキストファイル名,_指定した科目,_指定した点数) :- forall(指定した科目で指定した点数の(_テキストファイル名,_指定した科目,_指定した点数), 生徒の出席番号を表示する(_テキストファイル名)). 指定した科目で指定した点数の(_テキストファイル名,_指定した科目,_指定した点数) :- get_split_lines(_テキストファイル名,[' ',':'],_行ならび), member([_指定した科目,_指定した点数],_行ならび). 生徒の出席番号を表示する(_テキストファイル名) :- 'テキストファイル名から.txtを取り除いたものが生徒の出席番号'(_テキストファイル,_生徒の出席番号), writef('%w\n',[_生徒の出席番号]). 'テキストファイル名から.txtを取り除いたものが生徒の出席番号'(_テキストファイル名,_生徒の出席番号) :- sub_atom(_テキストファイル名,_生徒の出席番号,'.txt',''). '科目を得る。科目は数学、英語、国語、理科、社会のどれか'(_指定した科目) :- repeat, '科目を得る。'(_科目), '科目は数学、英語、国語、理科、社会のどれか'(_科目),!. '科目を得る。'(_科目) :- write('科目を入力してください : '), 行入力(_科目). '科目は数学、英語、国語、理科、社会のどれか'(_科目) :- member(_科目,[数学,英語,国語,理科,社会]). '指定した点数を得る。点数は整数。'(_指定した点数) :- repeat, 整数を得る('点数(整数)を入力してください : ',true,_指定した点数),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). get_split_lines(File,Sep,Lines) :- get_lines(File,Lines1), findall(Line,(member(A,Lines1) , split(A,Sep,Line)),Lines). get_lines(File,Lines) :- see(File), findall(_行,(repeat,(at_end_of_stream(current_input),!,fail;行入力(_行))),Lines), seen. sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,E,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,E,0,_後文字列). shs(Command,X) :- popen(Command,L), shs_2(L,X). shs_2([],[]) :- !. shs_2(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_2(R1,R),!. shs_2(L,[S]) :- atom_chars(S,L). popen(Command,Chars) :- open(pipe(Command),read,Instream), sh_chars(Instream,Chars), close(Instream),!. sh_chars(Instream,[]) :- at_end_of_stream(Instream),!. sh_chars(Instream,[Char|R]) :- get_char(Instream,Char), sh_chars(Instream,R). sh_codes(Instream,[]) :- at_end_of_stream(Instream),!. sh_codes(Instream,[Code|R]) :- get_code(Instream,Code), sh_codes(Instream,R). % *** user: split / 3 *** % ?- split('a\n\nbc\n',['\n'],X). % % X = [a,bc] % split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z), X = Z,!. % *** user: sPlit / 3 *** % ?- sPlit('a\n\nbc\n',['\n'],X). % % X = [a,'',bc]. % sPlit(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L),\+(member(U,_区切り符号ならび))),Z), X = Z,!. % *** user: sPLIT / 3 *** % ?- sPLIT('a\n\nbc\n',['\n'],X). % % X = [a,'\n','\n',bc,'\n'] % sPLIT(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z) X = Z,!. % *** user: 'SPLIT' / 3 *** % ?- 'SPLIT'('a\n\nbc\n',['\n'],X). % % X = [a,'\n','','\n',bc,'\n']. % 'SPLIT'(_文字列,_区切り符号ならび,X) :- split_0(_文字列,_区切り符号ならび,X),!. split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L). split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号ならび,L). '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,L),!. '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,[_文字列]) :- '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび). '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,['',_文字列,'']) :- member(_文字列,_区切り符号ならび),!. '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_文字列,_,_,_,_区切り符号))). '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号ならび,[_前文字列,_区切り符号|R]) :- sub_atom(_文字列,_前文字列,_区切り符号,_後文字列), member(_区切り符号,_区切り符号ならび), 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび), split_0(_後文字列,_区切り符号ならび,R). 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_前文字列,_,_,_,_区切り符号))). 整数を得る(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数入力に失敗した時は再試行する(_催促文,_条件,_整数). 整数入力に失敗した時は再試行する(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数), 条件を実行する(_行,_整数,_条件). '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数) :- 催促文の表示(_催促文), 行入力(_行), 整数入力検査(_行,_整数). 催促文の表示(_催促文) :- writef('%w',[_催促文]). 整数入力検査(_行,_整数) :- 行を解析して整数を得る(_行,_整数). 整数入力検査(_行,_) :- 整数を得られなかったらそのことを表示してfail(_行). 行を解析して整数を得る(_行,_整数) :- 行を解析して(_行,_整数), それが整数であることを確認する(_整数). 行を解析して(_行,_整数) :- catch(read_term_from_atom(_行,_整数,[]),E,fail). それが整数であることを確認する(_整数) :- integer(_整数). 整数を得られなかったらそのことを表示してfail(_行) :- writef('入力された行 %w からは整数が得られませんでした。再入力をお願いします。\n',[_行]), fail. 条件を実行する(_行,_整数,_条件) :- catch(_条件,E,fail). 条件を実行する(_行,_整数,_条件) :- writef('%w から得た整数 %w は、条件 %w を満たしません。再入力をお願いします。\n',[_行,_整数,_条件]), fail. % 以下のサイトは # 出典 :: ★★ Java の宿題ここで答えます Part 69 ★★ #415 # 【 課題 】 # 生徒の成績を管理するプログラムを作成する。 # 生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。 # 内容は # 数学:70 # 英語:80 # 国語:75 # 理科:80 # 社会:60 # となっている # このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】8/10 # 【 Ver  】1.6.0_06 # 【 補足 】 # # '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。 このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する' :- '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。'(L1), '指定した科目と点数を得る'(_指定した科目,_指定した点数), 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'(L1,_指定した科目,_指定した点数). '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。'(L1) :- shs('ls -N *.txt',L1). '指定した科目と点数を得る'(_指定した科目,_指定した点数) :- '指定した科目を得る。科目名は数学、英語、国語、社会、理科のどれか'(_指定した科目), '指定した点数を得る。点数は整数。'(_指定した点数). 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'([],_,_). 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'([_テキストファイル名|R1],_指定した科目,_指定した点数) :- 指定した科目で指定した点数の生徒の出席番号を表示する(_テキストファイル名,_指定した科目,_指定した点数,_生徒の出席番号). 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'([_|R1],_指定した科目,_指定した点数) :- 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'(R1,_指定した科目,_指定した点数). 指定した科目で指定した点数の生徒の出席番号を表示する(_テキストファイル名,_指定した科目,_指定した点数,_生徒の出席番号) :- get_split_lines(_テキストファイル名,[' ',':'],L), member([_指定した科目,_指定した点数],L), 'テキストファイル名から.txtを取り除いたものが生徒の出席番号'(_テキストファイル,_生徒の出席番号), writef('%w\n',[_生徒の出席番号]). 'テキストファイル名から.txtを取り除いたものが生徒の出席番号'(_テキストファイル名,_生徒の出席番号) :- sub_atom(_テキストファイル名,_生徒の出席番号,'.txt',''). '科目を得る。科目は数学、英語、国語、理科、社会のどれか'(_指定した科目) :- repeat, '科目を得る。'(_科目), '科目は数学、英語、国語、理科、社会のどれか'(_科目),!. '科目を得る。'(_科目) :- write('科目を入力してください : '), 行入力(_科目). '科目は数学、英語、国語、理科、社会のどれか'(_科目) :- member(_科目,[数学,英語,国語,理科,社会]). '指定した点数を得る。点数は整数。'(_指定した点数) :- repeat, 整数を得る('点数(整数)を入力してください : ',true,_指定した点数),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). get_split_lines(File,Sep,Lines) :- get_lines(File,Lines1), findall(Line,(member(A,Lines1) , split(A,Sep,Line)),Lines). get_lines(File,Lines) :- see(File), findall(_行,(repeat,(at_end_of_stream(current_input),!,fail;行入力(_行))),Lines), seen. sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,E,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,E,0,_後文字列). shs(Command,X) :- popen(Command,L), shs_2(L,X). shs_2([],[]) :- !. shs_2(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_2(R1,R),!. shs_2(L,[S]) :- atom_chars(S,L). popen(Command,Chars) :- open(pipe(Command),read,Instream), sh_chars(Instream,Chars), close(Instream),!. sh_chars(Instream,[]) :- at_end_of_stream(Instream),!. sh_chars(Instream,[Char|R]) :- get_char(Instream,Char), sh_chars(Instream,R). sh_codes(Instream,[]) :- at_end_of_stream(Instream),!. sh_codes(Instream,[Code|R]) :- get_code(Instream,Code), sh_codes(Instream,R). % *** user: split / 3 *** % ?- split('a\n\nbc\n',['\n'],X). % % X = [a,bc] % split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z), X = Z,!. % *** user: sPlit / 3 *** % ?- sPlit('a\n\nbc\n',['\n'],X). % % X = [a,'',bc]. % sPlit(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L),\+(member(U,_区切り符号ならび))),Z), X = Z,!. % *** user: sPLIT / 3 *** % ?- sPLIT('a\n\nbc\n',['\n'],X). % % X = [a,'\n','\n',bc,'\n'] % sPLIT(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z) X = Z,!. % *** user: 'SPLIT' / 3 *** % ?- 'SPLIT'('a\n\nbc\n',['\n'],X). % % X = [a,'\n','','\n',bc,'\n']. % 'SPLIT'(_文字列,_区切り符号ならび,X) :- split_0(_文字列,_区切り符号ならび,X),!. split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L). split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号ならび,L). '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,L),!. '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,[_文字列]) :- '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび). '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,['',_文字列,'']) :- member(_文字列,_区切り符号ならび),!. '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_文字列,_,_,_,_区切り符号))). '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号ならび,[_前文字列,_区切り符号|R]) :- sub_atom(_文字列,_前文字列,_区切り符号,_後文字列), member(_区切り符号,_区切り符号ならび), 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび), split_0(_後文字列,_区切り符号ならび,R). 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_前文字列,_,_,_,_区切り符号))). 整数を得る(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数入力に失敗した時は再試行する(_催促文,_条件,_整数). 整数入力に失敗した時は再試行する(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数), 条件を実行する(_行,_整数,_条件). '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数) :- 催促文の表示(_催促文), 行入力(_行), 整数入力検査(_行,_整数). 催促文の表示(_催促文) :- writef('%w',[_催促文]). 整数入力検査(_行,_整数) :- 行を解析して整数を得る(_行,_整数). 整数入力検査(_行,_) :- 整数を得られなかったらそのことを表示してfail(_行). 行を解析して整数を得る(_行,_整数) :- 行を解析して(_行,_整数), それが整数であることを確認する(_整数). 行を解析して(_行,_整数) :- catch(read_term_from_atom(_行,_整数,[]),E,fail). それが整数であることを確認する(_整数) :- integer(_整数). 整数を得られなかったらそのことを表示してfail(_行) :- writef('入力された行 %w からは整数が得られませんでした。再入力をお願いします。\n',[_行]), fail. 条件を実行する(_行,_整数,_条件) :- catch(_条件,E,fail). 条件を実行する(_行,_整数,_条件) :- writef('%w から得た整数 %w は、条件 %w を満たしません。再入力をお願いします。\n',[_行,_整数,_条件]), fail. % 以下のサイトは # # sudo ifdown _有線LANのデバイス; ネットワーク設定ファイルに追加する ; sudo ifup _有線LANのデバイス # ネットワーク設定ファイルに追加してデバイスを起動する(_有線LANのデバイス,_固定IPアドレス,_ネットマスク,_ブロードキャスト,_ゲートウェイ) :- デバイスを停止する(_有線LANのデバイス), ネットワーク設定ファイルに追加する(_有線LANのデバイス,_固定IPアドレス,_ネットマスク,_ブロードキャスト,_ゲートウェイ), デバイスを起動する(_有線LANのデバイス). デバイスを停止する(_有線LANのデバイス) :- atomic_list_concat(['sudo,ifdown',_有線LANのデバイス],' ',_ifdown), shell(_ifdown,_). デバイスを起動する(_有線LANのデバイス) :- atomic_list_concat(['sudo,ifup',_有線LANのデバイス],' ',_ifup), shell(_ifup,_). ネットワーク設定ファイルに追加する(_有線LANのデバイス,_固定IPアドレス,_ネットマスク,_ブロードキャスト,_ゲートウェイ) :- open('/etc/network/interfaces',append,Outstream), ネットワーク設定ファイルに追加する(Outstream,_有線LANのデバイス,_固定IPアドレス,_ネットマスク,_ブロードキャスト,_ゲートウェイ), close(Outstream). ネットワーク設定ファイルに追加する(Outstream,_有線LANのデバイス,_固定IPアドレス,_ネットマスク,_ブロードキャスト,_ゲートウェイ) :- 固定IPアドレスとネットマスクの追加(Outstream,_有線LANのデバイス,_固定IPアドレス,_ネットマスク), ブロードキャストとゲートウェイとDNSの追加(Outstream,_ブロードキャスト,_ゲートウェイ), システムの起動時にデバイスを有効にする(Outstream,_有線LANのデバイス). 固定IPアドレスとネットマスクの追加(Outstream,_有線LANのデバイス,_固定IPアドレス,_ネットマスク) :- 有線LANのデバイスの追加(Outstream,_有線LANのデバイス), 固定IPアドレスの追加(Outstream,_固定IPアドレス), ネットマスクの追加(Outstream,_ネットマスク). 有線LANのデバイスの追加(Outstream,_有線LANのデバイス) :- writef(Outstream,'iface %w inet static\n',[_有線LANのデバイス]). 固定IPアドレスの追加(Outstream,_固定IPアドレス) :- writef(Outstream,'address %w\n',[_固定IPアドレス,_ネットマスク]). ネットマスクの追加(Outstream,_ネットマスク) :- writef(Outstream,'netmask %w\n',[_ネットマスク]). ブロードキャストとゲートウェイとDNSの追加(Outstream,_ブロードキャスト,_ゲートウェイ) :- ブロードキャストの追加(Outstream,_ブロードキャスト), ゲートウェイの追加(Outstream,_ゲートウェイ), 'DNSの追加'(Outstream). ブロードキャストの追加(Outstream,_ブロードキャスト) :- writef(Outstream,,'broadcast %w\n',[_ブロードキャスト]). ゲートウェイの追加(Outstream,_ゲートウェイ) :- swritef(Outstream,'broadcast %w\n',[_ゲートウェイ]). 'DNSの追加'(Outstream) :- write(Outstream,'dns-nameservers 8.8.8.8\n'). システムの起動時にデバイスを有効にする(Outstream,_有線LANのデバイス) :- writef(Outstream,'auto %w\n',[_有線LANのデバイス]). writef(Stream,P,L) :- swritef(A,P,L), write(Stream,A). % 以下のサイトは # 出典 :: どんなプログラム言語でも覚える時にの共通習得仕様:15項目 prologでは(1,'Hello World表示', 'どんな方法でもいいので、その言語を書ける基盤が整っていて、print出来る証 そしてプログラムを実行できる環境構築が出来る証') :- true. prologでは(2,for文, 'プログラムの醍醐味は、繰り返しを端的に行える事にある。 人間が手作業でやると、タイムロスや失敗が生まれるが、バグの無いプログラムは無敵である。 上記、printと組み合われるとアウトプットも可能。') :- fail. prologでは(3,if文, '上記for文と組み合わせると、既に条件分岐による大量処理が可能となる。 先ずは簡単なif文から書いてみよう。 条件演算も、言語により特性が違うので、一通り出来る事。 同じ、異なる、型、文字比較') :- fail. prologでは(4,ファイル読み込み, 'テキストファイルのデータを取得してみよう。 csvデータから、簡単なレポート資料が作れるようになる。 読み込み時の形式は、行単位のレコード方式で行うと汎用性が増す。') :- true. prologでは(5,ファイル書き込み, '行区切りのレコード追記型で、ファイルアクセスして、データ追記を行う。 言語によっては、ファイルを壊してしまう恐れもあるので機能を習得しよう。') :- true. prologでは(6,'ファイル・ディレクトリ操作', 'ディレクトリの作成 ファイル名の変更 新規ファイル作成 これによりOSや他言語(ツール)などとの連携が柔軟にできるようになる。') :- true. prologでは(7,計算における演算, '+ , ? , × , ÷ , 余り、乗算 確率や、合計などが柔軟に出せるようにするのがポイント。') :- true. prologでは(8,文字列操作, 'split、join、文字検索、文字置換、連結、型変換、正規表現対応') :- fail. prologでは(9,配列, '多次元配列、連想配列、配列データの削除、jsonデータの扱い、xmlデータの扱い、csvデータの扱い') :- fail. prologでは(10,正規表現, '行マタギが可能か? どのレベルまでの判定が出来るか確認。 他の言語とコピペ出来るか?') :- fail. prologでは(11,関数, 'class、無名関数、返り値の制限 ライブラリの活用') :- fail. prologでは(12,プログラムのファイル読み込み, 'include,requireが出来るか?上記ライブラリと同じ オブジェクト志向の構成がどのレベルで行えるかを見極められるとベスト') :- true. prologでは(13,他言語連動, 'サーバで実行するのであれば、shellやawkを実行して、返り値を得られるか。 この環境を整えられるとほぼ無敵になる。') :- true. prologでは(14,プログラム負荷計算, '言語を実行する際の負荷を測定する(できれば多言語との比較などができるとベスト) サービスの安定運用など非常に上位の構築を行うことができるようになる。') :- fail. prologでは(15,複数環境における実行環境,'') :- true. % 以下のサイトは # [1] 授業単元:プログラミング基礎II # [2] 問題文(含コード&リンク): # 課題: #  double値を10進数表示せよ。 # 対象: #  C言語 # 制約: #  ・出力にはfputc()またはputc()またはputchar()を使うこと。 #  ・printf系の書式変換を一切使ってはならない。 #  ・C標準ライブラリ以外のライブラリの使用は禁止する。 #  ・system()による外部プロセスの利用も禁止する。 # # [3] 環境 #  [3.1] OS: Windows #  [3.2] コンパイラ名とバージョン: Visual Studio 2010 #  [3.3] 言語: C # [4] 期限: 2014年05月31日まで # [5] その他の制限: プログラミング基礎I で基本的なところ(入門書1冊丸々程度)は終了してます 'double値を10進数表示せよ。'(_double値) :- _float_integer_part is float_integer_part(_double値), _float_fractional_part is float_fractional_part(_double値), 小数点以上のならび(_float_integer_part,[],_少数点以上のならび), 小数点以下のならび(_float_fractional_part,_少数点以下のならび), '10進数表示せよ。'(_少数点以上のならび,_少数点以下のならび). 小数点以上のならび(0.0,L,L) :- !. 小数点以上のならび(V,L1,L) :- N is truncate(V) mod 10, V is V / 10, 小数点以上のならび(V_1,[N|L1],L). 小数点以下のならび(0.0,[]) :- !. 小数点以下のならび(V,[N|R]) :- N is truncate(V * 10), V_1 is float_fractional_part(V * 10), 小数点以下のならび(V_1,R). '10進数表示せよ。'(_少数点以上のならび,_少数点以下のならび) :- atomic_list_concat(_少数点以上のならび,_少数点以上表示), atomic_list_concat(_少数点以下のならび,_少数点以下表示), writef('%t.%t\n',[_少数点以上表示,_少数点以下表示]). % 以下のサイトは mecab(文,_文,LL) :- tmpnam(TMPNAM), tell(TMPNAM), writef('%t\n',[_文]), told, mecab(TMPNAM,LL). mecab(_ファイル,LL) :- atomic_list_concat(['cat ',_ファイル,' | mecab'],S), sh(S,LL_1), findall([S1,S3],( member([U|_],LL_1), sub_atom(U,_,_,_,S1,'\t',S3,_,_,_)), LL). 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). mecab(_ファイル,LL) :- atomic_list_concat(['cat ',_ファイル,' | mecab'],S), sh(S,LL_1), findall([S1,S3],( member([U|_],LL_1), sub_atom(U,S1,'\t',S3)), LL). sh(Command,X) :- shs(Command,Y), findall(U,( member(V,Y), split(V,[' ',','],U)), X). split(_文字列,_区切り文字ならび,L) :- atom_chars(_文字列,_文字ならび), split_list(_文字ならび,_区切り文字ならび,L). split_list([],_,[]). split_list(L1,_区切り文字ならび,[_文字列|R]) :- split_list_2(_区切り文字ならび,L1,_文字列), split_list(L3,_区切り文字ならび,R),!. split_list(L1,_区切り文字ならび,[_文字列]) :- atom_chars(_文字列,L1). split_list_2(_区切り文字ならび,L,_文字列,L3) :- append(L1,L2,L3,L), member(_区切り文字,_区切り文字ならび), split_list_3(_区切り文字,L1,L2,L3), atom_chars(_文字列,L1),!. split_list_3(_区切り文字,L1,L2,L3) :- all(L2,_区切り文字), \+(append(_,[_区切り文字],L1)), \+(L3 = [_区切り文字|_]),!. tmpnam(TMPNAM) :- 'TMPNAM'(TMPNAM), \+(exist_file(TMPNAM)),!. tmpnam(TMPNAM) :- tmpnam(TMPNAM). 'TMPNAM'(TMPNAM) :- '英小文字大文字数字からなる6要素の文字ならび'(_6要素の文字ならび), atomic_list_concat(['/tmp/file'|_6要素の文字ならび],TMPNAM). '英小文字大文字数字からなる6要素の文字ならび'(_6要素の文字ならび) :- findall(_任意の文字,( between(1,6,_), '英小文字大文字数字から任意の文字'(_任意の文字)), _6要素の文字ならび). '英小文字大文字数字から任意の文字'(_任意の文字) :- _文字コード is random(75) + 48, '文字コード48-122の範囲で記号のコードではない'(_文字コード), char_code(_任意の文字,_文字コード),!. '英小文字大文字数字から任意の文字'(_任意の文字) :- '英小文字大文字数字から任意の文字'(_任意の文字). '文字コード48-122の範囲で記号のコードではない'(_文字コード) :- '文字コード範囲58-64ではない'(_文字コード), '文字コード範囲91-96ではない'(_文字コード). '文字コード範囲58-64ではない'(_文字コード) :- \+((_文字コード>=58,_文字コード=<64)). '文字コード範囲91-96ではない'(_文字コード) :- \+((_文字コード>=91,_文字コード=<96)). sub_atom(A,H,X,T) :- atom(A), sub_atom(A,S,L,R,X), sub_atom(A,0,S,_,H), sub_atom(A,_,R,0,T). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1392388003/270 # [1] 授業単元:プログラミング基礎 # [2] 問題文(含コード&リンク):入力した1桁の整数を行数と解釈し、その後、その行数分だけキーボードから入力された # 文字をディスプレイに出力する。 # [条件1]整数(行数)入力にはgetchar関数を使用する。 # [条件2]行数入力後の文字入出力にはgetchar関数とputchar関数を使用する。 # [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。 # [3] 環境 #  [3.1] OS:Windows7 #  [3.2] コンパイラ名とバージョン:gcc 3.4 #  [3.3] 言語: C # [4] 期限:2014/03/30 '入力した1桁の整数を行数と解釈し、その後、その行数分だけキーボードから入力された文字をディスプレイに出力する。 [条件1]整数(行数)入力にはgetchar関数を使用する。 [条件2]行数入力後の文字入出力にはgetchar関数とputchar関数を使用する。 [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。' :- '入力した1桁の整数を行数と解釈し、 [条件1]整数(行数)入力にはgetchar関数を使用する。 [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。'(_行数), 'その後、', 'その行数分だけキーボードから入力された文字をディスプレイに出力する。 [条件2]行数入力後の文字入出力にはgetchar関数とputchar関数を使用する。'(_行数),!. '入力した1桁の整数を行数と解釈し、 [条件1]整数(行数)入力にはgetchar関数を使用する。 [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。'(_行数) :- '入力した1桁の整数を [条件1]整数(行数)入力にはgetchar関数を使用する。 [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。'(_入力した1桁の整数), 行数と解釈し(_入力した1桁の整数,_行数). '入力した1桁の整数を [条件1]整数(行数)入力にはgetchar関数を使用する。 [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。'(_入力した1桁の整数) :- '入力した1桁の整数を [条件1]整数(行数)入力にはgetchar関数を使用する。'(_入力した1桁の整数),!. '入力した1桁の整数を [条件1]整数(行数)入力にはgetchar関数を使用する。 [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。'(_入力した1桁の整数) :- write('Input error 再入力をお願いします\n'), '入力した1桁の整数を [条件1]整数(行数)入力にはgetchar関数を使用する。 [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。'(_入力した1桁の整数). '入力した1桁の整数を [条件1]整数(行数)入力にはgetchar関数を使用する。'(_入力した1桁の整数) :- 行入力(_行文字列), get_term_from_atom(_行文字列,_入力した1桁の整数,[]), integer(_入力した1桁の整数), number_chars(_入力した1桁の整数,[_]),!. 行数と解釈し(_入力した1桁の整数,_行数) :- _入力した1桁の整数 = _行数. 'その後、'. 'その行数分だけキーボードから入力された文字をディスプレイに出力する。 [条件2]行数入力後の文字入出力にはgetchar関数とputchar関数を使用する。'(_行数) :- reawmode, between(1,_行数,_行目), 'キーボードから入力された文字をディスプレイに出力する。 [条件2]行数入力後の文字入出力にはgetchar関数とputchar関数を使用する。', _行目 = _行数, norawmode. 'キーボードから入力された文字をディスプレイに出力する。 [条件2]行数入力後の文字入出力にはgetchar関数とputchar関数を使用する。' :- repeat, get_char(_文字), put_char(_文字), _文字 = '\n',!. 行入力(_行文字列) :- get_char(_文字), 行文字ならび(_文字,_行文字ならび), atom_chars(_行文字列,_行文字ならび). 行文字ならび(end_of_file,[]) :- !. 行文字ならび('\n',[]) :- !. 行文字ならび(_文字,[_文字|R]) :- get_char(_次の文字), 行文字ならび(_次の文字,R). rawmode :- shell('stty raw -echo',_). norawmode :- shell('stty -raw echo',_). % 以下のサイトは # # シェル経由の他言語インターフェイス shs/3 です。 # shs(Command,_コマンドへの入力ならび,_コマンドからの出力ならび) :- popen(Command,Outstream,Instream), コマンドへの入力(Outstream,_コマンドへの入力ならび), close(Outstream), コマンドからの出力の収集(Instream,_コマンドからの出力ならび), close(Instream). popen(Command,Outstream,Instream) :- open(pipe(Command),write,Outstream), open(pipe(Outstream),read,Instream). コマンドへの入力(Outstream,_コマンドへの入力ならび) :- tell(Outstream), forall(member(_入力行,_コマンドへの入力ならび),writef('%t\n',[_入力行])), told. コマンドからの出力の収集(Instream,[]) :- at_end_of_stream(Instream),!. コマンドからの出力の収集(Instream,[_行|R]) :- get_line(Instream,_行), コマンドからの出力の収集(Instream,R). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,C,[C]) :- at_end_of_stream(Stream),!. get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). % 以下のサイトは shs(Command,X) :- popen(Command,L), shs_2(L,X). shs_2([],[]) :- !. shs_2(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_2(R1,R),!. shs_2(L,[S]) :- atom_chars(S,L). 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). % 以下のサイトは 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). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/542 # イマイチ出力や入力、パイプについて深く理解できなかったので質問します # よろしくお願いします。 # # [1] システムプログラム # [2] 一般の実行プログラムである/usr/bin/lessを子プロセスとして起動して、pipeを通して子プロセスの標準入力にデータ(複数行のテキスト)を渡すプログラムを作りなさい。 # '一般の実行プログラムである/usr/bin/lessを子プロセスとして起動して、 pipeを通して子プロセスの標準入力にデータ(複数行のテキスト)を渡すプログラムを作りなさい。'(_複数行のならび) :- '一般の実行プログラムを子プロセスとして起動して、 pipeを通して子プロセスの標準入力にデータ(複数行のテキスト)を渡す'('/usr/bin/less',_複数行ならび). '一般の実行プログラムを子プロセスとして起動して、 pipeを通して子プロセスの標準入力にデータ(複数行のテキスト)を渡す'(_実行プログラム,_複数行ならび) :- atomic_list_concat(_複数行ならび,'\n',_文字列), atom_chars(_文字列,_文字ならび), popen(_実行プログラム,_文字ならび). 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). % 以下のサイトは # # お題:テキストファイルを読み込み、その中で最もよく使われている単語ベスト3を表示するプログラム # 'テキストファイルを読み込み、その中で最もよく使われている単語ベスト3を表示する'(_テキストファイル) :- テキストファイルを読み込み(_テキストファイル,_文), 'その中で最もよく使われている単語ベスト3を表示する'(_文). テキストファイルを読み込み(_テキストファイル,_文) :- get_lines(_テキストファイル,_行ならび), atomic_list_concat(_行ならび,_文). 'その中で最もよく使われている単語ベスト3を表示する'(_文) :- 形態素解析(文,_文,_形態素ならび), 最もよく使われている単語ベスト3を(_形態素ならび,_最もよく使われている単語ベスト3), 表示する(_最もよく使われている単語ベスト3). その中で最もよく使われている単語ベスト3を(_形態素ならび,[_単語1,_単語2,_単語3]) :- setof(A,member(A,_形態素ならび),_単語ならぴ), findall([_度数,_単語],( member(_単語,_単語ならび), count(_単語,_形態素ならび,_度数)), LL), sort(LL,_整列したLL), append(_,[[_,_単語3],[_,_単語2],[_,_単語1]],_整列したLL). 表示する([_単語1,_単語2,_単語3]) :- writef('%t %t %t\n',[_単語1,_単語2,_単語3]). count(P,N) :- findsum(1,P,F), N is truncate(F). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum_list(_値ならび,_合計値),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 形態素解析サーバー(mecab). 形態素解析([],[]) :-!. 形態素解析([['EOS'|_]|_],[]) :-!. 形態素解析([[A|_],[@,B|_]|R],[R1_1|R3]) :- 形態素解析_2(R,R1,R2), 形態素解析_2_重複削除([A,B|R1],[],R1_1), 形態素解析(R2,R3),!. 形態素解析([[A|_]|R],[B|R2]) :- 形態素解析サーバー(mecab), make_list(A,['\t'],AL), AL = [B|_], 形態素解析(R,R2),!. 形態素解析([[A|_]|R],[A|R2]) :- 形態素解析サーバー(juman), 形態素解析(R,R2),!. 形態素解析_2([],[],[]) :- !. 形態素解析_2([[A|R1]|R],[],[[A|R1]|R]) :- \+(A = (@)),!. 形態素解析_2([[@,A|_]|R],[A|R2],R3) :- 形態素解析_2(R,R2,R3),!. 形態素解析_2_重複削除([],L1,L) :- reverse(L1,L),!. 形態素解析_2_重複削除([A|R],Y,X) :- member(A,Y), 形態素解析_2_重複削除(R,Y,X),!. 形態素解析_2_重複削除([A|R],Y,X) :- \+(member(A,Y)), 形態素解析_2_重複削除(R,[A|Y],X). 形態素解析(ファイル,_テキストファイル,L) :- 形態素解析サーバー(_形態素解析サーバー), concat(['cat ',_テキストファイル,' | ',_形態素解析サーバー],S), sh(S,L1), 形態素解析(L1,L2), 形態素解析_3(L2,L). 形態素解析(文,S,L) :- tmpnam(_仮のファイル), tell(_仮のファイル), wr('%t',[S]), told, 形態素解析(ファイル,_仮のファイル,L) . 形態素解析_3([],[]). 形態素解析_3([A|R],[A|R2]) :- \+(list(A)), 形態素解析_3(R,R2) . 形態素解析_3([A|R],[B|R2]) :- list(A), member(B,A), 形態素解析_3(R,R2). system(Command,X) :- shell(Command,X). system(Command) :- shell(Command). 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). sh(Command,X) :- shs(Command,Y), findall(U,( member(V,Y) , split(V,[' ',','],U)), X). 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). tmpnam(TMPNAM) :- 乱数からTMPNAMを得る(TMPNAM),!. tmpnam(TMPNAM) :- tmpnam(TMPNAM). 乱数からTMPNAMを得る(TMPNAM) :- アルファベットに変換([_1,_2,_3,_4,_5,_6]), atomic_list_concat(['/tmp/file'|[_1,_2,_3,_4,_5,_6]],TMPNAM), \+(exists_file(TMPNAM)). アルファベットに変換([]). アルファベットに変換([A|R]) :- C is random(62), アルファベットに変換の二(C,A), アルファベットに変換(R). アルファベットに変換の二(N,A) :- '基数62のコード・アルファベットコード変換表'(S,E,B), between(S,E,N), C is N - S + B, char_code(A,C). '基数62のコード・アルファベットコード変換表'(0,9,48). '基数62のコード・アルファベットコード変換表'(10,35,65). '基数62のコード・アルファベットコード変換表'(36,60,97). % 以下のサイトは ある文字数以上の単語をすべて抽出する(_ある文字数以上の単語ならび) :- 形態素解析(_文字列,_形態素ならび), findall(_ある文字数以上の単語,( member(_ある文字数以上の単語,_形態素ならび), atom_length(_ある文字数以上の単語,_文字数), _文字数 >= _ある文字数), _ある文字数以上の単語ならび). 形態素解析(S,L) :- tmpnam(F), tell(F), writef('%t',[S]), told, 形態素解析サーバによる形態素解析(ファイル,F,L) . 形態素解析サーバによる形態素解析(_ファイル名,_形態素ならび) :- 形態素解析サーバー(_形態素解析サーバー), atomic_list_concat(['cat ',_ファイル名,' | ',_形態素解析サーバー],S), sh(S,L1), 形態素解析(L1,L2), 形態素解析_3(L2,L). 形態素解析_1([],[]) :- !. 形態素解析_1([['EOS'|_]|_],[]) :- !. 形態素解析_1([[A|_],[@,B|_]|R],[R1_1|R3]) :- 形態素解析_2(R,R1,R2), 形態素解析_2_重複削除([A,B|R1],[],R1_1), 形態素解析_1(R2,R3),!. 形態素解析_1([[A|_]|R],[B|R2]) :- mecabサーバーによる形態素解析(A,B,R,R2),!. 形態素解析_1([[A|_]|R],[A|R2]) :- jumanサーバーによる形態素解析(A,B,R,R2). mecabサーバーによる形態素解析(A,B,R,R2) :- 形態素解析サーバー(mecab), split(A,['\t'],AL), AL = [B|_], 形態素解析_1(R,R2),!. jumanサーバーによる形態素解析(A,B,R,R2) :- 形態素解析サーバー(juman), 形態素解析_1(R,R2),!. 形態素解析_2([],[],[]) :- !. 形態素解析_2([[A|R1]|R],[],[[A|R1]|R]) :- \+(A = (@)),!. 形態素解析_2([[@,A|_]|R],[A|R2],R3) :- 形態素解析_2(R,R2,R3),!. 形態素解析_3([],[]). 形態素解析_3([A|R],[A|R2]) :- \+(list(A)), '形態素解析_3(R,R2) . 形態素解析_3([A|R],[B|R2]) :- list(A), member(B,A), 形態素解析_3(R,R2) . 形態素解析_2_重複削除([],L1,L) :- reverse(L1,L),!. 形態素解析_2_重複削除([A|R],Y,X) :- member(A,Y), 形態素解析_2_重複削除(R,Y,X),!. 形態素解析_2_重複削除([A|R],Y,X) :- \+(member(A,Y)), 形態素解析_2_重複削除(R,[A|Y],X) . sh(Command,X) :- shs(Command,Y), findall(U,( member(V,Y), split(V,[' ',','],U)), X). 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). 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). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/33 # # [1] 授業単元: リスト処理 # [2] 問題文(含コード&) http://codepad.org/3DdhcBUM # # /* # # seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、リスト処理による挿入法で得点の降順に整列して表示しなさい。 # また、整列する際に要素どうしを比較した回数も表示しなさい。 # # 【実行例】 # # 番号 氏名      得点 # 1021 Machida Masato 100 # 1017 Nonaka Fujio 98 # 1011 Suzuki kenichi 93 # 1019 Fujimoto Kaoru 92 # 1006 kato Ichiro 91 # ・ ・     ・ # ・ ・     ・ # ・ ・     ・ # 1020 Hoshi Izumi 32 # 整列の為の比較回数=132回 # # ※長いので実行結果は途中省略しています。 # ※比較回数はコードによって異なる場合があります。 # # */ 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、リスト処理による挿入法で得点の降順に整列して表示しなさい。 また、整列する際に要素どうしを比較した回数も表示しなさい。' :- 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、'(_生徒ならび), リスト処理による挿入法で得点の降順に整列して(_生徒ならび,[],_整列済み生徒ならび,0,_比較回数), 表示しなさい(_整列済み生徒ならび,_比較回数). 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、'(_生徒ならび) :- get_split_lines('seito.dat',[' '],_生徒ならび). リスト処理による挿入法で得点の降順に整列して([[_学籍番号,_姓,_名,_得点]|R1],L1,_整列済み生徒ならび,_比較回数_1,_比較回数) :- 降順に挿入(_学籍番号,_姓,_名,_得点,L1,L2,_比較回数_1,_比較回数_2), リスト処理による挿入法で得点の降順に整列して(R1,L2,_整列済み生徒ならび,_比較回数_2,_比較回数),!. リスト処理による挿入法で得点の降順に整列して([],_整列済み生徒ならび,_整列済み生徒ならび,_比較回数,_比較回数). 降順に挿入(_学籍番号,_姓,_名,_得点,[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R],[[_学籍番号,_名,_名,_得点],[_学籍番号_1,_姓_1,_名_1,_得点_1]|R],_比較回数_1,_比較回数) :- 比較回数 is _比較回数_1 + 1, _得点 >= _得点_1,!. 降順に挿入(_学籍番号,_姓,_名,_得点,[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R1],[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R2],_比較回数_1,_比較回数) :- 降順に挿入(_学籍番号,_姓,_名,_得点,R1,R2,_比較回数_1,_比較回数). 降順に挿入(_学籍番号,_姓,_名,_得点,[],[[_学籍番号,_名,_名,_得点]],_比較回数,_比較回数) :- !. 表示しなさい(_整列済み生徒ならび,_比較回数) :- 見出しの表示, append(_,[[_学籍番号,_姓,_名,_得点]|R],_整列済み生徒ならび), 整形して表示する(_学籍番号,_姓,_名,_得点), R = [], writef('整列の為の比較回数=%t回\n',[_比較回数]). 見出しの表示 :- write('番号 氏名      得点\n'). 整形して表示する(_学籍番号,_姓,_名,_得点) :- 姓名をそれぞれ8桁に(_姓,_名,_姓文字列,_名文字列), 得点を頭部空白3桁に(_得点,_得点文字列), atomic_list_concat([_学籍番号,_姓文字列,_名文字列,_得点文字列],' ',_表示文字列), writef('%t\n',[_表示文字列]). 姓名をそれぞれ8桁に(_姓,_名,_姓文字列,_名文字列) :- '8桁に'(_姓,_姓文字列), '8桁に'(_名,_名文字列). '8桁に'(_項,_8桁文字列) :- atom_chars(_項,Chars_1), length(L,8), append(L1,L2,L), all(L2,' '), atom_chars(_8桁文字列,L). 得点を頭部空白3桁に(_得点,_得点文字列) :- number_chars(_得点,Chars), length(L,3), append(L0,Chars,L), all(L0,' '), atom_chars(_得点文字列,L). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_split_lines(File,Sep,Lines) :- get_lines(File,Lines1), findall(Line,( member(A,Lines1), split(A,Sep,Line)), Lines). get_lines(Instream,end_of_file,_,_,[]) :-!. get_lines(Instream,S,[],_終了検索対象ならび,[S]) :- member(A,_終了検索対象ならび), 検索(S,A),!. get_lines(Instream,S,[],[],[S|R]) :- get_line(Instream,S2), get_lines(Instream,S2,[],[],R),!. get_lines(Instream,S,[],_終了検索対象ならび,[S|R]) :- member(A,_終了検索対象ならび), \+(検索(S,A)), get_line(Instream,S2), get_lines(Instream,S2,[],_終了検索対象ならび,R),!. get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,[S]) :- \+(_開始検索対象ならび = []), member(A,_開始検索対象ならび), 検索(S,A), member(B,_終了検索対象ならび), 検索(S,B),!. get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,[S|R]) :- \+(_開始検索対象ならび = []), member(A,_開始検索対象ならび), 検索(S,A), !, get_line(Instream,S2), get_lines(Instream,S2,[],_終了検索対象ならび,R),!. get_lines(Instream,_,_開始検索対象ならび,_終了検索対象ならび,X) :- get_line(Instream,S2), get_lines(Instream,S2,_開始検索対象ならび,_終了検索対象ならび,X),!. get_lines(_ファイル,_スタート行,_最終行,X) :- integer(_スタート行), integer(_最終行), 行位置指定選択(_ファイル,_スタート行,_最終行,X). get_lines(_ファイル,_開始検索対象ならび,_終了検索対象ならび,X) :- \+(integer(_開始検索対象ならび)), \+(integer(_終了検索対象ならび)), open(_ファイル,read,Instream), get_line(Instream,S), get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,X), close(Instream),!. get_lines(File,Lines) :- get_chars(File,L), chars_lines(L,Lines),!. get_lines(Lines) :- findall(Line,( repeat, get_line(user_input,Line), (Line = end_of_file , (!) , fail ; true)), Lines). get_line(Instream,X) :- get_char(Instream,C), get_line_3(Instream,C,Chars), atom_chars(X,Chars),!. get_chars(Instream,end_of_file,[]) :- !. get_chars(Instream,_,[]) :- at_end_of_stream(Instream),!. get_chars(Instream,X,[X|R]) :- get_char(Instream,Y), get_chars(Instream,Y,R) . get_chars(File,L) :- \+(is_stream(_,File,_)), slush_op(File,File_1), exists_file(File_1), open(File_1,read,Instream), get_char(Instream,X), get_chars(Instream,X,L), close(Instream),!. get_chars(Instream,L) :- is_stream(_,Instream,_), get_char(Instream,X), get_chars(Instream,X,L),!. get_chars(L) :- findall(U,( repeat, get_char(U), (U = end_of_file , (!) , fail ; true)), L). get_line(X) :- get_line(user_input,X). get_line_3(_,'\n',[]) :- !. get_line_3(Instream,_,[]) :- at_end_of_stream(Instream),!. get_line_3(Instream,end_of_file,[]) :- !. get_line_3(Instream,C,[C|R]) :- get_char(Instream,C2), get_line_3(Instream,C2,R). 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), atomic_list_concat(U,A), chars_lines(R,R2). split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,Y), findall(U,( member(U,Y), \+(U = '')), L), L = X,!. sPlit(_文字列,_区切り符号ならび,X) :- atom_chars(_文字列,L), split_00(L,_区切り符号ならび,Y), findall(U,( member(U,Y) , \+(member(U,_区切り符号ならび))), Z), Z = X,!. split_00(_文字ならび,_区切り符号ならび,X) :- findall([B,A],( member(A,_区切り符号ならび) , atom_chars(A,B)), _区切り符号ならびの二), split_0(_文字ならび,_区切り符号ならびの二,X). split_0(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_0(_文字ならび,_区切り符号ならび,['',_区切り符号|R2]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_1(R,_区切り符号ならび,R2),!. split_0(L,_区切り符号ならび,X) :- split_1(L,_区切り符号ならび,X). split_1([],_,[]) :- !. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号_1,C,_区切り符号_2|X]) :- member([_区切り文字ならび,_区切り符号_1],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_2(R,R2,_区切り符号_2,_区切り符号ならび,B), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), _区切り符号 = '', split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C,_区切り符号|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), \+(_区切り符号 = ''), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_2([],[],'',_,[]) :- !. split_2(_文字ならび,R,_区切り符号,_区切り符号ならび,[]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび),!. split_2([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_3([''''|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_32(['"'|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2([_文字|R],R2,_区切り符号,_区切り符号ならび,[_文字|X]) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3([_|R],R2,_区切り符号,_区切り符号ならび,X) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([],[],'',_,[]) :- !. split_4([_文字|R],R2,_区切り符号ならび,[_文字|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_5([],'') :- !. split_5(B,C) :- numeric_list(B,Nl), C number Nl,!. split_5(B,C) :- atomic_list_concat(B,C),!. all([],_). all([V|R],V) :- all(R,V). 検索(_文字列,_副文字列) :- atom_length(_文字列,_文字列の文字数), atom_length(_副文字列,_副文字列の文字数), Max is _文字列の文字数 - _副文字列の文字数, between(0,Max,N), sub_atom(_文字列,N,_副文字列の文字数,_副文字列),!. 行位置指定選択(_ファイル,_選択先頭行,_選択最終行,X) :- wc(_ファイル,[[_行,_,_,_]]), _行数_1 is _行 - _選択先頭行 + 1, _行数_2 is _選択最終行 - _選択先頭行, atomic_list_concat(['tail -',_行数_1,' ',_ファイル,' | head -',_行数_2],S), shs(S,X). wc(F,X) :- exists_file(F1), atomic_list_concat(['wc ',F1],S), sh(S,X),!. wc(F,X) :- atomic_list_concat([F,' | wc'],S), sh(S,X),!. sh(Command,X) :- shs(Command,Y), findall(U,(member(V,Y) , make_list(V,[' ',','],U)),X). 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). system(Command,X) :- shell(Command,X). system(Command) :- shell(Command). 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,_,[]) :- at_end_of_stream(Instream),!. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/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). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/587 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # 演習目的 # 々渋ぢ里筌櫂ぅ鵐燭鰺用して、データ構造を設計することができる。 # 構造体をreturn文で返却する関数を作ることができる。 # ポインタを扱うことができる。 # 課題: # 直交座標系の座標(x,y)を極座標系の座標(r,θ)に変換する関数と、 # その逆変換をする関数を作成しなさい。 # ただし、直交座標系(orthogonal coordinate system)の座標と、 # 極座標系(polar coordinates system)の座標はそれぞれ構造体を # 用いて定義すること。 # {x=rcosθ,y=rsinθ # {r=√(x^2+y^2),tanθ=y/x # 例えば、次のように定義することができる。 # typedef struct{ # double x;  /** x座標 **/ # double y;  /** y座標 **/ # } orth_coord_t; # '直交座標系の座標(x,y)を極座標系の座標(r,θ)に変換する関数と その逆変換をする関数を作成しなさい。'(_x,_y,_r,_θ) :- \+(var(_x)), \+(var(_y)), '直交座標(x,y)から極座標(r,θ)へ変換'(_x,_y,_r,_θ) ,!. '直交座標系の座標(x,y)を極座標系の座標(r,θ)に変換する関数と その逆変換をする関数を作成しなさい。'(_x,_y,_r,_θ) :- \+(var(_r)), \+(var(_θ)), '極座標(r,θ)から直交座標(x,y)へ変換'(_r,_θ,_x,_y). '極座標(r,θ)から直交座標(x,y)へ変換'(_r,_θ,_x,_y) :- _x is _r * cos(_θ), _y is _r * sin(_θ),!. '直交座標(x,y)から極座標(r,θ)へ変換'(_x,_y,_r,_θ) :- _r is sqrt(_x ^ 2 + _y ^ 2), _θ is atan(_y / _x), '直交座標(x,y)から極座標(r,θ)へ変換'(_x,_y,_θ),!. '直交座標(x,y)から極座標(r,θ)へ変換'(_x,_y,_θ) :- \+(_x = 0.0), _θ is atan(0.0),!. '直交座標(x,y)から極座標(r,θ)へ変換'(0.0,_y,_θ) :- \+(_y = 0.0), _z is _x / _y, arccotan(_z,_θ),!. '直交座標(x,y)から極座標(r,θ)へ変換'(0.0,0.0,0.0). arccotan(X,Y) :- Z is X, Y is atan(Z) + 2 * atan(1). % 以下のサイトは # # 連番のエロ画像をダウンロードするスクリプトください # # # %%% バッチファイル anonymouget %%% # anonymousget2 $2 $3 | ftp -n $1 # # %%% バッチファイル anonymousget2 %%% # echo user anonymous ***** # echo binary # echo get $1 $2 | plustosp # echo close # echo quit # # %%% plustosp.c %%% # #include # main() { # unsigned int c0,n; # n=0; # while((c0=getchar()) != EOF) { # if(c0=='+') # putchar(32); # else # putchar(c0); # } # } 連番のエロ画像をダウンロードする(_ftpサイト名,_ファイル名,_サフィックス,_連番桁数,_連番起点,_連番終点) :- 連番ファイルをダウンロードする(_ftpサイト名,_ファイル名,_サフィックス,_連番桁数,_連番起点,_連番終点). 連番ファイルをダウンロードする(_ftpサイト名,_ファイル名,_サフィックス,_連番桁数,_連番起点,_連番終点) :- anonymousgetの準備, ダウンロード対象ファイルを得る(_ftpサイト名,_ファイル名,_サフィックス,_連番桁数,_連番起点,_連番終点,_連番,_ファイル名_2), anonymousget(_ftpサイト名,_ファイル名_2,_ファイル名_2), _連番終点 = _連番. ダウンロード対象ファイルを得る(_ftpサイト名,_ファイル名,_サフィックス,_連番桁数,_連番起点,_連番終点,_連番,_ファイル名_2) :- between(_連番起点,_連番終点,_連番), 整数から文字列(_連番桁数,_連番,_連番文字列), atomic_list_concat([_ファイル名,_連番文字列,'.',_サフィックス],_ファイル名_2). anonymousgetの準備 :- バッチファイルanonymousgetの生成, コマンドデータanonymousget2の生成, 実行プログラムplustospの生成. バッチファイルanonymousgetの生成 :- open(anonymousget,write,Outstream), write(Outstream,'anonymousget2 $2 $3 | ftp -n $1\n'), close(Outstream), shell('chmod 777 anonymousget'),!. コマンドデータanonymousget2の生成 :- open(anonymousget2,write,Outstream), write(Outstream,'echo user anonymous *****\necho binary\necho get $1 $2 | plustosp\necho close\necho quit\n'), close(Outstream). 実行プログラムplustospの生成 :- open('plustosp.c',write,Outstream), write(Outstream,'#include \nmain() {\n unsigned int c0,n;\n n=0;\n while((c0=getchar()) != EOF) {\n if(c0==\'+\')\n putchar(32);\n else\n putchar(c0);\n }\n}\n'), close(Outstream), shell('cc -o plustosp plustosp.c';chmod 777 plustosp),!. anonymousget(_ftpサイト名,_入力ファイル名,_出力ファイル名) :- atomic_list_concat(['anonymousget ',_ftpサイト名,' "',_入力ファイル名,'" "',_出力ファイル名,'"'],S), shell(S),!. 整数から文字列(_文字桁,_整数,_数値文字列) :- length(L,_文字桁), number_chars(_整数,Chars), append(L0,Chars,L), all(L0,'0'). all([],_). all([A|R],A) :- all(R,A). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/710 # # # [1] 授業単元: Visual C# ソフトウェア開発 # # [2] 問題文(含コード&リンク): # #指定した親フォルダ下のbin、objフォルダ内のDebug、Rleaseフォルダを全て削除するプログラムを作成 # # '指定した親フォルダ下のbin、objフォルダ内のDebug、Rleaseフォルダを全て削除する'(_指定した親フォルダ) :- '指定した親フォルダ下のbin、objフォルダ内の'(_フォルダ_1), 'Debug、Rleaseフォルダを'(_フォルダ_2), '全て削除する'(_指定した親フォルダ,_フォルダ_1,_フォルダ_2). '指定した親フォルダ下のbin、objフォルダ内のDebug、Rleaseフォルダを全て削除する'(_). '指定した親フォルダ下のbin、objフォルダ内の'(_フォルダ_1) :- member(_フォルダ_1,[bin,obj]). 'Debug、Rleaseフォルダを'(_フォルダ_2) :- member(_フォルダ_2,['Debug','Rlease']). '全て削除する'(_指定した親フォルダ,_フォルダ_1,_フォルダ_2) :- atomic_list_concat([_指定した親フォルダ,/,_フォルダ_1,/,_フォルダ_2],_フォルダ), \+(exists_file(_フォルダ)), atomic_list_concat(['rm -R ',_フォルダ],S), shell(S), fail. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/710 # # # [1] 授業単元: Visual C# ソフトウェア開発 # # [2] 問題文(含コード&リンク): # #指定した親フォルダ下のbin、objフォルダ内のDebug、Rleaseフォルダを全て削除するプログラムを作成 # # '指定した親フォルダ下のbin、objフォルダ内のDebug、Rleaseフォルダを全て削除する'(_指定した親フォルダ) :- append(_,[_フォルダ_1|R],[bin,obj]), member(_フォルダ_2,['Debug','Rlease']), atomic_list_concat(['rm -R ',_指定した親フォルダ,/,_フォルダ_1,/,_フォルダ_2],S), shell(S), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/814 # # しばらくずっとプログラミングしてなかったもので、正規表現を忘れてしまったのですが、PHPにて # # Japanese system that # <a title=" どうやら〜らしい" style="text-decoration: underline" href="javascript:;">apparently</a> # # のような文章で、両<a>タグを除去して(apparentlyは残す)、テキストだけにしたいのですが、どのように書けばいいでしょうか? # 両タグを除去する(_文字列,_両タグを除去された文字列) :- search(_文字列,[<,a],S2_2,[<,/,a,>],S1,S2,S3,L1,L2,L3), search(S2_2,[>],S2_3,[],_,_,_,_,_,_), atomic_list_concat([S1,S2_3,S3],_両タグを除去された文字列). % search/10 % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/445 # # ../test/read.cgi/tech/1322562648/444 続き # [5] その他の制限:以下の実行例のように,関数の動作を確認できるmain # 関数も作成すること.ただし,main 関数は以下のよう # に動作するものを作成すること # ・main 関数内で,タイトルをHAYABUSA,公開年 # を2011 として初期化したmovie 型構造体のオブジェクトmovie1 を宣言する # ・以下の実行例のように,movie1 のメンバの値を表 # 示した後,関数set_title と関数set_year を用 # いて別のタイトルと公開年の値に変更する.変更す # るタイトルと公開年は適当な値を用いてよい(ユー # ザに入力させる必要はない # ・その後もう一度movie1 のメンバの値を表示して終 # 了する. # お願いします # # program :- main. main :- shs('uuidgen',[_id]), asserta(映画(_id,タイトル('HAYABUSA'),公開年(1911))), タイトルを書き換える(_id,'隼'), 公開年を書き換える(_id,2011). タイトルを書き換える(_id,_タイトル) :- retract(映画(_id,タイトル(_),公開年(_公開年))), asserta(映画(_id,タイトル(_タイトル),公開年(_公開年))),!. 公開年を書き換える(_id,_公開年) :- retract(映画(_id,タイトル(_タイトル),公開年(_))), asserta(映画(_id,タイトル(_タイトル),公開年(_公開年))),!. % 以下のサイトは # twitter_by_@nooyosh_20111115_1 # # カレントディレクトリ以下にあるすべてのPDFファイルのサイズを合計して表示 # 'カレントディレクトリ以下にあるすべてのPDFファイルのサイズを合計して表示'(_合計サイズ) :- shs('ls -s *.pdf',L), findsum(_サイズ,( append(_,[_行|_],L), split(_行,[' '],[_サイズ|_])), _合計サイズ). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/174 # # [1] 授業単元:文字列 # [2] 問題文(含コード&リンク): # 入力した時間と分を長針と短針で示す # アナログ時計を作れ。 # 長針の長さ(200). 単身の長さ(140). 中心X座標(240). 中心Y座標(240). アナログ時計(_時,_分) :- _時_1 is _時 mod 12, アナログ時計描画(_時_1,_分). アナログ時計描画(_時,_分) :- 時分をラジアン角度で表現する(_時,_分,_ラジアン角度_時,_ラジアン角度_分), 長針の長さ(_長針の長さ), 短針の長さ(_短針の長さ), グラフィック描画(_中心X座標,_中心Y座標,_長針の長さ,_短針の長さ,_ラジアン角度_分,_ラジアン角度_時). 時分をラジアン角度で表現する(_時,_分,_ラジアン角度_時,_ラジアン角度_分) :- _ラジアン角度_時 is 2 * pi * ( 1 - _時 / 12) + pi / 2, _ラジアン角度_分 is 2 * pi * ( 1 - _分 / 60) + pi / 2. グラフィック描画(_中心X座標,_中心Y座標,_長針の長さ,_短針の長さ,_長針の角度,_短針の角度) :- newpath, 時計の円周装飾を描画(_中心X座標,_中心Y座標,_半径), 長針の描画(_中心X座標,_中心Y座標,_長針の長さ,_長針の角度), 短針の描画(_中心X座標,_中心Y座標,_短針の長さ,_短針の角度), showpage. 長針の描画(_中心X座標,_中心Y座標,_長針の長さ,_長針の角度) :- moveto(_中心X座標,_中心Y座標), X_1 is truncate(_長針の長さ * cos(_長針の角度)), Y_1 is truncate(_長針の長さ * sin(_長針の角度)), setlinewidth(3), rlineto(X_1,Y_1), stroke. 短針の描画(_中心X座標,_中心Y座標,_短針の長さ,_短針の角度) :- moveto(_中心X座標,_中心Y座標), X_2 is truncate(_短針の長さ * cos(_短針の角度)), Y_2 is truncate(_短針の長さ * sin(_短針の角度)), setlinewidth(3), rlineto(X_2,Y_2), stroke. 時計の円周装飾を描画(_中心X座標,_中心Y座標,_半径) :- setlinewidth(1), arc(_中心X座標,_中心Y座標,_半径,0,360), stroke. %%%%%%% ポストスクリプト述語 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% pswr(G,X) :- pswr_2(G,X),!. pswr(P) :- functor(P,F,A), pswr_1(1,A,P,L1,L2), ( L1=[], G0=''; not(L1=[]), concat_atom(L1,' ',G0) ), concat_atom([G0,' ',F,'\n'],G1), pswr_2(G1,L2),!. pswr_1(N,A,_,[],[]) :- N>A,!. pswr_1(N,E,P,['%t'|R1],[X|R2]) :- arg(N,P,X), M is N+1, pswr_1(M,E,P,R1,R2). pswr_2(G,L) :- telling(user), e_printf(G,L),!. pswr_2(G,L) :- telling(screen), fopen('temp.ps','a+',F), sprintf(G,L,S), fputs(S,F), fclose(F),!. pswr_2(G,L) :- write_formatted(G,L). pstell(F) :- slush_op(F,F1), tell(F1), write('%!'), write('Adobe-PS'),nl,!. arc(_中心X座標,_中心Y座標,_半径,_開始角度,_弧角度) :- _中心X座標の二 is _中心X座標, _中心Y座標の二 is _中心Y座標, stroke, pswr(arc(_中心X座標の二,_中心Y座標の二,_半径,_開始角度,_弧角度)),!. save :- pswr(' /saveobj save def\n'),!. restore :- pswr(' saveobj restore\n'),!. stroke :- pswr(stroke),!. closepath :- pswr(closepath),!. setrgbcolor(Red,Green,Blue) :- pswr(setrgbcolor(Red,Green,Blue)),!. sethsbcolor(Hue,Saturation,Brightness) :- pswr(sethsbcolor(Hue,Saturation,Brightness)),!. setlinewidth(N) :- pswr(setlinewidth(N)),!. rlineto(X,Y) :- X1 is X, Y1 is Y, pswr(rlineto(X1,Y1)),!. lineto(X,Y) :- X1 is X, Y1 is Y, pswr(lineto(X1,Y1)),!. curveto([]) :- !. curveto([A|R]) :- not(list(A)), concat([A|R],' ',L), wr(' %t curveto\n',[L]),!. curveto([[X1,Y1,X2,Y2,X3,Y3]|R]) :- curveto(X1,Y1,X2,Y2,X3,Y3), curveto(R),!. curveto([[X1,Y1]|R]) :- flat([[X1,Y1]|R],L), curveto(L),!. curveto(X1,Y1,X2,Y2,X3,Y3) :- pswr(curveto(X1,Y1,X2,Y2,X3,Y3)),!. rcurveto([]) :- !. rcurveto([A|R]) :- not(list(A)), concat([A|R],' ',L), wr(' %t rcurveto\n',[L]),!. rcurveto([[X1,Y1,X2,Y2,X3,Y3]|R]) :- rcurveto(X1,Y1,X2,Y2,X3,Y3), rcurveto(R),!. rcurveto([[X1,Y1]|R]) :- flat([[X1,Y1]|R],L), rcurveto(L),!. rcurveto(X1,Y1,X2,Y2,X3,Y3) :- pswr(rcurveto(X1,Y1,X2,Y2,X3,Y3)),!. setdash([],Y) :- pswr(setdash([],Y)),!. setdash([A|R],Y) :- concat([A|R],' ',X0), concat(['[',X0,']'],X), pswr(setdash(X,Y)),!. setdash(X,Y) :- pswr(setdash(X,Y)),!. setlinecap(X) :- pswr(setlinecap(X)),!. setlinejoin(X) :- pswr(setlinejoin(X)),!. matrix :- pswr(matrix),!. setmatrix(Matrix) :- flat(Matrix,FlatMatrix), concat(FlatMatrix,' ',X0), concat(['[',X0,']'],X), pswr(setdash(X,Y)),!. setscreen(Frequency,Angle,Proc) :- pswr(setscreen(Frequency,Angle,Proc)),!. stroke :- pswr(stroke),!. moveto(X+X1,Y+Y1) :- var(X), var(Y), integer(X1), integer(Y1), pswr('currentpoint exch \n'), concat([X1,' add exch'],S), pswr(S), concat([Y1,' add moveto\n'],S2), pswr(S2),!. moveto(X+X1,Y) :- var(X), integer(X1), var(Y), pswr('currentpoint exch \n'), concat([X1,' add exch moveto'],S), pswr(S),!. moveto(X,Y+Y1) :- var(X), integer(Y1), var(Y), pswr('currentpoint \n'), concat([Y1,' add moveto'],S), pswr(S),!. moveto(X,Y) :- var(X), Y1 is Y, pswr('currentpoint pop \n'), pswr(moveto(Y1)),!. moveto(X,Y) :- var(Y), X1 is X, concat([X1,' exch moveto'],S), pswr('currentpoint exch pop \n'), pswr(S),!. moveto(X,Y) :- X1 is X, Y1 is Y, pswr(moveto(X1,Y1)),!. showpage :- pswr(showpage),!. copypage :- pswr(copypage),!. erasepage :- pswr(erasepage),!. fill :- pswr(fill),!. ps2pdf(FO) :- concat(['/usr/local/Adobe/Acrobat7.0/bin/acroread ',FO2],S), system(S),!. newpath :- pswr(newpath),!. xpos(Y) :- Y1 is Y, pswr('/xpos %d def\n',[Y1]),!. ypos(Y) :- Y1 is Y, pswr('/ypos %d def\n',[Y1]),!. image(_スキャン長,_スキャンライン数,_ビット数,_変換配列,_16進数ならび文字列) :- sprintf('[%t %t %t %t %t %t]',_変換配列,_変換配列文字列), sprintf(' %t %t %t %t {<%t>} image ',[_スキャン長,_スキャンライン数,_ビット数,_変換配列文字列,_16進数ならび文字列],S), pswr(S),!. scale(X,Y) :- X1 is X, Y1 is Y, pswr(scale(X,Y)),!. translate(X,Y) :- X1 is X, Y1 is Y, pswr(translate(X1,Y1)),!. rotate(R) :- R1 is R, pswr(rotate(R1)),!. p_point(X,Y) :- X1 is X, Y1 is Y, moveto(X1,Y1), rlineto(1,0), stroke,!. % 以下のサイトは # # C:\Users\workspace\pythonというディレクトリの中のpythonファイルを実行すると、 # pythonがあるディレクトリと同ディレクトリの全てのテキスト形式ファイル内にある # path1、path2に格納されている文字列のディレクトリを # C:\Users\workspace\pythonに置き換えたいです。 # 現ディレクトリ('C:\\Users\\workspace\\python\\'). 'ディレクトリ内の全テキストファイル中のpath1, path2 のディレクトリを現ディレクトリに置換する' :- ディレクトリ内の全テキストファイル(_テキストファイル名ならび), 'ファイル中のpath1, path2 のディレクトリを現ディレクトリに置換する'(_テキストファイル名ならび). ディレクトリ内の全テキストファイル(_テキストファイル名ならび) :- shs('ls -N *.txt',_テキストファイル名ならび). 'ファイル内のpath1, path2 のディレクトリを現ディレクトリに置換する'(_テキストファイル名ならび) :- append(_,[_テキストファイル名|R],_テキストファイル名ならび), 'path1, path2 のディレクトリを現ディレクトリに置換する'(_テキストファイル名), R = []. 'path1, path2 のディレクトリを現ディレクトリに置換する'(_テキストファイル名) :- get_lines(_テキストファイル名,Lines), 'path1, path2 のディレクトリを現ディレクトリに置換する'(Lines,Lines2), put_lines(_テキストファイル名,Lines2). 'path1, path2 のディレクトリを現ディレクトリに置換する'([],[]) :- !. 'path1, path2 のディレクトリを現ディレクトリに置換する'([Line1|R1],[Line2|R2]) :- 'path1かpath2が存在する'(Line1,_path,_パス,R), パスを現ディレクトリに変換(_path,_パス,R,,Line2), 'path1, path2 のディレクトリを現ディレクトリに置換する'(R1,R2),!. 'path1, path2 のディレクトリを現ディレクトリに置換する'([Line|R1],[Line|R2]) :- 'path1, path2 のディレクトリを現ディレクトリに置換する'(R1,R2). 'path1かpath2が存在する'(Line1,_path,_パス,R) :- split(Line1,[' '],[_path,=,_パス|R]), member(_path,[path1,path2]),!. パスを現ディレクトリに変換(_path,_パス,R,Line2) :- 現ディレクトリ(DIR), split(_パス,['\\'],L), append(_,[_ファイル名],L), concat_atom([DIR,_ファイル名],_更新されたパス), concat_atom([_path,=,_更新されたパス,R],' ',Line2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/969 # # 5を入力するまで数字を入力し # # 入力されたら # その数列の最大値と最小値の場所を入れ替えて左から表示するプログラムを教えてください # # '5を入力するまで数字を入力し入力されたらその数列の最大値と最小値の場所を入れ替えて左から表示する' :- '5を入力するまで数字を入力し'(_数列), '最大値と最小値の場所を入れ替えて左から表示する'(_数列). '5を入力するまで数字を入力し'(_数列) :- write('数字を入力して下さい(5が入ったら終わります) : '), rawmode, 数字の入力(_数字), '5を入力するまで数字を入力し'(_数字,_数列), norawmode. '5を入力するまで数字を入力し'('5',[]) :- !. '5を入力するまで数字を入力し'(_数字,[_数字|R]) :- 数字の入力(_数字2), '5を入力するまで数字を入力し'(_数字2,R),!. '5を入力するまで数字を入力し'(_,R) :- 数字の入力(_数字), '5を入力するまで数字を入力し'(_数字,R). 数字の入力(_数字) :- get_char(_数字), _数字 @>= '0', _数字 @=< '9'. '最大値と最小値の場所を入れ替えて左から表示する'(_数列) :- 最大値と最小値の(_数列,_最大値,_最小値), 場所を入れ替えて(_数列,_最大値,_最小値,_最大値と最小値を入れ替えた数列), 左から表示する(_最大値と最小値を入れ替えた数列). 最大値と最小値の(_数列,_最大値,_最小値) :- 最大値(_数列,_最大値), 最小値(_数列,_最小値). 最大値(_数列,_最大値) :- append(L1,[_最大値|R1],_数列), \+((member(A1,L1),A1 @> _最大値)), \+((member(A2,R1),A2 @> _最大値)),!. 最小値(_数列,_最小値) :- append(L2,[_最小値|R2],_数列), \+((member(B1,L2),B1 @< _最小値)), \+((member(B2,R2),B2 @< _最小値)),!. 場所を入れ替えて(_数列,_最大値,_最小値,_数列2) :- append(L1,[_最大値|R1],[_最小値|R2],_数列), append(L1,[_最小値|R1],[_最大値|R2],_数列2),!. 場所を入れ替えて(_数列,_最大値,_最小値,_数列2) :- append(L1,[_最小値|R1],[_最大値|R2],_数列), append(L1,[_最大値|R1],[_最小値|R2],_数列2),!. 左から表示する([]) :- write('\n'). 左から表示する([A|R]) :- writef('%t ',[A]), 左から表示する(R). rawmode :- shell('stty raw'). norawmode :- shell('stty -raw'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/844 # # [1] 授業単元:C言語基礎 # [2] 問題文(含コード&リンク): # # 明治元年以降の西暦年を4桁の数で入力すると、 # 和暦で年を表示するプログラムを作成せよ。 # ただし、2つの元号を持つ年 # は両方の年を表示すること。 # (例: 1989年 → 昭和64年、平成元年) # # (2つの元号を持つ年の扱いについては # 余裕がある人は、月、日も入れて、その日の正しい # 元号を表示することによって元号を一つ表示す # るプログラムとしてもよい。) # 提出例 # === プログラム === # #include <stdio.h> # int main() # { # '明治元年以降の西暦年月日を入力して和暦を表示する' :- '明治元年以降の西暦年月日を入力すると'(_西暦年,_月,_日), '入力された西暦年月日から元号を表示する'(_西暦年,_月,_日). '明治元年以降の西暦年月日を入力すると'(_西暦年,_月,_日) :- write('西暦年月日をカンマ区切りで入力してください : '), readln([_西暦年,_月,_日]). '入力された西暦年月日から和暦を表示する'(_西暦年,_月,_日) :- findall(_和暦,( 元号期間(_元号,_期間開始年,_期間開始月,_期間開始日,_期間終了年,_期間終了月,_期間終了日), [_期間開始年,_期間開始月,_期間開始日] @=< [_西暦年,_月,_日], [_期間終了年,_期間終了月,_期間終了日] @>= [_西暦年,_月,_日], 西暦年月日と元号開始年から和暦を得る(_西暦年,_月,_日,_期間開始年,_和暦), L), 和暦を表示する(_西暦年,_月,_日,L). 和暦を表示する(_西暦年,_月,_日,[_和暦_1,_和暦_2]) :- writef('西暦%t年%月%日は二つの元号が重なっています。和暦は %t と %t になります。\n',[_西暦年,_月,_日,_和暦_1,_和暦_2]),!. 和暦を表示する(_西暦年,_月,_日,[_和暦]) :- writef('西暦%t年%月%日の和暦は %t です。\n',[_和暦]). 西暦年月日と元号開始年から和暦を得る(_西暦年,_月,_日,_期間開始年,_和暦) :- _数字和暦年 is _西暦年 - _期間開始年 + 1, 数字年和暦年変換(_数字和暦年,_和暦年), 九十九までの和数字変換(_月,_和暦月), 九十九までの和数字変換(_日,_和暦日), concat_atom([_元号,_和暦年,_和暦月,月,_和暦日,日],_和暦),!. 数字年和暦年変換(1,元年) :- !. 数字年和暦年変換(_西暦,_和暦年) :- 九十九までの和数字変換(_数字,_和数字), concat_atom([_和数字,年],_和暦年),!. 九十九までの和数字変換(0,''). 九十九までの和数字変換(1,一). 九十九までの和数字変換(2,ニ). 九十九までの和数字変換(3,三). 九十九までの和数字変換(4,四). 九十九までの和数字変換(5,五). 九十九までの和数字変換(6,六). 九十九までの和数字変換(7,七). 九十九までの和数字変換(8,八). 九十九までの和数字変換(9,九). 九十九までの和数字変換(数字,_和数字) :- N >= 10, N =< 19, M is N mod 10, 九十九までの和数字変換(M,M2), concat_atom([十,_和数字一の桁],_和数字). 九十九までの和数字変換(数字,_和数字) :- N >= 20, N =< 99, M is N mod 10, 九十九までの和数字変換(M,_和数字一の桁), N2 is N // 10, 九十九までの和数字変換(M2,_和数字十の桁), concat_atom([_和数字十の桁,十,_和数字一の桁],_和数字). 元号期間(明治,1868,1,1,1912,7,30). 元号期間(大正,1912,7,30,1926,12,25). 元号期間(昭和,1926,12,25,1989,1,7). 元号期間(平成,1989,1,8,_年,_月,_日) :- 今日(_年,_月,_日). 改元日(明治,1868,1,25,'改元は1月1日に遡って施行された') :- '実際の改元の勅書は1968年10月23日に出されたが1月1日に遡って施行'. 改元日(大正,1912,7,30,'改元は即日施行された') :- '改元は即日施行された'. 改元日(昭和,1926,12,25,'改元は即日施行された') :- '改元は即日施行された'. 改元日(平成,1989,1,7,'改元は翌日から施行された') :- '改元は翌日から施行された'. '実際の改元の勅書は1968年10月23日に出されたが1月1日に遡って施行'. '改元は即日施行された'. '改元は翌日から施行された'. 今日(_年,_月,_日) :- shs(date,S), split(S,[' ',年,月,日],[_年,_月,_日|_]),!. % 以下のサイトは # [1] 授業単元:C言語基礎 # [2] 問題文(含コード&リンク): # # 明治元年以降の西暦年を4桁の数で入力すると、 # 和暦で年を表示するプログラムを作成せよ。 # ただし、2つの元号を持つ年 # は両方の年を表示すること。 # (例: 1989年 → 昭和64年、平成元年) # # (2つの元号を持つ年の扱いについては # 余裕がある人は、月、日も入れて、その日の正しい # 元号を表示することによって元号を一つ表示す # るプログラムとしてもよい。) # 提出例 # === プログラム === # #include <stdio.h> # int main() # { # '明治元年以降の西暦年を4桁の数で入力すると、和暦で年を表示するプログラムを作成せよ。ただし、2つの元号を持つ年は両方の年を表示すること。' :- '明治元年以降の西暦年を4桁の数で入力すると'(_西暦年), '入力された西暦を示す4桁の数から和暦で年を表示する'(_西暦年). '明治元年以降の西暦年を4桁の数で入力すると'(_西暦年) :- write('明治元年以降の西暦年を4桁の数で入力 : '), 整数を得る(_西暦年), '明治元年以降の西暦年を4桁の数入力検査'(_西暦年),!. '明治元年以降の西暦年を4桁の数で入力すると'(_西暦年) :- '明治元年以降の西暦年を4桁の数で入力すると'(_西暦年). '明治元年以降の西暦年を4桁の数入力検査'(_西暦年) :- _西暦年 =< 9999, 元号期間(明治,_明治元年の西暦,_,_,_,_,_), _西暦年 >= _明治元年の西暦,!. '明治元年以降の西暦年を4桁の数入力検査'(Line,_西暦年) :- writef('入力された %t からは明治元年以降の西暦を示す整数は得られません。再入力をお願いします。\n',[Line]), fail. '入力された西暦を示す4桁の数から和暦で年を表示する'(_西暦年) :- findall(_和暦,( 西暦から和暦を得る(_西暦年,_和暦)), _和暦ならび), 和暦を表示する(_西暦年,_和暦ならび). '西暦から和暦を得る'(_西暦年,_和暦) :- 元号期間(_元号,_開始年,_,_,_終了年,_,_), _西暦年 >= _開始年, _西暦年 =< _終了年, 元号の開始年から和暦を得る(_西暦,_開始年,_和暦年), atomic_list_concat([_元号,_和暦年],_和暦). 元号の開始年から和暦年を得る(_西暦年,_開始年,_和暦年) :- _元号年 is _西暦年 - _開始年 + 1, 数字年和暦年変換(_元号年,_和暦年). 数字年和暦年変換(1,元年) :- !. 数字年和暦年変換(_西暦,_和暦年) :- 九十九までの和数字変換(_数字,_和数字), atomic_list_concat([_和数字,年],_和暦年),!. 九十九までの和数字変換(0,''). 九十九までの和数字変換(1,一). 九十九までの和数字変換(2,ニ). 九十九までの和数字変換(3,三). 九十九までの和数字変換(4,四). 九十九までの和数字変換(5,五). 九十九までの和数字変換(6,六). 九十九までの和数字変換(7,七). 九十九までの和数字変換(8,八). 九十九までの和数字変換(9,九). 九十九までの和数字変換(_数字,_和数字) :- 十から十九までの和数字変換(数字,_和数字). 九十九までの和数字変換(_数字,_和数字) :- 二十以上の和数字変換(_数字,_和数字). 十から十九までの和数字変換(_数字,_和数字) :- _数字 >= 10, _数字 =< 19, M is _数字 mod 10, 九十九までの和数字変換(M,M2), atomic_list_concat([十,_和数字一の桁],_和数字). 二十以上の和数字変換(_数字,_和数字) :- _数字 >= 20, _数字 =< 99, 一の桁の変換(_数字,_和数字一の桁), 十の桁の変換(_数字,_和数字十の桁), atomic_list_concat([_和数字十の桁,十,_和数字一の桁],_和数字). 一の桁の変換(_数字,_和数字一の桁) :- _一の桁の数字 is _数字 mod 10, 九十九までの和数字変換(_一の桁の数字,_和数字一の桁). 十の桁の変換(_数字,_和数字十の桁) :- _十の桁の数字 is _数字 // 10, 九十九までの和数字変換(_十の桁の数字,_和数字十の桁). 和暦を表示する(_西暦,[_和暦]) :- writef('西暦%t年は和暦では%tです。\n',[_西暦,_和暦]),!. 和暦を表示する(_西暦,[_和暦_1,_和暦_2]) :- writef('西暦%t年は和暦では%tか%tです。\n',[_西暦,_和暦_1,_和暦_2]),!. 元号の最終日と元号の開始日が一致する日(_年,_月,_日,_先の元号,_後の元号,_改元施行注釈) :- 元号期間(_先の元号,_年,_月,_日,_), 元号期間(_後の元号,_年,_月,_日,_改元施行注釈),!. 元号期間(明治,1868,1,1,1912,7,30). 元号期間(大正,1912,7,30,1926,12,25). 元号期間(昭和,1926,12,25,1989,1,7). 元号期間(平成,1989,1,8,_年,_月,_日) :- 今日(_年,_月,_日). 改元日(明治,1868,1,25,'改元は1月1日に遡って施行された') :- '実際の改元の勅書は1968年10月23日に出されたが1月1日に遡って施行'. 改元日(大正,1912,7,30,'改元は即日施行された') :- '改元は即日施行された'. 改元日(昭和,1926,12,25,'改元は即日施行された') :- '改元は即日施行された'. 改元日(平成,1989,1,7,'改元は翌日から施行された') :- '改元は翌日から施行された'. '実際の改元の勅書は1968年10月23日に出されたが1月1日に遡って施行'. '改元は即日施行された'. '改元は翌日から施行された'. 今日(_年,_月,_日) :- shs(date,S), split(S,[' ',年,月,日],[_年,_月,_日|_]),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/87 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # 直交座標系の座標(x,y)を極座標系の座標(r,θ)に変換する関数と、 # その逆変換をする関数を作成しなさい。 # ただし、直交座標系(orthogonal coordinate system)の座標と、 # 極座標系(polar coordinates system)の座標はそれぞれ構造体を # 用いて定義すること。 # {x=rcosθ,y=rsinθ # {r=√(x^2+y^2),tanθ=y/x # 上の演習を前スレ../test/read.cgi/tech/1312201995/409で # http://ime.nu/codepad.org/ncFr1HSH # のように作っていただいたのですが、実行時に直交座標系を入力し、 # 極座標系の座標(r,θ)変換した出力と、その逆変換の出力ができる # プログラムを自力で付け加え作成することができませんでした。 # 大変申し訳ないのですが、どなたか実行結果が出るプログラムを作成お願いします。 # 極座標系直交座標系変換(_r,_角度,X,Y) :- \+(var(_r)), \+(var(_角度)), X is _r * sin(_角度), Y is _r * cos(_角度). 極座標系直交座標系変換(_r,_角度,X,Y) :- var(_r), var(_角度), _r is abs(sqrt(X * X + Y * Y)), _角度 is atan(Y / X). 極座標系直交座標系変換(_r,0,X,Y) :- var(_r), var(_角度), (X = 0;X = 0.0), (Y = 0;Y = 0.0), _r is abs(sqrt(X * X + Y * Y)), _角度 is atan(Y / X). 極座標系直交座標系変換(_r,0,X,Y) :- var(_r), var(_角度), (X = 0;X = 0.0), \+(Y = 0), \+(Y = 0.0), _r is abs(sqrt(X * X + Y * Y)), arccotan(X/Y,_角度). arccotan(X,Y) :- Z is X, Y is atan(Z) + 2 * atan(1). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/196 # # [1] 授業単元:システムコール # [2] 問題文(含コード&リンク):http://codepad.org/XAPpvt1n # # コマンドライン引数でファイル名をn個指定し、 ファイル1からファイルn-1まで # wcコマンドを使って、ファイルの行数・単語数・バイト数を数えるプログラム。 # 各ファイルごとに、wcコマンドを無引数で実行、 # その結果をファイルnに書き込むプログラムを書け。 # http://codepad.org/2Y5RTFYrを元にせよ 'コマンドライン引数でファイル名をn個指定し、ファイル1からファイルn-1までの内容を連結し、その結果をファイルnに書き込む' :- 'ファイル名ならび・出力ファイル名の取得'(_オプションならび,_ファイル名ならび,_出力ファイル名), wcの実行(_実行ならび), 出力ファイルへ書きこむ(_出力ファイル,_実行ならび). 'ファイル名ならび・出力ファイル名の取得'(_オプションならび,_ファイル名ならび,_出力ファイル名) :- user_parameters(_ユーザパラメータ), append(_ファイル名ならび,[_出力ファイル名],_ユーザパラメータ),!. 'ファイル1からファイルn-1までの内容を連結し、その結果をファイルnに書き込む'(_ファイル名ならび,_出力ファイル名) :- open(_出力フィル名,write,Outstream), 順にファイルを呼び出しwcの結果を出力する(Outstream,_ファイル名ならび), close(Outstream). 順にファイルを呼び出しwcの結果を出力する(Outstream,_ファイル名ならび) :- append(_,[_ファイル名|R],_ファイル名ならび), concat_atom(['wc ',_ファイル名],S), shs(S,_実行結果), writef(Outstream,'%t: %t\n',[_ファイル名,_実行結果]), R = [],!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/831 # # 2. 引数に指定した複数のテキストファイルの内容を結合して, # 一つのファイルにまとめるコマンド(catfilesという名称とする)を作成せよ. # ただし,まとめた内容を格納するファイル名は,“concat.txt”とすること. # ただし,catコマンドをsystem関数の内部で呼ぶような構成は認めない. # システムコールとしては,open,close,read,writeを用いること. # また,結合してまとめた結果を格納するファイルが存在しない場合には, # creatシステムコールを用いて生成すること. # # 実行 # $ catfiles aaa.txt bbb.txt ccc.txt … # # program :- '引数に指定した複数のテキストファイルの内容を結合して,一つのファイルにまとめるコマンド(catfilesという名称とする)を作成する。ただし,まとめた内容を格納するファイル名は,“concat.txt”とるすこと', halt. '引数に指定した複数のテキストファイルの内容を結合して,一つのファイルにまとめるコマンド(catfilesという名称とする)を作成する。ただし,まとめた内容を格納するファイル名は,“concat.txt”とすること' :- '引数に指定した複数のテキストファイルの内容を'(_ファイルならび), 'まとめた内容を格納するファイル名は,"concat.txt"とする'(Outstream), '結合して,一つのファイルにまとめる'(_ファイルならび,Outstream). '引数に指定した複数のテキストファイルの内容を'(_ファイルならび) :- user_parameters([catfiles|_ファイルならび]). 'まとめた内容を格納するファイル名は,"concat.txt"とする'(Outstream) :- open('concat.txt',write,Outstream,[type(binary)]). '結合して,一つのファイルにまとめる'([],Outstream) :- close(Outstream),!. '結合して,一つのファイルにまとめる'([_ファイル|R],Outstream) :- file_test(_ファイル,read), open(_ファイル,read,Instream,[type(binary)]), get_byte(Instream,Code), バイナリコピー(Instream,Outstream,Code), '結合して,一つのファイルにまとめる'(R,Outstream),!. '結合して,一つのファイルにまとめる'([_ファイル|_],Outstream) :- write_formatted('オープンファイルエラーが発生しました ファイル名=%q\n',[_ファイル]), write('結合を中止します\n'), close(Outstream),!. バイナリコピー(Instream,Outstream,(-1)) :- !. バイナリコピー(Instream,Outstream,Code) :- put_byte(Outstream,Code), get_byte(Instream,Code2), バイナリコピー(Instream,Outstream,Code2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/439 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # 次のCプログラムとアセンブラコードを作成しなさい。 # 問題1「Hello World!」を作成するCプログラム # 問題2九九の計算結果を一の段から九の段まで表示するプログラム #  例  123456789 # 2 4 6 8 10 12 14 16 18  #    % stdio.h の位置を移動してあります。.htmlファイルで > < に囲まれるとブラウザの表示時に化けるので。 'Hello World!のCプログラムとアセンブラコードを作成しなさい。'(_Cプログラム,_アセンブラコード) :- 'Hello World!ソースプログラムを書く', '-Sオプションでコンパイル', get_lines('hello.c',_Cプログラム), get_lines('hello.s',_アセンブラコード). 'Hello World!ソースプログラムを書く' :- open('hello.c',write,Outstream), write_formatted(Outstream,'%t',['#include "stdio.h"\nmain() {\n printf("Hello World\\n");\n}\n']), close(Outstream). '-Sオプションでコンパイル' :- system('cc -S hello.c'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/357 # # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # ------------------- # /*hogehoge*/ # int main(){/*ggg*/ # printf("xxxxxx"); # } # int a=c; # ------------------- # 上記のソース総ステップ数5ステップ、実ステップ数3ステップ、 # コメント率40%が求められるステップカウンターを作製せよ。 # また、以下の条件を提示する。 # 1.ディレクトリ単位で読み込めるようにする。 # 2.Cファイルのみのステップ数を求めるようにする。 # ディレクトリ中のCファイル名を取得してそのステップ数を表示する(_ディレクトリ) :- ディレクトリ中のCファイル名を取得する(_ディレクトリ,_Cファイル名ならび), append(_,[_Cファイル名|R],_Cファイル名ならび), ステップ数を計る(_Cファイル名,_総ステップ数,_実ステップ数,_コメント数), write_formatted('ファイル名 : %t, 総ステップ数 : %t, 実ステップ数 : %t, コメント数 : %t\n',[_Cファイル名,_総ステップ数,_実ステップ数,_コメント数]), R = [],!. ディレクトリ中のCファイル名を取得する(_ディレクトリ,_Cファイル名ならび) :- concat_atom(['ls -N _ディレクトリ,'/','*.c'],S), shs(S,_Cファイル名ならび). ステップ数を計る(_Cファイル名,_総ステップ数,_実ステップ数,_コメント数) :- get_chars(_Cファイル名,Chars), ステップ数を計る(Chars,0,0,0,_総ステップ数,_実ステップ数,_コメント数). ステップ数を計る([],_総ステップ数,_実ステップ数,_コメント数,_総ステップ数,_実ステップ数,_コメント数) :- !. ステップ数を計る([''|R],S1,S2,S3,_総ステップ数,_実ステップ数,_コメント数) :- ステップ数を計る(R,S1,S2,S3,_総ステップ数,_実ステップ数,_コメント数),!. ステップ数を計る(['}'|R],S1,S2,S3,_総ステップ数,_実ステップ数,_コメント数) :- ステップ数を計る(R,S1,S2,S3,_総ステップ数,_実ステップ数,_コメント数),!. ステップ数を計る(L,S1,S2,S3,_総ステップ数,_実ステップ数,_コメント数) :- append(L0,['}'|R],L), all(L0,' '), S1_2 is S1 + 1, ステップ数を計る(R,S1_2,S2,S3,_総ステップ数,_実ステップ数,_コメント数). ステップ数を計る(['/','*'|R1],S1,S2,S3,_総ステップ数,_実ステップ数,_コメント数) :- コメント行(R1,R2,S3,S3_2), ステップ数を計る(R2,S1,S2,S3_2,_総ステップ数,_実ステップ数,_コメント数). ステップ数を計る(['\n'|R1],S1,S2,S3,_総ステップ数,_実ステップ数,_コメント数) :- S1_2 is S1 + 1, S2_2 is S2 + 1, ステップ数を計る(R1,S1_2,S2_2,S3,_総ステップ数,_実ステップ数,_コメント数). コメント行(['*','/'|R],R,S3,S3) :- !. コメント行(['\n'|R1],R,S1,S) :- S2 is S3 + 1, コメント行(R1,R,S2,S),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1258320456/157 # # 【 課題 】 # あるディレクトリに存在するすべてのファイルについて # 各ファイルの先頭一文字をディレクトリ名としてサブディレクトリを作成し # そのサブディレクトリへそのファイルを移動する # (既にサブディレクトリが存在する場合はファイルの移動のみ) # という操作を行うpythonで記述実行し動作を確認しなさい # # 【 期限 】11月25日13:00まで # 【 Ver  】2.5以上 2.6以下 # 【 補足 】済みません丸投げします # # 'あるディレクトリに存在するすべてのファイルについて各ファイルの先頭一文字をディレクトリ名としてサブディレクトリを作成しそのサブディレクトリへそのファイルを移動する'(_ディレクトリ) :- concat_atom(['ls -l ',_ディレクトリ],S), shs(S,_ディレクトリ詳細情報ならび), ディレクトリの生成(_ディレクトリ詳細情報ならび), ディレクトリへのファイルコピー(_ディレクトリ詳細情報ならび). ディレクトリの生成(_ディレクトリ詳細情報ならび) :- append(_,[Line|R],_ディレクトリ詳細情報ならび), split(Line,[' '],[A|R1]), last(R1,F), ディレクトリの生成(A,F), R = [],!. ディレクトリの生成(A,F) :- sub_atom(A,0,1,_,'-'), sub_atom(F,0,1,_,Dir), \+(exists(Dir,read)), concat_atom(['mkdir ',Dir],S), system(S),!. ディレクトリの生成(_,_). ディレクトリへのファイルコピー(_ディレクトリ詳細情報ならび) :- append(_,[Line|R],_ディレクトリ詳細情報ならび), split(Line,[' '],[A|R1]), last(R1,F), ディレクトリへファイルコピー(A,F), R = [],!. ディレクトリへファイルコピー(A,F) :- sub_atom(A,0,1,_,'-'), sub_atom(F,0,1,_,Dir), concat_atom(['cp ',F,' ',Dir,'/',F],S), system(S),!. ディレクトリへファイルコピー(_,_). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/unix/1127388574/941 # # プログラムで質問があります。 # /hoge/test/ # の中に # 1filename1.gif # 1filename2.gif # 2filename1.gif # 2filename2.gif # があるとします。 # # # sh /hoge/test/*filename* # という感じにコマンドを入力すると # それらの複数のファイルが # # command /hoge/test/1filename1.gif -option /aaa/bbb/1filename1.jpg # command /hoge/test/1filename2.gif -option /aaa/bbb/1filename2.jpg # command /hoge/test/2filename1.gif -option /aaa/bbb/2filename1.jpg # command /hoge/test/2filename2.gif -option /aaa/bbb/2filename2.jpg # # って感じにファイルが無くなるまで全て、コマンドを実行したいのですが # どうすればいいのでしょうか?? # # ファイルを選択してコマンド実行(_コマンド,_ディレクトリ1,_ディレクトリ2,_ファイル検索鍵,_サフィックス1,_サフィックス2) :- concat_atom(['sh -d ',_ディレクトリ,'/','*',_ファイル検索鍵,'*'],S1), atom_length(_ディレクトリ,_ディレクトリの長さ1), _ディレクトリの長さ2 is _ディレクトリの長さ1 + 1, shs(S2,L), append(_,[_ファイル名1|R],L), sub_atom(_ファイル名1,S,_,0,_サフィックス1), Len3 is S - _ディレクトリの長さ2, sub_atom(_ファイル名1,_ディレクトリの長さ2,Len3,_,_ファイル名2), concat_atom([_コマンド,' ',_ファイル名1,' ','-option ',_ディレクトリ2,'/',_ファイル名2,_サフィックス2],S2), shs(S2,_), R = [],!. ファイルを選択してコマンド実行(_,_,_,_,_). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/555 # # シェルの中で入力ファイル名から出力ファイル名を生成しています。 # 特定の文字列・記号を正規表現でリネームしたいのですが思いつきません。 # # ファイル名前半部が異なるファイルが50以上あるのですが、思い通りにrenameしてくれません。 # ご教示お願いいたします。 # # 対象ファイル: # iko_foobar_hogehoge_20101008.tsv # # リネーム後ファイル: # iko_foobar_hogehoge-20101008.tsv # # コマンドの実行イメージ # rename iko*_[\d,8].tsv iko*-[\d,8].tsv # # IN_FILE = ma_sina_syo_20100101 # OUT_FILE="${DIR_PATH_RCV}/${PREFIX}$(basename ${IN_FILE})${MARK}${YMD}.tsv" # OUT_FILE=iko_ma_sina_syo-20100101.tsv # # # ファイル名前半部が異なるファイルをrenameする(_ディレクトリ名) :- concat_atom(['ls -N ',_ディレクトリパス名',S), shs(S,_行ならび), append(_,[_行|R],_行ならび), atom_chars(_行,Chars), length(L2,9), append(L1,L2,Chars), append([_],L3,L2), 全部数字(L3), concat_atom(L1,S1), concat_atom(L3,S3), concat_atom(['mv ',_行,' ','iko_',S1,'-',S3,'.tsv']),Mv), system(Mv), R = [],!. 全部数字([]) :- !. 全部数字([A|R]) :- append(_,[A|_],['0','1','2','3','4','5','6','7','8','9']),全部数字(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1280653311/188 # # [2] 問題文:任意のウェブページ(ここではイントラページ)を、既定設定されているブラウザで表示させる # 既定のブラウザ(firefox). 既定設定されているブラウザで表示(URL) :- 既定のブラウザ(_ブラウザ), P =.. [_ブラウザ,URL], call(P). firefox(URL) :- concat_atom(['/usr/lib/firefox/firefox -a firefox -remote "openURL(',URL,')" &'],Firefox), shell(Firefox),!. w3m(URL) :- atom(URL), predicate_type(URL / 0,undefined), concat_atom(['sudo w3m "',URL,'"'],S), shell(S) . % 以下のサイトは # 出典 :: ★★ Java の宿題ここで答えます Part 69 ★★ #415 # 【 課題 】 # 生徒の成績を管理するプログラムを作成する。 # 生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。 # 内容は # 数学:70 # 英語:80 # 国語:75 # 理科:80 # 社会:60 # となっている # このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】8/10 # 【 Ver  】1.6.0_06 # 【 補足 】 # # '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。 このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する' :- '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。'(L1), '指定した科目と点数を得る'(_指定した科目,_指定した点数), 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'(L1,_指定した科目,_指定した点数). '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。'(L1) :- shs('ls -N *.txt',L1). '指定した科目と点数を得る'(_指定した科目,_指定した点数) :- '指定した科目を得る。科目名は数学、英語、国語、社会、理科のどれか'(_指定した科目), '指定した点数を得る。点数は整数。'(_指定した点数). 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'([],_,_). 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'([_テキストファイル名|R1],_指定した科目,_指定した点数) :- 指定した科目で指定した点数の生徒の出席番号を表示する(_テキストファイル名,_指定した科目,_指定した点数,_生徒の出席番号). 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'([_|R1],_指定した科目,_指定した点数) :- 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'(R1,_指定した科目,_指定した点数). 指定した科目で指定した点数の生徒の出席番号を表示する(_テキストファイル名,_指定した科目,_指定した点数,_生徒の出席番号) :- get_split_lines(_テキストファイル名,[' ',':'],L), member([_指定した科目,_指定した点数],L), 'テキストファイル名から.txtを取り除いたものが生徒の出席番号'(_テキストファイル,_生徒の出席番号), writef('%w\n',[_生徒の出席番号]). 'テキストファイル名から.txtを取り除いたものが生徒の出席番号'(_テキストファイル名,_生徒の出席番号) :- sub_atom(_テキストファイル名,_生徒の出席番号,'.txt',''). '科目を得る。科目は数学、英語、国語、理科、社会のどれか'(_指定した科目) :- repeat, '科目を得る。'(_科目), '科目は数学、英語、国語、理科、社会のどれか'(_科目),!. '科目を得る。'(_科目) :- write('科目を入力してください : '), 行入力(_科目). '科目は数学、英語、国語、理科、社会のどれか'(_科目) :- member(_科目,[数学,英語,国語,理科,社会]). '指定した点数を得る。点数は整数。'(_指定した点数) :- repeat, 整数を得る('点数(整数)を入力してください : ',true,_指定した点数),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). get_split_lines(File,Sep,Lines) :- get_lines(File,Lines1), findall(Line,(member(A,Lines1) , split(A,Sep,Line)),Lines). get_lines(File,Lines) :- see(File), findall(_行,(repeat,(at_end_of_stream(current_input),!,fail;行入力(_行))),Lines), seen. sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,E,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,E,0,_後文字列). shs(Command,X) :- popen(Command,L), shs_2(L,X). shs_2([],[]) :- !. shs_2(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_2(R1,R),!. shs_2(L,[S]) :- atom_chars(S,L). popen(Command,Chars) :- open(pipe(Command),read,Instream), sh_chars(Instream,Chars), close(Instream),!. sh_chars(Instream,[]) :- at_end_of_stream(Instream),!. sh_chars(Instream,[Char|R]) :- get_char(Instream,Char), sh_chars(Instream,R). sh_codes(Instream,[]) :- at_end_of_stream(Instream),!. sh_codes(Instream,[Code|R]) :- get_code(Instream,Code), sh_codes(Instream,R). % *** user: split / 3 *** % ?- split('a\n\nbc\n',['\n'],X). % % X = [a,bc] % split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z), X = Z,!. % *** user: sPlit / 3 *** % ?- sPlit('a\n\nbc\n',['\n'],X). % % X = [a,'',bc]. % sPlit(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L),\+(member(U,_区切り符号ならび))),Z), X = Z,!. % *** user: sPLIT / 3 *** % ?- sPLIT('a\n\nbc\n',['\n'],X). % % X = [a,'\n','\n',bc,'\n'] % sPLIT(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z) X = Z,!. % *** user: 'SPLIT' / 3 *** % ?- 'SPLIT'('a\n\nbc\n',['\n'],X). % % X = [a,'\n','','\n',bc,'\n']. % 'SPLIT'(_文字列,_区切り符号ならび,X) :- split_0(_文字列,_区切り符号ならび,X),!. split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L). split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号ならび,L). '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,L),!. '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,[_文字列]) :- '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび). '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,['',_文字列,'']) :- member(_文字列,_区切り符号ならび),!. '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_文字列,_,_,_,_区切り符号))). '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号ならび,[_前文字列,_区切り符号|R]) :- sub_atom(_文字列,_前文字列,_区切り符号,_後文字列), member(_区切り符号,_区切り符号ならび), 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび), split_0(_後文字列,_区切り符号ならび,R). 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_前文字列,_,_,_,_区切り符号))). 整数を得る(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数入力に失敗した時は再試行する(_催促文,_条件,_整数). 整数入力に失敗した時は再試行する(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数), 条件を実行する(_行,_整数,_条件). '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数) :- 催促文の表示(_催促文), 行入力(_行), 整数入力検査(_行,_整数). 催促文の表示(_催促文) :- writef('%w',[_催促文]). 整数入力検査(_行,_整数) :- 行を解析して整数を得る(_行,_整数). 整数入力検査(_行,_) :- 整数を得られなかったらそのことを表示してfail(_行). 行を解析して整数を得る(_行,_整数) :- 行を解析して(_行,_整数), それが整数であることを確認する(_整数). 行を解析して(_行,_整数) :- catch(read_term_from_atom(_行,_整数,[]),E,fail). それが整数であることを確認する(_整数) :- integer(_整数). 整数を得られなかったらそのことを表示してfail(_行) :- writef('入力された行 %w からは整数が得られませんでした。再入力をお願いします。\n',[_行]), fail. 条件を実行する(_行,_整数,_条件) :- catch(_条件,E,fail). 条件を実行する(_行,_整数,_条件) :- writef('%w から得た整数 %w は、条件 %w を満たしません。再入力をお願いします。\n',[_行,_整数,_条件]), fail. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274121477/320 # # 日本語文章中の複数の単語を置換したいです。 # ファイルは一つのディレクトリに複数あります。 # >http://ime.nu/www.machu.jp/diary/20070224.html#p01 # ファイル検索はcygwin かlinux上なので上記を参考にしています。 # trではうまくいきませんでした。 # # お題 # # 拡張子が .rb の全てのファイルに対して、 # # #!/usr/bin/env ruby # # を # # #!/usr/local/bin/ruby # # に置換する。ついでに、「ruby」という文字を「perl」に置き換える '拡張子が .rb の全てのファイルに対して、#!/usr/bin/env ruby を #!/usr/local/bin/ruby に置換する。ついでに、「ruby」という文字を「perl」に置き換える' :- shs('ls -N *.cs',Files), append(_,[File|R],Files), get_lines(File,Lines), 指定された内容に文字列を置換する(Lines,Lines2), put_lines(File,Lines2), R = []. 指定された内容に文字列を置換する([],[]) :- !. 指定された内容に文字列を置換する([Line|R1],[Line2|R2]) :- sub_atom(Line,_,_,_,A1,'#!/usr/bin/env ruby',A3,L1,L2,L3), concat_atom([A1,'#!/usr/local/bin/ruby',A3],Line1), rubyをperlに置換する(Line1,Line2), 指定された内容に文字列を置換する(R1,R2),!. 指定された内容に文字列を置換する([Line|R1],[Line2|R2]) :- rubyをperlに置換する(Line,Line2), 指定された内容に文字列を置換する(R1,R2). rubyをperlに置換する(Line,Line2) :- replace_all(Line,ruby,perl,Line2). % replace_all/3は http://nojiriko.asia/prolog/replace_atom.html 参照 % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1268699491/855 # # 『あるフォルダ中の moc*.cpp に一致するファイルの先頭に、「#include "stdafx.h"」 を挿入する』 # いう処理を行うスクリプトがほしい '『あるフォルダ中の moc*.cpp に一致するファイルの先頭に、「#include "stdafx.h"」 を挿入する』 ' :- tmpnam(TMPNAM1), tmpnam(TMPNAM2), open(TMPNAM1,write,Output), write(Output,'#include "stdafx.h"\n'), close(Output), shs('ls -N moc*.cpp',L), ( member(F,L), concat_atom(['cat ',TMPNAM1,' ',F,' >'TMPNAM2',';mv ',TMPNAM2,' ',F],S), system(S),fail; concat_atom(['rm -f ',TMPNAM1],RM), system(RM) ). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1267796762/74 # # 【 課題 】http://ime.nu/rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/964.txt # # ・指定したディレクトリの一覧を表示する。サブディレクトリがあればその一覧も表示する。 # ・指定したディレクトリからの相対パスで出力。 % Prolog ディレクトリをget_byte/2できるPrologはないと思う。 指定したディレクトリの一覧を表示する。サブディレクトリがあればその一覧も表示する(_ディレクトリのバス) :- 指定したディレクトリの情報を取得(_ディレクトリのパス,_ディレクトリの情報ならび), 一覧を表示する。サブディレクトリがあればその一覧も表示する(_ディレクトリのバス,_ディレクトリの情報ならび). 指定したディレクトリの情報を取得(_ディレクトリのパス,_ディレクトリの情報ならび) :- concat_atom(['ls -l ',_ディレクトリのパス],S), shs(S,_ディレクトリ情報ならび),!. 一覧を表示する。サブディレクトリがあればその一覧も表示する(_ディレクトリのパス) :- write_formatted('%%% ディレクトリ=%t %%%\n',[_ディレクトリのパス]), 一覧を表示する(_ディレクトリのパス), サブディレクトリがあればその一覧も表示する。(_ディレクトリのパス). 一覧を表示する([]) :- write('\n'),!. 一覧を表示する([_行|R]) :- write_formatted('%t\n',[_行]),一覧を表示する(R). サブディレクトリがあればその一覧も表示する([]) :- !. サブディレクトリがあればその一覧も表示する([_行|R]) :- sub_atom(_行,0,1,_,d), ディレクトリのパスを取得(_行,_ディレクトリのパス), 指定したディレクトリの一覧を表示する。サブディレクトリがあればその一覧も表示する(_ディレクトリのバス), サブディレクトリがあればその一覧も表示する(R),!. サブディレクトリがあればその一覧も表示する([_|R]) :- サブディレクトリがあればその一覧も表示する(R). ディレクトリのパスを取得(_行,_ディレクトリのパス) :- split(_行,[' '],L),last(L,_ディレクトリのパス). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/216 # # [1] 授業単元: オペレーティングシステム # [2] 問題文(含コード&リンク): #  2. 引数に指定した複数のテキストファイルの内容を結合して,一つのファイルにまとめるコマ #    ンド(catfiles という名称とする)を作成せよ.ただし,まとめた内容を格納するファイル名は, #    “concat.txt”とすること.ただし,cat コマンドをsystem 関数の内部で呼ぶような構成は認め #    ない.システムコールとしては,open,close,read,write を用いること.また,結合してまとめ #    た結果を格納するファイルが存在しない場合には,creat システムコールを用いて生成するこ #    と. # #    実行 #    $ catfiles aaa.txt bbb.txt ccc.txt … # # program :- user_parameters(_パス名ならび), open('concat.txt',write,Output1), close(Output1), open('concat.txt',append,Output), ファイルを書き加える(Output,_パス名ならび), close(Output), halt. ファイルを書き加える(Output,[]) :- !. ファイルを書き加える(Output,[_パス名|R]) :- open(_パス名,read,Input), get_char(C), 一文字づつ書き加える(Input,Output,C), close(Input), ファイルを書き加える(Output,R). 一文字づつ書き加える(_,_,end_of_file) :- !. 一文字づつ書き加える(Input,Output,C) :- put_char(Output,C), get_char(Input,C2), 一文字づつ書き加える(Input,Output,C2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1197620454/543 # # C#の宿題助けてくださしあ><お願いします。 # Visual Studio 2005使用です。 # 問題文などはzipの中に入っています。説明不足等がありましたら補足します。 # http://ime.nu/uproda11.2ch-library.com/11213069.zip.shtml # 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). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/68 # # [1] 授業単元: ネットワークプログラミング # [2] 問題文(含コード&リンク): #  あなたのマシンのIPアドレスを表示しなさい # あなたのマシンのIPアドレスを表示(IPアドレス) :- system(ifconfig,user_input,Stream), get_chars(Stream,L), 'inet addr:を探す'(L,R1), 'IPアドレスを切り取る'(R1,IPL), atom_chars(IPアドレス,IPL), write(IPアドレス). 'inet addr:を探す'([i,n,e,t,' ',a,d,d,r,':'|R1],R1). 'inet addr:を探す'([A|R1],R2) :- 'inet addr:を探す'(R1,R2). 'IPアドレスを切り取る'([],[]) :- !. 'IPアドレスを切り取る'(['\n'|_],[]) :- !. 'IPアドレスを切り取る'([' '|_],[]) :- !. 'IPアドレスを切り取る'([A|R1],[A|R2]) :- 'IPアドレスを切り取る'(R1,R2). ?- 'a##'. # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/97 # # struct meibo {char name[20];int eigo; int kokugo;} # みたいな構造体でmeibo_t[]にループでどんどんデータを入れて生きたいのですがどうすれば良いですか? # int a= 0; meibo[a]=みたいにするとエラーがでますし、何か[0]にどんどん数字が足されてるような気がします # }; # meibo(L) :- findall(L2,(get_line(Line),(Line=end_of_file,!,fail;split(Line,[','],L2))),L). % 以下のサイトは :- nonotify. :- op(850,fx,(^)). ( ^ P) :- wr('%%/%q. ',[P]). pswr(G,X) :- pswr_2(G,X),!. pswr(P) :- functor(P,F,A), pswr_1(1,A,P,L1,L2), ( L1=[], G0=''; not(L1=[]), concat_atom(L1,' ',G0) ), concat_atom([G0,' ',F,'\n'],G1), pswr_2(G1,L2),!. pswr_1(N,A,_,[],[]) :- N>A,!. pswr_1(N,E,P,['%t'|R1],[X|R2]) :- arg(N,P,X), M is N+1, pswr_1(M,E,P,R1,R2). pswr_2(G,L) :- telling(user), e_printf(G,L),!. pswr_2(G,L) :- telling(screen), fopen('temp.ps','a+',F), sprintf(G,L,S), fputs(S,F), fclose(F),!. pswr_2(G,L) :- write_formatted(G,L). pstell(F) :- slush_op(F,F1), tell(F1), write('%!'), write('Adobe-PS'),nl,!. acroread実行ファイル('/usr/local/Adobe/Acrobat7.0/bin/acroread'). newpath :- pswr(newpath),!. xpos(Y) :- Y1 は Y, pswr('/xpos %d def\n',[Y1]),!. ypos(Y) :- Y1 は Y, pswr('/ypos %d def\n',[Y1]),!. image(_スキャン長,_スキャンライン数,_ビット数,_変換配列,_16進数ならび文字列) :- sprintf('[%t %t %t %t %t %t]',_変換配列,_変換配列文字列), sprintf(' %t %t %t %t {<%t>} image ',[_スキャン長,_スキャンライン数,_ビット数,_変換配列文字列,_16進数ならび文字列],S), pswr(S),!. scale(X,Y) :- X1 は X, Y1 は Y, pswr(scale(X,Y)),!. translate(X,Y) :- X1 は X, Y1 は Y, pswr(translate(X1,Y1)),!. rotate(R) :- R1 は R, pswr(rotate(R1)),!. p_point(X,Y) :- X1 は X, Y1 は Y, moveto(X1,Y1), rlineto(1,0), stroke,!. helvetica(Style) :- asciiフォント名変換(helvetica,Style,_フォント名) , 一時asciiフォント名(_フォント名) , (!) . times(Style) :- asciiフォント名変換(times,Style,_フォント名) , 一時asciiフォント名(_フォント名) , (!) . courier(Style) :- asciiフォント名変換(courier,Style,_フォント名) , 一時asciiフォント名(_フォント名) , (!) . asciiフォント名変換(Name,[],_フォント名) :- atomic_length(Name,Len1) , Len2 is Len1 - 1 , subatomic(Name,1,1,A1) , subatomic(Name,2,Len2,A2) , to_upper(A1,A11), concat([A11,A2],_フォント名) , (!) . asciiフォント名変換(Name,Style,_フォント名) :- atomic_length(Name,Len1) , Len2 is Len1 - 1 , atomic_length(Style,Len3) , Len4 is Len3 - 1 , subatomic(Name,1,1,A1) , subatomic(Name,2,Len2,A2) , subatomic(Style,1,1,B1) , subatomic(Style,2,Len4,B2) , to_upper(A1,A11), to_upper(B1,B11), concat([A11,A2,(-),B11,B2],_フォント名) , (!) . to_upper(A,B) :- atomic_length(A,Len), findall(Y, ( for(1,N,Len), subatomic(A,N,1,X), char_code(X,C), ( ( C > 96, C < 123 ), C2 is C-32, char_code(Y,C2); ((C<97);(C>122)), char_code(Y,C) ) ),L), concat_atom(L,B),!. 明朝 :- 一時全角フォント名(明朝), 一時半角フォント名(明朝),!. ゴチック :- 一時全角フォント名(ゴチック), 一時半角フォント名(ゴチック), 一時asciiフォント名('Helvetica-Bold'),!. 一時全角フォント名(明朝) :- get_global(印刷端末文字コード,euc), pswr('/tzfont { /%t } def\n',['Ryumin-Light-78-EUC-H']),!. 一時全角フォント名(明朝) :- get_global(印刷端末文字コード,sjis), pswr('/tzfont { /%t } def\n',['Ryumin-Light-83pv-RKSJ-H']),!. 一時全角フォント名(ゴチック) :- get_global(印刷端末文字コード,euc), pswr('/tzfont { /%t } def\n',['GothicBBB-Medium-78-EUC-H']),!. 一時全角フォント名(ゴチック) :- get_global(印刷端末文字コード,sjis), pswr('/tzfont { /%t } def\n',['GothicBBB-Medium-83pv-RKSJ-H']),!. 一時全角フォント名(_フォント名) :- pswr('/tzfont { /%t } def\n',[_フォント名]),!. 一時半角フォント名(明朝) :- pswr('/thfont { /%t } def\n',['Ryumin-Light.Hankaku']),!. 一時半角フォント名(ゴチック) :- pswr('/thfont { /%t } def\n',['GothicBBB-Medium.Hankaku']),!. 一時半角フォント名(_フォント名) :- pswr('/thfont { /%t } def\n',[_フォント名]),!. 一時asciiフォント名('Times-Roman') :- pswr('/tafont { /%t } def\n',['Times-Roman']),!. 一時asciiフォント名(_フォント名) :- pswr('/tafont { /%t } def\n',[_フォント名]),!. 一時改行定義(_改行名) :- pswr('/tnl { %t } def\n',[_改行名]),!. 一時全角定義(_サイズ) :- integer(_サイズ), concat([zenkaku,_サイズ],_全角定義名), pswr('/%t { tzfont findfont %d scalefont setfont 0 0 3 2 roll lscape-test} def\n',[_全角定義名,_サイズ]), pswr('/tz { %t } def\n',[_全角定義名]),!. 一時半角定義(_サイズ) :- integer(_サイズ), concat([hankaku,_サイズ],_半角定義名), pswr('/%t { thfont findfont %d scalefont setfont 0 0 3 2 roll lscape-test} def\n',[_半角定義名,_サイズ]), pswr('/th { %t } def\n',[_半角定義名]),!. 一時ascii定義(_サイズ) :- integer(_サイズ), concat([ascii,_サイズ],_ascii定義名), pswr('/%t { tafont findfont %d scalefont setfont 0 0 3 2 roll lscape-test} def\n',[_ascii定義名,_サイズ]), pswr('/ta { %t } def\n',[_ascii定義名]),!. 一時全角定義(_全角定義名) :- not(integer(_全角定義名)), pswr('/tz { %t } def\n',[_全角定義名]),!. 一時半角定義(_半角定義名) :- not(integer(_半角定義名)), pswr('/th { %t } def\n',[_半角定義名]),!. 一時ascii定義(_ascii定義名) :- not(integer(_ascii定義名)), pswr('/ta { %t } def\n',[_ascii定義名]),!. 一時定義(_サイズ) :- 一時全角定義(_サイズ), 一時半角定義(_サイズ), 一時ascii定義(_サイズ),!. 改行定義(_改行名,ポートレート,_X座標,_文字開始変位,_行間隔,_下線名,_破線名) :- get_global(印刷形式,ポートレート), ( 書式定義(標準改行名,_,_改行名);true), ( 書式定義(固定軸座標,ポートレート,_X座標);true), ( 書式定義(文字開始変位,ポートレート,_文字開始変位);true), ( 書式定義(行間隔,ポートレート,_行間隔);true), ( 書式定義(標準下線名,_,_下線名);true), ( 書式定義(標準破線名,_,_破線名);true), 改行定義の二(_改行名,ポートレート,_X座標,_文字開始変位,_行間隔,_下線名,_破線名),!. 改行定義(_改行名,ランドスケープ,_Y座標,_文字開始変位,_行間隔,_下線名,_破線名) :- get_global(印刷形式,ランドスケープ), ( 書式定義(標準改行名,_,_改行名);true), ( 書式定義(固定軸座標,ランドスケープ,_Y座標);true), ( 書式定義(文字開始変位,ランドスケープ,_文字開始変位);true), ( 書式定義(行間隔,ランドスケープ,_行間隔);true), ( 書式定義(標準下線名,_,_下線名);true), ( 書式定義(標準破線名,_,_破線名);true), 改行定義の二(_改行名,ランドスケープ,_Y座標,_文字開始変位,_行間隔,_下線名,_破線名),!. 改行定義の二(_改行名,ポートレート,_X座標,_文字開始変位,_行間隔,_下線名,_破線名) :- concat([_下線名,'-offset'],_下線変位名), concat([_破線名,'-def'],_破線宣言名), concat([_下線名,'-def'],_下線宣言名), pswr('%t%t %t %t %t %t %t %t %t %t %t %t %t %t %t %t %t %t %t %t\n',['/',_改行名,'{',_X座標,ypos,_下線変位名,'sub moveto',_破線名,'1 eq {',_破線宣言名,' } if',_下線名,'1 eq {',_下線宣言名,'stroke} if /ypos ypos',_行間隔,'sub def',_X座標,_文字開始変位,'add ypos moveto} def']),!. 改行定義の二(_改行名,ランドスケープ,_Y座標,_文字開始変位,_行間隔,_下線名,_破線名) :- concat([_下線名,'-offset'],_下線変位名), concat([_破線名,'-def'],_破線宣言名), concat([_下線名,'-def'],_下線宣言名), pswr('%t%t %t %t %t %t %t %t %t %t %t %t %t %t %t %t %t %t %t %t %t %t\n',['/',_改行名,'{','gsave xpos ',_下線変位名,'add',_Y座標,moveto,_破線名,'1 eq {',_破線宣言名,' } if',_下線名,'1 eq { 90 rotate',_下線宣言名,'stroke} if grestore /xpos xpos',_行間隔,'add def',xpos,_Y座標,_文字開始変位,'add moveto} def']),!. 行間隔(_行間隔) :- 改行定義(_,_,_,_,_行間隔,_,_),!. ypos保存定義 :- pswr('/ypos-save {currentpoint pop /ypos exch def} def\n'),!. 白抜きフォント定義(_フォント名,_フォント範疇,_フォント,_ポイント) :- ( 書式定義(標準フォント名,_フォント範疇,_フォント名);true), ( 書式定義(標準フォント,_フォント範疇,_フォント);true), ( 書式定義(ポイント,_,_ポイント);true), pswr('%t%t %t%t %t %t %t\n',['/',_フォント名,'{ /',_フォント,findfont,_ポイント,'scalefont setfont outline-show} def']),!. フォント定義(_フォント名,_フォント範疇,_フォント,_ポイント,_x軸文字間空白,_y軸文字間空白) :- ( 書式定義(標準フォント名,_フォント範疇,_フォント名);true), ( 書式定義(標準フォント,_フォント範疇,_フォント);true), ( 書式定義(ポイント,_,_ポイント);true), ( 書式定義(x軸文字間空白,_,_x軸文字間空白);true), ( 書式定義(y軸文字間空白,_,_y軸文字間空白);true), フォント定義の二(_フォント名,_フォント,_ポイント,_x軸文字間空白,_y軸文字間空白),!. フォント定義の二(_フォント名,_フォント,_ポイント,_x軸文字間空白,_y軸文字間空白) :- pswr('%t%t %t%t %t %d %t %d %d %t\n',['/',_フォント名,'{ /',_フォント,findfont,_ポイント,'scalefont setfont',_x軸文字間空白,_y軸文字間空白,'3 2 roll lscape-test} def']),!. zenkaku_font(_ポイント,_行間隔) :- retract(書式定義(行間隔,_,_)), asserta(書式定義(行間隔,_,_ポイント)), 改行定義(newline,_,_,_,_行間隔,_,_), フォント定義(zenkaku,全角,_,_ポイント,0,0),!. hankaku_font(_ポイント,_行間隔) :- retract(書式定義(行間隔,_,_)), asserta(書式定義(行間隔,_,_ポイント)), 改行定義(newline,_,_,_,_行間隔,_,_), フォント定義(zenkaku,半角,_,_ポイント,0,0),!. ascii_font(_ポイント,_行間隔) :- retract(書式定義(行間隔,_,_)), asserta(書式定義(行間隔,_,_ポイント)), 改行定義(newline,_,_,_,_行間隔,_,_), フォント定義(zenkaku,ascii,_,_ポイント,0,0),!. ポストスクリプト矩形(_左上x座標,_左上y座標,_右下x座標,_右下y座標,_線幅,_オプション) :- moveto(_左上x座標,_左上y座標), _幅 は _右下x座標 - _左上x座標, _高さ は _左上y座標-_右下y座標, _幅マイナス は -_幅, _高さマイナス は -_高さ, rlineto(_幅,0), rlineto(0,_高さマイナス), rlineto(_幅マイナス,0), rlineto(0,_高さ), closepath, setlinewidth(_線幅), _オプション,!. ポストスクリプト矩形角丸め(_左上X座標,_左上Y座標,_右下X座標,_右下Y座標,_線幅,_オプション,_丸め幅) :- setlinewidth(_線幅), X2 is _左上X座標 + _丸め幅, moveto(X2,_左上Y座標), wr('%t %t %t %t %t arcto 4 {pop} repeat\n',[_右下X座標,_左上Y座標,_右下X座標,_右下Y座標,_丸め幅]), wr('%t %t %t %t %t arcto 4 {pop} repeat\n',[_右下X座標,_右下Y座標,_左上X座標,_右下Y座標,_丸め幅]), wr('%t %t %t %t %t arcto 4 {pop} repeat\n',[_左上X座標,_右下Y座標,_左上X座標,_左上Y座標,_丸め幅]), wr('%t %t %t %t %t arcto 4 {pop} repeat\n',[_左上X座標,_左上Y座標,_右下X座標,_左上Y座標,_丸め幅]), closepath, setlinewidth(_線幅), call(_オプション),!. ポストスクリプト罫線(_,_左上y座標,_,_右下y座標,0,_y軸方向間隔,_) :- Y は _左上y座標 - _y軸方向間隔, Y =< _右下y座標,!. ポストスクリプト罫線(_左上x座標,_左上y座標,_右下x座標,_右下y座標,0,_y軸方向間隔,_線幅) :- Len は _右下x座標 - _左上x座標, Y は _左上y座標 - _y軸方向間隔, moveto(_左上x座標,Y), setlinewidth(_線幅), rlineto(Len,0), stroke, ポストスクリプト罫線(_左上x座標,Y,_右下x座標,_右下y座標,0,_y軸方向間隔,_線幅),!. ポストスクリプト罫線(_左上x座標,_,_右下x座標,_,_x軸方向間隔,0,_) :- X は _左上x座標 + _x軸方向間隔, X >= _右下x座標,!. ポストスクリプト罫線(_左上x座標,_左上y座標,_右下x座標,_右下y座標,_x軸方向間隔,0,_線幅) :- Len は _左上y座標 - _右下y座標, X は _左上x座標 + _x軸方向間隔, moveto(X,_右下y座標), setlinewidth(_線幅), rlineto(0,Len), stroke, ポストスクリプト罫線(X,_左上y座標,_右下x座標,_右下y座標,_x軸方向間隔,0,_線幅),!. arc(_中心X座標,_中心Y座標,_半径,_開始角度,_弧角度) :- _中心X座標の二 は _中心X座標, _中心Y座標の二 は _中心Y座標, stroke, pswr(arc(_中心X座標の二,_中心Y座標の二,_半径,_開始角度,_弧角度)),!. save :- pswr(' /saveobj save def\n'),!. restore :- pswr(' saveobj restore\n'),!. stroke :- pswr(stroke),!. closepath :- pswr(closepath),!. setrgbcolor(Red,Green,Blue) :- pswr(setrgbcolor(Red,Green,Blue)),!. sethsbcolor(Hue,Saturation,Brightness) :- pswr(sethsbcolor(Hue,Saturation,Brightness)),!. setlinewidth(N) :- pswr(setlinewidth(N)),!. rlineto(X,Y) :- X1 は X, Y1 は Y, pswr(rlineto(X1,Y1)),!. lineto(X,Y) :- X1 は X, Y1 は Y, pswr(lineto(X1,Y1)),!. curveto([]) :- !. curveto([A|R]) :- not(list(A)), concat([A|R],' ',L), wr(' %t curveto\n',[L]),!. curveto([[X1,Y1,X2,Y2,X3,Y3]|R]) :- curveto(X1,Y1,X2,Y2,X3,Y3), curveto(R),!. curveto([[X1,Y1]|R]) :- flat([[X1,Y1]|R],L), curveto(L),!. curveto(X1,Y1,X2,Y2,X3,Y3) :- pswr(curveto(X1,Y1,X2,Y2,X3,Y3)),!. rcurveto([]) :- !. rcurveto([A|R]) :- not(list(A)), concat([A|R],' ',L), wr(' %t rcurveto\n',[L]),!. rcurveto([[X1,Y1,X2,Y2,X3,Y3]|R]) :- rcurveto(X1,Y1,X2,Y2,X3,Y3), rcurveto(R),!. rcurveto([[X1,Y1]|R]) :- flat([[X1,Y1]|R],L), rcurveto(L),!. rcurveto(X1,Y1,X2,Y2,X3,Y3) :- pswr(rcurveto(X1,Y1,X2,Y2,X3,Y3)),!. ベジェ曲線(T,_刻み_,_,_,_,_,_,_,_,[]) :- T > 1.0,!. ベジェ曲線(T,_刻み,X1,Y1,X2,Y2,X3,Y3,X4,Y4,[[X,Y]|R]) :- T2 is T + _刻み, X is (1-T) * (1-T) * (1-T) * X1 + 3 * (1-T) * (1-T) * T * X2 + 3 * (1-T) * T * T * X3 + T * T * T + X4, Y is (1-T) * (1-T) * (1-T) * Y1 + 3 * (1-T) * (1-T) * T * Y2 + 3 * (1-T) * T * T * Y3 + T * T * T * Y4, ベジェ曲線(T2,_刻み,X1,Y1,X2,Y2,X3,Y3,X4,Y4,R). setdash([],Y) :- pswr(setdash([],Y)),!. setdash([A|R],Y) :- concat([A|R],' ',X0), concat(['[',X0,']'],X), pswr(setdash(X,Y)),!. setdash(X,Y) :- pswr(setdash(X,Y)),!. setlinecap(X) :- pswr(setlinecap(X)),!. setlinejoin(X) :- pswr(setlinejoin(X)),!. matrix :- pswr(matrix),!. setmatrix(Matrix) :- flat(Matrix,FlatMatrix), concat(FlatMatrix,' ',X0), concat(['[',X0,']'],X), pswr(setdash(X,Y)),!. setscreen(Frequency,Angle,Proc) :- pswr(setscreen(Frequency,Angle,Proc)),!. stroke :- pswr(stroke),!. fill :- pswr(fill),!. setgray(0) :- pswr(setgray('.0')),!. setgray(F) :- sprintf('%1.2f',[F],S), subatomic(S,2,3,S1), pswr(setgray(S)),!. pvector([],[]) :- stroke,!. pvector([],[[_X座標位置,_Y座標位置,_ベクター長|_オプション]|_R],_線幅,_破線形式,_白色度) :- 線属性(_オプション,_線幅,_破線形式,_白色度), moveto(_X座標位置,_Y座標位置), rlineto(0,_ベクター長), 線属性の二(_オプション,[_線幅,_破線形式,_白色度]), pvector([],R,_線幅,_破線形式,_白色度),!. pvector([[_X座標位置,_Y座標位置,_ベクター長|_オプション]|_R],R1,_線幅,_破線形式,_白色度) :- 線属性の一(_オプション,[_線幅,_破線形式,_白色度]), moveto(_X座標位置,_Y座標位置), rlineto(_ベクター長,0), 線属性の二(_オプション,[_線幅,_破線形式,_白色度]), pvector(R,R1,_線幅,_破線形式,_白色度),!. 下線定義(_下線名,_印刷形式,_下線変位,_下線長,_下線幅) :- ( 書式定義(標準下線名,_,_下線名);true), ( 書式定義(下線変位,_,_下線変位);true), ( 書式定義(下線長,_印刷形式,_下線長);true), ( 書式定義(下線幅,_,_下線幅);true), 下線定義の二(_下線名,_下線変位,_下線長,_下線幅),!. us :- 下線定義(_,_,_,_,0). us(N) :- 下線定義(_,_,_,_,N). 下線 :- us,!. 下線定義の二(_下線名,_下線変位,_下線長,_下線幅) :- concat([_下線名,'-offset'],_下線変位名), concat([_下線名,'-length'],_下線長名), concat([_下線名,'-width'],_下線幅名), concat([_下線名,'-def'],_下線宣言名), pswr('%t%t %t\n',['/',_下線名,'1 def']), pswr('%t%t %t %t\n',['/',_下線長名,_下線長,def]), pswr('%t%t %t %t\n',['/',_下線幅名,_下線幅,def]), pswr('%t%t %t %t\n',['/',_下線変位名,_下線変位,def]), pswr('%t%t %t %t %t %t %t\n',['/',_下線宣言名,'{',_下線長名,'0 rlineto',_下線幅名,'setlinewidth} def']),!. 下線解除(_下線名) :- ( 書式定義(標準下線名,_,_下線名);true), pswr('%t%t %t\n',['/',_下線名,'0 def']),!. 破線定義(_破線名,_破線形式,_破線開始変位,_破線幅) :- ( 書式定義(標準破線名,_,_破線名);true), ( 書式定義(破線形式,_,_破線形式);true), ( 書式定義(破線開始変位,_,_破線開始変位);true), ( 書式定義(破線幅,_,_破線幅);true), 破線定義の二(_破線名,_破線形式,_破線開始変位,_破線幅),!. 破線定義の二(_破線名,_破線形式,_破線開始変位,_破線幅) :- concat([_破線名,'-type'],_破線形式名), concat([_破線名,'-startpos'],_破線変位名), concat([_破線名,'-width'],_破線幅名), concat(_破線形式,' ',_破線形式の二), concat(['[',_破線形式の二,']'],_破線形式の三), concat([_破線名,'-def'],_破線宣言名), pswr('%t%t %t\n',['/',_破線名,'1 def']), pswr('%t%t %t %t\n',['/',_破線形式名,_破線形式の三,def]), pswr('%t%t %t %t\n',['/',_破線変位名,_破線開始変位,def]), pswr('%t%t %t %t\n',['/',_破線幅名,_破線幅,def]), pswr('%t%t %t %t %t %t %t %t\n',['/',_破線宣言名,'{',_破線形式名,_破線変位名,'setdash',_破線幅名,'setlinewidth } def']),!. 破線解除(_破線名) :- ( 書式定義(標準破線名,_,_破線名);true), pswr('%t%t %t\n',['/',_破線名,'0 def']),!. 破線描画定義(_名,_破線パターン,_破線パターン開始位置,_線幅) :- 破線パターン文字列(_破線パターン,_破線パターン文字列), pswr('%t%t %t %t %t %t %t %t %t\n',['/',_名,'{ [,_破線パターン文字列',']',_破線パターン開始位置,setdash,_線幅,'setlinewidth} def']),!. 破線パターン文字列(L,L1) :- concat(L,' ',L1),!. ランドスケープ表示定義 :- pswr('/lscape-show { gsave 90 rotate ashow ypos-save grestore xpos ypos moveto} def\n'),!. ランドスケープ検査定義 :- pswr('/lscape-test {lscape 1 eq {lscape-show} {ashow} ifelse} def\n'),!. ランドスケープ :- set_global(印刷形式,ランドスケープ), pswr('/lscape 1 def\n /portlate 0 def\n'),!. ポートレート :- set_global(印刷形式,ポートレート), pswr('/portlate 1 def\n/lscape 0 def\n'),!. 肖像画 :- set_global(印刷形式,ポートレート), !. 風景画 :- set_global(印刷形式,ランドスケープ), !. moveto(X+X1,Y+Y1) :- var(X), var(Y), integer(X1), integer(Y1), pswr('currentpoint exch \n'), concat([X1,' add exch'],S), pswr(S), concat([Y1,' add moveto\n'],S2), pswr(S2),!. moveto(X+X1,Y) :- var(X), integer(X1), var(Y), pswr('currentpoint exch \n'), concat([X1,' add exch moveto'],S), pswr(S),!. moveto(X,Y+Y1) :- var(X), integer(Y1), var(Y), pswr('currentpoint \n'), concat([Y1,' add moveto'],S), pswr(S),!. moveto(X,Y) :- var(X), Y1 は Y, pswr('currentpoint pop \n'), pswr(moveto(Y1)),!. moveto(X,Y) :- var(Y), X1 は X, concat([X1,' exch moveto'],S), pswr('currentpoint exch pop \n'), pswr(S),!. moveto(X,Y) :- X1 は X, Y1 は Y, pswr(moveto(X1,Y1)),!. showpage :- pswr(showpage), get_global(印刷形式,_印刷形式), 書式定義(初期x座標,_印刷形式,_初期x座標), 書式定義(初期y座標,_印刷形式,_初期y座標), moveto(_初期x座標,_初期y座標),!. copypage :- pswr(copypage),!. erasepage :- pswr(erasepage),!. 文字開始位置(ポートレート,_文字開始変位,_初期x座標,_初期y座標,_文字開始x座標,_文字開始y座標) :- _文字開始y座標 は _初期y座標, _文字開始x座標 は _初期x座標 + _文字開始変位,!. 文字開始位置(ランドスケープ,_文字開始変位,_初期x座標,_初期y座標,_文字開始x座標,_文字開始y座標) :- _文字開始x座標 は _初期x座標, _文字開始y座標 は _初期y座標 + _文字開始変位,!. 背景色なし :- retract(書式定義(背景色,_,_)), assertz(書式定義(背景色,_, (-1))),!. ポストスクリプト背景 :- 書式定義(背景色,_, -1),!. ポストスクリプト背景 :- get_global(印刷形式,_印刷形式), 書式定義(背景色,_,_白色度), 書式定義(下線長,_,_下線長), 書式定義(行間隔,_,_行間隔), 書式定義(制限行数,_印刷形式,_制限行数), 書式定義(初期x座標,_印刷形式,_初期x座標), 書式定義(初期y座標,_印刷形式,_初期y座標), setgray(_白色度), X4 は _初期x座標 + _下線長, Y40 は '*'(_行間隔,_制限行数), Y4 は _初期y座標 - Y40, Y1 は _初期y座標 + _行間隔, ポストスクリプト矩形(_初期x座標,Y1,X4,Y4,0,fill), setgray(0),!. ポストスクリプト汎用定義 :- get_global(印刷形式,_印刷形式), ypos保存定義, call(_印刷形式), ランドスケープ表示定義, ランドスケープ検査定義, 下線定義(_,_印刷形式,_,_,_), 破線定義(_,_,_,_), 改行定義(_改行名,_印刷形式,_,_,_,_,_), 一時改行定義(_改行名), retract(書式定義(標準改行名,_,_)), asserta(書式定義(標準改行名,_,tnl)), フォント定義(_,全角,_,_,4,0), フォント定義(_,半角,_,_,2,0), フォント定義(_,ascii,_,_,2,0),!. 適用業務標準設定(_印刷形式,_初期x座標,_初期y座標,_文字開始変位,_制限行数,_文字名ならび) :- get_global(印刷形式,_印刷形式), 書式定義(初期x座標,_印刷形式,_初期x座標), 書式定義(初期y座標,_印刷形式,_初期y座標), 書式定義(文字開始変位,_,_文字開始変位), 書式定義(制限行数,_印刷形式,_制限行数), 書式定義(標準フォント名,ascii,_asciiフォント名), 書式定義(標準フォント名,全角,_全角フォント名), 書式定義(標準フォント名,半角,_半角フォント名), 一時全角定義(_全角フォント名), 一時半角定義(_半角フォント名), 一時ascii定義(_asciiフォント名), (retract(書式定義(標準フォント名,_,_)),fail;true), asserta(書式定義(標準フォント名,ascii,ta)), asserta(書式定義(標準フォント名,全角,tz)), asserta(書式定義(標準フォント名,半角,th)), _文字名ならび = [ta,tz,th], !. ポストスクリプト見出し(1,_,_初期化情報) :- midashi, call(_初期化情報),!. ポストスクリプト見出し(_,_,_). setup(F) :- seeing(FILE), see(F), repeat, get0(X), ( X = -1;put(X),fail), seen, see(FILE),!. ail3(FILE) :- seeing(CurrentFile), see(FILE), repeat, reads(X), ( X=end_of_file; ail3_1(X) ), seen, see(CurrentFile),!. ail3_1(X) :- subatomic(X,1,2,'%%'), !,fail. ail3_1(X) :- subatomic(X,1,5,gsave), atomic_length(X,N), M is N-7, subatomic(X,M,8,showpage), !,fail. ail3_1(X) :- wr('%t\n',[X]), fail. % *** user: p_print / 7 *** p_print(FI,P_DEFAULT,P_DEF,MIDASHI,_制御命令,FO,TTY) :- r_consult(P_DEFAULT), p_print_def(FI,P_DEFAULT,P_DEF,MIDASHI), open(P_DEF,read,Input_1) , repeat , read(Input_1,P) , ( P = end_of_file ; P = (書式定義(ARG1,ARG2,ARG3) :- T) , retract((書式定義(ARG1,ARG2,_) :- T)) , asserta((書式定義(ARG1,ARG2,ARG3) :- T)) , fail ; not P = (書式定義(ARG1,ARG2,ARG3) :- _) , P = 書式定義(ARG1,ARG2,ARG3) , retract((書式定義(ARG1,ARG2,_) :- _)) , asserta(書式定義(ARG1,ARG2,ARG3)) , fail ) , close(Input_1), r_consult(MIDASHI), slush_op(FI,FI_2), ( atom(FO), not(FO=user_output), tell(FO); not(atom(FO)), tmpnam(FO), tell(FO); FO=user_output ), ( atom(FI_2), not(FI_2=user_input), see(FI_2); atom(FI_2), FI_2=user_input ), wr '%%!\n', '一時全角フォント名'('明朝'), '一時半角フォント名'('ゴチック'), '一時asciiフォント名'('Times-Roman'), 'ポストスクリプト汎用定義', '適用業務標準設定'(_印刷形式,_初期x座標,_初期y座標,_文字開始変位,_制限行数,_文字名ならび), set_global('制限行数',_制限行数), get_global('印刷端末文字コード',_文字コード), 'p_print_フォント定義'(_文字コード), ( '書式定義'('下線幅',_,-1), '書式定義'('標準下線名',_,_標準下線名), '下線解除'(_標準下線名) ; true ), call(_制御命令), set_global(page,1), repeat, xpos(_初期x座標), ypos(_初期y座標), ( _印刷形式=ポートレート, _仮x座標 is _初期x座標 + _文字開始変位, _仮y座標 = _初期y座標; _印刷形式=ランドスケープ, _仮x座標 = _初期x座標, _仮y座標 is _初期y座標 + _文字開始変位 ), moveto(_仮x座標,_仮y座標), newpath, 'ポストスクリプト背景', set_global('頁換え',off), p_print_0(_制限行数,_印刷形式,_文字開始変位,_初期x座標,_初期y座標,_文字開始x座標,_文字開始y座標,_文字名ならび,X), X = end_of_file, seen, told, ! . % *** user: p_print / 5 *** p_print(FI,P_DEFAULT,P_DEF,MIDASHI,_制御命令) :- tty(TTY_1), concat(['/usr2/',TTY_1,'.pst'],SaveSystem), save_system(SaveSystem), 印刷端末(_印刷端末), p_print(FI,P_DEFAULT,P_DEF,MIDASHI,_制御命令,FO,TTY), '印刷制御'(_印刷端末,FO,_), ! . % *** user: p_print / 4 *** p_print(FI,P_DEFAULT,P_DEF,MIDASHI) :- slush_op(FI,FI_2), p_print(FI_2,P_DEFAULT,P_DEF,MIDASHI,true), ! . % *** user: p_print / 2 *** p_print(FI,_制御命令) :- slush_op(FI,FI_2), p_print(FI_2,'p_default.pro','p_def.pro','midashi.pro',_制御命令), ! . % *** user: p_print / 1 *** p_print(Network :: FI) :- hosts(_,Network,_,sjis), tmpnam(F), tmpnam(F2), cp(Network :: FI,F), concat(['sjtoeuc ',F,' >',F2],S), system(S), p_print(F2), unlink(F), unlink(F2), ! . p_print(FI) :- slush_op(FI,FI_2), p_print(FI_2,'p_default.pro','p_def.pro','midashi.pro',true), ! . p_print_フォント定義(euc) :- 白抜きフォント定義(zenkaku4,全角,'Ryumin-Light-78-EUC-H',30), 白抜きフォント定義(hankaku4,半角,'Ryumin-Light.Hankaku',30), 白抜きフォント定義('ascii-code4',ascii,'Courier',30), フォント定義(ascii7,ascii,'Times-Roman',7,0,0), フォント定義(zenkaku7,全角,'GothicBBB-Medium-78-EUC-H',7,0,0), フォント定義(hankaku7,半角,'GothicBBB-Medium.Hankaku',7,0,0), フォント定義(ascii8,ascii,'Times-Roman',8,0,0), フォント定義(zenkaku8,全角,'GothicBBB-Medium-78-EUC-H',8,0,0), フォント定義(hankaku8,半角,'GothicBBB-Medium.Hankaku',8,0,0), フォント定義(zenkaku6,全角,'Ryumin-Light-78-EUC-H',6,0,0), フォント定義(hankaku6,半角,'Ryumin-Light.Hankaku',6,0,0), フォント定義(ascii6,ascii,'Times-Roman',6,0,0), フォント定義(zenkaku16,全角,'Ryumin-Light-78-EUC-H',16,0,0), フォント定義(ascii16,ascii,'Times-Roman',16,0,0), フォント定義(hankaku16,半角,'Ryumin-Light.Hankaku',16,0,0), フォント定義(zenkaku25,全角,'Ryumin-Light-78-EUC-H',25,0,0), フォント定義(ascii25,ascii,'Times-Roman',25,0,0), フォント定義(hankaku25,半角,'Ryumin-Light.Hankaku',25,0,0), フォント定義(ascii30,ascii,'Times-Roman',30,0,0), フォント定義(zenkaku30,全角,'Ryumin-Light-78-EUC-H',30,0,0), フォント定義(hankaku30,半角,'GothicBBB-Medium.Hankaku',30,0,0),!. p_print_フォント定義(sjis) :- 白抜きフォント定義(zenkaku4,全角,'Ryumin-Light-83pv-RKSJ-H',30), 白抜きフォント定義(hankaku4,半角,'Ryumin-Light.Hankaku',30), 白抜きフォント定義('ascii-code4',ascii,'Courier',30), フォント定義(ascii7,ascii,'Times-Roman',7,0,0), フォント定義(zenkaku7,全角,'GothicBBB-Medium-83pv-RKSJ-H',7,0,0), フォント定義(hankaku7,半角,'GothicBBB-Medium.Hankaku',7,0,0), フォント定義(ascii8,ascii,'Times-Roman',8,0,0), フォント定義(zenkaku8,全角,'GothicBBB-Medium-83pv-RKSJ-H',8,0,0), フォント定義(hankaku8,半角,'GothicBBB-Medium.Hankaku',8,0,0), フォント定義(zenkaku6,全角,'Ryumin-Light-83pv-RKSJ-H',6,0,0), フォント定義(hankaku6,半角,'Ryumin-Light.Hankaku',6,0,0), フォント定義(ascii6,ascii,'Times-Roman',6,0,0), フォント定義(zenkakuG8,全角,'GothicBBB-Medium-83pv-RKSJ-H',8,0,0), フォント定義(asciiG8,ascii,'Helvetica-Bold',8,0,0), フォント定義(hankakuG8,半角,'GothicBBB-Medium.Hankaku',8,0,0), フォント定義(zenkaku12,全角,'GothicBBB-Medium-83pv-RKSJ-H',12,0,0), フォント定義(ascii12,ascii,'Helvetica-Bold',12,0,0), フォント定義(hankaku12,半角,'Gothic-Medium.Hankaku',12,0,0), /* フォント定義(zenkaku16,全角,'Ryumin-Light-83pv-RKSJ-H',16,0,0), フォント定義(ascii16,ascii,'Times-Roman',16,0,0), フォント定義(hankaku16,半角,'Ryumin-Light.Hankaku',16,0,0), */ フォント定義(zenkaku16,全角,'GothicBBB-Medium-83pv-RKSJ-H',16,0,0), フォント定義(ascii16,ascii,'Helvetica-Bold',16,0,0), フォント定義(hankaku16,半角,'Gothic-Medium.Hankaku',16,0,0), フォント定義(ascii20,ascii,'Times-Roman',20,0,0), フォント定義(zenkaku20,全角,'Ryumin-Light-83pv-RKSJ-H',20,0,0), フォント定義(hankaku20,半角,'GothicBBB-Medium.Hankaku',20,0,0), フォント定義(zenkaku25,全角,'Ryumin-Light-83pv-RKSJ-H',25,0,0), フォント定義(ascii25,ascii,'Times-Roman',25,0,0), フォント定義(hankaku25,半角,'Ryumin-Light.Hankaku',25,0,0), フォント定義(ascii30,ascii,'Times-Roman',30,0,0), フォント定義(zenkaku30,全角,'Ryumin-Light-83pv-RKSJ-H',30,0,0), フォント定義(hankaku30,半角,'GothicBBB-Medium.Hankaku',30,0,0),!. /* 白抜きフォント定義(zenkaku4,全角,'Ryumin-Light-KL',30), 白抜きフォント定義(hankaku4,半角,'Ryumin-Light.Hankaku',30), 白抜きフォント定義('ascii-code4',ascii,Courier,30), フォント定義(ascii7,ascii,'Times-Roman',7,0,0), フォント定義(zenkaku7,全角,'GothicBBB-Midium',7,0,0), フォント定義(hankaku7,半角,'GothicBBB-Midium.Hankaku',7,0,0), フォント定義(ascii8,ascii,'Times-Roman',8,0,0), フォント定義(zenkaku8,全角,'GothicBBB-Midium',8,0,0), フォント定義(hankaku8,半角,'GothicBBB-Midium.Hankaku',8,0,0), フォント定義(zenkaku6,全角,'Ryumin-Light-KL',6,0,0), フォント定義(hankaku6,半角,'Ryumin-Light.Hankaku',6,0,0), フォント定義(ascii6,ascii,'Times-Roman',6,0,0), フォント定義(zenkaku16,全角,'Ryumin-Light-KL',16,0,0), フォント定義(ascii16,ascii,'Times-Roman',16,0,0), フォント定義(hankaku16,半角,'Ryumin-Light.Hankaku',16,0,0), フォント定義(zenkaku25,全角,'Ryumin-Light-KL',25,0,0), フォント定義(ascii25,ascii,'Times-Roman',25,0,0), フォント定義(hankaku25,半角,'Ryumin-Light.Hankaku',25,0,0), フォント定義(ascii30,ascii,'Times-Roman',30,0,0), フォント定義(zenkaku30,全角,'Ryumin-Light-KL',30,0,0), フォント定義(hankaku30,半角,'GothicBBB-Midium.Hankaku',30,0,0),!. */ p_print_4(ttyz02,_一時ファイル) :- cp(_一時ファイル,ttyz02 :: prn), unlink(_一時ファイル),!. p_print_4(ttyz03,_一時ファイル) :- cp(_一時ファイル,ttyz03 :: prn), unlink(_一時ファイル),!. p_print_4(_印刷端末,_印刷端末) :- !. p_print_4(_印刷端末,_一時ファイル) :- cp(_一時ファイル,_印刷端末 :: prn), unlink(_一時ファイル), !. p_print_def(FI,P_DEFAULT,P_DEF,MIDASHI) :- ( 変数(P_DEFAULT), P_DEFAULT = 'p_default.pro'; 変数(P_DEF), P_DEF = 'p_def.pro'; 変数(MIDASHI), MIDASHI = 'midashi.pro' ), p_print_def(FI,P_DEFAULT,P_DEF,MIDASHI),!. p_print_def(_,_,_,_). 印刷端末取得(xview,_一時ファイル) :- get_global(印刷端末,xview), tmpnam(_一時ファイル),!. 印刷端末取得(_印刷端末,_一時ファイル) :- get_global(印刷端末,_印刷端末), subatomic(_印刷端末,1,3,tty), tmpnam(_一時ファイル),!. 印刷端末取得(_印刷端末,_印刷端末) :- get_global(印刷端末,_印刷端末). p_print_copy(F,F1) :- tmpnam(F1), tell(F1), see(F), repeat, reads(X), ( X=end_of_file; atomic_length(X,LEN), p_print_copy_2(X,LEN), fail ), seen, told,!. p_print_copy_2(X,LEN) :- get_global(印刷形式,ポートレート), 書式定義(初期x座標,ポートレート,_初期x座標), 書式定義(文字開始変位,_,_文字開始変位), 書式定義(ポイント,_,_ポイント), 書式定義(下線長,ポートレート,_下線長), N は '-'(_下線長,'*'(_文字開始変位,2)), LEN2 は (_下線長 / _ポイント), p_print_copy_3(X,LEN,LEN2),!. p_print_copy_3(X,LEN,LEN2) :- LEN>=LEN2, write(X),nl,!. p_print_copy_3(X,LEN,LEN2) :- eucsubstr(X,1,LEN2,Y), write(Y),nl, LEN3 は LEN2-LEN, N3 は LEN2 + 1, eucsubstr(X,N3,LEN3,Z), write(Z),nl,!. % *** user: p_print_0 / 9 *** p_print_0(_制限行数,_印刷形式,_文字開始変位,_初期x座標,_初期y座標,_文字開始x座標,_文字開始y座標,_文字名ならび,X) :- char_code(A,12), /* set_global('制限行数',_制限行数), */ pct_for(1,N), reads(X), ( X = end_of_file, N = 1 ; X = end_of_file, \+(N = 1), 'pct_頁表示', showpage ; N = 1, ( subatomic(X,1,1,A), subatomic(X,2,2,'%/'), SP1 = 4 ; subatomic(X,1,11,'%/showpage.'), subatomic(X,13,2,'%/'), SP1 = 15 ), error_protect(parse_atom(X,SP1,_,T,_,_),fail), ( \+(T = end_of_file), \+(T = []), error_protect(T,fail) ; T = end_of_file ), fail ; \+(N = 1), ( subatomic(X,1,1,A), SP2 = 2 ; subatomic(X,1,11,'%/showpage.'), SP2 = 13 ), get_global('制限行数',_制限行数の二), \+(0 is N mod _制限行数の二), !, 'pct_頁表示', showpage, subatomic(X,SP2,2,'%/'), SP3 is SP2 + 2, error_protect(parse_atom(X,SP3,_,T,_,_),fail), ( \+(T = end_of_file), error_protect(T,fail) ; T = end_of_file ), !, fail ; get_global('制限行数',_制限行数の二), 'ポストスクリプト見出し'(N,_制限行数の二,(xpos(_初期x座標) , ypos(_初期y座標) , setdash('[1 0]',0) , '文字開始位置'(_印刷形式,_文字開始変位,_初期x座標,_初期y座標,_文字開始x座標,_文字開始y座標) , moveto(_文字開始x座標,_文字開始y座標))), setgray(0), concat([X,'\n'],Y), 'ポストスクリプト文字列'(_文字名ならび,_,Y,Z), wr('%t\n',[Z]), 0 'は' N mod _制限行数の二, 'pct_頁表示', showpage ), ! . /* p_print_0(_制限行数,_印刷形式,_文字開始変位,_初期x座標,_初期y座標,_文字開始x座標,_文字開始y座標,_文字名ならび,X) :- char_code(A,12) , set_global(制限行数,_制限行数) , pct_for(1,N) , ( N=1, moveto(_文字開始x座標,_文字開始y座標); not(N=1) ), reads(X) , ( X = end_of_file , N = 1 ; X = end_of_file , not N = 1 , pct_頁表示 , showpage ; N = 1 , ( subatomic(X,1,1,A), subatomic(X,2,2,'%/'), SP1=4; subatomic(X,1,11,'%/showpage.'), subatomic(X,13,2,'%/'), SP1=15 ), moveto(_文字開始x座標,_文字開始y座標), error_protect(parse_atom(X,SP1,_,T,_,_),fail), ( not T = end_of_file , not(T = []), error_protect(T,fail) ; T = end_of_file ) , fail ; not N = 1 , ( subatomic(X,1,1,A), SP2=2, moveto(_文字開始x座標,_文字開始y座標); subatomic(X,1,11,'%/showpage.'), SP2=13, moveto(_文字開始x座標,_文字開始y座標) ), get_global(制限行数,_制限行数の二), not(0 is N mod _制限行数の二), pct_頁表示, showpage, subatomic(X,SP2,2,'%/'), SP3 is SP2+2, error_protect(parse_atom(X,SP3,_,T,_,_),fail), ( not T = end_of_file , error_protect(T,fail) ; T = end_of_file ) , (!) , fail ; get_global(制限行数,_制限行数の二) , ポストスクリプト見出し(N,_制限行数の二,(xpos(_初期x座標) , ypos(_初期y座標) , setdash('[1 0]',0) , 文字開始位置(_印刷形式,_文字開始変位,_初期x座標,_初期y座標,_文字開始x座標,_文字開始y座標) , moveto(_文字開始x座標,_文字開始y座標))) , setgray(0) , concat([X,'\n'],Y) , ポストスクリプト文字列(_文字名ならび,_,Y,Z) , wr('%t\n',[Z]), 0 は N mod _制限行数の二 , pct_頁表示 , showpage ) , (!) . */ pct_頁表示 :- get_global(頁表示,off),!. pct_頁表示 :- get_global(印刷形式,ポートレート), get_global(page,PAGE), PAGE1 is PAGE+1, set_global(page,PAGE1), /* atoi(Page,PAGE), */ lpad(PAGE,2,' ',Page), moveto(300,60), ポストスクリプト文字列(['ascii-code',zenkaku,hankaku],_,Page,W2), wr('%t\n',[W2]),!. pct_頁表示 :- get_global(印刷形式,ランドスケープ), get_global(page,PAGE), PAGE1 is PAGE+1, set_global(page,PAGE1), /* atoi(Page,PAGE), */ lpad(PAGE,2,' ',Page), moveto(565,416), ポストスクリプト文字列(['ascii-code',zenkaku,hankaku],_,Page,W2), wr('%t\n',[W2]),!. pct_for(A,_) :- get_global(制限行数,_制限行数), _制限行数 < A,!,fail. pct_for(A,A). pct_for(A,B) :- A2 is A+1, pct_for(A2,B). %/実線,下線定義(_,_,_,_,0). 実線 :- retract(書式定義(破線形式,_,_)), asserta(書式定義(破線形式,_,[1,0])). 行数(_行数) :- set_global(制限行数,_行数). 印刷制御(アクロバット,FO,_保護ファイル) :- ペーパーサイズ(PAPERSIZE), 印刷制御保護ファイル(FO4,FO40,FO43,FO44), concat(['ps2pdf -sPAPERSIZE=',PAPERSIZE,' ',FO,' ',FO44],S), system(S), cp(FO44,FO43), set_global(html,jump),!. 印刷制御(_印刷端末,FO,_) :- concat(['lpr -P',_印刷端末,' ',FO],SYSTEM), system(SYSTEM), !. 印刷制御保護ファイル(FO4,FO40,FO43,FO44) :- subatomic(FO4,1,5,'/tmp/'), replace_all(FO4,'/tmp/','',FO40), concat(['/tmp/',FO40,'.pdf'],FO43), set_global(tmpnam,FO43), concat(['/home/takao/tmp/',FO40,'.pdf'],FO44),!. 印刷制御保護ファイル(FO4,FO40,FO43,FO44) :- not(subatomic(FO4,1,5,'/tmp/')), make_list(FO4,['/'],L), last(L,FO40), concat(['/tmp/',FO40,'.pdf'],FO43), set_global(tmpnam,FO43), concat(['/home/takao/tmp/',FO40,'.pdf'],FO44),!. ローカル印刷端末(ttyz06) :- !. ペーパーサイズ(a4). ペーパーサイズ(_旧,_新) :- ペーパーサイズ(_旧), retract(ペーパーサイズ(_旧)), assertz(ペーパーサイズ(_新)),!. 印刷制御_acrobat_server_待ち合わせ(F) :- アクロバットサーバー(AcrobatServer), atomic_length(F,Len), for(1,N,30), sleep(1), anonymousdir(AcrobatServer,'/out',X), member(A,X), atom_suffix(A,Len,F), split(A,[' '],[_,_,_,_,Size,Mon,Day,_,_]), ( \+(Size = 0), sleep(2); Size = 0, sleep(5) ), N < 10,!. 大域変数を取得(Key,Value) :- error_protect(get_global(Key,Value),fail). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247636661/364 # # 質問です。 # # 入退室の時間を自分で打ち込んで、それをデータとして貯めるというシステムを作りたいんですが、こういうシステムを # 作る場合は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. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/574 # # [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, get_line(_入力,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,_出力), get_line(_入力,A), write_formatted(_出力,'USER %t\r\n',[_私書箱]), flush_output(_出力), 'メールパスワードの送付'(_メールボックス,_入力,_出力), repeat, get_line(_入力,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,_出力), 'メールユーザ名の送付'(_メールボックス,_入力,_出力), 'メールパスワードの送付'(_メールボックス,_入力,_出力), get_line(_入力,C), write_formatted(_出力,'RETR %t\r\n',[N]), flush_output(_出力), pop3_message_get(_入力,X), write(_出力,'QUIT\r\n'), flush_output(_出力), get_line(_入力,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), 'メールユーザ名の送付'(_入力,_出力), 'メールパスワードの送付'(_入力,_出力), get_line(_入力,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 ), get_line(_入力,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(_出力), get_line(_入力,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), write(_出力2,'\n'), for(Max,U,M), write_formatted(_出力,'RETR %t\r\n',[U]), flush_output(_出力), pop3_message_rw(_入力,_出力2), write(_出力2,'.\n'), U = M, write(_出力2,'\n'), close(_出力2), !. % *** user: pop3_message_rw / 2 *** pop3_message_rw(Input,Output) :- repeat, get_line(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 , get_line(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 *** 'メール数の取得'(_入力,_メール数) :- get_line(_入力,C), split(C,[' '],L), list_nth(4,L,_メール数). % *** user: 'メールパスワードの送付' / 3 *** 'メールパスワードの送付'(_メールボックス,_入力,_出力,B) :- メールパスワード(_メールボックス,_メールパスワード), get_line(_入力,B), write_formatted(_出力,'PASS %t\r\n',[_メールパスワード]), flush_output(_出力). % *** user: 'メールパスワードの送付' / 2 *** 'メールパスワードの送付'(_入力,_出力) :- メールパスワード(_メールパスワード), get_line(_入力,B), write_formatted(_出力,'PASS %t\r\n',[_メールパスワード]), flush_output(_出力). % *** user: 'メールユーザ名の送付' / 3 *** 'メールユーザ名の送付'(_メールボックス,_入力,_出力,A) :- メールユーザ(_メールボックス,_メールユーザ), get_line(_入力,A), write_formatted(_出力,'USER %t\r\n',[_メールボックス]), flush_output(_出力). 'メールユーザ名の送付'(_入力,_出力) :- メールユーザ(_メールユーザ), get_line(_入力,A), write_formatted(_出力,'USER %t\r\n',[_メールユーザ]), flush_output(_出力). % *** user: 'メールサーバを切り離す' / 2 *** 'メールサーバを切り離す'(_入力,_出力) :- write(_出力,'QUIT\r\n'), flush_output(_出力), get_line(_入力,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]), get_line(Input,_),!. send_quit(Input,Output) :- write_formatted(Output,'QUIT\r\n'), get_line(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(html,'text/html') :- !. 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: get_line / 2 *** get_line(Stream,S) :- error_protect(get_code(Stream,X_4),X_4 = -1), get_line_1(Stream,X_4,L_4,[]), atom_codes(S,L_4), ! . get_line_1(Stream,10,[],[]) :- !. get_line_1(Stream,10,L,L2) :- !, reverse(L2,L). get_line_1(Stream,10,L_4,[13|L1_4]) :- !, reverse(L1_4,L_4). get_line_1(Stream,31,L_4,L1_4) :- !, reverse(L1_4,L_4). get_line_1(Stream,-1,L,[A|L1]) :- reverse([A|L1],L). get_line_1(Stream,-1,[101,110,100,95,111,102,95,102,105,108,101],L2) :- !. get_line_1(Stream,X_4,L_4,L1_4) :- error_protect(get_code(Stream,Y_4),Y_4 = -1), !, get_line_1(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). % 以下のサイトは % 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)). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/303 # # [1] 授業単元: # インタラクティブッコミュニケーション # [2] 問題文(含コード&リンク): # 外部変数を使用せずに、main()から関数を呼び出し、円をドルとユーロに換算し、 # main()内のprintf()で結果を出力するプログラムを作成せよ。 # 但し、1ドル = 118円, 1ユーロ = 160円とする。また、プログラムは # 負の値が入力されるまで繰り返されるものとする。 # # http://www.ncc-1701.jp/kakei/InteractiveComm/Class10/InteractiveComm_10.html # の一番下の演習。 # 最終的にはこの形に # http://www.ncc-1701.jp/kakei/InteractiveComm/Class10/exercise10.gif '外部変数を使用せずに、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',[_ドル換算金額,_ユーロ換算金額]),!. 円レート(_通貨,_円レート) :- '通貨略号'(_通貨,_通貨略号), concat_atom(['http://stocks.finance.yahoo.co.jp/stocks/detail/?code=',_通貨略号,'JPY=X'],URL), 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). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1153585095/640 # # 【 課題 】 # 指定したフォルダの中身をフォルダの構成などを含めて完全にバックアップする # ソフトを作成すること。 # 尚、バックアップファイルには以下の機能を持つようにすること。 # ・ 対象ファイルや除外ファイルを指定できるような # 仕組みを持つこと。 # ・ バックアップ経過のログを作成すること。 # ログにはバックアップ処理の実行時間を出力すること。 # また、既にあるフォルダが指定された場合の対処についてもそれぞれ考慮して # 機能の実装を行うこと。 # 作業に余裕のある人は以下の機能を追加すること。 # ・バックアップしたファイルを圧縮する仕組みの追加。 # ・プログラムが常駐する仕組みの追加。 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).