このディレクトリの索引

% 以下のサイトは :- 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)). :- op(800,xfx,(::)). :- op(850,fx,(!)). exec(P) :- catch(P,E,fail). サーバ :- サーバ(6013). サーバ(Port) :- tcpソケットの準備(Socket,Port), 接続されたらソケットを開く(Socket, AcceptFd, _), tcpインタプリタ(AcceptFd). tcpソケットの準備(Socket,Port) :- tcp_socket(Socket), tcp_bind(Socket, Port), tcp_listen(Socket, 5). 接続されたらソケットを開く(AcceptFd,Socket,_Peer,In,Out) :- tcp_accept(AcceptFd, Socket, _Peer), tcp_open_socket(Socket, In, Out). 一行読み出し項に変換(In,Line,_項,E1) :- 行入力(In,Line), catch(read_term_from_atom(Line,_項,[]),E1,_項 = false). tcpインタプリタ(AcceptFd) :- repeat, 行を読みだして実行(AcceptFd), fail. 行を読みだして実行(AcceptFd) :- 接続されたらソケットを開く(AcceptFd,Socket,_Peer,In,Out), 一行読み出し項に変換(In,Line,_項,E1), 親タスクで実行(In,Out,_項), 小タスクで実行(Socket,In,Out,_項). 親タスクで実行(In,Out,_項) :- 親タスクで実行(In,Out,_項,E), fail. 親タスクで実行(In,Out,_項) :- \+(_項 = findall(_,exec(_),_)). 親タスクで実行(In,Out,_項,E) :- _項 = findall(_,exec(_),_), catch(_項,E,fail), 情報を送信する(Out,_項), ストリームを閉じる(In,Out). 小タスクで実行(Socket,In,Out,_項) :- thread_create(項を実行して結果を返す(In, Out, _項),_,[]). 項を実行して結果を返す(In, Out, _項) :- ( catch(_項,E2,エラー情報の送信(Out,E2)); _項=false),!, 情報を送信する(Out,_項), ストリームを閉じる(In,Out). クライアント(Host, Port, _項) :- 項にfindallを被せて目標として送信する(Host,Port,_項,Socket,ReadFd,WriteFd), 行入力(ReadFd,Line2), catch(read_term_from_atom(Line2,_項2,[]),E,(ストリームを閉じる(ReadFd,WriteFd),fail)), ストリームを閉じる(ReadFd,WriteFd), 送信項と受信項の単一化(_項,_項2). 項にfindallを被せて目標として送信する(Host,Port,_項,Socket,ReadFd,WriteFd) :- サーバと接続する(Host, Port,Socket), tcp_open_socket(Socket, ReadFd, WriteFd), 情報を送信する(WriteFd,_項). サーバと接続する(Host, Port,Socket) :- tcp_socket(Socket), tcp_connect(Socket, Host:Port). (! P) :- (keizo97:6013 :: P). Network:Port :: P :- クライアント(Network,Port,findall(P,P,L)), 全解を取り出す(P,L). 全解を取り出す(P,L) :- member(P,L). 行入力(In,Line) :- read_line_to_codes(In,Codes), atom_codes(Line,Codes). エラー情報の送信(Out,E) :- write(E),nl, writeq(Out,E), write(Out,'\n'). 情報を送信する(Out,_項) :- 項を文字列に変換する(_項,_文字列), 書き出す(Out,_文字列). 書き出す(Out,_文字列) :- write(Out,_文字列), write(Out,'\n'), flush_output(Out). 項を文字列に変換する(_項,_文字列) :- swritef(String,'%t',[_項]), string_to_atom(String,_文字列). ストリームを閉じる(In,Out) :- close(In), close(Out). 送信項と受信項の単一化(_項,_項). % 以下のサイトは :- use_module(library(socket)). :- op(800,xfx,(::)). :- op(850,fx,(!)). exec(P) :- catch(P,E,fail). サーバ :- サーバ(6013). サーバ(Port) :- tcpソケットの準備(Socket,Port), 接続されたらソケットを開く(Socket, AcceptFd, _), tcpインタプリタ(AcceptFd). tcpソケットの準備(Socket,Port) :- tcp_socket(Socket), tcp_bind(Socket, Port), tcp_listen(Socket, 5). 接続されたらソケットを開く(AcceptFd,Socket,_Peer,In,Out) :- tcp_accept(AcceptFd, Socket, _Peer), tcp_open_socket(Socket, In, Out). 一行読み出し項に変換(In,Line,_項,E1) :- 行入力(In,Line), catch(read_term_from_atom(Line,_項,[]),E1,_項 = false). tcpインタプリタ(AcceptFd) :- repeat, 行を読みだして実行(AcceptFd), fail. 行を読みだして実行(AcceptFd) :- 接続されたらソケットを開く(AcceptFd,Socket,_Peer,In,Out), 一行読み出し項に変換(In,Line,_項,E1), 親タスクで実行(In,Out,_項), 小タスクで実行(Socket,In,Out,_項). 親タスクで実行(In,Out,_項) :- 親タスクで実行(In,Out,_項,E), fail. 親タスクで実行(In,Out,_項) :- \+(_項 = findall(_,exec(_),_)). 親タスクで実行(In,Out,_項,E) :- _項 = findall(_,exec(_),_), catch(_項,E,fail), 情報を送信する(Out,_項), ストリームを閉じる(In,Out). 小タスクで実行(Socket,In,Out,_項) :- fork(Pid), ( Pid == child -> 項を実行して結果を返す(In, Out, _項), ストリームを閉じる(In,Out), halt; tcp_close_socket(Socket) ). 項を実行して結果を返す(In, Out, _項) :- ( catch(_項,E2,エラー情報の送信(Out,E2)); _項=false),!, 情報を送信する(Out,_項). クライアント(Host, Port, _項) :- 項にfindallを被せて目標として送信する(Host,Port,_項,Socket,ReadFd,WriteFd), 行入力(ReadFd,Line2), catch(read_term_from_atom(Line2,_項2,[]),E,(ストリームを閉じる(ReadFd,WriteFd),fail)), ストリームを閉じる(ReadFd,WriteFd), 送信項と受信項の単一化(_項,_項2). 項にfindallを被せて目標として送信する(Host,Port,_項,Socket,ReadFd,WriteFd) :- サーバと接続する(Host, Port,Socket), tcp_open_socket(Socket, ReadFd, WriteFd), 情報を送信する(WriteFd,_項). サーバと接続する(Host, Port,Socket) :- tcp_socket(Socket), tcp_connect(Socket, Host:Port). (! P) :- (keizo97:6013 :: P). Network:Port :: P :- クライアント(Network,Port,findall(P,P,L)), 全解を取り出す(P,L). 全解を取り出す(P,L) :- member(P,L). 行入力(In,Line) :- read_line_to_codes(In,Codes), atom_codes(Line,Codes). エラー情報の送信(Out,E) :- write(E),nl, writeq(Out,E), write(Out,'\n'). 情報を送信する(Out,_項) :- 項を文字列に変換する(_項,_文字列), 書き出す(Out,_文字列). 書き出す(Out,_文字列) :- write(Out,_文字列), write(Out,'\n'), flush_output(Out). 項を文字列に変換する(_項,_文字列) :- swritef(String,'%t',[_項]), string_to_atom(String,_文字列). ストリームを閉じる(In,Out) :- close(In), close(Out). 送信項と受信項の単一化(_項,_項). % 以下のサイトは # [1] 授業単元: 基礎プログラミング # [2] 問題文(含コード&リンク): # いま、要素数Nのならび(リスト)に整数がセットされている。 # # 1) 直前・直後の要素が存在し、それら2つの値の平均よりも大きな値を # 持つ要素をすべて印字する。 # 2) ならびからi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が # 等しいとき、iをを印字する。 # ただし出力される要素位置は重複しないこと。 :- op(500,xfx,すべて). P すべて Q :- forall(P,Q). '直前・直後のならび要素が存在し、それら2つの値の平均よりも大きな値を持つ要素をすべて印字する'(_ならび) :- '直前・直後のならび要素が存在し、それら2つの値の平均よりも大きな値を持つ要素を'(_ならび,_現在の要素) すべて 印字する(_現在の要素). '直前・直後のならび要素が存在し、それら2つの値の平均よりも大きな値を持つ要素を'(_ならび,_現在の要素) :- '直前・直後のならび要素が存在する現在の要素は'(_ならび,_直前の要素,_現在の要素,_直後の要素), '直前・直後の値の平均よりも大きな値を持つ'(_直前の要素,_現在の要素,_直後の要素). '直前・直後のならび要素が存在する現在の要素は'(_ならび,_直前の要素,_現在の要素,_直後の要素) :- append([_,[_直前の要素,_現在の要素,_直後の要素],_],_ならび). '直前・直後の値の平均よりも大きな値を持つ'(_直前の要素,_現在の要素,_直後の要素) :- _現在の要素 * 1.0 > (_直前の要素 + _直後の要素) / 2. 印字する(_現在の要素) :- writef('%t\n',[_現在の要素]). 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が等しいとき、それらの要素の添え字のうち小さな方を印字する'(_ならび) :- forall('ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目), それらの要素の添字の小さな方を印字する(_i番目,_j番目)). 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目) :- 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、'(_ならび,_i番目,_要素の値), '末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目,_要素の値). 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、'(_ならび,_i番目,_値) :- append(L1,[_値|_],_ならび), length(L1,_i番目). '末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目,_値) :- append(L3,[_値|L4],_ならび), length(L4,_i番目), length(L3,_j番目). それらの要素の添字の小さな方を印字する(_i番目,_j番目) :- _小さな方 is min(_i番目,_j番目), writef('%w\n',[_小さな方]). % 以下のサイトは # [1] 授業単元: 基礎プログラミング # [2] 問題文(含コード&リンク): # いま、要素数Nのならび(リスト)に整数がセットされている。 # # 1) 直前・直後の要素が存在し、それら2つの値の平均よりも大きな値を # 持つ要素をすべて印字する。 # 2) ならびからi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が # 等しいとき、iをを印字する。 # ただし出力される要素位置は重複しないこと。 :- op(500,xfx,すべて). P すべて Q :- forall(P,Q). '直前・直後の配列要素が存在し、それら2つの値の平均よりも大きな値を持つ要素をすべて印字する'(_ならび) :- '直前・直後の配列要素が存在し、それら2つの値の平均よりも大きな値を持つ要素を'(_ならび,_現在の要素) すべて 印字する(_現在の要素). '直前・直後の配列要素が存在し、それら2つの値の平均よりも大きな値を持つ要素を'(_ならび,_現在の要素) :- append([_,[_直前の要素,_現在の要素,_直後の要素],_],_ならび), _現在の要素 * 1.0 > (_直前の要素 + _直後の要素) / 2. 印字する(_現在の要素) :- writef('%t\n',[_現在の要素]). 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が等しいとき、それらの要素の添え字のうち小さな方を印字する'(_ならび) :- forall('ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目), それらの要素の添字の小さな方を印字する(_i番目,_j番目)). 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目) :- 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、'(_ならび,_i番目,_要素の値), '末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目,_要素の値). 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、'(_ならび,_i番目,_値) :- append(L1,[_値|_],_ならび), length(L1,_i番目). '末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目,_値) :- append(L3,[_値|L4],_ならび), length(L4,_i番目), length(L3,_j番目). それらの要素の添字の小さな方を印字する(_i番目,_j番目) :- _小さな方 is min(_i番目,_j番目), writef('%w\n',[_小さな方]). % 以下のサイトは # 10個の桃を6人で分ける時、分け方のパターンをすべて出力する :- op(750,xfx,すべて). :- op(600,xfx,を). :- op(500,xf,で). :- op(650,xf,分ける). '10個の桃を6人で分ける時、分け方のパターンをすべて出力する' :- '10個の桃を6人で分ける時、分け方のパターンを'(_6人) すべて 出力する(_6人). '10個の桃を6人で分ける時、分け方のパターンを'(_6人) :- '10個の桃'(_10個の桃), '6人'(_6人), _10個の桃 を _6人 で 分ける. '10個の桃'([桃,桃,桃,桃,桃,桃,桃,桃,桃,桃]). '6人'([_1,_2,_3,_4,_5,_6]). 出力する(_6人) :- writef('%w, %w, %w, %w, %w, %w\n',_6人). Q1 すべて Q2 :- forall(Q1,Q2). L を LL で 分ける :- append(LL,L). % 以下のサイトは # 10個の桃を6人で分ける時、分け方のパターンをすべて出力する :- op(750,xfx,すべて). '10個の桃を6人で分ける時、分け方のパターンをすべて出力する' :- '10個の桃を6人で分ける時、分け方のパターンを'(_1,_2,_3,_4,_5,_6) すべて 出力する(_1,_2,_3,_4,_5,_6). '10個の桃を6人で分ける時、分け方のパターンを'(_1,_2,_3,_4,_5,_6) :- append([_1,_2,_3,_4,_5,_6],[桃,桃,桃,桃,桃,桃,桃,桃,桃,桃]). 出力する(_1,_2,_3,_4,_5,_6) :- writef('%w, %w, %w, %w, %w, %w\n',[_1,_2,_3,_4,_5,_6]). Q1 すべて Q2 :- forall(Q1,Q2). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 152代目 #33 # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク):1から15の数字から5個の数字を取って同じ数字が # 使われない並びの通りをすべて表示させなさい。 # 例:1 2 3 4 5 # 1 3 2 4 5 # 11 12 10 9 8 # :- op(750,xfx,すべて). '1から15の数字から5個の数字を取って同じ数字が使われない並びの通りをすべて表示させる' :- '1から15の数字から'(_1から15の数字), '5個の数字を取って同じ数字が使われない並びの通りをすべて表示させる'(_1から15の数字). '1から15の数字から'(_1から15の数字) :- findall(N,between(1,15,N),_1から15の数字). '5個の数字を取って同じ数字が使われない並びの通りをすべて表示させる'(_1から15の数字) :- 同じ数字が使われない並びの通りを(_1から15の数字,5,_同じ数字が使われない並び) すべて 表示させる(_同じ数字が使われない並び). 同じ数字が使われない並びの通りを(_1から15の数字,5,_同じ数字が使われない並び) :- 順列(_1から15の数字,5,_同じ数字が使われない並び). 表示させる(_同じ数字が使われない並び) :- atomic_list_concat(_同じ数字が使われない並び,' ',_表示文字列), writef('%w\n',[_表示文字列]). P すべて Q :- forall(P,Q). 順列(_,0,[]). 順列(L1,N,[A|L2]) :- select(A,L1,R), succ(M,N), 順列(R,M,L2). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 152代目 #33 # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク):1から15の数字から5個の数字を取って同じ数字が # 使われない並びの通りをすべて表示させなさい。 # 例:1 2 3 4 5 # 1 3 2 4 5 # 11 12 10 9 8 # :- op(750,xfx,すべて). '1から15の数字から5個の数字を取って同じ数字が使われない並びの通りをすべて表示させる' :- '1から15の数字から'(_1から15の数字), '5個の数字を取って同じ数字が使われない並びの通りをすべて表示させる'(_1から15の数字). '1から15の数字から'(_1から15の数字) :- findall(N,between(1,15,N),_1から15の数字). '5個の数字を取って同じ数字が使われない並びの通りをすべて表示させる'(_1から15の数字) :- 同じ数字が使われない並びの通りを(_1から15の数字,5,_同じ数字が使われない並び) すべて 表示させる(_同じ数字が使われない並び). 同じ数字が使われない並びの通りを(_,0,[]). 同じ数字が使われない並びの通りを(L1,N,[_数字|L2]) :- select(_数字,L1,R), succ(M,N), 同じ数字が使われない並びの通りを(R,M,L2). 表示させる(_同じ数字が使われない並び) :- atomic_list_concat(_同じ数字が使われない並び,' ',_表示文字列), writef('%w\n',[_表示文字列]). P すべて Q :- forall(P,Q). % 以下のサイトは # 出典 :: 30代を思い出してPrologで言明、質問のプログラムを書いてみた。で「太郎は男です」という言明を入れたあと、質問「太郎は男ですか」には「そうです」と返ってくるのに、「太郎は女ですか」には「分かりません」と返ってきた。「男と女は反対語」という定義を入れなければならない? # 出典 :: AZ-Prologだとnoになるので、私はそこで「分かりません」と表示するようにしましたので・・・。反対語(X,Y)みたいな述語を用意して、反対語でマッチしたら「違います」と表示し、それでもダメなら「分かりません」と表示することにしました。 :- op(700,xfx,は). (A は B) :- P =.. [B,A], call(P), write('そうです\n'). (A は B) :- P =.. [B,A], \+(call(P)), (反義語(B,C);反義語(C,B)), P2 =.. [C,A], call(P2), write('違います\n'). (A は B) :- P =.. [B,A], \+(call(P)), \+(反義語(B,C)), \+(反義語(C,B)), write('わかりません\n'). % 以下のサイトは :- op(700,xfx,は). :- op(650,xfx,が). :- op(650,xfx,以上). :- op(600,xf,以上). :- op(600,xf,以下). 別表第1(_社会保険料控除後の給与等の金額,_給与所得控除の額) :- _社会保険料控除後の給与等の金額 が 135416 以下, _給与所得控除の額 は 54167. 別表第1(_社会保険料控除後の給与等の金額,_給与所得控除の額) :- _社会保険料控除後の給与等の金額 が 135417 以上 149999 以下, _給与所得控除の額 は 切り上げ(_社会保険料控除後の給与等の金額 * 0.4). 別表第1(_社会保険料控除後の給与等の金額,_給与所得控除の額) :- _社会保険料控除後の給与等の金額 が 150000 以上 299999 以下, _給与所得控除の額 は 切り上げ(_社会保険料控除後の給与等の金額 * 0.3 + 15000). 別表第1(_社会保険料控除後の給与等の金額,_給与所得控除の額) :- _社会保険料控除後の給与等の金額 が 300000 以上 549999 以下, _給与所得控除の額 は 切り上げ(_社会保険料控除後の給与等の金額 * 0.2 + 45000). 別表第1(_社会保険料控除後の給与等の金額,_給与所得控除の額) :- _社会保険料控除後の給与等の金額 が 550000 以上 833333 以下, _給与所得控除の額 は 切り上げ(_社会保険料控除後の給与等の金額 * 0.1 + 100000). 別表第1(_社会保険料控除後の給与等の金額,_給与所得控除の額) :- _社会保険料控除後の給与等の金額 が 833334 以上 1249999 以下, _給与所得控除の額 は 切り上げ(_社会保険料控除後の給与等の金額 * 0.05 + 141667). 別表第1(_社会保険料控除後の給与等の金額,_給与所得控除の額) :- _社会保険料控除後の給与等の金額 が 1250000 以上, _給与所得控除の額 は 204167. _値 は 切り上げ(_式) :- _値 is ceiling(_式),!. _値 は _式 :- _値 is _式. A が B 以上 :- A >= B. A が B 以下 :- A =< B. A が B 以上 C 以下 :- A >= B, A =< C. % 以下のサイトは # # 横書文書を縦書文書に変形する # # 事例として、あぜといへかの万葉仮名表記部分の生成 # :- op(700,xfx,は). 横書文書を縦書文書に変形する(_横書文書,_縦書文書) :- 横書文書を縦書文書に変形する(_横書文書,0,_縦書文書). 横書文書を縦書文書に変形する(_横書文書,_列間隔文字数,_縦書文書) :- 改行を区切りに行ならびに変形する(_横書文書,_行ならび), 行ならびを縦書文書に変形する(_行ならび,_列間隔文字数,_縦書文書). 行ならびを縦書文書に変形する(_行ならび,_列間隔文字数,_縦書文書) :- 最大文字列長を調べその長さに揃えて文書を矩形にする(_行ならび,_矩形ならび), 行ならびを転置する(_矩形ならび,_転置した矩形ならび), 矩形ならびの各要素行の内容を反転して縦書文書にする(_転置した矩形ならび,_列間隔文字数,_縦書文書). 矩形ならびの各要素行の内容を反転して縦書文書にする(_転置した矩形ならび,_列間隔文字数,_縦書文書) :- 矩形ならびの各要素行の内容を反転する(_転置した矩形ならび,_要素が反転した転置した矩形ならび), 縦書文書に変形する(_要素が反転した転置した矩形ならび,_列間隔文字数,_縦書文書). 改行を区切りに行ならびに変形する(_横書文書,[_前文字列|R]) :- 改行を区切りに(_横書文書,_前文字列,_後文字列), 改行を区切りに行ならびに変形する(_後文字列,R). 改行を区切りに行ならびに変形する(_文字列,R) :- 改行が存在しない場合停止する(_文字列,R). 改行が存在しない場合停止する('',[]) :- !. 改行が存在しない場合停止する(_文書,[_文書]). 改行を区切りに(_横書文書,_前文字列,_後文字列) :- 副文字列(_横書文書,_先頭からの変位,1,_末尾からの変位,'\n'), 副文字列(_横書文書,0,_先頭からの変位,_,_前文字列), 副文字列(_横書文書,_,_末尾からの変位,0,_後文字列),!. 最大文字列長を調べその長さに揃えて文書を矩形にする(_行ならび,_矩形ならび) :- 最大文字列長を調べ(_行ならび,_最大文字列長), その長さに揃えて文書を矩形にする(_行ならび,_最大文字列長,_矩形ならび). 最大文字列長を調べ(_行ならび,_最大文字列長) :- 解の最大値(_文字数,( 行ならびから行を取り出す(_行,_行ならび), 文字列長(_行,_文字数)),_最大文字列長). その長さに揃えて文書を矩形にする(_行ならび,_最大文字列長,_矩形ならび) :- 解を集める(_空白を付加した文字列,( 行ならびから行を取り出す(_行,_行ならび), 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_空白を付加した文字列)),_矩形ならび). 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_空白を付加した文字列) :- 文字列長(_行,_文字列長), 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_文字列長,_空白を付加した文字列). 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_文字列長,_空白を付加した文字列) :- 達しない文字数の空白(_最大文字列長,_文字列長,_空白文字列), 二つの文字列を結合する(_行,_空白文字列,_空白を付加した文字列). 達しない文字数の空白(_最大文字列長,_文字列長,_空白文字列) :- _最大文字列長と文字列長の差 は _最大文字列長 - _文字列長, 解を集める(' ',( 整数を順に生成する(1,_最大文字列長と文字列長の差,_)),_空白文字ならび), 文字ならびを文字列に変換する(_空白文字列,_空白文字ならび). 行ならびを転置する(_矩形ならび,_転置された矩形ならび) :- 矩形文字ならびに変換する(_矩形ならび,_矩形文字ならび), 転置(_矩形文字ならび,_転置された矩形文字ならび), 転置された矩形文字ならびを行ならびに変換(_転置された矩形文字ならび,_転置された矩形ならび). 矩形文字ならびに変換する(_矩形ならび,_矩形文字ならび) :- 解を集める(_文字ならび,( 矩形ならびから行を取り出す(_行,_矩形ならび), 文字列を文字ならびに変換する(_行,_文字ならび)),_矩形文字ならび). 転置された矩形文字ならびを行ならびに変換(_転置された矩形文字ならび,_転置された矩形ならび) :- 解を集める(_文字列,( 矩形文字ならびから文字ならびを取り出す(_文字ならび,_転置された矩形文字ならび), 文字ならびを文字列に変換する(_文字列,_文字ならび)),_転置された矩形ならび). 転置した矩形ならびの各行文字列を反転する(_転置した矩形ならび,_反転した行文字列) :- 要素の取り出し(_行文字列,_転置した矩形ならび), 文字列の反転(_行文字列,_反転した行文字列). 矩形ならびの各要素行の内容を反転する(_転置した矩形ならび,_要素が反転した転置した矩形ならび) :- 解を集める(_反転した行文字列,( 矩形ならびから行を取り出す(_行文字列,_転置した矩形ならび), 文字列の反転(_行文字列,_反転した行文字列)),_要素が反転した転置した矩形ならび). 縦書文書に変形する(_要素が反転した転置した矩形ならび,_列間隔文字数,_縦書文書) :- 列間隔文字を挟んで縦書文書に変形する(_要素が反転した転置した矩形ならび,_列間隔文字数,_縦書文書). 列間隔文字を挟んで縦書文書に変形する(_矩形ならび,_列間隔文字数,_縦書文書) :- 列間隔文字を挟んで(_矩形ならび,_列間隔文字数,_矩形ならび_1), 縦書文書に変形する(_矩形ならび_1,_縦書文書). 列間隔文字を挟んで(_矩形ならび_1,_列間隔文字数,_矩形ならび_2) :- 列間隔文字(_列間隔文字数,_列間隔文字), 解を集める(_行,( 行文字の間に列間隔文字を挿入する(_矩形ならび_1,_列間隔文字,_行)),_矩形ならび_2). 列間隔文字(_列間隔文字数,_列間隔文字) :- 解を集める(' ',( 整数を順に生成する(1,_列間隔文字数,_)),_列間隔文字ならび), 文字列を結合する(_列間隔文字ならび,_列間隔文字). 行文字の間に列間隔文字を挿入する(_矩形ならび_1,_列間隔文字,_行) :- 矩形ならびから行を取り出す(_行_1,_矩形ならび_1), 文字列を文字ならびに変換する(_行_1,_文字ならび), 文字列を結合する(_文字ならび,_列間隔文字,_行). 縦書文書に変形する(_矩形ならび_1,_縦書文書) :- 文字列を結合する(_矩形ならび_1,'\n',_縦書文書). 文字列の反転(_文字列,_反転した文字列) :- 文字列を文字ならびに変換する(_文字列,_文字ならび), 文字ならびを反転する(_文字ならび,_反転した文字ならび), 文字ならびを文字列に変換する(_反転した文字列,_反転した文字ならび). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 副文字列(_文字列,_開始位置,_長さ,_残り文字数,_副文字列) :- sub_atom(_文字列,_開始位置,_長さ,_残り文字数,_副文字列). 矩形ならびから行を取り出す(_行,_矩形ならび) :- member(_行,_矩形ならび). 矩形文字ならびから文字ならびを取り出す(_文字ならび,_転置された矩形文字ならび) :- member(_文字ならび,_転置された矩形文字ならび). 行ならびから行を取り出す(_行,_行ならび) :- member(_行,_行ならび). 二つの文字列を結合する(_文字列_1,_文字列_2,_結合した文字列) :- atom_concat(_文字列_1,_文字列_2,_結合した文字列). 文字列を結合する(_文字列ならび,_挿入文字,_結合した文字列) :- atomic_list_concat(_文字列ならび,_挿入文字,_結合した文字列). 文字列を結合する(_文字列ならび,_結合した文字列) :- atomic_list_concat(_文字列ならび,_結合した文字列). 文字列を文字ならびに変換する(_文字列,_文字ならび) :- atom_chars(_文字列,_文字ならび). 文字ならびを反転する(_文字ならび,_反転した文字ならび) :- reverse(_文字ならび,_反転した文字ならび). 文字ならびを文字列に変換する(_反転した文字列,_反転した文字ならび) :- atom_chars(_反転した文字列,_反転した文字ならび). 文字列長(_文字列,_文字列長) :- atom_length(_文字列,_文字列長). 整数を順に生成する(1,_列間隔文字数,_) :- between(1,_列間隔文字数,_). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 解を集める(_候補項,_目標,_解ならび) :- findall(_候補項,_目標,_解ならび). 解の最大値(_候補項,_目標,_解の最大値) :- findall(_候補項,_目標,_解ならび), 最大値(_解ならび,_解の最大値). 最大値(_ならび,_最大値) :- select(_最大値,_ならび,_残りならび), forall(member(_値,_残りならび),_最大値 @>= _値). 解の最小値(_候補項,_目標,_解の最小値) :- findall(_候補項,_目標,_解ならび), 最小値(_解ならび,_解の最小値). 最小値(_ならび,_最小値) :- select(_最小値,_ならび,_残りならび), forall(member(_値,_残りならび),_最小値 @=< _値). _値 は _式 :- _値 is _式. % 以下のサイトは % [1] 授業単元:C言語演習課題 % http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9422.txt % 問題 % 年と月を「YYYY/MM」と入力し、入力された月のカレンダーを表示しなさい。 % % 1752年10月以前、及び10000年1月以降はエラーを返す。 % % 出力形式は以下のとおり % ・1行目は該当月の1日が月曜日でなければ、前月の最終月曜日から表示。 % ・該当月の最終日が日曜日でなければ、翌月の第1日曜日まで表示。 % ・6行目の表示が必要ない場合は表示しない。 % % うるう年判定は以下のとおり % ・年が4で割り切れる年はうるう年。 % ・年が100で割り切れる年はうるう年でない。 % ・年が400で割り切れる年はうるう年である。 % % [出力例] % 年月日を入力:2009/07 % % 月 火 水 木 金 土 日 % 29 30 01 02 03 04 05 % 06 07 08 09 10 11 12 % 13 14 15 16 17 18 19 % 20 21 22 23 24 25 26 % 27 28 29 30 31 01 02 課題のカレンダー(_年/_月) :- not((_年/_月 >= 1752/10,_年/_月 =< 10000/1)), write('エラー: 入力された年月は範囲を逸脱しています\n'),!. 課題のカレンダー(_年/_月) :- _年/_月 @=< 2009/6,!, 曜日検索(_日付,_曜日,2009/6/13,土曜), _日付=_年/_月/1, 課題のカレンダー表示(_日付,_曜日). 課題のカレンダー(_年/_月) :- _年/_月 @>= 2009/6,!, 曜日検索(2009/6/13,土曜,_日付,_曜日), _日付=_年/_月/1, 課題のカレンダー表示(_日付,_曜日). 課題のカレンダー表示(_年/_月/_日,月曜) :- 日付候補を得る(_年/_月/_日,_年/_月/_日,月曜,_日付整数ならび), 課題のカレンダー見出し表示, 課題のカレンダー週表示(_日付整数ならび). 課題のカレンダー表示(_年/_月/_日,_曜日) :- not(_曜日=月曜), 前週の月曜日(_年/_月/_日,_曜日,_前週の月曜日), 日付候補を得る(_年/_月/_日,_前週の月曜日,月曜,_日付整数ならび), 課題のカレンダー見出し表示, 課題のカレンダー週表示(_日付整数ならび). 前週の月曜日(_年/_月/_日,_曜日,_前週の月曜日) :- 曜日検索(_前週の月曜日,_前週の曜日,_年/_月/_日,_曜日), _前週の曜日 = 月曜,!. 日付候補を得る(_年/_月/_日,_起点日付,_曜日,_日付整数ならび) :- findall(_日付,( 曜日(_起点日付,_曜日,_日付2,_),(_日付2=_年2/_月2/7,_年2/_月2 @> _年/_月,!,fail;true)),_日付整数ならび). 課題のカレンダー週表示(_日付整数ならび) :- n個組(7,_日付整数ならび,_7個組), 月曜から日曜までヘッドゼロサプライで表示(_7個組). 月曜から日曜までヘッドゼロサプライで表示([_年/_月/_日]) :- ヘッドゼロサプライ(2,_日,_日付文字列), write_formatted('%t\n',[_日文字列]),!. 月曜から日曜までヘッドゼロサプライで表示([_年/_月/_日|R]) :- ヘッドゼロサプライ(2,_日,_日付文字列), write_formatted('%t ',[_日付文字列]), 月曜から日曜までヘッドゼロサプライで表示(R). 課題のカレンダー見出し表示 :- write_formatted('月 火 水 木 金 土 日\n'). 曜日検索(_日付,_曜日,_今日,_今日の曜日) :- var(_日付), var(_曜日), 前日・今日(_日付,_曜日,_今日,_今日の曜日). 曜日検索(_日付,_曜日,_今日,_今日の曜日) :- var(_日付), var(_曜日), 前日・今日(_前日,_前日の曜日,_今日,_今日の曜日), 曜日検索(_日付,_曜日,_前日,_前日の曜日). 曜日検索(_今日,_今日の曜日,_日付,_曜日) :- var(_日付), var(_曜日), 前日・今日(_今日,_今日の曜日,_日付,_曜日). 曜日検索(_今日,_今日の曜日,_日付,_曜日) :- var(_日付), var(_曜日), 前日・今日(_今日,_今日の曜日,_翌日,_翌日の曜日), 曜日検索(_翌日,_翌日の曜日,_日付,_曜日). '曜日'(_日付,_曜日,_日付,_曜日) :- ! . '曜日'(_日付1,_曜日1,_日付2,_曜日2) :- _日付1 @> _日付2, '前日・今日'(_日付3,_曜日3,_日付1,_曜日1), '曜日'(_日付3,_曜日3,_日付2,_曜日2) . '曜日'(_日付1,_曜日1,_日付2,_曜日2) :- _日付1 @< _日付2, '前日・今日'(_日付1,_曜日1,_日付3,_曜日3), '曜日'(_日付3,_曜日3,_日付2,_曜日2) . 前日・今日(_前日の年/12/31,_前日の曜日,_年/1/1,_曜日) :- 一つ違い(_前日の年,_年), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/2/29,_前日の曜日,_年/3/1,_曜日) :- うるう年(_年), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/2/28,_前日の曜日,_年/3/1,_曜日) :- not(うるう年(_年)), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_前月/30,_前日の曜日,_年/_月/1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[4,6,9,11]), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_前月/31,_前日の曜日,_年/_月/1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[1,3,5,7,8,10,12]), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_月/_前日,_前日の曜日,_年/_月/_日,_曜日) :- 一つ違い(_前日,_日), 曜日連鎖(_前日の曜日,_曜日),!. 一つ違い(M,N) :- integer(M),!, N is M + 1. 一つ違い(M,N) :- integer(N),!, M is N - 1. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- not(0 is _年 mod 4),fail. 曜日連鎖(月曜,火曜). 曜日連鎖(火曜,水曜). 曜日連鎖(水曜,木曜). 曜日連鎖(木曜,金曜). 曜日連鎖(金曜,土曜). 曜日連鎖(土曜,日曜). 曜日連鎖(日曜,月曜). n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. ヘッドゼロサプライ(N桁,_整数,_ヘッドゼロ整数文字列) :- number_chars(_整数,_数字ならび), ヘッドゼロサプライ_1(N桁,_数字ならび,_ヘッドゼロ整数文字ならび), concat_atom(_ヘッドゼロ整数文字ならび,_ヘッドゼロ整数文字列),!. ヘッドゼロサプライ_1(N桁,L,L) :- length(L,N桁),!. ヘッドゼロサプライ_1(N桁,L,['0'|R]) :- M桁 is N桁 - 1, ヘッドゼロサプライ_1(M桁,L,R). # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1200175247/550 # # [1] 授業単元: Ruby演習 [2] 問題文、http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9426.txt # Rubyの問題がわかりません 助けてください # # (1)曜日を表す英語と日本語との対応を表すハッシュwdayを定義しなさい # # p wday["sunday"] #=> "日曜日" # p wday["monday"] #=> "月曜日" # p wday["saturday"] #=> "土曜日" # # (2)ハッシュのメソッドを使って(1)のハッシュwdayのペアの数を数えなさい # # (3)eachメソッドと(1)のハッシュwdayを使って以下の文字列を出力させてくださ い。 # 「sunday」は日曜日のことです。 # 「monday」は月曜日のことです。 # # (4)ハッシュには配列の%wのようなものがありません。そこで、空白とタブと改行(正 規表現で定義するなら「/\uff3cs+/」)で区切られた文字列をハッシュに変換するメソ ッドstr2hashを定義してください。 # # p str2hash("bule 青 white 白\uff3cnred赤"); # #=> {"bule"=>"青", "white"=>"白", "red"=>"赤"} :- op(450,xfx,(=>)). % (1) wday({ "sunday" => "日曜日","monday" => "月曜日","saturday" #=> "土曜日"}). % (2) hash_count(Hashname,Count) :- functor(P,Hashname,1), call(P), arg(1,P,H), count(H,Count). count(','(A,B),Count) :- count(B,Count2), Count is Count2 + 1. count(A,1). % (3) ?- each(wday.A=>B),write_formatted('「%t」は%tのことです。\n',[A,B]),fail;true. each(Hashname.Key=>Value) :- functor(P,Hashname,1), arg(1,P,V), each(V,Key=>Value). each(','(Key=>Value,B),Key=>Value). each(','(_,B),Key=>Value) :- each(B,Key=>Value). each(Key=>Value,Key=>Value). % (4) str2hash(Atom,Hash) :- split(Atom,[' ','\t','\n'],L), findall(U,n個組(2,L,U),L2), hashを成長させる(L2,Hash). hashを成長させる([A,B],{ A=>B }) :- !. hashを成長させる([[A,B]|R], { (A=>B,R2) }) :- hashを成長させる(R,{ R2 }). n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/103 # # 【質問テンプレ】 # [1] 授業単元: C言語演習 # [2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9753.txt # 2.入力された年月の1日が何曜日かを調べる。 #   曜日のチェックはZellerの公式を使用する。Zellerの公式は、 #    #   曜日を表す値=(y + [ y / 4 ] - [ y / 100 ] + [ y / 400 ] + [ (( 13 * m ) + 8 ) / 5 ] + d ) % 7 # #           ※ 上記の公式中の y は年、 m は月、 d は日を表し、 #             []はその数を越えない最大の整数を表す。(例: [13.6]は13になる) # #   で、曜日を表す値は次のようになっている。 # #     日曜日 = 0, 月曜日 = 1, 火曜日 = 2, 水曜日 = 3, # # 木曜日 = 4, 金曜日 = 5, 土曜日 = 6, # #   ※但し、1月と2月は前年の13月14月として計算するものとする。 % (1) 年月の入力 年月入力処理(_年,_月) :- 年入力処理(_年), 月入力処理(_月). % (2) 曜日計算 :- op(450,xfx,が),op(500,xfx,であり),op(600,xfx,ならば),op(450,xfx,は). 'Zellerの公式'(年 が Y であり 月 が M であり 日 が D ならば 曜日を表す値 は (Y + Y // 4 - Y // 100 + Y // 400 + ((( 13 * M ) + 8 ) // 5 ) + D ) mod 7). 曜日計算処理(_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日). 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を表す値を得る'(_年,_月,_日,_曜日を表す値), 曜日を表す値(_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を表す値を得る'(_年,1,_日,_曜日を表す値) :- _前年 is _年 - 1, 'Zellerの公式を用いて曜日を表す値を得る'(_前年,13,_日,_曜日を表す値),!. 'Zellerの公式を用いて曜日を表す値を得る'(_年,2,_日,_曜日を表す値) :- _前年 is _年 - 1, 'Zellerの公式を用いて曜日を表す値を得る'(_前年,14,_日,_曜日を表す値),!. 'Zellerの公式を用いて曜日を表す値を得る'(_年,_月,_日,_曜日を表す値) :- _年=Y,_月=M,_日=D, 'Zellerの公式'(年 が Y であり 月 が M であり 日 が D ならば 曜日を表す値 は _Zellerの公式), _曜日を表す値 is _Zellerの公式,!. 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). % (3) カレンダー表示 カレンダー表示 :- 年月入力処理(_年,_月), 'Zellerの公式を用いて曜日を表す値を得る'(_年,_月,1,_曜日を表す整数値), カレンダー表示データ編集(_年,_月,_曜日を表す整数値,_カレンダー表示文字列ならび), 要素に空白を挿入して全行表示(_カレンダー表示文字列ならび). カレンダー表示データ編集(_年,_月,_各月1日の曜日を表す整数値,_カレンダー表示文字列ならび) :- 年月文字列編集処理(_年,_月,_年月文字列), 月日数(_年,_月,_月日数), findall(S,for(1,N,_月日数),ヘッドゼロサプレス(2,N,S)),_表示日ならび), Length is _月日数 + _各月1日の曜日を表す整数値, M is (7 - (Length mod 7)), '7個組ならび'(Length,M,_表示日ならび,_7個組ならび), 見出しならび(_年月文字列,_見出しならび), append(_見出しならび,_7個組ならび,_カレンダー表示文字列ならび). 見出しならび(_年月文字列,[[_年月文字列],[日,月,火,水,木,金,土]]). '7個組ならび'(Length,0,_表示日ならび,_7個組ならび) :- length(L0,Length), すべての要素が(L0,' '), append(L0,_表示日ならび,L), '7個組'(L,_7個組ならび),!. '7個組ならび'(Length,M,_表示日ならび,_7個組ならび) :- not(M=0), length(L0,Length), すべての要素が(L0,' '), length(L2,M), すべての要素が(L2,' '), append(L0,_表示日ならび,L2,L), '7個組'(L,_7個組ならび),!. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- not(0 is _年 mod 4),fail. 月日数(_年,2,29) :- うるう年(_年),!. 月日数(_年,2,28) :- not(うるう年(_年)),!. 月日数(_,_月,30) :- member(_月,[4,6,9,11]). 月日数(_,_月,31) :- member(_月,[1,3,5,7,8,10,12]). % (4) 基礎述語の定義 年入力処理(_年) :- write('表示したいカレンダーは西暦何年 ? '), get_line(_行), 年入力処理の二(_行,_年), 年入力検査(_年),!. 年入力処理(_年) :- 年入力処理(_年). 年入力処理の二(_行,_年) :- atom_to_term(_行,_年), integer(_年),!. 年入力処理の二(_行,_年) :- write_formatted('この入力[ %t ]は整数ではありません\n',[_行]), fail. 年入力検査(_年) :- _年 >= 1583, _年 =< 3999,!. 年入力検査(_年) :- write_formatted('この年を表す整数%tは不正です\n',[_年]), fail. 月入力処理(_月) :- write('月は ? '), get_line(_行), 月入力処理の二(_行,_月), 月入力検査(_月),!. 月入力処理(_月) :- 月入力処理(_月). 月入力処理の二(_行,_月) :- atom_to_term(_行,_月,_), integer(_月),!. 月入力処理の二(_行,_月) :- write_formatted('この入力[ %t ]は整数ではありません\n',[_行]), fail. 月入力検査(_月) :- _月 >= 1, _月 =< 12,!. 月入力検査(_月) :- write_formatted('この月を表す整数%tは不正です\n',[_月]), fail. 日付文字列編集処理(_年,_月,_日,_日付文字列) :- ヘッドゼロサプライ(2,_年,_年文字列), ヘッドゼロサプライ(2,_月,_月文字列), ヘッドゼロサプライ(2,_日,_日文字列), concat_atom([_年文字列,_月文字列,_日文字列],_日付文字列). 年月文字列編集処理(_年,_月,_年月文字列) :- ヘッドゼロサプライ(2,_年,_年文字列), ヘッドゼロサプライ(2,_月,_月文字列), concat_atom([_年文字列,_月文字列],_年月文字列). ヘッドゼロサプライ(N桁,_整数,_ヘッドゼロ整数文字列) :- number_chars(_整数,_数字ならび), ヘッドゼロサプライ_1(N桁,_数字ならび,_ヘッドゼロ整数文字ならび), concat_atom(_ヘッドゼロ整数文字ならび,_ヘッドゼロ整数文字列),!. ヘッドゼロサプライ_1(N桁,L,L) :- length(L,N桁),!. ヘッドゼロサプライ_1(N桁,L,['0'|R]) :- M桁 is N桁 - 1, ヘッドゼロサプライ_1(M桁,L,R). ヘッドゼロサプレス(N桁,_整数,_ヘッド空白整数文字列) :- number_chars(_整数,_数字ならび), ヘッドゼロサプレス_1(N桁,_数字ならび,_ヘッド空白整数文字ならび), concat_atom(_ヘッド空白整数文字ならび,_ヘッド空白整数文字列),!. ヘッドゼロサプレス_1(N桁,L,L) :- length(L,N桁),!. ヘッドゼロサプレス_1(N桁,L,[' '|R]) :- M桁 is N桁 - 1, ヘッドゼロサプレス_1(M桁,L,R). 要素に空白を挿入して全行表示([]) :- !. 要素に空白を挿入して全行表示([L|R]) :- concat_atom(L,' ',_表示行), write_formatted('%t\n',[_表示行]), 要素に空白を挿入して全行表示(R). すべての要素が([],_). すべての要素が([V|R],V) :- すべての要素が(R,V). '7個組'([],[]) :- !. '7個組'([A,B,C,D,E,F,G|R1]),[[A,B,C,D,E,F,G]|R2]) :- '7個組'(R1,R2). n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. not(P) :- \+(P). append([],L1,L2,L) :- append(L1,L2,L) . append([A|R1],L1,L2,[A|R]) :- append(R1,L1,L2,R) . concat_atom([],'') :- !. concat_atom([A],A) :- !. concat_atom([A|R],S) :- concat_atom(R,S1), atom_concat(A,S1,S). concat_atom([],_,'') :- !. concat_atom([A],_,A) :- !. concat_atom([A|R],_区切り文字列,S) :- concat_atom(R,_区切り文字列,S1), atom_concat(A,_区切り文字列,S2), atom_concat(S2,S1,S). # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/157 # # [1] 授業単元: C++ # [2] 問題文(含コード&リンク): # http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9762.txt # # 正数による正方行列のうち、全ての行、列、斜め列の合計が同じであり、 # かつ2回以上使用される数字が存在しないものを魔方陣という。 # 下図に示すa,bに数値を設定したときに、1〜9の整数によって構成される魔方陣を # 出力するプログラムを作成せよ。 # 但し、魔方陣が作成不可能な(a,b)の組み合わせが設定された場合は、「Impossible」 # と出力するとする。 # # la_lb_l__l # l__l__l__l # l__l__l__l # 魔方陣(N枡,A,B,_行列) :- 魔方陣のための行列の生成(N枡,_行列), _行列 = [[A,B|_],_,_], 行の合計が全て一致する(_行列,S), 列の合計が全て一致する(_行列,S), 正方行列の斜め要素の合計が一致する(_行列,S). 魔方陣のための行列の生成(N枡,_行列) :- N2 is N枡 ^ 2, findall(M,for(1,M,N2),NL),!, 順列(NL,N2,_順列数字ならび), findall(_N個組,n個組(N枡,_順列数字ならび,_N個組),_行列). 行の合計が全て一致する([],S) :- !. 行の合計が全て一致する([_行|R],S) :- 魔方陣の加算(_行,0,S), 行の合計が全て一致する(R,S). 列の合計が全て一致する(_行列,S) :- 行列の転置(_行列,_転置行列), 列の合計が全て一致する(_転置行列,S),!. 正方行列の斜め要素の合計が一致する(_正方行列,S) :- length(_行列,Len), 左上から右下方向の合計(1,Len,_正方行列,0,S), 右上から左下方向の合計(1,Len,_正方行列,0,S),!. 左上から右下方向の合計(M,N,_,S,S) :- M > N,!. 左上から右下方向の合計(M,N,_行列,S1,S) :- list_nth(M,_行列,_行), list_nth(M,_行,_要素), S2 is _要素 + S1, M2 is M + 1, 左上から右下方向の合計(M2,N,_行列,S2,S),!. 右上から左下方向の合計(M,N,_,S,S) :- M > N,!. 右上から左下方向の合計(M,N,_行列,S1,S) :- M1 is N - M + 1, list_nth(M1,_行列,_行), list_nth(M1,_行,_要素), S2 is _要素 + S1, M2 is M + 1, 右上から左下方向の合計(M2,N,_行列,S2,S),!. n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. 魔方陣の加算([],X,X) :- !. 魔方陣の加算([A|R],Y,X) :- Z is A + Y, 魔方陣の加算(R,Z,X). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/566 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 番号と点数を配列に初期化して、それらを # 5段階にランク付けをして、受験番号・ランクを表示するプログラムを作成。 # ランク付けをする部分を関数Rankとして、番号と評価を表示する部分を関数Outputとすること。 # なお、ランクの評価は0〜19点をE、20〜39点をD、40〜59点をC、 # 60〜79点をB、80〜100点をAとする。 # ただし、受験者の数は、50人以下とする。 # 番号と点数は、以下の配列を使用すること。 # 番号 int no[NUMBER]={1,2,3,4,5,6,7,8,9,10}; # 点数 int tensu[NUMBER]={45,21,60,81,70,99,0,10,20,100}; # '問題文の5段階にランク付け'('ランクの評価は0〜19点をE、20〜39点をD、40〜59点をC、 60〜79点をB、80〜100点をAとする。 '). 番号の定義文('番号 int no[NUMBER]={1,2,3,4,5,6,7,8,9,10};'). 点数の定義文('点数 int tensu[NUMBER]={45,21,60,81,70,99,0,10,20,100};'). 'ランクならびの生成'(_ランクならび) :- '問題文の5段階にランク付け'(_ランク定義文), ランクの定義文解析(_ランク定義文,_ランクならび). 番号ならびの生成(_番号ならび) :- 番号の定義文(_番号の定義文), 番号の定義文解析(_番号の定義文,_番号ならび). 点数ならびの生成(_点数ならび) :- 点数の定義文(_点数の定義文), 点数の定義文解析(_点数の定義文,_点数ならび). '5段階にランク付けをして、受験番号・ランクを表示する' :- ランクならびの生成(_ランクならび), 番号ならびの生成(_番号ならび), 点数ならびの生成(_点数ならび), '5段階にランク付けをして、受験番号・ランクを表示する'(_番号ならび,_点数ならび,_ランクならび). '5段階にランク付けをして、受験番号・ランクを表示する'([],[],_). '5段階にランク付けをして、受験番号・ランクを表示する'([_番号|R1],[_点数|R2],_ランクならび) :- append(_,[[_点数下限,_点数上限,_ランク]|_],_ランクならび), _点数 >= _点数下限, _点数 =< _点数上限, writef('受験番号:%t ランク:%t\n',[_番号,_ランク]), '5段階にランク付けをして、受験番号・ランクを表示する'(R1,R2,_ランクならび). ランクの定義文解析(_ランク定義文,_ランクならび) :- 全角数字を半角数字に変換(_ランク定義文,_半角数字変換されたランク定義文), split(_半角数字変換されたランク定義文,[' ','。','、','〜','点を','とする'],L), n個組(3,L,_ランクならび). 全角数字を半角数字に変換(_ランク定義文,_半角数字変換されたランク定義文) :- atom_chars(_ランク定義文,Chars), findall(_文字_1, append(_,[_文字|_],Chars), 全角数字ならば半角数字に変換(_文字,_文字_1)), Chars2), atom_chars(_半角数字変換されたランク定義文,Chars2). 全角数字ならば半角数字に変換([_全角数字|R1],[_半角数字|R2]) :- 全角数字半角数字変換(_全角数字,_半角数字), 全角数字ならば半角数字に変換(R1,R2). 全角数字ならば半角数字に変換([_文字|R1],[_文字|R2]) :- \+(全角数字半角数字変換(_文字,_)), 全角数字ならば半角数字に変換(R1,R2). 全角数字半角数字変換(0,0). 全角数字半角数字変換(1,1). 全角数字半角数字変換(2,2). 全角数字半角数字変換(3,3). 全角数字半角数字変換(4,4). 全角数字半角数字変換(5,5). 全角数字半角数字変換(6,6). 全角数字半角数字変換(7,7). 全角数字半角数字変換(8,8). 全角数字半角数字変換(9,9). 番号の定義文解析(_番号の定義文,_番号ならび) :- split(_番号の定義文,['=',',',';'],[_|_番号ならび]). 点数の定義文解析(_点数の定義文,_点数ならび) :- split(_点数の定義文,['=',',',';'],[_|_点数ならび]). % 以下のサイトは % 使用言語 SWI-Prolog % 以下、ソースコード :- op(400,xfx,だけ). :- op(300,xf,分). :- op(400,xfx,が真になる全ての場合). :- op(500,xfx,を). :- op(600,xf,に収集する). :- op(400,xfx,を結合して). :- op(600,xf,を得る). 行のずれを意味する空白文字列(' '). 項表示形式('%6c'). パスカルの三角形 :- パスカルの三角形([_,_,_,_,_,_,_,_,_,_],[1]). パスカルの三角形([_],_上の行) :- '第一引数(行数)が空になったら、最終行を表示して終了する'([],_上の行). パスカルの三角形([_|_行数],_上の行) :- パスカルの三角形の行を順に表示する([_|_行数],_上の行). '第一引数(行数)が空になったら、最終行を表示して終了する'([],_上の行) :- パスカルの三角形の上の行を表示([],_上の行). パスカルの三角形の行を順に表示する([_|_行数],_上の行) :- 'パスカルの三角形の上の行を表示した上、現在行を計算して生成する'(_行数,_上の行,_現在行), パスカルの三角形(_行数,_現在行). 'パスカルの三角形の上の行を表示した上、現在行を計算して生成する'(_行数,_上の行,_現在行) :- 上の行の二項の和(_上の行,_上の行の二項の和) が真になる全ての場合 _上の行の二項の和 を _両端の1が落ちた計算された行 に収集する, パスカルの三角形の上の行を表示(_行数,_上の行), 両端に1を付加して現在行を完成する(_両端の1が落ちた計算された行,_現在行). 上の行の二項の和(_上の行,_上の行の二項の和) :- append(_,[_左上の項,_右上の項|_],_上の行), _上の行の二項の和 is _左上の項 + _右上の項. パスカルの三角形の上の行を表示(_行数,_上の行) :- '_行数から行頭からの空白文字列の生成'(_行数,_行頭からの空白文字列), 上の行の数字表示文字列(_上の行,_上の行の数字表示文字列), 表示する('%t%t\n',[_行頭からの空白文字列,_上の行の数字表示文字列]). '_行数から行頭からの空白文字列の生成'(_行数,_行頭からの空白文字列) :- 行のずれを意味する空白文字列(_行のずれを意味する空白文字列), _行数 分 だけ _行のずれを意味する空白文字列 を _空白文字列ならび に収集する, _空白文字列ならび を結合して _行頭からの空白文字列 を得る. 上の行の数字表示文字列(_上の行,_上の行の数字表示文字列) :- 上の行の数字表示部分(_上の行,_上の行の数字表示部分), _上の行の数字表示部分 を結合して _上の行の数字表示文字列 を得る. 上の行の数字表示部分(_上の行,_上の行の数字表示部分) :- 項表示形式(_項表示形式), 上の行の項を数字文字列に変換(_上の行,_項表示形式,_上の行の数字文字列) が真になる全ての場合 _上の行の数字文字列 を _上の行の数字表示部分 に収集する. 上の行の項を数字文字列に変換(_上の行,_項表示形式,_上の行の数字文字列) :- member(_項,_上の行), swritef(_上の行の数字文字列,_項表示形式,[_項]). 両端に1を付加して現在行を完成する(_両端の1が落ちた計算された行,_現在行) :- append([1|_両端の1が落ちた計算された行],[1],_現在行). _行数 分 だけ _行のずれを意味する空白文字列 を _空白文字列ならび に収集する :- findall(_行のずれを意味する空白文字列,member(_,_行数),_空白文字列ならび). _目標 が真になる全ての場合 _収集項 を _収集項ならび に収集する :- findall(_収集項,_目標,_収集項ならび). 上の行の項を数字文字列に変換(_上の行,_項表示形式,_上の行の数字文字列) が真になる全ての場合 _上の行の数字文字列 を _上の行の数字表示部分 に収集する :- findall(_上の行の数字文字列,( 上の行の項を数字文字列に変換(_上の行,_項表示形式,_上の行の数字文字列)),_上の行の数字表示部分). _上の行の数字表示部分 を結合して _上の行の数字表示文字列 を得る :- atomic_list_concat(_上の行の数字表示部分,_上の行の数字表示文字列). 表示する(_表示形式項,_値ならび) :- writef(_表示形式項,_値ならび). :- nl,パスカルの三角形,nl,halt. % 以下、実行結果 # swipl -f temp1.pl 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1 % 以下のサイトは # 最近、マシューはポエマーな女子高生に恋をしている。彼女は詩人なんだが、パーコさんと言うんだ。 # # パーコ :「あらゆる物体、すなわち大空、星、大地、その王国などは、精神の最も小さいものにもおよばない。なぜなら、精神はそれらのすべてと自身とを認識するが、物体は何も認識しないからである。」 # # マシュー:「それは新しい詩かい?」 # # パーコ :「違う。パスカルの『パンセ』に記載された有名な一節。知らない人がいるんだ。」 # # マシュー:「Oh...ごめんよ。」 # # パーコ :「人間は自然の中では矮小な生き物にすぎないが、考えることによって宇宙を超える、というパスカルの考え方には実に共感するものがある。」 # # マシュー:「そうだなあ。確かに、マシューの肉体は小さいが、妄想だけはいつもビッグサイズだ!・・・さて、パーコ、デートに行かないか?」 # # パーコ :「うん、そうね。じゃあ、パスカルにちなんで、パスカルの三角形をプログラムで表示して欲しい。もちろん、数学の美しさを生かした記述の仕方をしてね。」 # # 以下の三角形が10行分のパスカルの三角形だ。こちらを再現して欲しい。 # # 1 # 1 1 # 1 2 1 # 1 3 3 1 # 1 4 6 4 1 # 1 5 10 10 5 1 # 1 6 15 20 15 6 1 # 1 7 21 35 35 21 7 1 # 1 8 28 56 70 56 28 8 1 # 1 9 36 84 126 126 84 36 9 1 # # 動作確認はideoneで行う。 # ideoneで正しく動作しない場合は不正解となりますので注意してくれよ。 # 言語は40種類以上サポートしているぞ。 # # ・使用した言語 # ・ソースコード # ・答え # の3つを合わせて記述して欲しい。 % 使用言語 SWI-Prolog % 以下、ソースコード :- op(400,xfx,だけ). :- op(300,xf,分). :- op(400,xfx,が真になる全ての場合). :- op(500,xfx,を). :- op(600,xf,に収集する). :- op(400,xfx,を結合して). :- op(600,xf,を得る). 行のずれを意味する空白文字列(' '). 項表示形式('%6c'). パスカルの三角形 :- パスカルの三角形([_,_,_,_,_,_,_,_,_,_],[1]),!. パスカルの三角形([_],_上の行) :- '第一引数(行数)が空になったら、最終行を表示して終了する'([],_上の行). パスカルの三角形([_|_行数],_上の行) :- パスカルの三角形の行を順に表示する([_|_行数],_上の行). '第一引数(行数)が空になったら、最終行を表示して終了する'([],_上の行) :- パスカルの三角形の上の行を表示([],_上の行). パスカルの三角形の行を順に表示する([_|_行数],_上の行) :- 'パスカルの三角形の上の行を表示した上、現在行を計算して生成する'(_行数,_上の行,_現在行), パスカルの三角形(_行数,_現在行). 'パスカルの三角形の上の行を表示した上、現在行を計算して生成する'(_行数,_上の行,_現在行) :- 上の行の二項の和(_上の行,_上の行の二項の和) が真になる全ての場合 _上の行の二項の和 を _両端の1が落ちた計算された行 に収集する, パスカルの三角形の上の行を表示(_行数,_上の行), 両端に1を付加して現在行を完成する(_両端の1が落ちた計算された行,_現在行). 上の行の二項の和(_上の行,_上の行の二項の和) :- append(_,[_左上の項,_右上の項|_],_上の行), _上の行の二項の和 is _左上の項 + _右上の項. パスカルの三角形の上の行を表示(_行数,_上の行) :- '_行数から行頭からの空白文字列の生成'(_行数,_行頭からの空白文字列), 上の行の数字表示文字列(_上の行,_上の行の数字表示文字列), 表示する('%t%t\n',[_行頭からの空白文字列,_上の行の数字表示文字列]). '_行数から行頭からの空白文字列の生成'(_行数,_行頭からの空白文字列) :- 行のずれを意味する空白文字列(_行のずれを意味する空白文字列), _行数 分 だけ _行のずれを意味する空白文字列 を _空白文字列ならび に収集する, _空白文字列ならび を結合して _行頭からの空白文字列 を得る. 上の行の数字表示文字列(_上の行,_上の行の数字表示文字列) :- 上の行の数字表示部分(_上の行,_上の行の数字表示部分), _上の行の数字表示部分 を結合して _上の行の数字表示文字列 を得る. 上の行の数字表示部分(_上の行,_上の行の数字表示部分) :- 項表示形式(_項表示形式), 上の行の項を数字文字列に変換(_上の行,_項表示形式,_上の行の数字文字列) が真になる全ての場合 _上の行の数字文字列 を _上の行の数字表示部分 に収集する. 上の行の項を数字文字列に変換(_上の行,_項表示形式,_上の行の数字文字列) :- member(_項,_上の行), swritef(_上の行の数字文字列,_項表示形式,[_項]). 両端に1を付加して現在行を完成する(_両端の1が落ちた計算された行,_現在行) :- append([1|_両端の1が落ちた計算された行],[1],_現在行). _行数 分 だけ _収集項 を _収集項ならび に収集する :- findall(_収集項,member(_,_行数),_収集項ならび). _目標 が真になる全ての場合 _収集項 を _収集項ならび に収集する :- findall(_収集項,_目標,_収集項ならび). L を結合して A を得る :- atomic_list_concat(L,A). 表示する(_表示形式項,_値ならび) :- writef(_表示形式項,_値ならび). :- nl,パスカルの三角形,nl,halt. % 以下、実行結果 # swipl -f temp1.pro 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1 % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #132 # お題:ふたつの整数が与えられたとき、数字が一致している桁の個数を求める。 # 例 # 110, 119 -> 2 # 1234, 214 -> 2 # 567, 23 -> 0 # :- op(600,xfx,'個数を求める。'). 'ふたつの整数が与えられたとき、数字が一致している桁の個数を求める。'(_数_1,_数_2,_数字が一致している桁の個数) :- ふたつの整数をふたつの数字文字列に変換(_数_1,_数_2,_数字文字列_1,_数字文字列_2), '数字が一致している桁の個数を求める。'(_数字文字列_1,_数字文字列_2,_数字が一致している桁の個数). ふたつの整数をふたつの数字文字列に変換(_数_1,_数_2,_数字文字列_1,_数字文字列_2) :- atom_number(_数字文字列_1,_数_1), atom_number(_数字文字列_2,_数_2). '数字が一致している桁の個数を求める。'(_数字文字列_1,_数字文字列_2,_数字が一致している桁の個数) :- 数字が一致している桁の(_数字文字列_1,_数字文字列_2) '個数を求める。' _数字が一致している桁の個数. '数字が一致している桁の'(_数字文字列_1,_数字文字列_2) :- sub_atom(_数字文字列_1,_,1,_残り文字数,_数字), sub_atom(_数字文字列_2,_,1,_残り文字数,_数字), \+(_数字 = '-'). '個数を求める。'(P,_個数). findall(1,P,L), length(L,_個数). % 以下のサイトは # 出典: twitter_by_@_ktwr_20140620 # 出典: Qiita::Prologカットについて # # stream を使って書きなおしてみる。 "findallterm_from_stream.pro"に保存。 # findallterm_from_stream(Stream,_):- at_end_of_stream(Stream),!. findallterm_from_stream(Stream,Term) :- read(Stream,Term0), process(Term0,Term), findallterm_from_stream(Stream,Term). process(Term0,Term) :- \+(Term0=Term),!. process(Term0,_) :- write(Term0), nl. :- open('findallterm_from_stream.pro',read,Input), findallterm_from_stream(Input,_), close(Input). findallterm_from_stream(_G1737,_G1738):-at_end_of_stream(_G1737),! findallterm_from_stream(_G1748,_G1749):-read(_G1748,_G1752),process(_G1752,_G1749),findallterm_from_stream(_G1748,_G1749) process(_G1769,_G1770):- \+_G1769=_G1770,! process(_G1783,_G1784):-write(_G1783),nl Input = (0x8e49350). % 以下のサイトは # # 鎮 静 剤 #               マリー・ローランサン #                   堀口大學 訳 # # # 退屈な女より もっと哀れなのは 悲しい女です。 # # 悲しい女より もっと哀れなのは 不幸な女です。 # # 不幸な女より もっと哀れなのは 病気の女です。 # # 病気の女より もっと哀れなのは 捨てられた女です。 # # 捨てられた女より もっと哀れなのは よるべない女です。 # # よるべない女より もっと哀れなのは 追われた女です。 # # 追われた女より もっと哀れなのは 死んだ女です。 # # 死んだ女より もっと哀れなのは 忘れられた女です。 # # :- op(400,xf,より). :- op(450,xf,もっと). :- op(500,xfx,哀れなのは). :- op(350,xf,女). :- op(700,xf,です). 鎮静剤(_どんな,_哀れなのは) :- _どんな 女 より もっと 哀れなのは _こんな 女 です, atomic_list_concat([_どんな,女より,' もっと哀れなのは ',_こんな,'女です。'],_哀れなのは). 鎮静剤(_どんな,_哀れなのは) :- _どんな 女 より もっと 哀れなのは _こんな 女 です, 鎮静剤(_こんな,_哀れなのは). よるべない 女 より もっと 哀れなのは 追われた 女 です. 退屈な 女 より もっと 哀れなのは 悲しい 女 です. 忘れられた 女 より もっと 哀れなのは 退屈な 女 です. 追われた 女 より もっと 哀れなのは 死んだ 女 です. 不幸な 女 より もっと 哀れなのは 病気の 女 です. 捨てられた 女 より もっと 哀れなのは よるべない 女 です. 病気の 女 より もっと 哀れなのは 捨てられた 女 です. 悲しい 女 より もっと 哀れなのは 不幸な 女 です. 死んだ 女 より もっと 哀れなのは 忘れられた 女 です. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ?- 鎮静剤(退屈な,_節). _節 = '退屈な女より もっと哀れなのは 悲しい女です。' ; _節 = '悲しい女より もっと哀れなのは 不幸な女です。' ; _節 = '不幸な女より もっと哀れなのは 病気の女です。' ; _節 = '病気の女より もっと哀れなのは 捨てられた女です。' ; _節 = '捨てられた女より もっと哀れなのは よるべない女です。' ; _節 = 'よるべない女より もっと哀れなのは 追われた女です。' ; _節 = '追われた女より もっと哀れなのは 死んだ女です。' ; _節 = '死んだ女より もっと哀れなのは 忘れられた女です。' ; _節 = '忘れられた女より もっと哀れなのは 退屈な女です。' ; _節 = '退屈な女より もっと哀れなのは 悲しい女です。' ; _節 = '悲しい女より もっと哀れなのは 不幸な女です。' ; _節 = '不幸な女より もっと哀れなのは 病気の女です。' ; _節 = '病気の女より もっと哀れなのは 捨てられた女です。' ; _節 = '捨てられた女より もっと哀れなのは よるべない女です。' . ?- % 以下のサイトは # # 鎮 静 剤 #               マリー・ローランサン #                   堀口大學 訳 # # # 退屈な女より もっと哀れなのは 悲しい女です。 # # 悲しい女より もっと哀れなのは 不幸な女です。 # # 不幸な女より もっと哀れなのは 病気の女です。 # # 病気の女より もっと哀れなのは 捨てられた女です。 # # 捨てられた女より もっと哀れなのは よるべない女です。 # # よるべない女より もっと哀れなのは 追われた女です。 # # 追われた女より もっと哀れなのは 死んだ女です。 # # 死んだ女より もっと哀れなのは 忘れられた女です。 # # :- op(400,xf,より). :- op(500,xfx,もっと哀れなのは). :- op(700,xf,です). 鎮静剤(_どんな女,_もっと哀れなのは) :- _どんな女 より もっと哀れなのは _こんな女 です, atomic_list_concat([_どんな女,より,' もっと哀れなのは ',_こんな女,'です。'],_もっと哀れなのは). 鎮静剤(_どんな女,_もっと哀れなのは) :- _どんな女 より もっと哀れなのは _こんな女 です, 鎮静剤(_こんな女,_もっと哀れなのは). よるべない女 より もっと哀れなのは 追われた女 です. 退屈な女 より もっと哀れなのは 悲しい女 です. 忘れられた女 より もっと哀れなのは 退屈な女 です. 追われた女 より もっと哀れなのは 死んだ女 です. 不幸な女 より もっと哀れなのは 病気の女 です. 捨てられた女 より もっと哀れなのは よるべない女 です. 病気の女 より もっと哀れなのは 捨てられた女 です. 悲しい女 より もっと哀れなのは 不幸な女 です. 死んだ女 より もっと哀れなのは 忘れられた女 です. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ?- 鎮静剤(退屈な女,_節). _節 = '退屈な女より もっと哀れなのは 悲しい女です。' ; _節 = '悲しい女より もっと哀れなのは 不幸な女です。' ; _節 = '不幸な女より もっと哀れなのは 病気の女です。' ; _節 = '病気の女より もっと哀れなのは 捨てられた女です。' ; _節 = '捨てられた女より もっと哀れなのは よるべない女です。' ; _節 = 'よるべない女より もっと哀れなのは 追われた女です。' ; _節 = '追われた女より もっと哀れなのは 死んだ女です。' ; _節 = '死んだ女より もっと哀れなのは 忘れられた女です。' ; _節 = '忘れられた女より もっと哀れなのは 退屈な女です。' ; _節 = '退屈な女より もっと哀れなのは 悲しい女です。' ; _節 = '悲しい女より もっと哀れなのは 不幸な女です。' ; _節 = '不幸な女より もっと哀れなのは 病気の女です。' ; _節 = '病気の女より もっと哀れなのは 捨てられた女です。' ; _節 = '捨てられた女より もっと哀れなのは よるべない女です。' . ?- % 以下のサイトは # # 鎮 静 剤 #               マリー・ローランサン #                   堀口大學 訳 # # # 退屈な女より もっと哀れなのは 悲しい女です。 # # 悲しい女より もっと哀れなのは 不幸な女です。 # # 不幸な女より もっと哀れなのは 病気の女です。 # # 病気の女より もっと哀れなのは 捨てられた女です。 # # 捨てられた女より もっと哀れなのは よるべない女です。 # # よるべない女より もっと哀れなのは 追われた女です。 # # 追われた女より もっと哀れなのは 死んだ女です。 # # 死んだ女より もっと哀れなのは 忘れられた女です。 # # :- op(400,xf,より). :- op(500,xfx,もっと哀れなのは). :- op(700,xf,です). 鎮静剤(_どんな女,_もっと哀れなのは) :- _どんな女 より もっと哀れなのは _こんな女 です, 鎮静剤(_どんな女,_こんな女,_もっと哀れなのは). 鎮静剤(_どんな女,_こんな女,_もっと哀れなのは) :- atomic_list_concat([_どんな女,より,' もっと哀れなのは ',_こんな女,'です。'],_もっと哀れなのは). 鎮静剤(_,_こんな女,_もっと哀れなのは) :- 鎮静剤(_こんな女,_もっと哀れなのは). よるべない女 より もっと哀れなのは 追われた女 です. 退屈な女 より もっと哀れなのは 悲しい女 です. 忘れられた女 より もっと哀れなのは 退屈な女 です. 追われた女 より もっと哀れなのは 死んだ女 です. 不幸な女 より もっと哀れなのは 病気の女 です. 捨てられた女 より もっと哀れなのは よるべない女 です. 病気の女 より もっと哀れなのは 捨てられた女 です. 悲しい女 より もっと哀れなのは 不幸な女 です. 死んだ女 より もっと哀れなのは 忘れられた女 です. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ?- 鎮静剤(退屈な女,_節). _節 = '退屈な女より もっと哀れなのは 悲しい女です。' ; _節 = '悲しい女より もっと哀れなのは 不幸な女です。' ; _節 = '不幸な女より もっと哀れなのは 病気の女です。' ; _節 = '病気の女より もっと哀れなのは 捨てられた女です。' ; _節 = '捨てられた女より もっと哀れなのは よるべない女です。' ; _節 = 'よるべない女より もっと哀れなのは 追われた女です。' ; _節 = '追われた女より もっと哀れなのは 死んだ女です。' ; _節 = '死んだ女より もっと哀れなのは 忘れられた女です。' ; _節 = '忘れられた女より もっと哀れなのは 退屈な女です。' ; _節 = '退屈な女より もっと哀れなのは 悲しい女です。' ; _節 = '悲しい女より もっと哀れなのは 不幸な女です。' ; _節 = '不幸な女より もっと哀れなのは 病気の女です。' ; _節 = '病気の女より もっと哀れなのは 捨てられた女です。' ; _節 = '捨てられた女より もっと哀れなのは よるべない女です。' . ?- % 以下のサイトは # # 出典: sandy* ?@vecchio_ciao 5月15日 小3次男の割り算テスト。学校だけに任せておくと大変なことになるよ # :- op(400,yfx,×). 九九のだん(1,[1 × 1 = 1,1 × 2 = 2,1 × 3 = 3,1 × 4 = 4,1 × 5 = 5,1 × 6 = 6,1 × 7 = 7,1 × 8 = 8,1 × 9 = 9]). 九九のだん(2,[2 × 1 = 2,2 × 2 = 4,2 × 3 = 6,2 × 4 = 8,2 × 5 = 10,2 × 6 = 12,2 × 7 = 14,2 × 8 = 16,2 × 9 = 18]). 九九のだん(3,[3 × 1 = 3,3 × 2 = 6,3 × 3 = 9,3 × 4 = 12,3 × 5 = 15,3 × 6 = 18,3 × 7 = 21,3 × 8 = 24,3 × 9 = 27]). 九九のだん(4,[4 × 1 = 4,4 × 2 = 8,4 × 3 = 12,4 × 4 = 16,4 × 5 = 20,4 × 6 = 24,4 × 7 = 28,4 × 8 = 32,4 × 9 = 36]). 九九のだん(5,[5 × 1 = 5,5 × 2 = 10,5 × 3 = 15,5 × 4 = 20,5 × 5 = 25,5 × 6 = 30,5 × 7 = 35,5 × 8 = 40,5 × 9 = 45]). 九九のだん(6,[6 × 1 = 6,6 × 2 = 12,6 × 3 = 18,6 × 4 = 24,6 × 5 = 30,6 × 6 = 36,6 × 7 = 42,6 × 8 = 48,6 × 9 = 54]). 九九のだん(7,[7 × 1 = 7,7 × 2 = 14,7 × 3 = 21,7 × 4 = 28,7 × 5 = 35,7 × 6 = 42,7 × 7 = 49,7 × 8 = 56,7 × 9 = 63]). 九九のだん(8,[8 × 1 = 8,8 × 2 = 16,8 × 3 = 24,8 × 4 = 32,8 × 5 = 40,8 × 6 = 48,8 × 7 = 56,8 × 8 = 64,8 × 9 = 72]). 九九のだん(9,[9 × 1 = 9,9 × 2 = 18,9 × 3 = 27,9 × 4 = 36,9 × 5 = 45,9 × 6 = 54,9 × 7 = 63,9 × 8 = 72,9 × 9 = 81]). '次のわり算の答えは,何のだんの九九を使ってもとめればよいですか。 (1) 21 ÷ 7'(_何のだん,_わり算の答え) :- between(1,9,_何のだん), 九九のだん(_何のだん,_だんの式ならび), member(_何のだん × _わり算の答え = 21,_だんの式ならび). % 以下のサイトは # # 出典: sandy* ?@vecchio_ciao 5月15日 小3次男の割り算テスト。学校だけに任せておくと大変なことになるよ # :- op(400,yfx,×). 九九のだん(1,[1 × 1 = 1,1 × 2 = 2,1 × 3 = 3,1 × 4 = 4,1 × 5 = 5,1 × 6 = 6,1 × 7 = 7,1 × 8 = 8,1 × 9 = 9]). 九九のだん(2,[2 × 1 = 2,2 × 2 = 4,2 × 3 = 6,2 × 4 = 8,2 × 5 = 10,2 × 6 = 12,2 × 7 = 14,2 × 8 = 16,2 × 9 = 18]). 九九のだん(3,[3 × 1 = 3,3 × 2 = 6,3 × 3 = 9,3 × 4 = 12,3 × 5 = 15,3 × 6 = 18,3 × 7 = 21,3 × 8 = 24,3 × 9 = 27]). 九九のだん(4,[4 × 1 = 4,4 × 2 = 8,4 × 3 = 12,4 × 4 = 16,4 × 5 = 20,4 × 6 = 24,4 × 7 = 28,4 × 8 = 32,4 × 9 = 36]). 九九のだん(5,[5 × 1 = 5,5 × 2 = 10,5 × 3 = 15,5 × 4 = 20,5 × 5 = 25,5 × 6 = 30,5 × 7 = 35,5 × 8 = 40,5 × 9 = 45]). 九九のだん(6,[6 × 1 = 6,6 × 2 = 12,6 × 3 = 18,6 × 4 = 24,6 × 5 = 30,6 × 6 = 36,6 × 7 = 42,6 × 8 = 48,6 × 9 = 54]). 九九のだん(7,[7 × 1 = 7,7 × 2 = 14,7 × 3 = 21,7 × 4 = 28,7 × 5 = 35,7 × 6 = 42,7 × 7 = 49,7 × 8 = 56,7 × 9 = 63]). 九九のだん(8,[8 × 1 = 8,8 × 2 = 16,8 × 3 = 24,8 × 4 = 32,8 × 5 = 40,8 × 6 = 48,8 × 7 = 56,8 × 8 = 64,8 × 9 = 72]). 九九のだん(9,[9 × 1 = 9,9 × 2 = 18,9 × 3 = 27,9 × 4 = 36,9 × 5 = 45,9 × 6 = 54,9 × 7 = 63,9 × 8 = 72,9 × 9 = 81]). '次のわり算の答えは,何のだんの九九を使ってもとめればよいですか。 (1) 21 ÷ 7'(_何のだん,_わり算の答え) :- _何のだん = 7, 九九のだん(7,_だんの式ならび), member(7 × _わり算の答え = 21,_だんの式ならび). % 以下のサイトは # # 出典: sandy* ?@vecchio_ciao 5月15日 小3次男の割り算テスト。学校だけに任せておくと大変なことになるよ # :- op(400,yfx,×). 九九のだん(1,[1 × 1 = 1,1 × 2 = 2,1 × 3 = 3,1 × 4 = 4,1 × 5 = 5,1 × 6 = 6,1 × 7 = 7,1 × 8 = 8,1 × 9 = 9]). 九九のだん(2,[2 × 1 = 2,2 × 2 = 4,2 × 3 = 6,2 × 4 = 8,2 × 5 = 10,2 × 6 = 12,2 × 7 = 14,2 × 8 = 16,2 × 9 = 18]). 九九のだん(3,[3 × 1 = 3,3 × 2 = 6,3 × 3 = 9,3 × 4 = 12,3 × 5 = 15,3 × 6 = 18,3 × 7 = 21,3 × 8 = 24,3 × 9 = 27]). 九九のだん(4,[4 × 1 = 4,4 × 2 = 8,4 × 3 = 12,4 × 4 = 16,4 × 5 = 20,4 × 6 = 24,4 × 7 = 28,4 × 8 = 32,4 × 9 = 36]). 九九のだん(5,[5 × 1 = 5,5 × 2 = 10,5 × 3 = 15,5 × 4 = 20,5 × 5 = 25,5 × 6 = 30,5 × 7 = 35,5 × 8 = 40,5 × 9 = 45]). 九九のだん(6,[6 × 1 = 6,6 × 2 = 12,6 × 3 = 18,6 × 4 = 24,6 × 5 = 30,6 × 6 = 36,6 × 7 = 42,6 × 8 = 48,6 × 9 = 54]). 九九のだん(7,[7 × 1 = 7,7 × 2 = 14,7 × 3 = 21,7 × 4 = 28,7 × 5 = 35,7 × 6 = 42,7 × 7 = 49,7 × 8 = 56,7 × 9 = 63]). 九九のだん(8,[8 × 1 = 8,8 × 2 = 16,8 × 3 = 24,8 × 4 = 32,8 × 5 = 40,8 × 6 = 48,8 × 7 = 56,8 × 8 = 64,8 × 9 = 72]). 九九のだん(9,[9 × 1 = 9,9 × 2 = 18,9 × 3 = 27,9 × 4 = 36,9 × 5 = 45,9 × 6 = 54,9 × 7 = 63,9 × 8 = 72,9 × 9 = 81]). '次のわり算の答えは,何のだんの九九を使ってもとめればよいですか。 (1) 21 ÷ 7 '(_何のだん,_わり算の答え) :- _何のだん = 7, 九九のだん(7,_だんの式ならび), member(7 × _わり算の答え = 21,_だんの式ならび). % 以下のサイトは # # ソクラテスは人間である。 # %%%%%%%%%%%%%%%%%%%%%%%%%% ソクラテスは人間である. %%%%%%%%%%%%%%%%%%%%%%%%%% :- op(600,xfx,は). :- op(850,xf,である). ソクラテス は 人間 である. %%%%%%%%%%%%%%%%%%%%%%%%%%% ソクラテスは人間である :- 人間(ソクラテス). 人間(ソクラテス). %%%%%%%%%%%%%%%%%%%%%%%%%%% 人間(ソクラテス). %%%%%%%%%%%%%%%%%%%%%%%%%%% である(ソクラテス,人間). %%%%%%%%%%%%%%%%%%%%%%%%%%% % 以下のサイトは % % 「春が来た」のProlog述語としての一番自然な定義は、 % 来た(春). % であろうが %%%%%%%%%%%%%%%%%%%%%%%%%% 来た(春が). %%%%%%%%%%%%%%%%%%%%%%%%%% 春が来た. %%%%%%%%%%%%%%%%%%%%%%%%%% 春(来た). %%%%%%%%%%%%%%%%%%%%%%%%%% 春が(来た). %%%%%%%%%%%%%%%%%%%%%%%%%%% 春が来た(_春,_春が来た) :- 春(_春), 来た(_春,_春が来た). %%%%%%%%%%%%%%%%%%%%%%%%%%% 春が来た(_春,_来た) :- 春(_春), 来た(_来た). %%%%%%%%%%%%%%%%%%%%%%%%%%% 春が来た(_春,_来た,_春が来た) :- 春(_春), 来た(_春,_来た,_春が来た). %%%%%%%%%%%%%%%%%%%%%%%%%%% 春が来た(_春が来た) :- 春(_春), 来た(_来た), 春が来た(_春,_来た,_春が来た). % などの定義も考えられる。 %%%%%%%%%%%%%%%%%%%%%%%%%%% 春が来た(_春,_春が来た) :- 春が(_春), 来た(_春,_春が来た). %%%%%%%%%%%%%%%%%%%%%%%%%%% 春が来た(_春,_来た) :- 春が(_春), 来た(_来た). %%%%%%%%%%%%%%%%%%%%%%%%%%% 春が来た(_春,_来た,_春が来た) :- 春が(_春), 来た(_春,_来た,_春が来た). %%%%%%%%%%%%%%%%%%%%%%%%%%% 春が来た(_春が来た) :- 春が(_春), 来た(_来た), 春が来た(_春,_来た,_春が来た). % もあり得るし、僅かな違いで、 %%%%%%%%%%%%%%%%%%%%%%%%%% 春が来た(_春が,_春が来た) :- 春が(_春が), 来た(_春が,_春が来た). %%%%%%%%%%%%%%%%%%%%%%%%%%% 春が来た(_春が,_来た) :- 春が(_春が), 来た(_来た). %%%%%%%%%%%%%%%%%%%%%%%%%%% 春が来た(_春が,_来た,_春が来た) :- 春が(_春が), 来た(_春が,_来た,_春が来た). %%%%%%%%%%%%%%%%%%%%%%%%%%% 春が来た(_春が来た) :- 春が(_春が), 来た(_来た), 春が来た(_春が,_来た,_春が来た). % とする人もいるだろう。 %%%%%%%%%%%%%%%%%%%%%%%%%%% % さらに演算子を定義することによって、 :- op(600,xfx,が). 春 が 来た. % や %%%%%%%%%%%%%%%%%%%%%%%%%%% :- op(500,xf,が). :- op(700,xf,来た). 春 が 来た. % も勿論ある。 %%%%%%%%%%%%%%%%%%%%%%%%%%% が(春,来た). % もあるし、ここから派生して %%%%%%%%%%%%%%%%%%%%%%%%%%% が(春,来た,春が来た). %%%%%%%%%%%%%%%%%%%%%%%%%%% が(春,来た,_春,_来た) :- 春(_春), 来た(_春,_来た). % などの変化は大きく成長する余地がある。 %%%%%%%%%%%%%%%%%%%%%%%%%%% % 以下のように句構造として解析する定義も「春が来た」の定義を構成する。 春が来た(_構文解析項) :- 文([春,が,来た],_構文解析項,_). 文解析(_文,_解析) :- 形態素解析(_文,_形態素ならび), 文(_形態素ならび,_解析,_). 文(_文の語彙ならび,文(_名詞句情報,_動詞情報),_残り語彙ならび) :- 名詞句(_文の語彙ならび,_名詞句情報,_残り語彙ならび_1), 動詞(_残り語彙ならび_1,_動詞情報,_残り語彙ならび). 名詞句(_語彙ならび,名詞句(_名詞情報,_後置詞情報),_残り語彙ならび) :- 名詞(_語彙ならび,_名詞情報,_残り語彙ならび_1), 後置詞(_残り語彙ならび_1,_後置詞情報,_残り語彙ならび). 名詞([春|_残り語彙ならび],名詞([春,名詞,一般名詞]),_残り語彙ならび). 後置詞([が|_残り語彙ならび],後置詞([が,後置詞,格助詞]),_残り語彙ならび). 動詞([来た|_残り語彙ならび],動詞([来た,動詞,過去形]),_残り語彙ならび). % 文/3 % 以下のサイトは # 【問題】 # ある整数列が与えられます。その整数列を昇順に並び替えるとき、並び替える最小の範囲を見つけてください。 # 【例】 # 1 3 4 7 11 6 8 9 7 10 13 14 # # これを昇順に並び替えると # 1 3 4 6 7 7 8 9 10 11 13 14 # # となります。つまり、最初の整数列の、4番目から10番目を並び替えれば良いことになります。このとき、 # 4..10 # # と出力してください。もし、ソートする必要がなければ、 # 0 # # と出力してください。 # # 【解答方法】 # まずはsort.zipをダウンロードしてください。 # 中には6つのファイルが含まれています。 # # answer.txt # 解答用テキストファイルです。 # # input_case_1.txt # input_case_2.txt # input_case_3.txt # input_case_4.txt # input_case_5.txt # 整数列が含まれたデータファイルです。これらを入力として得られた結果を解答していただきます。 # データファイルの整数列は、改行区切りになっています。 # # answer.txtに必要事項を記入し、テキストファイルのままアップロードしてください。 # ※answer.txt以外のファイルをzipに固めてアップロードした場合は評価対象外となります。 # :- op(600,xfx,'::'). 'ある整数列が与えられます。その整数列を昇順に並び替えるとき、並び替える最小の範囲を見つけてください。'(_整数列,_開始位置 :: _終了位置) :- 範囲の開始位置(_整数列,_開始位置), 範囲の終了位置(_整数列,_終了位置),!. 'ある整数列が与えられます。その整数列を昇順に並び替えるとき、並び替える最小の範囲を見つけてください。'(_,0). 範囲の開始位置(L,_開始位置) :- append(L1,[A|L2],L), 'L1にAより大きい要素があるかL2にAより小さい要素がある'(A,L1,L2),!, length([_|L1],_開始位置). 範囲の終了位置(L,_終了位置) :- reverse(L,LR), append(L1,[A|L2],LR), 'L1にAより小さい要素があるかL2にAより大きい要素がある'(A,L1,L2),!, length([A|L2],_終了位置). 'L1にAより大きい要素があるかL2にAより小さい要素がある'(A,L1,L2) :- member(B,L1), B > A. 'L1にAより大きい要素があるかL2にAより小さい要素がある'(A,L1,L2) :- member(B,L2), B < A. 'L1にAより小さい要素があるかL2にAより大きい要素がある'(A,L1,L2) :- member(B,L1), B < A. 'L1にAより小さい要素があるかL2にAより大きい要素がある'(A,L1,L2) :- member(B,L2), B > A. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/772 # # 今朝急に友人から依頼されたのですが、javaしか経験したことがなく、C++なんて今まで触れたことすらないのでどなたかお助け下さい。 # 一応ウィンドウ画面については作れたのですが・・・。 # # [1] 授業単元: 課題 # [2] 問題文: # 1:数値a,b を入力し,a+b,a−b,a*b,a/b を計算するプログラムを作成して # ください。 #   注:数値は小数点以下を含むものとし,変数の型宣言をDouble としてください。 # # :- op(450,xfy,'+'). :- op(450,xfy,'−'). :- op(450,xfy,'*'). :- op(450,xfy,'/'). '数値a,b を入力し,a+b,a−b,a*b,a/b を計算するプログラムを作成してください。 注:数値は小数点以下を含むものとし,変数の型宣言をDouble としてください。' :- '数値a,b を入力し'(_数値a,_数値b), 'a+b,a−b,a*b,a/b を計算する'(_数値a,_数値b). '数値a,b を入力し'(_数値a,_数値b) :- 数を入力する(数値a,_数値a), 数を入力する(数値b,_数値b). 'a+b,a−b,a*b,a/b を計算する'(_数値a,_数値b) :- 'a+b,a−b,a*b,a/bの計算式を得る'(_数値a,_数値b,R,_式文字列), 計算して表示する(_式文字列,_数値a,_数値b), R = []. 'a+b,a−b,a*b,a/bの計算式を得る'(_数値a,_数値b,R,_式文字列) :- split('a+b,a−b,a*b,a/b',[,],L), append(_,[_式文字列|R],L). 計算して表示する(_式文字列,_数値a,_数値b) :- atom_to_term(_式文字列,_式,_), 計算する(_式,_数値a,_数値b,_計算結果), 表示する(_式文字列,_計算結果). 計算する(_ + _,_数値a,_数値b,_計算結果) :- _計算結果 is _数値a + _数値b. 計算する(_ − _,_数値a,_数値b,_計算結果) :- _計算結果 is _数値a - _数値b. 計算する(_ * _,_数値a,_数値b,_計算結果) :- _計算結果 is _数値a * _数値b. 計算する(_ / _,_数値a,_数値b,_計算結果) :- _計算結果 is _数値a / _数値b. 表示する(_式文字列,_計算結果) :- writef('%t = %t\n',[_式文字列,_計算結果]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/827 # # [1] 授業単元:整数演算 # [2] 問題文(含コード&リンク):以下の問題に答えなさい # # 50 # Σ((3*i)/2) = A の計算式を計算できるプログラムを完成させなさい。 # i=0 # # :- op(300,xfx,(..)). '50 Σ((3*i)/2) = A の計算式を計算できるプログラムを完成させなさい。 i=0'(_A) :- 'Σ'([_k = 0 .. 50],((3 * _k) / 2),_A). 'Σ'([_k = A .. B],_式,_累計値) :- findsum(Y,( between(A,B,_k), Y is _式), _累計値). findsum(A,P,S) :- findall(A,P,L), sum(L,S). sum([],0). sum([A|R],S) :- sum(R,S2), S is S2 + A. % 以下のサイトは # 数式が全部文字に置き換えられたモノから数式に戻して計算する関数を作りたいと思います。 # 例えば、[ Kazu 0.1, Tasu, Kazu 2.1, Hiku, Kazu 3.0, Kake, Kazu 2.9, Waru, Kazu 0.9]があって、 # これを戻すと 0.1 + 2.1 - 3.0 * 2.9 / 0.9 -> -7.46 みたいに結果をだしたい。 :- op(200,fx,kazu). :- op(200,fx,tasu). :- op(200,fx,hiku). :- op(200,fx,kake). :- op(200,fx,waru). '数式が全部文字に置き換えられたモノから数式に戻して計算する関数を作りたいと思います。 例えば、[ Kazu 0.1, Tasu, Kazu 2.1, Hiku, Kazu 3.0, Kake, Kazu 2.9, Waru, Kazu 0.9]があって、 これを戻すと 0.1 + 2.1 - 3.0 * 2.9 / 0.9 -> -7.46 みたいに結果をだしたい。'(L,_式,_結果) :- 数式が全部文字に置き換えられたモノから数式に戻して計算する(L,_式,_結果). 数式が全部文字に置き換えられたモノから数式に戻して計算する(L,_式,_結果) :- 演算子を置換する(_ならび,_演算子を置換されたならび), atomic_list_concat(_演算子を置換されたならび,' ',_式文字列), atom_to_term(_式文字列,_式,_), _結果 is _式. 演算子を置換する([],[]). 演算子を置換する([kazu _値|R1],[_値|R2]) :- 演算子を置換する(R1,R2). 演算子を置換する([_演算子文字列 _値|R1],[_演算子,_値|R2]) :- '演算子文字列・演算子'(_演算子文字列,_演算子), 演算子を置換する(R1,R2). '演算子文字列・演算子'(tasu,+). '演算子文字列・演算子'(hiku,-). '演算子文字列・演算子'(kake,*). '演算子文字列・演算子'(waru,/). % 以下のサイトは # 990 :デフォルトの名無しさん :sage :2013/03/16(土) 11:04:28.09 # # りんごが当たる確率20% # みかんが当たる確率35% # ばななが当たる確率45% # # これをコードにしたいんですが、この仕組みはどう実装していいのかわかりません # 言語は特にこだわりはないのですが、ヒントをください # # 991 :デフォルトの名無しさん :sage :2013/03/16(土) 11:09:36.39 # [0.0, 1.0)の乱数(x)を生成し、 # x < 0.2 なら りんご # 0.2 <= x < 0.55 なら みかん # 0.55 <= x なら ばなな # # 995 :デフォルトの名無しさん :2013/03/16(土) 12:21:55.33 # >>990 # そのくらい自分で考えられない知恵遅れがプログラミングなんかに手を出すな # :- op(300,xf,'%'). 'りんごが当たる確率20%'(20 '%'). 'みかんが当たる確率35%'(35 '%'). 'ばななが当たる確率45%'(45 '%'). 当たる確率(りんご,_当たる確率 '%') :- 'りんごが当たる確率20%'(_当たる確率 '%'). 当たる確率(みかん,_当たる確率 '%') :- 'みかんが当たる確率35%'(_当たる確率 '%'). 当たる確率(ばなな,_当たる確率 '%') :- 'ばななが当たる確率45%'(_当たる確率 '%'). 'りんご・みかん・ばななのどれかを取り出す'(_どれか) :- 一から百の範囲の乱数(_乱数), 割り当てた数範囲にある(_どれか,_乱数). 一から百の範囲の乱数(_乱数) :- _乱数 is random(100) + 1. 割り当てた数範囲にある(りんご,_乱数) :- between(1,20,_乱数). 割り当てた数範囲にある(みかん,_乱数) :- between(21,55,_乱数). 割り当てた数範囲にある(ばなな,_乱数) :- between(56,100,_乱数). 標本として用意すべき個数(_物,_総標本数,_標本として用意すべき個数) :- 当たる確率(_物,_当たる確率 '%'), _標本として用意すべき個数 is truncate((_総標本数 * _当たる確率 / 100) + 0.5). % 「割り当てた数範囲にある」と確率の関係がうまく説明できていない。 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1355011916/198 # # phpですがwebじゃないので、こちらで質問させて下さい # 趣味でプログラムをはじめて半年程度です # # 競馬のデータ処理をやっています # 数字と記号の混ざった文字列の数字部分を置き換えたいのですが # どうすればいいでしょうか? # # 具体的には、各馬の各コーナーの通過順位を以下のように馬番から着順に置き換えたいのです # (2,*15,14,5)(9,12,16)(8,3,6)-(10,13)(11,4)(7,1) *各馬の各コーナー通過順位 馬番表示 ←コレを # (10,*16,1,2)(8,4,6)(9,3,7)-(15,14)(11,13)(5,12) *各馬の各コーナー通過順位 着順表示 こうしたい # # # 現在データは、以下のようになっています # # 各馬の各コーナー通過順位 馬番表示は $corner *先週の朝日杯の3コーナー # (2,*15,14,5)(9,12,16)(8,3,6)-(10,13)(11,4)(7,1) # # 馬番は $umban # Array ( [0] => 14 [1] => 15 [2] => 2 [3] => 5 [4] => 9 [5] => 12 [6] => 16 [7] => 3 [8] => 8 [9] => 6 [10] => 10 [11] => 13 [12] => 4 [13] => 11 [14] => 7 [15] => 1 ) # # 着順は $tyaku # Array ( [0] => 1 [1] => 16 [2] => 10 [3] => 2 [4] => 8 [5] => 4 [6] => 6 [7] => 3 [8] => 9 [9] => 7 [10] => 15 [11] => 14 [12] => 13 [13] => 11 [14] => 5 [15] => 12 ) # # $umbanと$tyakuの相関性は、[0]は14番で1着、[1]は15番で16着、[2]は2番で10着、、etcとなっています # # phpです、宜しくお願いします *分割で見にくくなってしまいすいません # # # 11R 第64回 朝日杯フューチュリティステークス(GI)成績 # # サラ系2歳,1600m,芝・右 外 # (国際)牡・牝(指定)オープン,馬齢 # 本,賞,金,:,7000,、,2800,、,1800,、,1100,、,700,万円 # 付加賞金,:,121.8,、,34.8,、,17.4,万円 # 発走 15:25 # 天候:晴   芝:良 # :- op(400,xfx,':'). コーナー通過時の先頭からの各馬の最終到達順位(_レース,_通過時文字列,_到達順位に置換した通過時文字列) :- sPLIT(_通過時文字列,['(','-','=','*',')'],L1), 馬番を最終到達順位に変換(_レース,L1,L2), atomic_list_concat(L2,_到達順に置換した通過時順位). 馬番を最終到達順位に変換(_レース,[],[]). 馬番を最終到達順位に変換(_レース,[_馬番|R1],[_着順|R2]) :- integer(_馬番), レース成績(_レース,_着順,_馬番,_馬名,_性齢,_負担重量,_騎手,_タイム,_着差,_推定上り,_馬体重,_調教師,_単勝人気), 馬番を最終到達順位に変換(_レース,R1,R2). 馬番を最終到達順位に変換(_レース,[A|R1],[A|R2]) :- \+(integer(A)), 馬番を最終到達順位に変換(_レース,R1,R2). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',1,14, ロゴタイプ,牡2,55.0, M.デムーロ,1:33.4,'',36.1,482,-4, 田中剛,7). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',2,5, コディーノ,牡2,55.0, 横山典弘,1:33.4,クビ,36.0,476,+2, 藤沢和雄,1). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',3,3, ゴットフリート,牡2,55.0, C.スミヨン,1:33.8,2+1/2,36.0,470,+2, 斎藤誠,3). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',4,12, フラムドグロワール,牡2,55.0, C.ウィリアムズ,1:33.9,3/4,36.3,490, 0, 藤沢和雄,5). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',5,7, ティーハーフ,牡2,55.0, 武豊,1:33.9,クビ,35.5,436,-2, 西浦勝一,6). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',6,16, ノウレッジ,牡2,55.0, 蛯名正義,1:34.0,クビ,36.4,490,+2, 二ノ宮敬宇,10). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',7,6, ラブリーデイ,牡2,55.0, C.ルメール,1:34.0,クビ,36.2,472,-2, 池江泰寿,4). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',8,9,エーシントップ,牡2,55.0, 浜中俊,1:34.1,クビ,36.6,532,-2, 西園正都,2). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',9,8, クラウンレガーロ,牡2,55.0, 幸英明,1:34.1,ハナ,36.3,456,+12, 日吉正和,8). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',10, 2, ネオウィズダム,牡2,55.0, 柴田善臣,1:34.2,1/2,36.8,484,+2, 矢作芳人,12). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',11, 11, アットウィル,牡2,55.0, 岩田康誠,1:34.2,クビ,36.0,482,-2, 領家政蔵,13). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',12, 1, ザラストロ,牡2,55.0, 松岡正海,1:34.3,クビ,35.8,492,+4, 武藤善則,11). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',13, 4, テイエムイナズマ,牡2,55.0, 池添謙一,1:34.5,1+1/2,36.3,510,+10, 福島信晴,9). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',14, 13, ディアセルヴィス,牡2,55.0, 勝浦正樹,1:34.6,3/4,36.5,454,+4, 高橋裕,16). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',15, 10, ワキノブレイブ,牡2,55.0, 福永祐一,1:34.7,クビ,36.6,468,+6, 清水久詞,15). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',16, 15,マイネルエテルネル,牡2,55.0, 柴田大知,1:34.9,1+1/4,37.6,470,-2, 西園正都,14). %%%%% 実行例 %%%% ?- コーナー通過時の先頭からの各馬の最終到達順位('11R 第64回 朝日杯フューチュリティステークス(GI)','(2,*15,14,5)(9,12,16)(8,3,6)-(10,13)(11,4)(7,1)',_到達順位に置換した通過時文字列). _到達順位に置換した通過時文字列 = '(10,*16,1,2)(8,4,6)(9,3,7)-(15,14)(11,13)(5,12)' % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/142 # # [1] 授業単元:計算機実習 # [2] 問題文:http://ime.nu/ideone.com/baR2pW #       上記のプログラムに、複素数のひき算・掛け算・割り算の関数を追加し #       それを使った演算部分も追加しなさい。 # :- op(200,xf,i). 複素数の加算(_a + _b i,_c + _d i,_a_plus_c + _b_plus_d i) :- _a_plus_c is _a + _c, _b_plus_d is _b + _d. 複素数の減算(_a + _b i,_c + _d i,_a_minus_c + _b_minus_d i) :- _a_minus_c is _a - _c, _b_minus_d is _b - _d. 複素数の乗算(_a + _b i,_c + _d i,_ac_minus_bd - _bc_plus_ad i) :- _ac_minus_bd is _a * _c - _b * _d, _bc_plus_ad is _b * _c + _a * _d. 複素数の除算(_a + _b i,_c + _d i,_ac_plus_bd_div_c_c_plus_d_d + _bc_minus_ad_div_c_c_plus_d_d i) :- _ac_plus_bd_div_c_c_plus_d_d is (_a * _c + _b * _d) / (_c * _c + _d * _d), _bc_minus_ad_div_c_c_plus_d_d is (_b * _c - _a * _d) / (_c * _c + _d * _d). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/175 # # [1]C言語 # [2]問1. キーボードから正の整数を2 つ(x、y とする) 入力し、縦x 個、横y 個の文字'*' から # なる長方形を表示するプログラムを多重ループを用いて作成せよ。 # # 問2. キーボードから正の整数x を入力し、下記のように、一辺に'*' がx 個並んだ直角三角 # 形が画面に出力されるプログラムを作成せよ。(x = 5 のときの例) # ***** # **** # *** # ** # * # [3]Linux # gcc # C言語 # [4]本日中でお願いします。 # # :- op(700,xfx,(::)). 'キーボードから正の整数''x'' を入力し、一辺に''*'' がx 個並んだ直角三角形が画面に出力される' :- 'キーボードから正の整数''x'' を入力し'(_x), '一辺に''*'' がx 個並んだ直角三角形が画面に出力される'(_x). 'キーボードから正の整数''x'' を入力し'(_x) :- 整数を得る(正の整数x,_x > 0,_x). '一辺に''*'' がx 個並んだ直角三角形が画面に出力される'(0) :- !. '一辺に''*'' がx 個並んだ直角三角形が画面に出力される'(_x) :- _x :: write(*), nl, _x_1 is _x - 1, '一辺に''*'' がx 個並んだ直角三角形が画面に出力される'(_x_1). _回数 :: P :- between(1,_回数,N), P, _回数 = N. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/53 # # [1]C言語 for文 while文 do while文 # [2]問題 http://ime.nu/codepad.org/oxqRFj3G # [3]Linux gcc # [4]10月9日 10時 # [5]長めですがよろしくお願いします…。 # # /* # # 17. 1 から10 までの整数を一行に表示し、さらにこれを5 回繰り返すプログラムを作成せよ。た # だし、for を2 つ用いること。 # 1 2 3 4 5 6 7 8 9 10 # 1 2 3 4 5 6 7 8 9 10 # 1 2 3 4 5 6 7 8 9 10 # 1 2 3 4 5 6 7 8 9 10 # 1 2 3 4 5 6 7 8 9 10 # */ :- op(800,xf,さらにこれを5回繰り返す). '1 から10 までの整数を一行に表示し、さらにこれを5 回繰り返すプログラムを作成せよ。ただし、for を2 つ用いること。 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10' :- '1 から10 までの整数を一行に表示し、さらにこれを5 回繰り返すプログラムを作成せよ。ただし、for を2 つ用いること。'. '1 から10 までの整数を一行に表示し、さらにこれを5 回繰り返すプログラムを作成せよ。ただし、for を2 つ用いること。' :- '1 から10 までの整数を一行に表示し' さらにこれを5回繰り返す. '1 から10 までの整数を一行に表示し' :- for(1,N,9), writef('%t ',[N]), N = 9, write('10\n'). _これ さらにこれを5回繰り返す :- for(1,N,5), _これ, N = 5. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/52 # # [1] 授業単元:c言語 # [2] 問題文(含コード&リンク): # 複素数z=x+iyの実部Reと虚部Imをメンバに持つ構造体を定義し、 # 2つの複素数z1,z2に対して、和z1+z2と積z1×z2を求める関数を # それぞれ作成しなさい。返却値型もこの構造体とする。 # 構造体の定義例 # struct my_complex { # double Re; /** 実部 **/ # double Im; /** 虚部 **/ # } # # 配列のサイズなど、定数は#defineを利用. # 入力や表示を目的とする関数以外では、 # 関数の中で標準入力や標準出力への入出力は行わない. # :- op(250,fx,i). 複素数の和(_実部_1 + i _虚部_1,_実部_2 + i _虚部_2,_実部 + i _虚部) :- _虚部 is _虚部_1 + _虚部_2, _実部 is _実部_1 + _実部_2. 複素数の積(_実部_1 + i _虚部_1,_実部_2 + i _虚部_2,_実部 + i _虚部) :- _虚部 is (_実部_2 * _虚部_1) + (_実部_1 * _虚部_2), _実部 is (_実部_1 * _実部_2) - (_虚部_1 * _虚部_2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/214 # # よろしくお願いします。 # # [1] 授業単元: プログラミングC # [2] 問題文(含コード&リンク): # 値xの二乗値および三乗値を返す関数形式マクロ # sqr (x) # cub (x) # を定義し、下記(※)のようにint型変数、double型変数を用いた結果を表示しなさい。 # ※:http://ime.nu/kie.nu/a4f # :- op(550,xfx,は). sqr(_x,_二乗値) :- intger(_x), _二乗値 is _x * _x,!. sqr(_x,_二乗値) :- float(_x), _二乗値 is _x * _x. cub(_x,_三乗値) :- integer(_x), _三乗値 is _x * _x * _x,!. cub(_x,_三乗値) :- float(_x), _三乗値 is _x * _x * _x. _値 は _式 :- _式 =.. [_関数|_引数ならび], 引数ならびの評価(_引数ならび,_評価済みの引数ならび), _式_2 =.. [_関数|_評価済みの引数ならび], _値 は _式_2,!. _値 は _式 :- 関数定義(_式,_値),!. _値 は _式 :- _式 =.. [_関数|_引数ならび], append(_引数ならび,[_値],_引数ならびの二), _目標 =.. [_関数|_引数ならびの二], call(_目標),!. _値 は _式 :- _値 is _式. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/132 # # [1] 授業単元:プログラミング演習 # [2] 問題文: # double func(double x,double y, double z) # { # double sum; # sum=x+y+z; # return sum; # } # 上記のfunc関数を利用して3つの実数を入力すると、それらの合計値を計算するプログラムをmain関数からfunc関数を呼び出す形で作成しなさい。 # :- op(700,xfx,は). 関数定義(func(_x,_y,_z),_値) :- _値 is _x + _y + _z. _値 は _関数 :- 関数定義(_関数,_値),!. _値 は _関数 :- _値 is _関数. '上記のfunc関数を利用して3つの実数を入力すると、それらの合計値を計算する'(_合計値) :- '3つの実数を入力すると'(_実数_1,_実数_2,_実数_3), それらの合計値を計算する(_実数_1,_実数_2,_実数_3,_合計値). それらの合計値を計算する(_実数_1,_実数_2,_実数_3,_3つの実数の合計値) :- _3つの実数の合計値 は func(_実数_1,_実数_2,_実数_3). '3つの実数を入力すると'(_実数_1,_実数_2,_実数_3) :- 'n番目の実数を入力'(1,_実数_1), 'n番目の実数を入力'(2,_実数_2), 'n番目の実数を入力'(3,_実数_3). 'n番目の実数を入力'(_n,_実数) :- writef('%番目の実数を入力してください : ',[_n]), get_line(Line), 'n番目の実数を入力診断'(Line,_実数),!. 'n番目の実数を入力'(_n,_実数) :- 'n番目の実数を入力'(_n,_実数). 'n番目の実数を入力診断'(Line,_実数) :- atom_to_term(Line,_実数,_), float(_実数),!. 'n番目の実数を入力診断'(Line,_実数) :- writef('入力された %t からは実数値が得られません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/131 # # [1] 授業単元:プログラミング演習 # [2] 問題文: # 複素数a+ibのn乗を求めるプログラムを作成しなさい。 # ただし、係数a,bの値とnをそれぞれ読み込み、途中経過と計算結果を出力すること。 # :- op(250,fx,i). '複素数a+ibのn乗を求める'(X,1,X). '複素数a+ibのn乗を求める'(Y,_n,X) :- _n_1 is _n - 1, '複素数a+ibのn乗を求める'(Y,_n_1,Z), 複素数の掛け算(Y,Z,X). 複素数の掛け算(A + i B,C + i D,U + i V) :- U is A * C - B * D, V is B * C + A * D. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1252060267/747 # # 指定時刻に何かしたい! # 例えば・・・・ # 10時00分00秒に「イヤン!」と言う。 # 11時00分00秒に「バカン!」と言う。 # 12時00分00秒に「あなた、エッチね・・・・」と言う。 # こんな感じです! # 何か良い方法ありますか? # 上手にやってる方いますか?? # よろしくお願いします。 # # :- op(500,xf,と). :- op(600,xf,言う). '指定時刻に何かしたい!' :- localtime(_年,_月,_日,_曜日,_累計日数,_時,_分,_秒), '指定時刻に何かしたい!'(_時-_分-_秒). '指定時刻に何かしたい!'(10-00-00) :- 'イヤン!' と 言う. '指定時刻に何かしたい!'(11-00-00) :- 'バカン!' と 言う. '指定時刻に何かしたい!'(12-00-00) :- 'エッチ!' と 言う. _なになに と 言う :- writef('%t',[_なになに]). % % localtime/8 % % 以下のサイトは # @plus7さんの20120215のツイートより、 # # let atm = 101300.0<Pa>;; # let water_density = 1000.0<kg/m^3>;; # let g = 9.80665<m/s^2>;; # let length:float<m> = atm / (water_density*g);; # # このF#のブログラムと同じ内容のPrologプログラムは? :- op(250,xf,'Pa'). :- op(250,xf,'kg/m^3'). :- op(250,xf,'m/s^2'). :- op(250,xf,m). atm(101300.0 'Pa'). water_density(1000.0 'kg/m^3'). g(9.80665 'm/s^2'). length(_length m) :- atm(_atm 'Pa'), water_density(_water_density 'kg/m^3'), g(_g 'm/s^2'), _length is _atm / (_water_density * _g). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/876 # # [1] 授業単元:プログラム作成 # [2]D, C, B, A, S, Invalid という成績を表す列挙体 # enum result を定義し,点数(int 型)を引数として # enum result 型の値を返す関数 # seiseki_hantei(int sc) # と,enum result 型の値を引数として,成績を表示する関数も作成する # 点数と成績は以下の通とする # 0〜59 点: D # 60〜69 点: C # 70〜79 点: B # 80〜89 点: A # 90〜100 点: S # それ以外: Invalid # # # る関数 # print_seiseki(enum result res) # を作成せよ.この2 つの関数を使用して,以下の実行例 # のように点数を入力すると成績を表示するmain 関数も # 作成すること.点数と成績の関係は以下の通りとする. # 例. # 点数(整数)を入力してください:91 # 成績はS です。 # :- op(250,xfx,'〜'). :- op(280,xf,'点'). :- op(300,xfx,':'). 成績判定表(0 〜 59 点 : 'D'). 成績判定表(60 〜 69 点 : 'C'). 成績判定表(70 〜 79 点 : 'B'). 成績判定表(80 〜 89 点 : 'A'). 成績判定表(90 〜 100 点 : 'S'). '成績を入力して判定し、それを表示する' :- 成績を入力して(_成績), 成績を判定し(_成績,_判定), 判定を表示する(_判定). 成績を入力して(_成績) :- write('点数(整数)を入力してください:'), get_line(Line), 成績入力診断(Line,_成績),!. 成績を入力して(_成績) :- 成績を入力して(_成績). 成績入力診断(Line,_成績) :- atom_to_term(Line,_成績,_), integer(_成績),!. 成績入力診断(Line,_成績) :- writef('入力された%tからは整数が得られません。再入力をお願いします。\n',[Line]), fail. 成績を判定し(_点数,_判定) :- 成績判定表(_下限 〜 _上限 点 : _判定), _成績 >= _下限, _成績 =< _上限,!. 成績を判定し(_,成績が異常値). 判定を表示する(_判定) :- writef('判定は%tです\n',[_判定]),!. % 以下のサイトは # # リストを条件付きで三分割する。 # :- op(700,xf,含まない). :- op(700,xf,含む). 'リストを三つに分解する。前半部にはAを含まず、後半部にはBを含まない、すべての部分リストを示す'(A,B,_リスト,_前半部,_中半部,_後半部) :- append(_前半部,_中半部,_後半部,_リスト), _前半部 は A を 含まない, _後半部 は B を 含まない. L は A を 含む :- member(A,L). L は A を 含まない :- \+(member(A,L)). append([],L1,L2,L) :- append(L1,L2,L). append([A|R1],L1,L2,[A|R]) :- append(R1,L1,L2,R). % 以下のサイトは # # 井の頭線に関する情報が以下に纏められている。この述語定義について、 # 批判せよ。 # :- op(300,xf,(m)). :- op(300,xf,(mm)). 井の頭線(渋谷,神泉,500 m). 井の頭線(神泉,駒場東大前,900 m). 井の頭線(駒場東大前,池ノ上,1000 m). 井の頭線(池ノ上,下北沢,600 m). 井の頭線(下北沢,新代田,500 m). 井の頭線(新代田,東松原,500 m). 井の頭線(東松原,明大前,900 m). 井の頭線(明大前,永福町,1100 m). 井の頭線(永福町,西永福,700 m). 井の頭線(西永福,浜田山,800 m). 井の頭線(浜田山,高井戸,1200 m). 井の頭線(高井戸,富士見ヶ丘,800 m). 井の頭線(富士見ヶ丘,久我山,700 m). 井の頭線(久我山,三鷹台,1000 m). 井の頭線(三鷹台,井の頭公園,900 m). 井の頭線(井の頭公園,吉祥寺,600 m). 急行停車駅(渋谷). 急行停車駅(下北沢). 急行停車駅(明大前). 急行停車駅(永福町). 急行停車駅(久我山). 急行停車駅(吉祥寺). 乗り換え駅(吉祥寺,[中央線]). 乗り換え駅(明大前,[京王線]). 乗り換え駅(下北沢,[小田急線]). 乗り換え駅(渋谷,[山手線,埼京線,東横線,銀座線,田園都市線,半蔵門線,副都心線]). 軌間(井の頭線,1067 mm). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % 一般論として、単位節データベースの引数として複合項(構造体)を % 持つべきではない。 % m,mmといった単位情報は別に述語定義するべきである。 % 乗り換え駅の定義も % 軌間単位(mm). 駅間距離単位(m). % % を追加して上で % 井の頭線(渋谷,神泉,500). 井の頭線(神泉,駒場東大前,900). 井の頭線(駒場東大前,池ノ上,1000). 井の頭線(池ノ上,下北沢,600). 井の頭線(下北沢,新代田,500). 井の頭線(新代田,東松原,500). 井の頭線(東松原,明大前,900). 井の頭線(明大前,永福町,1100). 井の頭線(永福町,西永福,700). 井の頭線(西永福,浜田山,800). 井の頭線(浜田山,高井戸,1200). 井の頭線(高井戸,富士見ヶ丘,800). 井の頭線(富士見ヶ丘,久我山,700). 井の頭線(久我山,三鷹台,1000). 井の頭線(三鷹台,井の頭公園,900). 井の頭線(井の頭公園,吉祥寺,600). 乗り換え駅(吉祥寺,中央線). 乗り換え駅(明大前,京王線). 乗り換え駅(下北沢,小田急線). 乗り換え駅(渋谷,山手線). 乗り換え駅(渋谷,埼京線). 乗り換え駅(渋谷,東横線). 乗り換え駅(渋谷,田園都市線). 乗り換え駅(渋谷,銀座線). 乗り換え駅(渋谷,半蔵門線). 乗り換え駅(渋谷,副都心線). % とした方がよい。 % % 急行停車駅/2,乗り換え駅/3には井の頭線である情報がない。 % これを付加するべきである。 乗り換え駅(井の頭線,吉祥寺,中央線). 乗り換え駅(井の頭線,明大前,京王線). 乗り換え駅(井の頭線,下北沢,小田急線). 乗り換え駅(井の頭線,渋谷,山手線). 乗り換え駅(井の頭線,渋谷,埼京線). 乗り換え駅(井の頭線,渋谷,東横線). 乗り換え駅(井の頭線,渋谷,田園都市線). 乗り換え駅(井の頭線,渋谷,銀座線). 乗り換え駅(井の頭線,渋谷,半蔵門線). 乗り換え駅(井の頭線,渋谷,副都心線). 急行停車駅(井の頭線,渋谷). 急行停車駅(井の頭線,下北沢). 急行停車駅(井の頭線,明大前). 急行停車駅(井の頭線,永福町). 急行停車駅(井の頭線,久我山). 急行停車駅(井の頭線,吉祥寺). % % とするか、 % 井の頭線乗り換え駅(吉祥寺,中央線). 井の頭線乗り換え駅(明大前,京王線). 井の頭線乗り換え駅(下北沢,小田急線). 井の頭線乗り換え駅(渋谷,山手線). 井の頭線乗り換え駅(渋谷,埼京線). 井の頭線乗り換え駅(渋谷,東横線). 井の頭線乗り換え駅(渋谷,田園都市線). 井の頭線乗り換え駅(渋谷,銀座線). 井の頭線乗り換え駅(渋谷,半蔵門線). 井の頭線乗り換え駅(渋谷,副都心線). 井の頭線急行停車駅(渋谷). 井の頭線急行停車駅(下北沢). 井の頭線急行停車駅(明大前). 井の頭線急行停車駅(永福町). 井の頭線急行停車駅(久我山). 井の頭線急行停車駅(吉祥寺). % % とするべきである。 % % 書きなおしたもの % 以下のサイトは # 今日、教官に聞いてみよう。 :- op(650,xf,に). 今日、教官に聞いてみよう :- 意志がある(今日,私,聞く(教官 に)). 意志がある(今日,私,聞く(教官 に)). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1297602466/497 # # ../test/read.cgi/tech/1297602466/476 # /* C */ # for (i=0; i<10; i++) printf(i); # # # Python # for i in range(10): print i # # for文で0から9まで表示します # どちらが分かりやすいでしょう? # 答え: Python # # # 0 から 9 まで表示します # # というのが一番わかりやすいけど、 # Prologでこういう表記できるの? # :- op(500,xfx,から). :- op(550,xf,まで表示します). N1 から N2 まで 表示します :- for(N1,N,N2), writef('%t',[N]), N = N2. %%%%%%%%%%%%%%%%%%%%%%%%%%%% ?- 0 から 9 まで表示します. 0123456789 true. ?- % 以下のサイトは 出典::C/C++の宿題片付けます 146代目 #535 # すいません、ペペロンチーノの作り方を教えてください # # :- op(600,xf,cc). :- op(600,xf,片). :- op(600,xf,枚分). :- op(600,xf,個). ペペロンチーノの作り方 :- ペペロンチーノの材料表示, ペペロンチーノの作り方表示. ペペロンチーノの材料表示 :- write('ペペロンチーノの材料\n'), レシピ(ペペロンチーノ,材料,A,B 人前,C), writef('%t %t 人前 %t\n',[A,B,C]), fail. ペペロンチーノの材料表示. ペペロンチーノの作り方表示 :- write('\nペペロンチーノの作り方\n'), レシピ(ペペロンチーノ,作り方,_順序,_作り方), writef('%t. %t\n',[_順序,_作り方]), fail. ペペロンチーノの作り方表示. レシピ(ペペロンチーノ,材料,'塩,コショウ',6 人前,適量). レシピ(ペペロンチーノ,材料,'オリーブ油',6 人前,200 cc). レシピ(ペペロンチーノ,材料,'にんにく(つぶしたもの)',6 人前,3-4 片). レシピ(ペペロンチーノ,材料,'赤とうがらし',6 人前,1 個). レシピ(ペペロンチーノ,材料,'パセリのみじん切り',6 人前,2-3 枚 分). レシピ(ペペロンチーノ,作り方,1,'にんにくを細かく刻む'). レシピ(ペペロンチーノ,作り方,2,'スパゲッティをやわらかくなるまでゆでる'). レシピ(ペペロンチーノ,作り方,3,'刻んだにんにくと赤とうがらしをオリーブ油で十分に炒める'). レシピ(ペペロンチーノ,作り方,4,'ゆで上がったスパゲッティの水気を切り、深い皿に入れる'). レシピ(ペペロンチーノ,作り方,5,'にんにくを炒めた鍋からオリーブ油を直接皿に注ぐ'). レシピ(ペペロンチーノ,作り方,6,'黒コショウを振りかけてよく混ぜる'). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% にんにくを細かく刻む(_にんにく,_刻まれたにんにく) :- にんにく(_にんにく), 刻む(_にんにく,_刻まれたにんにく). スパゲッティをやわらかくなるまでゆでる(_鍋,_スパゲッティ,_ゆであがったスパゲッティ) :- 鍋(_鍋), スパゲッティ(_スパゲッティ), 鍋の湯を沸騰させる(_鍋,_鍋の中の沸騰した湯), 注ぐ(_鍋の中の沸騰した湯,_スパゲッティ,_湯で煮られるスパゲッティ), やわらかくなる(_湯で煮られるスパゲッティ,_ゆであがったスパゲッティ). 刻んだにんにくと赤とうがらしを十分に炒める(_小鍋,_刻んだにんにく,_赤とうがらし,_オリーブ油,_炒めたにんにく,_炒めた赤とうがらし,_にんにくと赤とうがらしの味の滲みでたオリーブ油) :- 小鍋(_小鍋), 赤とうがらし(_赤とうがらし), オリーブ油(_オリーブ油), 中に入れる(_小鍋,_刻んだにんにく,_赤とうがらし,_オリーブ油,_具の入った小鍋), 十分に炒める(_具の入った小鍋,_炒めたにんにく,_炒めた赤とうがらし,_にんにくと赤とうがらしの味の滲みでたオリーブ油). 'ゆであがったスパゲッティの水気を切り、深い皿に入れる(_ゆであがったスパゲッティ,_水気の切れたスパゲッティを入れた深い皿) :- 水気を切る(_ゆであがったスパゲッティ,_水気のきれたスパゲッテイ), 深い皿に入れる(_深い皿,_水気の切れたスパゲッティ,_水気の切れたスパゲッティを入れた深い皿). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/819 # # [1] 授業単元:プログラミング演習 2 # [2] 問題文(含コード&リンク) # # 球の体積を計算するプログラムを作成しなさい。 # <作成条件> # 関数の定義は以下の順序で行うこと。(プロトタイプ宣言が必要となります) # main()関数 # 下記の関数を組み合わせて呼び出し、直径15のときの球の体積を求め、その値を表示してください。 # ただし、main()関数内では、変数を一切使うことなく関数の呼び出しを行ってください。 # 体積の計算用として、下記の2つの関数を定義してください。 # 1. radius関数:直径を引数として受け取り、半径を返却値として返す # 2. volume関数:半径を引数として受け取り、球の体積を返却値として返す # ただし、引数及び返却値の型は、すべて double 型とします。 # <実行例> # 体積 = 1766.25 :- op(700,xfx,は). 球の体積を計算する :- 関数表示(球の体積(直径から半径を得る(15))), nl. 直径から半径を得る(_直径,_半径) :- _半径 is _直径 / 2. 球の体積(_半径,_球の体積) :- _球の体積 is (4 * _半径 * _半径 * _半径) / 3. 関数表示(_関数) :- _関数の値 は _関数, write_formatted('%t',[_関数の値]). % は/2 % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/277 # # [1] 授業単元:プログラミング言語(C) # [2] 問題文(含コード&リンク): # Cプログラミングの基礎[新訂版]発行:サイエンス社 著:蓑原隆より # P48 3.1 3.2 3.3 3.4 P55 4.1 P88 5.1 P104 6.1 6.2 # http://ime.nu/upload.jpn.ph/upload/img/u72273.jpg # http://ime.nu/upload.jpn.ph/upload/img/u72276.jpg # http://ime.nu/upload.jpn.ph/upload/img/u72274.jpg # http://ime.nu/upload.jpn.ph/upload/img/u72275.jpg # # 3.4 二次方程式 ax2+bx+c = 0 のa,b,cを入力すると答えをだす # プログラムを作成せよ。ただし、aが0の場合を考慮せよ。また、 # 実根、重根、虚根の判定をして、重根の場合は答えを1つだけ # 表示し、虚根の場合は、 # # x = 0.5 + 0.3i x = 0.5 - 0.3i # # のように虚部、実部を表示せよ。 :- op(200,xf,i). '二次方程式 ax2+bx+c = 0 のa,b,cを入力すると答えをだすプログラムを作成せよ。ただし、aが0の場合を考慮せよ。また、実根、重根、虚根の判定をして、重根の場合は答えを1つだけ表示し、虚根の場合は、 x = 0.5 + 0.3i x = 0.5 - 0.3i のように虚部、実部を表示する' :- write('ax*x+bx+c=0の係数 aを入力してください : '), get_integer(_a), write('ax*x+bx+c=0の係数 bを入力してください : '), get_integer(_b), write('ax*x+bx+c=0の係数 cを入力してください : '), get_integer(_c), '二次方程式 ax2+bx+c = 0 のa,b,cを入力すると答えをだす'(_a,_b,_c,_判定,_解), 判定と解を表示する(_判定,_解). '二次方程式 ax2+bx+c = 0 のa,b,cを入力すると答えをだす'(0,_b,_c,一次方程式,_解) :- \+(_b=0), _解 is ((-1) * _c) / _b,!. '二次方程式 ax2+bx+c = 0 のa,b,cを入力すると答えをだす'(_a,_b,_c,重根,_解) :- ( _b * _b - 4 * _a * _c ) = 0, _解 is ((-1) * _b) / (2 * _a),!. '二次方程式 ax2+bx+c = 0 のa,b,cを入力すると答えをだす'(_a,_b,_c,実根,_解) :- ( _b * _b - 4 * _a * _c ) > 0, _解 is ((-1) * _b + sqrt(_b * _b - 4 * _a * _c)) / (2 * _a). '二次方程式 ax2+bx+c = 0 のa,b,cを入力すると答えをだす'(_a,_b,_c,虚根,_解) :- ( _b * _b - 4 * _a * _c ) < 0, _解 is ((-1) * _b) / (2 * _a) + sqrt((( _b * _b - 4 * _a * _c ) * (-1)) / (2 * _a))). '二次方程式 ax2+bx+c = 0 のa,b,cを入力すると答えをだす'(_a,_b,_c,虚根,_解) :- ( _b * _b - 4 * _a * _c ) < 0, A is ((-1) * _b) / (2 * _a)), B is sqrt(( _b * _b - 4 * _a * _c ) * (-1)) / (2 * _a), _解 = (A + B i). '二次方程式 ax2+bx+c = 0 のa,b,cを入力すると答えをだす'(_a,_b,_c,虚根,_解) :- ( _b * _b - 4 * _a * _c ) < 0, A is ((-1) * _b) / (2 * _a)), B is sqrt(( _b * _b - 4 * _a * _c ) * (-1)) / (2 * _a), _解 = (A - B i). 判定と解を表示する(実根,_解) :- write_formatted('判定=実根, x = %t;\n',[_解]), fail. 判定と解を表示する(実根,_解) :- write_formatted('判定=実根, x = %t\n',[_解]),!. 判定と解を表示する(虚根,_解) :- write_formatted('判定=虚根, x = %t;\n',[_解]), fail. 判定と解を表示する(虚根,_解) :- write_formatted('判定=虚根, x = %t\n',[_解]),!. 判定と解を表示する(_判定,_解) :- write_formatted('判定=%t, x = %t;\n',[_判定,_解]). } % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/39 # # 1] 授業単元:プログラミングC # [2] 問題文:「90min = 1h30m」を関数を使って表せ 分から時間へは関数mtohをつかう。 # :- op(450,xfx,時間). :- op(250,xf,分). :- op(450,xfx,h). :- op(250,xf,min). :- op(250,xf,m). 時間分変換(_分_1 分 = _時 時 _分_2 分) :- var(_分_1), _分_1 is _時 * 60 + _分_2,!. 時間分変換(_分_1 分 = _時 時間 _分_2 分) :- integer(_分_1), _時 is _分_1 // 60, _分_2 is _分_1 mod 60. mtoh(_分_1 min = _時 h _分_2 m) :- var(_分_1), _分_1 is _時 * 60 + _分_2,!. mtoh(_分_1 min = _時 h _分_2 m) :- integer(_分_1), _時 is _分_1 // 60, _分_2 is _分_1 mod 60. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ?- 時間分変換(132 分 = X 時間 Y 分). X = 2, Y = 12. yes. ?- 時間分変換(_分 分 = 3 時間 40 分). _分 = 220. yes. ?- % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/651 # # [1] 授業単元: プログラミング # [2] 問題文: # 配列によるスタックを実現する。出来るだけ簡単なアルゴリズムで # ポップとプッシュの操作が可能なプログラムを作れ。正し配列は100要素 # 程度とする。 # # % PSI のKL0言語のデータ管理命令を使ってみる。 :- op(600,fx,push). '配列によるスタックを実現する。出来るだけ簡単なアルゴリズムでポップとプッシュの操作が可能なプログラムを作れ。正し配列は100要素' :- new_heap_vector(_HeapVector,100), スタック操作コマンド(_HeapVector,0). スタック操作(_,満杯) :- !. スタック操作(_,空) :- !. スタック操作(_HeapVector,_スタックポインタ) :- write('? '), get_line(Line), atom_to_term(Line,Term,_), スタック操作コマンド(_HeapVector,_スタックポインタ,Term,_診断), スタック操作(_HeapVector,_診断). スタック操作コマンド(_HeapVector,_スタックポインタ,push(_要素),_実行後スタックポインタ) :- push(push(_HeapVector,_要素,_スタックポインタ,_実行後スタックポインタ), write_formatted('%t >> \n',[_要素]),!. スタック操作コマンド(_HeapVector,_スタックポインタ,pop,_実行後スタックポインタ) :- pop(_HeapVector,_スタックポインタ,_実行後スタックポインタ,_要素), write_formatted('%t << \n',[_要素]),!. push(_HeapVector,_要素,100,満杯) :- !. push(_HeapVector,_要素,_実行前スタックポインタ,_実行後スタックポインタ) :- set_vector_element(_HeapVector,_実行前スタックポインタ,_要素), _実行後スタックポインタ is _実行前スタックポインタ + 1. pop(_HeapVector,0,_実行後スタックポインタ,空) :- !. pop(_HeapVector,_実行前スタックポインタ,_実行後スタックポインタ,_要素) :- set_vector_element(_HeapVector,_実行前スタックポインタ,_要素), _実行後スタックポインタ is _実行前スタックポインタ - 1. %% リストによるStackの処理 %% push(_挿入要素,_現在のスタック,_挿入後のスタック) :- _挿入後のスタック = [_挿入要素|_現在のスタック]. pop(_現在のスタック,_取り出し要素,_取り出し後のスタック) :- _現在のスタック = [_取り出し要素|_取り出し後のスタック],!. pop([],[],[]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/823 # # [1] 授業単元:C演習2 # [2] 問題文(含コード&リンク): # double 型の実部、虚部から構成される倍精度複素数の構造体を定義し、入力した2つの # 複素数の和差積商を算出するプログラムを作成しなさい # :- op(200,fx,i). 複素数の和(X1 + i(Y1),X2 + i(Y2),X3 + i(Y3)) :- X3 is X1 + X2, Y3 is Y1 + Y2. 複素数の差(X1 + i(Y1),X2 + i(Y2),X3 + i(Y3)) :- X3 is X1 - X2, Y3 is Y1 - Y2. 複素数の積(X1 + i(Y1),X2 + i(Y2),X3 + i(Y3)) :- X3 is X1 * X2 - Y1 * Y2, Y3 is X1 * Y2 + Y1 * X2. 複素数の商(X1 + i(Y1),X2 + i(Y2),X3 + i(Y3)) :- X3 is (X1*Y1+X2*Y2) / (X2*X2+Y2*Y2), Y3 is (Y1*X2-X1*Y2) / (X2*X2+Y2*Y2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1272006124/168 # # <問題> # 以下のようにスポーツができるか否かを判断するプログラムを考える。 # 1. 天気が晴れの場合は, テニスコードが空いているならテニスができる。 # 2. 天気が晴れでない場合は, 卓球室があいているなら卓球ができる。 # 3. 上記以外の場合はなにもしない。 # ここで天気状況などの事実を次のように定義する。 # weather(clear). % 天気が晴れ(これを削除すれば「天気が晴れでない」となる) # empty(tennis-court). % テニスコードが空き # ...... # また、スポーツができるか否かを上記事実に基つく推論する規則play-sport() は次のように定義 # する。 # play-sport :- weather(clear), !, empty(tennis-court), write('tennis'). # play-sport :- empty(table-tennis-court), write('table tennis'). # これらの規則により # weather(clear)(天気が晴れ)とempty(tennis-court)(テニスコードが空き)がともに真の # 場合は, 1番目の規則が成立する。 # weather(clear) が真でもempty(tennis-court) が偽の場合、1番目の規則は成立しない。しか # も既に「!」を通過したため、2 番目の推論規則がカットされ、全ての規則が成立しないこ # とになる。 # weather(clear) が偽の場合は,「!」を通過せずに1番目の規則が成立しなくなるため、2 番 # 目の規則が適用さる。これでempty(table-tennis-court) の真偽により2番目の規則が成立す # るか否かが決まる。 # # :- op(750,xfx,が). どんなスポーツをするか(テニス) :- テニスをする,!. どんなスポーツをするか(卓球) :- 卓球をする,!. どんなスポーツをするか(なにもしない) :- なにもしない. テニスをする :- テニスができる. 卓球をする :- \+(天気 が 晴れ),卓球ができる. なにもしない :- \+(テニスをする),\+(卓球をする). テニスができる :- '天気が晴れの場合は, テニスコートが空いているならテニスができる。'. '天気が晴れの場合は, テニスコートが空いているならテニスができる。' :- 天気 が 晴れ, テニスコート が 空いている. 卓球ができる :- 卓球室 が あいている. % 例えば以下のように状況に関する定義を書く。 天気 が 晴れ. テニスコート が 空いている. 卓球室 が あいている. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/586 # # [1] 授業単元:プログラミング演習(テーマ:関数の使い方とデータの受け渡し方) # [2] 問題文(含コード&リンク):main 関数内の標準入力から入力された # 文字列を引数として関数に渡し、関数内で表示するプログラムを作成せよ。 # % 関数ということにこだわるなら。 :- op(750,xfx,は). 'main 関数内の標準入力から入力された文字列を引数として関数に渡し、関数内で表示するプログラムを作成せよ。'(_結果) :- get_line(_文字列), _結果 は 関数に渡して関数内で表示(_文字列). 関数に渡して関数内で表示(Line,ok) :- write_formatted('%t\n',[Line]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/590 # # 似たような質問なんですが # すべてのカラムに対してそれぞれではなく、複数まとめて検索したい場合は # どうするのでしょうか? # # イメージ的には複数のフィールドを取り出してくっつけて1文にして # それにXXX and YYY で検索する感じです # # 実はすごく簡単なような気もするんですが # 全部取り出してくっつけたものを、この検索のためのフィールドに入れておく # くらいしか思いつきません # # name address   tel   ・・・・ # ------------------------------ # itouYYY XXXZZZ 0123-4567 # itouZZZ YYYYFF 1234-0123 # hanaXXX LLLZZZ XXXX-XXXX # # で、(itouYYY XXXZZZ 0123-4567 …)が欲しい # # # :- op(750,xfx,and). 'すべてのカラムに対してそれぞれではなく、複数まとめて検索したい場合は'(_テーブル名,_検索文字列1 and _検索文字列2,L) :- findall(_,テーブル定義(_テーブル名,_id,_属性名),L), P =.. [_テーブル名|L], call(P), concat_atom(L,S), sub_atom(S,_,_,_,_検索文字列1), sub_atom(S,_,_,_,_検索文字列2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/489 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): # # 円周率 π の値を近似式 # # π ? 4Σ(‐1)^n[{(1/2)^2n+1} +{(1/3)^2n+1}]/( 2 n + 1 ) を用いて小数第8位まで正しい値(3.14159265)を出力し,(Σはn=0。100まで) # # # その π の値を用いて入力された数値 ε に対して,次の不等式を満た # す最小の自然数 N を求めるプログラムを作れ. # # # |{π^2}/6-Σ(k=1.N)1/k^2|<ε # # # # できる方がいたらやり方を教えてください。 :- op(700,xfx,は). 'π ? 4Σ(‐1)^n[{(1/2)^2n+1} +{(1/3)^2n+1}]/( 2 n + 1 ) を用いて小数第8位まで正しい値(3.14159265)を出力する' :- π(X) , write_formatted('%.8f\n',[X]). π(X) :- π(0,100,0,X). π(N,M,X,X) :- N > M,!. π(N,M,Y,X) :- V is 2 * N + 1, U1 is ( 1.0 / 2.0 ) ^ V, U2 is ( 1.0 / 3.0 ) ^ V, W is 4 * ((-1) ^ N) * (U1+U2) / V, N2 is N + 1, Y2 is Y + W, π(N2,M,Y2,X). 'その π の値を用いて入力された数値 ε に対して,次の不等式を満たす最小の自然数Nを求める'(_ε,N) :- for(0,N,maxint), sigma_1(N,Sigma_1), X は abs(π ^ 2 / 6 - Sigma_1), X < _ε,!. sigma_1(N,Sigma_1) :- findsum(U,( for(1,K,N), U is 1 / K ^ 2), Sigma_1). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/944 # # [1] 授業単元:基礎プログラミング # [2] 問題文(含コード&リンク) # 下記の様に、料理名の入力や材料名をキーボードより入力して、人数分の料理のレシピを計算して表示するプログラムを作成しなさい. # 今日の料理名は何ですか:(料理名) # 
材料名は何ですか:( 材料)
 # ( 材料) は一人当たり何グラム必要ですか:(分量) # 
