このディレクトリの索引

% 以下のサイトは # 出典 :: C/C++の宿題片付けます 137代目 #943 # 入力したDNA塩基配列中に,atgという並びがいくつあるか調べるプログラムを作成せよ.但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること. # 【実行例】 # # % ./a.out # 1gattatgtga # 11tgccgatatc # 21gatatgattc # (ここで ^D を押す) # #ATG is 3 # % # # よろしくお願いします。 # # '入力したDNA塩基配列中に,atgという並びがいくつあるか調べるプログラムを作成せよ.但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること'(_いくつ) :- '入力したDNA塩基配列中に,(但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること)'(_DNA塩基ならび), '入力したDNA塩基配列中に,atgという並びがいくつあるか調べる'(_DNA塩基ならび,_いくつ). '入力したDNA塩基配列中に,atgという並びがいくつあるか調べる'(_DNA塩基ならび,_いくつ) :- いくつあるか(atgという並びが(_DNA塩基ならび),_いくつ). atgという並びが(_DNA塩基ならび) :- append(_,[a,t,g|_],_DNA塩基ならび). いくつあるか(_副目標,_いくつ) :- findall(1,_副目標,L), length(L,_いくつ). '入力したDNA塩基配列中に,(但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること)'(_DNA塩基ならび) :- findall(_DNA塩基,( '連続して一文字入力する。但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること'(_文字,_DNA塩基)),_DNA塩基ならび). '連続して一文字入力する。但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること'(_文字,_DNA塩基) :- 連続して一文字入力する(_文字), '但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること'(_文字,_DNA塩基). 連続して一文字入力する(_文字) :- repeat, get_char(_文字), (入力した文字がend_of_fileの時(_文字),!,入力を終了する;true). 入力した文字がend_of_fileの時(end_of_file). 入力を終了する :- fail. '但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること'(_DNA塩基,_DNA塩基) :- member(_DNA塩基,[t,c,a,g]). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 137代目 #943 # 入力したDNA塩基配列中に,atgという並びがいくつあるか調べるプログラムを作成せよ.但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること. # 【実行例】 # # % ./a.out # 1gattatgtga # 11tgccgatatc # 21gatatgattc # (ここで ^D を押す) # #ATG is 3 # % # # よろしくお願いします。 # # '入力したDNA塩基配列中に,atgという並びがいくつあるか調べるプログラムを作成せよ.但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること'(_いくつ) :- '入力したDNA塩基配列中に,(但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること)'(_DNA塩基ならび), '入力したDNA塩基配列中に,atgという並びがいくつあるか調べる'(_DNA塩基ならび,_いくつ). '入力したDNA塩基配列中に,atgという並びがいくつあるか調べる'(_DNA塩基ならび,_いくつ) :- いくつあるか(atgという並びが(_DNA塩基ならび),_いくつ). atgという並びが(_DNA塩基ならび) :- append(_,[a,t,g|_],_DNA塩基ならび). いくつあるか(_副目標,_いくつ) :- findall(1,_副目標,L), length(L,_いくつ). '入力したDNA塩基配列中に,(但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること)'(_DNA塩基ならび) :- findall(_DNA塩基,( 連続して一文字入力する(_文字), (入力した文字がend_of_fileの時(_文字),!,入力を終了する; '但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること'(_文字,_DNA塩基))),_DNA塩基ならび). '但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること'(_DNA塩基,_DNA塩基) :- member(_DNA塩基,[t,c,a,g]). 連続して一文字入力する(_文字) :- repeat, get_char(_文字). 入力した文字がend_of_fileの時(end_of_file). 入力を終了する :- fail. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 128代目 #946 # 【質問テンプレ】 # [1] 授業単元 C言語 # [2] 問題文(含コード&リンク): # 二つのバイナリファイルの中身を比較して等しいか、等しくないかを # 比較して結果を返す関数を作る '二つのバイナリファイルの中身を比較して等しいか、等しくないかを返す'(_ファイル1,_ファイル2,_診断) :- 二つのバイナリファイルの(_ファイル1,_ファイル2,_ストリーム1,_ストリーム2,A,B), 中身を比較して等しいか等しくないか返す(_ストリーム1,_ストリーム2,A,B,_診断), 二つのバイナリファイルを閉じる(_ストリーム1,_ストリーム2). 二つのバイナリファイルの(_ファイル1,_ファイル2,_ストリーム1,_ストリーム2,A,B) :- 二つのバイナリファイルを開き二つのストリームを得る(_ファイル1,_ファイル2,_ストリーム1,_ストリーム2), それぞれのストリームから1バイトを得る(_ストリーム1,_ストリーム2,A,B). 二つのバイナリファイルを開き二つのストリームを得る(_ファイル1,_ファイル2,_ストリーム1,_ストリーム2) :- open(ファイル1,read,_ストリーム1,[type(binary)]), open(ファイル2,read,_ストリーム2,[type(binary)]). それぞれのストリームから1バイトを得る(_ストリーム1,_ストリーム2,A,B) :- get_byte(_ストリーム1,A), get_byte(_ストリーム2,B). 中身を比較して等しいか等しくないか返す(_,_,A,B,_診断) :- '両方同時にat_end_of_file状態になるか、二つの値が異なった時、停止する'(_ストリーム1,_ストリーム2,A,B,_診断),!. 中身を比較して等しいか等しくないか返す(_ストリーム1,_ストリーム2,_,_,_診断) :- 二つのバイトが等しい限り1バイトずつ読み続ける(_ストリーム1,_ストリーム2,_診断). '両方同時にat_end_of_file状態になるか、二つの値が異なった時、停止する'(_ストリーム1,_ストリーム2,-1,-1,等しい) :- !. '両方同時にat_end_of_file状態になるか、二つの値が異なった時、停止する'(_ストリーム1,_ストリーム2,A,B,等しくない) :- A =\= B. 二つのバイトが等しい限り1バイトずつ読み続ける(_ストリーム1,_ストリーム2,_診断) :- それぞれのストリームから1バイトを得る(_ストリーム1,_ストリーム2,C,D), 中身を比較して等しいか等しくないか返す(_ストリーム1,_ストリーム2,C,D,_診断). 二つのバイナリファイルを閉じる(_ストリーム1,_ストリーム2) :- close(_ストリーム1), close(_ストリーム2). % 以下のサイトは :- use_module(library(socket)). :- op(800,xfx,(::)). :- op(850,fx,(!)). (! _目標) :- (keizo97:6013 :: _目標). _ホスト:_ポート :: _目標 :- クライアント(_ホスト,_ポート,findall(_目標,_目標,_目標ならび)), 全解を取り出す(_目標,_目標ならび). クライアント(_ホスト,_ポート, _項) :- 項にfindallを被せて目標として送信する(_ホスト,_ポート,_項,_ソケット,In,Out), ホストから情報受信(In,_行2), 受信情報の評価(_項,_行2,_項2,In,Out). 受信情報の評価(_項,_行2,_項2,In,Out) :- catch(read_term_from_atom(_行2,_項2,[]),E,(ストリームを閉じる(In,Out),fail)), ストリームを閉じる(In,Out), 送信項と受信項の単一化(_項,_項2). ホストから情報受信(In,_行2) :- '% end_of_file行までの表示'(In), 行入力(In,_行2). '% end_of_file行までの表示'(In) :- 行入力(In,_行), '% end_of_file行までの表示'(In,_行). '% end_of_file行までの表示'(In,'% end_of_file') :- !. '% end_of_file行までの表示'(In,_行) :- '% end_of_file行が来るまで表示して行く'(In,_行). '% end_of_file行が来るまで表示して行く'(In,_行) :- format('~w\n',[_行]), 行入力(in,_行2), '% end_of_file行までの表示'(In,_行2). 項にfindallを被せて目標として送信する(_ホスト,_ポート,_項,_ソケット,In,Out) :- サーバと接続する(_ホスト, _ポート,_ソケット), tcp_open_socket(_ソケット, In, Out), 情報を送信する(Out,_項). サーバと接続する(_ホスト, _ポート,_ソケット) :- tcp_socket(_ソケット), tcp_connect(_ソケット, _ホスト:_ポート). 全解を取り出す(P,L) :- member(P,L). 行入力(In,_行) :- read_line_to_codes(In,Codes), atom_codes(_行,Codes). エラー情報の送信(Out,_エラー情報) :- writef('%w\n',[_エラー情報]), format(Out,'~%w\n',[_エラー情報]). 情報を送信する(Out,_項) :- format(Out,'%w\n',[_項]), flush_output(Out). ストリームを閉じる(In,Out) :- close(In), close(Out). 送信項と受信項の単一化(_項,_項). % 以下のサイトは :- use_module(library(socket)). exec(P) :- catch(P,E,fail). サーバ :- サーバ(6013). サーバ(_ポート) :- tcpソケットの準備(_ソケット,_ポート), 接続されたらソケットを開く(_ソケット, AcceptFd, _), tcpインタプリタ(AcceptFd). tcpソケットの準備(_ソケット,_ポート) :- tcp_socket(_ソケット), tcp_bind(_ソケット, _ポート), tcp_listen(_ソケット, 5). 接続されたらソケットを開く(AcceptFd,_ソケット,_Peer,In,Out) :- tcp_accept(AcceptFd, _ソケット, _Peer), tcp_open_socket(_ソケット, In, Out). tcpインタプリタ(AcceptFd) :- repeat, 行を読みだして実行(AcceptFd), fail. 行を読みだして実行(AcceptFd) :- 接続されたらソケットを開く(AcceptFd,_ソケット,_Peer,In,Out), 一行読み出し項に変換(In,_項), インタプリタの実行(_ソケット,In,Out,_項). インタプリタの実行(_ソケット,In,Out,_項) :- 親タスクで実行(In,Out,_項), 小タスクで実行(_ソケット,In,Out,_項). 親タスクで実行(In,Out,_項) :- 項は親タスクで実行するべきもの(_項), 親タスクで実行(In,Out,_項), fail. 親タスクで実行(_,_,_項) :- 項は子タスクで実行するべきもの(_項). 項は親タスクで実行するべきもの(_項) :- _項 = findall(_,exec(_),_). 項は子タスクで実行するべきもの(_項) :- \+(_項 = findall(_,exec(_),_)). 親タスクで実行(In,Out,_項) :- catch(_項,_エラー情報,エラー発生時はfail扱い), 情報を送信する(Out,_項), ストリームを閉じる(In,Out). 小タスクで実行(_ソケット,In,Out,_項) :- tell(Out), thread_create(項を実行して結果を返す(In, Out, _項),_,[]). 項を実行して結果を返す(In, Out, _項) :- 目標評価(In, Out, _項), 情報を送信する(Out,_項), ストリームを閉じる(In,Out). 目標評価(In, Out, _項) :- catch(_項,_エラー情報,エラー情報の送信(Out,_エラー情報),!. 目標評価(In, Out, _項) :- _項=false. 一行読み出し項に変換(In,_項,_エラー情報) :- 行入力(In,_行), 行を解析して項を得る(_行,_項,_エラー情報). 行を解析して項を得る(_行,_項,_エラー情報) :- catch(read_term_from_atom(_行,_項,[]),_エラー情報,_項 = false). 行入力(In,_行) :- read_line_to_codes(In,Codes), atom_codes(_行,Codes). エラー情報の送信(Out,_エラー情報) :- format('~w\n',[_エラー情報]), format(Out,'~w\n',[_エラー情報]). 情報を送信する(Out,_項) :- write(Out,'% end_of_file\n'), 項書き出す(Out,_項). 項を書き出す(Out,_項) :- format(Out,'~w\n',[_項]), flush_output(out). ストリームを閉じる(In,Out) :- close(In), close(Out). 送信項と受信項の単一化(_項,_項). エラー発生時はfail扱い :- fail. % 以下のサイトは スレッドとメッセージキューを使って全解を収集する(_選択項,_副目標,_回収値ならび) :- message_queue_create(_キュー番号), thread_create(スレッドで副目標を実行する(_キュー番号,_選択項,_副目標),_,[]), メッセージを回収する(_キュー番号,_回収値ならび), message_queue_destroy(_キュー番号). スレッドで副目標を実行する(_キュー番号,_選択項,_副目標) :- call(_副目標), thread_send_message(_キュー番号,_選択項), fail. スレッドで副目標を実行する(_キュー番号,_,_) :- thread_send_message(_キュー番号,end_of_file). メッセージを回収する(_キュー番号,_メッセージならび) :- メッセージを確実に得る(_キュー番号,_回収値), メッセージを回収する(_キュー番号,_回収値,_メッセージならび). メッセージを回収する(_キュー番号,end_of_file,[]) :- !. メッセージを回収する(_キュー番号,_回収値,[_回収値|R]) :- メッセージを確実に得る(_キュー番号,_回収値_2), メッセージを回収する(_キュー番号,_回収値_2,R). メッセージを確実に得る(_キュー番号,_メッセージ) :- repeat, thread_peek_message(_キュー番号,_), thread_get_message(_キュー番号,_メッセージ),!. % 以下のサイトは ファイル行入力(_ファイル,_ストリーム,_行) :- open(_ファイル,read,_ストリーム), ストリーム行入力(_ストリーム,_行). ストリーム行入力(_ストリーム,end_of_file) :- 'at_end_of_stream状態になったらストリームをcloseする'(_ストリーム),!. ストリーム行入力(_ストリーム,_行) :- ストリーム行入力を続ける(_ストリーム,_行). 'at_end_of_stream状態になったらストリームをcloseする'(_ストリーム) :- at_end_of_stream(_ストリーム), close(_ストリーム). ストリーム行入力を続ける(_ストリーム,_行) :- 行入力(_ストリーム,_行). ストリーム行入力を続ける(_ストリーム,_行) :- ストリーム行入力(_ストリーム,_行). 行入力(_ストリーム,_行) :- read_line_to_codes(_ストリーム,Codes), atom_codes(_行,Codes). % 以下のサイトは ファイル行入力(_ファイル,_行) :- open(_ファイル,read,_ストリーム), ストリーム行入力(_ストリーム,_行). ストリーム行入力(_ストリーム,end_of_file) :- 'at_end_of_stream状態になったらストリームをcloseする'(_ストリーム),!. ストリーム行入力(_ストリーム,_行) :- ストリーム行入力を続ける(_ストリーム,_行). 'at_end_of_stream状態になったらストリームをcloseする'(_ストリーム) :- at_end_of_stream(_ストリーム), close(_ストリーム). ストリーム行入力を続ける(_ストリーム,_行) :- 行入力(_ストリーム,_行). ストリーム行入力を続ける(_ストリーム,_行) :- ストリーム行入力(_ストリーム,_行). 行入力(_ストリーム,_行) :- read_line_to_codes(_ストリーム,Codes), atom_codes(_行,Codes). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/456 # # [1] 授業単元: C++ # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10195.txt # # 今回はナップサック問題について考えプログラムを作成する。N個の荷物があって、個々の荷物の重さをWi、値段をPiとする。但しiは1からNの整数を意味する。 # 袋には最大Wの重さまで入れられるとすると、最大でいくら分を入れることができるか?という問題。 # データファイルは、始めの一行に荷物の個数Nが書かれており、次に重さが整数でN行分書かれている。その次の行からN行分、それぞれの荷物の価値が書かれているとする。 # 下のデータファイルの場合は、3個の荷物があり、重みは10、20、13、で # それぞれの値段は23、23、10という状況を表す。 # ------------------- # 3 # 10 # 20 # 13 # 23 # 23 # 10 # ------------------- # 荷物の重みと値段はともに、1から100までの乱数で与えることとする。 # void_write_data_file(char*file,intN)という関数を呼ぶとN個分のデータを乱数で生成し、文字列変数fileに入っている # ファイル名のファイルを開き、そこにデータを記録する。void_read_data_file(char*file)という関数を呼ぶと、文字列変数fileによって名前が指定されたファイルを開き、大域変数の荷物の重み配列W[]と値段配列[]\\\\\にデータを入力する。 '荷物の重みと値段はともに、1から100までの乱数で与えることとする。 void_write_data_file(char*file,intN)という関数を呼ぶとN個分のデータを乱数で生成し、文字列変数fileに入っている ファイル名のファイルを開き、そこにデータを記録する。'(_ファイル名,N) :- ファイル名のファイルを開き(_ファイル名), 'そこにデータを記録する。'(N), ファイルを閉じる. ファイル名のファイルを開き(_ファイル名) :- tell(_ファイル名). 'そこにデータを記録する。'(N) :- writef('%w\n',[N]), forall((between(1,N,_),X is random(100) + 1),writef('%w\n',[X])), forall((between(1,N,_),Y is random(100) + 1),writef('%w\n',[Y])). ファイルを閉じる :- told. ナップサック問題(_ファイル名,N,_許容最大重量,_詰めることのできる最高合計金額) :- データファイルから重さならびと価格ならびを得る(_ファイル名,N,_重さならび,_価格ならび), findmax(_合計価格,詰め物の作成(N,_許容最大重量,_重さならび,_価格ならび,_,_合計価格),_詰めることのできる最高合計金額). データファイルから重さならびと価格ならびを得る(_ファイル名,N,_重さならび,_価格ならび) :- データファイルから読み出す(_ファイル名,N,_整数ならび), 重さならびと価格ならびに分離(N,_整数ならび,_重さならび,_価格ならび). データファイルから読み出す(_ファイル名,N,L1) :- see(_ファイル名), get_integer(N), get_integers(L1), seen. 重さならびと価格ならびに分離(N,_整数ならび,_重さならび,_価格ならび) :- length(_重さならび,N), length(_価格ならび,N), append(_重さならび,_価格ならび,_整数ならび). 詰め物の作成(N,_許容最大重量,_重さならび,_価格ならび,_集合,_合計価格) :- findall(M,between(1,N,M),L), 冪集合(L,_冪集合), 許容最大重量内の集合の合計価格(_許容最大重量,_重さならび,_価格ならび,_冪集合,_集合,_合計価格). 許容最大重量内の集合の合計価格(_許容最大重量,_重さならび,_価格ならび,_冪集合,_集合,_合計価格) :- 許容最大重量内の集合(_許容最大重量,_重さならび,_冪集合,_集合), 集合の合計価格(_集合,_価格ならび,_合計価格). 許容最大重量内の集合(_許容最大重量,_重さならび,_冪集合,_集合) :- member(_集合,_冪集合), '集合の重量合計は許容最大重量内'(_許容最大重量,_重さならび,_集合). '集合の重量合計は許容最大重量内'(_許容最大重量,_重さならび,_集合) :- '集合の重量合計は'(_集合,_重さならび,_合計重量), _合計重量 =< _許容最大重量. '集合の重量合計は'(_集合,_重さならび,_合計重量) :- findsum(Wi,( member(_要素,_集合), nth1(_要素,_重さならび,Wi)),_合計重量). 集合の合計価格(_集合,_価格ならび,_合計価格) :- findsum(Pi,( member(_要素,_集合), nth1(_要素,_価格ならび,Pi)),_合計価格). get_integers(L) :- findall(I,(repeat,get_line(Line),(Line=end_of_file,!,fail;read_term_from_atom(Line,I,[]))),L),!. 冪集合(_対象集合,_冪集合) :- findall(_部分集合,( 部分集合(_対象集合,_部分集合)),_冪集合). 部分集合([], []). 部分集合([_|R1], LL) :- 部分集合(R1,LL). 部分集合([L|R1], [L|R2]) :- 部分集合(R1,R2). get_integer(N) :- get_line(Line), read_term_from_atom(Line,N,[]). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). findmax(A,B,C) :- findall(A,B,L), max_list(L,C). % 以下のサイトは # 出典 :: Qiita_47443e0fb2988c1332b2 表(1,×,×,×,×,×). 表(2,×,×,×,○,×). 表(3,×,×,○,×,×). 表(4,×,○,×,×,×). 表(5,×,×,○,○,○). 表(6,×,○,○,×,×). 表(7,×,○,×,○,○). 表(8,×,○,○,○,○). 表(9,○,×,×,×,×). 表(10,○,×,×,○,×). 表(11,○,×,○,×,○). 表(12,○,○,×,×,○). 表(13,○,×,○,○,○). 表(14,○,○,○,×,○). 表(15,○,○,×,○,○). 表(16,○,○,○,○,○). 結婚できるか(_結婚できるか) :- findall(_項目の判定,聞き取り(_項目の判定),[_年収,_身長,_学歴,_親が資産家]), 結婚できるか(_年収,_身長,_学歴,_親が資産家,_結婚できるか). 聞き取り項目(年収,年収). 聞き取り項目(身長,身長). 聞き取り項目(学歴,学歴). 聞き取り項目(親の資産額,親が資産家). 聞き取り(_項目の判定) :- 聞き取り項目の値を得る(_項目,_値), 項目の判定(_項目,_値,_項目の判定). 聞き取り項目の値を得る(_項目,_値) :- 聞き取り項目(_質問,_項目), writef('%t : ',[_質問]), 行入力(_値). 項目の判定(_項目,_値,_項目の判定) :- P =.. [_項目,_値,_項目の判定], call(P). 年収(_年収文字列,○) :- 年収が10000000円以上(_年収文字列),!. 年収(_,×). 年収が10000000円以上(_年収文字列) :- atom_number(_年収文字列,_年収), _年収 >= 10000000. 親が資産家(_資産額文字列,○) :- 親の資産が10000000円以上(_資産額文字列),!. 親が資産家(_,×). 親の資産が10000000円以上(_資産額文字列) :- atom_number(_資産額文字列,_資産額), _資産額 >= 100000000. 身長(_身長文字列,○) :- 身長が180cm以上(_身長文字列),!. 身長(_,×). 身長が180cm以上(_身長文字列) :- atom_number(_身長文字列,_身長), _身長 >= 180. 学歴(_学歴,○) :- 最終学歴の偏差値が65以上(_学歴),!. 学歴(_学歴,×). 最終学歴の偏差値が65以上(_大学卒) :- 入試時点の偏差値(_大学卒,_偏差値), _偏差値 >= 65. 入試時点の偏差値(南河内大学,71). 入試時点の偏差値(私立東京未来大学,62). 結婚できるか(_年収,_身長,_学歴,_親が資産家,結婚できる) :- 表(_,_年収,_身長,_学歴,_親が資産家,○). 結婚できるか(_年収,_身長,_学歴,_親が資産家,結婚できない) :- 表(_,_年収,_身長,_学歴,_親が資産家,×). 行入力(_行文字列) :- 行入力文字ならびを得る(_行入力文字ならび), atom_chars(_行文字列,_行入力文字ならび). 行入力文字ならびを得る(_行入力文字ならび) :- findall(_文字,(文字入力(_文字),(行入力終了(_文字),!,fail;true)),_行入力文字ならび). 文字入力(end_of_file) :- at_end_of_stream(user_input). 文字入力(_文字) :- get_char(_文字). 文字入力(_文字) :- 文字入力(_文字). 行入力終了(end_of_file). 行入力終了('\n'). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #812 # [1] 授業単元:c 反復処理 # [2] 問題文(含コード&リンク): # 整数 a をキーボードから入力し,a が素数かどうか判断するプログラムを作成しなさい.(2〜a/2で整数aを割ったときに全ての値で割り切れなければ,aは素数である.) # サイズm(m<=10)の整数型配列変数aをキーボードから受け取り,a[0],a[1],...,a[n-1]のうちの最大値をディスプレイに表示するプログラムを完成しなさい. # '整数 a をキーボードから入力し,a が素数かどうか判断する' :- '整数 a をキーボードから入力し'(_a), 'a が素数かどうか判断する'(_a,_素数かどうかの判断), writef('%t は %t\n',[_a,_素数かどうかの判断]). '整数 a をキーボードから入力し'(_a) :- 整数を得る('整数 a',_a). 'a が素数かどうか判断する'(_a,素数である) :- _除数になりうる最大値 is _a // 2, 'a が素数かどうか判断する'(2,_除数になりうる最大値,_a),!. 'a が素数かどうか判断する'(_,素数ではない). 'a が素数かどうか判断する'(_除数,_除数になりうる最大値,_) :- _除数 > _除数になりうる最大値. 'a が素数かどうか判断する'(_除数,_除数になりうる最大値,_a) :- 'a が除数で割り切れない限り除数を1ずつ加算して行って判断する'(_除数,_除数になりうる最大値,_a). 'a が除数で割り切れない限り除数を1ずつ加算して行って判断する'(_除数,_除数になりうる最大値,_a) :- 'a が除数で割り切れない限り'(_a,_除数), 除数を1ずつ加算して(_除数,_次の除数), 'a が素数かどうか判断する'(_次の除数,_除数になりうる最大値,_a). 'a が除数で割り切れない限り'(_a,_除数) :- \+(0 is _a mod _除数). 除数を1ずつ加算して(_除数,_次の除数) :- succ(_除数,_次の除数). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 整数を得る(Instream,_催促文ならび,_整数を含む条件,_整数ならび) :- list(_催促文ならび), findall(_整数,( member(_催促文,_催促文ならび), 整数を得る(Instream,_催促文,_整数を含む条件,_整数)), _整数ならび),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 整数を得る'(Line,_整数を含む条件,_整数),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 整数を得る(Instream,_催促文,_整数を含む条件,_整数). '診断: 整数を得る'(end_of_file,_整数を含む条件,end_of_file) :- !. '診断: 整数を得る'('',_,_) :- !,fail. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), '診断: 整数を含む条件'(_整数,_整数を含む条件),!. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- \+((atom_to_term(Line,_整数,_),integer(_整数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]), fail. '診断: 整数を得る'(end_of_file,end_of_file) :- !. '診断: 整数を得る'('',_) :- !,fail. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- call(_整数を含む条件),!. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_整数,_整数を含む条件]), fail. 整数を得る(_催促文,_整数を含む条件,_整数) :- 整数を得る(user_input,_催促文,_整数を含む条件,_整数). 整数を得る(_催促文,_整数) :- 整数を得る(user_input,_催促文,true,_整数). 整数を得る(_整数) :- 整数を得る(user_input,'',true,_整数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). n個の整数を得る(_n,_催促文,_整数ならび) :- length(_整数ならび,_n), findall(_整数,( 部分ならび(_整数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 整数を得る(_催促文,_整数)), _整数ならび). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 164代目 #833 # お願いします。 # [1] 情報処理演習 # [2] 自然数n > 0 を入力として, その自明でない約数(1とその数以外の約数)を一つ出力するプログラムを作 # 成せよ. #  [3.1] Linux #  [3.2] コンパイラ名とバージョン:visual studio 2010 #  [3.3] C言語 # [4] 指定なし # [5] 特になし # # '自然数n > 0 を入力として, その自明でない約数(1とその数以外の約数)を一つ出力する' :- '自然数n > 0 を入力として,'(_n), 'その自明でない約数(1とその数以外の約数)を一つ出力する'(_n,_その自明でない約数),!. '自然数n > 0 を入力として,'(_n) :- 整数を得る('0より大きい自然数',_n > 0,_n). 'その自明でない約数(1とその数以外の約数)を一つ出力する'(_n,_その自明でない約数) :- 'その自明でない約数(1とその数以外の約数)を一つ'(_n,_その自明でない約数), 出力する(_その自明でない約数). 'その自明でない約数(1とその数以外の約数)を一つ'(_n,_その自明でない約数) :- 'その自明でない約数(1とその数以外の約数)を'(_n,L), 一つ(L,_その自明でない約数). 'その自明でない約数(1とその数以外の約数)を'(_n,L) :- findall(_その自明でない約数,'その自明でない約数(1とその数以外の約数)'(_n,_その自明でない約数),L). 'その自明でない約数(1とその数以外の約数)'(_n,_その自明でない約数) :- _n_1 is _n - 1, between(2,_n_1,_その自明でない約数), 0 is _n mod _その自明でない約数. 一つ([H|T],_その自明でない約数) :- length([H|T],Len), _乱数 is random(Len), nth0(_乱数,[H|T],_その自明でない約数). 出力する(_その自明でない約数) :- writef('%t\n',[_その自明でない約数]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 整数を得る(Instream,_催促文ならび,_整数を含む条件,_整数ならび) :- list(_催促文ならび), findall(_整数,( member(_催促文,_催促文ならび), 整数を得る(Instream,_催促文,_整数を含む条件,_整数)), _整数ならび),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 整数を得る'(Line,_整数を含む条件,_整数),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 整数を得る(Instream,_催促文,_整数を含む条件,_整数). '診断: 整数を得る'(end_of_file,_整数を含む条件,end_of_file) :- !. '診断: 整数を得る'('',_,_) :- !,fail. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), '診断: 整数を含む条件'(_整数,_整数を含む条件),!. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- \+((atom_to_term(Line,_整数,_),integer(_整数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]), fail. '診断: 整数を得る'(end_of_file,end_of_file) :- !. '診断: 整数を得る'('',_) :- !,fail. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- call(_整数を含む条件),!. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_整数,_整数を含む条件]), fail. 整数を得る(_催促文,_整数を含む条件,_整数) :- 整数を得る(user_input,_催促文,_整数を含む条件,_整数). 整数を得る(_催促文,_整数) :- 整数を得る(user_input,_催促文,true,_整数). 整数を得る(_整数) :- 整数を得る(user_input,'',true,_整数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). n個の整数を得る(_n,_催促文,_整数ならび) :- length(_整数ならび,_n), findall(_整数,( 部分ならび(_整数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 整数を得る(_催促文,_整数)), _整数ならび). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 164代目 #833 # お願いします。 # [1] 情報処理演習 # [2] 自然数n > 0 を入力として, その自明でない約数(1とその数以外の約数)を一つ出力するプログラムを作 # 成せよ. #  [3.1] Linux #  [3.2] コンパイラ名とバージョン:visual studio 2010 #  [3.3] C言語 # [4] 指定なし # [5] 特になし # # '自然数n > 0 を入力として, その自明でない約数(1とその数以外の約数)を一つ出力する' :- '自然数n > 0 を入力として,'(_n), 'その自明でない約数(1とその数以外の約数)を一つ出力する'(_n,_その自明でない約数),!. '自然数n > 0 を入力として,'(_n) :- 整数を得る('0より大きい自然数',_n > 0,_n). 'その自明でない約数(1とその数以外の約数)を一つ出力する'(_n,_その自明でない約数) :- 'その自明でない約数(1とその数以外の約数)を一つ'(_n,_その自明でない約数), 出力する(_その自明でない約数). 'その自明でない約数(1とその数以外の約数)を一つ'(_n,_その自明でない約数) :- 'その自明でない約数(1とその数以外の約数)を'(_n,L), 一つ(L,_その自明でない約数). 'その自明でない約数(1とその数以外の約数)を'(_n,L) :- findall(_その自明でない約数,'その自明でない約数(1とその数以外の約数)'(_n,_その自明でない約数),L). 'その自明でない約数(1とその数以外の約数)'(_n,_その自明でない約数) :- _n_1 is _n - 1, between(2,_n_1,_その自明でない約数), 0 is _n mod _その自明でない約数. 一つ([H|T],_その自明でない約数) :- length([H|T],Len), _乱数 is random(Len), nth0(_乱数,[H|T],_その自明でない約数). 出力する(_その自明でない約数) :- writef('%t\n',[_その自明でない約数]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 整数を得る(Instream,_催促文ならび,_整数を含む条件,_整数ならび) :- list(_催促文ならび), findall(_整数,( member(_催促文,_催促文ならび), 整数を得る(Instream,_催促文,_整数を含む条件,_整数)), _整数ならび),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 整数を得る'(Line,_整数を含む条件,_整数),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 整数を得る(Instream,_催促文,_整数を含む条件,_整数). '診断: 整数を得る'(end_of_file,_整数を含む条件,end_of_file) :- !. '診断: 整数を得る'('',_,_) :- !,fail. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), '診断: 整数を含む条件'(_整数,_整数を含む条件),!. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- \+((atom_to_term(Line,_整数,_),integer(_整数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]), fail. '診断: 整数を得る'(end_of_file,end_of_file) :- !. '診断: 整数を得る'('',_) :- !,fail. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- call(_整数を含む条件),!. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_整数,_整数を含む条件]), fail. 整数を得る(_催促文,_整数を含む条件,_整数) :- 整数を得る(user_input,_催促文,_整数を含む条件,_整数). 整数を得る(_催促文,_整数) :- 整数を得る(user_input,_催促文,true,_整数). 整数を得る(_整数) :- 整数を得る(user_input,'',true,_整数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). n個の整数を得る(_n,_催促文,_整数ならび) :- length(_整数ならび,_n), findall(_整数,( 部分ならび(_整数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 整数を得る(_催促文,_整数)), _整数ならび). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/726 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # キーボードから入力した10文字以内の任意の文字列の中で、 # ある特定の文字が最初に表れる位置からそれ以降の部分文字列を返す関数 # char *cut_str(char *address1, char target_char)を定義し、 # その動作を確認するkadai7-2.cを作りなさい。 # ただし、文字列と、ある特定の文字の入力は、 # char str[10], target_char; # scanf("%s %c", str, &target_char); # で入力されるものとして、 # 答えは以下で出力されるものとする。 # printf("answer = %s\n", cut_str(str, target_char)); # # 'キーボードから入力した10文字以内の任意の文字列の中で、ある特定の文字が最初に表れる位置からそれ以降の部分文字列を返す'(_ある特定の文字が最初に現れる位置からそれ以降の部分文字列) :- キーボードから入力した10文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字), 'ある特定の文字が最初に現れる位置からそれ以降の部分文字列を返す'(_文字列,_ある特定の文字,_ある特定の文字が最初に現れる位置からそれ以降の部分文字列). キーボードから入力した10文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字) :- 催促の後一行入力して文字列とある特定の文字を得る(_文字列,_ある特定の文字),!. キーボードから入力した10文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字) :- キーボードから入力した10文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字). 催促の後一行入力して文字列とある特定の文字を得る(_文字列,_ある特定の文字) :- 催促の後一行入力する(_入力文字列), 文字列入力診断(_入力文字列,_文字列,_ある特定の文字). 催促の後一行入力する(_入力文字列) :- write('10文字以内の任意の文字列とある特定の文字を空白区切りで入力してください : '), 一行読み込む(_入力文字列,_). 文字列入力診断(_入力文字列,_文字列,_ある特定の文字) :- 文字列とある特定の文字を切り出す(_入力文字列,_文字列,_ある特定の文字), 文字列の長さ診断(_文字列,_ある特定の文字),!. 文字列入力診断(_入力文字列,_,_) :- writef('入力された %t から適切な情報が得られません。再入力をお願いします。\n',[_入力文字列]), fail. 文字列とある特定の文字を切り出す(_入力文字列,_文字列,_ある特定の文字) :- sub_atom(_入力文字列,_文字列,_空白文字列,_ある特定の文字), 空白文字列(_空白文字列), ある特定の文字は先頭文字は空白になり得ない(_ある特定の文字). 空白文字列(_空白文字列) :- sub_atom(_空白文字列,_,1,_,' '), forall(sub_atom(_空白文字列,_,1,_,_文字),_文字 = ' '). ある特定の文字は先頭文字は空白になり得ない(_ある特定の文字) :- \+(sub_atom(_ある特定の文字,0,1,_,' ')). 文字列の長さ診断(_文字列,_ある特定の文字) :- '10文字以内の文字列と1文字のある特定の文字'(_文字列,_ある特定の文字),!. 文字列の長さ診断(_文字列,_ある特定の文字) :- atom_length(_文字列,_文字列の長さ), writef('入力された文字列 %t は%t文字あります。10文字以下の長さで再入力をお願いします\n',[_文字列,_文字列の長さ]), fail. '10文字以内の文字列と1文字のある特定の文字'(_文字列,_ある特定の文字) :- '10文字以内の文字列'(_文字列), '1文字のある特定の文字'(_ある特定の文字). '10文字以内の文字列'(_文字列) :- atom_length(_文字列,_文字列の長さ), _文字列の長さ =< 10. '1文字のある特定の文字'(_ある特定の文字) :- atom_length(_ある特定の文字,1). 'ある特定の文字が最初に現れる位置からそれ以降の部分文字列を返す'(_文字列,_ある特定の文字,_ある特定の文字が最初に現れる位置からそれ以降の部分文字列) :- sub_atom(_文字列,S,_,_,_ある特定の文字), sub_atom(_文字列,S,_,0,_ある特定の文字が最初に現れる位置からそれ以降の部分文字列),!. 一行読み込む(_行,_終了状態) :- 行入力(_行,_終了状態). 行入力(X,_終了状態) :- get_char(C), '行入力/3'(C,Chars,_終了状態), atom_chars(X,Chars). '行入力/3'('\n',[],改行) :- !. '行入力/3'([A],[A],end_of_file) :- at_end_of_stream(user_input),!. '行入力/3'(C,[C|R],_終了状態) :- get_char(C2), '行入力/3'(C2,R,_終了状態). % 以下のサイトは 行文字列入力(_行文字列,_終了状態) :- 一文字を得る(_文字), 文字ならび入力(_文字,_文字ならび,_終了状態), 文字ならびを行文字列に変換する(_行文字列,_文字ならび). 文字ならび入力(_文字,_文字ならび,_終了状態) :- 入力文字が改行またはend_of_fileで終了する(_文字,_文字ならび,_終了状態),!. 文字ならび入力(_文字,_文字ならび,_終了状態) :- 文字を読み込みながら文字ならび入力を続ける(_文字,_文字ならび,_終了状態). 入力文字が改行またはend_of_fileで終了する(end_of_file,[],end_of_file) :- !. 入力文字が改行またはend_of_fileで終了する('\n',[],改行). 文字を読み込みながら文字ならび入力を続ける(_文字,[_文字|R],_終了状態) :- 一文字を得る(_次の文字), 文字ならび入力(_次の文字,R,_終了状態). 一文字を得る(_文字) :- get_char(_文字). 文字ならびを行文字列に変換する(_行文字列,_文字ならび) :- atom_chars(_行文字列,_文字ならび). % 以下のサイトは 行入力(_行,_終了状態) :- 一文字を得る(_文字), 文字ならび入力(_文字,_文字ならび,_終了状態), atom_chars(_行,_文字ならび). 文字ならび入力(_文字,_文字ならび,_終了状態) :- 入力文字が改行またはend_of_fileで終了する(_文字,_文字ならび,_終了状態),!. 文字ならび入力(_文字,_文字ならび,_終了状態) :- 文字を読み込みながら文字ならび入力を続ける(_文字,_文字ならび,_終了状態). 入力文字が改行またはend_of_fileで終了する(end_of_file,[],end_of_file) :- !. 入力文字が改行またはend_of_fileで終了する('\n',[],改行). 文字を読み込みながら文字ならび入力を続ける(_文字,[_文字|R],_終了状態) :- 一文字を得る(_次の文字), 文字ならび入力(_次の文字,R,_終了状態). 一文字を得る(_文字) :- get_char(_文字). % 以下のサイトは # 出典 :: CodeIQ q1565 # 【問題】 # できるだけ多くの人数で、肩車をしようと思います。 #      # # 肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。 # # # 【例】 # 一行ごとに、身長と体重のセットが与えられます。次の例は、5人の身長と体重を表しています。 # 166 71 # 178 84 # 176 94 # 174 85 # 174 65 # # # この中から肩車をする人間を選ぶと、身長と体重が # (166, 71) # (174, 85) # (176, 94) # の3人が最大人数になります。 # # ※身長と体重共に、上の人が下の人“より小さい”場合に肩車が許されるとしていますので、 #  (174, 85)の上に(174, 65)が乗ることはできません。 'できるだけ多くの人数で、肩車をしようと思います。      肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'(_最大人数) :- 身長と体重のセットを得る(_身長と体重のセット), 'できるだけ多くの人数で、肩車をしようと思います。'(_身長と体重のセット,_最大人数). 身長と体重のセットを得る(_身長と体重のセット) :- 行を得る(_行,_終了状態), 身長と体重のセットを得る(_終了状態,_行,_身長と体重のセット). 身長と体重のセットを得る(入力終了,_,[]) :- !. 身長と体重のセットを得る(_,_行,_身長体重ならび) :- 入力終了になるまで行入力を続ける(_,_行,_身長体重ならび). 入力終了になるまで行入力を続ける(_,_行,[[_身長,_体重]|_残りの行ならび]) :- read_term_from_atom(_行,(_身長,_体重),[]), 行を得る(_次の行,_終了状態), 身長と体重のセットを得る(_終了状態,_次の行,_残りの行ならび). 'できるだけ多くの人数で、肩車をしようと思います。'(_人間ならび,_最大人数) :- findall(_肩車人数,( 肩車人数(_人間ならび,_肩車人数)),_肩車人数ならび), max_list(_肩車人数ならび,_最大人数). 肩車人数(_人間ならび,_肩車人数) :- select(_取りだされた人間,_人間ならび,_残りの人間ならび), 肩車を重ねる(_取りだされた人間,_残りの人間ならび,_肩車重ね), length(_肩車重ね,_肩車人数). 肩車を重ねる(_自分,_人間ならび,[_自分|_肩車重ね]) :- 上の人を選択できる限り選択する(_自分,_人間ならび,_肩車重ね). 肩車を重ねる(_一番上の人間,_,[_一番上の人間]). 上の人を選択できる限り選択する(_自分,_人間ならび,_肩車重ね) :- select(_上の人間,_人間ならび,_残りの人間ならび), '肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'(_上の人間,_自分), 肩車を重ねる(_上の人間,_残りの人間ならび,_肩車重ね). '肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'([_上の人間の身長,_上の人間の体重],[_自分の身長,_自分の体重]) :- _上の人間の身長 @< _自分の身長, _上の人間の体重 @< _自分の体重. 行を得る(_行,_終了状態) :- get_char(_文字), 行を得る(_文字,_文字ならび,_終了状態), atomic_list_concat(_文字ならび,_行). 行を得る(_入力文字,[],_終了状態) :- 入力文字が改行文字またはend_of_fileの時停止する(_入力文字,_終了状態),!. 行を得る(_文字,_行ならび,_終了状態) :- 行を得るために文字入力を続ける(_文字,_行ならび,_終了状態). 入力文字が改行文字またはend_of_fileの時停止する('\n',改行終了). 入力文字が改行文字またはend_of_fileの時停止する(end_of_file,入力終了). 行を得るために文字入力を続ける(_文字,[_文字|_残りの文字ならび],_終了状態) :- get_char(_次の文字), 行を得る(_次の文字,_残りの文字ならび,_終了状態). % 以下のサイトは # 出典 :: CodeIQ q1565 # 【問題】 # できるだけ多くの人数で、肩車をしようと思います。 #      # # 肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。 # # # 【例】 # 一行ごとに、身長と体重のセットが与えられます。次の例は、5人の身長と体重を表しています。 # 166 71 # 178 84 # 176 94 # 174 85 # 174 65 # # # この中から肩車をする人間を選ぶと、身長と体重が # (166, 71) # (174, 85) # (176, 94) # の3人が最大人数になります。 # # ※身長と体重共に、上の人が下の人“より小さい”場合に肩車が許されるとしていますので、 #  (174, 85)の上に(174, 65)が乗ることはできません。 'できるだけ多くの人数で、肩車をしようと思います。      肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'(_最大人数) :- 身長と体重のセットを得る(_身長と体重のセット), 'できるだけ多くの人数で、肩車をしようと思います。'(_身長と体重のセット,_最大人数). 身長と体重のセットを得る(_身長と体重のセット) :- 行を得る(_行,_終了状態), 身長と体重のセットを得る(_終了状態,_行,_身長と体重のセット). 身長と体重のセットを得る(入力終了,_,[]) :- !. 身長と体重のセットを得る(_,_行,_身長体重ならび) :- 入力終了になるまで行入力を続ける(_,_行,_身長体重ならび). 入力終了になるまで行入力を続ける(_,_行,[[_身長,_体重]|_残りの行ならび]) :- read_term_from_atom(_行,(_身長,_体重),[]), 行を得る(_次の行,_終了状態), 身長と体重のセットを得る(_終了状態,_次の行,_残りの行ならび). 'できるだけ多くの人数で、肩車をしようと思います。'(_人間ならび,_最大人数) :- findall(_肩車人数,( 肩車人数(_人間ならび,_肩車人数)),_肩車人数ならび), max_list(_肩車人数ならび,_最大人数). 肩車人数(_人間ならび,_肩車人数) :- select(_取りだされた人間,_人間ならび,_残りの人間ならび), 肩車を重ねる(_取りだされた人間,_残りの人間ならび,_肩車重ね), length(_肩車重ね,_肩車人数). 肩車を重ねる(_自分,_人間ならび,[_自分|_肩車重ね]) :- 上の人を選択できる限り選択する(_自分,_人間ならび,_肩車重ね). 肩車を重ねる(_一番上の人間,_,[_一番上の人間]). 上の人を選択できる限り選択する(_自分,_人間ならび,_肩車重ね) :- select(_上の人間,_人間ならび,_残りの人間ならび), '肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'(_上の人間,_自分), 肩車を重ねる(_上の人間,_残りの人間ならび,_肩車重ね). '肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'([_上の人間の身長,_上の人間の体重],[_自分の身長,_自分の体重]) :- _上の人間の身長 @< _自分の身長, _上の人間の体重 @< _自分の体重. 行を得る(_行,_終了状態) :- get_char(_文字), 行を得る(_文字,_文字ならび,_終了状態), atomic_list_concat(_文字ならび,_行). 行を得る(_入力文字,[],_終了状態) :- 入力文字が改行文字またはend_of_fileの時停止する(_入力文字,_終了状態),!. 行を得る(_文字,_行ならび,_終了状態) :- 行を得るために文字入力を続ける(_文字,_行ならび,_終了状態). 入力文字が改行文字またはend_of_fileの時停止する('\n',改行終了). 入力文字が改行文字またはend_of_fileの時停止する(end_of_file,入力終了). 行を得るために文字入力を続ける(_文字,[_文字|_残りの文字ならび],_終了状態) :- get_char(_次の文字), 行を得る(_次の文字,_残りの文字ならび,_終了状態). % 以下のサイトは # 出典 :: CodeIQ q1347 # # 3人の几帳面な男たちがいました。 # ジェシー「みかんをたくさん頂いたんだ。みんなで分けようYO!」 # ダニエル「イイネ!…ええと、みかんは全部で30個あるみたいだから、ひとり10個ずつならきちんと分けられるNE!」 # ジョゼフ「それだけじゃダメだYO!みかんは一つひとつ大きさが違うんだから、その辺も考えてきっちり分けNIGHT!」 # # # 【問題】 # # 30個のみかんがあります。3人で10個ずつ分けようと思いますが、不公平にならないよう、みかんの重さの合計が均一になるように分けてください。たとえば、次のような重さのみかん6個 # 101g # 103g # 110g # 105g # 114g # 112g # # を、3人で2つずつ分ける場合、重さの合計が等しくなるように分けると # (101g, 114g) # (103g, 112g) # (105g, 110g) # # のように、合計が215グラムになるように分けることができます。 # # みかんの重さのデータを標準入力から読み込み、それを重さの合計・個数ともに3等分するプログラムを書いてください。 # # # 【入力】 # # 入力はテキストファイルで用意されています。これを標準入力から読み込んでください。 # 入力ファイルの1行目には、みかんの個数Nが与えられます。 # 2行目以降のN行分が、みかんの重さ(正の整数)です。 # # # 【出力】 # # 標準出力に、3等分したみかんのグループを出力してください。 # 1行につき1グループ、計3行を出力します。それ以外は出力しないでください。 # 分け方が複数ある場合、その中の1種類だけを出力してください。 # # # 【入出力例】 # # - sample1.in.txt # 6 # 101 # 103 # 110 # 105 # 114 # 112 # # - sample1.out.txt # (101, 114) # (103, 112) # (105, 110) # # # # - sample2.in.txt # 12 # 147 # 105 # 99 # 116 # 105 # 119 # 93 # 132 # 123 # 95 # 101 # 82 # # - sample2.out.txt # (82, 105, 105, 147) # (93, 95, 119, 132) # (99, 101, 116, 123) '入力ファイルからみかんの重さならびを得て、三人とも同量の重さで、配分した候補を得て、重複を取り除いて出力する'(_入力ファイル,_出力ファイル) :- '入力ファイルからみかんの重さならびを得て、三人とも同量の重さで'(_入力ファイル,_みかんの重さならび,_一人あたりの重さ合計), 配分した候補を得て(_みかんの重さならび,_一人あたりの重さ合計,_重複を許す配分した候補), 重複を取り除いて出力する(_出力ファイル,_重複を許す配分した候補). '入力ファイルからみかんの重さならびを得て、三人とも同量の重さで'(_入力ファイル,_みかんの重さならび,_一人あたりの重さ合計) :- 入力ファイルからみかんの重さならびを得て(_入力ファイル,_みかんの重さならび), sum_list(_みかんの重さならび,_みかんの重さの合計), _一人あたりの重さ合計 is _みかんの重さの合計 // 3. 入力ファイルからみかんの重さならびを得て(_入力ファイル,_みかんの重さならび) :- see(_入力ファイル), 先頭行から行数を得る(_みかんの個数), 残り行からみかんの重さならびを得る(_みかんの個数,_みかんの重さならび), seen. 先頭行から行数を得る(_行数) :- 整数入力(_行数). 残り行からみかんの重さならびを得る(_みかんの個数,_みかんの重さならび) :- findall(_みかんの重さ,( between(1,_みかんの個数,_), 整数入力(_みかんの重さ)),_みかんの重さならび). 配分した候補を得て(_みかんの重さならび,_合計目標,_重複を許す配分した候補) :- findall(LL,同量に配分する(_みかんの重さならび,_合計目標,[],LL),_重複を許す配分した候補). 同量に配分する([],_,LL,LL). 同量に配分する(_みかんの重さならび,_合計目標,LL1,LL) :- 組み合計を得る(_みかんの重さならび,_合計目標,[],L,_残りみかんの重さならび), forall(member(L1,LL1),L1 @>= L), 同量に配分する(_残りみかんの重さならび,_合計目標,[L|LL1],LL). 組み合計を得る(_残りみかんの重さならび,_合計目標,L,L,_残りみかんの重さならび) :- sum_list(L,_合計目標). 組み合計を得る(_みかんの重さならび_1,_合計目標,L1,L,_残りみかんの重さならび) :- select(_一個,_みかんの重さならび_1,_残りみかんの重さならび_2), forall(member(A,L1),A @>= _一個), 組み合計を得る(_残りみかんの重さならび_2,_合計目標,[_一個|L1],L,_残りみかんの重さならび). 重複を取り除いて出力する(_出力ファイル,_重複を許す配分した候補) :- 重複なく昇順に整列する(_重複を許す配分した候補,_候補リスト), 一行ずつ出力する(_出力ファイル,_候補リスト). 重複なく昇順に整列する(L1,L2) :- 重複なく昇順に整列する(L1,[],L2). 重複なく昇順に整列する([],L,L). 重複なく昇順に整列する([_軸要素|L1],L2,L3) :- 重複のない昇順分割(_軸要素,L1,LS,LB), 重複なく昇順に整列する(LS,[_軸要素|L3_2],L3), 重複なく昇順に整列する(LB,L2,L3_2). 重複のない昇順分割(_,[],[],[]). 重複のない昇順分割(_軸要素,[A|R1],[A|R2],R3) :- A @< _軸要素, 重複のない昇順分割(_軸要素,R1,R2,R3). 重複のない昇順分割(_軸要素,[A|R1],R2,[A|R3]) :- A @> _軸要素, 重複のない昇順分割(_軸要素,R1,R2,R3). 重複のない昇順分割(_軸要素,[_軸要素|R1],R2,R3) :- 重複のない昇順分割(_軸要素,R1,R2,R3). 一行ずつ出力する(_出力ファイル,_候補リスト) :- tell(_出力ファイル), forall(member(_三人分のみかんの重さならび,_候補リスト),配分候補ならびを三行で出力する(_三人分のみかんの重さならび)), told. 配分候補ならびを三行で出力する(_三人分のみかんの重さならび) :- forall(member(_みかんの重さならび,_三人分のみかんの重さならび),( 表示パターンのつくり(_みかんの重さならび,_表示パターン), writef(_表示パターン,_みかんの重さならび))). 表示パターンのつくり(_みかんの重さならび,_表示パターン) :- length(_みかんの重さならび,_要素数), findall('%t',between(1,_要素数,_),_表示パターンならび), atomic_list_concat(_表示パターンならび,',',_表示パターン_1), atomic_list_concat(['(',_表示パターン_1,')\n'],_表示パターン). 整数入力(_整数) :- 行入力(_行), read_term_from_atom(_行,_整数,[]). 行入力(_行) :- get_char(_文字), 行の文字ならび(_文字,_行の文字ならび), atom_chars(_行,_行の文字ならび). 行の文字ならび(end_of_file,[]) :- !. 行の文字ならび('\n',[]) :- !. 行の文字ならび(_文字,[_文字|R]) :- get_char(_次の文字), 行の文字ならび(_次の文字,R). ユーザパラメータならび(_ユーザパラメータならび) :- current_prolog_flag(argv,_ユーザパラメータならび). program :- ユーザパラメータならび([_入力ファイル,_出力ファイル]), '入力ファイルからみかんの重さならびを得て、三人とも同量の重さで、配分した候補を得て、重複を取り除いて出力する'(_入力ファイル,_出力ファイル). :- program,halt. % 以下のサイトは # 最大の利益 # FX取引では、異なる国の通貨を交換することで為替差の利益を得ることができます。例えば、1ドル100円の時に 1000ドル買い、価格変動により 1ドル 108円になった時に売ると、(108円 − 100円) × 1000ドル = 8000円の利益を得ることができます。 # # ある通貨について、時刻 t における価格 R[t] (t=1,2,,,N)が入力として与えられるので、価格の差 R[j]−R[i] (ただし、j>i とする) の最大値を求めてください。 # # 入力 # 最初の行に整数 N が与えられる。 # # 続くN行に整数 R[t] (t=1,2,,,N) が順番に与えられる。 # # 出力 # 最大値を1行に出力せよ。 # # 制約 # 2?N?200000 # 1?R[t]?109 # 入力例 1 # 6 # 2 # 3 # 1 # 3 # 4 # 3 # 入力例 1 に対する出力 # 3 # 入力例 2 # 4 # 4 # 1 # 2 # 1 # 入力例 2 に対する出力 # 1 'FX取引では、異なる国の通貨を交換することで為替差の利益を得ることができます。 例えば、1ドル100円の時に 1000ドル買い、価格変動により 1ドル 108円になった時に売ると、 (108円 − 100円) × 1000ドル = 8000円の利益を得ることができます。 ある通貨について、時刻 t における価格 R[t] (t=1,2,,,N)が入力として与えられるので、 価格の差 R[j]−R[i] (ただし、j>i とする) の最大値を求めてください。' :- ある通貨の時系列為替価格ならびを得る(_ある通貨の時系列為替価格ならび), 最大の為替差の利益(_ある通貨の時系列為替価格ならび,_最大の為替差の利益), 最大の為替差の利益を表示する(_最大の為替差の利益). ある通貨の時系列為替価格ならびを得る(_ある通貨の時系列価格ならび) :- 時系列数を得る(_時系列数), findall(_価格,( 価格を得る(_時系列数,_価格)), _ある通貨の時系列価格ならび). 時系列数を得る(_時系列数) :- 整数を得る(_時系列数). 価格を得る(_時系列数,_価格) :- between(1,_時系列数,_t), 整数を得る(_価格). 最大の為替差の利益(_ある通貨の時系列価格ならび,_最大の為替差の利益) :- findmax(_時刻tの投資に対する最大利益,( 時刻tの投資に対する最大利益(_ある通貨の時系列価格ならび,_時刻tの投資に対する最大利益)), _最大の為替差の利益). 時刻tの投資に対する最大利益(_ある通貨の時系列価格ならび,_時刻tの投資に対する最大利益) :- append(_,[_時刻tの価格|_その後の価格ならび],_ある通貨の時系列価格ならび), 時刻tの投資に対する最大利益(_時刻tの価格,_その後の価格ならび,_時刻tの投資に対する最大利益). 時刻tの投資に対する最大利益(_時刻tの価格,_その後の価格ならび,_時刻tの投資に対する最大利益) :- findmax(_時刻tの価格との価格差,( 時刻tの価格との価格差(_時刻tの価格,_その後の価格ならび,_時刻tの価格との価格差)), _時刻tの投資に対する最大利益). 時刻tの価格との価格差(_時刻tの価格,_その後の価格ならび,_時刻tの価格との価格差) :- member(_その後の時系列での価格,_その後の価格ならび), _時刻tの価格との価格差 is _その後の時系列での価格 - _時刻tの価格. 最大の為替差の利益を表示する(_最大の為替差の利益) :- writef('%t\n',[_最大の為替差の利益]). findmax(A,B,C) :- findall(A,B,L), max_list(L,C). % % 整数を入力する場合の一般型 % 整数を得る(Instream,_催促文ならび,_整数を含む条件,_整数ならび) :- list(_催促文ならび), findall(_整数,( member(_催促文,_催促文ならび), 整数を得る(Instream,_催促文,_整数を含む条件,_整数)), _整数ならび),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 整数を得る'(Line,_整数を含む条件,_整数),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 整数を得る(Instream,_催促文,_整数を含む条件,_整数). '診断: 整数を得る'(end_of_file,_整数を含む条件,end_of_file) :- !. '診断: 整数を得る'('',_,_) :- !,fail. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), '診断: 整数を含む条件'(_整数,_整数を含む条件),!. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- \+((atom_to_term(Line,_整数,_),integer(_整数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]), fail. '診断: 整数を得る'(end_of_file,end_of_file) :- !. '診断: 整数を得る'('',_) :- !,fail. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- call(_整数を含む条件),!. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_整数,_整数を含む条件]), fail. 整数を得る(_催促文,_整数を含む条件,_整数) :- 整数を得る(user_input,_催促文,_整数を含む条件,_整数). 整数を得る(_催促文,_整数) :- 整数を得る(user_input,_催促文,true,_整数). 整数を得る(_整数) :- 整数を得る(user_input,'',true,_整数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). n個の整数を得る(_n,_催促文,_整数ならび) :- length(_整数ならび,_n), findall(_整数,( 部分ならび(_整数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 整数を得る(_催促文,_整数)), _整数ならび). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. % 以下のサイトは 標準入力から整数を得る(_催促文言,_検査述語,_整数) :- 催促文言を表示して標準入力から整数を得て検査述語を実行する(_催促文言,_検査述語,_整数),!. 標準入力から整数を得る(_催促文言,_検査述語,_整数) :- 標準入力から整数を得る(_催促文言,_検査述語,_整数). 催促文言を表示して標準入力から整数を得て検査述語を実行する(_催促文言,_検査述語,_整数) :- 催促文言を表示して標準入力から整数を得て(_催促文言,_整数), 検査述語を実行する(_検査述語). 催促文言を表示して標準入力から整数を得て(_催促文言,_整数) :- 催促文言を表示して(_催促文言), 標準入力から整数を得る(_整数). 催促文言を表示して(_催促文言) :- 催促文言の編集(_催促文言,_編集された催促文言), writef('%tを入力してください : ',[_編集された催促文言]). 催促文言の編集(表示しない,'') :- !. 催促文言の編集(_催促文言,_編集された催促文言) :- atom_concat(_催促文言,'を入力して下さい : ',_編集された催促文言). 検査述語を実行する(_検査述語) :- _検査述語. 標準入力から整数を得る(_整数) :- 標準入力から文字列を得る(_文字列), 整数入力検査(_文字列,_整数),!. 標準入力から整数を得る(_整数) :- 標準入力から整数を得る(_整数). 整数入力検査(_文字列,_整数) :- 入力文字列から整数が得られる(_文字列,_整数),!. 整数入力検査(_文字列,_) :- 入力文字列から整数が得られない(_文字列,_). 入力文字列から整数が得られる(_文字列,_整数) :- catch(read_term_from_atom(_文字列,_整数,[valiables(_入力された変数),valiable_names(_入力された変数名)]),E,fail), integer(_整数). 入力文字列から整数が得られない(_文字列,_) :- writef('入力された文字列 %t からは整数が得られません。再入力をお願いします: \n',[_文字列]), fail. 標準入力から文字列を得る(_文字列) :- findall(_文字,( 標準入力から一文字を得る(_文字), (入力終了文字(_文字),!,fail;true)),Chars), atom_chars(_文字列,Chars). 標準入力から一文字を得る(_文字) :- get_char(_文字). 標準入力から一文字を得る(_文字) :- 標準入力から一文字を得る(_文字). 入力終了文字('\n'). 入力終了文字(end_of_file). % 以下のサイトは # 問題文 # 高橋君の国では、N 種類の硬貨が使われています。 1 番目の硬貨の価値は 1 円です。 k 番目の硬貨の価値は、k−1 番目の硬貨の 10 倍あります。 つまり、2 番目の硬貨は 10 円の価値があり、5 番目の硬貨は 10000 円の価値があります。 # # 高橋君は、お釣りが嫌いです。なので、出来るだけぴったりの金額で買い物がしたいと思っています。 そこで高橋君は、今持っている硬貨で、何種類の金額が払えるかを調べたいと思いました。 # # 高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # N # A1 # A2 # : # AN # 1 行目には、硬貨の種類数 N(1≦N≦50) が、1 行で与えられる。 # 2 行目から N 行では、高橋君が各硬貨を何枚持っているかが与えられる。 このうち i(1≦i≦N) 行目では、 i 番目の硬貨を、高橋君が何枚持っているかを表す整数 Ai(0≦Ai≦50000)が与えられる。 # 出力 # 高橋君が払える金額の種類数を、 1000000007 で割った余りを 1 行で出力せよ。出力の末尾は改行をいれること。 # # 入力例1 # 2 # 2 # 1 # 出力例1 # 5 # 払える金額は、1 円, 2 円, 10 円, 11 円, 12 円の 5 通りとなります。 # # 0 円は含まないことに注意してください。 # # 入力例2 # 2 # 32 # 3 # 出力例2 # 62 # 1 円から 62 円の 62 通りの金額を支払うことが出来ます。 # # 入力例3 # 4 # 12 # 3 # 7 # 34 # 出力例3 # 12039 # 入力例4 # 10 # 1234 # 2 # 857 # 3858 # 1 # 5000 # 32 # 4 # 1 # 857 # 出力例4 # 969347336 # 1000000007 で割った余りを出力してください。 # '高橋君の国では、N 種類の硬貨が使われています。 1 番目の硬貨の価値は 1 円です。 k 番目の硬貨の価値は、k‐1 番目の硬貨の 10 倍あります。 つまり、2 番目の硬貨は 10 円の価値があり、5 番目の硬貨は 10000 円の価値があります。 高橋君は、お釣りが嫌いです。なので、出来るだけぴったりの金額で買い物がしたいと思っています。 そこで高橋君は、今持っている硬貨で、何種類の金額が払えるかを調べた いと思いました。 高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるた め、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。' :- 何種類かとそれぞれの硬貨の枚数を得る(_何種類,_種類別枚数ならび), 最大何通り(_種類別枚数ならび,_最大何通り), 最大可能性から重複を差し引く(_種類別枚数ならび,_最大何通り,_何通り), '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り). 何種類かとそれぞれの硬貨の枚数を得る(_何種類,_枚数ならび) :- 標準入力から整数を得る(_何種類), findall([M,_整数],( between(1,_何種類,N), succ(M,N), 標準入力から整数を得る(_整数)), _枚数ならび). 最大何通り(_種類別枚数ならび,_最大何通り) :- 最大何通り(_種類別枚数ならび,1,_最大何通り). 最大何通り([],_最大何通り,_最大何通り). 最大何通り([[_,0]|R]],_最大何通り,_最大何通り) :- 最大何通り(R,_最大何通り,_最大何通り),!. 最大何通り([[A,B]|R],N,_最大何通り) :- N_2 is B * N, 最大何通り(R,N_2,_最大何通り). 最大可能性から重複を差し引く(_種類別枚数ならび,_最大何通り,_何通り) :- findsum(_差し引き数,( append(L1,[[_種類,_枚数]|L2],_種類別枚数ならび), 差し引き数(_種類,_枚数,L1,_差し引き数)), _重複差し引き数), _何通り is _最大何通り - _重複差し引き数. 差し引き数(_種類_1,_枚数_1,L1,_差し引き数)) :- findsum(_差し引き数_3,( member([_種類,_枚数],L1), _差し引き数_1 is _枚数_1 // (_種類_1 // _種類), _差し引き数_2 is _枚数 // (_種類_1 // _種類), 差し引き数選択(_差し引き数_1,_差し引き数_2,_差し引き数_3)), _差し引き数). 差し引き数選択(_差し引き数_1,_差し引き数_2,_差し引き数_1) :- _差し引き数_1 =< _差し引き数_2,!. 差し引き数選択(_差し引き数_1,_差し引き数_2,_差し引き数_2). '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り) :- '1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り),!. '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り) :- writef('%t何通り\n',[_何通り]). '1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り) :- _何通り >= 1000000007, _何通りを1000000007で割った余り is _何通り mod 1000000007, writef('%t何通り\n',[_何通りを1000000007で割った余り]). 標準入力から整数を得る(_整数) :- 標準入力から文字列を得る(_文字列), 整数入力検査(_文字列,_整数),!. 標準入力から整数を得る(_整数) :- 標準入力から整数を得る(_整数). 整数入力検査(_文字列,_整数) :- catch(read_term_from_atom(_文字列,_整数,[]),E,fail), integer(_整数),!. 標準入力から文字列を得る(_文字列) :- findall(_文字,( 標準入力から一文字を得る(_文字), (終了文字(_文字),!,fail;true)),Chars), atom_chars(_文字列,Chars). 標準入力から一文字を得る(_文字) :- get_char(_文字). 標準入力から一文字を得る(_文字) :- 標準入力から一文字を得る(_文字). 終了文字('\n'). 終了文字(end_of_file). % 以下のサイトは # 問題文 # 高橋君の国では、N 種類の硬貨が使われています。 1 番目の硬貨の価値は 1 円です。 k 番目の硬貨の価値は、k−1 番目の硬貨の 10 倍あります。 つまり、2 番目の硬貨は 10 円の価値があり、5 番目の硬貨は 10000 円の価値があります。 # # 高橋君は、お釣りが嫌いです。なので、出来るだけぴったりの金額で買い物がしたいと思っています。 そこで高橋君は、今持っている硬貨で、何種類の金額が払えるかを調べたいと思いました。 # # 高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # N # A1 # A2 # : # AN # 1 行目には、硬貨の種類数 N(1≦N≦50) が、1 行で与えられる。 # 2 行目から N 行では、高橋君が各硬貨を何枚持っているかが与えられる。 このうち i(1≦i≦N) 行目では、 i 番目の硬貨を、高橋君が何枚持っているかを表す整数 Ai(0≦Ai≦50000)が与えられる。 # 出力 # 高橋君が払える金額の種類数を、 1000000007 で割った余りを 1 行で出力せよ。出力の末尾は改行をいれること。 # # 入力例1 # 2 # 2 # 1 # 出力例1 # 5 # 払える金額は、1 円, 2 円, 10 円, 11 円, 12 円の 5 通りとなります。 # # 0 円は含まないことに注意してください。 # # 入力例2 # 2 # 32 # 3 # 出力例2 # 62 # 1 円から 62 円の 62 通りの金額を支払うことが出来ます。 # # 入力例3 # 4 # 12 # 3 # 7 # 34 # 出力例3 # 12039 # 入力例4 # 10 # 1234 # 2 # 857 # 3858 # 1 # 5000 # 32 # 4 # 1 # 857 # 出力例4 # 969347336 # 1000000007 で割った余りを出力してください。 # '高橋君の国では、N 種類の硬貨が使われています。 1 番目の硬貨の価値は 1 円です。 k 番目の硬貨の価値は、k‐1 番目の硬貨の 10 倍あります。 つまり、2 番目の硬貨は 10 円の価値があり、5 番目の硬貨は 10000 円の価値があります。 高橋君は、お釣りが嫌いです。なので、出来るだけぴったりの金額で買い物がしたいと思っています。 そこで高橋君は、今持っている硬貨で、何種類の金額が払えるかを調べた いと思いました。 高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるた め、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。' :- 何種類かとそれぞれの硬貨の枚数を得る(_何種類,_枚数ならび), 硬貨の合計金額種類(_枚数ならび,_何通り), '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り). 何種類かとそれぞれの硬貨の枚数を得る(_何種類,_枚数ならび) :- 標準入力から整数を得る(_何種類), findall(_整数,( between(1,_何種類,_), 標準入力から整数を得る(_整数)), _枚数ならび). 硬貨の合計金額種類(_枚数ならび,_何通り) :- findall(_合計金額,合計金額(0,_枚数ならび,0,_合計金額),L1), sort(L1,L2), length(L2,_何通り). 合計金額(N,[],_合計金額,_合計金額). 合計金額(N,[_枚数|R],_合計金額_1,_合計金額) :- '1から枚数分を増やして合計金額を非決定性に計算していく'(N,_枚数,_ご金額金額_1,_合計金額_2), succ(N,N_2), 合計金額(N_2,R,_合計金額_2,_合計金額). '1から枚数分を増やして合計金額を非決定的に計算していく'(N,_枚数,_合計金額_1,_合計金額_2) :- between(1,_枚数,M), _合計金額_2 is _合計金額_1 + 10 ^ N * M. '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_種類) :- '1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_種類),!. '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_種類) :- writef('%t種類\n',[_種類]). '1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_種類) :- _種類 >= 1000000007, _種類を1000000007で割った余り is _種類 mod 1000000007, writef('%t種類\n',[_種類を1000000007で割った余り]). 標準入力から整数を得る(_整数) :- 標準入力から文字列を得る(_文字列), 整数入力検査(_文字列,_整数),!. 標準入力から整数を得る(_整数) :- 標準入力から整数を得る(_整数). 整数入力検査(_文字列,_整数) :- catch(read_term_from_atom(_文字列,_整数,[]),E,fail), integer(_整数),!. 標準入力から文字列を得る(_文字列) :- findall(_文字,( 標準入力から一文字を得る(_文字), (終了文字(_文字),!,fail;true)),Chars), atom_chars(_文字列,Chars). 標準入力から一文字を得る(_文字) :- get_char(_文字). 標準入力から一文字を得る(_文字) :- 標準入力から一文字を得る(_文字). 終了文字('\n'). 終了文字(end_of_file). % 以下のサイトは # 問題文 # (21:13 追記) |A|=|B|=1のケースがテスト中に一つ含まれていましたので、リジャッジを行います。なお、このケースでNOを出力するプログラムに影響はありません。 # # 文字列 A の文字をちょうど 3 回スワップすることにより、文字列 B に変換できるとき、二つの文字列 A, B を、仲良し文字列と呼ぶことにします。 # # スワップとは、文字列に含まれる 2 つの文字を、入れ替えることを指します。 例えば、abcという文字列であれば、aとcを入れ替えて、cbaのように変換することが出来ます。 # # aaのような文字列に対し、 1 文字目のaと、 2 文字目のaを入れ替えることは許されていますが、同じ場所の文字を指定することはできません。 # # 文字列 A, B が与えられるので、仲良し文字列になっているかどうかを判定しなさい。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # A # B # 1 行目には、文字列 A(2≦|A|≦1000) が与えられる。 # 2 行目には、文字列 B(|B|=|A|) が与えられる。 # A, B 共に、小文字アルファベットのみで構成されていることが保障されている。 # 出力 # 与えられた 2 つの文字列が、仲良し文字列であればYES、そうでなければNOを出力せよ。 出力の末尾には改行をいれること。 # # 入力例1 # abcdef # fedcba # 出力例1 # YES # まず、文字列 A のabcdefのaとfをスワップし、fbcdeaとします。 # # 次に、bとeをスワップし、fecdbaとします。 # # 最後に、cとdをスワップし、fedcbaとすると、文字列 B と一致します。 # # よって、この 2 つの文字列は、仲良し文字列となるため、YESと出力します。 # # 入力例2 # abababab # babababa # 出力例2 # NO # 使っている文字数が同じでも、 3 回のスワップでは同じ文字列にできないパターンも存在します。 # # 入力例3 # nt # nt # 出力例3 # NO # スワップの仕方が 1 通りしかなく、 3 回のスワップを繰り返すと、tnになってしまいます。 よって、同じ 2 つの文字列ですが、仲良し文字列ではありません。 # # 入力例4 # pqqq # pqqq # 出力例4 # YES # まず、 1 番目の文字と 2 番目の文字を入れ替え、qpqqとします。 次に、 3 番目の文字と 4 番目の文字を入れ替え、qpqqとします。この際、同じ文字を選んでいますが、場所が違うので問題ありません。 最後に、1番目の文字と、2番目の文字を入れ替え、pqqqとします。 # # 入力例5 # abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvxyzw # abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz # 出力例5 # YES # 長い文字列が与えらえれることがあることにも注意してください。 # # 入力例6 # abcdef # ghijkl # 出力例6 # NO '文字列 A, B が与えられるので、仲良し文字列になっているかどうかを判定しなさい。'(A,B) :- 標準入力から二つの文字列を得る(A,B), '文字列 A, B が与えられるので、仲良し文字列になっているかどうかを判定しなさい。'(A,B). '文字列 A, B が与えられるので、仲良し文字列になっているかどうかを判定しなさい。'(A,B) :- 文字列と仲良し文字列(A,B), write('YES\n'),!. '文字列 A, B が与えられるので、仲良し文字列になっているかどうかを判定しなさい。'(A,B) :- write('NO\n'). 文字列と仲良し文字列(_文字列,_仲良し文字列) :- 二つの文字列をならびに変換する(_文字列,_仲良し文字列,L1,L2), '二つのならびの差分(L3,L4)と同一部分(L5)'(L1,L2,L3,L4,L5), 三組のスワップが存在する(L3,L4,L5,Len). 二つの文字列をならびに変換する(_文字列,_仲良し文字列,L1,L2) :- atom_chars(_文字列,L1), atom_chars(_仲良し文字列,L2). '二つのならびの差分(L3,L4)と同一部分(L5)'([],[],[],[],[]). '二つのならびの差分(L3,L4)と同一部分(L5)'([A|R1],[A|R2],R3,R4,[A|R5]) :- '二つのならびの差分(L3,L4)と同一部分(L5)'(R1,R2,R3,R4),!. '二つのならびの差分(L3,L4)と同一部分(L5)'([A|R1],[B|R2],[A|R3],[B|R4],R5) :- '二つのならびの差分(L3,L4)と同一部分(L5)'(R1,R2,R3,R4,R5). 三組のスワップが存在する(L3,L4,L5,Len) :- 二つのならびは同一要素からなる(L3,L4,Len), 整列(L5,L6), 同一文字のペアの可能性を含めて三組のスワップが存在するかどうかの検査(Len,L6). 二つのならびは同一要素からなる(L3,L4,Len) :- length(L3,Len), length(L4,Len). 同一の要素からなる(L3,L4). 同一の要素からなる([],[]). 同一の要素からなる([A|R1],L2) :- select(A,L2,R2), 同一の要素からなる(R1,R2). 同一文字のペアの可能性を含めて三組のスワップが存在するかどうかの検査(Len,L6) :- 同一文字ペアを数える(L6,_同一文字ペア数), 同一文字同士のスワップ検査(Len,_同一文字ペア数). 同一文字ペアの数を数える([],[]). 同一文字ペアの数を数える([A,A|R],[_|R2]) :- 同一文字ペアの数を数える(R1,R2),!. 同一文字ペアの数を数える([_|R1],R2) :- 同一文字ペアの数を数える(R1,R2). 同一文字同士のスワップ検査(3,_) :- !. 同一文字同士のスワップ検査(2,[_|_]) :- !. 同一文字同士のスワップ検査(1,[_,_|_]) :- !. 同一文字同士のスワップ検査(0,[_,_,_|_]). 整列([],[]). 整列([_軸要素|_残りならび],_整列したならび) :- 軸要素との大小で分割してそれぞれ整列する(_軸要素,_残りならび,_整列したL1,_整列したL2), append(_整列したL1,[_軸要素|_整列したL2],_整列したならび). 軸要素との大小で分割してそれぞれ整列する(_軸要素,_残りならび,_整列したL1,_整列したL2) :- 分割(_軸要素,_残りならび,L1,L2), 整列(L1,_整列したL1), 整列(L2,_整列したL2). 分割(_軸要素,[],[],[]). 分割(_軸要素,[A|R1],[A|R2],R3) :- 軸要素より大きい時は(_軸要素,A,R1,R2,R3). 分割(_軸要素,[A|R1],[A|R2],R3) :- 軸要素と等しいか小さい時は(_軸要素,A,R1,R2,R3). 軸要素より大きい時は(_軸要素,A,R1,R2,R3) :- _軸要素 @< A, 分割(_軸要素,R1,R2,R3). 軸要素と等しいか小さい時は(_軸要素,A,R1,R2,R3) :- _軸要素 @>= A, 分割(_軸要素,R1,R2,R3). 標準入力から二つの文字列を得る(A,B) :- 標準入力から文字列を得る(A), 標準入力から文字列を得る(B). 標準入力から文字列を得る(_文字列) :- findall(_文字,( 一文字を得る(_文字), (終了文字(_文字),!,fail;true)),_文字ならび), atom_chars(_文字列,_文字ならび). 一文字を得る(_文字) :- get_char(_文字). 一文字を得る(_文字) :- 一文字を得る(_文字). 終了文字('\n'). 終了文字(end_of_file). % 以下のサイトは # 11 で割り切れる数には、奇数桁の数の和と、偶数桁の数の和を比べると、差が 11 の倍数になっている、という性質があります。この際、一の位を 1 桁目、十の位を 2 桁目、というように、小さい数字から数えていくことに注意してください。 # # 例えば、 7392 という数字について、偶数桁に存在する数字は、 2 桁目の 9 と、 4 桁目の 7 であり、その和は 16です。 奇数桁に存在する数字は、 1 桁目の 2 と、 3 桁目の 3 であり、この和は 5 です。 16 と 5 の差は 11 であり、上記の性質を満たします。 # # あなたは、 与えられた整数が、 11 の倍数であるかどうか調べたいです。そのため、偶数桁の数の和と、奇数桁の数の和を求めようと思っています。この 2 つの値を出力するプログラムを書いてください。 'あなたは、 与えられた整数が、 11 の倍数であるかどうか調べたいです。そのため、偶数桁の数の和と、奇数桁の数の和を求めようと思っています。この 2 つの値を出力するプログラムを書いてください。' :- 標準入力から整数を得る(_与えられた整数), '偶数桁の数の和と、奇数桁の数の和を求めよう'(_与えられた整数,0,0,_偶数桁の和,_奇数桁の和), 出力する(_与えられた整数,_奇数桁の和,_偶数桁の和). '偶数桁の数の和と、奇数桁の数の和を求めよう'(0,S_1,S_2,S_1,S_2) :- !. '偶数桁の数の和と、奇数桁の数の和を求めよう'(N,S_1_1,S_2_1,S_1,S_2) :- D is N // 10, S_2_2 is S_2_1 + N mod 10, '偶数桁の数の和と、奇数桁の数の和を求めよう'(D,S_2_2,S_1_1,S_2,S_1). 出力する(_偶数桁の和,_奇数桁の和) :- writef('%t %t\n',[_偶数桁の和,_奇数桁の和]). 標準入力から整数を得る(_整数) :- 標準入力から数字ならびを得る(_数字ならび), 数字ならびを整数に変換する(_数字ならび,_整数). 標準入力から数字ならびを得る(_数字ならび) :- findall(_数字,( 一文字入力(_数字),(改行またはEOF(_数字),!,fail;'10進数字'(_数字))), _数字ならび). 一文字入力(_文字) :- get_char(_文字). 一文字入力(_文字) :- 一文字入力(_文字). 改行またはEOF('\n'). 改行またはEOF(end_of_file). '10進数字'(_数字) :- member(_数字,['0','1','2','3','4','5','6','7','8','9','-','+','.']). 数字ならびを整数に変換する(_数字ならび,_整数) :- atom_chars(_数字文字列,_数字ならび), catch(read_term_from_atom(_数字文字列,_整数,[]),E,fail). integer(_整数). % 以下のサイトは # サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 # # 今、サイコロの上の面に書かれている数字が、 A であることが解っています。 # # この対面にある、底面に書かれた数字を出力してください。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # A # 1 行目には、サイコロの上の面に書かれている数字を表す 1 つの整数 A(1≦A≦6) が与えられる。 # 出力 # サイコロの底の面に書かれている数字を 1 行で出力せよ。出力の末尾には改行をいれること。 # # 入力例1 # 6 # 出力例1 # 1 # 6 の裏に書かれている数字は 1 です。 # # 入力例2 # 3 # 出力例2 # 4 # :- dynamic(対面にある数字/2). 'サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 今、サイコロの上の面に書かれている数字が、 A であることが解っています。 この対面にある、底面に書かれた数字を出力してください。' :- 'サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。', '今、サイコロの上の面に書かれている数字が、 A であることが解っています。'(_A), 'この対面にある、底面に書かれた数字を'(_A,_対面にある底面に書かれた数字), 出力してください(_対面にある底面に書かれた数字). 'サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。' :- ' 1 から 6 までの数字が一つずつ書かれており、'(_1から6までの数字), 対面の和が 7 になるように作られています。'(_1から6までの数字). ' 1 から 6 までの数字が一つずつ書かれており、'(_1から6までの数字) :- between(1,6,_1から6までの数字). '対面の和が 7 になるように作られています。'(_1から6までの数字) :- '対面の和が 7 に'(_1から6までの数字,_対面にある数字), 'なるように作られています。'(_1から6までの数字,_対面にある数字). '対面の和が 7 に'(_1から6までの数字,_対面にある数字) :- length(L1,_1から6までの数字), length(_対面の和を表すならび,7), append(L1,L2,_対面の和を表すならび), length(L2,_対面にある数字). 'なるように作られています。'(_1から6までの数字,_対面にある数字) :- assertz(対面にある数字(_1から6までの数字,_対面にある数字)). '今、サイコロの上の面に書かれている数字が、 A であることが解っています。'(_A) :- 標準入力から整数を得る(_A). 'この対面にある、底面に書かれた数字を'(_A,_対面にある底面に書かれた数字) :- 対面にある数字(_A,_対面にある底面に書かれた数字). 出力してください(_対面にある底面に書かれた数字) :- writef('%t\n',[_対面にある底面に書かれた数字]). 標準入力から整数を得る(_A) :- 標準入力から文字列を得る(_文字列), 整数入力検査(_文字列,_整数),!. 整数入力検査(_文字列,_整数) :- catch(read_term_from_atom(_文字列,_整数,[]),E,fail), integer(_整数),!. 標準入力から文字列を得る(_文字列) :- findall(_文字,( 標準入力から一文字を得る(_文字), (入力終了文字(_文字),!,fail;true)),Chars), atom_chars(_文字列,Chars). 標準入力から一文字を得る(_文字) :- get_char(_文字). 標準入力から一文字を得る(_文字) :- 標準入力から一文字を得る(_文字). 入力終了文字('\n'). 入力終了文字(end_of_file). % 以下のサイトは # サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 # # 今、サイコロの上の面に書かれている数字が、 A であることが解っています。 # # この対面にある、底面に書かれた数字を出力してください。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # A # 1 行目には、サイコロの上の面に書かれている数字を表す 1 つの整数 A(1≦A≦6) が与えられる。 # 出力 # サイコロの底の面に書かれている数字を 1 行で出力せよ。出力の末尾には改行をいれること。 # # 入力例1 # 6 # 出力例1 # 1 # 6 の裏に書かれている数字は 1 です。 # # 入力例2 # 3 # 出力例2 # 4 # 'サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 今、サイコロの上の面に書かれている数字が、 A であることが解っています。 この対面にある、底面に書かれた数字を出力してください。' :- '今、サイコロの上の面に書かれている数字が、 A であることが解っています。'(_A), 'このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 この対面にある、底面に書かれた数字を'(_A,_対面にある底面に書かれた数字), 出力してください(_対面にある底面に書かれた数字). '今、サイコロの上の面に書かれている数字が、 A であることが解っています。'(_A) :- 標準入力から整数を得る(_A). 'このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 この対面にある、底面に書かれた数字を'(_A,_対面にある底面に書かれた数字) :- length(L1,_A), length(L2,_対面にある底面に書かれた数字), length(_対面の和を表すならび,7), append(L1,L2,_対面の和を表すならび). 出力してください(_対面にある底面に書かれた数字) :- writef('%t\n',[_対面にある底面に書かれた数字]). 標準入力から整数を得る(_A) :- 標準入力から文字列を得る(_文字列), 整数入力検査(_文字列,_整数),!. 整数入力検査(_文字列,_整数) :- catch(read_term_from_atom(_文字列,_整数,[]),E,fail), integer(_整数),!. 標準入力から文字列を得る(_文字列) :- findall(_文字,( 標準入力から一文字を得る(_文字), (入力終了文字(_文字),!,fail;true)),Chars), atom_chars(_文字列,Chars). 標準入力から一文字を得る(_文字) :- get_char(_文字). 標準入力から一文字を得る(_文字) :- 標準入力から一文字を得る(_文字). 入力終了文字('\n'). 入力終了文字(end_of_file). % 以下のサイトは # 問題文 # ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! # でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 # さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 # 「うーむ、どうしたものか……ハッ!」 # 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。 # そうと決まれば、 身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算してくれるプログラムを有能プログラマーである君に作ってもらいたい。 # # # ※ BMI[kg?m2] とは、ボディマス指数と呼ばれるもので、以下の計算式で与えられる。ただし、Height と Weight はそれぞれ身長と体重のことである。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # Height BMI # Height(120.0≦Height≦200.0) は、プログラムに与えられる身長[cm]を表す実数である。小数点第 1 位まで与えられる。 # BMI(10.0≦BMI≦40.0) は、プログラムに与えられる BMI[kg?m2] を表す実数である。小数点第 1 位まで与えられる。 # 出力 # 入力に基づいて逆算した 体重 [kg] を一行に出力せよ。 # 出力は絶対誤差が 10−2 以下であれば許容される。 # なお、出力の最後には改行を入れること。 'ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 「うーむ、どうしたものか……ハッ!」 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。' :- 標準入力から身長とBMIを得る(_身長,_BMI), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(0.0,200.0,_身長,_BMI,_体重), format('~1f\n',[_体重]). 標準入力から身長とBMIを得る(_身長,_BMI) :- 文字列を得る(_文字列), split(_文字列,[' '],[_身長文字列,_BMI文字列]), read_term_from_atom(_身長文字列,_身長,[]), read_term_from_atom(_BMI文字列,_BMI,[]). '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_体重_下,_体重_上,_身長,_BMI,_体重) :- 収束条件を満たす(_体重_下,_体重_上,_体重),!. '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_体重_下_1,_体重_上_1,_身長,_BMI,_体重) :- '新しい体重とその時のBMIを計算して、次の体重の計算区間を得る'(_体重_下_1,_体重_上_1,_身長,_BMI,_BMI_2,_体重_下,_体重_上), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_体重_下,_体重_上,_身長,_BMI,_体重). 収束条件を満たす(_体重_下,_体重_上,_体重) :- (_体重_上 - _体重_下) < 0.1, _体重 is (_体重_上 + _体重_下) / 2. '新しい体重とその時のBMIを計算して、次の体重の計算区間を得る'(_体重_下_1,_体重_上_1,_身長,_BMI,_BMI_2,_体重_下,_体重_上) :- '新しい体重とその時のBMIを計算する'(_体重_下_1,_体重_上_1,_身長,_BMI_2,_体重_2), '次の体重の計算区間を得る'(_体重_下_1,_体重_上_1,_体重_2,_BMI,_BMI_2,_体重_下,_体重_上). '新しい体重とその時のBMIを計算する'(_体重_下,_体重_上,_身長,_BMI_2,_体重_2) :- _体重_2 is (_体重_下 + _体重_上) / 2, _BMI_2 is _体重_2 / ((_身長 / 100) ^ 2). '次の体重の計算区間を得る'(_体重_下,_,_体重_2,_BMI,_BMI_2,_体重_下,_体重_2) :- _BMI_2 =< _BMI,!. '次の体重の計算区間を得る'(_体重_下,_体重_上,_体重_2,_BMI,_BMI_2,_体重_2,_体重_上). 文字列を得る(_文字列) :- findall(_文字,(repeat,get_char(_文字),(_文字=end_of_file,!,fail;_文字='\n',!,fail;true)),L), atomic_list_concat(L,_文字列). 文字列を区切り文字列で分ける(_文字列,_区切り文字列候補,[_前文字列|R]) :- 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列), 文字列を区切り文字列で分ける(_後文字列,_区切り文字列候補,R),!. 文字列を区切り文字列で分ける(_文字列,_,[_文字列]). 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列) :- 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R), 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列). 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R) :- sub_atom(_文字列,S,Len,R,_区切り文字列), member(_区切り文字列,_区切り文字列候補). 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列),!. % これはsplitをわかりやすいように簡略化した定義です。 % より完全なsplit/3の定義はこちらをご覧ください % split(_文,_区切り語ならび,_区切られた語ならび) :- 区切り語ならびの変形(_区切り語ならび,SeparatersL), atom_chars(_文,_文字ならび), split_list_1(_文字ならび,SeparatersL,_区切られた語ならび). sPLIT(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,Y), findall(U,( member(U,Y), \+(U = '')), L), L = X,!. 'SPLIT'(_文字列,_区切り符号ならび,X) :- atom_chars(_文字列,L), split_00(L,_区切り符号ならび,Z), Z = X,!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% split_list([],SeparatersL,[]). split_list(L1,SeparatersL,[L2|R]) :- \+(L1=[]), split_list_2(L1,SeparatersL,L2,R2), \+(L2=[]), split_list(R2,SeparatersL,R). split_list(L1,SeparatersL,X) :- \+(L1=[]), split_list_2(L1,SeparatersL,L2,R2), L2=[], split_list(R2,SeparatersL,X). split_list_1([],SeparatersL,[]). split_list_1(L1,SeparatersL,[A|R]) :- \+(L1=[]), split_list_2(L1,SeparatersL,L2,R2), \+(L2=[]), atom_chars(A,L2), split_list_1(R2,SeparatersL,R). split_list_1(L1,SeparatersL,X) :- \+(L1=[]), split_list_2(L1,SeparatersL,L2,R2), L2=[], split_list_1(R2,SeparatersL,X). split_list_2([],_,[],[]). split_list_2(L1,SeparatersL,[],R) :- member(L2,SeparatersL), append(L2,R,L1). split_list_2([A|R1],SeparatersL,[A|R2],R) :- \+((member(L2,SeparatersL),append(L2,_,[A|R1]))), split_list_2(R1,SeparatersL,R2,R). 区切り語ならびの変形(_区切り語ならび,_降順の区切り文字ならびのならび) :- sort(_区切り語ならび,_昇順の区切り語ならび), reverse(_昇順の区切り語ならび,_降順の区切り語ならび), atomList2charsList(_降順の区切り語ならび,_降順の区切り文字ならびのならび). atomList2charsList([],[]) :- !. atomList2charsList([A|R1],[L|R2]) :- atom_chars(A,L), atomList2charsList(R1,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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), catch(atom_chars(C,NL),_,fail),!. split_5(B,C) :- concat_atom(B,C),!. split_32(['"','"'|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_32([_|R],R2,_区切り符号,_区切り符号ならび,X) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42(['"','"'|R],R2,_区切り符号,_区切り符号ならび,['"'|X]) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42([],[],'',_,[]) :- !. numeric_list([],[]) :- !. numeric_list([A|R],[B|R1]) :- digit(A), char_code(A,B), numeric_list(R,R1),!. numeric_list(['.'|R],[46|R1]) :- numeric_list(R,R1),!. numeric_list([-|R],[45|R1]) :- numeric_list(R,R1),!. number(A,B) :- number_codes(A,B). % 以下のサイトは # 問題文 # ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! # でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 # さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 # 「うーむ、どうしたものか……ハッ!」 # 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。 # そうと決まれば、 身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算してくれるプログラムを有能プログラマーである君に作ってもらいたい。 # # # ※ BMI[kg?m2] とは、ボディマス指数と呼ばれるもので、以下の計算式で与えられる。ただし、Height と Weight はそれぞれ身長と体重のことである。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # Height BMI # Height(120.0≦Height≦200.0) は、プログラムに与えられる身長[cm]を表す実数である。小数点第 1 位まで与えられる。 # BMI(10.0≦BMI≦40.0) は、プログラムに与えられる BMI[kg?m2] を表す実数である。小数点第 1 位まで与えられる。 # 出力 # 入力に基づいて逆算した 体重 [kg] を一行に出力せよ。 # 出力は絶対誤差が 10−2 以下であれば許容される。 # なお、出力の最後には改行を入れること。 'ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 「うーむ、どうしたものか……ハッ!」 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。' :- 標準入力から身長とBMIを得る(_身長,_BMI), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_身長,_BMI,_体重), format('~1f\n',[_体重]). 標準入力から身長とBMIを得る(_身長,_BMI) :- 文字列を得る(_文字列), split(_文字列,[' '],[_身長文字列,_BMI文字列]), get_term_from_atom(_身長文字列,_身長,[]), get_term_from_atom(_BMI文字列,_BMI,[]). '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_身長,_BMI,_体重) :- '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(0,_身長,_BMI,_体重_BMIとの差ならび), 'BMIの計算差が最小のものの体重'(_体重_BMIとの差ならび,_体重). '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(2000,_身長,_BMI,[]) :- !. '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(N,_身長,_BMI,[[N,_BMI_の計算差]|R]) :- '身長、体重から、BMIの計算差を得る'(N,_身長,_BMI,N_2,_体重,_BMIの計算差), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(N_2,_身長,_BMI,R). '身長、体重から、BMIの計算差を得る'(N,_身長,_BMI,N_2,_体重,_BMIの計算差) :- _BMIの計算差 is abs((N / 10) / ((_身長 / 100) ^ 2)) - _BMI), succ(N,N_2), _体重 is N / 10. 'BMIの計算差が最小のものの体重'(_N_BMIとの差ならび,_体重) :- select([_体重,_BMIの差],_N_BMIとの差ならび,R), forall(member([_,_BMIの差_1],R),_BMIの差 =< _BMIの差_1). 文字列を得る(_文字列) :- findall(_文字,(repeat,get_char(_文字),(_文字=end_of_file,!,fail;_文字='\n',!,fail;true)),L), atomic_list_concat(L,_文字列). 文字列を区切り文字列で分ける(_文字列,_区切り文字列候補,[_前文字列|R]) :- 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列), 文字列を区切り文字列で分ける(_後文字列,_区切り文字列候補,R),!. 文字列を区切り文字列で分ける(_文字列,_,[_文字列]). 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列) :- 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R), 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列). 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R) :- sub_atom(_文字列,S,Len,R,_区切り文字列), member(_区切り文字列,_区切り文字列候補). 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列),!. % 以下のサイトは # 問題文 # ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! # でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 # さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 # 「うーむ、どうしたものか……ハッ!」 # 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。 # そうと決まれば、 身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算してくれるプログラムを有能プログラマーである君に作ってもらいたい。 # # # ※ BMI[kg?m2] とは、ボディマス指数と呼ばれるもので、以下の計算式で与えられる。ただし、Height と Weight はそれぞれ身長と体重のことである。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # Height BMI # Height(120.0≦Height≦200.0) は、プログラムに与えられる身長[cm]を表す実数である。小数点第 1 位まで与えられる。 # BMI(10.0≦BMI≦40.0) は、プログラムに与えられる BMI[kg?m2] を表す実数である。小数点第 1 位まで与えられる。 # 出力 # 入力に基づいて逆算した 体重 [kg] を一行に出力せよ。 # 出力は絶対誤差が 10−2 以下であれば許容される。 # なお、出力の最後には改行を入れること。 'ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 「うーむ、どうしたものか……ハッ!」 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。' :- 標準入力から身長とBMIを得る(_身長,_BMI), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_身長,_BMI,_体重), format('~1f\n',[_体重]). 標準入力から身長とBMIを得る(_身長,_BMI) :- 文字列を得る(_文字列), split(_文字列,[' '],[_身長文字列,_BMI文字列]), get_term_from_atom(_身長文字列,_身長,[]), get_term_from_atom(_BMI文字列,_BMI,[]). '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_身長,_BMI,_体重) :- _体重 is _BMI * (_身長 / 100) ^ 2. 文字列を得る(_文字列) :- findall(_文字,(repeat,get_char(_文字),(_文字=end_of_file,!,fail;_文字='\n',!,fail;true)),L), atomic_list_concat(L,_文字列). 文字列を区切り文字列で分ける(_文字列,_区切り文字列候補,[_前文字列|R]) :- 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列), 文字列を区切り文字列で分ける(_後文字列,_区切り文字列候補,R),!. 文字列を区切り文字列で分ける(_文字列,_,[_文字列]). 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列) :- 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R), 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列). 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R) :- sub_atom(_文字列,S,Len,R,_区切り文字列), member(_区切り文字列,_区切り文字列候補). 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列),!. % 以下のサイトは # 出典: http://peace.2ch.net/test/read.cgi/tech/1392388003/736 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 以下のプログラムを作成しなさい. # 文字列を5つ入力し、その中の # 一番小さい文字列を表示 # (英数字のみ) # (文字列は、50文字以内) # (英字の大文字と小文字は、 #  特に考慮しないで、そのまま比較 #  して良いこととする) # # 実行例) # abc 入力1 # aaaa 入力2 # wsdd 入力3 # gfd 入力4 # xxxd 入力5 # aaaa 出力 # 19dfc 入力1 # xuw29 入力2 # 12k2 入力3 # mnnn 入力4 # bccd1 入力5 # 12k2 出力 # '文字列を5つ入力し、その中の一番小さい文字列を表示 (英数字のみ)(文字列は、50文字以内)(英字の大文字と小文字は、特に考慮しないで、そのまま比較して良いこととする)' :- '文字列を5つ入力し、'(_文字列ならび), 一番小さい文字列を表示(_文字列ならび). '文字列を5つ入力し、'(_文字列ならび) :- findall(_文字列,( between(1,5,_), get_line(_文字列)), _文字列ならび). 一番小さい文字列を表示([_文字列|_残り文字列ならび],_一番小さい文字列) :- 一番小さい文字列を(_残り文字列ならび],_文字列,_一番小さい文字列), 表示(_一番小さい文字列). 一番小さい文字列を([],_一番小さい文字列,_一番小さい文字列). 一番小さい文字列を([_文字列|_残り文字列ならび],_現時点で一番小さい文字列,_一番小さい文字列) :- _文字列 @< _現時点で一番小さい文字列, 一番小さい文字列を(_残り文字列ならび,_文字列,_一番小さい文字列). 一番小さい文字列を([_文字列|_残り文字列ならび],_現時点で一番小さい文字列,_一番小さい文字列) :- _文字列 @>= _現時点で一番小さい文字列, 一番小さい文字列を(_残り文字列ならび,_現時点で一番小さい文字列,_一番小さい文字列). 表示(_一番小さい文字列) :- writef('%t\n',[_一番小さい文字列]). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). % 以下のサイトは バイナリファイル (標準入力) に一致しました % 以下のサイトは % % SWI-Prologに於いてfindall/3と同等の述語をmesage_queueを使って定義してみる。 % % findall/3と同じ機能の述語をメッセージキューを利用して定義する。 % メッセージキューを使って全解を収集する(_限界数,_選択項,_副目標,_回収値ならび) :- message_queue_create(_キュー番号), スレッド上でメッセージキューに限界数までの選択項を登録する(_限界数,_キュー番号,_選択項,_副目標), 'メッセージを待ち合わせ、回収する'(_キュー番号,_回収値ならび), message_queue_destroy(_キュー番号). スレッド上でメッセージキューに限界数までの選択項を登録する(_限界数,_キュー番号,_選択項,_副目標) :- thread_create(メッセージキューに限界数までの選択項を登録する(_限界数,_キュー番号,_選択項,_副目標),_,[]). 'メッセージを待ち合わせ、回収する'(_キュー番号,_回収値ならび) :- メッセージを待ち合わせる(_キュー番号), メッセージを回収する(_キュー番号,_回収値ならび). メッセージを待ち合わせる(_キュー番号) :- repeat, thread_peek_message(_キュー番号,end_of_file),!. メッセージを回収する(_キュー番号,_回収値ならび) :- findall(_回収値,( thread_get_message(_キュー番号,_回収値), ( _回収値 = end_of_file,!,fail; true)), _メッセージならび). %%%%%%%%%%%%%%%%%%%% スレッド側 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% メッセージキューに限界数までの選択項を登録する(_限界数,_キュー番号,_選択項,_副目標) :- 副目標を実行して選択項を登録する(_キュー番号,_選択項,_副目標), ( メッセージが限界数を超えた(_キュー番号,_限界数),!,fail; fail). メッセージキューに限界数までの選択項を登録する(_,_キュー番号,_,_) :- thread_send_message(_キュー番号,end_of_file). メッセージが限界数を超えた(_キュー番号,_限界数) :- メッセージの現在の度数を数える(_キュー番号,_度数), _度数 >= _限界数, thread_send_message(_キュー番号,end_of_file),!. 副目標を実行して選択項を登録する(_キュー番号,_選択項,_副目標) :- call(_副目標), 重複メッセージにはならない(_キュー番号,_選択項), thread_send_message(_キュー番号,_選択項). 重複メッセージにはならない(_キュー番号,_選択項) :- \+(thread_peek_message(_キュー番号,_選択項)). メッセージの現在の度数を数える(_キュー番号,_度数) :- message_queue_property(_キュー番号,size(_度数)). % 以下のサイトは % % SWI-Prologに於いてfindall/3と同等の述語をmesage_queueを使って定義してみる。 % % findall/3と同じ機能の述語をメッセージキューを利用して定義する。 % メッセージキューを使って全解を収集する(_限界数,_選択項,_副目標,_回収値ならび) :- message_queue_create(_キュー番号), スレッド上でメッセージキューに限界数までの選択項を登録(_限界数,_キュー番号,_選択項,_副目標), メッセージを回収する(_キュー番号,_回収値ならび), message_queue_destroy(_キュー番号). スレッド上でメッセージキューに限界数までの選択項を登録(_限界数,_キュー番号,_選択項,_副目標) :- thread_create(メッセージキューに限界数までの選択項を登録(_限界数,_キュー番号,_選択項,_副目標),_,[]). メッセージを回収する(_キュー番号,L) :- thread_peek_message(_キュー番号,end_of_file), thread_get_message(_キュー番号,_回収値_1), メッセージを回収する(_キュー番号,_回収値_1,L),!. メッセージを回収する(_キュー番号,L) :- メッセージを回収する(_キュー番号,L). メッセージを回収する(_キュー番号,end_of_file,[]) :- !. メッセージを回収する(_キュー番号,_回収値,[_回収値|R]) :- thread_get_message(_キュー番号,_回収値_2), メッセージを回収する(_キュー番号,_回収値_2,R). %%%%%%%%%%%%%%%%%%%% スレッド側 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% メッセージキューに限界数までの選択項を登録(_限界数,_キュー番号,_選択項,_副目標) :- 副目標の実行と選択項の登録(_キュー番号,_選択項,_副目標), ( メッセージが限界数を超えた(_キュー番号,_限界数),!,fail; fail). メッセージキューに限界数までの選択項を登録(_,_キュー番号,_,_) :- thread_send_message(_キュー番号,end_of_file). メッセージが限界数を超えた(_キュー番号,_限界数) :- メッセージの現在の度数(_キュー番号,_度数), _度数 >= _限界数, thread_send_message(_キュー番号,end_of_file),!. 副目標の実行と選択項の登録(_キュー番号,_選択項,_副目標) :- call(_副目標), 重複メッセージにはならない(_キュー番号,_選択項), thread_send_message(_キュー番号,_選択項). 重複メッセージにはならない(_キュー番号,_選択項) :- \+(thread_peek_message(_キュー番号,_選択項)). メッセージの現在の度数(_キュー番号,_度数) :- message_queue_property(_キュー番号,size(_度数)). % 以下のサイトは # プログラミングのお題スレ Part4 #197 # アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。 # 例に沿って連続する文字をカウントするプログラムを作成せよ。 # # 出力の最後に改行を挿入すること。 # 標準入力から以下の形式で与えられる。 # S # # 例) # In: # aaaaaaaaaabbbbbbbbbbbbcccccccddddddddddeeeeeeefffffffffghiiiiiiiii # # Out: # a10b12c7d10e7f9ghi9 # # In: # # Out: # 0 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。 例に沿って連続する文字をカウントするプログラムを作成せよ。 出力の最後に改行を挿入すること。 標準入力から以下の形式で与えられる。' :- 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(_文字ならび), 連続する文字をカウントする(_文字ならび,_文字_連続数ならび), 出力する(_文字_連続数ならび). 連続する文字をカウントする(L4,_文字_連続数ならび) :- findall([_文字,_連続数],( append(L1,L2,L3,L4), 'L2は限界連続文字ならび'(L1,L2,L3,_文字,_連続数)), _文字_連続数ならび). 'L2は限界連続文字ならび'(L1,L2,L3,_文字,_連続数) :- all(L2,_文字), \+(nth1(1,L3,_文字)), \+(last(L1,_文字)), length(L2,_連続数). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). all([],_). all([A|R],A) :- all(R,A). 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(_文字ならび) :- length(S,100), write('In: '), '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'(_文字), 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(S,_文字,_文字ならび). 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる,'([],_,[]) :- !. 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(_,end_of_file,[]) :- !. 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(_,'\n',[]) :- !. 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる'([_|S],_文字,[_文字|R]) :- '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'(S,_次の文字), 'アルファベットの小文字aからzで成り立つS(S,0≦S≦100)が標準入力から与えられる。'(S,_次の文字,R). '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'(end_of_file) :- !. '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'('\n') :- !. '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'(_文字) :- get_char(_文字), 文字はアルファベットの小文字aからzで成り立つ(_文字),!. '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'(_文字) :- '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'(_文字). 文字はアルファベットの小文字aからzで成り立つ(end_of_file) :- !. 文字はアルファベットの小文字aからzで成り立つ('\n') :- !. 文字はアルファベットの小文字aからzで成り立つ(_文字) :- _文字 @>= 'a', _文字 @=< 'z',!. 出力する(LL) :- flatten(LL,L), atomic_list_concat(L,_出力文字列). writef('Out:\n%t\n',[_出力文字列]). % 以下のサイトは # 出典: C/C++の宿題片付けます 167代目 #526 # [1] 授業単元: プログラミング? # [2] 問題文(含コード&リンク): テキストファイルの読みこみ、行頭文字が小文字の場合 # http://pastebin.com/RKHNpMwy # 大文字に置き換え、変換してファイル出力 # [3] 環境: Xcode 5.1.1 #  [3.1] OS: OSX 10.9 #  [3.2] コンパイラ名とバージョン: gcc49 #  [3.3] 言語: C++ # [4] 期限: 無期限 # [5] その他の制限: # よろしくお願いします。 'テキストファイルの読みこみ、行頭文字が小文字の場合大文字に置き換え、変換してファイル出力'(_ファイル) :- see(_ファイル), 'テキストファイルの読みこみ、'(_行), '行頭文字が小文字の場合大文字に置き換え、変換して出力'(_行), seen. 'テキストファイルの読みこみ、'(_行) :- get_line(_行). '行頭文字が小文字の場合大文字に置き換え、変換して出力'(end_of_file) :- !. '行頭文字が小文字の場合大文字に置き換え、変換して出力'(_行) :- '行頭文字が小文字の場合大文字に置き換え、'(_行,_行_2), writef('%t\n',[_行_2]), 'テキストファイルの読みこみ、'(_次の行), '行頭文字が小文字の場合大文字に置き換え、変換して出力'(_次の行). '行頭文字が小文字の場合大文字に置き換え、'(_行,_行_2) :- 行頭文字が小文字の場合(_行), '大文字に置き換え、'(_行,_行_2),!. '行頭文字が小文字の場合大文字に置き換え、'(_行,_行). 行頭文字が小文字の場合(_行) :- sub_atom(_行,0,1,_,A), A @>= 'a', A @=< 'z'. '大文字に置き換え、'(_行,_行_2) :- sub_atom(_行,0,1,R,_小文字), 小文字大文字(_小文字,_大文字), sub_atom(_行,_,R,0,_残り文字列), atom_concat(_大文字,_残り文字列,_行_2). 小文字大文字(a,'A'). 小文字大文字(b,'B'). 小文字大文字(c,'C'). 小文字大文字(d,'D'). 小文字大文字(e,'E'). 小文字大文字(f,'F'). 小文字大文字(g,'G'). 小文字大文字(h,'H'). 小文字大文字(i,'I'). 小文字大文字(j,'J'). 小文字大文字(k,'K'). 小文字大文字(l,'L'). 小文字大文字(m,'M'). 小文字大文字(n,'N'). 小文字大文字(o,'O'). 小文字大文字(p,'P'). 小文字大文字(q,'Q'). 小文字大文字(r,'R'). 小文字大文字(s,'S'). 小文字大文字(t,'T'). 小文字大文字(u,'U'). 小文字大文字(v,'V'). 小文字大文字(w,'W'). 小文字大文字(x,'X'). 小文字大文字(y,'Y'). 小文字大文字(z,'Z'). % 以下のサイトは 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',_). % 以下のサイトは # # 20×20のボックスの中からある文字列を取り出すプログラムを書いて! # # かたやん印刷所では、いまの時代においてもグーテンベルグ印刷にこだわって印刷をしています。 # グーテンベルグ印刷とは、活版(活字を組み合わせて作った版)で印刷する方法です。(Wikipedia) # # かたやん印刷所の所長かたやんは、使った活字を元の場所に戻さないので、 # いつも活字を入れているボックスはぐちゃぐちゃで、 # ほしい活字をすぐに見つけ出すことができません。 # # そこで見かねた印刷所の副所長エミーは、活字を入れているボックスビデオで撮影し、 # 画像解析し、ボックスのどこにどの活字があるかを解析し、 # ほしい文字列の活字がどこにあるか瞬時にみつけだすプログラミングを作ることにしました。 # # 現状の状態のボックスは以下のようになっています。 # # # 6×6のボックスの中から"PRO, PROGRAMMER"という活字を探し出したいです。 # カンマやスペースは1つの活字としてカウントします。 # ですので、今回は文字13個、カンマ1個、スペース1個の合計15個の活字が必要です。 # 一度使った活字は2回使うことはできません。 # # 活字の場所は、(縦番号,横番号)で表すと以下のような順番で活字を取り出すことができます。 # 縦番号は上から下の方向に、横番号は左から右の方向に、1から数えます。 # 1,4 = P # 2,1 = R # 1,6 = O # 5,2 = , # 5,4 = space # 2,2 = P # 3,4 = R # 4,5 = O # 5,1 = G # 4,3 = R # 1,1 = A # 2,5 = M # 6,1 = M # 2,4 = E # 6,6 = R # # # 上記の例では、例えば"P"という文字が2回でてきますが、(1,4)と(2,2)にある"P"はどちらを先につかってもかまいません。 # また場所の特定は1つのみ記述すればよいです。すべての場所番号を書く必要はありません。 # # 画像解析したボックスのデータはCSVで出力されます。 # ボックスのデータを使ってほしい文字列を作るための活字の在り処を探しだしてください。 # # ■資料 # gutenberg.zip # zipファイルを解凍すると以下のファイルが入っています。 # # gutenberg.csv # このボックスから"STAY HUNGRY, STAY FOOLISH"という活字を取り出してください。 # 文字21個、カンマ1個、スペース3個で、合計25個の活字が必要です。 # # answer.txt # 解答用テキストファイルです。 # # ■解答方法 # 解答用テキストファイル(answer.txt)を完成させ、アップロードしてください。 # ※解答用テキストファイル(answer.txt)以外のファイル形式(zipなど)をアップロードした場合は評価対象外となります。 # '20×20のボックスの生成' :- open('gutenberg.csv',read,Instream), '20×20のボックスの生成'(Instream,_20掛ける20のボックス), close(Instream), assertz('20×20のボックス'(_20掛ける20のボックス)). '20×20のボックスの生成'(Instream,[]) :- at_end_of_stream(Instream),!. '20×20のボックスの生成'(Instream,[L|R]) :- get_line(Instream,Line), split(Line,['\t'],L), '20×20のボックスの生成'(Instream,R). '20×20のボックスの中からある文字列を取り出す'(_ある文字列,_20掛ける20のボックス) :- atom_chars(_ある文字列,_文字ならび), '20×20のボックスの中からある文字列を取り出す'(_文字ならび,_20掛ける20のボックス,L), 解の表示(L). '20×20のボックスの中からある文字列を取り出す'([],_20掛ける20のボックス,[]) :- !. '20×20のボックスの中からある文字列を取り出す'([_文字|_残り文字ならび],_20掛ける20のボックス_1,[[_文字,_行目,_列目]|R]) :- ある文字を取り出す(_文字,_20掛ける20のボックス_1,1,_列目,_20掛ける20のボックス_2), '20×20のボックスの中からある文字列を取り出す'(_残り文字ならび,_20掛ける20のボックス_2,R). ある文字を取り出す(_文字,[_行|R_1],_行目,_列目,[_行_2|R_1]) :- nth1(_列目,_行,_文字), 行を更新する(_行,_列目,_行_2),!. ある文字を取り出す(_文字,[_行|R_1],_行目,_列目,[_行|R_2]) :- _行目_2 is _行目 + 1, ある文字を取り出す(_文字,R_1,_行目_2,_列目,R_2). 行を更新する(_行,_列目,_行_2) :- length([_|L1],_列目), append(L1,[_|R],_行), append(L1,[''|R],_行_2),!. 解の表示(L) :- tell('ans.txt'), forall(member([_文字,_行目,_列目],L),writef('%t,%t,%t\n',[_文字,_行目,_列目])), told. get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). split('',_,[],[]) :- !. split(_文字列,_区切り文字列ならび,[_区切り文字列|R3],[_副文字列|R4]) :- 副文字列を切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_副文字列,_残り文字列), split(_残り文字列,_区切り文字列ならび,R3,R4). 副文字列を切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_副文字列,_残り文字列) :- 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_切り出し文字ならび,_残り文字列), atomic_list_concat(_切り出し文字ならび,_副文字列),!. 文字ならびとして切り出す('',_,'',[],'') :- !. 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,[],_残り文字列) :- 文字列の先頭は区切り文字列である(_文字列,_区切り文字列ならび,_区切り文字列,_残り文字列),!. 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,[_文字|R4],_残り文字列) :- 一文字切り出す(_文字列,_文字,_残り文字列_2), 文字ならびとして切り出す(_残り文字列_2,_区切り文字列ならび,_区切り文字列,R4,_残り文字列). 文字列の先頭は区切り文字列である(_文字列,_区切り文字列ならび,_区切り文字列,_残り文字列) :- member(_区切り文字列,_区切り文字列ならび), atom_length(_区切り文字列,_長さ), sub_atom(_文字列,0,_長さ,_残り文字数,_区切り文字列), sub_atom(_文字列,_,_残り文字数,0,_残り文字列),!. 一文字切り出す(_文字列,_文字,_残り文字列_2) :- sub_atom(_文字列,0,1,_,_文字), sub_atom(_文字列,1,_,0,_残り文字列_2). :- '20×20のボックスの生成'(_CSVファイル). :- '20×20のボックス'(_20掛ける20のボックス), '20×20のボックスの中からある文字列を取り出す'(_ある文字列,_20掛ける20のボックス). % 以下のサイトは # twitter_by_@mog_shi_20140225 # #  【ググった?】 #      /      \ #    YES        NO #   /            \ # 【見つかった?】       死ね #   |    | #   YES   NO #   |     \ # じゃあ聞くな  なら、無ぇよ # % % ?- ググリ信仰(_御託宣). % ググッた? YES % 見つかった? NO % _御託宣 = じゃ、無ぇよ. % true. % ?- ググリ信仰(_御託宣) :- '【ググった?】'(_答え), ググッた(_答え,_御託宣). ググッた('YES',_御託宣) :- '【見つかった?】'(_答え), 見つかった(_答え,_御託宣),!. ググッた('NO','死ね'). 見つかった('YES',じゃあ聞くな). 見つかった('NO','なら、無ぇよ'). '【ググった?】'(_答え) :- write('ググった? '), get_line(_答え), member(_答え,['YES','NO']),!. '【ググった?】'(_答え) :- '【ググった?】'(_答え). '【見つかった?】'(_答え) :- write('見つかった? '), get_line(_答え), member(_答え,['YES','NO']),!. '【見つかった?】'(_答え) :- '【見つかった?】'(_答え). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(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/885 # 夜分遅くに申し訳ございません… # 本日9時提出の課題を今になって気づいたのですが、私の頭ではさっぱりわからないのでお助け下さい… # # [1]プログラミングC # [2] 問題文(含コード&リンク): # 問1:以下の実行結果に示すような、3つの実数を入力した後、最大値と最小値の差を求めるプログラムを作成せよ。 # ※例 # 3つの整数を入力してください。 # na=12 # nb=65 # nc=44 # 65と12の差は53です。 # # 問2:以下の文字列(programming_jissyu)が配列に格納されているとする。 # この文字列を任意の位置で2つ分割して表示するプログラムを作成せよ。 # ※例 # 難文字目で分割しますか:11 # 文字列の前半 # programming # 文字列の後半 # _jissyu # '問1:以下の実行結果に示すような、3つの整数を入力した後、最大値と最小値の差を求めるプログラムを作成せよ。 ※例 3つの整数を入力してください。 na=12 nb=65 nc=44 65と12の差は53です。' :- '3つの整数を入力した後、'(_3つの整数), 最大値と最小値の差(_3つの整数,_最大値,_最小値,_最大値と最小値の差), writef('%tと%tの差は%tです。',[_最大値,_最小値,_最大値と最小値の差]). '3つの整数を入力した後、'(_3つの整数) :- write('3つの整数を入力してください。\n'), findall(_整数,( member(A,[na,nb,nc]), writef('%t=',[A]), 整数を得る(_整数)), _3つの整数). 最大値と最小値の差(_3つの整数,_最大値,_最小値,_最大値と最小値の差) :- 最大値(_3つの整数,_最大値), 最小値(_3つの整数,_最小値), _最大値と最小値の差 is _最大値 - _最小値. 最大値(_整数ならび,_最大値) :- select(N,_整数ならび,R), forall(member(M,R),M =< N). 最小値(_整数ならび,L_最小値) :- select(N,_整数ならび,R), forall(member(M,R),M >= N). 整数を得る(_整数) :- 一行読み込む(Line), '診断: 整数を得る'(Line,_整数),!. 整数を得る(_整数) :- 整数を得る(_整数). '診断: 整数を得る'(Line,_整数) :- read_term_from_atom(Line,_整数,[]), integer(_整数),!. '診断: 整数を得る'(Line,_整数) :- writef('入力された値"%t"から整数は得られません。再入力をお願いします。\n',[Line]), fail. 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/837 # [2] 配列の大きさ6で、それを超えると受け取れないようにする。また負の数を入力した場合、入力処理を中断する。 # 'ならびの要素数6で、それを超えると受け取れないようにする。また負の数を入力した場合、入力処理を中断する。'(_ならび) :- 'ならびの要素数6で、'(_ならび), 'それを超えると受け取れないようにする。また負の数を入力した場合、入力処理を中断する。'(_ならび). 'それを超えると受け取れないようにする。また負の数を入力した場合、入力処理を中断する。'(_ならび) :- 'それを超えると受け取れないようにする。'(_ならび),!. 'それを超えると受け取れないようにする。また負の数を入力した場合、入力処理を中断する。'([_正の整数|R]) :- '整数を得る。負の数を入力した場合、入力処理を中断する。'(正の整数,_正の整数 >= 0,_正の整数), 'それを超えると受け取れないようにする。また負の数を入力した場合、入力処理を中断する。'(R). 'それを超えると受け取れないようにする。'([]). '整数を得る。負の数を入力した場合、入力処理を中断する。'(_正の整数) :- 整数を得る(_整数), '負の数を入力した場合、入力処理を中断する。'(_整数,_正の整数). 整数を得る(_整数) :- get_line(Line), '診断: 整数入力'(Line,_整数). 整数を得る(_整数) :- 整数を得る(_整数). '診断: 整数入力'(Line,_整数) :- get_term_from_atom(Line,_整数), integer(_整数),!. '診断: 整数入力'(Line,_整数) :- writef('入力された行"%t"からは整数が得られません。再入力をお願いします。\n',[Line]), fail. '負の数を入力した場合、入力処理を中断する。'(_整数,_正の整数) :- _整数 < 0, writef('入力された整数"%t"は正の整数ではありませんから\n入力と見なされません。\n',[_整数]), !, fail. '負の数を入力した場合、入力処理を中断する。'(_正の整数,_正の整数). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/745 # [2] キーボードから読み込む、実数の3乗を求めて表示するプログラム(floatを用いて) # 'キーボードから実数を読み込む、実数の3乗を求めて表示する' :- キーボードから実数を読み込む(_実数), 実数の3乗を求めて(_実数,_実数の3乗), 表示する(_実数,_実数の3乗). キーボードから実数を読み込む(_実数) :- get_line(_行), 実数入力検査(_行,_実数),!. キーボードから実数を読み込む(_実数) :- キーボードから実数を読み込む(_実数). 実数入力検査(_行,_実数) :- read_term_from_atom(_行,_実数,[]), float(_実数),!. 実数入力検査(_行,_実数) :- writef('入力された%tは実数ではありません。再入力をお願いします。\n',[_行]), fail. 実数の3乗を求めて(_実数,_実数の3乗) :- _実数の3乗 is _実数 ^ 3. 表示する(_実数,_実数の3乗) :- writef('%t ^ 3 = %t\n',[_実数,_実数の3乗]). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/696 # [1] 授業単元: Cプログラミング # [2] 問題文(含コード&amp;リンク): データファイル(rep_data.txt)には「学籍番号、科目A、科目B、科目Cの各点数」が # 順に学籍番号順に並んでいる。そのデータファイルをもとにキーボードから入力された学籍番号の # 学生の成績(含:3科目の合計点の順位)を表示するプログラムを作れ。 # 探索は二分探索法を使いソートにはクイックソートを使うこと。 # # 表示は以下のようにすること。 # Input A Student Number: 14【Enter】 # Ranking : #269 /*最高得点は1位とせよ.*/ # Subject A : 86 # Subject B : 59.1 # Subject C : 220.42 # Total : 365.52 # # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/697 # 【備考】 # 科目 A の得点は int 型,科目 B,C の得点は double 型で扱うこと. # 合計点が同じになる学生はいないということは既知とせよ. # データの人数は 1000 人であることもわかっているとせよ. # 学籍番号には抜けがある.学籍番号が存在しない場合は,”No data”と表示するようにせよ. # 雛型 (121.c) を用いよ.main 関数は完成しているので,main 関数内で呼び出している関数を作成せよ. # 'データファイル(rep_data.txt)には「学籍番号、科目A、科目B、科目Cの各点数」が 順に学籍番号順に並んでいる。そのデータファイルをもとにキーボードから入力された学籍番号の 学生の成績(含:3科目の合計点の順位)を表示するプログラムを作れ。 探索は二分探索法を使いソートにはクイックソートを使うこと。' :- 'データファイルから学籍番号、科目A、科目B、科目Cの各点数の学生成績ならびを作る'(_学生成績ならび), 合計得点の順位表を作る(_学生成績ならび,_合計得点の順位表), キーボードから入力された学籍番号の(_学籍番号), 二分探索法を使い学生の成績を得る(Lines,_学籍番号,_学生の成績), '学生の成績(含:3科目の合計点の順位)を表示する'(_学籍番号,_合計得点の重複を許す降順ならび,_学生の成績). 'データファイルから学籍番号、科目A、科目B、科目Cの各点数の学生成績ならびを作る'(_学生成績ならび) :- get_lines('rep_data.txt',Lines), findall(L,( member(_行,Lines), split(_行,[','],L)), _学生成績ならび). 合計得点の順位表を作る(_学生成績ならび,_合計得点の重複要素を許す降順ならび) :- findall(_合計,( member([_,A,B,C],_学生成績ならび), _合計 is A + B + C), _合計得点ならび), 重複要素を許す降順整列(_合計得点ならび,_合計得点の重複要素を許す降順ならび). キーボードから入力された学籍番号の(_学籍番号) :- 整数を得る(学籍番号,_学籍番号 >= 0,_学籍番号). キーボードから入力された学籍番号の(_学籍番号) :- キーボードから入力された学籍番号の(_学籍番号). 二分探索法を使い学生の成績を得る(Lines,_学籍番号,_学生の成績) :- length(Lines,_最大要素位置), 二分探索法を使い学生の成績を得る(1,_最大要素位置,_最大要素位置,Lines,_学籍番号,_学生の成績). 二分探索法を使い学生の成績を得る(_要素位置,_要素位置,Lines,_学籍番号,_学生の成績) :- !, nth1(_要素位置,Lines,[_学籍番号|_学生の成績]). 二分探索法を使い学生の成績を得る(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- succ(_要素位置_1,1,_要素位置_2),!, 求める要素は_要素位置_1か_要素位置_2のどちらかにある(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績), 二分探索法を使い学生の成績を得る(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- _検索位置 is (_要素位置_1 + _要素位置_2) // 2, nth1(_検索位置,Lines,[_学籍番号_1|_学生の成績_1]), 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号_1,_学生の成績_1,_学籍番号,_学生の成績). 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績,_学籍番号,_学生の成績) :- !. 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号_1,_,_学籍番号,_学生の成績) :- _学籍番号_1 @< _学籍番号, 二分探索法を使い学生の成績を得る(_要素位置_1,_検索位置,Lines,_学籍番号,_学生の成績). 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号_1,_,_学籍番号,_学生の成績) :- _学籍番号_1 @> _学籍番号, 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_2,Lines,_学籍番号,_学生の成績). 求める要素は_要素位置_1か_要素位置_2のどちらかにある(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- nth1(_要素位置_1,Lines,[_学籍番号|_学生の成績]),!. 求める要素は_要素位置_1か_要素位置_2のどちらかにある(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- nth1(_要素位置_2,Lines,[_学籍番号|_学生の成績]). 重複要素を許す降順整列([],[]). 重複要素を許す降順整列([_軸要素|_残りならび],_合計得点の重複要素を許す降順ならび) :- 重複要素を許す降順分割(_軸要素,_残りならび,_軸要素と等しいか大きいならび,_軸要素より小さいならび), 重複要素を許す降順整列(_軸要素と等しいか大きいならび,_合計得点の重複要素を許す降順ならび_1), 重複要素を許す降順整列(_軸要素より小さいならび,_合計得点の重複要素を許す降順ならび_2), append(_合計得点の重複要素を許す降順ならび_1,[_軸要素|_合計得点の重複要素を許す降順ならび_2],_合計得点の重複要素を許す降順ならび). 重複要素を許す降順分割(_,[],[],[]) :- !. 重複要素を許す降順分割(_軸要素,[A|R],[A|R2],R3) :- A @>= _軸要素, 重複要素を許す降順分割(_軸要素,R1,R2,R3). 重複要素を許す降順分割(_軸要素,[A|R],R2,[A|R3]) :- A @< _軸要素, 重複要素を許す降順分割(_軸要素,R1,R2,R3). '学生の成績(含:3科目の合計点の順位)を表示する'(_学籍番号,_合計得点の重複を許す降順ならび,_学生の成績) :- _学生の成績 = [_科目Aの得点,_科目Bの得点,_科目Cの得点], _学生の合計得点 = _科目Aの得点+_科目Bの得点+_科目Cの得点, nth1(_順位,_合計得点の重複を許す降順ならび,_学生の合計得点), writef('学籍番号 :: %t\n順位 :: #%t\n,科目%t :: %t\n科目%t :: %t\n科目%t :: %t\n',[_学籍番号,_順位,'A',_科目Aの得点,'B',_科目Bの得点,'C',_科目Cの得点]). get_lines(Lines) :- get_lines(user_input,Lines). get_lines(Stream,Lines) :- findall(Line,( get_line(Stream,Line), ( Line=end_of_file,!,fail; true)), Lines). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_line(user_input,X). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/576 # 西暦何年かを入力するとその年に月曜日が何回あるか数え # 52回なら1を、53回なら0を出力するプログラムお願いします… # # 1回1回判定するのではなく、一気に何回か入力し、一気に判定を出力するものでお願いします # (0を入力したら終わりです) # # 入力できるのは1989〜5000です # # '西暦何年かを入力するとその年に月曜日が何回あるか数え 52回なら1を、53回なら0を出力するプログラムお願いします… 1回1回判定するのではなく、一気に何回か入力し、一気に判定を出力するものでお願いします (0を入力したら終わりです) 入力できるのは1989〜5000です' :- '西暦何年かを一気に何回か入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_西暦ならび), 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'(_西暦ならび). '西暦何年かを一気に何回か入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_西暦ならび) :- findall(_西暦,( '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'('西暦(1989~5000)を入力して下さい',_西暦),( _西暦=0,!,fail;true)),_西暦ならび). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'([]). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'([_西暦|_残りならび]) :- 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を'(_西暦,_0または1), writef('%t年 %t\n',[_西暦,_0または1]), 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'(_残りならび). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を'(_西暦,_0または1) :- うるう年で1月1日が日曜か月曜の時は0それ以外は1(_西暦,_0または1). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を'(_西暦,_0または1) :- うるう年でない年は1月1日が月曜の時は0それ以外は1(_西暦,_0または1). うるう年で1月1日が日曜か月曜の時は0それ以外は1(_西暦,0) :- うるう年(_西暦), '1月1日が日曜か月曜の時は'(_西暦),!. うるう年で1月1日が日曜か月曜の時は0それ以外は1(_西暦,1) :- うるう年(_西暦). '1月1日が日曜か月曜の時は'(_西暦) :- 'Zellerの公式を用いて曜日を得る'(_西暦,1,1,_曜日を表す値,_曜日), member(_曜日,[日曜,月曜]). うるう年でない年は1月1日が月曜の時は0それ以外は1(_西暦,0) :- \+(うるう年(_西暦)), 'Zellerの公式を用いて曜日を得る'(_西暦,1,1,_曜日を表す値,月曜),!. うるう年でない年は1月1日が月曜の時は0それ以外は1(_西暦,1) :- \+(うるう年(_西暦)). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 > 2, _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 曜日を表す値(_曜日を表す値,_曜日). 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 =< 2, _年_1 is _年 - 1, _月_2 is _月 + 12, 'Zellerの公式を用いて曜日を得る'(_年_1,_月_2,_日,_曜日を表す値,_曜日). 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_催促文,_西暦) :- writef('%t ',[_催促文]), get_line(_入力行), '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_入力行,_西暦). '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_催促文,_西暦) :- '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_催促文,_西暦). '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'('0',0) :- !. '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_入力行,_西暦) :- read_term_from_atom(_入力行,_西暦,[]), integer(_西暦), between(1989,5000,_西暦),!. '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_入力行,_) :- writef('入力された文字列"%t"から1899年から5000年範囲の西暦が得られませんでした\n再入力をお願いします\n',[_入力行]), fail. get_line(Line) :- get_line(user_input,Line). get_line(Instream,Line) :- get_char(Instream,C), get_line_1(Instream,C,Chars), atom_chars(Line,Chars) . get_line_1(_,'\n',[]) :- !. get_line_1(_,end_of_file,[]) :- !. get_line_1(Instream,C,[C|R]) :- get_char(Instream,C2), get_line_1(Instream,C2,R). % 以下のサイトは # 出題場所 :: 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). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/423 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 問題(戻り値がある場合の引数あり) # 円錐の半径rと高さhを入力し、円錐の体積を求めるプログラムを作りなさい。 # ただし、main関数で円錐の半径rと高さhの入力と計算された円錐の体積の表示を行い、 # 円錐の体積の計算はtaisekiという関数で行うこと。 # また、円周率は3.14を使用すること。 # # ../test/read.cgi/tech/1381909900/422に続きます # '円錐の半径rと高さhを入力し、円錐の体積を求めるプログラムを作りなさい。 ただし、主述語で円錐の半径rと高さhの入力と計算された円錐の体積の表示を行い、 円錐の体積の計算は体積という述語で行うこと。 また、円周率は3.14を使用すること。' :- 数を得る(円錐の半径r,_円錐の半径r), 数を得る(円錐の高さh,_円錐の高さh), '円錐の体積の計算と表示は体積という述語で行うこと。 また、円周率は3.14を使用すること。'(_円錐の半径r,_円錐の高さh,_円錐の体積), writef('半径%t,高さ%t の円錐の体積は %t\n',[_円錐の半径r,_円錐の高さh,_円錐の体積]). '円錐の体積の計算は体積という関数で行うこと。 また、円周率は3.14を使用すること。'(_円錐の半径r,_円錐の高さh,_円錐の体積) :- _円周率 = 3.14, 体積(_円錐の半径r,_円錐の高さh,_円周率,_円錐の体積). 体積(_円錐の半径r,_円錐の高さh,_円周率,_円錐の体積) :- _円錐の体積 is _円周率 * _円錐の半径r * _円錐の半径r * _円錐の高さh / 3. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 数を得る(Instream,_催促文ならび,_数を含む条件,_数ならび) :- list(_催促文ならび), findall(_数,( member(_催促文,_催促文ならび), 数を得る(Instream,_催促文,_数を含む条件,_数)), _数ならび),!. 数を得る(Instream,_催促文,_数を含む条件,_数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 数を得る'(Line,_数を含む条件,_数),!. 数を得る(Instream,_催促文,_数を含む条件,_数) :- 数を得る(Instream,_催促文,_数を含む条件,_数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). '診断: 数を得る'(end_of_file,_,end_of_file) :- !. '診断: 数を得る'('',_,_) :- !,fail. '診断: 数を得る'(Line,_数を含む条件,_数) :- atom_to_term(Line,_数,_), number(_数), '診断: 数を含む条件'(_数,_数を含む条件),!. '診断: 数を得る'(Line,_数を含む条件,_数) :- \+((atom_to_term(Line,_数,_),number(_数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]),!, fail. '診断: 数を含む条件'(_数,_数を含む条件) :- number(_数), call(_数を含む条件),!. '診断: 数を含む条件'(_数,_数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_数,_数を含む条件]),!, fail. 数を得る(_催促文,_数を含む条件,_数) :- 数を得る(user_input,_催促文,_数を含む条件,_数). 数を得る(_催促文,_数) :- 数を得る(user_input,_催促文,true,_数). 数を得る(_数) :- 数を得る(user_input,'',true,_数). n個の数を得る(_n,_催促文,_数ならび) :- length(_数ならび,_n), findall(_数,( 部分ならび(_数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 数を得る(_催促文,_数)), _数ならび). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. % 以下のサイトは # # お題:テキストファイルを読み込み、その中で最もよく使われている単語ベスト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). % 以下のサイトは スレッドとメッセージキューを使って全解を収集する(_選択項,_副目標,_回収値ならび) :- message_queue_create(_キュー番号), thread_create(スレッドで副目標を実行する(_キュー番号,_選択項,_副目標),_,[]), メッセージを回収する(_キュー番号,_回収値ならび), message_queue_destroy(_キュー番号). スレッドで副目標を実行する(_キュー番号,_選択項,_副目標) :- call(_副目標), thread_send_message(_キュー番号,_選択項), fail. スレッドで副目標を実行する(_キュー番号,_,_) :- thread_send_message(_キュー番号,end_of_file). メッセージを回収する(_キュー番号,_メッセージならび) :- メッセージを確実に得る(_キュー番号,_回収値), メッセージを回収する(_キュー番号,_回収値,_メッセージならび). メッセージを回収する(_キュー番号,end_of_file,[]) :- !. メッセージを回収する(_キュー番号,_回収値,[_回収値|R]) :- メッセージを確実に得る(_キュー番号,_回収値_2), メッセージを回収する(_キュー番号,_回収値_2,R). メッセージを確実に得る(_キュー番号,_メッセージ) :- repeat, thread_peek_message(_キュー番号,_), thread_get_message(_キュー番号,_メッセージ),!. % 以下のサイトは ある文字数以上の単語をすべて抽出する(_ある文字数以上の単語ならび) :- 形態素解析(_文字列,_形態素ならび), 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/1364700745/835 # # お願いします。 # [1] 授業単元:情報処理演習 # [2] 問題文:3 つの整数a, b, s を入力として, ax + by = s を満たす整数x, y を一組求めてそれらを表 # 示するプログラムを作成せよ. ただし, 望みの整数x, y が存在しないときは, その旨を表 # 示するようにすること. # '3 つの整数a, b, s を入力として, ax + by = s を満たす整数x, y を一組求めてそれらを表示するプログラムを作成せよ. ただし, 望みの整数x, y が存在しないときは, その旨を表示するようにすること.' :- '3 つの整数a, b, s を入力として'(_a,_b,_s), 'ax + by = s を満たす整数x, y を一組求めて'(_a,_b,_s,_x,_y), それらを表示する(_a,_b,_s,_x,_y),!. '3 つの整数a, b, s を入力として, ax + by = s を満たす整数x, y を一組求めてそれらを表示するプログラムを作成せよ. ただし, 望みの整数x, y が存在しないときは, その旨を表示するようにすること.'(_a,_b,_s) :- 'ただし、望みの整数x, y が存在しないときは, その旨を表示する'. '3 つの整数a, b, s を入力として'(_a,_b,_s) :- 整数を得る('ax+by=s のa',true,_a), 整数を得る('ax+by=s のb',true,_b), 整数を得る('ax+by=s のs',true,_s). 'ax + by = s を満たす整数x, y を一組求めて'(_a,_b,_s,_x,_y) :- _a_1 is _a * -1, _b_1 is _b * -1, for(_a_1,_x,_a), for(_b_1,_y,_b), _s is _a * _x + _b * _y. それらを表示する(_a,_b,_s,_x,_y) :- write(' ax + by = s\n'), writef('%t*%t + %t*%t = %t\n',[_a,_x,_b,_y,_s]). 'ただし, 望みの整数x, y が存在しないときは, その旨を表示する' :- writef('望みのx,yが存在しません。\n'). for(S,N,E) :- E >= S, for_2(S,N,E). for(S,N,E) :- E < S, for_1(S,N,E). for_1(S,_,E) :- S < E,!,fail. for_1(S,N,E) :- N is S. for_1(S,N,E) :- S1 is S - 1, for_1(S1,N,E). for_2(S,_,E) :- S > E,!,fail. for_2(S,N,E) :- N is S. for_2(S,N,E) :- S1 is S + 1, for_2(S1,N,E). 整数を得る(Instream,_催促文ならび,_整数を含む条件,_整数ならび) :- list(_催促文ならび), findall(_整数,( member(_催促文,_催促文ならび), 整数を得る(Instream,_催促文,_整数を含む条件,_整数)), _整数ならび),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 整数を得る'(Line,_整数を含む条件,_整数),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 整数を得る(Instream,_催促文,_整数を含む条件,_整数). '診断: 整数を得る'(end_of_file,_整数を含む条件,end_of_file) :- !. '診断: 整数を得る'('',_,_) :- !,fail. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), '診断: 整数を含む条件'(_整数,_整数を含む条件),!. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- \+((atom_to_term(Line,_整数,_),integer(_整数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]), fail. '診断: 整数を得る'(end_of_file,end_of_file) :- !. '診断: 整数を得る'('',_) :- !,fail. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- call(_整数を含む条件),!. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_整数,_整数を含む条件]), fail. 整数を得る(_催促文,_整数を含む条件,_整数) :- 整数を得る(user_input,_催促文,_整数を含む条件,_整数). 整数を得る(_催促文,_整数) :- 整数を得る(user_input,_催促文,true,_整数). 整数を得る(_整数) :- 整数を得る(user_input,'',true,_整数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). n個の整数を得る(_n,_催促文,_整数ならび) :- length(_整数ならび,_n), findall(_整数,( 部分ならび(_整数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 整数を得る(_催促文,_整数)), _整数ならび). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/587 # # 【質問テンプレ】 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):キーボードより本体価格と税率を入力し、その税込価格を #                表示するプログラムを作成せよ。 # #                任意の数値xを小数点以下第n位で四捨五入する作れ(nは任意) # 'キーボードより本体価格と税率を入力し、その税込価格を 表示するプログラムを作成せよ。 任意の数値xを小数点以下第n位で四捨五入する作れ(nは任意)'(_小数点以下第n位で四捨五入) :- 'キーボードより本体価格と税率を入力し'(_本体価格,_税率), その税込み価格を表示する(_小数点以下第n位で四捨五入,_本体価格,_税率). 'キーボードより本体価格と税率を入力し'(_本体価格,_税率) :- 数を得る(本体価格,_本体価格 >= 0.0,_本体価格), 数を得る(税率,_税率 >= 0.0,_税率),!. その税込み価格を表示する(_小数点以下第n位で四捨五入,_本体価格,_税率) :- V is 10 ^ (_小数点以下第n位で四捨五入 - 1), _税込み価格 is floor(_本体価格 * (1 + _税率) * V + 0.5) / V, writef('%w\n',[_税込み価格]). 数を得る(Instream,_催促文ならび,_数を含む条件,_数ならび) :- list(_催促文ならび), findall(_数,( member(_催促文,_催促文ならび), 数を得る(Instream,_催促文,_数を含む条件,_数)), _数ならび),!. 数を得る(Instream,_催促文,_数を含む条件,_数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 数を得る'(Line,_数を含む条件,_数),!. 数を得る(Instream,_催促文,_数を含む条件,_数) :- 数を得る(Instream,_催促文,_数を含む条件,_数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). '診断: 数を得る'(end_of_file,_,end_of_file) :- !. '診断: 数を得る'('',_,_) :- !,fail. '診断: 数を得る'(Line,_数を含む条件,_数) :- atom_to_term(Line,_数,_), number(_数), '診断: 数を含む条件'(_数,_数を含む条件),!. '診断: 数を得る'(Line,_数を含む条件,_数) :- \+((atom_to_term(Line,_数,_),number(_数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]),!, fail. '診断: 数を含む条件'(_数,_数を含む条件) :- number(_数), call(_数を含む条件),!. '診断: 数を含む条件'(_数,_数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_数,_数を含む条件]),!, fail. 数を得る(_催促文,_数を含む条件,_数) :- 数を得る(user_input,_催促文,_数を含む条件,_数). 数を得る(_催促文,_数) :- 数を得る(user_input,_催促文,true,_数). 数を得る(_数) :- 数を得る(user_input,'',true,_数). n個の数を得る(_n,_催促文,_数ならび) :- length(_数ならび,_n), findall(_数,( 部分ならび(_数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 数を得る(_催促文,_数)), _数ならび). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. % 以下のサイトは 加算器型相加平均(_累計,_相加平均) :- 加算器型相加平均([],0,_累計,_相加平均). 加算器型相加平均(Ln,_累計_1,_累計,_相加平均) :- 数を得る(_数), _累計_2 is _累計_1 + _数, 加算器型相加平均_1(Ln,_累計_2,_累計,_相加平均). 加算器型相加平均_1(Ln,_累計,_累計,_相加平均) :- length([_|Ln],Len), _相加平均 is _累計 / Len. 加算器型相加平均_1(Ln,_累計_2,_累計,_相加平均) :- 加算器型相加平均([_|Ln],_累計_2,_累計,_相加平均). 数を得る(Instream,_催促文ならび,_数を含む条件,_数ならび) :- list(_催促文ならび), findall(_数,( member(_催促文,_催促文ならび), 数を得る(Instream,_催促文,_数を含む条件,_数)), _数ならび),!. 数を得る(Instream,_催促文,_数を含む条件,_数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 数を得る'(Line,_数を含む条件,_数),!. 数を得る(Instream,_催促文,_数を含む条件,_数) :- 数を得る(Instream,_催促文,_数を含む条件,_数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). '診断: 数を得る'(end_of_file,_,end_of_file) :- !. '診断: 数を得る'('',_,_) :- !,fail. '診断: 数を得る'(Line,_数を含む条件,_数) :- atom_to_term(Line,_数,_), number(_数), '診断: 数を含む条件'(_数,_数を含む条件),!. '診断: 数を得る'(Line,_数を含む条件,_数) :- \+((atom_to_term(Line,_数,_),number(_数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]),!, fail. '診断: 数を含む条件'(_数,_数を含む条件) :- number(_数), call(_数を含む条件),!. '診断: 数を含む条件'(_数,_数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_数,_数を含む条件]),!, fail. 数を得る(_催促文,_数を含む条件,_数) :- 数を得る(user_input,_催促文,_数を含む条件,_数). 数を得る(_催促文,_数) :- 数を得る(user_input,_催促文,true,_数). 数を得る(_数) :- 数を得る(user_input,'',true,_数). n個の数を得る(_n,_催促文,_数ならび) :- length(_数ならび,_n), findall(_数,( 部分ならび(_数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 数を得る(_催促文,_数)), _数ならび). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. % 以下のサイトは # 出典:: 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/1357748713/33 # # [1] 授業単元:リスト構造 # [2] 問題文(含コード&amp;リンク): # http://ime.nu/iup.2ch-library.com/i/i0825590-1357830189.gif # # 以下のようなメニューを表示,各項目の機能を実現して結果を表示するプログラムを作 成せよ. # リストは1つとし,初期値は「15 4 32 1」である. # ・データの追加,削除は練習課題(挿入や削除)のものを参考にすればよい. # ・データの追加に関して,そのデータはリストの最後に挿入されるものとする. # ・データのソート(降順)を行う関数を作成する. # ・リストの平均値を計算し出力する関数を作成する。 # # ------表示例------ # 1. データの追加 # 2. データの削除 # 3. データのソート(降順) # 4. リストの平均値 # 5. 終了 # 何を実行しますか : # ------------------ # # ------実行例------- # 1. データの追加 # 2. データの削除 # 3. データのソート(降順) # 4. リストの平均値 # 5. 終了 # 何を実行しますか : 1 # 追加するデータを入力してください : 10 # リスト : 15 4 32 1 10 # # 1. データの追加 # 2. データの削除 # 3. データのソート(降順) # 4. リストの平均値 # 5. 終了 # 何を実行しますか : 4 # リストの平均値 : 12.4 # リスト : 15 4 32 1 10 # # 1. データの追加 # 2. データの削除 # 3. データのソート(降順) # 4. リストの平均値 # 5. 終了 # 何を実行しますか : 3 # リスト : 32 15 10 4 1 # :- dynamic(リスト/1). '以下のようなメニューを表示,各項目の機能を実現して結果を表示するプログラムを作成せよ. リストは1つとし,初期値は「15 4 32 1」である. ・データの追加,削除は練習課題(挿入や削除)のものを参考にすればよい. ・データの追加に関して,そのデータはリストの最後に挿入されるものとする. ・データのソート(降順)を行う関数を作成する. ・リストの平均値を計算し出力する関数を作成する。 ------表示例------ 1. データの追加 2. データの削除 3. データのソート(降順) 4. リストの平均値 5. 終了 何を実行しますか : ' :- 'リストは1つとし,初期値は「15 4 32 1」である', メニューを表示, 各項目の機能を実現して結果を表示する. 'リストは1つとし,初期値は「15 4 32 1」である' :- assertz(リスト([15,4,32,1])). メニューを表示 :- write('1. データの追加\n2. データの削除\n3. データのソート(降順)\n4. リストの平均値\n5. 終了\n何を実行しますか : '). メニューを表示 :- メニューを表示. 各項目の機能を実現して結果を表示する :- 機能番号を選択する(_機能番号), 機能を実現して結果を表示する(_機能番号), _機能番号 = 5,!. 機能番号を選択する(_機能番号) :- get_line(Line), '診断:: メニューの選択'(Line,_機能番号),!. 機能番号を選択する(_機能番号) :- 機能番号を選択する(_機能番号). '診断:: メニューの選択'(Line,_機能番号) :- atom_number(Line,_機能番号), integer(_機能番号), between(1,5,_機能番号),!. '診断:: メニューの選択'(Line,_機能番号) :- writef('選択された %t からは適切な機能番号が得られません。再入力をお願いします。\n',[Line]), fail. 機能を実現して結果を表示する(5) :- !. 機能を実現して結果を表示する(1) :- データの追加. 機能を実現して結果を表示する(2) :- データの削除. 機能を実現して結果を表示する(3) :- 'データのソート(降順)'. 機能を実現して結果を表示する(4) :- リストの平均値. データの追加 :- write('追加するデータを入力してください : '), 整数を得る(_データ), retract(リスト(L1)), append(L1,[_データ],L2), assertz(リスト(L2)). データの削除 :- write('削除するデータを入力してください : '), 整数を得る(_データ), retract(リスト(L1)), ならびから削除(_データ,L1,L2), assertz(リスト(L2)). 'データのソート(降順)' :- リスト(L1), 降順整列(L1,L2), atomic_list_concat(L2,' ',S), writef('リスト : %t\n',[S]). リストの平均値 :- リスト(L1), findavg(_データ,( member(_データ,L1)), _平均値), atomic_list_concat(L1,_リスト表示), writef('平均値 : %t\nリスト : %t\n',[_平均値,_リスト表示]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,_,[e,n,d,'_',o,f,'_',f,i,l,e]) :- at_end_of_stream(Stream),!. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_line(user_input,X). ならびから削除(_,[],[]) :- !. ならびから削除(_削除する要素,[_削除する要素|_残り対象ならび],_削除されたならび) :- ならびから削除(_削除する要素,_残り対象ならび,_削除されたならび),!. ならびから削除(_削除する要素,[_要素|_残り対象ならび],[_要素|_残り削除ならび]) :- ならびから削除(_削除する要素,_残り対象ならび,_残り削除ならび),!. 降順整列([],[]). 降順整列([_軸要素|R1],_降順に整列されたならび) :- 降順分割(_軸要素,R,_軸要素に等しいか大きいならび,_軸要素より小さいならび), 降順整列(_軸要素に等しいか大きいならび,_整列した軸要素に等しいか大きいならび), 降順整列(_軸要素より小さいならび,_整列した軸要素より小さいならび), append(_整列した軸要素に等しいか大きいならび,[_軸要素|_整列した軸要素より小さいならび],_降順に整列したならび). 降順分割(_,[],[],[]). 降順分割(_軸要素,[_要素|R],[_要素|_軸要素に等しいか大きいならび],_軸要素より小さいならび) :- _要素 @>= _軸要素, 降順分割(_軸要素,R,_軸要素に等しいか大きいならび,_軸要素より小さいならび). 降順分割(_軸要素,[_要素|R],_軸要素に等しいか大きいならび,[_要素|_軸要素より小さいならび]) :- _要素 @< _軸要素, 降順分割(_軸要素,R,_軸要素に等しいか大きいならび,_軸要素より小さいならび). findavg(_集約項,_項,_相加平均) :- findall(_集約項,_項,_値ならび), sum(_値ならび,_合計値), length(_値ならび,_ならびの長さ), _相加平均 is _合計値 / _ならびの長さ,!. sum([],0). sum([N|R],S) :- sum(R,S_1), S is N + S_1. % 以下のサイトは # 出典:: 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/392 # # (1)C言語 # (2)問題:キーボードから正の整数を入力するとその桁数を表示するプログラムを作成せよ。 # (3)windows7 visual studio2010 # (4)期限:12月20日 # (5)よろしくお願いします。 # # 'キーボードから正の整数を入力するとその桁数を表示する' :- 'キーボードから正の整数を入力すると'(_正の整数), 'その桁数を表示する'(_正の整数). 'キーボードから正の整数を入力すると'(_正の整数) :- 整数を得る(正の整数,_正の整数 > 0,_正の整数). 'その桁数を表示する'(_正の整数) :- number_chars(_正の整数,Chars), length(Chars,_その桁数), writef('%t桁です\n',[_その桁数]). 整数を得る(_催促文,_整数を含む条件,_整数) :- 整数を得る(user_input,_催促文,_整数を含む条件,_整数). 整数を得る(Instream,_催促文ならび,_整数を含む条件,_整数ならび) :- list(_催促文ならび), findall(_整数,( member(_催促文,_催促文ならび), 整数を得る(Instream,_催促文,_整数を含む条件,_整数)), _整数ならび),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 整数を得る'(Line,_整数を含む条件,_整数),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 整数を得る(Instream,_催促文,_整数を含む条件,_整数). '診断: 整数を得る'(end_of_file,_整数を含む条件,end_of_file) :- !. '診断: 整数を得る'('',_,_) :- !,fail. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), '診断: 整数を含む条件'(_整数,_整数を含む条件),!. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- \+((atom_to_term(Line,_整数,_),integer(_整数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]), fail. '診断: 整数を得る'(end_of_file,end_of_file) :- !. '診断: 整数を得る'('',_) :- !,fail. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- call(_整数を含む条件),!. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_整数,_整数を含む条件]), fail. get_line(Line) :- read_line_to_codes(user_input,Codes), atom_codes(Line,Codes). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/187 # # [1]C言語 # [2]最大20人分の番号、所属、名前を管理する構造体配列を利用し #   入力したデータを元に社員タグを出力するプログラムを作成せよ #   実行例 #   http://ime.nu/iup.2ch-library.com/i/i0804401-1355254105.jpg # [3.1]Windows # [4]2012/12/13まで # [5]いかにも初心者が作るようなものだと嬉しいです # お願いします # # # % syain # input name...yamada # input post...education # input syainID...1234 # # input name...okada # input post...sales # input syainID...9876 # # input name...\d # # *******[ IDnumber 1234 ]******* # post:education # name:yamada # ******************************* # # *******[ IDnumber 9876 ]******* # post:sales # name:okeda # ******************************* # :- dynamic(社員/3). '最大20人分の番号、所属、名前を管理する述語を定義し、 入力したデータを元に社員タグを出力する' :- '最大20人分の番号、所属、名前を管理する構造体配列を利用し入力したデータを元に', 入力したデータを元に社員タグを出力する. '最大20人分の番号、所属、名前を管理する述語を定義し' :- 最大20人分の(Ln), '番号、所属、名前を管理する述語を定義し'(Ln). 最大20人分の(Ln) :- length(Ln,20). '最大20人分の番号、所属、名前を管理する述語を定義し'([_|Ln]) :- '番号、所属、名前の入力'(_名前,_所属,_社員タグ), '番号、所属、名前を管理する述語を定義し'(_名前,_所属,_社員タグ), '最大20人分の番号、所属、名前を管理する述語を定義し'(Ln),!. '最大20人分の番号、所属、名前を管理する述語を定義し'(_). '番号、所属、名前の入力'(_名前,_所属,_社員タグ) :- 名前の入力(_名前), 所属の入力(_所属), 社員タグの入力(_社員タグ). 名前の入力(_名前) :- write('input name...'), get_line(_名前), \+(_名前 = end_of_file). 所属の入力(_所属) :- write('input post...'), get_line(_所属). 社員タグの入力(_社員タグ) :- write('input SyainID...'), get_line(_社員ID). '番号、所属、名前を管理する述語を定義し'(_名前,_所属,_社員タグ) :- assertz(社員(_社員タグ,_所属,_名前)). 入力したデータを元に社員タグを出力する :- 社員(_社員タグ,_所属,_名前), writef('*******[ IDnumber %t ]*******\n post:%t\n name:%t\n*******************************\n\n',[_社員タグ,_所属,_名前]), fail. 入力したデータを元に社員タグを出力する. % 以下のサイトは # 出典:: http://toro.2ch.net/read.cgi/tech/1354393458/2 # # # お題:摂氏温度入力で華氏温度表示。 # 摂氏温度入力で華氏温度表示 :- 摂氏温度入力で(_摂氏温度), 華氏温度表示(_摂氏温度). 摂氏温度入力で(_摂氏温度) :- write('摂氏温度を入力してください : '), 一行の読み込み(Line), '診断: 摂氏温度入力'(Line,_摂氏温度),!. 摂氏温度入力で(_摂氏温度) :- 摂氏温度入力で(_摂氏温度). '診断: 摂氏温度入力'(Line,_摂氏温度) :- atom_to_term(Line,_摂氏温度,_), number(_摂氏温度),!. '診断: 摂氏温度入力'(Line,_) :- writef('摂氏温度は整数または実数ですが、入力された %t からは数値情報が得られません。再入力をお願いします。\n',[Line]), fail. 華氏温度表示(_摂氏温度) :- _華氏温度 is 9 * _摂氏温度 / 5 + 32, writef('華氏温度は %t です。\n',[_華氏温度]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/659 # # [1] 授業単元: C言語 # [2] 問題文(含コード&amp;リンク): # ファイル処理 # 文字列を複数入力した上で、その順番に表示するプログラムを作る。また、その応用で逆に表示するものも作る。 # 1、文字列はいくらでも入力できる。 # 2、連結リストにデータを保持する。 # 3、入力を終わらせる手段を用意する # # /* '文字列を複数入力した上で、その順番に表示するプログラムを作る。また、その応用で逆に表示するものも作る。 1、文字列はいくらでも入力できる。 2、連結リストにデータを保持する。 3、入力を終わらせる手段を用意する' :- '文字列を複数入力した上で連結リストにデータを保持する(# 1、文字列はいくらでも入力できる。 2、連結リストにデータを保持する。 3、入力を終わらせる手段を用意する)'(_連結リスト), 'その順番に表示する'(_連結リスト). */ '文字列を複数入力した上で連結リストにデータを保持する(1、文字列はいくらでも入力できる。 2、連結リストにデータを保持する。 3、入力を終わらせる手段を用意する)'(_連結リスト) :- 文字列を入力する(_文字列), '文字列を複数入力した上で連結リストにデータを保持する(1、文字列はいくらでも入力できる。 2、連結リストにデータを保持する。 3、入力を終わらせる手段を用意する)'(_文字列,_連結リスト). '文字列を複数入力した上で連結リストにデータを保持する(1、文字列はいくらでも入力できる。 2、連結リストにデータを保持する。 3、入力を終わらせる手段を用意する)'(end_of_file,[]) :- !. '文字列を複数入力した上で連結リストにデータを保持する(# 1、文字列はいくらでも入力できる。 2、連結リストにデータを保持する。 3、入力を終わらせる手段を用意する)'(_文字列,[_文字列|_残り連結リスト]) :- 文字列を入力する(_文字列_2), '文字列を複数入力した上で連結リストにデータを保持する(1、文字列はいくらでも入力できる。 2、連結リストにデータを保持する。 3、入力を終わらせる手段を用意する)'(_文字列_2,_残り連結リスト). 文字列を入力する(_文字列) :- get_line(_文字列). その順番に表示する([]). その順番に表示する([_文字列|_残り連結リスト]) :- writef('%t\n',[_文字列]), その順番に表示する(_残り連結リスト). 逆に表示する([]). 逆に表示する([_文字列|_残り連結リスト]) :- 逆に表示する(_残り連結リスト), writef('%t\n',[_文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/323 # # [1]ポインタと文字列 # [2]文字列128文字以下を読み込み、その長さを表示するプログラムを作成せよ。文字列のそうさにはポインタ変数をつかう。文字列操作関数は使用できない。 # [3]Linux、gcc、C # [4]来週まで # # # お願いします # # '文字列128文字以下を読み込み、その長さを表示する' :- 文字列128文字以下を読み込みその長さを(_その長さ), 表示する(_その長さ). 文字列128文字以下を読み込みその長さを(_その長さ) :- rawmode, get_char(_文字), 文字列128文字以下を読み込み(0,_文字,_その長さ), norawmode. 文字列128文字以下を読み込み(_その長さ,end_of_file,_その長さ) :- !. 文字列128文字以下を読み込み(128,_,128) :- !. 文字列128文字以下を読み込み(M_1,_文字_1,_その長さ) :- get_char(_文字_2), M_2 is M_1 + 1, 文字列128文字以下を読み込み(M_2,_文字_2,_その長さ). 表示する(_その長さ) :- writef('入力された文字列長は %t です。\n',[_その長さ]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/161 # # [1] 授業単元:プログラミング言語 # [2] 問題文 # 1.空白、タブ、改行を数えるプログラムを書け。 # 2.二つ以上の空白を一つの空白に置き換えながら、入力を出力にコピーするプログラムを書け。 # '二つ以上の空白を一つの空白に置き換えながら、入力を出力にコピーする' :- get_char(_文字), '二つ以上の空白を一つの空白に置き換えながら、入力を出力にコピーする'(_文字). '二つ以上の空白を一つの空白に置き換えながら、入力を出力にコピーする'(end_of_file) :- !. '二つ以上の空白を一つの空白に置き換えながら、入力を出力にコピーする'(' ') :- 空白以外の文字が現れるまで読み飛ばす(_空白以外の文字), put_char(' '), '二つ以上の空白を一つの空白に置き換えながら、入力を出力にコピーする'(_空白以外の文字),!. '二つ以上の空白を一つの空白に置き換えながら、入力を出力にコピーする'(_文字) :- put_char(_文字), get_char(_文字_2), '二つ以上の空白を一つの空白に置き換えながら、入力を出力にコピーする'(_文字_2). 空白以外の文字が現れるまで読み飛ばす(_文字) :- repeat, get_char(_文字), \+(_文字 == ' '). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/161 # # [1] 授業単元:プログラミング言語 # [2] 問題文 # 1.空白、タブ、改行を数えるプログラムを書け。 # 2.二つ以上の空白を一つの空白に置き換えながら、入力を出力にコピーするプログラムを書け。 # '二つ以上の空白を一つの空白に置き換えながら、入力を出力にコピーする' :- get_char(_文字), '二つ以上の空白を一つの空白に置き換えながら、入力を出力にコピーする'(_文字,_文字). '二つ以上の空白を一つの空白に置き換えながら、入力を出力にコピーする'(_,end_of_file) :- !. '二つ以上の空白を一つの空白に置き換えながら、入力を出力にコピーする'(_先行文字,_文字) :- \+(_先行文字 == ' '), \+(_文字 == ' '), put_char(_文字), get_char(_文字_2), '二つ以上の空白を一つの空白に置き換えながら、入力を出力にコピーする'(_文字,_文字_2). '二つ以上の空白を一つの空白に置き換えながら、入力を出力にコピーする'(' ',_文字) :- \+(_文字 == ' '), put_char(' '), get_char(_文字_2), '二つ以上の空白を一つの空白に置き換えながら、入力を出力にコピーする'(_文字,_文字_2). '二つ以上の空白を一つの空白に置き換えながら、入力を出力にコピーする'(_先行文字,' ') :- \+(_先行文字 == ' '), get_char(_文字_2), '二つ以上の空白を一つの空白に置き換えながら、入力を出力にコピーする'(' ',_文字_2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/737 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): http://ime.nu/ideone.com/hx5VH # # 試験の各科目の点数を、受験者ごとに「出席番号 体育 美術 英語 数学 社会」の順番でテキストファイルに記録する。なお、出席番号は数字4桁、科目の点数は100点を満点とする。 # #  例: #    0001 55 66 66 77 77 # 0002 44 55 33 44 33 # 0003 33 43 53 53 53 # . # . # # 1,出席番号、各科目の点数を標準入力から入力し、上記のフォーマットにあわせて受験者の成績をファイルに記録するプログラムの作成。 # なお出力ファイル名はコマンドライン引数で与えることとし、出席番号に数字以外の文字が入力された場合にデータの入力を終了せよ。 # # 2,作成したファイルを読み込み、受験者ごとの合計点、順位を求め「出席番号 合計点 順位」 # の順にファイルに出力するプログラムを作成せよ。出力は成績順に並び替えなくとも良い。ただし、 # 入力ファイル名と出力ファイル名はコマンドライン引数で与えるものとする。 # # ファイル処理について習いました。stdin やFILE構造体、書式付き入出力、 # ブロック単位の入出力(size_t fwrite(const void *ptr, size_t size,size_t nmemb,FILE *stream) ) # などを習いました '出席番号、各科目の点数を標準入力から入力し、上記のフォーマットにあわせて受験者の成績をファイルに記録する'(_ファイル) :- open(_ファイル,write,Outstream), 出席番号を標準入力から入力(_最初の出席番号), '出席番号、各科目の点数を標準入力から入力し、上記のフォーマットにあわせて受験者の成績をOutstreamに出力する'(Outstream,_最初の出席番号), close(Outstream). '出席番号、各科目の点数を標準入力から入力し、上記のフォーマットにあわせて受験者の成績をOutstreamに出力する'(_,end_of_file) :- !. '出席番号、各科目の点数を標準入力から入力し、上記のフォーマットにあわせて受験者の成績をOutstreamに出力する'(Outstream,_出席番号) :- 各科目の点数を標準入力から入力(_各科目の点数ならび), 上記のフォーマットにあわせて受験者の成績をOutstreamに出力(Outstream,_出席番号,_各科目の点数ならび), 出席番号を標準入力から入力(_次の出席番号), '出席番号、各科目の点数を標準入力から入力し、上記のフォーマットにあわせて受験者の成績をOutstreamに出力する'(Outstream,_次の出席番号). 出席番号を標準入力から入力(_出席番号) :- get_line(Line), '診断: 出席番号を標準入力から入力'(Line,_出席番号),!. '診断: 出席番号を標準入力から入力'(Line,_出席番号) :- write('出席番号を入力してください(終了する時はend_of_file) : '), atom_to_term(Line,_出席番号整数,_), integer(_出席番号整数), 頭部零文字列(4,_出席番号整数,_出席番号),!. '診断: 出席番号を標準入力から入力'(_,end_of_file). 各科目の点数を標準入力から入力(_各科目の点数ならび) :- findall(_点数,( member(_科目,[体育,美術,英語,数学,社会]), 整数を得る(_科目,(_点数>=0,_点数=<100),_点数)), _各科目の点数ならび). 上記のフォーマットにあわせて受験者の成績をOutstreamに出力(Outstream,_出席番号,_各科目の点数ならび) :- atomic_list_concat([_出席番号|_各科目の点数ならび],' ',_表示行文字列), writef(Outstream,'%t\n',[_表示行文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/663 # # [2]水の量(L)を入力し、その水に含まれる水素および酸素の原子の数を表示するプログラムを作成せよ。 # アボガドロ定数は6.02×10^23、水の分子量は18,水の重さは1ml=1gとしてよく、 # 入力される数値として浮動小数点数値に対応すること表示は指数表現で行う。 # # [3.1]windows # [3.3]c/c++ # [4]今日中 # よろしくお願いします。 # '水の量(L)を入力し、その水に含まれる水素および酸素の原子の数を表示するプログラムを作成せよ。 アボガドロ定数は6.02×10^23、水の分子量は18,水の重さは1ml=1gとしてよく、 入力される数値として浮動小数点数値に対応すること表示は指数表現で行う。' :- '水の量(L)を入力し'(_水の量), 'その水に含まれる水素および酸素の原子の数を表示する'(_水の量,_水素の原子数,_酸素の原子数). '水の量(L)を入力し'(_水の量) :- write('水の量(L)を入力してください : '), 行入力と終了状態(_行,_), 水の量の入力診断(_行,_水の量),!. '水の量(L)を入力し'(_水の量) :- '水の量(L)を入力し'(_水の量). 水の量の入力診断(_行,_水の量) :- read_term_from_atom(_行,_水の量,[]), number(_水の量), _水の量 > 0.0,!. 水の量の入力診断(_行,_水の量) :- writef('入力された水の量は適切でありません。再入力をお願いします。\n'). 'その水に含まれる水素および酸素の原子の数を表示する'(_水の量,_水素の原子数,_酸素の原子数) :- アボガドロ数(_アボガドロ数), _分子の総数 is _アボガドロ数 * _水の量 * 1000 * (1 / 1), 水の分子量(_分子量,_酸素原子量,_水素原子量), 水素および酸素の原子の数を(_分子の総数,_分子量,_酸素原子量,_水素原子量,_酸素原子の数,_水素原子の数), 表示する(_水の量,_分子の総数,_酸素原子の数,_水素原子の数). アボガドロ数(602000000000000000000000). 水の分子量(_分子量,_酸素原子量,_水素原子量) :- _分子量 = 18, _酸素原子量 = 16, _水素原子量 = 2. 水素および酸素の原子の数を(_分子の総数,_分子量,_酸素原子量,_水素原子量,_酸素原子の数,_水素原子の数) :- _酸素原子の数 is _分子の総数 * _酸素原子量 // _分子量, _水素原子の数 is _分子の総数 * _水素原子量 // _分子量. 表示する(_水の量,_分子の総数,_酸素原子の数,_水素原子の数) :- writef('水の量=%t\n分子の総数=%t\n酸素原子の数=%t\n水素原子の数=%t\n',[_水の量,_分子の総数,_酸素原子の数,_水素原子の数]). 行入力と終了状態(_行,_終了状態) :- get_char(_先読み文字), 文字ならび行入力と終了状態(_先読み文字,_文字ならび,_終了状態), atom_chars(_行,_文字ならび). 文字ならび行入力と終了状態('\n',[],正常終了) :- !. 文字ならび行入力と終了状態(end_of_file,[],end_of_file) :- !. 文字ならび行入力と終了状態(_先読み文字,[_先読み文字|R],_状態) :- get_char(_文字), 文字ならび行入力と終了状態(_文字,R,_状態). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/534 # # [1] 授業単元: - # [2] 問題文:http://ime.nu/judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0002&lang=jp # # Digit Number # 与えられた2つの整数 a と b の和の桁数を出力して終了するプログラムを作成して下さい。 # # Input # 複数のデータセットが与えられます。各データセットは1行に与えられます。各データセットは2つの整数 a と b が1つのスペースで区切られて与えられます。入力の終わりまで処理して下さい。a と b は非負の整数とします。 # # Output # 各データセットごとに、a + b の桁数を出力して下さい。 # # Sample Input # 5 7 # 1 99 # 1000 999 # Output for the Sample Input # 2 # 3 # 4 # '入力の終了まで、与えられた2つの整数 a と b の和の桁数を出力する' :- '与えられた2つの整数 a と b の'(_a,_b,_入力終了状態), '与えられた2つの整数 a と b の和の桁数を出力する'(_入力終了状態,_和の桁数). '与えられた2つの整数 a と b の和の桁数を出力する'(end_of_file,_,_) :- !. '与えられた2つの整数 a と b の和の桁数を出力する'(正常終了,_a,_b) :- '整数 a と b の和の桁数を'(_a,_b,_桁数), 出力する(_桁数), '入力の終了まで、与えられた2つの整数 a と b の和の桁数を出力する'. '与えられた2つの整数 a と b の和の桁数を'(_和の桁数) :- '与えられた2つの整数 a と b の'(_a,_b), '和の桁数を'(_a,_b,_和の桁数). '与えられた2つの整数 a と b の'(_a,_b,_終了状態) :- readln(L), '与えられた2つの整数 a と b の終了検査'(L,_a,_b,_終了状態),!. '与えられた2つの整数 a と b の'(_a,_b,_終了状態) :- write('入力エラー : 二つの整数を空白区切りで入力して下さい : '), '与えられた2つの整数 a と b の'(_a,_b,_終了状態). '与えられた2つの整数 a と b の終了検査'([],_,_,end_of_file) :- !. '与えられた2つの整数 a と b の終了検査'([_a,_b],_a,_b,正常終了) :- integer(_a), integer(_b),!. '整数 a と b の和の桁数を'(_a,_b,_和の桁数) :- _和 is _a + _b, number_chars(_和,L), length(L,_桁数). 出力する(_桁数) :- writef('%t\n',[_桁数]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/489 # # [1] 授業単元:C言語演習 # [2] 問題文: # キーボードで入力された名前をchar型の一次元の配列nameに入れていきます。 # 各名前の先頭アドレスをp_nameに入れます。 # p_nameのアドレスをptrptrに入れます。 # 最後に一番長い名前と一番短い名前、変数ptrptr、p_name、nameのアドレスを表示します。 # 実行例: # 名前を10個まで入力できます。桁数は最大30です。 # name1: tanaka # name2: nakabayashi # name3: hama #    ・ #    ・ # 一番長いのは"nakabayashi"で、11桁。 # 一番短いのは"hama"で、4桁。 # Adress of name: 231191 Adress of p_name: 231511 Adress of ptrptr: 231551 # # 'キーボードで入力された名前をならび_nameに入れていきます。一番長い名前と一番短い名前を表示します。' :- キーボードで入力されたならび_nameに入れていきます(_name), 一番長い名前と一番短い名前を表示します(_name). 一番長い名前と一番短い名前を表示します(_name) :- 一番長い名前(_name,_一番長い名前ならび), 一番短い名前(_name,_一番短い名前ならび), 表示します(_一番長い名前ならび,_一番短い名前ならび). 一番長い名前(_name,_一番長い名前ならび) :- findmax(_名前の長さ,( member(_名前,_name), sub_atom(_名前,0,_名前の長さ,0,_名前)), _一番長い長さ), findall(_名前,( member(_名前,_name), sub_atom(_名前,0,_一番長い長さ,_名前)), 一番長い名前ならび). 一番短い名前(_name,_一番短い名前ならび) :- findmin(_名前の長さ,( member(_名前,_name), sub_atom(_名前,0,_名前の長さ,0,_名前)), _一番短い長さ), findall(_名前,( member(_名前,_name), sub_atom(_名前,0,_一番短い長さ,_名前)), 一番短い名前ならび). 表示します(_一番長い名前ならび,_一番短い名前ならび) :- concat_atom(_一番長い名前ならび,' , ',_一番長い名前表示), writef('一番長い名前は %t です。\n',[_一番長い名前表示]), concat_atom(_一番短い名前ならび,' , ',_一番短い名前表示), writef('一番短い名前は %t です。\n',[_一番短い名前表示]). キーボードで入力された名前をならび_nameに入れていきます(_name) :- findall(_名前,( 名前を入力(_名前,_終了状態), ( _終了状態=終了,!,fail; true)), _name). 名前を入力(_名前,_終了状態) :- append(L0,_,_), length([_|L0],Nth), writef('名前[%t]: ',[Nth]), get_line(Line), 名前入力検査(Line,_名前,_終了状態). 名前入力検査('',_,終了) :- !. 名前入力検査(end_of_file,_,終了) :- !. 名前入力検査(名前,_名前,正常). % 以下のサイトは # http://www.ioi-jp.org/joi/2011/2012-yo/2012-yo-t1/2012-yo-t1.html # 問題 # 1    ランチ (Lunch) # 問題 # # JOI パスタ店では,ランチのおすすめパスタと搾りたてジュースのセットメニューが # 好評である.このセットメニューを注文するときは,その日の 3 種類のパスタと # 2 種類のジュースから 1 つずつ選ぶ.パスタとジュースの値段の合計から 50 円を # 引いた金額が代金となる. # # ある日のパスタとジュースの値段が与えられたとき,その日のセットメニューの # 代金の最小値を求めるプログラムを作成せよ. # # 入力 # # 入力は 5 行からなり,1 行に 1 つずつ正の整数が書かれている. # 1 行目の整数は 1 つ目のパスタの値段である. # 2 行目の整数は 2 つ目のパスタの値段である. # 3 行目の整数は 3 つ目のパスタの値段である. # 4 行目の整数は 1 つ目のジュースの値段である. # 5 行目の整数は 2 つ目のジュースの値段である. # ただし,与えられる入力データにおいては全てのパスタとジュースの値段は # 100 円以上 2000 円以下であることが保証されている. # # 出力 # # その日のセットメニューの代金の最小値を 1 行で出力せよ. # # 入出力例 # # 入力例 1 入力例 2 # 800 1999 # 700 1999 # 900 100 # 198 189 # 330 100 # # 出力例 1 出力例 2 # 848 150 # # # 入出力例 1 では,2 つ目のパスタと 1 つ目のジュースを組み合わせた場合の 700 + 198 - 50 = 848 がその日のセットメニューの代金の最小値である. # # 入出力例 2 では,3 つ目のパスタと 2 つ目のジュースを組み合わせた場合の 100 + 100 - 50 = 150 がその日のセットメニューの代金の最小値である. # # ※各入出力例のデータは,右クリック等によりファイルに保存して利用可能です. # program :- 'JOI パスタ店では,ランチのおすすめパスタと搾りたてジュースのセットメニューが好評である.このセットメニューを注文するときは,その日の 3 種類のパスタと 2 種類のジュースから 1 つずつ選ぶ.パスタとジュースの値段の合計から 50 円を引いた金額が代金となる.ある日のパスタとジュースの値段が与えられたとき,その日のセットメニューの代金の最小値を求める'. 'JOI パスタ店では,ランチのおすすめパスタと搾りたてジュースのセットメニューが好評である.このセットメニューを注文するときは,その日の 3 種類のパスタと 2 種類のジュースから 1 つずつ選ぶ.パスタとジュースの値段の合計から 50 円を引いた金額が代金となる.ある日のパスタとジュースの値段が与えられたとき,その日のセットメニューの代金の最小値を求める' :- '3書類のパスタと2種類のジュースの価格を得る'(_3種類のパスタの価格,_2種類のジュースの価格), 最小値を探しだす(_セットメニューの代金,( セットメニューを代金を得る(_3種類のパスタの価格,_2種類のジュースの価格,_セットメニューの代金)), _その日のセットメニューの代金の最小値), writef('%t\n',[_その日のセットメニューの代金の最小値]). '3書類のパスタと2種類のジュースの価格を得る'(_3種類のパスタの価格,_2種類のジュースの価格) :- '3種類のパスタの価格を得る'(_3種類のパスタの価格), '2種類のジュースの価格を得る'(_2種類のジュースの価格). '3種類のパスタの価格を得る'(_3種類のパスタの価格) :- length(_3種類のパスタの価格,3), findall(_パスタの価格,( append(_,[_パスタの価格|_],_3種類のパスタの価格), 整数入力(_パスタの価格)), _3種類のパスタの価格). '2種類のジュースの価格を得る'(_2種類のジュースの価格) :- length(_2種類のジュースの価格,2), findall(_ジュースの価格,( % _パスタの価格となっていた 12/23訂正 append(_,[_ジュースの価格|_],_2種類のジュースの価格), 整数入力(_ジュースの価格)), _2種類のジュースの価格). 最小値を探しだす(_対象となる値,_副目標,_最小値) :- findall(_対象となる値,_副目標,L), 最小値(L,_最小値). 最小値(L,_最小値) :- append(L1,[_最小値|L2],L), \+((append(_,[A|_],L1),A @< _最小値)), \+((append(_,[B|_],L2),B @< _最小値)),!. セットメニューを代金を得る(_3種類のパスタの価格,_2種類のジュースの価格,_セットメニューの代金) :- append(_,[_パスタの価格|_],_3種類のパスタの価格), append(_,[_ジュースの価格|_],_2種類のジュースの価格), _セットメニューの代金 is _パスタの価格 + _ジュースの価格 - 50. 整数入力(N) :- get_line(Line), 整数入力診断(Line,N),!. 整数入力(N) :- 整数入力(N). 整数入力診断(Line,N) :- atom_to_term(Line,N,_), integer(N),!. 整数入力診断(Line,N) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. get_line(Line) :- get_char(Char), get_line_2(Char,Chars), atom_chars(Line,Chars). get_line_2(end_of_file,[]) :- !. get_line_2('\n',[]) :- !. get_line_2(Char,[Char|R]) :- get_char(Char2), get_line_2(Char2,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/836 # # 1] 授業単元:プログラム作成 # [2] 問題文(含コード&リンク):以下の実行例のように,標準入力からgetchar 関数 # を使って文字を次々と読み込み,アルファベットの小文 # 字は大文字に,大文字は小文字に変えて,それ以外の文 # 字はそのまま表示するプログラムを作成せよ # 例hELLO! # I’m Taro KOUKA. <--(入力) # i’M tARO kouka. # I was born in Tokyo in 1991. <--(入力) # i WAS BORN IN tOKYO IN 1991. # <--(Ctrl-d で入力終了) # '標準入力からgetchar 関数を使って文字を次々と読み込み,アルファベットの小文字は大文字に,大文字は小文字に変えて,それ以外の文字はそのまま表示する' :- get_char(_文字), '標準入力からgetchar 関数を使って文字を次々と読み込み,アルファベットの小文字は大文字に,大文字は小文字に変えて,それ以外の文字はそのまま表示する'(_文字). '標準入力からgetchar 関数を使って文字を次々と読み込み,アルファベットの小文字は大文字に,大文字は小文字に変えて,それ以外の文字はそのまま表示する'(end_of_file) :- !. '標準入力からgetchar 関数を使って文字を次々と読み込み,アルファベットの小文字は大文字に,大文字は小文字に変えて,それ以外の文字はそのまま表示する'(_文字) :- アルファベットの小文字は大文字に変えて表示する(_文字), get_char(_次の文字), '標準入力からgetchar 関数を使って文字を次々と読み込み,アルファベットの小文字は大文字に,大文字は小文字に変えて,それ以外の文字はそのまま表示する'(_次の文字),!. '標準入力からgetchar 関数を使って文字を次々と読み込み,アルファベットの小文字は大文字に,大文字は小文字に変えて,それ以外の文字はそのまま表示する'(_文字) :- アルファベットの小文字は大文字に変えて表示する(_文字), get_char(_次の文字), '標準入力からgetchar 関数を使って文字を次々と読み込み,アルファベットの小文字は大文字に,大文字は小文字に変えて,それ以外の文字はそのまま表示する'(_次の文字),!. '標準入力からgetchar 関数を使って文字を次々と読み込み,アルファベットの小文字は大文字に,大文字は小文字に変えて,それ以外の文字はそのまま表示する'(_文字) :- アルファベットの大文字は小文字に変えて表示する(_文字), get_char(_次の文字), '標準入力からgetchar 関数を使って文字を次々と読み込み,アルファベットの小文字は大文字に,大文字は小文字に変えて,それ以外の文字はそのまま表示する'(_次の文字),!. '標準入力からgetchar 関数を使って文字を次々と読み込み,アルファベットの小文字は大文字に,大文字は小文字に変えて,それ以外の文字はそのまま表示する'(_文字) :- それ以外の文字はそのまま表示する(_文字), get_char(_次の文字), '標準入力からgetchar 関数を使って文字を次々と読み込み,アルファベットの小文字は大文字に,大文字は小文字に変えて,それ以外の文字はそのまま表示する'(_次の文字),!. アルファベットの小文字は大文字に変えて表示する(_文字) :- _文字 @>= 'a', _文字 @=< 'z', アルファベットの小文字を大文字に変換する(_文字,_変換された文字), 表示する(_変換された文字). アルファベットの大文字は小文字に変えて表示する(_文字) :- _文字 @>= 'A', _文字 @=< 'Z', アルファベットの大文字を小文字に変換する(_文字,_変換された文字), 表示する(_変換された文字). それ以外の文字はそのまま表示する(_文字) :- \+((_文字 @>= 'a',_文字 @=< 'z')), \+((_文字 @>= 'A',_文字 @=< 'Z')), 表示する(_文字). アルファベットの小文字を大文字に変換する(a,'A'). アルファベットの小文字を大文字に変換する(b,'B'). アルファベットの小文字を大文字に変換する(c,'C'). アルファベットの小文字を大文字に変換する(d,'D'). アルファベットの小文字を大文字に変換する(e,'E'). アルファベットの小文字を大文字に変換する(f,'F'). アルファベットの小文字を大文字に変換する(g,'G'). アルファベットの小文字を大文字に変換する(h,'H'). アルファベットの小文字を大文字に変換する(i,'I'). アルファベットの小文字を大文字に変換する(j,'J'). アルファベットの小文字を大文字に変換する(k,'K'). アルファベットの小文字を大文字に変換する(l,'L'). アルファベットの小文字を大文字に変換する(m,'M'). アルファベットの小文字を大文字に変換する(n,'N'). アルファベットの小文字を大文字に変換する(o,'O'). アルファベットの小文字を大文字に変換する(p,'P'). アルファベットの小文字を大文字に変換する(q,'Q'). アルファベットの小文字を大文字に変換する(r,'R'). アルファベットの小文字を大文字に変換する(s,'S'). アルファベットの小文字を大文字に変換する(t,'T'). アルファベットの小文字を大文字に変換する(u,'U'). アルファベットの小文字を大文字に変換する(v,'V'). アルファベットの小文字を大文字に変換する(w,'W'). アルファベットの小文字を大文字に変換する(x,'X'). アルファベットの小文字を大文字に変換する(y,'Y'). アルファベットの小文字を大文字に変換する(z,'Z'). アルファベットの大文字を小文字に変換する('A',a). アルファベットの大文字を小文字に変換する('B',b). アルファベットの大文字を小文字に変換する('C',c). アルファベットの大文字を小文字に変換する('D',d). アルファベットの大文字を小文字に変換する('E',e). アルファベットの大文字を小文字に変換する('F',f). アルファベットの大文字を小文字に変換する('G',g). アルファベットの大文字を小文字に変換する('H',h). アルファベットの大文字を小文字に変換する('I',i). アルファベットの大文字を小文字に変換する('J',j). アルファベットの大文字を小文字に変換する('K',k). アルファベットの大文字を小文字に変換する('L',l). アルファベットの大文字を小文字に変換する('M',m). アルファベットの大文字を小文字に変換する('N',n). アルファベットの大文字を小文字に変換する('O',o). アルファベットの大文字を小文字に変換する('P',p). アルファベットの大文字を小文字に変換する('Q',q). アルファベットの大文字を小文字に変換する('R',r). アルファベットの大文字を小文字に変換する('S',s). アルファベットの大文字を小文字に変換する('T',t). アルファベットの大文字を小文字に変換する('U',u). アルファベットの大文字を小文字に変換する('V',v). アルファベットの大文字を小文字に変換する('W',w). アルファベットの大文字を小文字に変換する('X',x). アルファベットの大文字を小文字に変換する('Y',y). アルファベットの大文字を小文字に変換する('Z',z). 表示する(_文字) :- put_char(_文字). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/836 # # 1] 授業単元:プログラム作成 # [2] 問題文(含コード&リンク):以下の実行例のように,標準入力からgetchar 関数 # を使って文字を次々と読み込み,アルファベットの小文 # 字は大文字に,大文字は小文字に変えて,それ以外の文 # 字はそのまま表示するプログラムを作成せよ # 例hELLO! # I’m Taro KOUKA. <--(入力) # i’M tARO kouka. # I was born in Tokyo in 1991. <--(入力) # i WAS BORN IN tOKYO IN 1991. # <--(Ctrl-d で入力終了) # '標準入力からgetchar 関数を使って文字を次々と読み込み,アルファベットの小文字は大文字に,大文字は小文字に変えて,それ以外の文字はそのまま表示する' :- get_char(_文字), '標準入力からgetchar 関数を使って文字を次々と読み込み,アルファベットの小文字は大文字に,大文字は小文字に変えて,それ以外の文字はそのまま表示する'(_文字). '標準入力からgetchar 関数を使って文字を次々と読み込み,アルファベットの小文字は大文字に,大文字は小文字に変えて,それ以外の文字はそのまま表示する'(end_of_file) :- !. '標準入力からgetchar 関数を使って文字を次々と読み込み,アルファベットの小文字は大文字に,大文字は小文字に変えて,それ以外の文字はそのまま表示する'(_文字) :- アルファベットの小文字は大文字に変えて表示する(_文字), get_char(_次の文字), '標準入力からgetchar 関数を使って文字を次々と読み込み,アルファベットの小文字は大文字に,大文字は小文字に変えて,それ以外の文字はそのまま表示する'(_次の文字),!. '標準入力からgetchar 関数を使って文字を次々と読み込み,アルファベットの小文字は大文字に,大文字は小文字に変えて,それ以外の文字はそのまま表示する'(_文字) :- アルファベットの小文字は大文字に変えて表示する(_文字), get_char(_次の文字), '標準入力からgetchar 関数を使って文字を次々と読み込み,アルファベットの小文字は大文字に,大文字は小文字に変えて,それ以外の文字はそのまま表示する'(_次の文字),!. '標準入力からgetchar 関数を使って文字を次々と読み込み,アルファベットの小文字は大文字に,大文字は小文字に変えて,それ以外の文字はそのまま表示する'(_文字) :- アルファベットの大文字は小文字に変えて表示する(_文字), get_char(_次の文字), '標準入力からgetchar 関数を使って文字を次々と読み込み,アルファベットの小文字は大文字に,大文字は小文字に変えて,それ以外の文字はそのまま表示する'(_次の文字),!. '標準入力からgetchar 関数を使って文字を次々と読み込み,アルファベットの小文字は大文字に,大文字は小文字に変えて,それ以外の文字はそのまま表示する'(_文字) :- それ以外の文字はそのまま表示する(_文字), get_char(_次の文字), '標準入力からgetchar 関数を使って文字を次々と読み込み,アルファベットの小文字は大文字に,大文字は小文字に変えて,それ以外の文字はそのまま表示する'(_次の文字),!. アルファベットの小文字は大文字に変えて表示する(_文字) :- _文字 @>= 'a', _文字 @=< 'z', アルファベットの小文字を大文字に変換する(_文字,_変換された文字), 表示する(_変換された文字). アルファベットの大文字は小文字に変えて表示する(_文字) :- _文字 @>= 'A', _文字 @=< 'Z', アルファベットの大文字を小文字に変換する(_文字,_変換された文字), 表示する(_変換された文字). それ以外の文字はそのまま表示する(_文字) :- \+((_文字 @>= 'a',_文字 @=< 'z')), \+((_文字 @>= 'A',_文字 @=< 'Z')), 表示する(_文字). アルファベットの小文字を大文字に変換する(a,'A'). アルファベットの小文字を大文字に変換する(b,'B'). アルファベットの小文字を大文字に変換する(c,'C'). アルファベットの小文字を大文字に変換する(d,'D'). アルファベットの小文字を大文字に変換する(e,'E'). アルファベットの小文字を大文字に変換する(f,'F'). アルファベットの小文字を大文字に変換する(g,'G'). アルファベットの小文字を大文字に変換する(h,'H'). アルファベットの小文字を大文字に変換する(i,'I'). アルファベットの小文字を大文字に変換する(j,'J'). アルファベットの小文字を大文字に変換する(k,'K'). アルファベットの小文字を大文字に変換する(l,'L'). アルファベットの小文字を大文字に変換する(m,'M'). アルファベットの小文字を大文字に変換する(n,'N'). アルファベットの小文字を大文字に変換する(o,'O'). アルファベットの小文字を大文字に変換する(p,'P'). アルファベットの小文字を大文字に変換する(q,'Q'). アルファベットの小文字を大文字に変換する(r,'R'). アルファベットの小文字を大文字に変換する(s,'S'). アルファベットの小文字を大文字に変換する(t,'T'). アルファベットの小文字を大文字に変換する(u,'U'). アルファベットの小文字を大文字に変換する(v,'V'). アルファベットの小文字を大文字に変換する(w,'W'). アルファベットの小文字を大文字に変換する(x,'X'). アルファベットの小文字を大文字に変換する(y,'Y'). アルファベットの小文字を大文字に変換する(z,'Z'). アルファベットの大文字を小文字に変換する('A',a). アルファベットの大文字を小文字に変換する('B',b). アルファベットの大文字を小文字に変換する('C',c). アルファベットの大文字を小文字に変換する('D',d). アルファベットの大文字を小文字に変換する('E',e). アルファベットの大文字を小文字に変換する('F',f). アルファベットの大文字を小文字に変換する('G',g). アルファベットの大文字を小文字に変換する('H',h). アルファベットの大文字を小文字に変換する('I',i). アルファベットの大文字を小文字に変換する('J',j). アルファベットの大文字を小文字に変換する('K',k). アルファベットの大文字を小文字に変換する('L',l). アルファベットの大文字を小文字に変換する('M',m). アルファベットの大文字を小文字に変換する('N',n). アルファベットの大文字を小文字に変換する('O',o). アルファベットの大文字を小文字に変換する('P',p). アルファベットの大文字を小文字に変換する('Q',q). アルファベットの大文字を小文字に変換する('R',r). アルファベットの大文字を小文字に変換する('S',s). アルファベットの大文字を小文字に変換する('T',t). アルファベットの大文字を小文字に変換する('U',u). アルファベットの大文字を小文字に変換する('V',v). アルファベットの大文字を小文字に変換する('W',w). アルファベットの大文字を小文字に変換する('X',x). アルファベットの大文字を小文字に変換する('Y',y). アルファベットの大文字を小文字に変換する('Z',z). 表示する(_文字) :- put_char(_文字). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/775 # # 1] 授業単元: プログラミング # [2] 問題文(含コード&リンク):以下の実行例のように,標準入力からgetchar 関数 # を使って文字を次々と読み込み,Ctrl-d などで入力が # 終了するまでに入力された行数(改行の数)を表示する # プログラムを作成せよ # # 実行例 # Hello! # I’m Taro KOUKA. # I was born in Tokyo in 1991. # <--(Ctrl-d で入力終了) # 行数: 3 # # '標準入力からgetchar 関数を使って文字を次々と読み込み,Ctrl-d などで入力が終了するまでに入力された行数(改行の数)を表示する' :- 標準入力から文字を読み込み(_文字), '標準入力からgetchar 関数を使って文字を次々と読み込み,Ctrl-d などで入力が終了するまでに入力された行数(改行の数)を'(_文字,0,0,_行数), 入力された行数(改行の数)を表示する'(_行数). '標準入力からgetchar 関数を使って文字を次々と読み込み,Ctrl-d などで入力が終了するまでに入力された行数(改行の数)を'(end_of_file,0,_行数,_行数) :- !. '標準入力からgetchar 関数を使って文字を次々と読み込み,Ctrl-d などで入力が終了するまでに入力された行数(改行の数)を'(end_of_file,_行頭からの文字数,_行数_1,_行数) :- _行頭からの文字数 > 0, _行数 is _行数_1 + 1,!. '標準入力からgetchar 関数を使って文字を次々と読み込み,Ctrl-d などで入力が終了するまでに入力された行数(改行の数)を'('\n',_,_行数_1,_行数) :- _行数_2 is _行数_1 + 1, 標準入力から文字を読み込み(_文字_2), '標準入力からgetchar 関数を使って文字を次々と読み込み,Ctrl-d などで入力が終了するまでに入力された行数(改行の数)を'(_文字_2,0,_行数_2,_行数),!. '標準入力からgetchar 関数を使って文字を次々と読み込み,Ctrl-d などで入力が終了するまでに入力された行数(改行の数)を'(_文字,_行頭からの文字数,_行数_1,_行数) :- _行頭からの文字数_2 is _行頭からの文字数_1 + 1, 標準入力から文字を読み込み(_文字_2), '標準入力からgetchar 関数を使って文字を次々と読み込み,Ctrl-d などで入力が終了するまでに入力された行数(改行の数)を'(_文字_2,_行頭からの文字数_2,_行数_1,_行数). '入力された行数(改行の数)を表示する'(_行数) :- writef('行数: %t\n',[_行数]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/724 # # [1] 授業単元:プログラミング演習 2 # [2] 問題文(含コード&リンク) # 標準入力に現れた行数と文字数をカウントするCプログラムline_count.cを書きなさい。 # 実行例は例えば次のようになります # $ ./line_count < testfile. txt # I am a student. # I have a programming C class. # # lines: 2 letters: 46 ← 欲しいのはこの2つの数字、つまり行数と文字数です. # $ # # [3.1] OS: unix # [3.2] コンパイラ名とバージョン: gcc # [3.3] 言語: C # [4] 期限:10月19日(出来れば早めにお願いします) # よろしくお願いします。 # 標準入力に現れた行数と文字数をカウントする :- get_char(Char), 標準入力に現れた行数と文字数をカウントする(Char,0,0,_行数,_文字数), writef('%t,%t\n',[_行数,_文字数]). 標準入力に現れた行数と文字数をカウントする(end_of_file,_行数,_文字数,_行数,_文字数). 標準入力に現れた行数と文字数をカウントする('\n',_行数_1,_文字数_1,_行数,_文字数) :- _行数_2 is _行数_1 + 1, get_char(Char), 標準入力に現れた行数と文字数をカウントする(Char,_行数_2,_文字数_1,_行数,_文字数),!. 標準入力に現れた行数と文字数をカウントする(Char,_行数_1,_文字数_1,_行数,_文字数) :- _文字数_2 is _文字数_1 + 1, get_char(Char2), 標準入力に現れた行数と文字数をカウントする(Char2,_行数_1,_文字数_2,_行数,_文字数),!. % 以下のサイトは # # 行読み込み述語 get_line/2,get_line/1 です。 # ここでの焦点は改行なしにいきなりEOFが来た時の処理。 # at_end_of_stream で処理をするのですが、最後の文字として、 # 改行があったのかどうかを返すことはできません。 # % % get_chars/2 : get_chars(_ファイル,_文字リスト) % ファイル全体をリストとして取得します % get_chars(File,Chars) :- open(File,read,Instream), get_chars_1(Instream,Chars), close(Instream). get_chars_1(Instream,[]) :- at_end_of_stream(Instream),!. get_chars_1(Instream,[Char|R]) :- get_char(Instream,Char), get_chars_1(Instream,R). % % get_lines/2 : get_lines(_ファイル名,_行リスト) % ファイル全体を行のリストとして取得します % 第一引数はストリームではなくファイルです % get_lines(File,Lines) :- open(File,read,Instream), get_lines_1(Instream,Lines), close(Instream). get_lines_1(Instream,[]) :- at_end_of_stream(Instream),!. get_lines_1(Instream,[Line|R]) :- get_line(Instream,Line), get_lines_1(Instream,R). % % get_line/2 : get_line(_ストリーム,_行) % 改行がくるまで、アトムとして取得します % get_line(Stream,end_of_file) :- at_end_of_stream(Stream),!. 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). % % 標準入力の場合。 % get_line(X) :- current_input(Stream), get_line(Stream,X). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/549 # # [1] 授業単元:演習 # [2] 問題文(含コード&リンク):http://pastebin.com/index/sg6akdN0 # 標準入力から「id, 名前, 年月日, 住所」のようなコンマ区切形式 (CSV 形式) の名簿データを受け付けて, # 項目を切り出してメモリ中に格納する.また,% で始まる入力行をコマンド入力として解釈し,格納されたデータを表示や整列する # '標準入力から「id, 名前, 年月日, 住所」のようなコンマ区切形式 (CSV 形式) の名簿データを受け付けて,項目を切り出してメモリ中に格納する.また,% で始まる入力行をコマンド入力として解釈し,格納されたデータを表示や整列する' :- get_line(Line), テキストの解析処理(Line,1,[]). テキストの解析処理(end_of_file,N,_オプションモード) :- \+member(整列,_オプションモード)),!. テキストの解析処理(end_of_file,N,_オプションモード) :- member(整列,_オプションモード), 名簿データをならびに変換(LL1), sort(LL1,LL2), 整列した名簿の表示(LL2),!. テキストの解析処理(_行,N,_オプションモード) :- コメント行(_行,_オプションモード,_オプションモードのニ), get_line(_行2), テキストの解析処理(_行2,N,_オプションモードのニ),!. テキストの解析処理(_行,N,_オプションモード) :- 'CSV行'(_行,_オプションモード), get_line(_行2), N2 is N + 1, テキストの解析処理(_行2,N2,_オプションモード). コメント行(_行,_オプションモード,_オプションモードのニ) :- sub_atom(_行,0,1,R,'%'), sub_atom(_行,1,R,0,_残り文字列), split(_残り文字列,[' ',','],L), コメント行解析(L,_オプションモード,_オプションモードのニ). 'CSV行'(_行,N,_オプションモード) :- member(表示,_オプションモード), writef('%t: %t\n',[N,_行]), split(_行,[','],[_id,_名前,_年月日,_住所]), assertz(名簿データ(_id,_名前,_年月日,_住所)), writef('%q\n',[名簿データ(_id,_名前,_年月日,_住所)]),!. 'CSV行'(_行,N,_オプションモード) :- \+(member(表示,_オプションモード)), split(_行,[','],[_id,_名前,_年月日,_住所]), assertz(名簿データ(_id,_名前,_年月日,_住所)),!. コメント行解析([],_オプションモード,_オプションモード) :- !. コメント行解析([非表示|R],_オプションモード,_オプションモードのニ) :- ならびから削除(表示,_オプションモード,_オプションモードの一), コメント行解析(R,_オプションモードの一,_オプションモードのニ),!. コメント行解析([_コマンド|R],_オプションモード,_オプションモードのニ) :- \+(member(_コマンド|_オプションモード)), コメント行解析(R,[_コマンド|_オプションモード],_オプションモードのニ). コメント行解析([_コマンド|R],_オプションモード,_オプションモードのニ) :- member(_コマンド|_オプションモード), コメント行解析(R,_オプションモード,_オプションモードのニ). 名簿データをならびに変換(LL) :- findall([_id,_名前,_年月日,_住所],( 名簿データ(_id,_名前,_年月日,_住所)), LL),!. 整列した名簿の表示(LL) :- append(_,[L|R],LL), writef('%t,%t,%t,%t\n',L), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/562 # # すみません、全くわからないのでご教唆お願いします # ファイル名「test.txt」というテキストファイルがあったとします。内容は # Hallow, nice to meet you. # というものです。これを読み込んで # Hallow # nice # to # meet # you # というふうに単語ごとに区切り、改行して表示するプログラムを作ります。 # ソースコードはこんな感じです 'ファイル名「test.txt」というテキストファイルを単語ごとに区切り、改行して表示する' :- see('test.txt'), readln(L,_終了状態), 'テキストファイルを単語ごとに区切り、改行して表示する'(L,_終了状態), seen. 'テキストファイルを単語ごとに区切り、改行して表示する'(_,end_of_file) :- !. 'テキストファイルを単語ごとに区切り、改行して表示する'([_単語ならび|R],_) :- append(_,[_単語|R],_単語ならび), writef('%t\n',[_単語]), R = [], readln(L,_終了状態), 'テキストファイルを単語ごとに区切り、改行して表示する'(L,_終了状態). % 改行のみの行は単語として''(空文字)として取得できる % 以下のサイトは # # ファイルから行列を取り込む # ファイルから行列を取り込む(_ファイル名,_行列) :- see(_ファイル名), readln(L), 行列を取り込む(L,_行列), seen. 行列を取り込む([end_of_file],[]) :- !. 行列を取り込む(L,[L|R]) :- readln(L2), 行列を取り込む(L2,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/9 # # [1] 授業単元:構造体ポインタ[2] 問題文: # name (文字列50字) # height ←実数 # weight ←実数 # bmi ←実数 # これらをメンバとする構造体 pationdata の配列を定義する(charやintやdoubleなどをそれぞれの前につけます)。 # 複数の人のデータを入れれる構造体 pationdata の配列を作成する。 # datafile.dat からデータを読み込んで、配列に保存していく。 # ここで注意するのは、ここで上から下までデータを読み込んだ時、データ数に合わせた配列が出来るようにすること。 # 以下 datafile.dat の中身例 # tom 1.65 59.2 # jim 1.80 63.5 # (左から名前、身長、体重) # 配列に保存したデータを関数 BMI ( ) に渡す。 # この中で bmi を計算し、構造体の bmi メンバに保存する。 # 配列に入っているデータを datafile2.dat に出力する。 # 以下 datafile2.dat の中身例 # tom 1.65 59.2 21.70 # jim 1.80 63.9 22.10 # (右端にBMI数値を追加) # 最後にdatafile2.datを閉じる。 # # 尚、datafile.datの中身は自由に決めてよい。 # bmi = weight / height * height # (BMIは体重÷身長の2乗) # 'datafile.dat からデータを読み込んで、構造体として保存していく'(_構造体ならび) :- abolish(pationdata/4), see('datafile.dat'), readln(L,Status), 構造体として保存していく(L,Status), seen. 構造体として保存していく(_,end_of_file) :- !. 構造体として保存していく([_name,_height,_weight],_) :- _bmi is _weight / height * heigth, assertz(pationdata(name(_name),height(_height),weight(_weight),bmi(_bmi))), readln(L2,Status), 構造体として保存していく(L2,Status). '保存されているデータを datafile2.dat に出力する' :- tell('datafile2.dat'), pationdata(name(_name),height(_height),weight(_weight),bmi(_bmi)), writef('%t %t %t %t\n',[_name,_height,_weight,_bmi]), fail. '保存されているデータを datafile2.dat に出力する' :- told. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/298 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): http://codepad.org/iM41ba88 # # [問2]上記プログラムを拡張して、読み込んだデータにある変換を施して別のファイルに保存するプログラムkadai12-2.cを作ろう。kadai12-1.cで読み込んだファイルを改めて眺めると、1行に2つの数値が書いてある。この各行の2番め(右端)の数値を「2乗したもの」に置き換えて別のファイルに保存する関数 void convert_data(FILE *in_fp, FILE *out_fp)を定義し、この動作を確認するプログラムkadai12-2.cを作りなさい。ただし、void convert_data(FILE *in_fp, FILE *out_fp)はin_fpからデータを読み取って、out_fpに書き込むものとする。 # # cat /usr4/yamauchi/yamauchi/data/test.dat # 1.000000 1.136735 # 1.010000 1.137647 # 1.020000 1.137143 # 1.030000 1.137957 # 1.040000 1.142641 # 1.050000 1.153101 # ..... # # ヒント: kadai12-2.cのmain()の例:みどりの文字がkadai12-1に新しく加えた部分 # # int main() { # char INFILENAME[100];//読み込みファイル名 # char OUTFILENAME[100];//書き込みファイル名 # FILE *in_fp;//読み込み用ファイルポインタ # FILE *out_fp;//書き込み用ファイルポインタ # # # scanf("%s", INFILENAME); //読み込みファイル名をキーボード入力 # scanf("%s", OUTFILENAME); //書き込みファイル名をキーボード入力 # # in_fp = fopen(INFILENAME, "r"); //ファイルを開く # if (in_fp == NULL) {//ファイルが開けない場合はin_fpがNULLになる。(ファイルが見付からない時等) # fprintf(stderr, "I cannot find %s\n", INFILENAME);//標準エラー出力にエラーメッセージを出力 # exit(1); # } # # out_fp = fopen(ファイル名の文字列, モード);//<-各自正しく書き換えるように。 # if (out_fp==NULL) { # ほげほげほげ <-各自正しく書き換えること # } # # convert_data(in_fp, out_fp); //in_fpからデータを読み取り、値を変換したものをout_fpに書き込む関数 # fclose(in_fp); //ファイルを閉じる # fclose(out_fp); //ファイルを閉じる # } # # ただし: # ○変換されて保存されたファイルの中身は次のフォーマットに従うものとする。 # 1.000000 1.292166 # 1.010000 1.294241 # 1.020000 1.293094 # 1.030000 1.294946 # 1.040000 1.305628 # 1.050000 1.329642 # 1.060000 1.368... # つまり、fprint(書き込み用ファイルポインタ, "%f %f\n", データ, データ);を使って出力します。 # # '読み込んだデータにある変換を施して別のファイルに保存する' :- see('test.txt'), tell('test2.txt'), readln(L,_終了状態), '各行の2番め(右端)の数値を「2乗したもの」に置き換えて別のファイルに保存する'(L,_終了状態), told, seen. '各行の2番め(右端)の数値を「2乗したもの」に置き換えて別のファイルに保存する'(_,end_of_file) :- !. '各行の2番め(右端)の数値を「2乗したもの」に置き換えて別のファイルに保存する'([A,B],_) :- C is B ^ 2, writef('%t\n',[C]), readln(L2,_終了状態2), '各行の2番め(右端)の数値を「2乗したもの」に置き換えて別のファイルに保存する'(L2,_終了状態2),!. '各行の2番め(右端)の数値を「2乗したもの」に置き換えて別のファイルに保存する'(_,_) :- readln(L2,_終了状態2), '各行の2番め(右端)の数値を「2乗したもの」に置き換えて別のファイルに保存する'(L2,_終了状態2),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/297 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): http://codepad.org/lqKLztNc # # あるファイルtest.datの中にテキストで実数が羅列されている。この実数を読み込んで表示するプログラムkadai12-1.cを作ってみよう。 # kadai12-1.cでは次のようなmain()を定義したとする。 # # #include # #include # # void display_file(FILE *fp); # # int main() { # char INFILENAME[100]; //ファイル名を格納する文字列 # FILE *in_fp; # scanf("%s", INFILENAME); //ファイル名をキーボード入力 # in_fp = fopen(INFILENAME, "r"); //ファイルを開く # if (in_fp == NULL) {//ファイルが開けない場合はin_fpがNULLになる。(ファイルが見付からない時等) # fprintf(stderr, "I cannot open %s\n", INFILENAME);//標準エラー出力にエラーメッセージを出力 # exit(1); # } # # display_file(in_fp); //ファイルの中身を全部画面表示する関数 # fclose(in_fp); //ファイルを閉じる # } # # ○ 上記main関数の中の void display_file(FILE *fp)を以下の仕様を満たすように定義し、kadai12-1.cを完成させなさい。 # 読み込むファイルは上記プリプロセッサで定義されたFILENAMEにある. # これをcat して中身を見ると、 # cat /usr4/yamauchi/yamauchi/data/test.dat # 1.000000 1.136735 # 1.010000 1.137647 # 1.020000 1.137143 # 1.030000 1.137957 # 1.040000 1.142641 # 1.050000 1.153101 # ..... # と数値が1行に2個ずつ列挙されている。これらのデータを読み取って # # 1.000000 # 1.136735 # 1.010000 # 1.137647 # ... # のように1行に1つずつ数値を列挙するように定義しなさい。但し、ファイルポインターがファイルの最後か否かを判定する関数として # int feof(FILE *fp)が準備されている。この使いかたは次で調べよ。 # man feof # すると、使用方法が表示される。 # # 実行例: # gcc kadai112-1.c # ./a.out # 1.000000 # 1.136735 # 1.010000 # 1.137647 # ..... 'あるファイルtest.datの中にテキストで実数が羅列されている。この実数を読み込んで表示する' :- see('test.dat'), get_line(Line), 実数を読み込んで表示する(Line), seen. 実数を読み込んで表示する(end_of_file) :- !. 実数を読み込んで表示する(Line) :- split(Line,[' '],_実数ならび), 表示する(_実数ならび), get_line(Line2), 実数を読み込んで表示する(Line2). 表示する([]) :- !. 表示する([A|R]) :- \+(number(A)), 表示する(R),!. 表示する([_実数|R]) :- writef('%t\n',[_実数]), 表示する(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/297 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): http://codepad.org/lqKLztNc # # あるファイルtest.datの中にテキストで実数が羅列されている。この実数を読み込んで表示するプログラムkadai12-1.cを作ってみよう。 # kadai12-1.cでは次のようなmain()を定義したとする。 # # #include # #include # # void display_file(FILE *fp); # # int main() { # char INFILENAME[100]; //ファイル名を格納する文字列 # FILE *in_fp; # scanf("%s", INFILENAME); //ファイル名をキーボード入力 # in_fp = fopen(INFILENAME, "r"); //ファイルを開く # if (in_fp == NULL) {//ファイルが開けない場合はin_fpがNULLになる。(ファイルが見付からない時等) # fprintf(stderr, "I cannot open %s\n", INFILENAME);//標準エラー出力にエラーメッセージを出力 # exit(1); # } # # display_file(in_fp); //ファイルの中身を全部画面表示する関数 # fclose(in_fp); //ファイルを閉じる # } # # ○ 上記main関数の中の void display_file(FILE *fp)を以下の仕様を満たすように定義し、kadai12-1.cを完成させなさい。 # 読み込むファイルは上記プリプロセッサで定義されたFILENAMEにある. # これをcat して中身を見ると、 # cat /usr4/yamauchi/yamauchi/data/test.dat # 1.000000 1.136735 # 1.010000 1.137647 # 1.020000 1.137143 # 1.030000 1.137957 # 1.040000 1.142641 # 1.050000 1.153101 # ..... # と数値が1行に2個ずつ列挙されている。これらのデータを読み取って # # 1.000000 # 1.136735 # 1.010000 # 1.137647 # ... # のように1行に1つずつ数値を列挙するように定義しなさい。但し、ファイルポインターがファイルの最後か否かを判定する関数として # int feof(FILE *fp)が準備されている。この使いかたは次で調べよ。 # man feof # すると、使用方法が表示される。 # # 実行例: # gcc kadai112-1.c # ./a.out # 1.000000 # 1.136735 # 1.010000 # 1.137647 # ..... 'あるファイルtest.datの中にテキストで実数が羅列されている。この実数を読み込んで表示する' :- see('test.dat'), readln(X,_終了状態), 実数を読み込んで表示する(X,_終了状態), seen. 実数を読み込んで表示する(_,end_of_file) :- !. 実数を読み込んで表示する(L,_) :- 表示する(L), readln(L2,_終了状態2), 実数を読み込んで表示する(L2,_終了状態). 表示する([]) :- !. 表示する([_実数|R]) :- writef('%t\n',[_実数]), 表示する(R). % 以下のサイトは # [1] 授業単元: プログラミング  # [2] 問題文(含コード&リンク):入力仕様を、入力座標は最大2桁までの整数を # 最大10件までとし、入力範囲のチェックと、最大件数のチェックを行う # プログラムの作成。 '入力座標は最大2桁までの整数を最大10件までとし、入力範囲のチェックと、最大件数のチェックを行う'(_入力座標ならび) :- length(Ln,10), 座標入力(_座標), '入力座標は最大2桁までの整数を最大10件までとし、入力範囲のチェックと、最大件数のチェックを行う'(Ln,_座標,_入力座標ならび). '入力座標は最大2桁までの整数を最大10件までとし、入力範囲のチェックと、最大件数のチェックを行う'(_,end_of_file,[]) :- !. '入力座標は最大2桁までの整数を最大10件までとし、入力範囲のチェックと、最大件数のチェックを行う'([_],_座標,[_座標]) :- !. '入力座標は最大2桁までの整数を最大10件までとし、入力範囲のチェックと、最大件数のチェックを行う'([_|Ln],_座標,[_座標|R2]) :- 座標入力(_座標2), '入力座標は最大2桁までの整数を最大10件までとし、入力範囲のチェックと、最大件数のチェックを行う'(Ln,_座標2,R2). 座標入力(_座標) :- get_line(Line), 座標入力診断(Line,_座標),!. 座標入力(_座標) :- 座標入力(_座標). 座標入力診断(Line,_座標) :- atom_to_term(Line,_座標,_), integer(_座標), number_chars(_座標,Chars), length(Chars,Len), len >= 1, Len =< 2,!. 座標入力診断(Line,_) :- writef('入力された%tからは2桁までの座標値は得られません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/945 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # strcmp()を利用し、input.txtを読み込み、キーボードから英単語を1つ入力し、その単語が、input.txtに何個含まれるかを出力するプログラムを作成しなさい。 # 'input.txtを読み込み、キーボードから英単語を1つ入力し、その単語が、input.txtに何個含まれるかを出力する' :- 'input.txtを読み込み'(LL), キーボードから英単語を1つ入力し(_英単語), 英単語から何個含まれるか(LL,_英単語,_何個), writef('英単語%tはinput.txtに%t個含まれる\n',[_英単語,_何個]). 'input.txtを読み込み'(LL) :- see('input.txt'), readln(X,_終了状態), 'input.txtを読み込み'(X,_終了状態,LL), seen. 'input.txtを読み込み'(_,end_of_file,[]) :- !. 'input.txtを読み込み'(L,_,[L|R]) :- readln(L2,_終了状態2), 'input.txtを読み込み'(L2,_終了状態2,R). キーボードから英単語を1つ入力し(_英単語) :- get_line(_英単語),!. 英単語から何個含まれるか(LL,_英単語,_何個) :- flatten(LL,L), count(member(_英単語,L),_何個). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% count(P,N) :- findsum(1,P,F), N is truncate(F). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum(_値ならび,_合計値),!. sum([],0) :- !. sum([N|R],X) :- sum(R,Y), X is N + Y. % split/3の定義 % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/929 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # strcmp()を利用し、../test/read.cgi/tech/1307166756/904で利用したものと同様のimput.txtを読み込む。 # キーボードから英単語を1つ入力し、その単語が、input.txtに何個含まれるかを出力するプログラムを作成しなさい。 # 'キーボードから英単語を1つ入力し、その単語が、input.txtに何個含まれるかを出力するプログラムを作成しなさい' :- 'キーボードから英単語を1つ入力し'(_英単語), 'その単語が、input.txtに何個含まれるかを出力する'(_英単語). 'キーボードから英単語を1つ入力し'(_英単語) :- get_line(_英単語). 'その単語が、input.txtに何個含まれるかを出力する'(_英単語) :- 'input.txtを読み込む'(LL), 何個含まれるか(LL,_英単語,_何個), 出力する(_英単語,_何個). 'input.txtを読み込む'(LL) :- see('input.txt'), readln(X,_終了状態), 'input.txtを読み込む'(X,_終了状態,LL), seen,!. 'input.txtを読み込む'(_,end_of_file,[]) :- !. 'input.txtを読み込む'(A,_,[A|R]) :- readln(B,_終了状態2), 'input.txtを読み込む'(B,_終了状態2,R). 何個含まれるか(LL,_英単語,_何個) :- flatten(LL,L), count(member(_英単語,L),_何個). 出力する(_英単語,_何個) :- writef('%t はinput.txt中に %t個含まれます。\n',[_英単語,_何個]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% count(P,N) :- findsum(1,P,F), N is truncate(F). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum(_値ならび,_合計値),!. sum([],0) :- !. sum([N|R],X) :- sum(R,Y), X is N + Y. % split/3の定義 % 以下のサイトは # Fileから項をストリームを使わず読みだして、そのままのリストとします。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% file_to_list(File,List) :- see(File), file_to_list(List), seen,!. file_to_list([X|R]) :- read(X), \+(X=end_of_file), file_to_list(R). file_to_list([]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% file_to_list(File,List) :- see(File), read(X), file_to_list(X,List), seen. file_to_list_1(end_of_file,[]) :- !. file_to_list_1(X,[X|R]) :- read(Y), file_to_list_1(Y,R). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% file_to_list(File,List) :- see(File), findall(X,repeat_read(X),List), seen. repeat_read(X) :- read(X), ( X=end_of_file,!,fail; true ). repeat_read(X) :- repeat_read(X). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% file_to_list(File,List) :- see(File), findall(X,( repeat, read(X), ( X=end_of_file,!,fail; true )), List), seen. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/342 # # ごめんなさい。よろしくお願いします。 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): # 学籍番号(整数)、身長(実数)、体重(実数)を入力すると、meibo.txt という # 名前のファイルを作り、その中に学籍番号、身長、体重を記録する処理と、 # 続いてそのファイルを開いてデータを読み込み、指定した番号の人のデータを # 以下のように表示する処理をするプログラムを作りなさい。 # (実行後meibo.txt の中身は # # 1 # 168.000000 # 55.000000 # 2 # 170.000000 # 66.000000 # 3 # 158.000000 # 45.000000 # # と書かれている) # # 実行例です # http://ime.nu/uproda.2ch-library.com/387866eaw/lib387866.jpg # # '学籍番号(整数)、身長(実数)、体重(実数)を入力すると、meibo.txt という名前のファイルを作り、その中に学籍番号、身長、体重を記録する処理と、続いてそのファイルを開いてデータを読み込み、指定した番号の人のデータを以下のように表示する' :- '学籍番号(整数)、身長(実数)、体重(実数)を入力すると、meibo.txt という名前のファイルを作り、その中に学籍番号、身長、体重を記録する処理', 続いて, 'そのファイルを開いてデータを読み込み、指定した番号の人のデータを以下のように表示する'. '学籍番号(整数)、身長(実数)、体重(実数)を入力すると、meibo.txt という名前のファイルを作り、その中に学籍番号、身長、体重を記録する処理' :- '学籍番号(整数)、身長(実数)、体重(実数)を入力すると'(_学籍番号・身長・体重ならび), 'meibo.txt という名前のファイルを作り'(Outstream), 'その中に学籍番号、身長、体重を記録する'(Outstream,_学籍番号・身長・体重ならび),!. そのファイルを開いてデータを読み込み、指定した番号の人のデータを以下のように表示する :- そのファイルを開いてデータを読み込み(_データ), 指定した番号の人のデータを以下のように表示する(_データ). '学籍番号(整数)、身長(実数)、体重(実数)を入力すると'(_学籍番号・身長・体重ならび) :- 登録人数を得る(_登録人数), 学籍番号・身長・体重ならびを形作る(_学籍番号・身長・体重ならび,_登録人数), 学籍番号・身長・体重ならびを得る(_学籍番号・身長・体重ならび). 学籍番号・身長・体重ならびを形作る(_学籍番号・身長・体重ならび,_登録人数) :- length(_学籍番号・身長・体重ならび,_登録人数). 学籍番号・身長・体重ならびを得る([]). 学籍番号・身長・体重ならびを得る([[_学籍番号・身長・体重ならび]|R]) :- 学籍番号を得る(_学籍番号), 身長を得る(_身長), 体重を得る(_体重), 学籍番号・身長・体重ならびを得る(R). 'meibo.txt という名前のファイルを作り'(Outstream) :- open('meibo.txt',write,Outstream),!. 'その中に学籍番号、身長、体重を記録する'(Outstream,_学籍番号・身長・体重ならび) :- append(_,[[_学籍番号,_身長,_体重]|R],_学籍番号・身長・体重ならび), writef(Outstream,'%t\n%t\n%t\n',[_学籍番号,_身長,_体重]), R = [], close(Outstream),!. そのファイルを開いてデータを読み込み(_データ) :- get_lines('meibo.txt',_データ). 指定した番号の人のデータを以下のように表示する(_データ) :- 指定した番号の人(_学籍番号), 指定した番号の人のデータを以下のように表示する(_学籍番号,_データ),!. 指定した番号の人のデータを以下のように表示する('',_) :- !. 指定した番号の人のデータを以下のように表示する(end_of_file,_) :- !. 指定した番号の人のデータを以下のように表示する(_学籍番号,_データ) :- append(_,[[_学籍番号,_身長,_体重]|_],_データ), writef('%t %t %t\n',[_学籍番号,_身長,_体重]), 指定した番号の人(_学籍番号2), 指定した番号の人のデータを以下のように表示する(_学籍番号2,_データ),!. 指定した番号の人(_学籍番号) :- write('検索する学籍番号を入れてください : '), get_integer(_学籍番号),!. 登録人数を得る(_登録人数) :- write('最初に登録人数を決めてください : '), get_line(Line), 登録人数入力診断(Line,_登録人数),!. 登録人数入力診断(Line,_登録人数) :- atom_to_term(Line,_登録人数,_), integer(_登録人数), _登録人数 >= 1, _登録人数 =< 10,!. 登録人数入力診断(Line,_登録人数) :- 再入力指示(Line,[登録人数]). 学籍番号を得る(_学籍番号) :- repeat, write('学籍番号(整数) : '), get_line(Line), 学籍番号入力検査(Line,_学籍番号),!. 学籍番号入力検査(Line,_学籍番号) :- 再入力指示(Line,学籍番号), fail. 身長を得る(_身長) :- repeat, write('身長(実数) : '), get_line(Line), 学籍番号入力検査(Line,_身長),!. 体重を得る(_体重) :- repeat, write('体重(実数) : '), get_line(Line), 学籍番号入力検査(Line,_体重),!. 学籍番号入力検査(Line,_学籍番号) :- atom_to_term(Line,_学籍番号,_), integer(_学籍番号),!. 学籍番号入力検査(Line,_学籍番号) :- 再入力指示(Line,学籍番号), fail. 身長入力検査(Line,_身長) :- atom_to_term(Line,_身長,_), float(_身長),!. 身長入力検査(Line,_身長) :- 再入力指示(Line,身長), fail. 体重入力検査(Line,_体重) :- atom_to_term(Line,_体重,_), float(_体重),!. 体重入力検査(Line,_体重) :- 再入力指示(Line,体重), fail. 再入力指示(Line,_項目名) :- writef('入力された %t からは%tが得られません。再入力をお願いします。\n',[Line,_項目名]). 続いて :- true. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/341 # # [よろしくお願いします・・(´・ω・`) # # 1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): # 整数aとbを入力すると、mylife.txt という名前のファイルを作り、その中にa+bの計算結果を記録する処理と、 # 続いてそのファイルを開いてデータを読み込み、ディスプレイ上に表示する処理をするプログラムを作りなさい。 # (実行後mylife.txt の中身は # # 126 # # とだけ書かれている) # # http://ime.nu/uproda.2ch-library.com/387865yc9/lib387865.jpg # 実行例です。 # # http://ime.nu/uproda.2ch-library.com/387863Wqm/lib387863.jpg # ここまで出来て居ます # '整数aとbを入力すると、mylife.txt という名前のファイルを作り、その中にa+bの計算結果を記録する処理と、続いてそのファイルを開いてデータを読み込み、ディスプレイ上に表示する処理をする' :- '整数aとbを入力すると、mylife.txt という名前のファイルを作り、その中にa+bの計算結果を記録する', 続いて, _そのファイル = 'mylife.txt', そのファイルを開いてデータを読み込み、ディスプレイ上に表示する(_そのファイル). '整数aとbを入力すると、mylife.txt という名前のファイルを作り、その中にa+bの計算結果を記録する' :- 整数aとbを入力すると(_a,_b), 'mylife.txt という名前のファイルを作り'(Outstream), 'a+bの計算結果を'(_a,_b,_計算結果), 記録する(Outstream). 整数aとbを入力すると(_a,_b) :- 整数aを入力する(_a), 整数bを入力する(_b). 整数aを入力する(_a) :- write('整数を入力してください : '), get_integer(_a). 整数bを入力する(_b) :- write('整数を入力してください : '), get_integer(_b). 'mylife.txt という名前のファイルを作り'(Outstream) :- open('mylife.txt',write,Outstream),!. 'a+bの計算結果を'(_a,_b,_計算結果) :- _計算結果 is _a + _b. 記録する(Outstream,_計算結果) :- writef(Outstream,'%t\n',[_計算結果]), close(Outstream). 続いて :- true. そのファイルを開いてデータを読み込み、ディスプレイ上に表示する(_そのファイル) :- そのファイルを開いて(_そのファイル,Instream), データを読み込み(Instream,_データ), ディスプレイ上に表示する(Instream,_データ). そのファイルを開いて(_そのファイル,Instream) :- open(_そのファイル,read,Instream). データを読み込み(Instream,_データ) :- get_lines(Instream,_データ), close(Instream). ディスプレイ上に表示する(_データ) :- put_lines(_データ). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_lines(Stream,Lines) :- is_stream(Stream), get_chars(Stream,Chars), chars_lines(Chars,Lines),!. get_lines(File,Lines) :- atom(File), exitst(File,read), 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(File,L) :- \+(is_stream(_,File,_)), slush_op(File,File_1), exists(File_1,read), open(File_1,read,Input), get_char(Input,X), get_chars(Input,X,L), close(Input),!. get_chars(Input,L) :- is_stream(_,Input,_), get_char(Input,X), get_chars(Input,X,L),!. % *** user: chars_lines / 3 *** 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). % *** user: chars_lines / 2 *** chars_lines([],[]) :- !. chars_lines(L,[A|R2]) :- chars_lines(L,U,R), concat_atom(U,A), chars_lines(R,R2). % *** user: put_lines / 2 *** put_lines(_,[]) :- !. put_lines(Output,[Line|R]) :- is_stream(Output), write(Output,Line), write(Output,'\n'), put_lines(Output,R),!. put_lines(File,L) :- \+(is_stream(File)), open(File,write,Output), put_lines(Output,L), close(Output),!. % *** user: put_lines / 1 *** put_lines(Lines) :- append(_,[Line|R],Lines), write_formatted('%t\n',[Line]), R = [],!. % *** user: get_integer / 2 *** get_integer(Input,N) :- get_line(Input,Line), get_integer_1(Input,Line,N),!. % *** user: get_integer / 1 *** get_integer(N) :- get_line(Line), get_integer_1(Line,N),!. % *** user: get_integer_1 / 3 *** get_integer_1(_,end_of_file,_) :- !, fail. get_integer_1(Input,Line,N) :- atom_to_term(Line,N,_), integer(N),!. get_integer_1(Input,_,N) :- get_line(Input,Line), get_integer_1(Input,Line,N) . % *** user: get_integer_1 / 2 *** get_integer_1(end_of_file,_) :- !,fail. get_integer_1(Line,N) :- atom_to_term(Line,N,_), integer(N),!. get_integer_1(_,N) :- get_line(Line), get_integer_1(Line,N). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/204 # # 【質問テンプレ】 # [1] 授業単元:プログラム言語 # [2] 問題文:コマンドプロンプト上で名前と # 国語、社会、数学、理科、社会の5科目の成績を入力して、 # それをバイナリファイルで保存するプログラムを作成せよ。 # 保存するファイル名はこれらを入力する前、つまり一番最初に入力して # そのファイル名で保存するものとする。 # 30件の入力があるか、EOFの入力を持って入力を終了するものとする。 # また、これとは別に入力して作成されたバイナリファイルを開く # プログラムを作成すること。 # sample # 保存したいファイル名:student.dat # 名前:tanaka # 国語:65 # 社会:80 # 数学:54 # 理科:71 # 英語:48 #   ・ #   ・ #   ・ # ※30件かEOFの入力を持って終了 # プログラムを開くほう # sample # オープンしたいファイル:student.dat # tanakaさんの成績 国語:65点 社会:80点 数学:54点 理科:71点 英語:48点#                       ・ #                       ・ #                       ・ # 科目名(国語). 科目名(社会). 科目名(数学). 科目名(理科). 科目名(英語). 国語、社会、数学、理科、英語の5科目の成績を入力して、それをバイナリファイルで保存する :- length(_成績ならび,30), write('保存したいファイル名:'),get_line(_保存ファイル名), write('名前:'),get_line(_名前), 国語、社会、数学、理科、英語の5科目の成績を入力(_名前,_成績ならびの一), 末尾の変数部分を切り取る(_成績ならびの一,_成績ならび), バイナリファイルで保存する(_保存ファイル名,_成績ならび). 国語、社会、数学、理科、英語の5科目の成績を入力(end_of_file,L) :- !. 国語、社会、数学、理科、英語の5科目の成績を入力(_名前,[[_名前|_5科目の成績]]) :- '5科目の成績を入力'(_名前,_5科目の成績), write('名前:'),get_line(_名前2),!. 国語、社会、数学、理科、英語の5科目の成績を入力(_名前,[[_名前|_5科目の成績]|R]) :- '5科目の成績を入力'(_名前,_5科目の成績), write('名前:'),get_line(_名前2), 国語、社会、数学、理科、英語の5科目の成績を入力して(_名前2,R). '5科目の成績を入力'(_5科目の成績) :- findall([_科目名,_成績],( 科目名(_科目名), writef('%t: ',[_科目名]), get_integer(_成績)), _5科目の成績). 末尾の変数部分を切り取る([],[]) :- !. 末尾の変数部分を切り取る([V|R],[]) :- var(V),!. 末尾の変数部分を切り取る([A|R1],[A|R2]) :- 末尾の変数部分を切り取る(R1,R2). バイナリファイルで保存する(_保存ファイル名,_成績ならび) :- open(_保存ファイル名,write,Outstream,[type(binary)]), append(_,[_科目ならび]|R],_成績ならび), '8ビットコードで一行分書き出す'(Outstream,_項目ならび), R = [], close(Outstream),!. '8ビットコードで一行分書き出す'(Outstream,[_氏名,_5科目ならび]) :- 氏名の出力(Outstream,_氏名), append(_,[[_科目名,_成績ならび]|R],_5科目ならび), 成績ならびの出力(Outstream,_5科目ならび), R = [], put_byte(Outstream,10),!. 氏名の出力(Outstream,_氏名) :- atom_codes(_氏名,Codes), 全角文字を8ビット展開(Codes,Codes1), append(_,[Code|R1],Code1), put_byte(Outstream,Code), R1 = [], put_byte(Outstream,32),!. 成績ならびの出力(Outstream,_5科目ならび) :- append(_[[_科目名,_成績]|R],_5科目ならび), 科目名の出力(Outstream,_科目名), 成績の出力(Outstream,_成績), R = [],!. 科目名の出力(Outstram,_科目名) :- atom_codes(_項目名,Codes), 全角文字を8ビット展開(Codes,Codes2), append(_,[Code|R],Code2), put_byte(Outstream,Code), R = [], put_byte(Outstream,58),!. 成績の出力(Outstram,_成績) :- number_codes(_成績,Codes), append(_,[Code|R],Code), put_byte(Outstream,Code), R = [], put_byte(Outstream,32),!. 全角文字を8ビット展開([],[]). 全角文字を8ビット展開([N|R1],[N2,N3|R2]) :- N >= 256, N2 is N // 256, N3 is N mod 256, 全角文字を8ビット展開(R1,R2). 全角文字を8ビット展開([N|R1],[N|R2]) :- N < 256, 全角文字を8ビット展開(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/274 # # [1] 授業単元:プログラミング実習 # [2] 問題文(含コード&リンク):http://ime.nu/www.dotup.org/uploda/www.dotup.org1324335.txt.html # # 商品(data1.txt)と在庫(data2.txt)からデータを読み込み # 商品名を入力すると、ID、単価、在庫総数、総在庫額を出力するプログラムの作成 # それぞれを構造体に読み込んでから探索、計算をお願いします # # ファイル様式 # data1.txtは上からID、商品名、単価の順番で並んでいます # data2.txtは上からID、在庫数の順番で並んでいます # # data1.txt # 1 # マウス # 780 # 2 # キーボード # 980 # 3 # ボールペン # 120 # 4 # えんぴつ # 80 # 5 # イヤホン # 790 # # data2.txt # 1 # 15 # 2 # 10 # 3 # 23 # 4 # 40 # 5 # 5 '商品(data1.txt)と在庫(data2.txt)からデータを読み込み商品名を入力すると、ID、単価、在庫総数、総在庫額を出力する' :- '商品(data1.txt)と在庫(data2.txt)からデータを読み込み'(_商品データならび,_在庫データならび), 商品名を入力すると、ID、単価、在庫総数、総在庫額を出力する(_商品データならび,_在庫データならび). '商品(data1.txt)と在庫(data2.txt)からデータを読み込み'(_商品データならび,_在庫データならび) :- '商品(data1.txt)を読み込む'(_商品データならび), '在庫(data2.txt)を読み込む'(_在庫データならび). '商品(data1.txt)を読み込む'(_商品データならび) :- get_lines('data1.txt',_商品データならび). '在庫(data2.txt)を読み込む'(_在庫データならび) :- get_lines('data1.txt',_在庫データならび). 商品名を入力すると、ID、単価、在庫総数、総在庫額を出力する(_商品データならび,_在庫データならび) :- 商品名を入力すると(_商品名), 'ID、単価、在庫総数、総在庫額を出力する'(_商品名,_商品データならび,_在庫データならび),!. 商品名を入力すると、ID、単価、在庫総数、総在庫額を出力する(_商品データならび,_在庫データならび) :- 商品名を入力すると、ID、単価、在庫総数、総在庫額を出力する(_商品データならび,_在庫データならび). 商品名を入力すると(_商品名) :- write('商品名を入力してください : '), get_line(_商品名). 'ID、単価、在庫総数、総在庫額を出力する'('',_,_) :- !. 'ID、単価、在庫総数、総在庫額を出力する'(end_of_file,_,_) :- !. 'ID、単価、在庫総数、総在庫額を出力する'(_商品名,_商品データならび,_在庫データならび) :- append(_,[[_ID,_商品名,_単価]|_],_商品データならび), findsum(_在庫数,append(_,[[_ID,_在庫数]|_],_在庫データならび),_在庫総数), _総在庫額 is truncate(_在庫総数 * _単価), write_formatted('%t,%t,%t,%t\n',[_ID,_単価,_在庫総数,_総在庫額]), fail. 'ID、単価、在庫総数、総在庫額を出力する'(_商品名,_商品データならび,_在庫データならび) :- \+(append(_,[[_ID,_商品名,_単価]|_],_商品データならび)), write_formatted('入力された商品名%tは商品データの中に存在しません。再入力をお願いします。\n',[_商品名]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/194 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # http://ime.nu/codepad.org/GxAuXYrr # http://ime.nu/codepad.org/2mRtRFu9 # # # /* #   このプログラムはTCP/IPによるプロセス間通信のプログラムです。 # 辞書ファイルを用意し、クライアントで単語を入力すると、 # サーバーがファイル中から該当単語の意味を読み込んで # クライアントに送信するプログラムです。 # # このプログラムをUDPを用いて実現してください。 # ただし追加機能として単語登録機能を追加する。 # 辞書ファイルは"dictinary.txt"としアクセス時に排他制御を行う。 # 単語登録時にやりとりするメッセージは各自で考える。 # */ # # /* # 辞書ファイル(dictinary.txt) # ---------------- # social:社会 # number:数字 # list:一覧 # test:試験 # dictionary:辞書 # word:単語 # # */ 'TCP/IP辞書サーバ' :- 'TCP/IPサーバ開設'(Socket,NewSocket,Instream,Outstream), '辞書サーバ'(Socket,NewSocket,Instream,Outstream), 'TCP/IPサーバ解放'(Socket,NewSocket,Instream,Outstream). '辞書サーバ'(Socket,NewSocket,Instream,Outstream) :- get_line(Instream,_単語), '辞書サーバ'(Socket,NewSocket,Instream,Outstream,_単語),!. '辞書サーバ'(Socket,NewSocket,Instream,Outstream,end_of_file) :- !. '辞書サーバ'(Socket,NewSocket,Instream,Outstream,_単語) :- 辞書(_単語,_単語の意味ならび), concat_atom(_単語の意味ならび,',',S), concat_atom([_単語,':',S,'\n'],_表示文字列), put_line(Outstream,_表示文字列), get_line(Instream,_単語2), '辞書サーバ'(Socket,NewSocket,Instream,Outstream,_単語2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289816228/621 # # C言語の質問です。自分でも何を言いたいのかわからないくらい初心者なのですが、 # 元々作成してあるファイル(テキストファイル)から、一文字ずつ入力して # スペースが入力されたらタブ文字を入れたテキストを画面に出力し # \nが入力されたら改行し # その他の文字が入力されたらそのまま画面に表示する # というプログラムを作りたいのですがソースプログラムはどのようにすればよいのでしょうか。 # アドバイスよろしくお願いします。 # # '元々作成してあるファイル(テキストファイル)から、一文字ずつ入力してスペースが入力されたらタブ文字を入れたテキストを画面に出力し\\nが入力されたら改行しその他の文字が入力されたらそのまま画面に表示する'(_テキストファイル) :- open(_テキストファイル,read,Instream), get_char(Instream,_文字), '一文字ずつ入力してスペースが入力されたらタブ文字を入れたテキストを画面に出力し\\nが入力されたら改行しその他の文字が入力されたらそのまま画面に表示する'(Instream,_文字), close(Instream),!. '一文字ずつ入力してスペースが入力されたらタブ文字を入れたテキストを画面に出力し\\nが入力されたら改行しその他の文字が入力されたらそのまま画面に表示する'(Instream,end_of_file) :- !. '一文字ずつ入力してスペースが入力されたらタブ文字を入れたテキストを画面に出力し\\nが入力されたら改行しその他の文字が入力されたらそのまま画面に表示する'(Instream,' ') :- 空白を読みとばす(Instream,_次の文字), write('\t'), '一文字ずつ入力してスペースが入力されたらタブ文字を入れたテキストを画面に出力し\\nが入力されたら改行しその他の文字が入力されたらそのまま画面に表示する'(Instream,_次の文字),!. '一文字ずつ入力してスペースが入力されたらタブ文字を入れたテキストを画面に出力し\\nが入力されたら改行しその他の文字が入力されたらそのまま画面に表示する'(Instream,_文字) :- write(_文字), get_char(_次の文字), '一文字ずつ入力してスペースが入力されたらタブ文字を入れたテキストを画面に出力し\\nが入力されたら改行しその他の文字が入力されたらそのまま画面に表示する'(Instream,_次の文字),!. 空白を読みとばす(Instream,end_of_file) :- at_end_of_stream(Instream),!. 空白を読みとばす(Instream,_文字) :- get_char(Instream,_文字), \+(_文字=' '),!. 空白を読みとばす(Instream,_文字) :- 空白を読みとばす(Instream,_文字). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/514 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # テキストファイルに保存された携帯電話データをコマンド選択により処理する # 携帯電話情報管理プログラムを作成せよ # # 右のテキストファイルを左のように書き換える(昇順ソート) # 2 SC-02B docomo 12 118     1 003SH softbank 12 139 # 3 IS03 au 13 138        → 2 SC-02B docomo 12 118 # 1 003SH softbank 12 139     3 IS03 au 13 138 # # 鍵情報(Line,_鍵) :- split(Line,[' '],[_,_,_,_鍵]). 切り出し指定行数(100). 昇順併合整列(_対象ファイル) :- tmpnam(_併合ファイル1), open(_併合ファイル1,read,Instream1), open(_対象ファイル,read,Instream), 昇順併合整列(Instream,Instream1,_併合ファイル1,_整列済みファイル), 整列済みファイルの表示(_整列済みファイル). 昇順併合整列(Instream,Instream1,_併合ファイル,_併合ファイル) :- at_end_of_stream(Instream), close(Instream), close(Instream1). 昇順併合整列(Instream,Instream1,_,_併合ファイル) :- tmpnam(_併合ファイル1), 先頭から指定行の整列(100,Instream,_整列したならび), open(_併合ファイル,write,Outstream), 昇順併合整列(_整列したならび,Instream1,_Outstream), close(Outstream), close(Instream1), open(_併合ファイル1,read,Instream2), 昇順併合整列(Instream,Instream2,_併合ファイル1,_併合ファイル). 昇順併合整列(_整列したならび,_整列ファイル,_併合ファイル) :- open(_整列ファイル,read,Instream), open(_併合ファイル,write,Outstream), get_line(Instream,Line), 昇順併合整列(Instream,Outstream,_整列したならび,Line), close(Outstream), close(Instream). 先頭から指定行の整列(Instream,_整列したならび) :- 切り出し指定行数(_切り出し指定行数), get_line(Insteam,Line), 先頭から指定行の切り出し(100,Instream,Line,_100行), 鍵指定整列(_切り出し指定行数,_整列したならび),!. 先頭から指定行の切り出し(1,Instream,Line,[Line]) :- !. 先頭から指定行の切り出し(_,Instream,end_of_file,[]) :- !. 先頭から指定行の切り出し(N,Instream,Line,[Line|R]) :- get_line(Instream,Line2), N1 is N - 1, 先頭から指定行の切り出し(N,Instream,Line2,R). 昇順併合整列(Instream,Outstream,[],end_of_file) :- !. 昇順併合整列(Instream,Outstream,[],Line) :- write_formatted(Outstream,'%t\n',[Line]), get_line(Instream,Line2), 昇順併合整列(Instream,Outstream,[],Line2),!. 昇順併合整列(Instream,Outstream,[A|R],Line) :- A @>= Line, get_line(Instream,Line2), 昇順併合整列(Instream,Outstream,[A|R],Line2),!. 昇順併合整列(Instream,Outstream,[A|R],Line) :- A @< Line, write_formatted(Outstream,'%t\n',[A]), 昇順併合整列(Instream,Outstream,R,Line),!. 昇順併合(Instream1,Instream2,Outstream) :- get_line(Instream1,Line1), get_line(Instream2,Line2), 昇順併合(Instream1,Instream2,Outstream,Line1,Line2). 昇順併合(Instream1,Instream2,Outstream,Line1,Line2) :- 鍵情報(Line1,_鍵1), 鍵情報(Line2,_鍵2), _鍵1 @=< _鍵2, write_formatted(Outstream,'%t\n',[Line1]), get_line(Instream1,Line), 昇順併合(Instream1,Instream2,Outstream,Line,Line2). 昇順併合(Instream1,Instream2,Outstream,Line1,Line2) :- write_formatted(Outstream,'%t\n',[Line2]), get_line(Instream2,Line), 昇順併合(Instream1,Instream2,Outstream,Line1,Line). 整列済みファイルの表示(_整列済みファイル) :- open(_整列済みファイル,read,Instream), get_line(Instream,Line), 整列済みファイルの表示(Instream,Line), close(Instream). 整列済みファイルの表示(_,end_of_file) :- !. 整列済みファイルの表示(Instream,Line) :- write_formatted('%t\n',[Line]), get_line(Instream,Line2), 整列済みファイルの表示(Instream,Line2). 鍵指定昇順整列([],[]) :- !. 鍵指定昇順整列([A|R],L) :- 鍵指定昇順分割(A,R,_Aより小さい,_Aと等しいか大きい), 鍵指定昇順整列(_Aより小さい,L1), 鍵指定昇順整列(_Aと等しいか大きい,L2), append(L1,[A|L2],L). 鍵指定昇順分割(A,[],[],[]) :- !. 鍵指定昇順分割(A,[_行|R],_Aより小さい,_Aと等しいか大きい) :- 鍵情報(A,_鍵1), 鍵情報(_行,_鍵2), _鍵1 @> _鍵2, 鍵指定昇順分割(A,R,[_行|_Aより小さい],_Aと等しいか大きい). 鍵指定昇順分割(A,[_行|R],_Aより小さい,_Aと等しいか大きい) :- 鍵情報(A,_鍵1), 鍵情報(_行,_鍵2), _鍵1 @=< _鍵2, 鍵指定昇順分割(A,R,_Aより小さい,[_行|_Aと等しいか大きい]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286706874/390 # # Haskellで、対話的なプログラムってどんな感じになりますか? # 手続き的に書くと # # 1. 入力を促すメッセージを表示 # 2. キーボードから文字列を入力 # 3. 特定の文字列or文字列終端が入力されると終了 # 4. 入力された文字列に関数を適用 # 5. 適用した結果を表示 # 6. 最初に戻ってループ # # な感じのプログラムなんですが… # 'Prologで、対話的なプログラム' :- 入力を促すメッセージを表示, キーボードから文字列を入力(_入力文字列), キーボードから文字列を入力(_入力文字列,_入力文字列ならび), concat_atom(_入力文字列ならび,'\n',_対象文字列), 負節実行(_対象文字列,_項), 適用した結果を表示(_項). 'Prologで、対話的なプログラム' :- 'Prologで、対話的なプログラム'. キーボードから文字列を入力(_入力文字列,[]) :- 特定の文字列or文字列終端が入力されると終了(_入力文字列),!. キーボードから文字列を入力(_入力文字列,[_入力文字列|R]) :- 入力を促すメッセージを表示, キーボードから文字列を入力(_入力文字列の二), キーボードから文字列を入力(_入力文字列の二,R). 入力を促すメッセージを表示 :- 入力を促すメッセージ(_入力を促すメッセージ), write('入力を促すメッセージ'). キーボードから文字列を入力(_入力文字列) :- get_line(_入力文字列). 特定の文字列or文字列終端が入力されると終了(end_of_file). 負節実行(_対象文字列,_項) :- atom_to_term(_対象文字列,_項,_), call(_項). 適用した結果を表示(_項) :- write_formatted('%q\n',[_項]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286706874/390 # # Haskellで、対話的なプログラムってどんな感じになりますか? # 手続き的に書くと # # 1. 入力を促すメッセージを表示 # 2. キーボードから文字列を入力 # 3. 特定の文字列or文字列終端が入力されると終了 # 4. 入力された文字列に関数を適用 # 5. 適用した結果を表示 # 6. 最初に戻ってループ # # な感じのプログラムなんですが… # 'Prologで、対話的なプログラム' :- 入力を促すメッセージを表示, キーボードから文字列を入力(_入力文字列), キーボードから文字列を入力(_入力文字列,_入力文字列ならび), concat_atom(_入力文字列ならび,'\n',_対象文字列), 負節実行(_対象文字列,_項), 適用した結果を表示(_項). 'Prologで、対話的なプログラム' :- 'Prologで、対話的なプログラム'. キーボードから文字列を入力(_入力文字列,[]) :- 特定の文字列or文字列終端が入力されると終了(_入力文字列),!. キーボードから文字列を入力(_入力文字列,[_入力文字列|R]) :- 入力を促すメッセージを表示, キーボードから文字列を入力(_入力文字列の二), キーボードから文字列を入力(_入力文字列の二,R). 入力を促すメッセージを表示 :- 入力を促すメッセージ(_入力を促すメッセージ), write('入力を促すメッセージ'). キーボードから文字列を入力(_入力文字列) :- get_line(_入力文字列). 特定の文字列or文字列終端が入力されると終了(end_of_file). 負節実行(_対象文字列,_項) :- atom_to_term(_対象文字列,_項,_), call(_項). 適用した結果を表示(_項) :- write_formatted('%q\n',[_項]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/654 # # 内容: # 1] 授業単元:cプログラミング # [2] クイズゲームを作成する。 # ファイル入出力についてどれだけ理解しているかを確かめる。 # # 画面上に問題を一文ずつ表示し、番号を入力させ答えさせる。 # 結果をtxtファイルで出力する。 # なお、問題文はtxtファイルを作成しそれを読み込んで表示させる。 '画面上に問題を一文ずつ表示し、番号を入力させ答えさせる。結果をtxtファイルで出力する。'(_問題ファイル名,_解答ファイル名) :- open(_問題ファイル,read,Instream), open(_解答ファイル,write,Outstream), '出題して、解答を得る。それを解答を解答ファイルに書き込む(問題ファイルが終了するまで繰り返す)'(Instream,Outstream), close(Outstream), close(Instream). '出題して、解答を得る。それを解答を解答ファイルに書き込む(問題ファイルが終了するまで繰り返す)'(Instream,Outstream) :- 一問読み込む(Instream,_問題), '出題して、解答を得る。それを解答を解答ファイルに書き込む(問題ファイルが終了するまで繰り返す)'(Instream,Outstream,_問題). '出題して、解答を得る。それを解答を解答ファイルに書き込む(問題ファイルが終了するまで繰り返す)'(Instream,Outstream,end_of_file) :- !. '出題して、解答を得る。それを解答を解答ファイルに書き込む(問題ファイルが終了するまで繰り返す)'(Instream,Outstream,_問題) :- 問題を提示して解答を得る(_問題,_解答), 問題と解答を書き込む(Outstream,_問題,_解答), 一問読み込む(Instream,_問題2), '出題して、解答を得る。それを解答を解答ファイルに書き込む(問題ファイルが終了するまで繰り返す)'(Instream,Outstream,_問題2). 一問読み込む(Instream,_問題) :- get_line(Instream,Line), 一問読み込む(Instream,Line,_問題行ならび), concat_atom(_問題行ならび,'\n',_問題),!. 一問読み込む(_,'',[]) :- !. 一問読み込む(Instream,Line,[Line|R]) :- get_line(Instream,Line2), 一問読み込む(Instream,Line,R). 問題を提示して解答を得る(_問題,_解答) :- write_formatted('%t\n',[_問題]), 解答を得る(_解答). 解答を得る(_解答) :- get_line(_解答),!. 問題と解答を書き込む(Outstream,_問題,_解答) :- write_formatted(Outstream,'%t\n%t\n\n',[_問題,_解答]),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/239 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク):文字列の入出力をサブルーチンとして実行する # プログラムを作成せよ。ただし、文字列の入力は複数回行うことができ、 # 1回入力するたびに入力した文字列を標準出力へ出力すること。 # %%%%%%%%%% 決定性 %%%%%%%%%%%%% 文字列の入出力をサブルーチンとして実行する(_文字列) :- get_line(_文字列), write_formatted('%t\n',[_文字列]). %%%%%%%% 繰り返し(非決定性) %%%%%%%%%% 文字列の入出力をサブルーチンとして実行する(_文字列) :- get_line(_文字列), write_formatted('%t\n',[_文字列]). 文字列の入出力をサブルーチンとして実行する(_文字列) :- 文字列の入出力をサブルーチンとして実行する(_文字列). %%%%%%%% 繰り返し(非決定性) %%%%%%%%%% 文字列の入出力をサブルーチンとして実行する(_文字列) :- repeat, get_line(_文字列), write_formatted('%t\n',[_文字列]). %%%%%%%%% 文字列データ収集(決定性) %%%%%%%% 文字列の入出力をサブルーチンとして実行する(_文字列ならび) :- get_line(_文字列), 文字列の入出力をサブルーチンとして実行する(_文字列,_文字列ならび). 文字列の入出力をサブルーチンとして実行する('end_of_file',[]) :- !. 文字列の入出力をサブルーチンとして実行する(_文字列,[_文字列|R]) :- write_formatted('%t\n',[_文字列]), get_line(_文字列2), 文字列の入出力をサブルーチンとして実行する(_文字列2,R). %%%%%%%%% 文字列データ収集(決定性) %%%%%%%% 文字列の入出力をサブルーチンとして実行する(_文字列ならび) :- findall(_文字列,( repeat, get_line(_文字列), ( _文字列=end_of_file,!,fail; write_formatted('%t\n',[_文字列]))), _文字列ならび). %%%%%%%%%% 入力データ検査の定型 %%%%%%%%%%% 文字列の入出力をサブルーチンとして実行する(_文字列,_検査結果) :- get_line(_文字列), ここに検査を入れる(_文字列,_検査結果), write_formatted('%t\n',[_文字列]),!. 文字列の入出力をサブルーチンとして実行する(_文字列,_検査結果) :- 文字列の入出力をサブルーチンとして実行する(_文字列). ここに検査を入れる(_文字列,_検査結果) :- 例えば整数検査ならば, atom_to_term(_文字列,_検査結果,_), 入力検査(_検査結果),!. ここに検査を入れる(_文字列,_検査結果) :- 再入力を求める(_文字列), fail. 再入力を求める(_文字列) :- write_formatted('入力された %t は適切な値を得られませんでした。\n再入力をお願いします。\n',[_文字列]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/335 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク):ファイルに保存された会員情報を指定された項目をキーとしてソートするプログラムを作成する. # 出力形式は,入力データと同じ,つまり1行に1人分のデータを格納し,各項目間はカンマで区切るものとする. # また,ソート済みのデータはファイルではなく標準出力に出力するものとする. # 整数型のデータについては数値として,文字列型のデータについては大文字/小文字を区別せずにソートをすること. # ソートアルゴリズムはこれまでの演習で使用したもの,していないものに関わらず,何を用いてもよい. # # また,会員数は最大で20,000人と仮定してもよい. # # 会員情報の入ったファイルのファイル名,キーとなる項目,正順か逆順かの指定はプログラム実行時の引数として与える.第一引数が会員情報の入ったファイル名,第二引数が項目番号(表1参照),第三引数がソート方法(0なら昇順,1なら降順)とする. # # 表1: データ型 項目名 項目番号 型 # 会員ID 1 整数(int) # 姓 2 文字列(最大で50文字) # 名 3 文字列(最大で50文字) # 年齢 4 整数(int) # 州 5 文字列(最大で50文字) # 郡 6 文字列(最大で50文字) # # # オンメモリ整列限界数(1000). ファイルに保存された会員情報を指定された項目をキーとしてソートする(_対象ファイル,_鍵項目番号,_ソート方法) :- オンメモリ整列限界数(_オンメモリ整列限界数), open(_対象ファイル,read,Input), ふたつの仮ファイルの取得と交互からくり生成, 入力出力ファイルを交互しながらの繰り返し(_,_仮出力ファイル,InputT,OutputT), 対象ファイルから読み込む(Input,_オンメモリ整列限界数,_鍵項目番号,LL,_診断), 昇降順・指定整列(LL,_ソート方法,_整列されたLL), 鍵項目番号とソート方法をしてファイルマージ(_整列されたLL,_ソート方法,InputT,OutputT), \+(_診断=1000),close(Input), 仮出力ファイルの内容を整理しながら標準出力に表示する(_仮出力ファイル). 入力出力ファイルを交互しながらの繰り返し(_仮ファイルA,_仮ファイルB,InputT,OutputT) :- 仮ファイルからくり(_仮ファイルA,_仮ファイルB), open(_仮ファイルA,read,InputT), open(_仮ファイルB,write,OutputT). 仮ファイルからくり(X) :- 仮ファイルからくり(X). ふたつの仮ファイルの取得と交互からくり生成 :- tmpnam(_仮ファイル1),open(_仮ファイル1,write,Output1),close(Output1), tmpnam(_仮ファイル2),opene(_仮ファイル2,write,Output2),close(Output2), asserta(仮ファイルからくり(_仮ファイル2,_仮ファイル1)), asserta(仮ファイルからくり(_仮ファイル1,_仮ファイル2)). 対象ファイルから読み込む(Input,_オンメモリ整列限界数,_鍵項目番号,LL,_診断) :- 対象ファイルから読み込む(Input,0,_オンメモリ整列限界数,_鍵項目番号,LL,_診断),!. 対象ファイルから読み込む(Input,_オンメモリ整列限界数,_オンメモリ整列限界数,_,[],_オンメモリ整列限界数) :- !. 対象ファイルから読み込む(Input,N,_オンメモリ整列限界数,_鍵項目番号,[[_鍵_1,_会員ID,_姓_1,_名_1,_年齢,_州_1,_郡_1]|R],_診断) :- get_line(Input,Line), N2 is N + 1, split([','],Line,[_会員ID,_姓,_名,_年齢,_州,_郡]), to_upper([_姓,_名,_州,_郡],[_姓_1,_名_1,_州_1,_郡_1]), list_nth(_鍵項目番号,[_会員ID,_姓_1,_名_1,_年齢,_州_1,_郡_1],_鍵), 文字項目なら大文字に変換(_鍵,_鍵項目番号,_鍵_1), 対象ファイルから読み込む(Input,N,_オンメモリ整列限界数,_鍵項目番号,R,_診断). 文字項目なら大文字に変換(_鍵,_鍵項目番号,_鍵_1) :- member(_鍵項目番号,[2,3,5,6]), to_upper(_鍵,_鍵_1),!. 文字項目なら大文字に変換(_鍵,_,_鍵). 昇降順・指定整列(LL,1,_整列されたLL) :- sort(LL,_整列されたLL). 昇降順・指定整列(LL,2,_整列されたLL) :- rsort(LL,_整列されたLL). 鍵項目番号とソート方法をしてファイルマージ([],end_of_file,_,InputT,OutputT) :- !. 鍵項目番号とソート方法をしてファイルマージ([L1|R1],end_of_file,_,InputT,OutputT) :- write_formatted(OutputT,'%t,%t,%t,%t,%t,%t,%t\n',L1), 鍵項目番号とソート方法をしてファイルマージ(R1,end_of_file,_,InputT,OutputT),!. 鍵項目番号とソート方法をしてファイルマージ([],[_鍵2|L2],_,InputT,OutputT) :- write_formatted(OutputT,'%t,%t,%t,%t,%t,%t,%t\n',[_鍵2|L2]), eofまでコピーする(InputT,OutputT), close(InputT), close(OutputT),!. 鍵項目番号とソート方法をしてファイルマージ([[_鍵1|L1]]|R1],[_鍵2|L2],1,InputT,OutputT) :- _鍵1 @=< _鍵2, write_formatted(OutputT,'%t\n',[_鍵1|L1]), 鍵項目番号とソート方法をしてファイルマージ(R1,[_鍵2|L2],_ソート方法,InputT,OutputT). 鍵項目番号とソート方法をしてファイルマージ([[_鍵1|L1]|R1],[_鍵2|L2],1,InputT,OutputT) :- _鍵1 @> _鍵2, write_formatted(OutputT,'%t\n',[_鍵2|L2]), get_line(InputT,Line), atom_to_term(Line,(_鍵3,_会員ID3,_姓3,_名3,_年齢3,_州3,_郡3),_), 鍵項目番号とソート方法をしてファイルマージ(R1,[_鍵3,_会員ID3,_姓3,_名3,_年齢3,_州3,_郡3],_ソート方法,InputT,OutputT). 鍵項目番号とソート方法をしてファイルマージ([[_鍵1|L1]|R1],[_鍵2|L2],2,InputT,OutputT) :- _鍵1 @>= _鍵2, write_formatted(OutputT,'%t\n',[_鍵1|L1]), 鍵項目番号とソート方法をしてファイルマージ(R1,[_鍵2|L2],_ソート方法,InputT,OutputT). 鍵項目番号とソート方法をしてファイルマージ([[_鍵1|L1]|R1],[_鍵2|L2],2,InputT,OutputT) :- _鍵1 @< _鍵2, write_formatted(OutputT,'%t\n',[_鍵2|L2]), get_line(InputT,Line), atom_to_term(Line,(_鍵3,_会員ID3,_姓3,_名3,_年齢3,_州3,_郡3),_), 鍵項目番号とソート方法をしてファイルマージ(R1,[_鍵3,_会員ID3,_姓3,_名3,_年齢3,_州3,_郡3],_ソート方法,InputT,OutputT). eofまでコピーする(InputT,OutputT) :- repeat, get_line(Line), ( Line=end_of_file;write_formatted('%t\n',[Line]),fail),!. 仮出力ファイルの内容を整理しながら標準出力に表示する(_仮出力ファイル) :- open(_仮出力ファイル,read,Input), repeat, get_line(Line), ( Line=end_of_file; split([','],Line,[_|L]), write_formatted('%t,%t,%t,%t,%t,%t\n',L), fail ). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1266565626/675 # # ../test/read.cgi/tech/1266565626/673 # ・とあるディレクトリd0以下に存在する全てのディレクトリをなぞる。 # # ・このとき、今位置するディレクトリdnの相対的な深さをdとして、 #  d個のピリオドをディレクトリdnの名前の前に足した文字列> をファイルFに出力する。 # # ・また、このとき、今位置するディレクトリdnにテキストファイルがあれば、 #  d+1個のピリオドをテキストファイルtnの名前の前に足し、拡張子.txtを除いた文字列 をファイルFに出力する。 # ・さらに、そのテキストファイルtnの内容をそのままファイルFに出力する。 #  テキストファイルtnの内容の各行頭には、ピリオドはつけない。 #  テキストファイルtnの内容のとある行頭にピリオドがある場合は、ピリオドの前に半角空白を入れる。 # # このような仕様です # # # ../test/read.cgi/tech/1266565626/674 # ありがとうございます # # まったくの期待通りですが、 # ピリオドの数が合わない部分がありました # # 下のようなディレクトリで試しました # ttp://www1.axfc.net/uploader/Sc/so/128829.zip # ウイルスチェックはしましたが、念のためもう一度お願いします # 'とあるディレクトリd0以下に存在する全てのディレクトリをなぞる'(_出力ファイル,_階層_1,_とあるディレクトリ) :- ディレクトリ配下の情報を得る(_とあるディレクトリ,_ファイルディレクトリ情報ならび), このディレクトリ配下のファイルを順に表示する(_出力ファイル,_階層_1,_とあるディレクトリ,_ファイルディレクトリ情報ならび), 配下のディレクトリを取り出す(_とあるディレクトリ,_フィルディレクトリ情報ならび,_階層_1,_階層_2,_デレクトリ_2), 'とあるディレクトリd0以下に存在する全てのディレクトリをなぞる'(_出力ファイル,_階層_2,_ディレクトリ_2). 'とあるディレクトリd0以下に存在する全てのディレクトリをなぞる'(_,_,_). ディレクトリ配下の情報を得る(_とあるディレクトリ,_ファイルディレクトリ情報ならび) :- atomic_list_concat(['ls -l ',_とあるディレクトリ],S), sh(S,_ファイルディレクトリ情報ならび). このディレクトリ配下のファイルを順に表示する(_出力ファイル,_階層_1,_ディレクトリ,_ファイルディレクトリ情報ならび) :- 配下のファイルを取り出す(_ファイルディレクトリ情報ならび,_テキストファイル,_入力ファイル), テキストファイルtnの内容をそのままファイルFに出力する(_階層_1,_入力ファイル,_テキストファイル,_出力ファイル), fail. このディレクトリ配下のファイルを順に表示する(_,_,_,_). 配下のファイルを取り出す(_ファイルディレクトリ情報ならび,_テキストファイル,_入力ファイル) :- append(_,[[A|R1]|R],_ファイルディレクトリ情報ならび), sub_atom(A,0,1,_,'-'), last(R1,_テキストファイル), atomic_list_concat([_ディレクトリ,'/',_テキストファイル],__入力ファイル). 配下のディレクトリを取り出す(_とあるディレクトリ,_フィルディレクトリ情報ならび,_階層_1,_階層_2,_デレクトリ_2) :- append(_,[[A|R1]|R],L), sub_atom(A,0,1,_,d), last(R1,_ディレクトリ), atomic_list_concat([_とあるディレクトリ,'/',_ディレクトリ],_ディレクトリ_2), _階層_2 is _階層_1 + 1. '今位置するディレクトリdnの相対的な深さをdとして、d個のピリオドをディレクトリdnの名前の前に足した文字列'(_相対位置,_今位置するディレクトリ,_ピリオドを名前の前に足した文字列) :- n個の同じ文字で構成される文字列(_相対位置,'.',S), atomic_list_concat([S,_今位置するディレクトリ],_ピリオドを名前の前に足した文字列). テキストファイルtnの内容をそのままファイルFに出力する(_階層,_入力ファイル,_テキストファイル,_出力ファイル) :- 'd+1個のピリオドをテキストファイルtnの名前の前に足し、拡張子.txtを除いた文字列を出力ファイルの先頭に書く'(_階層,_テキストファイル,_出力ファイル,Output), open(_入力ファイル,read,Input), get_char(Input,C), テキストファイルtnの内容をそのままファイルFに出力する(Input,Output,C). 'd+1個のピリオドをテキストファイルtnの名前の前に足し、拡張子.txtを除いた文字列を出力ファイルの先頭に書く'(_階層,_テキストファイル,_出力ファイル,Output) :- open(_出力ファイル,write,Output), 'd+1個のピリオドをテキストファイルtnの名前の前に足し、拡張子.txtを除いた文字列'(_階層,_テキストファイル,_文字列), write_formatted(Output,'%t\n',[_文字列]). 'd+1個のピリオドをテキストファイルtnの名前の前に足し、拡張子.txtを除いた文字列'(_d,_テキストファイル,_文字列) :- _d_1 is _d + 1, n個の同じ文字で構成される文字列(_d_1,'.',_ピリオド文字列), atomic_list_concat([_ピリオド文字列,_テキストファイル],_ファイル_1), sub_atom(_ファイル_1,_開始点_1,4,0,'.txt'), sub_atom(_ファイル_1,0,_開始点_1,_,_文字列),!. テキストファイルtnの内容をそのままファイルFに出力する(Input,Output,end_of_file) :- 'Input,Outputの終了'(Input,Output). テキストファイルtnの内容をそのままファイルFに出力する(Input,Output,'\n') :- 改行処理(Input,Output,C2), テキストファイルtnの内容をそのままファイルFに出力する(Input,Output,C2). テキストファイルtnの内容をそのままファイルFに出力する(Input,Output,C) :- 改行以外の処理(Input,Output,C,C2), テキストファイルtnの内容をそのままファイルFに出力する(Input,Output,C2). 'Input,Outputの終了'(Input,Output) :- close(Input), close(Output). 改行処理(Input,Output,C2) :- put_char(Output,'\n'), get_char(Input,C2), 行頭の特殊事情(Output,C2). 行頭の特殊事情(Output,'.') :- put_char(Output,' '),!. 行頭の特殊事情(_,_) :- !. 改行以外の処理(Input,Output,C,C2) :- put_char(Output,C), get_char(Input,C2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 全て同じ文字で構成される文字列(_文字列) :- atom_chars(_文字列,Chars), all(Chars,_). n個の同じ文字で構成される文字列(N,_文字,_文字列) :- 'Nが変数ではない時'(N,_文字,_文字列). n個の同じ文字で構成される文字列(N,_文字,_文字列) :- 'Nが変数の時'(N,_文字,_文字列). 'Nが変数ではない時'(N,_文字,_文字列) :- \+(var(N)), length(Chars,N), all(Chars,_文字), atom_chars(_文字列,Chars),!. 'Nが変数の時'(N,_文字,_文字列) :- var(N), atom_chars(_文字列,Chars), length(Chars,N), all(Chars,_文字). all([],_). all([A|R],A) :- all(R,A). % 以下のサイトは # ただし、以下の条件を満たすようにすること # クライアントでquitが入力された場合、クライアントは接続を切りプログラムを # 終了し、サーバは接続が切れたら、次のクライアントの接続を待つ。 # サーバでquitが入力された場合、サーバは接続を切り、次のクライアントの # 接続を待ち、クライアントは接続が切られたらプログラムを終了する # エンターキーのみが入力された場合は、文字列を送らずもう一度文字列を # 入力させて、その文字列を送るようにする メッセージの送受信(Input,Output,_クライアントからのメッセージ,_サーバからのメッセージ) :- write_formatted('%t\n',[_クライアントからのメッセージ]), get_line(_サーバからのメッセージ),!. 応答型サーバ(_ポート,_ログ) :- socket(internet,stream,Socket), socket_bind(Socket,_ポート), 応答型サーバ(Socket,[],_ログ), socket_shutdown(Socket). 応答型サーバ(Socket,[[end_of_file,_]|R],R) :- !. 応答型サーバ(Socket,[[A,quit]|R],[[A,quit]|R]) :- !. 応答型サーバ(Socket,L1,L2) :- socket_listen(Socket), socket_accept(Socket,Host : _ポート2,NewSocket), open(NewSocket,read,Input), open(NewSocket,write,Output), メッセージの送受信(Input,Output,_クライアントからのメッセージ,_応答型サーバからのメッセージ), close(Input), close(Output). socket_shutdown(NewSocket), 応答型サーバ(Socket,[[クライアントからの_メッセージ,_応答型サーバからのメッセージ]|L1],L2). サーバメッセージの送信(Output,quit) :- !. サーバメッセージの送信(Output,_メッセージ) :- put_line(Output,_メッセージ),!. クライアント(_ホスト,_舫,_送信メッセージ,_受信メッセージ) :- クライアント通信確立(_ホスト, _舫, _差し込み口), open(_差し込み口, read, _入力), open(_差し込み口, write, _出力), クライアント送受信(_ホスト,_舫,_送信メッセージ, _入力, _出力,_受信文字コードならび), close(_入力), close(_出力), socket_shutdown(_差し込み口), atom_codes(_受信文字列,_受信文字コードならび),!. クライアント(_ホスト,_舫,_差し込み口) :- クライアント通信確立(_ホスト, _舫, _差し込み口), open(_差し込み口, read, _入力), open(_差し込み口, write, _出力), write('サーバーに送信するメッセージを入れてください : '), get_line(_送信メッセージ), クライアント送受信(_ホスト,_舫,_送信メッセージ, _入力, _出力,_受信文字コードならび), close(_入力), close(_出力), socket_shutdown(_差し込み口), atom_codes(_受信文字列,_受信文字コードならび), write_formatted('受信した文字列は %t \n',[_受信文字列]). クライアント通信確立(_ホスト, _サービス, _差し込み口) :- 定数(_サービス), !, net_service(_サービス, tcp, _舫), socket(internet, stream, _差し込み口), host_addr(_ホスト, Addr), socket_connect(_差し込み口, Addr : _舫). クライアント通信確立(_ホスト, _舫, _差し込み口) :- 整数(_舫), !, socket(internet, stream, _差し込み口), socket_connect(_差し込み口, _ホスト : _舫). クライアント(_ホスト,_舫,_送信メッセージ,_受信メッセージ) :- クライアント送受信(_ホスト,_舫,_送信メッセージ,_入力,_出力,_受信文字コードならび) :- write_formatted(_出力,'%t\n\n',[_送信メッセージ]), flush_output(_出力), get_code(_入力,Code), クライアント受信(_入力,Code,_受信文字コードならび). クライアント受信(_入力,(-1),[]) :- !. クライアント受信(_入力,_文字コード,[_文字コード|R]) :- get_code(_入力,_文字コード2), クライアント受信(_入力,_文字コード2,R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/94 # # [1] 授業単元: 通信プロトコル # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10268.txt # tcpを用いて21個石がある中から1〜3個の石をServer、Clientで取り合い、 # 最後の1つを取った方が負けとなる石取りゲームを作りなさい。 # server、clientの処理、および使用するポートは自由に決めて構わない。 クライアント一般型(Server,Port,_述語名,_受け取った情報) :- socket(internet, stream, Socket), socket_connect(Socket, Server : Port), open(Socket,read,Input), open(Socket,write,Output), クライアント一般型_1(Input,Output,_述語名,Line). クライアント一般型_1(_,Input,Output,_述語名,_受け取った情報) :- get_line(Line), クライアント一般型_2(Input,Output,Line,_述語名,_受け取った情報). クライアント一般型_1(Socket,Input,Output,_,_) :- close(Input), close(Output), socket_shutdown(Socket),!. クライアント一般型_2(Input,Output,_,end_of_file,end_of_file) :- !. クライアント一般型_2(Input,Output,_,_受け取った情報,_受け取った情報). クライアント一般型_2(Input,Output,_述語名,Line1,_受け取った情報) :- functor(P,_述語名,Arg), arg(1,P,Line1), arg(2,P,Message), call(P), write_formatted(Output,%t\n,[Message]), flush_output(Output), get_line(Line2), クライアント一般型_2(Input,Output,_述語名,Line2,_受け取った情報). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/38 # # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10261.txt # 以下のプログラムを作成せよ。 。# プログラムは日付・休日かどうか・出費の分類(朝食・昼食・夕食・本・休日)、 # 出費の金額・買ったものの名前を順に尋ね、2にある構造体の配列(最大20件)に格納して # 最後に配列のデータをファイルに追記する。連続で入力できるようにし、もしユーザが # 日付で0年と入力すると終了するようにする。 # # # 課題の流れ # # ・繰り返し構造 # 年月日、休日かどうか、出費の分類、金額、商品名を聞き、 # syuppi構造体の配列に順次記録する。 # 0年と入力されたら、繰り返しを終了 # # ・配列に記録した件数分、ファイルに1行ずつ記録する # # ・プログラムの最後で、ファイルに記録されているデータを表示せよ。 # # ###分類の2進数の計算の仕方 # 1ビット目から5ビット目まで朝食、昼食、夕食、本、休日の順でビットが立つ。 # 朝食なら1、昼食なら2、夕食なら4、本なら8、休日なら16 # として、合計をとれば良い。 # 休日の夕食なら 16+4=20となる # # ###たとえば、以下の行は以下を # 休日の2009年12月11日に朝食で食パンを350円 買い # 休日の2009年12月11日にJumpという本を240円 買った # # syokupan 17 2009 12 11 350 # Jump 24 2009 12 11 200 # 解析上鍵となる言葉([休日,年,月,日,円,朝食,夕食,本,は,が,の,に,で,ために,へ,を, 買]). 入力された行動要素を分類してから数値として記録する(_記録ならび) :- findall([_年,_月,_日,_記録,_購入物,_金額]), ( 入力文の解析(_文,_解析した文の要素), ( _文=end_of_file,!,fail; 要素の分類と記録([本,夕食,朝食,昼食,休日],_解析した文の要素,0,_記録), 日付の取得(_解析した文の要素,_年,_月,_日), 購入物と金額(_購入物,_金額) ))), _記録ならび). 日付の取得(_解析した文の要素,_日付) :- member([年,_年],_解析した文の要素), member([月,_月],_解析した文の要素), member([日,_日],_解析した文の要素),!. 購入物と金額(_解析した文の要素,_購入物,_金額) :- member([購入物,_購入物],_解析した文の要素), member([金額,_金額],_解析した文の要素),!. 購入物と金額(_,なし,0). 要素の分類と記録(R,_,_数値,_数値) :- !. 要素の分類と記録([_要素|R],_解析した文の要素,_数値1,_数値) :- member(_解析した文の要素), _要素に対応した加算数字(_要素,_加算数字), _数値2 is _数値1 + _加算数字, 要素の分類と記録(R,_解析した文の要素,_数値2,_数値). 要素に対応する加算数値(朝食,1). 要素に対応する加算数値(昼食,2). 要素に対応する加算数値(夕食,4). 要素に対応する加算数値(本,8). 要素に対応する加算数値(休日,16). 入力文の解析(_文,_解析した文の要素) :- 解析上鍵となる言葉(_鍵言葉ならび), sPLIT(_文,_鍵言葉ならび,L1), 有意な要素の収集(L1,_解析した文の要素),!. 有意な要素の収集(L,L1,_解析した文要素) :- member(_出費の分類,[朝食,昼食,夕食,本,休日]), \+(member(_出費の分類,L1)), 有意な要素の収集(L,[_出費の分類|L1],_解析した文要素),!. 有意な要素の収集(L,L1,_解析した文要素) :- member(X,[年,月,日,円], \+(member([X,_],L1)), append(_,[A,X|_],L), '整数か?ただし全角文字は整数に変換する'(A,N), 有意な要素の収集(L,[[X,N]|L1],_解析した文要素),!. 有意な要素の収集(L,L1,_解析した文要素) :- append(L0,[_購入物,を|R],L), \+(member(_購入物,[本,夕食,昼食,朝食,休日])), \+(member([購入物_購入物],L1)), 有意な要素の収集(L,[[購入物,_購入物]|L1],_解析した文要素),!. 有意な要素の収集(_,解析した文要素,_解析した文要素) :- !. /* 解析上鍵となる言葉([休日,年,月,日,円,朝食,夕食,昼食,本,は,が,の,に,で,ために,へ,を,買]). 形態素解析(文,'休日の2009年12月11日に朝食で食パンを350円買い',X). */ % *** user: '全角文字列整数変換' / 4 *** '全角文字列整数変換'(E,E,_全角文字列,_整数) :- '副文字列'(_全角文字列,E,1,_全角文字), '全角文字整数変換'(_全角文字,_整数),!. '全角文字列整数変換'(N,E,_全角文字列,_整数) :- '副文字列'(_全角文字列,N,1,_全角文字), '全角文字整数変換'(_全角文字,_整数の一), F is E - N, _整数の二 'は' trunc(10 ^ F * _整数の一), M is N + 1, '全角文字列整数変換'(M,E,_全角文字列,_整数の三), _整数 'は' _整数の三 + _整数の二,!. % *** user: '全角文字列整数変換' / 2 *** '全角文字列整数変換'(_全角文字列,_整数) :- '文字列長'(_全角文字列,_文字列長), '全角文字列整数変換'(1,_文字列長,_全角文字列,_整数),!. % *** user: '全角文字整数変換' / 2 *** '全角文字整数変換'('0',0) :- !. '全角文字整数変換'('1',1) :- !. '全角文字整数変換'('2',2) :- !. '全角文字整数変換'('3',3) :- !. '全角文字整数変換'('4',4) :- !. '全角文字整数変換'('5',5) :- !. '全角文字整数変換'('6',6) :- !. '全角文字整数変換'('7',7) :- !. '全角文字整数変換'('8',8) :- !. '全角文字整数変換'('9',9) :- !. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/226 # # 上記を参考に、malloc関数を用いて、氏名、学籍番号、身長の入力を行い、さらに、ユーザからの入力終了指示を受けたら、全ての入力データを画面に出力する、任意の人数の処理が可能な、プログラムを、malloc.cという名前で作成せよ。 # malloc.cをVisual Studioで実行して(5名以上入力)、実行結果をmalloc.c内の文末に「コメント行」として記載せよ。(コメント行を追加後も、ビルド可能か再確認) # % malloc()に相当する述語はさすがにない。assertzで代用。 氏名、学籍番号、身長の入力を行い、さらに、ユーザからの入力終了指示を受けたら、全ての入力データを画面に出力する :- get_line(Line), 氏名、学籍番号、身長の入力を行い、さらに、ユーザからの入力終了指示を受けたら、全ての入力データを画面に出力する(Line), 学生(_氏名,_学籍番号,_身長), write_formatted('%t,%t,%t\n',[_氏名,_学籍番号,_身長]), fail. 氏名、学籍番号、身長の入力を行い、さらに、ユーザからの入力終了指示を受けたら、全ての入力データを画面に出力する. 氏名、学籍番号、身長の入力を行い、さらに、ユーザからの入力終了指示を受けたら、全ての入力データを画面に出力する(end_of_file) :- !. 氏名、学籍番号、身長の入力を行い、さらに、ユーザからの入力終了指示を受けたら、全ての入力データを画面に出力する(Line) :- split(Line,[' '],[_氏名,_学籍番号,_身長]), assertz(学生(_氏名,_学籍番号,_身長)), get_line(Line2), 氏名、学籍番号、身長の入力を行い、さらに、ユーザからの入力終了指示を受けたら、全ての入力データを画面に出力する(Line2). % 以下のサイトは # 出典:: 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/1260532772/38 # # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10261.txt # 以下のプログラムを作成せよ。 。# プログラムは日付・休日かどうか・出費の分類(朝食・昼食・夕食・本・休日)、 # 出費の金額・買ったものの名前を順に尋ね、2にある構造体の配列(最大20件)に格納して # 最後に配列のデータをファイルに追記する。連続で入力できるようにし、もしユーザが # 日付で0年と入力すると終了するようにする。 # # # 課題の流れ # # ・繰り返し構造 # 年月日、休日かどうか、出費の分類、金額、商品名を聞き、 # syuppi構造体の配列に順次記録する。 # 0年と入力されたら、繰り返しを終了 # # ・配列に記録した件数分、ファイルに1行ずつ記録する # # ・プログラムの最後で、ファイルに記録されているデータを表示せよ。 # # ###分類の2進数の計算の仕方 # 1ビット目から5ビット目まで朝食、昼食、夕食、本、休日の順でビットが立つ。 # 朝食なら1、昼食なら2、夕食なら4、本なら8、休日なら16 # として、合計をとれば良い。 # 休日の夕食なら 16+4=20となる # # ###たとえば、以下の行は以下を # 休日の2009年12月11日に朝食で食パンを350円 買い # 休日の2009年12月11日にJumpという本を240円 買った # # syokupan 17 2009 12 11 350 # Jump 24 2009 12 11 200 # 解析上鍵となる言葉([休日,年,月,日,円,朝食,夕食,本,は,が,の,に,で,ために,へ,を, 買]). 入力された行動要素を分類してから数値として記録する(_記録ならび) :- findall([_年,_月,_日,_記録,_購入物,_金額]), ( 入力文の解析(_文,_解析した文の要素), ( _文=end_of_file,!,fail; 要素の分類と記録([本,夕食,朝食,昼食,休日],_解析した文の要素,0,_記録), 日付の取得(_解析した文の要素,_年,_月,_日), 購入物と金額(_購入物,_金額) ))), _記録ならび). 日付の取得(_解析した文の要素,_日付) :- member([年,_年],_解析した文の要素), member([月,_月],_解析した文の要素), member([日,_日],_解析した文の要素),!. 購入物と金額(_解析した文の要素,_購入物,_金額) :- member([購入物,_購入物],_解析した文の要素), member([金額,_金額],_解析した文の要素),!. 購入物と金額(_,なし,0). 要素の分類と記録(R,_,_数値,_数値) :- !. 要素の分類と記録([_要素|R],_解析した文の要素,_数値1,_数値) :- member(_解析した文の要素), _要素に対応した加算数字(_要素,_加算数字), _数値2 is _数値1 + _加算数字, 要素の分類と記録(R,_解析した文の要素,_数値2,_数値). 要素に対応する加算数値(朝食,1). 要素に対応する加算数値(昼食,2). 要素に対応する加算数値(夕食,4). 要素に対応する加算数値(本,8). 要素に対応する加算数値(休日,16). 入力文の解析(_文,_解析した文の要素) :- 解析上鍵となる言葉(_鍵言葉ならび), sPLIT(_文,_鍵言葉ならび,L1), 有意な要素の収集(L1,_解析した文の要素),!. 有意な要素の収集(L,L1,_解析した文要素) :- member(_出費の分類,[朝食,昼食,夕食,本,休日]), \+(member(_出費の分類,L1)), 有意な要素の収集(L,[_出費の分類|L1],_解析した文要素),!. 有意な要素の収集(L,L1,_解析した文要素) :- member(X,[年,月,日,円], \+(member([X,_],L1)), append(_,[A,X|_],L), '整数か?ただし全角文字は整数に変換する'(A,N), 有意な要素の収集(L,[[X,N]|L1],_解析した文要素),!. 有意な要素の収集(L,L1,_解析した文要素) :- append(L0,[_購入物,を|R],L), \+(member(_購入物,[本,夕食,昼食,朝食,休日])), \+(member([購入物_購入物],L1)), 有意な要素の収集(L,[[購入物,_購入物]|L1],_解析した文要素),!. 有意な要素の収集(_,解析した文要素,_解析した文要素) :- !. /* 解析上鍵となる言葉([休日,年,月,日,円,朝食,夕食,昼食,本,は,が,の,に,で,ために,へ,を,買]). 形態素解析(文,'休日の2009年12月11日に朝食で食パンを350円買い',X). */ % *** user: '全角文字列整数変換' / 4 *** '全角文字列整数変換'(E,E,_全角文字列,_整数) :- '副文字列'(_全角文字列,E,1,_全角文字), '全角文字整数変換'(_全角文字,_整数),!. '全角文字列整数変換'(N,E,_全角文字列,_整数) :- '副文字列'(_全角文字列,N,1,_全角文字), '全角文字整数変換'(_全角文字,_整数の一), F is E - N, _整数の二 'は' trunc(10 ^ F * _整数の一), M is N + 1, '全角文字列整数変換'(M,E,_全角文字列,_整数の三), _整数 'は' _整数の三 + _整数の二,!. % *** user: '全角文字列整数変換' / 2 *** '全角文字列整数変換'(_全角文字列,_整数) :- '文字列長'(_全角文字列,_文字列長), '全角文字列整数変換'(1,_文字列長,_全角文字列,_整数),!. % *** user: '全角文字整数変換' / 2 *** '全角文字整数変換'('0',0) :- !. '全角文字整数変換'('1',1) :- !. '全角文字整数変換'('2',2) :- !. '全角文字整数変換'('3',3) :- !. '全角文字整数変換'('4',4) :- !. '全角文字整数変換'('5',5) :- !. '全角文字整数変換'('6',6) :- !. '全角文字整数変換'('7',7) :- !. '全角文字整数変換'('8',8) :- !. '全角文字整数変換'('9',9) :- !. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/602 # # 【 課題 】複数人の名前を入力してから3教科の点数を全員分入力し、各教科の平均点と、最高点と取った人の名前を表示せよ。 % 教科名が存在しないということは得点は列挙する他ない。 複数人の名前を入力してから3教科の点数を全員分入力し、各教科の平均点と、最高点と取った人の名前を表示する :- 複数人の名前を入力(_名前ならび), '3教科の点数を全員分入力する'(_名前ならび,_全員分の名前・3教科の得点ならび), 各教科の平均点と、最高点と取った人の名前を表示(_名前・教科の得点ならび,_各教科の平均点ならび,_最高点を取った名前ならび), for(1,N,3), list_nth(N,_各教科の平均点ならび,_平均点), list_nth(N,_最高点を取った名前ならび,[_,_最高点得点者ならび]), concat_atom(_最高得点者ならび,',',S), write_formatted('教科%tの平均点は%t点、最高得点者は%tです。\n',[_平均点,S]), N = 3. 複数人の名前を入力(_名前ならび) :- findall(_名前,(repeat,write('名前 : '),get_line(_名前),(_名前=end_of_file,!,fail;true)),_名前ならび). '3教科の点数を全員分入力する'(_名前ならび,_全員分の名前・3教科の得点ならび) :- findall(_名前・3教科の得点ならび,(repeat,write('名前と3教科の得点を,区切りで入力してください : '),get_split_line([' ',','],_名前・3教科の得点ならび),( 各教科の平均点と、最高点と取った人の名前を表示(_名前・教科の得点ならび,_各教科の平均点ならび,_最高点を取った名前ならび) :- 各教科の平均点(_名前・各教科の得点ならび,[_教科1_平均点,_教科2_平均点,_教科3_平均点]), 各教科の最高点を取った人の名前(1,_名前・教科の得点ならび,L). 各教科の平均点(M,N,_名前・各教科の得点ならび,[]) :- M > N,!. 各教科の平均点(M,N,_名前・各教科の得点ならび,[[M,_平均点]|R]) :- findavg(U,member(L,_名前・各教科の得点ならび),list_nth(N,L,U)),_平均点), M2 is M + 1, 各教科の平均点(M2,N,_名前・各教科の得点ならび,R). 各教科の最高点を取った人の名前(M,N,_,[]) :- !. 各教科の最高点を取った人の名前(M,N,L,[[M,_名前ならび]|R]) :- !. 各教科の最高点を取った人の名前(M,L,_名前ならび1,_名前ならび,_最高点1,_最高点), M2 is M + 1, 各教科の最高点を取った人の名前(M2,N,L,R). 各教科の最高点を取った人の名前(N,[],_名前ならび,_名前ならび,_最高点,_最高点) :- !. 各教科の最高点を取った人の名前(N,[[_名前|_教科得点ならび]|R],_名前ならび1,_名前ならび,_最高点1,_最高点2) :- list_nth(N,_教科得点ならび,_得点), 得点 > _最高点1, 各教科の最高点を取った人の名前(N,R,[[N,_名前]],_名前ならび,_得点,_最高点2),!. 各教科の最高点を取った人の名前(N,[[_名前|_教科得点ならび]|R],_名前ならび1,_名前ならび,_最高点1,_最高点2) :- list_nth(N,_教科得点ならび,_得点), 得点 = _最高点1, 各教科の最高点を取った人の名前(N,R,[_名前|_名前ならび1],_名前ならび,_得点,_最高点2),!. 各教科の最高点を取った人の名前(N,[_|R],_名前ならび1,_名前ならび,_最高点1,_最高点2) :- 各教科の最高点を取った人の名前(N,R,_名前ならび1,_名前ならび,_最高点1,_最高点2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/754 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # 入力されたデータをもとに売上明細を作成して表示する。 # 入力データは商品名と金額で、最大20件とし、^zで終了する。 # 入力されたデータは構造体配列に記録し、 # 入力終了後金額を集計して合計を表示する。 # <構造体メンバ> # 商品名:char型10桁 # 金額:long型 # <実行結果> # ^z # 商品名    金額 # パソコン   248500 # ラジオ     3200 # テレビ    120500 # オーディオ  314000 # レイゾウコ   65800 # クーラー    79000 # 合計    831000 # 入力されたデータをもとに売上明細を作成して表示する :- 売上データの収集(_収集されたデータ), findsum(_金額,member([_,_金額],_収集されたデータ),_金額合計), write('商品名 金額\n'), 明細表の印刷(_収集されたデータ,_金額合計),!. 売上データの収集(_収集されたデータ) :- write('商品名と金額をカンマで区切って入力してください\n'). findall([A2,B], ( for(1,N,10),get_line(Line), ( Line=end_of_file,!,fail; split(Line,[','],[A,B]), '10桁の文字列'(A,A2))),_収集されたデータ),!. 明細表の印刷([],_金額合計) :- write_formatted('%10s %10d\n',[金額合計,_金額合計]). 明細表の印刷([[_商品名,_金額]|R],_金額合計) :- write_formatted('%10s %10d\n',[_商品名,_金額]), 明細表の印刷(R,_金額合計). '10桁の文字列'(_文字列,_10桁の文字列) :- atom_chars(_文字列,Chars), length(L,10), apend(Chars,L1,L), all(L1,' '), atom_chars(_10桁の文字列,L),!. '10桁の文字列'(_文字列,_10桁の文字列) :- sub_atom(_文字列,0,10,_,_10桁の文字列). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/688 # # [1] 授業単元: # アルゴリズムとプログラミング # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10234.txt # # リストを用いたスタックの基本操作 # # リストsを用いてスタックの基本操作を行うプログラムを実現したい。 # 図のプログラムを完成させよ。 # ただし下記の条件を守れ。 # # 1: data.datからgetc()を用いてアルファベットを一文字ずつ読み込み、 スタックsにpush-downする。 # # 2: スタックの内容を表示する関数 print_stack_list(s)は分割しているので、分割コンパイルにより # 実行ファイルを作れ。 stack(s,[]). リストsを用いてスタックの基本操作を行う :- open('data.dat',read,Instrem), get_char(Instream,C), stack(s,L1), リストsを用いてスタックの基本操作を行う(Instream,C,L1,L2), close(Instream), save_stack(s,L2). リストsを用いてスタックの基本操作を行う(Instream,end_of_file,L,L) :- !. リストsを用いてスタックの基本操作を行う(Instream,C,L1,L2) :- push(C,L1,L3), get_char(Instream,C2), リストsを用いてスタックの基本操作を行う(Instream,C2,L3,L2). push(A,L,[A|L]). save_stack(Stack,L) :- retract(stack(Stack,_)),assertz(stack(Stack,L)). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/664 # # [1] C言語 # [2] 問題文(含コード&リンク): # 問題3  # 標準入力からの入力に対して、アルファベットの文字を3文字ず # らして標準出力に出力するシーザー暗号化プログラムを作成し # て、rep09.c として提出せよ。具体的には, 小文字に対しては # a -> d, b -> e, ..., w -> z, x -> a, y -> b, z -> c なる # 変換である。もちろん大文字に関しても同様の変換処理をしな # ければならない。 # アルファベット(小文字,[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]). アルファベット(大文字,['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']). program :- rep03. rep03 :- get_char(Char), アルファベットならびの選択(Char,L),rep03(Char,L). rep03(end_of_file,_). rep03(Char,L) :- list_nth(N,L,Char), ならびの回転(左方向,3,L,L3), list_nth(N,L3,A), put_char(A), get_char(Char2), アルファベットならびの選択(Char2,L2), rep03(Char2,L2). アルファベットならびの選択(Char,L) :- Char @>= a,Char @=< z,アルファベット(小文字,L). アルファベットならびの選択(Char,L) :- Char @>= 'A',Char @=< 'Z',アルファベット(大文字,L). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/486 # # [1] 授業単元:C言語演習 # [2] 問題文: 1〜100までの数字を繰り返し入力し、最後に0を入力するとこれまでに # 入力された値の合計値を表示するプログラムを作成しなさい。ただし # 1〜100以外の数字が入力されたときは”エラー”と表示させる。 '1〜100までの数字を繰り返し入力し、最後に0を入力するとこれまでに入力された値の合計値を表示する'(_合計値) :- findsum(X,(repeat,get_integer(X),(X=0,!,fail;範囲範囲チェック(X)),_合計値), write_formatted('合計は%t\n',[_合計値]). 整数範囲チェック(X):- X > 0,X =< 100. 整数範囲チェック(X):- \+((X >0,X =<100)),write('整数範囲エラー\n'),fail. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % *** user: findsum / 3 *** findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), 加算(_値ならび,_合計値),!. % *** user: 加算 / 2 *** 加算([],0) :- !. 加算(X,S) :- 加算_1(X,0,S) . % *** user: 加算_1 / 3 *** 加算_1([],S,S) :- !. 加算_1([A|R],Y,S) :- Z is A + Y, 加算_1(R,Z,S). % *** user: get_integer / 1 *** get_integer(N) :- get_line(Line), ( Line = end_of_file, !, fail ; atom_to_term(Line,N,_), integer(N) ), ! . get_integer(N) :- get_integer(N) . % *** user: get_line / 1 *** get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). % *** user: get_line_1 / 2 *** get_line_1('\n',[]) :- !. get_line_1(end_of_file,[]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R) . % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/456 # # [1] 授業単元: C++ # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10195.txt # # 今回はナップサック問題について考えプログラムを作成する。N個の荷物があって、個々の荷物の重さをWi、値段をPiとする。但しiは1からNの整数を意味する。 # 袋には最大Wの重さまで入れられるとすると、最大でいくら分を入れることができるか?という問題。 # データファイルは、始めの一行に荷物の個数Nが書かれており、次に重さが整数でN行分書かれている。その次の行からN行分、それぞれの荷物の価値が書かれているとする。 # 下のデータファイルの場合は、3個の荷物があり、重みは10、20、13、で # それぞれの値段は23、23、10という状況を表す。 # ------------------- # 3 # 10 # 20 # 13 # 23 # 23 # 10 # ------------------- # 荷物の重みと値段はともに、1から100までの乱数で与えることとする。 # void_write_data_file(char*file,intN)という関数を呼ぶとN個分のデータを乱数で生成し、文字列変数fileに入っている # ファイル名のファイルを開き、そこにデータを記録する。void_read_data_file(char*file)という関数を呼ぶと、文字列変数fileによって名前が指定されたファイルを開き、大域変数の荷物の重み配列W[]と値段配列[]\\\\\にデータを入力する。 ナップサック問題(_ファイル名,N,_許容最大重量,_詰めることのできる最高合計金額) :-   データファイルの読み出し(_ファイル名,N,_価格ならび,_重さならび),   findall(M,for(1,M,N),_1からNまで),   findmax(_合計価格,詰め物の作成(N,_1からNまで,_許容最大重量,_重さならび,_価格ならび,_合計価格),_詰めることのできる最高合計金額). データファイルの読み出し(_ファイル名,N,_重さならび,_価格ならび) :-   see(_ファイル名),get_integer(N),get_integers(L1),seen,   length(L2,N),length(L3,N),   append(_重さならび,_価格ならび,L1),!. 詰め物の作成(N,_1からNまで,_許容最大重量,_重さならび,_価格ならび,_合計価格) :-   for(1,M,N),   組合せ(_1からNまで,M,L),   findsum(Wi,(member(A,L),list_nth(A,_重さならび,Wi)),_合計重量),   _合計重量 =< _許容最大重量,   findsum(Pi,(member(A,L),list_nth(A,_価格ならび,Pi)),_合計金額). get_integers(L) :-   findall(I,(get_line(Line),(Line=end_of_file,!,fail;atom_to_term(Line,I,_))),L),!. % 以下のサイトは # 出典:: 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([Name,Eigo,Kokugo],(repeat,get_line(Line),(Line=end_of_file,!,fail;split(Line,[','],[Name,Eigo,Kokugo]))),L). % こういうのもあるにはある。三項の入力が保証されるようなケースでは使える。 meibo(L) :- get_split_lines(user_input,[','],L). % 以下のサイトは # 出典:: 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). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/657 # # [1] 授業単元: C言語のポインタ、配列、ファイルの問題です # [2] 問題文(含コード&リンク): # n件のデータを配列に入力しその平均値を出力するプログラムをつくり、 # 実行部において添字演算子は用いず、*(p+i)と*p++それぞれを用いるパターンを作る # ただし、入出力処理をファイル処理に、入出力ファイル名はコマンドラインで指定する 'n件のデータを配列に入力しその平均値を出力する'(N) :- user_parameters([_入力ファイル,_出力ファイル]), open(_入力ファイル,read,Input), findavg(K,(for(1,M,N),get_line(Input,Line),(Line=end_of_file,!,fail;atom_to_term(Line,K,_))),Avg), close(Input), open(_出力ファイル,write,Output), write_formatted(Output,'平均値は %t\n',[Avg]), /* この行訂正 */ close(Output),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/490 # # [1] プログラミング # [2] double型の引数を2つ持ち、2つの引数の積の絶対値を返す、 # double型の戻値を持つ関数 absmul() を作成した上で、動作の # 確認の出来るプログラムとして作成せよ。という問題と # # 標準入力からの入力に対して、アルファベットを全て空白文字 # に変更して出力するプログラムを作成せよ % absmul(_浮動小数点数_1,_浮動小数点数_2,_答え) :- Y is _浮動小数点数_1 * _浮動小数点数_2, 絶対値(Y,_答え). 絶対値(X,X) :- X >= 0.0. 絶対値(Y,X) :- Y < 0.0,X is -1 * Y. test_absmul :- 二つの浮動小数点数を得ます(_浮動小数点数_1,_浮動小数点数_2), write('(1)と(2)の積の絶対値としてあなたが考える答えも入れてください : '), get_float(_浮動小数点数_3), absmul(_浮動小数点数_1,_浮動小数点数_2,_答え), test_absmul_診断(_答え,_浮動小数点数_3,_診断), write_formatted('absmulを使った計算では解は%t あなたの答えは%tでした\n',[_ 浮動小数点数_3,_答え]), write_formatted('ふたつは%t!!\n',[_診断]). 二つの浮動小数点数を得ます(_浮動小数点数_1,_浮動小数点数_2) :- write('浮動小数点数(1) を入れてください : '), get_float(_浮動小数点数_1), write('浮動小数点数(2) を入れてください : '), get_float(_浮動小数点数_2). test_absmul_診断(F,F,一致しています). test_absmul_診断(F1,F2,二値は一致しません) :- \+(F1=F2). %% アルファベット(尾崎). アルファベット(u). 標準入力からの入力に対して、アルファベットを全て空白文字に変更してを出力する :- 'stty raw', get_char(A), アルファベットを全て空白文字に変更してを出力する(A,''), 'stty -raw'. アルファベットを全て空白文字に変更してを出力する(end_of_file,B) :- アルファベットとして存在する(B), write(' '),!. アルファベットを全て空白文字に変更してを出力する(end_of_file,B) :- \+(アルファベットとして存在する(A)),!. アルファベットを全て空白文字に変更してを出力する(A,B) :- アルファベットとして存在する(B), write(' '), アルファベットを全て空白文字に変更してを出力する(A,''),!. アルファベットを全て空白文字に変更してを出力する(A,B) :- アルファベットとして存在する(A), write(' '), get_char(C), アルファベットを全て空白文字に変更してを出力する(C,''),!. アルファベットを全て空白文字に変更してを出力する(A,B) :- atom_concat(A,B,C), get_char(D), アルファベットを全て空白文字に変更してを出力する(D,C). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/510 # # [1] プログラミング入門 # [2] 文字列sを逆に並べる関数reverse(s) を書け。 # さらにこの関数を使って、入力を行ごとに反転させるプログラムを作成せよ。という問題です。 'reverse(s)'(S,_反転されたS) :- atom_chars(S,S1), 反転(S1,S2), atom_chars(S2,_反転されたS). 反転([],[]). 反転([A|R1],R) :- 反転(R,R2), append(R2,[A],R). 入力を行ごとに反転させる(_反転された入力行のならび) :- get_line(_行), 入力を行ごとに反転させる(_行,_反転された入力行のならび). 入力を行ごとに反転させる(end_of_file,[]) :- !. 入力を行ごとに反転させる(_行,[_反転された行|R]) :- 'reverse(s)'(_行,_反転された行), get_line(_次の行), 入力を行ごとに反転させる(_次の行,R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/490 # # [1] プログラミング # [2] double型の引数を2つ持ち、2つの引数の積の絶対値を返す、 # double型の戻値を持つ関数 absmul() を作成した上で、動作の # 確認の出来るプログラムとして作成せよ。という問題と # # 標準入力からの入力に対して、アルファベットを全て空白文字 # に変更して出力するプログラムを作成せよ % absmul(_浮動小数点数_1,_浮動小数点数_2,_答え) :- Y is _浮動小数点数_1 * _浮動小数点数_2, 絶対値(Y,_答え). 絶対値(X,X) :- X >= 0.0. 絶対値(Y,X) :- Y < 0.0,X is -1 * Y. test_absmul :- 二つの浮動小数点数を得ます(_浮動小数点数_1,_浮動小数点数_2), write('(1)と(2)の積の絶対値としてあなたが考える答えも入れてください : '), get_float(_浮動小数点数_3), absmul(_浮動小数点数_1,_浮動小数点数_2,_答え), test_absmul_診断(_答え,_浮動小数点数_3,_診断), write_formatted('absmulを使った計算では解は%t あなたの答えは%tでした\n',[_ 浮動小数点数_3,_答え]), write_formatted('ふたつは%t!!\n',[_診断]). 二つの浮動小数点数を得ます(_浮動小数点数_1,_浮動小数点数_2) :- write('浮動小数点数(1) を入れてください : '), get_float(_浮動小数点数_1), write('浮動小数点数(2) を入れてください : '), get_float(_浮動小数点数_2). test_absmul_診断(F,F,一致しています). test_absmul_診断(F1,F2,二値は一致しません) :- \+(F1=F2). %% アルファベット(尾崎). アルファベット(u). 標準入力からの入力に対して、アルファベットを全て空白文字に変更してを出力する :- 'stty raw', get_char(A), アルファベットを全て空白文字に変更してを出力する(A,''), 'stty -raw'. アルファベットを全て空白文字に変更してを出力する(end_of_file,B) :- アルファベットとして存在する(B), write(' '),!. アルファベットを全て空白文字に変更してを出力する(end_of_file,B) :- \+(アルファベットとして存在する(A)),!. アルファベットを全て空白文字に変更してを出力する(A,B) :- アルファベットとして存在する(B), write(' '), アルファベットを全て空白文字に変更してを出力する(A,''),!. アルファベットを全て空白文字に変更してを出力する(A,B) :- アルファベットとして存在する(A), write(' '), get_char(C), アルファベットを全て空白文字に変更してを出力する(C,''),!. アルファベットを全て空白文字に変更してを出力する(A,B) :- atom_concat(A,B,C), get_char(D), アルファベットを全て空白文字に変更してを出力する(D,C). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/490 # # [1] プログラミング # [2] double型の引数を2つ持ち、2つの引数の積の絶対値を返す、 # double型の戻値を持つ関数 absmul() を作成した上で、動作の # 確認の出来るプログラムとして作成せよ。という問題と # # 標準入力からの入力に対して、アルファベットを全て空白文字 # に変更して出力するプログラムを作成せよ % absmul(_浮動小数点数_1,_浮動小数点数_2,_答え) :- Y is _浮動小数点数_1 * _浮動小数点数_2, 絶対値(Y,_答え). 絶対値(X,X) :- X >= 0.0. 絶対値(Y,X) :- Y < 0.0,X is -1 * Y. test_absmul :- 二つの浮動小数点数を得ます(_浮動小数点数_1,_浮動小数点数_2), write('(1)と(2)の積の絶対値としてあなたが考える答えも入れてください : '), get_float(_浮動小数点数_3), absmul(_浮動小数点数_1,_浮動小数点数_2,_答え), test_absmul_診断(_答え,_浮動小数点数_3,_診断), write_formatted('absmulを使った計算では解は%t あなたの答えは%tでした\n',[_ 浮動小数点数_3,_答え]), write_formatted('ふたつは%t!!\n',[_診断]). 二つの浮動小数点数を得ます(_浮動小数点数_1,_浮動小数点数_2) :- write('浮動小数点数(1) を入れてください : '), get_float(_浮動小数点数_1), write('浮動小数点数(2) を入れてください : '), get_float(_浮動小数点数_2). test_absmul_診断(F,F,一致しています). test_absmul_診断(F1,F2,二値は一致しません) :- \+(F1=F2). %% アルファベット(尾崎). アルファベット(u). 標準入力からの入力に対して、アルファベットを全て空白文字に変更してを出力する :- 'stty raw', get_char(A), アルファベットを全て空白文字に変更してを出力する(A,''), 'stty -raw'. アルファベットを全て空白文字に変更してを出力する(end_of_file,B) :- アルファベットとして存在する(B), write(' '),!. アルファベットを全て空白文字に変更してを出力する(end_of_file,B) :- \+(アルファベットとして存在する(A)),!. アルファベットを全て空白文字に変更してを出力する(A,B) :- アルファベットとして存在する(B), write(' '), アルファベットを全て空白文字に変更してを出力する(A,''),!. アルファベットを全て空白文字に変更してを出力する(A,B) :- アルファベットとして存在する(A), write(' '), get_char(C), アルファベットを全て空白文字に変更してを出力する(C,''),!. アルファベットを全て空白文字に変更してを出力する(A,B) :- atom_concat(A,B,C), get_char(D), アルファベットを全て空白文字に変更してを出力する(D,C). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/510 # # [1] プログラミング入門 # [2] 文字列sを逆に並べる関数reverse(s) を書け。 # さらにこの関数を使って、入力を行ごとに反転させるプログラムを作成せよ。という問題です。 'reverse(s)'(S,_反転されたS) :- atom_chars(S,S1), 反転(S1,S2), atom_chars(S2,_反転されたS). 反転([],[]). 反転([A|R1],R) :- 反転(R,R2), append(R2,[A],R). 入力を行ごとに反転させる(_反転された入力行のならび) :- get_line(_行), 入力を行ごとに反転させる(_行,_反転された入力行のならび). 入力を行ごとに反転させる(end_of_file,[]) :- !. 入力を行ごとに反転させる(_行,[_反転された行|R]) :- 'reverse(s)'(_行,_反転された行), get_line(_次の行), 入力を行ごとに反転させる(_次の行,R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/510 # # [1] プログラミング入門 # [2] 文字列sを逆に並べる関数reverse(s) を書け。 # さらにこの関数を使って、入力を行ごとに反転させるプログラムを作成せよ。という問題です。 'reverse(s)'(S,_反転されたS) :- atom_chars(S,S1), 反転(S1,S2), atom_chars(S2,_反転されたS). 反転([],[]). 反転([A|R1],R) :- 反転(R,R2), append(R2,[A],R). 入力を行ごとに反転させる(_反転された入力行のならび) :- get_line(_行), 入力を行ごとに反転させる(_行,_反転された入力行のならび). 入力を行ごとに反転させる(end_of_file,[]) :- !. 入力を行ごとに反転させる(_行,[_反転された行|R]) :- 'reverse(s)'(_行,_反転された行), get_line(_次の行), 入力を行ごとに反転させる(_次の行,R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/490 # # [1] プログラミング # [2] double型の引数を2つ持ち、2つの引数の積の絶対値を返す、 # double型の戻値を持つ関数 absmul() を作成した上で、動作の # 確認の出来るプログラムとして作成せよ。という問題と # # 標準入力からの入力に対して、アルファベットを全て空白文字 # に変更して出力するプログラムを作成せよ % absmul(_浮動小数点数_1,_浮動小数点数_2,_答え) :- Y is _浮動小数点数_1 * _浮動小数点数_2, 絶対値(Y,_答え). 絶対値(X,X) :- X >= 0.0. 絶対値(Y,X) :- Y < 0.0,X is -1 * Y. test_absmul :- 二つの浮動小数点数を得ます(_浮動小数点数_1,_浮動小数点数_2), write('(1)と(2)の積の絶対値としてあなたが考える答えも入れてください : '), get_float(_浮動小数点数_3), absmul(_浮動小数点数_1,_浮動小数点数_2,_答え), test_absmul_診断(_答え,_浮動小数点数_3,_診断), write_formatted('absmulを使った計算では解は%t あなたの答えは%tでした\n',[_ 浮動小数点数_3,_答え]), write_formatted('ふたつは%t!!\n',[_診断]). 二つの浮動小数点数を得ます(_浮動小数点数_1,_浮動小数点数_2) :- write('浮動小数点数(1) を入れてください : '), get_float(_浮動小数点数_1), write('浮動小数点数(2) を入れてください : '), get_float(_浮動小数点数_2). test_absmul_診断(F,F,一致しています). test_absmul_診断(F1,F2,二値は一致しません) :- \+(F1=F2). %% アルファベット(尾崎). アルファベット(u). 標準入力からの入力に対して、アルファベットを全て空白文字に変更してを出力する :- 'stty raw', get_char(A), アルファベットを全て空白文字に変更してを出力する(A,''), 'stty -raw'. アルファベットを全て空白文字に変更してを出力する(end_of_file,B) :- アルファベットとして存在する(B), write(' '),!. アルファベットを全て空白文字に変更してを出力する(end_of_file,B) :- \+(アルファベットとして存在する(A)),!. アルファベットを全て空白文字に変更してを出力する(A,B) :- アルファベットとして存在する(B), write(' '), アルファベットを全て空白文字に変更してを出力する(A,''),!. アルファベットを全て空白文字に変更してを出力する(A,B) :- アルファベットとして存在する(A), write(' '), get_char(C), アルファベットを全て空白文字に変更してを出力する(C,''),!. アルファベットを全て空白文字に変更してを出力する(A,B) :- atom_concat(A,B,C), get_char(D), アルファベットを全て空白文字に変更してを出力する(D,C). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/444 # 【課題】課題は3つあります。 # http://www.dotup.org/uploda/www.dotup.org318192.zip % 問題1 星ピラミットの表示 入力された段数になるように星文字でピラミッドを築く :- 入力された段数に(_入力された段数), なるように星文字でピラミッドを築く(_入力された段数). なるように星文字でピラミッドを築く(_入力された段数) :- _最終行の星数 is (_入力された段数 - 1) * 2 + 1, length(L,_最終行の星数), between(1,_入力された段数,N), 星文字でピラミッドを築く(N), N = _入力された段数. 入力された段数に(_入力された段数) :- write('段数を入れてください : '), get_integer(_段数). 星文字でピラミッドを築く(N) :- length(L1,N), all(L1,'*'), append(L0,L1,L0,L), all(L0,' '), atom_chars(Atom,L), writef(' %t \n',[Atom]). 乱数を使って発生させた2つの整数のたし算を5問示しそれぞれの回答診断と5問答えるのに要した時間を表示 :- _開始時刻 is time, for(1,N,5), 一問答える, N = 5, _終了時刻 is time, _回答するのに要した時間 is _終了時刻 - _開始時刻, writef('5問回答までの時間は%t秒でした。\n',[_回答するのに要した時間]). 一問答える :- A is random(100), B is random(100), writef('%t + %t =? ',[A,B]),get_integer(_答え), _正解 is A + B, 回答診断(_正解,_答え,_診断), writef('%t\n',[_診断]). 回答診断(_正解,_正解,'正解です!!'). 回答診断(_正解,_答え,_診断) :- 1 is abs(_正解 - _答え), concat_atom(['惜しいです。正解は',_正解],_診断). 回答診断(_正解,_答え,_診断) :- \+(_答え=_正解), \+(1 is abs(_正解 - _答え)), concat_atom(['間違いです。正解は',_正解],_診断). 'ファイル名を入力させてそのファイルの行数その中に現れる小文字、大文字、その他の文字数を表示する' :- 'ファイル名を入力させて'(_ファイル名), get_chars(_ファイル名,Chars). '行数、小文字数、大文字数、その他文字数の集計'(Chars,_行数,_小文字数,_大文字数,_その他文字数), そのファイルの行数その中に現れる小文字、大文字、その他の文字数を表示する'(_行数,_小文字数,_大文字数,_その他文字数). 'ファイル名を入力させて'(_ファイル名) :- write('ファイル名を入力してください\n'), get_line(_ファイル名). そのファイルの行数その中に現れる小文字、大文字、その他の文字数を表示する'(_行数,_小文字数,_大文字数,_その他文字数) :- writef('%t行ありました\n',[_行数]), writef('小文字の数は%t\n',[_小文字数]), writef('大文字の数は%t\n',[_大文字数]), writef('その他の数は%t\n',[_その他文字数]). '行数、小文字数、大文字数、その他文字数の集計'([],0,0,0,0). '行数、小文字数、大文字数、その他文字数の集計'(['\n'|R],S1,S2,S3,S4) :- 行数の加算(R,S1,S2,S3,S4). '行数、小文字数、大文字数、その他文字数の集計'([A|R],S1,S2,S3,S4) :- 小文字数の加算([A|R],S1,S2,S3,S4,S11,S12,S13,S14). '行数、小文字数、大文字数、その他文字数の集計'([A|R],S1,S2,S3,S4) :- 大文字数の加算([A|R],S1,S2,S3,S4,S11,S12,S13,S14). '行数、小文字数、大文字数、その他文字数の集計'([_|R],S1,S2,S3,S4) :- その他文字数の加算(R,S1,S2,S3,S4). 行数の加算(R,S1,S2,S3,S4) :- '行数、小文字数、大文字数、その他文字数の集計'(R,S11,S2,S3,S4), S1 is S11 + 1,!. 小文字数の加算([A|R],S1,S2,S3,S4) :- A @>= 'a',A @=< 'z', '行数、小文字数、大文字数、その他文字数の集計'(R,S1,S21,S3,S4), S2 is S21 + 1,!. 大文字数の加算([A|R],S1,S2,S3,S4) :- A @>= 'A',A @=< 'Z', '行数、小文字数、大文字数、その他文字数の集計'(R,S1,S2,S31,S4), S3 is S31 + 1,!. その他文字数の加算(R,S1,S2,S3,S4) :- '行数、小文字数、大文字数、その他文字数の集計'(R,S1,S2,S3,S41), S4 is S41 + 1,!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_integer(N) :- repeat, get_line(Line), atom_to_term(Line,M,_), get_integer_診断(M,N),!. get_integer_診断(end_of_file,-1). get_integer_診断(N,N) :- integer(N). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). % 以下のサイトは :- 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/1248012902/231 # # 【 形態 】Javaアプリケーション(main()で開始) # 【 課題 】以下のようなサーバプログラムCountServer.javaとクライアントプログラム # CountClient.javaを作成してください。 # # [条件] # ・サーバは、クライアントから文字列を受信し、その文字数をカウントして #  結果をクライアントに返す。 # ・クライアントプログラムを実行時に、コマンドラインから、サーバホスト名 #  java CountClient サーバホスト名 "文字列" # ・クライアントは、サーバからの結果を受け取り、画面に表示する。 # ・サーバは、ポート番号 4321 で接続要求を受け付けるようにする。 # # サーバプログラムの実行 # >java CountServer # # クライアントプログラムの実行と実行結果 # >java CountClient host1 "Java Programming" # 16   server(Port) :- socket(internet,stream,Socket), socket_bind(Socket,Port), repeat, socket_listen(Socket), socket_accept(Socket,Host : Port2,NewSocket), socket_raw_receive(NewSocket,8192,_,_受信コードならび,_実際に受信した長さ), atom_codes(_受信した文,_受信コードならび), server_1(_受信した文,NewSocket), Message = quit, socket_shutdown(Socket),!. server_1(quit,NewSocket,Input,Output) :- socket_shutdown(NewSocket),!. server_1(_受信した文,NewSocket) :- atom_codes(Message,L), atom_length(Message,Length), open(NewSocket,write,Output,[type(binary)]), write_formatted(Output,'%t\r\n',[Length]), flush_output(Output), close(Output), socket_shutdown(NewSocket), ! . client(Host,Port) :- get_line(_伝送する文), socket(internet, stream, Socket), socket_connect(Socket, Addr : Port), open(Socket,read,Input), open(Socket,write,Output), write_formatted(Output,'%t\n',[_送信する文]), flush_output(Output), get_line(Input,_受信した文), client_1(_受信した文,Host,Socket,Input,Output), close(Input), close(Output), socket_shutdown(Socket). client_1(end_of_file,Input,Output) :- !. client_1(_受信した文,Input,Output) :- write_formatted('%t\n',[_受信した文]), get_line(Input,_次の受信した文), client_1(_次の受信した文,Input,Output). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1250204272/42 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク):問題の基準に従い、 # 任意のローカルフォルダに置いた、指定したwords.txtの指定行から # 指定した行数の英単語を読み込み、 # マージソートをして表示するプログラムを作成せよ。 # 同じようにヒープソートや基数ソートのプログラムも作成せよ。 # 問題の定義はhttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9906.txt # 指定されたwords.txtは # http://nojiriko.asia/data/words.txt にコピーさせていただきました。 # 単語の綴りを逆に並べた際の(ASCIIコードに基づく)辞書順に並び替えよ。 # たとえば"a","b""aa","ab","za","aaa"をこの基準で並べると、 # "a","aa","za","aaa","b","ab"となる。 # ただし、マージソートはボトムアップ方式で実行し、連結リストを用いて # 新たに別の列を作らずに、一方の列に他方の列のノードを挿入することで実現する。 # マージソートは下に指定した構成でプログラムを書くこと。 # # /*適切なファイルをインクルード*/ # # #define WORDS_START 100000 /*開始行目*/ # #define WORDS_NUM 10 /*抽出する単語数(10,100などさまざまな値で試せ)*/ # #define WORD_LIMIT 64 /*単語の文字数の最大数*/ # 開始行(100000). 抽出する単語数(10). 単語の文字数の最大数(64). t634(_整列されたならび) :- 開始行(_開始行), 抽出する単語数(_抽出する単語数), 単語の文字数の最大数(_単語の文字数の最大数), n行目まで読み飛ばす('words.txt',_開始行,Input), 対象となる語ならびを得る(Input,_抽出する単語数,L), close(Input), 文字列の反転と文字数の調整(L,L2), 先頭から挿入して整列する(L2,[],_整列されたならび). 対象となる語ならびを得る(Input,_抽出する単語数,L) :- findall(X,(for(1,N,_抽出する単語数),get_line(Input,_,X)),L). 文字列の反転と文字数の調整(_,[],[]) :- !. 文字列の反転と文字数の調整(_単語の文字数の最大数,[_語|R1],[_反転した語|R2]) :- atomic_length(_語,Len), Len > _単語の文字数の最大数,!, atom_reverse(_語,反転した語_1), sub_atom(_反転した語_1,0,_単語の文字数の最大数,_,_反転した語), 文字列の反転と文字数の調整(_単語の文字数の最大数,R1,R2). 文字列の反転と文字数の調整(_単語の文字数の最大数,[_語|R1],[_反転した語|R2]) :- atom_reverse(_語,反転した語), 文字列の反転と文字数の調整(_単語の文字数の最大数,R1,R2). 先頭から挿入して整列する([],X,X) :- !. 先頭から挿入して整列する([A|R],Y,X) :- 整列するように挿入する(A,Y,Z), 先頭から挿入して整列する(R,Z,X). 整列するように挿入する(A,[],[A]) :- !. 整列するように挿入する(A,[B|R],[A,B|R]) :- A @=< B,!. 整列するように挿入する(A,[B|R1],[B|R2]) :- A @> B, 整列するように挿入する(A,R1,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % *** user: 'n行目まで読み飛ばす' / 3 *** 'n行目まで読み飛ばす'(File,1,Input) :- open(File,read,Input),!. 'n行目まで読み飛ばす'(File,N,Input) :- open(File,read,Input), N2 is N - 1, for(1,M,N2), get_line(Input,_診断,_), ( _診断 = '終了', close(Input), !, fail ; true ), M = N2,!. % *** user: get_line / 3 *** get_line(Instream,_診断,X) :- get_char(Instream,C), get_line_3(Instream,_診断,C,Chars), atom_chars(X,Chars),!. % *** user: get_line_3 / 4 *** get_line_3(_,'連続','\n',[]) :- !. get_line_3(Instream,_診断,'\r',X) :- get_char(Instream,C2), get_line_3_2(Instream,_診断,C2,X),!. get_line_3(Instream,'終了',end_of_file,[]) :- !. get_line_3(Instream,_診断,C,[C|R]) :- get_char(Instream,C2), get_line_3(Instream,_診断,C2,R). % *** user: get_line_3_2 / 4 *** get_line_3_2(Instream,'連続','\n',[]) :- !. get_line_3_2(Instream,_診断,C,['\r'|R]) :- \+(C == '\n'), get_line_3(Instream,_診断,C,R),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/704 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9863.txt # リストを用いた成績処理 # リストを用いて個人データを格納する表を作成 # 処理番号を入力して処理の切り替えを行う # 1.成績一覧表示, 2.個人成績表示, # 3.個人平均点表示,4.科目平均点表示, # 0.終了 # リストに新たにデータを追加する時は学生番号順に並ぶように追加する. # リスト構成する要素(セル)はmalloc関数でヒープ領域から確保するものとする. # # 入力する成績データ(この順番で入れる) # 学番名前英語数学化学物理 # 106 tada 65 80 90 100 # 101 kouda 50 85 70 65 # 103 hanako 70 75 65 80 # 104 akane 60 95 80 75 # 102 tarou 90 80 85 65 # 105 nara 80 70 50 95 t590 :- 初期データの入力(L), t590実行(L,_機能), _機能 = 終了(_,_). t590実行(L,_機能) :- 処理番号を入力して処理の切り替えを行う(L,_機能), call(_機能). t590実行(L,_機能) :- t590実行(L,_機能). 処理番号を入力して処理の切り替えを行う :- 処理番号選択を催促する, get_line(Line), atom_to_term(Line,_処理番号,_), 処理番号による機能選択(_処理番号,_機能). 処理番号選択を催促する :- write('1. 一覧表示\n2. 個人成績表示\n3. 個人平均点表示\n4. 科目平均点表示\n0. 終了\n'). 処理番号による機能選択(1,一覧表示). 処理番号による機能選択(2,個人成績表示). 処理番号による機能選択(3,個人平均点表示). 処理番号による機能選択(4,科目平均点表示). 処理番号による機能選択(0,終了). 終了(_,_). 一覧表示(L,_) :- member([A,B,C,D,E,F],L), write_formatted('%t,%t,%t,%t,%t,%t\n',[A,B,C,D,E,F]), fail. 一覧表示(_,_). 個人成績表示(L,[A,B,C,D,E,F]) :- write('検索したい学番を入れてください :'), get_line(Line), atom_to_term(Line,A,_), member([A,B,C,D,E,F],L), write_formatted('%t,%t,%t,%t,%t,%t\n',[A,B,C,D,E,F]),!. 個人平均点表示(L,[Avg]) :- findavg(U,(member([_,_,C,D,E,F],L),U is C+D+E+F),Avg), write_formatted('個人平均点は %tです\n',[Avg]). 科目別平均点表示(L,[AvgC,AvgD,AvgE,AvgF]) :- findavg(C,member([_,_,C,_,_,_],L),AvgC), findavg(D,member([_,_,_,D,_,_],L),AvgD), findavg(E,member([_,_,_,_,E,_],L),AvgE), findavg(F,member([_,_,_,_,_,F],L),AvgF), write_formatted('英語平均点=%t,数学=%t,化学=%t,物理=%t\n',[AvgC,AvgD,AvgE,AvgF]),!. 初期データの入力(Ls) :- write('初期データを入力してください\n'), get_line(Line), 初期データの入力(Line,[],Ls),!. 初期データの入力(end_of_file,Ls,Ls) :- !. 初期データの入力(Line,Ls1,Ls2) :- split(Line,[' '],L), insert_Ls(L,Ls1,Ls3), get_line(Line2), 初期データの入力(Line2,Ls3,Ls2). insert_Ls(L,[],[L]) :- !. insert_Ls([A|R1],[[B|R2]|R3],[[A|R1],[B|R2]|R3]]) :- A @=< B,!. insert_Ls([A|R1],[[B|R2]|R3],[[B|R2]|R3]]) :- A @> B, insert_Ls([A|R1],R3,R4). % 以下のサイトは # 出典:: 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). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/473 # # [1] 授業単元:プログラミング論 # [2] 問題文:入力ストリームから読み込んだデータ文字列を、 # データベースに格納する前にキューに一時的に格納するプログラムを # 作成する。このとき、データをまとめたデータ文字列を一つずつ、キューへ # エンキューしたり、デキューしたりする過程が分かるプログラムを作成する。 # なお、キューを実現するライブラリは、キューのための別のヘッダにまとめる。 # [そのほか] # ・入力ストリームから読み込んだデータ文字列を、キューにエンキューしたり、 # デキューしたりするたびにデータベースに格納された全データを表示する。 # ・構造体オブジェクトは動的な記憶域に生成する。 # ・生徒の名前、試験の点数を構造体オブジェクトに格納することとする。 # ・関数の処理にコメントをつけて、キューをどのように実現しているか、 # そのプログラムの処理内容が分かるようにする。 # [このプログラムの流れ] # (1)ファイルやキーボードなどの入力ストリームから # データをデータ文字列として読み込む # (2)このデータ文字列をキューに一時的に蓄える # (3)キューからデータ文字列を取り出す # (4)このデータ文字列からそれぞれデータを取り出して # 文字列や数値データに変換する # (5)変換したデータをデータベース(構造体の配列など)に # 格納してまとめて管理する # (6)このデータベースからデータを参照し、ディスプレイに出力する % 作られたキューは引数として持ち回る t561(Instrem,Q2) :- 新しいキューを作る(Q1), get_char(Instream,Char), t561_2(Instream,Char,_文字列,_終了文字), t561_1(Instream,文字列,_終了文字,Q1,Q2), listing(データベース). t561_1(Instream,_,end_of_file,Q,Q) :- !. t561_1(Instream,_文字列,'\n',Q1,Q2) :- キューに要素を追加する(_文字列,Q1,Q3), キューが空になるまで連続して取り出す(L,Q3,Q2), P =.. [データベース|L], assertz(P), listing(データベース),!. t561_1(Instream,_文字列,_区切り文字,Q1,Q2) :- member(_区切り文字,[' ',',']), キューに要素を追加する(_文字列,Q1,Q3), get_char(Instream,Char), t561_2(Instream,_文字列2,_終了文字), t561_1(Instream,_文字列2,_終了文字,Q3,Q2),!. t561_1(Instream,_文字列,_終了文字,Q1,Q2) :- get_char(Instream,Char), t561_2(Instream,Char,_文字列2,_終了文字2), t561_1(Instream,_文字列2,_終了文字2,Q1,Q2). t561_2(Instream,'\n','\n',[]) :- !. t561_2(Instream,' ',' ',[]) :- t561_2(Instream,',',',',[]) :- !. t561_2(Instream,C,_終了文字,[C|R]) :- get_char(Instream,C2), t561_2(Instream,C2,_終了文字,R). 新しいキューを作る(X-X). キューは空である(X-Y) :- X == Y. キューに要素を追加する(_要素,X-[_要素|Y],X-Y). キューから要素を取り出す(_要素,[_要素|X]-Y,X-Y). キューに名前を付けて保存する(_キュー保存名,_キュー) :- retract(名前を付けて保存されたキュー(_キュー保存名,_)), assertz(名前を付けて保存されたキュー(_キュー保存名,_キュー)),!. キューに名前を付けて保存する(_キュー保存名,_キュー) :- assertz(名前を付けて保存されたキュー(_キュー保存名,_キュー)),!. 要素を連続してキューに追加する([],_追加されたキュー,_追加されたキュー) :- !. 要素を連続してキューに追加する([_要素|R],_キュー_1,_追加されたキュー) :- キューに要素を追加する(_要素,_キュー_1,_キュー_2), 要素を連続してキューに追加する(R,_キュー_2,_追加されたキュー) :- キューが空になるまで連続して取り出す([],_キュー,_キュー) :- キューは空である(_キュー),!. キューが空になるまで連続して取り出す([_要素|R],_キュー_1,_取り出されたキュー) :- キューから要素を取り出す(_要素,_キュー_1,_キュー_2), キューが空になるまで連続して取り出す(R,_キュー_2,_取り出されたキュー). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/457 # # [1] 授業単元 C++ # # [2] 問題文(含コード&リンク) # テキストファイルの中のタブコードをそれぞれ、空白N個に置き換えて、 # 新たなファイルに書き出しなさい。ただし、N≧0とする。 # コマンドパラメーター:入力ファイル名、出力ファイル名、N # # <解答例> # Hello( )Bye←入力ファイル # N=3の場合 # Hello( )Bye←出力ファイル t554(_入力ファイル,_出力ファイル,_空白文字数) :- length(L,_空白文字数), all(L,' '), get_chars(_入力ファイル,Chars), replace_chars(Chars,['\t'],L,Chars2), put_chars(_出力ファイル,Chars2). replace_chars([],_,_,[]) :- !. replace_chars(L1,L2,L3,L4) :- append(L2,R1,L1), replace_chars(R1,L2,L3,L5), append(L3,L5,L4),!. replace_chars([A|R1],L2,L3,[A|R4]) :- replace_chars(R1,L2,L3,R4). get_chars(File,L) :- open(File,read,Input), get_char(Input,X), get_chars(Input,X,L), close(Input),!. get_chars(Input,end_of_file,[]) :- !. get_chars(Input,X,[X|R]) :- get_char(Input,Y), get_chars(Input,Y,R) . put_chars(F,L) :- open(F,write,Output), stream_put_chars(Output,L), close(Output),!. stream_put_chars(_,[]) :- !. stream_put_chars(Stream,[Char|R]) :- put_char(Stream,Char), stream_put_chars(Stream,R),!. all([],_). all([V|R],V) :- all(R,V). % 以下のサイトは % 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/1247438792/256 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # ファイルの1行目に2行目以降の各行に含まれる文字列の数が記述され, # 2行目以降はその数の不定長文字列が空白で区切られているような入力 # ファイルを読み込み,各行を以下に示す構造体の単方向連結リストに # 保存するプログラムを作成せよ.ここでは,attributes が1行分のデータ # を保持する. # struct t_list { # char **attributes; # struct t_list *next; # }; # またにはソースファイルには,生成した単方向連結リストの内容を # 標準出力に出力する関数 print_tlist を含むものとしprint_tlist により各行 # に含まれる文字列を出力するものとする.動作確認には,以下のテキストを用いよ. # なお,入力ファイル名はコマンドライン # 引数で指定するものとし,入力ファイルがオープンできなかった場合の処理も # 含めること.また,プログラム自身を除く引数の数が0個, # もしくは2個以上の場合は,何もせず適切なメッセージを出力して終了するものとする # 入力ファイル:http://www.uploda.tv/v/uptv0033032.txt program :- ユーザパラメータの取得(_ファイル名), get_line(Line), atom_to_term(Line,_文字列項目数,_), get_line(Line2), t527(Line2,X), exception_handler(open(_ファイル名,write,Output),error(E,I),open_error(_ファイル名,I)), print_tlist(Output,X), close(Output). program. ユーザパラメータの取得(_ファイル名) :- user_parameters([_ファイル名]),!. ユーザパラメータの取得(_) :- error_tell(Output), write(Output,'パラメータで適切なファイル名が与えられませんでした\n'), errot_told(Output). t527(end_of_file,[]) :- !. t527(Line,[L|R]) :- split(Line,[' '],L), get_line(Line2), t527(Line2,R). open_error(_ファイル名,Info) :- error_tell(Output), write(Output,'出力ファイル%tのオープンに失敗 :: %t\n',[_ファイル名,Info]), error_told(Output), fail. print_tlist(Output,[]) :- !. print_tlist(Output,[A|R]) :- write_formatted(Output,'%t\n',[A]), print_tlist(Output,R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/291 # # [1] 授業単元:コンピュータリテラシー # [2] 問題文(含コード&リンク):問題文と参考は以下です #   http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9806.txt # ・試験の過程を記録 # 1,番号、得点を入力したあと平均点を計算 # 2,番号順と得点順に並べ替え(ifを使いどちらか選択できるようにする) # 3,番号、得点、平均との差を出力 # 以上のプログラムを作成 成績を記録する :- write('番号と得点をスペースで区切って一行で入力してください\n'), get_line(_行), 成績を記録する(_行). 成績を記録する(end_of_file) :- !. 成績を記録する(_行) :- split(_行,[' '],[_番号,_得点]), assertz(成績(_番号,_得点)), get_line(_次の行), 成績を記録する(_次の行). 平均点(_平均点) :- findavg(_得点,成績(_,_得点),_平均点). 番号順に並べ直し(_番号順成績ならび) :- findall([_番号,_得点],成績(_番号,_得点),_成績ならび), quicksort(_成績ならび,_番号順成績ならび). 得点順に並べ直し(_得点順成績ならび) :- findall([_得点,番号],成績(_番号,_得点),_得点・番号成績ならび), quicksort(_得点・番号成績ならび,_整列した得点・番号ならび), 項目位置を元に戻す(_整列した得点・番号ならび,_得点順成績ならび). 項目位置を元に戻す([],[]). 項目位置を元に戻す([[A,B]|R1],[[B,A]|R2]) :- 項目位置を元に戻す(R1,R2). 番号、得点、平均との差の出力 :- 平均点(_平均点), write('番号 得点 平均との差\n'), 成績(_番号,_得点), _平均との差 is _得点 - _平均点, write_formatted('%t %t %t\n',[_番号,_得点,_平均との差]), fail. 番号、得点、平均との差の出力. quicksort([],[]) :- !. quicksort([X|Xs],Ys) :- partition(Xs,X,Littles,Gigs), quicksort(Littles,Ls), quicksort(Bigs,Bs), append(Ls,[X|Bs],Ys). partition([],Y,[],[]) :- !. partition([X|Xs],Y,[X|Ls],Bs) :- X @=< Y,partition(Xs,Y,Ls,Bs). partition([X|Xs],Y,Ls,[X|Bs]) :- X @> Y,partition(Xs,Y,Ls,Bs). %%%%%%%% findavg/3 加算/2 他 %%%%%%%%%%%%%%%%%%%% :- op(A,B,は). findavg(_集約項,_項,_算術平均) :- findall(_集約項,_項,_値ならび), '加算'(_値ならび,_合計値), length(_値ならび,_ならびの長さ), _算術平均 is _合計値 / _ならびの長さ,!. 加算(trunc(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A is trunc(B)),SL),!. 加算(四捨五入(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A は 四捨五入(B)),SL),!. 加算(切捨て(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A は 切捨て(B)),SL),!. 加算(切り上げ(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A は 切り上げ(B)),SL),!. 加算([],L) :- var(L), L = 0.0e+00,!. 加算([],L) :- \+(var(L)), 加算の変数に零をおく(L),!. 加算([L|R],SL) :- ならび(L), 行列の転置([L|R],L1), 加算_2(L1,SL),!. 加算(X,S) :- 加算_1(X,0.0e+00,S) . 加算_1([],S,S) :- !. 加算_1([A|R],Y,S) :- ならび(A), ならび(Y), !, ならび加算(A,Y,Z), 加算_1(R,Z,S),!. 加算_1([A|R],Y,S) :- atom(A), atom_number(A,I), integer(I), Z is I + Y, 加算_1(R,Z,S),!. 加算_1([A|R],Y,S) :- atom(A), atom_number(A,F), real(F), Z is F + Y, 加算_1(R,Z,S),!. 加算_1([A|R],Y,S) :- atom(A), 加算_1(R,Y,S),!. 加算_1([A|R],Y,S) :- A1 は A, Z is A1 + Y, 加算_1(R,Z,S). 加算_1(A,Y,S) :- とからりすと(A,L), !, 加算_1(L,Y,S) . 加算_2([],[]) :- !. 加算_2([L|R],[S|R2]) :- 加算(L,S), 加算_2(R,R2). 加算の変数に零をおく([]) :- !. 加算の変数に零をおく([A|R]) :- 変数(A), A = 0.0e+00, 加算の変数に零をおく(R),!. とからりすと(A,[A]) :- atomic(A),!. とからりすと(A と B,C) :- とからりすと(A,A1), とからりすと(B,B1), append(A1,B1,C). 変数(_変数) :- var(_変数). ならび([_|_]). _項 は (_ネットワーク :: _式) :- _ネットワーク :: _項 は _式, ! . _評価項 は N : L :- M は N, L1 は L, list_nth(M,L1,_評価項), ! . _評価項 は prolog(_評価項) :- functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), !, error_protect(_評価項,fail) . _評価値 は [X|{P}] :- findall(X,P,_評価値), ! . _評価項 は ` _値 :- !, _評価項 = _値, ! . _項 は _式 :- var(_式), _項 = _式, ! . _項 は _式 :- error_protect(一時関数定義(_式,_項),fail) . _項 は _式 :- atom(_式), member(_式,[minint,maxint,cputtime,time,csize,cused,dbsize,dbused,gsize,gused,noptrs,ptrsued,ssize,sused,tsize,tused]), !, _項 is _式, ! . _項 は _式 :- 二項組込み関数(_式), 二項組込み関数の評価(_式,_項) . _項 は _式 :- 二項組込み関数(_式), !, fail . _項 は _式 :- functor(_式,Functor,1), arg(1,_式,Arg), Y は Arg, functor(_式_1,Functor,1), arg(1,_式_1,Y), member(Functor,[atom,real,integer,var,float,list]), !, error_protect(_式_1,fail), _項 = Y, ! . _項 は _式 :- atom(_式), error_protect(get_global(_式,_項),fail), ! . _項 は _式 :- real(_式), _項 = _式, ! . _項 は _式 :- real(_式), !, fail . _項 は _式 :- list(_式), findall(X,(member(U,_式) , X は U),_項) . _項 は _式 :- list(_式), !, fail. _項 は _erlang_module : _erlang関数 :- erlang関数評価(_erlang_module : _erlang関数,_項),!. _項 は _式 :- 関数定義(_式,_項),!. _項 は _式 :- functor(_式,_関数,_次数), function(_関数,_次数), findall(Arg,(for(1,N,_次数) , arg(N,_式,Arg)),L), 関数評価に於いて引数部分の関数評価(L,L2), _式の二 =.. [_関数|L2], error_protect(_項 is _式の二,fail) . _項 は _評価関数 :- error_protect(_項 is _評価関数,fail),!. _評価項 は prolog(_評価項) :- functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), !, error_protect(_評価項,fail),!. _項 は _評価項 :- 述語評価が可能(_評価項,_関数,_次数,_次数足す一), _評価項 =.. _評価項の項分解ならび, findall(Arg,(for(1,N,_次数) , arg(N,_評価項,Arg)),L), 関数評価に於いて引数部分の関数評価(L,L2), append(L2,[_],_変数を付加した引数ならび), _解付き評価項 =.. [_関数|_変数を付加した引数ならび], error_protect(_解付き評価項,fail), arg(_次数足す一,_解付き評価項,_項) . _項 は _評価項 :- \+(述語評価が可能(_評価項,_関数,_次数,_次数足す一)), functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), error_protect(_評価項,fail), arg(Arg,_評価項,_項) . _項 は _評価項 :- \+(述語評価が可能(_評価項,_関数,_次数,_次数足す一)), functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), \+(error_protect(_評価項,fail)), _評価項 = _項,!. _項 は _式 :- atomic(_式), \+(述語評価が可能(_式,_関数,_次数,_次数足す一)), _項 = _式,!. 述語評価が可能(_評価項,_関数,_次数,_次数足す一) :- functor(_評価項,_関数,_次数), _次数足す一 is _次数 + 1, \+(predicate_type(_関数,_次数足す一,undefined)),!. 関数評価に於いて引数部分の関数評価([],[]). 関数評価に於いて引数部分の関数評価([L|R1],[L2|R2]) :- list(L), !, 関数評価に於いて引数部分の関数評価(L,L2), 関数評価に於いて引数部分の関数評価(R1,R2), ! . 関数評価に於いて引数部分の関数評価([F|R1],[F|R2]) :- \+(error_protect(F2 は F,fail)), !, 関数評価に於いて引数部分の関数評価(R1,R2) . 関数評価に於いて引数部分の関数評価([F|R1],[F2|R2]) :- error_protect(F2 は F,fail), 関数評価に於いて引数部分の関数評価(R1,R2) . erlang関数評価(os : cmd(Command),_項) :- erlang :: (os : cmd(Command) -> _項_1), _項 は string2atom(_項_1),!. erlang関数評価(_erlang_module : _erlang関数,_項) :- erlang :: (_erlang_module : _erlang関数 -> _項),!. 関数定義(_項の一 + _項の二,_値) :- _値の一 は _項の一, number(_値の一), _値の二 は _項の二, number(_値の二), _値 is _値の一 + _値の二, !. 関数定義(_項の一 + _項の二,_値) :- _値の一 は _項の一, atomic(_値の一), _値の二 は _項の二, atomic(_値の二), concat_atom([_値の一,_値の二],_値), !. 関数定義(_ならびの一 + _ならびの二,_値) :- ( 変数(_ならびの一) ; _ならびの一 == [] ; list(_ならびの一) ; 変数(_ならびの二) ; _ならびの二 == [] ; list(_ならびの二) ), !, append(_ならびの一,_ならびの二,_値) . 関数定義(_項の一 * _項の二,_値) :- _値の一 は _項の一, list(_値の一), _値の二 は _項の二, integer(_値の二), findall(_値の一,for(1,_,_値の二),LY), concat_list(LY,_値), !. 関数定義(_項の一 * _項の二,_値) :- _値の一 は _項の一, atom(_値の一), _値の二 は _項の二, integer(_値の二), findall(_値の一,for(1,_,_値の二),L), concat_atom(L,_値), !. 関数定義(_項の一 * _項の二,_値) :- _値の一 は _項の一, atomic(_値の一), _値の二 は _項の二, atomic(_値の二), concat_atom([_値の一,_値の二],_値), !. 関数定義(_ならびの一 * _ならびの二,_値) :- ( 変数(_ならびの一) ; _ならびの一 == [] ; list(_ならびの一) ; 変数(_ならびの二) ; _ならびの二 == [] ; list(_ならびの二) ), !, append(_ならびの一,_ならびの二,_値) . 関数定義(` _値,_値) :- !. 関数定義(@ _式,_値) :- _値 は _式,!. 関数定義(四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _値の二 >= 0.0e+00, _四捨五入後の値 is floor(_値の二 + 0.5) * 1.0,!. 関数定義(四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _四捨五入後の値 is ceil(_値の二 - 0.5),!. 関数定義(切り捨て(_値),_切り捨て後の値) :- _値の二 は _値, _切り捨て後の値 は floor(_値の二) * 1.0,!. 関数定義(切り上げ(_値),_切り上げ後の値) :- _値の二 は _値, _切り上げ後の値 は ceil(_値の二),!. 関数定義(十円未満四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _四捨五入後の値 は floor(_値の二 / 10 + 0.5) * 10,!. 関数定義(十円未満切り捨て(_値),_切り捨て後の値) :- _値の二 は _値, _切り捨て後の値 は trunc(_値の二 / 10) * 10,!. 関数定義(十円未満切り上げ(_値),_切り上げ後の値) :- _値の二 は _値, _切り上げ後の値 は ceil(_値の二 / 10) * 10,!. 関数定義(百円未満四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _四捨五入後の値 は floor(_値の二 / 100 + 0.5) * 100,!. 関数定義(百円未満切り上げ(_値),_切り上げ後の値) :- _値の二 は _値, _切り上げ後の値 は ceil(_値の二 / 100) * 100,!. 関数定義(百円未満切り捨て(_値),_切り捨て後の値) :- _値の二 は _値, _切り捨て後の値 は floor(_値の二 / 100) * 100,!. 関数定義(整数化(_値),_整数化された値) :- _値の二 は _値, _整数化された値 is trunc(_値の二),!. 関数定義(char_code(_項),_値) :- ( atom(_項), atomic_length(_項,1), char_code(_項,_値) ; integer(_項), char_code(_値,_項) ; 複合項(_項), _項の一 は _項, _値 は char_code(_項の一) ), !. 関数定義($ _大域変数名,_値) :- atom(_大域変数名), get_global(_大域変数名,_値の一), _値 は _値の一,!. 関数定義(S,E) :- functor(S,select,1), to(S,E),!. 関数定義(setq(A,B),E) :- atom(A), B1 は B, set_global(A,B1), E = B1,!. 関数定義(++ A,X) :- A1 は A, list(A1), 加算(A1,X),!. 関数定義(A ++ B,X) :- C is B / A, X = A + C + B,!. 関数定義(car(A),E) :- A1 は A, A1 = [E|_],!. 関数定義(cdr(A),E) :- A1 は A, A1 = [_|E],!. 関数定義(cons(A,B),E) :- A1 は A, B1 は B, E = [A1|B1],!. 関数定義(length(A),E) :- A1 は A, list(A1), length(A1,E),!. 関数定義(decode(A,B,C,D),E) :- A1 は A, B1 は B, A1 = B1, E は C,!. 関数定義(decode(A,B,C,D),E) :- E は D,!. 関数定義(decompcons(A),E) :- A1 は A, decompcons(A1,E),!. 関数定義(substr(A,B,C),E) :- 関数定義(subatomic(A,B,C),E),!. 関数定義(subatomic(A,B,C),E) :- A1 は A, B1 は B, C1 は C, subatomic(A1,B1,C1,E),!. 関数定義(concat(A),E) :- A1 は A, concat(A1,E),!. 関数定義(concat(A,B),E) :- A1 は A, B1 は B, concat(A1,B1,E),!. 関数定義(append(A,B),E) :- A1 は A, B1 は B, append(A1,B1,E),!. 関数定義(reverse(A),E) :- A1 は A, reverse(A1,E),!. 関数定義(string2atom(A),E) :- A2 は A, flat(A2,B), atom_codes(E,B),!. 関数定義(P,E) :- functor(P,greatest,Arg), P =.. [greatest|L], findall(B,(member(A,L) , B は A),L2), max(L2,E),!. 関数定義(P,E) :- functor(P,least,Arg), P =.. [least|L], findall(B,(member(A,L) , B は A),L2), min(L2,E),!. 関数定義(cel(_列数,_行数,_行列),_解) :- _関数評価された行数 は _行数, _関数評価された列数 は _列数, list_nth(_関数評価された行数,_行列,_行), list_nth(_関数評価された列数,_行,_解),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1153585095/904 # # [課題] # ・23本のマッチ棒からなる山があり,2人のプレーヤが山から交互にマッチ棒を # 取り除く # ・一度に取ることのできるマッチ棒は1から3本 # ・山を空にしたプレーヤが勝ち # 人間2人でこのゲームを行なうプログラムを作成せよ. # # プログラムでは各プレーヤの手がルールに反していないかどうかのチェックと, # 勝負がついたかどうかのチェックを行なうこと。 # また,最初に山にある本数と,各回に取ることができる最大の本数をプログラムの # 最初に変数にセットしておき,そこを変えるだけで本数の変化に対応できるような # プログラムにすること。 プレーヤ(1,山下). プレーヤ(2,太田). プレーヤのデバイス(1,入力,'/dev/tty1'). プレーヤのデバイス(2,入力,'/dev/tty2'). プレーヤのデバイス(1,出力,'/var/tmp/player1'). プレーヤのデバイス(2,出力,'/var/tmp/player2'). マッチ棒の山([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_]). マッチ棒('|'). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% マッチ棒の山崩し :- プレーヤ(1,_プレーヤ1), プレーヤ(2,_プレーヤ2), マッチ棒の山(L), デバイスを開く(Instream1,Instream2,Outstream1,Outstream2), ゲームの案内(Outstream1,Outstream2), マッチ棒の山崩し(_プレーヤ1,_プレーヤ2,Instream1,Instream2,Outstream1,Outstream2,L), デバイスを閉じる(Insteam1,Instream2,Outstream1,Outstream2). マッチ棒の山崩し(_,_プレーヤ,_,_,OutstreamA,OutstreamB,[]) :- concat_atom([_プレーヤ,さんの勝ちです,'\n'],S), 同報(OutstreamA,OutstreamB,S),!. マッチ棒の山崩し(_プレーヤA,_プレーヤB,InstreamA,InstreamB,OutstreamA,OutstreamB,L) :- 取り棒の案内(_マッチ棒,L,_取り棒の案内), write_formatted(OutstreamA,'君の番だよ( %t ) : ',[_取り棒の案内]), マッチ棒を取る(InstreamA,OutstreamA,L,L1,L2), マッチ棒の山の変化を同報する(OutstreamA,OutstreamB,L,L1,L2), マッチ棒の山崩し(_プレーヤB,_プレーヤA,InstreamB,InstreamA,OutstreamB,OutstreamA,L2),!. マッチ棒を取る(Instream,_,L,L1,L2) :- get_line(Instream,S), 変数ならびに変換(S,L1), 取ったマッチ棒の診断(L,L1,L2),!. マッチ棒を取る(Instream,Outstream,L,L1,L2) :- マッチ棒を取る(Instream,Outstream,L,L1,L2). 取ったマッチ棒の診断(L,L1,L2) :- append(L1,L2,L2),!. 取ったマッチ棒の診断(L,L1,L2) :- 取り棒の案内(L,_取り棒の案内), write(Outstream,'入力形式が正しくありません。\n'), write(Outstream,'(%t) : ',[_取り棒の案内]), fail. 変数ならびに変換(S,L) :- マッチ棒(_マッチ棒), 変数ならびに変換(_マッチ棒,Chars,L), atom_chars(S,Chars). 変数ならびに変換(_マッチ棒,[_マッチ棒],[_]). 変数ならびに変換(_マッチ棒,[_マッチ棒|R1],[_|R2]) :- 変数ならびに変換(_マッチ棒,R1,R2). 取り棒の案内(L,_取り棒の案内) :- マッチ棒(_マッチ棒), 取り棒の案内(_マッチ棒,L,_取り棒の案内). 取り棒の案内(_マッチ棒,[_],_マッチ棒). 取り棒の案内(_マッチ棒,[_,_],S) :- concat_atom([_マッチ棒,' or ',_マッチ棒],S). 取り棒の案内(_マッチ棒,[_,_,_|_],S) :- concat_atom([_マッチ棒,' or ',_マッチ棒,' or ',_マッチ棒],S). マッチ棒の山の変化を同報する(Outstream1,Outstream2,L0,L1,L) :- マッチ棒(_マッチ棒), all(L0,_マッチ棒),concat_atom(L0,' ',S0), all(L1,_マッチ棒),concat_atom(L1,' ',S1), all(L,_マッチ棒),concat_atom(L,' ',S), concat_atom([S1,'\n','↑\n',S,'\n現在の山は ',S,'\n'],S2), 同報(Outstream1,Outstream2,S2), fail. マッチ棒の山の変化を同報する(_,_,_,_,_). all([],_). all([V|R],V) :- all(R,V). ゲームの案内(Outstream1,Outstream2) :- 同報(Outstream1,Outstream2,'マッチの本数の入力は\n1本 -> |<改行>\n'), 同報(Outstream1,Outstream2,'2本 -> ||<改行>\n'), 同報(Outstream1,Outstream2,'3本 -> |||<改行> という表現でお願いします\n'). 同報(Outsteam1,Outstream2,_項) :- write(Outstream1,_項), write(Outstream2,_項),!. デバイスを開く(Instream1,Instream2,Outstream1,Outstream2) :- プレーヤのデバイス(1,入力,Indevice1), プレーヤのデバイス(2,入力,Indevice2), プレーヤのデバイス(1,出力,Outdevice1), プレーヤのデバイス(2,出力,Outdevice2), open(Indevice1,read,Instream1), open(Outdevice1,append,Outstream1), open(Indevice2,read,Instream2), open(Outdevice2,append,Outstream2),!. デバイスを閉じる(Instream1,Instream2,Outstream1,Outstream2) :- close(Insteam1), close(Outstream1), close(Instream2), close(Outstream2),!. マッチ棒の山の初期状態の設定(N) :- integer(N), retract(マッチ棒の山(_)), length(L,N), asserta(マッチ棒の山(L)). プレーヤの入出力デバイスの設定(_プレーヤ1の入力デバイス,_プレーヤ2の入力デバイス,_プレーヤ1の出力デバイス,_プレーヤ2の出力デバイス) :- abolish(プレーヤのデバイス/3), assertz(プレーヤのデバイス(1,入力,_プレーヤ1の入力デバイス)), assertz(プレーヤのデバイス(2,入力,_プレーヤ2の入力デバイス)), assertz(プレーヤのデバイス(1,出力,_プレーヤ1の出力デバイス)), assertz(プレーヤのデバイス(2,出力,_プレーヤ2の出力デバイス)),!. プレーヤの設定(_プレーヤ1,_プレーヤ2) :- abolish(プレーヤ/2), assertz(プレーヤ(1,_プレーヤ1)), assertz(プレーヤ(2,_プレーヤ2)),!. get_line(Instream,X) :- get_char(Instream,C), get_line_3(Instream,C,Chars), atom_chars(X,Chars). get_line_3(_,'\n',[]) :- !. get_line_3(Instream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_3(Instream,C,[C|R]) :- get_char(Instream,C2), get_line_3(Instream,C2,R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/160 # # [1]プログラミング # [2] 課題 # 言語: C もしくは C++ 言語 # # (1)以下のプログラムを作成しなさい(数当てゲーム) # # *画面上に「好きな数字を入力してください」と表示して、キーボードからの入力を # 待つ。 # 変数aを定義して、10までの乱数を発生させて変数aに代入する。 # キーボードからの入力があれば、先に発生させた乱数と一致しているならば # 「あたり!!」と表示する。 # 一致していなければ「残念乱数はxxです」と表示する(xxには変数aの中身を # 表示する) 数当てゲーム :- repeat, _a is ramdom mod 10 + 1, write('好きな数字を入力してください '), get_line(Line), atom_to_term(Line,N,_), 数当てゲーム診断(_a,N), Line = end_of_file. 数当てゲーム診断(A,A) :- write('あたり!!\n'). 数当てゲーム診断(_,B) :- not(integer(B)), write('入力されたのは整数ではありません\n'). 数当てゲーム診断(A,N) :- not(A == N), write_formatted('残念乱数は%tです\n',[A]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1245853701/960 # # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク): # 下に示すように,要素数が5 でint 型の配列に、5 人の学生の身長を読み込んで、その平均 # 身長を求めるプログラムを作成せよ。 # 身長を入力してください # 1 番: 178 # 2 番: 175 # 3 番: 165 # 4 番: 179 # 5 番: 172 # 平均身長: 173.8 '5 人の学生の身長を読み込んで、その平均身長を求める' :- '5 人の学生の身長を読み込んで、'(_身長ならび), sum(_身長ならび,_合計), _平均身長 is _合計 / 5, write_formatted('平均身長: %t\n',[_平均身長]), '5 人の学生の身長を読み込んで、'(_身長ならび) :- findall(_身長,(for(1,N番目,5),身長を得る(N番目,_身長)),_身長ならび). 身長を得る(N番目,_身長) :- write_formatted('%t 番: ',[N番目]), 数値を得る(_身長), 身長として適切な数値であるか検査する(_身長),!. 身長を得る(N番目,_身長) :- 身長を得る(N番目,_身長). 身長として適切な数値であるか検査する(_身長) :- _身長 > 0.0,_身長 < 230.0,!. 身長として適切な数値であるか検査する(_身長) :- write_formatted('%tは身長として適切な数値ではありませんでした。再入力が必要です\n',[_身長]),fail. 数値を得る(_数値) :- get_line(_改行までの文字列), atom_to_term(_改行までの文字列,_数値,_), number(_数値). get_line(X) :- get_char(C), get_line_2(C,Chars), atom_chars(X,Chars). get_line_2('\n',[]) :- !. get_line_2(end_of_file,[]) :- !. get_line_2(C,[C|R]) :- get_char(C2), get_line_2(C2,R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1245853701/822 # # 何人かの学生の3教科(数学、国語、英語)の得点を2次元配列を用いて # 処理するプログラムを作る。 # # (1)科目別の最高点、最低点を表示する。 # (2)各学生の3教科の平均点を表示する。 # (3)各教科の平均点を表示する。 # # ただし Ctrl+zが押されるまで次々と整数値を読み込んでいくものとする。 % テーマ findallを使った集約処理 '何人かの学生の3教科(数学、国語、英語)の得点を2次元配列を用いて 処理するプログラムを作る。 (1 )科目別の最高点、最低点を表示する。 (2)各学生の3教科の平均点を表示する。 (3)各教科の平均点を表示する。 ただし Ctrl+zが押されるまで次々と整数値を読み込んでいくものとする。' :- 'Ctrl+zが押されるまで次々と整数値を読み込んでいく'(_整数行列), '(1 )科目別の最高点、最低点を表示する。 '(_整数行列), '(2)各学生の3教科の平均点を表示する。 '(_整数行列), '(3)各教科の平均点を表示する。 '(_整数行列). 'Ctrl+zが押されるまで次々と整数値を読み込んでいく'(_整数行列) :- findall(_行,( get_split_line([','],_行)), _整数行列). '(1 )科目別の最高点、最低点を表示する。 '(_整数行列) :- 転置(_整数行列,[_学年ならび|LL]), forall(( nth1(_nth1,LL,L), 最高点と最低点を得る(L,_最高点,_最低点)), 表示する('科目番号:%t 最高点:%t 最低点:%t\n',[_nth1,_最高点,_最低点])). 最高点と最低点を得る([A|R],_最高点,_最低点) :- 最高点を得る(R,A,_最高点), 最低点を得る(R,A,_最低点). 最高点を得る([],_最高点,_最高点). 最高点を得る([N|R],_最高点_1,_最高点) :- N > _最高点_1, 最高点を得る(R,N,_最高点). 最高点を得る([N|R],_最高点_1,_最高点) :- N =< _最高点_1, 最高点を得る(R,_最高点_1,_最高点). 最低点を得る([],_最低点,_最低点). 最低点を得る([N|R],_最低点_1,_最低点) :- N < _最低点_1, 最低点を得る(R,N,_最低点). 最低点を得る([N|R],_最低点_1,_最低点) :- N >= _最低点_1, 最低点を得る(R,_最低点_1,_最低点). '(2)各学生の3教科の平均点を表示する。 '(_整数行列) :- forall(( nth1(_nth1,_整数行列,[_|R]), 相加平均(R,_相加平均)), writef('学生:%t 3教科の平均点:%t\n',[_nth1,_相加平均])). '(3)各教科の平均点を表示する。 '(_整数行列) :- 転置(_整数行列,[_学年ならび|LL]), forall(( nth1(_nth1,LL,L), 相加平均(L,_相加平均)), 表示する('科目番号:%t 平均点:%t\n',[_nth1,_相加平均])). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 相加平均(L,M) :- length(L,N), 相加平均(L,N,0,M). 相加平均([],N,S,M) :- M is S / N,!. 相加平均([A|R],N,S,M) :- S1 is S + A, 相加平均(R,N,S1,M). get_split_line(File,Splitter,List) :- get_split_lines(File,Splitter,Lines), member(List,Lines) . get_split_line(Splitters,List) :- get_line(Line), split(Line,Splitters,List). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1('\z',[]) :- !. get_line_1(end_of_file,[]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). 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), number(C,Nl),!. split_5(B,C) :- atomic_list_concat(B,C),!. split_32(['"','"'|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_32([_|R],R2,_区切り符号,_区切り符号ならび,X) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42(['"','"'|R],R2,_区切り符号,_区切り符号ならび,['"'|X]) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42([],[],'',_,[]) :- !. split_42([_文字|R],R2,_区切り符号ならび,[_文字|X]) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. numeric_list([],[]) :- !. numeric_list([A|R],[B|R1]) :- digit(A), char_code(A,B), numeric_list(R,R1),!. numeric_list(['.'|R],[46|R1]) :- numeric_list(R,R1),!. numeric_list([-|R],[45|R1]) :- numeric_list(R,R1),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1232627790/921 # # 正の数を入力し、入力した整数の1と # その数を除く約数の和を求めて表示するプログラムを作成しなさい。 # 15の約数は、1,3,5,15なので、1と15を除く約数の和は8となる。 # # お願いします。 '正の数を入力し、入力した整数の1と その数を除く約数の和を求めて表示するプログラムを作成しなさい。 15の約数は、1,3,5,15なので、1と15を除く約数の和は8となる。 お願いします。' :- '正の数を入力し、入力した整数の1とその数を除く約数の和を求めて表示する'. '正の数を入力し、入力した整数の1とその数を除く約数の和を求めて表示する' :- 正の数を入力し(_正の数), 入力した整数の1とその数を除く約数の和を求めて(_入力した整数,_約数の和), 表示する(_約数の和). 入力した整数の1とその数を除く約数の和を求めて(_入力した整数,_約数の和) :- findsum(_約数,( between(1,_入力した整数,_約数), 1とその数を除く約数(_入力した整数,_約数)), _約数の和). 1とその数を除く約数(_その数,_約数) :- \+(_約数 = 1), \+(_約数 = _その数), 0 is _その数 mod _約数. 正の数を入力し(_正の数) :- 整数を得る(正の整数,_整数 >= 0,_整数). 表示する(_約数の和) :- writef('%t\n',[_約数の和]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum(_値ならび,_合計値),!. sum([],0). sum([N|R],S) :- sum(R,S_1), S is N + S_1. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 整数を得る(Instream,_催促文ならび,_整数を含む条件,_整数ならび) :- list(_催促文ならび), findall(_整数,( member(_催促文,_催促文ならび), 整数を得る(Instream,_催促文,_整数を含む条件,_整数)), _整数ならび),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 整数を得る'(Line,_整数を含む条件,_整数),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 整数を得る(Instream,_催促文,_整数を含む条件,_整数). '診断: 整数を得る'(end_of_file,_整数を含む条件,end_of_file) :- !. '診断: 整数を得る'('',_,_) :- !,fail. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), '診断: 整数を含む条件'(_整数,_整数を含む条件),!. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- \+((atom_to_term(Line,_整数,_),integer(_整数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]), fail. '診断: 整数を得る'(end_of_file,end_of_file) :- !. '診断: 整数を得る'('',_) :- !,fail. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- call(_整数を含む条件),!. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_整数,_整数を含む条件]), fail. 整数を得る(_催促文,_整数を含む条件,_整数) :- 整数を得る(user_input,_催促文,_整数を含む条件,_整数). 整数を得る(_催促文,_整数) :- 整数を得る(user_input,_催促文,true,_整数). 整数を得る(_整数) :- 整数を得る(user_input,'',true,_整数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). n個の整数を得る(_n,_催促文,_整数ならび) :- length(_整数ならび,_n), findall(_整数,( 部分ならび(_整数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 整数を得る(_催促文,_整数)), _整数ならび). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1245853701/757 # # 【質問テンプレ】 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): 二次元配列を使って以下のファイルを読み込み、 # 同じように表示しなさい。 #  【test.dat】 #   ** ** ** #   ** ** ** #   ** ** ** t399 :- 二次元構造の読み込み('test.dat',_二次元構造), member(L,_二次元構造), concat_atom(L,' ',S), write_formatted('%t\n',[S]), fail; true. 二次元構造の読み込み(File,_二次元構造) :- open(File,read,Input), findall(L,(repeat,get_line(Input,X),(X=end_of_file,!,fail; split(X,[' '],L))),_二次元構造), close(Input),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1232627790/904 # # ・課題の内容 # TCP/IPプロトコルを用い、通信するプログラムを作成せよ。 # ・条件 # キーボードから文字列を1行入力し、それを送信するプログラム(tcp_snd1)と、 # それを受信するプログラム(tpc_rec1)の2つを作成せよ。 # tcp_snd1では、送信先の計算機の名前をプログラムの引数で指定できるようにせよ。 # tcp_rec1では、コネクションの要求あったら、コネクションを張り、 # 要求した計算機のIPアドレスを表示せよ。 # メッセージを受信するたびに、通信回数を[]で括って表示し、 # その後にメッセージを表示せよ。 # 空行が入力されたら、tcp_snd1もtcp_rec1の双方が終了するようにせよ。 # ポートとして、9000を利用せよ。 tcp_snd1(Host) :- socket(internet, stream, Socket), host_addr(Host,9000), socket_connect(Socket, Addr : Port), open(Socket,read,Input), open(Socket,write,Output), get_line(Line), send_message(Line,Host,Socket,Input,Output), write(Output,'\n'), close(Input), close(Output), socket_shutdown(Socket). send_message(end_of_file,Host,Input,Output) :- !. send_message(Line,Host,Input,Output) :- write_formatted(Output,'%t\n',[Host,Line]), flush_output(Output), get_line(Line2), send_message(Line,Host,Input,Output), get_line(Input,_). tcp_rcv1 :- socket(internet, stream, Socket), socket_bind(Socket, 9000), socket_listen(Socket), socket_accept(Socket,Host:Port,NewSocket), write_formatted('Accept Host:%t\n',[Host]), open(NewSocket,read,Input), open(NewSocket,write,Output), for(1,N,2000000000), get_line(Input,Line), return_message(N,Line,Status), Status == end_of_file, close(Input), close(Output), socket_shutdown(Socket), socket_shutdown(NewSocket). return_message(N,'',end_of_file) :- !. return_message(N,Line,ok) :- write_formatted('[%t]%t\n',[N,Line]), write(Output,'ok\n'). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1245853701/606 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9680.txt # http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9678.txt # ・リストを用いた成績処理 # ・リストを用いて個人データを格納する表を作成 # ・処理番号を入力して処理の切り替えを行う # - 1.成績一覧表示, 2.個人成績表示, # 3.個人平均点表示,4.科目平均点表示, # 0.終了 # ・リストに新たにデータを追加する時は学生番号順に並ぶように追加する. # ・リスト構成する要素(セル)はmalloc関数でヒープ領域から確保するものとする. # 入力する成績データ(この順番で入れる) # 学番名前英語数学化学物理 # 106 tada 65 80 90 100 # 101 kouda 50 85 70 65 # 103 hanako 70 75 65 80 # 104 akane 60 95 80 75 # 102 tarou 90 80 85 65 # 105 nara 80 70 50 95 処理番号を入力して処理の切り替えを行う :- 個人データのロード, forall((処理番号入力して(X),('0が入力されたら個人データをセーブして終了する'(X),!,fail;true)),処理の切り替えを行う(X)). 処理番号入力して(X) :- repeat, 入力プロンプト, 整数を得る(処理番号を入力してください,true,X). '0が入力されたら個人データをセーブして終了する'(0) :- 個人データのセーブ, write('処理を終了します\n'). 処理の切り替えを行う(0) :- !. 処理の切り替えを行う(1) :- 成績一覧表示. 処理の切り替えを行う(2) :- 個人成績表示. 処理の切り替えを行う(3) :- 個人平均点表示. 処理の切り替えを行う(4) :- 科目別平均表示. 処理の切り替えを行う(7) :- 個人データの格納. 入力プロンプト :- write('1.成績一覧表示, 2.個人成績表示,\n3.個人平均点表示,4.科目平均点表示,\n7. 個人データの追加, \n0. 終了\n'). 個人成績表示 :- 学番を得る(_学番), 個人データを得て個人合計点と個人平均点を得る(_学番,_英語,_数学,_科学,_物理,_合計,_平均), write('学番 名前 英語 数学 化学 物理 合計 平均\n'), write_formatted('%3d %8s %3d %3d %3d %3d %3d %3d\n',[_学番,B,C,D,E,F,_合計点,_個人平均点]). 学番を得る(_学番) :- 整数を得る(学番を入れてください,true,_学番). 個人データを得て個人合計点と個人平均点を得る(_学番,_英語,_数学,_科学,_物理,_合計,_平均) :- 個人データ(_学番,B,C,D,E,F), 個人平均点(_学番,_個人平均点), 個人合計点(_学番,_個人合計点). 個人平均点表示 :- 整数を得る(学番を入れて下さい,true,_学番), 個人平均点(_学番,_個人平均点), 個人データ(_学番,_氏名,_,_,_,_), writef('%t %8s の平均点は %tです\n',[_学番,_氏名,_個人平均点]). 科目別平均表示 :- 四科目の科目別平均を得る(_英語平均点,_数学平均点,_物理平均点,_化学平均点), writef('科目別の平均は 英語=%3d 数学=%3d 物理=%3d 化学=%3d です\n', [_英語平均点,_数学平均点,_物理平均点,_化学平均点]). 四科目の科目別平均を得る(_英語平均点,_数学平均点,_物理平均点,_化学平均点) :- 科目別平均(英語,_英語平均点), 科目別平均(数学,_数学平均点), 科目別平均(物理,_物理平均点), 科目別平均(化学,_化学平均点). 個人平均点(_学番,_個人平均点) :- 個人データ(_学番,_,C,D,E,F), _個人平均点 is truncate(round(C+D+E+F) / 4)). 個人合計点(_学番,_個人合計点) :- 個人データ(_学番,_,C,D,E,F), _個人平均 is truncate(round((C+D+E+F) / 4)). 科目別平均点(_科目,_平均点) :- findavg(U,(鍵位置(_科目,_,P,U),call(P)),_平均点の一), _平均点 is truncate(round(_平均点の一)). 科目別合計点(_科目,_合計点) :- findsum(U,(鍵位置(_科目,_,P,U),call(P)),_合計点の一). _合計点 is truncate(round(_合計点の一)). 成績一覧表示 :- 個人データ一覧を表示する, fail; 科目合計点と科目平均点と全員合計点を表示する. 個人データ一覧を表示する :- write('学番 名前 英語 数学 化学 物理 合計 平均\n'), 個人データ(A,B,C,D,E,F), 個人合計点(A,_合計点), 個人平均点(A,_平均点), writef('%3d %8s %3d %3d %3d %3d %3d %3d\n',[A,B,C,D,E,F,_合計点,_平均点]). 科目合計点と科目平均点と全員合計点と全員平均点を表示する :- 科目合計点と(_英語合計点,_数学合計点,_物理合計点,_化学合計点), 科目平均点と(_英語平均点,_数学平均点,_物理平均点,_化学平均点), 全員合計点と全員平均点を表示する(_英語合計点,_数学合計点,_物理合計点,_化学合計点,_全員合計点). 科目合計点と(_英語合計点,_数学合計点,_物理合計点,_化学合計点) :- 科目別合計点(英語,_英語合計点), 科目別合計点(数学,_数学合計点), 科目別合計点(物理,_物理合計点), 科目別合計点(化学,_化学合計点). 科目平均点と(_英語平均点,_数学平均点,_物理平均点,_化学平均点) :- 科目別平均点(英語,_英語平均点), 科目別平均点(数学,_数学平均点), 科目別平均点(物理,_物理平均点), 科目別平均点(化学,_化学平均点). 全員合計点と全員平均点を(_英語合計点,_数学合計点,_物理合計点,_化学合計点,_全員合計点,_全員平均点) :- sum_list([_英語合計点,_数学合計点,_物理合計点,_化学合計点],_全員合計点), _全員平均点 is truncate(round(_全員合計点 / 4), writef('合計 %3d %3d %3d %3d %3d\n,[_英語合計点,_数学合計点,_物理合計点,_化学合計点,_全員合計点]), writef('平均 %3d %3d %3d %3d %3d\n,[_英語平均点,_数学平均点,_物理平均点,_化学平均点,_全員平均点]). 個人データの格納 :- findall(K,個人データ(K),Ls), 個人データの格納(Ls). 個人データの格納(Ls) :- writef('個人データ入力 (学番 名前 英語 数学 化学 物理): '), get_line(Line), not(Line==end_of_file), split(Line,[' ',','],_個人データ), リストに挿入(_個人データ,Ls,Ls1), 個人データの格納(Ls1). 個人データの格納(Ls) :- abolish(個人データ/1), member(L,Ls), P =.. [個人データ|L], assertz(P), fail; true. 個人データのロード :- exists('個人データ#6.pro',read), consult('個人データ#6.pro'). 個人データのロード. 個人データのセーブ :- tell('個人データ#4.pro'), listing, told. リストに挿入(L,[],[L]) :- !. リストに挿入([K|R1],[[A|R2]|R3],[[A|R2]|R4]) :- K @>= A, リストに挿入([K|R1],R3,R4). リストに挿入([K|R1],[[A|R2]|R3],[[K|R1],[A|R2]|R3]) :- K @< A,!. 鍵位置(学番,[_学番,_,_,_,_,_],個人データ(_学番,_,_,_,_,_),_学番). 鍵位置(名前,[_,_名前,_,_,_,_],個人データ(_,_名前,_,_,_,_),_名前). 鍵位置(英語,[_,_,_英語,_,_,_],個人データ(_,_,_英語,_,_,_),_英語). 鍵位置(数学,[_,_,_,_数学,_,_],個人データ(_,_,_,_数学,_,_),_数学). 鍵位置(化学,[_,_,_,_,_化学,_],個人データ(_,_,_,_,_化学,_),_化学). 鍵位置(物理,[_,_,_,_,_,_物理],個人データ(_,_,_,_,_,_物理),_物理). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), '加算'(_値ならび,_合計値),!. findavg(_集約項,_項,_算術平均) :- findall(_集約項,_項,_値ならび), '加算'(_値ならび,_合計値), length(_値ならび,_ならびの長さ), _算術平均 is _合計値 / _ならびの長さ,!. 加算([],0.0) :- !. 加算([A|R],S) :- 加算(R,S2), S is A + S2. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1245853701/ # # [1] 授業単元:C言語実習 # [2] 問題文(含コード&リンク):http://kansai2channeler.hp.infoseek.co.jp/cgi-bin /joyful/img/9658.txt # {5,21,4,14,12}, # {25,20,15,3,7}, # {24,11,6,1,13}, # {16,2,17,19,8}, # {23,18,22,9,10} # # の横の各行を小さい順に並び替えた後、縦の各列を小さい順に並び替え(上が小さくな るように) # 結果を出力 # # 結果は # # 5 21 4 14 12 # 25 20 15 3 7 # 24 11 6 1 13 # 16 2 17 19 8 # 23 18 22 9 10 # # のような形で出力 '横の各行を小さい順に並び替えた後、縦の各列を小さい順に並び替えて出力する'(_ファイル) :- 行列に入力する(_ファイル,_行列1), '横の各行を小さい順に並び替えた後、縦の各列を小さい順に並び替えてW得点データをバブルソートを用いて国語の得点の大きい順に並び替えよ出力する'(_行列1,_行列2), 出力する(_行列2),!. '横の各行を小さい順に並び替えた後、縦の各列を小さい順に並び替えて出力する'(_行列1,_行列2) :- 各行を整列する(_行列1,_行列3), 縦の各列を整列する(_行列3,_行列2). 行列に入力する(_ファイル,_行列) :- get_split_lines(_ファイル,['{',',','}'],_行列). 各行を整列する([],[]) :- !. 各行を整列する([_行|R1],[_整列された行|R2]) :- quicksort(_行,_整列された行), 各行を整列する(R1,R2). 縦の各列を整列する(_行列1,_行列2) :- 転置(_行列2,_行列3), 各行を整列する(_行列3,_行列4), 転置(_行列4,_行列2). 出力する(_行列2) :- append(L0,[L|R],_行列2), concat_atom(L,' ',S), writef('%t\n',[S]), R = []. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_split_lines(File,Sep,Lines) :- get_lines(File,Lines1), findall(Line,(member(A,Lines1) , split(A,Sep,Line)),Lines) . get_lines(File,Lines) :- get_chars(File,L), chars_lines(L,Lines),!. get_lines(Lines) :- findall(Line,( repeat , get_line(Line) , (Line = end_of_file , (!) , fail ; true)), Lines). get_chars(File,L) :- \+(is_stream(_,File,_)), exists(File,read), open(File,read,Input), get_char(Input,X), get_chars(Input,X,L), close(Input),!. get_chars(Input,L) :- is_stream(_,Input,_), get_char(Input,X), get_chars(Input,X,L),!. get_line(Instream,X) :- get_char(Instream,C), get_line_3(Instream,C,Chars), atom_chars(X,Chars),!. get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). get_line_3(_,'連続','\n',[]) :- !. get_line_3(Instream,_診断,'\r',X) :- get_char(Instream,C2), get_line_3_2(Instream,_診断,C2,X),!. get_line_3(Instream,'終了',end_of_file,[]) :- !. get_line_3(Instream,_診断,C,[C|R]) :- get_char(Instream,C2), get_line_3(Instream,_診断,C2,R). get_line_3(_,'\n',[]) :- !. get_line_3(Instream,end_of_file,[]) :- !. get_line_3(Instream,C,[C|R]) :- get_char(Instream,C2), get_line_3(Instream,C2,R). get_chars(L) :- findall(U,( repeat , get_char(U) , (U = end_of_file , (!) , fail ; true)), L). get_line(Instream,_診断,X) :- get_char(Instream,C), get_line_3(Instream,_診断,C,Chars), atom_chars(X,Chars),!. get_line(Instream,X) :- get_char(Instream,C), get_line_3(Instream,C,Chars), atom_chars(X,Chars),!. get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). get_line_3(_,'連続','\n',[]) :- !. get_line_3(Instream,_診断,'\r',X) :- get_char(Instream,C2), get_line_3_2(Instream,_診断,C2,X),!. get_line_3(Instream,'終了',end_of_file,[]) :- !. get_line_3(Instream,_診断,C,[C|R]) :- get_char(Instream,C2), get_line_3(Instream,_診断,C2,R). get_line_3(_,'\n',[]) :- !. get_line_3(Instream,end_of_file,[]) :- !. get_line_3(Instream,C,[C|R]) :- get_char(Instream,C2), get_line_3(Instream,C2,R). get_line_3_2(Instream,'連続','\n',[]) :- !. get_line_3_2(Instream,'連続',C,['\r'|R]) :- \+(C == '\n'), get_line_3(Instream,_診断,C,R),!. split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,Y), findall(U,(member(U,Y) , not 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_5([],'') :- !. split_5(B,C) :- numeric_list(B,Nl), number(C,Nl),!. split_5(B,C) :- concat_atom(B,C),!. split_32(['"','"'|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_32([_|R],R2,_区切り符号,_区切り符号ならび,X) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42(['"','"'|R],R2,_区切り符号,_区切り符号ならび,['"'|X]) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42([],[],'',_,[]) :- !. split_42([_文字|R],R2,_区切り符号ならび,[_文字|X]) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. number(A,B) :- number_codes(A,B). numeric_list([],[]) :-!. numeric_list([A|R],[B|R1]) :- digit(A), char_code(A,B), numeric_list(R,R1),!. numeric_list(['.'|R],[46|R1]) :- numeric_list(R,R1),!. numeric_list([-|R],[45|R1]) :- numeric_list(R,R1),!. 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). % *** user: quicksort / 2 *** quicksort([X|Xs],Ys) :- partition(Xs,X,Littles,Bigs), quicksort(Littles,Ls), quicksort(Bigs,Bs), append(Ls,[X|Bs],Ys). quicksort([],[]). partition([X|Xs],Y,[X|Ls],Bs) :- X @=< Y, partition(Xs,Y,Ls,Bs). partition([X|Xs],Y,Ls,[X|Bs]) :- X @> Y, partition(Xs,Y,Ls,Bs). partition([],Y,[],[]). % 以下のサイトは # # 自然数を入力する場合の一般型 # 自然数を得る(Instream,_催促文ならび,_自然数を含む条件,_自然数ならび) :- list(_催促文ならび), findall(_自然数,( member(_催促文,_催促文ならび), 自然数を得る(Instream,_催促文,_自然数を含む条件,_自然数)), _自然数ならび),!. 自然数を得る(Instream,_催促文,_自然数を含む条件,_自然数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 自然数を得る'(Line,_自然数を含む条件,_自然数),!. 自然数を得る(Instream,_催促文,_自然数を含む条件,_自然数) :- 自然数を得る(Instream,_催促文,_自然数を含む条件,_自然数). '診断: 自然数を得る'(end_of_file,_自然数を含む条件,end_of_file) :- !. '診断: 自然数を得る'('',_,_) :- !,fail. '診断: 自然数を得る'(Line,_自然数を含む条件,_自然数) :- atom_to_term(Line,_自然数,_), 自然数(_自然数), '診断: 自然数を含む条件'(_自然数,_自然数を含む条件),!. '診断: 自然数を得る'(Line,_自然数を含む条件,_自然数) :- \+((atom_to_term(Line,_自然数,_),integer(_自然数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]), fail. '診断: 自然数を得る'(end_of_file,end_of_file) :- !. '診断: 自然数を得る'('',_) :- !,fail. '診断: 自然数を含む条件'(_自然数,_自然数を含む条件) :- call(_自然数を含む条件),!. '診断: 自然数を含む条件'(_自然数,_自然数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_自然数,_自然数を含む条件]), fail. 自然数を得る(_催促文,_自然数を含む条件,_自然数) :- 自然数を得る(user_input,_催促文,_自然数を含む条件,_自然数). 自然数を得る(_催促文,_自然数) :- 自然数を得る(user_input,_催促文,true,_自然数). 自然数を得る(_自然数) :- 自然数を得る(user_input,'',true,_自然数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). n個の自然数を得る(_n,_催促文,_自然数ならび) :- length(_自然数ならび,_n), findall(_自然数,( 部分ならび(_自然数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 自然数を得る(_催促文,_自然数)), _自然数ならび). 自然数(_自然数) :- integer(_自然数), _自然数 >= 0. 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. . % 以下のサイトは # # 実数を入力する場合の一般型 # 実数を得る(Instream,_催促文ならび,_実数を含む条件,_実数ならび) :- list(_催促文ならび), findall(_実数,( member(_催促文,_催促文ならび), 実数を得る(Instream,_催促文,_実数を含む条件,_実数)), _実数ならび),!. 実数を得る(Instream,_催促文,_実数を含む条件,_実数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 実数を得る'(Line,_実数を含む条件,_実数),!. 実数を得る(Instream,_催促文,_実数を含む条件,_実数) :- 実数を得る(Instream,_催促文,_実数を含む条件,_実数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). '診断: 実数を得る'('',_実数を含む条件,_実数) :- !,fail. '診断: 実数を得る'(end_of_file,_実数を含む条件,end_of_file) :- !. '診断: 実数を得る'(Line,_実数を含む条件,_実数) :- atom_to_term(Line,_実数,_), float(_実数), '診断: 実数を含む条件'(_実数,_実数を含む条件),!. '診断: 実数を得る'(Line,_実数を含む条件,_実数) :- \+((atom_to_term(Line,_実数,_),float(_実数))), writef('入力された %t からは実数が得られません。再入力をお願いします。\n',[Line]), fail. '診断: 実数を含む条件'(_実数,_実数を含む条件) :- call(_実数を含む条件),!. '診断: 実数を含む条件'(_実数,_実数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_実数,_実数を含む条件]),!, fail. 実数を得る(_催促文,_実数を含む条件,_実数) :- 実数を得る(user_input,_催促文,_実数を含む条件,_実数). 実数を得る(_催促文,_実数) :- 実数を得る(user_input,_催促文,true,_実数). 実数を得る(_実数) :- 実数を得る(user_input,'',true,_実数). n個の実数を得る(_n,_催促文,_実数ならび) :- length(_実数ならび,_n), findall(_実数,( 部分ならび(_実数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 実数を得る(_催促文,_実数)), _実数ならび). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. . % 以下のサイトは # # 整数を入力する場合の一般型 # 整数を得る(Instream,_催促文ならび,_整数を含む条件,_整数ならび) :- list(_催促文ならび), findall(_整数,( member(_催促文,_催促文ならび), 整数を得る(Instream,_催促文,_整数を含む条件,_整数)), _整数ならび),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 整数を得る'(Line,_整数を含む条件,_整数),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 整数を得る(Instream,_催促文,_整数を含む条件,_整数). '診断: 整数を得る'(end_of_file,_整数を含む条件,end_of_file) :- !. '診断: 整数を得る'('',_,_) :- !,fail. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), '診断: 整数を含む条件'(_整数,_整数を含む条件),!. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- \+((atom_to_term(Line,_整数,_),integer(_整数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]), fail. '診断: 整数を得る'(end_of_file,end_of_file) :- !. '診断: 整数を得る'('',_) :- !,fail. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- call(_整数を含む条件),!. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_整数,_整数を含む条件]), fail. 整数を得る(_催促文,_整数を含む条件,_整数) :- 整数を得る(user_input,_催促文,_整数を含む条件,_整数). 整数を得る(_催促文,_整数) :- 整数を得る(user_input,_催促文,true,_整数). 整数を得る(_整数) :- 整数を得る(user_input,'',true,_整数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). n個の整数を得る(_n,_催促文,_整数ならび) :- length(_整数ならび,_n), findall(_整数,( 部分ならび(_整数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 整数を得る(_催促文,_整数)), _整数ならび). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. . % 以下のサイトは # # 数を入力する場合の一般型 # 数を得る(Instream,_催促文ならび,_数を含む条件,_数ならび) :- list(_催促文ならび), findall(_数,( member(_催促文,_催促文ならび), 数を得る(Instream,_催促文,_数を含む条件,_数)), _数ならび),!. 数を得る(Instream,_催促文,_数を含む条件,_数) :- 催促文の出力(_催促文), 行入力(Instream,Line), '診断: 数を得る'(Line,_数を含む条件,_数),!. 数を得る(Instream,_催促文,_数を含む条件,_数) :- 数を得る(Instream,_催促文,_数を含む条件,_数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). '診断: 数を得る'(end_of_file,_,end_of_file) :- !. '診断: 数を得る'('',_,_) :- !,fail. '診断: 数を得る'(Line,_数を含む条件,_数) :- read_term_from_atom(Line,_数,[variable_names=_variable_names,variables=_variables]), 数である(_数), '診断: 数を含む条件'(_数,_数を含む条件),!. '診断: 数を得る'(Line,_数を含む条件,_数) :- \+((atom_to_term(Line,_数,_),number(_数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]),!, fail. 数である(_数) :- number(_数),!. 数である(_分子 rdiv _分母) :- 数である(_分子), 数である(_分母). '診断: 数を含む条件'(_数,_数を含む条件) :- call(_数を含む条件),!. '診断: 数を含む条件'(_数,_数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_数,_数を含む条件]),!, fail. 数を得る(_催促文,_数を含む条件,_数) :- 数を得る(user_input,_催促文,_数を含む条件,_数). 数を得る(_催促文,_数) :- 数を得る(user_input,_催促文,true,_数). 数を得る(_数) :- 数を得る(user_input,'',true,_数). n個の数を得る(_n,_催促文,_数ならび) :- length(_数ならび,_n), findall(_数,( 部分ならび(_数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 数を得る(_催促文,_数)), _数ならび). 行入力(_行) :- read_line_to_codes(current_input,Codes), atom_chars(_行,Codes). 行入力(_入力ストリーム,_行) :- read_line_to_codes(_入力ストリーム,Codes), atom_chars(_行,Codes). get_line(X) :- read_line_to_codes(current_input,Codes), atom_chars(X,Codes). list([_|_]) :- !. list([]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1244449887/615 # # [1] 授業単元: C初心者コース # [2] 問題文(含コード&リンク):試験の点数(100点満点)を入力すると、評価値(A+,A,B,C,F)を表示する # プログラムを作れ90〜100A+80〜89A70〜79B60〜69C0〜59Fそれ以外error # [3] 環境 # [3.1]linux # [3.2] gcc # [3.3]C # [4]6月19日 # [5]if文(gotoは論外)while do while for等 ループ文を使ってはいけないそうです 評価値(_点数,'A+') :- _点数>=90,_点数=<100. 評価値(_点数,'A') :- _点数>=80,_点数=<89. 評価値(_点数,'B') :- _点数>=70,_点数=<79. 評価値(_点数,'C') :- _点数>=60,_点数=<69. 評価値(_点数,'F') :- _点数>=0,_点数=<59. 評価値(_,error). '試験の点数(100点満点)を入力すると、評価値(A+,A,B,C,F)を表示する' :- '試験の点数(100点満点)を入力すると'(_試験の点数), 評価値を表示する(_試験の点数). '試験の点数(100点満点)を入力すると'(_試験の点数) :- write('試験の点数を入力してください : '), 行入力(_行), '試験の点数(100点満点)を入力診断'(_行,_試験の点数),!. '試験の点数(100点満点)を入力すると'(_試験の点数) :- '試験の点数(100点満点)を入力すると'(_試験の点数). '試験の点数(100点満点)を入力診断'(_行,_試験の点数) :- atom_to_term(_行,_試験の点数,_), 試験の点数は整数で0点以上100点以下(_試験の点数),!. '試験の点数(100点満点)を入力診断'(_行,_試験の点数) :- writef('入力された %t からは適切な試験の点数が得られません。再入力をお願いします。\n',[_行]), fail. 試験の点数は整数で0点以上100点以下(_試験の点数) :- integer(_試験の点数), _試験の点数>=0, _試験の点数=<100,!. 評価値を表示する(_試験の点数) :- 評価値(_試験の点数,_評価値), writef('入力した試験の点数は %t,その評価値は %t です\n',[_試験の点数,_評価値]). % 鍵値が範囲指定のときは、鍵の引数は変数にして置く。同時に二つ以上の具体的な値は表現できない。 % 評価値は英大文字から始まっているので変数と区別するためシングルクォーツで囲う。 % 一般に入力は不適切な文字列が入力されることも考慮する。ここでは、適切な入力が得られるまで、 % 繰り返し入力を促す例を示した。これが一般的な対応。 % read/1を使わないのは、入力の最後にピリオドが必要になるから。実務では受け入れられない。 % 文字列から整数を得るのにはatom_to_term/3を使う。第三引数は使わないためアンダースコアになっている。 行入力(_行) :- get_char(_文字), 行末まで読み込む(_文字,_行末までの文字ならび), atom_chars(_行,_行末までの文字ならび). 行末まで読み込む(end_of_file,[]) :- !. 行末まで読み込む('\n',[]) :- !. 行末まで読み込む(_文字,[_文字|R]) :- get_char(_次の文字), 行末まで読み込む(_次の文字,R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1244449887/514 # #[1]授業単元:プログラミング演習1 # #[2]問題文:画面より入力した成績データをファイルに登録する。 # 画面より入力する項目は以下のとおり。 # ・生徒コード、数字6桁、数字であること。 # ・氏名、文字列20文字、1字以上、20字以内 # ・国語(点数)、数字3桁、数字であること、0<=点数<=100 # ・算数(点数)、国語と同じ # ・社会(点数)、国語、算数と同じ # # # 生徒コードに999999が入力されたら終了する。 t206(_登録ファイル) :- 入力情報検査の書き方学習のための情報登録プログラム(_登録ファイル). 入力情報検査の書き方学習のための情報登録プログラム(_登録ファイル) :- open(_登録ファイル,write,Output), repeat, 一人分の生徒情報を得る(_個人データ,_入力検査結果), 個人情報を登録する(Output,_個人データ,_入力検査結果), _入力検査結果 = end_of_file, close(Output),!. 個人情報を登録する(_,_,end_of_file) :- !. 個人情報を登録する(Output,_個人データ,_入力検査結果) :- _個人データ = (_生徒コード,_氏名,_国語,_算数,_社会), write_formatted(Output,'%6d,%20s,%3d,%3d,%3d.\n',[_生徒コード,_氏名,_国語,_算数,_社会]), write_formatted('書き込んだデータ=%6d,%20s,%3d,%3d,%3d.\n',[_生徒コード,_氏名,_国語,_算数,_社会]). 一人分の生徒情報を得る(_個人データ,_入力検査結果) :- repeat, write('生徒コード,氏名,国語点数,算数点数,社会点数をカンマで区切り入力しなさい(最後は.で終わる)\n'), read(_個人データ), 一人分の情報入力検査(_個人データ,_入力検査結果),!. 一人分の情報入力検査(999999,end_of_file) :- !. 一人分の情報入力検査(_個人データ,_入力検査結果) :- 入力項目検査(_個人データ,_入力検査結果), 一人分の情報入力終了検査(_入力検査結果),!. 一人分の情報入力終了検査(end_of_file) :- !. 一人分の情報入力終了検査([]) :- !. 一人分の情報入力終了検査(L) :- 入力エラー理由の表示(L), write_formatted('%t\n',[再入力が必要です]), fail. 入力項目検査((_生徒コード,_氏名,_国語,_算数,_社会),_入力検査結果) :- 生徒コード入力検査(_生徒コード,[],L1), 氏名入力検査(_氏名,L1,L2), 点数科目入力検査(国語,_国語,L2,L3), 点数科目入力検査(算数,_算数,L3,L4), 点数科目入力検査(社会,_社会,L4,_入力検査結果),!. 入力項目入力検査(_入力されたデータ,_入力検査結果) :- _入力検査結果=[[入力項目の形式に誤りがあります,_入力されたデータ]],!. 生徒コード入力検査(_生徒コード,L,L) :- integer(_生徒コード), _生徒コード>=100000,_生徒コード<999999,!. 生徒コード入力検査(_生徒コード,L,[[生徒コードが整数でありません,_生徒コード]|,L) :- not(integer(_生徒コード)),!. 生徒コード入力検査(_生徒コード,L,[end_of_fileの認識用に使ってしまっているコードです,_生徒コード]|L]) :- integer(_生徒コード), _生徒コード=999999,!. 生徒コード入力検査(_生徒コード,L,[生徒コードが小さすぎます,_生徒コード]|L]) :- integer(_生徒コード), _生徒コード<100000,!. 生徒コード入力検査(_生徒コード,L,[生徒コードが大きすぎます,_生徒コード]|L]) :- integer(_生徒コード), _生徒コード>999999,!. 氏名入力検査(_氏名,L,L) :- atom(_氏名), atom_length(_氏名,_氏名の長さ), _氏名の長さ>=1,_氏名の長さ=<20,!. 氏名入力検査(_氏名,L,[[氏名がアトムでありません,_氏名]|L]) :- not(atom(_氏名)),!. 氏名入力検査(_氏名,L,[[氏名が有効な文字ではありません,_氏名]|L]) :- atom(_氏名), atom_length(_氏名,_氏名の長さ), _氏名の長さ<1,!. 氏名入力検査(_氏名,L,[[氏名の文字数が多すぎます,_氏名]|L]) :- atom(_氏名), atom_length(_氏名,_氏名の長さ), _氏名の長さ>20,!. 点数科目入力検査(_科目,_点数,L,L) :- integer(_科目), _点数 >= 0, _点数 =< 100,!. 点数科目入力検査(_科目,_点数,L,[[S,_点数]|L]) :- not(integer(_科目)), atom_concat(_科目,の点数が整数ではありません,S),!. 点数科目入力検査(_科目,_点数,L,[[S,_点数]|L]) :- integer(_科目), _科目<0, atom_concat(_科目,の点数が負数です,S),!. 点数科目入力検査(_科目,_点数,L,[[S,_点数]|L]) :- not(integer(_科目)),!, _点数>100, atom_concat(_科目,の点数が100点より大きくなっています,S),!. 入力エラー理由の表示(L) :- reverse(L,L2), member([A,B],L2), write_formatted('%t,%t\n',[A,B]), fail. 入力エラー理由の表示(_). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1244449887/481 # # [1] 授業単元:ソフトウェア演習C # [2] 問題文: # 文書ないのすべての単語とその単語の頻度をメンバとして持つ構造体を定義し、 # この構造体へのポインタをノードの値として持つ二分木のノードを定義せよ # # 次に、任意のノードはその左の部分木にはそのノードの単語より辞書順で # 小さい単語のみがあり、その右の部分木にはより大きい単語のみがあるように # 保持される。 # 新たに単語がすでに木にあるかどうかを探すには、ルート(根元)から出発して # そのノードに格納されている単語と新しい単語を比較する。 # 二つが一致したら、それで良い。 # 新しい単語が木の単語より小さいときは、探索は左の子供に対して続けられ、 # そうでなければ右の子供が調べられる。 # 求める方向に子供がないときは、新しい単語は木の中にはないと言うことであり、 # また実際にはその子供のないところがそれを置く場所である。 # このプロセスは再帰的である必要があり、単語の挿入を行うadd_word()関数を # 定義せよ。 # この関数は再帰的に呼ばれて、左または右の部分木に振り分けられる。 # 単語は木の中の単語と一致する(その場合カウント(頻度)がインクリメントされる)か、 # あるいはノードを作成し、木に加えなければならないことを示すヌル・ポインタと # 出会う。 # 新たにノードが生成されると、この関数ではそのノードへのポインタが返され、 # 親ノードに埋め込まれる。 # この関数を利用し、以下のテキストをコマンド実行時の引数として与えられた # ファイルを入力して二分探索木を生成し、単語と頻度のリストを表示する # プログラムを作成せよ。 # # 文章: ファイル名:test.txt # University was founded in April 1998 at Iwate, # which is situated in the northeastern part of Japan. # University consists of four faculties Software and Information Science, # Nursing, Social Welfare, # and policy Studies, and additionally other educational supporut centers. 二分木に情報と頻度を保持する :- get_chars('test.txt',Chars), chars_split(Chars,[' ',',','.'],WordList), 木作成(WordList). 情報と頻度を保持した二分木の昇順表示 :- 二分木から値と頻度を取り出す(1,_頻度付きの値ならび), member([_語,_頻度],_頻度付きの値ならび), write_formatted('語彙=%t,頻度=%t\n',[_語,_頻度]), fail; true. 木作成(_ならび) :- abolish(節/5), 節作成(_ならび,1,1,_). 木作成([],_,_,_). 木作成([_値|R],_節,_開始節番号,_次の節番号) :- to_lower(_値,_小文字化した値), 節作成(_小文字化した値,_節,_開始節番号,_受取節番号), 木作成(R,_節,_受取節番号,_次の節番号). 節作成(_値,_節,_受取節番号,_次の節番号) :- not(節(_節,_,_,_,_)), _左 is _受取節番号+1, _右 is _受取節番号+2, _次の節番号 is _受取節番号+3, assertz(節(_節,_左,_右,_値,1)),!. 節作成(_値,_節,_受取節番号,_次の節番号) :- 節(_節,_左,_右,_値2,_), _値 @< _値2, 節作成(_値,_左,_受取節番号,_次の節番号). 節作成(_値,_節,_受取節番号,_次の節番号) :- 節(_節,_左,_右,_値2,_), _値 @> _値2 , 節作成(_値,_右,_受取節番号,_次の節番号). 節作成(_値,_節,_受取節番号,_次の節番号) :- 節(_節,_左,_右,_値2,_頻度), _値 = _値2 , _頻度2 is _頻度 + 1, retract(節(_節,_左,_右,_値2,_頻度)), assertz(節(_節,_左,_右,_値2,_頻度2)). 二分木から値と頻度を取り出す(_節,_頻度付きの値ならび) :- findall([_値,頻度],二分木から値と頻度を取り出す(_節,_,_値,_,_頻度),_頻度付きの値ならび). 二分木から値と頻度を取り出す(_節,_値1,_値,_頻度1,_頻度) :- 節(_節,_左,_,_値2,_,_頻度2), 二分木から値と頻度を取り出す(_左,_値2,_値,_頻度2,_頻度). 二分木から値と頻度を取り出す(_節,_値1,_値,_頻度1,_頻度) :- 節(_節,_,_右,_値2,_頻度2), 二分木から値と頻度を取り出す(_右,_,_値,_,_頻度). 二分木から値と頻度を取り出す(_節,_値1,_値,_頻度1,_頻度) :- not(var(_値1)), not(var(_頻度1)), _値1=_値, _頻度1=_頻度. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_chars(File,Chars) :- open(File,read,Input), findall(X,(repeat,get_char(Input,X),(X=end_of_file,!,fail;true)),Chars), close(Input). concat_atom([A],Sep,[A]) :- !. concat_atom([A|R],Sep,X) :- concat_atom(R,Sep,Y), atom_concat(A,Sep,Y1), atom_concat(Y1,Y,X). chars_split(L,SeparatesL,WordsList) :- split_1(L,SeparatesL,WordsList),!. split_1([],SeparatersL,[]). split_1(L1,SeparatersL,[A|R]) :- not(L1=[]), split_2(L1,SeparatersL,L2,R2), not(L2=[]), atom_chars(A,L2), split_1(R2,SeparatersL,R). split_1(L1,SeparatersL,X) :- not(L1=[]), split_2(L1,SeparatersL,L2,R2), L2=[], split_1(R2,SeparatersL,X). split_2([],_,[],[]). split_2(L1,SeparatersL,[],R) :- member(L2,SeparatersL), append(L2,R,L1). split_2([A|R1],SeparatersL,[A|R2],R) :- not((member(L2,SeparatersL),append(L2,_,[A|R1]))), split_2(R1,SeparatersL,R2,R). 区切り語ならびの変形(_区切り語ならび,_降順の区切り文字ならびのならび) :- sort(_区切り語ならび,_昇順の区切り語ならび), reverse(_昇順の区切り語ならび,_降順の区切り語ならび), atomList2charsList(_降順の区切り語ならび,_降順の区切り文字ならびのならび). atomList2charsList([],[]) :- !. atomList2charsList([A|R1],[L|R2]) :- atom_chars(A,L), atomList2charsList(R1,R2). % 以下のサイトは データを追加する度に整列する(L) :- get_line(Line), データを追加する度に整列する(Line,[],L). データを追加する度に整列する(end_of_file,_,_) :- !,fail. データを追加する度に整列する(Line,L1,L) :- データを挿入する(Line,L1,L). データを追加する度に整列する(Line,L1,L) :- データを挿入する(Line,L1,L2), get_line(Line2), データを追加する度に整列する(Line2,L2,L). データを挿入する(A,[],[A]) :- !. データを挿入する(A,[B|R],[A,B|R]) :- A @=< B,!. データを挿入する(A,[B|R1],[B|R2]) :- A @> B,データを挿入する(A,R1,R2),!. % 以下のサイトは ===ヒープソート=== ヒープソートはメモリ上のスタックやヒープ領域に木構造を構築することによってソートを実現する。ここでは、標準入力ファイルから整数列が与えられたものを、引数上(スタック上)に木構造を成長させて、読み込みを終了したら、昇順に整列された値を取り出すことのできる述語 ヒープソートを定義してみる。 ヒープソート(_木構造) :- read(_整数), ヒープソート(_整数,[],_木構造). ヒープソート(end_of_file,_木構造,_木構造) :- !. ヒープソート(_整数,_木構造_1,_木構造) :- 挿入(_整数,_木構造_1,_木構造_2), read(_整数_2), ヒープソート(_整数_2,_木構造_2,_木構造). 挿入(_整数,[],_木構造) :- 木構造(_整数,[],[],_木構造). 挿入(_整数,_木構造_1,_木構造_2) :- 木構造(_値,_左部分木_1,_右部分木_1,_木構造_1), 挿入(_整数,_値,_左部分木_1,_右部分木_1,_左部分木_2,_右部分木_2), 木構造(_値,_左部分木_2,_右部分木_2,_木構造_2). 挿入(_整数,_値,_左部分木_1,_右部分木,_左部分木_2,_右部分木) :- _整数 =< _値, 挿入(_整数,_左部分木_1,_左部分木_2). 挿入(_整数,_値,_左部分木,_右部分木_1,_左部分木,_右部分木_2) :- _整数 > _値, 挿入(_整数,_右部分木_1,_右部分木_2). 木構造(_値,_左部分木,_右部分木,_木構造) :- functor(_木構造,木,3), arg(1,_木構造,_値), arg(2,_木構造,_左部分木), arg(3,_木構造,_右部分木). 次に、end_of_fileで構築が終った木構造から順に昇順に値を取り出す非決定性の述語 ヒープからの昇順取り出し/2 を定義し、それを使って昇順に整列したリストを取り出す。 ヒープからの昇順取り出し(_木構造,_値) :- 木構造(_,_左部分木,_右部分木,_木構造), ヒープからの昇順取り出し(_左部分木,_値). ヒープからの昇順取り出し(_木構造,_値) :- 木構造(_値,_,_,_木構造). ヒープからの昇順取り出し(_木構造,_値) :- 木構造(_,_左部分木,_右部分木,_木構造), ヒープからの昇順取り出し(_右部分木,_値). ヒープからの昇順リスト(_木構造,_昇順に整列したリスト) :- findall(_値,ヒープから昇順取り出し(_木構造,_値),_昇順に整列したリスト). % 以下のサイトは % 課題1 ターミナルから日本円の金額を読み込み,これをドルとユーロに変換して表示するプログラムを作成しなさい.  %    作成にあたっては,下図の構造体を用い,為替レートは図に示された初期値を用いなさい. % % struct rate { // 外国為替レート % double to_yen; // 対円 % double to_dollar; // 対ドル % double to_euro; // 対ユーロ % }; % % struct rate yen = {1.0, 0.0104, 0.007347,}; % /* 1$=96.15円, 1EURO=136.11円の場合の,各国通貨に対する円の為替レート */ % % % % 課題2 ターミナルから一文字を読み込み,それが'e'の場合は英語の国名を出力し,'f'の場合はフランス語で国名を出力する %    プログラムを作成しなさい.ただし,国名を格納した変数は下図に示すものを用いること. % % #define SLENGTH 20 % #define COUNTRIES 5 % % struct nation { % char en[SLENGTH]; /* 国名(英語) */ % char fr[SLENGTH]; /* 国名(仏語) */ % }; % % struct nation country[COUNTRIES] = { /* 国名の初期化 */ % {"Japan", "Japon", }, // 日本 % {"France", "France",}, // フランス % {"Germany", "Allemagne",}, // ドイツ % {"Spain", "Espagne",}, // スペイン % {"Italy", "Italie",}, // イタリア % }; % % % 課題3 氏名,身長,体重を収めるリストを構造体で作成し,BMI指数により標準体型と見なされる人の氏名とBMI指数を出力する %    プログラムを作成せよ. % %     ・登録できる人数の上限を16人とし,登録者数を入力してから,各人のデータを入力する. %     ・構造体の各要素は,name(氏名),height(身長),weight(体重)とする. %     ・氏名は,30文字以内とし,スペースを含まない. %     ・身長の単位は[cm],体重の単位は[Kg]とする. %     ・各項目は<スペース>で区切られて入力される. %     ・各項目は<スペース>で区切られて出力される. % % 課題1 対円レート(1.0, 0.0104, 0.007347). 外国為替レート(_円,_ドル,_ユーロ) :- 対円レート(_, _対ドル, _対ユーロ), not(var(_円)), _ドル is _円 * _対ドル, _ユーロ is _円 * _対ユーロ. % 課題2 課題2 :- read(X), 課題2_1(X). 課題2_1(e) :- country(L), member([Country,_],L), write(Country),nl, fail. 課題2_1(f) :- country(L), member([_,Country],L), write(Country),nl, fail. 課題2_1(_). country([['Japan', 'Japon'], % 日本 ['France', 'France'], % フランス ['Germany', 'Allemagne'], % ドイツ ['Spain', 'Espagne'], % スペイン ['Italy', 'Italie']]). % イタリア % 課題3 データ入力 :- abolish(個人データ/0), 構造体生成(_構造体1), read(X), split(X,[' '],[_名前,_身長,_体重]), データ入力(_名前,_身長,_体重,_構造体1,_構造体2), assertz(個人データ(_構造体2)), 'BMI標準メンバーの表示. 'BMI標準メンバーの表示' :- 個人データ(_構造体), member([_名前1,_身長1,_体重1],_構造体), 'BMI判定'(_身長1,_体重1,BMI,普通です), wr('%t %t %t %t\n',[_名前1,_身長1,_体重1,BMI]), fail; true. データ入力(end_of_file,_構造体,_構造体) :- !. データ入力(_入力行,_構造体1,_構造体) :- split(_入力行,[' '],[_名前,_身長,_体重]), sub_atom(_名前,0,30,_,_名前1), 構造体更新(_氏名,_身長1,_体重,_構造体1,_構造体2), read(X), データ入力(X,_構造体2,_構造体). 構造体生成([]). 構造体更新(_名前,_身長,_体重,_更新前,_更新後) :- length(_更新前,Len), Len < 16, _更新後=[[名前(_名前),身長(_身長),体重(_体重)]|_更新前]. 構造体更新(_名前,_身長,_体重,_,_) :- write('登録者がすでに16名います\n追加できません\n'). 'BMI判定'(_身長,_体重,BMI,_判定) :- BMI is _体重/_身長/_身長*10000, 'BMI判定'(BMI,_判定). 'BMI判定'(BMI,やせてます) :- BMI =< 18.5. 'BMI判定'(BMI,普通です) :- BMI > 18.5,BMI < 25.0. 'BMI判定'(BMI,レッツエクササイズ!) :- BMI >= 25.0. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1244449887/159 # # 出典:: http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9419.txt # '課題1-4'(File,X) :- open(File,read,Input), get_char(Input,C), '課題1-4'(Input,C,[],Y), close(Input), sort(Y,X). '課題1-4'(_,end_of_file,X,X) :- !. '課題1-4'(Input,_受取文字,受取リスト,X) :- _受取文字 @>= ' ', _受取文字 @=< z, to_upper(_受取文字,_大文字化した文字), 鍵と対の値に1を加える(_大文字化した文字,_受取リスト,_更新されたリスト), get_char(Input,_次の文字), '課題1-4'(Input,_次の文字,_更新されたリスト,X). 鍵と対の値に1を加える(Key,L,X) :- append(L1,[[Key,V]|L2],L), V2 is V + 1, append(L1,[[Key,V2]|L2],X),!. 鍵と対の値に1を加える(Key,L,[[Key,1]|L]). % 以下のサイトは # 出典:: 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). % 以下のサイトは get_integer(N) :- get_line(Line), get_integer_1(Line,N),!. get_integer(Input,N) :- get_line(Input,Line), get_integer_1(Input,Line,N),!. get_integer_1(end_of_file,_) :- !,fail. get_integer_1(Line,N) :- atom_to_term(Line,N,_), integer(N),!. get_integer_1(_,N) :- get_line(Line), get_integer_1(Line,N). get_integer_1(_,end_of_file,_) :- !,fail. get_integer_1(Input,Line,N) :- atom_to_term(Line,N,_), integer(N),!. get_integer_1(Input,_,N) :- get_line(Input,Line), get_integer_1(Input,Line,N).