何人分の料理を作りますか:(人数) # 
==レシピ== # 今日は、(料理名)を作りましょう。 # 
「(料理名)を(人数)人分作るには,(改行) # 
( 材料) が ( 分量×人数 ) グラム必要です」
 # *()内の料理名や材料には自分の好きな名前を考えてください。
* 人数、分量はキーボードから入力した値を使用してください。
 # printf 関数内で%sや%dを使用して、文字列(料理名・材料名)や整数値(人数・分量)を表示すること。 # :- op(250,xf,g). :- op(250,xf,kg). :- op(250,xf,cc). :- op(250,xf,羽). :- op(250,xf,個). :- op(250,xf,個分). :- op(250,xf,尾). :- op(250,xf,枚). :- op(250,xf,リットル). :- op(250,xf,串). :- op(250,xf,欠片). :- op(250,xf,瓶). :- op(250,xf,カップ). :- op(300,fx,大匙). :- op(300,fx,小匙). :- op(250,xf,杯). レシピの作成 :- write('今日の料理名は何ですか: '), get_line(_料理名), 材料を入力(_材料ならび), write('何人前のレシピを作りますか : '), get_integer(_何人前), レシピの作成(_料理名,_何人前,_材料ならび), 作り方の入力(1,_作り方ならび), 作り方の定義(_料理名,_作り方ならび). 材料を入力([[_材料,_一人当たりの分量]|R]) :- write('どんな材料を使いますか : '), get_line(_材料), \+(_材料 = ''), write('一人当たりの分量を入力してください : '), get_line(_一人当たりの分量), atom_to_term(Line,_一人当たりの分量,_), 材料を入力(R). 材料を入力([]). レシピの作成(_料理名,_何人前,[]) :- !. レシピの作成(_料理名,_何人前,[[_材料,_分量]|R]) :- 量の換算(_一人当たりの分量,_何人前,_分量), assertz(レシピ(_料理名,_材料,_何人前,_分量)), レシピの作成(_料理名,_何人前,R). 量の換算(A,M-N,B) :- _何人前 is (M+N) // 2, 量の換算(A,_何人前,B),!. 量の換算(少々,_,少々) :- !. 量の換算(少量,_,少量) :- !. 量の換算(適量,_,適量) :- !. 量の換算(N g,_何人前,M g) :- M is truncate(N * _何人前),!. 量の換算(N kg,_何人前,M g) :- M is truncate(1000 * N * _何人前),!. 量の換算(N cc,_何人前,M cc) :- M is truncate(N * _何人前),!. 量の換算(N 羽,_何人前,M 羽) :- M is truncate(N * _何人前),!. 量の換算(N1-N2 個,_何人前,M1-M2 個) :- M1 is truncate(N1 * _何人前),M2 is truncate(N2 * _何人前),!. 量の換算(N 個,_何人前,M 個分) :- M is truncate(N * _何人前),!. 量の換算(N 個,_何人前,M 個) :- M is truncate(N * _何人前),!. 量の換算(N 尾,_何人前,M 尾) :- M is truncate(N * _何人前),!. 量の換算(N1-N2 枚,_何人前,M1-M2 枚) :- M1 is truncate(N1 * _何人前),M2 is truncate(N2 * _何人前),!. 量の換算(N 枚,_何人前,M 枚) :- M is truncate(N * _何人前),!. 量の換算(N リットル,_何人前,M cc) :- M is truncate(1000 * N * _何人前),!. 量の換算(N 串,_何人前,M 串) :- M is truncate(N * _何人前),!. 量の換算(N 欠片,_何人前,M 欠片) :- M is truncate(N * _何人前),!. 量の換算(N 瓶,_何人前,M 瓶) :- M is truncate(N * _何人前),!. 量の換算(N カップ,_何人前,M カップ) :- M is truncate(N * _何人前),!. 量の換算(大匙 N 杯,_何人前,大匙 M 杯) :- M is truncate(N * _何人前),!. 量の換算(小匙 N 杯,_何人前,小匙 M 杯) :- M is truncate(N * _何人前),!. レシピの保存(_料理名) :- concat_atom([レシピ,'/',_料理名,'.pro'],_保存ファイル名), tell(_保存ファイル名), listing(レシピ/4), told. 作り方の入力(N,[[N,_作業]|R]) :- get_line(_作業), \+(_作業 = ''), N2 is N + 1, 作り方の入力(N2,R). 作り方の入力(_,[]). 作り方の定義(_料理名,[]) :- !. 作り方の定義(_料理名,[[_手順番号,_手順]|R]) :- assertz(作り方(_料理名,_手順番号,_手順)), 作り方の定義(_料理名,R). 作り方の保存(_料理名) :- concat_atom([作り方,'/',_料理名,'.pro'],_保存ファイル名), tell(_保存ファイル名), listing(作り方/3), told. /* レシピ(カエルのバターとブドウ酒の煮込み,皮を剥いだカエルの足,6,900 g). レシピ(カエルのバターとブドウ酒の煮込み,辛口の白ブドウ酒,6,200 cc). レシピ(カエルのバターとブドウ酒の煮込み,小麦粉,6,3 g). レシピ(カエルのバターとブドウ酒の煮込み,塩,6,少々). レシピ(カエルのバターとブドウ酒の煮込み,パセリのみじん切り,6,2-3 枚). レシピ(カエルのバターとブドウ酒の煮込み,レモン,6,1 個). レシピ(すずきの白ブドウ酒入り蒸し焼き,'海すずき(1.1kg)',6,1 尾). レシピ(すずきの白ブドウ酒入り蒸し焼き,塩,6,少量). レシピ(すずきの白ブドウ酒入り蒸し焼き,辛口白ブドウ酒,6,400 cc). レシピ(すずきの白ブドウ酒入り蒸し焼き,バター,6,25 g). 作り方(カエルのバターとブドウ酒の煮込み,1,'マリネのためにブドウ酒を使ってカエルの足を浸す'). 作り方(カエルのバターとブドウ酒の煮込み,2,'バターを深底のフライパンに溶かす'). 作り方(カエルのバターとブドウ酒の煮込み,3,'マリネからカエルの足を取り出したおく'). 作り方(カエルのバターとブドウ酒の煮込み,4,'フライパンにブドウ酒をそそぎ、バターとよく混ぜ合わせ、足を加える'). 作り方(カエルのバターとブドウ酒の煮込み,5,'ブドウ酒が半量煮つまるまで、中火で煮る'). 作り方(カエルのバターとブドウ酒の煮込み,6,'小麦粉、塩少々、パセリ、水 30ccを混ぜ合わせる'). 作り方(カエルのバターとブドウ酒の煮込み,7,'フライパンに入れて混ぜ合わせる'). 作り方(カエルのバターとブドウ酒の煮込み,8,'中火でさらに15分火を通し続ける'). 作り方(カエルのバターとブドウ酒の煮込み,9,'供する前に、カエルの足にレモン汁をふりかけて、供する'). 作り方(すずきの白ブドウ酒入り蒸し焼き,1,'皮に傷をつけないように下ごしらえする。魚はきざみ目をつけて内側に塩をする。'). 作り方(すずきの白ブドウ酒入り蒸し焼き,2,'鍋にブドウ酒、バター、塩少量を入れて魚を入れ、蓋をして中火のオープンで約20分間魚がやわらかくなるまで蒸し焼きにする。'). 作り方(すずきの白ブドウ酒入り蒸し焼き,3,'魚を皿に盛り魚の背中に2~3つの切り目をつけ、上から濾した煮汁をかけてすぐ供する。'). */ % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1136788500/499 # # Visual Basicでの質問なんですが、 # # 今給料明細のプログラミングをしてまして、 # 1日目の就業時間 8時間30分 # 2日目の就業時間 8時間30分 # 3日目〜〜 # 4日目〜〜 # # 総労働時間123時間30分 # などという用に作りたいのですが、 # timeserial関数を使って計算したところ24時間以降はまた1になってしまいます。 # 何かいい方法はないでしょうか? # # :- op(450,xfx,時間). :- op(440,xf,分). :- op(500,xfx,日目の就業時間). 就業時間合計(_時間,_分) :- findsum([_N2,_N3],(N 日目の就業時間 N2 時間 N3 分),[_時間_1,_分_1]), _分 is truncate(_分_1) mod 60, _時間プラス is _分_1 // 60, _時間 is truncate(_時間_1) + _時間プラス. /* 就業時間合計(_就業時間テキスト,_時間,_分) :- get_lines(_就業時間テキスト,Lines), member(Line,Lines),, replace(Line,日目の就業時間,' 日目の就業時間',Line1), replace(Line1,時間,' 時間',Line2), replace(Line2,分,' 分',Line3), atom_to_term(Line3,Term,_), assertz(Term), fail. 就業時間合計(_就業時間テキスト,_時間,_分) :- 就業時間(_時間,_分). */ % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/595 # # [1] 授業単元:プログラミング演習 # Q1. 問題文:4つの整数を入力し、それらを要素とする行列を求め、その値を以下のような # 形式で表示するプログラムを作成せよ。 # # 例 100 20 30 40と入力すれば #   | 100 20 | =3400 # | 30 40 | と表示される # # Q.2ディスカウントストアでどの商品でも5個以上買えば1割引、10個以上で2割引、20個以上で # 4割引となっていた。キーボードから買う商品の単価と個数を入力し、合計金額を計算するプログラミングを # 作成せよ。 # :- op(700,xfx,は). 'ディスカウントストアでどの商品でも5個以上買えば1割引、10個以上で2割引、20個以上で4割引となっていた。キーボードから買う商品の単価と個数を入力し、合計金額を計算する' :- write('商品単価と個数を入力してください : '), get_split_line([' ',','],[_単価,_個数]), 合計金額を計算する(_単価,_個数,_合計金額). 合計金額を計算する(_単価,_個数,_合計金額) :- abs(_個数) < 5, _合計金額 は 四捨五入(_単価 * _個数). 合計金額を計算する(_単価,_個数,_合計金額) :- abs(_個数) >= 5,abs(_個数) < 10, _合計金額 は 四捨五入(_単価 * _個数 * (1-0.1)). 合計金額を計算する(_単価,_個数,_合計金額) :- abs(_個数) >= 10,abs(_個数) < 20, _合計金額 は 四捨五入(_単価 * _個数 * (1-0.2)). 合計金額を計算する(_単価,_個数,_合計金額) :- abs(_個数) >= 20, _合計金額 は 四捨五入(_単価 * _個数 * (1-0.4)). _値 は 四捨五入(_式) :- _値_1 は _式, _値_1 >= 0.0, _値 is truncate(floor(_値_1 + 0.5)),!. _値 は 四捨五入(_式) :- _値_1 は _式, _値_1 < 0.0, _値 is truncate(ceiling(_値_1 - 0.5)),!. _値 は _式 :- _値 is _式. % 以下のサイトは # c137 #534 # [1] 授業単元: Visual Studio 入門 # [2] 問題 半乱順列の関数作成 # :- op(300,xf,回). :- op(700,xf,切る). 半乱順列の作成(_置換指定,_対象ならび,_半乱順列ならび) :- 整列(_対象ならび,_整列したならび), 整列したならび乱す(_置換指定,_整列したならび,_半乱順列ならび). 整列したならび乱す(最初と最後の要素を入れ替える,L1,L2) :- '最初と最後の要素を入れ替えて、整列したならびを乱す'(L1,L2). 整列したならびを乱す(N 回 切る,L1,L2) :- 'N回切って、整列したならびを乱す'(N,L1,L2). 整列したならびを乱す([[N1,N2]|R],L1,L2) :- '入れ替え位置指定ならびから、整列したならびを乱す'([[N1,N2]|R],L1,L2). '最初と最後の要素を入れ替えて、整列したならびを乱す'(L1,L2) :- [A|R]=L3, append(L4,[B],R), append([B|L4],[A],L2),!. 'N回切って、整列したならびを乱す'(0,L,L) :- !. 'N回切って、整列したならびを乱す'(N,L1,L2) :- 入れ替え位置を得る(L1,N1,N2), ならびの交換(N1,N2,L1,L3), succ(N1,N), 'N回切って、整列したならびを乱す'(N1,L1,L2). 入れ替え位置を得る(L1,N1,N2) :- length(L1,Len), N1 is random mod Len, N2 is random mod Len. '入れ替え位置指定ならびから、整列したならびを乱す'([],L,L) :- !. '入れ替え位置指定ならびから、整列したならびを乱す'([[N1,N2]|R],L1,L2) :- ならびの交換(N1,N2,L1,L3), '入れ替え位置指定ならびから、整列したならびを乱す'(R,L3,L2). ならびの交換(M,N,_対象ならび,_交換したならび) :- 'M番目の要素と前後'(M,L1,A,R1), 'N番目の要素と前後'(N,L2,B,R2), 要素を入れ替えながらならびの再構成(L1,A,R1,L2,B,R2). 'M番目の要素と前後'(M,L1,A,R1) :- M1 is M - 1, append(L1,[A|R1],_対象ならび), length(L1,M1),!. 'N番目の要素と前後'(N,L2,B,R2) :- N1 is N - 1, append(L2,[B|R2],_対象ならび), length(L2,N1),!. 要素を入れ替えながらならびの再構成(L1,A,R1,L2,B,R2) :- append(L1,[B|R1],L3), append(L4,[_|R3],L3), length(L4,N1), append(L4,[A|R3],_交換したならび),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/unix/1127388574/83 # # 1 # 12 # 123 # 1234 # 12345 # このプログラミング作成したい。 # for文を使って頼むorz # :- op(600,xfx,が). :- op(700,xf,回現れるまで). 'ある文字がN回現れるまで1からの文字連鎖によって文字列を成長させながら表示する'(A が N 回現れるまで) :- 文字連鎖によって文字列を成長させながら表示する(A が N 回現れるまで,'1',_文字列), write_formatted('%t\n',[_文字列]), fail. 'ある文字がN回現れるまで1からの文字連鎖によって文字列を成長させながら表示する'(_,_). 文字連鎖によって文字列を成長させながら表示する(_ が 0 回現れるまで,_文字列) :- !,fail. 文字連鎖によって文字列を成長させながら表示する(A が N 回現れるまで,_文字列,_文字列). 文字連鎖によって文字列を成長させながら表示する(A が N 回現れるまで,_文字列1,_文字列1,文字列) :- sub_atom(_文字列1,_,1,1,A), 文字連鎖(A,_次の文字), atom_concat(_文字列1,_次の文字,_付加された文字列), N1 is N - 1, 文字連鎖によって文字列を成長させながら表示する(A が N1 回現れるまで,_付加された文字列,文字列). 文字連鎖によって文字列を成長させながら表示する(A が N 回現れるまで,_文字列1,_文字列) :- sub_atom(_文字列1,_,1,1,_最後の文字), 文字連鎖(_最後の文字,_次の文字), atom_concat(_文字列1,_次の文字,_付加された文字列), 文字連鎖によって文字列を成長させながら表示する(A が N 回現れるまで,_付加された文字列,_文字列). 文字連鎖('1','2'). 文字連鎖('2','3'). 文字連鎖('3','4'). 文字連鎖('4','5'). 文字連鎖('5','6'). 文字連鎖('6','7'). 文字連鎖('7','8'). 文字連鎖('8','9'). 文字連鎖('9','0'). 文字連鎖('0','1'). %%%%%%%%%%%%% 12345 数値ととらえれば %%%%%%%%%%%%%%%%%%%%%%%%%%% :- op(600,xfx,が). :- op(700,xf,回現れるまで). 'ある数値がN回現れるまで1からの数値連鎖によって数値列を成長させながら表示する'(_ が 0 回現れるまで,_) :- !. 'ある数値がN回現れるまで1からの数値連鎖によって数値列を成長させながら表示する'(A が N 回現れるまで,M) :- A is (M + 1) mod 10, M10 is M * 10, M2 is M10 + M1, write_formatted('%t',[M2]), N1 is N - 1, 'ある数値がN回現れるまで1からの数値連鎖によって数値列を成長させながら表示する'(A が N1 回現れるまで,M2). 'ある数値がN回現れるまで1からの数値連鎖によって数値列を成長させながら表示する'(A が N 回現れるまで,M) :- M1 is (M + 1) mod 10, M10 is M * 10, M2 is M10 + M1, write_formatted('%t',[M2]), N1 is N - 1, 'ある数値がN回現れるまで1からの数値連鎖によって数値列を成長させながら表示する'(A が N 回現れるまで,M2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/414 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):switch 文を使用して # 1. データファイルの新規作成 # 2. データファイルの追加作成 # 3. データファイルの読み込みと表示 # 4. 終了 # をメニュー形式で処理するプログラムを作成せよ。 # ・ ファイル名はキーボードから入力する。 # ・ 1〜4の処理はユーザ関数として定義すること。 # void data_write(void) # void data_append(void) # void data_read(void) # void the_end(void) # ・1〜4以外の数値が入力されたら再入力させること。 # # switch(N,{N:P}) :- !,call(P). switch(N,{N:P;_}) :- !,call(P). switch(N,{P1;P2}) :- switch(N,{P1});switch(N,{P2}). switch述語を使ってメニューを処理する(N,File) :-     switch(N,{1:データファイルの新規作成(File);2:データファイルの追加作成(File);3:データファイルの読み込みと表示(File);4:終了}). データファイルの新規作成(File) :- open(File,write,Output),close(Output). データファイルの追加作成(File) :-     write('追加要素を入力しなさい : '),     get_line(Line),     open(File,append,Output),     write_formatted(Output,'%t\n',[Line]),     close(Output). データファイルの読み込みと表示(File) :-     get_lines(File,Lines),     put_lines(Lines). 終了 :- halt. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1267796762/157 # # 【 課題 】なるべく分岐(if,switchなど)を使わずに、使いやすい電卓を作りなさい。 # 【 形態 】1. Javaアプリケーション # 【 期限 】6/22まで # 【 Ver  】java version "1.6.0_20" # 【 補足 】上で投稿したものです。上はやっていただかなくてけっこうですので、こちらをお願いします。難しいものは書いてくださらなくてけっこうですのでシンプルなものをお願いします。 # # # # :- op(450,fx,(+)). :- op(450,fx,(-)). :- op(450,fx,(*)). :- op(450,fx,(/)). :- op(450,fx,(//)). :- op(450,fx,(^)). :- op(450,fx,mod). 関数(A,A) :- number(A),!. 関数(N,+ A,C) :- 関数(_,A,A1),C is N + A1,!. 関数(N,- A,C) :- 関数(_,A,A1),C is N - A1,!. 関数(N,* A,C) :- 関数(_,A,A1),C is N * A1,!. 関数(N,/ A,C) :- 関数(_,A,A1),C is N / A1,!. 関数(N,// A,C) :- 関数(_,A,A1),C is N // A1,!. 関数(N,^ A,C) :- 関数(_,A,A1),C is N ^ A1,!. 関数(N,mod A,C) :- 関数(_,A,A1),C is N mod A1,!. 関数(_,A + B,C) :- 関数(_,A,A1),関数(_,B,B1),C is A1 + B1,!. 関数(_,A - B,C) :- 関数(_,A,A1),関数(_,B,B1),C is A1 - B1,!. 関数(_,A * B,C) :- 関数(_,A,A1),関数(_,B,B1),C is A1 * B1,!. 関数(_,A / B,C) :- 関数(_,A,A1),関数(_,B,B1),C is A1 / B1,!. 関数(_,A // B,C) :- 関数(_,A,A1),関数(_,B,B1),C is A1 // B1,!. 関数(_,A ^ B,C) :- 関数(_,A,A1),関数(_,B,B1),C is A1 ^ B1,!. 関数(_,A mod B,C) :- 関数(_,A,A1),関数(_,B,B1),C is A1 mod B1,!. 関数(_,F,C) :- 関数(_,F,F1),C is F1. 関数(_,sin(A),C) :- 関数(_,A,A1),C is sin(A1). 関数(_,cos(A),C) :- 関数(_,A,A1),C is cos(A1). 関数(_,tan(A),C) :- 関数(_,A,A1),C is tan(A1). 関数(_,exp(A),C) :- 関数(_,A,A1),C is exp(A1). 関数(_,sqrt(A),C) :- 関数(_,A,A1),C is sqrt(A1). 電卓 :- clear_screen,write('0\n# '),get_line(Line),電卓(Line,0). 電卓(q,_) :- !. 電卓(c,_) :- !,電卓. 電卓(Line,N) :- atom_to_term(Line,Term,_), 関数(N,Term,_値), write_formatted('%t\n# ',[_値]), get_line(Line2), 電卓(_値,Line2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/880 # # [1] 授業単元:計算機とアルゴリズム # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10699.txt # # 問題4 # # 3つの整数 a,b,c を比較し、 それを小さい順に並べて表示するプログラムを作成しなさい。 # 例として a, b, c をそれぞれ 240, 77, 89 としたとき、下のような実行結果を表示するようにしなさい。 # # 実行結果 # # 240 と 77 と 89 を小さい順に並べ替えます # 小さい順は 77, 89, 240 です # :- op(600,xfx,と). :- op(750,xf,を小さい順に並べ替えます). /* _a と _b と _c を小さい順に並べ替えます :- 挿入整列([_a,_b,_c],[_1,_2,_3]), write_formatted('小さい順は %t,%t,%t です\n',[_1,_2,_3]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% _a と _b と _c を小さい順に並べ替えます :- '3つの整数 a,b,c を比較し、 それを小さい順に並べて'(_a,_b,_c,_1,_2,_3), write_formatted('小さい順は %t,%t,%t です\n',[_1,_2,_3]). '3つの整数 a,b,c を比較し、 それを小さい順に並べて'(_a,_b,_c,_1,_2,_3) :- 挿入整列([_a,_b,_c],[_1,_2,_3]). */ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '3つの整数 a,b,c を比較し、 それを小さい順に並べて表示する'(_a,_b,_c) :- '3つの整数 a,b,c を比較し、 それを小さい順に並べて'(_a,_b,_c,_1,_2,_3), write_formatted('小さい順は %t,%t,%t です\n',[_1,_2,_3]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 挿入整列([],L,L) :- !. 挿入整列([A|R1],L2,L3) :- 挿入整列_1(A,L2,L4), 挿入整列(R1,L4,L3). 挿入整列_1(_,[],[]) :- !. 挿入整列_1(A,[B|R1],[A,B|R1]) :- A =< B,!. 挿入整列_1(A,[B|R1],[B|R2]) :- A > B, 挿入整列_1(A,R1,R2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/880 # # [1] 授業単元:計算機とアルゴリズム # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10699.txt # # 問題3 # # 実数 (小数点付き数) a, b, c について、これらの値を長さとする三角形が平面上で存在しえるかどうかを判定するプログラムを作成しなさい。 # 例として a, b, c をそれぞれ 1.0, 5.0, 3.0 としたとき、および a, b, c をそれぞれ 4.0, 5.0, 3.0 としたときの実行結果例を示す。 # # 実行結果(a=1.0, b=5.0, c=3.0 の場合) # # 辺の長さが 1.000000 と 5.000000 と 3.000000 となる三角形があり得るかどうか判定します # ありえません # # # 実行結果(a=4.0, b=5.0, c=3.0 の場合) # # 辺の長さが 4.000000 と 5.000000 と 3.000000 となる三角形があり得るかどうか判定します # ありえます # :- op(600,xfx,と). :- op(650,fx,辺の長さが). :- op(700,xf,となる三角形があり得るかどうか判定します). 辺の長さが _a と _b と _c となる三角形があり得るかどうか判定します :- _a > _b + _c, _b > _a + _c, _c > _a + _b, write('ありえます\n'),!. 辺の長さが _a と _b と _c となる三角形があり得るかどうか判定します :- write('ありえません\n'). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '実数 (小数点付き数) a, b, c について、これらの値を長さとする三角形が平面上で存在しえるかどうかを判定する'(_a,_b,_c) :- float(_a), float(_b), float(_c), 辺の長さが _a と _b と _c となる三角形があり得るかどうか判定します. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '実数 (小数点付き数) a, b, c について、これらの値を長さとする三角形が平面上で存在しえるかどうかを判定する' :- get_line(Line), atom_to_term(Line,_a,_), get_line(Line), atom_to_term(Line,_b,_), get_line(Line), atom_to_term(Line,_c,_), float(_a), float(_b), float(_c), 辺の長さが _a と _b と _c となる三角形があり得るかどうか判定します. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/880 # # [1] 授業単元:計算機とアルゴリズム # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10699.txt # # 問題2 # # 整数変数 year に西暦の値を収め、そのときがうるう年かどうか判定するプログラムを作成しなさい。 # 例として、2000年の場合と1900年の場合の実行結果例を示す。 # # 実行結果(2000年の場合) # # 2000 年がうるう年かどうか判定します # うるう年です # # # 実行結果(1900年)の場合 # # 1900 年がうるう年かどうか判定します # うるう年ではありません # :- op(750,xf,年がうるう年かどうか判定します). _year 年がうるう年かどうか判定します :- integer(_year), うるう年(_year), write('うるう年です\n'),!. _year 年がうるう年かどうか判定します :- integer(_year), write('うるう年ではありません\n'). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '整数変数 year に西暦の値を収め、そのときがうるう年かどうか判定する' 催促付き整数入力('西暦の値を入力してください : ',_year), うるう年(_year), write('うるう年です\n'),!. '整数変数 year に西暦の値を収め、そのときがうるう年かどうか判定する' :- write('うるう年ではありません\n'). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4),fail. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/705 # # [1] 授業単元:オブジェクト指向プログラミング # [2] 問題文(含コード&リンク):四則演算の記号の個数を入力すると、その個数に合わせた #                文字列を表示するようにしなさい。 # :- op(750,fx,(::)). :- op(350,fx,(``)). :- op(340,fx,(`)). :- op(300,fx,(#)). %%%%%% 以上のオペレータ定義はシステムの初期化時に実行されている %%%%%%% 四則演算の記号の個数を入力すると、その個数に合わせた文字列を表示する :- `` 記号の個数を入力, findall(N :: `A,(member(A,[+,-,*,/]),` [A,(:)],# N),L), call_all(L). %%%%%% ただし、以下の定義があるものとする %%%%%%%%%%%%%%%%%%%%%% N :: P :- for(1,M,N),call(P),M=N. `` A :- write_formatted('%t\n',[A]). ` L :- list(L),(member(A,L),write(A),fail;true),!. ` A :- \+(list(A)),write(A). # N :- get_integer(N). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/92 # # [1] 授業単元:応用プログラム〜C言語講座 # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10633.txt # # 身長(cm)と体重(kg)を「ヤードポンド法」に換算するプログラムを作成せよ。 # ・身長は○フィート○インチと表示すること。 # ・体重は○ポンドと表示すること。 # なお、変換するヤードポンド法は以下の関係である。 # 1ヤード=3フィート=91.44cm # 1フィート=12インチ=30.48cm # 1インチ=2.54cm # 1ポンド=0.45359237kg '身長(cm)と体重(kg)を「ヤードポンド法」に換算する'(_身長cm,_体重kg) :-     身長のヤードポンド法換算(_身長cm,_フィート,_インチ),     体重のヤードポンド法換算(_体重kg,_ポンド),     write_formatted('身長は%tフィート%.1fインチ、体重は%.1fポンドです\n',[_身長フィート,_身長インチ,_体重ポンド]),!. 身長のヤードポンド法換算(_身長cm,_フィート,_インチ) :-     ヤードポンド法変換(フィート,cm,M,N),     _身長フィート is truncate(floor(_身長 * M / N)),     ヤードポンド法変換(フィート,インチ,M2,N2),     _身長インチ is ((_身長 * M / N) - floor(_身長 * M / N)) * N2 / M3,!. 体重のヤードポンド法換算(_体重kg,_体重ポンド) :-     変換するヤードポンド法の関係(ポンド,kg,M3,N3),     _体重ポンド is _体重kg * M3 / N3,!. ヤードポンド法変換(ヤード,フィート,1,3). ヤードポンド法変換(ヤード,cm,1,91.44). ヤードポンド法変換(フィート,cm,3,91.44). ヤードポンド法変換(フィート,インチ,1,12). ヤードポンド法変換(フィート,cm,1,30.48). ヤードポンド法変換(インチ,cm,12,30.48). ヤードポンド法変換(インチ,cm,1,2.54). ヤードポンド法変換(ポンド,kg,1,0.45359237). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% :- op(200,xf,ヤード). :- op(200,xf,フィート). :- op(200,xf,ポンド). :- op(200,xf,インチ). :- op(200,xf,cm). :- op(200,xf,kg). '身長(cm)と体重(kg)を「ヤードポンド法」に換算する'(_身長cm,_体重kg) :- 身長のヤードポンド法換算(_身長cm,_フィート,_インチ), 体重のヤードポンド法換算(_体重kg,_ポンド), write_formatted('身長は%tフィート%.1fインチ、体重は%.1fポンドです\n',[_身長フィート,_身長インチ,_体重ポンド]),!. 身長のヤードポンド法換算(_身長cm,_フィート,_インチ) :- 変換するヤードポンド法の関係(M フィート = N cm), _身長フィート is truncate(floor(_身長 * M / N)), 変換するヤードポンド法の関係(M2 フィート = N2 インチ), _身長インチ is ((_身長 * M / N) - floor(_身長 * M / N)) * M2 / N2,!. 体重のヤードポンド法換算(_体重kg,_体重ポンド) :- 変換するヤードポンド法の関係(M3 ポンド = N3 kg), _体重ポンド is _体重kg * M3 / N3,!. 変換するヤードポンド法の関係(1 ヤード = 3 フィート). 変換するヤードポンド法の関係(1 ヤード = 91.44 cm). 変換するヤードポンド法の関係(3 フィート = 91.44 cm). 変換するヤードポンド法の関係(1 フィート = 12 インチ). 変換するヤードポンド法の関係(1 フィート = 30.48 cm). 変換するヤードポンド法の関係(12 インチ = 30.48 cm). 変換するヤードポンド法の関係(1 インチ = 2.54 cm). 変換するヤードポンド法の関係(1 ポンド = 0.45359237 kg). % 以下のサイトは # http://pc12.2ch.net/test/read.cgi/tech/1272006124/68 # <問題> ある小さな農園で自家製ジュースを販売することになりました。 # バラ売りの単位として # 1.. 250cc # 2.. 500cc # 3.. 1L # そしてケース売りの単位として、 # 5.. 250ccが12個 # 6.. 1Lが12個 # 7.. 250ccが60個 # を用意することになりました。この単位をProlog述語 '荷姿' として定義しなさい。 :- op(200,xf,cc). :- op(200,xf,'L'). 荷姿(1,'250cc',250 cc). 荷姿(2,'500cc',500 cc). 荷姿(3,'1L',1 'L'). 荷姿(5,'12*250cc',12*250 cc). 荷姿(6,'12*1L',12*1 'L'). 荷姿(7,'60*250cc',60*250 cc). 荷姿単位変換(1,'L',0.25). 荷姿単位変換(2,'L',0.5). 荷姿単位変換(3,'L',1.0). 荷姿単位変換(5,'L',3.0). 荷姿単位変換(6,'L',12.0). 荷姿単位変換(7,'L',15.0). 荷姿単位変換(1,'cc',250). 荷姿単位変換(2,'cc',500). 荷姿単位変換(3,'cc',1000). 荷姿単位変換(5,'cc',3000). 荷姿単位変換(6,'cc',12000). 荷姿単位変換(7,'cc',15000). ケース売り(_荷姿ID) :- 荷姿(_荷姿ID,_,_*_ cc),!. ケース売り(_荷姿ID) :- 荷姿(_荷姿ID,_,_*_ 'L'),!. バラ売り(_荷姿ID) :- 荷姿(_荷姿ID,_,_量 cc),number(_量),!. バラ売り(_荷姿ID) :- 荷姿(_荷姿ID,_,_量 'L'),number(_量),!. % 以下のサイトは # ハノイの塔(N個盤,_履歴) # どの柱からどの柱に動かそうとしているかは、ほとんどの場合、ハノイの塔/5の # 第一節、すなわち盤が一枚の時、どの位置からどの位置へ動かそうとしているかで # 判ります。 # # もし、左から中の柱へ移動したい場合でも、修正箇所は少なく、 # _左 からの移動場所が _右 から _中に変わることと、 # ハノイの塔/5の第二節本体の第二副目標の # 「第一引数にはワーク柱が」 # 「目標柱が本来の位置」に書かれる必要があります。 # # しだかって、ハノイの塔/5の第二節本体の第二副目標は # 右に集める時は第一引数が_中、第三引数が_右。 # 中に集める時は第一引数が_右、第二引数が_中。 # # ハノイの塔の丁寧な説明は Prolog(プロログ)を学ぶ―文化とその実践 杉崎昭生著 p133-137にあります。 %%%%%%%%%%%%%%%% 左柱 から 右柱 へ の移動 %%%%%%%%%%%%%%%%%%% :- op(500,xfx,から). :- op(400,xf,へ). ハノイの塔(N,_移動履歴) :- length(Ln,N), ハノイの塔(Ln,左柱,中柱,右柱,_移動履歴). ハノイの塔([_],_左,_中,_右,[_左 から _右 へ]). ハノイの塔([_|Ln],_左,_中,_右,_移動履歴) :- ハノイの塔(Ln,_左,_右,_中,_移動履歴_1), ハノイの塔(Ln,_中,_左,_右,_移動履歴_2), append(_移動履歴_1,[_左 から _右 へ|_移動履歴_2],_移動履歴). %%%%%%%%%%%%%%%% 左柱 から 中柱 へ の移動 %%%%%%%%%%%%%%%%%%% :- op(500,xfx,から). :- op(400,xf,へ). ハノイの塔(N,_移動履歴) :- length(Ln,N), ハノイの塔(Ln,左柱,中柱,右柱,_移動履歴). ハノイの塔([_],_左,_中,_右,[_左 から _中 へ]). ハノイの塔([_|Ln],_左,_中,_右,_移動履歴) :- ハノイの塔(Ln,_左,_右,_中,_移動履歴_1), ハノイの塔(Ln,_右,_中,_左,_移動履歴_2), append(_移動履歴_1,[_左 から _中 へ|_移動履歴_2],_移動履歴). % 代表的なハノイの塔 % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/416 # # 数当てゲーム1 乱数当て # プログラムで一つの整数乱数aを生成し、その値を当てさせる。 # 入力された値がaより小さい時は「もっと大きいよ」、aより小さい時は「もっと小さいよ」と出力し、当てるまで繰り返しをする。 # # プログラムの例 # Srand (time(NULL)); # a=rand(); # # プログラムの最初にRAND_MAXを出力したほうがわかりやすい # # -------------------------------------------------------------------------------- # # 数当てゲーム2 0〜999の当て # 先ほどのプログラムを更に改善し、0〜999までの整数乱数を生成せよ # # --------------------------------------------------------------------------------- # # 数当てゲーム3 当て回数の制限 # さらに改善し、当てる回数に制限を付ける、例えば10回など # 当てる度に残っている回数を表示する。回数に達するとプログラム終了 :- op(250,xf,より大きい). :- op(250,xf,より小さい). 履歴を持った数当てゲームサーバ :- 乱数を引き正解値を決める(_正解), 当てずっぽの数をひとつ得る(_当てずっぽの数), 履歴を持った数当てゲームサーバ(_当てずっぽの数,_正解,[]). 履歴を持った数当てゲームサーバ(_正解,_正解,_) :- write('正解です\n'),!. 履歴を持った数当てゲームサーバ(_当てずっぽの数,_正解,_履歴) :- すでにヒントの中に含まれている(_当てずっぽの数,_履歴,_既出のヒント), write_formatted('前に %tっていったでしょ!',[_既出のヒント]), 当てずっぽの数をひとつ得る(_次の当てずっぽの数), 履歴を持った数当てゲームサーバ(_当てずっぽの数,_正解,_履歴). 履歴を持った数当てゲームサーバ(_当てずっぽの数,_正解,_履歴) :- \+(すでにヒントの中に含まれている(_当てずっぽの数,_履歴)), _当てずっぽの数 < _正解, write('もっと大きいよ\n'), 当てずっぽの数をひとつ得る(_次の当てずっぽの数), 履歴を持った数当てゲームサーバ(_次の当てずっぽの数,_正解,[_当てずっぽの数 より大きい|_履歴]). 履歴を持った数当てゲームサーバ(_当てずっぽの数,_正解,_履歴) :- \+(すでにヒントの中に含まれている(_当てずっぽの数,_履歴)), _当てずっぽの数 > _正解, write('もっと小さいよ\n'), 当てずっぽの数をひとつ得る(_次の当てずっぽの数), 履歴を持った数当てゲームサーバ(_次の当てずっぽの数,_正解,[_当てずっぽの数 より小さい|_履歴]). 乱数を引き正解値を決める(_正解) :- _正解 is random. 当てずっぽ数をひとつ得る(_当てずっぽ数) :- repeat, write('さあ、なににしますか? '), get_integer(_当てずっぽ数),!. すでにヒントの中に含まれている(_当てずっぽの数,[N より大きい|R],Max より大きい) :- _当てずっぽの数 < _正解, \+(_当てずっぽの数 > N), findmax(M,member(M より大きい,[N より大きい|R]),Max),!. すでにヒントの中に含まれている(_当てずっぽの数,[N より小さい|R],Min より小さい) :- _当てずっぽの数 > _正解, \+(_当てずっぽの数 < N), findmin(M,member(M より小さい,[N より小さい|R]),Min),!. すでにヒントの中に含まれている(_当てずっぽの数,[_|R],X) :- すでにヒントの中に含まれている(_当てずっぽの数,R,X). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '乱数を引き正解値(0〜999)を決める'(_正解値) :- _乱数値 is random, 乱数の範囲を0〜999に絞り込む(_乱数値,_正解値). 乱数の範囲を0〜999に絞り込む(_乱数値,_絞り込まれた乱数値) :- _絞り込まれた乱数値 is _乱数値 mod 1000. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% :- op(250,xf,より大きい). :- op(250,xf,より小さい). ゲームオーバーとなる解答限界数(10). 履歴を持った回数制限付き数当てゲームサーバ :- ゲームオーバーとなる解答限界数(Max), 乱数を引き正解値(0〜999)を決める(_正解), 当てずっぽの数をひとつ得る(_当てずっぽの数), 履歴を持った数当てゲームサーバ(1,Max,_当てずっぽの数,_正解,[]). 履歴を持った回数制限付き数当てゲームサーバ :- 履歴を持った回数制限付き数当てゲームサーバ. 履歴を持った回数制限付き数当てゲームサーバ(M,Max,_,_,_) :- M > Max, write_formatted('選択した数が%t個を越えました ゲームオーバー!!\n'),!. 履歴を持った回数制限付き数当てゲームサーバ(_,_,_正解,_正解,_) :- write('正解です\n'),!. 履歴を持った回数制限付き数当てゲームサーバ(M,Max,_当てずっぽの数,_正解,_履歴) :- すでにヒントの中に含まれている(_当てずっぽの数,_履歴,_既出のヒント), write_formatted('前に %tっていったでしょ!',[_既出のヒント]), 当てずっぽの数をひとつ得る(_次の当てずっぽの数), M2 is M + 1, 履歴を持った数当てゲームサーバ(M2,Max,_当てずっぽの数,_正解,_履歴). 履歴を持った回数制限付き数当てゲームサーバ(M,Max,_当てずっぽの数,_正解,_履歴) :- \+(すでにヒントの中に含まれている(_当てずっぽの数,_履歴)), _当てずっぽの数 < _正解, write('もっと大きいよ\n'), 当てずっぽの数をひとつ得る(_次の当てずっぽの数), M2 is M + 1, 履歴を持った回数制限付き数当てゲームサーバ(M2,Max,_次の当てずっぽの数,_正解,[_当てずっぽの数 より大きい|_履歴]). '履歴を持った回数制限付き数当てゲームサーバ(M,Max,_当てずっぽの数,_正解,_履歴) :- \+(すでにヒントの中に含まれてる(_当てずっぽの数,_履歴)), _当てずっぽの数 > _正解, write('もっと小さいよ\n'), 当てずっぽの数をひとつ得る(_次の当てずっぽの数), M2 is M + 1, 履歴を持った回数制限付き数当てゲームサーバ(M,Max,_次の当てずっぽの数,_正解,[_当てずっぽの数 より小さい|_履歴]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 当てずっぽクライアント :- Maxint is maxint, ある範囲の乱数を得る(1,Maxint,Random), 当てずっぽクライアント(1,Maxint,Random). 当てずっぽクライアント(M,Maxint,Random) :- write('選択値 = %t\n',[Random]), get_line(Line), 当てずっぽクライアント(Line,M,Maxint,Random), 当てずっぽクライアント(Random,Maxint,Random2). 当てずっぽクライアント('もっと大きいよ',M,Maxint,Random,Maxint,Random,Random2) :- ある範囲の乱数を得る(Random,Maxint,Random2),!. 当てずっぽクライアント('もっと小さいよ',M,Maxint,M,Random,Random,Random2) :- ある範囲の乱数を得る(M,Random,Random2), ある範囲の乱数を得る(_下限,_上限,_乱数) :- J is _上限 - _下限 + 1, _乱数 is random mod J + _下限. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/975 # # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク): # # ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10258.txt # # 表1のように,あるコンテストに関する4人の5点満点のデータがあるとき,「各個人の得点の平均を # 求める」,「平均点より表2のような評価を行う」,「データや平均点及び評価を表示する」の3つのユーザ定義関数を用いて結果を表示する。 # # 表1 http://nojiriko.asia/jpeg/up10430.jpg # # 表2 http://nojiriko.asia/jpeg/up10431.jpg # # 考え方 # データのNoと点数はmain 関数の中で初期化する。そして各人の点数を引数として平均値を求める # ユーザ定義関数,平均値を引数として評価を求めるユーザ定義関数,データNoと点数と平均値と評価を # 引数として表示を行うユーザ定義関数を別々に定義し,これらのユーザ定義関数をmain関数の中で呼び # 出して結果を表示するプログラムとする。 :- op(500,xf,以上). :- op(500,xf,未満). :- op(450,xfx,'~'). '5点満点データ'(1,4,3,5,4). '5点満点データ'(2,5,4,4,5). '5点満点データ'(3,3,2,2,2). '5点満点データ'(4,3,4,3,3). 評価判定('A',4.0以上). 評価判定('B',3.0~4.0未満). 評価判定('C',2.0~3.0未満). 評価判定('D',2.0未満). コンテスト結果の表示 :- 見出し表示, 個人データの表示, fail. コンテスト結果の表示. 見出し表示 :- write('No 技術力 正確さ 難易度 表現力 平均点 評価\n'). 個人データの表示 :- '5点満点データ'(No,_技術力,_正確さ,_難易度,_表現力), 平均値を求める(No,_技術力,_正確さ,_難易度,_表現力,_平均点), 評価判定を求める(_平均点,_評価), データを表示する(No,_技術力,_正確さ,_難易度,_表現力,_平均点,_評価). 平均値を求める(No,_技術力,_正確さ,_難易度,_表現力,_平均点) :- sum_list([_技術力,_正確さ,_難易度,_表現力],_技術力_正確さ_難易度_表現力_の合計), _平均点 is _技術力_正確さ_難易度_表現力_の合計 / 4.0. 評価判定を求める(_平均点,_評価) :- 評価判定(_評価,V 以上), _平均点 >= V,!. 評価判定を求める(_平均点,_評価) :- 評価判定(_評価,V1 ~ V2 未満), _平均点 >= V1, _平均点 < V2,!. 評価判定を求める(_平均点,_評価) :- 評価判定(_評価,V 未満), _平均点 < V,!. データを表示する(No,_技術力,_正確さ,_難易度,_表現力,_平均点,_評価) :- writef('%2r%6r %6r %6r %6r ',[No,_技術力,_正確さ,_難易度,_表現力]), format('~2f ~w\n',[_平均点,_評価]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/438 # # 1] 授業単元: プログラミング実習 # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10181.txt # # 〜課題1〜 # 変数a,b,cへ値を読み込み、方程式ax2(axの二乗)+bx+c=0の会を出力するプログラムを作成せよ。ただし、a=/0(aノット0)の場合の判別式はD=b2-4acで与えられるものとし、 # 解の公式は-b+-4ac/2aで与えられるものとする。虚数解となる場合はたとえばx=3+5i,x=3-5iのように実数部と虚数部がわかるように出力せよ。すべての場合を見落とさず考えよ。 # ルートの関数はsqrt関数を使う。たとえば√2.5を求める場合、 # double a; # a=sqrt(2.5); /*√2.5をaに代入*/ # のように書く。ただし、sqrtの()内に与えられる数(変数も指定できる)は正の実数(double型)でなければならない。 # :- op(250,xf,i). 二次方程式の解(0,B,C,X) :- X is (-1) * C / B. 二次方程式の解(A,B,C,X) :-   0.0 is B^2 - 4 * A * C,   X is ((-1) * B) / (2 * A). 二次方程式の解(A,B,C,X) :-   U is B^2 - 4 * A * C,   U > 0.0,   X is ((-1) * B) + sqrt(U)) / (2 * A). 二次方程式の解(A,B,C,X) :-   U is B^2 - 4 * A * C,   U > 0.0,   X is ((-1) * B) - sqrt(U)) / (2 * A). 二次方程式の解(A,B,C,(D+Ei)) :-   U is B^2 - 4 * A * C,   U < 0.0,   D is ((-1) * B) / (2 * A),   E is U / (2 * A). 二次方程式の解(A,B,C,(D-Ei)) :-   U is B^2 - 4 * A * C,   U < 0.0,   D is ((-1) * B) / (2 * A),   E is U / (2 * A). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/64 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 問題 # キーボードから10人分の身長を入力し、 # 180cm以上なら「高い」、 # 150cm以上、180cm未満なら「普通」、 # 150cm未満なら「低い」と表示するプログラムを作成しなさい。 # # 問題 # キーボードから10人分の身長を入力し、 # 合計と平均を計算し、表するプログラムを作成示しなさい。 # (なお小数点以下は無視して下さい。) :- op(400,xf,cm). キーボードから10人分の身長を入力し、180cm以上なら「高い」、150cm以上、180cm未満なら「普通」、150cm未満なら「低い」と表示する :- for(1,N,10), キーボードから身長を入力(_身長), '180cm以上なら「高い」、150cm以上、180cm未満なら「普通」、150cm未満なら「低い」と表示する'(_身長 cm),nl, N = 10. キーボードから身長を入力(_身長) :- get_integer(_身長). '180cm以上なら「高い」、150cm以上、180cm未満なら「普通」、150cm未満なら「低い」と表示する'(_身長 cm) :- _身長 >= 180, write(高い). '180cm以上なら「高い」、150cm以上、180cm未満なら「普通」、150cm未満なら「低い」と表示する'(_身長 cm) :- _身長 >= 150, _身長 < 180, write(普通). '180cm以上なら「高い」、150cm以上、180cm未満なら「普通」、150cm未満なら「低い」と表示する'(_身長 cm) :- _身長 < 150, write(低い). キーボードから身長を入力(_身長), キーボードから身長を入力(_身長) :- get_integer(_身長). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/62 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 問1:キーボードから身長を入力し、170cm以上なら「高い」と表示し、 # そうでなければ「低い」と表示するプログラムを作成しなさい。 # # 問2:キーボードから身長を入力し、 # 180cm以上なら「高い」、 # 150cm以上、180cm未満なら「普通」、 # 150cm未満なら「低い」と表示するプログラムを作成しなさい。 :- op(450,xf,cm). キーボードから身長を入力し、170cm以上なら「高い」と表示し、そうでなければ「低い」と表示する :- キーボードから身長を入力(_身長), 170cm以上なら「高い」と表示し、そうでなければ「低い」と表示する(_身長 cm). キーボードから身長を入力(_身長) :- get_integer(_身長). 170cm以上なら「高い」と表示し、そうでなければ「低い」と表示する(_身長 cm) :- _身長 >= 170,!, write(高い). 170cm以上なら「高い」と表示し、そうでなければ「低い」と表示する(_身長 cm) :- write(低い). % --------------------------------------------------------------------------- キーボードから身長を入力し、180cm以上なら「高い」、150cm以上、180cm未満なら「普通」、150cm未満なら「低い」と表示する :- キーボードから身長を入力(_身長), '180cm以上なら「高い」、150cm以上、180cm未満なら「普通」、150cm未満なら「低い」と表示する'(_身長). '180cm以上なら「高い」、150cm以上、180cm未満なら「普通」、150cm未満なら「低い」と表示する'(_身長 cm) :- _身長 >= 180,!, write(高い). '180cm以上なら「高い」、150cm以上、180cm未満なら「普通」、150cm未満なら「低い」と表示する'(_身長 cm) :- _身長 >= 150,!, write(普通). '180cm以上なら「高い」、150cm以上、180cm未満なら「普通」、150cm未満なら「低い」と表示する'(_身長 cm) :- _身長 < 150,!, write(低い). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/990 # # テンプレ無視してすみませんでした。 # # [1] 授業単元:プログラミング論 # [2] 問題文:国語・数学・理科の3教科の得点を入力し、平均点が #     90点以上…「平均点X 評価はAです。」 #      80点以上…「平均点X 評価はBです。」 #      70点未満…「平均点X 追試の対象です。」 # と表示するプログラムを作成しなさい。 # #   実行例 #     国語90 #     数学90 #     理科90 # #   平均点90点 評価はAです。 # :- op(450,fx,国語). :- op(450,fx,数学). :- op(450,fx,理科). 試験の個人平均点による評価 :- 三科目の点数を得る(_国語,_数学,_理科), 試験の個人平均点による評価(_国語,_数学,_理科,_評価), write_formatted('平均点%t点 評価は%tです。\n'). 試験の個人平均点による評価(_国語,_数学,_理科,_評価) :- 相加平均([_国語,_数学,_理科],_相加平均), 試験の個人平均点による評価(_相加平均,_評価). 試験の個人平均点による評価(_相加平均,'A') :- _相加平均 >= 90. 試験の個人平均点による評価(_相加平均,'B') :- _相加平均 >= 80,_相加平均 < 90. 試験の個人平均点による評価(_相加平均,'C') :- _相加平均 >= 70,_相加平均 < 80. 試験の個人平均点による評価(_相加平均,'追試の対象') :- _相加平均 < 70. 三科目の点数を得る(_国語,_数学,_理科) :- write('科目名点数で改行して三科目の点数を入れてください\n'), 三科目の点数ならびを得る([],L), member([国語,_国語],L), member([数学,_数学],L), member([理科,_理科],L),!. 三科目の点数ならびを得る(L,L) :- length(L,3),!. 三科目の点数ならびを得る(L1,L) :- get_line(_行), atom_to_term(_行,_項,_), _項 =.. [_科目,_点数], member(_科目,[国語,数学,理科]), \+(member([_科目,_],L1)), _点数 >= 0, _点数 =< 100, 三科目の点数ならびを得る([[_科目,_点数]|L1],L),!. 三科目の点数ならびを得る(L1,L) :- write('その科目はすでに入力済みであるか、適切な科目でありません\n'), 三科目の点数ならびを得る(L1,L). % 以下のサイトは :- op(700,xfx,は). % *** user: 'ABC分析パラメータ' / 3 *** 'ABC分析パラメータ'('A',0.0e+00,0.7). 'ABC分析パラメータ'('B',0.7,0.9). 'ABC分析パラメータ'('C',9.0,1.0). 'ABC分析'(X,A,B,C) :- '加算'(X,[_,S]), findall([U,L1],(append(L1,L2,X) , '加算'(L1,[_,D]) , U is D / S , U < 0.7),L), max(L,A), A = [W1,L3], append(L3,L4,X), findall([V,L5],(append(L5,L6,L4) , '加算'(L5,[_,E]) , V is E / S , V < 0.2),L7), max(L7,B), B = [W2,L8], append(L8,L9,L4), W3 is 1 - W1 - W2, C = [W3,L9], !. % *** user: 'ABC分析' / 7 *** 'ABC分析'(X,PerA,PerB,PerC,A,B,C) :- '加算'(X,[_,S]), 'ABC分析パラメータ'('A',Ap1,Ap2), 'ABC分析の二'(X,S,Ap1,Ap2,PerA,A), append(A,L2,X), 'ABC分析パラメータ'('B',Bp1,Bp2), 'ABC分析の二'(L2,S,0.0e+00,Bp2 - PerA,PerB,B), append(B,C,L2), PerC is 1 - PerA - PerB, !. % *** user: 'ABC分析の二' / 6 *** 'ABC分析の二'(L,S,Per1,Per2,PerX,X) :- findall([U,L1],(append(L1,_,L) , '加算'(L1,[_,D]) , U is D / S , U > Per1 , U =< Per2),L2), max(L2,Y), Y = [PerX,X], !. % *** user: '加算' / 2 *** '加算'(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), m_trans([L|R],L1), '加算_2'(L1,SL), !. '加算'(X,S) :- '加算_1'(X,0.0e+00,S) . % *** user: ('は') / 2 *** _項 'は' (_ネットワーク :: _式) :- _ネットワーク :: _項 'は' _式, !. _評価項 'は' 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(_式), \+('述語評価が可能'(_式,_関数,_次数,_次数足す一)), _項 = _式, !. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/434 # # 【 課題 】http://ime.nu/www1.axfc.net/uploader/Sc/so/49653 # レストランのメニューを表示するクラス # レベル1: 6点満点メニューを表示するだけ。ただし、各フィールドやメソッドに # 適切なコメントを記述すること。 # レベル2:7点満点キーボード入力でデザートを切り替える機能を追加。 # レベル3: 8点満点キーボード入力された値が無効な場合と有効な場合で実行結果を切り替える機能を追加。 # レベル4: 9点満点RestaurantMenu2.java という名前で、RtaurantMenu.javaの # コピーを作る。RestaurantMenu2.javaでは、mainDish, dessertという配列を # 廃止し、2次元配列menuでそれらと同等の文字列を管理する。その上で各メソッドを # 改造し、レベル3と同じ機能を持つようにする。実行結果もレベル3と同じ。 # レベル5: 10点満点メインディッシュとデザートの組み合わせからなる # セットメニューを表示するためのメソッド、showSetMenu を追加し、 # それを用いて下記の実行結果を得る。プログラム内のデザート番号入力及び # メニュー表示部分は消さずにコメントアウトしておく。 'レストラン「ピエモンテ」のメニュー表示' :- メニュー表紙表示, メニュー分類(_分類), 分類項目の表示(_分類), fail. 'レストラン「ピエモンテ」のメニュー表示'. メニュー表紙表示. 分類項目の表示(_分類) :- functor(Q,メニュー分類,1), findall(_料理名,(call(Q),arg(1,Q,_料理名)),_料理名ならび), \+(_料理名ならび=[]), length(_料理名ならび,_分類項目の料理数), _切る回数 is random mod 10, トランプを切るようにならびを切る(_切る回数,_分類項目の料理数,_料理名ならび,_切られた料理名ならび), write_formatted('\n\n\n       %t\n\n',[_分類]), 最大品数(_分類,_最大品数), メニュー明細の表示(_料理名ならび,_切られた料理名ならび,_最大品数),!. 分類項目の表示(_). メニュー明細の表示(_料理名ならび,_切られた料理名ならび,_最大品数) :- メニューに載せる料理名(_料理名ならび,_切られた料理名ならび,_最大品数,_メニューに載せる料理名), メニュー価格(_メニューに載せる料理名,_価格), write_formatted(' %-32s .... %7d 円\n',[_メニューに載せる料理名,_価格]), fail. メニュー明細の表示(_,_,_). メニューに載せる料理名(_料理名ならび,_切られた料理名ならび,_最大品数,_メニューに載せる料理名) :- member(_メニューに載せる料理名,_料理名ならび), append(L,[_メニューに載せる料理名|_],_切られた料理名ならび), length(L,Len), Len < _最大品数. メニュー価格('チーズ・トースト・ピエモンテ風',250). メニュー価格('フォンデュ・ピエモンテ風',2800). メニュー価格('チーズ入りポレンタがゆのプディング',1200). メニュー価格('ニョッキ・ピエモンテ風',600). メニュー価格('チーズ入りじゃがいものニョッキ',600). メニュー価格('アニォロッティまたはラヴィオリ・ピエモンテ風',800). メニュー価格('トリュフ入りリゾット',1400). % メニュー価格('グリーン・ソース・ピエモンテ風',_). % メニュー価格('ソース・ピエモンテーゼ',). % メニュー価格('ニンニクとアンチョビー入りソース・ピエモンテ風'). メニュー価格('チキン・コンソメのチキン・ロワイヤル入り',650). メニュー価格('野菜スープ・アスティ風',750). メニュー価格('仔牛の胃のスープ',900). メニュー価格('パンとチーズのスープ',550). メニュー価格('牛の背肉のバローロ・ワイン煮',2300). メニュー価格('仔牛肉のマレンゴ風',2200). メニュー価格('トゥルネード・フィナンシエール風',2500). メニュー価格('牛の尾肉煮込み・カヴェール風',2000). メニュー価格('カエルの足のシチュー',1600). メニュー価格('鶏肉のムース',1000). メニュー価格('鶏肉のトマトと白ブドウ酒煮',1300). メニュー価格('七面鳥の胸肉・マルサラソース',1300). メニュー価格('野うさぎ・ピエモンテ風',1400). メニュー価格('野うさぎの煮込み・マレンゴ風',1700). メニュー価格('雌雉子・シャンピニョン添え',1600). メニュー価格('雉子のトリュフ詰め',2000). メニュー価格('鳩のカブール風',1400). メニュー価格('うずらの蒸し焼き・白トリュフ添え',2000). メニュー価格('ますのピエモンテ風',1800). メニュー価格('セージ入りすずきのフライ',1800). メニュー価格('こいのマリネード',1400). メニュー価格('すずきの白ブドウ酒入り蒸し焼き',2000). メニュー価格('トリュフ入りレタスとセロリのサラダ',750). メニュー価格('トリュフ入りセロリのサラダ',700). メニュー価格('ピーマンとフンティーナ・チーズのサラダ',450). メニュー価格('バーニャ・カウダ・ソース入りピーマン',450). メニュー価格('小玉ねぎのイヴレア風',450). メニュー価格('アスパラガスのタルタル・ソースかけ',550). メニュー価格('ほうれんそうのピエモンテ風',400). メニュー価格('くりのシチュー',500). メニュー価格('クレープ・ピエモンテ風',550). メニュー価格('オムレツの白トリュフ入り、ピエモンテ風',850). メニュー価格('フォンティーナ・チーズのフライ・エッグのせ',650). メニュー価格('卵・トリノ風',450). メニュー価格('トリュフのピエモンテ風',750). メニュー価格('サクランボのバローロ・ワイン煮',400). メニュー価格('冷やしたプディング・ジアンダ風',400). メニュー価格('ベルヴェデーレ・クリーム',400). メニュー価格('ももの詰めもの・ピエモンテ風',550). % メニュー価格('サバイオーネ'). メニュー価格('コロンビアメデリンスプレモの浅炒り',450). メニュー価格('コロンビアメデリンスプレモの中炒り',450). メニュー価格('やぎのミルクを加えたカプチーノ',450). メニュー価格(' Vietti Barbera d'Asti Tre Vigne 2006',4500). メニュー価格('Gattinara 2004 Antoniolo',4500). メニュー価格('Ghemme 2003 / Antichi Vigneti di Cantalup',3800). メニュー価格('Barbaresco',3500). メニュー価格('Dekcetto d''Alba',3500). メニュー価格('Delcetto delle Langhe',2800). メニュー価格(_,100). メニュー分類(オードブル). メニュー分類(スープ). メニュー分類(パスタ). メニュー分類(ピザ). メニュー分類(サラダ). メニュー分類(米料理). メニュー分類(魚料理). メニュー分類(肉料理). メニュー分類(デザート). メニュー分類(ワイン). メニュー分類(コーヒー). 最大品数(オードブル,6). 最大品数(パスタ,8). 最大品数(サラダ,3). 最大品数(米料理,3). 最大品数(魚料理,6). 最大品数(肉料理,8). 最大品数(デザート,4). 最大品数(飲み物,6). 最大品数(コーヒー,2). 最大品数(ワイン,8). % お出しできる料理・・メニューに加える料理は一旦この述語節として定義し、後に分類する(同時に複数に分類されることもある) お出しできる料理('チーズ・トースト・ピエモンテ風'). お出しできる料理('フォンデュ・ピエモンテ風'). お出しできる料理('チーズ入りポレンタがゆのプディング'). お出しできる料理('ニョッキ・ピエモンテ風'). お出しできる料理('チーズ入りじゃがいものニョッキ'). お出しできる料理('アニォロッティまたはラヴィオリ・ピエモンテ風'). お出しできる料理('トリュフ入りリゾット'). お出しできる料理('グリーン・ソース・ピエモンテ風'). お出しできる料理('ソース・ピエモンテーゼ'). お出しできる料理('ニンニクとアンチョビー入りソース・ピエモンテ風'). お出しできる料理('チキン・コンソメのチキン・ロワイヤル入り'). お出しできる料理('野菜スープ・アスティ風'). お出しできる料理('仔牛の胃のスープ'). お出しできる料理('パンとチーズのスープ'). お出しできる料理('牛の背肉のバローロ・ワイン煮'). お出しできる料理('仔牛肉のマレンゴ風'). お出しできる料理('トゥルネード・フィナンシエール風'). お出しできる料理('牛の尾肉煮込み・カヴェール風'). お出しできる料理('カエルの足のシチュー'). お出しできる料理('鶏肉のムース'). お出しできる料理('鶏肉のトマトと白ブドウ酒煮'). お出しできる料理('七面鳥の胸肉・マルサラソース'). お出しできる料理('野うさぎ・ピエモンテ風'). お出しできる料理('野うさぎの煮込み・マレンゴ風'). お出しできる料理('雌雉子・シャンピニョン添え'). お出しできる料理('雉子のトリュフ詰め'). お出しできる料理('鳩のカブール風'). お出しできる料理('うずらの蒸し焼き・白トリュフ添え'). お出しできる料理('ますのピエモンテ風'). お出しできる料理('セージ入りすずきのフライ'). お出しできる料理('こいのマリネード'). お出しできる料理('すずきの白ブドウ酒入り蒸し焼き'). お出しできる料理('トリュフ入りレタスとセロリのサラダ'). お出しできる料理('トリュフ入りセロリのサラダ'). お出しできる料理('ピーマンとフンティーナ・チーズのサラダ'). お出しできる料理('バーニャ・カウダ・ソース入りピーマン'). お出しできる料理('小玉ねぎのイヴレア風'). お出しできる料理('アスパラガスのタルタル・ソースかけ'). お出しできる料理('ほうれんそうのピエモンテ風'). お出しできる料理('くりのシチュー'). お出しできる料理('クレープ・ピエモンテ風'). お出しできる料理('オムレツの白トリュフ入り、ピエモンテ風'). お出しできる料理('フォンティーナ・チーズのフライ・エッグのせ'). お出しできる料理('卵・トリノ風'). お出しできる料理('トリュフのピエモンテ風'). お出しできる料理('サクランボのバローロ・ワイン煮'). お出しできる料理('冷やしたプディング・ジアンダ風'). お出しできる料理('ベルヴェデーレ・クリーム'). お出しできる料理('ももの詰めもの・ピエモンテ風'). お出しできる料理('サバイオーネ'). オードブル('チーズ・トースト・ピエモンテ風'). オードブル('フォンデュ・ピエモンテ風'). オードブル('チーズ入りポレンタがゆのプディング'). オードブル('ニョッキ・ピエモンテ風'). オードブル('チーズ入りじゃがいものニョッキ'). オードブル('アニォロッティまたはラヴィオリ・ピエモンテ風'). サラダ('トリュフ入りレタスとセロリのサラダ'). サラダ('トリュフ入りセロリのサラダ'). サラダ('ピーマンとフンティーナ・チーズのサラダ'). スープ('チキン・コンソメのチキン・ロワイヤル入り'). スープ('野菜スープ・アスティ風'). スープ('仔牛の胃のスープ'). スープ('パンとチーズのスープ'). 米料理('トリュフ入りリゾット'). 肉料理('牛の背肉のバローロ・ワイン煮'). 肉料理('仔牛肉のマレンゴ風'). 肉料理('トゥルネード・フィナンシエール風'). 肉料理('牛の尾肉煮込み・カヴェール風'). 肉料理('カエルの足のシチュー'). 肉料理('鶏肉のムース'). 肉料理('鶏肉のトマトと白ブドウ酒煮'). 肉料理('七面鳥の胸肉・マルサラソース'). 肉料理('野うさぎ・ピエモンテ風'). 肉料理('野うさぎの煮込み・マレンゴ風'). 肉料理('雌雉子・シャンピニョン添え'). 肉料理('雉子のトリュフ詰め'). 肉料理('鳩のカブール風'). 肉料理('うずらの蒸し焼き・白トリュフ添え'). 魚料理('ますのピエモンテ風'). 魚料理('セージ入りすずきのフライ'). 魚料理('こいのマリネード'). 魚料理('すずきの白ブドウ酒入り蒸し焼き'). 野菜料理('バーニャ・カウダ・ソース入りピーマン'). 野菜料理('小玉ねぎのイヴレア風'). 野菜料理('アスパラガスのタルタル・ソースかけ'). 野菜料理('ほうれんそうのピエモンテ風'). 野菜料理('くりのシチュー'). デザート('サクランボのバローロ・ワイン煮'). デザート('冷やしたプディング・ジアンダ風'). デザート('ベルヴェデーレ・クリーム'). デザート('ももの詰めもの・ピエモンテ風'). コーヒー('コロンビアメデリンスプレモの浅炒り'). コーヒー('コロンビアメデリンスプレモの中炒り'). コーヒー('やぎのミルクを加えたカプチーノ'). コーヒー('エスプレッソ'). ワイン(' Vietti Barbera d'Asti Tre Vigne 2006'). ワイン('Gattinara 2004 Antoniolo'). ワイン('Ghemme 2003 / Antichi Vigneti di Cantalup'). ワイン('Barbaresco'). ワイン('Dekcetto d''Alba'). ワイン('Delcetto delle Langhe'). /* ワイン('Lessone'). ワイン('Mottalciata'). ワイン('Barbaresco'). ワイン('Delcetto delle Langhe'). ワイン('Freisa'). ワイン('Coretese'). ワイン('Muscatel'). */ ソースの味('ますのピエモンテ風',白ブドウ酒煮込み). ソースの味('すずきの白ブドウ酒入り蒸し焼き',白ブドウ酒煮込み). ソースの味('野うさぎ・ピエモンテ風',白ブドウ酒煮込み). ソースの味('牛の尾肉煮込み・カヴェール風',トマト). ソースの味('鶏肉のトマトと白ブドウ酒煮',トマト). % セットメニューに選択時に指定料理がある場合は引数に直接指定する(その料理だけは固定できる,他はあくまで候補) セットメニュー分類項目の表示(_オードブル,_スープ,_サラダ,_肉料理,_魚料理,_飲み物,_デザート) :- セットメニュー候補(_オードブル,_スープ,_サラダ,_肉料理,_魚料理,_飲み物,_デザート), write(' ピエモンテシェフとっておきのコース料理 ... 5500円\n\n'), writef('オードブル ... %t\n',[_オードブル]), writef('スープ ... %t\n',[_スープ]), writef('サラダ ... %t\n',[_サラダ]), writef('肉料理 ... %t\n',[_肉料理]), writef('魚料理 ... %t\n',[_魚料理]), writef('飲み物 ... %t\n',[_コーヒー]), writef('デザート ... %t\n',[_デザート]). セットメニュー候補(_オードブル,_スープ,_サラダ,_肉料理,_魚料理,_飲み物,_デザート) :- 肉・魚料理の選択(_肉料理,_魚料理), オードブル(_オードブル), スープ(_スープ), サラダ(_サラダ), _飲み物 = エスプレッソ, デザート(_デザート). 肉・魚料理の選択(_肉料理,_魚料理) :- 肉料理(_肉料理), 魚料理(_魚料理), ソースの味が異なる(_肉料理,_魚料理), メニュー価格(_肉料理,_肉料理の価格), メニュー価格(_魚料理,_魚料理の価格), \+(_肉料理の価格 + _魚料理の価格 >= 4000). ソースの味が異なる(_肉料理,_魚料理) :- ソースの味(_肉料理,_肉料理のソースの味), ソースの味(_魚料理,_魚料理のソースの味), \+(var(_肉料理のソースの味)), \+(var(_魚料理のソースの味)), !, \+(_肉料理のソースの味=_魚料理のソースの味). ソースの味が異なる(_,_). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% トランプを切るようにならびを切る(0,_要素数,L,L) :- !. トランプを切るようにならびを切る(N,_要素数,L,X) :- M1 is random(_要素数), M2 is random(_要素数), swap_nth(M1,M2,L,L1), N2 is N - 1, トランプを切るようにならびを切る(N2,_要素数,L1,X). swap_nth(M,N,L1,L2) :- nth0(M,L1,A), nth0(N,L1,B), swap(A,B,L1,L2). swap(A,B,L,LX) :- append(L1,[A|L2],[B|L3],L), append(L1,[B|L2],[A|L3],LX),!. swap(A,B,L,LX) :- append(L1,[B|L2],[A|L3],L), append(L1,[A|L2],[B|L3],LX),!. append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% :- op(250,xf,g). :- op(250,xf,kg). :- op(250,xf,cc). :- op(250,xf,羽). :- op(250,xf,個). :- op(250,xf,個分). :- op(250,xf,本分). :- op(250,xf,尾). :- op(250,xf,枚). :- op(250,xf,リットル). :- op(250,xf,串). :- op(250,xf,欠片). :- op(250,xf,切れ). :- op(250,xf,瓶). :- op(250,xf,カップ). :- op(300,fx,大匙). :- op(300,fx,小匙). :- op(250,xf,杯). :- op(250,xf,人前). レシピ(すずきの白ブドウ酒入り蒸し焼き,'海すずき(1.1kg)',6 人前,1 尾). レシピ(すずきの白ブドウ酒入り蒸し焼き,塩,6 人前,少量). レシピ(すずきの白ブドウ酒入り蒸し焼き,辛口白ブドウ酒,6 人前,400 cc). レシピ(すずきの白ブドウ酒入り蒸し焼き,バター,6 人前,25 g). レシピ(トゥルネード・フィナンシエール風,仔牛の胸腺肉,6 人前,225 g). レシピ(トゥルネード・フィナンシエール風,'塩・コショウ',6 人前,少々). レシピ(トゥルネード・フィナンシエール風,仔牛の骨の髄,6 人前,75 g). レシピ(トゥルネード・フィナンシエール風,ワインビネガー,6 人前,15 cc). レシピ(トゥルネード・フィナンシエール風,'玉ねぎのみじん切り(小)',6 人前,1 個分). レシピ(トゥルネード・フィナンシエール風,'にんじんのみじん切り',6 人前,1 本分). レシピ(トゥルネード・フィナンシエール風,'セロリのみじん切り',6 人前,1 本分). レシピ(トゥルネード・フィナンシエール風,'バター',6 人前,140 g). レシピ(トゥルネード・フィナンシエール風,'マデラ酒',6 人前,100 cc). レシピ(トゥルネード・フィナンシエール風,'酢漬けシャンピニョンの角切り',6 人前,110 g). レシピ(トゥルネード・フィナンシエール風,'キュウリのピクルスの角切り',6 人前,55 g). レシピ(トゥルネード・フィナンシエール風,'仔牛の脚から切り取った角切り',6 人前,6 切れ). レシピ(トゥルネード・フィナンシエール風,'小麦粉',6 人前,8 g). 作り方(すずきの白ブドウ酒入り蒸し焼き,1,'皮に傷をつけないように下ごしらえする。魚はきざみ目をつけて内側に塩をする。'). 作り方(すずきの白ブドウ酒入り蒸し焼き,2,'鍋にブドウ酒、バター、塩少量を入れて魚を入れ、蓋をして中火のオープンで約20分間魚がやわらかくなるまで蒸し焼きにする。'). 作り方(すずきの白ブドウ酒入り蒸し焼き,3,'魚を皿に盛り魚の背中に2~3つの切り目をつけ、上から濾した煮汁をかけてすぐ供する。'). ?- % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/55 # # [1] 授業単元:プログラム言語論 # [2] 問題文(含コード&リンク): # # 設問1.C言語、またはC++言語で、割り算を計算するdev(int x,int y)関数(*)を作成しなさい。 # ただし、不変表明(assert)を使って、0で除算を実行した場合にエラーを出力するようにすること。 # (*)関数devは、int型の返値を持ち、x/yを計算するものとする。 :- op(700,xfx,は). 関数定義(div(X,Y),Z) :- div(X,Y,Z). div(X,Y,Z) :- length(L1,X), length(L2,Y), div(L1,L2,DIV,MOD), length(DIV,Z). div(_,[],_,_) :- write('0除算エラー\n'),!. div(L1,L2,[_|D],MOD) :- append(L2,L3,L1), div(L3,L2,D,MOD). div(L1,L2,[],L1) :- \+(append(L2,L3,L1)). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% findavg(_集約項,_項,_算術平均) :- findall(_集約項,_項,_値ならび), '加算'(_値ならび,_合計値), length(_値ならび,_ならびの長さ), _算術平均 is _合計値 / _ならびの長さ,!. 加算(trunc(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A is trunc(B)),SL),!. 加算(四捨五入(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A は 四捨五入(B)),SL),!. 加算(切捨て(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A は 切捨て(B)),SL),!. 加算(切り上げ(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A は 切り上げ(B)),SL),!. 加算([],L) :- var(L), L = 0.0e+00,!. 加算([],L) :- \+(var(L)), 加算の変数に零をおく(L),!. 加算([L|R],SL) :- ならび(L), 行列の転置([L|R],L1), 加算_2(L1,SL),!. 加算(X,S) :- 加算_1(X,0.0e+00,S) . 加算_1([],S,S) :- !. 加算_1([A|R],Y,S) :- ならび(A), ならび(Y), !, ならび加算(A,Y,Z), 加算_1(R,Z,S),!. 加算_1([A|R],Y,S) :- atom(A), atom_number(A,I), integer(I), Z is I + Y, 加算_1(R,Z,S),!. 加算_1([A|R],Y,S) :- atom(A), atom_number(A,F), real(F), Z is F + Y, 加算_1(R,Z,S),!. 加算_1([A|R],Y,S) :- atom(A), 加算_1(R,Y,S),!. 加算_1([A|R],Y,S) :- A1 は A, Z is A1 + Y, 加算_1(R,Z,S). 加算_1(A,Y,S) :- とからりすと(A,L), !, 加算_1(L,Y,S) . 加算_2([],[]) :- !. 加算_2([L|R],[S|R2]) :- 加算(L,S), 加算_2(R,R2). 加算の変数に零をおく([]) :- !. 加算の変数に零をおく([A|R]) :- 変数(A), A = 0.0e+00, 加算の変数に零をおく(R),!. とからりすと(A,[A]) :- atomic(A),!. とからりすと(A と B,C) :- とからりすと(A,A1), とからりすと(B,B1), append(A1,B1,C). 変数(_変数) :- var(_変数). ならび([_|_]). _項 は (_ネットワーク :: _式) :- _ネットワーク :: _項 は _式, ! . _評価項 は N : L :- M は N, L1 は L, list_nth(M,L1,_評価項), ! . _評価項 は prolog(_評価項) :- functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), !, error_protect(_評価項,fail) . _評価値 は [X|{P}] :- findall(X,P,_評価値), ! . _評価項 は ` _値 :- !, _評価項 = _値, ! . _項 は _式 :- var(_式), _項 = _式, ! . _項 は _式 :- error_protect(一時関数定義(_式,_項),fail) . _項 は _式 :- atom(_式), member(_式,[minint,maxint,cputtime,time,csize,cused,dbsize,dbused,gsize,gused,noptrs,ptrsued,ssize,sused,tsize,tused]), !, _項 is _式, ! . _項 は _式 :- 二項組込み関数(_式), 二項組込み関数の評価(_式,_項) . _項 は _式 :- 二項組込み関数(_式), !, fail . _項 は _式 :- functor(_式,Functor,1), arg(1,_式,Arg), Y は Arg, functor(_式_1,Functor,1), arg(1,_式_1,Y), member(Functor,[atom,real,integer,var,float,list]), !, error_protect(_式_1,fail), _項 = Y, ! . _項 は _式 :- atom(_式), error_protect(get_global(_式,_項),fail), ! . _項 は _式 :- real(_式), _項 = _式, ! . _項 は _式 :- real(_式), !, fail . _項 は _式 :- list(_式), findall(X,(member(U,_式) , X は U),_項) . _項 は _式 :- list(_式), !, fail. _項 は _erlang_module : _erlang関数 :- erlang関数評価(_erlang_module : _erlang関数,_項),!. _項 は _式 :- 関数定義(_式,_項),!. _項 は _式 :- functor(_式,_関数,_次数), function(_関数,_次数), findall(Arg,(for(1,N,_次数) , arg(N,_式,Arg)),L), 関数評価に於いて引数部分の関数評価(L,L2), _式の二 =.. [_関数|L2], error_protect(_項 is _式の二,fail) . _項 は _評価関数 :- error_protect(_項 is _評価関数,fail),!. _評価項 は prolog(_評価項) :- functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), !, error_protect(_評価項,fail),!. _項 は _評価項 :- 述語評価が可能(_評価項,_関数,_次数,_次数足す一), _評価項 =.. _評価項の項分解ならび, findall(Arg,(for(1,N,_次数) , arg(N,_評価項,Arg)),L), 関数評価に於いて引数部分の関数評価(L,L2), append(L2,[_],_変数を付加した引数ならび), _解付き評価項 =.. [_関数|_変数を付加した引数ならび], error_protect(_解付き評価項,fail), arg(_次数足す一,_解付き評価項,_項) . _項 は _評価項 :- \+(述語評価が可能(_評価項,_関数,_次数,_次数足す一)), functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), error_protect(_評価項,fail), arg(Arg,_評価項,_項) . _項 は _評価項 :- \+(述語評価が可能(_評価項,_関数,_次数,_次数足す一)), functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), \+(error_protect(_評価項,fail)), _評価項 = _項,!. _項 は _式 :- atomic(_式), \+(述語評価が可能(_式,_関数,_次数,_次数足す一)), _項 = _式,!. 述語評価が可能(_評価項,_関数,_次数,_次数足す一) :- functor(_評価項,_関数,_次数), _次数足す一 is _次数 + 1, \+(predicate_type(_関数,_次数足す一,undefined)),!. 関数評価に於いて引数部分の関数評価([],[]). 関数評価に於いて引数部分の関数評価([L|R1],[L2|R2]) :- list(L), !, 関数評価に於いて引数部分の関数評価(L,L2), 関数評価に於いて引数部分の関数評価(R1,R2), ! . 関数評価に於いて引数部分の関数評価([F|R1],[F|R2]) :- \+(error_protect(F2 は F,fail)), !, 関数評価に於いて引数部分の関数評価(R1,R2) . 関数評価に於いて引数部分の関数評価([F|R1],[F2|R2]) :- error_protect(F2 は F,fail), 関数評価に於いて引数部分の関数評価(R1,R2) . erlang関数評価(os : cmd(Command),_項) :- erlang :: (os : cmd(Command) -> _項_1), _項 は string2atom(_項_1),!. erlang関数評価(_erlang_module : _erlang関数,_項) :- erlang :: (_erlang_module : _erlang関数 -> _項),!. 関数定義(_項の一 + _項の二,_値) :- _値の一 は _項の一, number(_値の一), _値の二 は _項の二, number(_値の二), _値 is _値の一 + _値の二, !. 関数定義(_項の一 + _項の二,_値) :- _値の一 は _項の一, atomic(_値の一), _値の二 は _項の二, atomic(_値の二), concat_atom([_値の一,_値の二],_値), !. 関数定義(_ならびの一 + _ならびの二,_値) :- ( 変数(_ならびの一) ; _ならびの一 == [] ; list(_ならびの一) ; 変数(_ならびの二) ; _ならびの二 == [] ; list(_ならびの二) ), !, append(_ならびの一,_ならびの二,_値) . 関数定義(_項の一 * _項の二,_値) :- _値の一 は _項の一, list(_値の一), _値の二 は _項の二, integer(_値の二), findall(_値の一,for(1,_,_値の二),LY), concat_list(LY,_値), !. 関数定義(_項の一 * _項の二,_値) :- _値の一 は _項の一, atom(_値の一), _値の二 は _項の二, integer(_値の二), findall(_値の一,for(1,_,_値の二),L), concat_atom(L,_値), !. 関数定義(_項の一 * _項の二,_値) :- _値の一 は _項の一, atomic(_値の一), _値の二 は _項の二, atomic(_値の二), concat_atom([_値の一,_値の二],_値), !. 関数定義(_ならびの一 * _ならびの二,_値) :- ( 変数(_ならびの一) ; _ならびの一 == [] ; list(_ならびの一) ; 変数(_ならびの二) ; _ならびの二 == [] ; list(_ならびの二) ), !, append(_ならびの一,_ならびの二,_値) . 関数定義(` _値,_値) :- !. 関数定義(@ _式,_値) :- _値 は _式,!. 関数定義(四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _値の二 >= 0.0e+00, _四捨五入後の値 is floor(_値の二 + 0.5) * 1.0,!. 関数定義(四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _四捨五入後の値 is ceil(_値の二 - 0.5),!. 関数定義(切り捨て(_値),_切り捨て後の値) :- _値の二 は _値, _切り捨て後の値 は floor(_値の二) * 1.0,!. 関数定義(切り上げ(_値),_切り上げ後の値) :- _値の二 は _値, _切り上げ後の値 は ceil(_値の二),!. 関数定義(十円未満四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _四捨五入後の値 は floor(_値の二 / 10 + 0.5) * 10,!. 関数定義(十円未満切り捨て(_値),_切り捨て後の値) :- _値の二 は _値, _切り捨て後の値 は trunc(_値の二 / 10) * 10,!. 関数定義(十円未満切り上げ(_値),_切り上げ後の値) :- _値の二 は _値, _切り上げ後の値 は ceil(_値の二 / 10) * 10,!. 関数定義(百円未満四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _四捨五入後の値 は floor(_値の二 / 100 + 0.5) * 100,!. 関数定義(百円未満切り上げ(_値),_切り上げ後の値) :- _値の二 は _値, _切り上げ後の値 は ceil(_値の二 / 100) * 100,!. 関数定義(百円未満切り捨て(_値),_切り捨て後の値) :- _値の二 は _値, _切り捨て後の値 は floor(_値の二 / 100) * 100,!. 関数定義(整数化(_値),_整数化された値) :- _値の二 は _値, _整数化された値 is trunc(_値の二),!. 関数定義(char_code(_項),_値) :- ( atom(_項), atomic_length(_項,1), char_code(_項,_値) ; integer(_項), char_code(_値,_項) ; 複合項(_項), _項の一 は _項, _値 は char_code(_項の一) ), !. 関数定義($ _大域変数名,_値) :- atom(_大域変数名), get_global(_大域変数名,_値の一), _値 は _値の一,!. 関数定義(S,E) :- functor(S,select,1), to(S,E),!. 関数定義(setq(A,B),E) :- atom(A), B1 は B, set_global(A,B1), E = B1,!. 関数定義(++ A,X) :- A1 は A, list(A1), 加算(A1,X),!. 関数定義(A ++ B,X) :- C is B / A, X = A + C + B,!. 関数定義(car(A),E) :- A1 は A, A1 = [E|_],!. 関数定義(cdr(A),E) :- A1 は A, A1 = [_|E],!. 関数定義(cons(A,B),E) :- A1 は A, B1 は B, E = [A1|B1],!. 関数定義(length(A),E) :- A1 は A, list(A1), length(A1,E),!. 関数定義(decode(A,B,C,D),E) :- A1 は A, B1 は B, A1 = B1, E は C,!. 関数定義(decode(A,B,C,D),E) :- E は D,!. 関数定義(decompcons(A),E) :- A1 は A, decompcons(A1,E),!. 関数定義(substr(A,B,C),E) :- 関数定義(subatomic(A,B,C),E),!. 関数定義(subatomic(A,B,C),E) :- A1 は A, B1 は B, C1 は C, subatomic(A1,B1,C1,E),!. 関数定義(concat(A),E) :- A1 は A, concat(A1,E),!. 関数定義(concat(A,B),E) :- A1 は A, B1 は B, concat(A1,B1,E),!. 関数定義(append(A,B),E) :- A1 は A, B1 は B, append(A1,B1,E),!. 関数定義(reverse(A),E) :- A1 は A, reverse(A1,E),!. 関数定義(string2atom(A),E) :- A2 は A, flat(A2,B), atom_codes(E,B),!. 関数定義(P,E) :- functor(P,greatest,Arg), P =.. [greatest|L], findall(B,(member(A,L) , B は A),L2), max(L2,E),!. 関数定義(P,E) :- functor(P,least,Arg), P =.. [least|L], findall(B,(member(A,L) , B は A),L2), min(L2,E),!. 関数定義(cel(_列数,_行数,_行列),_解) :- _関数評価された行数 は _行数, _関数評価された列数 は _列数, list_nth(_関数評価された行数,_行列,_行), list_nth(_関数評価された列数,_行,_解),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1250204272/974 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # new と deleteを使ったプログラムの作成 #  人数、名前、点数を入力し、横棒グラフを表示するプログラムを作りなさい。 # ただし、グラフは5点刻みとし、点数は0点から100点の範囲とする。 # <実行画面> # 人数 : 3 # 1人目の名前 : A # 1人目の点数 : 80 # 2人目の名前 : B # 2人目の点数 : 55 # 3人目の名前 : C # 3人目の点数 : 95 # # 名( 点 )| 50 100 # --------+---------+---------+ # A ( 80)|**************** # B ( 55)|*********** # C ( 95)|******************* # 平均 77|*************** # :- op(800,xfx,人目の名前). :- op(800,xfx,人目の点数). 1人目の名前 'A'. 1人目の点数 80. 2人目の名前 'B'. 2人目の点数 55. 3人目の名前 'C'. 3人目の点数 95. t786 :- write(' 名(点)| 50 100\n--------+---------+---------+\n'), N 人目の名前 _名前, N 人目の点数 _点数, 星表現(_点数,_星表現), write_formatted('%4s(%2d)|%t\n',[_名前,_点数,_星表現]), fail. t786 :- findavg(V,_ 人目の点数 V,_平均点), 星表現(_平均点,_星表現), write_formatted('平均(%2d)|%t\n',[_平均点,_星表現]). 星表現(_点数,_星表現) :- Y is _点数 // 5, all(Y,L,'*'), concat_atom(Y,_星表現). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% all(Length,L,A) :- length(L,Length), all(L,A). all([],_). all([A|R],A) :- all(R,A). findavg(_集約項,_項,_算術平均) :- findall(_集約項,_項,_値ならび), '加算'(_値ならび,_合計値), length(_値ならび,_ならびの長さ), _算術平均 is _合計値 / _ならびの長さ,!. 加算([],0.0). 加算([A|R1],X) :- 加算(R1,Y), X is A + Y. concat_atom([],'') :- !. concat_atom([Atom],Atom) :- !. concat_atom([Atom1|R1],Atom) :- concat_atom(R1,Atom2), atom_append(Atom1,Atom2,Atom). concat_atom([],_,'') :- !. concat_atom([Atom],_,Atom) :- !. concat_atom([Atom1|R1],_区切り文字,Atom) :- concat_atom(R1,_区切り文字,Atom2), atom_append(Atom1,_区切り文字,Atom3), atom_append(Atom3,Atom2,Atom). % 以下のサイトは :- 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/1250204272/89 # # [1] 授業単元:プログラミング演習 # [2] 問題文:構造体triangeleはメンバとして、 # 各頂点の座標を表す構造体pointのp1,p2,p3を持つ。 # また関数show_triangleはtriangleの内容を表示する。 # 乱数を利用してtriangleのインスタンスを1つ作成し、 # 関数show_trianglwを利用して、その内容を表示せよ。 :- op(700,xfx,(::)). インスタンス(0). 座標範囲(p1,0,2048). 座標範囲(p2,0,2048). 座標範囲(p3,0,2048). new_triangle(_インスタンス) :- 新しいインスタンス(_インスタンス), 新しい頂点を得る([],L1,p1,V1), assertz(_インスタンス :: triangle(point(p1,V1))), 新しい頂点を得る(L1,L2,p2,V2), assertz(_インスタンス :: triangle(point(p1,V2))), 新しい頂点を得る(L2,_,p3,V3), assertz(_インスタンス :: triangle(point(p1,V3))),!. show_triangle(_インスタンス) :- _インスタンス :: triangle(point(p1,V1))), _インスタンス :: triangle(point(p2,V2))), _インスタンス :: triangle(point(p3,V3))), write_formatted('p1 = %t\np2 = %t\np3 = %t\n',[V1,V2,V3]). 新しい頂点を得る(L1,[V|L1],P,V) :- 座標範囲(P,S,E), X is E-S, V is (random mod X) + S, \+(member(V,L1)),!. 新しい頂点を得る(L1,L2,P,V) :- 新しい頂点を得る(L1,L2,P,V). 新しいインスタンス(_インスタンス) :- retract(インスタンス(No)), No2 is No + 1, assertz(インスタンス(No2)), concat_atom(['$',No2],_インスタンス). % 以下のサイトは # 出典:: 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/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/1247438792/103 # # 【質問テンプレ】 # [1] 授業単元: C言語演習 # [2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9753.txt # 2.入力された年月の1日が何曜日かを調べる。 #   曜日のチェックはZellerの公式を使用する。Zellerの公式は、 #    #   曜日を表す値=(y + [ y / 4 ] - [ y / 100 ] + [ y / 400 ] + [ (( 13 * m ) + 8 ) / 5 ] + d ) % 7 # #           ※ 上記の公式中の y は年、 m は月、 d は日を表し、 #             []はその数を越えない最大の整数を表す。(例: [13.6]は13になる) # #   で、曜日を表す値は次のようになっている。 # #     日曜日 = 0, 月曜日 = 1, 火曜日 = 2, 水曜日 = 3, # # 木曜日 = 4, 金曜日 = 5, 土曜日 = 6, # #   ※但し、1月と2月は前年の13月14月として計算するものとする。 % (1) 年月の入力 年月入力処理(_年,_月) :- 年入力処理(_年), 月入力処理(_月). % (2) 曜日計算 :- op(450,xfx,が),op(500,xfx,であり),op(600,xfx,ならば),op(450,xfx,は). 'Zellerの公式'(年 が Y であり 月 が M であり 日 が D ならば 曜日を表す値 は (Y + Y // 4 - Y // 100 + Y // 400 + ((( 13 * M ) + 8 ) // 5 ) + D ) mod 7). 曜日計算処理(_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日). 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を表す値を得る'(_年,_月,_日,_曜日を表す値), 曜日を表す値(_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を表す値を得る'(_年,1,_日,_曜日を表す値) :- _前年 is _年 - 1, 'Zellerの公式を用いて曜日を表す値を得る'(_前年,13,_日,_曜日を表す値),!. 'Zellerの公式を用いて曜日を表す値を得る'(_年,2,_日,_曜日を表す値) :- _前年 is _年 - 1, 'Zellerの公式を用いて曜日を表す値を得る'(_前年,14,_日,_曜日を表す値),!. 'Zellerの公式を用いて曜日を表す値を得る'(_年,_月,_日,_曜日を表す値) :- _年=Y,_月=M,_日=D, 'Zellerの公式'(年 が Y であり 月 が M であり 日 が D ならば 曜日を表す値 は _Zellerの公式), _曜日を表す値 is _Zellerの公式,!. 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). % (3) カレンダー表示 カレンダー表示 :- 年月入力処理(_年,_月), 'Zellerの公式を用いて曜日を表す値を得る'(_年,_月,1,_曜日を表す整数値), カレンダー表示データ編集(_年,_月,_曜日を表す整数値,_カレンダー表示文字列ならび), 要素に空白を挿入して全行表示(_カレンダー表示文字列ならび). カレンダー表示データ編集(_年,_月,_各月1日の曜日を表す整数値,_カレンダー表示文字列ならび) :- 年月文字列編集処理(_年,_月,_年月文字列), 月日数(_年,_月,_月日数), findall(S,for(1,N,_月日数),ヘッドゼロサプレス(2,N,S)),_表示日ならび), Length is _月日数 + _各月1日の曜日を表す整数値, M is (7 - (Length mod 7)), '7個組ならび'(Length,M,_表示日ならび,_7個組ならび), 見出しならび(_年月文字列,_見出しならび), append(_見出しならび,_7個組ならび,_カレンダー表示文字列ならび). 見出しならび(_年月文字列,[[_年月文字列],[日,月,火,水,木,金,土]]). '7個組ならび'(Length,0,_表示日ならび,_7個組ならび) :- length(L0,Length), すべての要素が(L0,' '), append(L0,_表示日ならび,L), '7個組'(L,_7個組ならび),!. '7個組ならび'(Length,M,_表示日ならび,_7個組ならび) :- not(M=0), length(L0,Length), すべての要素が(L0,' '), length(L2,M), すべての要素が(L2,' '), append(L0,_表示日ならび,L2,L), '7個組'(L,_7個組ならび),!. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- not(0 is _年 mod 4),fail. 月日数(_年,2,29) :- うるう年(_年),!. 月日数(_年,2,28) :- not(うるう年(_年)),!. 月日数(_,_月,30) :- member(_月,[4,6,9,11]). 月日数(_,_月,31) :- member(_月,[1,3,5,7,8,10,12]). % (4) 基礎述語の定義 年入力処理(_年) :- write('表示したいカレンダーは西暦何年 ? '), get_line(_行), 年入力処理の二(_行,_年), 年入力検査(_年),!. 年入力処理(_年) :- 年入力処理(_年). 年入力処理の二(_行,_年) :- atom_to_term(_行,_年), integer(_年),!. 年入力処理の二(_行,_年) :- write_formatted('この入力[ %t ]は整数ではありません\n',[_行]), fail. 年入力検査(_年) :- _年 >= 1583, _年 =< 3999,!. 年入力検査(_年) :- write_formatted('この年を表す整数%tは不正です\n',[_年]), fail. 月入力処理(_月) :- write('月は ? '), get_line(_行), 月入力処理の二(_行,_月), 月入力検査(_月),!. 月入力処理(_月) :- 月入力処理(_月). 月入力処理の二(_行,_月) :- atom_to_term(_行,_月,_), integer(_月),!. 月入力処理の二(_行,_月) :- write_formatted('この入力[ %t ]は整数ではありません\n',[_行]), fail. 月入力検査(_月) :- _月 >= 1, _月 =< 12,!. 月入力検査(_月) :- write_formatted('この月を表す整数%tは不正です\n',[_月]), fail. 日付文字列編集処理(_年,_月,_日,_日付文字列) :- ヘッドゼロサプライ(2,_年,_年文字列), ヘッドゼロサプライ(2,_月,_月文字列), ヘッドゼロサプライ(2,_日,_日文字列), concat_atom([_年文字列,_月文字列,_日文字列],_日付文字列). 年月文字列編集処理(_年,_月,_年月文字列) :- ヘッドゼロサプライ(2,_年,_年文字列), ヘッドゼロサプライ(2,_月,_月文字列), concat_atom([_年文字列,_月文字列],_年月文字列). ヘッドゼロサプライ(N桁,_整数,_ヘッドゼロ整数文字列) :- number_chars(_整数,_数字ならび), ヘッドゼロサプライ_1(N桁,_数字ならび,_ヘッドゼロ整数文字ならび), concat_atom(_ヘッドゼロ整数文字ならび,_ヘッドゼロ整数文字列),!. ヘッドゼロサプライ_1(N桁,L,L) :- length(L,N桁),!. ヘッドゼロサプライ_1(N桁,L,['0'|R]) :- M桁 is N桁 - 1, ヘッドゼロサプライ_1(M桁,L,R). ヘッドゼロサプレス(N桁,_整数,_ヘッド空白整数文字列) :- number_chars(_整数,_数字ならび), ヘッドゼロサプレス_1(N桁,_数字ならび,_ヘッド空白整数文字ならび), concat_atom(_ヘッド空白整数文字ならび,_ヘッド空白整数文字列),!. ヘッドゼロサプレス_1(N桁,L,L) :- length(L,N桁),!. ヘッドゼロサプレス_1(N桁,L,[' '|R]) :- M桁 is N桁 - 1, ヘッドゼロサプレス_1(M桁,L,R). 要素に空白を挿入して全行表示([]) :- !. 要素に空白を挿入して全行表示([L|R]) :- concat_atom(L,' ',_表示行), write_formatted('%t\n',[_表示行]), 要素に空白を挿入して全行表示(R). すべての要素が([],_). すべての要素が([V|R],V) :- すべての要素が(R,V). '7個組'([],[]) :- !. '7個組'([A,B,C,D,E,F,G|R1]),[[A,B,C,D,E,F,G]|R2]) :- '7個組'(R1,R2). n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. not(P) :- \+(P). append([],L1,L2,L) :- append(L1,L2,L) . append([A|R1],L1,L2,[A|R]) :- append(R1,L1,L2,R) . concat_atom([],'') :- !. concat_atom([A],A) :- !. concat_atom([A|R],S) :- concat_atom(R,S1), atom_concat(A,S1,S). concat_atom([],_,'') :- !. concat_atom([A],_,A) :- !. concat_atom([A|R],_区切り文字列,S) :- concat_atom(R,_区切り文字列,S1), atom_concat(A,_区切り文字列,S2), atom_concat(S2,S1,S). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1200175247/550 # # [1] 授業単元: Ruby演習 [2] 問題文、http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9426.txt # Rubyの問題がわかりません 助けてください # # (1)曜日を表す英語と日本語との対応を表すハッシュwdayを定義しなさい # # p wday["sunday"] #=> "日曜日" # p wday["monday"] #=> "月曜日" # p wday["saturday"] #=> "土曜日" # # (2)ハッシュのメソッドを使って(1)のハッシュwdayのペアの数を数えなさい # # (3)eachメソッドと(1)のハッシュwdayを使って以下の文字列を出力させてくださ い。 # 「sunday」は日曜日のことです。 # 「monday」は月曜日のことです。 # # (4)ハッシュには配列の%wのようなものがありません。そこで、空白とタブと改行(正 規表現で定義するなら「/\uff3cs+/」)で区切られた文字列をハッシュに変換するメソ ッドstr2hashを定義してください。 # # p str2hash("bule 青 white 白\uff3cnred赤"); # #=> {"bule"=>"青", "white"=>"白", "red"=>"赤"} :- op(450,xfx,(=>)). % (1) wday({ "sunday" => "日曜日","monday" => "月曜日","saturday" #=> "土曜日"}). % (2) hash_count(Hashname,Count) :- functor(P,Hashname,1), call(P), arg(1,P,H), count(H,Count). count(','(A,B),Count) :- count(B,Count2), Count is Count2 + 1. count(A,1). % (3) ?- each(wday.A=>B),write_formatted('「%t」は%tのことです。\n',[A,B]),fail;true. each(Hashname.Key=>Value) :- functor(P,Hashname,1), arg(1,P,V), each(V,Key=>Value). each(','(Key=>Value,B),Key=>Value). each(','(_,B),Key=>Value) :- each(B,Key=>Value). each(Key=>Value,Key=>Value). % (4) str2hash(Atom,Hash) :- split(Atom,[' ','\t','\n'],L), findall(U,n個組(2,L,U),L2), hashを成長させる(L2,Hash). hashを成長させる([A,B],{ A=>B }) :- !. hashを成長させる([[A,B]|R], { (A=>B,R2) }) :- hashを成長させる(R,{ R2 }). n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1245853701/552 # # [1] 授業単元:情報処理 # [2] 問題文(含コード&リンク): # (1) # http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9670.txt # (2) # http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9671.txt :- op(350,fx,i). :- op(450,xfx,分の). 複素数の割り算(A+iB,C+iD,X+iY) :- X is (A * C + B * D) / ( C ^ 2 + D ^ 2), Y is (B * C - A * D) / ( C ^ 2 + D ^ 2). 複素数の掛け算(A+iB,C+iD,X+iY) :- X is A * C - B * D, Y is A * D + B * C. 複素数の足し算(A+iB,C+iD,X+iY) :- X is A + C, Y is B + D. 分数の積(A 分の B,C 分の D,X 分の Y) :- X is A * C, Y is B * D. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1245853701/275 # # [1] 授業単元:C言語の基礎 # [2] 問題文:年(西暦)、月、日を入力し、入力した、日時の曜日及び、経過した # 日数を表示したプログラムを作成せよ。 :- op(450,xf,日後). t321(_日付,_曜日,N 日後) :- 基準日(_基準日,_基準曜日), 曜日(_基準日,_基準曜日,_日付,_曜日,N). 基準日(2009/07/01,水曜). 曜日(_日付1,_曜日1,_日付2,_曜日2,N) :- 曜日(_日付1,_曜日1,_日付2,_曜日2,0,N). 曜日(_日付,_曜日,_日付,_曜日,N,N) :- ! . 曜日(_日付1,_曜日1,_日付2,_曜日2,N1,N) :- _日付1 @> _日付2, N2 is N - 1, 前日・今日(_日付3,_曜日3,_日付1,_曜日1), 曜日(_日付3,_曜日3,_日付2,_曜日2,N2,N) . 曜日(_日付1,_曜日1,_日付2,_曜日2,N1,N) :- _日付1 @< _日付2, N2 is N + 1, 前日・今日(_日付1,_曜日1,_日付3,_曜日3), 曜日(_日付3,_曜日3,_日付2,_曜日2,N2,N) . 前日・今日(_前日の年/12/31,_前日の曜日,_年/1/1,_曜日) :- 一つ違い(_前日の年,_年), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/2/29,_前日の曜日,_年/3/1,_曜日) :- うるう年(_年), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/2/28,_前日の曜日,_年/3/1,_曜日) :- not(うるう年(_年)), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_前月/30,_前日の曜日,_年/_月/1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[4,6,9,11]), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_前月/31,_前日の曜日,_年/_月/1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[1,3,5,7,8,10,12]), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_月/_前日,_前日の曜日,_年/_月/_日,_曜日) :- 一つ違い(_前日,_日), 曜日連鎖(_前日の曜日,_曜日),!. 一つ違い(M,N) :- integer(M),!, N is M + 1. 一つ違い(M,N) :- integer(N),!, M is N - 1. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- not(0 is _年 mod 4),fail. 曜日連鎖(月曜,火曜). 曜日連鎖(火曜,水曜). 曜日連鎖(水曜,木曜). 曜日連鎖(木曜,金曜). 曜日連鎖(金曜,土曜). 曜日連鎖(土曜,日曜). 曜日連鎖(日曜,月曜). % 以下のサイトは % http://pc12.2ch.net/test/read.cgi/tech/1232627790/588 % 【 課題 】車、新幹線、飛行機の3つの交通手段を考える。 % 距離と、所要時間の最大限度(許容最長時間)を指定したとき、許容最長時間内に % 目的地に到着可能で、かつ、費用が一番安い交通手段を調べて表示しなさい。 % ただし、距離(km)と許容最長時間(h) は浮動小数点数としてキーボードから与える。 % 許容最長時間内に到着できる手段がない場合は、「不可能です」と表示する。 % それぞれの時速、料金、利用規定は % 車 : 60km/h、20 円/km、 % 新幹線 : 200km/h、50 円/km、距離が50km以上のときに利用可能 % 飛行機 : 1000km/h、35 円/km、距離が400km以上のときに利用可能 待機・乗降の合計 % で1 時間にかかるとする。 % :- op(250,xf,km). :- op(250,xf,h). :- op(250,xf,円). 交通手段(車). 交通手段(新幹線). 交通手段(飛行機). 時速(車,60 km / h). 時速(新幹線,200 km / h). 時速(飛行機,1000 km / h). 料金(車,20 円 / km). 料金(新幹線,50 円 / km). 料金(飛行機,35 円 / km). 利用規定(新幹線,_距離 km) :- _距離 >= 50. 利用規定(飛行機,_距離 km) :- _距離 >= 400. 利用規定(車,_距離 km) :- _距離 >= 0. 付加的な所要時間(飛行機,'待機・乗降の合計',1 h). 付加的な所要時間(車,なし,0 h). 付加的な所要時間(新幹線,なし,0 h). '許容最長時間内に目的地に到着可能で、かつ、費用が一番安い交通手段'(_距離 km,_許容最長時間 h,_交通手段) :- '許容最長時間内に目的地に到達可能で、'(_距離 km,_許容最長時間 h,_費用_交通手段ならび), 'かつ、費用が一番安い交通手段'(_費用_交通手段ならび,_交通手段),!. '許容最長時間内に目的地に到着可能で、かつ、費用が一番安い交通手段'(_,_,'不可能です'). '許容最長時間内に目的地に到達可能で、'(_距離 km,_許容最長時間 h,_費用_交通手段ならび) :- findall([_費用,_交通手段],( 許容時間内に到達可能な交通手段の費用(_距離 km,_許容最長時間 h,_交通手段,_費用)),_費用_交通手段ならび). 'かつ、費用が一番安い交通手段'(_費用_交通手段ならび,_交通手段) :- 一番安い(_費用_交通手段ならび,_費用,_交通手段),!. 許容時間内に到達可能な交通手段の費用(_距離 km,_許容最長時間 h,_交通手段,_費用) :- 許容時間内に到達可能な交通手段の(_距離 km,_許容最長時間 h,_交通手段), 費用(_交通手段,_距離 km,_費用). 許容時間内に到達可能な交通手段の(_距離 km,_許容最長時間 h,_交通手段) :- 交通手段(_交通手段), 許容時間内に到達可能(_交通手段,_距離 km,_許容最長時間 h). 費用(_交通手段,_距離 km,_費用) :- 料金(_交通手段,_料金 円 / km), _費用 is _料金 * _距離. 許容時間内に到達可能(_交通手段,_距離 km,_許容最長時間 h) :- 利用規定に適合する交通手段を使っての(_交通手段,_距離 km), 到達時間が(_交通手段,_距離 km,_到達時間 h), 許容最長時間内にある(_到達時間 h,_許容最長時間 h). 利用規定に適合する交通手段を使っての(_交通手段,_距離 km) :- 利用規定(_交通手段,_距離 km). 到達時間が(_交通手段,_距離 km,_到達時間 h) :- 時速(_交通手段,_時速 km / h), 付加的な所要時間(_交通手段,_,_付加的な所要時間 h), _到達時間 is (_距離 / _時速) + _付加的な所要時間. 許容最長時間内にある(_到達時間 h,_許容最長時間 h) :- _到達時間 =< _許容最長時間. 一番安い(_価格_交通手段ならび,_一番安い価格,_交通手段) :- select([_一番安い価格,_交通手段],_価格_交通手段ならび,_残り価格_交通手段ならび), forall(member([_価格,_],_残り価格_交通手段ならび),_価格 @>= _一番安い価格). % 以下のサイトは % <<問題2>>「論理少女1」つじ要作 というマンガの中に出てくる問題です。 % 4箇所の隠し場所と4つのアイテム(お金)は>>62と同じですが、 % 隠す場所は一度ご破算にします。以下のヒントを読んで、 % できるだけ問題文に忠実な表現になるようにプログラミングしてください。 % 1) 髪の中かスカートのポケットのどちらか一万円札が入っている % 2) 胸のポケットに入っているお金はスカートに入ってるお金の10倍 % 3) 百円玉は千円札より上の位置にある % 4) 靴の中のお金は髪の中のお金の100倍 % そして、1)..4)のうちどれかが嘘。 % それでは、 % 靴の中のお金は? % :- op(800,xfx,は). :- op(650,xfx,の). :- op(250,xf,円). 隠した物([一万円札,千円札,百円玉,十円玉]). 隠した場所([髪の中,胸のポケット,スカートのポケット,靴の中]). 髪の中 は 胸のポケット の 直ぐ上にある. 胸のポケット は スカートのポケット の 直ぐ上にある. スカートのポケット は 靴の中 の 直ぐ上にある. A は B の 上にある :- A は B の 直ぐ上にある. A は B の 上にある :- A は C の 直ぐ上にある,C は B の 上にある. お金(一万円札,10000 円). お金(千円札,1000 円). お金(百円玉,100 円). お金(十円玉,10 円). '靴の中のお金は?'(_靴の中のお金) :- 解候補の生成(_解), 靴の中のお金は?(_解,_靴の中のお金). '靴の中のお金は?'(_解,_靴の中のお金) :- member([靴の中,_靴の中のお金],_解), not(ヒント(1,_解)), ヒント(2,_解), ヒント(3,_解), ヒント(4,_解). '靴の中のお金は?'(_解,_靴の中のお金) :- member([靴の中,_靴の中のお金],_解), ヒント(1,_解), not(ヒント(2,_解)), ヒント(3,_解), ヒント(4,_解). '靴の中のお金は?'(_解,_靴の中のお金) :- member([靴の中,_靴の中のお金],_解), ヒント(1,_解), ヒント(2,_解), not(ヒント(3,_解)), ヒント(4,_解). '靴の中のお金は?'(_解,_靴の中のお金) :- member([靴の中,_靴の中のお金],_解), ヒント(1,_解), ヒント(2,_解), ヒント(3,_解), not(ヒント(4,_解)). 解候補の生成(_解) :- 隠した物(_隠した物リスト), 隠した場所(_隠した場所リスト), length(_隠した物リスト,_要素数), 順列(_隠した物リスト,_要素数,_物候補), 解候補の生成(_隠した場所リスト,_物候補,_解). 解候補の生成([],_,[]). 解候補の生成([A|R1],[B|R2],[[A,B]|R]) :- 解候補の生成(R1,R2,R). ヒント(1,_解) :- member([髪の中,一万円札],_解). ヒント(1,_解) :- member([スカートのポケット,一万円札],_解). ヒント(2,_解) :- member([_千円札の場所,千円札],_解), member([_百円玉場所,百円玉],_解), _十円玉の場所 は _千円札の場所 の 上にある. ヒント(3,_解) :- member([スカートのポケット,_物1],_解), member([胸のポケット,_物2],_解), お金(_物1,_円1 円), お金(_物2,_円2 円), _円1 is _円2 * 10. ヒント(4,_解) :- member([靴の中,_物1],_解), member([髪の中,_物2],_解), お金(_物1,_円1 円), お金(_物2,_円2 円), _円1 is _円2 * 100. 順列(Y,0,[]). 順列(Y,N,[A|X]) :- select(A,Y,Z), M is N - 1, 順列(Z,M,X). % 以下のサイトは # <<問題>> この問題は他の言語の宿題スレの問題ではありません。 # 「論理少女1」つじ要作 というマンガの中に出てくる問題です。 # できるだけ、問題文に忠実な表現になるようにこの問題を解いてください。 # <<問題は3問ありますが、手始めに第一問>> # # ちょうど一万円札・千円札・百円玉・十円玉があるわ。今からこのお金を・・・ # 髪の中、胸のポケット、スカートのポケット、靴の中に・・・それぞれ一つずつ隠します # # ヒントをもとにどこに何を隠したかを当てていくのよ では第一問 ヒントは、 # ・ 一万円札は髪の中 # ・ 千円札は十円玉より上の位置 # ・ スカートには胸の10倍のお金が入っている # それでは、全てのお金の位置は? :- op(800,xfx,は). :- op(650,xfx,の). :- op(250,xf,円). 隠した物([一万円札,千円札,百円玉,十円玉]). 隠した場所([髪の中,胸のポケット,スカートのポケット,靴の中]). 髪の中 は 胸のポケット の 直ぐ上にある. 胸のポケット は スカートのポケット の 直ぐ上にある. スカートのポケット は 靴の中 の 直ぐ上にある. A は B の 上にある :- A は B の 直ぐ上にある. A は B の 上にある :- A は C の 直ぐ上にある,C は B の 上にある. お金(一万円札,10000 円). お金(千円札,1000 円). お金(百円玉,100 円). お金(十円玉,10 円). ヒント(1,_解). member([髪の中,一万円札],_解). ヒント(2,_解) :- member([_千円札の場所,千円札],_解), member([_十円玉場所,十円玉],_解), _千円札の場所 は _十円玉の場所 の 上にある. ヒント(3,_解) :- member([スカートのポケット,_物1],_解), member([胸のポケット,_物2],_解), お金(_物1,_円1 円), お金(_物2,_円2 円), _円1 is _円2 * 10. 全てのお金の位置は?(_解) :- 解候補の作成(_解), ヒント(1,_解), ヒント(2,_解), ヒント(3,_解). 解候補の生成(_解) :- 隠した物(_隠した物リスト), 隠した場所(_隠した場所リスト), length(_隠した物リスト,_要素数), 順列(_隠した物リスト,_要素数,_物候補), 解候補の生成(_隠した場所リスト,_物候補,_解). 解候補の生成([],_,[]). 解候補の生成([A|R1],[B|R2],[[A,B]|R]) :- 解候補の生成(R1,R2,R). 順列(Y,0,[]). 順列(Y,N,[A|X]) :- select(A,Y,Z), M is N - 1, 順列(Z,M,X).