このディレクトリの索引

% 以下のサイトは # 出典 :: CodeIQ q1365 # # 成績の分布などを表すのに使われる度数分布表。 # ひと目で全体の散らばり具合がわかって便利です。 # # 【問題】 # 今回は素数の度数分布表を作ってみます。 # 入力として2つの正の整数が与えられます。 # 一つ目は分布させる素数の最大値、二つ目は区切りの大きさです。 # 例えば、30と5が与えられたとき、30までの素数を5で区切って出力します。 # 30までの素数は2, 3, 5, 7, 11, 13, 17, 19, 23, 29ですので、 # 出力内容は以下のようになります。 # 01-05:*** # 06-10:* # 11-15:** # 16-20:** # 21-25:* # 26-30:* # 同様に、40と7が与えられると、以下のように出力されます。 # 01-07:**** # 08-14:** # 15-21:** # 22-28:* # 29-35:** # 36-42:* # 上記のように出力するプログラムを作成してください。 # なお、最低限、以下の入力に対して正常に動作することを確認してください。 # 入力1:100 15 # 入力2:1200 25 # 入力3:12345 789 # '今回は素数の度数分布表を作ってみます。'(_最大値,_区切り) :- 素数の度数分布表(_最大値,_区切り,_度数分布表), 度数分布図として表示する(_度数分布表). 素数の度数分布表(_最大値,_区切り,_度数分布表) :- 素数を生成する(_最大値,_素数ならび), 素数の度数分布表(_素数ならび,_区切り,_最大値,_度数分布表). 素数を生成する(_最大値,_素数ならび) :- findall(_自然数,between(2,_最大値,_自然数),L), エラトステネスの篩(L,_素数ならび). エラトステネスの篩([],[]) :- !. エラトステネスの篩([M|R1],[M|R2]) :- エラトステネスの篩(M,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(M,R1,L) :- findall(N,( member(N,R1), \+(0 is N mod M)),L). 素数の度数分布表(_素数ならび,_区切り,_最大値,_度数分布表) :- findall([_範囲下限,_範囲上限,_度数],( 素数の度数分布(_素数ならび,_最大値,_区切り,1,_区切り,_範囲下限,_範囲上限,_度数)),_度数分布表). 素数の度数分布(_素数ならび,_最大値,_区切り,_範囲下限,_範囲上限,_範囲下限,_範囲上限,_度数) :- 範囲と度数を得る(_素数ならび,_最大値,_範囲下限,_範囲上限,_度数). 素数の度数分布(_素数ならび,_最大値,_区切り,_範囲下限_1,_範囲上限_1,_範囲下限,_範囲上限,_度数) :- '範囲をずらしながら、素数の度数分布を得る'(_素数ならび,_最大値,_区切り,_範囲下限_1,_範囲上限_1,_範囲下限,_範囲上限,_度数). 範囲と度数を得る(_素数ならび,_最大値,_範囲下限,_範囲上限,_度数) :- _範囲下限 =< _最大値, 度数((between(_範囲下限,_範囲上限,_素数),member(_素数,_素数ならび)),_度数). '範囲をずらしながら、素数の度数分布を得る'(_素数ならび,_最大値,_区切り,_範囲下限_1,_範囲上限_1,_範囲下限,_範囲上限,_度数) :- _範囲下限_1 =< _最大値, 次の範囲を確定する(_区切り,_範囲下限_1,_範囲上限_1,_次の範囲下限,_次の範囲上限), 素数の度数分布(_素数ならび,_最大値,_区切り,_次の範囲下限,_次の範囲上限,_範囲下限,_範囲上限,_度数). 次の範囲を確定する(_区切り,_範囲下限_1,_範囲上限_1,_次の範囲下限,_次の範囲上限) :- _次の範囲下限 is _範囲下限_1 + _区切り, _次の範囲上限 is _範囲上限_1 + _区切り. 度数(_目標,_度数) :- findall(_,_目標,L), length(L,_度数). 度数分布図として表示する(_度数分布表) :- 範囲の下限値と上限値のそれぞれの最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数), 範囲毎に柱を表示する(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数). 範囲の下限値と上限値のそれぞれの最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数) :- 範囲下限値の最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数), 範囲上限値の最大値の桁数を得る(_度数分布表,_範囲上限の表示桁数). 範囲下限値の最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数) :- findall(_桁数,範囲下限値の桁数(_度数分布表,_桁数),L), max_list(L,_範囲下限の表示桁数). 範囲下限値の桁数(_度数分布表,_下限桁数) :- member([_範囲下限,_,_],_度数分布表), number_chars(_範囲下限,Chars), length(Chars,_下限桁数). 範囲上限値の最大値の桁数を得る(_度数分布表,_範囲の表示桁数) :- findall(_桁数,範囲上限値の桁数(_度数分布表,_桁数),L), max_list(L,_範囲の表示桁数). 範囲上限値の桁数(_度数分布表,_上限桁数) :- member([_,_範囲上限,_],_度数分布表), number_chars(_範囲上限,Chars), length(Chars,_上限桁数). 範囲毎に柱を表示する(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数) :- forall( member([_範囲下限,_範囲上限,_度数],_度数分布表), 柱を表示する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_度数)). 柱を表示する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_度数) :- ヘッドゼロサプライで範囲を表現する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_範囲表現文字列), 星文字列(_度数,_星文字列), writef('%t:%t\n',[_範囲表現文字列,_星文字列]). ヘッドゼロサプライで範囲を表現する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_範囲表現文字列) :- ヘッドゼロサプライ(_範囲下限の表示桁数,_範囲下限,_表示範囲下限), ヘッドゼロサプライ(_範囲上限の表示桁数,_範囲上限,_表示範囲上限), atomic_list_concat([_表示範囲下限,'-',_表示範囲上限],_範囲表現文字列). ヘッドゼロサプライ(_桁数,_数値,_ヘッドゼロサプライ数値表現) :- ヘッドゼロサプライを構成する枠を作る(_桁数,_ヘッドゼロサプライされたリスト), 数値を文字のリスト変換してその頭部にゼロを埋める(_数値,_ヘッドゼロサプライされたリスト), 文字リストを文字列に変換(_ヘッドゼロサプライされたリスト,_ヘッドゼロサプライ数値表現). ヘッドゼロサプライを構成する枠を作る(_桁数,_ヘッドゼロサプライされたリスト) :- length(_ヘッドゼロサプライされたリスト,_桁数). 数値を文字のリスト変換してその頭部にゼロを埋める(_数値,_ヘッドゼロサプライされたリスト) :- number_chars(_数値,_数字のリスト), append(_頭部の枠リスト,_数字のリスト,_ヘッドゼロサプライされたリスト), 全ての要素が同じ(_頭部の枠リスト,'0'). 全ての要素が同じ([],_). 全ての要素が同じ([V|R],V) :- 全ての要素が同じ(R,V). 星文字列(_度数,_星文字列) :- findall(*,between(1,_度数,_),L), atomic_list_concat(L,_星文字列). 文字リストを文字列に変換(_ヘッドゼロサプライされたリスト,_ヘッドゼロサプライ数値表現) :- atom_chars(_ヘッドゼロサプライ数値表現,_ヘッドゼロサプライされたリスト). % 以下のサイトは fizzbuzz(_数,_FizzBuzz) :- '_FizzBuzzが変数でないときは、Fizz,Buzz,FizzBuzzの何れか、或いは自然数でなくてはならない'(_FizzBuzz), '_数を生成し_FizzBuzzを得る'(_数,_FizzBuzz). '_FizzBuzzが変数でないときは、Fizz,Buzz,FizzBuzzの何れか、或いは自然数でなくてはならない'(_FizzBuzz) :- '_FizzBuzzが変数でないときは、'(_FizzBuzz), 'Fizz,Buzz,FizzBuzzの何れか、或いは自然数でなくてはならない'(_FizzBuzz). '_FizzBuzzが変数でないときは、Fizz,Buzz,FizzBuzzの何れか、或いは自然数でなくてはならない'(_FizzBuzz) :- '_FizzBuzzが変数のときはこの条件検査の対象外である'(_FizzBuzz). '_FizzBuzzが変数でないときは、'(_FizzBuzz) :- \+(var(_FizzBuzz)). 'Fizz,Buzz,FizzBuzzの何れか、或いは自然数でなくてはならない'(_FizzBuzz) :- 'Fizz,Buzz,FizzBuzzの何れか、'(_FizzBuzz). 'Fizz,Buzz,FizzBuzzの何れか、或いは自然数でなくてはならない'(_FizzBuzz) :- 自然数でなくてはならない(_FizzBuzz). 'Fizz,Buzz,FizzBuzzの何れか、'(_FizzBuzz) :- member(_FizzBuzz,['Fizz','Buzz','FizzBuzz']). 自然数でなくてはならない(_FizzBuzz) :- integer(_FizzBuzz), _FizzBuzz > 0. '_FizzBuzzが変数のときはこの条件検査の対象外である'(_FizzBuzz) :- var(_FizzBuzz). '_数を生成し_FizzBuzzを得る'(_数,_FizzBuzz) :- '_数を生成し'(_数), ('_FizzBuzzが整数のときは_数 > _FizzBuzzの場合打ち切る'(_数,_FizzBuzz),!,fail; '_FizzBuzzを得る'(_数,_FizzBuzz)). '_数を生成し'(_数) :- nth1(_数,_,_). '_FizzBuzzが整数のときは_数 > _FizzBuzzの場合打ち切る'(_数,_FizzBuzz) :- integer(_FizzBuzz), _数 > _FizzBuzz. '_FizzBuzzを得る'(_数,'Fizz') :- '_数は3で割り切れて、5では割り切れない'(_数). '_FizzBuzzを得る'(_数,'Buzz') :- '_数は5で割り切れて、3では割り切れない'(_数). '_FizzBuzzを得る'(_数,'FizzBuzz') :- '_数は3でも5でも割り切れる'(_数). '_FizzBuzzを得る'(_数,_FizzBuzz) :- '_数が3でも5でも割り切れないときは_FizzBuzzには_数を返す'(_数,_FizzBuzz). '_数は3で割り切れて、5では割り切れない'(_数) :- '_数は3で割り切れて、'(_数), '5では割り切れない'(_数). '_数は3で割り切れて、'(_数) :- 0 is _数 mod 3. '5では割り切れない'(_数) :- \+(0 is _数 mod 5). '_数は5で割り切れて、3では割り切れない'(_数) :- '_数は5で割り切れて、'(_数), '3では割り切れない'(_数). '_数は5で割り切れて、'(_数) :- 0 is _数 mod 5. '3では割り切れない'(_数) :- \+(0 is _数 mod 3). '_数は3でも5でも割り切れる'(_数) :- 0 is _数 mod 3, 0 is _数 mod 5. '_数が3でも5でも割り切れないときは_FizzBuzzには_数を返す'(_数,_数) :- '_数が3でも割り切れない'(_数), '_数が5でも割り切れない'(_数). '_数が3でも割り切れない'(_数) :- \+(0 is _数 mod 3). '_数が5でも割り切れない'(_数) :- \+(0 is _数 mod 5). % 以下のサイトは fizzbuzz(_数,_FizzBuzz) :- '_FizzBuzzが変数でないときは、"Fizz","Buzz","FizzBuzz"の何れか、或いは自然数でなくてはならない'(_FizzBuzz), '_数を生成し_FizzBuzzを得る'(_数,_FizzBuzz). '_FizzBuzzが変数でないときは、"Fizz","Buzz","FizzBuzz"の何れか、或いは自然数でなくてはならない'(_FizzBuzz) :- '_FizzBuzzが変数でないときは、'(_FizzBuzz), '"Fizz","Buzz","FizzBuzz"の何れか、或いは自然数でなくてはならない'(_FizzBuzz). '_FizzBuzzが変数でないときは、"Fizz","Buzz","FizzBuzz"の何れか、或いは自然数でなくてはならない'(_FizzBuzz) :- '_FizzBuzzが変数のときはこの条件検査の対象外である'(_FizzBuzz). '_FizzBuzzが変数でないときは、'(_FizzBuzz) :- \+(var(_FizzBuzz)). '"Fizz","Buzz","FizzBuzz"の何れか、或いは自然数でなくてはならない'(_FizzBuzz) :- '"Fizz","Buzz","FizzBuzz"の何れか、'(_FizzBuzz). '"Fizz","Buzz","FizzBuzz"の何れか、或いは自然数でなくてはならない'(_FizzBuzz) :- 自然数でなくてはならない(_FizzBuzz). '"Fizz","Buzz","FizzBuzz"の何れか、'(_FizzBuzz) :- member(_FizzBuzz,["Fizz","Buzz","FizzBuzz"]). 自然数でなくてはならない(_FizzBuzz) :- integer(_FizzBuzz), _FizzBuzz > 0. '_FizzBuzzが変数のときはこの条件検査の対象外である'(_FizzBuzz) :- var(_FizzBuzz). '_数を生成し_FizzBuzzを得る'(_数,_FizzBuzz) :- '_数を生成し'(_数,_FizzBuzz), '_FizzBuzzを得る'(_数,_FizzBuzz). '_数を生成し'(_数,_FizzBuzz) :- nth1(_数,_,_). '_FizzBuzzを得る'(_数,"Fizz") :- '_数は3で割り切れて、5では割り切れない'(_数). '_FizzBuzzを得る'(_数,"Buzz") :- '_数は5で割り切れて、3では割り切れない'(_数). '_FizzBuzzを得る'(_数,"FizzBuzz") :- '_数は3でも5でも割り切れる'(_数). '_FizzBuzzを得る'(_数,_FizzBuzz) :- '_数が3でも5でも割り切れないときは_FizzBuzzには_数を返す'(_数,_FizzBuzz). '_数は3で割り切れて、5では割り切れない'(_数) :- '_数は3で割り切れて、'(_数), '5では割り切れない'(_数). '_数は3で割り切れて、'(_数) :- 0 is _数 mod 3. '5では割り切れない'(_数) :- \+(0 is _数 mod 5). '_数は5で割り切れて、3では割り切れない'(_数) :- '_数は5で割り切れて、'(_数), '3では割り切れない'(_数). '_数は5で割り切れて、'(_数) :- 0 is _数 mod 5. '3では割り切れない'(_数) :- \+(0 is _数 mod 3). '_数は3でも5でも割り切れる'(_数) :- 0 is _数 mod 3, 0 is _数 mod 5. '_数が3でも5でも割り切れないときは_FizzBuzzには_数を返す'(_数,_数) :- '_数が3でも割り切れない'(_数), '_数が5でも割り切れない'(_数). '_数が3でも割り切れない'(_数) :- \+(0 is _数 mod 3). '_数が5でも割り切れない'(_数) :- \+(0 is _数 mod 5). % 以下のサイトは fizzbuzz(_数,_FizzBuzz) :- '_数を生成し_FizzBuzzを得る'(_数,_FizzBuzz). '_数を生成し_FizzBuzzを得る'(_数,_FizzBuzz) :- '_数を生成し'(_数,_FizzBuzz), '_FizzBuzzを得る'(_数,_FizzBuzz). '_数を生成し'(_数,_FizzBuzz) :- nth1(_数,_,_). '_FizzBuzzを得る'(_数,"Fizz") :- '_数は3で割り切れて、5では割り切れない'(_数). '_FizzBuzzを得る'(_数,"Buzz") :- '_数は5で割り切れて、3では割り切れない'(_数). '_FizzBuzzを得る'(_数,"FizzBuzz") :- '_数は3でも5でも割り切れる'(_数). '_FizzBuzzを得る'(_数,_FizzBuzz) :- '_数が3で5でも割り切れないときは_数を返す'(_数,_FizzBuzz). '_数は3で割り切れて、5では割り切れない'(_数) :- 0 is _数 mod 3, \+(0 is _数 mod 5). '_数は5で割り切れて、3では割り切れない'(_数) :- 0 is _数 mod 5, \+(0 is _数 mod 3). '_数は3でも5でも割り切れる'(_数) :- 0 is _数 mod 3, 0 is _数 mod 5. '_数が3で5でも割り切れないときは_数を返す'(_数,_数) :- \+(0 is _数 mod 3), \+(0 is _数 mod 5). % 以下のサイトは # 出典 :: CodeIQ q1385 言語不問:通分と約分を実装しよう # # 小学生が分数を学ぶときに、最初に躓くのが「通分」です。 # # 分母の異なる分数の足し算や引き算を行うとき、先に通分を行っておく必要があります。 # # また、計算した結果、「約分」できる場合は、可能な限り簡単な分数にしないと正解になりません。 # # 【問題】 # # では、入力される二つの分数について足し算を行った時に、 # # 正しい答えを出力するプログラムを作り、 # # 問1〜問5の標準入力に対して、出力内容を答えてください。 # # ※分母が1の時には整数として出力してください。 # # ■例 # # 例1) # # 【標準入力】 # # 5/6 # # 1/10 # # 【標準出力】 # # 14/15 # # 例2) # # 【標準入力】 # # 1/3 # # 2/3 # # 【標準出力】 # # 1 # # ■問1〜5 # # 問1) # # 1/3 # # 2/7 # # 問2) # # 2/8 # # 3/5 # # 問3) # # 3/10 # # 1/6 # # 問4) # # 3/4 # # 5/8 # # 問5) # # 2/5 # # 2/3 # # 【解答方法】 # # 解答用テキストファイルanswer_q1385.txtをダウンロードし、必要事項をご記入ください。 # # 必須事項がすべて記入されていることをご確認いただいた後、テキストファイルのままアップロードしてください。 # # 【注意】 # # ・ご提出いただいたプログラムは個別に実行テストを行いますので、 # #  解答用テキストファイルに書かれた解答が正解していても最高評価になるとは限りません。 # # ・プログラミング言語は不問ですが、古すぎる実行環境・特殊な設備を要する実行環境では採点できない場合がございます。 # # ・使用する言語は1解答につき必ず1種類でお願いします。 # #  どうしても複数の言語を用いる場合は、解答に「メインの言語名」を明記してください。 # '問1〜問5の標準入力に対して、出力内容を答えてください。 ■問1〜5 問1) 1/3 2/7 問2) 2/8 3/5 問3) 3/10 1/6 問4) 3/4 5/8 問5) 2/5 2/3' :- between(1,5,N), '入力される二つの分数について足し算を行った時に、正しい答えを出力する', N = 5. '入力される二つの分数について足し算を行った時に、正しい答えを出力する' :- 入力される二つの分数(_分子_1 / _分母_1,_分子_2 / _分母_2), 分数の加算(_分子_1 / _分母_1,_分子_2 / _分母_2,_加算された分子 / _加算された分母), 約分(_加算された分子 / _加算された分母,_約分された分子 / _約分された分母), 答えを出力する(_約分された分子 / _約分された分母). 分数の加算(_分子_1 / _分母_1,_分子_2 / _分母_2,_加算された分子 / _通分された分母) :- 通分(_分子_1 / _分母_1,_分子_2 / _分母_2,_通分された分子_1 / _通分された分母,_通分された分子_2 / _通分された分母), _加算された分子 is _通分された分子_1 + _通分された分子_2,!. 入力される二つの分数(_分子_1 / _分母_1,_分子_2 / _分母_2) :- 入力される分数(_分子_1 / _分母_1), 入力される分数(_分子_2 / _分母_2). 入力される分数(_分子_1 / _分母_1) :- 行入力(_行), read_term_from_atom(_行,_分子 / _分母,[]). 行入力(_行) :- get_char(_先読み文字), 行ならびを得る(_先読み文字,_行ならび), atom_chars(_行,_行ならび). 行ならびを得る('\n',[]). 行ならびを得る(_先読み文字,[_先読み文字|R]) :- get_char(_次の文字), 行ならびを得る(_次の文字,R). 答えを出力する(_約分された分子 / _約分された分母) :- writef('%t\n',[_約分された分子 / _約分された分母]). 約分(_分子 / _分母,X) :- 最大公約数で分子分母を割って約分する(_分子,_分母,_分子_1,_分母_1), 負数の場合のマイナス符号は分子側に付ける(_分子_1,_分母_1,_分子_2,_分母_2), 分母が1の時は整数に変形(_分子_2,_分母_2,X). 最大公約数で分子分母を割って約分する(_分子_1,_分母_1,_分子,_分母) :- 最大公約数(_分子_1,_分母_1,_最大公約数), _分子 is _分子_1 // _最大公約数, _分母 is _分母_1 // _最大公約数. 負数の場合のマイナス符号は分子側に付ける(_分子_1,_分母_1,_分子,_分母) :- 分母が負数だったら分子分母ともに符号を反転する(_分子_1,_分母_1,_分子,_分母),!. 負数の場合のマイナス符号は分子側に付ける(_分子,_分母,_分子,_分母). 分母が負数だったら分子分母ともに符号を反転する(_分子_1,_分母_1,_分子,_分母) :- _分母_1 =< 0, _分子 is _分子_1 * -1, _分母 is _分母_1 * -1. 分母が1の時は整数に変形(_分子,1,_分子) :- !. 分母が1の時は整数に変形(_分子,1.0,_分子) :- !. 分母が1の時は整数に変形(_分子,_分母,_分子 / _分母). 通分(_分子_1 / _分母_1,_分子_2 / _分母_2,_通分された分子_1 / _最小公倍数,_通分された分子_2 / _最小公倍数) :- 最小公倍数([_分母_1,_分母_2],_最小公倍数), _通分された分子_1 is _分子_1 * (_最小公倍数 // _分母_1), _通分された分子_2 is _分子_2 * (_最小公倍数 // _分母_2). 最大公約数([_整数],_整数). 最大公約数([_整数|R],_最大公約数) :- 最大公約数(R,_最大公約数_2), 二つの整数の最大公約数(_整数,_最大公約数_2,_最大公約数). 二つの整数の最大公約数(M,N,X) :- 二つの整数の絶対値をとる(M,N,M_2,N_2), 最大公約数をユークリッドの互除法で求める(M_2,N_2,Y), 負数解の可能性も探る(M,M_2,N,N_2,Y,X). 負数解の可能性も探る(M,M_2,N,N_2,Y,X) :- setof(X,[M,M_2,N,N_2,Y,X] ^ 負数解の可能性(M,M_2,N,N_2,Y,X),L), member(X,L). 負数解の可能性(M,M_2,_,_,Y,X) :- X is Y * (M // M_2). 負数解の可能性(_,_,N,N_2,Y,X) :- X is Y * (N // N_2). 二つの整数の絶対値をとる(M,N,M_2,N_2) :- M_2 is abs(M), N_2 is abs(N). 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). 最小公倍数(_整数ならび,_最小公倍数) :- '最小公倍数とは、0ではない複数の整数の公倍数のうち最小のものをさす'(_整数ならび,_最小公倍数). '最小公倍数とは、0ではない複数の整数の公倍数のうち最小のものをさす'([_整数],_整数). '最小公倍数とは、0ではない複数の整数の公倍数のうち最小のものをさす'([_整数|R],_最小公倍数) :- '最小公倍数とは、0ではない複数の整数の公倍数のうち最小のものをさす'(R,_最小公倍数_1), 二つの整数の最小公倍数(_整数,_最小公倍数_1,_最小公倍数). 二つの整数の最小公倍数(A,B,X) :- 二つの整数の最大公約数(A,B,_最大公約数), setof(X,[X,A,B,_最大公約数] ^ (X is A * B // _最大公約数),L), member(X,L). % 以下のサイトは # # 横書文書を縦書文書に変形する # # 事例として、あぜといへかの万葉仮名表記部分の生成 # 横書文書を縦書文書に変形する(_横書文書,_縦書文書) :- 横書文書を縦書文書に変形する(_横書文書,0,_縦書文書). 横書文書を縦書文書に変形する(_横書文書,_列間隔文字数,_縦書文書) :- 改行を区切りに行ならびに変形する(_横書文書,_行ならび), 行ならびを縦書文書に変形する(_行ならび,_列間隔文字数,_縦書文書). 行ならびを縦書文書に変形する(_行ならび,_列間隔文字数,_縦書文書) :- 最大文字列長を調べその長さに揃えて文書を矩形にする(_行ならび,_矩形ならび), 行ならびを転置する(_矩形ならび,_転置した矩形ならび), 矩形ならびの各要素行の内容を反転して縦書文書にする(_転置した矩形ならび,_列間隔文字数,_縦書文書). 矩形ならびの各要素行の内容を反転して縦書文書にする(_転置した矩形ならび,_列間隔文字数,_縦書文書) :- 矩形ならびの各要素行の内容を反転する(_転置した矩形ならび,_要素が反転した転置した矩形ならび), 縦書文書に変形する(_要素が反転した転置した矩形ならび,_列間隔文字数,_縦書文書). 改行を区切りに行ならびに変形する(_横書文書,[_前文字列|R]) :- 改行を区切りに(_横書文書,_前文字列,_後文字列), 改行を区切りに行ならびに変形する(_後文字列,R). 改行を区切りに行ならびに変形する(_文字列,R) :- 改行が存在しない場合停止する(_文字列,R). 改行が存在しない場合停止する('',[]) :- !. 改行が存在しない場合停止する(_文書,[_文書]). 改行を区切りに(_横書文書,_前文字列,_後文字列) :- sub_atom(_横書文書,S,1,R,'\n'), sub_atom(_横書文書,0,S,_,_前文字列), sub_atom(_横書文書,_,R,0,_後文字列),!. 最大文字列長を調べその長さに揃えて文書を矩形にする(_行ならび,_矩形ならび) :- 最大文字列長を調べ(_行ならび,_最大文字列長), その長さに揃えて文書を矩形にする(_行ならび,_最大文字列長,_矩形ならび). 最大文字列長を調べ(_行ならび,_最大文字列長) :- findmax(_文字数,( member(_行,_行ならび), atom_length(_行,_文字数)),_最大文字列長). その長さに揃えて文書を矩形にする(_行ならび,_最大文字列長,_矩形ならび) :- findall(_空白を付加した文字列,( member(_行,_行ならび), 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_空白を付加した文字列)),_矩形ならび). 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_空白を付加した文字列) :- atom_length(_行,_文字列長), 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_文字列長,_空白を付加した文字列). 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_文字列長,_空白を付加した文字列) :- 達しない文字数の空白(_最大文字列長,_文字列長,_空白文字列), atom_concat(_行,_空白文字列,_空白を付加した文字列). 達しない文字数の空白(_最大文字列長,_文字列長,_空白文字列) :- _nth1 is _最大文字列長 - _文字列長, findall(' ',( between(1,_nth1,_)),_空白文字ならび), 文字ならびを文字列に変換する(_空白文字列,_空白文字ならび). 行ならびを転置する(_矩形ならび,_転置された矩形ならび) :- 矩形文字ならびに変換する(_矩形ならび,_矩形文字ならび), 転置(_矩形文字ならび,_転置された矩形文字ならび), 転置された矩形文字ならびを行ならびに変換(_転置された矩形文字ならび,_転置された矩形ならび). 矩形文字ならびに変換する(_矩形ならび,_矩形文字ならび) :- findall(_文字ならび,( member(_行,_矩形ならび), 文字列を文字ならびに変換する(_行,_文字ならび)),_矩形文字ならび). 転置された矩形文字ならびを行ならびに変換(_転置された矩形文字ならび,_転置された矩形ならび) :- findall(_文字列,( member(_文字ならび,_転置された矩形文字ならび), 文字ならびを文字列に変換する(_文字列,_文字ならび)),_転置された矩形ならび). 転置した矩形ならびの各行文字列を反転する(_転置した矩形ならび,_反転した行文字列) :- member(_行文字列,_転置した矩形ならび), 文字列の反転(_行文字列,_反転した行文字列). 矩形ならびの各要素行の内容を反転する(_転置した矩形ならび,_要素が反転した転置した矩形ならび) :- findall(_反転した行文字列,( member(_行文字列,_転置した矩形ならび), 文字列の反転(_行文字列,_反転した行文字列)),_要素が反転した転置した矩形ならび). 縦書文書に変形する(_要素が反転した転置した矩形ならび,_列間隔文字数,_縦書文書) :- 列間隔文字を挟んで縦書文書に変形する(_要素が反転した転置した矩形ならび,_列間隔文字数,_縦書文書). 列間隔文字を挟んで縦書文書に変形する(_矩形ならび,_列間隔文字数,_縦書文書) :- 列間隔文字を挟んで(_矩形ならび,_列間隔文字数,_矩形ならび_1), 縦書文書に変形する(_矩形ならび_1,_縦書文書). 列間隔文字を挟んで(_矩形ならび_1,_列間隔文字数,_矩形ならび_2) :- 列間隔文字(_列間隔文字数,_列間隔文字), findall(_行,( 行文字の間に列間隔文字を挿入する(_矩形ならび_1,_列間隔文字,_行)),_矩形ならび_2). 列間隔文字(_列間隔文字数,_列間隔文字) :- findall(' ',( between(1,_列間隔文字数,_)),_列間隔文字ならび), atomic_list_concat(_列間隔文字ならび,_列間隔文字). 行文字の間に列間隔文字を挿入する(_矩形ならび_1,_列間隔文字,_行) :- member(_行_1,_矩形ならび_1), 文字列を文字ならびに変換する(_行_1,_文字ならび), atomic_list_concat(_文字ならび,_列間隔文字,_行). 縦書文書に変形する(_矩形ならび_1,_縦書文書) :- atomic_list_concat(_矩形ならび_1,'\n',_縦書文書). 文字列の反転(_文字列,_反転した文字列) :- 文字列を文字ならびに変換する(_文字列,_文字ならび), 文字ならびを反転する(_文字ならび,_反転した文字ならび), 文字ならびを文字列に変換する(_反転した文字列,_反転した文字ならび). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字列を文字ならびに変換する(_文字列,_文字ならび) :- atom_chars(_文字列,_文字ならび). 文字ならびを反転する(_文字ならび,_反転した文字ならび) :- reverse(_文字ならび,_反転した文字ならび). 文字ならびを文字列に変換する(_反転した文字列,_反転した文字ならび) :- atom_chars(_反転した文字列,_反転した文字ならび). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). findmax(A,P,_最大値) :- findall(A,P,L), max_list(L,_最大値). % 以下のサイトは # # 横書文書を縦書文書に変形する # # 事例として、あぜといへかの万葉仮名表記部分の生成 # :- 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 _式. % 以下のサイトは :- op(470,xfx,(#)). :- op(700,xfx,は). :- op(710,xfx,(::)). A は B :- A is B. 連立一次方程式の解(_拡大係数行列,_解ならび) :- ガウス行列に変形(_拡大係数行列,_ガウス行列,_), 連立一次方程式の一般解(_ガウス行列,_解ならび). 連立一次方程式の一般解(_ガウス行列,_解ならび) :- 解が1つだけ存在する場合(_ガウス行列,_解ならび),!. 連立一次方程式の一般解(_ガウス行列,解は無数に存在する) :- 解が無数にある場合(_ガウス行列),!. 連立一次方程式の一般解(_ガウス行列,解は存在しない) :- 解がない場合(_ガウス行列). 解が1つだけ存在する場合(_ガウス行列,_解ならび) :- '行が下がるごとに、最初に現れる0でない要素が、1つずつ右にずれていく'(0,_ガウス行列), 既約ガウス行列に変形(_ガウス行列,_既約ガウス行列), 既約ガウス行列の各行の最終要素が解である(_既約ガウス行列,_解ならび). '行が下がるごとに、最初に現れる0でない要素が、1つずつ右にずれていく'(_,[]) :- !. '行が下がるごとに、最初に現れる0でない要素が、1つずつ右にずれていく'(N,[L|R]) :- 先頭から0がN要素(N,L), succ(N,N_2), '行が下がるごとに、最初に現れる0でない要素が、1つずつ右にずれていく'(N_2,R). 先頭から0がN要素(N,L) :- append(L1,[A|_],L), \+(A=0),!, length(L1,N). 既約ガウス行列の各行の最終要素が解である(_既約ガウス行列,_解ならび) :- findall(_解,( member(_行,_既約ガウス行列), last(_行,_解)),_解ならび). 解が無数にある場合(_ガウス行列) :- length(_ガウス行列,N), 行列の階数(_ガウス行列,_ガウス行列の階数), \+(N = _ガウス行列の階数). 解がない場合(_ガウス行列) :- \+('行が下がるごとに、最初に現れる0でない要素が、1つずつ右にずれていく'(0,_ガウス行列)), '最終要素が0でなく、それ以外は0である行がある'(_ガウス行列),!. '最終要素が0でなく、それ以外は0である行がある'(_ガウス行列) :- member(L,_ガウス行列), 最終要素が0でなく(L), それ以外は0である(L),!. 最終要素が0でなく(L) :- append(L1,[N],L), \+(N = 0),!. それ以外は0(L) :- append(L1,[_],L), all(L1,0),!. % *** user: 'ガウス行列' / 2 *** 'ガウス行列'(_,[]) :- ! . 'ガウス行列'(L,[_行|R]) :- append(L,_,_行), '要素がゼロ以外に出会うまで'(_行,P1,_), 'ガウス行列'([0|P1],R) . 'ガウス行列'(_,[]) :- ! . 'ガウス行列'(L,[_行|R]) :- append(L,_,_行), '要素がゼロ以外に出会うまで'(_行,P1,_), 'ガウス行列'([0|P1],R) . % *** user: 'ガウス行列' / 1 *** 'ガウス行列'(_行列) :- 'ガウス行列'([],_行列) . % *** user: 'ガウス行列に変形' / 7 *** 'ガウス行列に変形'(N,M,Len,_,_行列,_行列,[]) :- M > Len, ! . 'ガウス行列に変形'(N,M,Len,0,_行列1,X,UL) :- nth1(M,_行列1,_行1), nth1(N,_行1,B), \+(B = 0), '行の置換'(N,M,_行列1,_行列2), M2 is N + 1, 'ガウス行列に変形'(N,M2,Len,B,_行列2,X,UL), ! . 'ガウス行列に変形'(N,M,Len,0,_行列1,X,UL) :- nth1(M,_行列1,_行1), nth1(N,_行1,B), B = 0, M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,0,_行列1,X,UL), ! . 'ガウス行列に変形'(N,M,Len,A,_行列1,X,[-1|R]) :- nth1(M,_行列1,_行1), nth1(N,_行1,0), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列1,X,R), ! . 'ガウス行列に変形'(N,M,Len,A,_行列1,X,[N1|R]) :- nth1(M,_行列1,_行1), nth1(N,_行1,B), '最小公倍数'(N2 * A,N1 * B,_), N1 >= 0, !, '行基本変形'(N1 # M - N2 # N,_行列1,_行列2), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列2,X,R), ! . 'ガウス行列に変形'(N,M,Len,A,_行列1,X,[N1|R]) :- nth1(M,_行列1,_行1), nth1(N,_行1,B), '最小公倍数'(N2 * A,N1 * B,_), N1 < 0, !, '行基本変形'(N3 # M + N2 # N,_行列1,_行列2), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列2,X,R), ! . % *** user: 'ガウス行列に変形' / 6 *** 'ガウス行列に変形'(N,M,Len,_,_行列,_行列) :- M > Len, ! . 'ガウス行列に変形'(N,M,Len,0,_行列1,X) :- nth1(M,_行列1,_行1), nth1(N,_行1,B), \+(B = 0), '行の置換'(N,M,_行列1,_行列2), M2 is N + 1, 'ガウス行列に変形'(N,M2,Len,B,_行列2,X), ! . 'ガウス行列に変形'(N,M,Len,0,_行列1,X) :- nth1(M,_行列1,_行1), nth1(N,_行1,B), B = 0, M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,0,_行列1,X), ! . 'ガウス行列に変形'(N,M,Len,A,_行列1,X) :- nth1(M,_行列1,_行1), nth1(N,_行1,0), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列1,X), ! . 'ガウス行列に変形'(N,M,Len,A,_行列1,X) :- nth1(M,_行列1,_行1), nth1(N,_行1,B), '最小公倍数'(N2 * A,N1 * B,_), '行基本変形'(N1 # M - N2 # N,_行列1,_行列2), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列2,X), ! . % *** user: 'ガウス行列に変形' / 5 *** 'ガウス行列に変形'(N,Len,X,X,[]) :- N >= Len, ! . 'ガウス行列に変形'(N,Len,_行列1,X,UL) :- nth1(N,_行列1,_行), nth1(N,_行,A), M is N + 1, 'ガウス行列に変形'(N,M,Len,A,_行列1,_行列2,UL1), N2 is N + 1, 'ガウス行列に変形'(N2,Len,_行列2,X,UL2), append(UL1,UL2,UL) . % *** user: 'ガウス行列に変形' / 4 *** 'ガウス行列に変形'(N,Len,X,X) :- N >= Len, ! . 'ガウス行列に変形'(N,Len,_行列1,X) :- nth1(N,_行列1,_行), nth1(N,_行,A), M is N + 1, 'ガウス行列に変形'(N,M,Len,A,_行列1,_行列2), N2 is N + 1, 'ガウス行列に変形'(N2,Len,_行列2,X) . % *** user: 'ガウス行列に変形' / 3 *** 'ガウス行列に変形'(_行列,_ガウス行列,UL) :- length(_行列,Len), 'ガウス行列に変形'(1,Len,_行列,_ガウス行列,UL) . % *** user: 'ガウス行列に変形' / 2 *** 'ガウス行列に変形'(_行列,_ガウス行列) :- length(_行列,Len), 'ガウス行列に変形'(1,Len,_行列,_ガウス行列) . % *** user: '既約ガウス行列に変形の二' / 4 *** '既約ガウス行列に変形の二'(N,Len,_既約ガウス行列,_既約ガウス行列) :- N > Len, ! . '既約ガウス行列に変形の二'(N,Len,G,_既約ガウス行列) :- nth1(N,G,_行), nth1(N,_行,A), '行基本変形'(1 / A # N,G,G1), N2 is N + 1, '既約ガウス行列に変形の二'(N2,Len,G1,_既約ガウス行列) . % *** user: '既約ガウス行列の一' / 2 *** '既約ガウス行列の一'(_,[]) :- ! . '既約ガウス行列の一'(L,[_行|R]) :- append(L,_,_行), '要素がゼロ以外に出会うまで'(_行,P1,[1|_]), '既約ガウス行列の一'([0|P1],R) . % *** user: '既約ガウス行列の一' / 1 *** '既約ガウス行列の一'([_行]) :- '零以外の最初の要素が1'(_行), ! . '既約ガウス行列の一'([_行|R]) :- '零以外の最初の要素が1'(_行), '既約ガウス行列の一'(R) . % *** user: '既約ガウス行列' / 2 *** '既約ガウス行列'(_,[]) :- ! . '既約ガウス行列'(L,[_行|R]) :- append(L,_,_行), '要素がゼロ以外に出会うまで'(_行,P1,[1|_]), '既約ガウス行列'([0|P1],R) . % *** user: '既約ガウス行列' / 1 *** '既約ガウス行列'(_行列) :- '既約ガウス行列の一'([],_行列), '行列の転置'(_行列,_転置された行列), '既約ガウス行列検査'(_転置された行列) . % *** user: '既約ガウス行列検査' / 1 *** '既約ガウス行列検査'([]) :- ! . '既約ガウス行列検査'([L|R]) :- append(L1,[1|L2],L), append(L1,L2,L3), 'すべての要素'(L3,0), '既約ガウス行列検査'(R), ! . '既約ガウス行列検査'([L|R]) :- \+(append(L1,[1|L2],L)), '既約ガウス行列検査'(R) . % *** user: '既約ガウス行列に変形' / 5 *** '既約ガウス行列に変形'(N,0,_,_行列,_行列) :- ! . '既約ガウス行列に変形'(N,M,Len,0,_行列1,X) :- nth1(M,_行列1,_行1), nth1(N,_行1,B), \+(B = 0), '行の置換'(N,M,_行列1,_行列2), M2 is N - 1, '既約ガウス行列に変形'(N,M2,Len,B,_行列2,X), ! . '既約ガウス行列に変形'(N,M,A,_行列1,_行列) :- nth1(M,_行列1,_行1), nth1(N,_行1,0), M2 is M - 1, '既約ガウス行列に変形'(N,M2,A,_行列1,_行列) . '既約ガウス行列に変形'(N,M,A,_行列1,_行列) :- nth1(M,_行列1,_行1), nth1(N,_行1,B), \+(B = 0), '最小公倍数'(N2 * A,N1 * B,_), '行基本変形'(N1 # M - N2 # N,_行列1,_行列2), M2 is M - 1, '既約ガウス行列に変形'(N,M2,A,_行列2,_行列) . % *** user: '既約ガウス行列に変形' / 3 *** '既約ガウス行列に変形'(1,_既約ガウス行列,_既約ガウス行列) :- ! . '既約ガウス行列に変形'(N,_ガウス行列,_既約ガウス行列) :- nth1(N,_ガウス行列,L0), '最初に現れる0ではない要素・位置'(1,L0,_列,Y), M is N - 1, nth1(M,_ガウス行列,L), '既約ガウス行列に変形'(_列,M,Y,_ガウス行列,G1), N2 is N - 1, '既約ガウス行列に変形'(N2,G1,_既約ガウス行列), ! . % *** user: '既約ガウス行列に変形' / 2 *** '既約ガウス行列に変形'(_行列,_既約ガウス行列) :- \+('ガウス行列'(_行列)), 'ガウス行列に変形'(_行列,_ガウス行列), '既約ガウス行列に変形'(_ガウス行列,_既約ガウス行列), ! . '既約ガウス行列に変形'(_ガウス行列,_既約ガウス行列) :- length(_ガウス行列,Len), '既約ガウス行列に変形'(Len,_ガウス行列,G1), '既約ガウス行列に変形の二'(1,Len,G1,_既約ガウス行列) . % *** user: 'n次正方行列の要素を行・列順序で取り出す' / 5 *** 'n次正方行列の要素を行・列順序で取り出す'(_n,_正方行列,_i行,_j列,_正方行列の要素) :- between(1,_n,_i行), nth1(_i行,_正方行列,L), nth1(_j列,L,_正方行列の要素) . % *** user: 'n次正方行列の要素を列・行順序で取り出す' / 5 *** 'n次正方行列の要素を列・行順序で取り出す'(_n,_正方行列,_i行,_j列,_正方行列の要素) :- between(1,_n,_j列), nth1(_i行,_正方行列,L), nth1(_j列,L,_正方行列の要素) . % *** user: 'n次正方行列から、第i行と第j列を取り除いた正方行列(n-1次正方行列の行列式に、(-1)のi+j乗をかけたものを、Aの(i,j)余因子といい、Cijで表します。' / 5 *** 'n次正方行列から、第i行と第j列を取り除いた正方行列(n-1次正方行列の行列式に、(-1)のi+j乗をかけたものを、Aの(i,j)余因子といい、Cijで表します。'(_n,_正方行列,_i,_j,_余因子) :- '正方行列から第i行と第j列を取り除く'(_正方行列,_i,_j,_n_1次正方行列), '行列式の値'(_n_1次正方行列,_n_1次正方行列の行列式の値), 'i,jから乗数を得る'(_i,_j,_乗数), _余因子 is _乗数 * _n_1次正方行列の行列式の値. % *** user: 'i,jから乗数を得る' / 3 *** 'i,jから乗数を得る'(_i,_j,-1) :- 1 is (_i + _j) mod 2, ! . 'i,jから乗数を得る'(_i,_j,1) :- 0 is (_i + _j) mod 2, ! . % *** user: '第何行を取り除く' / 3 *** '第何行を取り除く'(_正方行列,_第何行,_第i行が取り除かれた行列) :- append(L0,[L|R],_正方行列), length([_|L0],_第何行), append(L0,R,_第i行が取り除かれた行列) . % *** user: '正方行列から第i行と第j列を取り除く' / 4 *** '正方行列から第i行と第j列を取り除く'(_正方行列,_i,_j,_n_1次正方行列) :- '第何行を取り除く'(_正方行列,_i,_第i行が取り除かれた行列), '転置'(_第i行が取り除かれた行列,_転置された第i行が取り除かれた行列), '第何行を取り除く'(_転置された第i行が取り除かれた行列,_j,_転置された第i行第j列が取り除かれた行列), '転置'(_転置された第i行第j列が取り除かれた行列,_n_1次正方行列) . % *** user: '正方行列の対角要素' / 2 *** '正方行列の対角要素'(_正方行列,_対角要素) :- findall(A,(append(L0,[L|_],_正方行列) , \+(L = []) , length(L0,N2) , length(L1,N2) , append(L1,[A|_],L)),_対角要素) . % *** user: '正方行列' / 3 *** '正方行列'(N,_次数,[]) :- N > _次数, ! . '正方行列'(N,_次数,[_行|R]) :- length(_行,_次数), N2 is N + 1, '正方行列'(N2,_次数,R) . % *** user: '正方行列' / 2 *** '正方行列'(_,[]) :- ! . '正方行列'(_行数,[_行|R]) :- length(_行,_行数), '正方行列'(_行数,R) . % *** user: '正方行列' / 1 *** '正方行列'(_正方行列) :- length(_正方行列,_行数), '正方行列'(1,_行数,_正方行列) . % *** user: '正方行列の行列式' / 2 *** '正方行列の行列式'(_正方行列,_行列式) :- findsum(_符号付き要素積,'行列の符号付き要素積'(_正方行列,_符号付き要素積),_行列式) . % *** user: '正方行列の行列式の値' / 2 *** '正方行列の行列式の値'(_正方行列,_行列式の値) :- 'ガウス行列に変形'(_正方行列,X,Y), '行列式|C|の値'(X,Z1), 'ならびの積'(Y,Z2), _行列式の値 is Z1 // Z2 . % *** user: '正方行列の逆行列' / 3 *** '正方行列の逆行列'(_n次,_正方行列,_逆行列) :- '単位行列'(_n次,_単位行列), '二つのならびの同一順序要素の結合'(_正方行列,_単位行列,LL2), '既約ガウス行列に変形'(LL2,LL3), '行列の行の先頭からn列を切り取った残り行列'(_n次,LL3,_逆行列) . % *** user: '正方行列の逆行列' / 2 *** '正方行列の逆行列'(_正方行列,_逆行列) :- length(_正方行列,_n次), '単位行列'(_n次,_単位行列), '二つのならびの同一順序要素の結合'(_正方行列,_単位行列,LL2), '既約ガウス行列に変形'(LL2,LL3), '行列の行の先頭からn列を切り取った残り行列'(_n次,LL3,_逆行列) . % *** user: '単位行列' / 4 *** '単位行列'(M,N1,N,[]) :- N1 > N, ! . '単位行列'(M,M,N,[1|R]) :- N2 is M + 1, '単位行列'(M,N2,N,R) . '単位行列'(M,N1,N,[0|R]) :- \+(N1 = M), N2 is N1 + 1, '単位行列'(M,N2,N,R) . % *** user: '単位行列' / 3 *** '単位行列'(M,N,[]) :- M > N, ! . '単位行列'(M,N,[_行|R]) :- '単位行列'(M,1,N,_行), M2 is M + 1, '単位行列'(M2,N,R) . % *** user: '単位行列' / 2 *** '単位行列'(N,_単位行列) :- '単位行列'(1,N,_単位行列) . % *** user: '単位行列' / 1 *** '単位行列'(_単位行列) :- '正方行列'(_単位行列), length(_単位行列,_次数), '単位行列'(_次数,_単位行列) . % *** user: '単位行列の生成' / 2 *** '単位行列の生成'(N,LL) :- length(L,N), findall(L,(append(L0,[1|R],L) , all(L0,0) , all(R,0)),LL), ! . % *** user: '行列式の値' / 4 *** '行列式の値'(_正方行列,_i,_n,_行列式の値) :- findsum(W,('n次正方行列の要素を列・行順序で取り出す'(_n,_正方行列,_i,_j,_正方行列の要素) , '余因子'(_n,_正方行列,_i,_j,_余因子) , W is _正方行列の要素 * _余因子),_行列式の値) . % *** user: '行列式の値' / 2 *** '行列式の値'([[A,B],[C,D]],_行列式の値) :- _行列式の値 is A * D - B * C, ! . '行列式の値'(_正方行列,_行列式の値) :- _正方行列 = [_行_1|R], length([_行_1|R],_i), length(_行_1,_n), '行列式の値'(_正方行列,_i,_n,_行列式の値) . % *** user: '行列のすべての要素に値を掛ける' / 5 *** '行列のすべての要素に値を掛ける'(_行目,_n,LL,_,LL) :- _行目 > _n, ! . '行列のすべての要素に値を掛ける'(_行目,_n,LL1,_乗数 / _除数,LL2) :- '行基本変形'(_乗数 / _除数 # _行目,LL1,LL3), _行目_2 is _行目 + 1, '行列のすべての要素に値を掛ける'(_行目_2,_n,LL3,_乗数 / _除数,LL2) . % *** user: '行列の掛算_2' / 3 *** '行列の掛算_2'(_,[],[]) :- ! . '行列の掛算_2'(A,[B|R2],[C|R3]) :- '行列の掛算_3'(A,B,C), '行列の掛算_2'(A,R2,R3) . % *** user: '行列要素' / 4 *** '行列要素'(_行,_列,_行列,_値) :- nth1(_行,_行列,L), nth1(_列,L,_値) . % *** user: '行列の列置換' / 4 *** '行列の列置換'(_列,_置換する列,_対象行列,_置換された行列) :- '行列の転置'(_対象行列,_転置された行列), '要素番号によるならびの置換'(_列,_置換する列,_転置された行列,_置換された行列の二), '行列の転置'(_置換された行列の二,_置換された行列) . % *** user: '行列の行置換' / 4 *** '行列の行置換'(_行,_置換する行,_対象行列,_置換された行列) :- '要素番号によるならびの置換'(_行,_置換する行,_対象行列,_置換された行列), ! . % *** user: '行列の要素積の符号を判断する' / 3 *** '行列の要素積の符号を判断する'(_順列,_符号付き要素積,_符号付き要素積) :- '偶順列'(_順列), ! . '行列の要素積の符号を判断する'(_順列,_要素積の一,_符号付き要素積) :- '奇順列'(_順列), _符号付き要素積 is _要素積の一 * -1, ! . % *** user: '行列の符号付き要素積' / 2 *** '行列の符号付き要素積'(_正方行列,_符号付き要素積) :- length(_正方行列,Len), findall(U,for(1,U,Len),L0), '順列'(L0,Len,_順列), findall(V,(for(1,M,Len) , nth1(M,_正方行列,L1) , nth1(M,_順列,N) , nth1(N,L1,V)),L2), '積'(L2,_要素積の一), '行列の要素積の符号を判断する'(_順列,_要素積の一,_符号付き要素積) . % *** user: '行列から列を選択する' / 3 *** '行列から列を選択する'(_,[],[]) :- ! . '行列から列を選択する'(_選択する列位置ならび,[_行|R1],[L|R2]) :- '列の選択'(_選択する列位置ならび,_行,L), '行列から列を選択する'(_選択する列位置ならび,R1,R2) . % *** user: '行列行置換' / 5 *** '行列行置換'(N,N,L,[_|R],[L|R]) :- ! . '行列行置換'(M,N,L,[A|R1],[A|R2]) :- M2 is M + 1, '行列行置換'(M2,N,L,R1,R2) . % *** user: '行列の結合' / 5 *** '行列の結合'(Len1,Len2,[_行1],[_行2],[_行3]) :- append(_行1,_行2,_行3), length(_行1,Len1), length(_行2,Len2) . '行列の結合'(Len1,Len2,[_行1|R1],[_行2|R2],[_行3|R3]) :- append(_行1,_行2,_行3), '行列の結合'(Len1,Len2,R1,R2,R3), length(_行1,Len1), length(_行2,Len2) . % *** user: '行列の結合' / 3 *** '行列の結合'([_行1|R1],[_行2|R2],_結合された行列) :- '行列の結合'(Len1,Len2,[_行1|R1],[_行2|R2],_結合された行列), Len1 > 0, Len2 > 0 . % *** user: '行列の置換' / 5 *** '行列の置換'(_列,_行,_置換要素,_対象行列,_置換された行列) :- n_th(_行,_対象行列,_対象行), '要素番号によるならびの置換'(_列,_置換要素,_対象行,_置換された行), '要素番号によるならびの置換'(_行,_置換された行,_対象行列,_置換された行列), ! . % *** user: '行列の転置' / 2 *** '行列の転置'(_行列,_転置された行列) :- 転置(_行列,_転置された行列). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). % *** user: m_trans / 3 *** m_trans([],[],[]) :- ! . m_trans([[A|R]|R1],[A|R2],[R|R3]) :- m_trans(R1,R2,R3) . % *** user: m_trans / 2 *** m_trans([[]|_],[]) :- ! . m_trans(L,[B|R1]) :- m_trans(L,B,R2), m_trans(R2,R1), ! . % *** user: '行列式|C|の値' / 2 *** '行列式|C|の値'(_行列,_値) :- length(_行列,Len), findall(U,(for(1,N,Len) , nth1(N,_行列,_行) , nth1(N,_行,U)),L), 'ならびの積'(L,_値) . % *** user: '行列の階数' / 2 *** '行列の階数'(_行列,_階数) :- 'ガウス行列に変形'(_行列,_ガウス行列), count((member(L,_ガウス行列) , \+('すべての要素が0か0.0'(L))),_階数) . % *** user: '行列の要素積' / 2 *** '行列の要素積'(_正方行列,_要素積) :- length(_正方行列,Len), findall(U,for(1,U,Len),L0), '順列'(L0,Len,_順列), findall(V,(for(1,M,Len) , nth1(M,_正方行列,L1) , nth1(M,_順列,N) , nth1(N,L1,V)),L2), '積'(L2,_要素積) . % *** user: '行列の掛算' / 3 *** '行列の掛算'(L1,L2,X) :- '転置'(L2,L4), '行列の掛算_1'(L1,L4,X) . % *** user: '行列の掛算_1' / 3 *** '行列の掛算_1'([],_,[]) :- ! . '行列の掛算_1'([A|R1],L,[S1|R3]) :- '行列の掛算_2'(A,L,S1), '行列の掛算_1'(R1,L,R3) . % *** user: '行列の掛算_3' / 3 *** '行列の掛算_3'([],[],0) :- ! . '行列の掛算_3'([A|R1],[B|R2],S) :- '分数を含む掛算'(A,B,S1), '行列の掛算_3'(R1,R2,S2), '分数を含む加算'(S1,S2,S), ! . % *** user: '行列の行の先頭からn列を切り取った残り行列' / 3 *** '行列の行の先頭からn列を切り取った残り行列'(_n列,LL1,LL2) :- length(L0,_n列), findall(L2,(member(L1,LL1) , append(L0,L2,L1)),LL2) . % *** user: '行基本変形' / 6 *** '行基本変形'(*,_乗数,_行目,_行目,[_行1|R1],[_行2|R1]) :- findall(X,(member(A,_行1) , X is A * _乗数),_行2) . '行基本変形'(*,_乗数,M,_行目,[_行|R1],[_行|R2]) :- M2 is M + 1, '行基本変形'(*,_乗数,M2,_行目,R1,R2) . % *** user: '行基本変形' / 5 *** '行基本変形'(*,_乗数,_行目,_行列,X) :- '行基本変形'(*,_乗数,1,_行目,_行列,X) . % *** user: '行基本変形' / 3 *** '行基本変形'(_行列式,_行列,X) :- atom(_行列式), \+(_行列式 = []), & '行列式変換' # [2|pro], '行列式述語変換'(_行列式,P), '行基本変形'(P,_行列,X), ! . '行基本変形'([],_行列,[]) :- ! . '行基本変形'([N|R1],_行列,[L|R2]) :- !, list_nth(N,_行列,L), '行基本変形'(R1,_行列,R2), ! . '行基本変形'(# _行目1 # _行目2,_行列,X) :- list_nth(_行目1,_行列,_行1), list_nth(_行目2,_行列,_行2), 'ならびの位置指定置換'(_行目2,_行1,_行列,_行列1), 'ならびの位置指定置換'(_行目1,_行2,_行列1,X), ! . '行基本変形'(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- _乗数2 >= 0, _乗数1 >= 0, !, '分数を含む乗算'(-1,_乗数2,_乗数3), '行基本変形'(_乗数1 # _行目1 + _乗数3 # _行目2,_行列,X), ! . '行基本変形'(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- _乗数2 >= 0, _乗数1 < 0, '分数を含む乗算'(_乗数1,-1,_乗数3), !, '行基本変形'(_乗数3 # _行目1 + _乗数2 # _行目2,_行列,X), ! . '行基本変形'(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- _乗数2 < 0, _乗数1 >= 0, '分数を含む乗算'(_乗数2,-1,_乗数3), !, '行基本変形'(_乗数1 # _行目1 + _乗数3 # _行目2,_行列,X), ! . '行基本変形'(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- _乗数2 < 0, _乗数1 < 0, !, '分数を含む乗算'(-1,_乗数2,_乗数3), '行基本変形'(_乗数1 # _行目1 + _乗数3 # _行目2,_行列,X), ! . '行基本変形'(_乗数1 # _行目1 + _乗数2 # _行目2,_行列,X) :- !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行1) , '分数を含む乗算'(A,_乗数1,U)),_乗算された行1), findall(W,(member(B,_行2) , '分数を含む乗算'(B,_乗数2,W)),_乗算された行2), '項加算'([_乗算された行1,_乗算された行2],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X), ! . '行基本変形'(# _行目1 + _乗数 # _行目2,_行列,X) :- !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行2) , '分数を含む乗算'(A,_乗数,U)),_乗算された行), '項加算'([_乗算された行,_行1],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X), ! . '行基本変形'(# _行目1 - _乗数 # _行目2,_行列,X) :- !, '分数を含む乗算'(-1,_乗数,_乗数2), '行基本変形'(# _行目1 + _乗数2 * _行目2,_行列,X), ! . '行基本変形'(# _行目1 + _乗数 / _除数 * _行目2,_行列,X) :- integer(_除数), !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行2) , '分数を含む乗算'(A,_乗数,A2) , '分数を含む除算'(A2,_除数,U)),_除算された行), '項加算'([_行1,_除算された行],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X), ! . '行基本変形'(# _行目1 + _乗数 / _除数 # _行目2,_行列,X) :- \+(integer(_除数)), !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行2) , '分数を含む乗算'(A,_乗数,A2) , '分数を含む除算'(A2,_除数,U)),_除算された行), '項加算'([_行1,_除算された行],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X), ! . '行基本変形'(# _行目1 - _乗数 / _除数 # _行目2,_行列,X) :- !, '分数を含む乗算'(-1,_除数,_除数2), '行基本変形'(# _行目1 + _乗数 / _除数2 * _行目2,_行列,X), ! . '行基本変形'(_乗数 / _除数 # _行目,_行列,X) :- integer(_除数), !, list_nth(_行目,_行列,_行1), findall(Y,(member(A,_行1) , '行基本変形除算'(A,_乗数,_除数,Y)),_行2), replace_nth(1,_行目,_行2,_行列,X), ! . '行基本変形'(_乗数 / _除数 # _行目,_行列,X) :- \+(integer(_除数)), !, list_nth(_行目,_行列,_行1), findall(X,(member(A,_行1) , '分数を含む乗算'(A,_乗数,A2) , '分数を含む除算'(A2,_除数,X)),_行2), replace_nth(1,_行目,_行2,_行列,X), ! . '行基本変形'(_乗数 # _行目,_行列,X) :- !, list_nth(_行目,_行列,_行1), findall(X,(member(A,_行1) , '分数を含む乗算'(A,_乗数,X)),_行2), replace_nth(1,_行目,_行2,_行列,X), ! . % *** user: '行基本変形2' / 3 *** '行基本変形2'(_乗数 # _行目,_行列,X) :- nth1(_行目,_行列,_行), findall(U,(member(A,_行) , U is A * _乗数),_乗算された行), replace_nth(1,_行目,_乗算された行,_行列,X), ! . % *** user: '行基本変形3の適用' / 7 *** '行基本変形3の適用'(A,B,M,N,_行列1,_行列2,N2) :- B >= 0, A2 is abs(A), B2 is abs(B), '最小公倍数'(N1 * A2,N2 * B2,_), '行基本変形'(N2 # M - N1 # N,_行列1,_行列2), ! . '行基本変形3の適用'(A,B,M,N,_行列1,_行列2,N2) :- B < 0, A2 is abs(A), B2 is abs(B), '最小公倍数'(N1 * A2,N2 * B2,_), '行基本変形'(N2 # M + N1 # N,_行列1,_行列2), ! . % *** user: '行基本変形3の適用' / 6 *** '行基本変形3の適用'(A,B,M,N,_行列1,_行列2) :- B >= 0, A2 is abs(A), B2 is abs(B), '最小公倍数'(N1 * A2,N2 * B2,_), '行基本変形'(N2 # M - N1 # N,_行列1,_行列2), ! . '行基本変形3の適用'(A,B,M,N,_行列1,_行列2) :- B < 0, A2 is abs(A), B2 is abs(B), '最小公倍数'(N1 * A2,N2 * B2,_), '行基本変形'(N2 # M + N1 # N,_行列1,_行列2), ! . % *** user: '行基本変形3の適用' / 5 *** '行基本変形3の適用'(A,B,_行列1,_行列2,N2) :- B >= 0, A2 is abs(A), B2 is abs(B), '最小公倍数'(N1 * A2,N2 * B2,_), '行基本変形'(N2 # M - N1 # N,_行列1,_行列2), ! . '行基本変形3の適用'(A,B,_行列1,_行列2,N2) :- B < 0, A2 is abs(A), B2 is abs(B), '最小公倍数'(N1 * A2,N2 * B2,_), '行基本変形'(N2 # M + N1 # N,_行列1,_行列2), ! . % *** user: '行基本変形3の適用' / 4 *** '行基本変形3の適用'(A,B,_行列1,_行列2) :- B >= 0, A2 is abs(A), B2 is abs(B), '最小公倍数'(N1 * A2,N2 * B2,_), '行基本変形'(N2 # M - N1 # N,_行列1,_行列2), ! . '行基本変形3の適用'(A,B,_行列1,_行列2) :- B < 0, A2 is abs(A), B2 is abs(B), '最小公倍数'(N1 * A2,N2 * B2,_), '行基本変形'(N2 # M + N1 # N,_行列1,_行列2), ! . % *** user: '行基本変形除算' / 4 *** '行基本変形除算'(A,_乗数,_除数,X) :- integer(A), integer(_乗数), integer(_除数), A2 is A * _乗数, 0 is A2 mod _除数, X is A * _乗数 // _除数, ! . '行基本変形除算'(A,_乗数,_除数,X) :- integer(A), integer(_乗数), integer(_除数), A2 is A * _乗数, \+(0 is A2 mod _除数), '約分'(A2 / _除数,X), ! . '行基本変形除算'(A,_乗数,_除数,X) :- X is A * _乗数 / _除数 . '分数を含む掛算'(A,B,C) :- '分数を含む乗算'(A,B,C). % *** user: '分数を含む乗算' / 3 *** '分数を含む乗算'(A1 / B1,A2 / B2,C) :- B3 is B1 * B2, A3 is A1 * A2, '約分'(A3 / B3,C), ! . '分数を含む乗算'(V,A2 / B2,C) :- number(V), A3 is V * A2, '約分'(U / B2,C), ! . '分数を含む乗算'(A1 / B1,V,C) :- number(V), A3 is A1 * V, '約分'(A3 / B1,C), ! . '分数を含む乗算'(A,B,C) :- C is A * B . % *** user: '分数を含む掛算' / 3 *** '分数を含む掛算'(A1 / A2,B1 / B2,C) :- S1 is A1 * B1, S2 is A2 * B2, '約分'(S1 / S2,C), ! . '分数を含む掛算'(A1 / A2,B,C) :- S1 is A1 * B, '約分'(S1 / A2,C), ! . '分数を含む掛算'(A,B1 / B2,C) :- S1 is B1 * A, '約分'(S1 / B2,C), ! . '分数を含む掛算'(A,B,C) :- C is A * B . % *** user: '分数を含む加算' / 3 *** '分数を含む加算'(A,B,C) :- number(A), number(B), C is A + B, ! . '分数を含む加算'(A1 / B1,A2 / B2,C) :- A3 is A1 * B2 + A2 * B1, B3 is B1 * B2, '約分'(A3 / B3,C), ! . '分数を含む加算'(A1 / B1,V,C) :- number(V), A2 is V * B1, C3 is A1 + A2, '約分'(C3 / B1,C), ! . '分数を含む加算'(V,A2 / B2,C) :- number(V), A1 is V * B2, C3 is A1 + A2, '約分'(C3 / B2,C), ! . % *** user: '分数公倍数' / 3 *** '分数公倍数'(A1 / A2,B1 / B2,C1 / C2) :- C1 is A1 * B1, C2 is A2 * B2, ! . '分数公倍数'(A,B1 / B2,C1 / B2) :- integer(A), C1 is A * B1, ! . '分数公倍数'(A1 / A2,B,C1 / A2) :- integer(B), C1 is A1 * B, ! . '分数公倍数'(A,B1 / B2,C1 / B2) :- A float, C1 is A * B1, ! . '分数公倍数'(A1 / A2,B,C1 / A2) :- B float, C1 is A1 * B, ! . % *** user: '分数を含む減算' / 3 *** '分数を含む減算'(A,B,C) :- number(A), number(B), C is A - B, ! . '分数を含む減算'(A1 / B1,A2 / B2,C) :- A3 is A1 * B2 - A2 * B1, B3 is B1 * B2, '約分'(A3 / B3,C), ! . '分数を含む減算'(A1 / B1,V,C) :- number(V), A2 is V * B1, C3 is A1 - A2, '約分'(C3 / B1,C), ! . '分数を含む減算'(V,A2 / B2,C) :- number(V), A1 is V * B2, C3 is A1 - A2, '約分'(C3 / B2,C), ! . % *** user: '分数を含む除算' / 3 *** '分数を含む除算'(A,B,C) :- number(A), number(B), '約分'(A / B,C), ! . '分数を含む除算'(A1 / B1,A2 / B2,C) :- '分数を含む乗算'(A1 / B1,B2 / A2,C), ! . '分数を含む除算'(V,A2 / B2,C) :- number(V), '分数を含む乗算'(V,B2 / A2,C), ! . '分数を含む除算'(A1 / B1,V,C) :- number(V), B2 is V * B1, '約分'(A1 / B2,C), ! . % *** user: '最小公倍数' / 3 *** '最小公倍数'(N1 * A,B,C) :- integer(B), '最小公倍数'(A,B,C), N1 is C // A, ! . '最小公倍数'(A,N2 * B,C) :- integer(A), '最小公倍数'(A,B,C), N2 is C // B, ! . '最小公倍数'(N1 * A,N2 * B,C) :- '最小公倍数'(A,B,C), N1 is C // A, N2 is C // B, ! . '最小公倍数'(A,B,X) :- integer(A), integer(B), '最大公約数をユークリッドの互除法で求める'(A,B,C), X is A * B // C . % *** user: '最小公倍数' / 2 *** '最小公倍数'([N1 * A|R],X) :- findall(U,member(_ * U,[N1 * A|R]),L1), '最小公倍数'(L1,X), '最小公倍数_2'([N1 * A|R],X), ! . '最小公倍数'([A,B],X) :- '最小公倍数'(A,B,X), ! . '最小公倍数'([A|R],X) :- '最小公倍数'(R,B), '最小公倍数'(A,B,X), ! . % *** user: '最小公倍数_2' / 2 *** '最小公倍数_2'([],_) :- ! . '最小公倍数_2'([N * A|R],Y) :- N is Y // A, '最小公倍数_2'(R,Y), ! . '最小公倍数_2'([A|R],Y) :- integer(A), '最小公倍数_2'(R,Y), ! . % *** user: '最大公約数をユークリッドの互除法で求める' / 3 *** '最大公約数をユークリッドの互除法で求める'(M,N,N) :- 0 is M mod N, ! . '最大公約数をユークリッドの互除法で求める'(M,N,X) :- Mod is M mod N, '最大公約数をユークリッドの互除法で求める'(N,Mod,X) . % *** user: '最大公約数' / 3 *** '最大公約数'(M,N,X) :- '最大公約数をユークリッドの互除法で求める'(M,N,X), ! . % *** user: '要素数はnの倍数' / 2 *** '要素数はnの倍数'(L,_n) :- length(L,Len), 0 is Len mod _n . % *** user: '要素を削除するのニ' / 3 *** '要素を削除するのニ'(A,[],[]) :- ! . '要素を削除するのニ'(A,[A|R1],R2) :- '要素を削除するのニ'(A,R1,R2), ! . '要素を削除するのニ'(A,[B|R1],[B|R2]) :- '要素を削除するのニ'(A,R1,R2) . % *** user: '要素を削除する' / 3 *** '要素を削除する'(_,[],_) :- !, fail . '要素を削除する'(A,[A|R1],R2) :- '要素を削除するのニ'(A,R1,R2), ! . '要素を削除する'(A,[B|R1],[B|R2]) :- '要素を削除する'(A,R1,R2) . % *** user: '要素がn個' / 3 *** '要素がn個'(A,L,_n) :- findall(_,append(_,[A|_],L),L1), length(L1,_n), ! . % *** user: '要素数をnで割ると余りがmを収集' / 4 *** '要素数をnで割ると余りがmを収集'(L,_n,_m,Lx) :- findall(A,(append(L0,[A|R],L) , '要素数をnで割ると余りがm'([_|L0],_n,_m)),Lx) . % *** user: '要素数がnで割り切れる' / 2 *** '要素数がnで割り切れる'(L,_n) :- length(L,Len), 0 is Len mod _n . % *** user: '要素数が奇数' / 1 *** '要素数が奇数'(L) :- length(L,N), 1 is N mod 2 . % *** user: '要素位置は' / 2 *** '要素位置は'(L0,_要素位置) :- length([_|L0],_要素位置) . % *** user: '要素がゼロ以外に出会うまで' / 3 *** '要素がゼロ以外に出会うまで'([A|R],[],[A|R]) :- \+((A = 0 ; A = 0.0e+00)), ! . '要素がゼロ以外に出会うまで'([0|R],[0|R1],R2) :- '要素がゼロ以外に出会うまで'(R,R1,R2) . '要素がゼロ以外に出会うまで'([0.0e+00|R],[0.0e+00|R1],R2) :- '要素がゼロ以外に出会うまで'(R,R1,R2) . % *** user: '要素' / 2 *** '要素'(A,B) :- member(A,B) . % *** user: '要素番号によるならびの置換' / 4 *** '要素番号によるならびの置換'(_要素番号,_置換要素,_対象ならび,_置換ならび) :- update_list(_要素番号,_置換要素,_対象ならび,_置換ならび), ! . % *** user: '要素の複製' / 3 *** '要素の複製'(_複製数,_要素,_複製ならび) :- findall(_要素,for(1,N,_複製数),_複製ならび) . % *** user: '要素数' / 2 *** '要素数'(_ならび,_要素数) :- 'ならび'(_ならび), list_length(_ならび,_要素数) . % *** user: '要素数が偶数' / 1 *** '要素数が偶数'(L) :- length(L,N), 0 is N mod 2 . % *** user: '要素数をnで割ると余りがm' / 3 *** '要素数をnで割ると余りがm'(L,_n,_m) :- length(L,Len), _m is Len mod _n . % *** user: '要素数割り算' / 5 *** '要素数割り算'(L1,L2,Div,Div,L1) :- append([_|_],L1,L2), ! . '要素数割り算'(L1,L2,L4,Div,Mod) :- append(L2,L3,L1), length(L2,Len), length(L5,Len), '要素数割り算'(L3,L5,[_|L4],Div,Mod) . % *** user: '要素数割り算' / 4 *** '要素数割り算'(L1,L2,Div,Mod) :- length(L1,Len1), length(L2,Len2), length(L11,Len1), length(L22,Len2), '要素数割り算'(L11,L22,[],Div,Mod) . % *** user: '行の整列' / 5 *** '行の整列'(_,_,_,[],[]) :- ! . '行の整列'(N,S,E,[A|R1],[B|R2]) :- N >= S, N =< E, sort(A,B), M is N + 1, '行の整列'(M,S,E,R1,R2), ! . '行の整列'(N,S,E,[A|R1],[A|R2]) :- \+((N >= S , N =< E)), M is N + 1, '行の整列'(M,S,E,R1,R2), ! . % *** user: '行の整列' / 4 *** '行の整列'(_行目から,_行目まで,_表,_整列した表) :- '行の整列'(1,_行目から,_行目まで,_表,_整列した表), ! . % *** user: '行の整列' / 2 *** '行の整列'(_表,_整列した表) :- list_length(_表,E), '行の整列'(1,1,E,_表,_整列した表), ! . % *** user: '行の反転' / 5 *** '行の反転'(_,_,_,[],[]) :- ! . '行の反転'(N,S,E,[A|R1],[B|R2]) :- N >= S, N =< E, reverse(A,B), M is N + 1, '行の反転'(M,S,E,R1,R2), ! . '行の反転'(N,S,E,[A|R1],[A|R2]) :- \+((N >= S , N =< E)), M is N + 1, '行の反転'(M,S,E,R1,R2), ! . % *** user: '行の反転' / 4 *** '行の反転'(_行目から,_行目まで,_表,_反転した表) :- '行の反転'(1,_行目から,_行目まで,_表,_反転した表), ! . % *** user: '行の反転' / 2 *** '行の反転'(_表,_反転した表) :- list_length(_表,E), '行の反転'(1,1,E,_表,_反転した表), ! . % *** user: '行の置換' / 4 *** '行の置換'(_行番号1,_行番号2,_行列,_置換された行列) :- nth1(_行番号1,_行列,_行1), nth1(_行番号2,_行列,_行2), '要素番号によるならびの置換'(_行番号2,_行1,_行列,_行列2), '要素番号によるならびの置換'(_行番号1,_行2,_行列2,_置換された行列), ! . % *** user: 'すべての要素が0か0.0' / 1 *** 'すべての要素が0か0.0'([]). 'すべての要素が0か0.0'([0|R]) :- 'すべての要素が0か0.0'(R) . 'すべての要素が0か0.0'([0.0e+00|R]) :- 'すべての要素が0か0.0'(R) . % *** user: 'すべての要素' / 2 *** 'すべての要素'([A],A). 'すべての要素'([A|R],A) :- 'すべての要素'(R,A) . % *** user: 'すべての要素が変数である' / 1 *** 'すべての要素が変数である'([V]) :- var(V), ! . 'すべての要素が変数である'([V|R]) :- var(V), 'すべての要素が変数である'(R) . % *** user: 'すべての要素を左右反転する' / 2 *** 'すべての要素を左右反転する'([],[]) :- ! . 'すべての要素を左右反転する'([L1|R1],[L2|R2]) :- reverse(L1,L2), 'すべての要素を左右反転する'(R1,R2) . % *** user: '最初に現れる0ではない要素・位置' / 4 *** '最初に現れる0ではない要素・位置'(Nth,[X|_],Nth,X) :- \+((X = 0 ; X = 0.0e+00)), ! . '最初に現れる0ではない要素・位置'(Mth,[0|R],Nth,X) :- Mth_2 is Mth + 1, '最初に現れる0ではない要素・位置'(Mth_2,R,Nth,X) . '最初に現れる0ではない要素・位置'(Mth,[0.0e+00|R],Nth,X) :- Mth_2 is Mth + 1, '最初に現れる0ではない要素・位置'(Mth_2,R,Nth,X) . % *** user: replace_nth / 5 *** replace_nth(_,_,_,[],[]) :- ! . replace_nth(S,S,Y,[_|R1],[Y|R2]) :- S2 is S + 1, replace_nth(S2,S,Y,R1,R2), ! . replace_nth(S,N,Y,[A|R1],[A|R2]) :- S2 is S + 1, replace_nth(S2,N,Y,R1,R2) . % *** user: '余因子' / 5 *** '余因子'(_n,_正方行列,_i,_j,_余因子) :- 'n次正方行列から、第i行と第j列を取り除いた正方行列(n-1次正方行列の行列式に、(-1)のi+j乗をかけたものを、Aの(i,j)余因子といい、Cijで表します。'(_n,_正方行列,_i,_j,_余因子) . % *** user: '余因子行列の要素が余因子である' / 4 *** '余因子行列の要素が余因子である'(_n,_正方行列,_i,L) :- length(L,_n), findall(_余因子,(nth1(_j,L,_余因子) , '余因子'(_n,_正方行列,_i,_j,_余因子)),L) . % *** user: '余因子行列' / 3 *** '余因子行列'(_n,_正方行列,_余因子行列) :- length(_余因子行列,_n), findall(L,(nth1(_i,_余因子行列,L) , '余因子行列の要素が余因子である'(_n,_正方行列,_i,L)),_余因子行列) . % *** user: '余因子行列で行列値|a|を求める' / 2 *** '余因子行列で行列値|a|を求める'(_a,_行列式_aの値) :- '余因子行列'(_n,_a,_余因子行列), _a = [_aの第一行|_], _余因子行列 = [_余因子行列の第一行|_], '二つのならびの積の和'(_aの第一行,_余因子行列の第一行,_行列式_aの値) . % *** user: '余因子行列を使って逆行列を得る' / 3 *** '余因子行列を使って逆行列を得る'(_n,_正方行列,_逆行列) :- '余因子行列で行列値|a|を求める'(_正方行列,_行列式の値), '余因子行列'(_n,_正方行列,_余因子行列), '転置'(_余因子行列,_転置された余因子行列), '行列のすべての要素に値を掛ける'(1,_n,_転置された余因子行列,1 / _行列式の値,_逆行列) . % *** user: 'とからりすと' / 2 *** 'とからりすと'(A,[A]) :- atomic(A), ! . 'とからりすと'(A 'と' B,C) :- 'とからりすと'(A,A1), 'とからりすと'(B,B1), append(A1,B1,C) . % *** user: '項加算_1' / 3 *** '項加算_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) :- '分数を含む加算'(A,Y,Z), '項加算_1'(R,Z,S) . '項加算_1'(A,Y,S) :- 'とからりすと'(A,L), !, '項加算_1'(L,Y,S) . % *** user: '項加算_2' / 2 *** '項加算_2'([],[]) :- ! . '項加算_2'([L|R],[S|R2]) :- '項加算'(L,S), '項加算_2'(R,R2) . % *** 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, ! . '項加算'([],L) :- \+(var(L)), '加算の変数に零をおく'(L), ! . '項加算'([L|R],SL) :- 'ならび'(L), m_trans([L|R],L1), '項加算_2'(L1,SL), ! . '項加算'(X,S) :- '項加算_1'(X,0,S) . % *** user: '加算' / 2 *** '加算'(truncate(L),SL) :- '加算'(L,SL2), findall(A,(member(B,SL2) , A is truncate(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, ! . '加算'([],L) :- \+(var(L)), '加算の変数に零をおく'(L), ! . '加算'([L|R],SL) :- 'ならび'(L), m_trans([L|R],L1), '加算_2'(L1,SL), ! . '加算'(X,S) :- '加算_1'(X,0,S) . % *** user: '加算_1' / 3 *** '加算_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) . % *** user: '加算_2' / 2 *** '加算_2'([],[]) :- ! . '加算_2'([L|R],[S|R2]) :- '加算'(L,S), '加算_2'(R,R2) . % *** user: '加算の変数に零をおく' / 1 *** '加算の変数に零をおく'([]) :- ! . '加算の変数に零をおく'([A|R]) :- '変数'(A), A = 0, '加算の変数に零をおく'(R), ! . ならび(L) :- is_list(L). list(L) :- is_list(L). % *** user: '逆交差要素の一' / 5 *** '逆交差要素の一'(_,N,Len,_,[]) :- N > Len, ! . '逆交差要素の一'(M,_,_,_,[]) :- M =< 0, ! . '逆交差要素の一'(M,N,Len,LL,[]) :- M =< M - Len, ! . '逆交差要素の一'(M,N,Len,LL,[]) :- N >= N + Len, ! . '逆交差要素の一'(M,N,Len,LL,[A|R]) :- '行列要素'(M,N,LL,A), M1 is M - 1, N2 is N + 1, '逆交差要素の一'(M1,N2,Len,LL,R), ! . % *** user: '逆行列' / 2 *** '逆行列'(_行列,_逆行列) :- length(_行列,N), '変数正方行列'(1,N,_逆行列), '各行に単位行列の各行を結合して拡張した行列'(N,_行列,_行列の二), '既約ガウス行列に変形'(_行列の二,_既約ガウス行列), '行列の結合'(_,_逆行列,_既約ガウス行列) . % *** user: '各行で最初に現れる0ではない要素が1である' / 1 *** '各行で最初に現れる0ではない要素が1である'([]). '各行で最初に現れる0ではない要素が1である'([_行|R]) :- '最初に現れる0ではない要素が1である'(_行), '各行で最初に現れる0ではない要素が1である'(R) . % *** user: '各行で最初に現れる0ではない要素が1である列において他の要素がすべて0である' / 3 *** '各行で最初に現れる0ではない要素が1である列において他の要素がすべて0である'(_,_,[]). '各行で最初に現れる0ではない要素が1である列において他の要素がすべて0である'(N,_行列,[_行|R]) :- '最初に現れる0ではない要素・位置'(1,_行,_列位置,1), N2 is N + 1, '列において他の要素がすべて0である'(_行列,N,_列位置), '各行で最初に現れる0ではない要素が1である列において他の要素がすべて0である'(N2,_行列,R) . % *** user: '各行に単位行列の各行を結合して拡張した行列' / 3 *** '各行に単位行列の各行を結合して拡張した行列'(N,_行列,_行列の二) :- '単位行列'(N,L), '行列の結合'(_行列,L,_行列の二) . % *** user: '列において他の要素がすべて0である' / 3 *** '列において他の要素がすべて0である'(_行列,N,_列位置) :- length(_行列,Len), findall(U,(for(1,M,Len) , not M = N , nth1(M,_行列,_行) , nth1(_列位置,_行,U)),L), all(L,0), ! . % *** user: '変数分離' / 3 *** '変数分離'([],[],[]) :- ! . '変数分離'([V|R1],[V|R2],R3) :- var(V), '変数分離'(R1,R2,R3) . '変数分離'([A|R1],R2,[A|R3]) :- \+(var(A)), '変数分離'(R1,R2,R3) . % *** user: '変数でない項目だけ置き換える' / 3 *** '変数でない項目だけ置き換える'([],[],[]). '変数でない項目だけ置き換える'([Term|R1],[_|R2],[Term|R3]) :- \+(var(Term)), '変数でない項目だけ置き換える'(R1,R2,R3) . '変数でない項目だけ置き換える'([V|R1],[Term|R2],[Term|R3]) :- var(V), '変数でない項目だけ置き換える'(R1,R2,R3) . % *** user: '変数指定項複写' / 6 *** '変数指定項複写'(M,N,P,P1,V,V1) :- M > N, ! . '変数指定項複写'(M,N,P,P1,V,V1) :- arg(M,P,T), arg(M,P1,T1), '変数指定項複写'(T,T1,V,V1), M1 is M + 1, '変数指定項複写'(M1,N,P,P1,V,V1), ! . % *** user: '変数指定項複写' / 4 *** '変数指定項複写'(P,P1,V,V1) :- struct(P), functor(P,F,A), functor(P1,F,A), '変数指定項複写'(1,A,P,P1,V,V1), ! . '変数指定項複写'(P,P1,L1,L2) :- var(P), list(L1), list(L2), L1 = [V|_], L2 = [P1|_], P == V, ! . '変数指定項複写'(P,P1,L1,L2) :- var(P), list(L1), list(L2), L1 = [V|R1], L2 = [V2|R2], \+(P == V), '変数指定項複写'(P,P1,R1,R2), ! . '変数指定項複写'(P,P1,V,P1) :- var(P), var(V), P == V, ! . '変数指定項複写'(P,P1,V,V1) :- var(P), var(V), \+(P == V), ! . '変数指定項複写'(P,P1,V,V1) :- \+(var(P)), parse_atom(P,1,Q,_), \+(P == Q), sprintf('%q',[P],P1), ! . '変数指定項複写'(P,P,V,V1). % *** user: '変数を順に単一化する' / 3 *** '変数を順に単一化する'(_,[],[]) :- ! . '変数を順に単一化する'([],X,X) :- ! . '変数を順に単一化する'([A|R1],[V|R2],[A|R3]) :- var(V), '変数を順に単一化する'(R1,R2,R3), ! . '変数を順に単一化する'([A|R1],[B|R2],[B|R3]) :- \+(var(B)), '変数を順に単一化する'([A|R1],R2,R3) . % *** user: '変数を順に固定値に置換' / 5 *** '変数を順に固定値に置換'([],_,[],X,X) :- ! . '変数を順に固定値に置換'(R,_,R,[],[]) :- ! . '変数を順に固定値に置換'([_固定値|R0],_忌避変数ならび,R02,[A|R],[A|R1]) :- var(A), \+((member(B,_忌避変数ならび) , A == B)), A = _固定値, '変数を順に固定値に置換'(R0,_忌避変数ならび,R02,R,R1), ! . '変数を順に固定値に置換'([_固定値|R0],_忌避変数ならび,R02,[A|R],[A|R1]) :- var(A), member(B,_忌避変数ならび), A == B, '変数を順に固定値に置換'([_固定値|R0],_忌避変数ならび,R02,R,R1), ! . '変数を順に固定値に置換'([_固定値|R0],_忌避変数ならび,R02,[A|R],[A|R1]) :- atomic(A), '変数を順に固定値に置換'([_固定値|R0],_忌避変数ならび,R02,R,R1), ! . '変数を順に固定値に置換'(_固定値ならび,_忌避変数ならび,R02,[A|R],[B|R1]) :- struct(A), A =.. L, '変数を順に固定値に置換'(_固定値ならび,_忌避変数ならび,R0,L,L1), B =.. L1, '変数を順に固定値に置換'(R0,_忌避変数ならび,R02,R,R1), ! . % *** user: '変数を順に固定値に置換' / 4 *** '変数を順に固定値に置換'(_固定値ならび,_忌避変数ならび,_対象ならび,_置換ならび) :- '変数を順に固定値に置換'(_固定値ならび,_忌避変数ならび,R02,_対象ならび,_置換ならび), ! . % *** user: '変数を順に固定値に置換' / 3 *** '変数を順に固定値に置換'(_固定値ならび,_対象ならび,_置換ならび) :- '変数を順に固定値に置換'(_固定値ならび,[],_対象ならび,_置換ならび), ! . % *** user: '変数名の解決' / 1 *** '変数名の解決'([]) :- ! . '変数名の解決'([Varname = Var|R]) :- var(Var), Varname = Var, '変数名の解決'(R), ! . % *** user: '変数ならびの生成' / 3 *** '変数ならびの生成'(N,N,[]) :- ! . '変数ならびの生成'(S,E,[A|R]) :- S < E, S1 is S + 1, '変数ならびの生成'(S1,E,R) . % *** user: '変数を固定値に置換' / 3 *** '変数を固定値に置換'(A,X,X) :- var(X), A = X, ! . '変数を固定値に置換'(_,[],[]) :- ! . '変数を固定値に置換'(_固定値,[A|R],[A|R1]) :- var(A), A = _固定値, '変数を固定値に置換'(_固定値,R,R1), ! . '変数を固定値に置換'(_固定値,[A|R],[A|R1]) :- atomic(A), '変数を固定値に置換'(_固定値,R,R1), ! . '変数を固定値に置換'(_固定値,[A|R],[B|R1]) :- struct(A), A =.. L, '変数を固定値に置換'(_固定値,L,L1), B =.. L1, '変数を固定値に置換'(_固定値,R,R1), ! . % *** user: '変数束縛表示' / 1 *** '変数束縛表示'([]) :- ! . '変数束縛表示'([VN = V]) :- '表示'('%t = %q',[VN,V]), telling(F), tell(user_output), write_formatted('%t = %q.',[VN,V]), told, tell(F), ! . '変数束縛表示'([VN,V|R]) :- '表示'('%t = %q,',[VN,V]), telling(F), tell(user_output), write_formatted('%t = %q,',[VN,V]), told, tell(F), '変数束縛表示'(R) . % *** user: '変数ならび表示' / 1 *** '変数ならび表示'([]) :- ! . '変数ならび表示'([_変数項]) :- nl, write(_変数項), '表示'('\n%t',[_変数項]), reads(X), !, \+(X = (;)) . '変数ならび表示'([_変数項|_残りならび]) :- nl, write(_変数項), '表示'('\n%t',[_変数項]), '変数ならび表示'(_残りならび) . % *** user: '変数' / 1 *** '変数'(_項) :- var(_項) . % *** user: '変数ならび' / 3 *** '変数ならび'(0,R,R) :- ! . '変数ならび'(N,[_|R],X) :- M is N - 1, '変数ならび'(M,R,X) . % *** user: '変数ならび' / 1 *** '変数ならび'([]) :- ! . '変数ならび'([_変数|_残りならび]) :- '変数'(_変数), !, '変数ならび'(_残りならび) . % *** user: '変数ならび生成' / 2 *** '変数ならび生成'(0,[]) :- ! . '変数ならび生成'(_生成数,[_生成された変数|_残りならび]) :- _残り生成数 'は' _生成数 - 1, '変数ならび生成'(_残り生成数,_残りならび) . % *** user: '変数が存在する' / 1 *** '変数が存在する'([V|_]) :- var(V), ! . '変数が存在する'([Q|_]) :- struct(Q), Q =.. [_|L], '変数が存在する'(L), ! . '変数が存在する'([_|R]) :- '変数が存在する'(R) . % *** user: '変数正方行列' / 3 *** '変数正方行列'(M,N,[]) :- M > N . '変数正方行列'(M,N,[L|R]) :- length(L,N), M2 is M + 1, '変数正方行列'(M2,N,R) . % *** user: '変数は全て単一' / 2 *** '変数は全て単一'([],_). '変数は全て単一'([A|B],A) :- var(A), '変数は全て単一'(B,A) . '変数は全て単一'([A|B],C) :- \+(var(A)), '変数は全て単一'(B,C) . % *** user: '逆置' / 3 *** '逆置'(_順列,_ある要素,_逆置要素) :- append(_,[_ある要素|R],_順列), append(_,[_逆置要素|R1],R), _逆置要素 < _ある要素 . % *** user: '逆交差要素' / 5 *** '逆交差要素'(M,N,Len,LL,X) :- M2 is M + N - 1, '逆交差要素'(M2,Len,LL,X) . % *** user: '逆交差要素' / 4 *** '逆交差要素'(M,Len,_,_) :- M - Len >= Len, !, fail . '逆交差要素'(M,Len,LL,L) :- M =< Len, '逆交差要素の一'(M,1,Len,LL,L) . '逆交差要素'(M,Len,LL,L) :- M > Len, N is M - Len + 1, '逆交差要素の一'(Len,N,Len,LL,L) . '逆交差要素'(M,Len,LL,L) :- M2 is M + 1, '逆交差要素の一'(M2,Len,LL,L) . % *** user: '逆交差要素' / 2 *** '逆交差要素'(LL,L) :- length(LL,Len), '逆交差要素'(1,Len,LL,L) . % *** user: '逆斜行要素' / 7 *** '逆斜行要素'(M,N,Len1,Len2,LL,Z,X) :- M2 is M + N - 1, '逆斜行要素'(M2,Len1,Len2,LL,Z,X) . % *** user: '逆斜行要素' / 6 *** '逆斜行要素'(M,Len1,Len2,_,_,_) :- M - Len1 >= Len1, !, fail . '逆斜行要素'(M,Len1,Len2,LL,Z,L) :- M =< Len1, '逆斜行要素の一'(M,1,Len1,Len2,LL,Z,L) . '逆斜行要素'(M,Len1,Len2,LL,Z,L) :- M > Len1, N is M - Len1 + 1, '逆斜行要素の一'(Len1,N,Len1,Len2,LL,Z,L) . '逆斜行要素'(M,Len1,Len2,LL,Z,L) :- M2 is M + 1, '逆斜行要素の一'(M2,Len1,Len2,LL,Z,L) . % *** user: '逆斜行要素' / 5 *** '逆斜行要素'(M,Len,_,_,_) :- M - Len >= Len, !, fail . '逆斜行要素'(M,Len,LL,Z,L) :- M =< Len, '逆斜行要素の一'(M,1,Len,LL,Z,L) . '逆斜行要素'(M,Len,LL,Z,L) :- M > Len, N is M - Len + 1, '逆斜行要素の一'(Len,N,Len,LL,Z,L) . '逆斜行要素'(M,Len,LL,Z,L) :- M2 is M + 1, '逆斜行要素の一'(M2,Len,LL,Z,L) . % *** user: '逆斜行要素' / 2 *** '逆斜行要素'(LL,L) :- length(LL,Len), '逆斜行要素'(1,Len,LL,_,L) . % *** user: '逆斜行要素の一' / 7 *** '逆斜行要素の一'(_,N,Len1,Len2,_,[],[]) :- N > Len2, ! . '逆斜行要素の一'(M,_,_,_,_,[],[]) :- M =< 0, ! . '逆斜行要素の一'(M,N,Len1,Len2,LL,[],[]) :- M =< M - Len1, ! . '逆斜行要素の一'(M,N,Len1,Len2,LL,[],[]) :- N >= N + Len2, ! . '逆斜行要素の一'(M,N,Len1,Len2,LL,[[M,N]|R1],[A|R2]) :- '行列要素'(M,N,LL,A), M1 is M - 1, N2 is N + 1, '逆斜行要素の一'(M1,N2,Len1,Len2,LL,R1,R2), ! . % *** user: '逆斜行要素の一' / 6 *** '逆斜行要素の一'(M,_,_,_,[],[]) :- M =< 0, ! . % *** user: '上三角行列' / 3 *** '上三角行列'(N,N,_) :- ! . '上三角行列'(M,N,_行列) :- M2 is M + 1, nth1(M2,_行列,_行), findall(0,for(1,I,M),L), append(L,_,_行), '上三角行列'(M2,N,_行列) . % *** user: '上三角行列' / 1 *** '上三角行列'(_行列) :- length(_行列,_行), '上三角行列'(1,_行,_行列) . % *** user: '下三角行列' / 3 *** '下三角行列'(N,N,_) :- ! . '下三角行列'(M,N,_行列) :- nth1(M,_行列,_行), M2 is M + 1, findall(0,for(N,I,M2),L), append(_,L,_行), '下三角行列'(M2,N,_行列) . % *** user: '下三角行列' / 1 *** '下三角行列'(_行列) :- length(_行列,_行), '下三角行列'(1,_行,_行列) . % *** user: '零行列' / 1 *** '零行列'([]) :- ! . '零行列'([A|R]) :- '零行列_1'(A), '零行列'(R) . % *** user: '零行列_1' / 1 *** '零行列_1'([]) :- ! . '零行列_1'([0|R]) :- !, '零行列_1'(R) . '零行列_1'([0.0e+00|R]) :- '零行列_1'(R) . % *** user: '零以外の最初の要素が1' / 1 *** '零以外の最初の要素が1'([1]) :- ! . '零以外の最初の要素が1'([1|_]) :- ! . '零以外の最初の要素が1'([0|R]) :- '零以外の最初の要素が1'(R) . % *** user: '約分の二' / 3 *** '約分の二'(_分子,1,_分子) :- ! . '約分の二'(_分子,1.0,_分子) :- ! . '約分の二'(_分子,_分母,_分子 / _分母). % *** user: '約分' / 2 *** '約分'(B / A,X) :- '最大公約数'(B,A,C), _分子 is B // C, _分母 is A // C, '約分の二'(_分子,_分母,X), ! . % *** user: (all) / 2 *** all([],_). all([A|R],A) :- all(R,A). % *** user: '右下がり対角要素ならび' / 3 *** '右下がり対角要素ならび'(_n,_正方行列,_右下がり対角要素ならび) :- findall(V,(nth1(_nth1,_正方行列,L) , nth1(_nth1,L,V)),_右下がり対角要素ならび) . % *** user: '右上がり対角要素ならび' / 3 *** '右上がり対角要素ならび'(_n,_正方行列,_右上がり対角要素ならび) :- findall(V,(append(_,[L|R],_正方行列) , length([_|R],_nth1) , nth1(_nth1,L,V)),_右上がり対角要素ならび), ! . % *** user: '二つの対角要素を得る' / 4 *** '二つの対角要素を得る'(_n,_正方行列,_右下がり対角要素ならび,_右上がり対角要素ならび) :- '右下がり対角要素ならび'(_n,_正方行列,_右下がり対角要素ならび), '右上がり対角要素ならび'(_n,_正方行列,_右上がり対角要素ならび) . % *** user: '二つの対角要素の積を得る' / 4 *** '二つの対角要素の積を得る'(_n,_正方行列,_右下がり対角要素の積,_右上がり対角要素の積) :- '二つの対角要素を得る'(_n,_正方行列,_右下がり対角要素ならび,_右上がり対角要素ならび), '対角要素の掛算'(_右下がり対角要素ならび,_右下がり対角要素の積), '対角要素の掛算'(_右上がり対角要素ならび,_右上がり対角要素の積) . % *** user: '二つのならびの積の和' / 3 *** '二つのならびの積の和'([],[],0). '二つのならびの積の和'([A|R1],[B|R2],S) :- '二つのならびの積の和'(R1,R2,S_1), S is S_1 + A * B . % *** user: '二つのならびの同一順序要素の結合' / 3 *** '二つのならびの同一順序要素の結合'([],[],[]). '二つのならびの同一順序要素の結合'([A|R1],[B|R2],[C|R3]) :- append(A,B,C), '二つのならびの同一順序要素の結合'(R1,R2,R3) . % *** user: '二つの要素を交換する' / 4 *** '二つの要素を交換する'(L1,_要素位置1,_要素位置2,L2) :- nth1(_要素位置1,L1,A), nth1(_要素位置2,L1,B), '指定要素を置換する'(1,L1,[[_要素位置1,B],[_要素位置2,A]],L2) . % *** user: '対角要素の掛算' / 2 *** '対角要素の掛算'([],1). '対角要素の掛算'([A|R],X) :- '対角要素の掛算'(R,Y), X is A * Y . % *** user: '対角行列' / 3 *** '対角行列'(N,_対角要素が変数の対角行列,_変数ならび) :- integer(N), length(L,N), length(LX,N), findall([X,A],(append(L1,[A|L2],L) , length(L1,N1) , length(L11,N1) , length(L2,N2) , length(L22,N2) , L11 all 0 , L22 all 0 , append(L11,[A|L22],X)),LY), '対角行列_1'(LY,_対角要素が変数の対角行列,_変数ならび) . % *** user: '対角行列' / 2 *** '対角行列'(N,L) :- integer(N), length(LN,N), findall(LN,(append(L1,[A|L2],LN) , L1 all 0 , L2 all 0),L) . % *** user: '対角行列' / 1 *** '対角行列'(L) :- \+(var(L)), length(L,N), length(LN,N), findall(LN,(append(L1,[A|L2],LN) , L1 all 0 , L2 all 0),L) . % *** user: '対角要素' / 4 *** '対角要素'(M,N,_,[]) :- M > N, ! . '対角要素'(M,N,_行列,[_要素|R]) :- nth1(M,_行列,_行), list_length(_行,N), nth1(M,_行,_要素), M2 is M + 1, '対角要素'(M2,N,_行列,R) . % *** user: '対角要素' / 2 *** '対角要素'(_行列,_対角要素) :- list_length(_行列,N), '対角要素'(1,N,_行列,_対角要素) . % *** user: '対角行列_1' / 3 *** '対角行列_1'([],[],[]) :- ! . '対角行列_1'([[L,V]|R1],[L|R2],[V|R3]) :- '対角行列_1'(R1,R2,R3) . % *** user: '対角成分' / 4 *** '対角成分'(M,N,_,[]) :- M > N, ! . '対角成分'(M,N,_行列,[_成分|R]) :- nth1(M,_行列,_行), list_length(_行,N), nth1(M,_行,_成分), M2 is M + 1, '対角成分'(M2,N,_行列,R) . % *** user: '対角成分' / 2 *** '対角成分'(_行列,_対角成分) :- list_length(_行列,N), '対角成分'(1,N,_行列,_対角成分) . % *** user: '対角要素に交差した要素' / 2 *** '対角要素に交差した要素'(_行列,_対角要素に交差した要素) :- reverse(_行列,_行を逆順にした行列), '対角要素'(_行を逆順にした行列,_対角要素の一), reverse(_対角要素の一,_対角要素に交差した要素) . % *** user: '指定要素を置換する' / 4 *** '指定要素を置換する'(_,[],_,[]). '指定要素を置換する'(N,[L1|R1],_置換情報,[L2|R2]) :- member([N,L2],_置換情報), N2 is N + 1, '指定要素を置換する'(N2,R1,_置換情報,R2) . '指定要素を置換する'(N,[L1|R1],_置換情報,[L1|R2]) :- N2 is N + 1, '指定要素を置換する'(N2,R1,_置換情報,R2) . findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). findavg(A,B,C) :- findsum(A,B,S), length(A,D), C is S / D. % *** user: '列の選択' / 3 *** '列の選択'([],_,[]) :- ! . '列の選択'([_列位置|R1],_行,[A|R2]) :- integer(_列位置), nth1(_列位置,_行,A), '列の選択'(R1,_行,R2), ! . '列の選択'([A|R1],_行,[B|R2]) :- \+(integer(A)), B 'は' A, '列の選択'(R1,_行,R2), ! . % *** user: '列の選択' / 3 *** '列の選択'([],_,[]) :- ! . '列の選択'([_列位置|R1],_行,[A|R2]) :- integer(_列位置), nth1(_列位置,_行,A), '列の選択'(R1,_行,R2), ! . '列の選択'([A|R1],_行,[B|R2]) :- \+(integer(A)), B 'は' A, '列の選択'(R1,_行,R2), ! . % *** user: '列の整列' / 5 *** '列の整列'(_,_,_,[],[]) :- ! . '列の整列'(N,S,E,[A|R1],[B|R2]) :- N >= S, N =< E, sort(A,B), M is N + 1, '列の整列'(M,S,E,R1,R2), ! . '列の整列'(N,S,E,[A|R1],[A|R2]) :- \+((N >= S , N =< E)), M is N + 1, '列の整列'(M,S,E,R1,R2), ! . % *** user: '列の整列' / 4 *** '列の整列'(_列目から,_列目まで,_表,_整列した表) :- '行列の転置'(_表,_転置表), '列の整列'(1,_列目から,_列目まで,_転置表,_整列した転置表), '行列の転置'(_整列した転置表,_整列した表), ! . % *** user: '列の整列' / 2 *** '列の整列'(_表,_整列した表) :- '行列の転置'(_表,_転置表), list_length(_転置表,E), '列の整列'(1,1,E,_転置表,_整列した転置表), '行列の転置'(_整列した転置表,_整列した表), ! . % *** user: '列の反転' / 5 *** '列の反転'(_,_,_,[],[]) :- ! . '列の反転'(N,S,E,[A|R1],[B|R2]) :- N >= S, N =< E, reverse(A,B), M is N + 1, '列の反転'(M,S,E,R1,R2), ! . '列の反転'(N,S,E,[A|R1],[A|R2]) :- \+((N >= S , N =< E)), M is N + 1, '列の反転'(M,S,E,R1,R2), ! . % *** user: '列の反転' / 4 *** '列の反転'(_列目から,_列目まで,_表,_反転した表) :- '行列の転置'(_表,_転置表), '列の反転'(1,_列目から,_列目まで,_転置表,_反転した転置表), '行列の転置'(_反転した転置表,_反転した表), ! . % *** user: '列の反転' / 2 *** '列の反転'(_表,_反転した表) :- '行列の転置'(_表,_転置表), length(_転置表,E), '列の反転'(1,1,E,_転置表,_反転した転置表), '行列の転置'(_反転した転置表,_反転した表), ! . % *** user: '列において他の要素がすべて0である' / 3 *** '列において他の要素がすべて0である'(_行列,N,_列位置) :- length(_行列,Len), findall(U,(for(1,M,Len) , not M = N , nth1(M,_行列,_行) , nth1(_列位置,_行,U)),L), all(L,0), ! . 順列(Y,0,[]). 順列(Y,N,[A|X]) :- select(A,Y,Z), M is N - 1, 順列(Z,M,X). 組合せ(L,1,[A]) :- member(A,L). 組合せ([A|R1],N,[A|R2]) :- 'Nを1減らして残り要素の組合せ'(R1,N,R2). 組合せ([_|R1],N,R2) :- 'Nはそのままで残り要素の組合せ'(R1,N,R2). 'Nを1減らして残り要素の組合せ'(R1,N,R2) :- succ(N_1,N), 組合せ(R1,N_1,R2). 'Nはそのままで残り要素の組合せ'(R1,N,R2) :- 組合せ(R1,N,R2). % *** user: 'LU分解' / 2 *** 'LU分解'(LL1,LL2) :- '行数・列数のうち小さい方の回数制御ならび'(LL1,_回数制御ならび), 'LU分解'(_回数制御ならび,LL1,LL2). % *** user: '行数・列数のうち小さい方の回数制御ならび' / 2 *** '行数・列数のうち小さい方の回数制御ならび'(LL1,_回数制御ならび) :- 行数(LL1,_行数), 列数(LL1,_列数), min_list([_行数,_列数],Len), length(Ln,Len). 行数(LL1,_行数) :- length(LL1,_行数). 列数([L|_],_列数) :- length(L,_列数). % *** 'n次正方の疎行列の生成' / 3 *** 'n次正方の疎行列の生成'(_n,_行位置_列位置_値ならび,_n次正方の疎行列) :- 変数正方行列(1,_n,_n次正方の疎行列), 正方の疎行列の生成(_行位置_列位置_値ならび,_n次正方の疎行列), n次正方の疎行列の変数を0で埋める(_n次正方の疎行列). % *** 正方の疎行列の生成 / 2 *** 正方の疎行列の生成([],[]) :- !. 正方の疎行列の生成([[_i,_j,_値]|R],_n次正方の疎行列) :- nth1(_i,_n次正方の疎行列,L), nth1(_j,L,_値), 正方の疎行列の生成(R,_n次正方の疎行列). % *** n次正方の疎行列の変数を0で埋める / 1 *** n次正方の疎行列の変数を0で埋める([]) :- !. n次正方の疎行列の変数を0で埋める([L|R]) :- ならびの変数を0で埋める(L), n次正方の疎行列の変数を0で埋める(R). % *** ならびの変数を0で埋める / 1 *** ならびの変数を0で埋める([]). ならびの変数を0で埋める([0|R]) :- ならびの変数を0で埋める(R),!. ならびの変数を0で埋める([A|R]) :- ならびの変数を0で埋める(R). % *** user: 'LU分解' / 3 *** 'LU分解'([],LL,LL). 'LU分解'([_|Ln],_主小行列_1,[_lL|_LU_3]) :- '_lLと_uLと_主小行列に分割し主小行列部分を計算する'(_主小行列_1,_lL,_uL,_主小行列_2), 'LU分解'(Ln,_主小行列_2,_LU_2), '_uLを主小行列に貼り付ける'(_uL,_LU_2,_LU_3). % *** '_lLと_uLと_主小行列に分割し主小行列部分を計算する' / 4 *** '_lLと_uLと_主小行列に分割し主小行列部分を計算する'([_lL|R1],_lL,_uL,_主小行列) :- _lL = [_l|L], '_uLと_主小行列を切り出す'(_l,R1,_uL,R2), '主小行列部分を計算する'(R2,_lL,_uL,_主小行列). % *** '_uLと_主小行列を切り出す' / 4 *** '_uLと_主小行列を切り出す'(_,[],[],[]). '_uLと_主小行列を切り出す'(_l,[[_u_1|L]|R2],[_u_2|R3],[L|R4]) :- 分数を含む除算(_u_1,_l,_u_2), '_uLと_主小行列を切り出す'(_l,R2,R3,R4). % *** '主小行列部分を計算する' / 4 *** 主小行列部分を計算する([],[],[],[]). 主小行列部分を計算する([L1|R1],_lL,[_u|_uL],[L3|R4]) :- 主小行列部分の一行を計算する(L1,_lL,_u,L3), 主小行列部分を計算する(R1,_lL,_uL,R4). % *** '主小行列部分の一行を計算する' / 4 *** 主小行列部分の一行を計算する([],[],_,[]) :- !. 主小行列部分の一行を計算する([_d_1|R1],[_l|R3],_u,[_d_2|R4]) :- '_d_2 is _d_1 - _u * _l'(_u,_l,_d_1,_d_2), 主小行列部分の一行を計算する(R1,R3,_u,R4). % *** '_d_2 is _d_1 - _u * _l' / 4 *** '_d_2 is _d_1 - _u * _l'(_u,_l,_d_1,_d_2) :- 分数を含む掛算(_u,_l,Y), 分数を含む減算(_d_1,Y,_d_2). % *** '_uLを主小行列に貼り付ける' / 3 *** '_uLを主小行列に貼り付ける'([],[],[]). '_uLを主小行列に貼り付ける'([_u|_uL],[L1|_LU_2],[[_u|L1]|_LU_3]) :- '_uLを主小行列に貼り付ける'(_uL,_LU_2,_LU_3). 行列の置換(_列,_行,_置換要素,_対象行列,_置換された表) :- list_nth(_行,_対象行列,_対象行), 要素番号によるならびの置換(_列,_置換要素,_対象行,_置換された行), 要素番号によるならびの置換(_行,_置換された行,_対象行列,_置換された表),!. ならびの置換(_対象要素,_置換要素,_対象ならび,_置換ならび) :- append(_前半のならび,[_対象要素|_残り対象要素ならび],_対象ならび), append(_前半のならび,[_置換要素|_残り対象要素ならび],_置換ならび),!. ならびの置換(X,[],X) :- !. ならびの置換([],X,X) :- !. ならびの置換([A|R],[A|R1],[A|R2]) :- ならびの置換(R,R1,R2). ならびの置換([A|R],[B|R1],[A|R2]) :- ならびの置換(R,R1,R2). 要素番号によるならびの置換(_要素番号,_置換要素,_対象ならび,_置換ならび) :- update_list(_要素番号,_置換要素,_対象ならび,_置換ならび),!. update_list(Pos,U,P,Q) :- integer(Pos),!, update_list(1,Pos,U,P,Q). update_list(Pos,U,P,Q) :- not(integer(Pos)), not(Pos =.. [',',Pos1,Rpos]), Pos1 is Pos, update_list(1,Pos1,U,P,Q). update_list(Pos,U,P,Q) :- Pos =.. [',',Pos1,Rpos], update_list(1,Pos1,Rpos,U,P,Q). update_list(_,_,_,_,[],[]):-!. update_list(_,V,Rpos,U,[A|R],[B|R1]) :- var(V),!, update_list(Rpos,U,A,B), update_list(_,V,Rpos,U,R,R1). update_list(E,E,Rpos,U,[A|R],[B|R1]) :- update_list(Rpos,U,A,B), update_list(R,R1). update_list(S,E,Rpos,U,[A|R],[A|R1]) :- S1 is S+1, update_list(S1,E,Rpos,U,R,R1). update_list(E,E,U,[A|R],[U|R1]) :- update_list(R,R1). update_list(S,E,U,[A|R],[A|R1]) :- S1 is S+1, update_list(S1,E,U,R,R1). update_list([],[]):-!. update_list([A|R],[A|R1]) :- update_list(R,R1). # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/290 # # tblA # pkey|value # ----+----- # 1  |a # 2  |b # # tblB # pkey|value # ----+----- # 1  |c # # ・欲しい結果 # tblA # pkey|value # ----+----- # 1  |c # 2  |b tblA(1,a). tblA(2,B). tblB(1,c). update(_対象述語/Arity1,_キー位置1,_被置換項位置,_置換指定述語/Arity2,_キー位置2,_置換項位置) :-   length(L1,Arity1),   length(L2,Arity2),   P1 =.. [_対象述語|L1],   P2 =.. [_置換指定述語|L2],   list_nth(_キー位置1,L1,A),   list_nth(_キー位置2,L2,A),   list_nth(_置換項位置,L2,B),   call(P2),   call(P1),   retract(P1),   ならびの位置指定置換(_被置換項位置,B,L1,L3),   P3 =.. [_対象述語|L3],   asserta(P3). document.writeln(""); //--> document.writeln(""); //--> S 1- V50 [PR]KWFbg j[X[PR] # vO (a)-(j)for gB #include<stdio.h> int main() { int a[10]; double sum,ave; sum=0; a[0]=1; a[1]=5; a[2]=7; a[3]=2; a[4]=4; a[5]=1; a[6]=9; a[7]=4; a[8]=20; a[9]=5; sum=sum+a[0];
# /* (a) */ sum=sum+a[1]; /* (b) */ sum=sum+a[2]; /* (c) */ sum=sum+a[3]; /* (d) */ sum=sum+a[4]; /* (e) */ sum=sum+a[5]; /* (f) */ sum=sum+a[6]; /* (g) */ sum=sum+a[7];
# /* (h) */ sum=sum+a[8]; /* (i) */ sum=sum+a[9]; /* (j) */ ave=sum/10; printf("a %d B %d B\n",sum, ave); }
#
# S
# 5A\ヲAt\ヲvOB
# タsF F 3 F 7 F1 F 2 F 5
# \ヲ 3 7 1 2 5 t\ヲ 5 2 1 7 3 vOeLXgRs[eLXgtB[ho\toB

At@xbgtAt@xbg(,[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x, y,z],[z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a]).
At@xbgtAt@xbg(,['A','B','C','D','E','F','G','H','I','J','K','L', 'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'],['Z','Y','X','W','V','U','T','S','R','Q','P','O','N','M','L','K','J','I','H','G','F','E','D','C','B','A']). stack_operation(1,Stack1,Stack) :- write('f[^ :'),get_integer(N),push(N,Stack,Stack2),print_stack_list(Stack2),get_action(N2),stack_operation(N2,Stack2,Stack). pop(A,Stack1,Stack2),write_formatted('|bvf[^%tB \n',[A]),print_stack_list(Stack2),get_action(N2),stack_operation(N2,Stack2,Stack). &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& # t@Ct@CJAf[^L^Bvoid_read_data_file(char*file)A fileOwt@CJAdzW[]liz[]f[^B

@@get_file_info(_pX,[dev(Dev),ino(Ino),mode(Modes),nlink(Nlink),uid (Uid),uname(Uname),gid(Gid),gname(Gname),size(_TCY),atime(Atime),mtime (Mtime),ctime(_IX),blksize(Blksize),blocks(Blocks)]),
@@member(FI,Modes),
@@sub_atom(FI,0,2,_,if),
@@t@C(FI,_).

t@C(ifblk,ubNt@C).
t@C(ifchr,LN^t@C).
t@C(ififo,pCv).
t@C(ifreg,t@C).
t@C(ifdir,fBNg).
t@C(iflnk,V{bNN).

sBsB

VX\ヲ
S O100 100 V50 OF E-mail () :
# 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/474 # # SQL Server Compact 3.5 で、a_tbl と b_tbl のコードが一致した場合に # a_tbl に、b_tblの名前をセットするみたいなことしたいのですが無理ですか? # # UPDATE a_tbl # SET name = b_tbl.name # FROM b_tbl # WHERE a_tbl.no = b_tbl.no # # 実行すると、「FROM 句はこのクエリの種類では使用できません」ってエラーになります。 # SQL Server 2008 だと問題ないのですが・・・ # a_tbl(1,abc). a_tbl(2,add). b_tbl(1,uuu). b_tbl(2,jjj). 'a_tbl と b_tbl のコードが一致した場合に a_tbl に、b_tblの名前をセットする' :-   a_tbl(_no,_name1),   b_tbl(_no,_name2),   update_a_tbl(_no,_name2),   fail. 'a_tbl と b_tbl のコードが一致した場合に a_tbl に、b_tblの名前をセットする'. update_a_tbl(_no,_name2) :-   retract(a_tbl(_no,_)),   assertz(a_tbl(_no,_name2)),   fail. update_a_tbl(_,_). # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/877 # # T_USER T_HOGE T_MAG         T_USER # ID|NUM  ID      MAG             ID|NUM # --|---- --      --             --|---- # A | 100  A      100  .→→→    A | 300 # B | 100  A         update結果  B | 200 # C | 100  B                   C | 100 # # 「T_HOGE.IDがT_USER.IDと一致する数×T_MAG.MAG」の結果を # T_USER.NUMに対し加算するUPDATE文を書きたいのですが # どうすればよいでしょうか。IDはVARCHAR型です。 # DBMSはMySQL 5.1です。 # # '「T_HOGE.IDがT_USER.IDと一致する数×T_MAG.MAG」の結果をT_USER.NUMに対し加算するUPDATE文' :- '「T_HOGE.IDがT_USER.IDと一致する数×T_MAG.MAG」の結果をT_USER.NUMに対し加算するUPDATE文'(_), fail. '「T_HOGE.IDがT_USER.IDと一致する数×T_MAG.MAG」の結果をT_USER.NUMに対し加算するUPDATE文'. '「T_HOGE.IDがT_USER.IDと一致する数×T_MAG.MAG」の結果をT_USER.NUMに対し加算するUPDATE文'(ID) :- 'T_MAG'(MAG), retract('T_USER'(ID,NUM)), count('T_HOGE'(ID),Count), NUM2 is NUM + MAG * Count, assertz('T_USER'(ID,NUM2)). # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/488 # # updateのwhere in句でワイルカードを使いたいのですが、 # mysqlで、 UPDATE table SET col='新しいデータ' where col in ('001古%', '003古%'.) としたのですが、 # 上手く出来ませんでした。 # # どうしたら出来るのでしょうか。 # # % 新しいデータ(新しいデータ). 節の定義順を保って述語を更新したい :- findall(_col,retract(table(_col)),L), append(_,[A|R],L), update_data(A,B), assertz(table(B)), R = [],!. update_data(_col,_新しいデータ) :- sub_atom(_col,0,4,_,'001古'),新しいデータ(_新しいデータ),!. update_data(_col,_新しいデータ) :- sub_atom(_col,0,4,_,'003古'),新しいデータ(_新しいデータ),!. update_data(_col,col). # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/471 # # 【質問テンプレ】 # ・DBMS名とバージョン: SQLite 3 # ・テーブルデータ:長いため下記に記載 # ・欲しい結果:RSSリーダ(brief)のデータ(*.sqlite)から特定の記事データを削除したいです。 # ・説明:長いため下記に記載 # # ●テーブルデータ # ======================================================================================================================= # ■entries #  | id | feedID | primaryHash | secondaryHash | providerID | entryURL | date | read | updated | starred | deleted | bookmarkID | # ----------------------------------------------------------------------------------------------------------------------- # ■entries_text #  | title | content | authors | tags | # ----------------------------------------------------------------------------------------------------------------------- # ■entries_text_content #  | docid | c0title | c1content | c2authors | c3tags | # ----------------------------------------------------------------------------------------------------------------------- # ■sqlite_sequence #  | name | seq | # ======================================================================================================================= # # 1.【entries】テーブルの[deleted]フィールドが「 2 」の場合に、そのレコードを削除。 # # 2.同時に、【entries_text_content】テーブルの[docid]フィールドが、1.で削除した #   [id]フィールドと同じ値のレコードも削除。 # # 3.更に同時に、【entries_textテーブル】から、1.で削除した[idフィールド]の値(数字)と #   同じレコード番号のレコードを削除。 ※idフィールドがない為 # # 4.その後、下記のフィールドの値を、1・2・3〜とリナンバリングしたい。 #   【entries】テーブルの[id]フィールド #   【entries_text_content】テーブルの[docid]フィールド # # 5.そして、1.2.3.の三つのテーブルのレコード数がどれも同じ数だけあるか確認。 # # 6.最後に、【sqlite_sequence】テーブルの[seq]フィールドに5.で確認したレコード数を #   設定したい。 # # お手数ですが、以上よろしくお願いします。 # # '1.【entries】テーブルの[deleted]フィールドが「 2 」の場合に、そのレコードを削除' :- findsetof(_id,( entries(_id,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,_deleted,_bookmarkID)), _deleted = '2'), L1), retract_all(entries(_id,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,'2',_bookmarkID)), findsetof(_docid,( member(_id,L1), entries_text_contents(_docid,_c0title,_c1content,_c2authors,_c3tags)), _docid = _id), L2), '2.同時に、【entries_text_content】テーブルの[docid]フィールドが、1.で削除した[id]フィールドと同じ値のレコードも削除。'(L2), '3.更に同時に、【entries_textテーブル】から、1.で削除した[idフィールド]の値(数字)と同じレコード番号のレコードを削除。'(L1),!. '2.同時に、【entries_text_content】テーブルの[docid]フィールドが、1.で削除した[id]フィールドと同じ値のレコードも削除。'(L2) :- member(_docid,L2), retract_all(entries_text_contents(_docid,_c0title,_c1content,_c2authors,_c3tags)),!. '3.更に同時に、【entries_textテーブル】から、1.で削除した[idフィールド]の値(数字)と同じレコード番号のレコードを削除。'(L1) :- append(_,[Nth|R],L1), 節の定義位置指定による節の削除(L2,Nth), R = [],!. '3.更に同時に、【entries_textテーブル】から、1.で削除した[idフィールド]の値(数字)と同じレコード番号のレコードを削除。'(_). 節の定義位置指定による節の削除(L2,Nth) :- findall((Head :- Body),( clause(entries_text(_title,_content,_authors,_tags),Head,Body)), L2), list_nth(Nth,L2,P), retract(P),!. '4.その後、下記のフィールドの値を、1・2・3〜とリナンバリングしたい。 【entries】テーブルの[id]フィールド 【entries_text_content】テーブルの[docid]フィールド' :- findall(entries(_id,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,_deleted,_bookmarkID),( retract(entries(_id,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,_deleted,_bookmarkID))), L1), append(L01,[entries(_,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,_deleted,_bookmarkID)|R1],L1), length([_|L0],Nth1), assertz(entries(Nth1,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,_deleted,_bookmarkID)), R1 = [], findall(entries_text_contents(_,_c0title,_c1content,_c2authors,_c3tags),( retract(entries_text_contents(_docid,_c0title,_c1content,_c2authors,_c3tags))), L2), append(L02,[entries_text_contents(_,_c0title,_c1content,_c2authors,_c3tags)|R2],L2), length([_|L02],Nth2), assertz(entries_text_contents(Nth2,_c0title,_c1content,_c2authors,_c3tags)), R2 = [],!. '5.そして、1.2.3.の三つのテーブルのレコード数がどれも同じ数だけあるか確認。'(Count) :- count(entries(_id,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,_deleted,_bookmarkID),Count), count(entries_text_contents(_docid,_c0title,_c1content,_c2authors,_c3tags),Count), count(entries_text(_title,_content,_authors,_tags),Count). '6.最後に、【sqlite_sequence】テーブルの[seq]フィールドに5.で確認したレコード数を設定したい。'(Count) :- retract(sqlite_sequence(_name,_seq)), assertz(sqlite_sequence(_name,Count),!. # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/374 # # [1]授業単元:オペレーティングシステム論 # [2]課題:適当な名前の大きさ100Mバイトのバイナリファイルを作成し、内容を乱数バイト配列とする。 # それをクローズし、そのファイルを開き、すべてのビットを反転させた内容に置換する。 # これを10万回繰り返すプログラムを作成し、HD、SSD、USBフラッシュメモリ等のデバイスの差 # 処理時間がどのくらい変わるかテストするプログラムを作成せよ # [3] OS:Windows IDE:Visual studio 2008 言語:C # [4] 6/15まで # [5] ディスクキャッシュが大きいとディスクに短期間では確実に書き込まれるとは限らないので、ファイルを100個作って1000回 # 繰り返すプログラムにしたほうが良い # とのことです。 # コードだけでなく、実行時間もお願いします。 # # '適当な名前の大きさ100Mバイトのバイナリファイルを作成し、内容を乱数バイト配列とする。それをクローズし、そのファイルを開き、すべてのビットを反転させた内容に置換する' :- '適当な名前の大きさ100Mバイトのバイナリファイルを作成し、内容を乱数バイト配列とする'(File,Outstream), それをクローズし(Outstream), 'そのファイルを開き、すべてのビットを反転させた内容に置換する'(File). '適当な名前の大きさ100Mバイトのバイナリファイルを作成し、内容を乱数バイト配列とする'(File,Outstream) :- tmpnam(File), open(File,write,Outstream,[type(binary)]), for(1,N,100000000), Code is random(256), put_byte(Outstream,Code), N = 100000000,!. それをクローズし(Outstream) :- close(Outstream). 'そのファイルを開き、すべてのビットを反転させた内容に置換する'(File) :- open(File,update,Updatestream,[type(binary)]), repeat, ( at_end_of_stream(Updatestream); get_byte(Updatestream,Byte), Byte1 is Byte - 255, put_byte(Updatestream,Byte1), fail ), close(Updatestream). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/478 # # [1] 授業単元:プログラム実行カウンタの作成 # [2] 問題文(含コード&リンク): # log.txtのファイルを利用して、作成したプログラムが何回目の実行かを画面表示するプログラムを作成しなさい # なお、簡単のため、log.txtには初めに0と入力し、保存しておいてもかまわない # 'log.txtのファイルを利用して、作成したプログラムが何回目の実行かを画面表示するプログラムを作成しなさい' :- open('log.txt',update,Updatestream), readln(Updatestream,[N]), N2 is N + 1, write(Updatestream,N2), close(Updatestream),!, writef('このプログラムは%t回目の実行です\n',[N2]),!. # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/411 # # MySQL 5.1.46 # #   ≪item≫ # ───────── # id  name  category # ───────── # 1  Name1   2 # 2  Name2   1 # 3  Name3   1 # 4  Name4   6 # 5  Name5   4 # 6  Name6   8 # 7  Name7   2 # 8  Name8   2 # ───────── # # item 内のデータについて、 category が 2 のものだけ category の値を 7 に振り替えたいと思い # # UPDATE item SET category = 7 WHERE category = 2 # # を発行したのですが、うまく動作しません。 # こういう場合にうまくいく方法を教えてください。 # # 'item 内のデータについて、 category が 2 のものだけ category の値を 7 に振り替えたいと思い' :- 節順序を変更するupdate(item/3,[[3,2]],[[3,7]]). 節順序を変更するupdate(_述語名/_アリティ,_鍵情報ならび,_更新情報ならび,L) :- 節順序を変更するupdate(先頭,_述語名/_アリティ,_鍵情報ならび,_更新情報ならび,L),!. 節順序を変更するupdate(先頭,_述語名/_アリティ,_鍵情報ならび,_更新情報ならび) :- length(L1,_アリティ), 鍵情報を設定する(_鍵情報ならび,L1), _述語 =.. [_述語名|L1], findall(L2,( retract(_述語), 更新情報を設定する(_更新情報ならび,L1,L2)), L), 更新ならびを先頭に付加する(_述語名,L),!. 節順序を変更するupdate(末尾,_述語名/_アリティ,_鍵情報ならび,_更新情報ならび) :- length(L1,_アリティ), 鍵情報を設定する(_鍵情報ならび,L1), _述語 =.. [_述語名|L1], findall(L2,( retract(_述語), 更新情報を設定する(_更新情報ならび,L1,L2)), L), 更新ならびを末尾に付加する(_述語名,L),!. 更新ならびを先頭に付加する(_述語名,L) :- append(_,[L3|R],L), _述語3 =.. [_述語名|L3], asserta(_述語3), R = []. 更新ならびを末尾に付加する(_述語名,L) :- append(_,[L3|R],L), _述語3 =.. [_述語名|L3], assertz(_述語3), R = []. 鍵情報を設定する([],L). 鍵情報を設定する([[_鍵位置,_鍵]|R],L) :- nth1(_鍵位置,L,_鍵), 鍵情報を設定する(R,L). 更新情報を設定する([],L,L). 更新情報を設定する([[_更新位置,_更新値]|R1],L1,L) :- append(L0,[_|R],L1), length([_|L0],_更新位置), append(L0,[_更新値|R],L2), 更新情報を設定する(R1,L2,L). # 出典:: http://hibari.2ch.net/test/read.cgi/db/1316769778/153 # # if select * from t where id=1 # then update t set foo=bar where id=1 # # これをSQLで表現したいのですが可能でしょうか? # # 'if select * from t where id=1 then update t set foo=bar where id=1' :- '1要素のupdate'(t,id1,'1',foo,bar). '1要素のupdate'(_テーブル名,_鍵属性名,_鍵値,_置換属性名,_置換する値) :- 組構造を得る(_テーブル名,_属性名ならび), 鍵値を設定された項を作る(_テーブル名,_属性ならび,_鍵属性名,_鍵値,_現在の組,P), 置換する値を設定された項を作る(_テーブル名,_属性ならび,_置換属性名,_置換する値,_置換する組,_置換する項), retract(_現在の項), '置換される組の変数部分だけ元の値に単一化する'(_現在の組,_置換する組), asserta(_置換する項). 組構造を得る(_テーブル名,_属性名ならび) :- findall([_属性番号,_属性名],( テーブル構造(_テーブル名,_属性番号,_属性名)), L1), sort(L1,L2), findall(_属性名,( member([_,_属性名],L2)), _属性名ならび). 置換する値を設定された項を作る(_テーブル名,_属性ならび,_置換属性名,_置換する値,_置換する組,_置換項) :- 置換する組(_属性名ならび,_置換する組), 置換する値を置換する組に設定(_属性名ならび,_置換属性名,_置換する値,_置換する組), _置換項 =.. [_テーブル名|_置換する組]. 鍵値を設定された項を作る(_テーブル名,_属性ならび,_鍵属性名,_鍵値,_現在の組,_現在の項) :- 現在の組(_属性名ならび,_現在の組), 鍵を現在の組に設定(_属性名ならび,_鍵属性名,_鍵値,_現在の組), _現在の項 =.. [_テーブル名|_現在の組]. 現在の組(_属性名ならび,_現在の組) :- length(_属性名ならび,Len), length(_現在の組,Len). 置換する組(_属性名ならび,_置換する組) :- length(_属性名ならび,Len), length(_置換する組,Len). 鍵を現在の組に設定(_属性名ならび,_鍵名,_鍵値,_現在の組) :- nth1(_鍵属性名の位置,_属性名ならび,_鍵属性名), nth1(_鍵属性名の位置,_現在の組,_鍵値),!. 置換する値を置換する組に設定(_属性名ならび,_置換属性名,_置換する値,_置換する組) :- nth1(_置換属性名の位置,_属性名ならび,_鍵属性名), nth1(_鍵属性名の位置,_置換する組,_鍵値),!. '置換する組の変数部分だけ元の値に単一化する'([],[]). '置換する組の変数部分だけ元の値に単一化する'([A|R1],[A|R2]) :- '置換する組の変数部分だけ元の値に単一化する'(R1,R2). '置換する組の変数部分だけ元の値に単一化する'([A|R1],[B|R2]) :- \+(A = B), '置換する組の変数部分だけ元の値に単一化する'(R1,R2). # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/666 # # SQLite3を使っています。 # # カラムがなかったらinsert # あったらupdateしたいのですが、 # どういうSQLをかけばいいのでしょうか? # # insert into t1(c1, c2) values("hoge",10) # update t1 set c2=10 WHERE c1="hoge" # このときc1はuniqueです。 # # よろしくお願いします。 # # 'カラムがなかったらinsert あったらupdateしたい'(_テーブル,_カラムならび,_鍵カラム,_鍵値) :- findall(_カラム,( テーブル定義(_テーブル,_番目,_カラム)), L1), 鍵値をセットする(_テーブル,_鍵カラム,_鍵値,P), 'カラムがなかったらinsert あったらupdateしたい'(P,_テーブル,_カラムならび). 鍵値をセットする(_テーブル,L1,_鍵カラム,_鍵値,P) :- length(L1,Len), length(L2,Len), nth1(Nth,L1,_鍵カラム), nth1(Nth,L2,_鍵値), P =.. [_テーブル|L2]. 'カラムがなかったらinsert あったらupdateしたい'(P,_テーブル,_カラムならび) :- call(P),!, ( retract(P), Q =.. [_テーブル|_カラムならび], asserta(Q), fail; true). 'カラムがなかったらinsert あったらupdateしたい'(_,_テーブル,_カラムならび) :- Q =.. [_テーブル|_カラムならび], asserta(Q). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/996 # # [1] 授業単元: c言語 # [2] 問題文(含コード&リンク): http://ime.nu/codepad.org/30Mz7Pbj # このプログラムで何番目の値段をかえるではなく # 名前を聞かれてその名前の値段をかえるプログラムにする。 # # #include # #include # main() # { # struct goods{ # char name[20]; # char price[5]; # }record; # FILE *fp; # int max,size,num; # long top,end,locat,ftell(); # fp=fopen("file1","r+"); # if(fp==NULL){ # printf("open error"); # exit(1); # } # size=sizeof(record); # fseek(fp,0L,2); # end=ftell(fp); # fseek(fp,0L,0); # top=ftell(fp); # max=(end-top)/size; # do{ # printf("rec no?\n"); # scanf("%d",&num); # }while(num<1||num>max); # locat=size*(num-1); # fseek(fp,locat,0); # fread(&record,size,1,fp); # printf("name=%s price=%s\n" # ,record.name,record.price); # printf("Current price\t:%s\n",record.price); # printf("New price?\t:"); # scanf("%s",record.price); # fseek(fp,-size,1); # fwrite(&record,size,1,fp); # fclose(fp); # printf("update....ended\n"); # } 'ファイル内の名前を鍵に指定して値段をかえる'(_ファイル名,_更新対象氏名,_値段) :- 更新対象氏名の末尾に空白を埋める(_更新対象氏名,_末尾に空白を埋めた更新対象氏名), 値段の末尾に空白を埋める(_更新対象氏名,_末尾に空白を埋めた値段), open(_ファイル名,update,InOuttream), '名前を指定して値段をかえる'(InOutstream,_末尾に空白を埋めた対象氏名,_末尾に空白を埋めた値段), close(InOututstream). 更新対象氏名の末尾に空白を埋める(_更新対象氏名,_末尾に空白を埋めた更新対象氏名) :- length(L,20), atom_chars(_更新対象氏名,Chars), append(Chars,L2,L), all(L2,' '), atom_chars(_末尾に空白を埋めた更新対象氏名,L). 値段の末尾に空白を埋める(_値段,_末尾に空白を埋めた値段) :- length(L,5), number_chars(_値段,Chars), append(Chars,L2,L), all(L2,' '), atom_chars(_末尾に空白を埋めた値段,L). '名前を指定して値段をかえる'(InOutstream,_,_) :- at_end_of_stream(InOutstream),!. '名前を指定して値段をかえる'(InOutstream,_更新対象氏名,_値段) :- 氏名を読み更新する(InOutstream,_更新対象氏名,_値段), 価格を更新する(InOutstream), '名前を指定して値段をかえる'(InOutstream,_更新対象氏名,_値段). 氏名を読み更新する(InOutstream,_更新対象氏名,_値段) :- findall(_文字,( between(1,20,N), get_char(InOutstream,_文字)), L), 更新対象氏名の時は価格も更新する(InOutstream,_更新対象氏名,_値段). 更新対象氏名の時は価格も更新する(InOutstream,L,_更新対象氏名,_値段) :- atom_chars(_更新対象氏名,L), writef(InOutstream,'%t',[_更新対象氏名]), 価格を更新する(InOutstream,_値段). 更新対象氏名の時は価格も更新する(InOutstream,L,_更新対象氏名,_値段) :- \+(atom_chars(_更新対象氏名,L)), 価格をそのまま書く(InOutstream). 価格を更新する(InOutstream,_値段) :- writef(InOutstream,'%t',[_値段]). all([],_). all([A|R],A) :- all(R,A). # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/787 # # id5とid10という2つの情報しかないのですが # id5がもつc1とid10がもつc1を交換するとき # どういうクエリーをかけばよいでしょうか? # # 1.select c1 from t where id=5 or id=10 order by id # 2.begin transaction # 3.update t set c1=? where id=5 (?は1でとったid10のc1値) # 4.update t set c1=? where id=10 (?は1でとったid5のc1値) # 5.commit # # 自分の能力ではこんな手順が限界ですが # サブクエリーを駆使したらupdate1文でいけたりするのでしょうか? # もしできたらどんな感じの文になるか教えていただきたいです # 'id5とid10という2つの情報しかないのですがid5がもつc1とid10がもつc1を交換する' :- '引数の数,c1の位置,idの位置'(_引数の数,_c1の位置,_idの位置), idが5の処理(_引数の数,_c1の位置,_idの位置), idが10の処理(_引数の数,_c1の位置,_idの位置), 交換する(L0_1,L0_2,R1,R2). '引数の数,c1の位置,idの位置'(_引数の数,_c1の位置,_idの位置) :- findmax(_位置,( テーブル定義(t,_位置,_), _引数の数), テーブル定義(t,_c1の位置,c1), テーブル定義(t,_idの位置,id). idが5の処理(_引数の数,_c1の位置,_idの位置,L0_1,R1) :- 'idが5のデータを一旦削除する'(_引数の数,_c1の位置,_idの位置,L1), 'L1をc1の前と後に分解'(L1,L0_1,R1). idが5のデータを一旦削除する(_引数の数,_c1の位置,_idの位置,L1) :- length(L1,_引数の数), P =.. [t|L1], nth1(_c1の位置,L1,_c1_1), nth1(_idの位置,L1,5), retract(P). idが10の処理(_引数の数,_c1の位置,_idの位置,L0_2,R2) :- idが10のデータを一旦削除する(_引数の数,_c1の位置,_idの位置,L2), 'L1をc1の前と後に分解'(L2,L0_2,R2). idが10のデータを一旦削除する(_引数の数,_c1の位置,_idの位置,L2) :- length(L2,_引数の数), P =.. [t|L2], nth1(_c1の位置,L2,_c1_2), nth1(_idの位置,L2,10), retract(P). 'L1をc1の前と後に分解'(L1,L0_1,R1) :- length([_|L0_1],_c1の位置), append(L0_1,[A|R1],L1). 交換して定義する(L0_1,L0_2,R1,R2) :- append(L0_1,[B|R1],L1), append(L0_2,[A|R2],L2), P_1 =.. [t|L1], P_2 =.. [t|L2], asserta(P_1), asserta(P_2). # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/598 # # mysql 5.5 # # テーブル master # tcode # tname # lastdate # 〜 # # daily_data # select tcode,max(tdate) as maxdate # from daily_date # group by tcode; # # このdaily_dateから得られるmaxdateを使って # masterのtcodeの対応するlastdateに入れたいのですが、 # どのようにupdateを書けば良いのでしょうか? # 'daily_dateから得られるmaxdateを使ってmasterのtcodeの対応するlastdateに入れたい' :- dail_dateテーブルの構造(P1,_daily_date_tcode,_date), masterテーブルの構造(P2,_master_tcode,_lastdate), findsetof(_tcode,P1,L1), 最大日付に変更する(L1,P1,P2,_daily_date_tcode,_date,_master_tcode,_lastdate),!. daily_dateテーブルの構造(P,_tcode,_date) :- count(テーブル定義(daily_date,_,_),_アリティ), length(L,_アリティ), P =.. [daily_date|L], tcodeとdateの列位置を確定する(L,_tcode,_date),!. tcodeとdateの列位置を確定する(L,_tcode,_date),!. テーブル定義(daily_date,_nth1_tcode,tcode), テーブル定義(daily_date,_nth1_date,date), nth1(_nth1_tcode,L,_tcode), nth1(_nth1_date,L,_date),!. masterテーブルの構造(P,_tcode,_date) :- count(テーブル定義(master,_,_),_アリティ), length(L,_アリティ), P =.. [master|L], tcodeとlastdateの列位置を確定する(L,_tcode,_lastdate),!. tcodeとlastdateの列位置を確定する(L,_tcode,_date),!. テーブル定義(master,_nth1_tcode,tcode), テーブル定義(master,_nth1_lastdate,lastdate), nth1(_nth1_tcode,L,_tcode), nth1(_nth1_date,L,_lastdate),!. 最大日付に変更する(L1,P1,P2,_daily_date_tcode,_date,_master_tcode,_lastdate) :- forall(( member(_tcode,L1), findmax(_date,P1,_maxdate), lastdateの更新(_maxdate,P2,_tcode,_lastdate)), true). lastdateの更新(_maxdate,P,_tcode,_lastdate) :- retract(P), _lastdate = _maxdate, asserta(P),!. lastdateの更新(_maxdate,P,_tcode,_lastdate) :- _lastdate = _maxdate, asserta(P),!. # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/635 # # 質問です、お願いします # id|col1|col2 という構成のテーブルがあります # # これに対して、以下のような条件と動作を実現したいと思います # 1)更新できるのはcol2が0の場合のみ # 2)更新できた場合、'updated'を返す # 3)もし、col2が0以外の場合、'update_fail' という値を返す # # どんなクエリ文を書いたら良いんでしょうか # (利用してるDBはmysql5です) # # 'id|col1|col2 という構成のテーブルがあります これに対して、以下のような条件と動作を実現したいと思います 1)更新できるのはcol2が0の場合のみ 2)更新できた場合、\'updated\'を返す 3)もし、col2が0以外の場合、\'update_fail\' という値を返す どんなクエリ文を書いたら良いんでしょうか'(_id,_新しい_col1,_新しい_col2) :- クエリ文(_id,_新しい_col1,_新しい_col2). クエリ文(_id,_新しい_col1,_新しい_col2) :- '更新できるのはcol2が0の場合のみそれ以外は\'update_fail\'を返す'(_id),!. クエリ文(_id,_新しい_col1,_新しい_col2) :- '更新できた場合、\'updated\'を返す'(_id,_新しい_col1,_新しい_col2),!. クエリ文(_id,_新しい_col1,_新しい_col2) :- 'idが存在しない場合、\'update_fail not found id\'を返す'(_id). '更新できるのはcol2が0の場合のみそれ以外は\'update_fail\'を返す'(_id) :- table(_id,_col1,_col2), \+(_col2 = 0), writef('update_fail :: table(%q,%q,%q).\n',[_id,_col1,_col2]),!. '更新できた場合、\'updated\'を返す'(_id,_新しい_col1,_新しい_col2) :- retract(table(_id,_col1,0)), asserta(table(_id,_新しい_col1,_新しい_col2)), writef('updated :: table(%q,%q,%q).\n',[_id,_新しい_col1,_新しい_col2]),!. 'idが存在しない場合、\'update_fail not found id\'を返す'(_id) :- writef('update_fail not found id :: %q\n',[_id]). # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/662 # # 1つのupdate文に set と条件 の組を複数指定できませんか。 # update table_foo # set x = new1 where x = old1, # set y = new2 where y = old2, # set z = new3 where y = old3 # みたいなことがしたい。 # # :- dynamic(table_foo/3). '1つのupdate文に set と条件 の組を複数指定できませんか。 update table_foo set x = new1 where x = old1, set y = new2 where y = old2, set z = new3 where y = old3 みたいなことがしたい。'(_x_1,_y_1,_z_1,_old1,_old2,_old3,_new1,_new2,_new3) :- retract(table_foo(_x_1,_y_1,_z_1)), 更新_1(_x_1,_y_1,_z_1,_old1,_old2,_old3,_new1,_new2,_new3,_x,_y,_z). assertz(table_foo(_x,_y,_z)). 更新_1(_old1,_y_1,_z_1,_old1,_old2,_old3,_new1,_new2,_new3,_x,_y,_z) :- 更新_2(_new1,_y_1,_z_1,_old1,_old2,_old3,_new1,_new2,_new3,_x,_y,_z),!. 更新_1(_x_1,_y_1,_z_1,_,_old2,_old3,_,_new2,_new3,_x,_y,_z) :- 更新_2(_x_1,_y_1,_z_1,_,_old2,_old3,_,_new2,_new3,_x,_y,_z). 更新_2(_x,_old2,_z_1,_,_old2,_old3,_,_new2,_new3,_x,_y,_z) :- 更新_3(_x,_new2,_z_1,_,_,_old3,_,_,_new3,_x,_y,_z),!. 更新_2(_x,_y,_z_1,_,_,_old3,_,_,_new3,_x,_y,_z) :- 更新_3(_x,_y,_z_1,_,_,_old3,_,_,_new3,_x,_y,_z). 更新_3(_x,_y,_old3,_,_,_old3,_,_,_new3,_x,_y,_new3) :- !. 更新_3(_x,_y,_z,_,_,_,_,_,_,_x,_y,_z). % 以下のサイトは 250 ToastXToast 要約  何種類かのパンがあり,種類ごとにちょうどよい焼き時間が決まっている.その焼き時間より短ければ生焼けで,長ければ焦げてしまう.またどの種類のパンかは見た目にはわからない.生焼けのパンと焦げたパンがいくつか与えられていて.それぞれのパンの焼いた時間がわかっている.また,それぞれの種類で生焼けのパンと焦げたパンが少なくとも1枚ずつある事もわかっている.パンの種類として考えられるもののうち最小値を求めよ.  生焼けのパンの数と焦げたパンの数は1以上50以下,それぞれのパンの焼いた時間は1以上1000000以下.同じ時間だけ焼いたパンは2枚以上存在しない事は保証されている. 方針 生焼けのパンを○,焦げたパンを●で表し,焼き時間を横軸で表すと,一般的な状況では ○○ー○○○○○○ーーーー○○ーー○ー○○○ーー ーー●ーーーーーー●●●●ーー●●ー●ーーー●● の用になっている.この場合, ○○ー○○○○○○ーーーー○○ーー○ー○○○ーー ーーーーーーーーーーーーーーーーーーーーーー●● と ○○ーーーーーーーーーーーーーーーーーーーーーー ーー●ーーーーーー●●●●ーー●●ー●ーーーーー とわけることができ,答えは2種類とわかる.あとはこの状況にならないのはいつかを考えればよい. コード例 #include #include #include #include #include using namespace std; class ToastXToast { public: int bake(vector under, vector over) { sort(under.begin(), under.end()); sort(over.begin(), over.end()); if(over[0] <= under[0] ) return -1; if(under[under.size()-1] >= over[over.size()-1]) return -1; if(over[0] > under[under.size()-1]) return 1; else return 2; } }; 500 KingdomXCitiesandVillage 要約  座標平面上の格子点に町がいくつかと村がいくつか配置されている.次のアルゴリズムで,すべての村をいずれかの町と道路でつなぐ. はじめ,すべての村は町につながっていない 町につながっていない村をランダムに一つ選ぶ (それを sv(selected village) とする) 町 or「既に町につながっている村」のなかで sv に(ユークリッド距離で)最も近いものを選び,その2つを道路でつなぐ.最も近いものが複数ある場合はランダムに選ぶ. sv を「既に町につながっている村」に昇格させる. これをすべての村がつながるまで繰り返す.  道路の総距離の期待値を答えよ.町と村の数はそれぞれ1以上50以下,それぞれの町,村の座標は0以上1000000以下.同じ箇所に複数の町や村はない事は保証されている. 方針  まず期待値の加法性から,各々の村から延ばす道路の距離の期待値を合計すればよいので,一つの村に注目する(以降その村をvとし,その村から最も近い町をcとする).v とつながる可能性のある村は,v との距離が vc 間より短いもののみである.まずそれだけを取り出し v との距離が短い順に v[1], v[2], ・・・, v[k] とする.v と c がつながるのは,v が v[1], v[2], ・・・v[k] のいずれよりも先に選ばれたときなので,その確率は 1/(k+1).v と v[j] がつながるのは「 v[j]が vより先に選ばれ,かつvが v[1], v[2], ・・・, v[j-1]より先に選ばれる」ときである(前者が満たされないとv[j]は村とつながっていないのでそもそも候補に入らず,また後者が満たされないとvはv[1]・・・v[j-1]のいずれかとつながってしまう).v[j+1]・・・v[k]には制限がないので考慮しなくても良い.j+1個の球を横一列に並べる事を考えると,条件を満たすのは最左にv[j], その隣に v ,残りj-1個にv[1]・・・v[j-1]を自由に並べかえるものなので,その場合の数は(j - 1)!,全事象は(j + 1)! なので,求める確率は(j-1)! / (j+1)! = 1/ ( j * (j + 1) ) . #include #include #include #include #include #include using namespace std; typedef long long ll; ll dist2(int ax, int ay, int bx, int by){ return (ll)(ax - bx) * (ax - bx) + (ll)(ay - by) * (ay - by) ; } class KingdomXCitiesandVillages { public: double determineLength(vector cx, vector cy, vector vx, vector vy) { int n = cx.size(); int m = vx.size(); double ans = 0; for(int i = 0;i kouho; for(int j = 0;j% 以下のサイトは ペア数の実装(0,0). ペア数の実装(X,Y) :- nth1(N,_,_), 'Nを1から増加しながら0-Nの内2要素を取り2項の合計がNであるような重複順列を生成'(N,X,Y). 'Nを1から増加しながら0-Nの内2要素を取り2項の合計がNであるような重複順列を生成'(N,X,Y) :- findall(M,between(0,N,M),L), 重複順列(L,2,[X,Y]), N is X + Y. 重複順列(L,0,[]). 重複順列(L,N,[A|R3]) :- N > 0, member(A,L), N_1 is N - 1, 重複順列(L,N_1,R3). % 以下のサイトは 親(為義). 親(頼朝). 親(範頼). 子(頼朝). 子(範頼). 子(公暁). 親子テーブル候補(_親子テーブル候補) :- 属性集合である親と子の直積上の部分集合候補(_親子テーブル候補). 属性集合である親と子の直積上の部分集合候補(_親子テーブル候補) :- 属性集合である親と子の直積上の(_属性集合_親_と_属性集合_子の直積), 部分集合候補(_属性集合_親_と_属性集合_子の直積,_親子テーブル候補). 属性集合である親と子の直積上の(_親と子の直積) :- 属性集合_親(_属性集合_親), 属性集合_子(_属性集合_子), 直積([_属性集合_親,_属性集合_子],_親と子の直積). 属性集合_親(_属性集合_親) :- setof(_親,親(_親),_属性集合_親). 属性集合_子(_属性集合_子) :- setof(_子,子(_子),_属性集合_子). 直積(_集合ならび,_直積集合) :- member項の生成(_集合ならび,_member項,_要素変数ならび), findall(_要素変数ならび,_member項,_直積集合). member項の生成([_集合],member(_要素変数,_集合),[_要素変数]). member項の生成([_集合|R1],(member(_要素変数,_集合),U),[_要素変数|R2]) :- member項の生成(R1,U,R2). 冪集合(_集合,_冪集合) :- findall(L,部分集合(_集合,L),_冪集合). 部分集合(_,[]). 部分集合(A,B) :- length(A,C), between(1,C,D), 組合せ(A,D,B) . 組合せ(X,1,[A]) :- member(A,X). 組合せ([A|Y],N,[A|X]) :- N > 1, M is N - 1, 組合せ(Y,M,X). 組合せ([_|Y],N,A) :- N > 1, 組合せ(Y,N,A). 部分集合候補(_属性集合_親_と_属性集合_子の直積,_親子テーブル候補) :- 冪集合(_属性集合_親_と_属性集合_子の直積,_冪集合), member(_親子テーブル候補,_冪集合). % 以下のサイトは % [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(_点数の定義文,['=',',',';'],[_|_点数ならび]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1295436346/173 # # 質問させてください # selectしたデータを一部だけ別のテーブルに入れる方法ってありますか? # # 例:insert into table2 (aaa,bbb,ccc) select aaa as aaa,bbb as bbb,ccc as ccc from table1 # この場合table1のデータがすべてtable2に入るのでaaaだけ別のデータを入れたいと思っています。 # よろしくお願いします。 # # 海に接していない都道府県名([栃木県,群馬県,埼玉県,山梨県,長野県,岐阜県,滋賀県,奈良県]). table1(奈良県,1000,aa). table1(埼玉県,2000,ab). selectしたデータを一部だけ別のテーブルに入れる方法 :- 海に接していない都道府県名(_海に接していない都道府県名ならび), table1(_都道府県名の一,_bbb,_ccc), 新しい都道府県名の生成(_海に接していない都道府県名ならび,_都道府県名の一,_都道府県名の二), assertz(table2(_都道府県名の二,_bbb,_ccc)), fail. selectしたデータを一部だけ別のテーブルに入れる方法. 新しい都道府県名の生成(_海に接していない都道府県名ならび,_都道府県名の一,_都道府県名の二) :- M is (random mod 8) + 1, list_nth(M,_海に接していない道府県名ならび,_都道府県名の二), \+(_都道府県名の一 = _都道府県名の二), \+(table2(_都道府県名の二,_,_)). 新しい都道府県名の生成(_海に接していない都道府県名ならび,_都道府県名の一,_都道府県名の二) :- 新しい都道府県名の生成(_海に接していない都道府県名ならび,_都道府県名の一,_都道府県名の二). ?- 'a##'. # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/584 # # MySQL 5.5.19 . 長くなりますので # テーブルの定義・内容と欲しい結果はここに # http://ime.nu/codepad.org/oe1jhVrF # # で、 # # create table a_tbl( # code int(9) not null, # input_date date not null, # data1 double(9,2) unsigned default 0 not null, # data2 double(9,2) unsigned default 0 not null, # primary key(code,input_date) # ) ; # # insert into a_tbl # values # (1111,'2012-02-01',10,12), # (1111,'2012-02-02',133,14), # (1111,'2012-02-04',13,15), # (1111,'2012-02-06',13,10); # # create table b_tbl( # code varchar(10) not null, # input_date date not null, # data1 double(9,2) unsigned default 0 not null, # data2 double(9,2) unsigned default 0 not null, # primary key(code,input_date) # ) ; # # insert into b_tbl # values # ('ddd','2012-02-01',122,13), # ('ddd','2012-02-03',127,18), # ('ddd','2012-02-04',11,14), # ('ddd','2012-02-05',16,95), # ('ddd','2012-02-06',13,10); # # 欲しい結果 # input_date a.data1 a.data2 b.data2 # 2012-02-01 10 12 13 # 2012-02-02 133 14 null # 2012-02-03 null null 18 # 2012-02-04 13 15 14 # 2012-02-05 null null 95 # 2012-02-06 13 10 10 # # # select a.input_date,b.input_date,a.data1,a.data2,b.data2 # from a_tbl a # right join b_tbl b # on a.input_date = b.input_date; とすると、結果が # +------------+------------+-------+-------+-------+ # | input_date | input_date | data1 | data2 | data2 | # +------------+------------+-------+-------+-------+ # | 2012-02-01 | 2012-02-01 | 10 | 12 | 13 | # | NULL | 2012-02-03 | NULL | NULL | 18 | # | 2012-02-04 | 2012-02-04 | 13 | 15 | 14 | # | NULL | 2012-02-05 | NULL | NULL | 95 | # | 2012-02-06 | 2012-02-06 | 13 | 10 | 10 | # +------------+------------+-------+-------+-------+ # なんですが、実際にはいろんなコードが入っているので、コードも抽出条件に入れたら # select a.input_date,b.input_date,a.data1,a.data2,b.data2 # from a_tbl a # right join b_tbl b # on a.input_date = b.input_date # where # a.code=1111 and b.code='ddd'; # +------------+------------+-------+-------+-------+ # | input_date | input_date | data1 | data2 | data2 | # +------------+------------+-------+-------+-------+ # | 2012-02-01 | 2012-02-01 | 10 | 12 | 13 | # | 2012-02-04 | 2012-02-04 | 13 | 15 | 14 | # | 2012-02-06 | 2012-02-06 | 13 | 10 | 10 | # +------------+------------+-------+-------+-------+ # になってしまいました。 # コードを抽出条件に入れた状態で望ましい結果または上の方の結果になるようなSQLを教えて下さい。 # 'input_dateの集合を得る'(_input_dateの集合) :- findall(_input_date,a_tbl(_input_date,_,_),L1), findall(_input_date,b_tbl(_input_date,_,_),L2), append(L1,L2,L3), setof(_input_date,member(_input_date,L3),_input_dateの集合). 抽出(_input_date,_tbl_aのdata1ならび,_tbl_aのdata2ならび,_tbl_bのdata2ならび) :- 'input_dateの集合を得る'(_input_dateの集合), member(_input_date,_input_dateの集合), findall([_data1],tbl_a(_,_input_date,_data1,_),_tbl_aのdata1ならび), findall([_data2],tbl_a(_,_input_date,_,_data2),_tbl_aのdata2ならび), findall([_data2],tbl_b(_,_input_date,_,_data2),_tbl_bのdata2ならび). # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/633 # # MySQL 5.1です。 # # create table staff_list( # staff_id int(5) primary key //社員番号 # staff_name varchar(8) //社員名 # unit varchar(8) primary key //部署名 # ) # # insert into staff_list (staff_id,staff_name,unit) values # (1,'範馬','総務'), # (2,'愚地','総務'), # (3,'花山','総務'), # (1,'高津','企画'), # (2,'池谷','企画'), # (3,'長嶋','企画'), # (1,'鳩山','営業'), # (2,'野田','営業'), # (3,'小沢','営業'), # (4,'枝野','営業') # # # # このようなテーブルに対してSELECTをかける際、一度のクエリーで # 部署別にソートしたうえで、総務だけstaff_id降順で他を昇順で出したいと思っています。 # # order by unit,IF(staff_name='総務',staff_id desc,staff_id asc) # などと試行してみているのですがうまくできません。 # # どなたかうまい方法をご存じないでしょうか。 # # よろしくお願いいたします。 # スタッフリスト(1,範馬,総務). スタッフリスト(2,愚地,総務). スタッフリスト(3,花山,総務). スタッフリスト(1,高津,企画). スタッフリスト(2,池谷,企画). スタッフリスト(3,長嶋,企画). スタッフリスト(1,鳩山,営業). スタッフリスト(2,野田,営業). スタッフリスト(3,小沢,営業). スタッフリスト(4,枝野,営業). 'このようなテーブルを選択する際、一度部署別にソートしたうえで、総務だけ社員番号降順で出したいと思っています。'(_部署名,_社員番号,_社員名) :- 一度部署別にソートしたうえで(_部署名ならび), 総務だけ社員番号降順で出したい(_部署名ならび,_部署名,_社員番号,_社員名). 一度部署別にソートしたうえで(_部署名ならび) :- findsetof(_部署名,( スタッフリスト(_社員番号,_社員名,_部署名)), _部署名ならび). 総務だけ社員番号降順で出したい(_部署名ならび,_部署名,_社員番号,_社員名) :- member(_部署名,_部署名ならび), 総務だけ社員番号降順で出したい(_部署名,_社員番号,_社員名). 総務だけ社員番号降順で出したい(総務,_社員番号,_社員名) :- 総務だけ社員番号降順で(_社員番号,_社員名). 総務だけ社員番号降順で出したい(_部署名,_社員番号,_社員名) :- \+(_部署名 == 総務), スタッフリスト(_社員番号,_社員名,_部署名). 総務だけ社員番号降順で(_社員番号,_社員名) :- findall([_社員番号,_社員名],( スタッフリスト(_社員番号,_社員名,総務)), L1), 降順でソート(L1,L2), member([社員番号,_社員名],L2). 降順でソート(L1,L2) :- sort(L1,L3), reverse(L3,L2). % % findsetof/3 % # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/666 # # SQLite3を使っています。 # # カラムがなかったらinsert # あったらupdateしたいのですが、 # どういうSQLをかけばいいのでしょうか? # # insert into t1(c1, c2) values("hoge",10) # update t1 set c2=10 WHERE c1="hoge" # このときc1はuniqueです。 # # よろしくお願いします。 # # 'カラムがなかったらinsert あったらupdateしたい'(_テーブル,_カラムならび,_鍵カラム,_鍵値) :- findall(_カラム,( テーブル定義(_テーブル,_番目,_カラム)), L1), 鍵値をセットする(_テーブル,_鍵カラム,_鍵値,P), 'カラムがなかったらinsert あったらupdateしたい'(P,_テーブル,_カラムならび). 鍵値をセットする(_テーブル,L1,_鍵カラム,_鍵値,P) :- length(L1,Len), length(L2,Len), nth1(Nth,L1,_鍵カラム), nth1(Nth,L2,_鍵値), P =.. [_テーブル|L2]. 'カラムがなかったらinsert あったらupdateしたい'(P,_テーブル,_カラムならび) :- call(P),!, ( retract(P), Q =.. [_テーブル|_カラムならび], asserta(Q), fail; true). 'カラムがなかったらinsert あったらupdateしたい'(_,_テーブル,_カラムならび) :- Q =.. [_テーブル|_カラムならび], asserta(Q). # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/684 # # ・DBMS名とバージョン # Oracle 10g # ・テーブルデーた # create table aaa ( # id number(5,0) primary key, -- 主キー # nendo char(4), -- 年度 # tsuki char(2) -- 月 # ); # insert into aaa values (1, '2012', '01'); # insert into aaa values (2, '2012', '02'); # insert into aaa values (3, '2012', '03'); # insert into aaa values (4, '2012', '04'); # insert into aaa values (5, '2012', '05'); # ・欲しい結果 # id, nendo, tsuki # -------------------- # 4, '2012', '04' # 5, '2012', '05, # 1, '2012', '01' # 2, '2012', '02' # 3, '2012', '03' # # ・説明 # 年度/月の昇順に並べたいです。 # 2012年度3月は2013年3月、2012年度4月は2012年4月となるのでただの大小比較では無理でした。 # '・テーブルデータ create table aaa ( id number(5,0) primary key, -- 主キー nendo char(4), -- 年度 tsuki char(2) -- 月 ); insert into aaa values (1, '2012', '01'); insert into aaa values (2, '2012', '02'); insert into aaa values (3, '2012', '03'); insert into aaa values (4, '2012', '04'); insert into aaa values (5, '2012', '05'); ・欲しい結果 id, nendo, tsuki -------------------- 4, '2012', '04' 5, '2012', '05, 1, '2012', '01' 2, '2012', '02' 3, '2012', '03' ・説明 年度/月の昇順に並べたいです。 2012年度3月は2013年3月、2012年度4月は2012年4月となるのでただの大小比較では無理でした。'(_id,_年度,_月) :- 欲しい結果(_id,_年度,_月). 年度の場合の月順('04','05'). 年度の場合の月順('05','06'). 年度の場合の月順('06','07'). 年度の場合の月順('07','08'). 年度の場合の月順('08','09'). 年度の場合の月順('09','10'). 年度の場合の月順('10','11'). 年度の場合の月順('11','12'). 年度の場合の月順('12','01'). 年度の場合の月順('01','02'). 年度の場合の月順('02','03'). 年度の場合の月順('03','04'). 欲しい結果(_id,_年度,_月) :- findsetof(_年度,aaa(_,_年度,_),_年度ならび), member(_年度,_年度ならび), 年度順に並べる('04',_id,_年度,_月). 年度順に並べる(_月,_id,_年度,_月) :- aaa(_id,_年度,_月). 年度順に並べる(_月_1,_id,_年度,_月) :- \+(_月_1 = '03'), 年度の場合の月順(_月,_次の月), 年度順に並べる(_次の月,_id,_年度,_月). # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/684 # # ・DBMS名とバージョン # Oracle 10g # ・テーブルデーた # create table aaa ( # id number(5,0) primary key, -- 主キー # nendo char(4), -- 年度 # tsuki char(2) -- 月 # ); # insert into aaa values (1, '2012', '01'); # insert into aaa values (2, '2012', '02'); # insert into aaa values (3, '2012', '03'); # insert into aaa values (4, '2012', '04'); # insert into aaa values (5, '2012', '05'); # ・欲しい結果 # id, nendo, tsuki # -------------------- # 4, '2012', '04' # 5, '2012', '05, # 1, '2012', '01' # 2, '2012', '02' # 3, '2012', '03' # # ・説明 # 年度/月の昇順に並べたいです。 # 2012年度3月は2013年3月、2012年度4月は2012年4月となるのでただの大小比較では無理でした。 # '・テーブルデータ create table aaa ( id number(5,0) primary key, -- 主キー nendo char(4), -- 年度 tsuki char(2) -- 月 ); insert into aaa values (1, '2012', '01'); insert into aaa values (2, '2012', '02'); insert into aaa values (3, '2012', '03'); insert into aaa values (4, '2012', '04'); insert into aaa values (5, '2012', '05'); ・欲しい結果 id, nendo, tsuki -------------------- 4, '2012', '04' 5, '2012', '05, 1, '2012', '01' 2, '2012', '02' 3, '2012', '03' ・説明 年度/月の昇順に並べたいです。 2012年度3月は2013年3月、2012年度4月は2012年4月となるのでただの大小比較では無理でした。'(_id,_年度,_月) :- 欲しい結果(_id,_年度,_月). 欲しい結果(_id,_年度,_月) :- findsetof(_年度,aaa(_,_年度,_),_年度ならび), member(_年度,_年度ならび), 年度順に並べる(['04','05','06','07','08','09','10','11','12','01','02','03'],_id,_年度,_月). 年度順に並べる([_月|R],_id,_年度,_月) :- aaa(_id,_年度,_月). 年度順に並べる([_|R],_id,_年度,_月) :- 年度順に並べる(R,_id,_年度,_月). # 質問です。 # MySQL5です。 # テーブルデータはDATE(YYYYMMの6けたのint型),CODE(varchar型),VALUE(varchar型) の3カラムからなります。 # 各日付順の降順にしたいのですが、スレッドのように、同じコードの場合、その下に日付順でソートしたいです。 # 言っていることが、よくわからなくてすみません。 # # 元テーブル # DATE, CODE, VALUE # .... # 20140401, 11, A # 20140402, 12, B # 20140403, 11, C # 20140404, 13, D # 20140405, 12, E # 20140406, 11, F # .... # # 欲しい結果 # 20140401, 11, A # 20140403, 11, C # 20140406, 11, F # 20140402, 12, B # 20140405, 12, E # 20140404, 13, D # # 宜しくお願い致します。 # # # 879 名前:NAME IS NULL [sage]: 2014/04/25(金) 17:41:21.67 ID:??? # >>877 # どうも質問が明確じゃないけど、 # insert into tname select 〜 # の形式にすればとりあえず解決しそうな話に見える。 # # >>878 # order by code, date ということ? # # # 880 名前:NAME IS NULL []: 2014/04/25(金) 17:47:38.30 ID:+Fb19Efw (3) # 879 # 分かりずらい # 欲しい結果にしてしまいました。 # # 第1キーは、日付です。 # # 元テーブル # DATE, CODE, VALUE # 20140401, 13, A # 20140402, 11, B # 20140403, 12, C # 20140404, 13, D # 20140405, 12, E # 20140406, 11, F # # 欲しい結果 # 20140401, 13, A # 20140404, 13, D # 20140402, 11, B # 20140406, 11, F # 20140403, 12, C # 20140405, 12, E # # 宜しくお願い致します。 # # # 要するに第一キーは降順、第二キーは昇順で整列する。 # 'テーブルデータはDATE(YYYYMMの6けたのint型),CODE(varchar型),VALUE(varchar型) の3カラムからなります。各日付順の降順にしたいのですが、スレッドのように、同じコードの場合、その下に日付順でソートしたいです。'(_DATE,_CODE,_VALUE) :- '要するに第一キーは降順、第二キーは昇順で整列する。'(_DATE,_CODE,_VALUE). '要するに第一キーは降順、第二キーは昇順で整列する。'(_DATE,_CODE,_VALUE) :- 第一キー順序(_CODE), 第二キー順序(_CODE,_DATE), 元テーブル(_DATE,_CODE,_VALUE). 第一キー順序(_CODE) :- findsetof(_CODE,( 元テーブル(_DATE,_CODE,_VALUE)), L1), reverse(L1,L2), member(_CODE,L2). 第二キー順序(_CODE,_DATE) :- findsetof(_DATE,( 元テーブル(_DATE,_CODE,_VALUE)), L1), member(_DATE,L1). % 以下のサイトは % % Prolog % '花は 花は 花は咲く いつか生まれる君に 花は 花は 花は咲く わたしは何を残しただろう'(_花は_花は_花は咲く_1,_いつか生まれる君に,_花は_花は_花は咲く_2,_わたしは何を残しただろう) :- '花は 花は 花は咲く'(1,_花は_花は_花は咲く_1), いつか生まれる君に(_いつか生まれる君に), '花は 花は 花は咲く'(2,_花は_花は_花は咲く_2), わたしは何を残しただろう(_わたしは何を残しただろう). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/177 # # # [2]下記の九九の表を作るプログラムを作れ # # 1 # 2 4 # 3 6 9 # ....... # 8 16 24...64 # 9 18 27...72 # 変則的な九九の表を作る :- '_列が_行を超えない範囲で、積を生成する'(_行,_列,_積), '生成された積を表示する。ただし、最後の9行9列の積は表示しない。'(_行,_列,_積), _行 = 9. '_列が_行を超えない範囲で、積を生成する'(_行,_列,_積) :- '_列が_行を超えない範囲で、'(_行,_列), 積を生成する(_行,_列,_積). '_列が_行を超えない範囲で、'(_行,_列) :- between(1,9,_行), between(1,_行,_列). 積を生成する(_行,_列,_積) :- _積 is _行 * _列. '生成された積を表示する。ただし、最後の9行9列の積は表示しない。'(_行,_列,_) :- 'ただし、最後の9行9列の積は表示しない。'(_行,_列),!. '生成された積を表示する。ただし、最後の9行9列の積は表示しない。'(_行,_列,_積) :- '基本的に積を表示するが、_行=_列の場合改行する'(_行,_列,_積). 'ただし、最後の9行9列の積は表示しない。'(9,9). '基本的に積を表示するが、_行=_列の場合改行する'(_行,_列,_積) :- '基本的に積を表示するが、'(_積), '_行=_列の場合改行する'(_行,_列). '基本的に積を表示するが、'(_積) :- writef('%3r ',[_積]). '_行=_列の場合改行する'(_行,_列) :- _行 = _列, nl. % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/576 # 西暦何年かを入力するとその年に月曜日が何回あるか数え # 52回なら1を、53回なら0を出力するプログラムお願いします… # # 1回1回判定するのではなく、一気に何回か入力し、一気に判定を出力するものでお願いします # (0を入力したら終わりです) # # 入力できるのは1989〜5000です # # '西暦何年かを入力するとその年に月曜日が何回あるか数え 52回なら1を、53回なら0を出力するプログラムお願いします… 1回1回判定するのではなく、一気に何回か入力し、一気に判定を出力するものでお願いします (0を入力したら終わりです) 入力できるのは1989〜5000です' :- '西暦何年かを一気に何回か入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_西暦ならび), 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'(_西暦ならび). '西暦何年かを一気に何回か入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_西暦ならび) :- findall(_西暦,( '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'('西暦(1989~5000)を入力して下さい',_西暦), ( _西暦=0,!,fail;true)),_西暦ならび). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'([]). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'([_西暦|_残りならび]) :- 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を'(_西暦,_1または0), 出力する(_西暦,_1または0), 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'(_残りならび). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を'(_西暦,_0または1) :- 'その年に月曜日が何回あるか数え'(_西暦,_月曜日の回数), '52回なら1を、53回なら0を'(_月曜日の回数,_0または1). 'その年に月曜日が何回あるか数え'(_西暦,_月曜日の回数) :- findall(1,( 日付と曜日の生成(_西暦,1,1,_年,_月,_日,月曜), ( \+(_年 = _西暦),!,fail;true)),L), length(L,_月曜日の回数). '52回なら1を、53回なら0を'(52,1). '52回なら1を、53回なら0を'(53,0). 出力する(_西暦,_1または0) :- writef('%t年 %t\n',[_西暦,_1または0]). '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_催促文,_西暦) :- writef('%t ',[_催促文]), get_line(_入力行), '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_入力行,_西暦). '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_催促文,_西暦) :- '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_催促文,_西暦). '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'('0',0) :- !. '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_入力行,_西暦) :- read_term_from_atom(_入力行,_西暦,[]), integer(_西暦), between(1889,5000,_西暦),!. '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_入力行,_) :- writef('入力された文字列"%t"から1899年から5000年範囲の西暦が得られませんでした\n再入力をお願いします\n',[_入力行]), fail. get_line(Line) :- get_line(user_input,Line). get_line(Instream,Line) :- get_char(Instream,C), get_line_1(Instream,C,Chars), atom_chars(Line,Chars) . get_line_1(_,'\n',[]) :- !. get_line_1(_,end_of_file,[]) :- !. get_line_1(Instream,C,[C|R]) :- get_char(Instream,C2), get_line_1(Instream,C2,R). '日付と曜日の生成'(_年,_月,_日,_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日). '日付と曜日の生成'(_年_1,_月_1,_日_1,_年,_月,_日,_曜日) :- 翌日(_年_1,_月_1,_日_1,_年_2,_月_2,_日_2), '日付と曜日の生成'(_年_2,_月_2,_日_2,_年,_月,_日,_曜日). '日付と曜日の生成'(_起点年月日文字列,_年月日文字列,_曜日) :- 年月日文字列から整数年月日を得る(_起点年月日文字列,_起点年,_起点月,_起点日), '日付と曜日の生成'(_起点年,_起点月,_起点日,_年,_月,_日,_曜日), 整数から文字列(4,_年,_年文字列), 整数から文字列(2,_月,_月文字列), 整数から文字列(2,_日,_日文字列), atomic_list_concat([_年文字列,_月文字列,_日文字列],_年月日文字列). 翌日(_年,12,31,_翌日の年,1,1) :- succ(_年,_翌日の年),!. 翌日(_年,2,29,_年,3,1) :- うるう年(_年),!. 翌日(_年,2,28,_年,3,1) :- \+(うるう年(_年)),!. 翌日(_年,_月,_日,_年,_翌日の月,1) :- _翌日の月 is _月 + 1, '十二月・二月を除く月末日'(_月,_日),!. 翌日(_年,_月,_日,_年,_月,_翌日の日) :- succ(_日,_翌日の日). '十二月・二月を除く月末日'(_月,30) :- 小の月(_月),!. '十二月・二月を除く月末日'(_月,31) :- 大の月(_月). 小の月(_月) :- member(_月,[2,4,6,9,11]). 大の月(_月) :- member(_月,[1,3,5,7,8,10,12]). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 > 2, _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 曜日を表す値(_曜日を表す値,_曜日). 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 =< 2, _年_1 is _年 - 1, _月_2 is _月 + 12, 'Zellerの公式を用いて曜日を得る'(_年_1,_月_2,_日,_曜日を表す値,_曜日). 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). % 以下のサイトは '日付と曜日の生成'(_年_1,_月_1,_日_1,_起点日からの日数,_年,_月,_日,_曜日) :- '日付と曜日の生成'(_年_1,_月_1,_日_1,0,_起点日からの日数,_年,_月,_日,_曜日). '日付と曜日の生成'(_年,_月,_日,_日数,_日数,_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日). '日付と曜日の生成'(_年_1,_月_1,_日_1,_起点日からの日数_1,_起点日からの日数,_年,_月,_日,_曜日) :- 翌日(_年_1,_月_1,_日_1,_年_2,_月_2,_日_2), succ(_起点日からの日数_1,_起点日からの日数_2), '日付と曜日の生成'(_年_2,_月_2,_日_2,_起点日からの日数_2,_起点日からの日数,_年,_月,_日,_曜日). '日付と曜日の生成'(_年,_月,_日,_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日). '日付と曜日の生成'(_年_1,_月_1,_日_1,_年,_月,_日,_曜日) :- 翌日(_年_1,_月_1,_日_1,_年_2,_月_2,_日_2), '日付と曜日の生成'(_年_2,_月_2,_日_2,_年,_月,_日,_曜日). '日付と曜日の生成'(_起点年月日文字列,_年月日文字列,_曜日) :- 年月日文字列から整数年月日を得る(_起点年月日文字列,_起点年,_起点月,_起点日), '日付と曜日の生成'(_起点年,_起点月,_起点日,_年,_月,_日,_曜日), 整数から文字列(4,_年,_年文字列), 整数から文字列(2,_月,_月文字列), 整数から文字列(2,_日,_日文字列), atomic_list_concat([_年文字列,_月文字列,_日文字列],_年月日文字列). 翌日(_年,12,31,_翌日の年,1,1) :- succ(_年,_翌日の年),!. 翌日(_年,2,29,_年,3,1) :- うるう年(_年),!. 翌日(_年,2,28,_年,3,1) :- \+(うるう年(_年)),!. 翌日(_年,_月,_日,_年,_翌日の月,1) :- _翌日の月 is _月 + 1, '十二月・二月を除く月末日'(_月,_日),!. 翌日(_年,_月,_日,_年,_月,_翌日の日) :- succ(_日,_翌日の日). '十二月・二月を除く月末日'(_月,30) :- 小の月(_月),!. '十二月・二月を除く月末日'(_月,31) :- 大の月(_月). 小の月(_月) :- member(_月,[2,4,6,9,11]). 大の月(_月) :- member(_月,[1,3,5,7,8,10,12]). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 > 2, _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 曜日を表す値(_曜日を表す値,_曜日). 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 =< 2, _年_1 is _年 - 1, _月_2 is _月 + 12, 'Zellerの公式を用いて曜日を得る'(_年_1,_月_2,_日,_曜日を表す値,_曜日). 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). 整数から文字列(_文字列桁,_整数,_定数) :- '整数・文字番号変換'(_整数,_文字番号ならび), ならびの長さ(_文字番号ならび,_ならびの長さ), _不足桁 is _文字列桁 - _ならびの長さ, 頭部に零を詰める(_不足桁,_文字番号ならび,_整形された文字番号ならび), '定数・文字番号変換'(_定数,_整形された文字番号ならび),!. 年月日文字列から整数年月日を得る(_年月日文字列,_年,_月,_日) :- sub_atom(_年月日文字列,0,4,4,_年文字列), sub_atom(_年月日文字列,2,2,2,_月文字列), sub_atom(_年月日文字列,4,2,0,_日文字列), 文字列ならびから整数ならびを得る([_年文字列,_月文字列,_日文字列],[_年,_月,_日]). 文字列ならびから整数ならびを得る([],[]). 文字列ならびから整数ならびを得る([_文字列|R1],[_整数|R2]) :- get_term_from_atom(_文字列,_整数,[]), 文字列ならびから整数ならびを得る(R1,R2). ならびの長さ(_ならび,_ならびの長さ) :- length(_ならび,_ならびの長さ). '整数・文字番号変換'(_整数,_文字番号ならび) :- number_codes(_整数,_文字番号ならび). 頭部に零を詰める(0,_文字ならび,_文字ならび) :- !. 頭部に零を詰める(_桁,[_|_未決定ならび],_文字ならび) :- _桁 < 0,!, _残り桁 is _桁 + 1, 頭部に零を詰める(_残り桁,_未決定ならび,_文字ならび). 頭部に零を詰める(_桁,_文字ならび,[48|_未決定ならび]) :- _残り桁 is _桁 - 1, 頭部に零を詰める(_残り桁,_文字ならび,_未決定ならび). '定数・文字番号変換'(_定数,_文字番号ならび) :- atom_codes(_定数,_文字番号ならび). % 以下のサイトは '日付と曜日の生成'(_年,_月,_日,_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日). '日付と曜日の生成'(_年_1,_月_1,_日_1,_年,_月,_日,_曜日) :- 翌日(_年_1,_月_1,_日_1,_年_2,_月_2,_日_2), '日付と曜日の生成'(_年_2,_月_2,_日_2,_年,_月,_日,_曜日). 翌日(_年,12,31,_翌日の年,1,1) :- succ(_年,_翌日の年),!. 翌日(_年,2,29,_年,3,1) :- うるう年(_年),!. 翌日(_年,2,28,_年,3,1) :- \+(うるう年(_年)),!. 翌日(_年,_月,_日,_年,_翌日の月,1) :- _翌日の月 is _月 + 1, '十二月・二月を除く月末日'(_月,_日),!. 翌日(_年,_月,_日,_年,_月,_翌日の日) :- succ(_日,_翌日の日). '十二月・二月を除く月末日'(_月,30) :- 小の月(_月),!. '十二月・二月を除く月末日'(_月,31) :- 大の月(_月). 小の月(_月) :- member(_月,[2,4,6,9,11]). 大の月(_月) :- member(_月,[1,3,5,7,8,10,12]). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 > 2, _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 曜日を表す値(_曜日を表す値,_曜日). 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 =< 2, _年_1 is _年 - 1, _月_2 is _月 + 12, 'Zellerの公式を用いて曜日を得る'(_年_1,_月_2,_日,_曜日を表す値,_曜日). 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). % 以下のサイトは add(0,Y,Y). add(s(X),Y,s(Z)) :- add(X,Y,Z). 月名による足し算(X,Y,Z) :- 月対応(S1,X), 月対応(S2,Y), add(S1,S2,S3), 月対応(S3,Z) . 月対応(s(0),睦月) :- !. 月対応(s(X),Y) :- 次の(Z,Y), 月対応(X,Z). 次の(睦月,如月). 次の(如月,弥生). 次の(弥生,卯月). 次の(卯月,皐月). 次の(皐月,水無月). 次の(水無月,文月). 次の(文月,葉月). 次の(葉月,長月). 次の(長月,神無月). 次の(神無月,霜月). 次の(霜月,師走). 次の(師走,睦月). % 以下のサイトは % 使用言語 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 % 以下のサイトは # 出典::twitter_by_TakaoOzaki_20141219 # # 初心者向きのPrologの問題。100個の乱数値(0-99)をリストに生成してください。乱数値(0-99)は _乱数値 is random(100) で取れることとしてください。 # # 初心者でない人には、「あなたは、何通りのプログラムパターンが脳裏を過ぎりますか?」 # '100個の乱数値(0-99)をリストに生成します'(_乱数リスト) :- '100個の'(_乱数リスト), '乱数値(0-99)をリストに生成します'(_乱数リスト). '100個の'(_乱数リスト) :- length(_乱数リスト,100). '乱数値(0-99)をリストに生成します'([]). '乱数値(0-99)をリストに生成します'([_乱数値|R]) :- _乱数値 is random(100), '乱数値(0-99)をリストに生成します'(R). % 以下のサイトは # 出典::twitter_by_TakaoOzaki_20141219 # # 初心者向きのPrologの問題。100個の乱数値(0-99)をリストに生成してください。乱数値(0-99)は _乱数値 is random(100) で取れることとしてください。 # # 初心者でない人には、「あなたは、何通りのプログラムパターンが脳裏を過ぎりますか?」 # '100個の乱数値(0-99)をリストに生成します'(_乱数リスト) :- '100個の'(_乱数リスト), '乱数値(0-99)をリストに生成します'(_乱数リスト). '100個の'(_乱数リスト) :- length(_乱数リスト,100). '乱数値(0-99)をリストに生成します'([]). '乱数値(0-99)をリストに生成します'([_乱数値|R]) :- _乱数値 is random(100), '乱数値(0-99)をリストに生成します'(R). % 以下のサイトは # 出典::twitter_by_TakaoOzaki_20141219 # # 初心者向きのPrologの問題。100個の乱数値(0-99)をリストに生成してください。乱数値(0-99)は _乱数値 is random(100) で取れることとしてください。 # # 初心者でない人には、「あなたは、何通りのプログラムパターンが脳裏を過ぎりますか?」 # '100個の乱数値(0-99)をリストに生成します'(_乱数リスト) :- length(_乱数リスト,100), '乱数値(0-99)をリストに生成します'(_乱数リスト). '乱数値(0-99)をリストに生成します'([]). '乱数値(0-99)をリストに生成します'([_乱数値|R]) :- _乱数値 is random(100), '乱数値(0-99)をリストに生成します'(R). % 以下のサイトは :- dynamic(下三桁フィボナッチ数/2). 下三桁の足し算の定義節の生成 :- between(0,999,M), between(0,999,N), S is ( M + N ) mod 1000, assertz((下三桁の足し算(M,N,S) :- !)), N = 999, M = 999. 下三桁フィボナッチ数(0,1) :- !. 下三桁フィボナッチ数(1,1) :- !. 下三桁フィボナッチ数(N,X) :- 隣り合う2つの数を加える(N,X), asserta((下三桁フィボナッチ数(N,X) :- !)). 隣り合う2つの数を加える(N,X) :- N_1 is N - 1, N_2 is N - 2, 下三桁フィボナッチ数(N_1,Y), 下三桁フィボナッチ数(N_2,Z), 下三桁の足し算(Y,Z,X). :- 下三桁の足し算の定義節の生成. % 以下のサイトは 整数除算(_実,_法,_商,_剰余) :- 整数(_実), 整数除算(_実,_法,true,_商,_剰余). 整数除算(_実,_法,_商,_剰余) :- 変数(_実), 整数(_法), 法として合同(_法,_実,_商,_剰余). 法として合同(_n,_nを法として合同,_m,_剰余) :- 整数(_n), nth0(_m,_,_), succ(_n_1,_n), between(0,_n_1,_剰余), _nを法として合同 is _m * _n + _剰余. 整数除算(_実,_法,_制約,_商,_剰余) :- '整数は実と法'(_実,_法,_商,_剰余). 整数除算(_実,_法,_制約,_商,_剰余) :- '整数は実と商と剰余、変数は法'(_実,_法,_制約,_商,_剰余). 整数除算(_実,_法,_制約,_商,_剰余) :- '整数は実、変数は法と商'(_実,_法,_商,_剰余). 整数除算(_実,_法,_制約,_商,_剰余) :- '変数は実'(_実,_法,_制約,_商,_剰余). 法として合同(_n,_nを法として合同,_制約,_m,_剰余) :- 'm乃ち商と剰余を生成'(_n,_m,_剰余), _nを法として合同 is _m * _n + _剰余, (\+(_制約),!,fail;true). 'm乃ち商と剰余を生成'(_n,_m,_剰余) :- 整数(_n), nth0(_m,_,_), succ(_n_1,_n), between(0,_n_1,_剰余). 整数は実と法(_実,_法,_商,_剰余) :- 整数は実と法(_実,_法), _商 is _実 // _法, _剰余 is _実 mod _法. 整数は実と法(_実,_法) :- 整数(_実), 整数(_法). '整数は実と商と剰余、変数は法'(_実,_法,_制約,_商,_剰余) :- '整数は実と商と剰余、変数は法'(_実,_法,_商,_剰余), _法 is (_実 - _剰余) // _商, _剰余 is _実 mod _法, _制約. '整数は実と商と剰余、変数は法'(_実,_法,_商,_剰余) :- 整数(_実), 変数(_法), 整数(_商), 整数(_剰余). '整数は実と商、変数は法と剰余'(_実,_法,_商,_剰余) :- 整数(_実), 変数(_法), 整数(_商), 変数(_剰余), succ(_商_1,_商), between(0,_商_1,_剰余). '整数は実,変数は法と商'(_実,_法,_商,_剰余) :- 整数(_実), 変数(_法), 変数(_商), between(1,_実,_法), 整数除算(_実,_法,_制約,_商,_剰余). '変数は実'(_実,_法,_制約,_商,_剰余) :- 変数(_実), 法として合同(_法,_実,_制約,_商,_剰余). '整数は実、変数は法と商'(_実,_法,_商,_剰余) :- 整数(_実), 変数(_法), 変数(_商), between(1,_実,_法), _商 is _実 // _法, _剰余 is _実 mod _法. 整数(_整数) :- integer(_整数). 変数(_変数) :- var(_変数). % 以下のサイトは # # ガリ夫くん:スマ子さん、最近実は数字萌えに目覚めたんです! # # スマ子さん: 藪から棒にアブノーマル宣言をされても困るのだけれども……。 # # ガリ夫くん:特に1ちゃんと0ちゃんは最高っすよ! 長女として他の数字子ちゃん達を一生懸命支える1ちゃん。全てを無に帰す力を持ったミステリアス美少女の0ちゃん。……かわええ〜。 # # スマ子さん:……もう帰っていいかしら。 # # ガリ夫:もう数の世界には1ちゃんと0ちゃん以外要りません! 1ちゃんと0ちゃんさえいれば、それで満足です! # # スマ子さん:あら、それはなかなか鋭い指摘ね。 # # ガリ夫くん:……と言いますと? # # スマ子さん:実は、私たちが普段使っている数は、勝手に0〜9までの数を使いますよと決めているに過ぎないの。実際には0と1だけでも数を表すことは可能なのよ。 # # ガリ夫くん:ほうほう……。 # # スマ子さん:これを2進法って言うんだけれどもね。一の位が1になったら、その次の位は一の位を0に戻して、その上の位を1増やして……ってしていくとあらゆる数を表すことができるわ。例えば、1,10,11,100,101,110,111……ってな具合にね。 # # ガリ夫くん:なるほど! と言うことは全ての数は1ちゃんと0ちゃんのハーレムと化すんですね! ここは天国か! # # スマ子さん:……。ところでガリ夫くん、1ちゃんと0ちゃんはどちらがお好き? # # ガリ夫くん:う〜〜〜ん……甲乙つけ難いですが、やっぱり健気な1ちゃんですかね〜。 # # スマ子さん:じゃあその1ちゃん、ハーレムの中にどれぐらいいるのか、知りたくない? # # ガリ夫くん:知りたい知りたい! 1ちゃんのこと、もっと知りたい! # # スマ子さん:うわあ……。ま、まあいいわ! 1ちゃんの数を数えて、それじゃあ2014年にちなんでこんな問題を解いてみましょう! そう、スマートにね! # # # 【問】 # 1〜2014までの数を2進法で表した時に、連続した2数でその数の中に1の登場する回数が同じであるようなペアは何組存在するか、答えてください。 # # 解答用テキストファイルに問題の答えと、その答えを導出したプロセスを記述して、提出してください。 # また、プログラムを使用した場合はソースコードを解答用テキストファイルに貼り付けてください。言語は問いませんが、ideone(http://ideone.com/)で実行できるものを解答として提出してください。 # '1〜2014までの数を2進法で表した時に、連続した2数でその数の中に1の登場する回数が同じであるようなペアは何組存在するか、答えてください。'(_ペアの組数) :- findall(_2進法で表した時に1の登場する回数,( '1〜2014までの数を2進法で表した時に1の登場する回数'(_数を2進法で表した時に1の登場する回数)),_2進法で表した時に1の登場する回数ならび), 度数(append(_,[_1の回数,_1の回数|_],_数を2進法で表した時に1の登場する回数ならび),_ペアの組数). '1〜2014までの数を2進法で表した時に1の登場する回数'(_数を2進法で表した時に1の登場する回数) :- between(1,2014,_数), '数を2進法で表した時に1の登場する回数'(_数,_数を2進法で表した時に1の登場する回数). '数を2進法で表した時に1の登場する回数'(_実,_数を2進法で表した時に1の登場する回数) :- '数を2進法で表した時に1の登場する回数'(_実,0,_数を2進法で表した時に1の登場する回数). '数を2進法で表した時に1の登場する回数'(0,_1の回数,_1の回数) :- !. '数を2進法で表した時に1の登場する回数'(_実,_1の累積回数,_1の回数) :- _剰余 is _実 mod 2, _商 is _実 // 2, '剰余が1ならば加算'(_剰余,_商,_1の累積回数,_1の回数). '剰余が1ならば加算'(1,_商,_1の累積回数_1,_1の回数) :- succ(_1の累積回数_1,_1の累積回数_2), '数を2進法で表した時に1の登場する回数'(_商,_1の累積回数_2,_1の回数). '剰余が1ならば加算'(0,_商,_1の累積回数_1,_1の回数) :- '数を2進法で表した時に1の登場する回数'(_商,_1の累積回数_1,_1の回数). 度数(_目標,_度数) :- findall(1,_目標,_度数を示す1のならび), length(_度数を示す1のならび,_度数). % 以下のサイトは 昇順鍵整列(L1,_鍵ならび,L2) :- 昇順鍵整列(1,_鍵ならび,L1,KL,L3), 昇順整列(KL,KL2), findall(L,( member(L4,KL2), last(L4,K), member([K|L],L3)),L2). 昇順鍵整列(_,_,[],[],[]) :- !. 昇順鍵整列(N,KL,[L1|R1],[KL_1|KR],[[N|L1]|R3]) :- 鍵生成(N,KL,L1,KL_1), succ(N,N_2), 昇順鍵整列(N_2,KL,R1,KR,R3). 鍵生成(N,KL,L1,KR_2) :- findall(A,( member(K,KL), nth1(K,L1,A)),KR_1), append(KR_1,[N],KR_2). 昇順整列([],[]). 昇順整列([_軸要素|L1],L2) :- 昇順分割(_軸要素,L1,L1_2,L2_2), 昇順整列(L1_2,L1_3), 昇順整列(L2_2,L2_3), append(L1_3,[_軸要素|L2_3],L2). 昇順分割(_,[],[],[]). 昇順分割(A,[B|R2],[B|R3],R4) :- A @>= B, 昇順分割(A,R2,R3,R4). 昇順分割(A,[B|R2],R3,[B|R4]) :- A @< B, 昇順分割(A,R2,R3,R4). % 以下のサイトは # 出典:: プログラミングのお題スレ Part5 # お題:自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返すという操作を繰り返す。 # # 例1:14,17,50,25,29,85,89,145,190,730,730,... # 例2:59,106,217,352,160,217,352,160,... # # この操作によるループ(上記の例では[730],[160,217,352])を好きなだけ求めよ。 '自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返すという操作を繰り返す。'(N,L,_ループ) :- '自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返すという操作を繰り返す。'(N,[],L,_ループ). '自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返すという操作を繰り返す。'(N,L1,L,_ループ) :- ループが発生したら終了する(L1,L,_ループ). '自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返すという操作を繰り返す。'(N,L1,L,_ループ) :- '自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返す'(N,_Nの各桁のk乗の和), '自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返すという操作を繰り返す。'(_Nの各桁のk乗の和,[_Nの各桁のk乗の和|L1],L,_ループ). ループが発生したら終了する(L1,L,_ループ) :- L1 = [N1|R], append(L0,[N1|_],R), reverse(L1,L), reverse([N1|L0],_ループ). '自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返す'(N,_Nの各桁のk乗の和) :- 各桁の数ならびを得る(N,_数ならび), length(Chars,_k), findsum(_nの各桁のk乗,( member(_数,_数ならび), _nの各桁のk乗 is _数 ^ _k),_Nの各桁のk乗の和). 各桁の数ならびを得る(N,_数ならび) :- number_chars(N,Chars), findall(_数,( member(A,Chars), number_chars(_数,[A])),_数ならび). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1411227287/206 # お題:文字列中の数字が一文字以上連続する部分を右ローテイトする。 # 例 # "2014-10-03 00:17:21" -> "21-2014-10 03:00:17" # "1 2 3 4" -> "4 1 2 3" # "a0=0;a1=1;a2=2;a3=3" -> "a3=0;a0=1;a1=2;a2=3" # # '文字列中の数字が一文字以上連続する部分を右ローテイトする。'(_文字列,_数字が一文字以上連続する部分を右ローテイトした文字列) :- atom_chars(_文字列,_文字ならび), '文字列ならびの数字が一文字以上連続する部分を右ローテイトする。'(_文字ならび,_数字列部分が右ローテイトしたならび), atomic_list_concat(_数字列部分が右ローテイトしたならび,_数字が一文字以上連続する部分を右ローテイトした文字列). '文字列ならびの数字が一文字以上連続する部分を右ローテイトする。'(_文字ならび,_数字列部分が右ローテイトしたならび) :- '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'(_文字ならび,_数字列ならび,_数字列部分が右ローテイトしたならび), 右ローテイトしてから変数部分を埋める(_数字列ならび,_数字列部分が右ローテイトしたならび). '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'([],[],[]). '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'(L1,[_数字列|R2],[_|R3]) :- 先頭からの数字ならびを数字列に変換(L1,_数字列,R1), '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'(R1,R2,R3). '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'(L1,R2,[_文字列|R3]) :- 先頭からの数字以外の文字ならびを文字列に変換(L1,_文字列,R1), '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'(R1,R2,R3), 先頭からの数字ならびを数字列に変換(L1,_数字列,R1) :- 先頭からの数字ならびを(L1,_数字ならび,R1), 数字列に変換(_数字ならび,_数字列). 先頭からの数字ならびを(L1,_数字ならび,R1) :- append(_数字ならび,R1,L1), 要素の全てが数字(_数字ならび), 'R1の最初の要素があればそれは数字ではない'(R1). 'R1の最初の要素があればそれは数字ではない'(R1) :- \+((R1 = [_文字|_],member(_文字,['0','1','2','3','4','5','6','7','8','9'])). 要素の全てが数字(_数字ならび) :- forall(member(_数字,_数字ならび),member(_数字,['0','1','2','3','4','5','6','7','8','9'])). 数字列に変換(_数字ならび,_数字列) :- atom_chars(_数字列,_数字ならび). 先頭からの数字以外の文字ならびを文字列に変換(L1,_文字列,R1) :- append(_文字ならび,R1,L1), 要素の全てが数字ではない(_文字ならび), 'R1の最初の要素があればそれは数字以外の文字ではない'(R1). 要素の全てが数字ではない(_文字ならび) :- forall(member(_文字,_文字ならび),\+(member(_文字,['0','1','2','3','4','5','6','7','8','9']))). 'R1の最初の要素があればそれは数字以外の文字ではない'(R1) :- \+((R1 = [A|_],\+(member(A,['0','1','2','3','4','5','6','7','8','9'])))). 右ローテイトしてから変数を埋める([],L2) :- !. 右ローテイトしてから変数を埋める(L1,L2) :- 右ローテイトしてから(L1,L3), 変数を埋める(L3,L2). 右ローテイトしてから([A|R],L3) :- append(R,[A],L3). 変数を埋める([],[]) :- !. 変数を埋める([_数字列|R1],[_数字列|R2]) :- 変数を埋める(R1,R2). 変数を埋める(R1,[_文字列|R2]) :- 変数を埋める(R1,R2). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1411227287/89 # 0と1のみでランダムに生成した文字列Sがある # 長さは2<=S<=1000である # 11001010110100011001011011111111111111000000000010111000000 # # 同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX # 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN # としたときのMXとMNを求めよ # 見当たらない場合はFALSEを出力しろ # # S=110001010100 # MX=3 (000が一番長い) # MN=2 (11または00が二番目に長い) # # S=111111 # MX=3 (111111が一番長い) # MN=FALSE (2番目に短いものが存在しない) # # S=10 # MX=FALSE (1番長いのが存在しない) # MX=FALSE (2番目に短いものが存在しない) # # '0と1のみでランダムに生成した文字列Sがある 長さは2<=S<=1000である 11001010110100011001011011111111111111000000000010111000000 同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN としたときのMXとMNを求めよ 見当たらない場合はFALSEを出力しろ' :- '0と1のみでランダムに生成した文字列Sがある'(_文字列), forall('同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN としたときのMXとMNを求めよ 見当たらない場合はFALSEを出力しろ'(_文字列,_最長文字列,_短い方から二番目の文字列), write('S=%t\nMX=%t,MN=%t\n',[_文字列,_最長文字列,_短い方から二番目の文字列])),!. '0と1のみでランダムに生成した文字列Sがある 長さは2<=S<=1000である 11001010110100011001011011111111111111000000000010111000000 同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN としたときのMXとMNを求めよ 見当たらない場合はFALSEを出力しろ' :- write('FALSE\n'). '0と1のみでランダムに生成した文字列Sがある'(_文字列) :- R is random(999) + 2, findall(_0または1,( between(2,R,_), _0または1 is random(3341) mod 2), _0または1ならび), atomic_list_concat(_0または1ならび,_文字列). '同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN としたときのMXとMNを求めよ 見当たらない場合はFALSEを出力しろ'(_文字列,_最長文字列,_短い方から二番目の文字列) :- 連続した文字列と文字数ならびを得る(_文字列,_連続した文字列と文字数ならび), 最長文字列と短い方から二番目の文字列(_連続した文字列と文字数ならび,_最長文字列,_短い方から二番目の文字列). 連続した文字列と文字数ならびを得る(_文字列,_連続した文字列と文字数ならび) :- findall([_連続した文字列,_文字数],( 連続した文字列と文字数(_文字列,_連続した文字列,_文字数)), _連続した文字列_文字数ならび). 連続した文字列と文字数(_文字列,_連続した文字列,_文字数) :- '0の連続したの文字列'(_文字列,_連続した文字列,_文字数). 連続した文字列と文字数(_文字列,_連続した文字列,_文字数) :- '1の連続したの文字列と文字数'(_文字列,_連続した文字列,_文字数). '0の連続したの文字列'(_文字列,_連続した文字列,_文字数) :- sub_atom(_文字列,_開始点,_文字数,_残り文字数,_連続した文字列), 前後に0の文字がない(_文字列,_開始点,_文字数,_残り文字数), forall(sub_atom(_連続した文字列,_,1,_,_文字),_文字='0'). '1の連続したの文字列'(_文字列,_連続した文字列,_文字数) :- sub_atom(_文字列,_開始点,_文字数,_残り文字数,_連続した文字列), 前後に0の文字がない(_文字列,_開始点,_文字数,_残り文字数), forall(sub_atom(_連続した文字列,_,1,_,_文字),_文字='1'). 前後に0の文字がない(_文字列,_開始点,_文字数) :- succ(_開始点_1,_開始点), _開始点_2 is _開始点 + _文字数, \+(sub_atom(_文字列,_開始点_1,1,_,'0')), \+(sub_atom(_文字列,_開始点_2,1,_,'0')). 前後に1の文字がない(_文字列,_開始点,_文字数) :- succ(_開始点_1,_開始点), _開始点_2 is _開始点 + _文字数, \+(sub_atom(_文字列,_開始点_1,1,_,'1')), \+(sub_atom(_文字列,_開始点_2,1,_,'1')). 最長文字列と短い方から二番目の文字列(_連続した文字列と文字数ならび,_最長文字列,_短い方から二番目の文字列) :- 最長文字数と短い方から二番目に短い文字数(_連続した文字列と文字数ならび,_最長文字数,_短い方から二番目に短い文字数), 最長文字数と短い方から二番目に短い文字列(_連続した文字列と文字数ならび,_最長文字数,_短い方から二番目に短い文字数,_最長文字列,_短い方から二番目に短い文字列). 最長文字数と短い方から二番目に短い文字数(_連続した文字列と文字数ならび,_最長文字数,_短い方から二番目に短い文字数) :- 文字列長ならび(_連続した文字列と文字数ならび,_文字列長ならび), sort(_文字列長ならび,_整列した文字列長ならび), nth1(2,_整列した文字列長ならび,_短い方から二番目に短い文字数), append(_,[_最長文字数],_整列した文字列長ならび). 文字数ならび(_連続した文字列と文字数ならび,_文字数ならび) :- findall(_文字数,( member([_,_文字数],_連続した文字列と文字列数ならび)), _文字数ならび). 最長文字数と短い方から二番目に短い文字列(_連続した文字列と文字数ならび,_最長文字数,_短い方から二番目に短い文字数,_最長文字列,_短い方から二番目に短い文字列) :- member([_最長文字列,_最長文字数],_連続した文字列と文字数ならび), member([_短い方から二番目に短い文字列,_短い方から二番目に短い文字数],_連続した文字列と文字数ならび). % 以下のサイトは '3年H組の最も高い身長'(_3年H組の生徒ならび,_3年H組の最も高い身長) :- '3年H組の身長と残りの生徒の身長ならび'(_3年H組の生徒ならび,_3年H組の最も高い身長,_残りの生徒の身長ならび). '3年H組の最も高い身長と残りの生徒の身長ならび'([_最も高い身長|_残りの生徒の身長],_最も高い身長,_残りの生徒の身長), 残り生徒ならびの全てが最も高い身長に等しいか小さい(_最も高い身長,_残りの生徒の身長). '3年H組の最も高い身長と残りの生徒の身長ならび'([_身長|R1],_最も高い身長,[_身長|_残り身長ならび]) :- '3年H組の最も高い身長と残りの生徒の身長ならび'(R1,_最も高い身長,_残り身長ならび). 残り生徒ならびの全てが最も高い身長に等しいか小さい(_最も高い身長,_残り身長ならび) :- forall(残り身長ならびから身長を取り出す(_残り身長ならび,_身長),_身長 @=< _最も高い身長). 残り身長ならびから身長を取り出す([_身長|_],_身長). 残り身長ならびから身長を取り出す([_|R],_身長) :- 残り身長ならびから身長を取り出す(R,_身長). % 以下のサイトは # # 3年H組で最も高い身長は # '3年H組で最も高い身長'([_最も高い身長_1],_最も高い身長_1). '3年H組で最も高い身長'([_生徒の身長|R],_最も高い身長) :- '3年H組で最も高い身長'(R,_最も高い身長_2), 高い方の身長は(_生徒の身長,_最も高い身長_2,_最も高い身長). 高い方の身長は(_身長_1,_身長_2,_身長_2) :- _身長_1 @=< _身長_2. 高い方の身長は(_身長_1,_身長_2,_身長_1) :- _身長_1 @> _身長_2. % 以下のサイトは # # 3年H組で最も高い身長は # '3年H組で最も高い身長'(_3年H組の身長ならび,_3年H組で最も高い身長) :- '3年H組で最も高い身長は'(_3年H組で最も高い身長,_3年H組の身長ならび,_残り身長ならび), '_残り身長ならびの要素は全て_3年H組で最も高い身長に等しいか小さい'(_残り身長ならび,_3年H組で最も高い身長). '3年H組の最も高い身長は'(A,[A|R],R). '3年H組の最も高い身長は'(A,[B|R1],[B|R2]) :- '3年H組の最も高い身長は'(A,R1,R2). '_残り身長ならびの要素は全て_3年H組で最も高い身長に等しいか小さい'(_残り身長ならび,_3年H組で最も高い身長) :- forall('3年H組の生徒の身長'(_生徒の身長,_残り身長ならび),_生徒の身長 @=< _3年H組で最も高い身長). '3年H組の生徒の身長'(_生徒の身長,[_生徒の身長|_]). '3年H組の生徒の身長'(_生徒の身長,[_|_残り生徒の身長]) :- '3年H組の生徒の身長'(_生徒の身長,_残り生徒の身長). % 以下のサイトは # # 3年H組で最も高い身長は # '3年H組で最も高い身長'(_3年H組の身長ならび,_3年H組で最も高い身長) :- select(_3年H組で最も高い身長,_3年H組の身長ならび,_残り身長ならび), forall(member(_生徒の身長,_残り身長ならび),_生徒の身長 @=< _3年H組で最も高い身長). % この select/3, forall/2, member/2 を具象化させることはかなり難しい。 % 例えば、ここで具象化とは、'3年H組・・・' に述語名を置き直すこと。 % 以下のサイトは # # 3年H組で最も高い身長は # '3年H組で最も高い身長'(_3年H組の身長ならび,_3年H組で最も高い身長) :- _3年H組の身長ならび = [_最も高いの身長_1|_残り生徒の身長ならび], '3年H組で最も高い身長'(_残り生徒の身長ならび,_最も高い身長_1,_3年H組で最も高い身長). '3年H組で最も高い身長'([],_3年H組で最も高い身長,_3年H組で最も高い身長). '3年H組で最も高い身長'([_生徒の身長|R],_最も高い身長_1,_3年H組で最も高い身長) :- _生徒の身長 @< _最も高い身長_1, '3年H組で最も高い身長'(R,_最も高い身長_1,_3年H組で最も高い身長). '3年H組で最も高い身長'([_生徒の身長|R],_最も高い身長_1,_3年H組で最も高い身長) :- _生徒の身長 @>= _最も高い身長_1, '3年H組で最も高い身長'(R,_生徒の身長,_3年H組で最も高い身長). % 以下のサイトは 'https://twitter.com/uso_tuki/status/509652179930456064'(_投球,_捕球,_アウトカウント,_ランナーの占有塁ならび,_打者ランナー他) :- 三回ストライクするとアウトになってしまうんじゃ(_投球,_捕球,_アウトカウント,_ランナーの占有塁ならび,_打者ランナー他). 三回ストライクするとアウトになってしまうんじゃ(打者に当たる,_,_,_,_) :- !. 三回ストライクするとアウトになってしまうんじゃ(_,正規捕球,_,_,_) :- !. 三回ストライクするとアウトになってしまうんじゃ(_,_,_アウトカウント,_ランナーの占有塁ならび,_) :- 振り逃げの可能性がない(_アウトカウント,_ランナーの占有塁ならび),!. 三回ストライクするとアウトになってしまうんじゃ(_,_,_,_,_打者ランナー他) :- 振り逃げが成立しない(_打者ランナー他). 振り逃げの可能性がない(一死,_ランナーの占有塁ならび) :- 一塁にランナーがいる(_ランナーの占有塁ならび). 振り逃げの可能性がない(二死,_ランナーの占有塁ならび) :- 一塁にランナーがいる(_ランナーの占有塁ならび). 一塁にランナーがいる(_ランナーの占有塁ならび) :- member(一塁,_ランナーの占有塁ならび). 振り逃げが成立しない(打者ランナーが一塁への走塁を放棄). 振り逃げが成立しない(打者ランナーが一塁で刺殺される). 振り逃げが成立しない(打者ランナーが一塁まで到達しないうちにタグされる). 振り逃げが成立しない(進塁を余儀なくされたランナーが次塁で刺殺される). 振り逃げが成立しない(進塁を余儀なくされたランナーが次塁に到達しないうちにタグされる). % 以下のサイトは 'https://twitter.com/uso_tuki/status/509652179930456064'(_投球,_捕球,_打者,_アウトカウント,_ランナー) :- 三回ストライクするとアウトになってしまうんじゃ(_投球,_捕球,_打者,_アウトカウント,_ランナー). 三回ストライクするとアウトになってしまうんじゃ(_投球,_,_打者,_,_) :- 打者に当たる(_投球), 空振り(_打者),!. 三回ストライクするとアウトになってしまうんじゃ(_投球,_捕球,_,_,_) :- ストライクゾーンを通過(_投球), 正規捕球(_捕球). 三回ストライクするとアウトになってしまうんじゃ(_,_捕球,_打者,_,_) :- 正規捕球(_捕球), 空振り(_打者). 三回ストライクするとアウトになってしまうんじゃ(_投球,_捕球,_,_アウトカウント,_ランナー) :- ストライクゾーンを通過(_投球), \+(正規捕球(_捕球)), 無死または一死(_アウトカウント), 一塁走者がいる(_ランナー). 三回ストライクするとアウトになってしまうんじゃ(_,_捕球,_打者,_アウトカウント,_ランナー) :- 空振り(_打者), \+(正規捕球(_捕球)), 無死または一死(_アウトカウント), 一塁走者がいる(_ランナー). % 以下のサイトは # 問題文 # (21:13 追記) |A|=|B|=1のケースがテスト中に一つ含まれていましたので、リジャッジを行います。なお、このケースでNOを出力するプログラムに影響はありません。 # # 文字列 A の文字をちょうど 3 回スワップすることにより、文字列 B に変換できるとき、二つの文字列 A, B を、仲良し文字列と呼ぶことにします。 # # スワップとは、文字列に含まれる 2 つの文字を、入れ替えることを指します。 例えば、abcという文字列であれば、aとcを入れ替えて、cbaのように変換することが出来ます。 # # aaのような文字列に対し、 1 文字目のaと、 2 文字目のaを入れ替えることは許されていますが、同じ場所の文字を指定することはできません。 # # 文字列 A, B が与えられるので、仲良し文字列になっているかどうかを判定しなさい。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # A # B # 1 行目には、文字列 A(2≦|A|≦1000) が与えられる。 # 2 行目には、文字列 B(|B|=|A|) が与えられる。 # A, B 共に、小文字アルファベットのみで構成されていることが保障されている。 # 出力 # 与えられた 2 つの文字列が、仲良し文字列であればYES、そうでなければNOを出力せよ。 出力の末尾には改行をいれること。 # # 入力例1 # abcdef # fedcba # 出力例1 # YES # まず、文字列 A のabcdefのaとfをスワップし、fbcdeaとします。 # # 次に、bとeをスワップし、fecdbaとします。 # # 最後に、cとdをスワップし、fedcbaとすると、文字列 B と一致します。 # # よって、この 2 つの文字列は、仲良し文字列となるため、YESと出力します。 # # 入力例2 # abababab # babababa # 出力例2 # NO # 使っている文字数が同じでも、 3 回のスワップでは同じ文字列にできないパターンも存在します。 # # 入力例3 # nt # nt # 出力例3 # NO # スワップの仕方が 1 通りしかなく、 3 回のスワップを繰り返すと、tnになってしまいます。 よって、同じ 2 つの文字列ですが、仲良し文字列ではありません。 # # 入力例4 # pqqq # pqqq # 出力例4 # YES # まず、 1 番目の文字と 2 番目の文字を入れ替え、qpqqとします。 次に、 3 番目の文字と 4 番目の文字を入れ替え、qpqqとします。この際、同じ文字を選んでいますが、場所が違うので問題ありません。 最後に、1番目の文字と、2番目の文字を入れ替え、pqqqとします。 # # 入力例5 # abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvxyzw # abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz # 出力例5 # YES # 長い文字列が与えらえれることがあることにも注意してください。 # # 入力例6 # abcdef # ghijkl # 出力例6 # NO 文字列と仲良し文字列(_文字列,_仲良し文字列) :- atom_chars(_文字列,L1), 文字列中の文字の三回スワップ(L1,[],L2), atom_chars(_仲良し文字列,L2). 文字列中の文字の三回スワップ(X,[_,_,_,_,_,_],X). 文字列中の文字の三回スワップ(L1,_履歴,X) :- スワップ(L1,_履歴,_nth0_1,_nth0_2,L2), 文字列中の文字の三回スワップ(L2,[_nth0_1,_nth0_2|_履歴],X). スワップ(L1,_履歴,_何番目_1,_何番目_2,L2) :- 交換する候補を得る(L1,_履歴,_何番目_1,_何番目_2,A,B), 交換する(L1,_何番目_1,_何番目_2,A,B,L2). 交換する候補を得る(L1,_履歴,_何番目_1,_何番目_2,_交換要素_1,_交換要素_2) :- 'まだ交換していない位置の要素を取り出す'(_何番目_1,L1,_履歴,_交換要素_1), 'まだ交換していない位置の要素を取り出す'(_何番目_2,L1,[_何番目_1|_履歴],_交換要素_2). 'まだ交換していない位置の要素を取り出す'(_何番目,L,_履歴,_交換要素) :- nth1(_何番目,L,_交換要素), \+(member(_何番目,_履歴)). 交換する(L1,_何番目_1,_何番目_2,A,B,L2) :- 'L2を生成する'(L1,L2), '交換する値をL2に埋める'(_何番目_1,_何番目_2,A,B,L2), 変数として残った要素を埋める(L1,L2). 'L2を生成する'(L1,L2) :- length(L1,Len), length(L2,Len). '交換する値をL2に埋める'(_何番目_1,_何番目_2,A,B,L2) :- nth1(_何番目_1,L2,B), nth1(_何番目_2,L2,A). 変数として残った要素を埋める([],[]). 変数として残った要素を埋める([A|R1],[A|R2]) :- 変数として残った要素を埋める(R1,R2),!. 変数として残った要素を埋める([_|R1],[A|R2]) :- 変数として残った要素を埋める(R1,R2). % 以下のサイトは # # 差分リストを使った、キュー操作。不完全データ構造。 # キューを生成する(X-X). キューからデータを取り出す(E,[E|X]-Y,X-Y). キューにデータを付け加える(E,X-[E|Y],X-Y). キューを連結する(X-Y,Y-Z,X-Z). キューは空である(X-Y) :- X == Y. % 以下のサイトは # 夏四月丙寅朔戊辰、皇太子親肇作憲法十七條。 # 一曰、以和爲貴、無忤爲宗。人皆有黨。亦少達者。以是、或不順君父。乍違于隣里。然上和下睦、諧於論事、則事理自通。何事不成。 # 二曰、篤敬三寶。々々者佛法僧也。則四生之終歸、萬國之禁宗。何世何人、非貴是法。人鮮尤惡。能?従之。其不歸三寶、何以直枉。 # 三曰、承詔必謹。君則天之。臣則地之。天覆臣載。四時順行、萬気得通。地欲天覆、則至懐耳。是以、君言臣承。上行下靡。故承詔必愼。不謹自敗。 # 四曰、群卿百寮、以禮爲本。其治民之本、要在禮乎、上不禮、而下非齊。下無禮、以必有罪。是以、群臣禮有、位次不亂。百姓有禮、國家自治。 # 五曰、絶饗棄欲、明辨訴訟。其百姓之訟、一百千事。一日尚爾、況乎累歳。頃治訟者、得利爲常、見賄廳?。便有財之訟、如右投水。乏者之訴、似水投石。是以貧民、則不知所由。臣道亦於焉闕。 # 六曰、懲惡勸善、古之良典。是以无匿人善、見-悪必匡。其諂詐者、則爲覆二國家之利器、爲絶人民之鋒劔。亦佞媚者、對上則好説下過、逢下則誹謗上失。其如此人、皆无忠於君、无仁於民。是大亂之本也。 # 七曰、人各有任。掌宜-不濫。其賢哲任官、頌音則起。?者有官、禍亂則繁。世少生知。剋念作聖。事無大少、得人必治。時無急緩。遇賢自寛。因此國家永久、社禝勿危。故古聖王、爲官以求人、爲人不求官。 # 八曰、群卿百寮、早朝晏退。公事靡監。終日難盡。是以、遲朝不逮于急。早退必事不盡。 # 九曰、信是義本。毎事有信。其善悪成敗、要在于信。群臣共信、何事不成。群臣无信、萬事悉敗。 # 十曰、絶忿棄瞋、不怒人違。人皆有心。々各有執。彼是則我非。我是則彼非。我必非聖。彼必非愚。共是凡夫耳。是非之理、?能可定。相共賢愚、如鐶无端。是以、彼人雖瞋、還恐我失。、我獨雖得、從衆同擧。 # 十一曰、明察功過、賞罰必當。日者賞不在功。罰不在罪。執事群卿、宜明賞罰。 # 十二曰、國司國造、勿収斂百姓。國非二君。民無兩主。率土兆民、以王爲主。所任官司、皆是王臣。何敢與公、賦斂百姓。 # 十三曰、諸任官者、同知職掌。或病或使、有闕於事。然得知之日、和如曾識。其以非與聞。勿防公務。 # 十四曰、群臣百寮、無有嫉妬。我既嫉人、々亦嫉我。嫉妬之患、不知其極。所以、智勝於己則不悦。才優於己則嫉妬。是以、五百之乃今遇賢。千載以難待一聖。其不得賢聖。何以治國。 # 十五曰、背私向公、是臣之道矣。凡人有私必有恨。有憾必非同、非同則以私妨公。憾起則違制害法。故初章云、上下和諧、其亦是情歟。 # 十六曰、使民以時、古之良典。故冬月有間、以可使民。從春至秋、農桑之節。不可使民。其不農何食。不桑何服。 # 十七曰、夫事不可獨斷。必與衆宜論。少事是輕。不可必衆。唯逮論大事、若疑有失。故與衆相辮、辭則得理。 # # # やわらぐをもて貴しとし # やわらぐをもて貴しとし(_幾重にも囲まれた囲い,_平になった囲い) :- 垣根を取り払う(_幾重にも囲まれた囲い,_平になった囲い). 垣根を取り払う(_幾重にも囲まれた囲い,_平になった囲い) :- flatten(_幾重にも囲まれた囲い,_平になった囲い). % 以下のサイトは # 夏四月丙寅朔戊辰、皇太子親肇作憲法十七條。 # 一曰、以和爲貴、無忤爲宗。人皆有黨。亦少達者。以是、或不順君父。乍違于隣里。然上和下睦、諧於論事、則事理自通。何事不成。 # 二曰、篤敬三寶。々々者佛法僧也。則四生之終歸、萬國之禁宗。何世何人、非貴是法。人鮮尤惡。能?従之。其不歸三寶、何以直枉。 # 三曰、承詔必謹。君則天之。臣則地之。天覆臣載。四時順行、萬気得通。地欲天覆、則至懐耳。是以、君言臣承。上行下靡。故承詔必愼。不謹自敗。 # 四曰、群卿百寮、以禮爲本。其治民之本、要在禮乎、上不禮、而下非齊。下無禮、以必有罪。是以、群臣禮有、位次不亂。百姓有禮、國家自治。 # 五曰、絶饗棄欲、明辨訴訟。其百姓之訟、一百千事。一日尚爾、況乎累歳。頃治訟者、得利爲常、見賄廳?。便有財之訟、如右投水。乏者之訴、似水投石。是以貧民、則不知所由。臣道亦於焉闕。 # 六曰、懲惡勸善、古之良典。是以无匿人善、見-悪必匡。其諂詐者、則爲覆二國家之利器、爲絶人民之鋒劔。亦佞媚者、對上則好説下過、逢下則誹謗上失。其如此人、皆无忠於君、无仁於民。是大亂之本也。 # 七曰、人各有任。掌宜-不濫。其賢哲任官、頌音則起。?者有官、禍亂則繁。世少生知。剋念作聖。事無大少、得人必治。時無急緩。遇賢自寛。因此國家永久、社禝勿危。故古聖王、爲官以求人、爲人不求官。 # 八曰、群卿百寮、早朝晏退。公事靡監。終日難盡。是以、遲朝不逮于急。早退必事不盡。 # 九曰、信是義本。毎事有信。其善悪成敗、要在于信。群臣共信、何事不成。群臣无信、萬事悉敗。 # 十曰、絶忿棄瞋、不怒人違。人皆有心。々各有執。彼是則我非。我是則彼非。我必非聖。彼必非愚。共是凡夫耳。是非之理、?能可定。相共賢愚、如鐶无端。是以、彼人雖瞋、還恐我失。、我獨雖得、從衆同擧。 # 十一曰、明察功過、賞罰必當。日者賞不在功。罰不在罪。執事群卿、宜明賞罰。 # 十二曰、國司國造、勿収斂百姓。國非二君。民無兩主。率土兆民、以王爲主。所任官司、皆是王臣。何敢與公、賦斂百姓。 # 十三曰、諸任官者、同知職掌。或病或使、有闕於事。然得知之日、和如曾識。其以非與聞。勿防公務。 # 十四曰、群臣百寮、無有嫉妬。我既嫉人、々亦嫉我。嫉妬之患、不知其極。所以、智勝於己則不悦。才優於己則嫉妬。是以、五百之乃今遇賢。千載以難待一聖。其不得賢聖。何以治國。 # 十五曰、背私向公、是臣之道矣。凡人有私必有恨。有憾必非同、非同則以私妨公。憾起則違制害法。故初章云、上下和諧、其亦是情歟。 # 十六曰、使民以時、古之良典。故冬月有間、以可使民。從春至秋、農桑之節。不可使民。其不農何食。不桑何服。 # 十七曰、夫事不可獨斷。必與衆宜論。少事是輕。不可必衆。唯逮論大事、若疑有失。故與衆相辮、辭則得理。 # # # 和を以て貴しと為す # 以和爲貴(_幾重にも垣根に囲まれたならび,_平になったならび) :- 和を以て貴しと為す(_幾重にも垣根に囲まれたならび,_平になったならび). 和を以て貴しと為す(_幾重にも垣根に囲まれたならび,_平になったならび) :- 垣根を取り払う(_幾重にも垣根に囲まれたならび,_平になったならび). 垣根を取り払う(_幾重にも垣根に囲まれたならび,_平になったならび) :- flatten(_幾重にも垣根に囲まれたならび,_平になったならび). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/771 # [1] 授業単元:プログラミング # [2] 問題文 # 10人の学生の点数を読み込み、配布を図のように表示するプログラムを作成せよ # #     100: * # 90 - 99: ** # 80 - 89: *** #    (中略) # 0 -  9: * # # 点数は100点満点とし、人数分だけ * を出力すること #  [3.1] OS: Windows8 #  [3.3] 言語: C # よろしくお願いします。 # # '10人の学生の点数を読み込み、配布を図のように表示するプログラムを作成せよ     100: * 90 - 99: ** 80 - 89: ***    (中略) 0 -  9: * 点数は100点満点とし、人数分だけ * を出力すること' '点数は100点満点とし、10人の学生の点数を読み込み、'(_10人の学生の点数), '配布を図のように表示するプログラムを作成せよ     100: * 90 - 99: ** 80 - 89: ***    (中略) 0 -  9: * 点数は100点満点とし、人数分だけ * を出力すること'(_10人の学生の点数). '点数は100点満点とし、10人の学生の点数を読み込み、'(_10人の学生の点数) :- findall(_学生の点数,( between(1,10,_), 整数を得る(学生の点数,'点数は100点満点とし、'(_学生の点数),_学生の点数)), _10人の学生の点数). '点数は100点満点とし、'(_学生の点数) :- _学生の点数 >= 0, _学生の点数 =< 100. '配布を図のように表示するプログラムを作成せよ     100: * 90 - 99: ** 80 - 89: ***    (中略) 0 -  9: * 点数は100点満点とし、人数分だけ * を出力すること'(_10人の学生の点数) :- 表示は100点だけ特別(_10人の学生点数), '100点以外の10クラスの表示'(_10人の学生の点数). 表示は100点だけ特別(_10人の学生の点数) :- クラスの学生の人数(_10人の学生の点数,100,100,_100点の学生の人数), sub_atom('**********',0,_100点の学生の人数,_,_100点の学生の人数表示), writef(' 100: %t\n',[_100点の学生の人数表示]),!. '100点以外の10クラスの表示'(_10人の学生の点数) :- クラスの学生の人数(_クラス,_10人の学生の点数,_クラスの下限の点数,_クラスの上限の点数,_クラスの学生の人数), sub_atom('**********',0,_クラスの学生の人数,_,_クラスの学生の人数表示), writef('%3R-%3R: %t\n',[_クラスの下限の点数,_クラスの上限の点数,_クラスの学生の人数表示]), _クラス = 0. クラスの学生の人数(_クラス,_10人の学生の点数,_クラスの下限の点数,_クラスの上限の点数,_クラスの学生の人数) :- member(_クラス,[9,8,7,6,5,4,3,2,1,0]), 'クラスの下限の点数、上限の点数'(_クラスの下限の点数,_クラスの上限の点数), クラスの学生の人数(_10人の学生の点数,_クラスの下限の点数,_クラスの上限の点数,_クラスの学生の人数). 'クラスの下限の点数、上限の点数'(_クラスの下限の点数,_クラスの上限の点数) :- _クラスの下限の点数 is _クラス * 10, _クラスの上限の点数 is _クラス * 10 + 9. クラスの学生の人数(_10人の学生の点数,_クラスの下限の点数,_クラスの上限の点数,_クラスの学生の人数) :- finsum(1,( member(_学生の点数,_10人の学生の点数), _学生の点数 >= _クラスの下限の点数, _学生の点数 =< _クラスの上限の点数)), _クラスの学生の人数). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/769 # [1] 授業単元:プログラミング # [2] 問題文 # 6人の学生の点数を読み込み、最高点を表示するプログラムを作成せよ # '6人の学生の点数を読み込み、最高点を表示するプログラムを作成せよ' :- '6人の学生の点数を読み込み、最高点を表示する'. '6人の学生の点数を読み込み、最高点を表示する' :- '6人の学生の点数を読み込み、'(_6人の学生の点数), 最高点を表示する(_6人の学生の点数). '6人の学生の点数を読み込み、'(_6人の学生の点数) :- '6人の学生の'(_6人の学生の点数), 点数を読み込み(_6人の学生の点数). '6人の学生の点数を読み込み、'(_6人の学生の点数) :- findall(_学生の点数,( between(1,6,_), 整数を得る(学生の点数,true,_学生の点数)), _6人の学生の点数). 最高点を表示する(_6人の学生の点数) :- 最高点を(_6人の学生の点数,_最高点), 表示する(_6人の学生の点数,_最高点). 最高点を(_6人の学生の点数,_最高点) :- append(L1,[_最高点|L2],_6人の学生の点数), \+((member(A,L1),A > _最高点)), \+((member(A,L2),A > _最高点)). 表示する(_6人の学生の点数,_最高点) :- writef('6人の学生の点数 = %t,%t,%t,%t,%t,%t\n',_6人の学生の点数), writef('最高点 = %t\n',[_最高点]). % 以下のサイトは # 出典: http://peace.2ch.net/test/read.cgi/tech/1392388003/765 # [1] 授業単元:プログラミング1 # [2] 問題文:n人分の試験の得点の和と平均を求めるプログラムを作成せよ。 # 始めに処理するデータの人数nを読み込み、次にn人分の得点を読み込む。 # そして、和と平均を求め出力する。 # 次に、s(90以上)、a(80〜89)、b(70〜79)、c(60〜69)、f(それ以外) # の人数を求めるプログラムを、if else文を使い作成せよ。 # # ここからが本題なのですが # # 上記問題のs、a、b、c、fの人数を # 関数を使用して*で表すヒストグラムにせよ。 # # 'n人分の試験の得点の和と平均を求めるプログラムを作成せよ。 始めに処理するデータの人数nを読み込み、次にn人分の得点を読み込む。 そして、和と平均を求め出力する。 次に、s(90以上)、a(80〜89)、b(70〜79)、c(60〜69)、f(それ以外) の人数を求めるプログラムを、if else文を使い作成せよ。 ここからが本題なのですが 上記問題のs、a、b、c、fの人数を 関数を使用して*で表すヒストグラムにせよ。'(_ヒストグラム) :- 'n人分の試験の得点の和と平均を求めるプログラムを作成せよ。 始めに処理するデータの人数nを読み込み、次にn人分の得点を読み込む。 そして、和と平均を求め'(_n,_n人分の得点ならび,_得点の和,_平均), 出力する(_得点の和,_平均), '次に、s(90以上)、a(80〜89)、b(70〜79)、c(60〜69)、f(それ以外) の人数を求めるプログラムを、if else文を使い作成せよ。'(_n人分の得点ならび,_クラス_人数ならび), '上記問題のs、a、b、c、fの人数を 関数を使用して*で表すヒストグラムにせよ。'(_n,_クラス_人数ならび,_ヒストグラム). 'n人分の試験の得点の和と平均を求めるプログラムを作成せよ。 始めに処理するデータの人数nを読み込み、次にn人分の得点を読み込む。 そして、和と平均を求め'(_n,_n人分の得点ならび,_得点の和,_平均) :- '始めに処理するデータの人数nを読み込み、'(_n), '次にn人分の得点を読み込む。'(_n,_n人分の得点ならび), 'n人分の試験の得点の和と平均を求める'(_n,_n人分の得点ならび,_得点の和,_平均). '始めに処理するデータの人数nを読み込み、'(_n) :- 整数を得る(人数,true,_人数). '次にn人分の得点を読み込む。'(_n,_n人分の得点ならび) :- findall(_得点,( between(1,_n,_), 整数を得る(得点,true,_得点)), _n人分の得点ならび). 'n人分の試験の得点の和と平均を求める'(_n,_n人分の得点ならび,_得点の和,_平均) :- sum_list(_n人分の得点ならび,_得点の和), _平均 is _得点の和 / _n. 出力する(_得点の和,_平均) :- writef('得点の和 = %t\n平均 = %t\n',[_得点の和,_平均]). '次に、s(90以上)、a(80〜89)、b(70〜79)、c(60〜69)、f(それ以外) の人数を求めるプログラムを、if else文を使い作成せよ。'(_n人分の得点ならび,_クラス_人数ならび) :- findall([_クラス,_人数],( member(_クラス,[s,a,b,c,f]), クラスの人数(_クラス,_n人分の得点ならび,_人数)), _クラス_人数_ならび). クラスの人数(_クラス,_n人分の得点ならび,_人数) :- findall(1,( member(_得点,_n人分の得点ならび), クラス(_クラス,_得点)), L), sum_list(L,_人数). クラス(s,_得点) :- _得点 >= 90. クラス(a,_得点) :- between(80,89,_得点). クラス(b,_得点) :- between(70,79,_得点). クラス(c,_得点) :- between(60,69,_得点). クラス(f,_得点) :- クラス_f(_得点). クラス_f(_得点) :- \+(_得点 >= 60). '上記問題のs、a、b、c、fの人数を 関数を使用して*で表すヒストグラムにせよ。'(_n,_クラス_人数ならび,_ヒストグラム) :- length(_クラス_人数ならび,_クラスの数), ヒストグラムの生成(_n,_クラスの数,_クラス_人数ならび,_ヒストグラム). ヒストグラムの生成(_n,_クラスの数,_クラス_人数ならび,_ヒストグラム) :- findall([_クラス,_星文字列],( member([_クラス,_人数],_クラス_人数ならび), _星の数 is _人数 // (_n // _クラスの数 // 5), 星文字列(_星の数,_星文字列)), _ヒストグラム). 星文字列(_星の数,_星文字列) :- findall('*',between(1,_星の数,_),L), atomic_list_concat(L,_星文字列). % 以下のサイトは # S(1≦S≦10) # L(100≦L≦100) # 標準入力から以下の形式で与えられる # S L # # 例を参考にoとxを配置せよ # # 例 # 3 2 # oooxxx # oooxxx # oooxxx # xxxooo # xxxooo # xxxooo # # 2 3 # ooxxoo # ooxxoo # xxooxx # xxooxx # ooxxoo # ooxxoo # # 1 1 # o # # 2 1 # oo # :- dynamic(行パターン,1). 白(白). 黒(黒). '_行数 is S * L, S(1≦S≦10) L(100≦L≦100) 標準入力から以下の形式で与えられる S L' :- 'S Lを得る'(_s,_l), 表示パターンの形成(_s,_l,LL1), 出力する(LL1). 表示パターンの形成(_s,_l,_表示パターン) :- 行パターンの定義(_s,_l), 表の形成(_s,_l,_表示パターン), 転置して具体値を埋める(_表示パターン). 行パターンの定義(_s,_l) :- 白(_白), 黒(_黒), 行パターンの生成(_白,_黒,_s,_l), 行パターンの生成(_黒,_白,_s,_l). 行パターンの生成(_文字_1,_文字_2,_s,_l) :- length(Ln,_l), findall(文字,( 同一文字列トグル(Ln,_s,_文字_1,_文字_2,_文字)), _行パターン), assertz(行パターン(_行パターン)). 同一文字列トグル([_|_],_s,_文字,_,_文字) :- between(1,_s,_). 同一文字列トグル([_|Ln],_s,_文字_1,_文字_2,_文字) :- 同一文字列トグル(Ln,_s,_文字_2,_文字_1,_文字). 転置して具体値を埋める([L1|R]) :- 転置([L1|R],LL2), findall(L,( member(L,LL2), 行パターン(L)), LL2). 表の形成(_s,_l,[_行パターン|LL]) :- 行パターン(_行パターン),!, findall(L,( between(2,_l,_), length(L,_s)), LL). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 'S Lを得る'(S,L) :- get_line(Line), split(Line,[' '],[S,L]). 出力する(LL) :- flatten(LL,L), forall(member(A,L),format('~w\n',[A])). % 以下のサイトは # 出典: プログラムのお題スレ Part4 #38 # # 標準入力から与えられたフォーマットを元に年齢を求めて出力せよ # 標準入力から以下の形式で与えられます # YYYY/MM/dd # # 年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる。 '標準入力から与えられたフォーマットを元に年齢を求めて出力せよ 標準入力から以下の形式で与えられます YYYY/MM/dd 年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる。' :- '標準入力から与えられたフォーマット(YYYY/MM/dd)を元に'(_年,_月,_日), '年齢を求めて(年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる)'(_年,_月,_日,_年齢), 出力せよ(_年齢). '標準入力から与えられたフォーマット(YYYY/MM/dd)を元に'(_年,_月,_日) :- get_line(_文字列), read_term_from_atom(_文字列,_年/_月/_日,[]). '年齢を求めて(年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる)'(_年,_月,_日,_年齢) :- date(date(_今日_年,_今日_月,_今日_日)), 誕生日の前日(_今日_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日), '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢). 誕生日の前日(_年,_月,1,_前日_年,_前日_月,_前日_日) :- 誕生日の前月と月末日を得る(_年,_月,1,_前日_年,_前日_月,_前日_日). 誕生日の前日(_年,_月,_日,_年,_月,_前日_日) :- \+(_日 = 1), succ(_前日_日,_日). 誕生日の前月と月末日を得る(_誕生日の年,1,1,_誕生日の前年,12,31) :- succ(_誕生日の前年,_誕生日の年). 誕生日の前月と月末日を得る(_年,3,1,_年,2,_誕生日の前月末日) :- '3月1日はうるう年であるか否かで誕生日の前月末日が変わる'(_年,_誕生日の前月末日). 誕生日の前月と月末日を得る(_年,_誕生日の月,1,_年,_誕生日の前月,30) :- '誕生日の前月が小の月(2月を除く)'(_誕生日の月,_誕生日の前月). 誕生日の前月と月末日を得る(_年,_誕生日の月,1,_年,_誕生日の前月,31) :- '誕生日の前月が大の月(12月を除く)'(_誕生日の月,_誕生日の前月). '3月1日はうるう年であるか否かで誕生日の前月末日が変わる'(_年,29) :- うるう年(_年). '3月1日はうるう年であるか否かで誕生日の前月末日が変わる'(_年,28) :- \+(うるう年(_年)). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. '誕生日の前月が小の月(2月を除く)'(_誕生日の月,_誕生日の前月) :- succ(_誕生日の前月,_誕生日の月), member(_誕生日の前月,[4,6,9,11]). '誕生日の前月が大の月(12月を除く)'(_誕生日の月,_誕生日の前月) :- succ(_誕生日の前月,_誕生日の月), member(_誕生日の前月,[1,3,5,7,8,10]). '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- まだ誕生日の前日になっていない(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢). '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- 既に誕生日の前日を過ぎている(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢). まだ誕生日の前日になっていない(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 < _誕生日の前日_月, _年齢 is _誕生日の前日の年 - _年 - 1. まだ誕生日の前日になっていない(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 = _誕生日の前日_月, _日 < _誕生日の前日の日, _年齢 is _誕生日の前日_年 - _年 - 1. 既に誕生日の前日を過ぎている(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 > _誕生日の前日_月, _年齢 is _誕生日の前日の年 - _年. 既に誕生日の前日を過ぎている(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 = _誕生日の前日_月, _日 >= _誕生日の前日_日, _年齢 is _誕生日の前日_年 - _年. 出力せよ(_年齢) :- writef('%t歳です\n',[_年齢]). % 以下のサイトは # 出典: プログラムのお題スレ Part4 #38 # # 標準入力から与えられたフォーマットを元に年齢を求めて出力せよ # 標準入力から以下の形式で与えられます # YYYY/MM/dd # # 年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる。 '標準入力から与えられたフォーマットを元に年齢を求めて出力せよ 標準入力から以下の形式で与えられます YYYY/MM/dd 年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる。' :- '標準入力から与えられたフォーマット(YYYY/MM/dd)を元に'(_年,_月,_日), '年齢を求めて(年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる)'(_年,_月,_日,_年齢), 出力せよ(_年齢). '標準入力から与えられたフォーマット(YYYY/MM/dd)を元に'(_年,_月,_日) :- get_line(_文字列), read_term_from_atom(_文字列,_年/_月/_日,[]). '年齢を求めて(年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる)'(_年,_月,_日,_年齢) :- date(date(_今日_年,_今日_月,_今日_日)), 誕生日の前日(_今日_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日), '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢). 誕生日の前日(_年,1,1,_前日_年,12,31) :- succ(_前日_年,_年),!. 誕生日の前日(_年,3,1,_年,2,29) :- うるう年(_年),!. 誕生日の前日(_年,3,1,_年,2,28) :- \+(うるう年(_年)),!. 誕生日の前日(_年,_月,1,_年,_前日_月,31) :- member(_月,[2,4,6,9,11]), succ(_前日_月,_月),!. 誕生日の前日(_年,_月,1,_年,_前日_月,30) :- member(_月,[5,7,8,10,12]), succ(_前日_月,_月),!. 誕生日の前日(_年,_月,_日,_年,_月,_前日_日) :- succ(_前日_日,_日). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 > _誕生日の前日_月, _年齢 is _誕生日の前日の年 - _年. '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 < _誕生日の前日_月, _年齢 is _誕生日の前日の年 - _年 - 1. '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 = _誕生日の前日_月, _日 >= _誕生日の前日_日, _年齢 is _誕生日の前日_年 - _年. '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 = _誕生日の前日_月, _日 < _誕生日の前日の日, _年齢 is _誕生日の前日_年 - _年 - 1. 出力せよ(_年齢) :- writef('%t歳です\n',[_年齢]). % 以下のサイトは # 出典: twitter_by_@warazo_20140611 # #     RT #    RTRT #   RTRTRT #  RTRTRTRT # RTRTRTRTRT #  RTRTRTRT #   RTRTRT #    RTRT #     RT # '     RT    RTRT   RTRTRT  RTRTRTRT RTRTRTRTRT  RTRTRTRT   RTRTRT    RTRT     RT ' :- 'RT文字列'. 'RT文字列' :- 'RT文字列描画前半部', 'RT文字列描画後半部'. 'RT文字列描画前半部' :- char_code(' ',_全角空白文字コード), 'RT文字列描画前半部'(_RT副文字列,_表示制御文字列), format(_表示制御文字,[_全角空白文字コード,_RT副文字列,_全角空白文字コード]), _RT副文字列 = 'RTRTRTRT'. 'RT文字列描画前半部'(_RT副文字列,_表示制御文字列) :- sub_atom('RTRTRTRTRT',S,Len,R,_RT副文字列), Len > 0, 0 is S mod 2, _m is R // 2, 表示制御文字列の生成(_m,_表示制御文字列). 'RT文字列描画後半部' :- char_code(' ',_全角空白文字コード), 'RT文字列描画後半部'(_RT副文字列,_表示制御文字列), format(_表示制御文字,[_全角空白文字コード,_RT副文字列,_全角空白文字コード]), _RT副文字列 = 'RT'. 'RT文字列描画後半部'(_RT副文字列,_表示制御文字列) :- sub_atom('RTRTRTRTRT',S,_,0,_RT副文字列), 0 is S mod 2, _m is S // 2, 表示制御文字列の生成(_m,_表示制御文字列). 表示制御文字の生成(_m,_表示制御文字列) :- atomic_list_concat(['~',_m,c,'%q','~'_m,c~n],_表示制御文字列). % 以下のサイトは % 出典: twitter_by_@wakamesoba98_20140605 丸ノ内線の時刻表は何度見ても面白い(_丸ノ内線の時刻表) :- findall([N,L],( 丸ノ内線新宿駅池袋方面標準時刻表(N,L)), _丸ノ内線の時刻表). 丸ノ内線新宿駅池袋方面標準時刻表(5,[00,15,28,35,41,48,54]). 丸ノ内線新宿駅池袋方面標準時刻表(6',[00,05,09,14,24,27,30,35,38,41,44,48,51,55,58]). 丸ノ内線新宿駅池袋方面標準時刻表(7',[01,04,07,10,13,16,19,21,23,26,29,31,33,36,38,41,43,45,48,50,52,55,57,59]). 丸ノ内線新宿駅池袋方面標準時刻表(8',[01,03,05,08,09,11,13,15,18,19,21,24,26,28,30,32,35,37,39,41,44,46,48,50,53, 54,57,59]). 丸ノ内線新宿駅池袋方面標準時刻表(9',[01,04,06,08,10,12,15,17,19,22,26,29,32,34,36,39,42,45,47,49,52,54,58]). 丸ノ内線新宿駅池袋方面標準時刻表(10',[01,04,08,12,16,20,24,28,32,36,40,44,48,52,56]). 丸ノ内線新宿駅池袋方面標準時刻表(11,[01,04,06,13,16,20,25,28,32,37,40,44,49,52,56]). 丸ノ内線新宿駅池袋方面標準時刻表(12,[01,04,08,13,16,20,25,28,32,37,40,44,49,52,56]). 丸ノ内線新宿駅池袋方面標準時刻表(13,[01,04,08,13,16,20,25,28,32,37,40,44,49,52,56]). 丸ノ内線新宿駅池袋方面標準時刻表(14,[01,04,08,13,16,20,25,28,32,37,40,44,49,52,56]). '11時から14時の丸ノ内線新宿駅池袋方面標準時刻表の生成規則'(_何時,_時刻ならび) :- between(11,14,_何時), '11時から14時までの時刻ならびは3分,4分,5分の順刻みを繰り返す'(1,[3,4,5],_時刻ならび). '11時から14時までの時刻ならびは3分,4分,5分の順刻みを繰り返す'(N,[],L) :- '11時から14時までの時刻ならびは3分,4分,5分の順刻みを繰り返す'(N,[3,4,5],L). '11時から14時までの時刻ならびは3分,4分,5分の順刻みを繰り返す'(N,[M|R2],[]) :- N > 59,!. '11時から14時までの時刻ならびは3分,4分,5分の順刻みを繰り返す'(N,[M|R2],[N|R3]) :- N2 is N + M, '11時から14時までの時刻ならびは3分,4分,5分の順刻みを繰り返す'(N2,R2,R3). % 以下のサイトは # # 鎮 静 剤 #               マリー・ローランサン #                   堀口大學 訳 # # # 退屈な女より もっと哀れなのは 悲しい女です。 # # 悲しい女より もっと哀れなのは 不幸な女です。 # # 不幸な女より もっと哀れなのは 病気の女です。 # # 病気の女より もっと哀れなのは 捨てられた女です。 # # 捨てられた女より もっと哀れなのは よるべない女です。 # # よるべない女より もっと哀れなのは 追われた女です。 # # 追われた女より もっと哀れなのは 死んだ女です。 # # 死んだ女より もっと哀れなのは 忘れられた女です。 # # :- 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([_どんな女,より,' もっと哀れなのは ',_こんな女,'です。'],_もっと哀れなのは). 鎮静剤(_,_こんな女,_もっと哀れなのは) :- 鎮静剤(_こんな女,_もっと哀れなのは). よるべない女 より もっと哀れなのは 追われた女 です. 退屈な女 より もっと哀れなのは 悲しい女 です. 忘れられた女 より もっと哀れなのは 退屈な女 です. 追われた女 より もっと哀れなのは 死んだ女 です. 不幸な女 より もっと哀れなのは 病気の女 です. 捨てられた女 より もっと哀れなのは よるべない女 です. 病気の女 より もっと哀れなのは 捨てられた女 です. 悲しい女 より もっと哀れなのは 不幸な女 です. 死んだ女 より もっと哀れなのは 忘れられた女 です. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ?- 鎮静剤(退屈な女,_節). _節 = '退屈な女より もっと哀れなのは 悲しい女です。' ; _節 = '悲しい女より もっと哀れなのは 不幸な女です。' ; _節 = '不幸な女より もっと哀れなのは 病気の女です。' ; _節 = '病気の女より もっと哀れなのは 捨てられた女です。' ; _節 = '捨てられた女より もっと哀れなのは よるべない女です。' ; _節 = 'よるべない女より もっと哀れなのは 追われた女です。' ; _節 = '追われた女より もっと哀れなのは 死んだ女です。' ; _節 = '死んだ女より もっと哀れなのは 忘れられた女です。' ; _節 = '忘れられた女より もっと哀れなのは 退屈な女です。' ; _節 = '退屈な女より もっと哀れなのは 悲しい女です。' ; _節 = '悲しい女より もっと哀れなのは 不幸な女です。' ; _節 = '不幸な女より もっと哀れなのは 病気の女です。' ; _節 = '病気の女より もっと哀れなのは 捨てられた女です。' ; _節 = '捨てられた女より もっと哀れなのは よるべない女です。' . ?- % 以下のサイトは # # 鎮 静 剤 #               マリー・ローランサン #                   堀口大學 訳 # # # 退屈な女より もっと哀れなのは 悲しい女です。 # # 悲しい女より もっと哀れなのは 不幸な女です。 # # 不幸な女より もっと哀れなのは 病気の女です。 # # 病気の女より もっと哀れなのは 捨てられた女です。 # # 捨てられた女より もっと哀れなのは よるべない女です。 # # よるべない女より もっと哀れなのは 追われた女です。 # # 追われた女より もっと哀れなのは 死んだ女です。 # # 死んだ女より もっと哀れなのは 忘れられた女です。 # # :-op(500,xfx,もっと哀れなのは). 鎮静剤(_どんな女,_もっと哀れなのは) :- atom_concat(_どんな女,より,_どんな女より), _どんな女より もっと哀れなのは _こんな女です, sub_atom(_こんな女です,0,_,2,_こんな女), 鎮静剤(_どんな女,_こんな女,_もっと哀れなのは). 鎮静剤(_どんな女,_こんな女,_もっと哀れなのは) :- atomic_list_concat([_どんな女,より,' もっと哀れなのは ',_こんな女,'です。'],_もっと哀れなのは). 鎮静剤(_,_こんな女,_もっと哀れなのは) :- 鎮静剤(_こんな女,_もっと哀れなのは). よるべない女より もっと哀れなのは 追われた女です. 退屈な女より もっと哀れなのは 悲しい女です. 忘れられた女より もっと哀れなのは 退屈な女です. 追われた女より もっと哀れなのは 死んだ女です. 不幸な女より もっと哀れなのは 病気の女です. 捨てられた女より もっと哀れなのは よるべない女です. 病気の女より もっと哀れなのは 捨てられた女です. 悲しい女より もっと哀れなのは 不幸な女です. 死んだ女より もっと哀れなのは 忘れられた女です. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ?- 鎮静剤(退屈な女,_節). _節 = '退屈な女より もっと哀れなのは 悲しい女です。' ; _節 = '悲しい女より もっと哀れなのは 不幸な女です。' ; _節 = '不幸な女より もっと哀れなのは 病気の女です。' ; _節 = '病気の女より もっと哀れなのは 捨てられた女です。' ; _節 = '捨てられた女より もっと哀れなのは よるべない女です。' ; _節 = 'よるべない女より もっと哀れなのは 追われた女です。' ; _節 = '追われた女より もっと哀れなのは 死んだ女です。' ; _節 = '死んだ女より もっと哀れなのは 忘れられた女です。' ; _節 = '忘れられた女より もっと哀れなのは 退屈な女です。' ; _節 = '退屈な女より もっと哀れなのは 悲しい女です。' ; _節 = '悲しい女より もっと哀れなのは 不幸な女です。' ; _節 = '不幸な女より もっと哀れなのは 病気の女です。' ; _節 = '病気の女より もっと哀れなのは 捨てられた女です。' ; _節 = '捨てられた女より もっと哀れなのは よるべない女です。' . ?- % 以下のサイトは # # 鎮 静 剤 #               マリー・ローランサン #                   堀口大學 訳 # # # 退屈な女より もっと哀れなのは 悲しい女です。 # # 悲しい女より もっと哀れなのは 不幸な女です。 # # 不幸な女より もっと哀れなのは 病気の女です。 # # 病気の女より もっと哀れなのは 捨てられた女です。 # # 捨てられた女より もっと哀れなのは よるべない女です。 # # よるべない女より もっと哀れなのは 追われた女です。 # # 追われた女より もっと哀れなのは 死んだ女です。 # # 死んだ女より もっと哀れなのは 忘れられた女です。 # # :-op(500,xfx,もっと哀れなのは). 退屈な女より もっと哀れなのは 悲しい女です. 悲しい女より もっと哀れなのは 不幸な女です. 不幸な女より もっと哀れなのは 病気の女です. 病気の女より もっと哀れなのは 捨てられた女です. 捨てられた女より もっと哀れなのは よるべない女です. よるべない女より もっと哀れなのは 追われた女です. 追われた女より もっと哀れなのは 死んだ女です. 死んだ女より もっと哀れなのは 忘れられた女です. % 以下のサイトは # 複数の持ち回りのタスクを、同じ人が連続しないとかの条件付きでスケヂュールしてくれるプログラム作るとしたら言語は何で作る? # あーエクセルでも出来そうだなー。なんか解の探索?みたいな問題になって、使ったことないけどLispとかPrologとかそういうプログラムで作ると良いのかなとか考えてたんだよね。 # 具体的に言えば、輪講・論文紹介・研究進捗報告、の3種のタスクを毎週こなしましょう。学生のリストがあってそれぞれ持ちまわります。ただしドクターの人は輪講はやらない。なるべく2週続けてタスクが割り振られないようにしたい。という感じですね。 # # @tonno727 具体的に言えば、輪講・論文紹介・研究進捗報告、の3種のタスクを # 毎週こなしましょう。学生のリストがあってそれぞれ持ちまわります。 # ただしドクターの人は輪講はやらない。 # なるべく2週続けてタスクが割り振られないようにしたい。という感じですね。 学生(馬場,学生). 学生(横溝,学生). 学生(円谷,ドクター). 学生(船井,学生). 学生(金井,ドクター). 学生(山内,学生). 学生(林田,学生). 学生(沢木,学生). スケジュール(_輪講回数,_論文紹介回数,_研究進捗報告回数,_スケジュール) :- 輪講者ならびを生成(_輪講者ならび), 論文紹介者ならびを生成(_論文紹介者ならび), 研究進捗報告者ならびを生成(_研究進捗報告者ならび), スケジュール(_輪講回数,_論文紹介回数,_研究進捗報告回数,[],_輪講者ならび,_論文紹介者ならび,_研究進捗報告者ならび,_スケジュール). スケジュール(0,0,0,_,_,_,_,[]) :- !. スケジュール(_輪講残り回数,_論文紹介残り回数,_研究進捗報告残り回数,_前週ならび,_輪講者,_論文紹介者,_研究進捗報告者,[[_輪講者,_論文紹介者,_研究進捗報告者]|R]) :- 輪講者候補(_輪講残り回数,_前週ならび,_輪講者ならび,_輪講残り回数_2,_輪講者,_輪講者ならび_2), 論文紹介者候補(_論文紹介残り回数,_前週ならび,_論文紹介者ならび,_論文紹介残り回数_2,_論文紹介者,_論文紹介者ならび_2), 研究進捗報告者候補(_研究進捗報告残り回数,_前週ならび,_研究進捗報告者ならび,_研究進捗報告残り回数_2,_研究進捗報告者,_研究進捗報告者ならび_2), スケジュール(_輪講残り回数_2,_論文紹介残り回数_2,_研究進捗報告残り回数_2,[_輪講者,_論文紹介者,_研究進捗報告者],_輪講者ならび_2,_論文紹介者ならび_2,_研究進捗報告報告者ならび_2,R). 輪講者候補(0,_,_,0,'',_) :- !. 輪講者候補(M,_前週ならび,[],N,_輪講者,_輪講者ならび_2) :- 輪講者ならびを生成してから候補を得る(M,_前週ならび,[],N,_輪講者,_輪講者ならび_2). 輪講者候補(M,_前週ならび,_輪講者ならび,N,_輪講者,_輪講者ならび_2) :- 現在の輪講者ならびから候補を得る(M,_前週ならび,_輪講者ならび,N,_輪講者,_輪講者ならび_2). 輪講者ならびを生成してから候補を得る(M,_前週ならび,[],N,_輪講者,_輪講者ならび_2) :- 輪講者ならびを生成(_輪講者ならび), 現在の輪講者ならびから候補を得る(M,_前週ならび,_輪講者ならび,N,_輪講者,_輪講者ならび_2). 現在の輪講者ならびから候補を得る(M,_前週ならび,_輪講者ならび,N,_輪講者,_輪講者ならび_2) :- select(_輪講者,_輪講者ならび,_輪講者ならび_2), \+(member(_輪講者,_前週ならび)), succ(N,M). 論文紹介者候補(0,_,_,0,'',_) :- !. 論文紹介者候補(M,_前週ならび,[],N,_論文紹介者,_論文紹介者ならび_2) :- 論文紹介者ならびを生成してから候補を得る(M,_前週ならび,[],N,_論文紹介者,_論文紹介者ならび_2). 論文紹介者候補(M,_前週ならび,_論文紹介者ならび,N,_論文紹介者,_論文紹介者ならび_2) :- 現在の論文紹介者ならびから候補を得る(M,_前週ならび,_論文紹介者ならび,N,_論文紹介者,_論文紹介者ならび_2). 論文紹介者ならびを生成してから候補を得る(M,_前週ならび,[],N,_論文紹介者,_論文紹介者ならび_2) :- 現在の論文紹介者ならびを生成する(_論文紹介者ならび), 論文紹介者ならびから候補を得る(M,_前週ならび,_論文紹介者ならび,N,_論文紹介者,_論文紹介者ならび_2). 現在の論文紹介者ならびから候補を得る(M,_前週ならび,_論文紹介者ならび,N,_論文紹介者,_論文紹介者ならび_2) :- select(_論文紹介者,_論文紹介者ならび,_論文紹介者ならび_2), \+(member(_論文紹介者,_前週ならび)), succ(N,M). 研究進捗報告者候補(0,_,_,0,'',_) :- !. 研究進捗報告者候補(M,_前週ならび,[],N,_研究進捗報告者,_研究進捗報告者ならび_2) :- 研究進捗報告者ならびを生成してから候補を得る(M,_前週ならび,[],N,_研究進捗報告者,_研究進捗報告者ならび_2). 研究進捗報告者候補(M,_前週ならび,_研究進捗報告者ならび,N,_研究進捗報告者,_研究進捗報告者ならび_2) :- 現在の研究進捗報告者ならびから候補を得る(M,_前週ならび,_研究進捗報告者ならび,N,_研究進捗報告者,_研究進捗報告者ならび_2). 研究進捗報告者ならびを生成してから候補を得る(M,_前週ならび,[],N,_研究進捗報告者,_研究進捗報告者ならび_2) :- 研究進捗報告者ならびの生成(_研究進捗報告者ならび), 現在の研究進捗報告者ならびから候補を得る(M,_前週ならび,_研究進捗報告者ならび,N,_研究進捗報告者,_研究進捗報告者ならび_2). 現在の研究進捗報告者ならびから候補を得る(M,_前週ならび,_研究進捗報告者ならび,N,_研究進捗報告者,_研究進捗報告者ならび_2) :- select(_研究進捗報告者,_研究進捗報告者ならび,_研究進捗報告者ならび_2), \+(member(_研究進捗報告者,_前週ならび)), succ(N,M). 輪講者ならびを生成(_輪講者ならび) :- findall(_学生,( 学生(_学生,_クラス), \+(_クラス = ドクター)), _輪講者ならび). 論文紹介者ならびを生成(_論文紹介者ならび) :- findall(_学生,学生(_学生,_),_論文紹介者ならび). 研究進捗報告者ならびを生成(_研究進捗報告者ならび) :- findall(_学生,学生(_学生,_),_研究進捗報告者ならび). % 以下のサイトは # 尾崎隆大 2014年5月12日twitter # 尾崎隆大 2014年5月12日twitter(続き) 人間の不定芭蕉泡沫の世の慣らひ(_人間の不定,_芭蕉泡沫の世の慣らひ) :- 人間の不定(_人間の不定), 芭蕉泡沫の世の慣らひ(_芭蕉泡沫の世の慣らひ). 人間の不定('ことに人生は定めなくて、芭蕉のように脆く、水の泡のようにはかないのが、世の習わしなのだ。'). 芭蕉泡沫の世の慣らひ('人間のはかなさの譬え。維摩経 「是身如泡、不得久立、是身如芭蕉、中無有堅」など。'). '上記出典は日本古典文学体系「謡曲集 上」。世阿弥作曲 『葵の上』。'. % 以下のサイトは 九九表([ [1,2,3,3,4,6,7,8,9], [2,4,6,8,10,12,14,16,18], [3,6,9,12,15,18,21,24,27], [4,8,12,16,20,24,28,32,36], [5,10,15,20,25,30,35,40,45], [6,12,18,24,30,36,42,48,54], [7,14,21,28,35,42,49,56,63], [8,16,24,32,40,48,56,64,72], [9,18,27,36,45,54,63,72,81]]). '「21÷7 の計算は、九九表をどのように辿れば答えがえられますか?」ならば全然問題がないように思いますが。'(_答え,_答えは何段目にある) :- 九九表を得る(_九九表), '7を段から辿るか、列から辿るかを決める'(_段経由または列経由), 九九表から7段目または7列目を取り出す(_段経由または列経由,_九九表,_取り出した段または列), '7段目または7列目経由で21を探しその要素位置が答えである'(_段経由または列経由,_取り出した段または列,_答え,_答えは何段目にある). 九九表を得る(_九九表) :- 九九表(_九九表). '7を段から辿るか、列から辿るかを決める'(段経由) :- '発生させた乱数が偶数の時、段経由とする',!. '7を段から辿るか、列から辿るかを決める'(列経由). 九九表から7段目または7列目を取り出す(段経由,_九九表,_取り出した段または列) :- nth1(7,_九九表,_取り出した段または列). 九九表から7段目または7列目を取り出す(列経由,_九九表,_取り出した段または列) :- findall(_列の値,( nth1(_,_九九表,_段), nth1(7,_段,_列の値)), _取り出した段または列). '7段目または7列目経由で21を探しその要素位置が答えである'(段経由,_取り出した段または列,_答え,7) :- nth1(_答え,_取り出した段または列,21). '7段目または7列目経由で21を探しその要素位置が答えである'(列経由,_取り出した段または列,_答え,_何段目) :- nth1(_何段目,_取り出した段または列,21), _答え = _何段目. 乱数の種(7717). '発生させた乱数が偶数の時、段経由とする' :- 乱数の種(_乱数の種), 発生した乱数が偶数である(_乱数の種). 発生した乱数が偶数である(_乱数の種) :- 0 is random(_乱数の種) mod 2. % 以下のサイトは # 出典: Regular Expression(正規表現) Part12 #468 # # ●Regular Expressionの使用環境 # sed、grep # ●検索か置換か? # 置換 # ●説明 # マッチした結果をそのまま置き換えるでなく、 # 1つ前に改行を入れたい。 # # ●対象データ # 0ABC1DEF2GHI3JKL4MNO # # ●希望する結果 # 0ABC # 1DEF # 2GHI # 3JKL # 4MNO # # よろしくお願いします。 置換規則('0','0'). 置換規則('1','1'). 置換規則('2','2'). 置換規則('3','3'). 置換規則('4','4'). 置換規則('5','5'). 置換規則('6','6'). 置換規則('7','7'). 置換規則('8','8'). 置換規則('9','9'). 'マッチした結果をそのまま置き換えるでなく、1つ前に改行を入れたい。'(_文字列,_置換された文字列) :- 検索文字列を置換する(_文字列,_前文字列,_置換文字列,_後文字列), 後文字列も置換して置換された文字列を生成する(_前文字列,_置換文字列,_後文字列,_置換された文字列),!. 'マッチした結果をそのまま置き換えるでなく、1つ前に改行を入れたい。'(_文字列,_文字列). 後文字列も置換して置換された文字列を生成する(_前文字列,_置換文字列,_後文字列,_置換された文字列) :- 'マッチした結果をそのまま置き換えるでなく、1つ前に改行を入れたい。'(_後文字列,_置換された文字列_2), atomic_list_concat([_前文字列,'\n',_置換文字列,_置換された文字列_2],_置換された文字列). 検索文字列を置換する(_文字列,_前文字列,_置換文字列_1,_後文字列) :- 検索文字列を得る(_文字列,_前文字列,_検索文字列,_後文字列), 置換規則(_検索文字列,_置換文字列_1). 検索文字列を得る(_文字列,_前文字列,_検索文字列,_後文字列) :- sub_atom(_文字列,S,Len,R,_検索文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). % 以下のサイトは # 出典 :: 「受験全解算数」日能研発行 p460 灘中入試問題より # # ある工場では3種類の機械A,B,Cを使って、品物Pを生産しています。 # 1時間あたりの生産高はA,B,Cの順に、77個、56個、14個で、1日に # 8時間ずつ運転します。また、一日の生産高は、Cを使わないときは19544個、 # Bを使わないときは、13832個、Aを使わないときは14896個です。このとき、 # 次の問に答えなさい。 # (1) 3種類の機械はそれぞれ何台ありますか。 # (2) 全部の機械を使ったときの品物Pの総生産高を今の2倍にするために # は、Aを25台買い足して、さらにBとCをそれぞれ何台買いたせばよいで # すか。ただし、B,Cどちらも13台より多く買い入れるものとします。 'ある工場では3種類の機械A,B,Cを使って、品物Pを生産しています。 1時間あたりの生産高はA,B,Cの順に、77個、56個、14個で、1日に 8時間ずつ運転します。また、一日の生産高は、Cを使わないときは19544個、 Bを使わないときは、13832個、Aを使わないときは14896個です。このとき、 次の問に答えなさい。 3種類の機械はそれぞれ何台ありますか。'(Aの台数,Bの台数,Cの台数) :- '一日の生産高は、Cを使わないときは19544個、 Bを使わないときは、13832個、Aを使わないときは14896個です。'(A,B,C), '1時間あたりの生産高はA,B,Cの順に、77個、56個、14個で、1日に8時間ずつ運転します。 3種類の機械はそれぞれ何台ありますか。'(A,B,C,Aの台数,Bの台数,Cの台数). '一日の生産高は、Cを使わないときは19544個、 Bを使わないときは、13832個、Aを使わないときは14896個です。'(A,B,C) :- '一日の生産高は、Cを使わないときは19544個、'(A,B), '一日の生産高は、Bを使わないときは13832個、'(A,C), '一日の生産高は、Aを使わないときは14896個、'(B,C). '一日の生産高は、Cを使わないときは19544個、'(A,B) :- length(A_plus_B,19544), append(A,B,A_plus_B). '一日の生産高は、Bを使わないときは13832個、'(A,C) :- length(A_plus_C,13832), append(A,C,A_plus_C). '一日の生産高は、Aを使わないときは14896個、'(B,C) :- length(B_plus_C,14896), append(B,C,B_plus_C). '1時間あたりの生産高はA,B,Cの順に、77個、56個、14個で、1日に8時間ずつ運転します。 3種類の機械はそれぞれ何台ありますか。'(A,B,C,Aの台数,Bの台数,Cの台数) :- '1時間あたりのAの生産高は77個で、1日に8時間ずつ運転します。台数は'(A,Aの台数), '1時間あたりのBの生産高は56個で、1日に8時間ずつ運転します。台数は'(B,Bの台数), '1時間あたりのCの生産高は14個で、1日に8時間ずつ運転します。台数は'(C,Cの台数). '1時間あたりのAの生産高は77個で、1日に8時間ずつ運転します。台数は'(A,Aの台数) :- _一台のAによる一日の生産高 is 77 * 8, length(A,Aによる一日の総生産高), Aの台数 is Aによる一日の総生産高 / _一台のAによる一日の生産高. '1時間あたりのBの生産高は56個で、1日に8時間ずつ運転します。台数は'(B,Bの台数) :- _一台のBによる一日の生産高 is 56 * 8, length(B,Bによる一日の総生産高), Bの台数 is Bによる一日の総生産高 / _一台のBによる一日の生産高. '1時間あたりのCの生産高は14個で、1日に8時間ずつ運転します。台数は'(C,Cの台数) :- _一台のCによる一日の生産高 is 14 * 8, length(C,Cによる一日の総生産高), Cの台数 is Cによる一日の総生産高 / _一台のCによる一日の生産高. % 以下のサイトは # 出典 :: 「受験全解算数」日能研発行 p460 灘中入試問題より # # ある工場では3種類の機械A,B,Cを使って、品物Pを生産しています。 # 1時間あたりの生産高はA,B,Cの順に、77個、56個、14個で、1日に # 8時間ずつ運転します。また、一日の生産高は、Cを使わないときは19544個、 # Bを使わないときは、13832個、Aを使わないときは14896個です。このとき、 # 次の問に答えなさい。 # (1) 3種類の機械はそれぞれ何台ありますか。 # (2) 全部の機械を使ったときの品物Pの総生産高を今の2倍にするために # は、Aを25台買い足して、さらにBとCをそれぞれ何台買いたせばよいで # すか。ただし、B,Cどちらも13台より多く買い入れるものとします。 'ある工場では3種類の機械A,B,Cを使って、品物Pを生産しています。 1時間あたりの生産高はA,B,Cの順に、77個、56個、14個で、1日に 8時間ずつ運転します。また、一日の生産高は、Cを使わないときは19544個、 Bを使わないときは、13832個、Aを使わないときは14896個です。このとき、 次の問に答えなさい。 (1) 3種類の機械はそれぞれ何台ありますか。'(Aの台数,Bの台数,Cの台数) :- length(A_plus_B,19544), length(A_plus_C,13832), length(B_plus_C,14896), append(A,B,A_plus_B), append(A,C,A_plus_C), append(B,C,B_plus_C), length(A,Aの一日の生産高), length(B,Bの一日の生産高), length(C,Cの一日の生産高), Aの台数 is Aの一日の生産高 / (77 * 8), Bの台数 is Bの一日の生産高 / (56 * 8), Cの台数 is Cの一日の生産高 / (14 * 8). % 以下のサイトは # 出典 :: 「受験全解算数」日能研発行 p460 灘中入試問題より # # ある工場では3種類の機械A,B,Cを使って、品物Pを生産しています。 # 1時間あたりの生産高はA,B,Cの順に、77個、56個、14個で、1日に # 8時間ずつ運転します。また、一日の生産高は、Cを使わないときは19544個、 # Bを使わないときは、13832個、Aを使わないときは14896個です。このとき、 # 次の問に答えなさい。 # (1) 3種類の機械はそれぞれ何台ありますか。 # (2) 全部の機械を使ったときの品物Pの総生産高を今の2倍にするために # は、Aを25台買い足して、さらにBとCをそれぞれ何台買いたせばよいで # すか。ただし、B,Cどちらも13台より多く買い入れるものとします。 'ある工場では3種類の機械A,B,Cを使って、品物Pを生産しています。 1時間あたりの生産高はA,B,Cの順に、77個、56個、14個で、1日に 8時間ずつ運転します。また、一日の生産高は、Cを使わないときは19544個、 Bを使わないときは、13832個、Aを使わないときは14896個です。このとき、 次の問に答えなさい。 (1) 3種類の機械はそれぞれ何台ありますか。'(Aの台数,Bの台数,Cの台数) :- '一日の生産高は、Cを使わないときは19544個、 Bを使わないときは、13832個、 Aを使わないときは14896個であるとして、 一日のABCの合計の生産高は'(_一日のABCの合計の生産高), Aの台数 is (_一日のABCの合計の生産高-14896) / (77 * 8), Bの台数 is (_一日のABCの合計の生産高-13832) / (56 * 8), Cの台数 is (_一日のABCの合計の生産高-19544) / (14 * 8). '一日の生産高は、Cを使わないときは19544個、 Bを使わないときは、13832個、 Aを使わないときは14896個であるとして、 一日のABCの合計の生産高は'(_一日のABCの合計の生産高) :- 'A,B,Cの合計はA,B,A,C,B,Cの合計の二分の一である', ABACBCの合計 is 19544 + 13832 + 14896, '一日のA,B,Cの合計の生産高A,B,CはA,B,A,C,B,Cの合計の二分の一となる'(ABACBCの合計,_一日のABCの合計の生産高). 'A,B,Cの合計はA,B,A,C,B,Cの合計の二分の一である' :- このならびから同一の要素の対を分解して2つの同一のならびを構成できる(['A','B','A','C','B','C'],L,L), 順列(L,3,['A','B','C']),!. '一日のA,B,Cの合計の生産高はA,B,CはA,B,A,C,B,Cの合計の二分の一となる'(ABACBCの合計,_一日のABCの合計の生産高) :- _一日のABCの合計の生産高 is ABACBCの合計 / 2. このならびから同一の要素の対を分解して2つの同一のならびを構成できる([],[],[]) :- !. このならびから同一の要素の対を分解して2つの同一のならびを構成できる([A|R1],[A|R2],[A|R2]) :- 共通の2つ組がある(A,R1,R1_2), このならびから同一の要素の対を分解して2つの同一のならびを構成できる(R1_2,R2,R2). 共通の2つ組がある(A,[B|R],R) :- A == B,!. 共通の2つ組がある(A,[B|R1],[B|R2]) :- 共通の2つ組がある(A,R1,R2). 順列(Y,0,[]). 順列(Y,N,[A|X]) :- select(A,Y,Z), M is N - 1, 順列(Z,M,X). % 以下のサイトは # 出典 :: スレ立てるまでもない質問はここで 135匹目 #894 # # 鶴と亀合わせて頭数にして100いました # 足の数が全部で285ありました # 鶴と亀はそれぞれいくらずついましたか # p.s.全盛期の王貞治が打つ構えだったらしいです # 一本脚の鶴のまじった鶴亀算(_全部の足の数,_鶴と亀合わせて頭数,_鶴の数,_亀の数) :- 全部を亀だと考えよう(_鶴と亀合わせて頭数,_全部亀だとしての足の数), 実際の足の数との差が(_全部亀だとしての足の数,_全部の足の数,_実際の足の数との差), '鶴がまじっていることによって生じた差だから、 一匹一羽の亀と鶴の足数の差で割れば良いのだが、 ここでは一本足の鶴もいる想定だから、 足の差を2と3の組み合せで考える'(_鶴と亀合わせて頭数,_実際の足の数との差,_鶴の数,_亀の数). 全部を亀だと考えよう(_鶴と亀合わせて頭数,_全部亀だとしての足の数) :- _全部亀だとしての足の数 is 4 * _鶴と亀合わせて頭数. 実際の足の数との差が(_全部亀だとしての足の数,_全部の足の数,_実際の足の数との差) :- _実際の足の数との差 is abs(_全部亀だとしての足の数 - _全部の足の数). '鶴がまじっていることによって生じた差だから、 一匹一羽の亀と鶴の足数の差で割れば良いのだが、 ここでは一本足の鶴もいる想定だから、 足の差を2と3の組み合せで考える'(_鶴と亀合わせて頭数,_実際の足の数との差,_鶴の数,_亀の数) :- 二本足と一本足の鶴の数候補を得る(_鶴と亀合わせて頭数,_二本足の鶴の数,_一本足の鶴の数), '実際の足の数との差と一致したら、 鶴の数、亀の数が決まる'(_鶴と亀合わせて頭数,_実際の足の数との差,_二本足の鶴の数,_一本足の鶴の数,_鶴の数,_亀の数). 二本足と一本足の鶴の数候補を得る(_鶴と亀合わせて頭数,_二本足の鶴の数,_一本足の鶴の数) :- between(0,_鶴と亀合わせて頭数,_二本足の鶴の数), between(0,_鶴と亀合わせて頭数,_一本足の鶴の数). '実際の足の数との差と一致したら、 鶴の数、亀の数が決まる'(_鶴と亀合わせて頭数,_実際の足の数との差,_二本足の鶴の数,_一本足の鶴の数,_鶴の数,_亀の数) :- _実際の足の数との差 is (4 - 2) * _二本足の鶴の数 + (4 - 1) * _一本足の鶴の数, _鶴の数 is _二本足の鶴の数 + _一本足の鶴の数, _亀の数 is _鶴と亀合わせて頭数 - _鶴の数. % 以下のサイトは # 出典 :: スレ立てるまでもない質問はここで 135匹目 #894 # # 鶴と亀合わせて頭数にして100いました # 足の数が全部で285ありました # 鶴と亀はそれぞれいくらずついましたか # p.s.全盛期の王貞治が打つ構えだったらしいです # 一本脚の鶴のまじった鶴亀算(_全部の足の数,_鶴と亀合わせて頭数,_鶴の数,_亀の数) :- 全部を亀だと考えよう(_鶴と亀合わせて頭数,_全部亀だとしての足の数), 実際の足の数との差が(_全部亀だとしての足の数,_全部の足の数,_実際の足の数との差), '鶴がまじっていることによって生じた差だから、 一匹一羽の亀と鶴の足数の差で割れば良いのだが、 ここでは一本足の鶴もいる想定だから、 足の差を2と3の組み合せで考える'(_鶴と亀合わせて頭数,_実際の足の数との差,_鶴の数,_亀の数). 全部を亀だと考えよう(_鶴と亀合わせて頭数,_全部亀だとしての足の数) :- _全部亀だとしての足の数 is 4 * _鶴と亀合わせて頭数. 実際の足の数との差が(_全部亀だとしての足の数,_全部の足の数,_実際の足の数との差) :- _実際の足の数との差 is abs(_全部亀だとしての足の数 - _全部の足の数). '鶴がまじっていることによって生じた差だから、 一匹一羽の亀と鶴の足数の差で割れば良いのだが、 ここでは一本足の鶴もいる想定だから、 足の差を2と3の組み合せで考える'(_鶴と亀合わせて頭数,_実際の足の数との差,_鶴の数,_亀の数) :- between(0,_鶴と亀合わせて頭数,_二本足の鶴の数), between(0,_鶴と亀合わせて頭数,_一本足の鶴の数), _実際の足の数との差 is (4 - 2) * _二本足の鶴の数 + (4 - 1) * _一本足の鶴の数, _鶴の数 is _二本足の鶴の数 + _一本足の鶴の数, _亀の数 is _鶴と亀合わせて頭数 - _鶴の数. % 以下のサイトは # 出典 :: スレ立てるまでもない質問はここで135匹目 #794" # 100という整数があります # これを25から40の範囲の整数として3等分します # 例 # 30, 30, 40 # 35, 35, 30 # 25, 40, 35 '100という整数があります。これを25から40の範囲の整数として3等分します。'(N1,N2,N3) :- findall(N,between(25,40,N),L), 重複組合せ(L,3,[N1,N2,N3]), 100 is N1 + N2 + N3. 重複組合せ(_候補ならび,1,[A]) :- 要素数が1の場合は候補ならびから順にAを生成して行きます(_候補ならび,A). 重複組合せ([A|_候補ならび],_要素数,[A|_重複組合せ]) :- '候補ならびは変更せずに(重複の所以)生成要素数を減らしながら重複組合せを組み立てます'([A|_候補ならび],_要素数,_重複組合せ). 重複組合せ([_|_候補ならび],_要素数,_重複組合せ) :- 'バックトラックして来たら、候補ならびをひとつずつ減らしながら重複組合せを生成します'(_候補ならび,_要素数,_重複組合せ). 要素数が1の場合は候補ならびから順にAを生成して行きます(_候補ならび,A) :- member(A,_候補ならび). '候補ならびは変更せずに(重複の所以)生成要素数を減らしながら重複組合せを組み立てます'([A|_候補ならび],_要素数,_重複組合せ) :- _要素数 > 1, _要素数_1 is _要素数 - 1, 重複組合せ([A|_候補ならび],_要素数_1,_重複組合せ). 'バックトラックして来たら、候補ならびをひとつずつ減らしながら重複組合せを生成します'(_候補ならび,_要素数,_重複組合せ) :- _要素数 > 1, 重複組合せ(_候補ならび,_要素数,_重複組合せ). % 以下のサイトは # 出典 :: プログラミングのお題スレ3 #623 # お題:1のビットが3個ある二進表記文字列が与えられたとき、次に大きい # 1のビットが3個ある二進表記文字列を求める。 # 例 # 111 -> 1011 # 1110 -> 10011 # 101100 -> 110001 '1のビットが3個ある二進表記文字列が与えられたとき、次に大きい1のビットが3個ある二進表記文字列を求める。'(_1のビットが3個ある二進表記文字列,_次に大きい1のビットが3個ある二進表記文字列) :- 先頭に0を付加した二進表記文字列で探索する(_1のビットが3個ある二進表記文字列,_探索した数字ならび), '先頭が数字0の場合はそれを削除してから、数字1の場合はそのまま文字列に変換する'(_探索した数字ならび,_次に大きい1のビットが3個ある二進表記文字列),!. 先頭に0を付加した二進表記文字列で探索する(_1のビットが3個ある二進表記文字列,_生成された数字ならび) :- atom_concat('0',_1のビットが3個ある二進表記文字列,_先頭に0を付加した1のビットが3個ある二進表記文字列), atom_chars(_先頭に0を付加した1のビットが3個ある二進表記文字列,_先頭に0を付加した1のビットが3個ある二進表記文字ならび), 順列で数字ならびを生成する(_先頭に0を付加した1のビットが3個ある二進表記文字ならび,_生成された数字ならび), _生成された数字ならび @> _先頭に0を付加した1のビットが3個ある二進表記文字ならび. 順列で数字ならびを生成する(_先頭に0を付加した1のビットが3個ある二進表記文字ならび,_生成された数字ならび) :- length(_先頭に0を付加した1のビットが3個ある二進表記文字ならび,_要素数), '最後の3要素だけが数字1、それより前は数字0のならび'(_要素数,_最後の3要素だけ数字1それより前は数字0のならび), 順列(_最後の3要素だけ数字1それより前は数字0のならび,_要素数,_生成された数字ならび). '最後の3要素だけが数字1、それより前は数字0のならび'(_要素数,_最後の3要素だけ数字1それより前は数字0のならび) :- length(_最後の3要素だけ数字1それより前は数字0のならび,_要素数), append(_全ての要素が数字0のならび,['1','1','1'],_最後の3要素だけ数字1それより前は数字0のならび), 全ての要素が数字0のならび(_全ての要素が数字0のならび). '先頭が数字0の場合はそれを削除してから、数字1の場合はそのまま文字列に変換する'(['0'|L],_次に大きい1のビットが3個ある二進表記文字列) :- atomic_list_concat(L,_次に大きい1のビットが3個ある二進表記文字列). '先頭が数字0の場合はそれを削除してから、数字1の場合はそのまま文字列に変換する'(['1'|L],_次に大きい1のビットが3個ある二進表記文字列) :- atomic_list_concat(['1'|L],_次に大きい1のビットが3個ある二進表記文字列). 全ての要素が数字0のならび([]). 全ての要素が数字0のならび(['0'|_全ての要素が数字0のならび]) :- 全ての要素が数字0のならび(_全ての要素が数字0のならび). 順列(Y,0,[]). 順列(Y,N,[A|X]) :- select(A,Y,Z), M is N - 1, 順列(Z,M,X). % 以下のサイトは % % 「春が来た」のProlog述語としての一番自然な定義は、 % 来た(春). % であろうが %%%%%%%%%%%%%%%%%%%%%%%%%% 来た(春が). %%%%%%%%%%%%%%%%%%%%%%%%%% 春が来た. %%%%%%%%%%%%%%%%%%%%%%%%%% 春(来た). %%%%%%%%%%%%%%%%%%%%%%%%%% 春が(来た). %%%%%%%%%%%%%%%%%%%%%%%%%%% 春が来た(_春,_春が来た) :- 春(_春), 来た(_春,_春が来た). %%%%%%%%%%%%%%%%%%%%%%%%%%% 春が来た(_春,_来た) :- 春(_春), 来た(_来た). %%%%%%%%%%%%%%%%%%%%%%%%%%% 春が来た(_春,_来た,_春が来た) :- 春(_春), 来た(_春,_来た,_春が来た). %%%%%%%%%%%%%%%%%%%%%%%%%%% 春が来た(_春が来た) :- 春(_春), 来た(_来た), 春が来た(_春,_来た,_春が来た). % などの定義も考えられる。 %%%%%%%%%%%%%%%%%%%%%%%%%%% 春が来た(_春,_春が来た) :- 春が(_春), 来た(_春,_春が来た). %%%%%%%%%%%%%%%%%%%%%%%%%%% 春が来た(_春,_来た) :- 春が(_春), 来た(_来た). %%%%%%%%%%%%%%%%%%%%%%%%%%% 春が来た(_春,_来た,_春が来た) :- 春が(_春), 来た(_春,_来た,_春が来た). %%%%%%%%%%%%%%%%%%%%%%%%%%% 春が来た(_春が来た) :- 春が(_春), 来た(_来た), 春が来た(_春,_来た,_春が来た). % もあり得るし、僅かな違いで、 %%%%%%%%%%%%%%%%%%%%%%%%%% 春が来た(_春が,_春が来た) :- 春が(_春が), 来た(_春が,_春が来た). %%%%%%%%%%%%%%%%%%%%%%%%%%% 春が来た(_春が,_来た) :- 春が(_春が), 来た(_来た). %%%%%%%%%%%%%%%%%%%%%%%%%%% 春が来た(_春が,_来た,_春が来た) :- 春が(_春が), 来た(_春が,_来た,_春が来た). %%%%%%%%%%%%%%%%%%%%%%%%%%% 春が来た(_春が来た) :- 春が(_春が), 来た(_来た), 春が来た(_春が,_来た,_春が来た). % とする人もいるだろう。 %%%%%%%%%%%%%%%%%%%%%%%%%%% % さらに演算子を定義することによって、 :- op(600,xfx,が). 春 が 来た. % や %%%%%%%%%%%%%%%%%%%%%%%%%%% :- op(500,xf,が). :- op(700,xf,来た). 春 が 来た. % も勿論ある。 %%%%%%%%%%%%%%%%%%%%%%%%%%% が(春,来た). % もあるし、ここから派生して %%%%%%%%%%%%%%%%%%%%%%%%%%% が(春,来た,春が来た). %%%%%%%%%%%%%%%%%%%%%%%%%%% が(春,来た,_春,_来た) :- 春(_春), 来た(_春,_来た). % などの変化は大きく成長する余地がある。 %%%%%%%%%%%%%%%%%%%%%%%%%%% % 以下のように句構造として解析する定義も「春が来た」の定義を構成する。 春が来た(_構文解析項) :- 文([春,が,来た],_構文解析項,_). 文解析(_文,_解析) :- 形態素解析(_文,_形態素ならび), 文(_形態素ならび,_解析,_). 文(_文の語彙ならび,文(_名詞句情報,_動詞情報),_残り語彙ならび) :- 名詞句(_文の語彙ならび,_名詞句情報,_残り語彙ならび_1), 動詞(_残り語彙ならび_1,_動詞情報,_残り語彙ならび). 名詞句(_語彙ならび,名詞句(_名詞情報,_後置詞情報),_残り語彙ならび) :- 名詞(_語彙ならび,_名詞情報,_残り語彙ならび_1), 後置詞(_残り語彙ならび_1,_後置詞情報,_残り語彙ならび). 名詞([春|_残り語彙ならび],名詞([春,名詞,一般名詞]),_残り語彙ならび). 後置詞([が|_残り語彙ならび],後置詞([が,後置詞,格助詞]),_残り語彙ならび). 動詞([来た|_残り語彙ならび],動詞([来た,動詞,過去形]),_残り語彙ならび). % 文/3 % 以下のサイトは % % ?- 戦艦(_艦船名,_レベル,_耐久,_火力,_雷装,_対空,_速力). 出典('twitter by @kamina741'). 参照('戦艦'). 参照('テーブル定義付き'). 参照('テーブル定義・検索項目付き'). 参照('テーブル定義・条件・検索項目付き'). 参照('Prolog Wikipedia リレーショナルデータベース'). 戦艦(比叡改二,124,91,144,0,100,高速). 戦艦(比叡改二,112,91,131,0,90,高速). 戦艦(比叡改,110,83,134,0,96,高速). 戦艦(比叡改,107,83,174,0,75,高速). 戦艦(比叡改,107,83,121,0,95,高速). 戦艦(比叡改,100,83,145,0,99,高速). 戦艦(比叡改,100,83,121,0,95,高速). 戦艦(比叡,100,71,78,0,29,高速). 戦艦(比叡,100,71,64,0,25,高速). 戦艦(比叡,100,71,98,0,32,高速). テーブル定義(戦艦,1,艦船名). テーブル定義(戦艦,2,レベル). テーブル定義(戦艦,3,耐久). テーブル定義(戦艦,4,火力). テーブル定義(戦艦,5,雷装). テーブル定義(戦艦,6,対空). テーブル定義(戦艦,7,速力). テーブル検索(_テーブル名,_条件項目名ならび,_条件値ならび,_検索項目名ならび,_値ならび,_検索した値ならび) :- テーブル定義をもとに値ならびを生成(_テーブル名,_値ならび), 条件値ならびの設定(_テーブル名,_条件項目名ならび,_条件値ならび,_値ならび), 値ならび中の検索項目を選択(_テーブル名,_検索項目名ならび,_値ならび,_検索した値ならび), 値ならび(_テーブル名,_値ならび). テーブル検索(_テーブル名,_検索項目名,_検索した値) :- テーブル定義をもとに値ならびを生成(_テーブル名,_値ならび), 値ならび中の検索項目を選択(_テーブル名,_検索項目名,_値ならび,_検索した値), 値ならび(_テーブル名,_値ならび). テーブル定義をもとに値ならびを生成(_テーブル名,_値ならび) :- findall(_,テーブル定義(_テーブル名,_,_),_値ならび). 条件値ならび(_,[],[],_値ならび). 条件値ならび(_テーブル名,[_条件項目名|R1],[_条件値|R2],_値ならび) :- テーブル定義(_テーブル名,_nth1,_条件項目名), nth1(_nth1,_値ならび,_条件値), 条件値ならび(_テーブル名,R1,R2,_値ならび). 値ならび中の検索項目を選択(_,[],_値ならび,[]). 値ならび中の検索項目を選択(_テーブル名,[_検索項目名|R1],_値ならび,[_検索した値|R2]) :- テーブル定義(_テーブル名,_nth1,_検索項目名), nth1(_nth1,_値ならび,_検索した値), 値ならび中の検索項目を選択(_テーブル名,R1,_値ならび,R2). 値ならび(_テーブル名,_値ならび) :- _副目標 =.. [_テーブル名|_値ならび], catch(_副目標,error(S,_error),true), 実行検査(_項,_error). 実行検査(_項,_error) :- var(_error),!. % 以下のサイトは % % ?- 戦艦(_艦船名,_レベル,_耐久,_火力,_雷装,_対空,_速力). 出典('twitter by @kamina741'). 戦艦(比叡改二,124,91,144,0,100,高速). 戦艦(比叡改二,112,91,131,0,90,高速). 戦艦(比叡改,110,83,134,0,96,高速). 戦艦(比叡改,107,83,174,0,75,高速). 戦艦(比叡改,107,83,121,0,95,高速). 戦艦(比叡改,100,83,145,0,99,高速). 戦艦(比叡改,100,83,121,0,95,高速). 戦艦(比叡,100,71,78,0,29,高速). 戦艦(比叡,100,71,64,0,25,高速). 戦艦(比叡,100,71,98,0,32,高速). テーブル定義(戦艦,1,艦船名). テーブル定義(戦艦,2,レベル). テーブル定義(戦艦,3,耐久). テーブル定義(戦艦,4,火力). テーブル定義(戦艦,5,雷装). テーブル定義(戦艦,6,対空). テーブル定義(戦艦,7,速力). テーブル検索(_テーブル名,_条件項目名ならび,_条件値ならび,_検索項目名,_検索した値) :- テーブル定義をもとに値ならびを生成(_テーブル名,_値ならび), 条件値ならびの設定(_テーブル名,_条件項目名ならび,_条件値ならび,_値ならび), 値ならび中の検索項目を選択(_テーブル名,_検索項目名,_値ならび,_検索した値), 値ならび(_テーブル名,_値ならび). テーブル検索(_テーブル名,_検索項目名,_検索した値) :- テーブル定義をもとに値ならびを生成(_テーブル名,_値ならび), 値ならび中の検索項目を選択(_テーブル名,_検索項目名,_値ならび,_検索した値), 値ならび(_テーブル名,_値ならび). テーブル定義をもとに値ならびを生成(_テーブル名,_値ならび) :- findall(_,テーブル定義(_テーブル名,_,_),_値ならび). 条件値ならび(_,[],[],_値ならび). 条件値ならび(_テーブル名,[_条件項目名|R1],[_条件値|R2],_値ならび) :- テーブル定義(_テーブル名,_nth1,_条件項目名), nth1(_nth1,_値ならび,_条件値), 条件値ならび(_テーブル名,R1,R2,_値ならび). 値ならび中の検索項目を選択(_テーブル名,_検索項目名,_値ならび,_検索した値) :- テーブル定義(_テーブル名,_nth1,_検索項目名), nth1(_nth1,_値ならび,_検索した値). 値ならび(_テーブル名,_値ならび) :- _副目標 =.. [_テーブル名|_値ならび], catch(_副目標,error(S,_error),true), 実行検査(_項,_error). 実行検査(_項,_error) :- var(_error),!. 参照('Prolog Wikipedia リレーショナルデータベース'). % 以下のサイトは % % ?- 戦艦(_艦船名,_レベル,_耐久,_火力,_雷装,_対空,_速力). 出典('twitter by @kamina741'). 戦艦(比叡改二,124,91,144,0,100,高速). 戦艦(比叡改二,112,91,131,0,90,高速). 戦艦(比叡改,110,83,134,0,96,高速). 戦艦(比叡改,107,83,174,0,75,高速). 戦艦(比叡改,107,83,121,0,95,高速). 戦艦(比叡改,100,83,145,0,99,高速). 戦艦(比叡改,100,83,121,0,95,高速). 戦艦(比叡,100,71,78,0,29,高速). 戦艦(比叡,100,71,64,0,25,高速). 戦艦(比叡,100,71,98,0,32,高速). テーブル定義(戦艦,1,艦船名). テーブル定義(戦艦,2,レベル). テーブル定義(戦艦,3,耐久). テーブル定義(戦艦,4,火力). テーブル定義(戦艦,5,雷装). テーブル定義(戦艦,6,対空). テーブル定義(戦艦,7,速力). テーブル検索(_テーブル名,_検索項目名,_検索した値) :- テーブル定義をもとに値ならびを生成(_テーブル名,_値ならび), 値ならび中の検索項目を選択(_テーブル名,_検索項目名,_値ならび,_検索した値), 値ならび(_テーブル名,_値ならび). テーブル定義をもとに値ならびを生成(_テーブル名,_値ならび) :- findall(_,テーブル定義(_テーブル名,_,_),_値ならび). 値ならび中の検索項目を選択(_テーブル名,_検索項目名,_値ならび,_検索した値) :- テーブル定義(_テーブル名,_nth1,_検索項目名), nth1(_nth1,_値ならび,_検索した値). 値ならび(_テーブル名,_値ならび) :- _副目標 =.. [_テーブル名|_値ならび], catch(_副目標,error(S,_error),true), 実行検査(_項,_error). 実行検査(_項,_error) :- var(_error),!. 参照('Prolog Wikipedia リレーショナルデータベース'). % 以下のサイトは % % ?- 戦艦(_艦船名,_レベル,_耐久,_火力,_雷装,_対空,_速力). 出典('twitter by @kamina741'). 戦艦(比叡改二,124,91,144,0,100,高速). 戦艦(比叡改二,112,91,131,0,90,高速). 戦艦(比叡改,110,83,134,0,96,高速). 戦艦(比叡改,107,83,174,0,75,高速). 戦艦(比叡改,107,83,121,0,95,高速). 戦艦(比叡改,100,83,145,0,99,高速). 戦艦(比叡改,100,83,121,0,95,高速). 戦艦(比叡,100,71,78,0,29,高速). 戦艦(比叡,100,71,64,0,25,高速). 戦艦(比叡,100,71,98,0,32,高速). テーブル定義(戦艦,1,艦船名). テーブル定義(戦艦,2,レベル). テーブル定義(戦艦,3,耐久). テーブル定義(戦艦,4,火力). テーブル定義(戦艦,5,雷装). テーブル定義(戦艦,6,対空). テーブル定義(戦艦,7,速力). テーブル検索(_テーブル名,_検索項目名,_検索した値) :- テーブル定義をもとに値ならびを生成(_テーブル名,_値ならび), 値ならび中の検索項目を選択(_テーブル名,_検索項目名,_値ならび), 値ならび(_テーブル名,_値ならび), テーブル定義をもとに値ならびを生成(_テーブル名,_値ならび) :- findall(_,テーブル定義(_テーブル名,_,_),L). 値ならび中の検索項目を選択(_テーブル名,_検索項目名,_値ならび) :- テーブル定義(_テーブル名,_nth1,_検索項目名), nth1(_nth1,_値ならび,_検索した値). 値ならび(_テーブル名,_値ならび) :- _副目標 =.. [_テーブル名|_値ならび], catch(_副目標,error(S,_error),true), 実行検査(_項,_error). 実行検査(_項,_error) :- var(_error),!. 参照('Prolog Wikipedia リレーショナルデータベース'). % 以下のサイトは # 中学生になるホンガツオ君はいつも学校の成績が悪く、父・海平に怒られます。 # 今回も中間テストでどれもひどい点数をとってしまい、海平の雷が落ちるのは間違いありません。 # # 全教科のテスト結果を同時にみせると、海平の怒りは最大級となり、1週間のおやつ抜きとなってしまいます。 # # おやつを毎日食べたいホンガツオ君は、海平の怒りを分散させるために、1日1教科ずつテスト結果をみせていくことを思いつきました。 # # ただ、テスト結果の報告が遅れることで、海平の怒りは日に日に上がっていきます。 # もしテスト結果を隠したりして報告しなかったことが後でバレたら最大級の怒りとなるため、すべての教科のテスト結果をみせた方がよさそうです。 # # 海平の怒りの度合いは教科といつみせるかによっても異ります。 # # たとえば、国語、数学、英語の3教科の点数が40点だった場合、1日1教科ずつみせるならば、3日必要です。 # 海平の怒りについては、ホンガツオ君は長年の経験から、スコア化できています。 # # 教科 点数 海平怒りのスコア初期値 1日目 2日目 3日目 # 国語(Ja) 40 10 1 2 3 # 数学(Ma) 40 10 1 4 6 # 英語(En) 40 10 1 6 9 # # # この例では、国語、数学、英語に対する海平怒りのスコアがすべて10です。 # あとは、何日目にみせるかによって、怒りが初期値に乗算されます。 # # 単純に怒りのスコアが小さい教科順にみせると、トータルの海平から被る怒りの量は以下のようになります。 # (10 * 1) + (10 * 4) + (10 * 9) = 140 # # しかし、3日目に被る怒りの量が大きい教科を先にみせることで、怒りの量は減ります。 # (10 * 1) + (10 * 4) + (10 * 3) = 80 # # # つまり、この場合は、1日目に英語→2日目に数学→3日目に国語(En->Ma->Ja)の順にみせることで、ホンガツオ君が海平から被る怒りの量は最も少ない80ですみます。 # # では、以下の7教科の場合、海平怒りのスコアが最も少なくてすむにはどの教科の順でテスト結果をみせればよいでしょうか? # # プログラミング言語はJavaScriptを使用してください。 # # 教科 点数 海平怒りのスコア初期値 1日目 2日目 3日目 4日目 5日目 6日目 7日目 # 国語(Ja) 15 35 1 1 2 3 5 8 13 # 数学(Ma) 35 15 1 5 9 13 17 21 25 # 英語(En) 30 20 1 5 8 12 15 19 22 # 社会(So) 20 30 1 3 5 7 9 11 13 # 理科(Sc) 25 25 1 2 4 6 8 10 12 # 音楽(Mu) 35 15 1 4 6 9 11 14 16 # 美術(Ar) 25 25 1 2 2 3 5 8 11 # # # 以下、問題のデータを用意しています。コピペして使ってください。 # また必ずしもこのデータを使う必要はありません。 # // 教科データ # var category=['Ja','Ma','En','So','Sc','Mu','Ar']; # // 海平怒りのスコア初期値 # var score=[35,15,20,30,25,15,25]; # // 海平怒りの倍数(7日分 # var multiplier=[ # [1,1,2,3,5,8,13], # [1,5,9,13,17,21,25], # [1,5,8,12,15,19,22], # [1,3,5,7,9,11,13], # [1,2,4,6,8,10,12], # [1,4,6,9,11,14,16], # [1,2,2,3,5,8,11], # ]; # # # ■資料 # answer_ikariscore_JavaScript.txt: # 解答用テキストファイルです。 # # ■解答方法 # 解答用テキストファイル(answer_ikariscore_JavaScript.txt)を完成させ、アップロードしてください。 # ※解答用テキストファイル以外のファイル形式(zipなど)をアップロードした場合は評価対象外となります。 # 毎日一教科ずつ示して怒りを最小にする表示順序(_表示順序) :- findall(_教科,教科と怒りの相関表(_教科,_,_,_),_教科ならび), findall([_怒り指数,_表示順序候補],( 表示順による怒り指数(_教科ならび,_表示順序候補,_怒り指数)), LL), 最小の怒り指数(LL,_最小の怒り指数), member([_最小の怒り指数,_表示順序],LL). 表示順による怒り指数(_教科ならび,_表示順序候補,_怒り指数) :- 順列(_教科ならび,7,_表示順序候補), 怒り評価(_表示順序候補,_怒り指数). 怒り評価(_順序候補,_怒り指数) :- findsum(_怒りの点数,( nth1(_nth1,_順序候補,_教科), 教科と怒りの相関表(_教科,_,_初期値,L), nth1(_nth1,L,_怒りの倍数), _怒りの点数 is _初期値 * _怒りの倍数), _怒り指数). findsum(A,P,Sum) :- findall(A,P,L), sumlist(L,Sum). 順列(Y,0,[]). 順列(Y,N,[A|X]) :- select(A,Y,Z), M is N - 1, 順列(Z,M,X). 最小の怒り指数([[_怒り指数|_]|R],_最小の怒り指数) :- 最小の怒り指数(R,_怒り指数,_最小の怒り指数). 最小の怒り指数([],_最小の怒り指数,_最小の怒り指数). 最小の怒り指数([[_怒り指数|_]|R],_最小の怒り指数_1,_最小の怒り指数) :- _怒り指数 < _最小の怒り指数_1, 最小の怒り指数(R,_怒り指数,_最小の怒り指数),!. 最小の怒り指数([_|R],_最小の怒り指数_1,_最小の怒り指数) :- 最小の怒り指数(R,_最小の怒り指数_1,_最小の怒り指数). 教科と怒りの相関表('国語(Ja)',15,35,[1,1,2,3,5,8,13]). 教科と怒りの相関表('数学(Ma)',35,15,[1,5,9,13,17,21,25]). 教科と怒りの相関表('英語(En)',30,20,[1,5,8,12,15,19,22]). 教科と怒りの相関表('社会(So)',20,30,[1,3,5,7,9,11,13]). 教科と怒りの相関表('理科(Sc)',25,25,[1,2,4,6,8,10,12]). 教科と怒りの相関表('音楽(Mu)',35,15,[1,4,6,9,11,14,16]). 教科と怒りの相関表('美術(Ar)',25,25,[1,2,2,3,5,8,11]). % 以下のサイトは # # 20×20のボックスの中からある文字列を取り出すプログラムを書いて! # # かたやん印刷所では、いまの時代においてもグーテンベルグ印刷にこだわって印刷をしています。 # グーテンベルグ印刷とは、活版(活字を組み合わせて作った版)で印刷する方法です。(Wikipedia) # # かたやん印刷所の所長かたやんは、使った活字を元の場所に戻さないので、 # いつも活字を入れているボックスはぐちゃぐちゃで、 # ほしい活字をすぐに見つけ出すことができません。 # # そこで見かねた印刷所の副所長エミーは、活字を入れているボックスビデオで撮影し、 # 画像解析し、ボックスのどこにどの活字があるかを解析し、 # ほしい文字列の活字がどこにあるか瞬時にみつけだすプログラミングを作ることにしました。 # # 現状の状態のボックスは以下のようになっています。 # # # 6×6のボックスの中から"PRO, PROGRAMMER"という活字を探し出したいです。 # カンマやスペースは1つの活字としてカウントします。 # ですので、今回は文字13個、カンマ1個、スペース1個の合計15個の活字が必要です。 # 一度使った活字は2回使うことはできません。 # # 活字の場所は、(縦番号,横番号)で表すと以下のような順番で活字を取り出すことができます。 # 縦番号は上から下の方向に、横番号は左から右の方向に、1から数えます。 # 1,4 = P # 2,1 = R # 1,6 = O # 5,2 = , # 5,4 = space # 2,2 = P # 3,4 = R # 4,5 = O # 5,1 = G # 4,3 = R # 1,1 = A # 2,5 = M # 6,1 = M # 2,4 = E # 6,6 = R # # # 上記の例では、例えば"P"という文字が2回でてきますが、(1,4)と(2,2)にある"P"はどちらを先につかってもかまいません。 # また場所の特定は1つのみ記述すればよいです。すべての場所番号を書く必要はありません。 # # 画像解析したボックスのデータはCSVで出力されます。 # ボックスのデータを使ってほしい文字列を作るための活字の在り処を探しだしてください。 # # ■資料 # gutenberg.zip # zipファイルを解凍すると以下のファイルが入っています。 # # gutenberg.csv # このボックスから"STAY HUNGRY, STAY FOOLISH"という活字を取り出してください。 # 文字21個、カンマ1個、スペース3個で、合計25個の活字が必要です。 # # answer.txt # 解答用テキストファイルです。 # # ■解答方法 # 解答用テキストファイル(answer.txt)を完成させ、アップロードしてください。 # ※解答用テキストファイル(answer.txt)以外のファイル形式(zipなど)をアップロードした場合は評価対象外となります。 # '20×20のボックスの生成' :- open('gutenberg.csv',read,Instream), '20×20のボックスの生成'(Instream,_20掛ける20のボックス), close(Instream), assertz('20×20のボックス'(_20掛ける20のボックス)). '20×20のボックスの生成'(Instream,[]) :- at_end_of_stream(Instream),!. '20×20のボックスの生成'(Instream,[L|R]) :- get_line(Instream,Line), split(Line,['\t'],L), '20×20のボックスの生成'(Instream,R). '20×20のボックスの中からある文字列を取り出す'(_ある文字列,_20掛ける20のボックス) :- atom_chars(_ある文字列,_文字ならび), '20×20のボックスの中からある文字列を取り出す'(_文字ならび,_20掛ける20のボックス,L), 解の表示(L). '20×20のボックスの中からある文字列を取り出す'([],_20掛ける20のボックス,[]) :- !. '20×20のボックスの中からある文字列を取り出す'([_文字|_残り文字ならび],_20掛ける20のボックス_1,[[_文字,_行目,_列目]|R]) :- ある文字を取り出す(_文字,_20掛ける20のボックス_1,1,_列目,_20掛ける20のボックス_2), '20×20のボックスの中からある文字列を取り出す'(_残り文字ならび,_20掛ける20のボックス_2,R). ある文字を取り出す(_文字,[_行|R_1],_行目,_列目,[_行_2|R_1]) :- nth1(_列目,_行,_文字), 行を更新する(_行,_列目,_行_2),!. ある文字を取り出す(_文字,[_行|R_1],_行目,_列目,[_行|R_2]) :- _行目_2 is _行目 + 1, ある文字を取り出す(_文字,R_1,_行目_2,_列目,R_2). 行を更新する(_行,_列目,_行_2) :- length([_|L1],_列目), append(L1,[_|R],_行), append(L1,[''|R],_行_2),!. 解の表示(L) :- tell('ans.txt'), forall(member([_文字,_行目,_列目],L),writef('%t,%t,%t\n',[_文字,_行目,_列目])), told. get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). split('',_,[],[]) :- !. split(_文字列,_区切り文字列ならび,[_区切り文字列|R3],[_副文字列|R4]) :- 副文字列を切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_副文字列,_残り文字列), split(_残り文字列,_区切り文字列ならび,R3,R4). 副文字列を切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_副文字列,_残り文字列) :- 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_切り出し文字ならび,_残り文字列), atomic_list_concat(_切り出し文字ならび,_副文字列),!. 文字ならびとして切り出す('',_,'',[],'') :- !. 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,[],_残り文字列) :- 文字列の先頭は区切り文字列である(_文字列,_区切り文字列ならび,_区切り文字列,_残り文字列),!. 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,[_文字|R4],_残り文字列) :- 一文字切り出す(_文字列,_文字,_残り文字列_2), 文字ならびとして切り出す(_残り文字列_2,_区切り文字列ならび,_区切り文字列,R4,_残り文字列). 文字列の先頭は区切り文字列である(_文字列,_区切り文字列ならび,_区切り文字列,_残り文字列) :- member(_区切り文字列,_区切り文字列ならび), atom_length(_区切り文字列,_長さ), sub_atom(_文字列,0,_長さ,_残り文字数,_区切り文字列), sub_atom(_文字列,_,_残り文字数,0,_残り文字列),!. 一文字切り出す(_文字列,_文字,_残り文字列_2) :- sub_atom(_文字列,0,1,_,_文字), sub_atom(_文字列,1,_,0,_残り文字列_2). :- '20×20のボックスの生成'(_CSVファイル). :- '20×20のボックス'(_20掛ける20のボックス), '20×20のボックスの中からある文字列を取り出す'(_ある文字列,_20掛ける20のボックス). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/300 # お題:次のような規則の配列でインデックス番号iの配列の値を求める。 # ・インデックス番号1の配列の値A(1)は1である。 # ・配列の値は昇順である。 # ・インデックス番号iの配列の値A(i)は配列内のiの個数である。 # 例 # A(10) -> 4 # A(100) -> 14 # A(1000) -> 45 # '次のような規則の配列でインデックス番号iの配列の値を求める。 ・インデックス番号1の配列の値A(1)は1である。 ・配列の値は昇順である。 ・インデックス番号iの配列の値A(i)は配列内のiの個数である。'(_i,X) :- '次のような規則の配列でインデックス番号iの配列の値を求める。 ・インデックス番号1の配列の値A(1)は1である。 ・配列の値は昇順である。 ・インデックス番号iの配列の値A(i)は配列内のiの個数である。'([],2,_i,2,_a), nth1(_i,_a,X). '次のような規則の配列でインデックス番号iの配列の値を求める。 ・インデックス番号1の配列の値A(1)は1である。 ・配列の値は昇順である。 ・インデックス番号iの配列の値A(i)は配列内のiの個数である。'(_a,_インデッスク,_i,_繰り返し数_1,_a) :- _インデックス > _i,!. '次のような規則の配列でインデックス番号iの配列の値を求める。 ・インデックス番号1の配列の値A(1)は1である。 ・配列の値は昇順である。 ・インデックス番号iの配列の値A(i)は配列内のiの個数である。'(_a_1,_インデッスク,_i,_繰り返し数_1,_a) :- 繰り返し数_1から繰り返し個数を求めてインデックス列を登録する(_a_1,_インデックス,_繰り返し数_1,_次のインデックス,_繰り返し数_2,_a_2), '次のような規則の配列でインデックス番号iの配列の値を求める。 ・インデックス番号1の配列の値A(1)は1である。 ・配列の値は昇順である。 ・インデックス番号iの配列の値A(i)は配列内のiの個数である。'(_a_2,_次のインデックス,_i,_繰り返し数_2,_a). 繰り返し数_1から繰り返し数を求めてインデックス列を登録する(_a_1,_インデックス,_繰り返し数_1,_次のインデックス,_繰り返し数_2,_a) :- 繰り返し個数を得る(_a_1,_繰り返し数_1,_繰り返し数), _次のインデックス is _インデックス + _繰り返し数, インデッスク列の生成(_インデックス,_繰り返し数,L), _繰り返し数_2 is _繰り返し数_1 + 1, append(_a_1,L,_a),!. 繰り返し数を得る(_a,N,M) :- nth1(N,_a,M),!. 繰り返し数を得る(_,N,N). インデッスク列の生成(_インデックス,_繰り返し数,L) :- _インデックス_2 is _インデックス + _繰り返し数 - 1, findall(N,( between(_インデックス,_インデックス_2,N)), L). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/300 # お題:次のような規則の配列でインデックス番号iの配列の値を求める。 # ・インデックス番号1の配列の値A(1)は1である。 # ・配列の値は昇順である。 # ・インデックス番号iの配列の値A(i)は配列内のiの個数である。 # 例 # A(10) -> 4 # A(100) -> 14 # A(1000) -> 45 # :- dynamic(a/2). a(1,1). '次のような規則の配列でインデックス番号iの配列の値を求める。 ・インデックス番号1の配列の値A(1)は1である。 ・配列の値は昇順である。 ・インデックス番号iの配列の値A(i)は配列内のiの個数である。'(_i,X) :- '次のような規則の配列でインデックス番号iの配列の値を求める。 ・インデックス番号1の配列の値A(1)は1である。 ・配列の値は昇順である。 ・インデックス番号iの配列の値A(i)は配列内のiの個数である。'(2,_i,2), a(_i,X). '次のような規則の配列でインデックス番号iの配列の値を求める。 ・インデックス番号1の配列の値A(1)は1である。 ・配列の値は昇順である。 ・インデックス番号iの配列の値A(i)は配列内のiの個数である。'(_インデッスク,_i,_繰り返し数_1) :- _インデックス > _i,!. '次のような規則の配列でインデックス番号iの配列の値を求める。 ・インデックス番号1の配列の値A(1)は1である。 ・配列の値は昇順である。 ・インデックス番号iの配列の値A(i)は配列内のiの個数である。'(_インデッスク,_i,_繰り返し数_1) :- 繰り返し数_1から繰り返し個数を求めてインデックス列を登録する(_インデックス,_繰り返し数_1,_次のインデックス,_繰り返し数_2), '次のような規則の配列でインデックス番号iの配列の値を求める。 ・インデックス番号1の配列の値A(1)は1である。 ・配列の値は昇順である。 ・インデックス番号iの配列の値A(i)は配列内のiの個数である。'(_次のインデックス,_i,_繰り返し数_2). 繰り返し数_1から繰り返し数を求めてインデックス列を登録する(_インデックス,_繰り返し数_1,_次のインデックス,_繰り返し数_2) :- 繰り返し個数を得る(_繰り返し数_1,_繰り返し数), _次のインデックス is _インデックス + _繰り返し数, インデッスク列の生成(_インデックス,_繰り返し数), _繰り返し数_2 is _繰り返し数_1 + 1. 繰り返し数を得る(N,M) :- a(N,M),!. 繰り返し数を得る(N,N). インデッスク列の生成(_インデックス,_繰り返し数) :- _インデックス_2 is _インデックス + _繰り返し数 - 1, forall(between(_インデックス,_インデックス_2,N),assertz(a(N,_繰り返し数))). % 以下のサイトは # twitter_by_@mog_shi_20140225 # #  【ググった?】 #      /      \ #    YES        NO #   /            \ # 【見つかった?】       死ね #   |    | #   YES   NO #   |     \ # じゃあ聞くな  なら、無ぇよ # % % ?- ググリ信仰(_御託宣). % ググッた? YES % 見つかった? NO % _御託宣 = じゃ、無ぇよ. % true. % ?- ググリ信仰(_御託宣) :- '【ググった?】'(_答え), ググッた(_答え,_御託宣). ググッた('YES',_御託宣) :- '【見つかった?】'(_答え), 見つかった(_答え,_御託宣),!. ググッた('NO','死ね'). 見つかった('YES',じゃあ聞くな). 見つかった('NO','なら、無ぇよ'). '【ググった?】'(_答え) :- write('ググった? '), get_line(_答え), member(_答え,['YES','NO']),!. '【ググった?】'(_答え) :- '【ググった?】'(_答え). '【見つかった?】'(_答え) :- write('見つかった? '), get_line(_答え), member(_答え,['YES','NO']),!. '【見つかった?】'(_答え) :- '【見つかった?】'(_答え). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/69 # お題: # n=1のとき # 01 # 10 # # n=2のとき # 0011 # 0011 # 1100 # 1100 # # n=3のとき # 000111 # 000111 # 000111 # 111000 # 111000 # 111000 # # を表示する。 # # ブロックを表示する(_n,LL) :- '_n * _n のブロックを生成する'(_n,0,1,LL1), '_n * _n のブロックを生成する'(_n,1,0,LL2), 表示する(LL1,LL2). '_n * _n のブロックを生成する'(_n,A,B,LL) :- findall(L,( all(_n,L1,A), all(_n,L2,B), between(1,_n,_), append(L1,L2,L)), LL). all(0,[],_) :- !. all(N,[A|R],A) :- N_1 is N - 1, all(N_1,R,A). 表示する(LL1,LL2) :- forall(member(L1,LL1),(atomic_list_concat(L1,A),writef('%t\n',[A]))), forall(member(L2,LL2),(atomic_list_concat(L2,B),writef('%t\n',[B]))), % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/696 # [1] 授業単元: Cプログラミング # [2] 問題文(含コード&amp;リンク): データファイル(rep_data.txt)には「学籍番号、科目A、科目B、科目Cの各点数」が # 順に学籍番号順に並んでいる。そのデータファイルをもとにキーボードから入力された学籍番号の # 学生の成績(含:3科目の合計点の順位)を表示するプログラムを作れ。 # 探索は二分探索法を使いソートにはクイックソートを使うこと。 # # 表示は以下のようにすること。 # Input A Student Number: 14【Enter】 # Ranking : #269 /*最高得点は1位とせよ.*/ # Subject A : 86 # Subject B : 59.1 # Subject C : 220.42 # Total : 365.52 # # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/697 # 【備考】 # 科目 A の得点は int 型,科目 B,C の得点は double 型で扱うこと. # 合計点が同じになる学生はいないということは既知とせよ. # データの人数は 1000 人であることもわかっているとせよ. # 学籍番号には抜けがある.学籍番号が存在しない場合は,”No data”と表示するようにせよ. # 雛型 (121.c) を用いよ.main 関数は完成しているので,main 関数内で呼び出している関数を作成せよ. # 'データファイル(rep_data.txt)には「学籍番号、科目A、科目B、科目Cの各点数」が 順に学籍番号順に並んでいる。そのデータファイルをもとにキーボードから入力された学籍番号の 学生の成績(含:3科目の合計点の順位)を表示するプログラムを作れ。 探索は二分探索法を使いソートにはクイックソートを使うこと。' :- 'データファイルから学籍番号、科目A、科目B、科目Cの各点数の学生成績ならびを作る'(_学生成績ならび), 合計得点の順位表を作る(_学生成績ならび,_合計得点の順位表), キーボードから入力された学籍番号の(_学籍番号), 二分探索法を使い学生の成績を得る(Lines,_学籍番号,_学生の成績), '学生の成績(含:3科目の合計点の順位)を表示する'(_学籍番号,_合計得点の重複を許す降順ならび,_学生の成績). 'データファイルから学籍番号、科目A、科目B、科目Cの各点数の学生成績ならびを作る'(_学生成績ならび) :- get_lines('rep_data.txt',Lines), findall(L,( member(_行,Lines), split(_行,[','],L)), _学生成績ならび). 合計得点の順位表を作る(_学生成績ならび,_合計得点の重複要素を許す降順ならび) :- findall(_合計,( member([_,A,B,C],_学生成績ならび), _合計 is A + B + C), _合計得点ならび), 重複要素を許す降順整列(_合計得点ならび,_合計得点の重複要素を許す降順ならび). キーボードから入力された学籍番号の(_学籍番号) :- 整数を得る(学籍番号,_学籍番号 >= 0,_学籍番号). キーボードから入力された学籍番号の(_学籍番号) :- キーボードから入力された学籍番号の(_学籍番号). 二分探索法を使い学生の成績を得る(Lines,_学籍番号,_学生の成績) :- length(Lines,_最大要素位置), 二分探索法を使い学生の成績を得る(1,_最大要素位置,_最大要素位置,Lines,_学籍番号,_学生の成績). 二分探索法を使い学生の成績を得る(_要素位置,_要素位置,Lines,_学籍番号,_学生の成績) :- !, nth1(_要素位置,Lines,[_学籍番号|_学生の成績]). 二分探索法を使い学生の成績を得る(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- succ(_要素位置_1,1,_要素位置_2),!, 求める要素は_要素位置_1か_要素位置_2のどちらかにある(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績), 二分探索法を使い学生の成績を得る(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- _検索位置 is (_要素位置_1 + _要素位置_2) // 2, nth1(_検索位置,Lines,[_学籍番号_1|_学生の成績_1]), 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号_1,_学生の成績_1,_学籍番号,_学生の成績). 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績,_学籍番号,_学生の成績) :- !. 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号_1,_,_学籍番号,_学生の成績) :- _学籍番号_1 @< _学籍番号, 二分探索法を使い学生の成績を得る(_要素位置_1,_検索位置,Lines,_学籍番号,_学生の成績). 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号_1,_,_学籍番号,_学生の成績) :- _学籍番号_1 @> _学籍番号, 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_2,Lines,_学籍番号,_学生の成績). 求める要素は_要素位置_1か_要素位置_2のどちらかにある(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- nth1(_要素位置_1,Lines,[_学籍番号|_学生の成績]),!. 求める要素は_要素位置_1か_要素位置_2のどちらかにある(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- nth1(_要素位置_2,Lines,[_学籍番号|_学生の成績]). 重複要素を許す降順整列([],[]). 重複要素を許す降順整列([_軸要素|_残りならび],_合計得点の重複要素を許す降順ならび) :- 重複要素を許す降順分割(_軸要素,_残りならび,_軸要素と等しいか大きいならび,_軸要素より小さいならび), 重複要素を許す降順整列(_軸要素と等しいか大きいならび,_合計得点の重複要素を許す降順ならび_1), 重複要素を許す降順整列(_軸要素より小さいならび,_合計得点の重複要素を許す降順ならび_2), append(_合計得点の重複要素を許す降順ならび_1,[_軸要素|_合計得点の重複要素を許す降順ならび_2],_合計得点の重複要素を許す降順ならび). 重複要素を許す降順分割(_,[],[],[]) :- !. 重複要素を許す降順分割(_軸要素,[A|R],[A|R2],R3) :- A @>= _軸要素, 重複要素を許す降順分割(_軸要素,R1,R2,R3). 重複要素を許す降順分割(_軸要素,[A|R],R2,[A|R3]) :- A @< _軸要素, 重複要素を許す降順分割(_軸要素,R1,R2,R3). '学生の成績(含:3科目の合計点の順位)を表示する'(_学籍番号,_合計得点の重複を許す降順ならび,_学生の成績) :- _学生の成績 = [_科目Aの得点,_科目Bの得点,_科目Cの得点], _学生の合計得点 = _科目Aの得点+_科目Bの得点+_科目Cの得点, nth1(_順位,_合計得点の重複を許す降順ならび,_学生の合計得点), writef('学籍番号 :: %t\n順位 :: #%t\n,科目%t :: %t\n科目%t :: %t\n科目%t :: %t\n',[_学籍番号,_順位,'A',_科目Aの得点,'B',_科目Bの得点,'C',_科目Cの得点]). get_lines(Lines) :- get_lines(user_input,Lines). get_lines(Stream,Lines) :- findall(Line,( get_line(Stream,Line), ( Line=end_of_file,!,fail; true)), Lines). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_line(user_input,X). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/684 # お題: ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ # # 出力: http://ime.nu/codepad.org/9Qm1zRxy # # 一番上の「☆」と土台の「||」は固定でよい # 装飾は適当な文字(例:N,i,X,J,o,%,bなど)を利用する # # 解答例: http://ime.nu/codepad.org/aR7eI9F2 # # ☆ # || # ☆ # ** # || # ☆ # b* # *i*o # || # ☆ # ** # **** # ****** # || # ☆ # *b # **** # i**%*J # *Ni***** # || # ☆ # ** # *%** # *****i # **JX**** # ********** # || # ☆ # %* # **%* # *i***o # ******** # ****%***** # **o%****oi*b # || 葉と飾り(20,[*,*,*,*,*,*,*,*,*,*,*,*,*,'N','i','X','J',o,'%',b]). 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ 出力: http://ime.nu/codepad.org/9Qm1zRxy 一番上の「☆」と土台の「||」は固定でよい 装飾は適当な文字(例:N,i,X,J,o,%,bなど)を利用する' :- forall((between(2,8,_何段), 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ'(_何段,_クリスマスツリー)), クリスマスツリーの表示(_クリスマスツリー)). 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ'(_何段,_クリスマスツリー) :- length(_クリスマスツリー,_何段), append([☆|L1],['||'],_クリスマスツリー), findall(_段,( nth1(_段目,_クリスマスツリー,_段), 一段生成(_段目,_段)), _クリスマスツリー). 一段生成(_段目,_飾りを含む葉) :- var(_飾りを含む葉), length(_段,_段目), 飾りを含む葉の生成(_段,_飾りを含む葉),!. 一段生成(_,_既に存在するもの) :- \+(var(_既に存在するもの)). 飾りを含む葉の生成(_段,_一段の葉飾り) :- 葉と飾り(_基数,_葉と飾りならび), findall(_葉または飾り,( 葉または飾りの選択(_段,_基数,_葉と飾りならび,_葉または飾り)), _葉または飾りならび), atomic_list_concat(_葉または飾りならび,_一段の葉飾り),!. 葉または飾りの選択(_段,_基数,_葉と飾りならび,_葉または飾り) :- member(_葉または飾り,_段), _乱数 is random(_基数), nth0(_乱数,_葉と飾りならび,_葉または飾り). クリスマスツリーの表示(_クリスマスツリー) :- forall(member(_段,_クリスマスツリー), writef('%t\n',[_段])). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/684 # お題: ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ # # 出力: http://ime.nu/codepad.org/9Qm1zRxy # # 一番上の「☆」と土台の「||」は固定でよい # 装飾は適当な文字(例:N,i,X,J,o,%,bなど)を利用する # # 解答例: http://ime.nu/codepad.org/aR7eI9F2 # # ☆ # || # ☆ # ** # || # ☆ # b* # *i*o # || # ☆ # ** # **** # ****** # || # ☆ # *b # **** # i**%*J # *Ni***** # || # ☆ # ** # *%** # *****i # **JX**** # ********** # || # ☆ # %* # **%* # *i***o # ******** # ****%***** # **o%****oi*b # || 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ 出力: http://ime.nu/codepad.org/9Qm1zRxy 一番上の「☆」と土台の「||」は固定でよい 装飾は適当な文字(例:N,i,X,J,o,%,bなど)を利用する' :- forall((between(2,8,_段), 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ'(_段,_クリスマスツリー)), クリスマスツリーの表示(_クリスマスツリー)). 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ'(_段,_クリスマスツリー) :- length(L,_段), append([☆|L1],['||'],L), findall(A,( nth1(_nth1,L,A), '一段生成'(_nth1,A)), L). '一段生成'(_nth1,A) :- var(A), length(L,_nth1), 飾りを含む葉の生成(L,A),!. '一段生成'(_,A) :- \+(var(A)). 飾りを含む葉の生成(L,A) :- findall(B,( member(B,L), _乱数 is random(20), nth0(_乱数,[*,*,*,*,*,*,*,*,*,*,*,*,*,'N','i','X','J',o,'%',b],B)), L), atomic_list_concat(L,A),!. クリスマスツリーの表示(_クリスマスツリー) :- forall(member(A,_クリスマスツリー), writef('%t\n',[A])). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/642 # お題:"1"を「1個の"1"」として数字だけ抜き出し並べて"11"を返す。 # "11"なら「2個の"1"」で"21"を返す。"21"なら「1個の"2"、1個の"1"」で"1211"を # 返す。"1"から始めてこの操作を10回繰り返し、途中経過を表示する。 # 例 # 1 # 11 # 21 # 1211 # 111221 # 312211 # 13112221 # 1113213211 # 31131211131221 # 13211311123113112211 # 11131221133112132113212221 # # '"1"を「1個の"1"」として数字だけ抜き出し並べて"11"を返す。"11"なら「2個の"1"」で"21"を返す。"21"なら「1個の"2"、1個の"1"」で"1211"を返す。"1"から始めてこの操作(以下、"この操作"とする)を10回繰り返し、途中経過を表示する。' :- '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'. '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。' :- この操作([],'1',Ln,_文字列), writef('%t\n',[_文字列]), length(Ln,10). この操作(Ln,_文字列,Ln,_文字列). この操作(Ln_1,_文字列_1,Ln,_文字列) :- 連続記号を切り取って連続数と連続記号が交互に来るならびを生成する(_文字列_1,_文字構成ならび), atomic_list_concat(_文字構成ならび,_文字列_2), この操作([_|Ln_1],_文字列_2,Ln,_文字列). 連続記号を切り取って連続数と連続記号が交互に来るならびを生成する(_文字列,_文字構成ならび) :- findall([_連続数,_連続記号],( 連続記号を切り取る(_文字列,_連続数,_連続記号)), LL), flatten(LL,_文字構成ならび). 連続記号を切り取る(_文字列,_連続数,_連続記号) :- sub_atom(_文字列,0,_連続数_1,_,_連続記号_1), n個の連続記号(_連続数_1,_記号_1,_連続記号_1), \+(sub_atom(_文字列,_連続数_1,1,_,_記号_1)),!, 連続記号を切り取る(_文字列,_連続数_1,_連続記号_1,_連続数,_連続記号). 連続記号を切り取る(_文字列,_連続数,_連続記号,_連続数,_連続記号). 連続記号を切り取る(_文字列,_連続数_1,_,_連続数,_連続記号) :- sub_atom(_文字列,_連続数_1,_,0,_残り文字列), 連続記号を切り取る(_残り文字列,_連続数,_連続記号). n個の連続記号(_n個,_記号,_n個の連続記号) :- atom(_n個の連続記号), atom_chars(_n個の連続記号,_n個の連続記号ならび), n個の連続記号ならび(_n個,_記号,_n個の連続記号ならび),!. /* n個の連続記号(_n個,_記号,_n個の連続記号) :- \+(atom(_n個の連続記号)), n個の連続記号ならび(_n個,_記号,_n個の連続記号ならび), atom_chars(_n個の連続記号,_n個の連続記号ならび),!. */ n個の連続記号ならび(_n個,_記号,_n個の連続記号ならび) :- _n個の連続記号ならび = [_記号|R], length([_記号|R],_n個), all(R,_記号). all([],_). all([V|R],V) :- all(R,V). % 以下のサイトは # prologについてです。 # 2乗和のプログラムが書けなくて困っています。1からXまでの2乗和Yを計算するプログラムssq(X,Y)を”一切isを用いず”に作成していただけないでしょうか?よろしくお願いします。 '2乗和のプログラムが書けなくて困っています。 1からXまでの2乗和Yを計算するプログラムssq(X,Y)を”一切isを用いず”に作成していただけないでしょうか? よろしくお願いします。'(X,Y) :- ssq(X,Y). ssq(X,Y) :- '1からXまでの2乗和Yを"一切isを用いず"に計算する'(X,Y). '1からXまでの2乗和Yを"一切isを用いず"に計算する'(X,_2乗和Y) :- '2乗和をリストとして表現する(ただしリストは平坦化されていない)'(X,_2乗和リスト表現), リストを平坦化してその要素数を数える(_2乗和リスト表現,_2乗和Y). '2乗和をリストとして表現する(ただしリストは平坦化されていない)'(X,_2乗和リスト表現) :- findall(LL,( '1からXまでの整数を要素数とするリストLを生成する'(X,L), リストによって2乗を表現する(L,LL)), _2乗和リスト表現). '1からXまでの整数を要素数とするリストLを生成する'(X,L) :- between(1,X,N), length(L,N). リストによって2乗を表現する(L1,LL) :- findall(L1,nth1(_,L1,_),LL). リストを平坦化してその要素数を数える(LL,_要素数) :- flatten(LL,L), length(L,_要素数). % 以下のサイトは # 出題場所:: http://toro.2ch.net/test/read.cgi/tech/1357191974/435 # お題:1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は # 元のデータの順に)表示する。 '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)表示する。' :- '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(1,[],_整列した_開始位置_数値定数ならび), 表示する(_整列した_開始位置_数値定数ならび). '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(_数値,L,L) :- _数値 > 100,!. '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(_数値,L1,L) :- 出現順に挿入整列する(_数値,L1,L2), _数値_2 is _数値 + 1, '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(_数値_2,L2,L). 出現順に挿入整列する(_数値,L1,L2) :- atom_number(_数値定数,_数値), チャンパーノウン定数に出現(_数値定数,_開始位置), 挿入整列する(_開始位置,_数値,L1,L2). チャンパーノウン定数に出現(_数値定数,_開始位置) :- チャンパーノウン定数の生成(1,'0.1',_チャンパーノウン定数), sub_atom(_チャンパーノウン定数,_開始位置,_,_,_数値定数),!. チャンパーノウン定数の生成(_数値,_チャンパーノウン定数,_チャンパーノウン定数). チャンパーノウン定数の生成(_数値_1,_チャンパーノウン定数_1,_チャンパーノウン定数) :- _数値_2 is _数値_1 + 1, atom_number(_数値定数,_数値_2), atom_concat(_チャンパーノウン定数_1,_数値定数,_チャンパーノウン定数_2), チャンパーノウン定数の生成(_数値_2,_チャンパーノウン定数_2,_チャンパーノウン定数). 挿入整列する(_開始位置,_数値,[],[[_開始位置,_数値]]). 挿入整列する(_開始位置,_数値,[[_開始位置_1,_数値_1]|R],[[_開始位置,_数値],[_開始位置_1,_数値_1]|R]) :- _開始位置 =< _開始位置_1,!. 挿入整列する(_開始位置,_数値,[[_開始位置_1,_数値_1]|R1],[[_開始位置_1,_数値_1]|R2]) :- 挿入整列する(_開始位置,_数値,R1,R2). 表示する(_整列した_開始位置_数値ならび) :- forall(member([_,_数値],_整列した_開始位置_数値ならび),writef('%t\n',[_数値])). % 以下のサイトは # 出題場所:: http://toro.2ch.net/test/read.cgi/tech/1357191974/435 # お題:1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は # 元のデータの順に)表示する。 '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)表示する。' :- '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(_整列した_開始位置_数値定数ならび), 表示する(_整列した_開始位置_数値定数ならび). '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(_整列した_開始位置_数値ならび) :- findall([_開始位置,_数値],( between(1,100,_数値), atom_number(_数値定数,_数値), チャンパーノウン定数に出現(_数値定数,_開始位置)), _開始位置_数値ならび), sort(_開始位置_数値ならび,_整列した_開始位置_数値ならび). チャンパーノウン定数に出現(_数値定数,_開始位置) :- チャンパーノウン定数の生成(1,'0.1',_チャンパーノウン定数), sub_atom(_チャンパーノウン定数,_開始位置,_,_,_数値定数),!. チャンパーノウン定数の生成(_数値,_チャンパーノウン定数,_チャンパーノウン定数). チャンパーノウン定数の生成(_数値_1,_チャンパーノウン定数_1,_チャンパーノウン定数) :- _数値_2 is _数値_1 + 1, atom_number(_数値定数,_数値_2), atom_concat(_チャンパーノウン定数_1,_数値定数,_チャンパーノウン定数_2), チャンパーノウン定数の生成(_数値_2,_チャンパーノウン定数_2,_チャンパーノウン定数). 表示する(_整列した_開始位置_数値ならび) :- forall(member([_,_数値],_整列した_開始位置_数値ならび),writef('%t\n',[_数値])). % 以下のサイトは # お題: 任意の数の自然数を与えた時、それらの自然数を四則演算した結果が、 # 期待した自然数になる式を全て列挙するコードを作成しなさい。 # ただし、式中の乗除算は加減算より先に計算するものとする。 # また数の並びは変更出来ず、括弧は使わないものとする。 # # 例: 1 5 3 6 : 10 # # 1 * 5 / 3 * 6 # 1 + 5 * 3 - 6 # # 1 5 3 6 7 : 10 # -> # 1 + 5 + 3 - 6 + 7 '任意の数の自然数を与えた時、それらの自然数を四則演算した結果が、 期待した自然数になる式を全て列挙するコードを作成しなさい。 ただし、式中の乗除算は加減算より先に計算するものとする。 また数の並びは変更出来ず、括弧は使わないものとする。'(_自然数ならび,_期待した自然数,_式) :- findall(X,( append(_,[_自然数|R],_自然数ならび), 自然数と変数を交互に(_自然数,R,X)), _自然数の間に変数が挿入されたならび), 変数に演算子を当て嵌める(_自然数の間に変数が挿入されたならび), 式を計算する(_自然数の間に変数が挿入されたならび,_期待した自然数,_式). 自然数と変数を交互に(_自然数,[],_自然数) :- !. 自然数と変数を交互に(_自然数,_,_自然数). 自然数と変数を交互に(_自然数,_,_). 変数に演算子を当て嵌める(_自然数の間に変数が挿入されたならび) :- 変数のみ取り出して(_自然数の間に変数が挿入されたならび,_変数ならび), 変数に演算子を当て嵌める(_変数ならび). 変数のみ取り出して(_自然数の間に変数が挿入されたならび,_変数ならび) :- findall(_変数,( member(_変数,_自然数の間に変数が挿入されたならび), var(_変数)), _変数ならび). 変数に演算子を当て嵌める([]). 変数に演算子を当て嵌める([_変数|R]) :- member(_演算子,[+,-,*,//]), 変数に演算子を当て嵌める(R). 式を計算する(_自然数の間に変数が挿入されたならび,_期待した自然数,_式) :- 一旦文字列に変換して(_自然数の間に変数が挿入されたならび,_式文字列), 文字列から式を生成する(_式文字列,_式), _期待した自然数 is _式,!. 一旦文字列に変換して(_自然数の間に変数が挿入されたならび,_式文字列) :- atomic_list_concat(_自然数の間に変数が挿入されたならび,_式文字列). 文字列から式を生成する(_式文字列,_式) :- read_term_from_atom(_式文字列,_式,[]). % 以下のサイトは # 以下の引用は笹川さんのプログです。 # http://scmblog.blog.shinobi.jp/%E6%9C%AA%E9%81%B8%E6%8A%9E/prolog%E3%82%AA%E3%82%B8%E3%82%B5%E3%83%B3%E3%81%AB%E6%8D%A7%E3%81%90 # # Prologオジサンに捧ぐ # 私もProlog好きなオジサンなのですが、もうこれはすごいってくらいの筋金入りのPrologオジサンがいます。 # # 昭和57年頃に第五世代コンピューター計画というものがありまして、大規模な国家プロジェクトでした。そこで採用されたベースになる言語がPrologでした。私は、ひどく知的ショックを受けました。なぜLispやSchemeに手を伸ばしたかというとすべてはPrologを理解し、動かすためでした。 # # NormalにはPrologの拡張機能があります。VMにWAM(ウォーレンさんの抽象マシン)を参考にしたProlog用の命令が含まれています。まだまだ改良の余地があるのですが、おおよその動作はするようになっています。 # # 例えば # # (assert (&subset () ())) # (assert (&subset (_f . _r) (_f . _s)) # (&subset _r _s)) # (assert (&subset (_f . _r) _s) # (&subset _r _s)) # # これは集合の部分集合を求めるものです。 # # こんな風に動作します。 # # norm> (&subset (1 2 3) _x) # _x = (1 2 3) # ; # _x = (1 2) # ; # _x = (1 3) # ; # _x = (1) # ; # _x = (2 3) # ; # _x = (2) # ; # _x = (3) # ; # _x = () # ; # #f # norm> # # # 竹内先生たちの開発したTAOがLispとPrologのハイブリッドでした。あちらはさらにオブジェクト指向まで取り込んでまさしく鵺のようでした。 # # # PrologとSchemeは私にとってなくてはならない言語たちです。二つをうまく取り込めたことを自慢に思っています。 # # どうぞ、Normalで遊んでください。Prologはとてもとても面白い言語です。 # subset([],[]). subset([_f|_r],[_f|_s]) :- subset(_r,_s). subset([_f|_r],_s) :- subset(_r,_s). 部分集合([],[]). 部分集合(L1,L2) :- 第二要素以下による全ての部分集合候補の先頭に第一要素を付加する(L1,L2). 部分集合(L1,L2) :- 先頭要素を削り一要素少なくなった集合の全ての部分集合候補を得る(L1,L2). 第二要素以下による全ての部分集合候補の先頭に第一要素を付加する([_第一要素|_第二要素以下],[_第一要素|_第二要素以下による全ての部分集合候補]) :- 部分集合(_第二要素以下,_第二要素以下による全ての部分集合候補). 先頭要素を削り一要素少なくなった集合の全ての部分集合候補を得る([_|_一要素少なくなった集合],_一要素少なくなった集合の全ての部分集合候補) :- 部分集合(_一要素少なくなった集合,_一要素少なくなった集合の全ての部分集合候補). % 以下のサイトは # 以下の引用は笹川さんのプログです。 # http://scmblog.blog.shinobi.jp/%E6%9C%AA%E9%81%B8%E6%8A%9E/prolog%E3%82%AA%E3%82%B8%E3%82%B5%E3%83%B3%E3%81%AB%E6%8D%A7%E3%81%90 # # Prologオジサンに捧ぐ # 私もProlog好きなオジサンなのですが、もうこれはすごいってくらいの筋金入りのPrologオジサンがいます。 # # 昭和57年頃に第五世代コンピューター計画というものがありまして、大規模な国家プロジェクトでした。そこで採用されたベースになる言語がPrologでした。私は、ひどく知的ショックを受けました。なぜLispやSchemeに手を伸ばしたかというとすべてはPrologを理解し、動かすためでした。 # # NormalにはPrologの拡張機能があります。VMにWAM(ウォーレンさんの抽象マシン)を参考にしたProlog用の命令が含まれています。まだまだ改良の余地があるのですが、おおよその動作はするようになっています。 # # 例えば # # (assert (&subset () ())) # (assert (&subset (_f . _r) (_f . _s)) # (&subset _r _s)) # (assert (&subset (_f . _r) _s) # (&subset _r _s)) # # これは集合の部分集合を求めるものです。 # # こんな風に動作します。 # # norm> (&subset (1 2 3) _x) # _x = (1 2 3) # ; # _x = (1 2) # ; # _x = (1 3) # ; # _x = (1) # ; # _x = (2 3) # ; # _x = (2) # ; # _x = (3) # ; # _x = () # ; # #f # norm> # # # 竹内先生たちの開発したTAOがLispとPrologのハイブリッドでした。あちらはさらにオブジェクト指向まで取り込んでまさしく鵺のようでした。 # # # PrologとSchemeは私にとってなくてはならない言語たちです。二つをうまく取り込めたことを自慢に思っています。 # # どうぞ、Normalで遊んでください。Prologはとてもとても面白い言語です。 # subset([],[]). subset([_f|_r],[_f|_s]) :- subset(_r,_s). subset([_f|_r],_s) :- subset(_r,_s). 部分集合([],[]). 部分集合(L1,L2) :- 第二要素以下による全ての部分集合候補の先頭に第一要素を付加する(L1,L2). 部分集合(L1,L2) :- 先頭要素を削り一要素少なくなった集合の全ての部分集合候補を得る(L1,L2). 第二要素以下による全ての部分集合候補の先頭に第一要素を付加する([_第一要素|_第二要素以下],[_第一要素|_第二要素以下による全ての部分集合候補]) :- 部分集合(_第二要素以下,_第二要素以下による全ての部分集合候補). 先頭要素を削り一要素少なくなった集合の全ての部分集合候補を得る([_|_一要素少なくなった集合],_一要素少なくなった集合の全ての部分集合候補) :- 部分集合(_一要素少なくなった集合,_一要素少なくなった集合の全ての部分集合候補). % 以下のサイトは # 【 課題 】 # 入力: int n # 出力: List list # n 列の長さを持つすべての順列を辞書式で出力するメソッドを作成せよ。 # n=3の時 # 結果は{123,132,213,231,312,321} # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI  】なし # 【 期限 】11/07/2013 # 【 Ver  】"1.7.0_11" # # よろしくお願いいたします。 '入力: int n 出力: List list n 列の長さを持つすべての順列を辞書式で出力するメソッドを作成せよ。 n=3の時 結果は{123,132,213,231,312,321}'(_n,_順列ならび) :- 数字列を生成する(_n,_数字ならび), findall(_数値,( 順列(_数字ならび,_n,_数字順列), number_chars(_数値,_数字順列)), _順列ならび). 数字列を生成する(_n,_数字ならび) :- findall(A,( between(1,_n,N), atom_number(A,N)), _数字ならび). 順列(_,0,[]). 順列(L,N,[A|R]) :- select(A,L,L2), N_1 is N - 1, 順列(L2,N_1,R). % 以下のサイトは % % 再帰を使わず、かつ、バックトラックを駆使したハノイの塔 % :- dynamic(ハノイの塔/3). :- dynamic(ハノイの塔/1). :- dynamic(ハノイの塔/0). :- dynamic(履歴/3). ハノイの塔(N) :- ハノイの塔列の生成(N), ハノイの塔_2(1), listing(履歴). ハノイの塔列の生成(N) :- findall(M,between(1,N,M),A), assertz(履歴(A,[],[])), assertz(ハノイの塔(A,[],[])), between(1,1000000,N2), N3 is N2 + 1, assertz((ハノイの塔_2(N2) :- ハノイの塔,ハノイの塔_2(N3))), N3 = 1000000, assertz(ハノイの塔_2(1000000)). ハノイの塔 :- ハノイの塔([],[],_),!. ハノイの塔 :- ハノイの塔([A|R],B,C), \+(履歴(R,[A|B],C)), 重ね検査(A,B), ( asseretz(ハノイの塔(R,[A|B],C)), retract(ハノイの塔([A|R],B,C)), asserz(履歴(R,[A|B],C)); retract(履歴(R,[A|B],C)), asseretz(ハノイの塔([A|R],B,C)), retract(ハノイの塔(R,[A|B],C)), fail). ハノイの塔 :- ハノイの塔([A|R],C,B), \+(履歴(R,C,[A|B])), 重ね検査(A,B), ( asseretz(ハノイの塔(R,C,[A|B])), retract(ハノイの塔([A|R],C,B)), asserz(履歴(R,C,[A|B])); retract(履歴(R,C,[A|B])), asseretz(ハノイの塔([A|R],C,B)), retract(ハノイの塔(R,C,[A|B])), fail). ハノイの塔 :- ハノイの塔(B,[A|R],C), \+(履歴([A|B],R,C)), 重ね検査(A,B), ( asseretz(ハノイの塔([A|B],R,C)), retract(ハノイの塔(B,[A|R],C)), asserz(履歴([A|B],R,C)); retract(履歴([A|B],R,C)), asseretz(ハノイの塔(B,[A|R],C)), retract(ハノイの塔([A|B],R,C)), fail). ハノイの塔 :- ハノイの塔(B,C,[A|R]), \+(履歴([A|B],C,R)), 重ね検査(A,B), ( asseretz(ハノイの塔([A|B],C,R)), retract(ハノイの塔(B,C,[A|R])), asserz(履歴([A|B],C,R)); retract(履歴([A|B],C,R)), asseretz(ハノイの塔(B,C,[A|R])), retract(ハノイの塔([A|B],C,R)), fail). ハノイの塔 :- ハノイの塔(C,[A|R],B), \+(履歴(C,R,[A|B])), 重ね検査(A,B), ( asseretz(ハノイの塔(C,R,[A|B])), retract(ハノイの塔(C,[A|R],B)), asserz(履歴(C,R,[A|B])); retract(履歴(C,R,[A|B])), asseretz(ハノイの塔(C,[A|R],B)), retract(ハノイの塔(C,R,[A|B])), fail). ハノイの塔 :- ハノイの塔(C,B,[A|R]), \+(履歴(C,[A|B],R)), 重ね検査(A,B), ( asseretz(ハノイの塔(C,[A|B],R)), retract(ハノイの塔(C,B,[A|R])), asserz(履歴(C,[A|B],R)); retract(履歴(C,[A|B],R)), asseretz(ハノイの塔(C,B,[A|R])), retract(ハノイの塔(C,[A|B],R)), fail). 重ね検査(A,[]). 重ね検査(A,[B|_]) :- A @< B. % 以下のサイトは # # 直積 # 直積(_集合ならび,_直積集合) :- member項の生成(_集合ならび,_member項,_要素変数ならび), findall(_要素変数ならび,_member項,_直積集合). member項の生成([_集合],member(_要素変数,_集合),[_要素変数]). member項の生成([_集合|R1],(member(_要素変数,_集合),U),[_要素変数|R2]) :- member項の生成(R1,U,R2). % 以下のサイトは # # 目標を限界度数成功させて指定した蒐集項をならびとして得る # 目標を限界度数成功させて指定した蒐集項をならびとして得る(_限界度数,_蒐集項,_目標,_蒐集項ならび) :- findall_n(_限界度数,_蒐集項,_目標,_蒐集項ならび). findall_n(_限界度数,_蒐集項,_目標,_蒐集項ならび) :- message_queue_create(_キュー番号), ( '子スレッドで、生成された度数を、限界度数に達したら0をキューに送る'(_限度度数,_キュー番号); キューから限界度数を示す0を受信するまで目標を成功させて蒐集項ならびを得る(_蒐集項,_目標,_キュー番号,_蒐集項ならび)). キューから限界度数を示す0を受信するまで目標を成功させて蒐集項ならびを得る(_蒐集項,_目標,_キュー番号,_蒐集項ならび) :- findall(_蒐集項,( thread_get_message(_キュー番号,_項), ( _項 = 0,!,fail;call(_目標))), _蒐集項ならび). '子スレッドで、生成された度数を、限界度数に達したら0をキューに送る'(_限度度数,_キュー番号) :- thread_create(度数(_限界度数,_キュー番号),_,[]). 度数(_限界度数,_キュー番号) :- between(1,_限界度数,_度数), _剰余 is _度数 mod ( _限界度数 + 1 ), thread_send_message(_キュー番号,_剰余), _度数 = _限界度数. % % 先にlength/2等で解の枠が決まっている場合があるが、 % findall/3述語だと、その枠を無視して、全解を蒐集して、 % その上で第三引数のならびとの単一化を試みようとする。 % 目標の解が1000万個というように多量の場合は、 % スタックオーバーフローが生じてエラーとなって終了する。 % % これに対して、この述語は子スレッドを作り出して、ここで % 本来は現在の解数を数えさせてキュー経由で親スレッドは % これを受信する。この為には親スレッドから子スレッドに解が % 取れたことを送信するためのキューが必要であるがここでは % それを省略した。子から親への片方向の通信になっている。 % % 子スレッドは1から解の限界数まで整数をキューに一気に詰め、 % さらに、終了の合図である0を詰める。親スレッドは目標が % 達成される度にキューから一つ度数情報を取り出す。 % 解の数が限界数に達した時に子スレッドが既に送信してあった % 0を受信することになり、親スレッドのfindall_n/4の目標内の % カットが発動されて強制的にfindall_n/4を終了させることが % できる。 % % ここではfindall/3を対象にしているがsetof/3やbagof/3も % 全く同様の問題があるし、解決策も同じである。 % 以下のサイトは # # 目標を限界度数成功させて指定した蒐集項をならびとして得る # 目標を限界度数成功させて指定した蒐集項をならびとして得る(_限界度数,_蒐集項,_目標,_蒐集項ならび) :- findall_n(_限界度数,_蒐集項,_目標,_蒐集項ならび). findall_n(_限界度数,_蒐集項,_目標,_蒐集項ならび) :- message_queue_create(_キュー番号), ( thread_create(度数(_限界度数,_キュー番号),_,[]); findall(_蒐集項,( call(_目標), thread_get_message(_キュー番号,_項), ( _項 = 0,!,fail;true)), _蒐集項ならび)). 度数(_限界度数,_キュー番号) :- between(1,_限界度数,_度数), _剰余 is _度数 mod ( _限界度数 + 1 ), thread_send_message(_キュー番号,_剰余), _度数 = _限界度数. % % 先にlength/2等で解の枠が決まっている場合があるが、 % findall/3述語だと、その枠を無視して、全解を蒐集して、 % その上で第三引数のならびとの単一化を試みようとする。 % 目標の解が1000万個というように多量の場合は、 % スタックオーバーフローが生じてエラーとなって終了する。 % % これに対して、この述語は子スレッドを作り出して、ここで % 本来は現在の解数を数えさせてキュー経由で親スレッドは % これを受信する。この為には親スレッドから子スレッドに解が % 取れたことを送信するためのキューが必要であるがここでは % それを省略した。子から親への片方向の通信になっている。 % % 子スレッドは1から解の限界数まで整数をキューに一気に詰め、 % さらに、終了の合図である0を詰める。親スレッドは目標が % 達成される度にキューから一つ度数情報を取り出す。 % 解の数が限界数に達した時に子スレッドが既に送信してあった % 0を受信することになり、親スレッドのfindall_n/4の目標内の % カットが発動されて強制的にfindall_n/4を終了させることが % できる。 % % ここではfindall/3を対象にしているがsetof/3やbagof/3も % 全く同様の問題があるし、解決策も同じである。 % 以下のサイトは '多点交叉'(_親1,_親2,_交叉点の個数,_1点交叉後の親1,_1点交叉後の親2) :- '1点交叉の素直な拡張である多点交叉は,親1,親2の文字列上で交叉点"|"をランダムに複数個選び,交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を生成する'(_親1,_親2,_交叉点の個数,_1点交叉後の親1,_1点交叉後の親2). '1点交叉の素直な拡張である多点交叉は,親1,親2の文字列上で交叉点"|"をランダムに複数個選び,交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を生成する'(_親1,_親2,_交叉点の個数,_1点交叉後の親1,_1点交叉後の親2) :- '交叉点をランダムに複数個選び、'(_親1,_親2,_交叉点の個数,_交叉点ならび), '交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を生成する'(_親1,_親2,_交叉点ならび,_1点交叉後の親1,_1点交叉後の親2). '交叉点をランダムに複数個選び、'(_親1,_親2,_交叉点の個数,_交叉点ならび) :- length(_親1,_長さ1), length(_親2,_長さ2), '交叉点をランダムに1箇所選び、'(_親1,_長さ1,_親2,_長さ2,_交叉点の個数,_交叉点ならび). '交叉点をランダムに複数個選び、'(_親1,_長さ1,_親2,_長さ2,_交叉点の個数,_交叉点ならび) :- _長さ1 =< _長さ2, '交差点をランダムに複数個選び、'(_長さ1,_交叉点の個数,_交叉点ならび),!. '交叉点をランダムに1箇所選び、'(_親1,_長さ1,_親2,_長さ2,_交叉点の個数,_交叉点) :- '交差点をランダムに複数個選び、'(_長さ2,_交叉点の個数,_交叉点ならび),!. '交差点をランダムに複数個選び、'(_長さ1,_交叉点の個数,_交叉点ならび) :- '交差点をランダムに複数個選び、'(_長さ1,_交叉点の個数,[],_交叉点ならび). '交差点をランダムに複数個選び、'(_,0,_交叉点ならび,_交叉点ならび) :- !. '交差点をランダムに複数個選び、'(_長さ1,N,L1,_交叉点ならび) :- R is random(_長さ1), 整列を保ちつつ挿入する(R,L1,L2), N_1 is N - 1, '交差点をランダムに複数個選び、'(_長さ1,N_1,L2,_交叉点ならび),!. '交差点をランダムに複数個選び、'(_長さ1,N,L1,_交叉点ならび) :- '交差点をランダムに複数個選び、'(_長さ1,N,L1,_交叉点ならび). 整列を保ちつつ挿入する(M,[],[M]). 整列を保ちつつ挿入する(M,[N|R],[M,N|R]) :- M < N,!. 整列を保ちつつ挿入する(M,[N|R1],[N|R2]) :- M > N, 整列を保ちつつ挿入する(M,R1,R2),!. '交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2をならびとして生成する'(_親1,_親2,_交叉点ならび,_1点交叉後の親1,_1点交叉後の親2) :- '交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を部分文字列ならびとして生成する'(_親1,_親2,_交叉点ならび,_1点交叉後の親1の部分文字列ならび,_1点交叉後の親2の部分文字列ならび), atomic_list_concat(_1点交叉後の親1の部分文字列ならび,_1点交叉後の親1). atomic_list_concat(_1点交叉後の親2の部分文字列ならび,_1点交叉後の親2). '交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を部分文字列ならびとして生成する'(_親1,_親2,[],[],[]). '交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を部分文字列ならびとして生成する'(_親1,_親2,[_交叉点],[_親1部分文字列],[_親2部分文字列]) :- sub_atom(_親1,_交叉点,_,0,_親1部分文字列), sub_atom(_親2,_交叉点,_,0,_親2部分文字列). '交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を部分文字列ならびとして生成する'(_親1,_親2,[_交叉点1,_交叉点2|R1],[_親1部分文字列_1,_親2部分文字列_2|R2],[_親2部分文字列_1,_親1部分文字列_2|R3]) :- sub_atom(_親1,0,_交叉点1,_,_親1部分文字列_1), sub_atom(_親2,0,_交叉点2,_,_親2部分文字列_1), _交叉2の長さ is _交叉点2 - _交叉点1, sub_atom(_親1,_交叉点1,_交叉2の長さ,_,_親1部分文字列_2), sub_atom(_親2,_交叉点1,_交叉2の長さ,_,_親2部分文字列_2), '交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を部分文字列ならびとして生成する'(_親1,_親2,R1,R2,R3). % 以下のサイトは '1点交叉'(_親1,_親2,_1点交叉後の親1,_1点交叉後の親2) :- '1点交叉は,単純交叉とよばれる最も単純な交叉規則である。1点交叉では,親1,親2の文字列上で交叉点"|"をランダムに1箇所選び,交叉点の右側の2つの親の部分文字列をそっくりそのまま交換して,子1,子2を生成する。'(_親1,_親2,_1点交叉後の親1,_1点交叉後の親2). '1点交叉は,単純交叉とよばれる最も単純な交叉規則である。1点交叉では,親1,親2の文字列上で交叉点"|"をランダムに1箇所選び,交叉点の右側の2つの親の部分文字列をそっくりそのまま交換して,子1,子2を生成する。'(_親1,_親2,_1点交叉後の親1,_1点交叉後の親2) :- '交叉点をランダムに1箇所選び、'(_親1,_親2,_交叉点), '交叉点の右側の2つの親の部分文字列をそっくりそのまま交換して,子1,子2を生成する。'(_親1,_親2,_交叉点,_1点交叉後の親1,_1点交叉後の親2). '交叉点をランダムに1箇所選び、'(_親1,_親2,_交叉点) :- length(_親1,_長さ1), length(_親2,_長さ2), '交叉点をランダムに1箇所選び、'(_親1,_長さ1,_親2,_長さ2,_交叉点). '交叉点をランダムに1箇所選び、'(_親1,_長さ1,_親2,_長さ2,_交叉点) :- _長さ1 =< _長さ2, _交叉点 is random(_長さ1),!. '交叉点をランダムに1箇所選び、'(_親1,_長さ1,_親2,_長さ2,_交叉点) :- _交叉点 is random(_長さ2). '交叉点の右側の2つの親の部分文字列をそっくりそのまま交換して,子1,子2を生成する。'(_親1,_親2,_交叉点,_1点交叉後の親1,_1点交叉後の親2) :- '交叉点の右側の2つの親の部分文字列を'(_親1,_親2,_親1の前半文字列,_親1の後半文字列,_親2の前半文字列,_親2の後半文字列), 'そっくりそのまま交換して,子1,子2を生成する。'(_親1の前半文字列,_親1の後半文字列,_親2の前半文字列,_親2の後半文字列,_1点交叉後の親1,_1点交叉後の親2). '交叉点の右側の2つの親の部分文字列を'(_親1,_親2,_親1の前半文字列,_親1の後半文字列,_親2の前半文字列,_親2の後半文字列) :- sub_atom(_親1,0,_交叉点,_残り長さ1,_親1の前半文字列), sub_atom(_親1,_交叉点,_残り長さ1,0,_親1の後半文字列), sub_atom(_親2,0,_交叉点,_残り長さ2,_親2の前半文字列), sub_atom(_親2,_交叉点,_残り長さ2,0,_親2の後半文字列). 'そっくりそのまま交換して,子1,子2を生成する。'(_親1の前半文字列,_親1の後半文字列,_親2の前半文字列,_親2の後半文字列,_1点交叉後の親1,_1点交叉後の親2) :- atom_concat(_親1の前半文字列,_親2の後半文字列,_1点交叉後の親1), atom_concat(_親2の前半文字列,_親1の後半文字列,_1点交叉後の親2). % 以下のサイトは 苗字をn人分作る(_n,_苗字ならび) :- findall([_苗字,_10000人中の人数],( 苗字と10000人中の人数を得る(_苗字,_10000人中の人数)), LL1). 苗字分布ならびに変換する(LL1,0,LL2), length(_苗字ならび,_n), 苗字ならびにn人分の苗字を埋める(LL2,_苗字ならび). 苗字と10000人中の人数を得る(_苗字,_10000人中の人数) :- 苗字(_苗字,_出現比率), _10000人中の人数 is truncate(_出現比率 * 10000). 苗字分布ならびに変換する([],_,[]). 苗字分布ならびに変換する([[_苗字,N]|R1],M,[[_苗字,M,M_2]|R2]) :- M_2 is M + N, 苗字分布ならびに変換する(R1,M_2,R2). 苗字ならびにn人分の苗字を埋める(_,[]). 苗字ならびにn人分の苗字を埋める(LL2,[A|R]) :- 苗字を得る(LL2,_苗字), 苗字ならびにn人分の苗字を埋める(LL2,R),!. 苗字ならびにn人分の苗字を埋める(LL2,L) :- 苗字ならびにn人分の苗字を埋める(LL2,L). 苗字を得る(LL2,_苗字) :- _乱数 is random(10000), member([A,B,C],LL2), between(B,C,_乱数). % *** user: '苗字' / 2 *** 苗字(佐藤,0.0227). 苗字(高橋,0.0164). 苗字(伊藤,0.0124). 苗字(渡辺,0.0121). 苗字(小林,0.0118). 苗字(吉田,0.0093). 苗字(佐々木,0.0084). 苗字(松本,0.0071). 苗字(木村,0.0065). 苗字(斎藤,0.0061). 苗字(山崎,0.0055). 苗字(森,0.0052). 苗字(橋本,0.005). 苗字(石川,0.0047). 苗字(前田,0.0044). 苗字(後藤,0.0043). 苗字(岡田,0.0042). 苗字(長谷川,0.0042). 苗字(石井,0.004). 苗字(坂本,0.0038). 苗字(藤井,0.0036). 苗字(福田,0.0035). 苗字(西村,0.0035). 苗字(太田,0.0035). 苗字(原田,0.0033). 苗字(中野,0.0033). 苗字(小野,0.0033). 苗字(竹内,0.0032). 苗字(中山,0.0031). 苗字(石田,0.003). 苗字(上田,0.0028). 苗字(森田,0.0028). 苗字(横山,0.0027). 苗字(宮崎,0.0026). 苗字(内田,0.0026). 苗字(谷口,0.0025). 苗字(丸山,0.0025). 苗字(大野,0.0024). 苗字(菅原,0.0023). 苗字(武田,0.0023). 苗字(上野,0.0023). 苗字(千葉,0.0023). 苗字(増田,0.0022). 苗字(小山,0.0022). 苗字(平野,0.0022). 苗字(渡部,0.0021). 苗字(菊地,0.0021). 苗字(松尾,0.0021). 苗字(木下,0.0021). 苗字(野村,0.002). 苗字(鈴木,0.0195). 苗字(田中,0.0149). 苗字(山本,0.0122). 苗字(中村,0.0119). 苗字(加藤,0.0097). 苗字(山田,0.0092). 苗字(山口,0.0073). 苗字(井上,0.0067). 苗字(林,0.0061). 苗字(清水,0.0059). 苗字(阿部,0.0054). 苗字(池田,0.0051). 苗字(山下,0.0049). 苗字(中島,0.0045). 苗字(藤田,0.0044). 苗字(小川,0.0043). 苗字(村上,0.0042). 苗字(近藤,0.0041). 苗字(斉藤,0.0038). 苗字(遠藤,0.0038). 苗字(青木,0.0036). 苗字(三浦,0.0035). 苗字(藤原,0.0035). 苗字(松田,0.0034). 苗字(岡本,0.0033). 苗字(中川,0.0033). 苗字(田村,0.0032). 苗字(金子,0.0031). 苗字(和田,0.003). 苗字(工藤,0.0028). 苗字(原,0.0028). 苗字(酒井,0.0027). 苗字(柴田,0.0027). 苗字(宮本,0.0026). 苗字(高木,0.0026). 苗字(安藤,0.0025). 苗字(今井,0.0024). 苗字(高田,0.0024). 苗字(河野,0.0023). 苗字(藤本,0.0023). 苗字(杉山,0.0023). 苗字(村田,0.0022). 苗字(小島,0.0022). 苗字(大塚,0.0022). 苗字(久保,0.0022). 苗字(松井,0.0021). 苗字(岩崎,0.0021). 苗字(佐野,0.0021). 苗字(野口,0.0021). 苗字(新井,0.002). 苗字(古川,0.002). 苗字(杉本,0.002). 苗字(菊池,0.0019). 苗字(市川,0.0019). 苗字(島田,0.0019). 苗字(山内,0.0018). 苗字(吉川,0.0018). 苗字(東,0.0018). 苗字(中田,0.0017). 苗字(川口,0.0017). 苗字(安田,0.0017). 苗字(川崎,0.0017). 苗字(本田,0.0017). 苗字(川上,0.0016). 苗字(田口,0.0016). 苗字(吉村,0.0016). 苗字(福島,0.0016). 苗字(中西,0.0016). 苗字(松岡,0.0016). 苗字(岩田,0.0016). 苗字(森本,0.0016). 苗字(秋山,0.0016). 苗字(松下,0.0016). 苗字(大橋,0.0015). 苗字(小池,0.0015). 苗字(吉岡,0.0015). 苗字(大久保,0.0015). 苗字(野田,0.0015). 苗字(星野,0.0015). 苗字(堀,0.0014). 苗字(尾崎,0.0014). 苗字(黒田,0.0014). 苗字(松村,0.0014). 苗字(西山,0.0014). 苗字(田辺,0.0013). 苗字(片山,0.0013). 苗字(岩本,0.0013). 苗字(広瀬,0.0013). 苗字(岡崎,0.0013). 苗字(早川,0.0013). 苗字(横田,0.0013). 苗字(荒井,0.0013). 苗字(篠原,0.0012). 苗字(高山,0.0012). 苗字(栗原,0.0012). 苗字(松原,0.0012). 苗字(三宅,0.0012). 苗字(伊東,0.0012). 苗字(岡,0.0012). 苗字(福井,0.0011). 苗字(大西,0.002). 苗字(小松,0.002). 苗字(高野,0.0019). 苗字(五十嵐,0.0019). 苗字(水野,0.0019). 苗字(桜井,0.0018). 苗字(西田,0.0018). 苗字(北村,0.0018). 苗字(西川,0.0017). 苗字(久保田,0.0017). 苗字(平田,0.0017). 苗字(関,0.0017). 苗字(飯田,0.0016). 苗字(土屋,0.0016). 苗字(樋口,0.0016). 苗字(辻,0.0016). 苗字(浜田,0.0016). 苗字(永井,0.0016). 苗字(山中,0.0016). 苗字(矢野,0.0016). 苗字(服部,0.0016). 苗字(石原,0.0016). 苗字(熊谷,0.0016). 苗字(馬場,0.0015). 苗字(松浦,0.0015). 苗字(荒木,0.0015). 苗字(浅野,0.0015). 苗字(川村,0.0015). 苗字(大谷,0.0014). 苗字(望月,0.0014). 苗字(菅野,0.0014). 苗字(永田,0.0014). 苗字(内藤,0.0014). 苗字(本間,0.0013). 苗字(大島,0.0013). 苗字(大石,0.0013). 苗字(成田,0.0013). 苗字(平井,0.0013). 苗字(鎌田,0.0013). 苗字(小田,0.0013). 苗字(須藤,0.0013). 苗字(宮田,0.0012). 苗字(石橋,0.0012). 苗字(萩原,0.0012). 苗字(南,0.0012). 苗字(大森,0.0012). 苗字(桑原,0.0012). 苗字(小西,0.0012). 苗字(内山,0.0012). 苗字(松永,0.0011). 苗字(奥村,0.0011). 苗字(関口,0.0011). 苗字(上原,0.0011). 苗字(北川,0.0011). 苗字(白石,0.0011). 苗字(吉野,0.0011). 苗字(今村,0.0011). 苗字(八木,0.0011). 苗字(坂口,0.0011). 苗字(岡村,0.0011). 苗字(中尾,0.0011). 苗字(青山,0.001). 苗字(河合,0.001). 苗字(西,0.001). 苗字(川島,0.001). 苗字(竹田,0.001). 苗字(小沢,0.001). 苗字(坂井,0.001). 苗字(足立,0.001). 苗字(小原,0.001). 苗字(根本,0.001). 苗字(河村,0.001). 苗字(齋藤,0.001). 苗字(豊田,0.001). 苗字(武藤,0.001). 苗字(山根,0.0009). 苗字(関根,0.0009). 苗字(安部,0.0009). 苗字(前川,0.0009). 苗字(植田,0.0009). 苗字(宮川,0.0009). 苗字(長田,0.0009). 苗字(中井,0.0009). 苗字(及川,0.0009). 苗字(大川,0.0009). 苗字(中嶋,0.0009). 苗字(細川,0.0009). 苗字(谷,0.0009). 苗字(浅井,0.0009). 苗字(三上,0.0008). 苗字(江口,0.0008). 苗字(田代,0.0008). 苗字(神谷,0.0008). 苗字(大沢,0.0008). 苗字(長尾,0.0008). 苗字(村松,0.0008). 苗字(土井,0.0008). 苗字(飯島,0.0008). 苗字(稲葉,0.0008). 苗字(榎本,0.0008). 苗字(片岡,0.0011). 苗字(沢田,0.0011). 苗字(上村,0.0011). 苗字(小野寺,0.0011). 苗字(古賀,0.0011). 苗字(奥田,0.0011). 苗字(平山,0.0011). 苗字(宮下,0.0011). 苗字(牧野,0.0011). 苗字(小泉,0.0011). 苗字(富田,0.0011). 苗字(寺田,0.001). 苗字(児玉,0.001). 苗字(大山,0.001). 苗字(多田,0.001). 苗字(小笠原,0.001). 苗字(小倉,0.001). 苗字(渋谷,0.001). 苗字(村山,0.001). 苗字(坂田,0.001). 苗字(森下,0.001). 苗字(杉浦,0.001). 苗字(角田,0.001). 苗字(飯塚,0.001). 苗字(天野,0.0009). 苗字(神田,0.0009). 苗字(水谷,0.0009). 苗字(塚本,0.0009). 苗字(畠山,0.0009). 苗字(田島,0.0009). 苗字(佐久間,0.0009). 苗字(堀内,0.0009). 苗字(岡部,0.0009). 苗字(白井,0.0009). 苗字(今野,0.0009). 苗字(森山,0.0009). 苗字(若林,0.0009). 苗字(松崎,0.0009). 苗字(中谷,0.0008). 苗字(安達,0.0008). 苗字(西尾,0.0008). 苗字(稲垣,0.0008). 苗字(石塚,0.0008). 苗字(星,0.0008). 苗字(戸田,0.0008). 苗字(荒川,0.0008). 苗字(中原,0.0008). 苗字(本多,0.0008). 苗字(岸本,0.0008). 苗字(森川,0.0008). 苗字(岡野,0.0008). 苗字(三好,0.0008). 苗字(米田,0.0008). 苗字(黒木,0.0008). 苗字(津田,0.0008). 苗字(松山,0.0008). 苗字(落合,0.0008). 苗字(堀田,0.0007). 苗字(野崎,0.0007). 苗字(岩井,0.0007). 苗字(土田,0.0007). 苗字(古田,0.0007). 苗字(西野,0.0007). 苗字(奥山,0.0007). 苗字(須田,0.0007). 苗字(川田,0.0007). 苗字(大竹,0.0007). 苗字(野中,0.0007). 苗字(梅田,0.0007). 苗字(梶原,0.0006). 苗字(三木,0.0006). 苗字(日高,0.0006). 苗字(大場,0.0006). 苗字(大木,0.0006). 苗字(塚田,0.0006). 苗字(西本,0.0006). 苗字(藤川,0.0006). 苗字(金沢,0.0006). 苗字(竹中,0.0006). 苗字(竹下,0.0006). 苗字(宮内,0.0006). 苗字(吉本,0.0006). 苗字(藤村,0.0006). 苗字(谷川,0.0006). 苗字(窪田,0.0006). 苗字(竹本,0.0006). 苗字(石黒,0.0006). 苗字(小谷,0.0006). 苗字(福本,0.0006). 苗字(緒方,0.0006). 苗字(宮原,0.0006). 苗字(広田,0.0006). 苗字(北野,0.0005). 苗字(宮沢,0.0005). 苗字(高井,0.0005). 苗字(出口,0.0005). 苗字(小森,0.0005). 苗字(亀井,0.0005). 苗字(青柳,0.0005). 苗字(古谷,0.0005). 苗字(金井,0.0008). 苗字(中沢,0.0008). 苗字(甲斐,0.0008). 苗字(佐伯,0.0008). 苗字(山岸,0.0008). 苗字(金田,0.0008). 苗字(堤,0.0008). 苗字(西岡,0.0007). 苗字(泉,0.0007). 苗字(町田,0.0007). 苗字(新田,0.0007). 苗字(徳永,0.0007). 苗字(笠原,0.0007). 苗字(滝沢,0.0007). 苗字(黒川,0.0007). 苗字(山川,0.0007). 苗字(杉田,0.0007). 苗字(堀江,0.0007). 苗字(村井,0.0007). 苗字(川端,0.0006). 苗字(大村,0.0006). 苗字(岸,0.0006). 苗字(井口,0.0006). 苗字(庄司,0.0006). 苗字(向井,0.0006). 苗字(川原,0.0006). 苗字(大内,0.0006). 苗字(吉原,0.0006). 苗字(榊原,0.0006). 苗字(松島,0.0006). 苗字(茂木,0.0006). 苗字(藤岡,0.0006). 苗字(下田,0.0006). 苗字(藤沢,0.0006). 苗字(栗田,0.0006). 苗字(柳沢,0.0006). 苗字(嶋田,0.0006). 苗字(安井,0.0006). 苗字(宇野,0.0006). 苗字(平川,0.0006). 苗字(高島,0.0006). 苗字(奥野,0.0006). 苗字(三輪,0.0005). 苗字(下村,0.0005). 苗字(山村,0.0005). 苗字(大城,0.0005). 苗字(藤野,0.0005). 苗字(長野,0.0005). 苗字(川本,0.0005). 苗字(丹羽,0.0005). 苗字(荻野,0.0005). 苗字(田原,0.0005). 苗字(大平,0.0005). 苗字(高瀬,0.0005). 苗字(相馬,0.0005). 苗字(金城,0.0005). 苗字(北原,0.0005). 苗字(黒沢,0.0005). 苗字(小澤,0.0005). 苗字(筒井,0.0005). 苗字(吉沢,0.0005). 苗字(平松,0.0005). 苗字(山岡,0.0005). 苗字(石山,0.0005). 苗字(篠崎,0.0005). 苗字(冨田,0.0005). 苗字(鶴田,0.0005). 苗字(澤田,0.0005). 苗字(永野,0.0005). 苗字(二宮,0.0005). 苗字(川野,0.0005). 苗字(富永,0.0005). 苗字(入江,0.0005). 苗字(臼井,0.0005). 苗字(杉原,0.0005). 苗字(瀬戸,0.0005). 苗字(田畑,0.0005). 苗字(千田,0.0005). 苗字(浅田,0.0005). 苗字(花田,0.0005). 苗字(篠田,0.0005). 苗字(池上,0.0004). 苗字(日野,0.0004). 苗字(加納,0.0004). 苗字(新谷,0.0004). 苗字(堀口,0.0004). 苗字(倉田,0.0004). 苗字(深沢,0.0004). 苗字(福原,0.0004). 苗字(河原,0.0004). 苗字(野沢,0.0004). 苗字(志村,0.0004). 苗字(畑中,0.0004). 苗字(白川,0.0004). 苗字(柏木,0.0004). 苗字(矢島,0.0004). 苗字(岩瀬,0.0004). 苗字(原口,0.0004). 苗字(大崎,0.0004). 苗字(難波,0.0004). 苗字(竹村,0.0005). 苗字(稲田,0.0005). 苗字(長島,0.0005). 苗字(長岡,0.0005). 苗字(宮城,0.0005). 苗字(林田,0.0005). 苗字(大田,0.0005). 苗字(越智,0.0005). 苗字(福岡,0.0005). 苗字(福永,0.0005). 苗字(横井,0.0005). 苗字(溝口,0.0005). 苗字(柳田,0.0005). 苗字(手塚,0.0005). 苗字(武井,0.0005). 苗字(堀川,0.0005). 苗字(大原,0.0005). 苗字(高松,0.0005). 苗字(園田,0.0005). 苗字(片桐,0.0005). 苗字(比嘉,0.0005). 苗字(石崎,0.0005). 苗字(湯浅,0.0005). 苗字(渡邉,0.0005). 苗字(沼田,0.0005). 苗字(渡邊,0.0005). 苗字(根岸,0.0005). 苗字(谷本,0.0005). 苗字(小出,0.0005). 苗字(平岡,0.0005). 苗字(大槻,0.0005). 苗字(小坂,0.0004). 苗字(笠井,0.0004). 苗字(菅,0.0004). 苗字(田上,0.0004). 苗字(西沢,0.0004). 苗字(西原,0.0004). 苗字(長沢,0.0004). 苗字(松野,0.0004). 苗字(森岡,0.0004). 苗字(徳田,0.0004). 苗字(村瀬,0.0004). 苗字(小柳,0.0004). 苗字(中本,0.0004). 苗字(吉井,0.0004). 苗字(浜口,0.0004). 苗字(三谷,0.0004). 苗字(芳賀,0.0004). 苗字(内海,0.0004). 苗字(米山,0.0004). 苗字(島崎,0.0004). 苗字(荻原,0.0004). 苗字(木原,0.0004). 苗字(大友,0.0004). 苗字(北島,0.0004). 苗字(今泉,0.0004). 苗字(秋元,0.0004). 苗字(福山,0.0004). 苗字(磯部,0.0004). 苗字(河内,0.0004). 苗字(川瀬,0.0004). 苗字(小嶋,0.0004). 苗字(佐竹,0.0004). 苗字(長井,0.0004). 苗字(三村,0.0004). 苗字(遠山,0.0004). 苗字(井出,0.0004). 苗字(井手,0.0004). 苗字(塩田,0.0004). 苗字(平林,0.0004). 苗字(浜野,0.0004). 苗字(村岡,0.0004). 苗字(葛西,0.0004). 苗字(奈良,0.0004). 苗字(三島,0.0004). 苗字(真鍋,0.0004). 苗字(草野,0.0004). 苗字(橘,0.0004). 苗字(辻本,0.0004). 苗字(栗山,0.0004). 苗字(水口,0.0004). 苗字(半田,0.0004). 苗字(大澤,0.0004). 苗字(狩野,0.0004). 苗字(瀬川,0.0004). 苗字(尾形,0.0004). 苗字(坂下,0.0004). 苗字(大沼,0.0003). 苗字(立石,0.0003). 苗字(志賀,0.0003). 苗字(中里,0.0003). 苗字(柳,0.0003). 苗字(朝倉,0.0003). 苗字(有馬,0.0003). 苗字(神山,0.0003). 苗字(大江,0.0003). 苗字(高見,0.0003). 苗字(植松,0.0003). 苗字(江藤,0.0003). 苗字(宮地,0.0003). 苗字(大井,0.0004). 苗字(川畑,0.0004). 苗字(相沢,0.0004). 苗字(植木,0.0004). 苗字(皆川,0.0004). 苗字(岩下,0.0004). 苗字(坪井,0.0004). 苗字(大坪,0.0004). 苗字(秋田,0.0004). 苗字(吉永,0.0004). 苗字(三井,0.0004). 苗字(畑,0.0004). 苗字(細谷,0.0004). 苗字(細田,0.0004). 苗字(齊藤,0.0004). 苗字(浜崎,0.0004). 苗字(早坂,0.0004). 苗字(古屋,0.0004). 苗字(清野,0.0004). 苗字(若松,0.0004). 苗字(亀山,0.0004). 苗字(河田,0.0004). 苗字(保坂,0.0004). 苗字(橋口,0.0004). 苗字(松川,0.0004). 苗字(植村,0.0004). 苗字(水上,0.0004). 苗字(高村,0.0004). 苗字(板垣,0.0004). 苗字(堀井,0.0004). 苗字(岸田,0.0004). 苗字(藤森,0.0004). 苗字(玉井,0.0004). 苗字(相原,0.0004). 苗字(平,0.0004). 苗字(進藤,0.0004). 苗字(那須,0.0004). 苗字(亀田,0.0003). 苗字(川合,0.0003). 苗字(門脇,0.0003). 苗字(高岡,0.0003). 苗字(寺島,0.0003). 苗字(下山,0.0003). 苗字(市村,0.0003). 苗字(宮島,0.0003). 苗字(河本,0.0003). 苗字(高柳,0.0003). 苗字(織田,0.0003). 苗字(武内,0.0003). 苗字(藤崎,0.0003). 苗字(北山,0.0003). 苗字(木内,0.0003). 苗字(松木,0.0003). 苗字(高原,0.0003). 苗字(野上,0.0003). 苗字(三原,0.0003). 苗字(富樫,0.0003). 苗字(土居,0.0003). 苗字(立花,0.0003). 苗字(今田,0.0003). 苗字(柴崎,0.0003). 苗字(平尾,0.0003). 苗字(守屋,0.0003). 苗字(海野,0.0003). 苗字(久野,0.0003). 苗字(長谷部,0.0003). 苗字(深谷,0.0003). 苗字(関谷,0.0003). 苗字(長瀬,0.0003). 苗字(石丸,0.0003). 苗字(長谷,0.0003). 苗字(菅谷,0.0003). 苗字(黒岩,0.0003). 苗字(大倉,0.0003). 苗字(内野,0.0003). 苗字(上山,0.0003). 苗字(小寺,0.0003). 苗字(西谷,0.0003). 苗字(島,0.0003). 苗字(田川,0.0003). 苗字(末永,0.0003). 苗字(濱田,0.0003). 苗字(宮脇,0.0003). 苗字(滝口,0.0003). 苗字(成瀬,0.0003). 苗字(高崎,0.0003). 苗字(小室,0.0003). 苗字(門田,0.0003). 苗字(宍戸,0.0003). 苗字(鳥居,0.0003). 苗字(森谷,0.0003). 苗字(小畑,0.0003). 苗字(杉村,0.0003). 苗字(板倉,0.0003). 苗字(平塚,0.0003). 苗字(木田,0.0003). 苗字(阪本,0.0003). 苗字(阿久津,0.0003). 苗字(山上,0.0003). 苗字(井川,0.0003). 苗字(寺本,0.0003). 苗字(大津,0.0003). 苗字(有田,0.0003). 苗字(坂上,0.0003). 苗字(毛利,0.0003). 苗字(松沢,0.0003). 苗字(前原,0.0003). 苗字(島村,0.0003). 苗字(田崎,0.0003). 苗字(三橋,0.0003). 苗字(牧,0.0003). 苗字(岩永,0.0003). 苗字(浅見,0.0003). 苗字(川井,0.0003). 苗字(中澤,0.0003). 苗字(高尾,0.0003). 苗字(岩佐,0.0003). 苗字(飯野,0.0003). 苗字(中根,0.0003). 苗字(和泉,0.0003). 苗字(塚原,0.0003). 苗字(外山,0.0003). 苗字(滝本,0.0003). 苗字(市原,0.0003). 苗字(金山,0.0003). 苗字(金森,0.0003). 苗字(小関,0.0003). 苗字(金谷,0.0003). 苗字(秦,0.0003). 苗字(石垣,0.0003). 苗字(石本,0.0003). 苗字(井田,0.0003). 苗字(奥,0.0003). 苗字(岩渕,0.0003). 苗字(米沢,0.0003). 苗字(正木,0.0003). 苗字(宇佐美,0.0003). 苗字(矢部,0.0003). 苗字(永山,0.0003). 苗字(坂元,0.0003). 苗字(山野,0.0003). 苗字(野本,0.0003). 苗字(江崎,0.0003). 苗字(諏訪,0.0003). 苗字(藤木,0.0003). 苗字(森脇,0.0003). 苗字(江川,0.0003). 苗字(小宮,0.0003). 苗字(秋葉,0.0003). 苗字(大滝,0.0003). 苗字(小杉,0.0003). 苗字(三田,0.0003). 苗字(新垣,0.0003). 苗字(赤松,0.0003). 苗字(風間,0.0003). 苗字(布施,0.0003). 苗字(曽根,0.0003). 苗字(水田,0.0003). 苗字(堀越,0.0003). 苗字(金丸,0.0003). 苗字(佐川,0.0003). 苗字(松元,0.0002). 苗字(椎名,0.0002). 苗字(小椋,0.0002). 苗字(岩間,0.0002). 苗字(羽田,0.0002). 苗字(土橋,0.0002). 苗字(生田,0.0002). 苗字(仲田,0.0002). 苗字(小野田,0.0002). 苗字(仲村,0.0002). 苗字(長崎,0.0002). 苗字(依田,0.0002). 苗字(宮野,0.0002). 苗字(染谷,0.0002). 苗字(細野,0.0002). 苗字(矢口,0.0002). 苗字(日下,0.0002). 苗字(山元,0.0002). 苗字(赤木,0.0002). 苗字(矢田,0.0002). 苗字(木戸,0.0002). 苗字(浅川,0.0002). 苗字(勝又,0.0002). 苗字(高梨,0.0002). 苗字(倉持,0.0002). 苗字(小沼,0.0002). 苗字(寺尾,0.0002). 苗字(菅沼,0.0002). 苗字(高倉,0.0002). 苗字(富岡,0.0002). 苗字(真田,0.0002). 苗字(橋爪,0.0002). 苗字(雨宮,0.0002). 苗字(白鳥,0.0002). 苗字(岩城,0.0002). 苗字(石坂,0.0002). 苗字(丹野,0.0002). 苗字(池内,0.0002). 苗字(神野,0.0002). 苗字(豊島,0.0003). 苗字(梅原,0.0003). 苗字(玉城,0.0003). 苗字(下川,0.0003). 苗字(野原,0.0003). 苗字(香川,0.0003). 苗字(相川,0.0003). 苗字(浜本,0.0003). 苗字(古沢,0.0003). 苗字(北沢,0.0003). 苗字(山城,0.0003). 苗字(塩谷,0.0002). 苗字(櫻井,0.0002). 苗字(浦田,0.0002). 苗字(中林,0.0002). 苗字(喜多,0.0002). 苗字(小幡,0.0002). 苗字(目黒,0.0002). 苗字(宇都宮,0.0002). 苗字(大和田,0.0002). 苗字(山形,0.0002). 苗字(大畑,0.0002). 苗字(平沢,0.0002). 苗字(麻生,0.0002). 苗字(乾,0.0002). 苗字(細井,0.0002). 苗字(今西,0.0002). 苗字(梅本,0.0002). 苗字(小玉,0.0002). 苗字(大矢,0.0002). 苗字(梅津,0.0002). 苗字(北田,0.0002). 苗字(杉野,0.0002). 苗字(木本,0.0002). 苗字(大庭,0.0002). 苗字(都築,0.0002). 苗字(角,0.0002). 苗字(影山,0.0002). 苗字(波多野,0.0002). 苗字(深田,0.0002). 苗字(並木,0.0002). 苗字(西口,0.0002). 苗字(川辺,0.0002). 苗字(柳原,0.0002). 苗字(栗林,0.0002). 苗字(首藤,0.0002). 苗字(瀬尾,0.0002). 苗字(宮坂,0.0002). 苗字(赤坂,0.0002). 苗字(結城,0.0002). 苗字(合田,0.0002). 苗字(尾上,0.0002). 苗字(立川,0.0002). 苗字(海老原,0.0002). 苗字(大貫,0.0002). 苗字(青野,0.0002). 苗字(今,0.0002). 苗字(石渡,0.0002). 苗字(大下,0.0002). 苗字(川西,0.0002). 苗字(永島,0.0002). 苗字(横尾,0.0002). 苗字(久米,0.0002). 苗字(東海林,0.0002). 苗字(三沢,0.0002). 苗字(飛田,0.0002). 苗字(玉置,0.0002). 苗字(森口,0.0002). 苗字(桑田,0.0002). 苗字(廣瀬,0.0002). 苗字(三枝,0.0002). 苗字(石倉,0.0002). 苗字(大林,0.0002). 苗字(柏原,0.0002). 苗字(小堀,0.0002). 苗字(江原,0.0002). 苗字(芦田,0.0002). 苗字(水島,0.0002). 苗字(砂川,0.0002). 苗字(島袋,0.0002). 苗字(坂東,0.0002). 苗字(高畑,0.0002). 苗字(花岡,0.0002). 苗字(手島,0.0002). 苗字(梅村,0.0002). 苗字(玉木,0.0002). 苗字(吉澤,0.0002). 苗字(前野,0.0002). 苗字(白木,0.0002). 苗字(野呂,0.0002). 苗字(中塚,0.0002). 苗字(柴山,0.0002). 苗字(金澤,0.0002). 苗字(沖,0.0002). 苗字(前島,0.0002). 苗字(百瀬,0.0002). 苗字(富山,0.0002). 苗字(菅井,0.0002). 苗字(浅沼,0.0002). 苗字(高谷,0.0002). 苗字(曽我,0.0002). 苗字(小久保,0.0002). 苗字(妹尾,0.0002). 苗字(北,0.0002). 苗字(板橋,0.0002). 苗字(志田,0.0002). 苗字(上杉,0.0002). 苗字(神崎,0.0002). 苗字(有賀,0.0002). 苗字(大熊,0.0002). 苗字(竹原,0.0002). 苗字(井原,0.0002). 苗字(大嶋,0.0002). 苗字(池本,0.0002). 苗字(西島,0.0002). 苗字(田端,0.0002). 苗字(清田,0.0002). 苗字(西脇,0.0002). 苗字(須賀,0.0002). 苗字(坂野,0.0002). 苗字(横川,0.0002). 苗字(川越,0.0002). 苗字(本村,0.0002). 苗字(春日,0.0002). 苗字(笹川,0.0002). 苗字(内村,0.0002). 苗字(日比野,0.0002). 苗字(楠,0.0002). 苗字(谷村,0.0002). 苗字(脇田,0.0002). 苗字(浦野,0.0002). 苗字(小栗,0.0002). 苗字(平良,0.0002). 苗字(岡山,0.0002). 苗字(角谷,0.0002). 苗字(沖田,0.0002). 苗字(楠本,0.0002). 苗字(浜,0.0002). 苗字(大和,0.0002). 苗字(森永,0.0002). 苗字(明石,0.0002). 苗字(吉崎,0.0002). 苗字(柳川,0.0002). 苗字(島津,0.0002). 苗字(大高,0.0002). 苗字(岩谷,0.0002). 苗字(井本,0.0002). 苗字(笹原,0.0002). 苗字(滝川,0.0002). 苗字(小菅,0.0002). 苗字(黒崎,0.0002). 苗字(倉本,0.0002). 苗字(戸塚,0.0002). 苗字(桜田,0.0002). 苗字(本橋,0.0002). 苗字(畠中,0.0002). 苗字(勝田,0.0002). 苗字(益田,0.0002). 苗字(中,0.0002). 苗字(熊田,0.0002). 苗字(猪股,0.0002). 苗字(恩田,0.0002). 苗字(八田,0.0002). 苗字(村木,0.0002). 苗字(塩見,0.0002). 苗字(会田,0.0002). 苗字(新村,0.0002). 苗字(福地,0.0002). 苗字(冨永,0.0002). 苗字(滝,0.0002). 苗字(田所,0.0002). 苗字(神戸,0.0002). 苗字(川添,0.0002). 苗字(末吉,0.0002). 苗字(照井,0.0002). 苗字(紺野,0.0002). 苗字(城戸,0.0002). 苗字(寺岡,0.0002). 苗字(磯野,0.0002). 苗字(夏目,0.0002). 苗字(村中,0.0002). 苗字(森井,0.0002). 苗字(菊田,0.0002). 苗字(長友,0.0002). 苗字(石沢,0.0002). 苗字(米倉,0.0002). 苗字(石岡,0.0002). 苗字(今川,0.0002). 苗字(神原,0.0002). 苗字(柿沼,0.0002). 苗字(河西,0.0002). 苗字(寺崎,0.0002). 苗字(持田,0.0002). 苗字(川嶋,0.0002). 苗字(玉田,0.0002). 苗字(中岡,0.0002). 苗字(長沼,0.0002). 苗字(品川,0.0002). 苗字(柳瀬,0.0002). 苗字(増井,0.0002). 苗字(田渕,0.0002). 苗字(大浦,0.0002). 苗字(池谷,0.0002). 苗字(国分,0.0002). 苗字(高嶋,0.0002). 苗字(熊倉,0.0002). 苗字(本山,0.0002). 苗字(古山,0.0002). 苗字(小口,0.0002). 苗字(田尻,0.0002). 苗字(石野,0.0002). 苗字(井村,0.0002). 苗字(小平,0.0002). 苗字(南部,0.0002). 苗字(平賀,0.0002). 苗字(寺沢,0.0002). 苗字(五味,0.0002). 苗字(赤羽,0.0002). 苗字(梅沢,0.0002). 苗字(丸田,0.0002). 苗字(松橋,0.0002). 苗字(日下部,0.0002). 苗字(重松,0.0002). 苗字(若山,0.0002). 苗字(福士,0.0002). 苗字(児島,0.0002). 苗字(鶴岡,0.0002). 苗字(湊,0.0002). 苗字(野島,0.0002). 苗字(阪口,0.0002). 苗字(土谷,0.0002). 苗字(新保,0.0002). 苗字(藤島,0.0002). 苗字(西森,0.0002). 苗字(牧田,0.0002). 苗字(大関,0.0002). 苗字(重田,0.0002). 苗字(宮澤,0.0002). 苗字(古市,0.0002). 苗字(有村,0.0002). 苗字(岩村,0.0002). 苗字(浦,0.0002). 苗字(氏家,0.0002). 苗字(境,0.0002). 苗字(沢井,0.0002). 苗字(藤山,0.0002). 苗字(小高,0.0002). 苗字(西井,0.0002). 苗字(小村,0.0002). 苗字(寺井,0.0002). % 以下のサイトは # # (p) http://cp1.nintendo.co.jp/2012 任天堂サイトの問題ですが # # $ python SimpleBarsTest.py # test_loop (__main__.testSimpleBars) ... ok # test_simple_rule (__main__.testSimpleBars) ... ok # # ---------------------------------------------------------------------- # Ran 2 tests in 0.000s # # OK # # テストコードまでOKなんですが、 # answerを出したのですが違っているようなんです。 # この問題を解いた方がいましたら少し教えてもらえませんでしょうか。 'iTピラミッド' :- 'iTピラミッド'(1,12,[i,'T']), 'iTピラミッド'(12,1,['T',i]). 'iTピラミッド'(1,6,[i,'T']). 'iTピラミッド'(_開始段数,_段数,_記号並び順) :- for(_開始段数,N,_段数), ピラミッドの段を生成(N,_記号並び順,L), 最初の3文字分を末尾に移動して段文字列とする(L,_段文字列), writef('%t\n',[_段文字列]), N = _段数. ピラミッドの段を生成(N,_記号並び順,L) :- 段の記号部分を生成(_記号並び順,L2), length(L,25), append(L1,L2,L1,L), all(L1,' '). 段の記号部分を生成(_記号並び順,L2) :- _length is (N - 1) * 2 + 1, length(L2,_length), '記号並び順に変数を埋める'(_記号並び順,L2). '記号並び順に変数を埋める'(_,[]). '記号並び順に変数を埋める'([A|R1],[A|R2]) :- append(R1,[A],L1), '記号並び順に変数を埋める'(L1,R2). 最初の3文字分を末尾に移動して段文字列とする([_1,_2,_3|R],_段文字列) :- append(R,[_1,_2,_3],_求める記号ならび), atomic_list_concat(_求める記号ならび,_段文字列). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% all([],_). all([V|R],V) :- all(R,V). for(S,N,E) :- for_2(S,N,E). for(S,N,E) :- for_1(S,N,E). for_1(S,_,E) :- S < E,!,fail. for_1(S,N,E) :- N is S. for_1(S,N,E) :- S1 is S - 1, for_1(S1,N,E). for_2(S,_,E) :- S > E,!,fail. for_2(S,N,E) :- N is S. for_2(S,N,E) :- S1 is S + 1, for_2(S1,N,E). % 以下のサイトは # # グーを0、チョキを1、パーを2とし、ユーザは自分の出す手をキーボードから入力する。 # 'グーを0、チョキを1、パーを2とし、ユーザは自分の出す手をキーボードから入力する。'(_自分の出す手) :- 入力プロセスの生成(Id,Message_queue_Id), 'グーを0、チョキを1、パーを2とし'(_自分の出す手,_自分の出す手の入力値), 'ユーザは自分の出す手をキーボードから入力する。'(Id,Message_queue_Id,_自分の出す手の入力値),!. 'グーを0、チョキを1、パーを2とし'(_自分の出す手,_自分の出す手の入力値) :- グーを0(_自分の出す手,_自分の出す手の入力値). 'グーを0、チョキを1、パーを2とし'(_自分の出す手,_自分の出す手の入力値) :- チョキを1(_自分の出す手,_自分の出す手の入力値). 'グーを0、チョキを1、パーを2とし'(_自分の出す手,_自分の出す手の入力値) :- パーを2(_自分の出す手,_自分の出す手の入力値). グーを0(グー,0). チョキを1(チョキ,1). パーを2(パー,2). 'ユーザは自分の出す手をキーボードから入力する。'(Id,Message_queue_Id,_自分の出す手の入力値) :- キーボードから(_キーボードの入力ストリーム), 入力プロセスから一度得た情報を何度も供給する(Id,Message_queue_Id,Line), atom_number(Line,_自分の出す手の入力値). 入力プロセスから一度得た情報を何度も供給する(Id,Message_queue_Id,_情報) :- 入力プロセスから一度得た情報(Id,Message_queue_Id,Term), 入力プロセスから一度得た情報を何度も供給する(Id,Message_queue_Id,Term,_情報). 入力プロセスから一度得た情報を何度も供給する(Id,Message_queue_Id,_情報) :- 入力プロセスから一度得た情報を何度も供給する(Id,Message_queue_Id,_情報). 入力プロセスから一度得た情報を何度も供給する(Id,Message_queue_Id,_情報,_情報). 入力プロセスから一度得た情報を何度も供給する(Id,Message_queue_Id,_情報,_情報) :- thread_peek_massage(Message_queue_Id,_次の情報),!,fail. 入力プロセスから一度得た情報を何度も供給する(Id,Message_queue_Id,Term,_情報) :- 入力プロセスから一度得た情報を何度も供給する(Id,Message_queue_Id,Term,_情報). 入力プロセスから一度得た情報(Id,Message_queue_Id,Term) :- thread_get_message(Message_queue_Id,Term). 入力プロセスの生成(Id,Message_queue_Id) :- thread_create(キーボードからの入力(Message_queue_Id),Id,[]). キーボードからの入力(Message_queue_Id) :- message_queue_create(Message_queue_Id), キーボードからの入力(Message_queue_Id). キーボードからの入力(Message_queue_Id) :- reapeat, キーボードから(Instream), get_line(Instream,Line), thread_send_message(Message_queue_Id,Line), fail. キーボードから(user_input). % 以下のサイトは 素数生成(_素数) :- 素数生成(2,[],_素数). 素数生成(N,L,_素数) :- 素数検査(N,L,L_2,_診断), 素数生成(N,L_2,_診断,_素数). 素数検査(_素数,L,[_素数|L],素数) :- forall(member(_素数_1,L),\+(0 is _素数 mod _素数_1)),!. 素数検査(N,L,L,素数ではない). 素数生成(_素数,_,素数,_素数). 素数生成(N,L,_診断,_素数) :- N_2 is N + 1, 素数生成(N_2,L,_素数). % 以下のサイトは 'Prologでジェネレータを書いてみる'(_文字列1,_文字列2,_文字列3,_生成文字列) :- sub_atom(_文字列1,_,1,_,_文字1), sub_atom(_文字列2,_,1,_,_文字2), sub_atom(_文字列3,_,1,_,_文字3), atomic_list_concat([_文字1,_文字2,_文字3],_生成文字列). % 以下のサイトは 'Prologでジェネレータを書いてみる'([_文字列1,_文字列2,_文字列3],_生成文字列) :- sub_atom(_文字列1,_,1,_,_文字1), sub_atom(_文字列2,_,1,_,_文字2), sub_atom(_文字列3,_,1,_,_文字3), atomic_list_concat([_文字1,_文字2,_文字3],_生成文字列). % 以下のサイトは 'Prologでジェネレータを書いてみる'(L,_生成文字列) :- findall(sub_atom(_文字列,_,1,_,_文字),( member(_文字列,L)), L1), ならび連言項変換(L1,P), call(P), sub_atomの解を結合する(L1,_生成文字列). ならび連言項変換([_項の一|_残りならび],_連言項) :- _連言項 =.. [',',_項の一,_連言項の二], ならび連言項変換(_残りならび,_連言項の二),!. ならび連言項変換([_項],_項) :- !. sub_atomの解を結合する(L1,_生成文字列) :- findall(A,( member(sub_atom(_,_,_,_,A),L1)), L), atomic_list_concat(L,_生成文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1367772345/105 # # 103じゃないけど、yieldを使ってジェネレータが書ける こんな感じで # # def product(xss): # if xss: # for x in xss[0]: # for y in product(xss[1:]): # yield x + y # else: # yield '' # # print(','.join(product(['abc', 'xy', '12']))) #=> ax1,ax2,ay1,ay2,bx1,bx2,by1,by2,cx1,cx2,cy1,cy2 # # 106 :デフォルトの名無しさん :sage :2013/05/07(火) 07:27:40.99 # 普通の3重ループじゃ駄目なの? # # 107 :デフォルトの名無しさん :sage :2013/05/07(火) 07:30:37.41 # # # >>106 # ループ数は引数のリストの長さで決まるから、 # 再帰を使った方が書きやすいよ # # 108 :デフォルトの名無しさん :sage :2013/05/07(火) 07:58:37.14 # >>106 # n重ループ # # 109 :デフォルトの名無しさん :sage :2013/05/07(火) 08:27:20.88 # やっぱpythonのjoinはちょっと気持ち悪いな # List.joinでいいじゃんと思ってしまう # 設計思想的にこうなんだろうけど # # 110 :デフォルトの名無しさん :sage :2013/05/07(火) 08:54:06.01 # List.joinでは手続き的すぎて古臭いって思想か # ジェネレータもそれかな # ただの軽量スレッドでは面白くないからジェネレータなのだ # # 111 :デフォルトの名無しさん :sage :2013/05/07(火) 10:25:49.03 # ジェネレータで書けるものを再帰で再現するとスタックの無駄遣いで # 再帰の方が非効率だと思う # # > % Prologでジェネレータ書いてみる。やはり再帰でしか書けない。 product([_文字列],_一文字) :-     sub_atom(_文字列,_,1,_,_一文字). product([_文字列|R1],_生成文字列) :-     sub_atom(_文字列,_,1,_,_一文字),     product(R1,_生成文字列_2),     atom_concat(_一文字,_生成文字列_2,_生成文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1367772345/105 # # 103じゃないけど、yieldを使ってジェネレータが書ける こんな感じで # # def product(xss): # if xss: # for x in xss[0]: # for y in product(xss[1:]): # yield x + y # else: # yield '' # # print(','.join(product(['abc', 'xy', '12']))) #=> ax1,ax2,ay1,ay2,bx1,bx2,by1,by2,cx1,cx2,cy1,cy2 # # 106 :デフォルトの名無しさん :sage :2013/05/07(火) 07:27:40.99 # 普通の3重ループじゃ駄目なの? # # 107 :デフォルトの名無しさん :sage :2013/05/07(火) 07:30:37.41 # # # >>106 # ループ数は引数のリストの長さで決まるから、 # 再帰を使った方が書きやすいよ # # 108 :デフォルトの名無しさん :sage :2013/05/07(火) 07:58:37.14 # >>106 # n重ループ # # 109 :デフォルトの名無しさん :sage :2013/05/07(火) 08:27:20.88 # やっぱpythonのjoinはちょっと気持ち悪いな # List.joinでいいじゃんと思ってしまう # 設計思想的にこうなんだろうけど # # 110 :デフォルトの名無しさん :sage :2013/05/07(火) 08:54:06.01 # List.joinでは手続き的すぎて古臭いって思想か # ジェネレータもそれかな # ただの軽量スレッドでは面白くないからジェネレータなのだ # # 111 :デフォルトの名無しさん :sage :2013/05/07(火) 10:25:49.03 # ジェネレータで書けるものを再帰で再現するとスタックの無駄遣いで # 再帰の方が非効率だと思う # # # yield from 使ってみたくて使ったけど不要だった # # def product(xss): # return (x + y for x in xss[0] for y in product(xss[1:])) if xss else [''] % Prologでジェネレータ書いてみる。やはり再帰でしか書けない。 'def product(xss): if xss: for x in xss[0]: for y in product(xss[1:]): yield x + y else: yield '''' '(_文字列ならび,_生成文字列) :- 'Prologでジェネレータを書いてみる'(_文字列ならび,_生成文字列). 'def product(xss): return (x + y for x in xss[0] for y in product(xss[1:])) if xss else ['''']'(_文字列ならび,_生成文字列) :- 'Prologでジェネレータを書いてみる'(_文字列ならび,_生成文字列). 'Prologでジェネレータ書いてみる'([_文字列],_一文字) :- sub_atom(_文字列,_,1,_,_一文字). 'Prologでジェネレータ書いてみる'([_文字列|R1],_生成文字列) :- sub_atom(_文字列,_,1,_,_一文字), 'Prologでジェネレータ書いてみる'(R1,_生成文字列_2), atom_concat(_一文字,_生成文字列_2,_生成文字列). % % 'def product(xss): % if xss: % for x in xss[0]: % for y in product(xss[1:]): % yield x + y % else: % yield '''' '([abc,xy,'12'],X). % % X = ax1; % X = ax2; % X = ay1; % X = ay2; % X = bx1; % X = bx2; % X = by1; % X = by2; % X = cx1; % X = cx2; % X = cy1; % X = cy2; % no % % ?- 'Prologでジェネレータ書いてみる'([abc,xy,'12'],X). % % X = ax1; % X = ax2; % X = ay1; % X = ay2; % X = bx1; % X = bx2; % X = by1; % X = by2; % X = cx1; % X = cx2; % X = cy1; % X = cy2; % no % % ?- % 以下のサイトは # [1] 授業単元:著作権 # [2] 問題文(含コード&リンク): # # 標準入力から西暦(グレゴリオ暦)を受け取り、 # その年のイースターの日を計算するプログラムを作成してください。 # 結果の表示はしてもしなくてもかまいません。 # # [3] 環境 #  [3.1] OS: (Windows/Linux/等々) #  [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) #  [3.3] 言語: (C/C++/どちらでも可 のいずれか) # [4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか) # # [5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々) # # # イースターの日の決め方 # # イースターの日の決め方の単純な定義は「春分の日の次の満月の後の最初の日曜日」ということになります。 # 尚、その満月の日が日曜日の場合は翌日曜日がイースターとなります。 # # しかしながら、厳密に申しますとこの定義は正しくありません。 # まず、ここでいう「春分の日」は天文学的な意味での春分の日ではなく常に3月21日とします。 # 「満月の日」というのも天文学的な意味での満月の日ではなくMetonic cycleという周期に基づいたものなのです。 # # この理由は、地球上の経度の違い、即ちタイムゾーンの違いによって地域によってイースターの日が変ってしまうという混乱を防ぐためなのです。 # イースターの日を決めるということはそもそも礼拝式典の必要から生じてきました。 # 8世紀までは決め方に関する定まった方法はありませんでしたが、 # AD325年のニカヤ会議による方法が徐々に取り入れられていったようです。 # グレゴリオ暦の採択によって幾分かの修正が必要となりましたが基本的には同じです。 # # 逆に言うと、Metonic cycleさえ知っていれば、将来のイースターの日を計算することが可能なのです。 # # 試してみたい方は、次のようなアルゴリズムによって1900年から2099年までのイースターの日が計算できます。 # # 1.まず調べたい年の西暦年を19で割った余りを計算します。 # # (例えば2006年の場合は19で割って余りが11) # # 2.その余りに11をかけて225から引いた数字をDとします。 # # (D=225-11×11= 104) # # 3.もしDが51以上の時は51未満になるまで30で引き、改めてそれをDとします。 # # (D=104-30-30=44) # # 4.もし、Dが48よりも大きい時はそれから1を引きます。 # # (D=44なのでそのまま) # # 5.西暦年と、西暦年を4で割った数字(小数点以下切り捨て)と、D+1とを足し、それを7で割った余りをEとします。 # # (2006+501+44+1=2552となり7で割ると余りが4なのでE=4) # # 6.Dに7を足してEで引き、それをQとします。 # # (Q=44+7-4=47) # # 7.もし、Qが31以下の時はイースターは3月でその数字がイースター日付を表わします。Qが32以上の場合はイースターは4月でQから31を引いた数字が日付を表わします。 # # (Qは47なので、イースターは4月そして日付は47-31=16日) # # 堺福音教会東京チャペル # tokyo@jec-net.org # TEL.03-3642-5242/FAX.03-3642-5479 # 〒135-0042 東京都江東区木場2丁目17-10-301 # のサイトからの引用 'イースターの日の決め方 イースターの日の決め方の単純な定義は「春分の日の次の満月の後の最初の日曜日」ということになります。 尚、その満月の日が日曜日の場合は翌日曜日がイースターとなります。 しかしながら、厳密に申しますとこの定義は正しくありません。 まず、ここでいう「春分の日」は天文学的な意味での春分の日ではなく常に3月21日とします。 「満月の日」というのも天文学的な意味での満月の日ではなくMetonic cycleという周期に基づいたものなのです。 この理由は、地球上の経度の違い、即ちタイムゾーンの違いによって地域によって イースターの日が変ってしまうという混乱を防ぐためなのです。 イースターの日を決めるということはそもそも礼拝式典の必要から生じてきました。 8世紀までは決め方に関する定まった方法はありませんでしたが、 AD325年のニカヤ会議による方法が徐々に取り入れられていったようです。 グレゴリオ暦の採択によって幾分かの修正が必要となりましたが基本的には同じです。 試してみたい方は、次のようなアルゴリズムによって1900年から2099年までのイースターの日が計算できます。 1.まず調べたい年の西暦年を19で割った余りを計算します。 (例えば2006年の場合は19で割って余りが11) 2.その余りに11をかけて225から引いた数字をDとします。 (D=225-11×11= 104) 3.もしDが51以上の時は51未満になるまで30で引き、改めてそれをDとします。 (D=104-30-30=44) 4.もし、Dが48よりも大きい時はそれから1を引きます。 (D=44なのでそのまま) 5.西暦年と、西暦年を4で割った数字(小数点以下切り捨て)と、D+1とを足し、それを7で割った余りをEとします。 (2006+501+44+1=2552となり7で割ると余りが4なのでE=4) 6.Dに7を足してEで引き、それをQとします。 (Q=44+7-4=47) 7.もし、Qが31以下の時はイースターは3月でその数字がイースター日付を表わします。Qが32以上の場合はイースターは4月でQから31を引いた数字が日付を表わします。 (Qは47なので、イースターは4月そして日付は47-31=16日)' :- 堺福音教会東京チャペルのサイトからの引用. '標準入力から西暦(グレゴリオ暦)を受け取り、 その年のイースターの日を計算するプログラムを作成してください。 結果の表示はしてもしなくてもかまいません。'(_西暦,_月,_日) :- '標準入力から西暦(グレゴリオ暦)を受け取り、'(_西暦), 'Metonic cycleを使ってその年のイースターの日を計算する'(_西暦,_月,_日). '標準入力から西暦(グレゴリオ暦)を受け取り、'(_西暦) :- 整数を得る('西暦(グレゴリオ暦)',グレゴリオ歴(_西暦),_西暦). 'Metonic cycleを使ってその年のイースターの日を計算する'(_西暦,_月,_日) :- 'まず調べたい年の西暦年を19で割った余りを計算します。その余りに11をかけて225から引いた数字をDとします。'(_西暦,D), 'もしDが51以上の時は51未満になるまで30で引き、それをD_2とします。もし、Dが48よりも大きい時はそれから1を引きます。'(D,D_2), '西暦年と、西暦年を4で割った数字(小数点以下切り捨て)と、D_2 + 1 とを足し、それを7で割った余りをEとします。'(_西暦,D_2,E), 'D_2に7を足してEで引き、それをQとします。'(D_2,E,Q), 'もし、Qが31以下の時はイースターは3月でその数字がイースター日付を表わします。Qが32以上の場合はイースターは4月でQから31を引いた数字が日付を表わします。'(Q,_月,_日). 'まず調べたい年の西暦年を19で割った余りを計算します。その余りに11をかけて225から引いた数字をDとします。'(_西暦,D) :- _19で割った余り is _西暦 mod 19, D is 255 - _19で割った余り * 11. 'もしDが51以上の時は51未満になるまで30で引き、それをD_2とします。もし、Dが48よりも大きい時はそれから1を引きます。'(D,D_2) :- 'もしDが51以上の時は'(D), '51未満になるまで30で引き、それをD_2とします。'(D,D_2). 'もしDが51以上の時は51未満になるまで30で引き、それをD_2とします。もし、Dが48よりも大きい時はそれから1を引きます。'(D,D_2) :- 'もし、Dが48よりも大きい時は'(D), 'それから1を引きます。'(D,D_2). 'もしDが51以上の時は'(D,D_2) :- D >= 51. '51未満になるまで30で引き、それをD_2とします。'(D,D_2) :- D_2 is ((D - 51) // 30) + 1) * 30. 'もし、Dが48よりも大きい時は'(D) :- between(48,50,D). 'それから1を引きます。'(D,D_2) :- D_2 is D - 1. '西暦年と、西暦年を4で割った数字(小数点以下切り捨て)と、D_2 + 1 とを足し、それを7で割った余りをEとします。'(_西暦,D_2,E) :- _西暦年を4で割った数字 is _西暦 // 4, E is (_西暦年を4で割った数字 + D_2 + 1) mod 7. 'D_2に7を足してEで引き、それをQとします。'(D_2,E,Q) :- Q is D_2 + 7 - E. 'もし、Qが31以下の時はイースターは3月でその数字がイースター日付を表わします。Qが32以上の場合はイースターは4月でQから31を引いた数字が日付を表わします。'(Q,3,Q) :- Q =< 31,!. 'もし、Qが31以下の時はイースターは3月でその数字がイースター日付を表わします。Qが32以上の場合はイースターは4月でQから31を引いた数字が日付を表わします。'(Q,4,_日) :- Q >= 32, _日 is Q - 31. グレゴリオ歴(_西暦) :- true. % 以下のサイトは アルファベットのならびを生成する(_アルファベットのならび) :- findall(_アルファベット,( アルファベットの文字コードの範囲(_文字コード), char_code(_アルファベット,_文字コード)), _アルファベットのならび). アルファベットの文字コードの範囲(_文字コード) :- 数字文字コード(_文字コード). アルファベットの文字コードの範囲(_文字コード) :- 英大文字コード(_文字コード). アルファベットの文字コードの範囲(_文字コード) :- 英小文字コード(_文字コード). 数字文字コード(_文字コード) :- between(48,57,_文字コード). 英大文字コード(_文字コード) :- between(65,90,_文字コード). 英小文字コード(_文字コード) :- between(97,122,_文字コード). % 以下のサイトは # # 1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となるPrologプログラムを作成しなさい。 # '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となる'(_1,_2,_3,_4,_5,_6,_7,_8) :- '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となる'([],[_1,_2,_3,_4,_5,_6,_7,_8]). '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となる'([_1,_2,_3,_4,_5,_6,_7,_8|_],[_8,_7,_6,_5,_4,_3,_2,_1]) :- 整列([_1,_2,_3,_4,_5,_6,_7,_8],[_,_,_,M,N,_,_,_]), 44 is M + N. '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となる'(L1,L) :- N is random(99) + 1, '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となる'([N|L1],L). 整列([],[]). 整列([_軸要素|R1],L) :- 分割(_軸要素,R1,L1,L2), 整列(L1,L3), 整列(L2,L4), append(L3,[_軸要素|L4],L). 分割(_,[],[],[]). 分割(_軸要素,[A|R1],[A|R2],R3) :- A @=< _軸要素, 分割(_軸要素,R1,R2,R3). 分割(_軸要素,[A|R1],R2,[A|R3]) :- A @> _軸要素, 分割(_軸要素,R1,R2,R3). % 以下のサイトは # 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). % 「割り当てた数範囲にある」と確率の関係がうまく説明できていない。 % 以下のサイトは # # 1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となるPrologプログラムを作成しなさい。 # '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となるPrologプログラムを作成しなさい。'(L) :- '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'([],L). '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となる'(L1,L) :- 乱数を発生させる(_乱数), 乱数を挿入して整列させる(_乱数,L1,L2), '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となるの二'(L2,LL). '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となるの二'(L1,L) :- 中央値が存在する(L1,L). '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となるの二'(L1,L) :- '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となる'(L1,L). 中央値が存在する(L1,L) :- append(L0,[[_1,_2,_3,_4,_5,_6,_7,_8]|R],L1), 44 is _4 + _5, 中央値が存在する(L1,L0,[_1,_2,_3,_4,_5,_6,_7,_8],R,L). 中央値が存在する(L1,_,L,_,L). 中央値が存在する(L1,L0,_,R,L) :- append(L0,R,L2), '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となる'(L2,L). 乱数を発生させる(_乱数) :- _乱数 is random(99) + 1. 乱数を挿入して整列させる(_乱数,[],[_乱数]) :- !. 乱数を挿入して整列させる(_乱数,[N|R],[_乱数,N|R]) :- _乱数 =< N,!. 乱数を挿入して整列させる(_乱数,[N|R1],[N|R2]) :- _乱数 > N, 乱数を挿入して整列させる(_乱数,R1,R2). % 以下のサイトは # x^2+y^2=z^2を満たす正の整数をピタゴラス数と呼び、三つ組(x,y,z)で表す。 # ピタゴラス数のリストを生成する関数pythsを定義せよ。 # ただし、ピタゴラス数の要素は、与えられた上限以下であるとする。 # ピタゴラス数ならび(_要素値上限,_ピタゴラス数ならび) :- findall(N,between(1,_要素値上限,N),L), findall([X,Y,Z],( 重複組み合わせ(L,3,[X,Y,Z]), Z * Z =:= X * X + Y * Y), _ピタゴラス数ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/561 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # 問題A # 0と1だけで構成されたテキストファイルAがある。このファイルを読み込み、文字数をカウントし、 # 同じ文字数の0と1で構成された乱数列を生成し、テキストファイルBとして出力するプログラムを作成せよ。 # シード値はシステム時刻など適当なものを使用せよ。 # 問題B # 問題Aで使用したテキストファイルA、Bを一文字ずつXORしテキストファイルCとして出力するプログラムを作成せよ。 # '問題B 問題Aで使用したテキストファイルA、Bを一文字ずつXORしテキストファイルCとして出力するプログラムを作成せよ。'(_テキストファイルA,_テキストファイルB,_テキストファイルC) :- get_chars(_テキストファイルA,Chars_1), get_chars(_テキストファイルB,Chars_2), 一文字ずつXORしテキストファイルCとして出力する(_テキストファイルC,Chars_,Chars_2). 一文字ずつXORしテキストファイルCとして出力する(Outstream,Chars_,Chars_2) :- open(_テキストファイルC,write,Outstream), forall(一文字ずつXORし(Chars_1,Chars_2,C), writef(Outstream,'%t',[C])), close(Outstream). 一文字ずつXORし(Chars_1,Chars_2,C) :- nth1(_nth1,Chars_1,A), nth1(_nth1,Chars_2,B), '数字のXOR'(A,B,C). '数字のXOR'('0','0','0'). '数字のXOR'('1','0','1'). '数字のXOR'('0','1','1'). '数字のXOR'('1','1','0'). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/561 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # 問題A # 0と1だけで構成されたテキストファイルAがある。このファイルを読み込み、文字数をカウントし、 # 同じ文字数の0と1で構成された乱数列を生成し、テキストファイルBとして出力するプログラムを作成せよ。 # シード値はシステム時刻など適当なものを使用せよ。 # 問題B # 問題Aで使用したテキストファイルA、Bを一文字ずつXORしテキストファイルCとして出力するプログラムを作成せよ。 # '問題A 0と1だけで構成されたテキストファイルAがある。このファイルを読み込み、文字数をカウントし、 同じ文字数の0と1で構成された乱数列を生成し、テキストファイルBとして出力するプログラムを作成せよ。'(_テキストファイルA,_テキストファイルB) :- 'このファイルを読み込み、文字数をカウントし、同じ文字数の0と1で構成された乱数列を生成し'(_テキストファイルA,_要素数,_乱数数字ならび), テキストファイルBとして出力する(_テキストファイルB,_乱数数字ならび). 'このファイルを読み込み、文字数をカウントし、同じ文字数の0と1で構成された乱数列を生成し'(_テキストファイルA,_要素数,_乱数数字ならび) :- このファイルを読み込み(_テキストファイルA,Chars), 文字数をカウントし(Chars,_文字数), 同じ文字数の0と1で構成された乱数列を生成し(_文字数,Chars,_乱数数字ならび). このファイルを読み込み(_テキストファイルA,Chars) :- get_chars(_テキストファイルA,Chars). 文字数をカウントし(Chars,_文字数) :- length(Chars,_文字数). 同じ文字数の0と1で構成された乱数列を生成し(0,[],[]) :- !. 同じ文字数の0と1で構成された乱数列を生成し(N,L1,[A|R]) :- M is random(N), 一文字取り出す(M,L1,A,L2), N_1 is N - 1, 同じ文字数の0と1で構成された乱数列を生成し(N_1,L2,R). 一文字取り出す(M,L1,A,L2) :- length(L0,M), append(L0,[A|R],L1), append(L0,R,L2). テキストファイルBとして出力する(_テキストファイルB,L) :- atom_chars(_乱数文字列,L), open(_テキストファイルB,write,Outstream), write(Outstream,A), close(Outstream). % 以下のサイトは # http://toro.2ch.net/test/read.cgi/tech/1357748713/477 # [1] 授業単元:c++ # [2] 問題文(含コード&リンク):不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、ローマ字名を入力してデータファイル内の情報を検索するプログラムを作成してください。 # 検索の結果として、該当者が居る場合画面にその情報(ローマ字名、漢字名、番号、得点)を表示し、なおかつその情報が記載された新しいファイル(kekka.txt)が生成されるようにしてください。また、該当者が居ない場合はその旨を表示するようにしてください。 # [3] 環境 #  [3.1] OS: windows7 #  [3.2] コンパイラ名とバージョン: Borland C++ 5.5.1 #  [3.3] 言語:C++ # [4] 期限: 2013/2/1 # [5] その他の制限: 入出力の方法、変数、四則演算、分岐、繰り返し、関数、文字の出入力、文字列、構造体、ファイル処理の範囲内でお願い致します。 '不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、 ローマ字名を入力してデータファイル内の情報を検索するプログラムを作成してください。 検索の結果として、該当者が居る場合画面にその情報(ローマ字名、漢字名、番号、得点)を表示し、 なおかつその情報が記載された新しいファイル(kekka.txt)が生成されるようにしてください。 また、該当者が居ない場合はその旨を表示するようにしてください。' :- '不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、 ローマ字名を入力して、データファイル内の情報を検索する'(_検索結果,_ローマ字名,_漢字名,_番号,_得点), '検索の結果として、該当者が居る場合、画面にその情報(ローマ字名、漢字名、番号、得点)を表示し、 なおかつその情報が記載された新しいファイル(kekka.txt)が生成されるようにしてください。 また、該当者が居ない場合はその旨を表示する'(_検索結果,_ローマ字名,_漢字名,_番号,_得点). '不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、 ローマ字名を入力して、データファイル内の情報を検索する'(_検索結果,_入力されたローマ字名,_漢字名,_番号,_得点) :- ローマ字名を入力して(_入力されたローマ字名), '不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、 ローマ字名を入力して、データファイル内の情報を検索する'(_入力されたローマ字名,_検索結果,_漢字名,_番号,_得点). ローマ字名を入力して(_ローマ字名) :- write('検索するローマ字名を入力してください : '), get_line(_ローマ字名). '不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、 ローマ字名を入力して、データファイル内の情報を検索する'(_入力されたローマ字名,該当者が居る,_漢字名,_番号,_得点) :- get_split_lines('seiseki.txt',[' ',','],LL), member([_入力されたローマ字名,_漢字名,_番号,_得点],LL). '不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、 ローマ字名を入力して、データファイル内の情報を検索する'(_,該当者が居ない,_,_,_). '検索の結果として、該当者が居る場合、画面にその情報(ローマ字名、漢字名、番号、得点)を表示し、 なおかつその情報が記載された新しいファイル(kekka.txt)が生成されるようにしてください。 また、該当者が居ない場合はその旨を表示する'(該当者が居る,_ローマ字名,_漢字名,_番号,_得点) :- '画面にその情報(ローマ字名、漢字名、番号、得点)を表示し'(_ローマ字名,_漢字名,_番号,_得点), 'なおかつその情報が記載された新しいファイル(kekka.txt)が生成される'(_ローマ字名,_漢字名,_番号,_得点). '検索の結果として、該当者が居る場合、画面にその情報(ローマ字名、漢字名、番号、得点)を表示し、 なおかつその情報が記載された新しいファイル(kekka.txt)が生成されるようにしてください。 また、該当者が居ない場合はその旨を表示する'(該当者が居ない,_,_,_,_) :- write('該当者はいません\n'). '画面にその情報(ローマ字名、漢字名、番号、得点)を表示し'(_ローマ字名,_漢字名,_番号,_得点) :- writef('%t %t %t %t\n',[_ローマ字名,_漢字名,_番号,_得点]). 'なおかつその情報が記載された新しいファイル(kekka.txt)が生成される'(_ローマ字名,_漢字名,_番号,_得点) :- '新しいファイル(kekka.txt)が生成される'(Outstream), writef(Outstream,'%t %t %t %t\n',[_ローマ字名,_漢字名,_番号,_得点]), close(Outstream). '新しいファイル(kekka.txt)が生成される'(Outstream) :- open('kekka.txt',write,Outstream). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/363 # # [1] 授業単元:C++基礎 # [2] 問題文(含コード&リンク): # 基底クラスとして Shape、その派生クラスとして Rectangle (正方形)を定義し、 # 正四角形の辺の長さの合計と面積を計算する。 # 面積(_ある正方形,_面積) :- 正方形(_ある正方形), 辺(_ある正方形,_辺), _面積 is _辺 * _辺. 辺の合計(_ある正方形,_面積) :- 正方形(_ある正方形), 辺(_ある正方形,_辺), _辺の合計 is _辺 * 4. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/227 # # [1] 授業単元: 配列の整列 # [2] 問題文(含コード&リンク):字数超えてしまったのでリンク張ります。 # [ http://ime.nu/codepad.org/YCoV3saL ] # # /* # # 2次元配列の整列 # # ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。 # # | 学生番号 | 問1の点数 | 問2の点数 | 問3の点数 | 問4の点数 |問5の点数 | # # これを入力し、学生ごとの合格点と、問ごと合計点を求めて表示する(整列前) # 次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合計点で照準に整列して表示する(整列後)。 # # 【実行例】 # # 整列前 # 番号 問1  問2 問3 問4 問5 合計 # 1001 20 30 49 41 90 230 # 1002 50 30 24 0 95 199 # 1003 20 33 55 35 90 233 # 1004 93 55 56 61 90 355 #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ # 1025 80 90 52 50 91 363 # 合計 1145 1015 1297 978 2292 # # 整列後 # 番号 問5  問3 問1 問2 問4 合計 # 1025 91 52 80 90 50 363 # 1004 90 56 93 55 61 355 # 1003 90 50 94 50 49 233 # 1004 100 49 70 30 62 311 #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ # 1015 90 53 20 20 0 183 # 合計 2292 1297 1145 1015 978 # # ※実行例が長くなってしまうので途中省略しています。 # # */ 'ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。 | 学生番号 | 問1の点数 | 問2の点数 | 問3の点数 | 問4の点数 |問5の点数 | これを入力し、学生ごとの合格点と、問ごと合計点を求めて表示する(整列前) 次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合格点で照準に整列して表示する(整列後)。' :- 'ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。これを入力し、'(LL1), '学生ごとの合格点と、問ごと合計点を求めて表示する'(LL1,LL2), '次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合格点で照準に整列して表示する(整列後)。'(LL2). 'ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。これを入力し、'(LL1) :- get_split_lines('seiseki.dat',[' '],LL1). '学生ごとの合格点と、問ごと合計点を求めて表示する'(LL1,LL2) :- '行列を列の合計で降順に整列して列位置を交換し(LL1,LL2), 問いごとの合計を表示する(LL2). 列の合計で降順に整列して列位置を交換し(LL,LL1) :- 転置(LL,_転置されたLL), findall([_合計,_nth1|L],( nth1(_nth1,_転置されたLL,L), sum(L,_合計)), _転置され合計を付加されたLL), 降順バブルソート(_転置され合計と列位置が付加されたLL,_降順に整列された転置され合計と列位置が付加されたLL), 転置(_降順に整列された転置され合計と列位置が付加されたLL,LL1). 問いごとの合計を表示する(LL2) :- between(1,6,_nth), nth0(_nth,LL2,[_合計|_]), atomic_list_concat([問,_nth,' = ',_合計],S), writef(' %t,',[S]), _nth = 6, write('\n'). '次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合格点で照準に整列して表示する(整列後)。'(LL1) :- 列の合計で降順に整列して列位置を交換し(LL1,LL2), 行合計で降順に整列する(LL2,_降順に整列された各行の先頭列に合計が付加され各列の先頭行から合計と列位置が付加されたLL), 表示する(_降順に整列された各行の先頭列に合計が付加され各列の先頭行から合計と列位置が付加されたLL). 行合計で降順に整列する(LL1,_降順に整列された各行の先頭列に合計が付加され各列の先頭行から合計と列位置が付加されたLL) :- findall([_合計|L2],( member(L,LL1), 要素の合計を最終要素に付加(L,_合計,L2)), LL2), 降順バブルソート(LL2,_降順に整列された各行の先頭列に合計が付加され各列の先頭行から合計と列位置が付加されたLL). 要素の合計を最終要素に付加(L1,_合計,L2) :- 要素の合計を最終要素に付加(L1,0,_合計,L2). 要素の合計を最終要素に付加([],_合計,_合計,[_合計]). 要素の合計を最終要素に付加([N|R1],_合計_1,_合計,[N|R2]) :- _合計_2 is _合計 + N, 要素の合計を最終要素に付加(R1,_合計_2,_合計,R2). 表示する(LL2) :- 最終見出しを得る(LL2,_見出し), writef('%t\n',[_見出し]), 行列部分の表示(LL2), 最終合計の表示(LL2). 行列部分の表示(LL) :- append(_,[[_|L]|R],LL), writef('%5l%5r%5r%5r%5r%5r%5r\n',L), R = []. 最終合計の表示([_最終合計ならび|_]) :- writef(' %5r%5r%5r%5r%5r%5r\n',_最終合計ならび). 合計点の表示(_順位づけられた合計点ならび) :- findall(_合計点,( member([_合計点,_],_順位づけられた合計点ならび)), _合計点ならび), writef(' %5r%5r%5r%5r%5r%5r\n',_合計点ならび). 最終見出しを得る([_,L|_],_最終見出し) :- findall(S,( member(N,L), atomic_list_concat(['問',_nth1,' '],S)), L), atomic_list_concat(['番号 '|L],_最終見出し). 降順バブルソート(L1,L2) :- append(L0,[A,B|R],L1), A @< B, append(L0,[B,A|R],L3), 降順バブルソート(L3,L2),!. 降順バブルソート(L,L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/227 # # [1] 授業単元: 配列の整列 # [2] 問題文(含コード&リンク):字数超えてしまったのでリンク張ります。 # [ http://ime.nu/codepad.org/YCoV3saL ] # # /* # # 2次元配列の整列 # # ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。 # # | 学生番号 | 問1の点数 | 問2の点数 | 問3の点数 | 問4の点数 |問5の点数 | # # これを入力し、学生ごとの合格点と、問ごと合計点を求めて表示する(整列前) # 次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合計点で照準に整列して表示する(整列後)。 # # 【実行例】 # # 整列前 # 番号 問1  問2 問3 問4 問5 合計 # 1001 20 30 49 41 90 230 # 1002 50 30 24 0 95 199 # 1003 20 33 55 35 90 233 # 1004 93 55 56 61 90 355 #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ # 1025 80 90 52 50 91 363 # 合計 1145 1015 1297 978 2292 # # 整列後 # 番号 問5  問3 問1 問2 問4 合計 # 1025 91 52 80 90 50 363 # 1004 90 56 93 55 61 355 # 1003 90 50 94 50 49 233 # 1004 100 49 70 30 62 311 #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ # 1015 90 53 20 20 0 183 # 合計 2292 1297 1145 1015 978 # # ※実行例が長くなってしまうので途中省略しています。 # # */ 'ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。 | 学生番号 | 問1の点数 | 問2の点数 | 問3の点数 | 問4の点数 |問5の点数 | これを入力し、学生ごとの合格点と、問ごと合計点を求めて表示する(整列前) 次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合格点で照準に整列して表示する(整列後)。' :- 'ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。これを入力し、'(LL1), '学生ごとの合格点と、問ごと合計点を求めて表示する(整列前)'(LL1,_問いごとの合計点ならび,_転置された学生の合格点付き点数行列), 'さらに、学生の合格点で照準に整列して表示する(整列後)。'(_問いごとの合計点ならび,転置された学生の合格点付き点数行列). 'ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。これを入力し、'(LL1) :- get_split_lines('seiseki.dat',[' '],LL1). '学生ごとの合格点と、問ごと合計点を求めて表示する(整列前)'(LL1,LL4,_問いごとの合計点ならび,_転置された学生の合格点付き点数行列) :- '学生ごとの合格点と、'(LL1,_学生の合格点付き点数行列), '問ごと合計点を求めて'(_学生の合格点付き点数行列,_問いごとの合計点ならび,_転置された学生の合格点付き点数行列), 表示する(_学生の合格点付き点数行列,_問いごとの合計点ならび). '学生ごとの合格点と、'([],[]). '学生ごとの合格点と、'([[_学生番号|L1]|R1],[[_学生番号|L2]|R2]) :- sum(L1,_sum), 学生ごとの合格点(L1,0,L2), '学生ごとの合格点と、'(R1,R2). 学生ごとの合格点([],_合計点,[_合計点]). 学生ごとの合格点([A|R1],_合計点_1,[A|R2]) :- _合計点2 is A + _合計点_1, 学生ごとの合格点(R1,R2). 問ごと合計点を求めて(_学生の合格点付き点数行列,_問いごとの合計点ならび,_転置された学生の合格点付き点数行列) :- 転置(_学生の合格点付き点数行列,_転置された学生の合格点付き点数行列), 問ごと合計点(_転置された学生の合格点付き点数行列,_問いごとの合計点ならび). 問ごと合計点([],[]). 問ごと合計点([L1|R1],[S|R2]) :- sum(L1,S), 問ごと合計点(R1,R2). 表示する(_学生の合格点付き点数行列,_問いごとの合計点ならび) :- write('番号 問1  問2 問3 問4 問5 合計\n'), append(_,[L|R],_学生の合格点付き点数行列), writef('%5l%5r%5r%5r%5r%5r%5r\n',L), R = [], writef(' %5r%5r%5r%5r%5r%5r\n',_問いごとの合計点ならび). '次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合格点で照準に整列して表示する(整列後)。'(_転置された学生の合格点付き点数行列,_問いごとの合計点ならび) :- '次に、問の合計点の降順に左から右に向かって整列し、'(_転置された学生の合格点付き点数行列,_問いごとの合計点ならび,LL_1), 'さらに、学生の合格点で照準に整列して'(LL_1,LL_2), 表示する_2(_問いごとの合計点ならび,LL_2). '次に、問の合計点の降順に左から右に向かって整列し、'(_転置された学生の合格点付き点数行列,_問いごとの合計点ならび) :- 順位づけする(_問いごとの合計点ならび,_順位づけされた合計点ならび), findall(L,( between(1,5,N), nth1(N,_順位づけされた合計点ならび,[_,_項目番号]), nth1(_項目番号,_転置された学生の合格点付き点数行列,L)), LL_1), 転置([_学生番号ならび|LL_1],LL_2). 'さらに、学生の合格点で照準に整列して'(LL1,LL2) :- findall([A|L],( member(L,LL1), last(L,A)), LL3), 整列(LL3,LL4), 鍵を切り離して逆順にならび替え(LL4,[],LL2). 鍵を切り離して逆順にならび替え([],LL,LL). 鍵を切り離して逆順にならび替え([[A|L]|R1],L_1,LL) :- 鍵を切り離して逆順にならび替え(R1,[L|L_1],LL). 順位づけする(_問いごとの合計点ならび,_順位づけされた合計点ならび) :- findall([_合計点,_nth1],( between(1,5,_nth1), nth1(_nth1,_問いごとの合計点ならび,_合計点)), LL1), 降順整列(LL1,_順位づけされた合計点ならび). 降順整列(LL1,_順位づけされた合計点ならび) :- 整列(LL1,LL2), reverse(LL2,_順位づけされた合計点ならび). 表示する_2(LL_2,_順位づけられた合計点ならび) :- 見出し表示(_順位づけられた合計点ならび), 行列部分の表示(LL_2), 合計点の表示(_順位づけられた合計点ならび). 見出し表示(_順位づけられた合計点ならび) :- findall(_項目番号,( member([_,_項目番号],_順位づけられた合計点ならび)), _項目番号ならび), writef('番号 %5r%5r%5r%5r%5r%5r合計\n',_項目番号ならび). 行列部分の表示(LL) :- append(_,[L|R],LL), writef('%5l%5r%5r%5r%5r%5r%5r\n',L), R = []. 合計点の表示(_順位づけられた合計点ならび) :- findall(_合計点,( member([_合計点,_],_順位づけられた合計点ならび)), _合計点ならび), writef(' %5r%5r%5r%5r%5r%5r\n',_合計点ならび). % 以下のサイトは # # 教育漢字から任意の一文字を選択する # 教育漢字から任意の二文字を選択する # 教育漢字から任意の三文字を選択する # 教育漢字ならび([一,右,雨,円,王,音,下,火,花,貝,学,気,九,休,玉,金,空,月,犬,見,五,口,校,左,三,山,子,四,糸,字,耳,七,車,手,十,出,女,小,上,森,人,水,正,生,青,夕,石,赤,千,川,先,早,草,足,村,大,男,竹,中,虫,町,天,田,土,二,日,入,年,白,八,百,文,木,本,名,目,立,力,林,六,引,羽,雲,園,遠,何,科,夏,家,歌,画,回,会,海,絵,外,角,楽,活,間,丸,岩,顔,汽,記,帰,弓,牛,魚,京,強,教,近,兄,形,計,元,言,原,戸,古,午,後,語,工,公,広,交,光,考,行,高,黄,合,谷,国,黒,今,才,細,作,算,止,市,矢,姉,思,紙,寺,自,時,室,社,弱,首,秋,週,春,書,少,場,色,食,心,新,親,図,数,西,声,星,晴,切,雪,船,線,前,組,走,多,太,体,台,地,池,知,茶,昼,長,鳥,朝,直,通,弟,店,点,電,刀,冬,当,東,答,頭,同,道,読,内,南,肉,馬,売,買,麦,半,番,父,風,分,聞,米,歩,母,方,北,毎,妹,万,明,鳴,毛,門,夜,野,友,用,曜,来,里,理,話,悪,安,暗,医,委,意,育,員,院,飲,運,泳,駅,央,横,屋,温,化,荷,開,界,階,寒,感,漢,館,岸,起,期,客,究,急,級,宮,球,去,橋,業,曲,局,銀,区,苦,具,君,係,軽,血,決,研,県,庫,湖,向,幸,港,号,根,祭,皿,仕,死,使,始,指,歯,詩,次,事,持,式,実,写,者,主,守,取,酒,受,州,拾,終,習,集,住,重,宿,所,暑,助,昭,消,商,章,勝,乗,植,申,身,神,真,深,進,世,整,昔,全,相,送,想,息,速,族,他,打,対,待,代,第,題,炭,短,談,着,注,柱,丁,帳,調,追,定,庭,笛,鉄,転,都,度,投,豆,島,湯,登,等,動,童,農,波,配,倍,箱,畑,発,反,坂,板,皮,悲,美,鼻,筆,氷,表,秒,病,品,負,部,服,福,物,平,返,勉,放,味,命,面,問,役,薬,由,油,有,遊,予,羊,洋,葉,陽,様,落,流,旅,両,緑,礼,列,練,路,和,愛,案,以,衣,位,囲,胃,印,英,栄,塩,億,加,果,貨,課,芽,改,械,害,街,各,覚,完,官,管,関,観,願,希,季,紀,喜,旗,器,機,議,求,泣,救,給,挙,漁,共,協,鏡,競,極,訓,軍,郡,径,型,景,芸,欠,結,建,健,験,固,功,好,候,航,康,告,差,菜,最,材,昨,札,刷,殺,察,参,産,散,残,士,氏,史,司,試,児,治,辞,失,借,種,周,祝,順,初,松,笑,唱,焼,象,照,賞,臣,信,成,省,清,静,席,積,折,節,説,浅,戦,選,然,争,倉,巣,束,側,続,卒,孫,帯,隊,達,単,置,仲,貯,兆,腸,低,底,停,的,典,伝,徒,努,灯,堂,働,特,得,毒,熱,念,敗,梅,博,飯,飛,費,必,票,標,不,夫,付,府,副,粉,兵,別,辺,変,便,包,法,望,牧,末,満,未,脈,民,無,約,勇,要,養,浴,利,陸,良,料,量,輪,類,令,冷,例,歴,連,老,労,録,圧,移,因,永,営,衛,易,益,液,演,応,往,桜,恩,可,仮,価,河,過,賀,快,解,格,確,額,刊,幹,慣,眼,基,寄,規,技,義,逆,久,旧,居,許,境,均,禁,句,群,経,潔,件,券,険,検,限,現,減,故,個,護,効,厚,耕,鉱,構,興,講,混,査,再,災,妻,採,際,在,財,罪,雑,酸,賛,支,志,枝,師,資,飼,示,似,識,質,舎,謝,授,修,述,術,準,序,招,承,証,条,状,常,情,織,職,制,性,政,勢,精,製,税,責,績,接,設,舌,絶,銭,祖,素,総,造,像,増,則,測,属,率,損,退,貸,態,団,断,築,張,提,程,適,敵,統,銅,導,徳,独,任,燃,能,破,犯,判,版,比,肥,非,備,俵,評,貧,布,婦,富,武,復,複,仏,編,弁,保,墓,報,豊,防,貿,暴,務,夢,迷,綿,輸,余,預,容,略,留,領,異,遺,域,宇,映,延,沿,我,灰,拡,革,閣,割,株,干,巻,看,簡,危,机,貴,揮,疑,吸,供,胸,郷,勤,筋,系,敬,警,劇,激,穴,絹,権,憲,源,厳,己,呼,誤,后,孝,皇,紅,降,鋼,刻,穀,骨,困,砂,座,済,裁,策,冊,蚕,至,私,姿,視,詞,誌,磁,射,捨,尺,若,樹,収,宗,就,衆,従,縦,縮,熟,純,処,署,諸,除,将,傷,障,城,蒸,針,仁,垂,推,寸,盛,聖,誠,宣,専,泉,洗,染,善,奏,窓,創,装,層,操,蔵,臓,存,尊,宅,担,探,誕,段,暖,値,宙,忠,著,庁,頂,潮,賃,痛,展,討,党,糖,届,難,乳,認,納,脳,派,拝,背,肺,俳,班,晩,否,批,秘,腹,奮,並,陛,閉,片,補,暮,宝,訪,亡,忘,棒,枚,幕,密,盟,模,訳,郵,優,幼,欲,翌,乱,卵,覧,裏,律,臨,朗,論]). 教育漢字から一文字を選択する(_漢字) :- 教育漢字ならび(_教育漢字ならび), 教育漢字から一文字を選択する(_教育漢字ならび,_漢字),!. 教育漢字から一文字を選択する(_教育漢字ならび,_漢字) :- _nth0 is random(1006), nth0(_nth0,_教育漢字ならび,_漢字),!. 教育漢字から二文字を選択する(_漢字_1,_漢字_2) :- 教育漢字ならび(_教育漢字ならび), 教育漢字から一文字を選択する(_教育漢字ならび,_漢字_1), 教育漢字から一文字を選択する(_教育漢字ならび,_漢字_2). 教育漢字から重複なく二文字を選択する(_漢字_1,_漢字_2) :- 教育漢字から重複なくn文字を選択する(2,[_漢字_1,_漢字_2]). 教育漢字から三文字を選択する(_漢字_1,_漢字_2,_漢字_3) :- 教育漢字ならび(_教育漢字ならび), 教育漢字から一文字を選択する(_教育漢字ならび,_漢字_1), 教育漢字から一文字を選択する(_教育漢字ならび,_漢字_2). 教育漢字から重複なく三文字を選択する(_漢字_1,_漢字_2,_漢字_3) :- 教育漢字から重複なくn文字を選択する(3,[_漢字_1,_漢字_2,_漢字_3]). 教育漢字からn文字を選択する(_n,_漢字ならび) :- 教育漢字ならび(_教育漢字ならび), findall(_漢字,( between(1,_n,_), _nth0 is random(1006), nth0(_nth0,_教育漢字ならび,_漢字)), _漢字ならび). 教育漢字から重複なくn文字を選択する(_n,_漢字ならび) :- 教育漢字ならび(_教育漢字ならび), 教育漢字から重複なくn文字を選択する(_n,_教育漢字ならび,[],_漢字ならび). 教育漢字から重複なくn文字を選択する(_n,_,L1,[]) :- length(L1,_n),!. 教育漢字から重複なくn文字を選択する(_n,_教育漢字ならび,L1,[_漢字|R]) :- 教育漢字から一文字を選択する(_教育漢字ならび,_漢字), \+(member(_漢字,L1)), 教育漢字から重複なくn文字を選択する(_n,_教育漢字ならび,[_漢字|L1],R),!. 教育漢字から重複なくn文字を選択する(_n,_教育漢字ならび,L1,R) :- 教育漢字から重複なくn文字を選択する(_n,_教育漢字ならび,L1,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/79 # # [1] 授業単元: システム開発 # [2] 問題文(含コード&amp;リンク): # 以下のヒントを元に、生徒の成績を管理するプログラムを作りなさい # http://ime.nu/codepad.org/vevYc04f # http://ime.nu/codepad.org/rCOCOccX # # /* seiseki.c 成績処理システム */ # #include /* 標準入出力 */ # #include /* 標準ライブラリー */ # #include /* 数学的関数 */ # #include /* 文字列関数 */ # #define SEN "--------------------\n" /* マクロ定義 */ # #define KEISEN "=====================\n" # # /* サブルーチンの宣言 */ # void data_write(void); /* データの書き込み */ # void data_read(void); /* データの読み込み */ # void data_disp(void); /* 成績一覧表の表示 */ # void data_kensk(void); /* 検索処理 */ # void the_end(void); /* プログラムの終了処理 */ # # /* 変数, 構造体の宣言 */ # struct seiseki{ # char simei[20]; /* 氏名 */ # int bango, kokugo, eigo, suugaku; /* 番号, 国語, 英語, 数学 */ # }; # struct seiseki a[100]; /* 登録数は100名まで */ # int n, i, goukei; /* 変数の定義 */ # double heikin, std; # # main() # { # int k; /* switch-case用の処理番号 */ # do{ /* 繰り返し処理do-while */ # /* 初期メニュー画面 */ # printf("\n"); # printf("☆☆ 成績処理メニュー ☆☆\n"); # printf(SEN); # printf("データの書き込み・・・・・・・・・【1】\n"); # printf("データの読み込み・・・・・・・・・【2】\n"); # printf("成績一覧表・・・・・・・・・・・・【3】\n"); # printf("検索処理・・・・・・・・・・・・・【4】\n"); # printf("終わり・・・・・・・・・・・・・・【9】\n"); # printf(SEN); # printf("処理番号を入力してください:"); # scanf("%d",&k); # printf("\n"); # # /* 関数の呼び出し */ # switch(k){ # case 1:data_write();break; # case 2:data_read();break; # case 3:data_disp();break; # case 4:data_kensk();break; # case 9:the_end();break; # default:printf("該当番号なし\n");break; # } # }while(k < 10); # } # # /* 成績一覧表の作成 */ # void data_disp(void) # { # int goukei_k=0, goukei_e=0, goukei_s=0; # double heikin_k=0.0, heikin_e=0.0, heikin_s=0.0; # double std_k=0.0, std_e=0.0, std_s=0.0; # # printf("☆☆☆ 成績一覧表 ☆☆☆\n"); # printf(KEISEN); # printf("番号 名前 国語 英語 数学 合計 平均\n"); # for(i=0;i < n;i++){ # printf("%5d %-10s %5d %5d %5d", a[i].bango, a[i].simei, a[i].kokugo, a[i].eigo, a[i].suugaku); # /* 3科目の合計計算 */ # goukei=(a[i].kokugo +a[i].eigo +a[i].suugaku); # printf("%5d",goukei); # /* キャスト:3科目の平均計算 */ # heikin=(double)goukei/3; # printf("%6.1f\n",heikin); # } # printf("\n"); # # /* 各科目の合計計算 */ # for(i=0;i < n;i++){ # goukei_k+=a[i].kokugo; # goukei_e+=a[i].eigo; # goukei_s+=a[i].suugaku; # } # # /* 各科目の平均計算 */ # heikin_k=(double)goukei_k/n; # heikin_e=(double)goukei_e/n; # heikin_s=(double)goukei_s/n; # # /* 偏差の二乗和の計算 */ # for(i=0;i < n;i++){ # std_k+=pow((a[i].kokugo-heikin_k),2); # std_e+=pow((a[i].eigo-heikin_e),2); # std_s+=pow((a[i].suugaku-heikin_s),2); # } # # /* 標準偏差の計算 */ # std_k=sqrt(std_k/n); # std_e=sqrt(std_e/n); # std_s=sqrt(std_s/n); '繰り返し処理do-while'(P) :- 'do{ /* 繰り返し処理do-while */ }while(k < 10);'(P). 初期メニュー画面(_k) :- '/* 初期メニュー画面 */ printf("\n"); printf("☆☆ 成績処理メニュー ☆☆\n"); printf(SEN); printf("データの書き込み・・・・・・・・・【1】\n"); printf("データの読み込み・・・・・・・・・【2】\n"); printf("成績一覧表・・・・・・・・・・・・【3】\n"); printf("検索処理・・・・・・・・・・・・・【4】\n"); printf("終わり・・・・・・・・・・・・・・【9】\n"); printf(SEN); printf("処理番号を入力してください:"); scanf("%d",&k); printf("\n");'(_k). 関数の呼び出し(_k) :- '/* 関数の呼び出し */ switch(k){ case 1:data_write();break; case 2:data_read();break; case 3:data_disp();break; case 4:data_kensk();break; case 9:the_end();break; default:printf("該当番号なし\n");break; }'(_k). '3科目の合計計算'(_i,_a,_goukei) :- '/* 3科目の合計計算 */ goukei=(a[i].kokugo +a[i].eigo +a[i].suugaku); printf("%5d",goukei);'(_i,_a,_goukei). 'キャスト:3科目の平均計算'(_goukei,_heikin) :- '/* キャスト:3科目の平均計算 */ heikin=(double)goukei/3; printf("%6.1f\n",heikin);'(_goukei,_heikin). 各科目の合計計算(_n,_a,_goukie_k_1,_goukei_e_1,_goukei_s_1,_goukie_k,_goukei_e,_goukei_s) :- '/* 各科目の合計計算 */ for(i=0;i < n;i++){ goukei_k+=a[i].kokugo; goukei_e+=a[i].eigo; goukei_s+=a[i].suugaku; }'(_n,_a,_goukie_k_1,_goukei_e_1,_goukei_s_1,_goukie_k,_goukei_e,_goukei_s). 各科目の平均計算((_n,_goukei_k,_gouke_e,_goukei_s,_heikin_k_1,_heikin_e_1,_heikin_s_1,_heikin_k,_heikin_e,_heikin_s) :- '/* 各科目の平均計算 */ heikin_k=(double)goukei_k/n; heikin_e=(double)goukei_e/n; heikin_s=(double)goukei_s/n;'(_n,_goukei_k,_gouke_e,_goukei_s,_heikin_k_1,_heikin_e_1,_heikin_s_1,_heikin_k,_heikin_e,_heikin_s). 偏差の二乗和の計算(_n,_a,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s) :- '/* 偏差の二乗和の計算 */ for(i=0;i < n;i++){ std_k+=pow((a[i].kokugo-heikin_k),2); std_e+=pow((a[i].eigo-heikin_e),2); std_s+=pow((a[i].suugaku-heikin_s),2); }'(_n,_a,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s). 標準偏差の計算(_n,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s) :- '/* 標準偏差の計算 */ std_k=sqrt(std_k/n); std_e=sqrt(std_e/n); std_s=sqrt(std_s/n);'(_n,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'do{ /* 繰り返し処理do-while */ }while(k < 10);'(P) :- between(1,10,N), call(P), N = 10. '/* 初期メニュー画面 */ printf("\n"); printf("☆☆ 成績処理メニュー ☆☆\n"); printf(SEN); printf("データの書き込み・・・・・・・・・【1】\n"); printf("データの読み込み・・・・・・・・・【2】\n"); printf("成績一覧表・・・・・・・・・・・・【3】\n"); printf("検索処理・・・・・・・・・・・・・【4】\n"); printf("終わり・・・・・・・・・・・・・・【9】\n"); printf(SEN); printf("処理番号を入力してください:"); scanf("%d",&k); printf("\n");'(_k) :- write('\n'), writef('☆☆ 成績処理メニュー ☆☆\n'), write('%t',['--------------------\n']), write('データの書き込み・・・・・・・・・【1】\n'), write('データの読み込み・・・・・・・・・【2】\n'), write('成績一覧表・・・・・・・・・・・・【3】\n'), write('検索処理・・・・・・・・・・・・・【4】\n'), write('終わり・・・・・・・・・・・・・・【9】\n'), write('--------------------\n'), write('処理番号を入力してください:'), 整数を得る(_k), write('\n'). '/* 関数の呼び出し */ switch(k){ case 1:data_write();break; case 2:data_read();break; case 3:data_disp();break; case 4:data_kensk();break; case 9:the_end();break; default:printf("該当番号なし\n");break; }'(_k) :- '_kの値によって述語を呼び出す'(_k). '_kの値によって述語を呼び出す'(1) :- data_write. '_kの値によって述語を呼び出す'(2) :- data_read. '_kの値によって述語を呼び出す'(3) :- data_disp. '_kの値によって述語を呼び出す'(4) :- data_kensk. '_kの値によって述語を呼び出す'(9) :- the_end. '/* 3科目の合計計算 */ goukei=(a[i].kokugo +a[i].eigo +a[i].suugaku); printf("%5d",goukei);'(_i,_a,_goukei) :- nth0(_i,_a,[_kokugo,_eigo,_suugaku]), _goukei is _kokugo + _eigo + _suugaku, writef('%t',[_goukei]). '/* キャスト:3科目の平均計算 */ heikin=(double)goukei/3; printf("%6.1f\n",heikin);'(_goukei,_heikin) :- _heikin is _goukei / 3, format('~1f\n',[_heikin]). '/* 各科目の合計計算 */ for(i=0;i < n;i++){ goukei_k+=a[i].kokugo; goukei_e+=a[i].eigo; goukei_s+=a[i].suugaku; }'(_n,_a,_goukie_k_1,_goukei_e_1,_goukei_s_1,_goukie_k,_goukei_e,_goukei_s) :- 各科目の合計計算(0,_n,_a,_goukie_k_1,_goukei_e_1,_goukei_s_1,_goukie_k,_goukei_e,_goukei_s). 各科目の合計計算(_n_1,_n,_a,_goukie_k_1,_goukei_e_1,_goukei_s_1,_goukie_k,_goukei_e,_goukei_s) :- _n_1 < _n, nth1(_nth1,_a,[_kokugo,_eigo,_suugaku]), _goukei_k_2 is _goukei_k_1 + _kokugo, _goukei_e_2 is _goukei_e_1 + _eigo, _goukei_s_2 is _goukei_s_1 + _suugaku, _n_2 is _n_1 + 1, 各科目の合計計算(_n_2,_n,_a,_goukie_k_2,_goukei_e_2,_goukei_s_2,_goukie_k,_goukei_e,_goukei_s). 各科目の合計計算(_n_1,_n,_a,_goukie_k,_goukei_e,_goukei_s,_goukie_k,_goukei_e,_goukei_s) :- _n_1 >= _n. '/* 各科目の平均計算 */ heikin_k=(double)goukei_k/n; heikin_e=(double)goukei_e/n; heikin_s=(double)goukei_s/n;'(_n,_goukei_k,_gouke_e,_goukei_s,_heikin_k_1,_heikin_e_1,_heikin_s_1,_heikin_k,_heikin_e,_heikin_s) :- _heikin_k is _heikin_k_1 + _goukei_k / _n, _heikin_e is _heikin_e_1 + _goukei_e / _n, _heikin_s is _heikin_s_1 + _goukei_s / _n. '/* 偏差の二乗和の計算 */ for(i=0;i < n;i++){ std_k+=pow((a[i].kokugo-heikin_k),2); std_e+=pow((a[i].eigo-heikin_e),2); std_s+=pow((a[i].suugaku-heikin_s),2); }'(_n,_a,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s) :- 偏差の二乗和の計算(0,_n,_a,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s). 偏差の二乗和の計算(_i_1,_n,_a,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s) :- _i_1 < _n, 偏差の二乗を加える(_i_1,_n,_a,_std_k_1,_std_e_1,std_s_1,_std_k_2,_std_e_2,std_s_2), _i_2 is _i_1 + 1, 偏差の二乗和の計算(_i_2,_n,_a,_std_k_2,_std_e_2,_std_s_2,_std_k,_std_e,_std_s). 偏差の二乗和の計算(_i_1,_n,_a,_std_k,_std_e,_std_s,_std_k,_std_e,_std_s) :- _i_1 >= _n. 偏差の二乗を加える(_i_1,_a,_std_k_1,_std_e_1,std_s_1,_std_k_2,_std_e_2,std_s_2) :- nth1(_i_1,_a,[_kokugo_heikin_k,_eigo_heikin_e,_suugaku_heikin_s]), _std_k_2 is _std_k_1 + _kokugo_heikin_k ^ 2, _std_e_2 is _std_e_1 + _eigo_heikin_e ^ 2, _std_s_2 is _std_s_1 + _suugaku_heikin_s ^ 2. '/* 標準偏差の計算 */ std_k=sqrt(std_k/n); std_e=sqrt(std_e/n); std_s=sqrt(std_s/n);'(_n,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s) :- _std_k is sqrt(_std_k_1) / _n, _std_e is sqrt(_std_e_1) / _n, _std_s is sqrt(_std_s_1) / _n. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/33 # # [1] 授業単元: リスト処理 # [2] 問題文(含コード&) http://codepad.org/3DdhcBUM # # /* # # seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、リスト処理による挿入法で得点の降順に整列して表示しなさい。 # また、整列する際に要素どうしを比較した回数も表示しなさい。 # # 【実行例】 # # 番号 氏名      得点 # 1021 Machida Masato 100 # 1017 Nonaka Fujio 98 # 1011 Suzuki kenichi 93 # 1019 Fujimoto Kaoru 92 # 1006 kato Ichiro 91 # ・ ・     ・ # ・ ・     ・ # ・ ・     ・ # 1020 Hoshi Izumi 32 # 整列の為の比較回数=132回 # # ※長いので実行結果は途中省略しています。 # ※比較回数はコードによって異なる場合があります。 # # */ 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、リスト処理による挿入法で得点の降順に整列して表示しなさい。 また、整列する際に要素どうしを比較した回数も表示しなさい。' :- 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、'(_生徒ならび), リスト処理による挿入法で得点の降順に整列して(_生徒ならび,[],_整列済み生徒ならび,0,_比較回数), 表示しなさい(_整列済み生徒ならび,_比較回数). 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、'(_生徒ならび) :- get_split_lines('seito.dat',[' '],_生徒ならび). リスト処理による挿入法で得点の降順に整列して([[_学籍番号,_姓,_名,_得点]|R1],L1,_整列済み生徒ならび,_比較回数_1,_比較回数) :- 降順に挿入(_学籍番号,_姓,_名,_得点,L1,L2,_比較回数_1,_比較回数_2), リスト処理による挿入法で得点の降順に整列して(R1,L2,_整列済み生徒ならび,_比較回数_2,_比較回数),!. リスト処理による挿入法で得点の降順に整列して([],_整列済み生徒ならび,_整列済み生徒ならび,_比較回数,_比較回数). 降順に挿入(_学籍番号,_姓,_名,_得点,[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R],[[_学籍番号,_名,_名,_得点],[_学籍番号_1,_姓_1,_名_1,_得点_1]|R],_比較回数_1,_比較回数) :- 比較回数 is _比較回数_1 + 1, _得点 >= _得点_1,!. 降順に挿入(_学籍番号,_姓,_名,_得点,[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R1],[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R2],_比較回数_1,_比較回数) :- 降順に挿入(_学籍番号,_姓,_名,_得点,R1,R2,_比較回数_1,_比較回数). 降順に挿入(_学籍番号,_姓,_名,_得点,[],[[_学籍番号,_名,_名,_得点]],_比較回数,_比較回数) :- !. 表示しなさい(_整列済み生徒ならび,_比較回数) :- 見出しの表示, append(_,[[_学籍番号,_姓,_名,_得点]|R],_整列済み生徒ならび), 整形して表示する(_学籍番号,_姓,_名,_得点), R = [], writef('整列の為の比較回数=%t回\n',[_比較回数]). 見出しの表示 :- write('番号 氏名      得点\n'). 整形して表示する(_学籍番号,_姓,_名,_得点) :- 姓名をそれぞれ8桁に(_姓,_名,_姓文字列,_名文字列), 得点を頭部空白3桁に(_得点,_得点文字列), atomic_list_concat([_学籍番号,_姓文字列,_名文字列,_得点文字列],' ',_表示文字列), writef('%t\n',[_表示文字列]). 姓名をそれぞれ8桁に(_姓,_名,_姓文字列,_名文字列) :- '8桁に'(_姓,_姓文字列), '8桁に'(_名,_名文字列). '8桁に'(_項,_8桁文字列) :- atom_chars(_項,Chars_1), length(L,8), append(L1,L2,L), all(L2,' '), atom_chars(_8桁文字列,L). 得点を頭部空白3桁に(_得点,_得点文字列) :- number_chars(_得点,Chars), length(L,3), append(L0,Chars,L), all(L0,' '), atom_chars(_得点文字列,L). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_split_lines(File,Sep,Lines) :- get_lines(File,Lines1), findall(Line,( member(A,Lines1), split(A,Sep,Line)), Lines). get_lines(Instream,end_of_file,_,_,[]) :-!. get_lines(Instream,S,[],_終了検索対象ならび,[S]) :- member(A,_終了検索対象ならび), 検索(S,A),!. get_lines(Instream,S,[],[],[S|R]) :- get_line(Instream,S2), get_lines(Instream,S2,[],[],R),!. get_lines(Instream,S,[],_終了検索対象ならび,[S|R]) :- member(A,_終了検索対象ならび), \+(検索(S,A)), get_line(Instream,S2), get_lines(Instream,S2,[],_終了検索対象ならび,R),!. get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,[S]) :- \+(_開始検索対象ならび = []), member(A,_開始検索対象ならび), 検索(S,A), member(B,_終了検索対象ならび), 検索(S,B),!. get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,[S|R]) :- \+(_開始検索対象ならび = []), member(A,_開始検索対象ならび), 検索(S,A), !, get_line(Instream,S2), get_lines(Instream,S2,[],_終了検索対象ならび,R),!. get_lines(Instream,_,_開始検索対象ならび,_終了検索対象ならび,X) :- get_line(Instream,S2), get_lines(Instream,S2,_開始検索対象ならび,_終了検索対象ならび,X),!. get_lines(_ファイル,_スタート行,_最終行,X) :- integer(_スタート行), integer(_最終行), 行位置指定選択(_ファイル,_スタート行,_最終行,X). get_lines(_ファイル,_開始検索対象ならび,_終了検索対象ならび,X) :- \+(integer(_開始検索対象ならび)), \+(integer(_終了検索対象ならび)), open(_ファイル,read,Instream), get_line(Instream,S), get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,X), close(Instream),!. get_lines(File,Lines) :- get_chars(File,L), chars_lines(L,Lines),!. get_lines(Lines) :- findall(Line,( repeat, get_line(user_input,Line), (Line = end_of_file , (!) , fail ; true)), Lines). get_line(Instream,X) :- get_char(Instream,C), get_line_3(Instream,C,Chars), atom_chars(X,Chars),!. get_chars(Instream,end_of_file,[]) :- !. get_chars(Instream,_,[]) :- at_end_of_stream(Instream),!. get_chars(Instream,X,[X|R]) :- get_char(Instream,Y), get_chars(Instream,Y,R) . get_chars(File,L) :- \+(is_stream(_,File,_)), slush_op(File,File_1), exists_file(File_1), open(File_1,read,Instream), get_char(Instream,X), get_chars(Instream,X,L), close(Instream),!. get_chars(Instream,L) :- is_stream(_,Instream,_), get_char(Instream,X), get_chars(Instream,X,L),!. get_chars(L) :- findall(U,( repeat, get_char(U), (U = end_of_file , (!) , fail ; true)), L). get_line(X) :- get_line(user_input,X). get_line_3(_,'\n',[]) :- !. get_line_3(Instream,_,[]) :- at_end_of_stream(Instream),!. get_line_3(Instream,end_of_file,[]) :- !. get_line_3(Instream,C,[C|R]) :- get_char(Instream,C2), get_line_3(Instream,C2,R). chars_lines([],[],[]) :- !. chars_lines(['\r'],[],[]) :- !. chars_lines(['\r',A|R],[],[A|R]) :- \+(A = '\n'),!. chars_lines(['\r','\n'|R],[],R) :- !. chars_lines(['\n'|R],[],R) :- !. chars_lines([A|R1],[A|R2],Z) :- chars_lines(R1,R2,Z). chars_lines([],[]) :- !. chars_lines(L,[A|R2]) :- chars_lines(L,U,R), atomic_list_concat(U,A), chars_lines(R,R2). split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,Y), findall(U,( member(U,Y), \+(U = '')), L), L = X,!. sPlit(_文字列,_区切り符号ならび,X) :- atom_chars(_文字列,L), split_00(L,_区切り符号ならび,Y), findall(U,( member(U,Y) , \+(member(U,_区切り符号ならび))), Z), Z = X,!. split_00(_文字ならび,_区切り符号ならび,X) :- findall([B,A],( member(A,_区切り符号ならび) , atom_chars(A,B)), _区切り符号ならびの二), split_0(_文字ならび,_区切り符号ならびの二,X). split_0(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_0(_文字ならび,_区切り符号ならび,['',_区切り符号|R2]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_1(R,_区切り符号ならび,R2),!. split_0(L,_区切り符号ならび,X) :- split_1(L,_区切り符号ならび,X). split_1([],_,[]) :- !. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号_1,C,_区切り符号_2|X]) :- member([_区切り文字ならび,_区切り符号_1],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_2(R,R2,_区切り符号_2,_区切り符号ならび,B), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), _区切り符号 = '', split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C,_区切り符号|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), \+(_区切り符号 = ''), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_2([],[],'',_,[]) :- !. split_2(_文字ならび,R,_区切り符号,_区切り符号ならび,[]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび),!. split_2([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_3([''''|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_32(['"'|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2([_文字|R],R2,_区切り符号,_区切り符号ならび,[_文字|X]) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3([_|R],R2,_区切り符号,_区切り符号ならび,X) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([],[],'',_,[]) :- !. split_4([_文字|R],R2,_区切り符号ならび,[_文字|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_5([],'') :- !. split_5(B,C) :- numeric_list(B,Nl), C number Nl,!. split_5(B,C) :- atomic_list_concat(B,C),!. all([],_). all([V|R],V) :- all(R,V). 検索(_文字列,_副文字列) :- atom_length(_文字列,_文字列の文字数), atom_length(_副文字列,_副文字列の文字数), Max is _文字列の文字数 - _副文字列の文字数, between(0,Max,N), sub_atom(_文字列,N,_副文字列の文字数,_副文字列),!. 行位置指定選択(_ファイル,_選択先頭行,_選択最終行,X) :- wc(_ファイル,[[_行,_,_,_]]), _行数_1 is _行 - _選択先頭行 + 1, _行数_2 is _選択最終行 - _選択先頭行, atomic_list_concat(['tail -',_行数_1,' ',_ファイル,' | head -',_行数_2],S), shs(S,X). wc(F,X) :- exists_file(F1), atomic_list_concat(['wc ',F1],S), sh(S,X),!. wc(F,X) :- atomic_list_concat([F,' | wc'],S), sh(S,X),!. sh(Command,X) :- shs(Command,Y), findall(U,(member(V,Y) , make_list(V,[' ',','],U)),X). shs(Command,X) :- popen(Command,L), shs_3(L,X). shs_3(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_3(R1,R). shs_3([],[]) :- !. shs_3(L,[S]) :- atom_chars(S,L). system(Command,X) :- shell(Command,X). system(Command) :- shell(Command). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,_,[]) :- at_end_of_stream(Instream),!. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/611 # # [1] 授業単元: C言語プログラミング # [2] 問題文(含コード&リンク):となりどおしの数字の差がその下の数字となるように、 # 1から15までの数を1回だけ使って例に従ってマスにいれなさい。 # :- dynamic(重複が存在しない減算表/4). 重複が存在しない減算表の定義(_重複しない数ならび) :- 重複が存在しない減算表候補の選定(_重複しない数ならび,A,B,C), assertz((重複が存在しない減算表(L,A,B,C) :- 'A,B,Cは高々一個'(L,A,B,C))), fail. 重複が存在しない減算表の定義(_). 重複が存在しない減算表候補の選定(_重複しない数ならび,A,B,C) :- 最大値(_重複しない数ならび,_最大値), member(A,_重複しない数ならび), member(B,_重複しない数ならび), C is abs(A - B), 'A,B,Cは一意であり、Cは最大値より小さい'(_最大値,A,B,C). 最大値(L,_最大値) :- max(L,_最大値). 'A,B,Cは一意であり、Cは最大値より小さい'(_最大値,A,B,C) :- \+(A=B), C < _最大値, \+(C=B), \+(C=A). '定義::数を一回だけ使ってマスに入れる'(LL) :- flatten(LL,L), '条件生成::数を一回だけ使ってマスに入れる'(L,LL,Q), assertz(('数を一回だけ使ってマスに入れる'(L) :- Q)). '条件生成::数を一回だけ使ってマスに入れる'(L,[[_上左,_上右,_下]],重複が存在しない減算表(L,_上左,_上右,_下)) :- !. '条件生成::数を一回だけ使ってマスに入れる'(L,[[_上左,_上右,_下]|R],(重複が存在しない減算表(L,_上左,_上右,_下),P)) :- '条件生成::数を一回だけ使ってマスに入れる'(L,R,P). 'A,B,Cは高々一個'(L,A,B,C) :- '2個以上存在する'(A,0,L),!,fail. 'A,B,Cは高々一個'(L,A,B,C) :- '2個以上存在する'(B,0,L),!,fail. 'A,B,Cは高々一個'(L,A,B,C) :- '2個以上存在する'(C,0,L),!,fail. 'A,B,Cは高々一個'(L,A,B,C). '2個以上存在する'(_,N,_) :- N > 1,!. '2個以上存在する'(_,_,[]) :- !,fail. '2個以上存在する'(C,N,[V|R]) :- var(V), '2個以上存在する'(C,N,R),!. '2個以上存在する'(C,N,[V|R]) :- \+(var(V)), C = V, N_2 is N + 1, '2個以上存在する'(C,N_2,R),!. '2個以上存在する'(C,N,[V|R]) :- \+(var(V)), \+(C=V), '2個以上存在する'(C,N,R). ?- 重複が存在しない減算表の定義([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]). ?- 数を一回だけ使ってマスに入れる'([[_1_1,_1_2,_2_1],[_1_2,_1_3,_2_2],[_1_3,1_4,_2_3],[_1_4,_1_5,_2_4],[_2_1,_2_2,_3_1],[_2_2,_2_3,_3_2],[_2_3,_2_4,_3_3],[_3_1,_3_2,_4_1],[_3_2,_3_3,_4_2],[_4_1,_4_2,_5_1]]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1355011916/ # # やろうとしていることは、可変長の二次元配列ではなくて # 可変長の配列の可変長の配列だろ。 # つまり、要素数が例えば2x100とかではなく100+50+30+200のような。 # C++で言うところのstd::vector >でほぼできることだけど、Cだと # 別途管理配列を要素する必要があるね。 'n個の可変要素のリストを生成する'(_n,LL) :- findall(L,( between(1,_n,L)), LL). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/119 # # [1]C言語 # [2]http://ime.nu/www.dotup.org/uploda/www.dotup.org3700396.jpg # 探索木についての課題です # 問題1. データ 6,4,3,8,5,9,7 がこの順に与えられたとき、これを2分探索木として表しなさい。 # # 問題2. 前問をプログラムとして、表示しなさい。表示する関数は再帰的に書きなさい。 # 左の子(部分木) を print,node を print, 右の子 (部分木) を print のように表示することをDFS 中間順と言います。 # # 問題3. 標準入力から文字を入力させ、その文字によって2分探索木に対して以下の動作をするプログラムを作成せよ。 # s ---> 数を1つ標準入力から入力されてデータが存在するか表示 # i ---> 数を1つ標準入力から入力させて2分探索木に追加 # p ---> 今まで入力された数をすべて表示 (DFS中間順で) # q ---> quit # # 問題4. 0から9999の整数の乱数を10000個生成して、2分探索木を作り、データの # 総数、木の深さの最大値、データの最小値と最大値を求めるプログラムを作成し # て確認せよ。 # # [3]ubuntu # gcc # c言語 # [4]期限:木曜日6:00 # 宜しくお願いします。 # :- dynamic([木/3,根/1,二分探索木ラベル/2]). 二分探索木ラベルの生成(_値ならび,_ラベルならび) :- findall(_ラベル,( member(_値,_値ならび), 二分探索木ラベルの候補(_ラベル), assertz(二分探索木ラベル(_ラベル,_値))), _ラベルならび). 二分探索木ラベルの候補(_ラベル) :- N is random(900000) + 100000, atomic_list_concat(['L',N],_ラベル), \+(二分探索木ラベル(_ラベル,_)),!. 二分探索木ラベルの候補(_ラベル) :- 二分探索木ラベルの候補(_ラベル). 根を作る(_値,_ラベル) :- asserta((根(_ラベル) :- !)), 木を作る(_値,_ラベル). 木を作る(_値,_ラベル) :- 二分探索木ラベル(_ラベル,_値), asserta(木([],_ラベル,[])). 木に追加(_根のラベル,_値のラベル) :- 二分探索木ラベル(_根のラベル,_根の値), 二分探索木ラベル(_値のラベル,_値), 木に追加(_根のラベル,_値のラベル,_根の値,_値). 木に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @< _根の値, retract(木([],_根のラベル,_右枝)), 木を作る(_値のラベル), asserta(木(_値のラベル,_根のラベル,_右枝)),!. 木に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @< _根の値, 木(_左枝,_根,_右枝), 木に追加(_左枝,_値). 木に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @>= _根の値, retract(木(_左枝,_根,[])), 木を作る(_値のラベル), asserta(木(_左枝,_根のラベル,_値のラベル)),!. 木に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @>= _根の値, 木(_左枝,_根のラベル,_右枝), 木に追加(_右枝,_値のラベル). 'データ 6,4,3,8,5,9,7 がこの順に与えられたとき、これを2分探索木として表しなさい。' :- 二分探索木ラベルの生成([6,4,3,8,5,9,7],[_根のラベル|_ラベルならび]), 根を作る(_先頭のラベル), append(_,[N|R],_ラベルならび), 木に追加(_根のラベル,N), R = []. 二分探索木全体を表示する :- 根(_根のラベル), 木を表示する(_根のラベル). 木を表示する([]) :- !. 木を表示する(_木の根のラベル) :- 木(_左枝,_木の根のラベル,_右枝), 木を表示する(_左枝,_木の根のラベル,_右枝). 木を表示する(_左の枝,_木の根,_右の枝) :- 二分木探索ラベル(_木の根ラベル,_木の根の値), 木を表示する(_左枝), writef('%t ',[_木の根の値]), 木を表示する(_右枝). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/119 # # [1]C言語 # [2]http://ime.nu/www.dotup.org/uploda/www.dotup.org3700396.jpg # 探索木についての課題です # 問題1. データ 6,4,3,8,5,9,7 がこの順に与えられたとき、これを2分探索木として表しなさい。 # # 問題2. 前問をプログラムとして、表示しなさい。表示する関数は再帰的に書きなさい。 # 左の子(部分木) を print,node を print, 右の子 (部分木) を print のように表示することをDFS 中間順と言います。 # # 問題3. 標準入力から文字を入力させ、その文字によって2分探索木に対して以下の動作をするプログラムを作成せよ。 # s ---> 数を1つ標準入力から入力されてデータが存在するか表示 # i ---> 数を1つ標準入力から入力させて2分探索木に追加 # p ---> 今まで入力された数をすべて表示 (DFS中間順で) # q ---> quit # # 問題4. 0から9999の整数の乱数を10000個生成して、2分探索木を作り、データの # 総数、木の深さの最大値、データの最小値と最大値を求めるプログラムを作成し # て確認せよ。 # # [3]ubuntu # gcc # c言語 # [4]期限:木曜日6:00 # 宜しくお願いします。 # 二分探索木ラベルの生成(_値ならび) :- nth1(_nth1,_値ならび,_値), atomic_list_concat(['L','_',_nth1],_ラベル), assertz(二分探索木ラベル(_ラベル,_値)), fail. 二分探索木ラベルの生成(_). 根を作る(_値,_ラベル) :- 二分探索木ラベル(_ラベル,_値), asserta(根(_ラベル,[],[])). 枝を作る(_値,_ラベル) :- 二分探索木ラベル(_ラベル,_値), asserta(枝(_ラベル,[],[])). 枝に追加(_根のラベル,_値) :- 二分探索木ラベル(_根のラベル,_根の値), 二分探索木ラベル(_値のラベル,_値), 枝に追加(_根のラベル,_値のラベル,_根の値,_値). 枝に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @< _根の値, retract(枝(_根のラベル,[],_右枝)), 枝を作る(_値), asserta(根(_根のラベル,_値のラベル,_右枝)),!. 枝に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @< _根の値, 枝(_根,_左枝,_右枝), 枝に追加(_左枝,_値). 枝に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @>= _根の値, retract(枝(_根,_左枝,[])), 枝を作る(_値), asserta(根(_根のラベル,_左枝,_値のラベル)),!. 枝に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @>= _根の値, 枝(_根のラベル,_左枝,_右枝), 枝に追加(_右枝,_値). 'データ 6,4,3,8,5,9,7 がこの順に与えられたとき、これを2分探索木として表しなさい。' :- 二分探索木ラベルの生成([6,4,3,8,5,9,7]), 根を作る(6,_根のラベル), append(_,[N|R],[4,3,8,5,9,7]), 枝に追加(_根のラベル,N), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/271 # # Oracle11gR2で # # ID  Count # 1 3 # 2 2 # 3 3 # # こういうデータを元に # # Seq ID # 1 1 # 2 1 # 3 1 # 4 2 # 5 2 # 6 3 # 7 3 # 8 3 # # こんな感じのCount(*)の逆を作りたいけど、PL/SQL使わずに作るには、どうしたらいい? # Seqはなくてもいい # 'ID  Count 1 3 2 2 3 3 こういうデータを元に Seq ID 1 1 2 1 3 1 4 2 5 2 6 3 7 3 8 3 こんな感じのCount(*)の逆を作りたいけど、PL/SQL使わずに作るには、どうしたらいい?'(_テーブル名,_Seq,_ID) :- 実行項の生成(_テーブル名,_ID,_実行項), 'IDごとのカウントを取る'(_ID,_実行項,_ID_頻度ならび), sort(_ID_頻度ならび,_整列した_ID_頻度ならび), 'Seq組を生成'(1,_整列した_ID_頻度ならび,_Seq,_ID). 実行項の生成(_テーブル名,_ID,_実行項) :- findmax(Nth1,テーブル定義(_テーブル名,Nth1,_),_組の要素数), length(L,_組の要素数), _実行項 =.. [_テーブル名|L], テーブル定義(_テーブル名,_IDの位置,'ID'), nth1(_IDの位置,L,_ID). 'IDごとのカウントを取る'(_ID,_実行項,_ID_頻度ならび) :- findsetof(_ID,( _実行項), _IDならび), findall([_ID,_頻度],( member(_ID,_IDならび), count(_実行項,_頻度ならび)), _ID_頻度ならび). 'Seq組を生成'(N_1,[[_ID,_頻度]|R],_Seq,_ID) :- N_2 is N_1 + _頻度 - 1, between(N_1,N_2,_Seq). 'Seq組を生成'(N_1,[[_ID,_頻度]|R],_Seq,_ID) :- N_2 is N_1 + _頻度, 'Seq組を生成'(N_2,R,_Seq,_ID). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/867 # # [1] プログラミング基礎 # [2] 5人の学生の学生番号、身長、体重を入力し # 平均身長ave_heigh、平均体重ave_weightを求める。 # ただし、学生番号、身長、身長の平均からの差、体重、体重の平均からの差は 2次元配列data[5][5]に格納するようにすること。 # # 学生番号、身長、体重の各々をkeyにして昇順、降順のどちらでもソートできるようにせよ。 # ただし、ソート処理は関数化しソートアルゴリズムには選択ソート、バブルソート、クイックソートの何れかを選択可能とすること。 # '5人の学生の学生番号、身長、体重を入力し、 平均身長、平均体重を求める。 学生番号、身長、身長の平均からの差、体重、体重の平均からの差を組とするならびに格納する'(_ならび) :- '5人の学生の学生番号、身長、体重を入力し'(_5人の学生の学生番号_身長_体重), '5人の学生番号、身長、身長の平均からの差、体重、体重を組とするならびに格納する'(_5人の学生の学生番号_身長_体重,_ならび). '5人の学生の学生番号、身長、体重を入力し'(_5人の学生の学生番号_身長_体重) :- findall([_学生番号,_身長,_体重],( between(1,5,_), 整数を得る(学生番号,_学生番号 > 0,_学生番号), 数を得る(身長,_身長 > 0,_身長), 数を得る(体重,_体重 > 0,_体重)), _5人の学生の学生番号_身長_体重). '5人の学生番号、身長、身長の平均からの差、体重、体重を組とするならびに格納する'(_5人の学生の学生番号_身長_体重,_ならび) :- '5人の学生番号、身長、身長の平均からの差、体重、体重を組とするならびに格納する'(_5人の学生の学生番号_身長_体重,0,0,_身長の平均,_体重の平均,_ならび). '5人の学生番号、身長、身長の平均からの差、体重、体重を組とするならびに格納する'([],_身長の合計,_体重の合計,_身長の平均,_体重の平均,[]) :- '5人の身長、体重の平均を算出する'(_身長合計,_体重合計,_身長の平均,_体重の平均). '5人の学生番号、身長、身長の平均からの差、体重、体重を組とするならびに格納する'([[_学生番号,_身長,_体重]|R1],_身長合計_1,_体重合計_1,_身長の平均,_体重の平均,[[_学生番号,_身長,_身長の平均からの差,_体重,_体重の平均からの差]|R2]) :- '身長合計、体重合計に加算する'(_身長,_体重,_身長合計_1,_体重合計_1,_身長合計_2,_体重合計_2), '5人の学生番号、身長、身長の平均からの差、体重、体重を組とするならびに格納する'(R1,_身長合計_2,_体重合計_2,_身長の平均,_体重の平均,R2), '身長の平均からの差、体重の平均からの差を求める'(_身長,_体重,_身長の平均,_体重の平均,_身長の平均からの差,_体重の平均からの差). '5人の身長、体重の平均を算出する'(_身長合計,_体重合計,_身長の平均,_体重の平均) :- _身長の平均 is _身長の合計 / 5, _体重の平均 is _体重の合計 / 5. '身長合計、体重合計に加算する'(_身長,_体重,_身長合計_1,_体重合計_1,_身長合計_2,_体重合計_2) :- _身長合計_2 is _身長合計_1 + _身長, _体重合計_2 is _体重合計_1 + _体重. '身長の平均からの差、体重の平均からの差を求める'(_身長,_体重,_身長の平均,_体重の平均,_身長の平均からの差,_体重の平均からの差) :- _身長の平均からの差 is _身長 - _身長の平均, _体重の平均からの差 is _体重 - _体重の平均. % 以下のサイトは # # 連番のエロ画像をダウンロードするスクリプトください # # # %%% バッチファイル anonymouget %%% # anonymousget2 $2 $3 | ftp -n $1 # # %%% バッチファイル anonymousget2 %%% # echo user anonymous ***** # echo binary # echo get $1 $2 | plustosp # echo close # echo quit # # %%% plustosp.c %%% # #include # main() { # unsigned int c0,n; # n=0; # while((c0=getchar()) != EOF) { # if(c0=='+') # putchar(32); # else # putchar(c0); # } # } 連番のエロ画像をダウンロードする(_ftpサイト名,_ファイル名,_サフィックス,_連番桁数,_連番起点,_連番終点) :- 連番ファイルをダウンロードする(_ftpサイト名,_ファイル名,_サフィックス,_連番桁数,_連番起点,_連番終点). 連番ファイルをダウンロードする(_ftpサイト名,_ファイル名,_サフィックス,_連番桁数,_連番起点,_連番終点) :- anonymousgetの準備, ダウンロード対象ファイルを得る(_ftpサイト名,_ファイル名,_サフィックス,_連番桁数,_連番起点,_連番終点,_連番,_ファイル名_2), anonymousget(_ftpサイト名,_ファイル名_2,_ファイル名_2), _連番終点 = _連番. ダウンロード対象ファイルを得る(_ftpサイト名,_ファイル名,_サフィックス,_連番桁数,_連番起点,_連番終点,_連番,_ファイル名_2) :- between(_連番起点,_連番終点,_連番), 整数から文字列(_連番桁数,_連番,_連番文字列), atomic_list_concat([_ファイル名,_連番文字列,'.',_サフィックス],_ファイル名_2). anonymousgetの準備 :- バッチファイルanonymousgetの生成, コマンドデータanonymousget2の生成, 実行プログラムplustospの生成. バッチファイルanonymousgetの生成 :- open(anonymousget,write,Outstream), write(Outstream,'anonymousget2 $2 $3 | ftp -n $1\n'), close(Outstream), shell('chmod 777 anonymousget'),!. コマンドデータanonymousget2の生成 :- open(anonymousget2,write,Outstream), write(Outstream,'echo user anonymous *****\necho binary\necho get $1 $2 | plustosp\necho close\necho quit\n'), close(Outstream). 実行プログラムplustospの生成 :- open('plustosp.c',write,Outstream), write(Outstream,'#include \nmain() {\n unsigned int c0,n;\n n=0;\n while((c0=getchar()) != EOF) {\n if(c0==\'+\')\n putchar(32);\n else\n putchar(c0);\n }\n}\n'), close(Outstream), shell('cc -o plustosp plustosp.c';chmod 777 plustosp),!. anonymousget(_ftpサイト名,_入力ファイル名,_出力ファイル名) :- atomic_list_concat(['anonymousget ',_ftpサイト名,' "',_入力ファイル名,'" "',_出力ファイル名,'"'],S), shell(S),!. 整数から文字列(_文字桁,_整数,_数値文字列) :- length(L,_文字桁), number_chars(_整数,Chars), append(L0,Chars,L), all(L0,'0'). all([],_). all([A|R],A) :- all(R,A). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/437 # # 【 形態 】Javaアプリケーション # 【 期限 】一週間後まで # 【 Ver  】java version "1.7.0_03" # 【 課題 】2次元配列、1次元配列を使って科目得点表を表示するプログラムを作成する。 #       平均点に関しては、プログラム内で求めて表示する。また、配列の要素は必要な個数分だけにする。 #        #           国語  数学  英語  社会  理科  平均 #       青木   50   90   76           72 #       木村   80   46   84   67       69 #       山田   30   69   72   89   56   63 # #       科目名、生徒はStringクラスの1次元配列、点数はint型の2次元配列で初期化。 # # 【 補足 】点数、平均点の表示は何とか出来たのですが、表にしようとすると、青木の社会、理科、木村の理科の部分が足りず、ArrayIndexOutOfBoundsExceptionが発生してしまいます。 # '2次元配列、1次元配列を使って科目得点表を表示するプログラムを作成する。 平均点に関しては、プログラム内で求めて表示する。また、配列の要素は必要な個数分だけにする。                  国語  数学  英語  社会  理科  平均       青木   50   90   76           72       木村   80   46   84   67       69       山田   30   69   72   89   56   63 科目名、生徒はStringクラスの1次元配列、点数はint型の2次元配列で初期化。' :- 科目名ならび(_科目名ならび), 生徒ならび(_生徒ならび), 得点ならび(_得点ならび), 科目得点表を表示する(_得点ならび,_生徒ならび,_得点ならぴ). 科目名ならび([国語,数学,英語,社会,理科]). 生徒ならび([青木,木村,山田]). 得点ならび([[50,90,76,[],[],72],[80,46,84,67,[],69],[30,69,72,89,56,63]]). 科目得点表を表示する(_科目ならび,_生徒ならび,_得点ならぴ) :- 科目見出し(_科目ならび), 行表示(_生徒ならび,_得点ならび). 科目見出し(_科目ならび) :- write(' '), append(_,[A|R],_科目ならび), 幅は8桁で表示(A), R = [], write('\n'). 行表示([],[]). 行表示([_生徒|R1],[_得点ならび|R2]) :- writef(' %t',[_生徒]), 得点列を表示する(_得点ならび), 行表示(R1,R2). 得点列を表示する(_得点ならび) :- append(_,[N|R],_得点ならび), 幅は8桁で表示(N), R = [], write('\n'). 幅は8桁で表示(A) :- atom(A), 文字列の末尾を空白で埋める(A,S), writef('%t',[S]). 幅は8桁で表示(N) :- integer(N), 整数の頭部を空白で埋める(N,S), writef('%t',[S]). 文字列の末尾を空白で埋める(A,S) :- length(L,8), atom_chars(A,L1), append(L1,L2,L), all(L2,' '), atom_chars(S,L2). 整数の頭部を空白で埋める(A,S) :- length(L,8), number_chars(A,L2), append(L1,L2,L), all(L1,' '), atom_chars(S,L2). % 以下のサイトは # # 値の決まらない6×6ビンゴの表を作成する # %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '値の決まらない6×6ビンゴの表を作成する'(_ビンゴの表) :- findall(_6要素の変数リスト,( between(1,6,_), length(_6要素の変数リスト,6)), _ビンゴの表). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '値の決まらない6×6ビンゴの表を作成する'(_ビンゴの表) :- length(_ビンゴの表,6), '値の決まらない6×6ビンゴの表'(_ビンゴの表). '値の決まらない6×6ビンゴの表'([]). '値の決まらない6×6ビンゴの表'([_6要素の変数リスト|R]) :- length(_6要素の変数リスト,6), '値の決まらない6×6ビンゴの表'(R). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '値の決まらない6×6ビンゴの表を作成する'(_ビンゴの表) :- '値の決まらない6×6ビンゴの表を作成する'(6,_ビンゴの表). '値の決まらない6×6ビンゴの表を作成する'(0,[]) :- !. '値の決まらない6×6ビンゴの表を作成する'(N,[_6要素の変数リスト|R]) :- length(_6要素の変数リスト,6), N_1 is N - 1, '値の決まらない6×6ビンゴの表を作成する'(N_1,R). %%%%%%%%%%%%%%%% length/2 を使用しないと %%%%%%%%%%%%%%%%%%%%% '値の決まらない6×6ビンゴの表を作成する'(_ビンゴの表) :- '値の決まらない6×6ビンゴの表を作成する'(6,_ビンゴの表). '値の決まらない6×6ビンゴの表を作成する'(0,[]) :- !. '値の決まらない6×6ビンゴの表を作成する'(N,[_6要素の変数リスト|R]) :- '6要素の変数リストを生成する'(6,_6要素の変数リスト), N_1 is N - 1, '値の決まらない6×6ビンゴの表を作成する'(N_1,R). '6要素の変数リストを生成する'(0,[]). '6要素の変数リストを生成する'(N,[_|R]) :- N_1 is N - 1, '6要素の変数リストを生成する'(N_1,[_|R]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 以下のサイトは # # 値の決まらない6×6ビンゴの表を作成する # %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '値の決まらない6×6ビンゴの表を作成する'(_ビンゴの表) :- findall(_6要素の変数リスト,( between(1,6,_), length(_6要素の変数リスト,6)), _ビンゴの表). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '値の決まらない6×6ビンゴの表を作成する'(_ビンゴの表) :- length(_ビンゴの表,6), '値の決まらない6×6ビンゴの表'(_ビンゴの表). '値の決まらない6×6ビンゴの表'([]). '値の決まらない6×6ビンゴの表'([_6要素の変数リスト|R]) :- length(_6要素の変数リスト,6), '値の決まらない6×6ビンゴの表'(R). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '値の決まらない6×6ビンゴの表を作成する'(_ビンゴの表) :- '値の決まらない6×6ビンゴの表を作成する'(6,_ビンゴの表). '値の決まらない6×6ビンゴの表を作成する'(0,[]) :- !. '値の決まらない6×6ビンゴの表を作成する'(N,[_6要素の変数リスト|R]) :- length(_6要素の変数リスト,6), N_1 is N - 1, '値の決まらない6×6ビンゴの表を作成する'(N_1,R). %%%%%%%%%%%%%%%% length/2 を使用しないと %%%%%%%%%%%%%%%%%%%%% '値の決まらない6×6ビンゴの表を作成する'(_ビンゴの表) :- '値の決まらない6×6ビンゴの表を作成する'(6,_ビンゴの表). '値の決まらない6×6ビンゴの表を作成する'(0,[]) :- !. '値の決まらない6×6ビンゴの表を作成する'(N,[_6要素の変数リスト|R]) :- '6要素の変数リストを生成する'(6,_6要素の変数リスト), N_1 is N - 1, '値の決まらない6×6ビンゴの表を作成する'(N_1,R). '6要素の変数リストを生成する'(0,[]). '6要素の変数リストを生成する'(N,[_|R]) :- N_1 is N - 1, '6要素の変数リストを生成する'(N_1,[_|R]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 以下のサイトは # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク):() # # アルファベット小文字からなる文字列 s が与えられる. # s から何文字か削除して回文(左から読んでも右から読んでも同じ)にしたい. # 最小何文字削除すれば回文となるか計算するプログラムを作れ. # なお,s の文字数は 100000 以下としてよい. # # 例: # s = ababba → 1 (右から 2 番目の b を消して ababa) # s = abcdef → 5 (1 文字残して残りを削除する) # # # [3] 環境 #  [3.1,2] OS,コンパイラ: 問わず #  [3.3] 言語: どちらでも可 # [4] 期限: 2008/06/08 # [5] その他の制限: 特に無し 'アルファベット小文字からなる文字列 s が与えられる.s から何文字か削除して回文(左から読んでも右から読んでも同じ)にしたい.最小何文字削除すれば回文となるか計算するプログラムを作れ.なお,s の文字数は 100000 以下としてよい.' :- 'アルファベット小文字からなる文字列 s が与えられる'(_s), 's から何文字か削除して回文(左から読んでも右から読んでも同じ)にしたい.最小何文字削除すれば回文となるか計算するプログラムを作れ.なお,s の文字数は 100000 以下としてよい.'(_s,_最小何文字の削除で済む), writef('最小 %t 文字の削除で回文は出来上がります\n',[_最小何文字の削除で済む]),!. 's から何文字か削除して回文(左から読んでも右から読んでも同じ)にしたい.最小何文字削除すれば回文となるか計算するプログラムを作れ.なお,s の文字数は 100000 以下としてよい.'(_s,_最小何文字の削除で済む) :- sの文字ならびと反転した文字ならびを用意する(_s,Chars_1,Chars_2), atom_length(_s,_文字列数), findmax(_回文の文字数,( 回文を生成(Chars_1,Chars_2,0,_回文の文字数)), _回文は最大何文字), _最小何文字の削除で済む is _文字列数 - _回文は最大何文字. sの文字ならびと反転した文字ならびを用意する(_s,Chars_1,Chars_2) :- atom_chars(_s,Chars_1), reverse(Chars_1,Chars_2). 回文を生成([],_,N,N). 回文を生成([A|R1],[A|R2],N_1,N) :- N_2 is N_1 + 1, 回文を生成(R1,R2,N_2,N). 回文を生成(L1,[B|R2],N_1,N) :- 回文を生成(L1,R2,N_1,N). 回文を生成([_|R1],L2,N_1,N) :- 回文を生成(R1,L2,N_1,N). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/412 # # [1] 授業単元:C言語 for文 # [2] 問題文(含コード&リンク): # +#+#+#+#+* # +#+#+#+*-* # +#+#+*-*-* # +#+*-*-*-* # +*-*-*-*-*  # この模様を二重ループを使って作成せよ # '+#+#+#+#+* +#+#+#+*-* +#+#+*-*-* +#+*-*-*-* +*-*-*-*-*  この模様を作成する'(_模様を表すならび) :- findall(S,( append(L1,L2,[_,_,_,_]), 中の模様を生成(L1,L2,S)), _模様を表すならび). 中の模様を生成(L1,L2,S) :- all(L1,'#+'), all(L2,'*-'), atomic_list_concat(L1,S1), atomic_list_concat(L2,S2), atomic_list_concat([+,S1,S2,*],S). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/409 # # [1] 授業単元:C言語 アルゴリズム # [2] 問題文(含コード&リンク):モンテカルロ法 # http://ime.nu/codepad.org/6m1GPoV0 # # /* # 問題1. サイコロを10,100,1000,10000,100000 回投げて分布を調べよ。 # # 問題2. コイン投げも同様にして、Sn = X1 + ・・・ + Xn のSn, # そのmax、min を調べよ。 # # 問題3.   # 面積 # 1 # ∫ x^2dx をモンテカルロ法で求めよ # 0 # # 問題4. πの値をモンテカルロ法で求めよ。 # 問題5. 2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。 # */ # '2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。' :- findall(Count,( between(1,100,N), count((between(1,100,M), U is random(1000), U < 400), Count)), L), 分布を表示する(L). 分布を表示する(L) :- between(0,100,N), 表示文字列を生成(N,L,_表示文字列), writef('%t: %t\n',[_カウント表示文字列]), N = 100. 表示文字列を生成(N,L,_表示文字列) :- 整数から文字列(2,Count,_カウント表示文字列), findall((*),( member(N,L)), L), atomic_list_concat([_カウント表示文字列,': '|L],_表示文字列). 整数から文字列(_文字列桁,_整数,_文字列) :- 桁不足の場合頭部には空白を詰める(_文字列桁,_整数,_文字列),!. 整数から文字列(_文字列桁,_整数,_文字列) :- atom_number(_文字列,_整数). 桁不足の場合頭部には空白を詰める(_文字列桁,_整数,_文字列) :- length(L,_文字列桁), number_chars(_整数,Chars), append(L0,Chars,L), all(L0,' '), atomic_list_concat(L,_文字列). % 以下のサイトは # # 1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となるPrologプログラムを作成しなさい。 # '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となるPrologプログラムを作成しなさい。'(_乱数ならび) :- '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(0,0,0,_乱数ならび). '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(1,3,3,[]) :- !. '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(_22_1,_以下_1,_以上_1,[_乱数|R]) :- '1から99までを値域とする乱数'(_乱数), '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(_乱数,_22_1,_以下_1,_以上_1,_22_2,_以下_2,_以上_2), '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(_22_2,_以下_2,_以上_2,R),!. '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(22,0,_以下,_以上,1,_以下,_以上) :- !. '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(_乱数,_22,_以下_1,_以上_1,_22,_以下_2,_以上_1) :- '乱数が22以下で枠がまだある'(_乱数,_以下_1,_以下_2),!. '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(_乱数,_22,_以下_1,_以上_1,_22,_以下_1,_以上_2) :- '乱数が22以上で枠がまだある'(_乱数,_以上_1,_以上_2),!. '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(_,_22,_以下,_以上,_22,_以下,_以上) :- 既に枠が埋まってしまっている場合は乱数は使用されない. '乱数が22以下で枠がまだある'(_乱数,_以下_1,_以下_2) :- _乱数 =< 22, _以下_1 < 3, _以下_2 is _以下_1 + 1,!. '乱数が22以上で枠がまだある'(_乱数,_以上_1,_以上_2) :- _乱数 >= 22, _以上_1 < 3, _以上_2 is _以上_1 + 1,!. '1から99までを値域とする乱数'(_乱数) :- _乱数 is random(99) + 1. 既に枠が埋まってしまっている場合は乱数は使用されない. % 以下のサイトは # # 1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となるPrologプログラムを作成しなさい。 # '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となるPrologプログラムを作成しなさい。'(_乱数ならび) :- '1から99までを値域とする乱数'(_乱数), '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(_乱数,0,0,0,_乱数ならび). '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(_,1,3,3,[]) :- !. '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(22,0,_22以下の頻度_1,_22以下の頻度_1,[22|R]) :- var(_22の枠), '1から99までを値域とする乱数'(_乱数), '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(_乱数,1,_22以下の頻度_1,_22以下の頻度_1,R),!. '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(_値,_22,_22以下の頻度_1,_22以下の頻度_1,[_値|R]) :- _値 =< 22, _22以下の頻度_1 < 3, _22以下の頻度_2 is _22以下の頻度_1 + 1, '1から99までを値域とする乱数'(_乱数), 中央値が22となる(_乱数,_22,_22以下の頻度_2,_22以上の頻度_1,R),!. '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(_値,_22,_22以下の頻度_1,_22以下の頻度_1,[_値|R]) :- _値 >= 22, _22以上の頻度_1 < 3, _22以上の頻度_2 is _22以上の頻度_1 + 1, '1から99までを値域とする乱数'(_乱数), '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(_乱数,_22,_22以下の頻度_1,_22以上の頻度_2,R),!. '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(_,_22,_22以下の頻度_1,_22以下の頻度_1,R) :- '1から99までを値域とする乱数'(_乱数), '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(_乱数,_22,_22以下の頻度_1,_22以上の頻度_1,R),!. '1から99までを値域とする乱数'(_乱数) :- _乱数 is random(99) + 1. % 以下のサイトは % 自 秘蔵宝鑰. 暗生始 :- 生生生生. 冥生終 :- 死死死死. 暗生始(_) :- 生生生生(_). 冥生終(_) :- 死死死死(_). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/127 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/YK6POzO6 # # 値を入力し、最小値と最大値を求める。 # ただしマイナスの値が入力されたら結果を表示する。 # # [実行例] # 値1:50 # 値2:32 # 値3:102 # 値4:2 # 値5:99 # 値6:-2 # # //最大値の右にmax、最小値の右にminと出力する。// # 1: 50 # 2: 32 # 3:102  max # 4: 2  min # 5: 99 # '値を入力し、最小値と最大値を求める。ただしマイナスの値が入力されたら結果を表示する。' :- findall(_値,( '値を入力し、'(_値), ( マイナスの値が入力されたら(_値),!, fail; true)), _値ならび), '入力した値をmin(最小値),max(最大値)を付加して表示する。'(_値ならび). '値を入力し、'(_値) :- append(L0,_,_), length([_|L0],_何番目), atomic_list_concat([値,_何番目],_催促表示), 数を得る(_催促表示,_値). '入力した値をmin(最小値),max(最大値)を付加して表示する。'(_値ならび) :- 最大値(_値ならび,_最大値), 最小値(_値ならび,_最小値), 全ての行を表示する(_値ならび,_最小値,_最大値). 全ての行を表示する(_値ならび,_最小値,_最大値) :- append(L0,[_値|R],_値ならび), length([_|L0],_何番目), 行表示文字列を生成(_何番目,_値,_最小値,_最大値,_行表示文字列), writef('%t\n',[_行表示文字列]), R = [],!. 行表示文字列を生成(_何番目,_値,_最小値,_最大値,_行表示文字列) :- atomic_list_concat([_何番目,':',_値],_行表示_1), 最小値ならminを付加(_値,_最小値,_行表示_1,_行表示_2), 最大値ならmaxを付加(_値,_最大値,_行表示_2,_行表示文字列). 最小値ならminを付加(_最小値,_最小値,_行表示_1,_行表示_2) :- atomic_list_concat([_行表示_1,' min'],_行表示_2),!. 最小値ならminを付加(_,_,_行表示,_行表示). 最大値ならminを付加(_最大値,_最大値,_行表示_1,_行表示_2) :- atomic_list_concat([_行表示_1,' max'],_行表示_2),!. 最大値ならminを付加(_,_,_行表示,_行表示). マイナスの値が入力されたら(V) :- integer(V), V < 0,!. マイナスの値が入力されたら(V) :- float(V), V < 0.0,!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/844 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # http://ime.nu/codepad.org/DXRUGC3J # http://ime.nu/codepad.org/e9CIf3Iy # # /* # # 4. # 2次元平面上の3つの座標 p1、p2、 p3 を頂点とする # 3角形を考え、構造体 triangle を以下のように定義する。 # struct triangle { # double p1[2]; double p2[2]; double p3[2]; # }; # # 構造体 triangle に対して、以下の関数を作成せよ。 適当な構造体 triangle の変数を # いくつか作成して、この関数が正しく動作することを確認するプログラムを作成せよ。 # # int congruence (structure triangle *a, structure triangle *b) # # 三角形 a と三角形 b が合同かどうかを判定する、 # 合同なら 1 を合同でないなら 0 を返す # # */ # # /* # # 5.構造体Tri は三角形に対応するものであり、3 つの辺の長さ(a,b,c) とその三角形の面積(area) を # メンバーとしてして持つ。 # struct Tri { # int a; # int b; # int c; # double area # }; # # 構造体Tri の変数をランダムにn 個作成して、三角形の面積が大きい順に表示するプログラムを作成 # する。ただしn はプログラムの引数として与える。また構造体Tri の変数をランダムに作成する際 # に、a とb には3 以上30 以下の整数をランダムに入れ、c にはa とb の値から、3 辺a, b, c から三 # 角形ができるようにランダムに正の整数を入れる。 # # [実行結果] # > ./a.out 1000 # 1 番目に大きい三角形は3 辺が( 30, 29, 41 ) で面積は434.741302 # 2 番目に大きい三角形は3 辺が( 29, 29, 43 ) で面積は418.422260 # 3 番目に大きい三角形は3 辺が( 30, 27, 37 ) で面積は399.749922 # ... # 998 番目に大きい三角形は3 辺が( 4, 3, 3 ) で面積は4.472136 # 999 番目に大きい三角形は3 辺が( 3, 3, 3 ) で面積は3.897114 # 1000 番目に大きい三角形は3 辺が( 3, 3, 1 ) で面積は1.479020 # # */ '三角形の面積が大きい順に表示する'(_n) :- 三角形をn個生成する(_n,_n個の三角形ならび), 大きい順に表示する(_n個の三角形ならび). 三角形をn個生成する(_n,_n個の三角形ならび) :- findall([_a,_b,_c],( between(1,_n,_), 三辺の長さを生成する(_a,_b,_c)), _n個の三角形ならび). 三辺の長さを生成する(_a,_b,_c) :- _a is random(100) + 1, _b is random(100) + 1, _c is random(100) + 1. 大きい順に表示する(_n個の三角形ならび) :- 三角形の面積と相対位置のならびを作る(0,_n個の三角形ならび,_面積と相対位置のならび), 大きい順に(_面積と相対位置のならび,_大きい順に整列した面積と相対位置のならび), 表示する(0,_大きい順に整列した面積と相対位置のならび,_n個の三角形ならび). 三角形の面積と相対位置のならびを作る(_,[],[]). 三角形の面積と相対位置のならびを作る(N_1,[[_a,_b,_c]|R1],[[_三角形の面積,N_2]|R2]) :- N_2 is N + 1, ヘロンの公式(_a,_b,_c,_三角形の面積), 三角形の面積と相対位置のならびを作る(0,R1,R2). ヘロンの公式(_a,_b,_c,_三角形の面積) :- _周囲の半分 is (_a + _b + _c) / 2, _三角形の面積 is sqrt(_周囲の半分 * (_周囲の半分 - _a) * (_周囲の半分 - _b) * (_周囲の半分 - _c)). 大きい順に([],[]). 大きい順に([_軸要素|L1],L2) :- 大きい順に分割する(_軸要素,L1,_軸要素に等しいか大きい要素ならび,_軸要素より小さい要素ならび), 大きい順に(_軸要素に等しいか大きい要素ならび,_大きい順に整列した軸要素に等しいか大きい要素ならび), 大きい順に(_軸要素より小さい要素ならび,_大きい順に整列した軸要素より小さい要素ならび), append(_大きい順に整列した軸要素に等しいか大きい要素ならび,[_軸要素|_大きい順に整列した軸要素より小さい],L2). 大きい順に分割する(_,[],[],[])). 大きい順に分割する(_軸要素,[_要素|R1],[_要素|_軸要素に等しいか大きい要素ならび],_軸要素より小さい要素ならび) :- _要素 @>= _軸要素, 大きい順に分割する(_軸要素,R1,_軸要素に等しいか大きい要素ならび,_軸要素より小さい要素ならび). 大きい順に分割する(_軸要素,[_要素|R1],_軸要素に等しいか大きい要素ならび,[_要素|_軸要素より小さい要素ならび]) :- _要素 @< _軸要素, 大きい順に分割する(_軸要素,R1,_軸要素に等しいか大きい要素ならび,_軸要素より小さい要素ならび). 表示する(_,[],_). 表示する(_順位_0,[[_面積,_相対番号]|R1],_n個の三角形ならび) :- _順位 is _順位_0 + 1, nth1(_相対番号,_n個の三角形ならび,[_a,_b,_c]), writef('%t 番目に大きい三角形は3 辺が( %t, %t, %t ) で面積は%t\n',[_順位,_a,_b,_c,_面積]), 表示する(_順位,R1,_n個の三角形ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/667 # # [1] 授業単元:C言語 # [2] 問題文: http://ime.nu/ideone.com/tRkzM # # 1. 10000から99999のランダムな自然数を1000コ生成し、小さい順にこれら数値を表示するプログラムを作成せよ。 #   ただし数値は何番目に生成した数値かも表示する。 # #   例)1番目に小さい数は475番目の数10049です。 # # 2. 10000から999999のランダムな自然数を1000コ生成し、各数値と平均値との差をもとめ、その差が小さい順にその数値を  表示するプログラムを作成せよ。また、各数値は何番目に生成したかも表示する。 # #   例)1番目に平均との差が小さい数は680番目の数69383です。 平均値との差は10.505です。 # # 3. n種類の文字{a1,a2,・・・,an}を考える。このn種類の文字を使って構成できるn文字列をすべて表示せよ。 #   ただし文字の重複はなし。nはプログラムの引数としてあたえ、1 < n < 15 は仮定する。 # #   例)program 5 # a,b,c,d,e # a,b,c,e,d # a,b,d,c,e # ・ #       ・ #     e,d,c,b,a 'n種類の文字{a1,a2,・・・,an}を考える。このn種類の文字を使って構成できるn文字列をすべて表示せよ。ただし文字の重複はなし。nはプログラムの引数としてあたえ、1 < n < 15 は仮定する。'(_n) :- length(L,_n), 重複しないn文字を得る(_n,L), このn種類の文字を使って構成できるn文字列をすべて表示せよ(_n,L). 重複しないn文字を得る(0,L,L) :- !. 重複しないn文字を得る(N,L1,L) :- 'L1に重複しない一文字を追加する'(L1,L2), N_1 is N - 1, 重複しないn文字を得る(N_1,L2,L),!. 重複しないn文字を得る(N,L1,L) :- 重複しないn文字を得る(N,L1,L). 'L1に重複しない一文字を追加する'(L1,L2) :- write('一文字入力してください : '), get_char(_文字), \+(member(_文字,L1)), append(L1,[_文字],L2). このn種類の文字を使って構成できるn文字列をすべて表示せよ(_n,L) :- このn種類の文字を使って構成できるn文字列を(_n,L,_文字列ならび), append(_,[_文字列|R],_文字列ならび), writef('%t\n',[_文字列]), R = []. このn種類の文字を使って構成できるn文字列を(_n,L,_文字列ならび) :- findall(_文字列,( 順列(L,_n,L1), atomic_list_concat(L1,',',_文字列)), _文字列ならび). 順列(Y,0,[]). 順列(Y,N,[A|X]) :- del(A,Y,Z), M is N - 1, 順列(Z,M,X). del(A,[A|X],X). del(A,[B|X],[B|Y]) :- del(A,X,Y). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/667 # # [1] 授業単元:C言語 # [2] 問題文: http://ime.nu/ideone.com/tRkzM # # 1. 10000から99999のランダムな自然数を1000コ生成し、小さい順にこれら数値を表示するプログラムを作成せよ。 #   ただし数値は何番目に生成した数値かも表示する。 # #   例)1番目に小さい数は475番目の数10049です。 # # 2. 10000から999999のランダムな自然数を1000コ生成し、各数値と平均値との差をもとめ、その差が小さい順にその数値を  表示するプログラムを作成せよ。また、各数値は何番目に生成したかも表示する。 # #   例)1番目に平均との差が小さい数は680番目の数69383です。 平均値との差は10.505です。 # # 3. n種類の文字{a1,a2,・・・,an}を考える。このn種類の文字を使って構成できるn文字列をすべて表示せよ。 #   ただし文字の重複はなし。nはプログラムの引数としてあたえ、1 < n < 15は仮定する。 # #   例)program 5 # a,b,c,d,e # a,b,c,e,d # a,b,d,c,e # ・ #       ・ #     e,d,c,b,a '10000から999999のランダムな自然数を1000コ生成し、各数値と平均値との差をもとめ、その差が小さい順にその数値を表示する。各数値は何番目に生成したかも表示する' :- '10000から99999のランダムな自然数を1000コ生成し'(_自然数ならび), '各数値と平均値との差をもとめ、その差が小さい順にその数値を表示する。各数値は何番目に生成したかも表示する'(_自然数ならび). '10000から99999のランダムな自然数を1000コ生成し'(_自然数ならび) :- findall(N,( between(1,10000,_), N is random(10000) + 10000), _自然数ならび). '各数値と平均値との差をもとめ、その差が小さい順にその数値を表示する'(_自然数ならび) :- 各数値と平均値との差をもとめ(_自然数ならび,_何番目かの情報を付けた平均との差ならび), その差が小さい順に(_何番目かの情報を付加した平均との差ならび,_小さい順に整列した何番目かの情報を付加した平均との差ならび), その数値を表示する(_小さい順に整列した何番目かの情報を付加した平均との差ならび). 各数値と平均値との差をもとめ(_自然数ならび,_何番目かの情報を付加した平均との差ならび) :- 平均値(_自然数ならび,_平均値), findall([_差,_何番目],( append(L0,[_数値|_],_自然数ならび), length([_|L0],_何番目), _差 is abs(_数値 - _平均値)), _何番目かの情報を付加した平均との差ならび). 平均値(_自然数ならび,_平均値) :- 相加平均(_自然数ならび,_平均値). 小さい順にこれら数値を表示する(_自然数ならび) :- 小さい順に数値を(_自然数ならび,_小さい順に整列した自然数ならび), 表示する(_小さい順に整列した自然数ならび) その差が小さい順に([],[]). その差が小さい順に([_軸要素|_残りならび],_小さい順に整列した自然数ならび) :- 分割(_軸要素,_残りならび,_軸要素と等しいか小さい自然数ならび,_軸要素より大きい自然数ならび), その差が小さい順に(_軸要素と等しいか小さい自然数ならび,_小さい順に整列した軸要素と等しいか小さい自然数ならび), その差が小さい順に(_軸要素より大きい自然数ならび,_小さい順に整列した軸要素より大きい自然数ならび), append(_小さい順に整列した軸要素と等しいか小さい自然数ならび,[_軸要素|_小さい順に整列した軸要素より大きい自然数ならび],_小さい順に整列した自然数ならび). 分割(_,[],[]). 分割(_軸要素,[A|R],[A|R1],R2) :- A @=< _軸要素, 分割(_軸要素,R,R1,R2). 分割(_軸要素,[A|R],R1,[A|R2]) :- A @> _軸要素, 分割(_軸要素,R,R1,R2). 'その数値を表示する。各数値は何番目に生成したかも表示する'(_,[]). 'その数値を表示する。各数値は何番目に生成したかも表示する'(_自然数ならび,[_1,_2,_3,_4,_5,_6,_7,_8,_9,_10|R]) :- '数値と何番目かを表示する'(_自然数ならび,[_1,_2,_3,_4,_5,_6,_7,_8,_9,_10]), 'その数値を表示する。各数値は何番目に生成したかも表示する'(_自然数ならび,R). '数値と何番目かを表示する'(_,[]) :- write('\n'). '数値と何番目かを表示する'(_自然数ならび,[[_,_位置]|R]) :- nth1(_位置,_自然数ならび,_数値), writef('%t(%t) ',[_位置,_数値]), '数値と何番目かを表示する'(_自然数ならび,R). 相加平均(_値ならび,_相加平均) :- length(_値ならび,_標本数), 相加平均(_値ならび,_標本数,0,_相加平均). 相加平均([],_標本数,_合計,_相加平均) :- _相加平均 is _合計 / _標本数,!. 相加平均([V|R],_標本数,_合計_1,_相加平均) :- _合計_2 is _合計_1 + V, 相加平均(R,_標本数,_合計_2,_相加平均). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/667 # # [1] 授業単元:C言語 # [2] 問題文: http://ime.nu/ideone.com/tRkzM # # 1. 10000から99999のランダムな自然数を1000コ生成し、小さい順にこれら数値を表示するプログラムを作成せよ。 #   ただし数値は何番目に生成した数値かも表示する。 # #   例)1番目に小さい数は475番目の数10049です。 # # 2. 10000から999999のランダムな自然数を1000コ生成し、各数値と平均値との差をもとめ、その差が小さい順にその数値を  表示するプログラムを作成せよ。また、各数値は何番目に生成したかも表示する。 # #   例)1番目に平均との差が小さい数は680番目の数69383です。 平均値との差は10.505です。 # # 3. n種類の文字{a1,a2,・・・,an}を考える。このn種類の文字を使って構成できるn文字列をすべて表示せよ。 #   ただし文字の重複はなし。nはプログラムの引数としてあたえ、1 < n < 15は仮定する。 # #   例)program 5 # a,b,c,d,e # a,b,c,e,d # a,b,d,c,e # ・ #       ・ #     e,d,c,b,a '10000から99999のランダムな自然数を1000コ生成し、小さい順にこれら数値を表示する' :- '10000から99999のランダムな自然数を1000コ生成し'(_自然数ならび), '小さい順にこれら数値を表示する'(_自然数ならび). '10000から99999のランダムな自然数を1000コ生成し'(_自然数ならび) :- findall(N,( between(1,10000,_), N is random(10000) + 10000), _自然数ならび). 小さい順にこれら数値を表示する(_自然数ならび) :- 小さい順に数値を(_自然数ならび,_小さい順に整列した自然数ならび), 表示する(_小さい順に整列した自然数ならび) 小さい順に数値を([],[]). 小さい順に数値を([_軸要素|_残りならび],_小さい順に整列した自然数ならび) :- 分割(_軸要素,_残りならび,_軸要素と等しいか小さい自然数ならび,_軸要素より大きい自然数ならび), 小さい順に数値を(_軸要素と等しいか小さい自然数ならび,_小さい順に整列した軸要素と等しいか小さい自然数ならび), 小さい順に数値を(_軸要素より大きい自然数ならび,_小さい順に整列した軸要素より大きい自然数ならび), append(_小さい順に整列した軸要素と等しいか小さい自然数ならび,[_軸要素|_小さい順に整列した軸要素より大きい自然数ならび],_小さい順に整列した自然数ならび). 分割(_,[],[]). 分割(_軸要素,[A|R],[A|R1],R2) :- A =< _軸要素, 分割(_軸要素,R,R1,R2). 分割(_軸要素,[A|R],R1,[A|R2]) :- A > _軸要素, 分割(_軸要素,R,R1,R2). 表示する([]). 表示する([_1,_2,_3,_4,_5,_6,_7,_8,_9,_10|R]) :- writef('%t %t %t %t %t %t %t %t %t %t\n',[_1,_2,_3,_4,_5,_6,_7,_8,_9,_10]), 表示する(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/667 # # [1] 授業単元:C言語 # [2] 問題文: http://ime.nu/ideone.com/tRkzM # # 1. 10000から99999のランダムな自然数を1000コ生成し、小さい順にこれら数値を表示するプログラムを作成せよ。 #   ただし数値は何番目に生成した数値かも表示する。 # #   例)1番目に小さい数は475番目の数10049です。 # # 2. 10000から999999のランダムな自然数を1000コ生成し、各数値と平均値との差をもとめ、その差が小さい順にその数値を  表示するプログラムを作成せよ。また、各数値は何番目に生成したかも表示する。 # #   例)1番目に平均との差が小さい数は680番目の数69383です。 平均値との差は10.505です。 # # 3. n種類の文字{a1,a2,・・・,an}を考える。このn種類の文字を使って構成できるn文字列をすべて表示せよ。 #   ただし文字の重複はなし。nはプログラムの引数としてあたえ、1 < n < 15は仮定する。 # #   例)program 5 # a,b,c,d,e # a,b,c,e,d # a,b,d,c,e # ・ #       ・ #     e,d,c,b,a '10000から99999のランダムな自然数を1000コ生成し、小さい順にこれら数値を表示する' :- '10000から99999のランダムな自然数を1000コ生成し'(_自然数ならび), '小さい順にこれら数値を表示する'(_自然数ならび). '10000から99999のランダムな自然数を1000コ生成し'(_自然数ならび) :- findall(N,( between(1,10000,_), N is random(10000) + 10000), _自然数ならび). 小さい順にこれら数値を表示する(_自然数ならび) :- 小さい順に数値を(_自然数ならび,_小さい順に整列した自然数ならび), 表示する(_小さい順に整列した自然数ならび) 小さい順に数値を([],[]). 小さい順に数値を([_軸要素|_残りならび],_小さい順に整列した自然数ならび) :- 分割(_軸要素,_残りならび,_軸要素と等しいか小さい自然数ならび,_軸要素より大きい自然数ならび), 小さい順に数値を(_軸要素と等しいか小さい自然数ならび,_小さい順に整列した軸要素と等しいか小さい自然数ならび), 小さい順に数値を(_軸要素より大きい自然数ならび,_小さい順に整列した軸要素より大きい自然数ならび), append(_小さい順に整列した軸要素と等しいか小さい自然数ならび,[_軸要素|_小さい順に整列した軸要素より大きい自然数ならび],_小さい順に整列した自然数ならび). 分割(_,[],[]). 分割(_軸要素,[A|R],[A|R1],R2) :- A =< _軸要素, 分割(_軸要素,R,R1,R2). 分割(_軸要素,[A|R],R1,[A|R2]) :- A > _軸要素, 分割(_軸要素,R,R1,R2). 表示する([]). 表示する([_1,_2,_3,_4,_5,_6,_7,_8,_9,_10|R]) :- writef('%t %t %t %t %t %t %t %t %t %t\n',[_1,_2,_3,_4,_5,_6,_7,_8,_9,_10]), 表示する(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/592 # # [1] 授業単元:データ構造入門 # [2] 問題文(含コード&リンク):問題文が長いためこちらに記載しました http://ime.nu/ideone.com/R8gaZ # # 【問題1】 # サイコロのように1から6の目を等確率で発生させる関数を、rand()関数を用いて次の方法で作成せよ。 # 1+(int)(6.0*rand()/(1.0+RAND_MAX)); の演算で、1から6まで発生させる。 # 'サイコロのように1から6の目を等確率で発生する乱数'(_サイコロのように1から6の目を等確率で発生する数) :- _サイコロのように1から6の目を等確率で発生する数 is ceiling(6.0 * random(2147483647) / (1.0+2147483647)). サイコロ乱数発生テスト(_繰り返し回数,_1,_2,_3,_4,_5,_6) :- findall(N,( between(1,_繰り返し回数,_), 'サイコロのように1から6の目を等確率で発生する乱数'(N)), L), findall(Count,( between(1,6,M), count(member(M,L),Count)), [_1,_2,_3,_4,_5,_6]). count(P,Count) :- findall(1,P,L), length(L,Count). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/592 # # [1] 授業単元:データ構造入門 # [2] 問題文(含コード&リンク):問題文が長いためこちらに記載しました http://ime.nu/ideone.com/R8gaZ # # 【問題2】 # 線形探索法で目的データを探索するプログラムを作成せよ。 # データの数をキーボード入力し、その個数だけの疑似乱数を発生させてデータを配列に格納し、 # データとその添え字番号を一覧表示する。次に目的データ(探索データ)をキーボード入力し、 # 線形探索法で探索し、見つかった場合その配列の添え字番号を表示し、見つからなかった場合は # 「みつからなかったこと」を表示する。なお、データ数は最大50として、50をマクロ定義 # せよ。また、データの探索と作成には、次の関数を作成して使うこと。 # # ・int linear_search(int data[],int key,int num) # この関数はnum個のデータが格納された配列dataの中から、線形探索を用いて目的データkeyと等しい # 値を探し、見つかった場合にはその配列要素を返却し、見つからなかった場合には-1を返却する。 # # ・void random_data(int data[],int num) # この関数は整列していないnum個のデータを配列dataに格納する関数。疑似乱数rand()を用いよ。 # データの値は0からnum-1までの整数で全て異なる値とせよ。 # ※乱数列を変更するにはvoid srand(seed)を実行する。seedの値が異なると、ことなる乱数列が # 得られることを確認しよう。 'データの数をキーボード入力し、その個数だけの疑似乱数を発生させてデータを配列に格納し、データとその添え字番号を一覧表示する。 次に目的データ(探索データ)をキーボード入力し、線形探索法で探索し、見つかった場合その配列の添え字番号を表示し、見つからなかった場合は「みつからなかったこと」を表示する。 なお、データ数は最大50として、50をマクロ定義せよ。' :- 'データの数をキーボード入力し、その個数だけの疑似乱数を発生させてデータを配列に格納し、データとその添え字番号を一覧表示する。なお、データ数は最大50とする'(_データの数,_データならび), '次に目的データ(探索データ)をキーボード入力し、線形探索法で探索し、見つかった場合その配列の添え字番号を表示し、見つからなかった場合は「みつからなかったこと」を表示する。'(_データの数,_データならび). 'データの数をキーボード入力し、その個数だけの疑似乱数を発生させてデータを配列に格納し、データとその添え字番号を一覧表示する。' :- 'データ数は最大50としてデータの数をキーボード入力し'(_データの数), 'その個数だけの疑似乱数を発生させてデータを配列に格納し'(_データの数,_データならび), 'データとその添え字番号を一覧表示する'(_データの数,_データならび). 'データ数は最大50としてデータの数をキーボード入力し、' :-'(_データの数) :- 整数を得る(データの数,between(1,50,_データ数),_データの数). 'その個数だけの疑似乱数を発生させてデータを配列に格納し'(_データの数,_データならび) :- length(_データならび,_データの数), findall(N,( member(N,_データならび), N is random(_データの数) + 1), _データならび). 'データとその添え字番号を一覧表示する'(_データの数,_データならび) :- nth1(_添字番号,_データならび,_データ), writef('%t: %t\n',[_添字番号,_データ]), _添字番号 = _データの数,!. '次に目的データ(探索データ)をキーボード入力し、線形探索法で探索し、見つかった場合その配列の添え字番号を表示し、見つからなかった場合は「みつからなかったこと」を表示する。'(_データの数,_データならび) :- '目的データ(探索データ)をキーボード入力し'(_データの数,_目的データ), '線形探索法で探索し、見つかった場合その配列の添え字番号を表示し、見つからなかった場合は「みつからなかったこと」を表示する'(_目的データ,_データならび). '目的データ(探索データ)をキーボード入力し'(_データの数,_目的データ) :- swritef(_制限表示,'1から%tまでの範囲の任意の数',[_データ数]), write('目的データ(探索データ)を入力してください : '), 整数を得る(_制限表示,_目的データ). '線形探索法で探索し、見つかった場合その配列の添え字番号を表示し、見つからなかった場合は「みつからなかったこと」を表示する'(_目的データ,_データならび) :- '線形探索法で探索し、見つからなかった場合は「みつからなかったこと」を表示する'(_目的データ,_データならび),!. '線形探索法で探索し、見つかった場合その配列の添え字番号を表示し、見つからなかった場合は「みつからなかったこと」を表示する'(_目的データ,_データならび) :- '線形探索法で探索し、見つかった場合その配列の添え字番号を表示し'(_目的データ,_データならび). '線形探索法で探索し、見つかった場合その配列の添え字番号を表示し'(_目的データ,_データならび) :- '見つからなかった場合は「みつからなかったこと」を表示する'(_目的データ,_データならび),!. '線形探索法で探索し、見つからなかった場合は「みつからなかったこと」を表示する'(_目的データ,_データならび) :- \+(nth1(_添字番号,_データならび,_目的データ)), writef('目的データ %t はデータならびの中に見つかりません\n',[_目的データ]),!. '線形探索法で探索し、見つかった場合その配列の添え字番号を表示し'(_目的データ,_データならび) :- nth1(_添字番号,_データならび,_目的データ), writef('%t: %t\n',[_添字番号,_目的データ), fail. '線形探索法で探索し、見つかった場合その配列の添え字番号を表示し'(_目的データ,_データならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/592 # # [1] 授業単元:データ構造入門 # [2] 問題文(含コード&リンク):問題文が長いためこちらに記載しました http://ime.nu/ideone.com/R8gaZ # # 【問題1】 # サイコロのように1から6の目を等確率で発生させる関数を、rand()関数を用いて次の方法で作成せよ。 # 1+(int)(6.0*rand()/(1.0+RAND_MAX)); の演算で、1から6まで発生させる。 # 'サイコロのように1から6の目を等確率で発生する乱数'(_サイコロのように1から6の目を等確率で発生する数) :- _サイコロのように1から6の目を等確率で発生する数 is ceiling(6.0 * random(2147483647) / (1.0+2147483647)). サイコロ乱数発生テスト(_繰り返し回数,_1,_2,_3,_4,_5,_6) :- サイコロのように1から6の目を等確率で発生する乱数ならび(_繰返し回数,_乱数ならび), サイコロの目ごとの度数(_乱数ならび,[_1,_2,_3,_4,_5,_6]). サイコロのように1から6の目を等確率で発生する乱数ならび(_繰返し回数,_乱数ならび) :- findall(N,( between(1,_繰り返し回数,_), 'サイコロのように1から6の目を等確率で発生する乱数'(N)),_乱数ならび). サイコロの目ごとの度数(_乱数ならび,[_1,_2,_3,_4,_5,_6]) :- findall(_度数,( between(1,6,M), 度数(member(M,_乱数ならび),_度数)),[_1,_2,_3,_4,_5,_6]). 度数(P,_度数) :- findall(1,P,L), length(L,_度数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/592 # # [1] 授業単元:データ構造入門 # [2] 問題文(含コード&リンク):問題文が長いためこちらに記載しました http://ime.nu/ideone.com/R8gaZ # # 【問題1】 # サイコロのように1から6の目を等確率で発生させる関数を、rand()関数を用いて次の方法で作成せよ。 # 1+(int)(6.0*rand()/(1.0+RAND_MAX)); の演算で、1から6まで発生させる。 # 'サイコロのように1から6の目を等確率で発生する乱数'(_サイコロのように1から6の目を等確率で発生する数) :- _サイコロのように1から6の目を等確率で発生する数 is ceiling(6.0 * random(2147483647) / (1.0+2147483647)). サイコロ乱数発生テスト(_繰り返し回数,_1,_2,_3,_4,_5,_6) :- findall(N,( between(1,_繰り返し回数,_), 'サイコロのように1から6の目を等確率で発生する乱数'(N)), L), findall(Count,( between(1,6,M), count(member(M,L),Count)), [_1,_2,_3,_4,_5,_6]). count(P,Count) :- findall(1,P,L), length(L,Count). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/829 # # 問題 # 数独の解答が9行9列の文字列で与えられたとき正しいかどうか判定せよ。 # # '数独の解答が9行9列の文字列で与えられたとき正しいかどうか'(_文字列) :- '数独の解答が9行9列の文字列で与えられたとき'(_文字列,L), 数独の回答が正しい(L). '数独の解答が9行9列の文字列で与えられたとき'(_9行9列の文字列,L) :- atom_chars(_9行9列の文字列,Chars), 改行を取り除きながら数字列を数値ならびに変換(Chars,L). 改行を取り除きながら数字列を数値ならびに変換([],[]). 改行を取り除きながら数字列を数値ならびに変換(['\n'|R1],R2) :- 改行を取り除きながら数字列を数値ならびに変換(R1,R2). 改行を取り除きながら数字列を数値ならびに変換([A|R1],[N|R2]) :- atom_number(A,N), 改行を取り除きながら数字列を数値ならびに変換(R1,R2). 数独の回答が正しい([_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59,_60,_61,_62,_63,_64,_65,_66,_67,_68,_69,_70,_71,_72,_73,_74,_75,_76,_77,_78,_79,_80,_81]) :- 数独診断([[_1,_2,_3,_4,_5,_6,_7,_8,_9], [_10,_11,_12,_13,_14,_15,_16,_17,_18], [_19,_20,_21,_22,_23,_24,_25,_26,_27], [_28,_29,_30,_31,_32,_33,_34,_35,_36], [_37,_38,_39,_40,_41,_42,_43,_44,_45], [_46,_47,_48,_49,_50,_51,_52,_53,_54], [_55,_56,_57,_58,_59,_60,_61,_62,_63], [_64,_65,_66,_67,_68,_69,_70,_71,_72], [_73,_74,_75,_76,_77,_78,_79,_80,_81], [_1,_10,_19,_28,_37,_46,_55,_64,_73], [_2,_11,_20,_29,_38,_47,_56,_65,_74], [_3,_12,_21,_30,_39,_48,_57,_66,_75], [_4,_13,_22,_31,_40,_49,_58,_67,_76], [_5,_14,_23,_32,_41,_50,_59,_68,_77], [_6,_15,_24,_33,_42,_51,_60,_69,_78], [_7,_16,_25,_34,_43,_52,_61,_70,_79], [_8,_17,_26,_35,_44,_53,_62,_71,_80], [_9,_18,_27,_36,_45,_54,_63,_72,_81], [_1,_2,_3,_10,_11,_12,_19,_20,_21], [_4,_5,_6,_13,_14,_15,_22,_23,_24], [_7,_8,_9,_16,_17,_18,_25,_26,_27], [_28,_29,_30,_37,_38,_39,_46,_47,_48], [_31,_32,_33,_40,_41,_42,_49,_50,_51], [_34,_35,_36,_43,_44,_45,_52,_53,_54], [_55,_56,_57,_64,_65,_66,_73,_74,_75], [_58,_59,_60,_67,_68,_69,_76,_77,_78], [_61,_62,_63,_70,_71,_72,_79,_80,_81]]). 数独診断([]) :- !. 数独診断([L|R]) :- sort(L,L1), length(L1,9), 数独診断(R). 数独([_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59,_60,_61,_62,_63,_64,_65,_66,_67,_68,_69,_70,_71,_72,_73,_74,_75,_76,_77,_78,_79,_80,_81]) :- 数独生成([[_1,_2,_3,_4,_5,_6,_7,_8,_9], [_10,_11,_12,_13,_14,_15,_16,_17,_18], [_19,_20,_21,_22,_23,_24,_25,_26,_27], [_28,_29,_30,_31,_32,_33,_34,_35,_36], [_37,_38,_39,_40,_41,_42,_43,_44,_45], [_46,_47,_48,_49,_50,_51,_52,_53,_54], [_55,_56,_57,_58,_59,_60,_61,_62,_63], [_64,_65,_66,_67,_68,_69,_70,_71,_72], [_73,_74,_75,_76,_77,_78,_79,_80,_81], [_1,_10,_19,_28,_37,_46,_55,_64,_73], [_2,_11,_20,_29,_38,_47,_56,_65,_74], [_3,_12,_21,_30,_39,_48,_57,_66,_75], [_4,_13,_22,_31,_40,_49,_58,_67,_76], [_5,_14,_23,_32,_41,_50,_59,_68,_77], [_6,_15,_24,_33,_42,_51,_60,_69,_78], [_7,_16,_25,_34,_43,_52,_61,_70,_79], [_8,_17,_26,_35,_44,_53,_62,_71,_80], [_9,_18,_27,_36,_45,_54,_63,_72,_81], [_1,_2,_3,_10,_11,_12,_19,_20,_21], [_4,_5,_6,_13,_14,_15,_22,_23,_24], [_7,_8,_9,_16,_17,_18,_25,_26,_27], [_28,_29,_30,_37,_38,_39,_46,_47,_48], [_31,_32,_33,_40,_41,_42,_49,_50,_51], [_34,_35,_36,_43,_44,_45,_52,_53,_54], [_55,_56,_57,_64,_65,_66,_73,_74,_75], [_58,_59,_60,_67,_68,_69,_76,_77,_78], [_61,_62,_63,_70,_71,_72,_79,_80,_81]]). 数独生成([]) :- !. 数独生成([L|R]) :- 変数に数値を埋める(L), 数独生成(R). 変数に数値を埋める(L) :- 既に使われている数値は候補から外す(L,[1,2,3,4,5,6,7,8,9],_数字候補), 変数に数値を埋める(_数字候補,L). 既に使われている数値は候補から外す([],L,L). 既に使われている数値は候補から外す([V|R1],L1,L) :- var(V), 既に使われている数値は候補から外す(R1,L1,L). 既に使われている数値は候補から外す([N|R1],L1,L) :- integer(N), select(N,L1,L2), 既に使われている数値は候補から外す(R1,L2,L). 変数に数値を埋める([],[]). 変数に数値を埋める(_数字候補,[N|R]) :- integer(N), 変数に数値を埋める(_数字候補,R). 変数に数値を埋める(_数字候補,[V|R]) :- var(V), select(V,_数字候補,_残り数字候補), 変数に数値を埋める(_残り数字候補,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/309 # # [1] 授業単元:C言語プログラム演習 # [2] 問題文: # ../test/read.cgi/tech/1342966104/308の関数を用いて、1からuまでの乱数をN回発生させ、1から10までのそれぞれの数が発生した回数を数値および*の数で表し、さらに乱数の平均値も表示するプログラムを作成せよ。 # <出力例> # 1 :9回 : ********* # 2 :11回 : *********** # 3 :10回 : ********** # # 10 :5回 : ***** # 平均:5.54 # '1からuまでの乱数をN回発生させ、1から10までのそれぞれの数が発生した回数を数値および*の数で表し、さらに乱数の平均値も表示する'(_u,N) :- '1からuまでの乱数をN回発生させ'(_u,N,L), '1から10までのそれぞれの数が発生した回数を数値および*の数で表し'(L), 'さらに乱数の平均値も表示する'(L). '1からuまでの乱数をN回発生させ'(_u,N,L) :- findall(_1から_uまでの乱数,( between(1,N,_), _1から_uまでの乱数 is random(_u) + 1), L). '1から10までのそれぞれの数が発生した回数を数値および*の数で表し'(L,_度数を表す数値,_度数を表すグラフ) :- '1から10までの'(N), 'それぞれの数が発生した回数を'(L,_度数), '数値および*の数で表し'(_度数,_度数を表す数値,_度数を表すグラフ), writef('%t: %t回 %t\n',[_度数を表す数値,_度数を表すグラフ]), N = 10. '1から10までの'(N) :- between(1,10,N). 'それぞれの数が発生した回数を'(L,_度数) :- count(member(N,L),_度数). '数値および*の数で表し'(_度数,_度数を表す数値,_度数を表すグラフ) :- _度数 = _度数を表す数値, '度数を*で表す'(_度数,_度数を表すグラフ). '度数を*で表す'(_度数,_度数を表すグラフ) :- length(L,_度数), all(L,'*'), atomic_list_concat(L,_度数を表すグラフ). 'さらに乱数の平均値も表示する'(L) :- 相加平均(L,_平均値), writef('乱数の平均値: %t\n',[_平均値]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/308 # # [1] 授業単元:C言語プログラム演習 # [2] 問題文: # http://ime.nu/codepad.org/gSiVgqsJ # 上記の関数ransuuは、整数型の引数uを受け取ると1からuまでの乱数(1からuまでの中からでたらめに選んだ数)を返す。 # この関数を用いて、1から10までの乱数をN回発生させ、1から10までのそれぞれの数が発生した回数を数値で表示するプログラムを作成せよ。 # 但し、#define文でNを100回と設定せよ。 # <出力例> # 1 :9回 # 2 :11回 # 3 :10回 # # 10 :5回 # '1から10までの乱数をN回発生させ、1から10までのそれぞれの数が発生した回数を数値で表示する。但し、#define文でNを100回と設定せよ。 ' :- '但し、#define文でNを100回と設定せよ。', '1から10までの乱数をN回発生させ'(L), '1から10までのそれぞれの数が発生した回数を数値で表示する'(L). '但し、#define文でNを100回と設定せよ。' :- abolish(発生回数/1), asserta(発生回数(100)). '1から10までの乱数をN回発生させ'(L) :- 発生回数(N), '1からuまでの乱数をN回発生させ'(10,N,L). '1からuまでの乱数をN回発生させ'(_u,N,L) :- findall(_1から_uまでの乱数,( between(1,N,_), _1から_uまでの乱数 is random(_u) + 1), L). '1から10までのそれぞれの数が発生した回数を数値で表示する'(L) :- between(1,10,N), count(member(N,L),_度数), writef('%t: %t回\n',[N,_度数]), N = 10. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/243 # # [1] 授業単元:アルゴリズムとデータ構造 # [2] 問題文(含コード&リンク): # ・問 マルチキークイックソートを非再帰で実装せよ。 # マルチキークイックソートは文字列を辞書順にソートする手法である。 # 例えば、文字列appleを5回巡回し、5つの文字列を生成する。 # この5つの文字列を辞書順にソートすると、以下のようになる。 # # 巡回     ソート後 # apple apple # pplea  eappl # pleap  → leapp # leapp pleap # eappl pplea # # 実際には文字列appleを2倍にし巡回文字列を得る。 # 例 : appleapple # この文字列に対して非再帰のマルチキークイックソートを適用せよ。 # マルチキークイックソートは文字列を辞書順にソートする(_文字列,_辞書順に整列した文字列) :- マルチキークイックソートの整列対象文字列の生成(_文字列,_整列対象文字列ならび), 辞書順整列(_整列対象文字列ならび,_辞書順に整列した文字列). マルチキークイックソートの整列対象文字列の生成(_文字列,_整列対象文字列ならび) :- atom_chars(_文字列,_文字ならび), atom_length(_文字列,_n), findall(_回転した文字列,( between(1,_n,N), ならびの回転(左方向,N,L,_回転した文字ならび), atom_chars(_回転した文字列,_回転した文字ならび)), _整列対象文字列ならび). 辞書順整列([],[]). 辞書順整列([_軸要素文字列|_残り文字列],_辞書順に整列した文字列) :- 辞書順分割(_軸要素文字列,_残り文字列,_より小さい文字列,_等しいかより大きい文字列), 辞書順整列(_より小さい文字列,_整列したより小さい文字列), 辞書順整列(_等しいかより大きい文字列,_整列した等しいかより大きい文字列), append(_整列したより小さい文字列,[_軸要素文字列|_整列した等しいかより大きい文字列],_辞書順に整列した文字列). 辞書順分割(_軸要素文字列,[],[],[]). 辞書順分割(_軸要素文字列,[_文字列|R1],L1,L2) :- atom_chars(_軸文字列,_文字ならび_1), atom_chars(_文字列,_文字列ならび_2), 辞書順分割(_文字ならび_1,_文字ならび_2,L1,L2,R1,R2), 辞書順分割(_軸要素文字列,R1,R1,R2). 辞書順分割(_文字ならび_1,_文字ならび_2,L1,R2,R1,R2) :- 辞書順文字列の比較(_軸要素文字ならび_1,_文字ならび,_文字ならび,_), atom_chars(_文字列,_文字ならび), L1 = [_文字列|R1],!. 辞書順分割(_文字ならび_1,_文字ならび_2,R1,L2,R1,R2) :- 辞書順文字列の比較(_軸要素文字ならび_1,_文字ならび,_,_文字ならび), atom_chars(_文字列,_文字ならび), L2 = [_文字列|R2],!. 辞書順文字列の比較([],[],[],[]) :- !. 辞書順文字列の比較(L,[],[],L) :- !. 辞書順文字列の比較([],L,[],L) :- !. 辞書順文字列の比較([_文字|R1],[_文字|R2],[_文字|R3],[_文字|R4]) :- 辞書順文字列の比較(R1,R2,R3,R4),!. 辞書順文字列の比較([_文字_1|R1],[_文字_2|R2],[_文字_1|R1],[_文字_2|R2]) :- 英大文字(_文字_1), 英小文字(_文字_2), to_upper(_文字_2,_文字_1),!. 辞書順文字列の比較([_文字_1|R1],[_文字_2|R2],[_文字_2|R2],[_文字_1|R1]) :- 英小文字(_文字_1), 英大文字(_文字_2), to_upper(_文字_1,_文字_2),!. 辞書順文字列の比較([_文字_1|R1],[_文字_2|R2],[_文字_1|R1],[_文字_2|R2]) :- _文字_1 @< _文字_2,!. 辞書順文字列の比較([_文字_1|R1],[_文字_2|R2],[_文字_2|R2],[_文字_1|R1]) :- _文字_1 @>= _文字_2,!. 英小文字(_英小文字) :- _英小文字 @>= 'a', _英小文字 @=< 'z'. 英大文字(_英大文字) :- _英大文字 @>= 'A', _英大文字 @=< 'Z'. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/965 # # 休憩時間が設定されているときに、指定日時より'HH:MM'後の時刻を求めたいです。 # # ・データベース:PostgreSQL 8.4 # ・テーブル: # 休憩時間 # 開始時刻 終了時刻 # 08:00 08:30 # 19:00 19:30 # 22:00 22:30 # # 使うかどうかわかりませんが、次のマスタもあります。 # カレンダー # 日付 # ... # 2012-07-26 # 2012-07-27 # 2012-07-28 # ... # # ・説明 # 指定した日時から休憩時間を除いた'HH:MM'後を計算します。 # 計算結果が休憩時間内(開始終了時刻を含む)の場合は、休憩時間終了時刻を結果とします。 # # ・欲しい結果 # '2012-07-27 09:00'の'09:00'後 => '2012-07-27 18:00'(休憩時間がないのでそのまま足す) # '2012-07-27 09:00'の'10:00'後 => '2012-07-27 19:30'(10時間後は19:00の休憩と重なるので、19:30が答え) # '2012-07-27 09:00'の'11:00'後 => '2012-07-27 20:30' # '2012-07-27 09:00'の'13:00'後 => '2012-07-27 23:00'(19:00〜と22:00〜の二回の休憩を挟む) # # '指定した日時から休憩時間を除いたHH:MM後を計算します。計算結果が休憩時間内(開始終了時刻を含む)の場合は、休憩時間終了時刻を結果とします。'(_起点時刻,_時間後,_時間後の時刻) :- 休憩時間ならびと就業時間ならびを生成する(_休憩時間ならび,_就業時間ならび), 最初に一番間近な休憩時刻までの時間を時間後から差し引き起点をその休憩後時刻にずらす(_休憩時間ならび,_起点時刻,_時間後,_更新された起点時刻,_更新された時間後), 次の就業時間の始まりまでの間の就業時間を時間後から削っていく(_更新された起点時刻,_最後の休憩終了時刻,_更新された時間後,_就業時間ならび,_時間後の時刻). 休憩時間ならびと就業時間ならびを生成する(_就業時間ならび) :- findall([_開始時刻,_終了時刻],( 休憩時間(_開始時刻,_終了時刻)), _休憩時間ならび), 就業時間ならびを生成する(L,_就業時間ならび). 就業時間ならびを生成する([],[]). 就業時間ならびを生成する([[A,B],[C,D]|R1],[[B,C]|R2]) :- 就業時間ならびを生成する([[C,D]|R1],R2). 最初に一番間近な休憩時刻までの時間を時間後から差し引き起点をその休憩後時刻にずらす([],_起点時刻,_時間後,0,_時間後の時刻) :- _時間後の時刻 is _起点時刻 + _時間後,!. 最初に一番間近な休憩時刻までの時間を時間後から差し引き起点をその休憩後時刻にずらす([[_休憩起点時刻,_休憩終了時刻]|R1],_起点時刻,0,_時間後の時刻) :- _休憩起点時刻 @>= _起点時刻, 時間の引き算(_休憩起点時刻,_起点時刻,_休憩起点時刻までの時間), _休憩起点時刻までの時間 @>= _時間後, 時間の足し算(_起点時刻,_時間後,_時間後の時刻),!. 最初に一番間近な休憩時刻までの時間を時間後から差し引き起点をその休憩後時刻にずらす([[_休憩起点時刻,_休憩終了時刻]|R1],_起点時刻,_更新された時間後,_休憩終了時刻) :- _休憩起点時刻 @>= _起点時刻, 時間の引き算(_休憩起点時刻,_起点時刻,_休憩起点時刻までの時間), _休憩起点時刻までの時間 @< _時間後, 時間の引き算(_時間後,_休憩起点時刻までの時間,_更新された時間後),!. 最初に一番間近な休憩時刻までの時間を時間後から差し引き起点をその休憩後時刻にずらす([[_休憩起点時刻,_休憩終了時刻]|R1],_起点時刻,_時間後,_更新された時間後,_更新された時間後時刻) :- \+(_休憩起点時刻 @>= _起点時刻), 最初に一番間近な休憩時刻までの時間を時間後から差し引き起点をその休憩後時刻にずらす(R1,_起点時刻,_時間後,_更新された時間後,_更新された時間後時刻). 次の就業時間の始まりまでの間の就業時間を時間後から削っていく(_時間後の時刻,_,0,_,_時間後の時刻) :- !. 次の就業時間の始まりまでの間の就業時間を時間後から削っていく(_起点時刻,_,_時間後,[],_時間後の時刻) :- 時間の足し算(_起点時刻,_時間後,_時間後の時刻),!. 次の就業時間の始まりまでの間の就業時間を時間後から削っていく(_起点時刻,_,_時間後,[[A,B]|R1],_時間後の時刻) :- 時間の引き算(B,A,_次の就業時間枠), _時間後 @=< _次の就業時間枠, 時間の足し算(A,_時間後,_時間後の時刻),!. 次の就業時間の始まりまでの間の就業時間を時間後から削っていく(_起点時刻,_最後の休憩終了時刻,_時間後,[[A,B]],_時間後の時刻) :- 時間の引き算(B,A,_次の就業時間枠), 時間の引き算(_時間後,_次の就業時間枠,_更新された時間後), 時間の足し算(_最後の休憩終了時刻 +_時間後,_時間後の時刻),!. 次の就業時間の始まりまでの間の就業時間を時間後から削っていく(_起点時刻,_最後の休憩終了時刻,_時間後,[[A,B],[C,D]|R1],_時間後の時刻) :- 時間の引き算(B,A,_次の就業時間枠), 時間の引き算(_時間後,_次の就業時間枠,_更新された時間後), 時間の足し算(C,_時間後,_時間後の時刻),!. 時間の引き算(_時刻_1,_時刻_2,_時刻_3) :- '時刻から年・月・日・時・分を得る'(_時刻_1,_年_1,_月_1,_日_1,_時_1,_分_1), '時刻から年・月・日・時・分を得る'(_時刻_2,_年_2,_月_2,_日_2,_時_2,_分_2), 時間の引き算(_時刻_1,_年_1,_月_1,_日_1,_時_1,_分_1,_年_2,_月_2,_日_2,_時_2,_分_2,_年,_月,_日,_時,_分), atomic_list_concat([_年,-,_月,-,_日,' ',_時,':',_分],_時刻_3). 時間の足し算(_時刻_1,_時刻_2,_時刻_3) :- '時刻から年・月・日・時・分を得る'(_時刻_1,_年_1,_月_1,_日_1,_時_1,_分_1), '時刻から年・月・日・時・分を得る'(_時刻_2,_年_2,_月_2,_日_2,_時_2,_分_2), 時間の足し算(_時刻_1,_年_1,_月_1,_日_1,_時_1,_分_1,_年_2,_月_2,_日_2,_時_2,_分_2,_年,_月,_日,_時,_分), atomic_list_concat([_年,-,_月,-,_日,' ',_時,':',_分],_時刻_3). '時刻から年・月・日・時・分を得る'(_時刻,_年,_月,_日,_時,_分) :- split(_時刻,['-',':',' '],[_年,_月,_日,_時,_分]),!. 時間の足し算(_年_1,_月_1,_日_1,_時_1,_分_1,_年_2,_月_2,_日_2,_時_2,_分_2,_年,_月,_日,_時,_分) :- _年_3 is _年_1 + _年_2, _月_3 is _月_1 + _月_2, _日_3 is _日_1 + _日_2, _時_3 is _時_1 + _時_2, _分_3 is _分_1 + _分_2, 時間の補正(_年_3,_月_3,_日_3,_時_3,_分_3,_年,_月,_日,_時,_分). 時間の補正(_年_3,_月_3,_日_3,_時_3,_分_3,_年,_月,_日,_時,_分) :- _分_3 >= 60, _分_4 is _分_3 - 60, _時_4 is _時_3 + 1, 時間の補正(_年_3,_月_3,_日_3,_時_4,_分_4,_年,_月,_日,_時,_分),!. 時間の補正(_年_3,_月_3,_日_3,_時_3,_分_3,_年,_月,_日,_時,_分) :- _時_3 >= 24, _時_4 is _時_3 - 24, _日_4 is _日_3 + 1, 時間の補正(_年_3,_月_3,_日_4,_時_4,_分_3,_年,_月,_日,_時,_分),!. 時間の補正(_年_3,_月_3,_日_3,_時_3,_分_3,_年,_月,_日,_時,_分) :- 月末補正(_年_3,_月_3,_日_3,_月_4,_日_4), 時間の補正(_年_3,_月_4,_日_4,_時_3,_分_3,_年,_月,_日,_時,_分). 時間の補正(_年_3,_月_3,_日_3,_時_3,_分_3,_年,_月,_日,_時,_分) :- _月_3 > 12, _年_4 is _年_3 + 1, 時間の補正(_年_4,1,_日_3,_時_3,_分_3,_年,_月,_日,_時,_分),!. 時間の補正(_年,_月,_日,_時,_分,_年,_月,_日,_時,_分). 月末補正(_年_3,_月_3,_日_3,_月_4,_日_4) :- % 以下のサイトは ガウス法によるLU分解(_n,LL,LU,L,U) :- 解が生成される変数行列とその転置行列の生成(_n,LU,LU2), 転置(LL,LL2), ガウス法によるLU分解(LL,LL2,LU,LU2), 'LとUに分解'(LU,L,U),!. 解が生成される変数行列とその転置行列の生成(_n,LU,LU2) :- length(LU,_n), findall(L,( between(1,_n,_), length(L,_n)), LU), 転置(LU,LU2),!. ガウス法によるLU分解([],[],[],[]) :- !. ガウス法によるLU分解([[A|L1]|R1],[[A|L2]|R2],[[A|L3]|R3],[[A|L2]|R4]) :- '第一行は各列を隅要素(A)で割って置換する'(A,L1,L3), 第二行以下は次の対象矩形を生成する(L2,L3,R1,_次の対象矩形), '次の対象矩形の変数行列(第一行と第一列だけ段々に確定していく)'(R3,R4,R31,R41), 転置(_次の対象矩形,_転置された次の対象矩形), ガウス法によりLu分解(_次の対象矩形,_転置された次の対象矩形,R31,R41), '第一行は各列を隅要素(A)で割って置換する'(A,[],[]). '第一行は各列を隅要素(A)で割って置換する'(A,[A1|R1],[B1|R2]) :- 'A1をAで割る'(A,A1,B1), '第一行は各列を隅要素(A)で割って置換する'(A,R1,R2). 'A1をAで割る'(A,A1,B1) :- 行基本変形除算(A,1,A1,B1). 第二行以下は次の対象矩形を生成する([],_,[],[]) :- !. 第二行以下は次の対象矩形を生成する([A|R1],L2,[[_|L3]|R3],[L|R]) :- '各行の列を現在値(C)を基礎に第一列の値(A)と第一行の値(B)から書き換える'(A,L2,L3,L), 第二行以下は次の対象矩形を生成する(R1,L2,R3,R). '各行の列を現在値(C)を基礎に第一列の値(A)と第一行の値(B)から書き換える'(_,[],[],[]) :- !. '各行の列を現在値(C)を基礎に第一列の値(A)と第一行の値(B)から書き換える'(A,[B|R2],[C|R3],[D|R4]) :- 'D is C - A * B'(A,B,C,D), '各行の列を現在値(C)を基礎に第一列の値(A)と第一行の値(B)から書き換える'(A,R2,R3,R4). 'D is C - A * B'(A,B,C,D) :- 行基本変形乗算(A,B,V), 行基本変形減算(C,V,D),!. '次の対象矩形の変数行列(第一行と第一列だけ段々に確定していく)'([],[],[],[]). '次の対象矩形の変数行列(第一行と第一列だけ段々に確定していく)'([[_|L3]|R3],[[_|L4]|R4],[L3|R31],[L4|R41]) :- '次の対象矩形の変数行列(第一行と第一列だけ段々に確定していく)'(R3,R4,R31,R41). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'LとUに分解'(LU,L,U) :- 'Lに分解'(LU,L), 'Uに分解'(LU,U). 'Lに分解'(LU,LL) :- findall(L2,( member(L1,LU), append(L0,R,L1), \+(L0 = []), '残り要素Rをすべて0に置き換える'(L0,R,L2)), LL). '残り要素Rをすべて0に置き換える'(L0,R,L2) :- length(R,Len), length(R1,Len), all(R1,0), append(L0,R1,L2),!. 'Uに分解'(LU,UU) :- findall(L2,( member(L,LU), append(L0,L1,L), 'L0の全要素を0に置き換える'(L0,L1,L2)), UU). 'L0の全要素を0に置き換える'(L,L0,[A|R1],L2) :- length(L0,Len), length(L0_2,Len), all(L0_2,0), 'L1を先頭要素で割る'(L1,L1_2), append(L0_2,L1_2,L2),!. 'L1を先頭要素で割る'([_先頭要素|R1],[1|R2]) :- findall(M,( member(A,R1), 分数を含む除算(A,_先頭要素,M)), R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 行基本変形乗算(_乗数_1,_乗数_2,X) :- integer(_乗数_1), integer(_乗数_2), X is _乗数_1 * _乗数_2,!. 行基本変形乗算(_分子_1/_分母_1,_分子_2/_分母_2,X) :- _分子 is _分子_1 * _分子_2, _分母 is _分母_1 * _分母_2, 約分(_分子 / _分母,X),!. 行基本変形乗算(_分子/_分母,_乗数_2,X) :- A is _分子 * _乗数_2, 0 is A mod _分母, X is A // _分母,!. 行基本変形乗算(_乗数_1,_分子/_分母,X) :- atomic(_乗数_1), 行基本変形乗算(_分子/_分母,_乗数_1,X),!. 行基本変形乗算(_乗数_1,_乗数_2,X) :- X is _乗数_1 * _乗数_2,!. 行基本変形除算(A,_乗数,_除数,X) :- integer(A), integer(_乗数), integer(_除数), A2 is A * _乗数, 0 is A2 mod _除数, X is A * _乗数 // _除数,!. 行基本変形除算(A,_乗数,_除数,X) :- integer(A), integer(_乗数), integer(_除数), A2 is A * _乗数, \+(0 is A2 mod _除数), 約分(A2 / _除数,X),!. 行基本変形除算(A,_乗数,_除数,X) :- X is A * _乗数 / _除数. 行基本変形減算(A,B,C) :- atomic(A), atomic(B), C is A - B,!. 行基本変形減算(A1/A2,B1/B2,X) :- _分子 is A1 * B1, _分母 is A2 * B2, 約分(_分子 / _分母,X),!. 行基本変形減算(A1/A2,B1/B2,X) :- _分子 is A1 * B2 - B1 * A2, _分母 is A2 * B2, 約分(_分子 / _分母,X),!. 行基本変形減算(A1/A2,B,X) :- atomic(B), _分子 is A1 - A2 * B, _分母 is A2, 約分(_分子 / _分母,X),!. 行基本変形減算(B,A1/A2,X) :- 行基本変形減算(A1/A2,B,X),!. 行基本変形減算(A,B,X) :- X is A - B. 約分(B / A,X) :- 最大公約数(B,A,C), _分子 is B // C, _分母 is A // C, 約分の二(_分子,_分母,X),!. 約分の二(_分子,1,_分子) :- !. 約分の二(_分子,1.0,_分子) :- !. 約分の二(_分子,_分母,_分子 / _分母). 最大公約数(M,N,X) :- 最大公約数をユークリッドの互除法で求める(M,N,X),!. 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/73 # # [1] 授業単元:C言語演習 # [2] 問題文: # 以下の実験データは、あるコンピュータAのメッセージ発生時刻と、そのメッセージが宛先コンピュータBに到着した時刻である。 # 以下のリストの< >の処理をコメントに従って埋め、メッセージ毎の転送時間を出力するプログラムを作成せよ。 # 但し、メッセージ転送時間は、メッセージ発生時刻との差である。 # <実験データ> # メッセージ番号 発生時刻[ミリ秒] 到着時刻[ミリ秒] # 0        0         25 # 1        5         30 # 2        10         38 # 3        15         50 # 4        20         52 # 5        25         55 # 6        30         57 # 7        35         60 # 8        40         65 # 9        45         70 # <リスト> # http://ime.nu/ime.nu/codepad.org/PW5VddGM # # #include # struct MESSAGE # { # int gene; # int end; # int delay; # }; # # void delay(struct MESSAGE data[], int i); # # int main(void) # { # struct MESSAGE data[10]; int i; # //<メッセージの発生時刻と到着時刻の値の代入> # for (i=0; i<=9; i++) # { # delay(data, i); # prinff("メッセージ%dの転送時間は%dミリ秒 \n",i, data[i].delay); # } # } # # void delay(struct MESSAGE data[], int i) # { # //<メッセージiの転送時間の計算> # } 実験データ(0,0,25,_). 実験データ(1,5,30,_). 実験データ(2,10,38,_). 実験データ(3,15,50,_). 実験データ(4,20,52,_). 実験データ(5,25,55,_). 実験データ(6,30,57,_). 実験データ(7,35,60,_). 実験データ(8,40,65,_). 実験データ(9,45,70,_). '以下の実験データは、あるコンピュータAのメッセージ発生時刻と、そのメッセージが宛先コンピュータBに到着した時刻である。メッセージ毎の転送時間を出力する' :- 実験データの転送時間を更新(_メッセージ番号,_転送時間), writef('メッセージ番号%tの転送時間は%t\n',[_メッセージ番号,_転送時間]), fail. '以下の実験データは、あるコンピュータAのメッセージ発生時刻と、そのメッセージが宛先コンピュータBに到着した時刻である。メッセージ毎の転送時間を出力する'. 実験データの転送時間を更新(_メッセージ番号,_転送時間) :- retract(実験データ(_メッセージ番号,_発生時刻,_到着時刻,_)), _転送時間 is _到着時刻 - _発生時刻, assertz(実験データ(_メッセージ番号,_発生時刻,_到着時刻,_転送時間)). % dynamic宣言を行わないretract/assertz % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/71 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # http://ime.nu/ideone.com/TO8Kg 問題です。 # http://ime.nu/ideone.com/ZvUuR 課題を提出したら関数の定義 #              をしろといわれました。 # http://ime.nu/ideone.com/Nd5ir 自分なりにやったのですが #              ここからができませんでしたので #              よろしくお願いします。 # # 生徒の氏名と身長と体重を列挙したデータファイル wh-list.dat がある。このデータを読み込んでBMI値を計算し、BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙するプログラムkadai12.c を書きなさい。ただしファイル名は画面から入力されるものとする(scanf()を使う)。 # ただし、wh-list.datに列挙される人数はプログラム開発時点では全く分からないものとする。 # # ヒント: # ○何をしなければならないかを大まかに書き下してみよう。 #  1. ファイルのオープン(これに先立ってファイル名を取得する必要がある) #  2. データ構造の用意(これにはファイルにかかれたデータ数を知る必要がありますね。どうやって知るべきか考えよう) #  3.データの読み込み #  4.BMIの算出 #  5. BMIの大きい者順に並べ替える(バブルソートを使おう。これが何者か知らない人は「バブルソート」で検索されたい) #  6. 画面表示 # # ○BMIとは? # BMIは次のようにして計算されるものとする。 # BMI値=体重(キログラム)/(身長(メートル))^2 # '^2'は二乗を意味する。 # このBMI値が25を越えると、肥満とみなされる。 # # ○ファイルポインターがファイルの中間もしくは終わりをさしている時、これをファイルの先頭に戻す関数があります。 '生徒の氏名と身長と体重を列挙したデータファイルがある。このデータを読み込んでBMI値を計算し、BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙する。ただしファイル名は画面から入力されるものとする。' :- '生徒の氏名と身長と体重を列挙したデータファイルがある。このデータを読み込んで'(LL), 'BMI値を計算し'(LL,LL1), 'BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙する。'(LL1). '生徒の氏名と身長と体重を列挙したデータファイルがある。このデータを読み込んで'(LL) :- write('データファイル名を入力してください : '), get_line(_データファイル名), get_split_lines(_データファイル名,[' ',','],LL). 'BMI値を計算し'(LL1,LL2) :- findall([_BMI値,_氏名],( member([_氏名,_身長,_体重],LL1), 'BMIは次のようにして計算されるものとする。BMI値=体重(キログラム)/(身長(メートル))^2 '(_体重,_身長,_BMI値)), LL2). /* 'BMI値を計算し'([],[]). 'BMI値を計算し'([[_氏名,_身長,_体重]|R1],[[_BMI値,_氏名]|R2]) :- 'BMIは次のようにして計算されるものとする。BMI値=体重(キログラム)/(身長(メートル))^2 '(_体重,_身長,_BMI値), 'BMI値を計算し'(R1,R2). */ 'BMIは次のようにして計算されるものとする。BMI値=体重(キログラム)/(身長(メートル))^2 '(_体重,_身長,_BMI値) :- _BMI値 is _体重 / _身長 ^ 2. 'BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙する。'(LL1) :- 'BMI値が大きいもの順に'(LL1,LL3), その人のBMI値および肥満か否かを列挙する(LL3). 'BMI値が大きいもの順に'(LL1,LL3) :- sort(LL1,LL2), reverse(LL2,LL3). その人のBMI値および肥満か否かを列挙する(LL3) :- append(_,[[_BMI値,_氏名]|R],LL3), 'このBMI値が25を越えると、肥満とみなされる。'(_BMI値,_肥満判定), writef('%t は %t。\n',[_氏名,_肥満判定]), R = []. 'このBMI値が25を越えると、肥満とみなされる。'(_BMI値,肥満です) :- _BMI値 > 25.0,!. 'このBMI値が25を越えると、肥満とみなされる。'(_,肥満ではない). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/63 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # http://ime.nu/s2.muryo-de.mydns.jp/~c_cpp_homework/cgi-bin/joyful/img/371.txt # #include # int main(){ # int a[4][3]={ # {3,5,3}, # {4,3,5}, # {2,2,3}, # {1,8,7} # }; # # int b[4],x,y; # # for(y=0;y<=3;y++){ # b[y]=0; # for(x=0;x<=2;x++){ # b[y] += a[y][x]; # } # } # # for(y=0;y<=3;y++){ # printf("%d\n",b[y]); # } # } # 上のコードは、配列a[4][3]の各行の合計を求め、配列b[4]に保存し、求めた値を出力するプログラムです。 # これを改造して次のプログラムを作成せよ。 # # ・配列a[4][3]の各行において、その合計の昇順に行を並び替え、配列 c[4][3]に保存し、出力しなさい。 # ただし、各行の合計の値が等しいものがあった場合、行番号が小さいものを小さい順番にする。 # # '行列の各行において、その合計の昇順に行を並び替え、出力しなさい。ただし、各行の合計の値が等しいものがあった場合、行番号が小さいものを小さい順番にする。'(_行列,_行合計で整列した行列) :- 'その合計の昇順に行を並び替え'(_行列,_行合計で整列した行列), 出力しなさい(_行合計で整列した行列). 'その合計の昇順に行を並び替え'(_行列,_行合計で整列した行列) :- findsort([_行合計,_行番号],( nth1(_行番号,_行列,_行), sum(_行,_行合計)), _行合計で整列した行列). 出力しなさい(_行合計で整列した行列) :- 表示形式文字列の生成(_行合計で整列した行列,_表示形式文字列), append(_,[[_行合計,_行番号]|_残り行],_行合計で整列した行列), nth1(_行番号,_行列,_行), writef(_表示形式文字列,_行), _残り行 = []. 表示形式文字列の生成(_行合計で整列した行列,_表示形式文字列) :- nth1(1,_行合計で整列した行列,_行), length(_行,_列数), findall('%t',between(1,_列数,_),L), atomic_list_concat(L,',',S), atomic_list_concat(['| ',S,' |\n'],_表示形式文字列). findsort(_射影項,_目標,_整列した射影項ならび) :- findall(_射影項,_目標,_射影項ならび), sort(_射影項ならび,_整列した射影項ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/46 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):次のプログラムを一つ一つ手順を追って説明せよ。 # http://ime.nu/codepad.org/iARWUPGk # # #include # #include # # #define BIRDTHDAY_SIZE (3) # #define BOOKSIZE (128) # # struct addressSheet { # char *name; # int group; # char *phone; # char *address; # int birthday[BIRDTHDAY_SIZE]; /* 年月日 */ # }; # # #define NUM (4) # struct addressSheet addressBook[BOOKSIZE] = { # {"Mary", 2, "075-123-1232", "Aneyakouji, Shimogyo", {1983, 12, 1}}, # {"John", 1, "075-123-2135", "Rokkaku, Shimogyo", {1978, 5, 17}}, # {"Tom", 3, "075-123-1234", "Takoyakushi, Shimogyo", {1980, 1, 15}}, # {"Sam", 1, "075-321-2214", "Nishiki, Shimogyo", {1979, 6, 25}}, # }; # # void sortByName(struct addressSheet *, int); # int findMin(struct addressSheet *, int, int); # void swap(struct addressSheet *, int, int); # int compare(struct addressSheet *, struct addressSheet *); # void printSheet(struct addressSheet *); # # int main(void) # { # int i; # # sortByName(addressBook, 4); # # for (i=0; iname, q->name)); # } # # void swap(struct addressSheet ary[], int i, int j) # { # struct addressSheet tmp; /* データの待避先 */ # # tmp = ary[i]; # ary[i] = ary[j]; # ary[j] = tmp; # # return; # } # # void printSheet(struct addressSheet *sheet) # { # printf("Name:\t%s\n", sheet->name); # printf("Group:\t%d\n", sheet->group); # printf("Tel:\t%s\n", sheet->phone); # printf("Address:\t%s\n", sheet->address); # printf("Birthday:\t%d/%d/%d\n", sheet->birthday[0], sheet->birthday[1], sheet->birthday[2]); # # return; # } 住所録(毬,2,'075-123-1232','姉屋小路,下京', 1983/12/1). 住所録(慈恩,2,'075-123-2135','六角,下京', 1978/5/17). 住所録(富武,3,'075-123-1234','凧薬師,下京',1980/1/15). 住所録(佐武,1,'075-321-2214','西区,下京',1979/6/25). テーブル定義(住所録,1,名前). テーブル定義(住所録,2,所属). テーブル定義(住所録,3,電話番号). テーブル定義(住所録,4,住所). テーブル定義(住所録,5,生年月日). 名前順に整列(_名前順に整列した住所録) :- 名前を鍵として副目標を生成する(_副目標,_鍵,L1), findall([_鍵|L1],( call(_副目標)), LL1), 名前を鍵に整列して取り出す(LL1,_名前順に整列した住所録). 名前を鍵として副目標を生成する(_副目標,_鍵,L) :- findall(_,( テーブル定義(住所録,_,_)), L), _副目標 =.. [住所録|L], テーブル定義(住所録,N,名前), nth1(N,L,_鍵). 名前を鍵に整列して取り出す(LL1,_名前順に整列した住所録) :- sort(LL1,LL2), 鍵を取り除く(LL2,_名前順に整列した住所録). 鍵を取り除く(LL2,_名前順に整列した住所録) :- findall(L,( member([_|L],LL2)), _名前順に整列した住所録). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/46 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):次のプログラムを一つ一つ手順を追って説明せよ。 # http://ime.nu/codepad.org/iARWUPGk # # #include # #include # # #define BIRDTHDAY_SIZE (3) # #define BOOKSIZE (128) # # struct addressSheet { # char *name; # int group; # char *phone; # char *address; # int birthday[BIRDTHDAY_SIZE]; /* 年月日 */ # }; # # #define NUM (4) # struct addressSheet addressBook[BOOKSIZE] = { # {"Mary", 2, "075-123-1232", "Aneyakouji, Shimogyo", {1983, 12, 1}}, # {"John", 1, "075-123-2135", "Rokkaku, Shimogyo", {1978, 5, 17}}, # {"Tom", 3, "075-123-1234", "Takoyakushi, Shimogyo", {1980, 1, 15}}, # {"Sam", 1, "075-321-2214", "Nishiki, Shimogyo", {1979, 6, 25}}, # }; # # void sortByName(struct addressSheet *, int); # int findMin(struct addressSheet *, int, int); # void swap(struct addressSheet *, int, int); # int compare(struct addressSheet *, struct addressSheet *); # void printSheet(struct addressSheet *); # # int main(void) # { # int i; # # sortByName(addressBook, 4); # # for (i=0; iname, q->name)); # } # # void swap(struct addressSheet ary[], int i, int j) # { # struct addressSheet tmp; /* データの待避先 */ # # tmp = ary[i]; # ary[i] = ary[j]; # ary[j] = tmp; # # return; # } # # void printSheet(struct addressSheet *sheet) # { # printf("Name:\t%s\n", sheet->name); # printf("Group:\t%d\n", sheet->group); # printf("Tel:\t%s\n", sheet->phone); # printf("Address:\t%s\n", sheet->address); # printf("Birthday:\t%d/%d/%d\n", sheet->birthday[0], sheet->birthday[1], sheet->birthday[2]); # # return; # } 住所録(毬,2,'075-123-1232','姉屋小路,下京', 1983/12/1). 住所録(慈恩,2,'075-123-2135','六角,下京', 1978/5/17). 住所録(富武,3,'075-123-1234','凧薬師,下京',1980/1/15). 住所録(佐武,1,'075-321-2214','西区,下京',1979/6/25). テーブル定義(住所録,1,名前). テーブル定義(住所録,2,所属). テーブル定義(住所録,3,電話番号). テーブル定義(住所録,4,住所). テーブル定義(住所録,5,生年月日). 名前順に整列(_名前順に整列した住所録) :- 名前を鍵として副目標を生成する(_副目標,_鍵,L1), findall([_鍵|L1],( call(_副目標)), LL1), 名前を鍵に整列して取り出す(LL1,_名前順に整列した住所録). 名前を鍵として副目標を生成する(_副目標,_鍵,L) :- findall(_,( テーブル定義(住所録,_,_)), L), _副目標 =.. [住所録|L], テーブル定義(住所録,N,名前), nth1(N,L,_鍵). 名前を鍵に整列して取り出す(LL1,_名前順に整列した住所録) :- sort(LL1,LL2), 鍵を取り除く(LL2,_名前順に整列した住所録). 鍵を取り除く(LL2,_名前順に整列した住所録) :- findall(L,( member([_|L],LL2)), _名前順に整列した住所録). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/46 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):次のプログラムを一つ一つ手順を追って説明せよ。 # http://ime.nu/codepad.org/iARWUPGk # # #include # #include # # #define BIRDTHDAY_SIZE (3) # #define BOOKSIZE (128) # # struct addressSheet { # char *name; # int group; # char *phone; # char *address; # int birthday[BIRDTHDAY_SIZE]; /* 年月日 */ # }; # # #define NUM (4) # struct addressSheet addressBook[BOOKSIZE] = { # {"Mary", 2, "075-123-1232", "Aneyakouji, Shimogyo", {1983, 12, 1}}, # {"John", 1, "075-123-2135", "Rokkaku, Shimogyo", {1978, 5, 17}}, # {"Tom", 3, "075-123-1234", "Takoyakushi, Shimogyo", {1980, 1, 15}}, # {"Sam", 1, "075-321-2214", "Nishiki, Shimogyo", {1979, 6, 25}}, # }; # # void sortByName(struct addressSheet *, int); # int findMin(struct addressSheet *, int, int); # void swap(struct addressSheet *, int, int); # int compare(struct addressSheet *, struct addressSheet *); # void printSheet(struct addressSheet *); # # int main(void) # { # int i; # # sortByName(addressBook, 4); # # for (i=0; iname, q->name)); # } # # void swap(struct addressSheet ary[], int i, int j) # { # struct addressSheet tmp; /* データの待避先 */ # # tmp = ary[i]; # ary[i] = ary[j]; # ary[j] = tmp; # # return; # } # # void printSheet(struct addressSheet *sheet) # { # printf("Name:\t%s\n", sheet->name); # printf("Group:\t%d\n", sheet->group); # printf("Tel:\t%s\n", sheet->phone); # printf("Address:\t%s\n", sheet->address); # printf("Birthday:\t%d/%d/%d\n", sheet->birthday[0], sheet->birthday[1], sheet->birthday[2]); # # return; # } 住所録(毬,2,'075-123-1232','姉屋小路,下京', 1983/12/1). 住所録(慈恩,2,'075-123-2135','六角,下京', 1978/5/17). 住所録(富武,3,'075-123-1234','凧薬師,下京',1980/1/15). 住所録(佐武,1,'075-321-2214','西区,下京',1979/6/25). テーブル定義(住所録,1,名前). テーブル定義(住所録,2,所属). テーブル定義(住所録,3,電話番号). テーブル定義(住所録,4,住所). テーブル定義(住所録,5,生年月日). 名前順に整列(_名前順に整列した住所録) :- 名前を鍵として副目標を生成する(_副目標,_鍵,L1), findall([_鍵|L1],( call(_副目標)), LL1), 名前を鍵に整列して取り出す(LL1,_名前順に整列した住所録). 名前を鍵として副目標を生成する(_副目標,_鍵,L) :- findall(_,( テーブル定義(住所録,_,_)), L), _副目標 =.. [住所録|L], テーブル定義(住所録,N,名前), nth1(N,L,_鍵). 名前を鍵に整列して取り出す(LL1,_名前順に整列した住所録) :- sort(LL1,LL2), 鍵を取り除く(LL2,_名前順に整列した住所録). 鍵を取り除く(LL2,_名前順に整列した住所録) :- findall(L,( member([_|L],LL2)), _名前順に整列した住所録). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/978 # # [1] 授業単元:C言語演習 # [2] 問題文: # ../test/read.cgi/tech/1339338438/976のプログラムを修正して、メッセージ転送時間の平均値を計算するaverage関数を追加し、main関数側で平均メッセージ転送時間も出力するようにせよ。 # '実験データは、あるコンピュータAのメッセージ発生時刻と、そのメッセージが宛先コンピュータBに到着した時刻である。メッセージの転送時間の平均値を出力する'(_実験データファイル) :- 実験データは(_実験データファイル,_実験データ行ならび), 'あるコンピュータAのメッセージ発生時刻と、そのメッセージが宛先コンピュータBに到着した時刻である。メッセージ毎の転送時間を出力する'(_実験データ行ならび). 実験データは(_実験データファイル,_実験データ行ならび) :- get_split_lines(_実験データファイル,_実験データ行ならび). 'あるコンピュータAのメッセージ発生時刻と、そのメッセージが宛先コンピュータBに到着した時刻である。メッセージの転送時間の平均値を出力する'(_実験データ行ならび) :- findavg(_転送時間,( member(_行文字列,_実験データ行ならび), メッセージ毎の転送時間(_行文字列,_メッセージの転送時間)), _転送時間の平均値), writef('転送時間の平均値は %t 秒です\n',[_転送時間の平均値]). メッセージ毎の転送時間(_行文字列,_メッセージの転送時間) :- split(_行文字列,[' '],[_メッセージ番号,_メッセージの発生時刻,_メッセージの到達時刻]), _メッセージの転送時間 is _メッセージの到達時刻 - _メッセージの発生時刻. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/976 # # [1] 授業単元:C言語演習 # [2] 問題文: # 以下の実験データは、あるコンピュータAのメッセージ発生時刻と、そのメッセージが宛先コンピュータBに到着した時刻である。 # 以下のリストの< >の処理をコメントに従って埋め、メッセージ毎の転送時間を出力するプログラムを作成せよ。 # 但し、メッセージ転送時間は、メッセージ発生時刻との差である。 # <実験データ> # メッセージ番号 発生時刻[ミリ秒] 到着時刻[ミリ秒] # 0        0         25 # 1        5         30 # 2        10         38 # 3        15         50 # 4        20         52 # 5        25         55 # 6        30         57 # 7        35         60 # 8        40         65 # 9        45         70 # <リスト> # http://ime.nu/codepad.org/PW5VddGM # #include # struct MESSAGE # { # int gene; # int end; # int delay; # }; # # void delay(struct MESSAGE data[], int i); # # int main(void) # { # struct MESSAGE data[10]; int i; # //<メッセージの発生時刻と到着時刻の値の代入> # for (i=0; i<=9; i++) # { # delay(data, i); # prinff("メッセージ%dの転送時間は%dミリ秒 \n",i, data[i].delay); # } # } # # void delay(struct MESSAGE data[], int i) # { # //<メッセージiの転送時間の計算> # } # '実験データは、あるコンピュータAのメッセージ発生時刻と、そのメッセージが宛先コンピュータBに到着した時刻である。メッセージ毎の転送時間を出力する'(_実験データファイル) :- 実験データは(_実験データファイル,_実験データ行ならび), 'あるコンピュータAのメッセージ発生時刻と、そのメッセージが宛先コンピュータBに到着した時刻である。メッセージ毎の転送時間を出力する'(_実験データ行ならび). 実験データは(_実験データファイル,_実験データ行ならび) :- get_split_lines(_実験データファイル,_実験データ行ならび). 'あるコンピュータAのメッセージ発生時刻と、そのメッセージが宛先コンピュータBに到着した時刻である。メッセージ毎の転送時間を出力する'(_実験データ行ならび) :- append(_,[_行文字列|R],_実験データ行ならび), メッセージ毎の転送時間を(_行文字列,_メッセージ番号,_メッセージの転送時間), writef('%t %t\n',[_メッセージ番号,_転送時間]), R = []. メッセージ毎の転送時間を(_行文字列,_メッセージ番号,_メッセージの転送時間) :- split(_行文字列,[' '],[_メッセージ番号,_メッセージの発生時刻,_メッセージの到達時刻]), _メッセージの転送時間 is _メッセージの到達時刻 - _メッセージの発生時刻. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/935 # # [1] 授業単元:C言語演習 # [2] 問題文: # 学生の英語、国語、数学の合計の得点データを処理するために、次のようなデータ型と名前のメンバを持つ構造体を考える。 #  氏名 : 文字型 name[20] #  英語得点 : 整数型 eigo #  国語得点 : 整数型 kokugo #  数学 : 整数型 sugaku # SCORE型の構造体配列data[5]を宣言せよ。 # そしてキーボードから5人分のデータ(番号、氏名、各教科の得点)を入力すると、最高得点の学生の氏名とその得点を英語、国語、数学の各教科毎に出力するプログラムを作成せよ。 # <データ例> # 番号 氏名 英語得点 国語得点 数学得点 # 1  nakashima 75   70    75 # 2  takada  85   65    70 # 3  arita   80   80    80 # 4  shimane  65   75    55 # 5  hirakata 70   77    90 # <出力例> # 英語 takada 85 # 国語 arita 80 # 数学 hirakata 90 # 'キーボードから5人分のデータ(番号、氏名、各教科の得点)を入力すると、最高得点の学生の氏名とその得点を英語、国語、数学の各教科毎に出力する' :- length(Ln,5), 'キーボードから5人分のデータ(番号、氏名、各教科の得点)を入力すると'(Ln), '最高得点の学生の氏名とその得点を英語、国語、数学の各教科毎に出力する'. 'キーボードから5人分のデータ(番号、氏名、各教科の得点)を入力すると'([]). 'キーボードから5人分のデータ(番号、氏名、各教科の得点)を入力すると'([_|Ln]) :- 'データ(番号、氏名、各教科の得点)を入力すると', 'キーボードから5人分のデータ(番号、氏名、各教科の得点)を入力すると'(Ln). 'データ(番号、氏名、各教科の得点)を入力すると' :- 変数XXを得る(XX), 整数を得る(番号,_番号), 氏名を得る(_氏名), 各教科の得点を得る(_英語の得点,_国語の得点,_数学の得点), 成績を定義する(XX,_番号,_氏名,_英語の得点,_国語の得点,_数学の得点). 氏名を得る(_氏名) :- write('氏名 : '), get_line(_氏名). 各教科の得点を得る(_英語の得点,_国語の得点,_数学の得点) :- 整数を得る(英語得点,_英語得点), 整数を得る(国語得点,_国語得点), 整数を得る(数学得点,_数学得点). '最高得点の学生の氏名とその得点を英語、国語、数学の各教科毎に出力する' :- append(_,[_教科|R],[英語,国語,数学]), 教科の最高得点を得る(_教科,_氏名,_最高得点), writef('%t の最高得点者は %t 得点は %t\n',[_教科,_氏名,_最高得点]). R = []. 成績を定義する(XX,_番号,_氏名,_英語得点,_国語得点,_数学得点) :- assertz(成績(_XX,番号,_番号)), assertz(成績(_XX,氏名,_氏名)), assertz(成績(_XX,英語,_英語得点)), assertz(成績(_XX,国語,_国語得点)), assertz(成績(_XX,数学,_数学得点)),!. 教科の最高得点を得る(_教科,_氏名,_最高得点) :- findmax([_得点,_氏名],( 成績(XX,_教科,_得点), 成績(XX,氏名,_氏名)), _最高得点). 変数xxを得る(_XX) :- N is random(99999999) + 1, 整数から文字列(8,N,A), atomic_list_concat([x,A],_XX), \+(成績(_XX,番号,_)),!. 変数xxを得る(_XX) :- 変数xxを得る(_XX). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/924 # # [1] 授業単元:C言語 # [2] 問題文: # 学生の英語、国語、数学の合計の得点データを処理するために、次のようなデータ型と名前のメンバを持つSCORE型構造体を考える。 # 学籍番号:整数型 number # 氏名:文字型 name[20] # 英語得点:整数型 eigo # 国語得点:整数型 kokugo # 数学得点:整数型 sugaku # 合計得点:整数型 goukei # SCORE型の2つの構造体変数x1,x2を宣言せよ。 # そしてキーボードから番号、氏名、各教科の得点を入力すると英語、国語、数学の3教科の合計点が計算され、合計点の高い方の学生の氏名と合計点が出力されるプログラムを作成せよ。 # <データ例> # 変数 番号 氏名 英語得点 国語得点 数学得点 # x1  1  nakashima 75  80    75 # x2  2  takada  77   82    70 # <出力列> # nakashima 230 # 'キーボードから番号、氏名、各教科の得点を入力すると英語、国語、数学の3教科の合計点が計算され、合計点の高い方の学生の氏名と合計点が出力される' :- 'キーボードから番号、氏名、各教科の得点を入力すると', '英語、国語、数学の3教科の合計点が計算され'(_合計点_番号ならび), '合計点の高い方の学生の氏名と合計点が出力される'(_合計点_番号ならび). 'キーボードから番号、氏名、各教科の得点を入力すると' :- 一人分の成績を定義する, 'キーボードから番号、氏名、各教科の得点を入力すると'. 'キーボードから番号、氏名、各教科の得点を入力すると'. 一人分の成績を定義する :- 番号を得る(_番号), 氏名を得る(_氏名), 各教科の得点を得る(_英語得点,_国語得点,_数学得点), 成績を定義する(_番号,_氏名,_英語得点,_国語得点,_数学得点). 番号を得る(_番号) :- 整数を得る(番号,_番号),!, \+(_番号==0). 氏名を得る(_氏名) :- write('氏名を入力してください : '), get_line(_氏名). 各教科の得点を得る(_英語得点,_国語得点,_数学得点) :- 整数を得る(英語得点,_英語得点), 整数を得る(国語得点,_国語得点), 整数を得る(数学得点,_数学得点). 成績を定義する(_番号,_氏名,_英語得点,_国語得点,_数学得点) :- 変数xxを得る(_XX), 成績を定義する(XX,_番号,_氏名,_英語得点,_国語得点,_数学得点). 成績を定義する(XX,_番号,_氏名,_英語得点,_国語得点,_数学得点) :- assertz(成績(_XX,番号,_番号)), assertz(成績(_XX,氏名,_氏名)), assertz(成績(_XX,英語成績,_英語成績)), assertz(成績(_XX,国語成績,_国語成績)), assertz(成績(_XX,数学成績,_数学成績)),!. 変数xxを得る(_XX) :- N is random(99999999) + 1, 整数から文字列(8,N,A), atomic_list_concat([x,A],_XX), \+(成績(_XX,番号,_)),!. 変数xxを得る(_XX) :- 変数xxを得る(_XX). '英語、国語、数学の3教科の合計点が計算され'(_合計点_変数番号ならび) :- findsetof(_XX,( 成績(_XX,番号,_)), _XXならび), findall([_合計点,_XX],( member(_XX,_XXならび), 合計点を計算する(_XX,_合計点)), _合計点_変数番号ならび). 合計点を計算する(_XX,_合計点) :- 成績(_XX,英語成績,_英語成績), 成績(_XX,国語成績,_国語成績), 成績(_XX,数学成績,_数学成績), _合計点 is _英語成績 + _国語成績 + _数学成績. '合計点の高い方の学生の氏名と合計点が出力される'(_合計点_番号ならび) :- sort(_合計点_番号ならび,_整列された合計点_番号ならび), reverse(_整列された合計点_番号ならび,_降順に整列された合計点_番号ならび), _整列された合計点_番号ならび = [[_合計点,_XX]|_], 成績(_XX,氏名,_氏名), writef('合計点が高い方は %t で合計点 %t 点です。\n',[_氏名,_合計点]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/242 # # 【課題】http://www.dotup.org/uploda/www.dotup.org3205225.txt.html # 【形態】1. Javaアプリケーション(main()で開始) # 【GUI】4. 制限なし # 【期限】提出期限:7月18日 20時まで # 【Ver】java version "1.7.0_03 # よろしくお願いします。 # # # # 1.線分オブジェクトを定義 # # 二点 (Point) を両端とする線分 (LineSegment) のクラスを定義する # # a1. フィールド : (Point型) p1, p2 # LineSegment オブジェクトを生成した直後では, # p1, p2 フィールドは null であることに注意 # a2. 線分の長さを得るメソッド getLength() を定義する。 # 引数無し,戻り値の型はdouble # # # 2.長方形オブジェクトを定義 # # 左上隅と右下隅の二点 (Point) で与えられる長方形 (Rectangle) のクラスを定義する # # フィールド : (Point型) top_left, bottom_right # 次のメソッドを定義し,実行する。 # # a: 面積を求める double getArea() # # b: 周囲の長さを求める int getPerimeter() # # c: ある点が内部に含まれるかどうかを調べる # boolean isAround(Point p) # # 複数課題で申し訳ありませんがよろしくお願いします。 線分の定義(_識別子,_X座標_1,_Y座標_1,_X座標_2,_Y座標_2) :- assertz(線分(_識別子,X座標_1,_X座標_1)), assertz(線分(_識別子,Y座標_1,_Y座標_1)), assertz(線分(_識別子,X座標_2,_X座標_2)), assertz(線分(_識別子,Y座標_2,_Y座標_2)). 線分の長さを得る(_識別子,_線分の長さ) :- 二つの端点の座標を得る(_識別子,_X座標_1,_Y座標_1,_X座標_2,_Y座標_2), _線分の長さ is sqrt((_X座標_2-_X座標_1) * (_X座標_2-_X座標_1) + (_Y座標_2-_Y座標_1) * (_Y座標_2-_Y座標_1)). 二つの端点の座標を得る(_識別子,_X座標_1,_Y座標_1,_X座標_2,_Y座標_2) :- 線分(_識別子,X座標_1,_X座標_1), 線分(_識別子,Y座標_1,_Y座標_1), 線分(_識別子,X座標_2,_X座標_2), 線分(_識別子,Y座標_2,_Y座標_2). 長方形の定義(_識別子,_左上隅のX座標,_左上隅のY座標,_右下隅のX座標,_右下隅のY座標) :- assertz(長方形(_識別子,左上隅のX座標,_左上隅のX座標)), assertz(長方形(_識別子,左上隅のX座標,_左上隅のY座標)), assertz(長方形(_識別子,右下隅のX座標,_右下隅のX座標)), assertz(長方形(_識別子,右下隅のX座標,_右下隅のY座標)). 長方形の面積を求める(_識別子,_長方形の面積) :- 左上隅と右下隅の座標を得る(_識別子,_左上隅のX座標,_左上隅のY座標,_右下隅のX座標,_右下隅のY座標), _長方形の面積 is abs(_右下隅のX座標-_左上隅のX座標) * abs(_右下隅のY座標-_左上隅のY座標). 左上隅と右下隅の座標を得る(_識別子,_左上隅のX座標,_左上隅のY座標,_右下隅のX座標,_右下隅のY座標) :- 長方形(_識別子,左上隅のX座標,_左上隅のX座標), 長方形(_識別子,左上隅のX座標,_左上隅のY座標), 長方形(_識別子,右下隅のX座標,_右下隅のX座標), 長方形(_識別子,右下隅のX座標,_右下隅のY座標). 周囲の長さを求める(_識別子,_周囲の長さ) :- 辺の長さを得る(_識別子,_辺の長さ_1,_辺の長さ_2,_辺の長さ_3,_辺の長さ_4), _周囲の長さ is _辺の長さ_1 + _辺の長さ_2 + _辺の長さ_3 + _辺の長さ_4. 辺の長さを得る(_識別子,_辺の長さ_1,_辺の長さ_2,_辺の長さ_3,_辺の長さ_4) :- 左上隅と右下隅の座標を得る(_識別子,_左上隅のX座標,_左上隅のY座標,_右下隅のX座標,_右下隅のY座標), _辺の長さ_1 is abs(_右下隅のX座標-_左上隅のX座標), _辺の長さ_2 = _辺の長さ_1, _辺の長さ_3 is abs(_右下隅のY座標-_左上隅のY座標), _辺の長さ_4 = _辺の長さ_3. ある点が内部に含まれるかどうかを調べる(_識別子,_ある点のX座標,_ある点のY座標) :- 左上隅と右下隅の座標を得る(_識別子,_左上隅のX座標,_左上隅のY座標,_右下隅のX座標,_右下隅のY座標), _ある点のX座標 >= _左上隅のX座標, _ある点のX座標 =< _右下隅のX座標, _ある点のY座標 =< _左上隅のY座標, _ある点のY座標 >= _右下隅のY座標. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/188 # # 【課題】以下のようなクラス(名前は各自決める)を定義せよ。 # mainメソッドを呼び出すと、別のスレッドthを生成し、スタートさせる。 # mainメソッドは、プロンプトとして”Command> “を印字し、キーボードからの入力を待つ。 # 入力は、以下のようなadd, removeなどを先頭とするいくつかの文字列で、 # それを何らかの方法でスレッドthに渡し、ふたたび “Command> “を印字して次の入力を待つ。 # Command> add <文字列> # スレッドthでは、mainから受け取った<文字列>の部分を取り出し、 # thの中で管理するLinkedListの要素に加える(add)。一方、 # Command> remove <文字列> とすると該当する文字列をLinkedListから消す。そのほか、 # Command> print とでき、printはLinkedListにある要素をすべて印字し # Command> exit exitはスレッドを停止し、それを待ってmainメソッドを終了する # ものである。 # 上記以外の入力は無視する。 # (ヒント:書き方はたくさんありますが、たとえば前回のProducer Consumerの例を考えてください。 # 片方が生成(入力された文字列をMqueueに格納)、他方がそれを読み出すと考えます。 # もちろんもっと簡単な方法もあると思います。上記の仕様通りに動いていれば正解です。 # 【 形態 】1. Javaアプリケーション(main()で開始) # 【GUI】4.制限なし # 【 期限 】 今日(7/14)中 # 【 Ver  】 1.7.0_03 # 【 補足 】宜しくお願いします! # # 影を用いて情報を管理する :- 取り次ぎ(_取り次ぎ), コマンドを得る(_コマンド行), 影を生み出す(影(_取り次ぎ),_影,[]), 影を用いて情報を管理する(_取り次ぎ,_命令). 影を用いて情報を管理する(_取り次ぎ,exit). 影を用いて情報を管理する(_取り次ぎ,コマンド行) :- コマンドを得る(_コマンド_2), thread_send_message(_取り次ぎ,コマンド_2), 影を用いて情報を管理する(_取り次ぎ,コマンド行_2). コマンドを得る(_コマンド行) :- write('コマンド>> '), get_line(_コマンド行). 影(_取り次ぎ) :- 言伝からコマンドを得る(_取り次ぎ,_命令,R), 影(_取り次ぎ,_命令,R,[],L). 影(_取り次ぎ,_命令,_付加情報,L_1,L) :- コマンドの実行(_取り次ぎ,_コマンド,L_1,L_2), 言伝を送る(_取り次ぎ,ok), 言伝からコマンドを得る(_取り次ぎ,_命令_2,_付加情報_2), 影(_取り次ぎ,_命令_2,_付加情報_2,L_2,L). 言伝からコマンドを得る(_取り次ぎ,_命令,R) :- 言伝を取り出す(_取り次ぎ,_言伝,[]), split(_言伝,[' '],[_命令|R]). コマンドの実行(add,[_情報],L_1,[_情報|L_1]). コマンドの実行(delete,[_情報],L_1,L_2) :- ならびから削除(_情報,L_1,L_2). コマンドの実行(print,[],L_1,L_1) :- writef('%t\n',[L_1]). コマンドの実行(_コマンド,_,L_1,L_1) :- writef('%tコマンドは存在しません。\n',[_コマンド]). ならびから削除(_,[],[]) :- !. ならびから削除(_削除する要素,[_削除する要素|_残り対象ならび],_削除されたならび) :- ならびから削除(_削除する要素,_残り対象ならび,_削除されたならび),!. ならびから削除(_削除する要素,[_要素|_残り対象ならび],[_要素|_残り削除ならび]) :- ならびから削除(_削除する要素,_残り対象ならび,_残り削除ならび),!. キューを保存する(L) :- tell('キュー保存.pro'), write(L), write('.\n'), told. 影を生み出す(Term,_影,Option) :- thread_create(Term,_影,Option). 影を終わる :- thread_self(_番号), thread_detach(_番号). 取り次ぎ(_取り次ぎ) :- message_queue_create(_取り次ぎ). 言伝を取り出す(_取り次ぎ,_言伝,_限界時間) :- thread_get_message(_取り次ぎ,_言伝,[timeout(_限界時間)]). 言伝を取り出す(_言伝) :- thread_get_message(_言伝). 言伝を送る(_番号,_言伝) :- thread_send_message(_番号,_言伝). 取り次ぎを立てる(_取り次ぎ) :- message_queue_create(_取り次ぎ,[]). 取り次ぎを解消する(_取り次ぎ) :- message_queue_destroy(_取り次ぎ). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/191 # # 自然数N(N<10000)があたえられたとき、Nまでのうち素数のみを示すプログラムを作れ。 # 表示はコンソールに、コンマで区切って表示せよ。 # (ヒント:a,b(a<=b)の2数の積がN以下ならば最大となるaまでの素数を考えればよい) # # まずヒントが日本語じゃないです・・・ # 数学ができなくてもやる気があればできるというので大学に入ったのですが、もう毎日死ぬほど数学やってもわからない問題ばっかりです # 助けてください。毎日遊んだり合コンしたりと思ってたのに単位もらえそうになくて死にたいです # # '自然数N(N<10000)があたえられたとき、Nまでのうち素数のみを示す' :- '自然数N(N<10000)があたえられたとき'(_N), 'Nまでのうち素数のみを'(_N,_素数ならび), 示す(_素数ならび). '自然数N(N<10000)があたえられたとき'(_N) :- 自然数を得る('1000未満の自然数',_N < 1000,_N). 'Nまでのうち素数のみを'(_N,_素数ならび) :- findall(_m,( between(2,_N,_m)), L), % 以下のサイトは # # EUCコードの漢字をランダムに発生させる。 # 乱数によりEUCコードの漢字を発生させる(_除外漢字ならび,_漢字) :- repeat, 乱数によりEUCコードの漢字を発生させる(_漢字), \+(member(_漢字,_除外漢字ならび)),!. 乱数によりEUCコードの漢字を発生させる(_漢字) :- repeat, 漢字コード候補の発生(C), 'Cが除外領域ではない'(C), char_code(_漢字,C),!. 漢字コード候補の発生(C) :- A is random mod 69, B is random mod 93, C is (176 + A) * 256 + (161 + B). 'Cが除外領域ではない'(C) :- \+((C >= 207 * 256 + 212,C =< 207 * 256 + 254)), \+((C >= 244 * 256 + 165)). % 以下のサイトは # # 正の整数を文字列に変換し、指定桁数に足らない場合ゼロを詰める # 頭部零文字列に変換(_指定桁数,_整数,_頭部零文字列) :- number_chars(_整数,Chars), lpad(Chars,_指定桁数,'0',_頭部零文字列). lpad(_文字列,_桁,_補填文字,_補填された文字列) :- 補填文字が必要(_文字列,_桁,_補填文字数), 補填文字列の生成(_補填文字,_補填文字数,_補填文字文字列), atomic_list_concat([_補填文字列,_文字列],_補填された文字列),!. lpad(_文字列の一,_,_,_文字列) :- atomic_list_concat([_文字列の一],_文字列). 補填文字が必要(_文字列,_桁,_補填文字数) :- atomic_length(_文字列,_文字列長), _補填文字数 is _桁 - _文字列長, _補填文字数 > 0. 補填文字列の生成(_補填文字,_補填文字数,_補填文字列) :- length(_補填文字ならび,_補填文字数), all(_補填文字ならび,_補填文字), atomic_list_concat(_補填文字ならび,_補填文字列). all([],_). all([V|R],V) :- all(R,V). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/902 # # DBMS:SQLite3.7.12.1(System.Data.SQLite1.0.81.0) # # [テーブルデータ] # # CREATE TABLE tblA( # id INTEGER, # status001 INTEGER, # status002 INTEGER, # status003 INTEGER, # status004 INTEGER, # . # . # . # status300 INTEGER # ); # # id |status001|status002|.... . |status300| # ----+--------+--------+ +--------| # 1| 0 | 0 | | 0 | # 2| 1 | 0 | | 0 | # 3| 0 | 0 | | 1 | # 4| 0 | 1 | | 1 | # 5| 0 | 0 | | 0 | # 6| 1 | 1 | | 0 | # 7| 0 | 1 | | 0 | # 8| 1 | 1 | | 1 | # 9| 1 | 1 | | 0 | # # 想定レコード数 50,000〜2000,000 # # [欲しい結果] # ------------------------------------------- # status001 | 4 //status001=1であるレコード数 # status002 | 5 //status002=1であるレコード数 # . # . # . # status300 | 3 //status300=1であるレコード数 # # 正規化に問題があるように思えますが # これらを一度のSQLで取得出来ないでしょうか。 # この結果を最も速く取得する方法を模索しています(__) # # 各フィールドの値が1である組数(_フィールド名,_組数) :- between(1,300,N), 引数ならびを生成し指定フィールドを1とする(L1), member([_フィールド名,L],L1), 指定フィールドが1の組数(L,_組数). 引数ならびを生成し指定フィールドを1とする(N,_フィールド名,L) :- フィールド名の復元(N,_フィールド名), length(L,300), nth1(N,L,1). 指定フィールドが1の組数(L,_組数) :- P =.. [tblA,_id|L], count(P,_組数), _組数 > 0. フィールド名の復元(_フィールド名_0,N,_フィールド名) :- '3要素のフィールド名識別名をならびで確保'(L), number_chars(N,Chars), append(L1,Chars,L), 変数として残った要素は0に単一化(L1), ならび要素を結合したものがフィールド名([_フィールド名_0|L],_フィールド名). '3要素のフィールド名識別名をならびで確保'(L) :- length(L,3). append([],L1,L2,L) :- append(L1,L2,L). append([A|R1],L1,L2,[A|R]) :- append(R1,L1,L2,R). 変数として残った要素は0に単一化([]). 変数として残った要素は0に単一化(['0'|R]) :- 変数として残った要素は0に単一化(R). ならび要素を結合したものがフィールド名(L,_フィールド名) :- atomic_list_concat(L,_フィールド名). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/652 # # 問題 # 整数nが与えられたとき、1からnの数すべてを1桁に分解して集計せよ。 # 例 # n=15のとき # 1+2+3+4+5+6+7+8+9+(1+0)+(1+1)+(1+2)+(1+3)+(1+4)+(1+5) = 66 # % % どうせなら '1+2+3+4+5+6+7+8+9+(1+0)+(1+1)+(1+2)+(1+3)+(1+4)+(1+5)'を生成して % それを利用して!計算したいものだ。 % '整数nが与えられたとき、1からnの数すべてを1桁に分解して集計せよ。'(_n,_集計値) :- 一桁ずつに分解した加算文字列ならび(_n,_一桁ずつに分解した加算文字列ならび), atomic_list_concat(_一桁ずつに分解した加算式文字列ならび,'+',_評価式文字列), atom_to_term(_評価式文字列,_評価式,_), _集計値 is _評価式. 一桁ずつに分解した加算文字列ならび(_n,_一桁ずつに分解した加算式文字列ならび) :- findall(_一桁ずつに分解した加算式文字列,( between(1,_n,_整数), number_chars(_整数,_一桁ずつに分解した数字ならび), '二桁以上の時は括弧で括ってプラス演算子を挿入する'(_n,_一桁ずつに分解した数字ならび,_一桁ずつに分解した加算式文字列)), _一桁ずつに分解した加算式文字列ならび). '二桁以上の時は括弧で括ってプラス演算子を挿入する'(_n,_一桁ずつに分解した数字ならび,_一桁ずつに分解した加算式文字列) :- _n < 10, atomic_list_concat(_一桁ずつに分解した数字ならび,'+',_一桁ずつに分解した加算式文字列). '二桁以上の時は括弧で括ってプラス演算子を挿入する'(_n,_一桁ずつに分解した数字ならび,_一桁ずつに分解した括弧で括られた加算式文字列) :- _n >= 10, atomic_list_concat(_一桁ずつに分解した数字ならび,'+',_一桁ずつに分解した加算式文字列), atomic_list_concat(['(',_一桁ずつに分解した加算式文字列,')'],_一桁ずつに分解した括弧で括られた加算式文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/413 # # [1] 授業単元: C言語 # [2] 問題文:http://ime.nu/codepad.org/je2akZ6u # #include # # int main(){ # int num[100]; # int data, i, j; # FILE* FP; # # //データの個数を入力 # printf("データの個数を入力してください。"); # scanf("%d", &data); # # //読み込み # FP = fopen("readFile.txt","r"); # # for(i=0; i&nplt;dat&npgta; i++){ # fscanf(FP,"%d", &num[i]); # } # fclose(FP); # # //書き込み # FP = fopen("writeFile.txt","w"); # for(i=0; i&nplt;data; i++){ # fprintf(FP,"%d ", num[i]); # } # fclose(FP); # return(0); # } # writeFile.txtの表示を # 11 22 33 44 55 # 66 77 88 99 00 # にするにはどうすればいい? # 'データの個数を入力し、readFile.txtを読み、昇順にデータを並べ替えて、writeFile.txtに一行5データずつ出力する' :- 'まずデータの個数を入力し'(_データの個数), 'readFile.txtを読み'(_データの個数,_データならび), '昇順にデータを並べ替えて'(_データならび,_昇順に整列したデータならび), 'ファイルwriteFile.txtに5データ毎に改行して書き込む'(_昇順に整列したデータならび). 'まずデータの個数を入力し'(_学生の人数) :- 整数を得る(データの個数,_データの個数). 'readFile.txtを読み'(_データの個数,_データならび) :- get_split_lines('readFile.txt',[' '],LL), 平坦化(LL,_データならび_1), データの個数分を切り取る(_データの個数,_データならび_1,_データならび). データの個数分を切り取る(_データの個数,_データならび_1,_データならび) :- length(_データならび_1,_要素数), _要素数 >= _データの個数, length(_データならび,_データの個数), append(_データならび,_,_データならび_1),!. データの個数分を切り取る(_,_データならび,_データならび). '昇順にデータを並べ替えて'(_データならび,_昇順に整列したデータならび) :- 整列(_データならび,_昇順に整列したデータならび). 整列([],[]). 整列([_軸要素|_着目した科目の成績ならび],_昇順に整列した着目した科目の成績ならび) :- 分割(_軸要素,_着目した科目の成績ならび,_軸要素より小さい成績ならび,_軸要素と等しいか大きい成績ならび), 整列(_軸要素より小さい成績ならび,_整列した軸要素より小さい成績ならび), 整列(_軸要素より大きい成績ならび,_整列した軸要素より大きい成績ならび), append(_整列した軸要素より小さい成績ならび,[_軸要素|_整列した軸要素より大きい成績ならび],_昇順に整列した着目した科目の成績ならび). 分割(_,[],[],[]). 分割(_軸要素,[[_成績,_No]|R1],[[_成績,_No]|_軸要素より小さい成績ならび],_軸要素と等しいか大きい成績ならび) :- _成績 @<_軸要素, 分割(_軸要素,R1,_軸要素より小さい成績ならび,_軸要素と等しいか大きい成績ならび). 分割(_軸要素,[[_成績,_No]|R1],_軸要素より小さい成績ならび,[[_成績,_No]|_軸要素と等しいか大きい成績ならび]) :- _成績 @>= _軸要素, 分割(_軸要素,R1,_軸要素より小さい成績ならび,_軸要素と等しいか大きい成績ならび). 'ファイルwriteFile.txtに5データ毎に改行して書き込む'(_整列した得点ならび) :- '得点ならびを頭部零文字列ならびに変換'(_整列した得点ならび,_頭部零文字列ならび), open('writeFile.txt',write,Outstream), 'Outstreamに書き込む'(Outstream,_頭部零文字列ならび), close(Outstream). '5データ毎にOutstreamに書き込む'(_,[]) :- !. '5データ毎にOutstreamに書き込む'(Outstream,_頭部零文字列ならび) :- '5データ毎に'(_得点ならび,A,B,C,D,E,_残りならび), writef(Outstream,'%t %t %t %t %t\n',[A,B,C,D,E]), '5データ毎にOutstreamに書き込む'(Outstream,_残りならび). '5データ毎に'([A,B,C,D,E|_残りならび],A,B,C,D,E,_残りならび) :- !. '5データ毎に'(_得点ならび,A,B,C,D,E,[]) :- append(_得点ならび,L1,[A,B,C,D,E]), all(L1,'00'). '得点ならびを頭部零文字列ならびに変換'([],[]) :- !. '得点ならびを頭部零文字列ならびに変換'([N|R1],[A|R2]) :- 頭部零文字列(2,N,A), '得点ならびを頭部零文字列ならびに変換'(R1,R2). 頭部零文字列(_N桁,_整数,_頭部零文字列) :- length(L,_N桁), number_chars(_整数,Chars), append(L0,Chars,L), all(L0,'0'), atomic_list_concat(L,_頭部零文字列),!. 頭部零文字列(_N桁,_整数,_頭部零文字列) :- number_chars(_整数,Chars), atomic_list_concat(Chars,_頭部零文字列). % 平坦化/2 % ここでは使っていない'N個組'/2 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/399 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # まず学生の人数(100人以下)を入力し、成績結果のファイルseiseki.txtを読み、 # それから国語または数学、英語の点数のどれかに注目した小から大への順番に従ってデータを並べ替えて、 # write.txtに出力するプログラムを作成しなさい。 # 例 # seiseki.txt # No. 国語 数学 英語 # 1  90 80 70 # 2   85 75 65 # 3   80 70 60 # 4   75 65 55 # 5   70 60 50 # # 学生の人数を入力してください。6 # 科目番号を入力してください。 # 1:国語、2:数学、3:英語 # 2 # # write.txt # 5 70 60 50 # 4 75 65 55 # 3 80 70 60 # 2 85 75 65 # 1 90 80 70 # 'まず学生の人数(100人以下)を入力し、成績結果のファイルseiseki.txtを読み、それから国語または数学、英語の点数のどれかに注目した小から大への順番に従ってデータを並べ替えて、write.txtに出力する' :- 'まず学生の人数(100人以下)を入力し'(_学生の人数), '成績結果のファイルseiseki.txtを読み'(_学生の人数,_成績ならび), 'それから国語または数学、英語の点数のどれかに注目'(_注目した科目,_成績ならび,_着目した科目の成績ならび), '小から大への順番に従ってデータを並べ替えて'(_着目した科目の成績ならび,_昇順に整列した着目した科目の成績ならび), 'write.txtに出力する'(_昇順に整列した着目した科目の成績ならび,_成績ならび). 'まず学生の人数(100人以下)を入力し'(_学生の人数) :- 整数を得る(学生の人数,_学生の人数 =< 100,_学生の人数). '成績結果のファイルseiseki.txtを読み'(_学生の人数,_成績ならび) :- get_split_lines('seiseki.txt',[' '],LL), 平坦化(LL,_成績ならび_1), 学生の人数分を切り取る(_学生の人数,_成績ならび_1,_成績ならび). 学生の人数分を切り取る(_学生の人数,_成績ならび_1,_成績ならび) :- length(_成績ならび_1,_要素数), _要素数 >= _学生の人数, length(_成績ならび,_学生の人数), append(_成績ならび,_,_成績ならび_1),!. 学生の人数分を切り取る(_学生の人数,_成績ならび,_成績ならび). 'それから国語または数学、英語の点数のどれかに注目'(_注目した科目,_成績ならび,_注目した科目の成績ならび) :- 注目した科目を選択する(_注目した科目), findall([_注目した科目の成績,_No],( member([_No,_国語,_数学,_英語],_成績ならび), 注目した科目成績を選択する(_注目した科目,[_国語,_数学,_英語],_注目した科目の成績)), _注目した科目の成績ならび). 注目した科目を選択する(_注目した科目) :- write('国語、数学、英語のうち、注目した科目を入力してください : '), get_line(Line), '診断: 注目した科目を選択する'(Line,_注目した科目),!. 注目した科目を選択する(_注目した科目) :- 注目した科目を選択する(_注目した科目). '診断: 注目した科目を選択する'(_注目した科目,_注目した科目) :- member(_注目した科目,[国語,数学,英語]),!. '診断: 注目した科目を選択する'(Line,_注目した科目) :- write('入力された %t は国語、数学、英語のいずれでもありません。再入力をお願いします。\n',[Line]), fail. 注目した科目成績を選択する(国語,[_国語,_数学,_英語],_国語). 注目した科目成績を選択する(数学,[_国語,_数学,_英語],_数学). 注目した科目成績を選択する(英語,[_国語,_数学,_英語],_英語). '小から大への順番に従ってデータを並べ替えて'(_着目した科目の成績ならび,_昇順に整列した着目した科目の成績ならび) :- 整列(_着目した科目の成績ならび,_昇順に整列した着目した科目の成績ならび). 整列([],[]). 整列([_軸要素|_着目した科目の成績ならび],_昇順に整列した着目した科目の成績ならび) :- 分割(_軸要素,_着目した科目の成績ならび,_軸要素より小さい成績ならび,_軸要素と等しいか大きい成績ならび), 整列(_軸要素より小さい成績ならび,_整列した軸要素より小さい成績ならび), 整列(_軸要素より大きい成績ならび,_整列した軸要素より大きい成績ならび), append(_整列した軸要素より小さい成績ならび,[_軸要素|_整列した軸要素より大きい成績ならび],_昇順に整列した着目した科目の成績ならび). 分割(_,[],[],[]). 分割(_軸要素,[[_成績,_No]|R1],[[_成績,_No]|_軸要素より小さい成績ならび],_軸要素と等しいか大きい成績ならび) :- _成績 @<_軸要素, 分割(_軸要素,R1,_軸要素より小さい成績ならび,_軸要素と等しいか大きい成績ならび). 分割(_軸要素,[[_成績,_No]|R1],_軸要素より小さい成績ならび,[[_成績,_No]|_軸要素と等しいか大きい成績ならび]) :- _成績 @>= _軸要素, 分割(_軸要素,R1,_軸要素より小さい成績ならび,_軸要素と等しいか大きい成績ならび). 'write.txtに出力する'(_昇順に整列した着目した科目の成績ならび,_成績ならび) :- open('write.txt',write,Outstream), 'Outstreamへ出力'(Outstream,_昇順に整列した着目した科目の成績ならび,_成績ならび), close(Outstream). 'Outstreamへ出力'(Outstream,_昇順に整列した着目した科目の成績ならび,_成績ならび) :- append(_,[[_成績,_No]|R],_昇順に整列した着目した科目の成績ならび), member([_No,_国語,_数学,_英語],_成績ならび), writef(Outstream,'%t %t %t %t\n',[_No,_国語,_数学,_英語]), R = []. % 平坦化/2 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/267 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):問題が長いので http://ime.nu/ideone.com/1FVot ここにあげさせてもらいました。 # # 共用体を用いてビット単位で操作できる1バイトの仮想レジスタを定義し、 # 「2進数8桁の文字列」で入力した2つの数値データの、 # 加算、減算、論理積、論理和、排他的論理和、否定の演算結果を # 2進数8桁で出力するプログラムを作成せよ。 # # という課題がでて以下の様なソースを書いたのですが、エラー処理の方法が # よくわかりません。やりたいことは0と1以外の数を入力したら # エラーと表示、8桁でなければエラーと表示してもらいたいです。 # それと先生に出力の書き方が少しおかしいと言われたのですが、このソースで # 動いてしまいました。プログラミングの授業的になにかまずいことでもあるのでしょうか? # それも出来れば教えてもらいたいです。 '1バイトの仮想レジスタ'(加算,_2進数8桁の文字列_1,_2進数8桁の文字列_2,_2進数8桁の文字列_3) :- atom_chars(_2進数8桁の文字列_1,L1), atom_chars(_2進数8桁の文字列_2,L2), ビット加算(L1,L2,L), atom_chars(_2進数8桁の文字列_3,L). '1バイトの仮想レジスタ'(減算,_2進数8桁の文字列_1,_2進数8桁の文字列_2,_2進数8桁の文字列_3) :- atom_chars(_2進数8桁の文字列_1,L1), atom_chars(_2進数8桁の文字列_2,L2), ビット減算(L1,L2,L), atom_chars(_2進数8桁の文字列_3,L). '1バイトの仮想レジスタ'(論理積,_2進数8桁の文字列_1,_2進数8桁の文字列_2,_2進数8桁の文字列_3) :- atom_chars(_2進数8桁の文字列_1,L1), atom_chars(_2進数8桁の文字列_2,L2), ビット論理積(L1,L2,L), atom_chars(_2進数8桁の文字列_3,L). '1バイトの仮想レジスタ'(論理和,_2進数8桁の文字列_1,_2進数8桁の文字列_2,_2進数8桁の文字列_3) :- atom_chars(_2進数8桁の文字列_1,L1), atom_chars(_2進数8桁の文字列_2,L2), ビット論理和(L1,L2,L), atom_chars(_2進数8桁の文字列_3,L). '1バイトの仮想レジスタ'(排他的論理積,_2進数8桁の文字列_1,_2進数8桁の文字列_2,_2進数8桁の文字列_3) :- atom_chars(_2進数8桁の文字列_1,L1), atom_chars(_2進数8桁の文字列_2,L2), ビット排他的論理和(L1,L2,L), atom_chars(_2進数8桁の文字列_3,L). '1バイトの仮想レジスタ'(否定,_2進数8桁の文字列_1,_2進数8桁の文字列_2) :- atom_chars(_2進数8桁の文字列_1,L1), ビット否定(L1,L2), atom_chars(_2進数8桁の文字列_2,L2). ビット加算(L1,L2,L) :- ビット加算(L1,L2,[],L). ビット加算([],[],L1,L) :- reverse(L1,L). ビット加算([A|R1],[B|R2],L1,L) :- ビット加算(A,B,C,D), 桁あがり処理(C,L1,L2), ビット加算(R1,R2,[D|L2],L). ビット加算('0','0','0','0'). ビット加算('0','1','0','1'). ビット加算('1','0','0','1'). ビット加算('1','1','1','0'). 桁あがり処理('0',L,L). 桁あがり処理('1',['0'|R],['1'|R]). 桁あがり処理('1',['1'|R1],['0'|R2]) :- 桁あがり処理('1',R1,R2). ビット減算(L1,L2,L) :- ビット減算(L1,L2,[],L). ビット減算([],[],L1,L) :- reverse(L1,L). ビット減算([A|R1],[B|R2],L1,L) :- ビット減算(A,B,C,D), 桁あふれ処理(C,L1,L2), ビット減算(R1,R2,[D|L2],L). ビット減算('0','0','0','0'). ビット減算('0','1','1','1'). ビット減算('1','0','0','1'). ビット減算('1','1','0','0'). 桁さがり処理('0',L,L). 桁さがり処理('1',['1'|R],['0'|R]). 桁さがり処理('1',['0'|R1],['1'|R2]) :- 桁さがり処理('1',R1,R2). ビット論理積([],[],[]). ビット論理積(['0'|R1],['0'|R2],['0'|R3]) :- ビット論理積(R1,R2,R3). ビット論理積(['0'|R1],['1'|R2],['0'|R3]) :- ビット論理積(R1,R2,R3). ビット論理積(['1'|R1],['0'|R2],['0'|R3]) :- ビット論理積(R1,R2,R3). ビット論理積(['1'|R1],['1'|R2],['1'|R3]) :- ビット論理積(R1,R2,R3). ビット論理和([],[],[]). ビット論理和(['0'|R1],['0'|R2],['0'|R3]) :- ビット論理和(R1,R2,R3). ビット論理和(['0'|R1],['1'|R2],['1'|R3]) :- ビット論理和(R1,R2,R3). ビット論理和(['1'|R1],['0'|R2],['1'|R3]) :- ビット論理和(R1,R2,R3). ビット論理和(['1'|R1],['1'|R2],['1'|R3]) :- ビット論理和(R1,R2,R3). ビット排他的論理和([],[],[]). ビット排他的論理和(['0'|R1],['0'|R2],['0'|R3]) :- ビット排他的論理和(R1,R2,R3). ビット排他的論理和(['0'|R1],['1'|R2],['1'|R3]) :- ビット排他的論理和(R1,R2,R3). ビット排他的論理和(['1'|R1],['0'|R2],['1'|R3]) :- ビット排他的論理和(R1,R2,R3). ビット排他的論理和(['1'|R1],['1'|R2],['0'|R3]) :- ビット排他的論理和(R1,R2,R3). ビット否定([],[]). ビット否定(['0'|R1],['1'|R3]) :- ビット否定(R1,R2,R3). ビット否定(['1'|R1],['0'|R3]) :- ビット否定(R1,R2,R3). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/70 # # 【 課題 】DB上に給与の支給テーブルがあります。 #       支店・部・課・社員番号・基本給・役職手当・残業時間 #       これらの情報をDBから読み込み、各支店ごとの部、課の合計、支店合計 #       総合計を求めなさい。最後に全ての合計を印字する事。 #       集計項目は基本給・役職手当・残業手当・総支給額の4項目とする。 # 【 形態 】1. Javaアプリケーション(main()で開始すること) # 【期限】6/17 午後20時 # 【Ver 】java version "1.7.0_02" # 【 補足 】 # 残業手当 =(基本給+役職手当)/160*1.2 # 総支給額 = 基本給+役職手当+残業手当 で計算します。 # # データベースの設定ですが # 支店varcher2(14)部varcher2(14)課varcher2(14)社員番号number(8)基本給number(20)役職手当number(20) # 残業時間number(20) # 一意キーは社員番号です # # 追試の追試課題です。 # 今晩がんばりますが、明日の21時にはメールで提出しないといけません。 # お力添えお願いします。 # 'DB上に給与の支給テーブルがあります。支店・部・課・社員番号・基本給・役職手当・残業時間、これらの情報をDBから読み込み、各支店ごとの部、課の合計、支店合計、総合計を求めなさい。 最後に全ての合計を印字する事。集計項目は基本給・役職手当・残業手当・総支給額の4項目とする。' :- 鍵ならびを生成(_支店候補,_支店_部候補,_支店_部_課候補), 支店の表示(_支店候補,_支店_部候補,_支店_部_課候補,_支店), fail; 総合計の表示. 支店の表示(_支店候補,_支店_部候補,_支店_部_課候補,_支店) :- member([_支店,_部],_支店_部候補), '支店,部の表示'(_支店_部候補,_支店_部_課候補,_支店,_部), fail. 支店の表示(_支店候補,_支店_部候補,_支店_部_課候補,_支店) :- '支店を鍵に集約'(_支店候補,_支店,_基本給,_役職手当,_残業手当,_総支給額), writef('支店集約: 支店=%t: 基本給=%t,役職手当=%t,残業手当%t,総支給額=%t\n',[_支店,_基本給,_役職手当,_残業手当,_総支給額]). '支店,部の表示'(_支店_部候補,_支店_部_課候補,_支店,_部) :- member([_支店,_部,_課],_支店_部_課候補), '支店,部,課の表示'(_支店_部_課候補,_支店,_部,_課), fail. '支店,部の表示'(_支店_部_課候補,_支店,_部) :- '支店,部を鍵に集約'(_支店_部候補,_支店,_部,_基本給,_役職手当,_残業手当,_総支給額), writef('支店・部集約: 支店=%t,部=%t: 基本給=%t,役職手当=%t,残業手当%t,総支給額=%t\n',[_支店,_部,_基本給,_役職手当,_残業手当,_総支給額]). '支店,部,課の表示'(_支店_部_課候補,_支店,_部,_課) :- '支店,部,課を鍵に集約'(_支店_部_課候補,_支店,_部,_課,_基本給,_役職手当,_残業手当,_総支給額), writef('支店・部・課集約: 支店=%t,部=%t,課=%t: 基本給=%t,役職手当=%t,残業手当%t,総支給額=%t\n',[_支店,_部,_課,_基本給,_役職手当,_残業手当,_総支給額]). 鍵ならびを生成(_支店候補,_支店_部候補,_支店_部_課候補) :- '支店を鍵'(_支店候補), '支店,部を鍵'(_支店_部候補), '支店,部,課を鍵'(_支店_部_課候補). '支店を鍵'(_支店候補) :- findsetof([_支店],( 給与(_支店,_,_,_社員番号,_基本給,_役職手当)), _支店候補). '支店,部を鍵'(_支店_部候補) :- findsetof([_支店,_部],( 給与(_支店,_部,_課,_社員番号,_基本給,_役職手当)), _支店_部候補). '支店,部,課を鍵'(_支店_部_課候補) :- findsetof([_支店,_部,_課],( 給与(_支店,_部,_課,_社員番号,_基本給,_役職手当)), _支店_部候補). '支店,部,課を鍵に集約'(_支店_部_課候補,_支店,_部,_課,_基本給,_役職手当,_残業手当,_総支給額) :- member([_支店,_部,_課],_支店_部_課候補), findsum([_基本給,_役職手当,_残業手当,_総支給額],( 給与(_支店,_部,_課,_社員番号,_基本給,_役職手当), _残業手当と総支給額の算出(_基本給,_役職手当,残業手当,_総支給額)), [_基本給,_役職手当,_残業手当,_総支給額]). '支店,部を鍵に集約'(_支店_部候補,_支店,_部,_基本給,_役職手当,_残業手当,_総支給額) :- member([_支店,_部],_支店_部候補), findsum([_基本給,_役職手当,_残業手当,_総支給額],( 給与(_支店,_部,_,_社員番号,_基本給,_役職手当), _残業手当と総支給額の算出(_基本給,_役職手当,残業手当,_総支給額)), [_基本給,_役職手当,_残業手当,_総支給額]). '支店を鍵に集約'(_支店候補,_支店,_基本給,_役職手当,_残業手当,_総支給額) :- member([_支店],_支店候補), findsum([_基本給,_役職手当,_残業手当,_総支給額],( 給与(_支店,_,_,_社員番号,_基本給,_役職手当), _残業手当と総支給額の算出(_基本給+_役職手当,残業手当,_総支給額)), [_基本給,_役職手当,_残業手当,_総支給額]). すべての合計(_基本給,_役職手当,_残業手当,_総支給額) :- findsum([_基本給,_役職手当,_残業手当,_総支給額],( 給与(_,_,_,_社員番号,_基本給,_役職手当), _残業手当と総支給額の算出(_基本給+_役職手当,残業手当,_総支給額)), [_基本給,_役職手当,_残業手当,_総支給額]). 残業手当と総支給額の算出(_基本給,_役職手当,_残業手当,_総支給額) :- 残業手当の算出(_基本給,_役職手当,_残業手当), 総支給額の算出(_基本給,_役職手当,_残業手当,_総支給額). 残業手当の算出(_基本給,_役職手当,_残業手当) :- _残業手当 is (_基本給+_役職手当)/160*1.2. 総支給額の算出(_基本給,_役職手当,_残業手当,_総支給額) :- _総支給額 is _基本給+_役職手当+_残業手当. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/109 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # テストを受験した学生の人数をまず入力し、それから各学生達のテストの点数を次々に入力して配列に格納したうえで、 # 0点以上 20点未満・20点以上 40点未満・40点以上 60点未満・60点以上 80点未満・80点以上100点以下の各ランクに属する人数を計算して表示するプログラムを作成しなさい。 # ただしテストを受験する学生の人数は10人以下とする。 # 'テストを受験した学生の人数をまず入力し、それから各学生達のテストの点数を次々に入力して配列に格納したうえで、0点以上 20点未満・20点以上 40点未満・40点以上 60点未満・60点以上 80点未満・80点以上100点以下の各ランクに属する人数を計算して表示するプログラムを作成しなさい。ただしテストを受験する学生の人数は10人以下とする。' :- 'テストを受験した学生の人数をまず入力し、ただしテストを受験する学生の人数は10人以下とする。'(_学生の人数), 'それから各学生達のテストの点数を次々に入力して配列に格納したうえで、'(_各学生たちのテストの点数の格納されたならび), '0点以上 20点未満・20点以上 40点未満・40点以上 60点未満・60点以上 80点未満・80点以上100点以下の各ランクに属する人数を計算して表示する'(_各学生たちのテストの点数の格納されたならび). 'テストを受験した学生の人数をまず入力し、ただしテストを受験する学生の人数は10人以下とする。'(_学生の人数) :- write('テストを受験した学生の人数(10人以下)を入力してください : '), get_line(Line), '診断: テストを受験した学生の人数'(Line,_学生の人数),!. 'テストを受験した学生の人数をまず入力し、ただしテストを受験する学生の人数は10人以下とする。'(_学生の人数) :- 'テストを受験した学生の人数をまず入力し、ただしテストを受験する学生の人数は10人以下とする。'(_学生の人数). '診断: テストを受験した学生の人数'(Line,_学生の人数) :- atom_to_term(Line,_学生の人数,_), integer(_学生の人数), _学生の人数 >= 0, _学生の人数 =< 10. 'それから各学生達のテストの点数を次々に入力して配列に格納したうえで、'(_学生の人数,_各学生たちのテストの点数の格納されたならび) :- length(_各学生たちのテストの点数の格納されたならび,_学生の人数), findall(_点数,( 各学生達のテストの点数を次々に入力して(_各学生たちのテストの点数の格納されたならび,_点数)), _各学生たちのテストの点数の格納されたならび). 各学生達のテストの点数を次々に入力して(_各学生たちのテストの点数の格納されたならび,_点数) :- append(Ln,[_|_],_各学生たちのテストの点数の格納されたならび), length([_|Ln],_何番目), writef('%t番目の点数 : ',[_何番目]), get_integer(_点数). '0点以上 20点未満・20点以上 40点未満・40点以上 60点未満・60点以上 80点未満・80点以上100点以下の各ランクに属する人数を計算して表示する'(_各学生たちのテストの点数の格納されたならび) :- '80点未満のランクの表示'(A,B,_各学生たちのテストの点数の格納されたならび), '80点以上 100点以下の表示'(_各学生たちのテストの点数の格納されたならび). '80点未満のランクの表示'(_各学生たちのテストの点数の格納されたならび) :- append(_,[[A,B]|R],[[A,B],[[0,20],[20,40],[40,60],[60,80]]), ランク範囲の人数(A,B,_各学生たちのテストの点数の格納されたならび,_人数)), writef('%t点以上 %t点未満 %t 人\n',[A,B,_人数]), R = []. ランク範囲の人数(A,B,_各学生たちのテストの点数の格納されたならび,_人数) :- count(( member(_点数,_各学生たちのテストの点数の格納されたならび), _点数 >= A, _点数 < B), _人数). '80点以上 100点以下の表示'(_各学生たちのテストの点数の格納されたならび) :- count(( member(_点数,_各学生たちのテストの点数の格納されたならび), _点数 >= 80, _点数 =< 100), _人数), writef('80点以上 100点以下 %t 人\n',[_人数]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/104 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): #   100以下までの素数を求め、その表示をするプログラムを作成せよ。 #   ただし、求める素数の量は引数として関数側に渡して求めることとする。 # #   【関数仕様】 #   戻り値:なし #   関数名:prime #   引数:int n # '100以下までの素数を求め、その表示をするプログラムを作成せよ。ただし、求める素数の量は引数として関数側に渡して求めることとする。'(_n個まで) :- '2から100までのリストを生成する'(L), m個目の素数は(_m個目,L,_素数), その表示をする(_m個目,_素数), _m個目 = _n個まで. '2から100までのリストを生成する'(L) :- findall(N,between(2,100,N),L). m個目の素数は(_m,L,_素数) :- 計数付きエラトステネスの篩(0,_m,L,_素数). 計数付きエラトステネスの篩(M,N,[A|R1],X) :- エラトステネスの篩(A,R1,L), 計数付きエラトステネスの篩(M,N,A,L,X). 計数付きエラトステネスの篩(M,N,A,L,A) :- N is M + 1. 計数付きエラトステネスの篩(M,N,_,L,X) :- M_2 is M + 1, 計数付きエラトステネスの篩(M_2,N,L,X). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). その表示をする(_m個目,_素数) :- writef('%t個目の素数は %t です\n',[_m個目,_素数]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/102 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # 商品の種類の数をまず入力し、それから各商品の価格と 購入した個数を入力して、合計金額を計算して表示するプログラムを作成しなさい。 # それぞれの商品番号に対して、単価と個数の2つの要素を持つような 2次元配列を使ってプログラムを作成しなさい。 # ただし商品の種類の数は100以下とする。 # '商品の種類の数をまず入力し、それから各商品の価格と購入した個数を入力して、合計金額を計算して表示する。それぞれの商品番号に対して、単価と個数の2つの要素を持つような2次元配列を使ってプログラムを作成しなさい。ただし商品の種類の数は100以下とする。' :- '商品の種類の数をまず入力し(ただし商品の種類の数は100以下とする)'(_商品の種類の数), 'それから各商品の価格と購入した個数を入力して、それぞれの商品番号に対して、単価と個数の2つの要素を持つような_各商品の価格と購入した個数ならびを生成する'(_商品の種類の数,_各商品の価格と購入した個数ならび), 合計金額を計算して表示する(_各商品の価格と購入した個数のならび). '商品の種類の数をまず入力し(ただし商品の種類の数は100以下とする)'(_商品の種類の数) :- write('商品の種類の数を設定してください : '), get_line(Line), '診断: 商品の種類の数'(Line,_商品の種類の数),!. '商品の種類の数をまず入力し(ただし商品の種類の数は100以下とする)'(_商品の種類の数) :- '商品の種類の数をまず入力し(ただし商品の種類の数は100以下とする)'(_商品の種類の数). '診断: 商品の種類の数'(Line,_商品の種類の数) :- atom_to_term(Line,_商品の種類の数,_), integer(_商品の種類の数), _商品の種類の数 > 0,!. '診断: 商品の種類の数'(Line,_商品の種類の数) :- writef('入力された %t からは適切な商品の種類の数が得られません。再入力をお願いします。\n',[Line]), fail. 'それから各商品の価格と購入した個数を入力して、それぞれの商品番号に対して、単価と個数の2つの要素を持つような_各商品の価格と購入した個数ならびを生成する'(_商品の種類の数,_各商品の価格と購入した個数ならび) :- length(_各商品の価格と購入した個数ならび,_商品の種類の数), findall([_商品番号,_商品価格,_購入した個数],( append(_,[_|_],_各商品の価格と購入した個数ならび), 商品の価格と購入した個数を入力して(_商品番号,_商品価格,_購入した個数)), _各商品の価格と購入した個数ならび). 商品の価格と購入した個数を入力して(_商品番号,_商品価格,_購入した個数) :- 商品番号の入力(_商品番号), 商品価格の入力(_商品番号,_商品価格), 購入した個数の入力(_商品番号,_購入した個数). 商品番号の入力(_商品番号) :- get_line(_商品番号). 商品価格の入力(_商品番号,_商品価格) :- writef('商品番号%tの商品価格を入力してください : ',[_商品番号]), get_line(Line), '診断: 商品価格の入力'(Line,_商品価格),!. 商品価格の入力(_商品番号,_商品価格) :- 商品価格の入力(_商品番号,_商品価格). '診断: 商品価格の入力'(Line,_商品価格) :- atom_to_term(Line,_商品価格,_), number(_商品価格), _商品価格 >= 0.0,!. '診断: 商品価格の入力'(Line,_商品価格) :- writef('入力された %t からは適切な商品価格が得られません。再入力をお願いします。\n',[Line]), fail. 購入した個数の入力(_商品番号,_購入した個数) :- writef('商品番号%tの購入した個数を入力してください : ',[_商品番号]), get_line(Line), '診断: 購入した個数の入力'(Line,_購入した個数),!. 購入した個数の入力(_商品番号,_購入した個数) :- 購入した個数の入力(_商品番号,_購入した個数). '診断: 購入した個数の入力'(Line,_購入した個数) :- atom_to_term(Line,_購入した個数,_), number(_購入した個数), _購入した個数 >= 0.0,!. '診断: 購入した個数の入力'(Line,_購入した個数) :- writef('入力された %t からは適切な購入した個数が得られません。再入力をお願いします。\n',[Line]), fail. 合計金額を計算して表示する(_各商品の価格と購入した個数のならび) :- 合計金額を計算して(_各商品の価格と購入した個数のならび,_合計金額), 表示する(_合計金額). 合計金額を計算して(_各商品の価格と購入した個数のならび,_合計金額) :- findsum(_金額,( member([_,_商品の価格,_購入した個数],_各商品の価格と購入した個数のならび), _金額 is _商品価格 * _購入した個数), _合計金額). 表示する(_合計金額) :- writef('合計金額は %t です\n',[_合計金額]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/64 # # [1] 授業単元:配列 # [2] 問題文(含コード&リンク):身長(cm)と体重(kg)が、(170,85), (165,65), (180,78), #             (195,80), (188,72)の学生がいる。このデータを配列変数に保存し,身長 #             を入力すると体重を検索するプログラムを作成せよ。 #              該当する身長の学生がいない場合は「みつかりません。」を表示し #             繰り返しを終了せよ。 #             ここで,次のように配列宣言を行う。 #             int shincho[ ] = { 170, 165, 180, 195, 188, 0}; #             int taiju[ ] = { 85, 65, 78, 80, 72, 0}; # # データの最後は,データの個数である 5 を用いず、身長データが0になった # とき繰り返しを終了する方法を考えること。 # ヒント:for( i=0 ; shincho[i] != 0 ; i++)を使用する。 # # '身長(cm)と体重(kg)が、(170,85),(165,65),(180,78),(195,80),(188,72)の学生がいる。このデータを配列数に保存し,身長を入力すると体重を検索する。該当する身長の学生がいない場合は「みつかりません。」を表示し繰り返しを終了せよ。' :- '身長(cm)と体重(kg)が、(170,85),(165,65),(180,78),(195,80),(188,72)の学生がいる。このデータを配列数に保存し'(_身長_体重ならび), '身長を入力すると体重を検索する。該当する身長の学生がいない場合は「みつかりません。」を表示し繰り返しを終了せよ。'(_身長_体重ならび). '身長(cm)と体重(kg)が、(170,85),(165,65),(180,78),(195,80),(188,72)の学生がいる。このデータを配列数に保存し'(_身長_体重ならび) :- length(_身長_体重ならび,5), findall([_身長,_体重],( append(Ln,[_|_],_身長_体重ならび), 身長と体重の入力(Ln,_身長,_体重)), _身長体重ならび). 身長と体重の入力(Ln,_身長,_体重) :- length([_|Ln],N人目), writef('%t人目の 身長 : ',[N人目]), get_integer(_身長), write(' 体重 : '), get_integer(_体重). '身長を入力すると体重を検索する。該当する身長の学生がいない場合は「みつかりません。」を表示し繰り返しを終了せよ。'(_身長_体重ならび) :- '身長を入力すると'(_身長), '体重を検索する'(_身長_体重ならび,_身長,_体重), writef('身長 %t の人の 体重は %t です。\n',[_身長,_体重]), '身長を入力すると体重を検索する。該当する身長の学生がいない場合は「みつかりません。」を表示し繰り返しを終了せよ。'(_身長_体重ならび). '身長を入力すると体重を検索する。該当する身長の学生がいない場合は「みつかりません。」を表示し繰り返しを終了せよ。'(_身長_体重ならび) :- writef('見つかりません\n'). '身長を入力すると'(_身長) :- write('身長を入力してください : '), get_line(Line), '診断: 身長を入力すると'(Line,_身長),!. '身長を入力すると'(_身長) :- '身長を入力すると'(_身長). '診断: 身長を入力すると'(Line,_身長) :- atom_to_term(Line,_身長,_), integer(_身長),!. '診断: 身長を入力すると'(Line,_身長) :- writef('入力された %t から整数が得られません。再入力をお願いします。\n',[Line]), fail. '体重を検索する'(_身長_体重ならび,_身長,_体重) :- member([_身長,_体重],_身長_体重ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/28 # # 以下の問題が分かりませんので、教えて頂けたら助かります。 # # [1] 授業単元:C言語 # # [2] 問題文: # http://ime.nu/codepad.org/hPrPD1Dw # 文字制限で入れれなかったため、上記のリンクで問題文を書きました。 # ファイル形式は無視してください。 # # [問1] 前回と同様に国語と数学の2科目のテストの成績を処理するプログラムを作る。 # 今回はそれぞれの科目の期末テストが合格か否かを判定したい。 # つまり前回の構造体に合格かどうかを格納する変数も必要だ。そのため、対応する # 名前のメンバーを構造体に増やす必要がある。しかし、メンバーが増えすぎると # 構造体が煩雑になって見た目にわかりにくくなることは否めない。 # そこで、今回はもっとスマートな汎用性の高いデータ構造の構築を目指そう。 # すなわち、構造体をもう1つ用意して # # struct each_score { # ??? ???; //点数 # ??? ???; //合格・不合格 # }; # # struct SEISEKI { # char name[50]; # struct each_score kokugo; # struct each_score sugaku; # }; # # としてみよう。 # 見た目にはstruct SEISEKIのメンバーの数には変わりがないことが分かるだろうか。 # しかし、そのメンバーの型がstruct each_scoreとなっていて、それぞれが # 点数のみならず、合格・不合格の情報を格納できるというわけである。 # # struct each_score の「??? ???」部分を補った上で、 # それぞれの成績がborderlineで表される成績を上回っているか否かを判定し、 # 合格・不合格を表すメンバーに1(合格の意味)もしくは0(不合格の意味)の値を # 代入して3人の学生の合否データを含めた記録を作ろう。3人の成績データを # 格納するデータ構造は、配列を利用して次のように定義できる。 # # struct SEISEKI score[3]; # # ついては、各人の成績データから合否判定をして合格・不合格情報をデータ構造に書きこむ関数 # void check_score(int borderline, struct SEISEKI *a) /* 引数aの前に'*'が付いていることに注意されたい */ # を定義して、その動作を確認する(すべての人の成績を入力し、データ構造に書きこみ、合否判定をして全結果を表示する)プログラムkadai8-1.cを作りなさい。 # 但し、ボーダーラインは60点とする。(必ず上記の型通りのcheck_scoreを定義し、引数borderlineを使用するようにプログラムを書きなさい) # # また、結果の表示を行うために、前回の課題同様に表示用の関数 # void print_score(struct SEISEKI a); # を作りなおして、使用するように。今回は合格・不合格も表示する。 # # ただし、答えの入力は前回と全く同じで、 # ex. 入力例: # yamauchi 60 70 yamada 30 90 tougou 70 80 # # 表示はつぎのフォーマットで行うようにせよ。 # 最終出力の例: # name: yamauchi # kokugo 60 : accept # sugaku 70 : accept # name: yamada # kokugo 30 : rejection # sugaku 90 : accept # name: tougou # kokugo 70 : accept # sugaku 80 : accept 合否閾値(国語,73). 合否閾値(数学,80). '国語と数学の2科目のテストの成績を入力して、それぞれの科目の期末テストが合格か否かを判定する'(_入力する人数,_試験種類) :- abolish(テスト成績/5), 国語と数学の成績入力して(_入力する人数,_氏名,_国語点数,_数学点数,_残り人数), 合格か否かを判定する(_国語点数,_数学点数,_国語の判定,_数学の判定), '氏名・点数・判定結果をテスト成績述語として定義する'(_氏名,_試験種類,国語,_国語点数,_国語の判定,_数学の点数,_数学の判定), _残り人数 = 0. 国語と数学の成績入力して(_入力する人数,_氏名,_国語点数,_数学点数,_残り人数) :- '何番目の入力・残り人数'(_何番目,_残り人数), 氏名と国語と数学の点数の入力(_何番目,_氏名,_国語点数,_数学点数). '何番目の入力・残り人数'(_何番目,_入力後の残り人数) :- length(L,_入力する人数), append(Ln,[_|R],L), length(Ln,_何番目), length(R,_入力後の残り人数). 氏名と国語と数学の点数の入力(_何番目,_氏名,_国語点数,_数学点数) :- writef('%t 番目の入力 : 氏名を入力してください : ',[_何番目]), 氏名の入力(_氏名), 国語点数の入力(_国語点数), 数学点数の入力(_数学点数). 氏名の入力(_氏名) :- get_line(_氏名). 国語点数の入力(_国語点数) :- get_line(Line), 国語点数の入力診断(Line,_国語点数),!. 国語点数の入力(_国語点数) :- 国語点数の入力(_国語点数). 国語点数の入力診断(Line,_国語点数) :- atom_to_term(Line,_国語点数,_), integer(_国語点数), _国語点数 >= 0, _国語点数 =< 100,!. 国語点数の入力診断(Line,_国語点数) :- 再入力指示(Line,国語). 数学点数の入力(_数学点数) :- get_line(Line), 数学点数の入力診断(Line,_数学点数),!. 数学点数の入力(_数学点数) :- 数学点数の入力(_数学点数). 数学点数の入力診断(Line,_数学点数) :- atom_to_term(Line,_数学点数,_), integer(_数学点数), _数学点数 >= 0, _数学点数 =< 100,!. 数学点数の入力診断(Line,_数学点数) :- 再入力指示(Line,数学). 再入力指示(Line,_科目) :- writef('入力された %t からは適切な%t点数が得られません。再入力をお願いします。\n',[Line,_科目]), fail. 合格か否かを判定する(_国語点数,_数学点数,_国語の判定,_数学の判定) :- 合格か否かを判定する(国語,_国語点数,_国語の判定), 合格か否かを判定する(数学,_数学点数,_数学の判定). 合格か否かを判定する(_科目,_点数,合格) :- 合否閾値(_科目,_下限値), _点数 >= _下限値,!. 合格か否かを判定する(_,_,不合格). '氏名・点数・判定結果をテスト成績述語として定義する'(_氏名,_試験種類,国語,_国語点数,_国語の判定,_数学の点数,_数学の判定) :- assertz(テスト成績(_氏名,_試験種類,国語,_国語点数,_国語の判定)), assertz(テスト成績(_氏名,_試験種類,数学,_数学点数,_数学の判定)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/28 # # 以下の問題が分かりませんので、教えて頂けたら助かります。 # # [1] 授業単元:C言語 # # [2] 問題文: # http://ime.nu/codepad.org/hPrPD1Dw # 文字制限で入れれなかったため、上記のリンクで問題文を書きました。 # ファイル形式は無視してください。 # # [問1] 前回と同様に国語と数学の2科目のテストの成績を処理するプログラムを作る。 # 今回はそれぞれの科目の期末テストが合格か否かを判定したい。 # つまり前回の構造体に合格かどうかを格納する変数も必要だ。そのため、対応する # 名前のメンバーを構造体に増やす必要がある。しかし、メンバーが増えすぎると # 構造体が煩雑になって見た目にわかりにくくなることは否めない。 # そこで、今回はもっとスマートな汎用性の高いデータ構造の構築を目指そう。 # すなわち、構造体をもう1つ用意して # # struct each_score { # ??? ???; //点数 # ??? ???; //合格・不合格 # }; # # struct SEISEKI { # char name[50]; # struct each_score kokugo; # struct each_score sugaku; # }; # # としてみよう。 # 見た目にはstruct SEISEKIのメンバーの数には変わりがないことが分かるだろうか。 # しかし、そのメンバーの型がstruct each_scoreとなっていて、それぞれが # 点数のみならず、合格・不合格の情報を格納できるというわけである。 # # struct each_score の「??? ???」部分を補った上で、 # それぞれの成績がborderlineで表される成績を上回っているか否かを判定し、 # 合格・不合格を表すメンバーに1(合格の意味)もしくは0(不合格の意味)の値を # 代入して3人の学生の合否データを含めた記録を作ろう。3人の成績データを # 格納するデータ構造は、配列を利用して次のように定義できる。 # # struct SEISEKI score[3]; # # ついては、各人の成績データから合否判定をして合格・不合格情報をデータ構造に書きこむ関数 # void check_score(int borderline, struct SEISEKI *a) /* 引数aの前に'*'が付いていることに注意されたい */ # を定義して、その動作を確認する(すべての人の成績を入力し、データ構造に書きこみ、合否判定をして全結果を表示する)プログラムkadai8-1.cを作りなさい。 # 但し、ボーダーラインは60点とする。(必ず上記の型通りのcheck_scoreを定義し、引数borderlineを使用するようにプログラムを書きなさい) # # また、結果の表示を行うために、前回の課題同様に表示用の関数 # void print_score(struct SEISEKI a); # を作りなおして、使用するように。今回は合格・不合格も表示する。 # # ただし、答えの入力は前回と全く同じで、 # ex. 入力例: # yamauchi 60 70 yamada 30 90 tougou 70 80 # # 表示はつぎのフォーマットで行うようにせよ。 # 最終出力の例: # name: yamauchi # kokugo 60 : accept # sugaku 70 : accept # name: yamada # kokugo 30 : rejection # sugaku 90 : accept # name: tougou # kokugo 70 : accept # sugaku 80 : accept 国語合否閾値(73). 数学合否閾値(80). '国語と数学の2科目のテストの成績を入力して、それぞれの科目の期末テストが合格か否かを判定する'(_入力する人数,_試験種類) :- abolish(テスト成績/5), 国語と数学の成績入力して(_入力する人数,_氏名,_国語点数,_数学点数,_残り人数), 合格か否かを判定する(_国語点数,_数学点数,_国語の判定,_数学の判定), '氏名・点数・判定結果をテスト成績述語として定義する'(_氏名,_試験種類,国語,_国語点数,_国語の判定,_数学の点数,_数学の判定), _残り人数 = 0. 国語と数学の成績入力して(_入力する人数,_氏名,_国語点数,_数学点数,_残り人数) :- length(L,_入力する人数), append(Ln,[_|R],L), length(Ln,_何番目), 氏名と国語と数学の点数の入力(_何番目,_氏名,_国語点数,_数学点数), length(R,_残り人数). 氏名と国語と数学の点数の入力(_何番目,_氏名,_国語点数,_数学点数) :- writef('%t 番目の入力 : 氏名を入力してください : ',[_何番目]), get_line(_氏名), 国語点数の入力(_国語点数), 数学点数の入力(_数学点数). 国語点数の入力(_国語点数) :- get_line(Line), 国語点数の入力診断(Line,_国語点数),!. 国語点数の入力(_国語点数) :- 国語点数の入力(_国語点数). 国語点数の入力診断(Line,_国語点数) :- atom_to_term(Line,_国語点数,_), integer(_国語点数), _国語点数 >= 0, _国語点数 =< 100,!. 国語点数の入力診断(Line,_国語点数) :- 再入力指示(Line,国語). 数学点数の入力(_数学点数) :- get_line(Line), 数学点数の入力診断(Line,_数学点数),!. 数学点数の入力(_数学点数) :- 数学点数の入力(_数学点数). 数学点数の入力診断(Line,_数学点数) :- atom_to_term(Line,_数学点数,_), integer(_数学点数), _数学点数 >= 0, _数学点数 =< 100,!. 数学点数の入力診断(Line,_数学点数) :- 再入力指示(Line,数学). 再入力指示(Line,_科目) :- writef('入力された %t からは適切な%t点数が得られません。再入力をお願いします。\n',[Line,_科目]), fail. 合格か否かを判定する(_国語点数,_数学点数,_国語の判定,_数学の判定) :- 国語が合格か否かを判定する(_国語点数,_国語の判定), 数学が合格か否かを判定する(_数学点数,_数学の判定). 国語が合格か否かを判定する(_国語点数,合格) :- 国語合否閾値(_下限値), _国語点数 >= _下限値,!. 国語が合格か否かを判定する(_国語点数,不合格). 数学が合格か否かを判定する(_数学点数,合格) :- 数学合否閾値(_下限値), _数学点数 >= _下限値,!. 数学が合格か否かを判定する(_数学点数,不合格). '氏名・点数・判定結果をテスト成績述語として定義する'(_氏名,_試験種類,国語,_国語点数,_国語の判定,_数学の点数,_数学の判定) :- assertz(テスト成績(_氏名,_試験種類,国語,_国語点数,_国語の判定)), assertz(テスト成績(_氏名,_試験種類,数学,_数学点数,_数学の判定)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/994 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # まずテストを受けた生徒の人数を入力し、 # それから各生徒の国語・数学・英語の点数(0〜100点の整数値)を入力して # 2次元の配列に格納したうえで、生徒別の合計点・平均点と科目別の合計点・平均点とを # 小数点以下まで計算して表示するプログラムを作成しなさい。 # ただしテストを受ける生徒の人数は20人以下とする。 # 'まずテストを受けた生徒の人数を入力し(ただしテストを受ける生徒の人数は20人以下)、それから各生徒の国語・数学・英語の点数(0〜100点の整数値)を入力して2次元の配列に格納したうえで、生徒別の合計点・平均点と科目別の合計点・平均点とを小数点以下まで計算して表示する。' :- 'まずテストを受けた生徒の人数を入力し(ただしテストを受ける生徒の人数は20人以下)'(_生徒の人数), 'それから各生徒の国語・数学・英語の点数(0〜100点の整数値)を入力して2次元の配列に格納したうえで'(_生徒の人数,_生徒の二次元得点ならび), '生徒別の合計点・平均点と科目別の合計点・平均点とを小数点以下まで計算して表示する'(_生徒の人数,_生徒の二次元得点ならび). 'まずテストを受けた生徒の人数を入力し(ただしテストを受ける生徒の人数は20人以下)'(_生徒の人数) :- get_line(Line), '診断: 生徒の人数を入力し(ただしテストを受ける生徒の人数は20人以下)'(Line,_生徒の人数),!. 'まずテストを受けた生徒の人数を入力し(ただしテストを受ける生徒の人数は20人以下)'(_生徒の人数) :- 'まずテストを受けた生徒の人数を入力し(ただしテストを受ける生徒の人数は20人以下)'(_生徒の人数). '診断: 生徒の人数を入力し(ただしテストを受ける生徒の人数は20人以下)'(Line,_生徒の人数) :- atom_to_term(Line,_生徒の人数), ただしテストを受ける生徒の人数は20人以下(_生徒の人数),!. '診断: 生徒の人数を入力し(ただしテストを受ける生徒の人数は20人以下)'(Line,_生徒の人数) :- writef('入力された %t からは20人以下の生徒数が得られません。再入力をお願いします。\n',[Line]), fail. ただしテストを受ける生徒の人数は20人以下(_生徒の人数) :- integer(_生徒の人数), _生徒の人数 > 0, _生徒の人数 =< 20. 'それから各生徒の国語・数学・英語の点数(0〜100点の整数値)を入力して2次元の配列に格納したうえで'(_生徒の人数,_生徒の二次元得点ならび) :- length(_生徒の二次元得点ならび,_生徒の人数), findall([_国語の点数,_数学の点数,_英語の点数],( append(Ln,[_|_],_生徒の二次元得点ならび), '国語・数学・英語の点数(0〜100点の整数値)を入力して'(Ln,_国語の点数,_数学の点数,_英語の点数)), _生徒の二次元得点ならび). '国語・数学・英語の点数(0〜100点の整数値)を入力して'(Ln,_国語の点数,_数学の点数,_英語の点数) :- length([_|Ln],_何番目), writef('%t番目の生徒の国語・数学・英語の点数をカンマ区切りで入力してください : ',[_何番目]), get_line(Line), '診断: 国語・数学・英語の点数(0〜100点の整数値)を入力して'(Ln,Line,_国語の点数,_数学の点数,_英語の点数),!. '国語・数学・英語の点数(0〜100点の整数値)を入力して'(Ln,_国語の点数,_数学の点数,_英語の点数) :- '国語・数学・英語の点数(0〜100点の整数値)を入力して'(Ln,_国語の点数,_数学の点数,_英語の点数). '診断: 国語・数学・英語の点数(0〜100点の整数値)を入力して'(Ln,Line,_国語の点数,_数学の点数,_英語の点数) :- split(Line,[',',' '],[_国語の点数,_数学の点数,_英語の点数]), '0〜100点の整数値'(_国語の点数), '0〜100点の整数値'(_数学の点数), '0〜100点の整数値'(_英語の点数),!. '0〜100点の整数値'(_国語の点数) :- integer(_点数), _点数 >= 0, _点数 =< 100. '生徒別の合計点・平均点と科目別の合計点・平均点とを小数点以下まで計算して表示する'(_生徒の人数,_生徒の二次元得点ならび) :- '生徒別の合計点・平均点を小数点以下まで計算して表示する'(_生徒の人数,_生徒の二次元得点ならび), '科目別の合計点・平均点とを小数点以下まで計算して表示する'(_生徒の人数,_生徒の二次元得点ならび), '生徒別の合計点・平均点を小数点以下まで計算して表示する'(_生徒の人数,_生徒の二次元得点ならび) :- append(Ln,[_生徒の得点ならび|R],_生徒の二次元得点ならび), length([_|Ln],_何番目), sum(_生徒の得点ならび,_生徒の合計点), _生徒の平均点 is _生徒の合計点 / 3, writef('%t番目の生徒の合計点は %t, 平均点は %t です。\n',[_生徒の合計点,_生徒の平均点]), R = []. '科目別の合計点・平均点とを小数点以下まで計算して表示する'(_生徒の人数,_生徒の二次元得点ならび) :- 転置(_生徒の二次元得点ならび,[_国語の得点ならび,_数学の得点ならび,_英語の得点ならび]), 国語の合計点と平均点を表示する(_生徒の人数,_国語の得点ならび), 数学の合計点と平均点を表示する(_生徒の人数,_数学の得点ならび), 英語の合計点と平均点を表示する(_生徒の人数,_英語の得点ならび). 国語の合計点と平均点を表示する(_生徒の人数,_国語の得点ならび) :- sum(_国語の得点ならび,_国語の合計点), _国語の平均点 is _国語の合計点 / _生徒の人数, writef('国語の合計点は %t, 国語の平均点は %t です\n',[_国語の合計点,_国語の平均点]). 数学の合計点と平均点を表示する(_生徒の人数,_数学の得点ならび) :- sum(_数学の得点ならび,_数学の合計点), _数学の平均点 is _数学の合計点 / _生徒の人数, writef('数学の合計点は %t, 数学の平均点は %t です\n',[_数学の合計点,_数学の平均点]). 英語の合計点と平均点を表示する(_生徒の人数,_英語の得点ならび) :- sum(_英語の得点ならび,_英語の合計点), _英語の平均点 is _英語の合計点 / _生徒の人数, writef('英語の合計点は %t, 英語の平均点は %t です\n',[_英語の合計点,_英語の平均点]). % sum/2 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/972 # # #include # main(){ # int i,j; # j=1; # for(i=1;i<11;i++){ # j=i*j; # } # printf("j=%d",j); # return 0; # } # をwhile文に書き換える時に、 # 正の整数が入力される限り繰り返すときのwhileの条件文を教えてください # # '正の整数が入力される限りwhileを繰り返す' :- while(_i > 0,[_i],1,_j), writef('_j = %t\n',[_j]). while(_条件文,_変数リスト_1,_j_1,_j) :- 項複写変数指定付き(_条件文,_条件文_2,_変数リスト_1,_変数リスト_2), get_integer(_i), _j_2 is _i * _j_1, _条件文, while(_条件文_2,_変数リスト_2,_j_2,_j). while(_,_,_j,_j). % 項複写変数指定付き/4 % Prologで一番問題となる定義だ。 % % 高階述語の罠で、項を複写しないと、再帰中に一度束縛された変数が % 解かれずに、そのまま次の呼び出しの引数となり、failしてしまう。 % % それを回避するのが項複写変数指定付き/4。全く同型の別の複合項を % 複写して、その中の変数とこれも新たに生成された変数を結びつける。 % こうすることによって、受取側述語でもその変数の利用が可能になる。 % % もし、この部分がうまくできていないと、条件文中の変数が何であるか % ここでの場合では、get_integer(_i)の_iに当たる変数が引数の中の % 何であるかがわからない。項複写されたものは元の_iとは無縁だから。 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/617 # # [1] 授業単元:アルゴリズムとデータ構造 # [2] 問題文: http://ime.nu/codepad.org/lwC4tzs0 # このコードの関数addNewNodeToHeadとdeleteFirstNodeの中身を完成させてください。 # /*------------------------------------------------ # 連結リストの実装例(リストヘッドによる方法) # ------------------------------------------------*/ # #include # #include # # //DATA型を定義(正体は int 型) # typedef int DATA; # # //NODE型の構造体定義 # typedef struct node { # struct node *next; // 次のノードへのポインタ # DATA data; // データ部 # } NODE; # # //リストの先頭ポインタを保持する変数の宣言 # NODE list_head; # # //関数のプロトタイプ宣言 # void addNewNodeToHead( DATA* ); // 先頭ノードを追加 # void deleteFirstNode(); // 先頭ノードを削除 # void showList(); //リストの表示 # # /*--------------------------------------- # メイン関数 # ---------------------------------------*/ # int main() # { # int key; # DATA value = 1; //格納する値を生成するための変数 # # // リストヘッドの初期化 # list_head.next = NULL; # # //終了の 9 が入力されるまで繰り返す # while( key != 9 ) { # # //リストの表示 # showList(); # # //メニューを表示 # printf("1.先頭に追加,2.先頭を削除,9.終了:"); # # //メニュー番号の入力と分岐 # scanf("%d",&key); # switch( key ) { # # case 1: //リストの先頭にデータを追加 # # //追加するDATA(いまは整数値)を引数に追加関数をよぶ # addNewNodeToHead( &value ); //注意:ノードを追加後,ついでに value をインクリメントしている # break; # # case 2: //先頭のデータを削除 # # //先頭の要素を削除する関数をよぶ # deleteFirstNode(); # break; # } # } # # return 0; # } # # //リストの先頭にノードを追加する # void addNewNodeToHead( DATA *d ) # { # NODE *newNode, *pos; # # # } # # // リストの先頭ノードを削除する # void deleteFirstNode() # { # NODE *pos, *prevNode; # # # } # # //連結リストの状態を表示する # void showList() # { # NODE *pos; //読み出し位置にあるノードへのポインタ変数 # # //最初のノードのアドレスを取得(注意: リストが空の場合は NULL が入っている) # pos = list_head.next; # # //末尾のノードまで繰り返す # while ( pos != NULL ) { # printf("%d ", pos->data); //データ参照して表示 # pos = pos->next; //次のノードに進む # } # # printf("\n\n"); # } # 実行結果 # 1.n番目を追加、2.n番目を削除、9.終了:1 # 何番目を追加しますか:1 # 1: 1 # 1.n番目を追加、2.n番目を削除、9.終了:1 # 何番目を追加しますか:2 # 2: 1 2 # 1.n番目を追加、2.n番目を削除、9.終了:1 # 何番目を追加しますか:2 # 3: 1 3 2 # 1.n番目を追加、2.n番目を削除、9.終了:2 # 何番目を削除しますか:2 # 2: 1 3 # 1.n番目を追加、2.n番目を削除、9.終了:2 # 何番目を削除しますか:3 # 3番目の要素はありません。 # 2: 1 3 # 1.n番目を追加、2.n番目を削除、9.終了:2 # 何番目を削除しますか:2 # 1: 1 # 1.n番目を追加、2.n番目を削除、9.終了:9 # [3.3] 言語: C言語 [4] 期限:5月25日 [5] その他の制限: よろしくお願いします。 # 結び目(0,0,_). '終了の 9 が入力されるまで繰り返す'(_初期ならび,_実行終了時ならび) :- write('1.n番目を追加、2.n番目を削除、9.終了:1 \n'), get_integer(_メニュー番号), 実行の選択(_メニュー番号,_初期ならび,_実行終了時ならび). 実行の選択(9,_ならび,_ならび) :- !. 実行の選択(1,_実行前ならび,_実行終了時ならび) :- '1.n番目を追加'(_実行前ならび,_追加後のならび), '終了の 9 が入力されるまで繰り返す'(_追加後のならび,_実行終了時ならび). 実行の選択(2,_実行前ならび,_実行終了時ならび) :- '2.n番目を削除'(_実行前ならび,_削除後のならび), '終了の 9 が入力されるまで繰り返す'(_削除後のならび,_実行終了時ならび). '1.n番目を追加'(_実行前ならび,_追加後のならび) :- write('追加する要素番号を入力してください : '), get_integer(_n), write('追加する要素値を入力してください : '), get_line(_要素), 要素をn番目に挿入(_要素,_n). '2.n番目を削除'(_実行前ならび,_削除後のならび) :- write('追加する要素番号を入力してください : '), get_integer(_n), n番目の要素を取り除く(_n,_削除後のならび). 先頭に結び目を加える(_要素) :- 新しい結び目を得る(_新しい結び目), retract(結び目(0,_次の結び目,_)), asserta(結び目(_新しい結び目,_次の結び目,_要素)), assertz(結び目(0,_新しい結び目,_)). 末尾に結び目を加える(_要素) :- 新しい結びを得る(_新しい結び目), retract(結び目(_末尾の結び目,0,_末尾の要素)), asserta(結び目(_末尾の結び目,_新しい結び目,_末尾の要素)), asserta(結び目(_新しい結び目,0,_要素)). 先頭の結び目を取り除く :- retract(結び目(0,_先頭の結び目,_)), retract(結び目(_先頭の結び目,_次の結び目,_要素)), asserta(結び目(0,_次の結び目,_)). 末尾の結び目を取り除く(_ならび,_末尾の要素,_末尾の要素を除いたならび) :- retract(結び目(_末尾の結び目,0,_末尾の要素)), retract(結び目(_末尾の一つ前の結び目,_末尾の結び目,_末尾の一つ前の要素)), asserta(結び目(_末尾の一つ前の結び目,0,_末尾の一つ前の要素)). n番目の要素を表示(_n,_n番目の要素) :- 結び目(0,_最初の結び目,_), n番目の要素を得る(1,_n,_最初の結び目,_n番目の要素). n番目の要素を得る(_n,_n,_n番目の結び目,_n番目の要素) :- 結び目(_n番目の結び目,_,_n番目の要素),!. n番目の要素を得る(_n_1,_n,_n_1番目の結び目,_n番目の要素) :- _n_1 < _n, 結び目(_n_1番目の結び目,_n_2番目の結び目,_n番目の要素), _n_2 is _n_1 + 1, n番目の要素を得る(_n_2,_n,_n_2番目の結び目,_n番目の要素). n番目の要素を取り除く(_n,_n番目の要素) :- 結び目(0,_最初の結び目,_), n番目の結び目を取り除く(1,_n,_最初の結び目). n番目の結び目を取り除く(_n,_n,_n番目の結び目) :- retract(結び目(_n番目の結び目,_n_2番目の結び目,_n番目の要素)), retract(結び目(_n_1番目の結び,_n番目の結び目,_n_1番目の要素)), asserta(結び目(_n_1番目の結び,_n_2番目の結び目,_n_1番目の要素)),!. n番目の結び目を取り除く(_n_1,_n,_n_1番目の結び目) :- _n_1 < _n, 結び目(_n_1番目の結び目,_n_2番目の結び目,_), _n_2 is _n_1 + 1, n番目の結び目を取り除く(_n_2,_n,_n_2番目の結び目,_n番目の要素). n番目の結び目を挿入(_n,_n番目の要素) :- 結び目(0,_最初の結び目,_), n番目の結び目を挿入(1,_n,_最初の結び目,_n番目の要素). n番目の結び目を挿入(_n,_n,_現在のn番目の結び目,_n番目の要素) :- retract(結び目(_n_1番目の結び目,_現在のn番目の結び目,_n_1番目の要素)), 新しい結び目(_新しい結び目), asserta(結び目(_新しい結び目,_現在のn番目の結び目,_新しい要素)), asserta(結び目(_n_1番目の結び目,_新しい結び目,_n_1番目の要素)),!. n番目の結び目を挿入(_n_1,_n,_n_1番目の結び目,_n番目の要素) :- _n_1 < _n, 結び目(_n_1番目の結び目,_n_2番目の結び目,_), _n_2 is _n_1 + 1, n番目の結び目を挿入(_n_2,_n,_n_2番目の結び目,_n番目の要素). 新しい結び目(_新しい結び目) :- _新しい結び目 is (random(40000)+1) * (random(40000)+1), \+(結び目(_新しい結び目,_,_)),!. 新しい結び目(_新しい結び目) :- 新しい結び目(_新しい結び目). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/617 # # [1] 授業単元:アルゴリズムとデータ構造 # [2] 問題文: http://ime.nu/codepad.org/lwC4tzs0 # このコードの関数addNewNodeToHeadとdeleteFirstNodeの中身を完成させてください。 # /*------------------------------------------------ # 連結リストの実装例(リストヘッドによる方法) # ------------------------------------------------*/ # #include # #include # # //DATA型を定義(正体は int 型) # typedef int DATA; # # //NODE型の構造体定義 # typedef struct node { # struct node *next; // 次のノードへのポインタ # DATA data; // データ部 # } NODE; # # //リストの先頭ポインタを保持する変数の宣言 # NODE list_head; # # //関数のプロトタイプ宣言 # void addNewNodeToHead( DATA* ); // 先頭ノードを追加 # void deleteFirstNode(); // 先頭ノードを削除 # void showList(); //リストの表示 # # /*--------------------------------------- # メイン関数 # ---------------------------------------*/ # int main() # { # int key; # DATA value = 1; //格納する値を生成するための変数 # # // リストヘッドの初期化 # list_head.next = NULL; # # //終了の 9 が入力されるまで繰り返す # while( key != 9 ) { # # //リストの表示 # showList(); # # //メニューを表示 # printf("1.先頭に追加,2.先頭を削除,9.終了:"); # # //メニュー番号の入力と分岐 # scanf("%d",&key); # switch( key ) { # # case 1: //リストの先頭にデータを追加 # # //追加するDATA(いまは整数値)を引数に追加関数をよぶ # addNewNodeToHead( &value ); //注意:ノードを追加後,ついでに value をインクリメントしている # break; # # case 2: //先頭のデータを削除 # # //先頭の要素を削除する関数をよぶ # deleteFirstNode(); # break; # } # } # # return 0; # } # # //リストの先頭にノードを追加する # void addNewNodeToHead( DATA *d ) # { # NODE *newNode, *pos; # # # } # # // リストの先頭ノードを削除する # void deleteFirstNode() # { # NODE *pos, *prevNode; # # # } # # //連結リストの状態を表示する # void showList() # { # NODE *pos; //読み出し位置にあるノードへのポインタ変数 # # //最初のノードのアドレスを取得(注意: リストが空の場合は NULL が入っている) # pos = list_head.next; # # //末尾のノードまで繰り返す # while ( pos != NULL ) { # printf("%d ", pos->data); //データ参照して表示 # pos = pos->next; //次のノードに進む # } # # printf("\n\n"); # } # 実行結果 # 1.n番目を追加、2.n番目を削除、9.終了:1 # 何番目を追加しますか:1 # 1: 1 # 1.n番目を追加、2.n番目を削除、9.終了:1 # 何番目を追加しますか:2 # 2: 1 2 # 1.n番目を追加、2.n番目を削除、9.終了:1 # 何番目を追加しますか:2 # 3: 1 3 2 # 1.n番目を追加、2.n番目を削除、9.終了:2 # 何番目を削除しますか:2 # 2: 1 3 # 1.n番目を追加、2.n番目を削除、9.終了:2 # 何番目を削除しますか:3 # 3番目の要素はありません。 # 2: 1 3 # 1.n番目を追加、2.n番目を削除、9.終了:2 # 何番目を削除しますか:2 # 1: 1 # 1.n番目を追加、2.n番目を削除、9.終了:9 # [3.3] 言語: C言語 [4] 期限:5月25日 [5] その他の制限: よろしくお願いします。 # '終了の 9 が入力されるまで繰り返す'(_初期ならび,_実行終了時ならび) :- write('1.n番目を追加、2.n番目を削除、9.終了:1 \n'), get_integer(_メニュー番号), 実行の選択(_メニュー番号,_初期ならび,_実行終了時ならび). 実行の選択(9,_ならび,_ならび) :- !. 実行の選択(1,_実行前ならび,_実行終了時ならび) :- '1.n番目を追加'(_実行前ならび,_追加後のならび), '終了の 9 が入力されるまで繰り返す'(_追加後のならび,_実行終了時ならび). 実行の選択(2,_実行前ならび,_実行終了時ならび) :- '2.n番目を削除'(_実行前ならび,_削除後のならび), '終了の 9 が入力されるまで繰り返す'(_削除後のならび,_実行終了時ならび). '1.n番目を追加'(_実行前ならび,_追加後のならび) :- write('追加する要素番号を入力してください : '), get_integer(_n), write('追加する要素値を入力してください : '), get_line(_要素), 要素をn番目に挿入(_要素,_n,_ならび,_追加後のならび). '2.n番目を削除'(_実行前ならび,_削除後のならび) :- write('追加する要素番号を入力してください : '), get_integer(_n), n番目の要素を取り除く(_n,_ならび,_,_削除後のならび). 先頭に要素を加える(_要素,_ならび,[_要素|_ならび]). 末尾に要素を加える(_要素,_ならび,_末尾に要素を加えたならび) :- append(_ならび,[_要素],_末尾に要素を加えたならび). 先頭の要素を取り除く([_先頭の要素|_先頭の要素を除いたならび],_先頭の要素,_先頭の要素を除いたならび). 末尾の要素を取り除く(_ならび,_末尾の要素,_末尾の要素を除いたならび) :- append(_末尾の要素を除いたならび,[_末尾の要素],_ならび). n番目の要素を表示(_n,_ならび,_n番目の要素) :- length([_|L0],_n), append(L0,[_n番目の要素|_],_ならび), n番目の要素を取り除く(_n,_ならび,_n番目の要素,_n番目の要素を除いたならび) :- length([_|L0],_n), append(L0,[_n番目の要素|R],_ならび), append(L0,R,_n番目の要素を除いたならび). 要素をn番目に挿入(_要素,_n,_ならび,_要素をn番目に挿入されたならび) :- length([_|L1],_n), append(L1,L2,_ならび), append(L1,[_要素|L2],_要素をn番目に挿入されたならび). n番目の要素の置換(_n,_置換要素,_ならび,_n番目の要素を置換されたならび) :- length([_|L0],_n), append(L0,[_|R],_ならび), append(L0,[_置換要素|R],_n番目の要素を置換されたならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/589 # # [1] 授業単元:アルゴリズムとデータ構造 # [2] 問題文: http://ime.nu/codepad.org/lwC4tzs0 # このコードの関数addNewNodeToHeadとdeleteFirstNodeの中身を完成させてください。 # /*------------------------------------------------ # 連結リストの実装例(リストヘッドによる方法) # ------------------------------------------------*/ # #include # #include # # //DATA型を定義(正体は int 型) # typedef int DATA; # # //NODE型の構造体定義 # typedef struct node { # struct node *next; // 次のノードへのポインタ # DATA data; // データ部 # } NODE; # # //リストの先頭ポインタを保持する変数の宣言 # NODE list_head; # # //関数のプロトタイプ宣言 # void addNewNodeToHead( DATA* ); // 先頭ノードを追加 # void deleteFirstNode(); // 先頭ノードを削除 # void showList(); //リストの表示 # # /*--------------------------------------- # メイン関数 # ---------------------------------------*/ # int main() # { # int key; # DATA value = 1; //格納する値を生成するための変数 # # // リストヘッドの初期化 # list_head.next = NULL; # # //終了の 9 が入力されるまで繰り返す # while( key != 9 ) { # # //リストの表示 # showList(); # # //メニューを表示 # printf("1.先頭に追加,2.先頭を削除,9.終了:"); # # //メニュー番号の入力と分岐 # scanf("%d",&key); # switch( key ) { # # case 1: //リストの先頭にデータを追加 # # //追加するDATA(いまは整数値)を引数に追加関数をよぶ # addNewNodeToHead( &value ); //注意:ノードを追加後,ついでに value をインクリメントしている # break; # # case 2: //先頭のデータを削除 # # //先頭の要素を削除する関数をよぶ # deleteFirstNode(); # break; # } # } # # return 0; # } # # //リストの先頭にノードを追加する # void addNewNodeToHead( DATA *d ) # { # NODE *newNode, *pos; # # # } # # // リストの先頭ノードを削除する # void deleteFirstNode() # { # NODE *pos, *prevNode; # # # } # # //連結リストの状態を表示する # void showList() # { # NODE *pos; //読み出し位置にあるノードへのポインタ変数 # # //最初のノードのアドレスを取得(注意: リストが空の場合は NULL が入っている) # pos = list_head.next; # # //末尾のノードまで繰り返す # while ( pos != NULL ) { # printf("%d ", pos->data); //データ参照して表示 # pos = pos->next; //次のノードに進む # } # # printf("\n\n"); # } # 実行結果 # 1.先頭に追加、2.先頭を削除、9.終了:1 # 1 # 1.先頭に追加、2.先頭を削除、9.終了:1 # 2 1 # 1.先頭に追加、2.先頭を削除、9.終了:2 # 1 # 1.先頭に追加、2.先頭を削除、9.終了:2 # # 1.先頭に追加、2.先頭を削除、9.終了:2 # 削除するデータがありません # 1.先頭に追加、2.先頭を削除、9.終了:9 # リストの先頭にデータを追加(_データ,_リスト,[_データ|_リスト]). 先頭のデータを削除([_データ|_リスト],_取り除かれたデータ,_リスト). 先頭のデータを削除([],_,[]) :- write('データがありません。\n'). リストヘッドの初期化(_,[]). 実行(_現在のリスト,_実行後のリスト) :- メニューを表示, メニュー番号の入力と分岐(_現在のリスト,_メニュー番号,_実行後のリスト_1), リストの表示(_実行後のリスト_1), 実行の終了診断(_メニュー番号,_実行後のリスト_1,_実行後のリスト). 実行の終了診断(9,_実行後リスト_1,_実行後のリスト) :- !. 実行の終了診断(_,_実行後リスト_1,_実行後のリスト) :- 実行(_実行後リスト_1,_実行後のリスト). リストの表示(_リスト) :- length(_リスト,_リストの長さ), 表示パターンの生成(_リストの長さ,_表示パターン), writef(_表示パターン,_リスト), write('\n'). 表示パターンの生成(_リストの長さ,_表示パターン) :- length(L1,_リストの長さ), all(L1,'%t'), atomic_list_concat(L1,',',_表示パターン). メニューを表示 :- write('1.先頭に追加,2.先頭を削除,9.終了:'). メニュー番号の入力と分岐(_現在のリスト,_メニュー番号,_実行後のリスト) :- メニュー番号の入力(_メニュー番号), 分岐(_メニュー番号,_現在のリスト,_実行後のリスト). メニュー番号の入力(_メニュー番号) :- get_integer(_メニュー番号). 分岐(1,_現在のリスト,_実行後のリスト) :- 追加するデータを得る(_データ), リストの先頭にデータを追加(_データ,_現在のリスト,_実行後のリスト). 分岐(2,_現在のリスト,_実行後のリスト) :- 先頭のデータを削除(_現在のリスト,_,_実行後のリスト). 分岐(9,_リスト,_リスト). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/517 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # http://ime.nu/www1.axfc.net/uploader/Sc/so/347163 # # 学生番号 1 2 3 4 5 6 # グループA 35 63 25 62 73 53 # グループB 45 53 81 53 34 45 # グループC 56 76 34 45 67 65 # # 上記のグループ別学生毎の得点データを適当な整数型配列data[4][7]に読み込み、グループ別及び全体の平均点を計算せよ。 # '上記のグループ別学生毎の得点データを読み込み、グループ別及び全体の平均点を計算する' :- '上記のグループ別学生毎の得点データを読み込み'(LL), グループ別及び全体の平均点を計算する(LL,_グループ別平均点ならび,_全体の平均点), グループ別平均点を表示する(_グループ別平均点ならび), 全体の平均点を表示する(_全体の平均点). '上記のグループ別学生毎の得点データを読み込み'([]) :- at_end_of_stream(user_input),!. '上記のグループ別学生毎の得点データを読み込み'([L|R]) :- get_line(Line), split(Line,[' ','\t'],L), '上記のグループ別学生毎の得点データを読み込み'(R). グループ別及び全体の平均点を計算する(LL,_グループ別平均点ならび,_全体の平均点) :- グループ別平均点を計算する(LL,_グループ別平均点ならび), 全体の平均点を計算する(LL,_全体の平均点). グループ別平均点を計算する([_見出し部分|_グループ名付き得点表],_グループ別平均点ならび) :- findall([_グループ,_平均点],( member([_グループ|_得点ならび],_グループ名付き得点表), 相加平均(_得点ならび,_平均点)), _グループ別平均点ならび). 全体の平均点を計算する([_見出し部分|_グループ名付き得点表],_全体の平均点) :- findsum(_得点,( member([_グループ名|_得点ならび],_グループ名付き得点表]), member(_得点,_得点ならび)), _全体の平均点). グループ別平均点を表示する(_グループ別平均点ならび) :- append(_,[[_グループ,_平均点]|R],_グループ別平均点ならび), writef('%t の平均点: %t点\n',[_グループ,_平均点]), R = []. 全体の平均点を表示する(_全体の平均点) :- writef(' 全体の平均点: %t点\n',[_全体の平均点]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/423 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # 100点満点の試験の学生10人の得点データをキーボードから # 整数型配列data[10]に入力すると、最高点とその要素番号が出力されるプログラムを作成。 # 同点はないものとする。 # '100点満点の試験の学生10人の得点データをキーボードから入力すると、最高点とその要素番号が出力されるプログラムを作成。同点はないものとする。' :- '100点満点の試験の学生10人の得点データをキーボードから入力すると'([],_学生10人の得点データ), '最高点とその要素番号が出力される'(_学生10人の得点データ). '100点満点の試験の学生10人の得点データをキーボードから入力すると'(_学生10人の得点データ) :- length(_学生10人の得点データ,10), findall(_得点,( append(L0,[_得点|R],_学生10人の得点データ), '100点満点の得点の入力'(L0,_得点)), _学生10人の得点データ). '最高点とその要素番号が出力される'(_学生10人の得点データ) :- max(_学生10人の得点データ,_最高点), nth1(_要素番号,_学生10人の得点データ,_最高点), writef('最高点 = %t点, その要素番号(1起点) = %t\n',[_最高点,_要素番号]). '100点満点の得点(同点はないものとする)の入力'(L,L) :- length(L,10),!. '100点満点の得点(同点はないものとする)の入力'(_既に入力された得点ならび,L) :- length([_|_既に入力された得点ならび],_何人目), writef('%t人目の得点を入力してください : ',[_何人目]), get_line(Line), '100点満点の得点(同点はないものとする)の入力診断'(Line,_既に入力された得点ならび,_得点), append(_既に入力された得点ならび,[_得点],_入力された得点を加えたならび), '100点満点の得点(同点はないものとする)の入力'(_入力された得点を加えたならび,L),!. '100点満点の得点の入力'(_既に入力された得点ならび,L) :- '100点満点の得点の入力'(_既に入力された得点ならび,L). '100点満点の得点(同点はないものとする)の入力診断'(Line,_既に入力された得点ならび,_得点) :- atom_to_term(Line,_得点,_), integer(_得点), _得点 =< 100,!, 同点はないものとする(_得点,_既に入力された得点ならび). '100点満点の得点(同点はないものとする)の入力診断'(Line,_得点) :- writef('入力された%tからは適切な得点が得られません。再入力をお願いします。\n',[Line]), fail. 同点はないものとする(_得点,_既に入力された得点ならび) :- \+(member(_得点,_既に入力された得点ならび)),!. 同点はないものとする(_得点,_既に入力された得点ならび) :- writef('得点%tは既に入力されています。別の得点を入力しなおしてください。\n',[_得点]), fail. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/423 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # 100点満点の試験の学生10人の得点データをキーボードから # 整数型配列data[10]に入力すると、最高点とその要素番号が出力されるプログラムを作成。 # 同点はないものとする。 # '100点満点の試験の学生10人の得点データをキーボードから入力すると、最高点とその要素番号が出力されるプログラムを作成。同点はないものとする。' :- '100点満点の試験の学生10人の得点データをキーボードから入力すると'(_学生10人の得点データ), '最高点とその要素番号が出力される'(_学生10人の得点データ). '100点満点の試験の学生10人の得点データをキーボードから入力すると'(_学生10人の得点データ) :- length(_学生10人の得点データ,10), findall(_得点,( append(L0,[_得点|R],_学生10人の得点データ), '100点満点の得点の入力'(L0,_得点)), _学生10人の得点データ). '最高点とその要素番号が出力される'(_学生10人の得点データ) :- max(_学生10人の得点データ,_最高点), nth1(_要素番号,_学生10人の得点データ,_最高点), writef('最高点 = %t点, その要素番号(1起点) = %t\n',[_最高点,_要素番号]). '100点満点の得点の入力'(L0,_得点) :- length([_|L0],_何人目), writef('%t人目の得点を入力してください : ',[_何人目]), get_line(Line), '100点満点の得点の入力診断'(Line,_得点),!. '100点満点の得点の入力'(L0,_得点) :- '100点満点の得点の入力'(L0,_得点). '100点満点の得点の入力診断'(Line,_得点) :- atom_to_term(Line,_得点,_), integer(_得点), _得点 =< 100,!. '100点満点の得点の入力診断'(Line,_得点) :- writef('入力された%tからは適切な得点が得られません。再入力をお願いします。\n',[Line]), fail. % % この一般的な入力プログラムはこの課題には適さない。 % バックトラックしての入力はこれまでどのような入力があったかを % 検査することができない。 % この課題では同点はないものとするという条件があり、これを入力時に % 検査する為には再帰的な制御、すなわち集約が必要になる。 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/334 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # http://ime.nu/codepad.org/4r1e9DdC # 上記のransuu関数を用いて、以下のような数当てゲームプログラムを作成せよ。 # このプログラムはmain関数とransuu関数からなるプログラム。 # 1) 1から100までの整数乱数を1つ発生させる。 # 2) 利用者に1から100までのある整数を入力してもらう。 # 3) 発生した乱数と入力した数が同じなら"当り"、乱数の方が入力した数よりも大きければ"もっと大きい"、乱数の方が入力した数よりも小さければ"もっと小さい"、と表示する。 # 4) 数を当てることができなかった場合には、もう一度数を入力してもらう。 # 5) 6回以内に当たった場合には"あなたの勝ち"と表示して終了。6回続けて外れた場合には"あなたの負け"と表示して終了。 # 数当てゲームプログラム :- '1) 1から100までの整数乱数を1つ発生させる。'(_1から100までの整数乱数), 数当てゲームプログラム([],_1から100までの整数乱数,_). 数当てゲームプログラム(_試行回数,_1から100までの整数乱数,_診断) :- \+(var(_診断)), '5) 6回以内に当たった場合には"あなたの勝ち"と表示して終了。6回続けて外れた場合には"あなたの負け"と表示して終了。'(_試行回数,_診断),!. 数当てゲームプログラム(_試行回数,_1から100までの整数乱数,_) :- '2) 利用者に1から100までのある整数を入力してもらう。'(_利用者が入力する1から100までのある整数), '3) 発生した乱数と入力した数が同じなら"当り"、乱数の方が入力した数よりも大きければ"もっと大きい"、乱数の方が入力した数よりも小さければ"もっと小さい"、と表示する。'(_1から100までの整数乱数,_利用者が入力する1から100までの整数), '4) 数を当てることができなかった場合には、もう一度数を入力してもらう。'(_診断,_利用者が入力する1から100までのある整数), 数当てゲームプログラム([_|_試行回数],_1から100までの整数乱数,_診断), '1) 1から100までの整数乱数を1つ発生させる。'(_1から100までの整数乱数) :- _1から100までの整数乱数 is random(100) + 1. '2) 利用者に1から100までのある整数を入力してもらう。'(_利用者が入力する1から100までのある整数) :- write('1から100までの整数を入力してください : '), get_line(Line), '1から100までの整数入力診断'(Line,_利用者が入力する1から100までのある整数),!. '2) 利用者に1から100までのある整数を入力してもらう。'(_利用者が入力する1から100までのある整数) :- '2) 利用者に1から100までのある整数を入力してもらう。'(_利用者が入力する1から100までのある整数). '1から100までの整数入力診断'(Line,_利用者が入力する1から100までのある整数) :- atom_to_term(Line,_利用者が入力する1から100までのある整数,_), integer(_利用者が入力する1から100までのある整数), _利用者が入力する1から100までのある整数 >= 1, _利用者が入力する1から100までのある整数 =< 100,!. '1から100までの整数入力診断'(Line,_利用者が入力する1から100までのある整数) :- writef('入力された %t からは1から100までの整数が得られません。\n',[Line]), fail. '3) 発生した乱数と入力した数が同じなら"当り"、乱数の方が入力した数よりも大きければ"もっと大きい"、乱数の方が入力した数よりも小さければ"もっと小さい"、と表示する。'(_数,_数) :- write('当り\n'). '3) 発生した乱数と入力した数が同じなら"当り"、乱数の方が入力した数よりも大きければ"もっと大きい"、乱数の方が入力した数よりも小さければ"もっと小さい"、と表示する。'(_発生した乱数,_入力した数) :- _発生した乱数 > _入力した数, write('もっと大きい\n'). '3) 発生した乱数と入力した数が同じなら"当り"、乱数の方が入力した数よりも大きければ"もっと大きい"、乱数の方が入力した数よりも小さければ"もっと小さい"、と表示する。'(_発生した乱数,_入力した数) :- _発生した乱数 < _入力した数, write('もっと小さい\n'). '4) 数を当てることができなかった場合には、もう一度数を入力してもらう。'(当り,_) :- !. '4) 数を当てることができなかった場合には、もう一度数を入力してもらう。'(_診断,_利用者が入力する1から100までのある整数) :- \+(_診断 = 当り), fail. 'もう一度数を入力してもらう。'(_利用者が入力する1から100までのある整数) :- '2) 利用者に1から100までのある整数を入力してもらう。'(_利用者が入力する1から100までのある整数). '5) 6回以内に当たった場合には"あなたの勝ち"と表示して終了。6回続けて外れた場合には"あなたの負け"と表示して終了。'(_,当り) :- write('あなたの勝ち\n'),!. '5) 6回以内に当たった場合には"あなたの勝ち"と表示して終了。6回続けて外れた場合には"あなたの負け"と表示して終了。'([_,_,_,_,_,_],_) :- write('あなたの負け\n'),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/235 # # [1] 授業単元:プログラミング # [2] 問題文: # # ransuu関数は整数型の引数uを受け取ると1からuまでの乱数を返す。 # この関数を用いて、1から6までの乱数を100回発生させる。 # 1から6までのそれぞれの数が発生した回数を出力しなさい。 # http://ime.nu/codepad.org/2MXb2oGy # ransuu(_u,_1からuまでの乱数) :- 整数型の引数uを受け取ると1からuまでの乱数を返す(_u,_1からuまでの乱数). 整数型の引数uを受け取ると1からuまでの乱数を返す(_u,_1からuまでの乱数) :- _1からuまでの乱数 is random(_u) + 1. '1から6までの乱数を100回発生させる。1から6までのそれぞれの数が発生した回数を出力しなさい。' :- '1から6までの乱数を100回発生させる。1から6までのそれぞれの数が発生した回数を出力しなさい。'(1,0,0,0,0,0,0,_1,_2,_3,_4,_5,_6), writef('乱数出現度数\n1 = %t\n2 = %t\n3 = %t\n4 = %t\n5 = %t\n6 = %t\n',[_1,_2,_3,_4,_5,_6]). '1から6までの乱数を100回発生させる。1から6までのそれぞれの数が発生した回数を出力しなさい。'(N,_1,_2,_3,_4,_5,_6,_1,_2,_3,_4,_5,_6) :- N > 100,!. '1から6までの乱数を100回発生させる。1から6までのそれぞれの数が発生した回数を出力しなさい。'(N,_1_1,_2_1,_3_1,_4_1,_5_1,_6_1,_1,_2,_3,_4,_5,_6) :- ransuu(6,_発生した乱数), 度数加算(_発生した乱数,_1_1,_2_1,_3_1,_4_1,_5_1,_6_1,_1_2,_2_2,_3_2,_4_2,_5_2,_6_2), N_2 is N + 1, '1から6までの乱数を100回発生させる。1から6までのそれぞれの数が発生した回数を出力しなさい。'(N_2,_1_2,_2_2,_3_2,_4_2,_5_2,_6_2,_1,_2,_3,_4,_5,_6). 度数加算(1,_1_1,_2,_3,_4,_5,_6,_1_2,_2,_3,_4,_5,_6) :- _1_2 is _1_1 + 1,!. 度数加算(2,_1,_2_1,_3,_4,_5,_6,_1,_2_2,_3,_4,_5,_6) :- _2_2 is _2_1 + 1,!. 度数加算(3,_1,_2,_3_1,_4,_5,_6,_1,_2,_3_2,_4,_5,_6) :- _3_2 is _3_1 + 1,!. 度数加算(4,_1,_2,_3,_4_1,_5,_6,_1,_2,_3,_4_2,_5,_6) :- _4_2 is _4_1 + 1,!. 度数加算(5,_1,_2,_3,_4,_5_1,_6,_1,_2,_3,_4,_5_2,_6) :- _5_2 is _5_1 + 1,!. 度数加算(6,_1,_2,_3,_4,_5,_6_1,_1,_2,_3,_4,_5,_6_2) :- _6_2 is _6_1 + 1,!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/235 # # [1] 授業単元:プログラミング # [2] 問題文: # # ransuu関数は整数型の引数uを受け取ると1からuまでの乱数を返す。 # この関数を用いて、1から6までの乱数を100回発生させる。 # 1から6までのそれぞれの数が発生した回数を出力しなさい。 # http://ime.nu/codepad.org/2MXb2oGy # ransuu(_u,_1からuまでの乱数) :- 整数型の引数uを受け取ると1からuまでの乱数を返す(_u,_1からuまでの乱数). 整数型の引数uを受け取ると1からuまでの乱数を返す(_u,_1からuまでの乱数) :- _1からuまでの乱数 is random(_u) + 1. '1から6までの乱数を100回発生させる。1から6までのそれぞれの数が発生した回数を出力しなさい。' :- '1から6までの乱数を100回発生させる'(L), between(1,6,N), count(member(N,L),_発生した回数), writef('乱数 %t 発生数 %t回\n',[N,_発生した回数]), N = 6. '1から6までの乱数を100回発生させる'(L) :- findall(_1から6までの乱数,( between(1,100,_), ransuu(6,_1から6までの乱数)), L). % 以下のサイトは # # 文学を課題に積極的に取り込もう。それは直感的な理解の大きな弼けとなるだろう。 # そして、文学を対象にしたプログラミング。そこはPrologの独壇場の世界だ。 # # 万葉集巻七1082は # # 水底の玉さへ清く見ゆべくも照る月夜かも夜のふけゆけば # # であるが、この句の順序を入れ替えてみると、 # # 水底の夜のふけゆけば見ゆべくも玉さへ清く照る月夜かも # # やや古今集的な味わいの作となる。 % % 万葉集の歌のように仕様に理解しにくい部分があれば例えば順序を入れ替える。 % 何が起きるかがここでのはなし。 % % 最初に元々の万葉集の歌を定義する。 水底の玉さへ清く見ゆべくも照る月夜かも夜のふけゆけば :- 水底の, 玉さへ清く, 見ゆべくも, 照る月夜かも, 夜のふけゆけば. % % 夜が深くなれば益々月の光もまして、という心の歌なのだが、 % 照る月夜かも夜のふけゆけば % は万葉振りではあるが接続は自然ではない。そこで以下のように % 句の順番を入れ替えて、流れを自然にしてみた。 % 水底の玉さへ清く見ゆべくも照る月夜かも夜のふけゆけば :- 水底の夜のふけゆけば見ゆべくも玉さへ清く照る月夜かも. 水底の夜のふけゆけば見ゆべくも玉さへ清く照る月夜かも :- 水底の, 夜のふけゆけば, 見ゆべくも, 玉さへ清く, 照る月夜かも. % % 仕様は多くの場合不完全である。プログラマはそれを補正しながら % 定義していくものだが、結果として、仕様と微妙な食い違いが生じる。 % この例では、以下の二点が気にかかる。 % 1) 副目標の順序を入れ替えて同じ意味が保てるか? % 2) 順序を入れ替えた仕様からは抜け落ちた意味がありそうだが、 % その点は大丈夫であろうか? % % 歌を例題にしたのはこの 2) について考察して、理解を深めるのに適しているから。 % % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/662 # # MySQL5 # # 開始日、終了日を持ったテーブルを日付単位に表示したいです。 # tbl_job は、以下の構造です。 # # id, name, start_date, end_date # --------------------------- # 1, JOB1, 2012-04-01, 2012-04-03 # 2, JOB2, 2012-04-02, 2012-04-04 # # 上記テーブルから以下のように日付単位でJOBを表示するSQLを教えてほしいです。 # # date, id, name # -------------------- # 2012-04-01, 1, JOB1 # 2012-04-02, 1, JOB1 # 2012-04-02, 2, JOB2 # 2012-04-03, 1, JOB1 # 2012-04-03, 2, JOB2 # 2012-04-04, 2, JOB2 # # '開始日、終了日を持ったテーブルを日付単位に表示したい' :- 日付単位tbl_jobの生成(_日付単位tbl_jobならび), findsetof(_日付,( member([_date,_,_],_日付単位tbl_jobならび)), _日付ならび), 日付単位に表示する(_日付ならび,_日付単位tbl_jobならび). 日付単位tbl_jobの生成(_日付単位tbl_jobならび) :- findall(_日付,( tbl_job(_id,_name,_start_date,_end_date), 日付の生成(_start_date,_end_date,_日付)), _日付単位tbl_jobならび). 日付の生成(_終了年-_終了月-_終了日,_終了年-_終了月-_終了日,_終了年-_終了月-_終了日) :- !. 日付の生成(_開始年-_開始月-_開始日,_終了年-_終了月-_終了日,_開始年-_開始月-_開始日). 日付の生成(_開始年-_開始月-_開始日,_終了年-_終了月-_終了日,_年-_月-_日) :- 翌日(_開始年,_開始月,_開始日,_翌日年,_翌日月,_翌日日), 日付の生成(_翌日年-_翌日月-_翌日日,_終了年-_終了月-_終了日,_年-_月-_日). 翌日(_年,12,31,_翌年,1,1) :- !. 翌日(_年,_月,30,_年,_翌月,1) :- member(_月,[4,6,9,11]), _翌月 is _月 + 1,!. 翌日(_年,_月,31,_年,_翌月,1) :- _翌月 is _月 + 1,!. 翌日(_年,2,29,_年,3,1) :- !. 翌日(_年,2,28,_年,3,1) :- \+(うるう年(_年)), 翌日(_年,_月,_日,_年,_月,_翌日) :- _翌日 is _日 + 1. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 日付単位に表示する(_日付ならび,_日付単位tbl_jobならび) :- member(_日付,_日付ならび), member([_日付,_id,_name],_日付単位tbl_jobならび), 日付の形式を整えながら一行表示する(_日付,_id,_name), fail. 日付単位に表示する(_日付ならび,_日付単位tbl_jobならび). 日付の形式を整えながら一行表示する(_年-_月-_日,_id,_name) :- swritef(S,'%2r-%2r-%2r',[_年-_月-_日]), 空白を0に置換した日付文字列(S,_空白を0に置換した日付文字列), writef('%t, %t, %t\n',[_空白を0に置換した日付文字列,_id,_name). 空白を0に置換した日付文字列(S,_空白を0に置換した日付文字列) :- findall(_文字_2,( sub_atom(S,_,1,_,_文字), 空白を0に置換(_文字,_文字_2)), _空白を0に置換した日付文字列). 空白を0に置換(' ','0') :- !. 空白を0に置換(A,A). % 以下のサイトは # I want to find all possible combinations of 3x3 matrix. But there is a rule that the digits occur just once and the sum on each line and column is the same. # # 私は3x3行列のすべての可能な組み合わせを見つけたい。しかし、数字は一度だけ発生し、各行の和と列が同じであるという規則があります。 # # 8 1 6 # 3 5 7 # 4 9 2 # '私は3x3行列のすべての可能な組み合わせを見つけたい。しかし、数字は一度だけ発生し、各行の和と列が同じであるという規則があります。'([[A,B,C],[D,E,F],[G,H,I]]) :- 順列([1,2,3,4,5,6,7,8,9],9,[A,B,C,D,E,F,G,H,I]), 各行の和と列が同じである(A,B,C,D,E,F,G,H,I). 各行の和と列が同じである(A,B,C,D,E,F,G,H,I) :- 各行の和(A,B,C,D,E,F,G,H,I,_各行の和でありしかも各列の和), 各列の和(A,B,C,D,E,F,G,H,I,_各行の和でありしかも各列の和). 各行の和(A,B,C,D,E,F,G,H,I,_各行の和でありしかも各列の和) :- _各行の和でありしかも各列の和 is A+B+C, _各行の和でありしかも各列の和 is D+E+F, _各行の和でありしかも各列の和 is G+H+I. 各列の和(A,B,C,D,E,F,G,H,I,_各行の和でありしかも各列の和) :- _各行の和でありしかも各列の和 is A+D+G, _各行の和でありしかも各列の和 is B+E+H, _各行の和でありしかも各列の和 is C+F+I. 順列(Y,0,[]). 順列(Y,N,[A|X]) :- del(A,Y,Z), M is N - 1, 順列(Z,M,X). del(A,[A|X],X). del(A,[B|X],[B|Y]) :- del(A,X,Y). % 以下のサイトは # 出典:: http://kohada.2ch.net/test/read.cgi/php/1168450843/821 # # 住所と番地の間にある空白を削除する場合どうやればいいですか? # 「見附市 見附 123番地」この文字列を # 「見附市 見附123番地」としたいです # 「見附市」と「見附」の間の空白はそのままという条件付です # 市(見附市). 住所と番地の間にある空白を削除する(_文字列,_住所と番地の間にある空白を削除された文字列) :- 空白で分割して空白を含む要素ならびを作る(_文字列,_要素ならび), 前の要素が市名でない番地前の空白を削除されたならび(_要素ならび,_前の要素が市名でない番地前の空白を削除されたならび), ならびを結合して住所と番地の間にある空白を削除された文字列を生成(_前の要素が市名でない番地前の空白を削除されたならび,_住所と番地の間にある空白を削除された文字列). 空白で分割して空白を含む要素ならびを作る(_文字列,_要素ならび) :- sPLIT(_文字列,[' '],L). 前の要素が市名でない番地前の空白を削除されたならび(_要素ならび,_前の要素が市名でない番地前の空白を削除されたならび) :- append(L1,[A|R2],[B|R3],L), 前の要素が市名でない番地前の空白を(A,B,R2), 削除されたならび(L1,A,B,R2,_前の要素が市名でない番地前の空白を削除されたならび). 前の要素が市名でない番地前の空白を(A,B,R2) :- \+(市名(A)), all(R2,' '), sub_atom(B,0,1,_,_B0), member(B0,['0','1','2','3','4','5','6','7','8','9']),!. 削除されたならび(L1,A,B,R2,_前の要素が市名でない番地前の空白を削除されたならび) :- append(L1,[A,B|R3],_前の要素が市名でない番地前の空白を削除されたならび). ならびを結合して住所と番地の間にある空白を削除された文字列を生成(_前の要素が市名でない番地前の空白を削除されたならび,_住所と番地の間にある空白を削除された文字列) :- atomic_list_concat(_前の要素が市名でない番地前の空白を削除されたならび,_住所と番地の間にある空白を削除された文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1332279659/40 # # まず雀頭1と順子4つになっているか確認 # その後19字牌がないがチェック ない場合成立 # 二杯口は順子をグループ化してふたつどういつかチェックすればいいんでね # 平和だけどタンヤオって時点で役牌じゃない&二杯口も前提条件だから # 両方が成立したとき自動的に成立 # # タンピンリャンペーコーを判定する専用ならこういうやり方でいいんでね # タンピンリャンペーコー(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P) :- 整列([A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P]),L1), タンピンリャンペーコー生成(L2), 整列(L2,L1). タンピンリャンペーコー生成([A,B,C,A,B,C,D,E,F,D,E,F,G,G]) :- '一・九を除く順子'(萬子,A,B,C), '一・九を除く順子'(筒子,D,E,F), 積集合([A,B,C],[D,E,F],[]). 雀頭(_子,G,G), \+(member(G,[A,B,C,D,E,F])). タンピンリャンペーコー生成([A,B,C,A,B,C,D,E,F,D,E,F,G,G]) :- '一・九を除く順子'(索子,A,B,C), '一・九を除く順子'(筒子,D,E,F), 積集合([A,B,C],[D,E,F],[]). 雀頭(_子,G,G), \+(member(G,[A,B,C,D,E,F])). タンピンリャンペーコー生成([A,B,C,A,B,C,D,E,F,D,E,F,G,G]) :- '一・九を除く順子'(萬子,A,B,C), '一・九を除く順子'(索子,D,E,F), 積集合([A,B,C],[D,E,F],[]). 雀頭(_子,G,G), \+(member(G,[A,B,C,D,E,F])). 雀頭(萬子,A,A) :- '一・九を除く字牌'(萬子,_萬子ならび), append(_,[A|_],_筒子ならび). 雀頭(索子,A,A) :- '一・九を除く字牌'(萬子,_索子ならび), append(_,[A|_],_索子ならび). 雀頭(筒子,A,A) :- '一・九を除く字牌'(筒子,_筒子ならび), append(_,[A|_],_筒子ならび). '一・九を除く順子'(萬子,A,B,C) :- '一・九を除く字牌'(萬子,_萬子ならび), append(_,[A,B,C|_],_筒子ならび). '一・九を除く順子'(索子,A,B,C) :- '一・九を除く字牌'(索子,_索子ならび), append(_,[A,B,C|_],_索子ならび). '一・九を除く順子'(筒子,A,B,C) :- '一・九を除く字牌'(筒子,_筒子ならび), append(_,[A,B,C|_],_筒子ならび). '一・九を除く字牌'(萬子,[二萬,三萬,四萬,五萬,六萬,七萬,八萬]). '一・九を除く字牌'(筒子,[二筒,三筒,四筒,五筒,六筒,七筒,八筒]). '一・九を除く字牌'(索子,[二索,三索,四索,五索,六索,七索,八索]). 整列([],[]). 整列([A|R],L) :- 分割(A,R,L1,L2), 整列(L1,L11), 整列(L2,L22), append(L11,[A|L22],L). 分割(A,[],[],[]). 分割(A,[B|R1],[B|R2],R3) :- A @>= B, 分割(A,R1,R2,R3). 分割(A,[B|R1],R2,[B|R3]) :- A @< B, 分割(A,R1,R2,R3). 積集合([],_,[]) :- !. 積集合([X|_集合1],_集合2,[X|_積集合]) :- member(X,_集合2), 積集合(_集合1,_集合2,_積集合),!. 積集合([X|_集合1],_集合2,_積集合) :- \+(member(X,_集合2)),!, 積集合(_集合1,_集合2,_積集合). % 以下のサイトは # # ランダムに生成された0から99までの1000個の整数からなるリストの要素を既出のものは # 除いて順に取り出す。 # 'ランダムに生成された0から99までの1000個の整数からなるリストの要素を既出のものは除いて順に取り出す'(X) :- findall(R,( for(1,N,1000), R is random(100)), L), append(L1,[X|_],L), \+(member(X,L1)). % 以下のサイトは # # ランダムに生成された0から99までの1000個の整数からなるリストの要素を既出のものは # 除いて順に取り出す。 # 'ランダムに生成された0から99までの1000個の整数からなるリストの要素を既出のものは除いて順に取り出す'(_要素) :- 'ランダムに生成された0から99までの1000個の整数からなるリストの'(_1000個の整数からなるリスト), 要素を既出のものは除いて順に取り出す(_1000個の整数からなるリスト,_要素). 'ランダムに生成された0から99までの1000個の整数からなるリストの'(_1000個のランダムに生成された整数からなるリスト) :- findall(_ランダムに生成された整数,( '1000個の'(_), 'ランダムに生成された0から99までの整数'(_ランダムに生成された整数)), _1000個のランダムに生成された整数からなるリスト). '1000個の'(_) :- for(1,_,1000). 'ランダムに生成された0から99までの整数'(_ランダムに生成された整数) :- _ランダムに生成された整数 is random(100). 要素を既出のものは除いて順に取り出す(_対象リスト,_要素) :- 要素を取り出す(_対象リスト,_既に取り出された要素のリスト,_要素), 既出のものは除いて(_既に取り出された要素のリスト,_要素). 要素を取り出す(_対象リスト,_既に取り出された要素のリスト,_要素) :- append(_既に取り出された要素のリスト,[_要素|_],_対象リスト). 既出のものは除いて(_既に取り出された要素のリスト,_要素) :- \+(member(_要素,_既に取り出された要素のリスト)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1258320456/308 # # ・1から2000までの数字が昇順に格納された # 要素2000個の配列を用意 # ・乱数にて1から2000までのキー値を生成し、 # 上記配列を二分探索で探索してキー値を見つけるまでの # 探索回数を記録 # ・以上を1000回繰り返し、平均探索回数を算出 # ・上記の平均探索回数を、理論値log2・2000と比較して示せ # # という宿題を出されたのですが、まるでわかりません。 # よろしくお願いします。 # # '1から2000までの数字が昇順に格納された要素2000個の配列を用意'(L) :- findall(N,for(1,N,2000),L). '1から2000までの数字が昇順に格納された要素2000個の配列を用意し、乱数にて1から2000までのキー値を生成し、上記配列を二分探索で探索してキー値を見つけるまでの探索回数を記録。以上を1000回繰り返し、平均探索回数を算出する'(_探索回数合計) :- '1から2000までの数字が昇順に格納された要素2000個の配列を用意'(L), findsum(_探索回数,( for(1,_,1000), _キー値 is random(2000) + 1, 上記配列を二分探索で探索してキー値を見つけるまでの探索回数を記録(1000,L,_キー値,_探索回数)), _探索回数合計). 上記配列を二分探索で探索してキー値を見つけるまでの探索回数を記録(_要素数,L,_キー値,_探索回数) :- 二分(_要素数,L,N1,N2,L1,A,L2), 上記配列を二分探索で探索してキー値を見つけるまでの探索回数を記録(N1,N2,L1,A,L2,_キー値,1,_探索回数). 上記配列を二分探索で探索してキー値を見つけるまでの探索回数を記録(N1,N2,L1,_キー値,L2,_キー値,_探索回数,_探索回数) :- !. 上記配列を二分探索で探索してキー値を見つけるまでの探索回数を記録(N1,N2,L1,A,L2,_キー値,_探索回数_1,_探索回数) :- _キー値 @< A, 上記配列を二分探索で探索してキー値を見つけるまでの探索回数を記録(N1,L1,_キー値,_探索回数_2), _探索回数 is _探索回数_1 + _探索回数_2,!. 上記配列を二分探索で探索してキー値を見つけるまでの探索回数を記録(N1,N2,L1,A,L2,_キー値,_探索回数_1,_探索回数) :- _キー値 @> A, 上記配列を二分探索で探索してキー値を見つけるまでの探索回数を記録(N2,L2,_キー値,_探索回数_2), _探索回数 is _探索回数_1 + _探索回数_2,!. 二分(_要素数,L,N,N,L1,A,L2) :- 1 is _要素数 mod 2, N is _要素数 // 2, append(L1,[A|L2],L), length(L1,N),!. 二分(_要素数,L,N,N_1,L1,A,L2) :- N is _要素数 // 2, N_1 is N - 1, append(L1,[A|L2],L), length(L1,N),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1258320456/308 # # ・1から2000までの数字が昇順に格納された # 要素2000個の配列を用意 # ・乱数にて1から2000までのキー値を生成し、 # 上記配列を二分探索で探索してキー値を見つけるまでの # 探索回数を記録 # ・以上を1000回繰り返し、平均探索回数を算出 # ・上記の平均探索回数を、理論値log2・2000と比較して示せ # # という宿題を出されたのですが、まるでわかりません。 # よろしくお願いします。 # # '1から2000までの数字が昇順に格納された要素2000個の配列を用意'(L) :- findall(N,for(1,N,2000),L). '1から2000までの数字が昇順に格納された要素2000個の配列を用意し、乱数にて1から2000までのキー値を生成し、上記配列を二分探索で探索してキー値を見つけるまでの探索回数を記録。以上を1000回繰り返し、平均探索回数を算出する'(_探索回数合計) :- '1から2000までの数字が昇順に格納された要素2000個の配列を用意'(L), findsum(_探索回数,( for(1,_,1000), _キー値 is random(2000) + 1, 上記配列を二分探索で探索してキー値を見つけるまでの探索回数を記録(1000,L,_キー値,_探索回数)), _探索回数合計). 上記配列を二分探索で探索してキー値を見つけるまでの探索回数を記録(_要素数,L,_キー値,_探索回数) :- 二分(_要素数,L,N1,N2,L1,A,L2), 上記配列を二分探索で探索してキー値を見つけるまでの探索回数を記録(N1,N2,L1,A,L2,_キー値,1,_探索回数). 上記配列を二分探索で探索してキー値を見つけるまでの探索回数を記録(N1,N2,L1,_キー値,L2,_キー値,_探索回数,_探索回数) :- !. 上記配列を二分探索で探索してキー値を見つけるまでの探索回数を記録(N1,N2,L1,A,L2,_キー値,_探索回数_1,_探索回数) :- _キー値 @< A, 上記配列を二分探索で探索してキー値を見つけるまでの探索回数を記録(N1,L1,_キー値,_探索回数_2), _探索回数 is _探索回数_1 + _探索回数_2,!. 上記配列を二分探索で探索してキー値を見つけるまでの探索回数を記録(N1,N2,L1,A,L2,_キー値,_探索回数_1,_探索回数) :- _キー値 @> A, 上記配列を二分探索で探索してキー値を見つけるまでの探索回数を記録(N2,L2,_キー値,_探索回数_2), _探索回数 is _探索回数_1 + _探索回数_2,!. 二分(_要素数,L,N,N,L1,A,L2) :- 1 is _要素数 mod 2, N is _要素数 // 2, append(L1,[A|L2],L), length(L1,N),!. 二分(_要素数,L,N,N_1,L1,A,L2) :- N is _要素数 // 2, N_1 is N - 1, append(L1,[A|L2],L), length(L1,N),!. % 以下のサイトは # # チャールスT.ホーングレン著 「管理会計」 小倉栄一郎・加藤勝康訳 1974年 日本生産性本部刊 p341より # # 問題 # # 予算に計上されたある会社の事業部活動にかんしてつぎのデータが与えられている。 # # 平均利用可能資産: # 受取資産 $ 100,000 # 棚卸資産 300,000 # 工場および設備(純額) 200,000 # --------- # $ 600,000 # ========= # 間接固定費 $ 200,000 # 変動単価 単位当たり$1 # 平均利用可能資産にたいする所要投資利益率 25% # 期待販売量 100,000単位 # # 問 # # 1.a. 平均利用可能資産にたいする所要投資利益率が得られるためには、どれほどの # 平均単価価格が必要であるか。 # b. 期待される資産回転率はどれほどであろうか。 # # c. 売上額にたいする純利益率はどれほどであろうか。 # # 2.a. もし販売量が120,000単位であるならば、利用可能資産にたいしてどれほどの # 投資利益率が得られるであろうか。 # b. もし販売数量が80,000単位ならばどうか。 # # 3. いま同一会社の他の事業部にたいして100,000単位のうち30,000単位が販売され # るものと仮定しよう。他の事業部管理者は、$4 という暫定売価に失望していた。 # その価格でなら自分のところでもそれだけの製造は可能であることを主張して、 # $2.25を申し出ている。売手側事業部の管理者は、自己のデータを健闘してみた。 # もし他の事業部に販売しなければ、在庫を$40,000、工場および設備を$60,000、 # 間接固定費を$20,000削減できると決定した。$2.25で販売すべきであろうか。 # 計算過程を示せ。 # % 1.a. '平均利用可能資産にたいする所要投資利益率が得られるためには、どれほどの平均単価価格が必要であるか。'(_平均単価価格) :- 期待販売量(_期待販売量), 売上額(_売上額), _平均単価価格 is _売上額 / _期待販売量. % 1.b. '期待される資産回転率はどれほどであろうか。'(_期待される資産回転率) :- 売上額(_売上額), 平均利用可能資産(_平均利用可能資産), _期待される資産回転率 is _売上額 / _平均利用可能資産. % 1.c. '売上額にたいする純利益はどれほどであろうか。'(_売上額にたいする純利益率) :- 平均利用可能資産にたいする期待利益(_平均利用可能資産にたいする期待利益), 売上額(_売上額), _売上額にたいする純利益率 is _平均利用可能資産にたいする期待利益 / _売上額. % 2.a. 'もし販売量が120,000単位であるならば、利用可能資産にたいしてどれほどの投資利益率が得られるであろうか。'(_平均単価価格,_利用可能資産にたいする投資利益率) :- 'もし販売量が120,000単位であるならば、', 利益額(120000,_平均単価価格,_利益額), 平均利用可能資産(_平均利用可能資産), _利用可能資産にたいする投資利益率 is _利益額 / _平均利用可能資産. 利益額(_販売量,_平均単価価格,_利益額) :- _売上額 is _平均単価価格 * _販売量, 変動費(_変動費), 固定費(_固定費), _利益額 id _売上額 - _変動費 - _固定費. % 2.b. 'もし販売数量が80,000単位ならばどうか'(_平均単価価格,_利用可能資産にたいする投資利益率) :- 'もし販売量が80,000単位であるならば、', 利益額(80000,_平均単価価格,_利益額), 平均利用可能資産(_平均利用可能資産), _利用可能資産にたいする投資利益率 is _利益額 / _平均利用可能資産. 'もし販売量が120,000単位であるならば、' :- retract(期待販売量(_)), asserta(期待販売量(120000)). 'もし販売数量が80,000単位であるならば、' :- retract(期待販売量(_)), asserta(期待販売量(80000)). 平均利用可能資産にたいする期待利益(_平均利用可能資産にたいする期待利益) :- 平均利用可能資産(_平均利用可能資産), 平均利用可能資産にたいする所要投資利益率(_平均利用可能資産にたいする所要投資利益率), _平均利用可能資産にたいする期待利益 is _平均利用可能資産 * _平均利用可能資産にたいする所要投資利益率. 売上額(_売上額) :- 変動費(_変動費), 固定費(_固定費), 平均利用可能資産にたいする期待利益(_平均利用可能資産にたいする期待利益), _売上額 is _変動費 + _固定費 + _平均利用可能資産に対する期待利益. 変動費(_変動費) :- 期待販売量(_期待販売量), 変動単価_単位当たり(_変動単価_単位当たり), _変動費 is _変動単価_単位当たり * _期待販売量. 平均利用可能資産(_平均利用可能資産) :- 受取資産(_受取資産), 棚卸資産(_棚卸資産), '工場および設備(純額)'(_工場および設備), _平均利用可能資産 is _受取資産 + _棚卸資産 + _工場および設備. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 受取資産(100000). 棚卸資産(300000). '工場および設備(純額)'(200000). 間接固定費(200000). 変動単価_単位当たり(1). 平均利用可能資産にたいする所要投資利益率(0.25). 期待販売量(100000). % 以下のサイトは # # チャールスT.ホーングレン著 「管理会計」 小倉栄一郎・加藤勝康訳 1974年 日本生産性本部刊 p341より # # 問題 # # 予算に計上されたある会社の事業部活動にかんしてつぎのデータが与えられている。 # # 平均利用可能資産: # 受取資産 $ 100,000 # 棚卸資産 300,000 # 工場および設備(純額) 200,000 # --------- # $ 600,000 # ========= # 間接固定費 $ 200,000 # 変動単価 単位当たり$1 # 平均利用可能資産にたいする所要投資利益率 25% # 期待販売量 100,000単位 # # 問 # # 1.a. 平均利用可能資産にたいする所要投資利益率が得られるためには、どれほどの # 平均単価価格が必要であるか。 # b. 期待される資産回転率はどれほどであろうか。 # # c. 売上額にたいする純利益率はどれほどであろうか。 # # 2.a. もし販売量が120,000単位であるならば、利用可能資産にたいしてどれほどの # 投資利益率が得られるであろうか。 # b. もし販売数量が80,000単位ならばどうか。 # # 3. いま同一会社の他の事業部にたいして100,000単位のうち30,000単位が販売され # るものと仮定しよう。他の事業部管理者は、$4 という暫定売価に失望していた。 # その価格でなら自分のところでもそれだけの製造は可能であることを主張して、 # $2.25を申し出ている。売手側事業部の管理者は、自己のデータを健闘してみた。 # もし他の事業部に販売しなければ、在庫を$40,000、工場および設備を$60,000、 # 間接固定費を$20,000削減できると決定した。$2.25で販売すべきであろうか。 # 計算過程を示せ。 # % 1.a. '平均利用可能資産にたいする所要投資利益率が得られるためには、どれほどの平均単価価格が必要であるか。'(_平均単価価格) :- 期待販売量(_期待販売量), 売上額(_売上額), _平均単価価格 is _売上額 / _期待販売量. % 1.b. '期待される資産回転率はどれほどであろうか。'(_期待される資産回転率) :- 売上額(_売上額), 平均利用可能資産(_平均利用可能資産), _期待される資産回転率 is _売上額 / _平均利用可能資産. % 1.c. '売上額にたいする純利益はどれほどであろうか。'(_売上額にたいする純利益率) :- 平均利用可能資産にたいする期待利益(_平均利用可能資産にたいする期待利益), 売上額(_売上額), _売上額にたいする純利益率 is _平均利用可能資産にたいする期待利益 / _売上額. 平均利用可能資産にたいする期待利益(_平均利用可能資産にたいする期待利益) :- 平均利用可能資産(_平均利用可能資産), 平均利用可能資産にたいする所要投資利益率(_平均利用可能資産にたいする所要投資利益率), _平均利用可能資産にたいする期待利益 is _平均利用可能資産 * _平均利用可能資産にたいする所要投資利益率. 売上額(_売上額) :- 変動費(_変動費), 固定費(_固定費), 平均利用可能資産にたいする期待利益(_平均利用可能資産にたいする期待利益), _売上額 is _変動費 + _固定費 + _平均利用可能資産に対する期待利益. 変動費(_変動費) :- 期待販売量(_期待販売量), 変動単価_単位当たり(_変動単価_単位当たり), _変動費 is _変動単価_単位当たり * _期待販売量. 平均利用可能資産(_平均利用可能資産) :- 受取資産(_受取資産), 棚卸資産(_棚卸資産), '工場および設備(純額)'(_工場および設備), _平均利用可能資産 is _受取資産 + _棚卸資産 + _工場および設備. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 受取資産(100000). 棚卸資産(300000). '工場および設備(純額)'(200000). 間接固定費(200000). 変動単価_単位当たり(1). 平均利用可能資産にたいする所要投資利益率(0.25). 期待販売量(100000). % 以下のサイトは % % 20年以上前のProlog反古を見つけた。少し編集して載せてみる。 % 出処は不明。内生変数,ラグつき内生変数,政策変数,与件変数の四述語で終端するらしい。 % 各変数の説明はどのように述語とするつもりだったのだろうか? % '構造方程式に含まれる経済変量は,それらの確率的特性にしたがって次のように分類される'(_構造方程式に含まれる経済変量) :- 内生変数であるか先決変数である(_構造方程式に含まれる経済変量). 内生変数であるか先決変数である(_構造方程式に含まれる経済変量) :- 内生変数(_構造方程式に含まれる経済変量). 内生変数であるか先決変数である(_構造方程式に含まれる経済変量) :- 先決変数(_構造方程式に含まれる経済変量). 先決変数(_構造方程式に含まれる経済変量) :- 外生変数であるかラグつき内生変数である(_構造方程式に含まれる経済変量). 外生変数であるかラグつき内生変数である(_構造方程式に含まれる経済変量) :- 外生変数(_構造方程式に含まれる経済変量). 外生変数であるかラグつき内生変数である(_構造方程式に含まれる経済変量) :- ラグつき内生変数(_構造方程式に含まれる経済変量). 外生変数(_構造方程式に含まれる経済変量) :- 政策変数であるか与件変数である(_構造方程式に含まれる経済変量). 政策変数であるか与件変数である(_構造方程式に含まれる経済変量) :- 政策変数(_構造方程式に含まれる経済変量). 政策変数であるか与件変数である(_構造方程式に含まれる経済変量) :- 与件変数(_構造方程式に含まれる経済変量). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/790 # # [1] 授業単元: # [2] 問題文(含コード&リンク):http://ime.nu/pastebin.com/B7EcsTNp # 'LIFOスタック'(生成,[]). 'LIFOスタック'(出力,[_要素|_スタック],_要素,_スタック). 'LIFOスタック'(入力,_要素,_スタック,[_要素|_スタック]). % 以下のサイトは # # チャールスT.ホーングレン著 「管理会計」 小倉栄一郎・加藤勝康訳 1974年 日本生産性本部刊 p341より # # 問題 # # 予算に計上されたある会社の事業部活動にかんしてつぎのデータが与えられている。 # # 平均利用可能資産: # 受取資産 $ 100,000 # 棚卸資産 300,000 # 工場および設備(純額) 200,000 # --------- # $ 600,000 # ========= # 間接固定費 $ 200,000 # 変動単価 単位当たり$1 # 平均利用可能資産にたいする所要投資利益率 25% # 期待販売量 100,000単位 # # 問 # # 1.a. 平均利用可能資産にたいする所要投資利益率が得られるためには、どれほどの # 平均単価価格が必要であるか。 # b. 期待される資産回転率はどれほどであろうか。 # # c. 売上額にたいする純利益率はどれほどであろうか。 # # 2.a. もし販売量が120,000単位であるならば、利用可能資産にたいしてどれほどの # 投資利益率が得られるであろうか。 # b. もし販売数量が80,000単位ならばどうか。 # # 3. いま同一会社の他の事業部にたいして100,000単位のうち30,000単位が販売され # るものと仮定しよう。他の事業部管理者は、$4 という暫定売価に失望していた。 # その価格でなら自分のところでもそれだけの製造は可能であることを主張して、 # $2.25を申し出ている。売手側事業部の管理者は、自己のデータを健闘してみた。 # もし他の事業部に販売しなければ、在庫を$40,000、工場および設備を$60,000、 # 間接固定費を$20,000削減できると決定した。$2.25で販売すべきであろうか。 # 計算過程を示せ。 # % 1.a. '平均利用可能資産にたいする所要投資利益率が得られるためには、どれほどの平均単価価格が必要であるか。'(_平均単価価格) :- 期待販売量(_期待販売量), 売上額(_売上額), _平均単価価格 is _売上額 / _期待販売量. % 1.b. '期待される資産回転率はどれほどであろうか。'(_期待される資産回転率) :- 売上額(_売上額), 平均利用可能資産(_平均利用可能資産), _期待される資産回転率 is _売上額 / _平均利用可能資産. % 1.c. '売上額にたいする純利益はどれほどであろうか。'(_売上額にたいする純利益率) :- 平均利用可能資産にたいする期待利益(_平均利用可能資産にたいする期待利益), 売上額(_売上額), _売上額にたいする純利益率 is _平均利用可能資産にたいする期待利益 / _売上額. 平均利用可能資産にたいする期待利益(_平均利用可能資産にたいする期待利益) :- 平均利用可能資産(_平均利用可能資産), 平均利用可能資産にたいする所要投資利益率(_平均利用可能資産にたいする所要投資利益率), _平均利用可能資産にたいする期待利益 is _平均利用可能資産 * _平均利用可能資産にたいする所要投資利益率. 売上額(_売上額) :- 変動費(_変動費), 固定費(_固定費), 平均利用可能資産にたいする期待利益(_平均利用可能資産にたいする期待利益), _売上額 is _変動費 + _固定費 + _平均利用可能資産に対する期待利益. 変動費(_変動費) :- 期待販売量(_期待販売量), 変動単価_単位当たり(_変動単価_単位当たり), _変動費 is _変動単価_単位当たり * _期待販売量. 平均利用可能資産(_平均利用可能資産) :- 受取資産(_受取資産), 棚卸資産(_棚卸資産), '工場および設備(純額)'(_工場および設備), _平均利用可能資産 is _受取資産 + _棚卸資産 + _工場および設備. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 受取資産(100000). 棚卸資産(300000). '工場および設備(純額)'(200000). 間接固定費(200000). 変動単価_単位当たり(1). 平均利用可能資産にたいする所要投資利益率(0.25). 期待販売量(100000). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1260922392/95 # # どなたかご協力お願いします。 # 1からmまでの整数の集合 A = {nは自然数|1≦n≦m}の中からn個の整数を取り出す組み合わせすべてを生成するプログラムを作れ。また、5C3の場合を表示せよ。(Cはコンビネーションです) # # 組み合わせを a1,a2,a3,・・・an としていって、a1<a2<a3<・・・<an となることを利用して作ると思われるのですが、、、 # # %% 引数なし '5C3の場合を表示せよ' :- '1からmまでの整数の集合 A = {nは自然数|1≦n≦m}の中からn個の整数を取り出す組み合わせすべてを生成する'(5,3,_組合せ), writef('%t\n',[_組合せ]), fail. '5C3の場合を表示せよ'. %% 1引数で '5C3の場合を表示せよ'(L) :- findall(_組合せ,( '1からmまでの整数の集合 A = {nは自然数|1≦n≦m}の中からn個の整数を取り出す組み合わせすべてを生成する'(5,3,_組合せ), writef('%t\n',[_組合せ])), L). '1からmまでの整数の集合 A = {nは自然数|1≦n≦m}の中からn個の整数を取り出す組み合わせすべてを生成する'(_m,_n,_組合せ) :- findall(N,for(1,N,_m),L), 組合せ(L,_n,_組合せ). 組合せ(X,1,[A]) :- member(A,X). 組合せ([A|Y],N,[A|X]) :- N > 1, M is N - 1, 組合せ(Y,M,X). 組合せ([_|Y],N,A) :- N > 1, 組合せ(Y,N,A). % 以下のサイトは # # Prologという宣言型プログラミング言語にふれる。ルールを定義するという点を除くと、 # 確かにSQL(データに対しこれ欲しいみたいなクエリ)に近しい感じがします。 # ということで、アクセスパス(性能)が気になるのは、命令型に侵されてるからかな? % % Prologの述語の定義節の間では基本的に情報の授受ができません。 % 具体的に示しましょう。 % 成績(阿部,70). 成績(尾崎,55). 成績(山田,90). % と定義されている時、三人の平均点を取りたいとします。(集約問題) ?- 成績(_,_成績). _ = 阿部, _成績 = 70; _ = 尾崎, _成績 = 55; _ = 山田, _成績 = 90; false % というように取得できますが、_ = _尾崎,_成績 = 55が取得できた時には阿部の % 情報は変数の束縛を開放してしまっていますから、利用できません。 % 個々の節が全く独立しているわけですから合計していくことができないことになります。 % ただし、以下のように情報が連鎖するように仕組めば可能になります。 % 成績(阿部,尾崎,70). 成績(尾崎,山田,55). 成績(山田,阿部,90). 成績の平均(_起点,_平均点) :- 成績(_起点,_生徒,_), 成績の合計(_起点,_生徒,_人数,_合計), _平均点 is _合計 / _人数. 成績の合計(_起点,_起点,1,_成績) :- 成績(_起点,_,_成績),!. 成績の合計(_起点,_生徒_1,_人数,_合計) :- 成績(_生徒_1,_生徒_2,_成績), 成績の合計(_起点,_生徒_2,_人数_2,_合計_2), _合計 is _合計_2 + _成績, _人数 is _人数_2 + 1. % と一応はできました。 % 実は集約するために必要な条件は情報の連鎖なのです。 % Prologで扱う連鎖構造の代表にリストがあります。 % ここでも、[70,55,90]というリストが欲しい。 % 成績という述語の節の中にある成績(点数)だけを抜き出してリストとしたい。 % これを実現するfindallというメタ述語がPrologには用意されています。 成績(阿部,70). 成績(尾崎,55). 成績(山田,90). 成績リスト(_成績リスト) :- findall(_成績,成績(_,_成績),_成績リスト). ?- 成績リスト(_成績リスト). _成績リスト = [70,55,90]; false % と成ります。 % % このfindallこそ SQL にそっくりですね。 % 成績の平均(_平均点) :- 成績リスト(_成績リスト), sum(_成績リスト,_合計), length(_成績リスト,_人数), _平均点 is _合計 / _人数. % ただし、sumの定義は sum([],0). sum([N|R],_合計) :- sum(R,_合計_2), _合計 is _合計_2 + N. % 以下のサイトは # 線維筋痛症は,原因不明の全身疼痛を主症状とし, # 不眠,うつ病などの精神神経症状,過敏性大腸炎症候群,逆流性食道炎,過活動性膀胱炎 # などの自律神経系の症状を副症状とする病気である # # <線維筋痛症診療ガイドライン2011 日本医事新報社刊 p1より> # '線維筋痛症は,原因不明の全身疼痛を主症状とし,不眠,うつ病などの精神神経症状,過敏性大腸炎症候群,逆流性食道炎,過活動性膀胱炎などの自律神経系の症状を副症状とする病気である' : - '線維筋痛症は,原因不明の全身疼痛を主症状とし'(_線維筋痛症), '不眠,うつ病などの精神神経症状,過敏性大腸炎症候群,逆流性食道炎,過活動性膀胱炎などの自律神経系の症状を副症状とする'(_線維筋痛症), 病気である(_線維筋痛症). '線維筋痛症は,原因不明の全身疼痛を主症状とし'(_線維筋痛症) :- 主症状(_線維筋痛症,_全身疼痛), 全身疼痛(_全身疼痛), 原因不明(_全身疼痛). '不眠,うつ病などの精神神経症状,過敏性大腸炎症候群,逆流性食道炎,過活動性膀胱炎などの自律神経系の症状を副症状とする'(_線維筋痛症) :- 副症状とする(_線維筋痛症,_自律神経系の症状), 自律神経系の症状(_線維筋痛症,_自律神経系の症状). 自律神経系の症状(_線維筋痛症,_精神神経症状) :- 精神神経症状(_精神神経症状). 自律神経系の症状(_線維筋痛症,_過敏性大腸炎症候群) :- 過敏性大腸炎症候群(_過敏性大腸炎症候群). 自律神経系の症状(_線維筋痛症,_逆流性食道炎) :- 逆流性食道炎(_逆流性食道炎). 自律神経系の症状(_線維筋痛症,_過活動性膀胱炎) :- 過活動性膀胱炎(_過活動性膀胱炎). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/901 # # java入門の通信教育課題なのですが、ちんぷんかんぷんで・・・ # 基本のキだとは思いますが、ご教示いただければ幸いです。 # (以降、いくつか連投になると思います) # 【課題提示用テンプレ】 # 【 課題 】 # Char型の配列をつかって「あいうえお」と表示するプログラムを作成する。 # なお、配列mojiはnew演算子を使って要素数を5つもつように生成します。 # 実行結果になるように以下部の空欄をうめなさい。 # (実行結果) #  あいうえお # (問題文) # class Question01{ # public static void main(String[] args){ # //char型で要素数が5つの配列を生成 # char[] moji = ; #   char c = 'あ'; #   for(int i = 0; ; i++){ #   = ( c + i * 2); #    System.out.print( ); #   } #  } # }  # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI  】5. その他(使用しない) # 【 期限 】本日中2月29日 # 【 補足 】,蓮new char[5]」、△蓮i <=4」だと思うのですが、、い全く分かりません… # # '5要素のリストをつかって「あいうえお」と表示するプログラムを作成する' :- length(_あいうえお_ならび,5), char_code(あ,_あのコード), findall(_文字,( '"あ"から順に文字を生成する'(_あいうえお_ならび,_文字)), _あいうえお_ならび), 表示する(_あいうえお_ならび). '"あ"から順に文字を生成する'(_あいうえお_ならび,_文字) :- append(L0,[_文字|_],_あいうえお_ならび), length(L0,N), _文字コード is _あの文字コード + 2 * N, char_code(_文字,_文字コード). 表示する(_あいうえお_ならび) :- append(_,[_文字|R],_あいうえお_ならび), writef('%t',[_文字]), R = []. % 以下のサイトは # # 二つのリストを取り、対応する要素を組みにして、一つのリストを作る。 # リストの生成は、二つのリストの一方、あるいは両方が使い果たされたときに # 終わる。 # '二つのリストを取り、対応する要素を組みにして、一つのリストを作る。リストの生成は、二つのリストの一方、あるいは両方が使い果たされたときに終わる'(_リスト_1,_リスト_2,_リスト_3) :- '二つのリストの一方、あるいは両方が使い果たされたときに'(_リスト_1,_リスト_2), 終わる(_リスト_3),!. '二つのリストを取り、対応する要素を組みにして、一つのリストを作る。リストの生成は、二つのリストの一方、あるいは両方が使い果たされたときに終わる'([A|R1],[B|R2],[[A,B]|R3]) :- '二つのリストを取り、対応する要素を組みにして、一つのリストを作る。リストの生成は、二つのリストの一方、あるいは両方が使い果たされたときに終わる'(R1,R2,R3). '二つのリストの一方、あるいは両方が使い果たされたときに'([],_) :- !. '二つのリストの一方、あるいは両方が使い果たされたときに'(_,[]) :- !. '二つのリストの一方、あるいは両方が使い果たされたときに'([],[]). 終わる([]). % 以下のサイトは # # 二つのリストを取り、対応する要素を組みにして、一つのリストを作る。 # リストの生成は、二つのリストの一方、あるいは両方が使い果たされたときに # 終わる。 # '二つのリストを取り、対応する要素を組みにして、一つのリストを作る。リストの生成は、二つのリストの一方、あるいは両方が使い果たされたときに終わる'(_リスト_1,_リスト_2,[]) :- '二つのリストの一方、あるいは両方が使い果たされたときに'(_リスト_1,_リスト_2), 終わる,!. '二つのリストを取り、対応する要素を組みにして、一つのリストを作る。リストの生成は、二つのリストの一方、あるいは両方が使い果たされたときに終わる'([A|R1],[B|R2],[[A,B]|R3]) :- '二つのリストを取り、対応する要素を組みにして、一つのリストを作る。リストの生成は、二つのリストの一方、あるいは両方が使い果たされたときに終わる'(R1,R2,R3). '二つのリストの一方、あるいは両方が使い果たされたときに'([],_) :- !. '二つのリストの一方、あるいは両方が使い果たされたときに'(_,[]) :- !. '二つのリストの一方、あるいは両方が使い果たされたときに'([],[]). 終わる. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/190 # # [1] 授業単元:C言語 # [2] リスト構造を使ったアドレス帳の作成。  # リスト構造で管理し次の機能が実現できること。 # •追加(データの新規登録) # •削除(任意のデータの削除) # •探索(任意のデータの詳細表示) # •一覧表示 # •データのソー扱うデータは氏名、住所、電話番号、eメールアドレス # http://ime.nu/ideone.com/lMgd3 # :- dynamic(アドレス帳/1). 追加(_氏名,_住所,_電話番号,_eメールアドレス) :- retract(アドレス帳(_追加前のアドレス帳)), 追加(_氏名,_住所,_電話番号,_eメールアドレス,_追加前のアドレス帳),!. 追加(_氏名,_住所,_電話番号,_eメールアドレス) :- asserta(アドレス帳([[_氏名,_住所,_電話番号,_eメールアドレス]]). 追加(_氏名,_住所,_電話番号,_eメールアドレス,_現在のアドレス帳) :- member([_氏名,_住所,_電話番号,_eメールアドレス],_現在のアドレス帳), asserta(アドレス帳(_現在のアドレス帳)), writef('追加指定された %t,%t,%t,%t,%t は既に登録されています\n',[_氏名,_住所,_電話番号,_eメールアドレス]),!. 追加(_氏名,_住所,_電話番号,_eメールアドレス,_追加前のアドレス帳) :- asserta(アドレス帳([[_氏名,_住所,_電話番号,_eメールアドレス]|_追加前のアドレス帳]). 削除(_氏名,_住所,_電話番号,_eメールアドレス) :- retract(アドレス帳(_削除前のアドレス帳)), 削除(_氏名,_住所,_電話番号,_eメールアドレス,_削除前のアドレス帳),!. 削除(_氏名,_住所,_電話番号,_eメールアドレス) :- asserta(アドレス帳([])). 削除(_氏名,_住所,_電話番号,_eメールアドレス,_削除前のアドレス帳) :- append(L0,[[_氏名,_住所,_電話番号,_eメールアドレス]|R],_削除前のアドレス帳), append(L0,R,_削除後のアドレス帳), asserta(アドレス帳(_削除後のアドレス帳)),!. 削除(_氏名,_住所,_電話番号,_eメールアドレス,_現在のアドレス帳) :- asserta(アドレス帳(_現在ののアドレス帳)), writef('指定された %t,%t,%t,%t で削除するべきアドレスは発見できませんでした\n',[_氏名,_住所,_電話番号,_eメールアドレス,_現在のアドレス帳]). 探索(_鍵項目ならび) :- list(_鍵項目ならび), 探索組生成(_鍵項目ならび,_組), 組表示(_組). 探索(_鍵項目,_鍵の値) :- 検索組生成(_鍵項目,_鍵の値,_組), 組表示(_組). 一覧表示 :- アドレス帳(_アドレス帳), writef('%20r,%32r,%14r,%64l\n',[氏名,住所,電話番号,eメールアドレス]), append(_,[[_氏名,_住所,_電話番号,_eメールアドレス]|R],_アドレス帳), writef('%20r,%32r,%14r,%64l\n',[_氏名,_住所,_電話番号,_eメールアドレス]), R = []. 探索組生成([],_). 探索組生成([[_鍵,_鍵の値]|R],_組) :- 検索組生成(_鍵,_鍵の値,_組), 探索組生成(R,_組). 検索組生成(氏名,_鍵の値,[_鍵の値,_,_,_]). 検索組生成(住所,_鍵の値,[_,_鍵の値,_,_]). 検索組生成(電話番号,_鍵の値,[_,_,_鍵の値,_]). 検索組生成(eメールアドレス,_鍵の値,[_,_,_,_鍵の値]). 組表示(_組) :- アドレス帳(_アドレス帳), append(_,[_組|R],_アドレス帳), writef('%t,%t,%t,%t\n',_組), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/782 # # [1] 授業単元:プログラミング # [2] 問題文: # 5つの優先度付きデータを作成する。優先度が最も高いものを1つ削除して新しい優先度付きデータを1つ挿入し優先度順に並べ替えて表示することを指定回数繰り返すプログラムを作成しなさい。 # なお優先度はランダムに発生させた数字の高いものから優先度が高いものとする。 # 例: # {データ番号,優先度(ランダム)}={1,1.4},{2,4.3},{3,2.1},{4,1.1},{5,9.7}だとすると # 優先度の高い5を削除して、新たに{6,7.8(ランダム)}を挿入したとすると6→2→3→1→4と表示されるようにする。 # '5つの優先度付きデータを作成する。優先度が最も高いものを1つ削除して新しい優先度付きデータを1つ挿入し優先度順に並べ替えて表示することを指定回数繰り返す'(_指定回数,LL1,LL) :- '5つの優先度付きデータを作成する。優先度が最も高いものを1つ削除して新しい優先度付きデータを1つ挿入し優先度順に並べ替えて表示することを指定回数繰り返す'(1,_指定回数,LL1,LL). '5つの優先度付きデータを作成する。優先度が最も高いものを1つ削除して新しい優先度付きデータを1つ挿入し優先度順に並べ替えて表示することを指定回数繰り返す'(N,_指定回数,LL,LL) :- N > _指定回数,!. '5つの優先度付きデータを作成する。優先度が最も高いものを1つ削除して新しい優先度付きデータを1つ挿入し優先度順に並べ替えて表示することを指定回数繰り返す'(N,_指定回数,LL1,LL) :- 最も優先順位の高いデータを取り除く(LL1,L0,R), 新たなデータを追加する(N,L0,R,LL2), 大きい順に表示する(LL2), N2 is N + 1, コントロールブロック(N2,_指定回数,LL2,LL). 最も優先順位の高いデータを取り除く(LL1,L0,R) :- append(L0,[[N,_優先順位_1]|R],LL1), \+((append(L1,[[N_2,_優先順位_2]|R2],R),_優先順位_2 > _優先順位_1)),!. 新たなデータを追加する(N,L0,R,LL2) :- M is N + 5, _優先度 is random(100\\\) / 10, append(L0,[[M,_優先度]|R],LL2). 優先順位の大きい順にデータ番号を表示する(LL) :- findall([_優先順位,_データ番号],( member([_データ番号,_優先順位],LL)), LL1), sort(LL1,LL2), reverse(LL2,[[_,N1],[_,N2],[_,N3],[_,N4],[_,N5]]), writef('%t->%t->%t->%t->%t\n',[N1,N2,N3,N4,N5]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/780 # # [2]構造体についての問題です # ある人の生まれた年,生まれた月をそれぞれ構造体で内部的に表現する. # 2人分のデータを入力した後,2人の年令の差(年,月まで)を 計算して以下のような結果を示すプログラムを作成する. # 実行例 # ----------------------------------------------------- # [1] Aさんのデータを入力 # [2] Bさんのデータを入力 # [3] 結果表示 # [9] 終了 # ----------------------------------------------------- # #コマンドを入力して下さい:1 # Aさんの生れた年は?:1967 # Aさんの生れた月は?:8 # # #コマンドを入力して下さい:3 # まだBさんのデータが入力されていません! # # #コマンドを入力して下さい:2 # Bさんの生れた年は?:1987 # Bさんの生れた月は?:10 # # #コマンドを入力して下さい:3 # Aさんは 20年と2ヶ月 Bさんより年上です. # # #コマンドを入力して下さい:9 # [3]環境 #  [3.1] OS:Linux  [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C # [4]1/31 # よろしくお願いします # # '2人分のデータを入力した後,2人の年令の差(年,月まで)を 計算して以下のような結果を示す' :- 機能選択(_選択された機能), '2人分のデータを入力した後,2人の年令の差(年,月まで)を 計算して以下のような結果を示す'. 機能選択(_選択された機能) :- 機能選択表示, write('コマンドを入力して下さい:'), get_line(Line), 機能選択(Line,_選択された機能). 機能選択表示 :- write('----------------------------------------------------- \n'), write('[1] Aさんのデータを入力 \n'), write('[2] Bさんのデータを入力 \n'), write('[3] 結果表示 \n'), write('[9] 終了 \n'), write('----------------------------------------------------- \n'). 機能選択('1') :- '[1] Aさんのデータを入力'. 機能選択('2') :- '[2] Bさんのデータを入力'. 機能選択('3') :- '[3] 結果表示'. 機能選択('4') :- '[9] 終了'. '[1] Aさんのデータを入力' :- write('Aさんのデータを入力します。\n'), write('Aさんの生れた年は?:'), get_integer(_年), write('Aさんの生れた月は?: '), get_integer(_月),!. '[2] Bさんのデータを入力' :- write('Bさんのデータを入力します。\n'), write('Bさんの生れた年は?:'), get_integer(_年), write('Bさんの生れた月は?: '), get_integer(_月),!. '[3] 結果表示' :- findall([_氏名,_年,_月],( 生年月日(_氏名,_生年月日_年,_生年月日_月)), _生年月日ならび), 生年月日の差(_生年月日ならび,_年長氏名,_年下氏名,_年の差,_月の差), writef('%tさんは %t年と%tヶ月 %tさんより年上です.\n',[_年長氏名,_年下氏名,_年の差,_月の差]). 生年月日の差([[_氏名_1,_生年月日_年_1,_生年月日_月_1],[_氏名_2,_生年月日_年_2,_生年月日_月_2]],_年長氏名,_年下氏名,_年の差,_月の差) :- _紀元元年からの累積月_1 is _生年月日_年_1 * 12 + _生年月日_月_1, _紀元元年からの累積月_2 is _生年月日_年_2 * 12 + _生年月日_月_2, _月換算の差 is _生年月日累積月_1 - _生年月日累積月_2, 生年月日の差(_月換算の差,_年長氏名,_年下氏名,_年の差,_月の差). 生年月日の差(_月換算の差,'A','B',_年の差,_月の差) :- _月換算の差 >= 0, _年の差 is _月換算の差 // 12, _月の差 is _月換算の差 mod 12. 生年月日の差(_月換算の差,'B','A',_年の差,_月の差). _月換算の差 < 0, _年の差 is abs(_月換算の差) // 12, _月の差 is abs(_月換算の差) mod 12. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/650 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 出席番号、算数、国語、社会の点数(適当で)からできている成績データを # 読み込み、各生徒の3科目の平均点と最高点を算出して、それを各生徒の # データとして加え、3科目の平均点の順番にソートするプログラムを # 選択ソートでかきなさい。 # '出席番号、算数、国語、社会の点数(適当で)からできている成績データを読み込み、各生徒の3科目の平均点と最高点を算出して、それを各生徒のデータとして加え、3科目の平均点の順番にソートする'(_成績データファイル,_3科目の平均点の順ならび) :- '出席番号、算数、国語、社会の点数(適当で)からできている成績データを読み込み'(LL), '各生徒の3科目の平均点と最高点を算出して、それを各生徒のデータとして加え'(LL,LL2), '3科目の平均点の順番にソートする'(LL2,_3科目の平均点の順ならび). '出席番号、算数、国語、社会の点数(適当で)からできている成績データを読み込み'(LL) :- get_split_lines(_成績データファイル,[','],LL). '各生徒の3科目の平均点と最高点を算出して、それを各生徒のデータとして加え'(LL,LL2) :- findall(L2,( member([_出席番号|L],LL), 平均(L,_平均点), 最大値(L,_最高点), append([_出席番号|L],[_平均点,_最高点],L2)), LL2). '3科目の平均点の順番にソートする'(LL2,_3科目の平均点の順ならび) :- '3科目の平均点を鍵として行頭に付加する'(LL2,LL3), 逆順整列(LL3,LL4), '付加した整列鍵を削除する'(LL4,_3科目の平均点の順ならび). '3科目の平均点を鍵として行頭に付加する'(LL2,LL3) :- findall([_平均点|L],( member(L,LL2), append(_,[_平均点,_],L)), LL3). '付加した整列鍵を削除する'(LL4,_3科目の平均点の順ならび) :- findall(L,( member([_|L],LL4)), _3科目の平均点の順ならび). 逆順整列(L1,L2) :- sort(L1,L3), reverse(L3,L2). 平均(L,_平均) :- length(L,Len), sum(L,_合計), _平均 is _合計 / Len. 最大値([A|R],_最大値) :- append(_,[B|R2],R), B @> A, 最大値([B|R2],_最大値),!. 最大値([_最大値|_],_最大値). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/545 # # [1] 授業単元: 関数 # [2] 問題文: # 最大で5名の学生の名前、性別、身長と体重を登録し、BMIも計算して保存し、 # それらの結果を表示するプログラムを作成せよ。[BMI=体重(kg)/(身長(m)*身長(m))] # # プログラムを起動するとメニュー画面が現れ、 #  ・[1] 名前,性別,数値登録 #  ・[2] 登録内容訂正 #  ・[3] 一覧表示 #  ・[0] 終了 # が行えるようにすること。 ユーザには身長はcmで登録させること。 # # 各機能ごとに関数を分割する。登録と訂正に関わる関数、 # 一覧表示に関わる関数、main関数の3つに分けて作成せよ。 # # 訂正については、○人目のデータを指定し、内容(名前,性別,数値)を上書きする。 # # 'プログラムを起動するとメニュー画面が現れ、 ・[1] 名前,性別,数値登録 ・[2] 登録内容訂正 ・[3] 一覧表示 ・[0] 終了 が行えるようにすること。 ユーザには身長はcmで登録させること。 ' :- repeat, 'プログラムを起動するとメニュー画面が現れ', '・[1] 名前,性別,数値登録 ・[2] 登録内容訂正 ・[3] 一覧表示 ・[0] 終了 が行えるようにする'(_選択番号), 実行(_選択番号). 'プログラムを起動するとメニュー画面が現れ' :- write('選択してください\n'), write('・[1] 名前,性別,数値登録\n'), write('・[2] 登録内容訂正\n'), write('・[3] 一覧表示\n'), write('・[0] 終了\n'). '・[1] 名前,性別,数値登録 ・[2] 登録内容訂正 ・[3] 一覧表示 ・[0] 終了 が行えるようにする'(_選択番号) :- get_line(_選択番号), 選択番号診断(_選択番号),!. '・[1] 名前,性別,数値登録 ・[2] 登録内容訂正 ・[3] 一覧表示 ・[0] 終了 が行えるようにする'(_選択番号) :- '・[1] 名前,性別,数値登録 ・[2] 登録内容訂正 ・[3] 一覧表示 ・[0] 終了 が行えるようにする'(_選択番号). 選択番号診断(_選択番号) :- member(_選択番号,['0','1,','2','3']),!. 実行('0') :- !. 実行('1') :- '名前,性別,数値登録'. 実行('2') :- '登録内容訂正'. 実行('3') :- '一覧表示'. '名前,性別,数値登録' :- write('名前,性別,身長(cm)をカンマ区切りで入力して下さい\n'), readln(L), P = .. [身長|L], assertz(P), fail. '登録内容訂正' :- write('名前を入力して下さい\n'), get_line(_名前), '登録内容訂正'(_名前), fail. 登録内容訂正(_名前) :- findall([_名前,_性別,_身長],( 身長(_名前,_性別,_身長)), LL), 現在登録されている情報の開示(LL), 更新情報の入力(_名前,_性別,_身長), 登録内容の訂正(_名前,_性別,_身長). 更新情報の入力(_名前,_性別,_身長) :- write('性別,身長(cm)をカンマ区切りで入力して下さい\n'), readln([_更新された性別,_更新された身長]). 現在登録されている情報の開示(L) :- append(_,[[_名前,_性別,_身長]|R],L), writef('%12r,%t,%t\n',[_名前,_性別,_身長]), R = []. 登録内容の訂正(_名前,_性別,_身長) :- retract(身長(_名前,_性別,_身長)), assertz(身長(_名前,_更新された性別,_更新された身長)). 一覧表示 :- findall([_名前,_性別,_身長],( 身長(_名前,_性別,_身長)), LL), append(_,[[_名前,_性別,_身長]|R],LL), writef('%12r,%t,%t\n',[_名前,_性別,_身長]), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/524 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):入力した誕生日から今日まで経過した日数・時間を表示するプログラムを作成せよ. # '入力した誕生日から今日まで経過した日数を表示する' :- 入力した誕生日(_誕生年,_誕生月,_誕生日), '今日まで経過した日数・時間を'(_誕生年,_誕生月,_誕生日,_今日まで経過した日数), 表示する(_今日まで経過した日数). 入力した誕生日(_誕生年,_誕生月,_誕生日) :- write('誕生年を入力して下さい : '), get_integer(_誕生年), write('誕生月を入力して下さい : '), get_integer(_誕生月), write('誕生日を入力して下さい : '), get_integer(_誕生日). '今日まで経過した日数を'(_誕生年,_誕生月,_誕生日,_今日まで経過した日数) :- 今日(_年,_月,_日), '今日まで経過した日数を'(_今日の年,_今日の月,_今日の日,_誕生年,_誕生月,_誕生日,_今日まで経過した日数時間). '今日まで経過した日数を'(_今日の年,_今日の月,_今日の日,_誕生年,_誕生月,_誕生日,_今日まで経過した日数) :- _今年の年 = _誕生年, _今年の月 = _誕生月, _今日まで経過した日数 is _今日の日 - _誕生日. '今日まで経過した日数を'(_今日の年,_今日の月,_今日の日,_誕生年,_誕生月,_誕生日,_今日まで経過した日数) :- 誕生年と今年の間の日数(_誕生年,_今年の年,_誕生年と今年の間の日数), 年末までの経過日数(_誕生年,_誕生月,_誕生日,_年末までの経過日数), 年初からの経過日数(_今年の年,_今年の月,_今年の日,_今年の年初からの経過日数), _今日まで経過した日数 is _誕生日から年末までの経過日数 + _今年の年初からの経過日数. 年初からの経過日数(_,1,_日,_年初からの経過日数) :- _日 = _年初からの経過日数,!. 年初からの経過日数(_年,_月,_日,_年初からの経過日数) :- 前月末日までの月末日ならび(1,_年,_月,_日,_前月末日までの月末日ならび), sum([_日|_前月末日までの月末日ならび],_年初からの経過日数). 前月末日までの月末日ならび(_月,_年,_月,_日,[]). 前月末日までの月末日ならび(N,_年,_月,_日,[_末日|R]) :- 月の末日(_年,N,_末日), N2 is N + 1, 前月末日までの月末日ならび(N,_年,_月,_日,R). 月の末日(_年,2,29) :- うるう年(_年),!. 月の末日(_年,2,28) :- \+(うるう年(_年)),!. 月の末日(_,_月,31) :- member(_月,[1,3,5,7,8,10,12]),!. 月の末日(_,_月,30) :- member(_月,[4,6,9,11]). 年末までの経過日数(_年,_月,_日,_年末までの経過日数) :- 年初からの経過日数(_年,_月,_日,_年初からの経過日数), 年末までの経過日数計算(_年,_年初からの経過日数,_年末までの経過日数). 年末までの経過日数計算(_年,_年初からの経過日数,_年末までの経過日数) :- うるう年(_年), _年末までの経過日数 is 366 - _年初からの経過日数 + 1,!. 年末までの経過日数計算(_年,_年初からの経過日数,_年末までの経過日数) :- \+(うるう年(_年)), _年末までの経過日数 is 365 - _年初からの経過日数 + 1,!. 年間日数(_年,366) :- うるう年(_年),!. 年間日数(_年,365) :- \+(うるう年(_年)). 誕生年と今年の間の日数(_誕生年,_今年,0) :- _誕生年 = _今年,!. 誕生年と今年の間の日数(_誕生年,_今年,0) :- 1 is _今年 - _誕生年,!. 誕生年と今年の間の日数(_誕生年,_今年,_誕生年と今年の間の日数) :- S is _誕生年 + 1, Max is _今年 - 1, findall(_年間日数,( for(S,_年,Max), 年間日数(_年,_年間日数)), _年間日数ならび), sum(_年間日数ならび,_誕生年と今年の間の日数). 表示する(_今日まで経過した日数) :- writef('今日まで経過した日数は %t です\n',[_今日まで経過した日数]). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/729 # # 【 課題 】<プログラムの仕様> # ・N人の、M科目の成績が書かれたCSVファイルを読み込む # ・平均点、最高点、最低点、度数分布を各科目毎に出力する # ・各科目、総合点のランキングリストを出力する # ・成績の処理結果をテキストファイルに出力する # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI  】4. 制限なし # 【 期限 】1/26(木) 20:00 # 【 Ver  】java version "1.7.0" # 【 補足 】http://ime.nu/www1.axfc.net/uploader/Sc/so/311237.zip #       上記のリンクが、課題のCSVファイルと、 #       参考資料としてあげられていたCSVファイルの読み込み・書き込みを行うプログラムです。 #       CSVファイルは編集してはならないとのことです。 #       CSVファイルは、左から順番に、 #       「国語」「数学」「英語」「社会」「理科」「美術」「工芸」「書道」「音楽」「体育」の科目で、 #       上から順番に「生徒1」「生徒2」・・・「生徒100」となっております。 #       よろしくお願いいたします。 # '・N人の、M科目の成績が書かれたCSVファイルを読み込む ・平均点、最高点、最低点、度数分布を各科目毎に出力する ・各科目、総合点のランキングリストを出力する ・成績の処理結果をテキストファイルに出力する'(_CSVファイル,_書き込みテキストファイル) :- get_split_lines(_CSVファイル,[','],LL), 転置(LL,_転置LL), '平均点、最高点、最低点、度数分布を各科目毎に集約する'([国語,数学,英語,社会,理科,美術,工芸,書道,音楽,体育],_転置LL,_集約リスト), 総合点のランキングリスト(LL,_総合点のランキングリスト), 出力する(_書き込みテキストファイル,_集約リスト,_総合点のランキングリスト). '平均点、最高点、最低点、度数分布を各科目毎に集約する'([],[],[]). '平均点、最高点、最低点、度数分布を各科目毎に集約する'([_科目|R1],[_列|R2],[[_科目,_平均点,_最高点,_最低点,_度数分布,_ランキングリスト]|R3]) :- 最高点(_列,_最高点), 最低点(_列,_最低点), 平均点(_列,_平均点), 度数分布(_列,_度数分布), 科目毎のランキングリスト(_列,_ランキングリスト), '平均点、最高点、最低点、度数分布を各科目毎に集約する'(R1,R2,R3). 総合点のランキングリスト(LL,_ランキングリスト) :- 総合点集約(1,LL,LL1), sort(LL1,LL2), reverse(LL3,_ランキングリスト). 総合点集約(_,[],[]). 総合点集約(N,[_行|R1],[[_合計点,N]|R2]) :- sum(_行,_合計点), N2 is N + 1, 集合点集約(N2,R1,R2). 度数分布(_列,_度数分布) :- findall(_度数,( member([_点数下限,_点数上限],[[0,19],[20,39],[40,59],[60,79],[80,100]]), count(( member(_点数,_列), _点数 >= _点数下限, _点数 =< _点数上限), _度数分布). 科目毎のランキングリスト(_列,_ランキングリスト), 整列用ランキングリスト(1,_列,_整列用ランキングリスト), sort(_整列用ランキングリスト,_整列済みランキングリスト), reverse(_整列済みランキングリスト,_ランキングリスト). 整列用ランキングリスト(_,[],[]). 整列用ランキングリスト(N,[_得点|R1],[[_得点,N]|R2]) :- N2 is N + 1, 整列用ランキングリスト(N2,R1,R2). 出力する(_書き込みテキストファイル,_集約リスト,_総合点のランキングリスト) :- open(_書き込みテキストファイル,write,Outstream), 科目別項目の書き込み(Outstream,_集約リスト), 総合点のランキングの書き込み(Outstream,_総合点ランキングリスト), close(Outstream). 科目別項目の書き込み(Outstream,_集約リスト) :- append(_,[[_科目,_平均点,_最高点,_最低点,_度数分布,_ランキングリスト]|R],_集約リスト), writef(Outstream,'科目 %t\n',[_科目]), writef(Outstream,'平均点 %4r\n最高点 %4r\n最低点 %4r\n',[_平均点,_最高点,_最低点]), writef(Outstream,'0~19点 %4r\n20~39点 %4r\n40~59点 %4r\n60~79点 %4r\n80~100点 %4r\n',_度数分布), write('%tランキングリスト\n',[_科目]), ランキングリストの書き込み(Outstream,_ランキングリスト), R = []. ランキングリストの書き込み(Outstream,_ランキングリスト) :- ランキングリストの書き込み(Outstream,1,1,_ランキングリスト). ランキングリストの書き込み(Outstream,_,_,[]) :- !. ランキングリストの書き込み(Outstream,_順位,_順位_1,[[_得点,_生徒番号_1],[_得点,_生徒番号_2]|R]) :- writef(Outstream,'%4r 生徒%2l %4r\n',[_順位,_生徒番号_1,_得点]), _順位_2 is _順位_1 + 1, ランキングリストの書き込み(Outstream,_順位,_順位_2,[[_得点,_生徒番号_2]|R]). ランキングリストの書き込み(Outstream,_順位,_順位_1,[[_得点,_生徒番号]|R]) :- write(Outstream,N1,N2,'科目毎ランキング\n'), writef(Outstream,'%4r 生徒%2l %4r\n',[_順位,_生徒番号,_得点]), _順位_2 is _順位_1 + 1, ランキングリストの書き込み(Outstream,_順位_2,_順位_2,R). 総合点のランキングの書き込み(Outstream,_総合点ランキングリスト) :- write('総合点ランキング\n'), ランキングリストの書き込み(Outstream,_総合点ランキングリスト). % 以下のサイトは バイナリファイル (標準入力) に一致しました % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/727 # # 【 課題 】 名前、生年月日、電話番号、メールアドレスと入った一文が複数あるファイルがある。 # このファイルを読み込み生年月日順にソートして表示せよ。 # ただし生年月日は和暦に変換して表示する。 # 【 形態 】1. Javaアプリケーション(main()で開始 # 【 GUI  】4. 制限なし # 【 期限 】1月23日 《必須》 # 【 Ver  】java version "1.6.0_21" # 【 用語 】数学用語、専門用語の意味、説明を書きます。 《あれば必須》 # 【 補足 】ファイルは各自で用意します。 # 例 田中一郎、1887/05/08、123-456-789、tanaka_ichiro@aa.jp # よろしくお願いします。 # # ' 名前、生年月日、電話番号、メールアドレスと入った一文が複数あるファイルがある。このファイルを読み込み生年月日順にソートして表示せよ。ただし生年月日は和暦に変換して表示する。'(_ファイル) :- get_split_lines(_ファイル,['、'],LL), 整列鍵を先頭に付加する(LL,LL1), 整列(LL1,LL2), 西暦和暦変換をしながら表示する(LL2). 整列鍵を先頭に付加する(LL,LL1) :- findall([_生年月日,_名前,_生年月日,_電話番号,_メールアドレス],LL), member([_名前,_生年月日,_電話番号,_メールアドレス],LL)), LL1). 西暦和暦変換をしながら表示する(LL) :- append(_,[[_,_生年月日,_名前,_生年月日,_電話番号,_メールアドレス]|R],LL), 西暦を和暦に変換する(_生年月日,_和暦表示生年月日), concat_atom([_生年月日,_名前,_生年月日,_電話番号,_メールアドレス],'、',_表示行), writef('%t\n',[_表示行]), R = []. 西暦を和暦に変換する(_生年月日,_和暦表示生年月日) :- split(_生年月日,[/],[_年,_月,_日]), 西暦年を和暦年に変換する(_年,_和暦年表示), concat_atom([_和暦年表示,_月,月,_日,_日],_和暦表示生年月日). 西暦年を和暦年に変換する(_年,_和暦年表示) :- _年 > 1867, _年 < 1912, _和暦年 is 1867 + _年, concat_atom([明治,_和暦年,年],_和暦年表示). 西暦年を和暦年に変換する(_年,_和暦年表示) :- _年 > 1911, _年 < 1926, _和暦年 is 1911 + _年, concat_atom([大正,_和暦年,年],_和暦年表示). 西暦年を和暦年に変換する(_年,_和暦年表示) :- _年 > 1925, _年 < 1989, _和暦年 is 1926 + _年, concat_atom([昭和,_和暦年,年],_和暦年表示). 西暦年を和暦年に変換する(_年,_和暦年表示) :- _年 > 1988, _和暦年 is 1988 + _年, concat_atom([平成,_和暦年,年],_和暦年表示). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/393 # # [1] 授業単元:プログラミング # [2]特定範囲の乱数を計算する関数を作成して、0から9ま # での10種類の乱数を発生させて、それぞれの値の発 # 生回数を調べるプログラムをかけ。 # '特定範囲の乱数を計算する関数を作成して、0から9までの10種類の乱数を発生させて、それぞれの値の発生回数を調べる'(_標本数,_発生回数ならび) :- findall(_乱数,( 線形合同法による擬似乱数の発生(_標本数,10,_乱数)), L), それぞれの値の発生回数を調べる(L,_発生回数ならび). それぞれの値の発生回数を調べる(L,_発生回数ならび) :- findall([N,_発生回数],( for(0,N,9), count(member(N,L),_発生回数)), _発生回数ならび). 'Aの種'(97411897). 'Bの種'(75289433). 'Xの種'(42308843). 線形合同法による擬似乱数の発生(N,M,X) :- 定数を決定する(A,B,X0), X1 is (A * X0 + B) mod M, 線形合同法による擬似乱数の発生(1,N,A,B,M,X1,X). 線形合同法による擬似乱数の発生(N,N,A,B,M,X,X). 線形合同法による擬似乱数の発生(N1,N,A,B,M,X1,X) :- X2 is (A * X1 + B) mod M, N2 is N + 1, 線形合同法による擬似乱数の発生(N2,N,A,B,M,X2,X). 定数を決定する(A,B,X) :- get_time(Time), 'Aの種'(_Aの種), 'Bの種'(_Bの種), 'Xの種'(_Xの種), A is truncate(Time) mod _Aの種 + 1, B is truncate(Time) mod _Bの種 + 1, X is truncate(Time) mod _Xの種 + 1. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/361 # # [2] 問題文(含コード&リンク): 構造体 # # ある人の生まれた年,生まれた月をそれぞれ構造体で内部的に表現する. 2人分のデータを入力した後,2人の年令の差(年,月まで)を 計算して以下のような結果を示すプログラムを作成する. # 実行例 # ----------------------------------------------------- #  [1] Aさんのデータを入力 #  [2] Bさんのデータを入力 #  [3] 結果表示 #  [9] 終了 # ----------------------------------------------------- # # #コマンドを入力して下さい:1 # Aさんの生れた年は?:1967 # Aさんの生れた月は?:8 # # #コマンドを入力して下さい:3 # まだBさんのデータが入力されていません! # # #コマンドを入力して下さい:2 # Bさんの生れた年は?:1987 # Bさんの生れた月は?:10 # # #コマンドを入力して下さい:3 # Aさんは 20年と2ヶ月 Bさんより年上です. # # #コマンドを入力して下さい:9 # 留意点 # ・メニュー形式で実装. # ・関数化を行うこと. #  main 関数のみのプログラムは不可とします. # [3.3] 言語: c言語 # [4] 期限: 1月20日 # 'ある人の生まれた年,生まれた月をそれぞれ構造体で内部的に表現する.2人分のデータを入力した後,2人の年令の差(年,月まで)を 計算して以下のような結果を示すプログラムを作成する.' :- write('-----------------------------------------------------\n[1] Aさんのデータを入\n[2] Bさんのデータを入力\n[3] 結果表示\n[9] 終了\n-----------------------------------------------------\n'), コマンドの入力(_コマンド), コマンドの選択実行(_コマンド). 'ある人の生まれた年,生まれた月をそれぞれ構造体で内部的に表現する.2人分のデータを入力した後,2人の年令の差(年,月まで)を 計算して以下のような結果を示すプログラムを作成する.' :- 'ある人の生まれた年,生まれた月をそれぞれ構造体で内部的に表現する.2人分のデータを入力した後,2人の年令の差(年,月まで)を 計算して以下のような結果を示すプログラムを作成する.'. コマンドの入力(_コマンド) :- write('#コマンドを入力して下さい: '), get_line(_コマンド). コマンドの選択実行('9') :- !. コマンドの選択実行('1') :- get_integer(_生まれた年), get_integer(_生まれた月), 'ある人の生まれた年,生まれた月をそれぞれ構造体で内部的に表現する.'('A',_生まれた年,_生まれた月). コマンドの選択実行('2') :- get_integer(_生まれた年), get_integer(_生まれた月), 'ある人の生まれた年,生まれた月をそれぞれ構造体で内部的に表現する.'('B',_生まれた年,_生まれた月). コマンドの選択実行('3') :- '2人の年令の差(年,月まで)を 計算して以下のような結果を示す'. '2人の年令の差(年,月まで)を 計算して以下のような結果を示す' :- findall([_生まれた年,_生まれた月],( 'ある人の生まれた年,生まれた月'(_,_生まれた年,_生まれた月)), [[_Aの生まれた年,_Aの生まれた月],[_Bの生まれた年,_Bの生まれた月]]), 年齢差の計算(_Aの生まれた年,_Aの生まれた月,_Bの生まれた年,_Bの生まれた月,_表示文), writef('%t',[_表示文]). 'ある人の生まれた年,生まれた月をそれぞれ構造体で内部的に表現する.'(_ある人,_生まれた年,_生まれた月) :- assertz('ある人の生まれた年,生まれた月'(_ある人,_生まれた年,_生まれた月)). 年齢差の計算(_生まれた年,_生まれた月,_生まれた年,_生まれた月,'AさんとBさんは同じ年の同じ月の生まれです') :- !. 年齢差の計算(_Aの生まれた年,_Aの生まれた月,_Bの生まれた年,_Bの生まれた月,_表示文) :- M_1 is _Aの生まれた年 * 12 + _Aの生まれた月, M_2 is _Bの生まれた年 * 12 + _Bの生まれた月, 年齢差の計算(M_1,M_2,_表示文). 年齢差の計算(M_1,M_2,_表示文) :- M_1 > M_2, S is M_1 - M_2, _年 is S // 12, _月 is S mod 12, swritef(_表示文,'Aさんは %t年と%tヶ月 Bさん%tです.\n',[_年,_月,より年上]). 年齢差の計算(M_1,M_2,_表示文) :- M_1 < M_2, S is M_2 - M_1, _年 is S // 12, _月 is S mod 12, swritef(_表示文,'Aさんは %t年と%tヶ月 Bさん%tです.\n',[_年,_月,より年下]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/159 # # ●正規表現の使用環境 # テキスト # # ●検索か置換か? # 置換 # # ●説明 # 文章内の指定した数の改行毎に、行を一段開けたい。 # 下記例文なら改行三つごとに行を一段開けたい。 # # ●対象データ # (例文) # 人は誰しも初体験にはほろ苦く、甘酸っぱい思い出があるものだが、人生の諸先輩方はどんな童貞喪失体験をしたのか? # 「シリーズ初体験」−−現在70歳の会社役員(兵庫県)が当時の思い出を語った。 # 中学2年の時、国語の女教師に「勉強を教えてあげるから家においで」といわれ、夏休みに入ってすぐに先生の家を訪れました。 # 教師になって3年目、美人ではないけれど、私にとっては優しいお姉さんのような存在でした。 # 何人かいるのかなと思ったんですが、先生の家に行くと私の他は誰もいませんでした。 # 勉強を教わり、夕食をご馳走になり、その日は泊めてもらいました。 # 夜中、下半身がもぞもぞするので目が覚めると、先生が私の浴衣の裾を広げていました。 # # ●希望する結果 # 人は誰しも初体験にはほろ苦く、甘酸っぱい思い出があるものだが、人生の諸先輩方はどんな童貞喪失体験をしたのか? # 「シリーズ初体験」−−現在70歳の会社役員(兵庫県)が当時の思い出を語った。 # 中学2年の時、国語の女教師に「勉強を教えてあげるから家においで」といわれ、夏休みに入ってすぐに先生の家を訪れました。 # # 教師になって3年目、美人ではないけれど、私にとっては優しいお姉さんのような存在でした。 # 何人かいるのかなと思ったんですが、先生の家に行くと私の他は誰もいませんでした。 # 勉強を教わり、夕食をご馳走になり、その日は泊めてもらいました。 # # 夜中、下半身がもぞもぞするので目が覚めると、先生が私の浴衣の裾を広げていました。 # ------------------------- # よろしくお願いします。 # # '文章内の指定した数の改行毎に、行を一段開ける'(_ファイル,_n行毎) :- get_lines(_ファイル,Lines), 'n行毎に改行を挿入する'(Lines,Lines2), 表示する(_ファイル,Lines2). 'n行毎に改行を挿入する'([A,B,C|R1],[A,B,C,'\n'|R2]) :- 'n行毎に改行を挿入する'(R1,R2),!. 'n行毎に改行を挿入する'(L,L). 表示する(_ファイル,Lines) :- put_lines(_ファイル,Lines). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/122 # # [1] 授業単元:計算機アルゴリズム # [2] 問題文(含コード&リンク): # ttp://www.dotup.org/uploda/www.dotup.org2496567.txt.html # # 設問1-1 # プログラミング実習の出席回数と試験結果をそれぞれ別々のファイルに記録するプログラムを作成し、 # 10人分の適当なデータをキーボードから入力して実行しなさい。 # プログラムとしてはn(>0)人分のデータを記録できるように作成し、変数nの値はキーボードから入力できるようにしなさい。 # ただし、データはキーボードから入力しファイルに書き込むこととする。 # それぞれのファイルには、出席番号、前期の結果、後期の結果を次のように記録するものとする。 # # 出席の記録 # ファイル名:Class_Participation.txt # # 1, 12, 5 # 2, 10, 12 # 3, 11, 15 # 4, 4, 15 # 5, 8, 14 # # …, …, … # # 試験の記録 # ファイル名:Exams.txt # # 1, 88, 90 # 2, 96, 75 # 3, 40, 80 # 4, 40, 75 # 5, 90, 90 # # …, …, … # # 設問1-2 # 設問1-1のデータについて、成績は、((前期出席回数+後期出席回数)+(前期試験点数+後期試験点数))/2で評価するものとし、 # 設問1-1で作成したファイルからデータを読み込み、成績を計算表示するプログラムを作成し、実行してみなさい。 # 'プログラミング実習の出席回数と試験結果をそれぞれ別々のファイルに記録するプログラムを作成し、10人分の適当なデータをキーボードから入力して実行しなさい' :- 'n人分の適当なデータをキーボードから入力'(10,_n人分のデータ), 'プログラミング実習の出席回数と試験結果をそれぞれ別々のファイルに記録する'(_n人分のデータ). 'n人分の適当なデータをキーボードから入力'(_n人,_n人分のデータ) :- length(_n人分のデータ,_n人), findall(_データ,( append(Ln,[_データ|_],_n人分のデータ), データ入力([_|Ln],_データ)), _n人分のデータ). データ入力(Ln,[_学生番号,_前期出席数,_後期出席数,_前期成績,_後期成績]) :- length(Ln,_何番目), writef('第%t番目の 学生番号,前期出席数,後期出席数,前期成績,後期成績(5項目)をカンマ区切りで入力してください : ',[_何番目]), readln([_学生番号,_前期出席数,_後期出席数,_前期成績,_後期成績]),!. データ入力(Ln,_データ) :- write('もう一度入力しなおして下さい\n'), データ入力(Ln,_データ). 'プログラミング実習の出席回数と試験結果をそれぞれ別々のファイルに記録する'(_n人分のデータ) :- 'プログラミング実習の出席回数をファイルClass_Participation.txtに書きだす'(_n人分のデータ), 'プログラミング実習の試験結果をファイルExams.txtに書きだす'(_n人分のデータ). 'プログラミング実習の出席回数をファイルClass_Participation.txtに書きだす'(_n人分のデータ) :- open('Class_Participation.txt',write,Outstream), append(_,[[_学生番号,_前期出席数,_後期出席数,_,_]|R],_n人分のデータ), writef(Outstream,'%t,%t,%t\n',[_学生番号,_前期出席数,_後期出席数]), R = [], close(Outstream). 'プログラミング実習の出席回数をファイルExams.txtに書きだす'(_n人分のデータ) :- open('Exams.txt',write,Outstream), append(_,[[_学生番号,_,_,_前期成績,_後期成績]|R],_n人分のデータ), writef(Outstream,'%t,%t,%t\n',[_学生番号,_前期成績,_後期成績]), R = [], close(Outstream). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/87 # # [1] 授業単元:基礎プログラミング # [2] 問題文(含コード&リンク): # 次のように1行に氏名、科目ごとの成績が記録されたファイル # (ファイル名:result.dat)があるとする。 # Name English Science Math Sociology # Ichiro 100 30 40 90 # Jiro 100 80 70 100 # Saburo 80 90 100 60 # Shiro 95 90 95 80 # Goro 73 85 90 98 # このファイルを読み込んで各生徒の平均点を求め、平均点の高い順に行を並べ替えて表示するプログラムを作成せよ。 # (表示には平均点を含む) # '1行に氏名、科目ごとの成績が記録されたファイル(ファイル名:result.dat)があるとする。このファイルを読み込んで各生徒の平均点を求め、平均点の高い順に行を並べ替えて表示する' :- get_lines('result.dat',[_第一行|LL]), findall([_平均点,_氏名],( member(Line,LL), split(Line,[' '],[_|_得点ならび]), avg(_得点ならび,_平均点)), _平均点ならび), 平均点の高い順に行をならび替えて表示する(_第一行,LL,_平均点ならび). 平均点の高い順に行をならび替えて表示する(_第一行,LL,_平均点ならび) :- 平均点の高い順に(_平均点ならび,_平均点の高い順の氏名ならび), 行をならび替えて(_第一行,LL,_平均点の高い順の氏名ならび,_表示行ならび), 表示する(_表示行ならび). 平均点の高い順に(_平均点ならび,LL,_行のならび) :- sort(_平均点ならび,_整列した平均点), reverse(_整列した平均点,_平均点の高い順にならび替えた行), findall(_氏名,( member([_,_氏名],_平均点の高い順にならび替えた行)), _平均点の高い順の氏名ならび). 行をならび替えて(_第一行,LL,_平均点の高い順の氏名ならび,[_第一行|_表示行ならび]) :- findall([_氏名,Line],( member(Line,LL), split(Line,[' '],[_氏名|_])), LL1), findall(L,( member(_氏名,_平均点の高い順の氏名ならび), member([_氏名,Line],LL1)), _表示行ならび). 表示する(_表示行ならび) :- append(_,[_表示行|R],_表示行ならび), writef('%t\n',[_表示行]), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/903 # # [1] 授業単元:計算機アルゴリズムファイルへの書き込み # [2] 問題文(含コード&リンク):以下の実行例のように、キーボードから友人の名前(文字列)と生年月日(yyyymmdd形式のlong型変数) # を次々と読み込んで、そのデータをファイルに書きこむプログラムを作成せよ。 # # 以下の要件を満たすとする # ・書きこむのファイル名をユーザに入力させる # ・同じ名前の友人の情報がすでに入力されたかどうかは確認しなくても良い。 # ・同じ名前のファイルはすでに存在する場合には、内容を上書きするものとする。 # ・作成されたファイルの中身は以下の実行例(catコマンドの結果)のようにするものとする。 # ・以下の実行例のように,1人文のデータを入力するごとに「続けますか(yse...1/NO...0:)」のように表示を促し1が入力されたら処理を続けるプログラムとする。 # # [5] その他の制限:[実行例] # 書きこむファイル名:friends.txt # 友人の名前:Goro # 誕生日(yyyymmdd):19911001 # 続けますか?(yes...1/NO...0):1 # 友人の名前:Taro # 誕生日(yyyymmdd):19890505 # 続けますか?(yes...1/NO...0):1 # 友人の名前:Akira # 誕生日(yyyymmdd):19920222 # 続けますか?(yes...1/NO...0):0 # # %cat freinds.txt # Goro 19911001 # Taro 19890505 # Akira 19920222 # 宜しくお願いします。 # 'キーボードから友人の名前(文字列)と生年月日(yyyymmdd形式のlong型変数)を次々と読み込んで、そのデータをファイルに書きこむ'(_ファイル) :- 'キーボードから友人の名前(文字列)と生年月日(yyyymmdd形式のlong型変数)を次々と読み込んで'(_名前_生年月日ならび), 'そのデータをファイルに書きこむ'(_ファイル,_名前_生年月日ならび). 'キーボードから友人の名前(文字列)と生年月日(yyyymmdd形式のlong型変数)を次々と読み込んで'(_名前_生年月日ならび) :- 友人の名前を読み込む(_友人の名前), 生年月日を読み込む(_生年月日), 続行するか終了するか問う(_答え), 'キーボードから友人の名前(文字列)と生年月日(yyyymmdd形式のlong型変数)を次々と読み込んで'(_答え,_友人の名前,_生年月日,_名前_生年月日ならび). 'キーボードから友人の名前(文字列)と生年月日(yyyymmdd形式のlong型変数)を次々と読み込んで'(0,[]). 'キーボードから友人の名前(文字列)と生年月日(yyyymmdd形式のlong型変数)を次々と読み込んで'(_,_友人の名前,_生年月日,[[_友人の名前,_生年月日]|R]) :- 友人の名前を読み込む(_友人の名前_2), 生年月日を読み込む(_生年月日_2), 続行するか終了するか問う(_答え), 'キーボードから友人の名前(文字列)と生年月日(yyyymmdd形式のlong型変数)を次々と読み込んで'(_答え,_友人の名前_2,_生年月日_2,R). 友人の名前を読み込む(_友人の名前) :- write('友人の名前:'), get_line(_友人の名前). 生年月日を読み込む(_生年月日) :- write('誕生日(yyyymmdd):'), get_line(_生年月日). 続行するか終了するか問う(_答え) :- write('続けますか?(yes...1/NO...0):'), get_line(Line), 続行するか終了するか診断(Line,_答え),!. 続行するか終了するか問う(_答え) :- 続行するか終了するか問う(_答え). 続行するか終了するか診断(Line,_答え) :- atom_to_term(Line,_答え,_), integer(_答え), _答え >= 0, _答え =< 1,!. 続行するか終了するか診断(Line,_答え) :- fail. 'そのデータをファイルに書きこむ'(_ファイル,_名前_生年月日ならび) :- open(_ファイル,write,Outstream), append(_,[[_友人の名前,_生年月日]|R],_名前_生年月日ならび), writef('%t %t\n',[_友人の名前,_生年月日]), R = [], close(Outstream). % 以下のサイトは 国民の祝日である(_年,_月,_日) :- '国民の祝日に関する法律 第二条  「国民の祝日」を次のように定める。'(_,_,_年,_月,_日). 振替休日である(_振替休日の年,_振替休日の月,_振替休日の日) :- '国民の祝日に関する法律 第三条 2  「国民の祝日」が日曜日に当たるときは、その日後においてその日に最も近い「国民の祝日」でない日を休日とする。'(_振替休日の年,_振替休日の月,_振替休日の日). 国民の休日である(_国民の休日の年,_国民の休日の月,_国民の休日の日) :- '国民の祝日に関する法律 第三条 3  その前日及び翌日が「国民の祝日」である日(「国民の祝日」でない日に限る。)は、休日とする。'(_国民の休日の年,_国民の休日の月,_国民の休日の日). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 国民の祝日に関する法律 :- '(昭和二十三年七月二十日法律第百七十八号)', '最終改正:平成一七年五月二〇日法律第四三号', '国民の祝日に関する法律 第一条  自由と平和を求めてやまない日本国民は、美しい風習を育てつつ、よりよき社会、より豊かな生活を築きあげるために、ここに国民こぞつて祝い、感謝し、又は記念する日を定め、これを「国民の祝日」と名づける。', '国民の祝日に関する法律 第二条  「国民の祝日」を次のように定める。', '国民の祝日に関する法律 第三条  「国民の祝日」は、休日とする。'. '国民の祝日に関する法律 第三条 2  「国民の祝日」が日曜日に当たるときは、その日後においてその日に最も近い「国民の祝日」でない日を休日とする。'. '国民の祝日に関する法律 第一条  自由と平和を求めてやまない日本国民は、美しい風習を育てつつ、よりよき社会、より豊かな生活を築きあげるために、ここに国民こぞつて祝い、感謝し、又は記念する日を定め、これを「国民の祝日」と名づける。'. '国民の祝日に関する法律 第二条  「国民の祝日」を次のように定める。'. '国民の祝日に関する法律 第二条  「国民の祝日」を次のように定める。'(_祝日の名称,_条文,_年,_月,_日) :- 国民の祝日(_祝日の名称,_条文,_年,_月,_日). '国民の祝日に関する法律 第三条  「国民の祝日」は、休日とする。'. '国民の祝日に関する法律 第三条 2  「国民の祝日」が日曜日に当たるときは、その日後においてその日に最も近い「国民の祝日」でない日を休日とする。'. '国民の祝日に関する法律 第三条 2  「国民の祝日」が日曜日に当たるときは、その日後においてその日に最も近い「国民の祝日」でない日を休日とする。'(_振替休日の年,_振替休日の月,_振替休日の日) :- '祝日が日曜の場合は翌日以降の平日を振替休日にする'(_振替休日の年,_振替休日の月,_振替休日の日). '国民の祝日に関する法律 第三条 3  その前日及び翌日が「国民の祝日」である日(「国民の祝日」でない日に限る。)は、休日とする。'. '国民の祝日に関する法律 第三条 3  その前日及び翌日が「国民の祝日」である日(「国民の祝日」でない日に限る。)は、休日とする。'(_国民の休日の年,_国民の休日の月,_国民の休日の日) :- '国民の休日とは、国民の祝日にはさまれた平日を指す'(_国民の休日の年,_国民の休日の月,_国民の休日の日). '(昭和二十三年七月二十日法律第百七十八号)'. '最終改正:平成一七年五月二〇日法律第四三号'. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 国民の祝日(元日,'一月一日 年のはじめを祝う。',_,1,1). 国民の祝日(成人の日,'一月の第二月曜日 おとなになつたことを自覚し、みずから生き抜こうとする青年を祝いはげます。',_年,1,_日) :- 第二月曜日(_年,1,_日). 国民の祝日(建国記念の日,'政令で定める日 建国をしのび、国を愛する心を養う。',_年,_月,_日) :- 建国記念日の日に関する政令(_年,_月,_日). 国民の祝日(春分の日,'春分日 自然をたたえ、生物をいつくしむ。',_年,_月,_日) :- 春分の日(_年,_月,_日). 国民の祝日(昭和の日,'昭和の日 四月二十九日 激動の日々を経て、復興を遂げた昭和の時代を顧み、国の将来に思いをいたす。',_年,4,29). 国民の祝日(憲法記念日,'憲法記念日 五月三日 日本国憲法 の施行を記念し、国の成長を期する。',_年,5,3). 国民の祝日(みどりの日,'みどりの日 五月四日 自然に親しむとともにその恩恵に感謝し、豊かな心をはぐくむ。',_年,5,4). 国民の祝日(こどもの日,'こどもの日 五月五日 こどもの人格を重んじ、こどもの幸福をはかるとともに、母に感謝する。',_年,5,5). 国民の祝日(海の日,'海の日 七月の第三月曜日 海の恩恵に感謝するとともに、海洋国日本の繁栄を願う。',_年,7,_日) :- 第三月曜日(_年,7,_日). 国民の祝日(敬老の日,'敬老の日 九月の第三月曜日 多年にわたり社会につくしてきた老人を敬愛し、長寿を祝う。',_年,9,_日) :- 第三月曜日(_年,9,_日). 国民の祝日(秋分の日,'秋分の日 秋分日 祖先をうやまい、なくなつた人々をしのぶ。',_年,_月,_日) :- 秋分の日(_年,_月,_日). 国民の祝日(体育の日,'体育の日 十月の第二月曜日 スポーツにしたしみ、健康な心身をつちかう。',_年,10,_日) :- 第二月曜日(_年,10,_日). 国民の祝日(文化の日,'文化の日 十一月三日 自由と平和を愛し、文化をすすめる。',_年,11,3). 国民の祝日(勤労感謝の日,'勤労感謝の日 十一月二十三日 勤労をたつとび、生産を祝い、国民たがいに感謝しあう。',_年,11,23). 国民の祝日(天皇誕生日,'天皇誕生日 十二月二十三日 天皇の誕生日を祝う。',_年,12,23). 祝日が日曜の場合は翌日以降の平日を振替休日にする(_振替休日の年,_振替休日の月,_日) :- 国民の祝日(_,_,_振替休日の年,_振替休日の月,_日), 'Zellerの公式を用いて曜日を得る'(_振替休日の年,_振替休日の月,_日,_,日曜), 振替休日(_振替休日の年,_振替休日の月,_日,_振替休日の日). 振替休日(_振替休日の年,_振替休日の月,_日,_振替休日の日) :- between(_日,31,_振替休日の日), \+(国民の祝日(_,_,_振替休日の年,_振替休日の月,_振替休日の日)), 'Zellerの公式を用いて曜日を得る'(_振替休日の年,_振替休日の月,_振替休日の日,_,_曜日), \+(_曜日=日曜),!. '国民の休日とは、国民の祝日にはさまれた平日を指す'(_国民の休日の年,_国民の休日の月,_国民の休日の日) :- 前日(_国民の休日の年,_国民の休日の月,_国民の休日の日,_前日の年,_前日の月,_前日の日), 翌日(_国民の休日の年,_国民の休日の月,_国民の休日の日,_翌日の年,_翌日の月,_翌日の日), 国民の祝日(_,_,_前日の年,_前日の月,_前日の日), 国民の祝日(_,_,_翌日の年,_翌日の月,_翌日の日),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 第三月曜日(_年,_月,_日) :- between(15,21,_日), 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_,月曜). 第二月曜日(_年,_月,_日) :- between(8,14,_日), 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_,月曜). 春分の日(_年,_月,_日) :- '「春分の日」および「秋分の日」の日付は、前年2月1日の官報で発表される。'(_年,_月,_日),!. 春分の日(_年,3,_日) :- '国立天文台「暦象年表」に基づき', _年 >= 1980, _年 =< 2099, _日 is truncate(20.8431+0.242194*(_年-1980)-truncate((_年-1980)/4)),!. 春分の日(_年,3,23). 秋分の日(_年,_月,_日) :- '「春分の日」および「秋分の日」の日付は、前年2月1日の官報で発表される。'(_年,_月,_日),!. 秋分の日(_年,9,_日) :- '国立天文台「暦象年表」に基づき', _年 >= 1980, _年 =< 2099, _日 is truncate(23.2488+0.242194*(_年-1980)-truncate((_年-1980)/4)),!. 秋分の日(_年,9,23). 建国記念日の日に関する政令(_年,2,11). 政令で定める. '「春分の日」および「秋分の日」の日付は、前年2月1日の官報で発表される。'(_年,_月,_日) :- fail. '国立天文台「暦象年表」に基づき'. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 前日(_年,_月,_日,_前日の年,_前日の月,_前日の日) :- 前日の月がわり調整(_年,_月,_日,_前日の年,_前日の月,_前日の日). 翌日(_年,_月,_日,_翌日の年,_翌日の月,_翌日の日) :- 翌日の月がわり調整(_年,_月,_日,_翌日の年,_翌日の月,_翌日の日). 前日の月がわり調整(_整数年,1,1,_変更された整数年,12,31) :- _変更された整数年 は _整数年 - 1,!. 前日の月がわり調整(_整数年,_整数月,1,_整数年,_変更された整数月,31) :- member(_整数月,[2,4,6,8,9,11]), _変更された整数月 は _整数月 - 1,!. 前日の月がわり調整(_整数年,_整数月,1,_整数年,_変更された整数月,30) :- member(_整数月,[5,7,10,12]), _変更された整数月 は _整数月 - 1,!. 前日の月がわり調整(_整数年,3,1,_整数年,2,29) :- 0 is _整数年 mod 4,!. 前日の月がわり調整(_整数年,3,1,_整数年,2,28) :- \+(0 is _整数年 mod 4),!. 前日の月がわり調整(_整数年,_整数月,_整数日,_整数年,_整数月,_変更された整数日) :- _変更された整数日 は _整数日 - 1,!. 翌日の月がわり調整(_整数年,12,31,_変更された整数年,1,1) :- _変更された整数年 は _整数年 + 1,!. 翌日の月がわり調整(_整数年,_整数月,30,_整数年,_変更された整数月,1) :- member(_整数月,[4,6,8,9,11]), _変更された整数月 は _整数月 + 1,!. 翌日の月がわり調整(_整数年,_整数月,31,_整数年,_変更された整数月,1) :- member(_整数月,[1,3,5,7,10]), _変更された整数月 は _整数月 + 1,!. 翌日の月がわり調整(_整数年,2,29,_整数年,3,1) :- 0 is _整数年 mod 4,!. 翌日の月がわり調整(_整数年,2,28,_整数年,3,1) :- \+(うるう年(_整数年)),!. 翌日の月がわり調整(_整数年,_整数月,_整数日,_整数年,_整数月,_変更された整数日) :- _変更された整数日 は _整数日 + 1,!. 翌月(_年,12,_翌年,1) :- _翌年 is _年 + 1,!. 翌月(_年,_月,_年,_翌月) :- _翌月 is _月 + 1. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100, !, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 'Zellerの公式を用いて曜日を得る'(_年,1,_日,_曜日を表す値,_曜日) :- _年_1 is _年 - 1, 'Zellerの公式を用いて曜日を得る'(_年_1,13,_日,_曜日を表す値,_曜日),!. 'Zellerの公式を用いて曜日を得る'(_年,2,_日,_曜日を表す値,_曜日) :- _年_1 is _年 - 1, 'Zellerの公式を用いて曜日を得る'(_年_1,14,_日,_曜日を表す値,_曜日),!. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 曜日を表す値(_曜日を表す値,_曜日),!. 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). % 以下のサイトは 国民の祝日である(_年,_月,_日) :- 国民の祝日である(_,_年,_月,_日). 振替休日である(_年,_月,_日) :- 祝日が日曜の場合は翌日以降の平日を振替休日にする(_年,_月,_日). 国民の休日である(_年,_月,_日) :- '国民の休日とは、国民の祝日にはさまれた平日を指す'(_年,_月,_日). 国民の祝日である(元旦,_年,1,1). 国民の祝日である(成人の日,1,_日) :- 第二月曜日(_年,1,_日). 国民の祝日である(建国記念の日,_年,2,11) :- 政令で定める. 国民の祝日である(春分の日,_年,3,_日) :- 春分の日(_年,3,_日). 国民の祝日である(昭和の日,_年,4,29). 国民の祝日である(憲法記念日,_年,5,3). 国民の祝日である(みどりの日,_年,5,4). 国民の祝日である(こどもの日,_年,5,5). 国民の祝日である(海の日,_年,7,_日) :- 第三月曜日(_年,7,_日). 国民の祝日である(敬老の日,_年,9,_日) :- 第三月曜日(_年,9,_日). 国民の祝日である(秋分の日,_年,9,_日) :- 秋分の日(_年,9,_日). 国民の祝日である(体育の日,_年,10,_日) :- 第二月曜日(_年,10,_日). 国民の祝日である(文化の日,_年,11,3). 国民の祝日である(勤労感謝の日,_年,11,23). 国民の祝日である(天皇誕生日,_年,12,23). 祝日が日曜の場合は翌日以降の平日を振替休日にする(_振替休日の年,_振替休日の月,_振替休日の日) :- 国民の祝日である(_,_振替休日の年,_振替休日の月,_日), 'Zellerの公式を用いて曜日を得る'(_振替休日の年,_振替休日の月,_日,_,日曜), 振替休日(_振替休日の年,_振替休日の月,_日,_振替休日の日). '国民の休日とは、国民の祝日にはさまれた平日を指す'(_国民の休日の年,_国民の休日の月,_国民の休日の日) :- 前日(_国民の休日の年,_国民の休日の月,_国民の休日の日,_前日の年,_前日の月,_前日の日), 翌日(_国民の休日の年,_国民の休日の月,_国民の休日の日,_翌日の年,_翌日の月,_翌日の日), 国民の祝日である(_,_前日の年,_前日の月,_前日の日), 国民の祝日である(_,_翌日の年,_翌日の月,_翌日の日),!. 振替休日(_振替休日の年,_振替休日の月,_日,_振替休日の日) :- for(_日,_振替休日の日,31), \+(国民の祝日である(_,_振替休日の年,_振替休日の月,_振替休日の日)), 'Zellerの公式を用いて曜日を得る'(_振替休日の年,_振替休日の月,_振替休日の日,_,_曜日), \+(_曜日=日曜),!. 祝日が日曜の場合は翌日以降の平日を振替休日にする(_振替休日の年,_振替休日の月,_振替休日の日) :- 国民の祝日である(_,_振替休日の年,_振替休日の月,_日), 'Zellerの公式を用いて曜日を得る'(_振替休日の年,_振替休日の月,_日,_,日曜), 振替休日(_振替休日の年,_振替休日の月,_日,_振替休日の日). '国民の休日とは、国民の祝日にはさまれた平日を指す'(_国民の休日の年,_国民の休日の月,_国民の休日の日) :- 前日(_国民の休日の年,_国民の休日の月,_国民の休日の日,_前日の年,_前日の月,_前日の日), 翌日(_国民の休日の年,_国民の休日の月,_国民の休日の日,_翌日の年,_翌日の月,_翌日の日), 国民の祝日である(_,_前日の年,_前日の月,_前日の日), 国民の祝日である(_,_翌日の年,_翌日の月,_翌日の日),!. 振替休日(_振替休日の年,_振替休日の月,_日,_振替休日の日) :- for(_日,_振替休日の日,31), \+(国民の祝日である(_,_振替休日の年,_振替休日の月,_振替休日の日)), 'Zellerの公式を用いて曜日を得る'(_振替休日の年,_振替休日の月,_振替休日の日,_,_曜日), \+(_曜日=日曜),!. 第三月曜日(_年,_月,_日) :- for(15,_日,21), 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_,月曜). 第二月曜日(_年,_月,_日) :- for(8,_日,14), 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_,月曜). 春分の日(_年,3,_日) :- '「春分の日」および「秋分の日」の日付は、前年2月1日の官報で発表される。', fail. 春分の日(_年,3,_日) :- '国立天文台「暦象年表」に基づき', _年 >= 1980, _年 =< 2099, _日 is truncate(20.8431+0.242194*(_年-1980)-truncate((_年-1980)/4)),!. 春分の日(_年,3,23). 秋分の日(_年,9,_日) :- '「春分の日」および「秋分の日」の日付は、前年2月1日の官報で発表される。', fail. 秋分の日(_年,9,_日) :- '国立天文台「暦象年表」に基づき', _年 >= 1980, _年 =< 2099, _日 is truncate(23.2488+0.242194*(_年-1980)-truncate((_年-1980)/4)),!. 秋分の日(_年,9,23). 翌月(_年,12,_翌年,1) :- _翌年 is _年 + 1,!. 翌月(_年,_月,_年,_翌月) :- _翌月 is _月 + 1. 前日(_年,_月,_日,_前日の年,_前日の月,_前日の日) :- 前日の月がわり調整(_年,_月,_日,_前日の年,_前日の月,_前日の日). 翌日(_年,_月,_日,_翌日の年,_翌日の月,_翌日の日) :- 翌日の月がわり調整(_年,_月,_日,_翌日の年,_翌日の月,_翌日の日). 前日の月がわり調整(_整数年,1,1,_変更された整数年,12,31) :- _変更された整数年 は _整数年 - 1,!. 前日の月がわり調整(_整数年,_整数月,1,_整数年,_変更された整数月,31) :- member(_整数月,[2,4,6,8,9,11]), _変更された整数月 は _整数月 - 1,!. 前日の月がわり調整(_整数年,_整数月,1,_整数年,_変更された整数月,30) :- member(_整数月,[5,7,10,12]), _変更された整数月 は _整数月 - 1,!. 前日の月がわり調整(_整数年,3,1,_整数年,2,29) :- 0 is _整数年 mod 4,!. 前日の月がわり調整(_整数年,3,1,_整数年,2,28) :- \+(0 is _整数年 mod 4),!. 前日の月がわり調整(_整数年,_整数月,_整数日,_整数年,_整数月,_変更された整数日) :- _変更された整数日 は _整数日 - 1,!. 翌日の月がわり調整(_整数年,12,31,_変更された整数年,1,1) :- _変更された整数年 は _整数年 + 1,!. 翌日の月がわり調整(_整数年,_整数月,30,_整数年,_変更された整数月,1) :- member(_整数月,[4,6,8,9,11]), _変更された整数月 は _整数月 + 1,!. 翌日の月がわり調整(_整数年,_整数月,31,_整数年,_変更された整数月,1) :- member(_整数月,[1,3,5,7,10]), _変更された整数月 は _整数月 + 1,!. 翌日の月がわり調整(_整数年,2,29,_整数年,3,1) :- 0 is _整数年 mod 4,!. 翌日の月がわり調整(_整数年,2,28,_整数年,3,1) :- \+(うるう年(_整数年)),!. 翌日の月がわり調整(_整数年,_整数月,_整数日,_整数年,_整数月,_変更された整数日) :- _変更された整数日 は _整数日 + 1,!. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100, !, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 'Zellerの公式を用いて曜日を得る'(_年,1,_日,_曜日を表す値,_曜日) :- _年_1 is _年 - 1, 'Zellerの公式を用いて曜日を得る'(_年_1,13,_日,_曜日を表す値,_曜日),!. 'Zellerの公式を用いて曜日を得る'(_年,2,_日,_曜日を表す値,_曜日) :- _年_1 is _年 - 1, 'Zellerの公式を用いて曜日を得る'(_年_1,14,_日,_曜日を表す値,_曜日),!. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 曜日を表す値(_曜日を表す値,_曜日),!. 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). 政令で定める. '「春分の日」および「秋分の日」の日付は、前年2月1日の官報で発表される。'. '国立天文台「暦象年表」に基づき'. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/501 # # [1] 授業単元:配列とポインタ(アルゴリズム) # [2] 問題文(含コード&リンク):以下の実行例のように,文字列を入力すると,その前 # 後に"を付けた文字列を生成するプログラムを,ライブ # ラリ関数strcpy とstrcat を用いて作成せよ.ただし, # プログラムは以下の要件を満たすこととする # ・ユーザに入力させる文字列を格納する配列をstr1[],前後に"を付けた文字列のための配列をstr2[] とする. # ・ユーザに入力させる文字列は30 字までとする。 # ・配列str2[] は初期化せずに宣言し,ライブラリ関数strcpy とstrcat を使って(添字演算子[] を使わずに)前後に"を付けた文字列を生成すること. #   実行例. # 文字列を入力してください:Tokyo # 文字列の前後に"を付けました。 # str2:"Tokyo" #  [3.1] OS: linux debian #  [3.2] コンパイラ名とバージョン: gcc4.3.2 #  [3.3] 言語:C言語 # [4] 期限: 12月13日 14時 # [5] その他の制限: # '文字列を入力すると,その前後に"を付けた文字列を生成するプログラムを,ライブラリ関数strcpy とstrcat を用いて作成せよ.ただし,プログラムは以下の要件を満たすこととする。 ・ユーザに入力させる文字列を格納する配列をstr1[],前後に"を付けた文字列のための配列をstr2[] とする. ・ユーザに入力させる文字列は30 字までとする。 ・配列str2[] は初期化せずに宣言し,ライブラリ関数strcpy とstrcat を使って(添字演算子[を使わずに)前後に"を付けた文字列を生成すること.' :- 文字列の入力(_文字列), concat_atom(['"',_文字列,'"'],_生成された文字列), writef('前後に"を付加された文字列は %t です\n',[_生成された文字列]). 文字列の入力(_文字列) :- write('文字列を入力して下さい : '), get_line(Line), 文字列入力診断(Line,_文字列),!. 文字列入力診断(文字列,_文字列) :- atom_length(_文字列,_長さ), _長さ =< 30,!. 文字列入力診断(Line,_文字列) :- sub_atom(Line,0,30,_,_文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/330 # # [1] 授業単元:プログラミング演習 2 # [2] 問題文(含コード&リンク) # テキストファイル bmi.txt を用意します # 17人の名前と彼らの身長と体重が記入されています. # $ cat bmi.txt # Ackley,D.H. 181.5 65.1 # Baker,J.E. 185.3 68.3 # Keller,K.S. 175.2 63.4 # Brent,R.P. 174.4 52.8 # Jong,K.A. 186.2 73.4 # Goldberg,D.E. 174.0 60.0 # Forrest,S. 175.5 60.6 # Fletcher,R. 180.3 73.8 # Powell,M.J.D. 170.1 55.9 # Smith,R.E. 178.7 69.6 # Richardson,J. 167.7 51.5 # Martin,F.G. 179.2 65.3 # Wilson,S.W. 185.8 84.4 # Lawler,E.L. 166.5 59.6 # Reed,J. 176.3 58.8 # Holland,J.H. 186.1 70.4 # Jones,W.T. 171.4 63.7 # # C プログラム delcomma.c を書き,以下の要領でコンパイルし,実行モジュール delcomma を生成します. # delcomma は想像通り,delete comma の略です. # 標準入力から受け取った名前の中で,カンマ以下を削除して標準出力に表示するコマンドです. # # '標準入力から受け取った名前の中で,カンマ以下を削除して標準出力に表示する' :- at_end_of_stream(user_input),!. '標準入力から受け取った名前の中で,カンマ以下を削除して標準出力に表示する' :- get_line(user_input,Line), split(Line,[','],[_名前|_]), writef(user_output,'%t\n',[_名前]), '標準入力から受け取った名前の中で,カンマ以下を削除して標準出力に表示する'. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/163 # # [1] 授業単元:C言語による基礎 # [2] 問題文(含コード&リンク): # 以下の実行例のように,文字列を入力すると,その前 # 後に"を付けた文字列を生成するプログラムを,ライブ # ラリ関数strcpy とstrcat を用いて作成せよ.ただし, # プログラムは以下の要件を満たすこととする. # ? ユーザに入力させる文字列を格納する配列を # str1[],前後に"を付けた文字列のための配列を # str2[] とする. # ? ユーザに入力させる文字列は30 字までとする. # ? 配列str2[] は初期化せずに宣言し,ライブラリ関 # 数strcpy とstrcat を使って(添字演算子[] を # 使わずに)前後に"を付けた文字列を生成すること. # # '文字列を入力すると,その前後に"を付けた文字列を生成する' :- '文字列を入力すると'(_文字列), 'その前後に"を付けた文字列を生成する'(_文字列,_前後に付加された文字列), writef('前後に %t を付加された文字列は %t です。\n',['"',_前後に付加された文字列]). '文字列を入力すると'(_文字列) :- write('文字列を入力して下さい : '), rawmode, '改行が来るか30文字に達するまで文字を入力する'(_文字,[],_文字ならび), norawmode, concat_atom(_文字ならび,_文字列). '改行が来るか30文字に達するまで文字を入力する'(['\n'|_文字ならび_1],_文字ならび) :- reverse(_文字ならび_1,_文字ならび),!. '改行が来るか30文字に達するまで文字を入力する'(_文字ならび_1,_文字ならび) :- length(_文字ならび_1,30), reverse(_文字ならび_1,_文字ならび),!. '改行が来るか30文字に達するまで文字を入力する'(_文字ならび_1,_文字ならび) :- get_char(_文字), '改行が来るか30文字に達するまで文字を入力する'([_文字|_文字ならび_1],_文字ならび). 'その前後に"を付けた文字列を生成する'(_文字列,_前後に付加された文字列) :- concat_atom(['"',_文字列,'"'],_前後に付加された文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/707 # # [1] 授業単元: C言語プログラミング # [2] 問題文(含コード&リンク): # 名前(char name[20])と点数(int score)からなる構造体の配列を作る. # 件数(10以下)をキーボード入力後、その件数だけ名前と点数をキーボード入力して配列に格納し, # 点数の平均点と、平均点以上の学生の名前を表示するプログラムを作成せよ. # なお,文字列aと整数bを同時にキーボード入力するには、scanf("%s %d",a,&b)とすればよい(文字列変数には&がいらない). # # 実行例 # $./kadai # n? 5 # name score? taro 52 # name score? jiro 84 # name score? saburo 38 # name score? hanako 63 # name score? youko 72 # Average:61 # Above average:jiro hanako youko # # ヒント # struct student { # char name[20]; # int score; # } student; # # scanf("%s %d",student.name, &student.score); # '件数(10以下)をキーボード入力後、その件数だけ名前と点数をキーボード入力して配列に格納し,点数の平均点と、平均点以上の学生の名前を表示する' :- '件数(10以下)をキーボード入力'(_件数), 'その件数だけ名前と点数をキーボード入力して配列に格納し'(_件数), '点数の平均点と、平均点以上の学生の名前を表示する'. '点数の平均点と、平均点以上の学生の名前を表示する' :- 点数の平均点(_平均点), 平均点以上の学生の名前を表示する(_平均点), fail. '点数の平均点と、平均点以上の学生の名前を表示する'. 平均点以上の学生の名前を表示する(_平均点) :- 名前と得点(_名前,_得点), _得点 >= _平均点, writef('平均点%t以上の名前は : %t\n',[_名前]),!. 点数の平均点(_平均点) :- findavg(_点数,( 名前と得点(_名前,_得点)), _平均点). '件数(10以下)をキーボード入力'(_件数) :- 催促付き整数入力('件数を入力して下さい(10以下) : ',_件数), _件数 =< 10,!. '件数(10以下)をキーボード入力'(_件数) :- '件数(10以下)をキーボード入力'(_件数). 'その件数だけ名前と点数をキーボード入力して配列に格納し'(0) :- !. 'その件数だけ名前と点数をキーボード入力して配列に格納し'(_件数) :- 名前と点数の入力(_名前,_点数), assertz(名前と点数(_名前,_点数)), _件数_1 is _件数 - 1, 'その件数だけ名前と点数をキーボード入力して配列に格納し'(_件数_1). 名前と点数の入力(_名前,_点数) :- write('名前と点数をカンマ区切りて入力して下さい : '), readln(L), 名前と点数の入力(L,_名前,_点数),!. 名前と点数の入力(_名前,_点数) :- 名前と点数の入力(_名前,_点数). 名前と点数の入力([_名前,_点数],_名前,_点数) :- !. 名前と点数の入力([_名前1,_名前2,_点数],_名前,_点数) :- concat_atom([_名前1,_名前2],' ',_名前). 名前と点数の入力(L,_,_) :- writef('入力データの解析結果は%tで名前,点数が得られません。再入力をお願いします。\n',[L]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/707 # # [1] 授業単元: C言語プログラミング # [2] 問題文(含コード&リンク): # 名前(char name[20])と点数(int score)からなる構造体の配列を作る. # 件数(10以下)をキーボード入力後、その件数だけ名前と点数をキーボード入力して配列に格納し, # 点数の平均点と、平均点以上の学生の名前を表示するプログラムを作成せよ. # なお,文字列aと整数bを同時にキーボード入力するには、scanf("%s %d",a,&b)とすればよい(文字列変数には&がいらない). # # 実行例 # $./kadai # n? 5 # name score? taro 52 # name score? jiro 84 # name score? saburo 38 # name score? hanako 63 # name score? youko 72 # Average:61 # Above average:jiro hanako youko # # ヒント # struct student { # char name[20]; # int score; # } student; # # scanf("%s %d",student.name, &student.score); # '件数(10以下)をキーボード入力後、その件数だけ名前と点数をキーボード入力して配列に格納し,点数の平均点と、平均点以上の学生の名前を表示する' :- '件数(10以下)をキーボード入力'(_件数), 'その件数だけ名前と点数をキーボード入力して配列に格納し'(_件数,_名前と点数構造ならび), '点数の平均点と、平均点以上の学生の名前を表示する'(_名前と点数構造ならび). '件数(10以下)をキーボード入力'(_件数) :- 催促付き整数入力('件数を入力して下さい(10以下) : ',_件数), _件数 =< 10,!. '件数(10以下)をキーボード入力'(_件数) :- '件数(10以下)をキーボード入力'(_件数). 'その件数だけ名前と点数をキーボード入力して配列に格納し'(0,[]) :- !. 'その件数だけ名前と点数をキーボード入力して配列に格納し'(N,[(名前(_名前),点数(_点数))|R]) :- 名前と点数の入力(_名前,_点数), N_1 is N - 1, 'その件数だけ名前と点数をキーボード入力して配列に格納し'(N_1,R). 名前と点数の入力(_名前,_点数) :- write('名前と点数をカンマ区切りて入力して下さい : '), readln(L), 名前と点数の入力(L,_名前,_点数),!. 名前と点数の入力(_名前,_点数) :- 名前と点数の入力(_名前,_点数). 名前と点数の入力([_名前,_点数],_名前,_点数) :- !. 名前と点数の入力([_名前1,_名前2,_点数],_名前,_点数) :- concat_atom([_名前1,_名前2],' ',_名前). 名前と点数の入力(L,_,_) :- writef('入力データの解析結果は%tで名前,点数が得られません。再入力をお願いします。\n',[L]), fail. '点数の平均点と、平均点以上の学生の名前を表示する'(_名前と点数構造ならび) :- 点数の平均点(_名前と点数構造ならび,_平均点), writef('平均点は %t です\n',[_平均点]), 平均点以上の学生の名前を表示する(_平均点,_名前と点数構造ならび), 平均点以上の学生の名前を表示する(_,[]). 平均点以上の学生の名前を表示する(_平均点,[(名前(_名前),点数(_点数))|R]) :- _点数 >= _平均点, writef('平均点%t以上の生徒: %t\n',[_平均点,_名前]), 平均点以上の学生を表示する(_平均点,R). 平均点以上の学生の名前を表示する(_平均点,[_|R]) :- 平均点以上の学生の名前を表示する(_平均点,R). 点数の平均点(_名前と点数構造ならび,_平均点) :- length(_名前と点数構造ならび,_標本数), 点数の合計(_名前と点数構造ならび,_合計), _平均点 is _合計 / _標本数. 点数の合計([],0). 点数の合計([(名前(_),点数(_点数))|R],_点数合計) :- 点数の合計(R,_点数合計_1), _点数合計 is _点数 + _点数合計_1. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/672 # # [1] 授業単元: C言語プログラミング(文字列生成・操作) # [2] 問題文(含コード&リンク): # 以下の実行例のように,姓と名を入力すると,2 つの # 間にスペースを入れて連結した文字列を生成するプロ # グラムを作成せよ.姓と名はそれぞれ配列family[] と # first[] に,連結した文字列は配列fullname[] に格納 # すること.入力できる姓と名の長さはそれぞれ30 字ま # でとする. # # 実行例. # Family name: Roku # First name: Dai # Roku Dai # # '姓と名を入力すると,2つの間にスペースを入れて連結した文字列を生成する' :- 姓と名を入力すると(_姓,_名), '2 つの間にスペースを入れて連結した文字列を生成する'(_姓,_名,_2つの間にスペースを入れて連結した文字列), 表示形式を指定して出力('%t\n',[_2つの間にスペースを入れて連結した文字列]). 姓と名を入力すると(_姓,_名) :- 姓の入力(_姓), 名の入力(_名). 姓の入力(_姓) :- 催促付き入力('姓を入力して下さい : ',_姓). 名の入力(_名) :- 催促付き入力('名を入力して下さい : ',_名). '2 つの間にスペースを入れて連結した文字列を生成する'(_姓,_名,_2つの間にスペースを入れて連結した文字列) :- 文字列連結([_姓,' ',_名],_2つの間にスペースを入れて連結した文字列). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 催促付き入力(_催促文,_入力文字列) :- write('_催促文'), get_line(_入力文字列). 表示形式を指定して出力(_表示形式,_出力値ならび) :- writef(_表示形式,_出力値ならび). 文字列連結(_連結する値ならび,_連結した文字列) :- concat_atom(_連結する値ならび,_連結した文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/624 # # [1] 授業単元:リスト構造体 # [2] 問題文(含コード&リンク): # enqueue()とdequeue()を用いて実行結果が # # Please input E(登録) or D(削除): E # Input number and name: 8 Nakamura # Please input E(登録) or D(削除): E # Input number and name: 3 Saito # Please input E(登録) or D(削除): D # Number=8 Name=Nakamura # Please input E(登録) or D(削除): D # Number=3 Name=Saito # Please input E(登録) or D(削除): D # No Data! # Please input E(登録) or D(削除): E # ・ # ・ # ・ # のように動作するプログラムを作成せよ # 'enqueue()とdequeue()を用いて実行' :- start_queue, 要求の取得(_要求), 'enqueue()とdequeue()を用いて実行'(_要求). 要求の取得(_要求) :- write('Please input E(登録) or D(削除): '), get_line(_要求),!. 'enqueue()とdequeue()を用いて実行'(q) :- !. 'enqueue()とdequeue()を用いて実行'('E') :- enqueue, fail. 'enqueue()とdequeue()を用いて実行'('D') :- dequeue, fail. 'enqueue()とdequeue()を用いて実行'(_) :- 要求の取得(_要求), 'enqueue()とdequeue()を用いて実行'(_要求). start_queue :- キューの生成(一時的). enqueue :- write('Input number and name: ' 'Input number and name'(_number,_name), キューに追加(一時的,[_number,_name]). 'Input number and name'(_number,_name) :- readln([_number,_name]). dequeue :- キューからの取り出し(一時的,_値), dequeue(_項), dequeue診断(_項,_診断), writef('%t\n',[_診断]). dequeue診断([],' No Data!') :- !. dequeue診断([_number,_name],_表示文字列) :- concat_atom(['nunmber = ',_number,' name = ',_name],_表示文字列). キューの生成(_キューの名前) :- キュー(_キューの名前,_), writef('%tというキューは既に存在します。登録できません。\n',[_キューの名前]),!. キューの生成(_キューの名前) :- asserta(キュー(_キューの名前,[])). キューからの取り出し(_キューの名前,_取り出した項) :- retract(キュー(_キューの名前,[_項|R])), asserta(キュー(_キューの名前,R)),!. キューからの取り出し(_キューの名前,[]). キューへの追加(_キュー名,_追加する項) :- retract(キュー(_キューの名前,_キュー)), append(_キュー,[_追加する項],_追加されたキュー), asserta(キュー(_キューの名前,_追加されたキュー)). キューを空にする(_キュー名) :- retract(キュー(_キューの名前,_)), asserta(キュー(_キューの名前,[])). % % キューは引数内の論理変数として重リストを使って定義し、 % それを更新しながら持ちまわるのが普通だが、 % ここでは愚直に、キューを述語としてassertし、reatract/assertを % 繰り返して値を出入りさせる述語群を定義してみた。 % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1309076891/523 # # 【 課題 】キーボードで生徒のデータを入力するプログラムを作成せよ # データは名前、ID、学年、電話番号からなり、学年の入力が負の場合メッセージを表示して中断する。 # 【 形態 】Javaアプリケーション(main()で開始 # 【 GUI  】制限なし # 【 期限 】2011年11月24日(木) # 【 Ver  】java version 1.6.0_22 # 【 補足 】作ってみたものの、上手く行きません。 # http://ime.nu/ideone.com/8gqKi # 何処がどう間違っているか指摘していただければ幸いです。 # # 'キーボードで生徒のデータを入力する。データは名前、ID、学年、電話番号からなり、学年の入力が負の場合メッセージを表示して中断する。' :- repeat, 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断), 生徒のデータを登録する(_名前,_ID,_学年,_電話番号,_診断),!. 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断) :- 指示に従い一行入力する('名前,ID,学年,電話番号 をカンマ区切りで入力して下さい(終了したい時は改行のみ) : ',Line), 入力診断(Line,_名前,_ID,_学年,_電話番号,_診断), \+(_診断 = 再入力),!. 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断) :- 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断). 指示に従い一行入力する(_指示,Line) :- writef('%t',[_指示]), get_line(Line),!. 入力診断('',_名前,_ID,_学年,_電話番号,終了) :- !. 入力診断(Line,_名前,_ID,_学年_1,_電話番号,入力完了) :- split(Line,[','],[_名前,_ID,_学年,_電話番号]), 学年の入力が負の場合メッセージを表示して中断する(_学年_1,_学年),!. 入力診断(Line,_名前,_ID,_学年,_電話番号,再入力) :- writef('入力された %t からは求める生徒データが得られません。再入力をお願いします。\n',[Line]). 学年の入力が負の場合メッセージを表示して中断する(_学年,_学年) :- _学年 >= 0,!. 学年の入力が負の場合メッセージを表示して中断する(_学年_1,_学年) :- _学年_1 < 0, writef('学年データ%tが負数です。再入力をしますか? y or n : ',[_学年_1]), get_line(y), 学年の再入力(_学年),!. 学年の再入力(_学年) :- write('学年を入力して下さい : '), get_line(Line), 学年再入力診断(Line,_学年),!. 学年再入力診断(Line,_学年) :- atom_to_term(Line,_学年,_), integer(_学年), _学年 >= 0,!. 生徒のデータを登録する(_名前,_ID,_学年,_電話番号,終了) :- !. 生徒のデータを登録する(_名前,_ID,_学年,_電話番号,入力完了) :- assertz(生徒のデータ(_名前,_ID,_学年,_電話番号)), fail. % % http://nojiriko.asia/prolog/j71_523.html とは僅かな違い。 % 何処が違うのか、捜すのさえ難しいくらいだが。 % どちらが好ましい表現かという問題。 % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1309076891/523 # # 【 課題 】キーボードで生徒のデータを入力するプログラムを作成せよ # データは名前、ID、学年、電話番号からなり、学年の入力が負の場合メッセージを表示して中断する。 # 【 形態 】Javaアプリケーション(main()で開始 # 【 GUI  】制限なし # 【 期限 】2011年11月24日(木) # 【 Ver  】java version 1.6.0_22 # 【 補足 】作ってみたものの、上手く行きません。 # http://ime.nu/ideone.com/8gqKi # 何処がどう間違っているか指摘していただければ幸いです。 # # 'キーボードで生徒のデータを入力する。データは名前、ID、学年、電話番号からなり、学年の入力が負の場合メッセージを表示して中断する。' :- 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断), 生徒のデータを登録する(_名前,_ID,_学年,_電話番号,_診断),!. 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断) :- 指示に従い一行入力する('名前,ID,学年,電話番号 をカンマ区切りで入力して下さい(終了したい時は改行のみ) : ',Line), 入力診断(Line,_名前,_ID,_学年,_電話番号,_診断), \+(_診断 = 再入力). 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断) :- 'キーボードで生徒のデータを入力する。'(_名前,_ID,_学年,_電話番号,_診断). 指示に従い一行入力する(_指示,Line) :- writef('%t',[_指示]), get_line(Line),!. 入力診断('',_,_,_,_,終了) :- !. 入力診断(Line,_名前,_ID,_学年_1,_電話番号,入力完了) :- split(Line,[','],[_名前,_ID,_学年,_電話番号]), 学年の入力が負の場合メッセージを表示して中断する(_学年_1,_学年),!. 入力診断(Line,_名前,_ID,_学年,_電話番号,再入力) :- writef('入力された %t からは求める生徒データが得られません。再入力をお願いします。\n',[Line]). 学年の入力が負の場合メッセージを表示して中断する(_学年,_学年) :- _学年 >= 0,!. 学年の入力が負の場合メッセージを表示して中断する(_学年_1,_学年) :- _学年_1 < 0, writef('学年データ%tが負数です。再入力をしますか? y or n : ',[_学年_1]), get_line('学年データ%tが負数です。再入力をしますか? y or n : ',y), 学年の再入力(_学年),!. 学年の再入力(_学年) :- write('学年を入力して下さい : '), get_line(Line), 学年再入力診断(Line,_学年),!. 学年再入力診断(Line,_学年) :- atom_to_term(Line,_学年,_), integer(_学年), _学年 >= 0,!. 生徒のデータを登録する(_名前,_ID,_学年,_電話番号,終了) :- !. 生徒のデータを登録する(_名前,_ID,_学年,_電話番号,入力完了) :- assertz(生徒のデータ(_名前,_ID,_学年,_電話番号)), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/399 # # [1] 授業単元:C言語入門 # [2] 問題文(含コード&リンク):http://ime.nu/i.imgur.com/UwzPZ.jpg # # # 下の例のような、学生の4科目の(数学、物理、科学、英語)の試験点数(100点満点)を # 書いたファイルがある。(学生数は100名以下) # # ファイルを読んで、右のように、学生の科目の一覧と、各学生の平均点、 # 各科目の平均点を表示するプログラムを作成する。 # # ・ 科目名(6文字未満)を入れる文字列(文字の一次元配列)を4つ用意する。 # # ・ 学籍番号と点数を一緒に入れる二次元整数配列を用意する # 例 int tensu[ ? ][ ? ] # # 最初に二次元配列を表示して、実行例のように点数を表示し、次に各学生の # 平均点、各科目の平均点を表示する。 # # ただし、ファイルの先頭には学生数(この例では5名)があり、つぎに4科目の # 科目名(数学、物理、科学、英語)が記述され、続いて、1行目に指定した学生数分 # の学籍番号と各試験点数が書かれている。 # # # ファイルの例(5名の例) # # 5 # Math Phys Chem Eng # 8001 78 64 88 90 # 8004 34 40 52 67 # 8013 83 77 89 93 # 8035 98 81 69 77 # 8062 56 63 47 23 # # 表示例 # # 点数 :::: # 8001 78 64 88 90 # 8004 34 40 52 67 # 8013 83 77 89 93 # 8035 98 81 69 77 # 8062 56 63 47 23 # # 学生平均 :::: # 8001 : 80.0 # 8004 : 48.25 # 8013 : 85.50 # 8035 : 81.25 # 8062 : 47.25 # # 科目平均 # 数学 : 69.8 # 物理 : 65.0 # 科学 : 69.0 # 英語 : 70.0 # 'ファイルを読んで、右のように、学生の科目の一覧と、各学生の平均点、書く科目の平均点を表示する'(_ファイル名) :- 'ファイルを読んで'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび), '学生の科目の一覧と、各学生の平均点、書く科目の平均点を表示する'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび). 'ファイルを読んで'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび) :- get_lines(_ファイル名,Lines), 'ファイルの先頭には学生数(この例では5名)があり'(Lines,_学生数), 'つぎに4科目の科目名(数学、物理、科学、英語)が記述され'(Lines,_科目名ならび), '続いて、1行目に指定した学生数分の学籍番号と各試験点数が書かれている'(Lines,_学生数,_学籍番号と各試験点数ならび),!. 'ファイルの先頭には学生数(この例では5名)があり'(Lines,_学生数) :- Lines = [_学生数文字列|_], atom_to_term(_学生数文字列,_学生数,_), integer(_学生数),!. 'つぎに4科目の科目名(数学、物理、科学、英語)が記述され'(Lines,_科目名ならび) :- Lines = [_,_二行目文字列|_], split(_二行目文字列,[' ',','],_科目名ならび),!. '続いて、1行目に指定した学生数分の学籍番号と各試験点数が書かれている'(Lines,_学生数,_学籍番号と各試験点数ならび) :- length(_学籍番号と各試験点数ならび,_学生数), Lines = [_,_|_残りLines], findall(_学籍番号と各点数,( append(_,[_学籍番号と各点数文字列|_],_残りLines), aplit(_学籍番号と各点数文字列,[' ',','],_学籍番号と各点数)), _学籍番号と各試験点数ならび). '学生の科目の一覧と、各学生の平均点、書く科目の平均点を表示する'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび) :- 学生の科目の一覧を表示(_学籍番号と各試験点数ならび), '各学生の平均点、各科目の平均点を表示する'(_科目名ならび,_学籍番号と各試験点数ならび). 学生の科目の一覧を表示(_学籍番号と各試験点数ならび) :- append(_,[_学籍番号と各試験点数|R],_学籍番号と各試験点数ならび), concat_atom(_学籍番号と各試験点数,' ',_表示文字列), writef('%t\n',[_表示文字列]), R = []. '各学生の平均点、各科目の平均点を表示する'(_科目名ならび,_学籍番号と各試験点数ならび) :- 各学生の平均点(_学籍番号と各試験点数ならび,_各学生の平均点ならび), 各科目の平均点(_科目名ならび,_学籍番号と各試験点数ならび,_各科目の平均点ならび), 各学生の平均点を表示する(_各学生の平均点ならび), 各科目の平均点を表示する(_各科目の平均点ならび). 各学生の平均点(_学籍番号と各試験点数ならび,_各学生の平均点ならび) :- findall([_学籍番号,_平均点],( append(_,[[_学籍番号|L]|_],_学籍番号と各試験点数ならび), 相加平均(L,_平均点)), _各学生の平均点ならび). 各科目の平均点(_科目名ならび,_学籍番号と各試験点数ならび,_各科目の平均点ならび) :- 転置(_学籍番号と各試験点数ならび,[_|_科目別点数ならび]), findall([_科目名,_平均点],( 科目名と点数ならびを得る(_科目名ならび,_学籍番号と各試験点数ならび,_科目名,_点数ならび), 相加平均(_点数ならび,_平均点)), _各科目の平均点ならび). 科目名と点数ならびを得る(_科目名ならび,_学籍番号と各試験点数ならび,_科目名,_点数ならび) :- append(L0,[_科目名|_],_科目名ならび), length(L0,Len), nth1(Len,_科目別点数ならび,_点数ならび). 各学生の平均点を表示する(_各学生の平均点ならび) :- write('\n学生平均 ::::\n'), append(_,[[_学籍番号,_平均点]|R],_各学生の平均点ならび), writef('%8r : %5r\n',[_学籍番号,_平均点]), R = []. 各科目の平均点を表示する(_各科目の平均点ならび) :- write('\n科目平均 ::::\n'), append(_,[[_科目名,_平均点]|R],_各科目の平均点ならび), writef('8r : %5r\n',[_科目名,_平均点]), R = []. % % http://nojiriko.asia/prolog/c153_399.html の % 各学生の平均点以下の述語定義と比較して、 % どちらが、理解しやすいかを問う。 % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/399 # # [1] 授業単元:C言語入門 # [2] 問題文(含コード&リンク):http://ime.nu/i.imgur.com/UwzPZ.jpg # # # 下の例のような、学生の4科目の(数学、物理、科学、英語)の試験点数(100点満点)を # 書いたファイルがある。(学生数は100名以下) # # ファイルを読んで、右のように、学生の科目の一覧と、各学生の平均点、 # 各科目の平均点を表示するプログラムを作成する。 # # ・ 科目名(6文字未満)を入れる文字列(文字の一次元配列)を4つ用意する。 # # ・ 学籍番号と点数を一緒に入れる二次元整数配列を用意する # 例 int tensu[ ? ][ ? ] # # 最初に二次元配列を表示して、実行例のように点数を表示し、次に各学生の # 平均点、各科目の平均点を表示する。 # # ただし、ファイルの先頭には学生数(この例では5名)があり、つぎに4科目の # 科目名(数学、物理、科学、英語)が記述され、続いて、1行目に指定した学生数分 # の学籍番号と各試験点数が書かれている。 # # # ファイルの例(5名の例) # # 5 # Math Phys Chem Eng # 8001 78 64 88 90 # 8004 34 40 52 67 # 8013 83 77 89 93 # 8035 98 81 69 77 # 8062 56 63 47 23 # # 表示例 # # 点数 :::: # 8001 78 64 88 90 # 8004 34 40 52 67 # 8013 83 77 89 93 # 8035 98 81 69 77 # 8062 56 63 47 23 # # 学生平均 :::: # 8001 : 80.0 # 8004 : 48.25 # 8013 : 85.50 # 8035 : 81.25 # 8062 : 47.25 # # 科目平均 # 数学 : 69.8 # 物理 : 65.0 # 科学 : 69.0 # 英語 : 70.0 # 'ファイルを読んで、右のように、学生の科目の一覧と、各学生の平均点、書く科目の平均点を表示する'(_ファイル名) :- 'ファイルを読んで'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび), '学生の科目の一覧と、各学生の平均点、書く科目の平均点を表示する'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび). 'ファイルを読んで'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび) :- get_lines(_ファイル名,Lines), 'ファイルの先頭には学生数(この例では5名)があり'(Lines,_学生数), 'つぎに4科目の科目名(数学、物理、科学、英語)が記述され'(Lines,_科目名ならび), '続いて、1行目に指定した学生数分の学籍番号と各試験点数が書かれている'(Lines,_学生数,_学籍番号と各試験点数ならび),!. 'ファイルの先頭には学生数(この例では5名)があり'(Lines,_学生数) :- Lines = [_学生数文字列|_], atom_to_term(_学生数文字列,_学生数,_), integer(_学生数),!. 'つぎに4科目の科目名(数学、物理、科学、英語)が記述され'(Lines,_科目名ならび) :- Lines = [_,_二行目文字列|_], split(_二行目文字列,[' ',','],_科目名ならび),!. '続いて、1行目に指定した学生数分の学籍番号と各試験点数が書かれている'(Lines,_学生数,_学籍番号と各試験点数ならび) :- length(_学籍番号と各試験点数ならび,_学生数), Lines = [_,_|_残りLines], findall(_学籍番号と各点数,( append(_,[_学籍番号と各点数文字列|_],_残りLines), aplit(_学籍番号と各点数文字列,[' ',','],_学籍番号と各点数)), _学籍番号と各試験点数ならび). '学生の科目の一覧と、各学生の平均点、書く科目の平均点を表示する'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび) :- write('\n'), 学生の科目の一覧を表示(_学籍番号と各試験点数ならび), '各学生の平均点、各科目の平均点を表示する'(_科目名ならび,_学籍番号と各試験点数ならび). 学生の科目の一覧を表示(_学籍番号と各試験点数ならび) :- append(_,[_学籍番号と各試験点数|R],_学籍番号と各試験点数ならび), concat_atom(_学籍番号と各試験点数,' ',_表示文字列), writef('%t\n',[_表示文字列]), R = []. '各学生の平均点、各科目の平均点を表示する'(_科目名ならび,_学籍番号と各試験点数ならび) :- 各学生の平均点(_学籍番号と各試験点数ならび,_各学生の平均点ならび), 各科目の平均点(_科目名ならび,_学籍番号と各試験点数ならび,_各科目の平均点), write('\n学生平均 ::::\n'), 各学生の平均点を表示する(_各学生の平均点ならび), write('\n科目平均 ::::\n'), 各科目の平均点を表示する(_各科目の平均点). 各学生の平均点([],[]). 各学生の平均点([[_学籍番号|L]|R1],[[_学籍番号,_平均点]|R2]) :- 相加平均(L,_平均点), 各学生の平均点(R1,R2). 各科目の平均点(_科目名ならび,_学籍番号と各試験点数ならび,_各科目の平均点) :- 転置(_学籍番号と各試験点数ならび,[_|_科目別点数ならび]), 転置された点数ならびから科目別平均点を得る(_科目名ならび,_科目別点数ならび,_各科目の平均点). 転置された点数ならびから科目別平均点を得る([],[],[]). 転置された点数ならびから科目別平均点を得る([_科目名|R1],[L|R2],[[_科目名,_平均点]|R3]) :- 相加平均(L,_平均点), 転置された点数ならびから科目別平均点を得る(R1,R2,R3). 各学生の平均点を表示する([]). 各学生の平均点を表示する([[_学籍番号,_平均点]|R]) :- writef('%8r : %5r\n',[_学籍番号,_平均点]), 各学生の平均点を表示する(R). 各科目の平均点を表示する([]). 各科目の平均点を表示する([[_科目名,_平均点]|R]) :- writef('8r : %5r\n',[_科目名,_平均点]), 各科目の平均点を表示する(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/383 # # # [1] 授業単元:プログラミング演習 # # [2] 問題文(含コード&リンク): # # # http://ime.nu/codepad.org/bMCs37CD # # # 1): # n個の実数からなるファイルを読み込み、それらの最大値、最小値、および平均値をディスプレイに出力するプログラムを作成し、動作を確認せよ。 # ただし、整数nと入力ファイル名はコマンドライン引数とすること。 # また、プログラム内ではn個の実数は配列x[]に読み込むこと、すなわち、 # double *x; # int n; # n=atoi(argv[1]); # x=(double *)malloc(sizeof(double)*n); # # 2): # #include # int main(){ # int x=100; # int y=500; # int *ptr=&x; # # printf("*ptr=%d\n",*ptr); # *ptr=400; # printf("x=%d\n",x); # printf("y=%d\n",y); # # return 0; # } # を関数化せよ。 # すなわち、実数からなる配列x[]とその要素数nが与えられたとき、それらnこの実数の最大値、採草地、および平均値を求める関数。 # void max_min_mean(double x[],int n,double *a,double *b,,double *c) # を作成し、動作を確認せよ。 # # 3): # 西暦で表された、年、月、日、の3つの値が与えられていたとして、その年内で経過日数を求めるプログラムを作成する。 # ?ヶ月ごとの日数を配列に格納するが、うるう年があるため、?行?列の多次元配列を用いることとする。 # # int mdays[][12]={{日数を入れる},{うるう年の日数を入れる}}; # # 結果は標準入出力とする。 # # # 4): # 身体検査データを構造体配列として格納し、身長の平均値と視力の分布を求めるプログラムを作成する。身長検査データは標準入力からでもプログラムに記述でもどちらでもいい。 # # 結果 平均身長 〇〇cm #    視力の分布 0.0〜:○人 #          0.1〜:○人(以下略 # # struct{ # # } 'n個の実数からなるファイルを読み込み、それらの最大値、最小値、および平均値をディスプレイに出力する'(_n個,_残り実数ならび) :- 'n個の実数からなるファイルを読み込み'(_実数ならび,_残り実数ならび), 'それらの最大値、最小値、および平均値をディスプレイに出力する'(_実数ならび). 'n個の実数からなるファイルを読み込み'(_n個,_ファイル,_実数ならび), get_lines(_ファイル,Lines), 'n個の実数ならびを生成'(_n個,Lines,_実数ならび,_残り実数ならび). 'n個の実数ならびを生成'(_n個,Lines,_実数ならび,_残り実数ならび) :- length(_実数ならび,_n個), findall(_実数,( append(L0,[_実数|_],Lines), float(_実数)), _実数ならびの一), append(_実数ならび,_残り実数ならび,_実数ならびの一),!. 'それらの最大値、最小値、および平均値をディスプレイに出力する'(_実数ならび) :- 最大値(_実数ならび,_最大値), 最小値(_実数ならび,_最小値), 平均値(_実数ならび,_平均値), writef('最大値 = %t,最小値 = %t,平均値 = %t\n',[_最大値,_最小値,_平均値]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 最大値([A|L],_最大値) :- !. 最大値(L,A,_最大値), 最大値([],_最大値,_最大値) :- !. 最大値([A|R],_最大値_1,_最大値) :- A @> _最大値_1, 最大値(R,A,_最大値). 最大値([A|R],_最大値_1,_最大値) :- 最大値(R,_最大値_1,_最大値). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 最大値([_最大値],_最大値) :- !. 最大値([A1,A2],_最大値) :- 大きい方が最大値(A1,A2,_最大値),!. 最大値(_実数ならび,_最大値) :- append(L1,L2,_実数ならび), length(L1,N), length(L2,N), 最大値(L1,Max1), 最大値(L2,Max2), 大きい方が最大値(Max1,Max2,_最大値),!. 最大値([A|_実数ならび],_最大値) :- 最大値(_実数ならび,Max1), 大きい方が最大値(A,Max1,_最大値). 大きい方が最大値(Max1,Max2,Max1) :- Max1 @>= Max2,!. 大きい方が最大値(Max1,Max2,Max2) :- Max1 @< Max2. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 最小値([A|L],_最小値) :- !. 最小値(L,A,_最小値), 最小値([],_最小値,_最小値) :- !. 最小値([A|R],_最小値_1,_最小値) :- A @< _最小値_1, 最小値(R,A,_最小値). 最小値([A|R],_最小値_1,_最小値) :- 最小値(R,_最小値_1,_最小値). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 最小値([_最小値],_最小値) :- !. 最小値([A1,A2],_最小値) :- 小きい方が最小値(A1,A2,_最小値),!. 最小値(_実数ならび,_最小値) :- append(L1,L2,_実数ならび), length(L1,N), length(L2,N), 最小値(L1,Max1), 最小値(L2,Max2), 小きい方が最小値(Max1,Max2,_最小値),!. 最小値([A|_実数ならび],_最小値) :- 最小値(_実数ならび,Max1), 小きい方が最小値(A,Max1,_最小値). 小きい方が最小値(Max1,Max2,Max1) :- Max1 @< Max2,!. 小きい方が最小値(Max1,Max2,Max2) :- Max1 @> Max2. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 平均値(L,_平均値) :- sum(L,_合計), length(L,_要素数), _平均値 is _合計 / _要素数. sum([],0). sum([A|R],S) :- sum(R,S1), S is A + S1. % 以下のサイトは # # 犬の誕生日が記録してあるデータが入ったテーブルがあります。 # 兄弟犬を抽出したいという要望です。 # # 兄弟の定義は「母が同一かつ同時に出産した個体(同胎)」だとします。 # 母親は各データが持っていますが、同時出産でも誕生日が日付をまたぐことがあります。 # 2日にまたがる難産の場合もあると思われます。 # ただし、出産は数ヶ月に一度です。 # '兄弟犬を抽出したい'(_犬,_兄弟犬) :- 母犬が共通(_犬,_兄弟犬), '誕生日が2日以内'(_犬,_兄弟犬). 母犬が共通(_犬,_兄弟犬) :- 母犬(_犬,_母犬), 母犬(_兄弟犬,_母犬). '誕生日が2日以内'(_犬,_兄弟犬) :- 誕生日が(_犬,_兄弟犬,_犬の誕生日,_兄弟犬の誕生日), '2日以内'(_犬の誕生日,_兄弟犬の誕生日). 誕生日が(_犬,_兄弟犬,_犬の誕生日,_兄弟犬の誕生日) :- 誕生日(_犬,_犬の誕生日), 誕生日(_兄弟犬,_兄弟犬の誕生日). '2日以内'(_犬の誕生日,_兄弟犬の誕生日) :- 前日(_犬の誕生日,_犬の誕生日の前日), 翌日(_犬の誕生日,_犬の誕生日の翌日), member(_兄弟犬の誕生日,[_犬の誕生日,_犬の誕生日の前日,_犬の誕生日の翌日]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/260 # # [1] 授業単元: C言語プログラミング # [2] 問題文(含コード&リンク): # sinのグラフを次のように描くプログラムを作成せよ # ただしsin90°とsin270°に対するアスタリスクの数は20個とする。 # http://ime.nu/beebee2see.appspot.com/i/azuYk7KSBQw.jpg # 'sinのグラフを次のように描くただしsin90°とsin270°に対するアスタリスクの数は20個とする' :- length(_キャンパス,25), 'キャンパスにsinカーブを描画する'(_キャンパス), キャンパスを表示する(_キャンパス). 'キャンパスを構成しながらsinカーブを描画する'(_キャンパス) :- findall(_キャンパス,( append(L0,[L|_],_キャンパス), length(L,40), キャンパスに描画(L0,L)), _キャンパス). キャンパスに描画(Ln,L) :- 刻みを得る(_刻み), length(Ln,N), _星の位置 is truncate(20 * sin(_刻み * N)) + 20, 星の位置描画(N,_星の位置,L). 刻みを得る(_刻み) :- _刻み is 2 * pi / 24. 星の位置描画(N,10,L) :- 変数を全て置換する(N,L,L),!. 星の位置描画(N,_星の位置,L) :- N > 10, for(11,M,N), 星を描画(M,L), M = N, 変数を全て置換する(N,L,L),!. 星の位置描画(N,_星の位置,L) :- N < 10, for(9,M,N), 星を描画(M,L), M = N, 変数を全て置換する(N,L,L),!. 星を描画(M,L) :- length([_|Ln],M), append(L2,[*|R],L),!. 変数を全て置換する(_,[],[]) :- !. 変数を全て置換する(N,[V|R1],[' '|R2]) :- var(V), 変数を全て空白に置換する(N,R1,R2),!. 変数を全て空白に置換する(N,[A|R1],[A|R2]) :- 変数を全て空白に置換する(N,R1,R2). キャンパスを表示する([]). キャンパス表示する([L|R]) :- 左端の十文字分は空白, 一行表示する(L), キャンパスを表示する(R). 左端の十文字分は空白 :- write(' '). 一行表示する([]) :- !. 一行表示する([A|R]) :- write(A), 一行表示する(R). % % C153_216.html の類型 % % 述語 星の位置描画/3 のあたりが微妙に違う。 % X軸、Y軸を描かなくてよいことからも差異を生じる。 % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/134 # # [2] 問題文(含コード&リンク): # 1:キーボードから自然数 m と n を読み込む. 2:0 以上 1 未満の一様乱数 n 個の平均値を計算して、実行例ように表示. 3:この 2:の操作を m 回繰り返す. # 実行例 # > ./ex06-3 # 繰り返し回数を入力: 10 # 乱数の個数を入力: 100 # 回 平均 # 1 0.509034 # 2 0.488603 # 3 0.485044 # 4 0.473806 # 5 0.503660 # 6 0.519470 # 7 0.477955 # 8 0.536236 # 9 0.516652 # 10 0.467380 # > # この動作をするプログラムを作成せよ。乱数は疑似乱数発生関数 drand48 を用いる.この関数は呼び出すたびにdrand48() を 3 回呼び出すと,drand48() の生成した三つの乱数がそれぞれ変数 x, y, z に格納される. # double x, y, z; x = drand48(); y = drand48(); z = drand48(); # この関数を用いるプログラムは,冒頭に #include <stdlib.h> と記述 # '1:キーボードから自然数 m と n を読み込む. 2:0 以上 1 未満の一様乱数 n 個の平均値を計算して、実行例ように表示. 3:この 2:の操作を m 回繰り返す.' :- '1:キーボードから自然数 m と n を読み込む'(_m,_n), '2:0 以上 1 未満の一様乱数 n 個の平均値を計算して、実行例ように表示'(1,_実行回数,_m,_n), '3:この 2:の操作を m 回繰り返す.' (_実行回数,_m). '1:キーボードから自然数 m と n を読み込む'(_m,_n) :- 'キーボードから自然数 m を読み込む'(_m), 'キーボードから自然数 n を読み込む'(_n). 'キーボードから自然数 m を読み込む'(_m) :- 自然数を読み込む(_m). 'キーボードから自然数 n を読み込む'(_n) :- 自然数を読み込む(_n). 自然数を読み込む(_自然数) :- get_line(Line), 自然数を読み込む(Line,_自然数),!. 自然数を読み込む(_自然数) :- 自然数を読み込む(_自然数). 自然数を読み込む(Line,_自然数) :- atom_to_term(Line,_自然数,_), integer(_自然数), _自然数 >= 0,!. 自然数を読み込む(Line,_自然数) :- writef('入力された %t からは自然数が得られません。再入力をお願いします。\n'), fail. '2:0 以上 1 未満の一様乱数 n 個の平均値を計算して、実行例ように表示'(_実行回数,_実行回数,_n) :- '0 以上 1 未満の一様乱数 n 個の平均値を計算して'(_n,_平均値), '実行例ように表示'(_実行回数,_平均値). '2:0 以上 1 未満の一様乱数 n 個の平均値を計算して、実行例ように表示'(_実行回数_1,_実行回数,_n) :- _実行回数_2 is _実行回数_1 + 1, '2:0 以上 1 未満の一様乱数 n 個の平均値を計算して、実行例ように表示'(_実行回数_2,_実行回数,_n). '0 以上 1 未満の一様乱数 n 個の平均値を計算して'(_n,_平均値) :- findavg(_一様乱数,( for(1,_,_n), '0 以上 1 未満の一様乱数'(_一様乱数)), _平均値). '0 以上 1 未満の一様乱数'(_一様乱数) :- _一様乱数 is random(1000000) / 1000000. '実行例ように表示'(_実行回数,_平均値) :- writef('%3l%8l\n',[_実行回数,_平均値]). '3:この 2:の操作を m 回繰り返す.' (_m,_m). % % 目下の課題は以下の実行例をどのように述語定義の中に取り込むかだ % /* 実行例 :- # 1 0.509034 # 2 0.488603 # 3 0.485044 # 4 0.473806 # 5 0.503660 # 6 0.519470 # 7 0.477955 # 8 0.536236 # 9 0.516652 # 10 0.467380 */ % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1309076891/12 # # 【 課題 】疑似乱数を生成する java.util.Random クラスを使って、 # 占いを行う Fortune クラスを作りなさい。fortune メソッドを作成し、 # そのメソッドに String クラスの # インスタンスを渡せば名前占いを、 # また整数 (int) を渡せば誕生日占いを # するようにしなさい。 # 名前占いと誕生日占いのアルゴリズムは # 適当に決めなさい。 # 占い結果は「絶好調!」「まあまあ」 # 「絶不調orz」とし、 # それぞれ30%、40%、40%の確率で # 出るようにしなさい。 # # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI  】制限なし # 【 期限 】6/29 0:00まで # 【 Ver  】java.version 1.6.0_25 # # 画像が消されてしまったようなので # 再書き込みさせてもらいました。 # 本日中にお願いします。 # # '擬似乱数を生成して、占いを行う'(_文字列または整数) :- '文字列を渡せば名前占いを、また整数 (int) を渡せば誕生日占いをする'(_文字列または整数,_占いの結果), writef('占いの結果は %t です。\n',[_占いの結果]). '文字列を渡せば名前占いを、また整数 (int) を渡せば誕生日占いをする'(_文字列,占いの結果) :- atom(_文字列), 名前占い(_文字列,_占いの結果). '文字列を渡せば名前占いを、また整数 (int) を渡せば誕生日占いをする'(_整数._占いの結果) :- integer(_整数), 誕生日占い(_整数,_占いの結果). 名前占い(_文字列,_占いの結果) :- atom_codes(_文字列,Codes), sum(Codes,Sum), N is Sum mod 12 + 1, '占い結果は「絶好調!」「まあまあ」「絶不調orz」とし、それぞれ30%、40%、40%の確率で出る'(N,_占い結果). 誕生日占い(_整数,_占いの結果) :- 整数から星座を得る(_整数,_星座), nth1(_何番目,[牡牛座,双子座,蟹座,獅子座,乙女座,天秤座,蠍座,射手座,山羊座,山羊座,水瓶座,魚座],_星座), '占い結果は「絶好調!」「まあまあ」「絶不調orz」とし、それぞれ30%、40%、40%の確率で出る'(_何番目,_占い結果). '占い結果は「絶好調!」「まあまあ」「絶不調orz」とし、それぞれ30%、40%、40%の確率で出る'(N,_占い結果) :- 擬似乱数を生成する(_擬似乱数), _判定数 is ((_擬似乱数 * N) mod 110) + 1, '占い結果は「絶好調!」「まあまあ」「絶不調orz」とし、それぞれ30%、40%、40%の確率で出る'(_判定数,_占い結果). '占い結果は「絶好調!」「まあまあ」「絶不調orz」とし、それぞれ30%、40%、40%の確率で出る'(_判定数,'絶好調!') :- _判定数 >= 1, _判定数 =< 30. '占い結果は「絶好調!」「まあまあ」「絶不調orz」とし、それぞれ30%、40%、40%の確率で出る'(_判定数,まあまあ) :- _判定数 >= 31, _判定数 =< 70. '占い結果は「絶好調!」「まあまあ」「絶不調orz」とし、それぞれ30%、40%、40%の確率で出る'(_判定数,'絶不調orz') :- _判定数 >= 71, _判定数 =< 110. 名前占い(_文字列,_占いの結果) :- atom_codes(_文字列,Codes), sum(Codes,Sum), N is Sum mod 12 + 1, '占い結果は「絶好調!」「まあまあ」「絶不調orz」とし、それぞれ30%、40%、40%の確率で出る'(N,_占い結果). 誕生日占い(_整数,_占いの結果) :- 整数から星座を得る(_整数,_星座), nth1(_何番目,[牡牛座,双子座,蟹座,獅子座,乙女座,天秤座,蠍座,射手座,山羊座,山羊座,水瓶座,魚座],_星座), '占い結果は「絶好調!」「まあまあ」「絶不調orz」とし、それぞれ30%、40%、40%の確率で出る'(_何番目,_占い結果). 擬似乱数を生成する(_擬似乱数) :- _擬似乱数 is random(3521). 整数から星座を得る(_整数,_星座) :- _月 is _整数 // 100, _日 is _整数 mod 100, 星座判定(_月,_日,_星座). 星座判定(_月,_日,_星座) :- 星座(_星座,_月下限/_日下限-_月上限/_日上限), _月 = _月下限, _月 = _月上限, _日 >= _日下限, _日 =< _日上限,!. 星座判定(_月,_日,_星座) :- 星座(_星座,_月下限/_日下限-_月上限/_日上限), _月 = _月下限, _日 >= _日下限,!. 星座判定(_月,_日,_星座) :- 星座(_星座,_月下限/_日下限-_月上限/_日上限), _月 = _月上限, _日 =< _日上限,!. 星座(牡牛座,4/21-5/21). 星座(双子座,5/22-6/21). 星座(蟹座,6/22-7/22). 星座(獅子座,7/23-8/22). 星座(乙女座,8/23-9/23). 星座(天秤座,9/24-10/23). 星座(蠍座,10/24-11/22). 星座(射手座,11/23-12/21). 星座(山羊座,12/22-12/31). 星座(山羊座,1/1-1/20). 星座(水瓶座,1/21-2/18). 星座(魚座,2/19-3/20). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/980 # # [1] 授業単元:基礎C # [2] 問題文(含コード&リンク):以下の実行例のように,姓と名を入力すると,2 つの # 間にスペースを入れて連結した文字列を生成するプロ # グラムを作成せよ.姓と名はそれぞれ配列family[] と # first[] に,連結した文字列は配列fullname[] に格納 # すること.入力できる姓と名の長さはそれぞれ30 字ま # でとする。 # 例. Family name: Kouka # First name: Dai # Kouka Dai # '姓と名を入力すると,2つの間にスペースを入れて連結した文字列を生成する' :- 姓の入力(_姓), 名の入力(_名), '姓と名を入力すると,2つの間にスペースを入れて連結した文字列を生成する'(_姓,_名,_連結した文字列), writef('間にスペース入れて連結した文字列は「%t」\n',[_連結した文字列]). '姓と名を入力すると,2つの間にスペースを入れて連結した文字列を生成する'(_姓,_名,_間にスペースを入れて連結した文字列) :- concat_atom([_姓,_名],' ',_間にスペースを入れて連結した文字列). 姓の入力(_姓) :- write('姓名の姓を入力して下さい : '), get_line(_姓), 姓の入力診断(_姓),!. 姓の入力(_姓) :- 姓の入力(_姓). 姓の入力診断(_姓) :- atom(_姓), sub_atom(_姓,0,Len,0,_姓), Len =< 30,!. 姓の入力診断(_姓) :- writef('入力された %t は姓名の姓として適切でありません。再入力をお願いします。\n',[_姓]), fail. 名の入力(_名) :- write('姓名の名を入力して下さい : '), get_char(_名), 名の入力診断(_名),!. 名の入力(_名) :- 名の入力(_名). 名の入力診断(_名) :- atom(_名), sub_atom(_名,0,Len,0,_名), Len =< 30,!. 名の入力診断(_名) :- writef('入力された %t は姓名の名として適切でありません。再入力をお願いします。\n',[_名]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/911 # # # [1] 授業単元:基礎C言語 # [2] 問題文(含コード&リンク):二つの3×3行列A.Bを入力して、その積と、それぞれの逆行列を出力するプログラムを作れ。 # '二つの3×3行列A.Bを入力して、その積と、それぞれの逆行列を出力する' :- '二つの3×3行列A.Bを入力して'(_A,_B), 'その積と'(_A,_B,_Aと_Bの積), 'それぞれの逆行列を出力する'(_A,_B,_Aの逆行列,_Bの逆行列). '二つの3×3行列A.Bを入力して'(_A,_B) :- '二つの3×3行列A.B'(_A,_B) , '入力して'(_A,_B). '二つの3×3行列A.B'(_A,_B) :- length(_A,3), length(_B,3), findall(L1,( append(_,[L1|_],_A)), _A), findall(L2,( append(_,[L2|_],_B)), _B). '入力して'(_A,_B) :- '_Aを入力する'(_A), '_Bを入力する'(_B). '_Aを入力する'(_A) :- findall([_値1,_値2,_値3],( append(_,[_|_],_A), write('行データ(3項)をカンマ区切りで入力してください : '), readln([_値1,_値2,_値3])), _A). '_Bを入力する'(_B) :- findall([_値1,_値2,_値3],( append(_,[_|_],_B), write('行データ(3項)をカンマ区切りで入力してください : '), readln([_値1,_値2,_値3])), _B). '二つの3×3行列A.Bの積'(_A,_B,_評価された行列の積) :- _A = [[_a11,_a12,_a13], [_a21,_a22,_a23], [_a31,_a32,_a33]], _B = [[_b11,_b12,_b13], [_b21,_b22,_b23], [_b31,_b32,_b33]], _C = [[_a11*_b11+_a12*_b21+_a13*_b31,_a11*_b12+_a12*_b22+_a13*_b32,_a11*_b13+_a12*_b23+_a13*_b33], [_a21*_b11+_a22*_b21+_a23*_b31,_a21*_b12+_a22*_b22+_a23*_b32,_a21*_b13+_a22*_b23+_a23*_b33], [_a31*_b11+_a32*_b21+_a33*_b31,_a31*_b12+_a32*_b22+_a33*_b32,_a31*_b13+_a32*_b23+_a33*_b33]], 行列要素を評価する(_C,_評価された行列の積). 行列要素を評価する(LL1,LL2) :- findall(L2,( append(_,[L1|_],LL1), 行の評価(L1,L2)), LL2). 行の評価(L1,L2) :- findall(_評価値,( append(_,[_式|_],L1), _評価値 is _式), L2). % % この課題のポイントは'二つの3×3行列A.Bの積'(_A,_B,_評価された行列の積) という述語。 % Prologプログラムが高校生の参考書の役割を担うとすればどのような様式になるかを % 考えてみた。 % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/858 # # # 5人の学生の成績(100点満点)の値をキーボードから読み込み,それらの平均点と分散(標準偏差の二乗)を求めるプログラムを作れ。 # # # 授業の課題です # 解説付きでお願いします。 # # '5人の学生の成績(100点満点)の値をキーボードから読み込み,それらの平均点と分散(標準偏差の二乗)を求める' :- '5人の学生の成績(100点満点)の値をキーボードから読み込み'(_5人の学生の成績ならび), 'それらの平均点と分散(標準偏差の二乗)を求める'(_5人の学生の成績ならび,_平均点,_分散), append(_5人の学生の成績ならび,[_平均点,_分散],_表示情報), writef('%t,%t,%t,%t,%t の 平均点は %t, 分散は %t です。\n,_表示情報). '5人の学生の成績(100点満点)の値をキーボードから読み込み'(_5人の学生の成績ならび) :- length(_5人の学生の成績ならび,5), findall(_成績,( append(L0,[_成績|_],_5人の学生の成績ならび), length([_|L0],_何個目), write('成績(0-100点)の[%t個目]を入力してください : ',[_何個目]), 成績入力(_成績)), _5人の学生の成績ならび). 成績入力(_成績) :- get_line(Line), 成績入力診断(Line,_成績),!. 成績入力(_成績) :- 成績入力(_成績). 成績入力診断(Line,_成績) :- atom_to_term(Line,_成績,_), integer(_成績), _成績 >= 0, _成績 =< 100,!. 成績入力診断(Line,_成績) :- writef('入力された %t からは成績(0-100点)が得られませんでした。再入力をお願いします。\n',[Line]), fail. 'それらの平均点と分散(標準偏差の二乗)を求める'(_5人の学生の成績ならび,_平均点,_分散) :- それらの平均点と(_5人の学生の成績ならび,_平均点), 分散を求める(_5人の学生の成績ならび,_分散). それらの平均点と(_5人の学生の成績ならび,_平均点) :- findavg(_成績,( append(_,[_成績|_],_5人の学生の成績ならび)), _平均点). 分散を求める(_5人の学生の成績ならび,_平均点,_分散) :- findavg(_偏差,( append(_,[_成績|_],_5人の学生の成績ならび), _偏差 is (_成績 - _平均点) * (_成績 - _平均点)), _分散). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/803 # # [1] 配列操作 # [2] 問題文(含コード&リンク): # 入力した文字と個数をもとに文字列データを生成する。(^Zが入力されるまで) # 以下の実行結果をもとにプログラミングしなさい。 # char m[30]; # # 実行結果 # 文字、個数==>A,3 # 文字、個数==>b,3 # 文字、個数==>c,1 # 文字、個数==>E,2 # 文字、個数==>^Z # 文字列:AAAbbbcEE # # '入力した文字と個数をもとに文字列データを生成する。(^Zが入力されるまで) ' :- findall(_文字列,( '入力した文字と個数'(_文字,_個数), length(L,_個数), all(L,_文字), concat_atom(L,_文字列)), _文字列ならび), concat_atom(_文字列ならび,_表示文字列), writef('%t\n',[_表示文字列]). 入力した文字と個数(_文字,_個数) :- write('文字,個数==> '), rawmode, get_code(_文字コード), '入力した個数'(文字コード,_文字,_個数), norawmode. 入力した個数(26,_文字,_個数) :- !,fail. 入力した個数(_文字コード,_文字,_個数) :- char_code(_文字,_文字コード), 個数を入力する(_個数). 個数を入力する(_個数) :- get_code(Code), 個数を入力する(Code,N), 個数を入力する(10,0) :- !. 個数を入力する(44,_個数) :- get_code(Code), 個数を入力する(Code,個数). 個数を入力する(Code,N,_個数) :- \+(N = 44), get_code(Code2), 個数を入力する(Code2,_個数2), Code =< 48, Code >= 57, N is Code - 48, _個数 is _個数2 * 10 + N. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/589 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # scanf により n を受け取り, 要素数 n の 1 〜 10 の値を持つ乱数配列を生成し表示するプログラムを作成せよ. # ただし, 配列の要素を表示するときは一行につき 10 個ずつ表示するようにせよ. # # 'n を受け取り, 要素数 n の 1 〜 10 の値を持つ乱数のならびを生成し表示する' :- 'n を受け取り, 要素数 n の 1 〜 10 の値を持つならびを生成し'(L), 表示する(L). 'n を受け取り, 要素数 n の 1 〜 10 の値を持つ乱数のならびを生成し'(L) :- 'n を受け取り'(_n), '要素数 n の'(_n,L), '1 〜 10 の値を持つ乱数のならびを生成し'(L). 'n を受け取り'(_n) :- write('要素数を入力してください : '), get_integer(_n). '要素数 n の'(_n,L) :- length(L,_n). '1 〜 10 の値を持つ乱数のならび生成し'(L) :- findall(N,( append(_,[N|_],L), '1 〜 10 の値を持つ乱数の'(N)), L). '1 〜 10 の値を持つ乱数の'(N) :- '0 〜 9 の値を持つ乱数に1を加えて1 〜 10 の値とします(N). '0 〜 9 の値を持つ乱数に1を加えて1 〜 10 の値とします'(N) :- '0 〜 9 の値を持つ乱数'(N_1), N is N_1 + 1. '0 〜 9 の値を持つ乱数'(N_1) :- N_1 is random(10). 表示する(L) :- writef('%t\n',[L]). % 以下のサイトは # 出典:: 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(_点数の定義文,['=',',',';'],[_|_点数ならび]). % 以下のサイトは # http://d.hatena.ne.jp/JunichiIto/touch/20111007/1317976730 # # Fizz-Buzz問題の例はこんな感じだ。 # # 1から100までの数をプリントするプログラムを書け。 # ただし3の倍数のときは数の代わりに「Fizz」と、 # 5の倍数のときは「Buzz」とプリントし、 # 3と5両方の倍数の場合には「FizzBuzz」とプリントすること。 # # ちゃんとしたプログラマであれば、 # これを実行するプログラムを2分とかからずに紙に書き出せるはずだ。 # 怖い事実を聞きたい? コンピュータサイエンス学科卒業生の過半数には # それができないのだ。 # 自称上級プログラマが答えを書くのに10-15分もかかっているのを見たこともある。 # 'Fizz-Buzz問題の例' :- '1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。'. '1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。' :- for(1,N,100), '1から100までの数をプリントする。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントする'(N), N = 100. '1から100までの数をプリントする。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントする'(N) :- 'ただし3の倍数のときは数の代わりに「Fizz」と'(N,_表示アトム), プリントする(_表示アトム),!. '1から100までの数をプリントする。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントする'(N) :- 'ただし5の倍数のときは数の代わりに「Buzz」と'(N,_表示アトム), プリントする(_表示アトム),!. '1から100までの数をプリントする。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントする'(N) :- '3と5両方の倍数のときは数の代わりに「FizzBuzz」と'(N,_表示アトム), プリントする(_表示アトム),!. '1から100までの数をプリントする。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントする'(N) :- '3の倍数でなく、5の倍数でもない場合は数字をそのまま'(N,_表示アトム), プリントする(_表示アトム),!. 'ただし3の倍数のときは数の代わりに「Fizz」と'(N,'Fizz') :- 0 is N mod 3, \+(0 is N mod 5). 'ただし5の倍数のときは数の代わりに「Buzz」と'(N,'Buzz') :- 0 is N mod 3, \+(0 is N mod 5). '3と5両方の倍数の場合には「FizzBuzz」'(N,'FizzBuzz') :- 0 is N mod 3, 0 is N mod 5. '3の倍数でなく、5の倍数でもない場合は数字をそのまま表示する'(N,_表示アトム) :- \+(0 is N mod 3), \+(0 is N mod 5), swritef(_表示アトム,'%t',[N]). プリントする(_表示アトム) :- writef('%t',[_表示アトム]). % 少考 % % このプログラムの問題点はプリントが複数箇所に分散していること。 % 普通は for(1,N,100) と N=100. の間で表示アトムを受け取って % プリントするように書く。 % 私のプログラミングスタイルでは、述語名に沿って本体(:- の後)を記述することを % 旨としているため、敢えて将来のメンテナンスの難しさ覚悟で % このような記述にした。 % % カットはなくてもよいのですが、「書き手の意志」を示すものとして入れることを % 勧めます。 % 以下のサイトは # Fizz-Buzz問題の例はこんな感じだ。 # # 1から100までの数をプリントするプログラムを書け。 # ただし3の倍数のときは数の代わりに「Fizz」と、 # 5の倍数のときは「Buzz」とプリントし、 # 3と5両方の倍数の場合には「FizzBuzz」とプリントすること。 # # ちゃんとしたプログラマであれば、 # これを実行するプログラムを2分とかからずに紙に書き出せるはずだ。 # 怖い事実を聞きたい? コンピュータサイエンス学科卒業生の過半数には # それができないのだ。 # 自称上級プログラマが答えを書くのに10-15分もかかっているのを見たこともある。 # '1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。' :- for(1,N,100), 表示アトムの選択(N,_表示アトム), writef('%t',[_表示アトム]), N = 100. 表示アトムの選択(N,_表示アトム) :- 'ただし3の倍数のときは数の代わりに「Fizz」と'(N,_表示アトム). 表示アトムの選択(N,_表示アトム) :- 'ただし5の倍数のときは数の代わりに「Buzz」と'(N,_表示アトム). 表示アトムの選択(N,_表示アトム) :- '3と5両方の倍数のときは数の代わりに「FizzBuzz」と'(N,_表示アトム). 表示アトムの選択(N,_表示アトム) :- \+(0 is N mod 3), \+(0 is N mod 5), swritef(_表示アトム,'%t',[N]). 'ただし3の倍数のときは数の代わりに「Fizz」と'(N,'Fizz') :- 0 is N mod 3, \+(0 is N mod 5). 'ただし5の倍数のときは数の代わりに「Buzz」と'(N,'Buzz') :- 0 is N mod 5, \+(0 is N mod 3). '3と5両方の倍数の場合には「FizzBuzz」'(N,'FizzBuzz') :- 0 is N mod 3, 0 is N mod 5. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/563 # # http://ime.nu/codepad.org/bsGYVXWW # # 4名の学生別に3科目の成績を入力してその学生別平均と科目別平均を表示する。 # '4名の学生別に3科目の成績を入力してその学生別平均と科目別平均を表示する' :- '4名の学生別に3科目の成績を入力して'(LL), 'その学生別平均と'(LL,_学生別平均ならび), '科目別平均を'(LL,_科目別平均ならび), '表示する'(_学生別平均ならび,_科目別平均ならび). '4名の学生別に3科目の成績を入力して'(LL) :- '4名の'(LL,4), findall(L,( 学生別に(LL,L), '3科目の成績を入力する'(L)), LL). '4名の'(LL) :- length(LL,4). 学生別に(LL,L) :- append(_,[L|_],LL). '3科目の成績を入力する'(L) :- '3科目の'(L), findall(_成績,( 成績を(L,_成績), 入力する(_成績)), L). '3科目の'(L) :- length(L,3). 成績を(L,_成績) :- append(_,[_成績|_],L). 入力する(_成績) :- get_line(Line), 成績入力検査(Line,_成績),!. 入力する(_成績) :- 入力する(_成績). 成績入力検査(Line,_成績) :- atom_to_term(Line,_成績,_), '成績は0点以上100点以下の整数とする'(_成績),!. 成績入力検査(Line,_成績) :- writef('入力された%tからは科目成績として適切な整数が得られませんでした。再入力をお願いします。\n',[Line]), fail. '成績は0点以上100点以下の整数とする'(_成績) :- integer(_成績), _成績 >= 0, _成績 =< 100. 'その学生別平均と'(LL,_学生別平均ならび) :- findall(_平均,( append(_,[L|_],LL), 相加平均(L,_平均)), _学生別平均ならび). '科目別平均を'(LL,_科目別平均ならび) :- 転置(LL,LL1), findall(_平均,( append(_,[L|_],LL1), 相加平均(L,_平均)), _科目別平均ならび). 相加平均([],N,S,M) :- M is S / N,!. 相加平均([A|R],N,S,M) :- S1 is S + A, 相加平均(R,N,S1,M). 相加平均(L,M) :- length(L,N), 相加平均(L,N,0.0,M). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/563 # # http://ime.nu/codepad.org/bsGYVXWW # # 4名の学生別に3科目の成績を入力してその学生別平均と科目別平均を表示する。 # # '4名の学生別に3科目の成績を入力してその学生別平均と科目別平均を表示する' :- '4名の学生別に3科目の成績を入力して'(LL), 'その学生別平均と'(LL,_学生別平均ならび), '科目別平均を'(LL,_科目別平均ならび), '表示する'(_学生別平均ならび,_科目別平均ならび). '4名の学生別に3科目の成績を入力して'(LL) :- '4名の'(LL,4), findall(L,( 学生別に(LL,L), '3科目の成績を入力する'(L)), LL). '4名の'(LL) :- length(LL,4). 学生別に(LL,L) :- append(_,[L|_],LL). '3科目の成績を入力する'(L) :- '3科目の'(L), findall(_成績,( 成績を(L,_成績), 入力する(_成績)), L). '3科目の'(L) :- length(L,3). 成績を(L,_成績) :- append(_,[_成績|_],L). 入力する(_科目別成績) :- get_line(Line), 入力検査(Line,_科目別成績),!. 入力する(_科目別成績) :- 入力する(_科目別成績). 入力検査(Line,_科目別成績) :- atom_to_term(Line,_科目別成績,_), integer(_科目別成績), _科目別成績 >= 0, _科目別成績 =< 100,!. 入力検査(Line,_科目別成績) :- writef('入力された%tからは科目成績として適切な整数が得られませんでした。再入力をお願いします。\n',[Line]), fail. 'その学生別平均と'(LL,_学生別平均ならび) :- findall(_平均,( append(_,[L|_],LL), 相加平均(L,_平均)), _学生別平均ならび). '科目別平均を'(LL,_科目別平均ならび) :- 転置(LL,LL1), findall(_平均,( append(_,[L|_],LL1), 相加平均(L,_平均)), _科目別平均ならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/563 # # http://ime.nu/codepad.org/bsGYVXWW # # #include # #define student 4 # #define score 3 # int main(){ # int i, j; # int a[student][score]; # int num[3]; # for(i=0; i= 0, _成績 =< 100,!. 成績入力検査(Line,_成績) :- writef('入力された%tからは科目成績として適切な整数が得られませんでした。再入力をお願いします。\n',[Line]), fail. 'その学生別平均と'(LL,_学生別平均ならび) :- findall(_平均,( append(_,[L|_],LL), 相加平均(L,_平均)), _学生別平均ならび). '科目別平均を'(LL,_科目別平均ならび) :- 転置(LL,LL1), findall(_平均,( append(_,[L|_],LL1), 相加平均(L,_平均)), _科目別平均ならび). 相加平均([],N,S,M) :- M is S / N,!. 相加平均([A|R],N,S,M) :- S1 is S + A, 相加平均(R,N,S1,M). 相加平均(L,M) :- length(L,N), 相加平均(L,N,0.0,M). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/563 # # http://ime.nu/codepad.org/bsGYVXWW # # #include # #define student 4 # #define score 3 # int main(){ # int i, j; # int a[student][score]; # int num[3]; # for(i=0; i= 0, _科目別成績 =< 100,!. 入力検査(Line,_科目別成績) :- writef('入力された%tからは科目成績として適切な整数が得られませんでした。再入力をお願いします。\n',[Line]), fail. 'その学生別平均と'(LL,_学生別平均ならび) :- findall(_平均,( append(_,[L|_],LL), 相加平均(L,_平均)), _学生別平均ならび). '科目別平均を'(LL,_科目別平均ならび) :- 転置(LL,LL1), findall(_平均,( append(_,[L|_],LL1), 相加平均(L,_平均)), _科目別平均ならび). % 以下のサイトは % *** user: / 2 *** 料理材料(魚介類,'アジ'). 料理材料(魚介類,'アナゴ'). 料理材料(魚介類,'アマダイ'). 料理材料(魚介類,'イワシ'). 料理材料(魚介類,'ウナギ'). 料理材料(魚介類,'カツオ'). 料理材料(魚介類,'カレイ'). 料理材料(魚介類,'キス'). 料理材料(魚介類,'サケ'). 料理材料(魚介類,'サバ'). 料理材料(魚介類,'サヨリ'). 料理材料(魚介類,'サワラ'). 料理材料(魚介類,'サンマ'). 料理材料(魚介類,'シラウオ'). 料理材料(魚介類,'白身魚'). 料理材料(魚介類,'スモークサーモン'). 料理材料(魚介類,'鯛'). 料理材料(魚介類,'タチウオ'). 料理材料(魚介類,'ハモ'). 料理材料(魚介類,'ハマチ'). 料理材料(魚介類,'ヒラメ'). 料理材料(魚介類,'マグロ'). 料理材料(魚介類,'ワカサギ'). 料理材料(魚介類,' '). 料理材料(魚介類,'アサリ'). 料理材料(魚介類,'ウニ'). 料理材料(魚介類,'カキ'). 料理材料(魚介類,'ハマグリ'). 料理材料(魚介類,'ホタテ貝柱'). 料理材料(魚介類,'ムール貝'). 料理材料(魚介類,' '). 料理材料(魚介類,'エビ'). 料理材料(魚介類,'むきエビ'). 料理材料(魚介類,'干しエビ'). 料理材料(魚介類,'カニ'). 料理材料(魚介類,'カニ缶詰'). 料理材料(魚介類,'イカ刺身'). 料理材料(魚介類,'スルメイカ'). 料理材料(魚介類,'紋甲イカ'). 料理材料(魚介類,'ヤリイカ'). 料理材料(魚介類,'タコ'). 料理材料(魚介類,' '). 料理材料(魚介類,'オイルサーディン'). 料理材料(魚介類,'カズノコ'). 料理材料(魚介類,'カマボコ'). 料理材料(魚介類,'クラゲ'). 料理材料(魚介類,'塩クラゲ'). 料理材料(魚介類,'シラス干し'). 料理材料(魚介類,'白身魚のすり身'). 料理材料(魚介類,'タラコ'). 料理材料(魚介類,'チクワ'). 料理材料(魚介類,'チリメンジャコ'). 料理材料(魚介類,'ツナ缶詰'). 料理材料(魚介類,'練りウニ'). 料理材料(魚介類,'明太子'). 料理材料(肉,'牛肉(全て)'). 料理材料(肉,'牛薄切り肉'). 料理材料(肉,'牛モモ肉'). 料理材料(肉,'牛ロース肉'). 料理材料(肉,'牛ヒレ肉'). 料理材料(肉,'牛バラ肉'). 料理材料(肉,'牛スネ肉'). 料理材料(肉,'牛ミンチ'). 料理材料(肉,'牛タン'). 料理材料(肉,'牛カルビ'). 料理材料(肉,'牛ミノ'). 料理材料(肉,'牛レバー'). 料理材料(肉,'ローストビーフ'). 料理材料(肉,'豚肉(全て)'). 料理材料(肉,'豚薄切り肉'). 料理材料(肉,'豚モモ肉'). 料理材料(肉,'豚ロース肉'). 料理材料(肉,'豚ヒレ肉'). 料理材料(肉,'豚バラ肉'). 料理材料(肉,'豚ミンチ'). 料理材料(肉,'スペアリブ'). 料理材料(肉,'焼き豚'). 料理材料(肉,'鶏肉(全て)'). 料理材料(肉,'鶏ムネ肉'). 料理材料(肉,'鶏モモ肉'). 料理材料(肉,'手羽'). 料理材料(肉,'鶏ササミ'). 料理材料(肉,'鶏ミンチ'). 料理材料(肉,'鶏レバー'). 料理材料(肉,'砂ギモ'). 料理材料(肉,'合挽きミンチ'). 料理材料(肉,'牛ミンチ'). 料理材料(肉,'豚ミンチ'). 料理材料(肉,'鶏ミンチ'). 料理材料(肉,'ソーセージ'). 料理材料(肉,'ボンレスハム'). 料理材料(肉,'ロースハム'). 料理材料(肉,'ベーコン'). 料理材料(野菜,'赤ピーマン'). 料理材料(野菜,'青ネギ'). 料理材料(野菜,'アスパラガス(生)'). 料理材料(野菜,'アスパラガス(缶詰)'). 料理材料(野菜,'ウド'). 料理材料(野菜,'エノキ茸'). 料理材料(野菜,'エンダイブ'). 料理材料(野菜,'エンドウ豆'). 料理材料(野菜,'大葉青ジソ'). 料理材料(野菜,'オクラ'). 料理材料(野菜,'カイワレ菜'). 料理材料(野菜,'カブ'). 料理材料(野菜,'カボチャ'). 料理材料(野菜,'カリフラワー'). 料理材料(野菜,'黄ニラ'). 料理材料(野菜,'キクラゲ'). 料理材料(野菜,'菊菜(春菊)'). 料理材料(野菜,'キヌサヤ'). 料理材料(野菜,'木の芽'). 料理材料(野菜,'キャベツ'). 料理材料(野菜,'キュウリ'). 料理材料(野菜,'切り干しダイコン'). 料理材料(野菜,'ギンナン'). 料理材料(野菜,'グリーンアスパラガス'). 料理材料(野菜,'クレソン'). 料理材料(野菜,'香草'). 料理材料(野菜,'ゴボウ'). 料理材料(野菜,'コマツ菜'). 料理材料(野菜,'小タマネギ'). 料理材料(野菜,'小ナス'). 料理材料(野菜,'サツマイモ'). 料理材料(野菜,'サトイモ'). 料理材料(野菜,'サニーレタス'). 料理材料(野菜,'サラダ菜'). 料理材料(野菜,'サヤインゲン(サンド豆)'). 料理材料(野菜,'山菜'). 料理材料(野菜,'シイタケ(生)'). 料理材料(野菜,'シイタケ(干)'). 料理材料(野菜,'白ネギ'). 料理材料(野菜,'白インゲン豆(缶詰)'). 料理材料(野菜,'シシトウガラシ'). 料理材料(野菜,'シソ(大葉青ジソ)'). 料理材料(野菜,'シメジ'). 料理材料(野菜,'ジャガイモ'). 料理材料(野菜,'春菊'). 料理材料(野菜,'ショウガ(土ショウガ)'). 料理材料(野菜,'ズッキーニ'). 料理材料(野菜,'セロリ'). 料理材料(野菜,'ソラ豆'). 料理材料(野菜,'ダイコン'). 料理材料(野菜,'大豆モヤシ'). 料理材料(野菜,'大豆(缶詰・水煮)'). 料理材料(野菜,'タケノコ'). 料理材料(野菜,'タマネギ'). 料理材料(野菜,'タラの芽'). 料理材料(野菜,'チコリ'). 料理材料(野菜,'チンゲンサイ'). 料理材料(野菜,'冬瓜'). 料理材料(野菜,'トマト'). 料理材料(野菜,'トマトホール(缶詰)'). 料理材料(野菜,'ナガイモ'). 料理材料(野菜,'ナス'). 料理材料(野菜,'菜の花'). 料理材料(野菜,'ニラ'). 料理材料(野菜,'生シイタケ'). 料理材料(野菜,'ナメコ'). 料理材料(野菜,'ニンジン'). 料理材料(野菜,'ネギ(青)'). 料理材料(野菜,'ネギ(白)'). 料理材料(野菜,'ハクサイ'). 料理材料(野菜,'ピーマン'). 料理材料(野菜,'ピーマン(赤)'). 料理材料(野菜,'フキ'). 料理材料(野菜,'プチトマト'). 料理材料(野菜,'プチオニオン(ペコロス)'). 料理材料(野菜,'ブロッコリー'). 料理材料(野菜,'ホウレン草'). 料理材料(野菜,'干しシイタケ'). 料理材料(野菜,'ホワイトアスパラガス(缶詰)'). 料理材料(野菜,'マッシュルーム'). 料理材料(野菜,'松茸'). 料理材料(野菜,'水菜'). 料理材料(野菜,'ミツバ'). 料理材料(野菜,'モヤシ'). 料理材料(野菜,'ヤマイモ'). 料理材料(野菜,'ヤングコーン(缶詰)'). 料理材料(野菜,'ユズ'). 料理材料(野菜,'ユリネ'). 料理材料(野菜,'レタス'). 料理材料(野菜,'レモン'). 料理材料(野菜,'レンコン'). 料理材料(野菜,'ワケギ'). 料理材料(野菜,'ワラビ'). 料理材料(野菜,'エノキ茸'). 料理材料(野菜,'キクラゲ'). 料理材料(野菜,'シメジ'). 料理材料(野菜,'ナメコ'). 料理材料(野菜,'生シイタケ'). 料理材料(野菜,'干しシイタケ'). 料理材料(野菜,'マッシュルーム'). 料理材料(野菜,'松茸'). 料理材料(野菜,'サツマイモ'). 料理材料(野菜,'サトイモ'). 料理材料(野菜,'ジャガイモ'). 料理材料(野菜,'ナガイモ'). 料理材料(野菜,'ヤマイモ'). 料理材料(野菜,'アズキ'). 料理材料(野菜,'エンドウ豆'). 料理材料(野菜,'キヌサヤ'). 料理材料(野菜,'サヤインゲン(サンド豆)'). 料理材料(野菜,'白インゲン豆'). 料理材料(野菜,'ソラ豆'). 料理材料(野菜,'大豆(缶詰・水煮)'). % 以下のサイトは # x^2+y^2=z^2を満たす正の整数をピタゴラス数と呼び、三つ組(x,y,z)で表す。 # ピタゴラス数のリストを生成する関数pythsを定義せよ。 # ただし、ピタゴラス数の要素は、与えられた上限以下であるとする。 # ピタゴラス数ならび(_ピタゴラス数要素の上限,_ピタゴラス数ならび) :- findall([_x,_y,_z],( ピタゴラス数(_ピタゴラス数要素の上限,_x,_y,_z)), _ピタゴラス数ならび). ピタゴラス数(_ピタゴラス数要素の上限,_x,_y,_z) :- '_x,_y,_zの候補は'(_要素値上限,_x,_y,_z), 'ピタゴラス数は_zを直角三角形の斜辺_x,_yを直角の隣辺とした時の制約を持つ'(_x,_y,_z). '_x,_y,_zの候補は'(_ピタゴラス数要素の上限,_x,_y,_x) :- for(1,_x,_ピタゴラス数要素の上限), for(1,_y,_ピタゴラス数要素の上限), for(1,_z,_ピタゴラス数要素の上限). 'ピタゴラス数は_zを直角三角形の斜辺_x,_yを直角の隣辺とした時の制約を持つ'(_x,_y,_z) :- ピタゴラスの定理を適用する(_x,_y,_z). ピタゴラスの定理を適用する(X,Y,Z) :- '直角の隣辺の二乗の和は斜辺の二乗に等しい'(_x,_y,_z). '直角の隣辺の二乗の和は斜辺の二乗に等しい'(_x,_y,_z) :- '直角の隣辺の二乗の和は'(_x,_y,_直角の隣辺の二乗の和), '斜辺の二乗に'(_z,_斜辺の二乗), 等しい(_直角の隣辺の二乗の和,_斜辺の二乗). '直角の隣辺の二乗の和は'(_x,_y,_直角の隣辺の二乗の和) :- _直角の隣辺の二乗の和 is _x * _x + _y * _y. '斜辺の二乗に'(_z,_斜辺の二乗) :- _斜辺の二乗 is _z * _z. 等しい(X,Y) :- X =:= Y. % 関連解答 % http://nojiriko.asia/prolog/pythagorean_su.html % http://nojiriko.asia/prolog/pythagorean_su_2.html % http://nojiriko.asia/prolog/pythagorean_su_3.html % 以下のサイトは # x^2+y^2=z^2を満たす正の整数をピタゴラス数と呼び、三つ組(x,y,z)で表す。 # ピタゴラス数のリストを生成する関数pythsを定義せよ。 # ただし、ピタゴラス数の要素は、与えられた上限以下であるとする。 # ピタゴラス数ならび(_ピタゴラス数要素の上限,_ピタゴラス数ならび) :- findall([_x,_y,_z],( ピタゴラス数(_ピタゴラス数要素の上限,_x,_y,_z)), _ピタゴラス数ならび). ピタゴラス数(_ピタゴラス数要素の上限,_x,_y,_z) :- '_x,_y,_zの候補は'(_要素値上限,_x,_y,_z), 'ピタゴラス数は_zを直角三角形の斜辺_x,_yを直角の隣辺とした時の制約を持つ'(_x,_y,_z). '_x,_y,_zの候補は'(_ピタゴラス数要素の上限,_x,_y,_x) :- for(1,_x,_ピタゴラス数要素の上限), for(1,_y,_ピタゴラス数要素の上限), for(1,_z,_ピタゴラス数要素の上限), 'ピタゴラス数は_x,_yを三角形の短辺_zを長辺とした時の制約を持つ'(_x,_y,_z). 'ピタゴラス数は_zを直角三角形の斜辺_x,_yを直角の隣辺とした時の制約を持つ'(_x,_y,_z) :- ピタゴラスの定理を適用する(_x,_y,_z). ピタゴラスの定理を適用する(X,Y,Z) :- Z * Z =:= X * X + Y * Y. 'ピタゴラス数は_x,_yを三角形の短辺_zを長辺とした時の制約を持つ'(_x,_y,_z) :- _z > _x, _z > _y, _z < _x + _y. % 関連解答 % http://nojiriko.asia/prolog/pythagorean_su.html % http://nojiriko.asia/prolog/pythagorean_su_2.html % 以下のサイトは # x^2+y^2=z^2を満たす正の整数をピタゴラス数と呼び、三つ組(x,y,z)で表す。 # ピタゴラス数のリストを生成する関数pythsを定義せよ。 # ただし、ピタゴラス数の要素は、与えられた上限以下であるとする。 # ピタゴラス数ならび(_ピタゴラス数要素の上限,_ピタゴラス数ならび) :- findall([_x,_y,_z],( ピタゴラス数(_ピタゴラス数要素の上限,_x,_y,_z)), _ピタゴラス数ならび). ピタゴラス数(_ピタゴラス数要素の上限,_x,_y,_z) :- '_x,_y,_zの候補は'(_要素値上限,_x,_y,_z), 'ピタゴラス数は_zを直角三角形の斜辺_x,_yを直角の隣辺とした時の制約を持つ'(_x,_y,_z). '_x,_y,_zの候補は'(_ピタゴラス数要素の上限,_x,_y,_x) :- for(1,_x,_ピタゴラス数要素の上限), for(1,_y,_ピタゴラス数要素の上限), for(1,_z,_ピタゴラス数要素の上限). 'ピタゴラス数は_zを直角三角形の斜辺_x,_yを直角の隣辺とした時の制約を持つ'(_x,_y,_z) :- ピタゴラスの定理を適用する(_x,_y,_z). ピタゴラスの定理を適用する(X,Y,Z) :- Z * Z =:= X * X + Y * Y. % 以下のサイトは # x^2+y^2=z^2を満たす正の整数をピタゴラス数と呼び、三つ組(x,y,z)で表す。 # ピタゴラス数のリストを生成する関数pythsを定義せよ。 # ただし、ピタゴラス数の要素は、与えられた上限以下であるとする。 # ピタゴラス数ならび(_要素値上限,_ピタゴラス数ならび) :- findall([_x,_y,_z],( ピタゴラス数(_要素値上限,_x,_y,_z)), _ピタゴラス数ならび). ピタゴラス数(_要素値上限,_x,_y,_z) :- '1から_要素値上限までの整数リストを生成'(_要素値上限,L), 重複組合せ(L,3,[X,Y,_z]), 'X,Y,を三角形の短辺、_zを長辺だとみなすことができる'(X,Y,_z), ピタゴラスの定理を適用する(X,Y,_z), 短辺はひっくり返すことも可能(X,Y,_x,_y). '1から_要素値上限までの整数リストを生成'(_要素値上限,L) :- findall(N,for(1,N,_要素値上限),L). 'X,Y,を三角形の短辺、_zを長辺だとみなすことができる'(X,Y,_z) :- _z > X, _z > Y, _z < X + Y. ピタゴラスの定理を適用する(X,Y,Z) :- Z * Z =:= X * X + Y * Y. 短辺はひっくり返すことも可能(_x,_x,_x,_x) :- !. 短辺はひっくり返すことも可能(_x,_y,_x,_y). 短辺はひっくり返すことも可能(_y,_x,_x,_y). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/541 # # ●正規表現の使用環境 # 一般社会 # # ●検索か置換か? # 検索 # # ●説明 # すぐにやれる女を見つけたいです # # ●対象データ # OL # 女子大生 # 女子高生 # キャバ嬢 # ヘルス嬢 # 近所のおばさん # 母親 # # ●希望する結果 # させこ # やりまん # 公衆便所 # すぐにやれる女(させこ). すぐにやれる女(やりまん). すぐにやれる女(公衆便所). 'すぐにやれる女を見つけたいです'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,_,_,_), すぐにやれる女(_適合文字列). % 以下のサイトは #

Best Cow Line(POJ3617)

# # N文字の文字列Sが与えられ、N文字の文字列Tを作ります。 # はじめはTは長さ0の文字列で、次のいずれかの操作が行えます。 # ・Sの先頭を一文字削除し、Tの末尾に追加する # ・Sの末尾を一文字削除し、Tの末尾に追加する # 辞書順比較でできるだけ小さくなるようにTを作ってください。 # # 制約 # ・1 =< N =< 2000 # ・文字列Sに含まれるのはローマ字の大文字のみ # poj3617(S,T) :- 'stringは引数として渡されると文字コードのリストとして扱われる', '第二引数が[]から成長する、それが実はTである'(Ln,S,[],L), '最後に文字コードのリストをstringに戻す'(L,T). '第二引数が[]から成長する、それが実はTである'(S,T1,T) :- '引数として渡されたものはS,Tのままにするがこれは文字コードのリストだ', '処理した文字数を制御するため、Sの文字数と同じ要素数の匿名変数リストLnを用意する'(S,Ln), 'リストの比較がし易いように反転リストS2を作る'(S,S2), 'S,S2からTを生成'(Ln,S,S2,T1,T). '処理した文字数を制御するため、Sの文字数と同じ要素数の匿名変数リストLnを用意する'(S,Ln) :- length(S,N), length(Ln,N). 'リストの比較がし易いように反転リストS2を作る'(S,S2) :- reverse(S,S2). 'S,S2からTを生成'([],_,_,T,T) :- '第四引数に生成された物それがTである'. 'S,S2からTを生成'([_|Ln],[A|R1],[B|R2],T1,T) :- [A|R1] @=< [B|R2], '選択された要素をT1(実はT)の末尾に付加してT2とする'(T1,A,T2), 'S,S2からTを生成'(Ln,R1,R22,T2,T). 'S,S2からTを生成'([_|Ln],[A|R1],[B|R2],T1,T) :- [A|R1] @> [B|R2], '選択された要素をT1(実はT)の末尾に付加してT2とする'(T1,B,T2), 'S,S2からTを生成'(Ln,R11,R2,T2,T). '選択された要素をT1(実はT)の末尾に付加してT2とする'(T1,_選択された要素,T2) :- append(T1,[_選択された要素],T2). '最後に文字コードのリストをstringに戻す'(L,T) :- string_to_list(T,L). % 以下はコメント的な述語 'stringは引数として渡されると文字コードのリストとして扱われる'. '引数として渡されたものはS,Tのままにするがこれは文字コードのリストだ'. '第四引数に生成された物それがTである'. % 以下のサイトは #

Best Cow Line(POJ3617)

# # N文字の文字列Sが与えられ、N文字の文字列Tを作ります。 # はじめはTは長さ0の文字列で、次のいずれかの操作が行えます。 # ・Sの先頭を一文字削除し、Tの末尾に追加する # ・Sの末尾を一文字削除し、Tの末尾に追加する # 辞書順比較でできるだけ小さくなるようにTを作ってください。 # # 制約 # ・1 =< N =< 2000 # ・文字列Sに含まれるのはローマ字の大文字のみ # poj3617(S,T) :- 'stringは引数として渡されると文字コードのリストとして扱われる', '第二引数が[]から成長する、それが実はTである'(S,[],L), '最後に文字コードのリストをstringに戻す'(L,T). '第二引数が[]から成長する、それが実はTである'(S,T1,T) :- '引数として渡されたものはS,Tのままにするがこれは文字コードのリストだ', 'リストの比較がし易いように反転リストS2を作る'(S,S2), 'S,S2からTを生成'(S,S2,T1,T). 'リストの比較がし易いように反転リストS2を作る'(S,S2) :- reverse(S,S2). 'S,S2からTを生成'([],[],T,T) :- '第三引数に生成された物それがTである'. 'S,S2からTを生成'([A|R1],[B|R2],T1,T) :- [A|R1] @=< [B|R2], 先頭要素を採用されなかったリストは末尾要素を削除する([B|R2],R22), '選択された要素をT1(実はT)の末尾に付加してT2とする'(T1,A,T2), 'S,S2からTを生成'(R1,R22,T2,T). 'S,S2からTを生成'([A|R1],[B|R2],T1,T) :- [A|R1] @> [B|R2], 先頭要素を採用されなかったリストは末尾要素を削除する([A|R1],R11), '選択された要素をT1(実はT)の末尾に付加してT2とする'(T1,B,T2), 'S,S2からTを生成'(R11,R2,T2,T). 先頭要素を採用されなかったリストは末尾要素を削除する(L1,L2) :- append(L2,[_],L1). '選択された要素をT1(実はT)の末尾に付加してT2とする'(T1,_選択された要素,T2) :- append(T1,[_選択された要素],T2). '最後に文字コードのリストをstringに戻す'(L,T) :- string_to_list(T,L). % 以下はコメント的な述語 'stringは引数として渡されると文字コードのリストとして扱われる'. '引数として渡されたものはS,Tのままにするがこれは文字コードのリストだ'. '第三引数に生成された物それがTである'. % 以下のサイトは #

Best Cow Line(POJ3617)

# # N文字の文字列Sが与えられ、N文字の文字列Tを作ります。 # はじめはTは長さ0の文字列で、次のいずれかの操作が行えます。 # ・Sの先頭を一文字削除し、Tの末尾に追加する # ・Sの末尾を一文字削除し、Tの末尾に追加する # 辞書順比較でできるだけ小さくなるようにTを作ってください。 # # 制約 # ・1 =< N =< 2000 # ・文字列Sに含まれるのはローマ字の大文字のみ # poj3617(S,T) :- 'リストの比較がし易いように反転リストS2を作る'(S,S2), 'S,S2からTを生成'(S,S2,T). 'リストの比較がし易いように反転リストS2を作る'(S,S2) :- reverse(S,S2). 'S,S2からTを生成'([],[],[]). 'S,S2からTを生成'([A|R1],[B|R2],[A|R3]) :- [A|R1] @=< [B|R2], 先頭要素を採用されなかったリストは末尾要素を削除する([B|R2],R22), 'S,S2からTを生成'(R1,R22,R3). 'S,S2からTを生成'([A|R1],[B|R2],[B|R3]) :- [A|R1] @> [B|R2], 先頭要素を採用されなかったリストは末尾要素を削除する([A|R1],R11), 'S,S2からTを生成'(R11,R2,R3). 先頭要素を採用されなかったリストは末尾要素を削除する(A,B) :- append(B,[_],A). % 以下のサイトは #

Best Cow Line(POJ3617)

# # N文字の文字列Sが与えられ、N文字の文字列Tを作ります。 # はじめはTは長さ0の文字列で、次のいずれかの操作が行えます。 # ・Sの先頭を一文字削除し、Tの末尾に追加する # ・Sの末尾を一文字削除し、Tの末尾に追加する # 辞書順比較でできるだけ小さくなるようにTを作ってください。 # # 制約 # ・1 =< N =< 2000 # ・文字列Sに含まれるのはローマ字の大文字のみ # 'N文字の文字列Sが与えられ、N文字の文字列Tを作ります。はじめはTは長さ0の文字列で、次のいずれかの操作が行えます。・Sの先頭を一文字削除し、Tの末尾に追加する ・Sの末尾を一文字削除し、Tの末尾に追加する 辞書順比較でできるだけ小さくなるようにTを作る'(S,T) :- poj3617(S,T). poj3617(S,T) :- 'Sを文字リストL1に変換'(S,L1), 'リストL1を反転して後ろから見たリストL2を作る'(L1,L2), 'L1,L2から辞書順リストL3を生成'(L1,L2,L3), '文字リストL3からTを生成'(T,L3). 'Sを文字リストL1に変換'(S,L1) :- atom_chars(S,L1). 'リストL1を反転して後ろから見たリストL2を作る'(L1,L2) :- reverse(L1,L2). 'L1,L2から辞書順リストL3を生成'([],[],[]). 'L1,L2から辞書順リストL3を生成'([A|R1],[B|R2],[A|R3]) :- [A|R1] @=< [B|R2], リストの最終要素を削除([B|R2],R22), 'L1,L2から辞書順リストL3を生成'(R1,R22,R3). 'L1,L2から辞書順リストL3を生成'([A|R1],[B|R2],[B|R3]) :- [A|R1] @> [B|R2], リストの最終要素を削除([A|R1],R11), 'L1,L2から辞書順リストL3を生成'(R11,R2,R3). リストの最終要素を削除(A,B) :- append(B,[_],A). '文字リストL3からTを生成'(T,L3) :- atom_chars(T,L3). %

問題点 ・・・ Sから最初空のTに段々文字を移していく雰囲気が全くない。 % さらに言うと、長い問題文をそのまま順にPrologコードに落としていく % 雰囲気もない。最低のコードだ。

% 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1294641578/506 # # 日本語が下手なので、質問し直し。 # # データベースには、書名、出版社、著者、ISBN番号はいずれもデータが入っている。 # # 検索ページはWEBページ上に作る。TEXT入力欄を4箇所配置する。 # 検索者は、上記4項のうち、書名もしくは出版社等、分かっているものしか入力できないので、どの項目に検索単語が入力されているかは、検索毎に変わる。 # # 入力のある・なしの組み合わせは2の4乗になる。 # # このような場合に、SELECT文は、どう書き下すように作るのでしょうか。 # # 全項目が埋まっていれば、アンドを使って簡単に書けるのですが。。。 # # 'SQLのwhere句の生成'(_入力データならび,_where句) :- findall(_属性名=_値_1,( append(_,[[_属性名,_値]|_],_入力データならび), concat_atom(['\'',_値,'\''],_値_1)), L), concat_atom(L,' and ',_where句). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/6 # # [1] 授業単元: C言語プログラミング # [2] 問題文(含コード&リンク):となりどおしの数字の差がその下の数字となるように、 # 1から15までの数を1回だけ使って例に従ってマスにいれなさい。 # 積み上げ(L) :- 組合せならびの生成(_組合せならびの生成), L = [[_],[_,_],[_,_,_],[_,_,_,_],[_,_,_,_,_]], 積み上げ(_組合せならびの生成,[],LY,L), reverse(L,L2), '5段から1段まで表示する'([' ',' ',' ',' ',' ',''],L2). 積み上げ(LX,LY1,LY,[L1,L2|R]) :- 一行積み上げ(L1,LX,LY1,LY2,L2), 積み上げ(LX,LY2,LY,[L2|R]). 一行積み上げ([],LX,LY,LY,[]) :- !. 一行積み上げ([S],LX,LY1,[N1,N2|LY1],[N1,N2]) :- member([S,N1,N2],LX), \+(member(N1,LY)), \+(member(N2,LY)), S is abs(N1-N2),!. 一行積み上げ([S|R1],LX,LY1,LY,[N1,N2|R2]) :- member([S,N1,N2],LX), \+(member(N1,LY)), \+(member(N2,LY)), S is abs(N1-N2), 一行積み上げ(R1,LX,[N1,N2|LY1],LY,[N2|R2]). 組合せならびの生成(_組合せならびの生成) :- findall([S,N1,N2],( 組合せ([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],2,[N1,N2]), S is abs(N1-N2), \+(member(S,[N1,N2]))), _組合せならび), '5段から1段まで表示する'([],[]) :- !. '5段から1段まで表示する'([_空白|R1],[L|R2]) :- concat_atom(L,' ',S), writef('%t%t\n',[_空白,S]), '5段から1段まで表示する'(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/900 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # C言語の乱数発生関数を使ってサイコロ関数  int dice( void ) を作成し、以下の統計的な性質を検証せよ。 # (1) 10,100,1000,1万回、10万回、100万回、1000万回、1億回の試行での 期待値(平均値)の変化 # (2)前記の試行回数での各数字の出目の確率 # (3)2つのサイコロを投げた時の11、22のようなぞろ目の確率 # レポートのグラフはExcelを用いる。 # '10,100,1000,1万回、10万回、100万回、1000万回、1億回の試行での 期待値(平均値)の変化' :- '2つのサイコロを投げた時の11、22のようなぞろ目の確率'(0,0). '2つのサイコロを投げた時の11、22のようなぞろ目の確率'(100000000,_ゾロ目の回数) :- _ゾロ目の確率 is _ゾロ目の回数 / 100000000, writef('試行回数: %t,ゾロ目の確率: %t\n',[100000000,_ゾロ目の確率]),!. '2つのサイコロを投げた時の11、22のようなぞろ目の確率'(N,_ゾロ目の回数) :- member(N,[10,100,1000,10000,100000,1000000,10000000]), _ゾロ目の確率 is _ゾロ目の回数 / N, writef('試行回数: %t,ゾロ目の確率: %t\n',[N,_ゾロ目の確率]), fail. '2つのサイコロを投げた時の11、22のようなぞろ目の確率'(M,_ゾロ目の回数1) :- '2つのサイコロを投げた時の目'(_目1,_目2), 'ゾロ目とは2つの目が同じということ'(_目1,_目2), M2 is M + 1, _ゾロ目の回数2 is _ゾロ目の回数1 + 1, '2つのサイコロを投げた時の11、22のようなぞろ目の確率'(M2,_ゾロ目の回数2),!. '2つのサイコロを投げた時の11、22のようなぞろ目の確率'(M,_ゾロ目の回数) :- M2 is M + 1, '2つのサイコロを投げた時の11、22のようなぞろ目の確率'(M2,_ゾロ目の回数). '2つのサイコロを投げた時の目'(_目1,_目2) :- ランダム関数をサイコロに模して二つの目を出す(_目1,_目2). ランダム関数をサイコロに模して二つの目を出す(_目1,_目2) :- 'random(6)は0-5が値域だから1を加える必要がある'(_目1,_目2). 'random(6)は0-5が値域だから1を加える必要がある'(_目1,_目2) :- _目1 is random(6) + 1, _目2 is random(6) + 1. ゾロ目とは二つの目が同じということ(_目,_目). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/900 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # C言語の乱数発生関数を使ってサイコロ関数  int dice( void ) を作成し、以下の統計的な性質を検証せよ。 # (1) 10,100,1000,1万回、10万回、100万回、1000万回、1億回の試行での 期待値(平均値)の変化 # (2)前記の試行回数での各数字の出目の確率 # (3)2つのサイコロを投げた時の11、22のようなぞろ目の確率 # レポートのグラフはExcelを用いる。 # '10,100,1000,1万回、10万回、100万回、1000万回、1億回の試行での 期待値(平均値)の変化' :- 試行回数での各数字の出目の確率(0,[0,0,0,0,0,0,0,0,0,0]). 試行回数での各数字の出目の確率(100000000,L) :- 各数字の出目の確率を表示する(100000000,L),!. 試行回数での各数字の出目の確率(N,L) :- member(N,[10,100,1000,10000,100000,1000000,10000000]), 各数字の出目の確率を表示する(N,L), fail. 試行回数での各数字の出目の確率(M,L1) :- _ランダム値 is random(10), ランダム値頻度の更新(_ランダム値,L1,L2), M2 is M + 1, 試行回数での各数字の出目の確率(M2,L2). ランダム値頻度の更新(N,L1,L2) :- append(L0,[M|R],L2), length(L0,N), M2 is M + 1, append(L0,[M2|R],L2),!. 各数字の出目の確率を表示する(N,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9]) :- writef('試行回数 %t :: '), append(L0,[_頻度|R],[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9]), length(L0,M), _確率 is _頻度 / N, writef('%t: %t,',[M,_確率]), R = [], write('\n'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/900 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # C言語の乱数発生関数を使ってサイコロ関数  int dice( void ) を作成し、以下の統計的な性質を検証せよ。 # (1) 10,100,1000,1万回、10万回、100万回、1000万回、1億回の試行での 期待値(平均値)の変化 # (2)前記の試行回数での各数字の出目の確率 # (3)2つのサイコロを投げた時の11、22のようなぞろ目の確率 # レポートのグラフはExcelを用いる。 # '10,100,1000,1万回、10万回、100万回、1000万回、1億回の試行での 期待値(平均値)の変化' :- '0から9の数値をN回ランダムに取り出す'(0,0). '0から9の数値をN回ランダムに取り出す'(100000000,_合計) :- _平均値 is _合計 / 100000000, writef('試行回数: %t,平均値: %t\n',[100000000,_平均値]),!. '0から9の数値をN回ランダムに取り出す'(N,_合計) :- member(N,[10,100,1000,10000,100000,1000000,10000000]), _平均値 is _合計 / N, writef('試行回数: %t,平均値: %t\n',[N,_平均値]), fail. '0から9の数値をN回ランダムに取り出す'(M,_合計1) :- _合計2 is random(10) + _合計1, M2 is M + 1, '0から9の数値をN回ランダムに取り出す'(M2,_合計2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/807 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): http://ime.nu/codepad.org/P8lye0BT # このプログラムを応用し、100以上200未満の乱数を10000回発生させ、各数値が何回乱数として発生したのかをcsv形式ファイルに出力し、結果をExcelのグラフを示しなさい。 # '100以上200未満の乱数を10000回発生させ、各数値が何回乱数として発生したのかをcsv形式ファイルに出力する'(_csvファイル) :- '100以上200未満の乱数を10000回発生させ'(L), 各数値が何回乱数として発生したのかをcsv形式ファイルに出力する(_csvファイル,L). '100以上200未満の乱数を10000回発生させ'(L) :- length(L,10000), findall(N,( append(_,[_|_],L), N is random(100)+100), L). 各数値が何回乱数として発生したのかをcsv形式ファイルに出力する(_csvファイル,L) :- open(_csvファイル,write,Outstream), 各数値が(N), 何回乱数として発生したのか(N,L,_何回), 出力する(Outstream,_何回), N = 199, write(Outstream,'\n'), close(Outstream). 各数値が(N) :- for(100,N,199). 何回乱数として発生したのか(N,L,_何回) :- count(member(N,L),_何回). 出力する(Outsteam,N) :- writef(Outstream,'%t,',[N]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/805 # # [1]授業単元:プログラミング # [2]問題文:番号、数学点数、英語点数を一組としたデータを線形リスト形式で保存 # 全データ一覧 # 入力した番号の点数のみ表示 # 新しいデータを入力しリストの最後に追加 # 番号のみを入力してデータ削除 ← 可能ならば、出来てなくても大丈夫です # プログラム終了 # # 始めから与えられているデータを入れ忘れました。申し訳ありませんでした # 番号  数学  英語 # N0003  82  100 # N0006  73  91 # N0020  69  83 # N0011  44  70 # N0025  34  62 # N0022  32  52 # N0015  16  12 # N0013  61  100 # N0001  70  88 # (本当はデータ数が25個程あるのですが、これだけでお願いします) # 全データ一覧ではリスト通りの表示でOKです # 成績('N0003',82,100). 成績('N0006',73,91). 成績('N0020',69,83). 成績('N0011',44,70). 成績('N0025',34,62). 成績('N0022',32,52). 成績('N0015',16,12). 成績('N0013',61,100). 成績('N0001',70,88). 成績管理 :- 成績管理メニュー表示, get_integer(_選択), 成績管理選択実行(_選択). 成績管理メニュー表示 :- write('左側の番号で選択してください\n'), write('1..番号、数学点数、英語点数を一組としたデータを線形リスト形式で保存\n'), write('2..全データ一覧\n'), write('3..入力した番号の点数のみ表示\n'), write('4..新しいデータを入力しリストの最後に追加\n'), write('5..番号のみを入力してデータ削除\n'), write('9..終了\n'),!. 成績管理選択実行(1) :- '番号、数学点数、英語点数を一組としたデータを線形リスト形式で保存'. 成績管理選択実行(2) :- 全テータ一覧. 成績管理選択実行(3) :- 入力した番号の点数のみ表示. 成績管理選択実行(4) :- 新しいデータを入力しリストの最後に追加. 成績管理選択実行(5) :- 番号のみを入力してデータ削除. 成績管理選択実行(9). '番号、数学点数、英語点数を一組としたデータを線形リスト形式で保存' :- findall([_番号,_数学点数,_英語点数],( 成績(_番号,_数学点数,_英語点数)), LL), open('生成保存.pro',write,Outstream), writef(Outstream,'%q.\n',[LL]), close(Outstream). 全データ一覧 :- write('番号  数学  英語\n'), 成績(_番号,_数学点数,_英語点数), writef('%t %4r %4r\n',[_番号,_数学点数,_英語点数]), fail. 全データ一覧. 入力した番号の点数のみ表示 :- 入力した番号(_入力した番号), write('番号  数学  英語\n'), 成績(_番号,_数学点数,_英語点数), writef('%t %4r %4r\n',[_番号,_数学点数,_英語点数]), fail. 入力した番号の点数のみ表示. 入力した番号(_入力した番号) :- get_line(_入力した番号),!. 新しいデータを入力しリストの最後に追加 :- 番号の入力(_番号), 数学点数の入力(_数学点数), 英語点数の入力(_英語点数), 新しいデータを入力しリストの最後に追加(_番号,_数学点数,_英語点数). 新しいデータを入力しリストの最後に追加(_番号,_数学点数,_英語点数) :- assertz(成績(_番号,_数学点数,_英語点数)). 番号の入力(_番号) :- write('番号を入力してください : '), get_line(_番号),!. 数学点数の入力(_数学点数) :- write('数学点数(0~100)を入力してください : '), get_line(Line), 点数入力診断(Line,_数学点数), 数学点数の入力(_数学点数) :- 数学点数の入力(_数学点数). 英語点数の入力(_英語点数) :- write('英語点数(0~100)を入力してください : '), get_line(Line), 点数入力診断(Line,_英語点数),!. 英語点数の入力(_英語点数) :- 英語点数の入力(_英語点数). 点数入力診断(Line,_点数) :- atom_to_term(Line,_点数,_), integer(_点数), _点数 >= 0, _点数 =< 100,!. 点数入力診断(Line,_点数) :- write('入力された %t から点数として適切な整数を得られません。再入力をお願いします。\n',[Line]), fail. '番号のみを入力してデータ削除 ← 可能ならば、出来てなくても大丈夫です' :- 番号のみ入力して(_番号), retract(成績(_番号,_,_)), fail. '番号のみを入力してデータ削除 ← 可能ならば、出来てなくても大丈夫です'. 番号のみ入力して(_番号) :- get_line(_番号),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/658 # # 助けてください。5つあります。 # 明日提出期限です。 # # 入力した数の階乗を計算するプログラムを作れ。 # nの階乗とは、n!と書いて、次のような計算をするものである。 # n! = n × (n – 1) × (n – 2) × … × 2 × 1 # # ヒント)関数 fact(n)を n!を計算するプログラムとする。 # この時、 # n! = n × (n – 1)! # だから、fact(n) を計算するには、fact(n-1)を計算してから、nをかければ良い。 # 'n!'(_n,_階乗) :- 階乗式評価項文字列の生成(N,_階乗式評価項文字列), atom_to_term(_階乗式評価項文字列,P,VL), '文字列の中の変数と_論理変数を結びつける'('_n',VL,_n), '文字列の中の変数と_論理変数を結びつける'('_階乗',VL,_階乗), call(P). 階乗式評価項文字列の生成(_n,_階乗式評価項文字列) :- 階乗式文字列の生成(_n,_階乗式文字列), swritef(_階乗式評価項文字列,'_階乗 is %t,[_階乗式文字列]). 階乗式文字列の生成(_n,_階乗式文字列) :- _n_3 is _n - 3, findall(S,( for(0,M,_n_3), concat_atom(['(','_n',' - ',M,')'],S)), L), append(L,['2','1'],L1), concat_atom(L1,' * ',_階乗式文字列),!. '文字列の中の変数と_論理変数を結びつける'(_変数文字列,[_変数文字列=V],V) :- !. '文字列の中の変数と_論理変数を結びつける'(_変数文字列,[_|R],V) :- '文字列の中の変数と_論理変数を結びつける'(_変数文字列,R,V). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/638 # # [1] 授業単元:C言語プログラミング # [2] 問題文(含コード&リンク): 4つの数字を入力して四則演算の組み合わせを考えて # 10になる数式を表示せよ。10になる数式がなければ"NG"と表示。 # 入力できる数値は1〜9までとする。 # 例) # 入:1 2 3 4 # 答え:2×3+1×4 # '4つの数字を入力して四則演算の組み合わせを考えて10になる数式を表示せよ。10になる数式がなければ"NG"と表示' :- '4つの数字を入力して'(N1,N2,N3,N4), 順列([+,-,*,/],3,L), 式文字列を構成する([N1,N2,N3,N4],L,_式文字列), atom_to_term(_式文字列,_式,_), 10 is truncate(_式), write('%t\n',[_式文字列]),!. '4つの数字を入力して四則演算の組み合わせを考えて10になる数式を表示せよ。10になる数式がなければ"NG"と表示' :- write('NG\n'). '4つの数字を入力して'(N1,N2,N3,N4) :- write('4つの整数を空白区切りで入力してください : '), readln([N1,N2,N3,N4]), すべて整数([N1,N2,N3,N4]). 式文字列を構成する(_値ならび,_符号ならび,_式文字列) :- 式を構成するならびを生成(_値ならび,_符号ならび,_式を構成するならび), concat_atom(_式を構成するならび,_式文字列). 式を構成するならびを生成([N4],[],[N4]) :- !. 式を構成するならびを生成([N1,0|R1],[/|R2],R3) :- !,fail. 式を構成するならびを生成([N|R1],[_符号|R2],[N,_符号|R3]) :- 式を構成するならびを生成(R1,R2,R3). すべて整数([]). すべて整数([N|R]) :- integer(N), すべて整数(R). % 以下のサイトは # # 部分集合の生成 # %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % 非決定性に作っておいて、findallで収集する。 % 全部分集合(_集合,_部分集合リスト) :- findall(_部分集合,( 部分集合(_集合,_部分集合)), _部分集合リスト). 部分集合(_集合,_部分集合) :- length(_集合,_要素数), for(1,N,_要素数), 組合せ(_集合,N,_部分集合). % ****** 組合せ / 3 *** 組合せ(X,1,[A]) :- member(A,X). 組合せ([A|Y],N,[A|X]) :- N > 1, M is N - 1, 組合せ(Y,M,X). 組合せ([_|Y],N,A) :- N > 1, 組合せ(Y,N,A). % % forループを使わない場合 % % ****** 全部分集合 / 2 ******* 全部分集合(_集合,_部分集合リスト) :- length(_集合,_要素数), 全部分集合(_要素数,_集合,_部分集合リスト). % ***** 全部分集合 / 3 ******* 全部分集合(0,_,[]) :- !. 全部分集合(N,_集合,LL) :- findall(L,組合せ(_集合,N,L),LL1), N_1 is N - 1, 全部分集合(N_1,_集合,LL2), append(LL1,LL2,LL). %%%%%% for / 3 %%%%%%%% for(S,N,E) :- E >= S, for_2(S,N,E). for(S,N,E) :- E < S, for_1(S,N,E). for_1(S,_,E) :- S < E,!,fail. for_1(N,N,E). for_1(S,N,E) :- S1 is S - 1,for_1(S1,N,E). for_2(S,_,E) :- S > E,!,fail. for_2(N,N,E). for_2(S,N,E) :- S1 is S + 1,for_2(S1,N,E). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/327 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/biBuP97v #   20人分の生徒の名前と、5教科(国語、数学、英語、理科、社会)の点数を入力し、 #   data.txtファイルに保存するプログラムを作成しなさい。( 保存ファイルの書式は、各自で設計すること) # '20人分の生徒の名前と、5教科(国語、数学、英語、理科、社会)の点数を入力し、data.txtファイルに保存する' :- '20人分の生徒の名前と、5教科(国語、数学、英語、理科、社会)の点数を入力し'(_生徒の名前と5教科の点数ならび), 'data.txtファイルに保存する'(_生徒の名前と5教科の点数ならび). '20人分の生徒の名前と、5教科(国語、数学、英語、理科、社会)の点数を入力し'(_生徒の名前と5教科の点数ならび) :- findall([_名前,_国語,_数学,_英語,_理科,_社会],( '20人分の', 生徒の名前と(_名前), '5教科の点数の入力し'(_国語,_数学,_英語,_理科,_社会)), _生徒の名前と5教科の点数ならび). '20人分の' :- length(_20人分,20), append(L0,[_|_],_20人分), length([_|L0],_何人目), writef('[%t人目/20人] ',[_何人目]). 生徒の名前と(_名前) :- write('生徒の名前 : '), readln([_名前]),!. '5教科の点数の入力し'(_国語,_数学,_英語,_理科,_社会) :- write('5教科の点数をカンマ区切りで入力してください : '), readln([_国語,_数学,_英語,_理科,_社会]),!. '5教科の点数の入力し'(_国語,_数学,_英語,_理科,_社会) :- write('入力が適切でありませんでした。再入力をお願いします。\n'), '5教科の点数の入力し'(_国語,_数学,_英語,_理科,_社会). 'data.txtファイルに保存する'(_生徒の名前と5教科の点数ならび) :- open('data.txt',write,Outstream), append(_,[_生徒の名前と5教科の点数|R],_生徒の名前と5教科の点数ならび), writef(Outstream,'%q,%t,%t,%t,%t,%t\n',_生徒の名前と5教科の点数), R = [], close(Outstream). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/763 # # ・授業:ネットワークプログラミング # ・問題文:以下のプログラムを改編し、ジャンケンゲームを作成せよ。勝敗判定は先に3勝したほうを勝ちとする。このときサーバーは2つクライアントから入力をうけ、同時に入力結果を返すこととする。 # ・プログラムURL:http://ideone.com/pGnkt # ・環境 # ・OS: Linux #  コンパイル:端末 gcc -o # ・言語:C # ・期限: 2011年07月19日15:30まで #  その他の制限: この課題に取り組んでいますが、サーバーとクライアントの間でうまく動作するものが作れません。よろしくお願いいたします。 # % % 参加者がそれぞれサーバとして振舞う ジャンケンゲーム % 条件として、サーバ上に表示し、それに対して文字入力応答ができること。 % % ジャンケン胴元によって勝負は制御される。参加者サーバに拳を何にするか % 質問して、その解答を取りまとめるのがジャンケン胴元の役割だ。 % % 胴元側述語 'ジャンケンゲームを作成せよ。勝敗判定は先に3勝したほうを勝ちとする'(_参加者勝数ならび) :- member([(_参加者,_),3],_参加者勝数ならび),!, writef('%t が3勝しました。勝者は %t です\n',[_参加者,_参加者]),!. 'ジャンケンゲームを作成せよ。勝敗判定は先に3勝したほうを勝ちとする'(_参加者勝数ならび) :- ジャンケン(_参加者勝数ならび1), ポン(_参加者勝数ならび1,_拳ならび), 判定(_拳ならび,_判定), 同報分生成(_参加者勝負ならび,_拳ならび,_同報文), 同報(_参加者勝負ならび,_同報文), 成績更新(_判定,_拳ならび,_参加者勝数ならび1,_参加者勝数ならび2), 'ジャンケンゲームを作成せよ。勝敗判定は先に3勝したほうを勝ちとする'(_参加者勝数ならび2). ジャンケン([]). ジャンケン([[(_参加者:_ポート)|_]|R]) :- (_参加者:_ポート) :: ジャンケン表示, ジャンケン(R). ポン([[_参加者|_]|R1],[_拳|R2]) :- (_参加者:_ポート) :: ポン入力(_拳), ポン(R1,R2). 判定(_拳ならび,あいこ) :- all(_拳ならび,V),!. 判定(_拳ならび,あいこ) :- member(グー,_拳ならび), member(パー,_拳ならび), member(チョキ,_拳ならび),!. 判定(_拳ならび,パー) :- member(グー,_拳ならび), member(パー,_拳ならび),!. 判定(_拳ならび,チョキ) :- member(パー,_拳ならび), member(チョキ,_拳ならび),!. 判定(_拳ならび,グー) :- member(チョキ,_拳ならび), member(グー,_拳ならび),!. 成績更新(あいこ,_,_参加者勝数ならび,_参加者勝数ならび) :- !. 成績更新(_拳,[_拳|R1],[[(_参加者,_ポート),_勝数1]|R2],[[(_参加者,_ポート),_勝数2]|R3]) :- _勝数2 is _勝数1 + 1, 成績更新(_拳,R1,R2,R3). 成績更新(_拳,[_拳2|R1],[L|R2],[L|R3]) :- \+(_拳 = _拳2), 成績更新(_拳,R1,R2,R3). 同報文生成(_参加者勝数ならび,_拳ならび,_同報文) :- 参加者付き拳ならび(_参加者勝数ならび,_拳ならび,_参加者付き拳ならび), concat_atom(_参加者付き拳ならび,',',_同報文). 参加者付き拳ならび([[],[],[]) :- !. 参加者付き拳ならび([[(_参加者:_)|_]|R1],[_拳|R2],[_参加者:_拳|R3]) :- 参加者付き拳ならび(R1,R2,R3). 同報([],_) :- !. 同報([[(_参加者:_ポート番号),_]|R1],_同報文) :- (_参加者:_ポート) :: writef('%t\n',[_同報文]), 同報(R1,_同報文). % 参加者(サーバ)側述語 ジャンケン表示 :- write('ジャン\n'), write('ケン\n'). ポン入力(_拳) :- write('ポン'), readln([_拳]),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/746 # # [1] 授業単元:プログラミング言語 # [2] 問題文(含コード&リンク):10人の学生の身長(m),体重(kg)のデータを入力し、 # 各学生の身長(m),BMI値を表示するプログラムを作成しなさい。 # '10人の学生の身長(m),体重(kg)のデータを入力し、各学生の身長(m),BMI値を表示する' :- '10人の学生の身長(m),体重(kg)のデータを入力し'(_10人の学生の身長体重ならび), '各学生の身長(m),BMI値を表示する'(_10人の学生の身長体重ならび). '10人の学生の身長(m),体重(kg)のデータを入力し'(_10人の学生の身長体重ならび) :- length(_10人の学生の身長体重ならび,10), findall([No,_身長,_体重],( append(Ln,[_|_],_10人の学生の身長体重ならび), length([_|Ln],No), writef('%t番目: 身長(m),体重(kg)を入力してください : '), readln([_身長,_体重])), _10人の学生の身長体重ならび),!. '各学生の身長(m),BMI値を表示する'([]). '各学生の身長(m),BMI値を表示する'([[No,_身長,_体重]|R]) :- 'BMI値の計算(_身長,_体重,_BMI値), writef('%t, 身長: %t, BMI値: %t\n',[No,_身長,_BMI値]), '各学生の身長(m),BMI値を表示する'(R). 'BMI値の計算'(_身長,_体重,_BMI値) :- _BMI値 is _体重 / (_身長 ^ 2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/586 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): http://codepad.org/3dkRTmjJ # # 生徒の氏名と身長と体重を列挙したデータファイル wh-list.dat がある。 # このデータを読み込んでBMI値を計算し、BMI値が大きいもの順に、その人の # BMI値および肥満か否かを列挙するプログラムkadai13-1.cを書きなさい。 # ただし、wh-list.datに列挙される人数はプログラム開発時点では全く分から # ないものとする。 # # ヒント: # ○何をしなければならないかを大まかに書き下してみよう。 #  1. ファイルのオープン(これに先立ってファイル名を取得する必要がある) #  2. データ構造の用意(これにはファイルにかかれたデータ数を知る必要がありますね。どうやって知るべきか考えよう) #  3.データの読み込み #  4.BMIの算出 #  5. BMIの大きい者順に並べ替える(バブルソートを使おう。これが何者か知らない人は「バブルソート」で検索されたい) #  6. 画面表示 # # ○BMIとは? # BMIは次のようにして計算されるものとする。 # BMI値=体重(キログラム)÷(身長(メートル))^2 # '^2'は二乗を意味する。 # このBMI値が25を越えると、肥満とみなされる。 # # ○ファイルポインターがファイルの中間もしくは終わりをさしている時、これをファイルの先頭に戻す関数があります。 # rewind(FILE *stream); # # ○wh-list.dat の中身は以下の通りで、氏名 身長(cm) 体重(kg)が列挙されている。 # yamada 157 62.5 # tanaka 180 45.1 # yoneda 190 50.5 # yamashita 210 80.5 # toyama 140 80 # .... # # ○例えば画面表示は # toyama BMI=40.816326 himan # nagashima BMI=29.551020 himan # yamashita BMI=27.777779 himan # takenaka BMI=27.716263 himan # . # 中略 # . # nakano BMI=23.179012 # yamashita BMI=18.253969 # . # . # # 等と表示されるものとする。 # '生徒の氏名と身長と体重を列挙したデータファイル wh-list.dat がある。このデータを読み込んでBMI値を計算し、BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙する' :- user_parameters([_ファイル名]), 'ファイルのオープン(これに先立ってファイル名を取得する必要がある)'(_ファイル名,Instream), データの読み込み(Instream,Lines), 'BMIの算出と判定'(Lines,_BMIと判定ならび), 'BMIの大きい者順に並べ替える'(_BMIと判定ならび,_降順に整列したBMIと判定ならび), 画面表示(_降順に整列したBMIならび),!. 'ファイルのオープン(これに先立ってファイル名を取得する必要がある)'(_ファイル名,Instream) :- open(_ファイル名,read,Instream),!. データの読み込み(Instream,Lines) :- get_lines(Instream,Lines),!. 'BMIの算出と判定'([],[]) :- !. 'BMIの算出と判定'([Line|R1],[[_BMI,_名前,_判定]|R2]) :- split(Line,[' '],[_名前,_身長単位センチメートル,_体重]), _身長単位メートル is _身長単位センチメートル / 100, 'BMI値=体重(キログラム)÷(身長(メートル))^2'(_体重,_身長単位メートル,_BMI値), 'BMI値が25を越えると、肥満とみなされる'(_BMI値,_判定), 'BMIの算出と判定'(R1,R2). 'BMI値=体重(キログラム)÷(身長(メートル))^2'(_体重,_身長,_BMI値) :- _BMI値 is _体重 * _身長 ^ 2. 'BMI値が25を越えると、肥満とみなされる'(_BMI値,肥満) :- _BMI値 > 25,!. 'BMI値が25を越えると、肥満とみなされる'(_BMI値,''). 'BMIの大きい者順に並べ替える'(_BMIならび,_降順に整列したBMIならび) :- バブルソート(_BMIならび,_昇順に整列したBMIならび), reverse(_昇順に整列したBMIならび,_降順に整列したBMIならび). バブルソート(_対象ならび,_整列済みならび) :- 交換(_対象ならび,_対象ならびの一), !, バブルソート(_対象ならびの一,_整列済みならび). バブルソート(_整列済みならび,_整列済みならび). 交換([],[]) :- !,fail. 交換([A,B|R],[B,A|R]) :- A @> B,!. 交換([A|R1],[A|R2]) :- 交換(R1,R2). 画面表示(_降順に整列したBMIならび) :- append(_,[[_BMI,_名前,_判定]|R],_降順に整列したBMIならび), writef('%t %t %t\n',[_名前,_BMI,_判定]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/347 # # [1] 授業単元:整列処理 # [2] 問題文(含コード&リンク): http://codepad.org/afHWYPLF # 問題が3問あります。長いので問題文もリンク先に書かせていただきました。 # # # # 【問題2】 # クイックソート法の特性を調べたい。同一の数列について、クイックソートプログラムの実行中に行われる # (1)比較の回数、(2)交換の回数を計数し、次にバブルソートプログラムの実行中に行われる # (1)比較の回数、(2)交換の回数を計数して比較せよ。また、バブルソート法よりクイックソート法の方が # 比較と交換の回数が少ない理由を考察せよ。ただし、数列はrand関数を用いて生成せよ。データの個数が、 # 20個、40個、60個、80個、100個の5つの場合について、比較と交換の回数を計数する。 # #    計数結果の出力形式 #    <クイックソート法> #     データ数:20個 #     比較回数:xxxx回 #     交換回数:xxxx回 # #     データ数:40個 #     比較回数:xxxx回 #     交換回数:xxxx回 #      ・ #      ・ #      ・ #      ・ #    <バブルソート法> #     データ数:20個 #     比較回数:xxxx回 #     交換回数:xxxx回 # #     データ数:40個 #     比較回数:xxxx回 #     交換回数:xxxx回 #      ・ #      ・ #      ・ #      ・ # # レポートには以下のものを添付する事。 # (1)回数を計数するプログラムを加えたバブルソートプログラムと、それを実行するmain関数のプログラムリスト # (2)回数を計数するプログラムを加えたクイックソートプログラムと、それを実行するmain関数のプログラムリスト # (3)出力形式に基づいた両プログラムの計数結果 # (4)バブルソート法よりクイックソート法の比較、交換の回数が少ない理由 # # rand関数の使用例 # #include # #include # int main(void) # { # int i,n,ran,sum; # srand(time(NULL)); # printf("Number of trials:"); # scanf("%d",&n); # sum=0; # for(i=0;i= B, 分割(A,R1,LP_1,LP_2,_比較回数2,_移動回数2), _比較回数1 is _比較回数2 + 1, _移動回数1 is _移動回数2 + 1,!. 分割(A,[B|R1],LP_1,[B|LP_2],_比較回数1,_移動回数1) :- A @< B, 分割(A,R1,LP_1,LP_2,_比較回数2,_移動回数2), _比較回数1 is _比較回数2 + 2, _移動回数1 is _移動回数2 + 1,!. 結合([],Y,Y,1,1) :- !. 結合([U|X],Y,[U|Z],_比較回数,_移動回数1) :- 結合(X,Y,Z,_比較回数,_移動回数2), _移動回数1 is _移動回数2 + 1,!. 'バブルソートの比較・移動回数'(_対象ならび,_整列済みならび,_比較回数,_交換回数) :- 交換(_対象ならび,_対象ならびの一,_比較回数1,_交換回数1),!, バブルソート(_対象ならびの一,_整列済みならび,_比較回数2,_交換回数2), _比較回数 is _比較回数1 + _比較回数2, _交換回数 is _交換回数1 + _交換回数2,!. 'バブルソートの比較・移動回数'(_整列済みならび,_整列済みならび,_比較回数,0) :- length(_整列済みならび,_比較回数),!. 交換([A,B|R],[B,A|R],1,1) :- A @> B,!. 交換([A|R1],[A|R2],_比較回数1,_交換回数) :- 交換(R1,R2,_比較回数2,_交換回数), _比較回数1 is _比較回数2 + 2,!. 交換([],[],_,_) :- !,fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/410 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): http://codepad.org/ZtuWkxys # # //決まった形式のテキストを9×9の配列に1~9の数字の情報を入力する関数aa_readを作りたいです。 # //たとえば1を読み込めばビットで000000001を、4を読み込めば000001000を、 # //つまりビットの1の位置を数字に対応させています。 # //そして「.」を読み込めば特別に111111111を構造体aa_tのcellに入力します。 # //r,cは行と列に対応しています。下のテキストファイルの内容と、入力する盤面の位置は対応させます。 # //読み込む形式はテキストファイルで、内容はたとえば下のようなものです。 # //123|..1|43. # //4..|24.|31. # //..7|7.6|... # //---+---+--- # //...|..8|5.. # //5.1|1..|1.. # //5.9|2..|3.4 # //---+---+--- # //41.|..1|1.1 # //..5|.3.|4.. # //2..|...|..7 # //テキストファイルから1文字ずつfgetcで走査していき数字のみ拾って、 # //aa_tのcellの正しい位置にその情報を入れる、という動作をさせたいのですが、 # //どうもうまくいきません。よろしくお願いします # '決まった形式のテキストを9×9の配列に1~9の数字の情報を入力する'(_テキストファイル,LL) :- length(LL,9), findall(L,( length(L,9), append(_,[L|_],LL)), LL), open(_テキストファイル,read,Instream), '数字のみ拾って、cellの正しい位置にその情報を入れる'(Instream,LL), close(Instream). '数字のみ拾って、cellの正しい位置にその情報を入れる'(Instream,LL) :- findall(L,( append(_,[L|_],LL), findall(_数値ビット表現,( append(_,[_|_],L), '数字かドットを読み込む'(Instream,_数値ビット表現)), L)), LL). '数字かドットを読み込む'(Instream,_数値ビット表現) :- at_end_stream(Instream),!, fail. '数字かドットを読み込む'(Instream,_数値ビット表現) :- get_char(Instream,_数字かドット), 数値ビット表現(_数字かドット,_数値ビット表現),!. '数字かドットを読み込む'(Instream,_数値ビット表現) :- '数字かドットを読み込む'(Instream,_数値ビット表現). 数値ビット表現('0',0). 数値ビット表現('1',1). 数値ビット表現('2',2). 数値ビット表現('3',4). 数値ビット表現('4',8). 数値ビット表現('5',16). 数値ビット表現('6',32). 数値ビット表現('7',64). 数値ビット表現('8',128). 数値ビット表現('9',256). 数値ビット表現('.',511). 数値ビット表現述語の生成 :- append(_,[A|R],['0b0','0b1','0b10','0b100','0b1000','0b10000','0b100000','0b1000000','0b10000000','0b100000000','0b111111111']), atom_to_term(A,N,_), sub_atom(A,2,Len,0,B), wr('数値ビット表現(''%t'',%t).\n',[Len,N]), R =[]. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/483 # # 全校学生健康診断表で # 身長の高い人50人を選ぶ場合 # select 学生ID, 学生名, 学生身長 from 健康診断表 order by 学生身長 desc limit 50 # とかでいいと思いますが # その次の50人を選ぶ場合はどうしたらいいのでしょうか? # # 身長の高い人50人づつ選ぶ場合 :- findall([_学生身長,_学生ID,_学生名],( 健康診断表(_学生ID,_学生名,_学生身長)), LL1), sort(LL1,LL2), reverse(LL2,LL3), 身長の高い人50人を選ぶ(LL3). 身長の高い人50人を選ぶ(LL) :- length(LL0,50), append(LL0,LL2,LL), append(_,[[_学生身長,_学生ID,_学生名]|R],LL0), writef('%t,%t,%t\n',[_学生ID,_学生名,_学生身長]), R = []. 身長の高い人50人を選ぶ(LL) :- length(LL0,50), append(LL0,LL2,LL), 身長の高い人50人を選ぶ(LL2). 身長の高い人50人を選ぶ(LL) :- append(_,[[_学生身長,_学生ID,_学生名]|R],LL), writef('%t,%t,%t\n',[_学生ID,_学生名,_学生身長]), R = []. 身長の高い人50人を選ぶ([]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/347 # # [1] 授業単元:整列処理 # [2] 問題文(含コード&リンク): http://codepad.org/afHWYPLF # 問題が3問あります。長いので問題文もリンク先に書かせていただきました。 # # # # 【問題2】 # クイックソート法の特性を調べたい。同一の数列について、クイックソートプログラムの実行中に行われる # (1)比較の回数、(2)交換の回数を計数し、次にバブルソートプログラムの実行中に行われる # (1)比較の回数、(2)交換の回数を計数して比較せよ。また、バブルソート法よりクイックソート法の方が # 比較と交換の回数が少ない理由を考察せよ。ただし、数列はrand関数を用いて生成せよ。データの個数が、 # 20個、40個、60個、80個、100個の5つの場合について、比較と交換の回数を計数する。 # #    計数結果の出力形式 #    <クイックソート法> #     データ数:20個 #     比較回数:xxxx回 #     交換回数:xxxx回 # #     データ数:40個 #     比較回数:xxxx回 #     交換回数:xxxx回 #      ・ #      ・ #      ・ #      ・ #    <バブルソート法> #     データ数:20個 #     比較回数:xxxx回 #     交換回数:xxxx回 # #     データ数:40個 #     比較回数:xxxx回 #     交換回数:xxxx回 #      ・ #      ・ #      ・ #      ・ # # レポートには以下のものを添付する事。 # (1)回数を計数するプログラムを加えたバブルソートプログラムと、それを実行するmain関数のプログラムリスト # (2)回数を計数するプログラムを加えたクイックソートプログラムと、それを実行するmain関数のプログラムリスト # (3)出力形式に基づいた両プログラムの計数結果 # (4)バブルソート法よりクイックソート法の比較、交換の回数が少ない理由 # # rand関数の使用例 # #include # #include # int main(void) # { # int i,n,ran,sum; # srand(time(NULL)); # printf("Number of trials:"); # scanf("%d",&n); # sum=0; # for(i=0;i= B, 分割(A,R1,LP_1,LP_2,_比較回数2,_移動回数2), _比較回数1 is _比較回数2 + 1, _移動回数1 is _移動回数2 + 1,!. 分割(A,[B|R1],LP_1,[B|LP_2],_比較回数1,_移動回数1) :- A @< B, 分割(A,R1,LP_1,LP_2,_比較回数2,_移動回数2), _比較回数1 is _比較回数2 + 2, _移動回数1 is _移動回数2 + 1,!. 結合([],Y,Y,1,1) :- !. 結合([U|X],Y,[U|Z],_比較回数,_移動回数1) :- 結合(X,Y,Z,_比較回数,_移動回数2), _移動回数1 is _移動回数2 + 1,!. 'バブルソートの比較・移動回数'(_対象ならび,_整列済みならび,_比較回数,_交換回数) :- 交換(_対象ならび,_対象ならびの一,_比較回数1,_交換回数1),!, バブルソート(_対象ならびの一,_整列済みならび,_比較回数2,_交換回数2), _比較回数 is _比較回数1 + _比較回数2, _交換回数 is _交換回数1 + _交換回数2,!. 'バブルソートの比較・移動回数'(_整列済みならび,_整列済みならび,_比較回数,0) :- length(_整列済みならび,_比較回数),!. 交換([A,B|R],[B,A|R],1,1) :- A @> B,!. 交換([A|R1],[A|R2],_比較回数1,_交換回数) :- 交換(R1,R2,_比較回数2,_交換回数), _比較回数1 is _比較回数2 + 2,!. 交換([],[],_,_) :- !,fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/305 # # ../test/read.cgi/tech/1308749241/304に加えてもう1問お願いします。 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): # 次に示す個人情報を構造体として作成し、 # それぞれの科目の平均点とそれぞれの学生の平均点を # 構造体のポインタを用いて求めなさい。 # 学籍番号 英語 数学 物理 # 1 81 24 63 # 2 28 15 7 # 3 89 92 88 # 4 32 88 66 # 5 92 46 81 # -1 0 0 0 # 学籍番号英語数学物理 #  [3.1] OS:windows #  [3.2] コンパイラ名とバージョン:cygwin #  [3.3] 言語: C # [4] 期限: 2011/7/6 # [5] その他の制限: # 現在ポインタを習っているところです。 # 出来るだけ簡単に書いてもらえると助かります。 # '個人情報を構造体として作成し、それぞれの科目の平均点とそれぞれの学生の平均点を構造体のポインタを用いて求める'(_科目の平均点ならび,_学生の平均点ならび) :- 個人情報を登録する, 'それぞれの科目の平均点とそれぞれの学生の平均点を求める'(_科目の平均点ならび,_学生の平均点ならび). 個人情報を登録する :- repeat, 個人情報を得る(_学籍番号,_英語,_数学,_物理), 個人情報を登録する(_学籍番号,_英語,_数学,_物理). _学籍番号 = -1,!. 個人情報を得る(_学籍番号,_英語,_数学,_物理) :- write('学籍番号 英語 数学 物理 を空白区切りで入力してください '), readln([_学籍番号,_英語,_数学,_物理]). 個人情報を登録する(-1,_,_,_) :- !. 個人情報を登録する(_学籍番号,_英語,_数学,_物理) :- assertz(個人成績(学籍番号(_学籍番号),英語(_英語),数学(_数学),物理(_物理)). 'それぞれの科目の平均点とそれぞれの学生の平均点を求める'(_科目の平均点ならび,_学生の平均点ならび) :- それぞれの科目の平均点を求める(_科目の平均点ならび), それぞれの学生の平均点を求める(_学生の平均点ならび). それぞれの科目の平均点を求める(_科目の平均点ならび) :- findall([_科目,_科目の平均点],( append(_,[_科目|R],[英語,数学,物理]), 科目の平均点(_科目,_科目の平均点)), _科目の平均点ならび). 科目の平均点(_科目,_科目平均点) :- findavg(_成績,( P =.. [科目,_成績], 個人成績(学籍番号(_),英語(_英語),数学(_数学),物理(_物理)), append(_,[P|_],[英語(_英語),数学(_数学),物理(_物理)])), _科目の平均点). それぞれの学生の平均点を求める(_学生の平均点ならび) :- findall([_学籍番号,_学生の平均点],( 個人成績(学籍番号(_),英語(_英語),数学(_数学),物理(_物理)), _学生の平均点 is (_英語 + _数学 + _物理) / 3), _学生の平均点ならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/131 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):http://codepad.org/EEw71Jn2 # # [問1] 長さ100のstruct rocker型の配列 struct rocker Rockers[100]; を定義して、この中の所定の数のロッカーに乱数を格納するプログラムを以下の手続きにしたがって作りなさい。 # # ○ データ構造として次の構造体を用意する。 # struct rocker { # int data; //保存するデータ # char name[20]; //ロッカーのラベル # }; # # ○ main関数の中身が次のようになるものとする。 # int main() { # int N; # struct rocker Rockers[100]; # scanf("%d", &N); # set_rockers(Rockers, N); # display_rockers(Rockers, N); # } # # 上記main関数の中の # void set_rockers(struct rocker rockers[], int length); //0番目からlength-1番目のロッカーにラベル(name)と乱数(data)を格納する関数 # および # void display_rockers(struct rocker rockers[], int length);//0番目からlength-1番目のロッカーのname, dataを全て表示する関数。 # を次の仕様を元に定義し、プログラムを完成させなさい。 # # set_rockers()の仕様: #  例えば0番目のロッカーには # rocker[0].name が "rocker-0"という文字列がラベルとしてセットされ、 # rocker[0].data に乱数(例:1804289383)がセットされます。 # # ラベルをセットするにはsprintf()を使用すると便利です。 #  sprintf()は例えば #  char str[100]; #  int i = 1; # sprintf(str, "rocker-%d", i); # とすると、strには"rocker-1"がセットされます。 # #  乱数はあらかじめ用意されている関数 int rand()を使用すると得ることが出来ます。ただし # #include # が必要です。rand()は呼び出すたびに全く異なる数を返してきます。なお、rand()を使う前にsrand(0)を実行するようにしてください。 # # display_rockers()の仕様: # printf("%s : %d\n", rockers[i].name, rockers[i].data); # をlength個分繰り返してください。 # # # gcc kadai11-1.c # ./a.out # 3 # rocker-0 : 1804289383 # rocker-1 : 846930886 # rocker-2 : 1681692777 # '長さ100のならびを定義して、この中の所定の数のロッカーに乱数を格納する' :- 長さ100のならびを定義して, 所定の数を得る(_数), length(Ln,_数), ロッカー位置と格納する値を乱数で決める(Ln). 長さ100のならびを定義して :- abolish(ロッカー/2), ロッカーを生成してロッカー番号を振る(1). ロッカーを生成してロッカー番号を振る(N) :- N > 100,!. ロッカーを生成してロッカー番号を振る(N) :- assertz(ロッカー(N,_)), N2 is N + 1, ロッカーを生成してロッカー番号を振る(N2). 所定の数を得る(_数) :- write('1以上100以下の数を入力しなさい : '), get_line(Line), 所定の数診断(Line,_数),!. 所定の数を得る(_数) :- 所定の数を得る(_数). 所定の数診断(Line,_数) :- atom_to_term(Line,_数,_), integer(_数), _数 >= 1, _数 =< 100,!. 所定の数診断(Line,_) :- writef('入力された%tからは1以上100以下の数を得られませんでした。再入力をお願いします\n',[Line]), fail. ロッカー位置と格納する値を乱数で決める([]) :- !. ロッカー位置と格納する値を乱数で決める([_|Ln]) :- '1から100の範囲のランダム値を得る'(_ロッカー番号), 指定位置のロッカーが空だったら(_ロッカー番号), ロッカーにランダム値を格納する(_ロッカー番号), ロッカー位置と格納する値を乱数で決める(Ln). ロッカー位置と格納する値を乱数で決める([_|Ln]) :- ロッカーが既に格納済みだったらもう一度ロッカーを捜す([_|Ln]). '1から100の範囲のランダム値を得る'(_ランダム値) :- _ランダム値 is random(100) + 1. 指定位置のロッカーが空だったら(_ロッカー番号) :- ロッカー(_ロッカー番号,_ロッカー), var(_ロッカー),!. ロッカーにランダム値を格納する(_ロッカー番号) :- _ロッカー is random(0x100000000), retract(ロッカー(_ロッカー番号,_)), assertz(ロッカー(_ロッカー番号,_ロッカー)),!. ロッカーが既に格納済みだったらもう一度ロッカーを捜す([_|Ln]) :- ロッカー位置と格納する値を乱数で決める([_|Ln]). ロッカーの値を更新する(_ロッカー番号,_ロッカー) :- retract(ロッカー(_ロッカー番号,_)), assertz(ロッカー(_ロッカー番号,_ロッカー)),!. ロッカーの値を新しいランダム値に更新する(_ロッカー番号) :- ロッカーにランダム値を格納する(_ロッカー番号). ロッカーの値を新しいランダム値に更新する :- '1から100の範囲のランダム値を得る'(_ロッカー番号), ロッカーの値を新しいランダム値に更新する(_ロッカー番号). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/196 # # [1] 授業単元:システムコール # [2] 問題文(含コード&リンク):http://codepad.org/XAPpvt1n # # コマンドライン引数でファイル名をn個指定し、 ファイル1からファイルn-1まで # の内容を連結し、 その結果をファイルnに書き込むプログラムを書け。 # ただし、標準入力と標準出力を当該のファイルにリダイレクトした状態で # UNIX標準コマンドを実行することで行うこと。 入力ファイルに関して # エラーが発生した場合、 そこで処理を終了せず、残りのファイルの処理を # 続けること。 ただし、以下のオプションをとることができるようにせよ。 # # -a # 書き込む際に、 ` を *' に、 ~ を *^ に、 それぞれ変換する。 # -b # 書き込む際に、 { を *[ に、 } を *] に、 # | (縦棒)を *\ (アスタリスク バックスラッシュ)に、 それぞれ変換する。 # -l # 書き込む際に、 アルファベット小文字を、 対応する大文字の # 前に * (アスタリスク)を添えた二文字に変換する。 # # 注意1 # ファイルをcloseした後に同名のファイルをopenすると、セキュリティ上の # 問題が生じる。出力のリダイレクトで、そのようなことにならないよう # 注意してプログラミングすること 'コマンドライン引数でファイル名をn個指定し、ファイル1からファイルn-1までの内容を連結し、その結果をファイルnに書き込む' :- 'オプションならび・ファイル名ならび・出力ファイル名の取得'(_オプションならび,_ファイル名ならび,_出力ファイル名), フィルタの定義(_オプションならび), 'ファイル1からファイルn-1までの内容を連結し、その結果をファイルnに書き込む'(_ファイル名ならび,_出力ファイル名). 'オプションならび・ファイル名ならび・出力ファイル名の取得'(_オプションならび,_ファイル名ならび,_出力ファイル名) :- user_parameters(_ユーザパラメータ), append(_オプションまたはファイル名ならび,[_出力ファイル名],_ユーザパラメータ), オプションとファイル名の分離(_オプションまたはファイル名ならび,_オプションならび,_ファイル名ならび),!. オプションとファイル名の分離([],[],[]) :- !. オプションとファイル名の分離([_オプション指定|R1],[_オプション指定|R2],_ファイル名ならび) :- sub_atom(_オプション指定,0,1,_,'-'), オプションとファイル名の分離(R1,R2,_ファイル名ならび), オプションとファイル名の分離([_ファイル名|R1],R2,[_ファイル名|R3]) :- \+(sub_atom(_オプション指定,0,1,_,'-')), オプションとファイル名の分離(R1,R2,R3),!. 'ファイル1からファイルn-1までの内容を連結し、その結果をファイルnに書き込む'(_ファイル名ならび,_出力ファイル名) :- open(_出力フィル名,write,Outstream), 順にファイルを呼び出し指定された変更をしながら出力する(Outstream,_ファイル名ならび), close(Outstream). 順にファイルを呼び出し指定された変更をしながら出力する(Outstream,[]) :- !. 順にファイルを呼び出し指定された変更をしながら出力する(Outstream,[_ファイル名|R]) :- open(_ファイル名,read,Instream), フィルタを通しながら出力する(Instream,Outstream), close(Instream), 順にファイルを呼び出し指定された変更をしながら出力する(Outstream,R). フィルタを通しながら出力する(Instream,Outstream) :- at_end_of_stream(Instream),!. フィルタを通しながら出力する(Instream,Outstream) :- get_char(Instream,_文字), フィルタ(_文字,_変換された文字列), writef(Outstream,'%t',[_変換された文字列]), フィルタを通しながら出力する(Instream,Outstream). フィルタの定義(_オプションならび) :- member('-a',_オプションならび), asserta((フィルタ('`','*''') :- !)), asserta((フィルタ('~','*^') :- !)), fail. フィルタの定義(_オプションならび) :- member('-b',_オプションならび), asserta((フィルタ('{','*{') :- !)), asserta((フィルタ('}','*}') :- !)), fail. フィルタの定義(_オプションならび) :- member('-l',_オプションならび), asserta((フィルタ(A,B) :- A @>= 'a', A @=< 'z', to_upper(A,A1), concat_atom(A1,B),!)), fail. フィルタの定義(_) :- assertz((フィルタ(A,A))). % 以下のサイトは # [1]授業単元: 関数入門 # [2]問題文: # 100点満点の試験を入力して、5段階評価を返す関数 hyouka を作成せよ。 # 5段階評価は、100〜90までは5、89〜80は4、79〜70は3、69〜60は2、60未満は1とする。 # この関数を利用して、学生10人の試験の点数を入力して、 # それぞれの5段階評価を求め一覧表を表示するプログラム quality.cpp を作成せよ。 '学生10人の試験の点数を入力して、それぞれの5段階評価を求め一覧表を表示する' :- '学生10人の試験の点数を入力して'(_10人の試験の点数), それぞれの5段階評価を求め(_10人の試験の点数,_評価ならび), 一覧表を表示する(_評価ならび). '学生10人の試験の点数を入力して'(_10人の試験の点数) :- length(_10人の試験の点数,10), 学生番号・点数を入力(_10人の試験の点数). 学生番号・点数を入力(_10人の試験の点数) :- findall([_学生番号,_点数], append(_,[_|_],_10人の試験の点数), 学生番号を入力(_学生番号), 点数を入力(_点数)), _10人の試験の点数). 学生番号を入力(_学生番号) :- write('学生番号を入力してください : '), get_line(_学生番号). 点数を入力(_点数) :- get_line(Line), 点数入力診断(Line,_点数),!. 点数を入力(_点数) :- 点数を入力(_点数). 点数入力診断(Line,_点数) :- atom_to_term(Line,_点数,_), integer(_点数), _点数 >= 0, _点数 =< 100,!. 点数入力診断(Line,_点数) :- writef('入力された%tから点数が得られません。再入力をお願いします。[Line]), fail. それぞれの5段階評価を求め(_10人の試験の点数,_評価ならび) :- findall([_学生番号,_試験の点数,_5段階評価],(           append(_,[[_学生番号,_試験の点数]|_],_10人の試験の点数), '5段階評価'(__100点満点の試験の点数,_5段階評価)), _評価ならび). '5段階評価'(_試験の点数,5) :- '5段階評価は、100〜90までは5'(_試験の点数). '5段階評価'(_試験の点数,4) :- '5段階評価は、89〜80は4'(_試験の点数). '5段階評価'(_試験の点数,3) :- '5段階評価は、79〜70は3'(_試験の点数). '5段階評価'(_試験の点数,2) :- '5段階評価は、69〜60は2'(_試験の点数). '5段階評価'(_試験の点数,1) :- '5段階評価は、60点未満は1'(_試験の点数). '5段階評価は、100〜90までは5'(_試験の点数) :- _試験の点数 >= 90, _試験の点数 =< 100,!. '5段階評価は、89〜80は4'(_試験の点数) :- _試験の点数 >= 80, _試験の点数 =< 89,!. '5段階評価は、79〜70は3'(_試験の点数) :- _試験の点数 >= 70, _試験の点数 =< 79,!. '5段階評価は、69〜60は2'(_試験の点数) :- _試験の点数 >= 60, _試験の点数 =< 69,!. '5段階評価は、60点未満は1'(_試験の点数) :- _試験の点数 < 60. 一覧表を表示する(_評価ならび) :- 見出し表示, それぞれの評価を表示する(_評価ならび). 見出し表示 :- writef('%12r %12r %12r\n',[学生番号,試験成績,'5段階の評価']). それぞれの評価を表示する([]). それぞれの評価を表示する([[_学生番号,_試験の成績,_5段階の評価]|R]) :- writef('%12r %12r %12r\n',[_学生番号,_試験の成績,_5段階の評価]), それぞれの評価を表示する(R). % 以下のサイトは # [1] 授業単元: プログラミング # [2] rand()を使い、モンテカルロ法により円周率を求めるプログラムを作る。 #    具体的な手順として #     ・0から1の乱数2つをペアにし、片方をx座標、もう1方をyとする。 #     ・乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える #     ・1:π/4 = n:r から π = 4*r/n  #      この式に従いπを計算する。 #    参考として #     ・rand()でx座標とy座標を求める #       x=(double)rand()/RAND_MAX; # y=(double)rand()/RAND_MAX; # ・その点の原点からの距離rを計算する #       r=x*x+y*y #     ・For分で点の発生を繰り返す #     ・点が円の内側か外側かを判定し、内側ならカウンタの変数を1増やす #      (演算子++を使う) #  っていうのが問題です。 試行回数(1000). モンテカルロ法により円周率を求める(_円周率) :- 試行回数(_n), '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(_n,_x,_y,_r), _円周率 is 4 * _r / _n. '0から1の乱数2つをペアにし、片方をx座標、もう1方をyとする'(_x,_y) :- _x is rand(1001) / 1000, _y is rand(1001) / 1000,!. '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(0,0) :- !. '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(_n,_r) :- '0から1の乱数2つをペアにし、片方をx座標、もう1方をyとする'(_x,_y), ピタゴラスの定理を使って座標点が円の内部であるか判定する(_x,_y), _n_1 is _n - 1, '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(_n_1,_r_1), _r is _r_1 + 1,!. '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(_n,_r) :- _n_1 is _n - 1, '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(_n_1,_r). ピタゴラスの定理を使って座標点が円の内部であるか判定する(_x,_y) :- 1.0 >= _x * _x + _y * _Y. % 以下のサイトは # [1] 授業単元: 情報処理 # [2] 問題文(含コード&リンク): # テキストファイルの入力に対して行の文字数の短い順に並べて出力しなさい。 # 空行は出力しないこと。 # # 例) # abcd # abcdef # ab # abc # # 出力結果: # ab # abc # abcd # abcdef 'テキストファイルの入力に対して行の文字数の短い順に並べて出力しなさい。空行は出力しないこと'(_ファイル) :- テキストファイルの入力(_ファイル,_テキストならび), 行の文字数と行位置のならびを生成する(_テキストならび,_行の文字数と行位置のならび), 短い順に並べて(_行の文字数と行位置のならび,_整列した行の文字数と行位置のならび), 出力する(_テキストならび,_整列した行の文字数と行位置のならび),!. テキストファイルの入力(_ファイル,_テキストならび) :- get_lines(_ファイル,_テキストならび). 行の文字数と行位置のならびを生成する(_テキストならび,_行の文字数と行位置のならび) :- findall([_文字数,_行位置],( テキスト行を取り出し文字数と行位置を得る(_テキストならび,_文字数,_行位置)), _行の文字数と行位置のならび). テキスト行を取り出し文字数と行位置を得る(_テキストならび,_文字数,_行位置) :- append(L0,[_テキスト行|_],_テキストならび), subatom(_テキスト行,0,_文字数,0,_テキスト行), 行位置はL0の要素数よりひとつ大きな数(L0,_行位置). 行位置はL0の要素数よりひとつ大きな数(L0,_行位置) :- length([_|L0],_行位置). 短い順に並べて(_行の文字数と行位置のならび,_整列した行の文字数と行位置のならび) :- sort(_行の文字数と行位置のならび,_整列した行の文字数と行位置のならび). 出力する(_テキストならび,_整列した行の文字数と行位置のならび) :- 整列した行から順に行位置を取り出し(_整列した行の文字数と行位置のならび,_行位置,_残り行ならび), 行位置からテキスト行を取り出す(_行位置,_テキストならび,_テキスト行), writef('%t\n',[_テキスト行]), _残り行ならび = []. 整列した行から順に行位置を取り出し(_整列した行の文字数と行位置のならび,_行位置,_残り行ならび) :- append(_,[[_,_行位置]|_残り行ならび],_整列した行の文字数と行位置のならび). 行位置からテキスト行を取り出す(_行位置,_テキストならび,_テキスト行) :- nth1(_行位置,_テキストならび,_テキスト行). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/883 # # あと、もうひとつ問題 # 2.201003121(10進数9桁)、性別(男:1、女:2)、年令(未成年:0,成年:1,高齢:2,後期高齢:3)、 # 職業(無:0、有:1)で個々人が16分類される。それぞれを数字(コード)で入力させ、 # その人の状態を一旦ディスプレイに表示し、if文を使って、自然な文章で最後に表示するプログラムを作れ # 'それぞれを数字(コード)で入力させ、その人の状態を一旦ディスプレイに表示し、if文を使って、自然な文章で最後に表示する' :- 'それぞれを数字(コード)で入力させ'(_個人ID,_分類コード), 分類コードの生成([_分類コード,_性別,_年齢,_職業],_分類表示), writef('%t\n',[_分類表示]), 自然な文章で最後に表示する(_個人ID,_性別,_年齢,_職業). 'それぞれを数字(コード)で入力させ'(_個人ID,_分類コード) :- 個人IDの入力(_個人ID), 分類コードの入力(_分類コード),!. 個人IDの入力(_個人ID) :- write('個人IDを入力してください : '), get_line(Line), 個人ID入力診断(Line,_個人ID),!. 個人IDの入力(_個人ID) :- 個人IDの入力(_個人ID). 個人ID入力診断(Line,_個人ID) :- atom_to_term(Line,_個人ID,_), integer(_個人ID), _個人ID >= 100000000, _個人ID =< 999999999,!. 個人ID入力診断(Line,_個人ID) :- writef('入力された %t からは適切な個人IDが得られませんでした。再入力をお願いします。\n',[Line]), fail. 分類コードの入力(_分類コード) :- 分類コード表示, write('分類コードを入力してください : '), get_line(Line), 分類コード入力診断(Line,_分類コード),!. 分類コードの入力(_分類コード) :- 分類コードの入力(_分類コード). 分類コード入力診断(Line,_分類コード) :- atom_to_term(Line,_分類コード,_), integer(_分類コード), _分類コード >= 0, _分類コード =< 15,!. 分類コード入力診断(Line,_分類コード) :- writef('入力された %t からは分類コードが得られませんでした。再入力をお願いします。\n',[Line]), fail. 分類コードの生成([_分類コード,_性別,_年齢,_職業],_分類表示) :- append(L01,[_性別|_],['男','女']), append(L02,[_年齢|_],['未成年','青年','高齢者','後期高齢者']), append(L03,[_職業|_],['無','有']), length(L01,N1), length(L02,N2), length(L03,N3), _分類コード is N1 * 8 + N2 * 2 + N3, concat_atom(['分類コード ',_分類コード,' [','性別:',_性別,' ','年齢: ',_年齢,' ','職業: ',_職業,']'],_分類表示). 分類コード表示 :- 分類コードの生成([_分類コード,_性別,_年齢,_職業],_分類表示), writef('%t\n',[_分類表示]), fail. 分類コード表示. 自然な文章で最後に表示する(_個人ID,_性別,_年齢,_職業) :- writef('個人IDが%tの人は、%tで',[_個人ID,_性別]), 自然な年齢表現(_年齢), 自然な職業表現(_職業). 自然な年齢表現(_年齢) :- writef('年齢分類は%t、',[_年齢]). 自然な職業表現(有) :- write('職業に就いています。\n'). 自然な職業表現(無) :- write('無職です。\n'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/675 # # [1] 授業単元:プログラミングC # [2] 問題文(含コード&リンク):ある学校の複数のクラスで試験を実施した. # クラスごとの各学生の試験の得点が2次元配列の形で与えられている. # クラスごとの平均点を計算 # し,コンソールに出力するプログラムを作成せよ # # ==== クラス 0: 4人 ==== # 出席番号 0: 得点 32点 # 出席番号 1: 得点 52点 # 出席番号 2: 得点 18点 # 出席番号 3: 得点 58点 # クラス平均点:40.0点 # ==== クラス 1: 3人 ==== # 出席番号 0: 得点 41点 # 出席番号 1: 得点 59点 # 出席番号 2: 得点 50点 # クラス平均点:50.0点 # ==== クラス 2: 6人 ==== # 出席番号 0: 得点 63点 # 出席番号 1: 得点 83点 # 出席番号 2: 得点 71点 # 出席番号 3: 得点 89点 # 出席番号 4: 得点 77点 # 出席番号 5: 得点 97点 # クラス平均点:80.0点 # 試験の点数([[32,52,18,58],[41,59,50],[63,83,71,89,77,97]]). program :- 'ある学校の複数のクラスで試験を実施した.クラスごとの各学生の試験の得点が2次元配列の形で与えられている.クラスごとの平均点を計算し,コンソールに出力する'. 'ある学校の複数のクラスで試験を実施した.クラスごとの各学生の試験の得点が2次元配列の形で与えられている.クラスごとの平均点を計算し,コンソールに出力する' :- 試験の点数(_試験の点数), クラスごとの平均点(_試験の点数,_クラスごとの平均点), コンソールに出力する(_クラスごとの平均点). クラスごとの平均点([],[]). クラスごとの平均点([L|R1],[[_平均点,L]|R2]) :- 相加平均(L,_平均点), コンソールに出力する クラスごとの平均点(R1,R2). コンソールに出力する(_クラスごとの平均点) :- append(L0,[[_平均点,L]|R],_クラスごとの平均点), クラス番号とメンバー数の表示(L0,L), メンバーの得点表示(L), 平均点の表示(_平均点), R = [],!. クラス番号とメンバー数の表示(L0,L) :- length(L0,_クラス番号), length(L,_メンバー数), writef('====クラス%t: %t人====\n',[_クラス番号,_メンバー数]). メンバーの得点表示(L) :- append(L0,[_得点|R],L), length(L0,_出席番号), writef('出席番号 %t: 得点 %t点\n',[_出席番号,_得点]), R = [],!. 平均点の表示(_平均点) :- _平均点表示 is truncate(_平均点 * 10) / 10, writef('クラス平均点: %t点\n',[_平均点表示]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 相加平均(L,M) :- length(L,N), 相加平均(L,N,0.0,M). 相加平均([],N,S,M) :- M is S / N,!. 相加平均([A|R],N,S,M) :- S1 is S + A, 相加平均(R,N,S1,M). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/640 # # [1]C言語 # [2]本文 # 以下のLED 7セグメント(4桁)を制御するプログラムを作成してください # (1) 入力に+ キー1つをもち、1桁だけのカウンタを作成する。 # # (2) スイッチのチャタリング防止のために、20msec程度の間に1msec # 間隔で連続5回程度ON状態を検出したらONにする関数を追加する。 # # (3) スイッチのチャタリング防止の機能を拡張すると、長押しの動作の # 判定が可能になる。長押し(1秒以上)でカウンタが「ゼロ」になるように拡張する。 # # (4) 500msecの間に2回ONを検知したらダブルクリックである機能を追加 # する。ダブルクリックでは、自動的にカウントアップする動作を行うこと。 # もう一度ダブルクリックで停止、ダブルクリックで再開、長押しでリセットする。 # # (5) 実験1〜4で実現した機能をさらに活用して、4桁のカウンタを作る。 # このとき長押し、ダブルクリックの機能も残す。 # 4桁の7セグを直接制御するため、 ダイナミック点灯の考え方を使って4桁表示を行う。 # 7セグを制御する7ポート(例:RBO〜6)と表示する桁を制御する4ポート # (例:RAO〜3)を利用する。 # 表示桁の切り替えを5msecで行い、そのタイミングでその桁に表示する数値を切り #  替える。 # # チャタリング回路付きスイッチ(_状態) :- 'スイッチのチャタリング防止のために、20msec程度の間に1msec 間隔で連続5回程度ON状態を検出したらONにする'(_状態). 'スイッチのチャタリング防止のために、20msec程度の間に1msec 間隔で連続5回程度ON状態を検出したらONにする' :- 'スイッチのチャタリング防止のために、', '20msec程度の間に1msec 間隔で連続5回程度ON状態を検出したらONにする'(_状態). 'スイッチのチャタリング防止のために、'. '20msec程度の間に1msec 間隔で連続5回程度ON状態を検出したらONにする'(_状態) :- '20msec程度の間に'(_終了時刻), '1msec 間隔で連続5回程度ON状態を検出したらONにする'(_終了時刻,[],_状態),!. '20msec程度の間に'(_終了時刻) :- 現在の時刻を得る(_起動時刻), _終了時刻 is _起動時刻 + 20. '1msec 間隔で連続5回程度ON状態を検出したらONにする'(_終了時刻,_,off) :- 現在の時刻を得る(_現在の時刻), _現在の時刻 @>= _終了時刻,!. '1msec 間隔で連続5回程度ON状態を検出したらONにする'(_終了時刻,[on,on,on,on,on],on) :- 終了時刻が来るまで待つ(_終了時刻),!. '1msec 間隔で連続5回程度ON状態を検出したらONにする'(_終了時刻,[on|L1],_状態) :- '1msec 間隔で', 'ON状態を検出', '1msec 間隔で連続5回程度ON状態を検出したらONにする'(_終了時刻,[on,on|L1],_状態),!. '1msec 間隔で連続5回程度ON状態を検出したらONにする'(_終了時刻,_,_状態) :- '1msec 間隔で', 'ON状態を検出', '1msec 間隔で連続5回程度ON状態を検出したらONにする'(_終了時刻,[on],_状態),!. '1msec 間隔で連続5回程度ON状態を検出したらONにする'(_終了時刻,_,_状態) :- '1msec 間隔で連続5回程度ON状態を検出したらONにする'(_終了時刻,[off],_状態),!. '1msec 間隔で' :- sleep(1). 終了時刻が来るまで待つ(_終了時刻) :- 現在の時刻 @>= _終了時刻,!. 終了時刻が来るまで待つ(_終了時刻) :- '1msec 間隔で', 終了時刻が来るまで待つ(_終了時刻). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/565 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # http://ime.nu/codepad.org/6wsr2CEj # 国語と数学の2科目のテストの成績を処理するプログラムにおいて、生徒数を # キーボードから入力した後に、そのデータを入力し、最後に入力したデータ全てを # 表示する。 # '国語と数学の2科目のテストの成績を処理するプログラムにおいて、生徒数をキーボードから入力した後に、そのデータを入力し、最後に入力したデータ全てを表示する' :- 生徒数をキーボードから入力した(_生徒数), 後に, そのデータを入力し(_生徒数,_入力したデータ), 最後に入力したデータ全てを表示する(_入力したデータ). 生徒数をキーボードから入力した(_生徒数) :- get_line(Line), 生徒数入力診断(Line,_生徒数),!. 生徒数をキーボードから入力した(_生徒数) :- 生徒数をキーボードから入力した(_生徒数). 生徒数入力診断(Line,_生徒数) :- atom_to_term(Line,_生徒数,_), integer(_生徒数),!. 生徒数入力診断(Line,_生徒数) :- writef('入力された %t から生徒数が得られませんでした。再入力をお願いします。',[Line]), fail. 後に :- true. そのデータを入力し(_生徒数,_入力したデータ) :- length(_入力したデータ,_生徒数), そのデータを入力し(_入力したデータ). そのデータを入力し([]). そのデータを入力し([[_国語,_数学]|R]) :- 国語点数を入力(_国語), 数学点数を入力(_数学), そのデータを入力し(R). 国語点数を入力(_国語点数) :- get_line(Line), 国語点数入力診断(Line,_国語点数),!. 国語点数を入力(_国語点数) :- 国語点数を入力(_国語点数). 国語点数入力診断(Line,_国語点数) :- atom_to_term(Line,_国語点数,_), integer(_国語点数),!. 国語点数入力診断(Line,_国語点数) :- writef('入力された %t から国語点数が得られませんでした。再入力をお願いします。',[Line]), fail. 数学点数を入力(_数学点数) :- get_line(Line), 数学点数入力診断(Line,_数学点数),!. 数学点数を入力(_数学点数) :- 数学点数を入力(_数学点数). 数学点数入力診断(Line,_数学点数) :- atom_to_term(Line,_数学点数,_), integer(_数学点数),!. 数学点数入力診断(Line,_数学点数) :- writef('入力された %t から数学点数が得られませんでした。再入力をお願いします。',[Line]), fail. 最後に入力したデータ全てを表示する(_入力したデータ) :- append([_,[[_国語,_数学]|R],_入力したデータ), writef('%t,%t\n',[_国語,_数学]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/384 # # # [1] 授業単元:2次元配列の利用 # [2] 問題文(含コード&リンク): # 新幹線「のぞみ」の料金(ただし運賃との合計額)は以下の表の通りである。出発駅と到着駅をそれぞれ駅番号で入力し、料金を表示するプログラムを作成しなさい。 # なお、駅番号は、東京が1、新横浜が2、名古屋が3、京都が4、新大阪が5とする。 # 但し、料金を表示してから後で、1を入力すると上記の処理を繰り返し、0を入力するとプログラムを終了するものとする。 #     新大阪 京都  名古屋 新横浜 # 東京  14920 14390 11540  3180 # 新横浜 14600 13660 10910 # 名古屋 6840 6100 # 京都  3240 # :- のぞみ料金表の生成('のぞみ料金表.txt'). 出発駅と到着駅をそれぞれ駅番号で入力し、料金を表示する :- 出発駅を得る(_出発駅), 到着駅を得る(_到着駅), のぞみ料金(_出発駅,_到着駅,_料金), 料金を表示する(_出発駅,_到着駅,_料金), write('0..終了 1..別の料金を検索する : '), get_line('0'),!. 出発駅と到着駅をそれぞれ駅番号で入力し、料金を表示する :- 出発駅と到着駅をそれぞれ駅番号で入力し、料金を表示する. 出発駅を得る(_出発駅) :- 駅番号駅名表示(_駅番号駅名表示), writef('出発駅を番号で選択してください。%t : ',[_駅番号駅名表示]), 駅番号で入力する(_駅番号), 駅番号(_駅番号,_出発駅),!. 出発駅を得る(_出発駅) :- 出発駅を得る(_出発駅). 到着駅を得る(_到着駅) :- 駅番号駅名表示(_駅番号駅名表示), writef('到着駅を番号で選択してください。%t : ',[_駅番号駅名表示]), 駅番号で入力する(_駅番号), 駅番号(_駅番号,_到着駅),!. 到着駅を得る(_到着駅) :- 到着駅を得る(_到着駅). 駅番号駅名表示(_駅番号駅名表示) :- findall(S,( 駅番号(_駅番号,_駅名), concat_atom([_駅番号,'..',_駅名],S)), L), concat_atom(L,' ',_駅番号駅名表示),!. 駅番号で入力する(_駅番号) :- get_line(Line), 駅番号入力診断(Line,_駅番号),!. 駅番号入力診断(Line,_駅番号) :- atom_to_term(Line,_駅番号,_), integer(_駅番号), _駅番号 >= 1, _駅番号 =< 5,!. 駅番号入力診断(Line,_駅番号) :- writef('入力された %t から適切な駅番号が得られません。再入力をお願いします\n',[Line]), fail. 料金を表示する(_出発駅,_到着駅,_料金) :- writef('%t から %t までの料金は %t 円です。\n',[_出発駅,_到着駅,_料金]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% のぞみ料金表の作成(File) :- get_split_lines(File,[' '],Lines), Lines = [_駅名横ならび|R1], findall(_駅名,( append(LL0,[[_駅名|_]|R],R1)), _駅名縦ならび), 駅番号の登録(_駅名縦ならび), findall(_料金ならび,( append(LL0,[[_|_料金ならび]|_],R1)), _料金表), のぞみ料金表の作成(_駅名縦ならび,_駅名横ならび,_料金表). 駅番号の登録(_駅名縦ならび) :- append(_駅名縦ならび,[新大阪],_駅名縦ならびのニ), append(L0,[_駅名|R],_駅名縦ならびのニ), length([_|L0],Len), assertz((駅番号(Len,_駅名) :- !)), R = []. のぞみ料金表の作成([],_,_) :- !. のぞみ料金表の作成([_駅名|R1],_駅名横ならび,[L3|R3]) :- 駅単位料金表(_駅名,_駅名横ならび,L3), のぞみ料金表の作成(R1,_駅名横ならび,R3). 起点駅単位料金登録(_,_,[]) :- !. 起点駅単位料金登録(_駅名,[_駅名2|R2],[_料金|R3]) :- assertz(のぞみ料金(_駅名,_駅名2,_料金)), assertz(のぞみ料金(_駅名2,_駅名,_料金)), 起点駅単位料金表(_駅名,R2,R3). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1244449887/481 # # [1] 授業単元:ソフトウェア演習C # [2] 問題文: # 文書ないのすべての単語とその単語の頻度をメンバとして持つ構造体を定義し、 # この構造体へのポインタをノードの値として持つ二分木のノードを定義せよ # # 次に、任意のノードはその左の部分木にはそのノードの単語より辞書順で # 小さい単語のみがあり、その右の部分木にはより大きい単語のみがあるように # 保持される。 # 新たに単語がすでに木にあるかどうかを探すには、ルート(根元)から出発して # そのノードに格納されている単語と新しい単語を比較する。 # 二つが一致したら、それで良い。 # 新しい単語が木の単語より小さいときは、探索は左の子供に対して続けられ、 # そうでなければ右の子供が調べられる。 # 求める方向に子供がないときは、新しい単語は木の中にはないと言うことであり、 # また実際にはその子供のないところがそれを置く場所である。 # このプロセスは再帰的である必要があり、単語の挿入を行うadd_word()関数を # 定義せよ。 # この関数は再帰的に呼ばれて、左または右の部分木に振り分けられる。 # 単語は木の中の単語と一致する(その場合カウント(頻度)がインクリメントされる)か、 # あるいはノードを作成し、木に加えなければならないことを示すヌル・ポインタと # 出会う。 # 新たにノードが生成されると、この関数ではそのノードへのポインタが返され、 # 親ノードに埋め込まれる。 # この関数を利用し、以下のテキストをコマンド実行時の引数として与えられた # ファイルを入力して二分探索木を生成し、単語と頻度のリストを表示する # プログラムを作成せよ。 # # 文章: ファイル名:test.txt # University was founded in April 1998 at Iwate, # which is situated in the northeastern part of Japan. # University consists of four faculties Software and Information Science, # Nursing, Social Welfare, # and policy Studies, and additionally other educational supporut centers. 'Idによって管理された二分木に情報と頻度を保持する' :- get_chars('test.txt',Chars), split(Chars,[' ',',','.'],WordList), 木作成(WordList). 'Idによって管理された二分木に保持された情報と頻度を昇順表示' :- 二分木から値と頻度を取り出す(1,_頻度付きの値ならび), append(_[[_語,_頻度]|R],_頻度付きの値ならび), write_formatted('語彙=%t,頻度=%t\n',[_語,_頻度]), R = []. 木作成(_ならび) :- abolish(節/5), 節作成(_ならび,1,1,_). 木作成([],_,_,_). 木作成([_値|R],_節,_開始節番号,_次の節番号) :- 節作成(_値,_節,_開始節番号,_受取節番号), 木作成(R,_節,_受取節番号,_次の節番号). 節作成(_値,_節,_受取節番号,_次の節番号) :- not(節(_節,_,_,_,_)), _左 is _受取節番号+1, _右 is _受取節番号+2, _次の節番号 is _受取節番号+3, assertz(節(_節,_左,_右,_値,1)),!. 節作成(_値,_節,_受取節番号,_次の節番号) :- 節(_節,_左,_右,_値2,_), 辞書順語彙比較(<,_値,_値2), 節作成(_値,_左,_受取節番号,_次の節番号). 節作成(_値,_節,_受取節番号,_次の節番号) :- 節(_節,_左,_右,_値2,_), 辞書順語彙比較(>,_値,_値2), 節作成(_値,_右,_受取節番号,_次の節番号). 節作成(_値,_節,_受取節番号,_次の節番号) :- 節(_節,_左,_右,_値2,_頻度), 辞書順語彙比較(=,_値,_値2), _頻度2 is _頻度 + 1, retract(節(_節,_左,_右,_値2,_頻度)), assertz(節(_節,_左,_右,_値2,_頻度2)). 辞書順語彙比較(Functor,_語彙1,_語彙2) :- atom_codes(_語彙1,Codes1), atom_codes(_語彙2,Codes2), 辞書順codes比較(Fuctor,Code1,Codes2),!. 辞書順codes比較((=),[],[]) :- !. 辞書順codes比較((<),[],L) :- !. 辞書順codes比較((>),L,[]) :- !. 辞書順codes比較((<),[A|R1],[B|R2]) :- A >= 65,A =< 90, B >= 97,B =< 122, B >= A + 32,!. 辞書順codes比較((>),[A|R1],[B|R2]) :- A >= 65,A =< 90, B >= 97,B =< 122, B < A + 32,!. 辞書順codes比較((>),[A|R1],[B|R2]) :- A >= 97,A =< 122, B >= 65,B =< 90, A >= B + 32,!. 辞書順codes比較((<),[A|R1],[B|R2]) :- A >= 97,A =< 122, B >= 65,B =< 90, A < B + 32,!. 辞書順codes比較(<,[B|R1],[A|R2]) :- B =< A,!. 辞書順codes比較(>,[B|R1],[A|R2]) :- B > A,!. 辞書順codes比較(P,[A|R1],[A|R2]) :- 辞書順codes比較(P,R1,R2). 二分木から値と頻度を取り出す(_節,_頻度付きの値ならび) :- findall([_値,頻度],二分木から値と頻度を取り出す(_節,_,_値,_,_頻度),_頻度付きの値ならび). 二分木から値と頻度を取り出す(_節,_値1,_値,_頻度1,_頻度) :- 節(_節,_左,_,_値2,_,_頻度2), 二分木から値と頻度を取り出す(_左,_値2,_値,_頻度2,_頻度). 二分木から値と頻度を取り出す(_節,_値1,_値,_頻度1,_頻度) :- 節(_節,_,_右,_値2,_頻度2), 二分木から値と頻度を取り出す(_右,_,_値,_,_頻度). 二分木から値と頻度を取り出す(_節,_値1,_値,_頻度1,_頻度) :- not(var(_値1)), not(var(_頻度1)), _値1=_値, _頻度1=_頻度. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 区切り語ならびの変形(_区切り語ならび,_降順の区切り文字ならびのならび) :- sort(_区切り語ならび,_昇順の区切り語ならび), reverse(_昇順の区切り語ならび,_降順の区切り語ならび), atomList2charsList(_降順の区切り語ならび,_降順の区切り文字ならびのならび). atomList2charsList([],[]) :- !. atomList2charsList([A|R1],[L|R2]) :- atom_chars(A,L), atomList2charsList(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/874 # # [1] 授業単元: Cプログラミング1 # [2] 問題文(含コード&リンク): キーボードより整数 a を入力して、 a×a の2次元配列を動的メモリ確保し、その配列の中に a×a の九九の計算結果を代入し、その内容を表示するプログラムを作成せよ。 # (入力例) # input num : 3 # (出力) # 1 2 3 # 2 4 6 # 3 6 9 # # 'キーボードより整数 a を入力して、 a×a の2次元配列を動的メモリ確保し、その配列の中に a×a の九九の計算結果を代入し、その内容を表示する' :- 'キーボードより整数 a を入力して'(_a), 'a×a の2次元配列を動的メモリ確保し'(_a,LL), 'その配列の中に a×a の九九の計算結果を代入し'(_a,LL), その内容を表示する(_a,LL). 'キーボードより整数 a を入力して'(_a) :- write('input num : '), get_line(Line), 整数入力検査(Line,_a),!. 'キーボードより整数 a を入力して'(_a) :- 'キーボードより整数 a を入力して'(_a). 整数入力検査(Line,_a) :- atom_to_term(Line,_a,_), integer(_a), _a > 0,!. 整数入力検査(Line,_a) :- writef('入力された %t からは適切な整数が得られませんでした。再入力をお願いします\n',[Line]), fail. 'a×a の2次元配列を動的メモリ確保し'(_a,LL) :- length(LL,_a), findall(L,( append(_,[L|_],LL), length(L,_a)), LL). 'その配列の中に a×a の九九の計算結果を代入し'(_a,LL) :- findall(L,( append(L0,[L|_],LL), findall(V,( append(L01,[V|_],L), ならびの掛け算([_|L0],[_|L01],LX), length(LX,V)), L)), LL). ならびの掛け算(L1,L2,LX) :- findall(L2,( append(_,[_|_],L1)), LL), flat(LL,LX). その内容を表示する(_a,LL) :- 表示パターンを生成する(_a,_表示パターン), append(_,[N|R],L), writef(_表示パターン,[N]), R = []. その内容を表示する(_a,LL) :- 表示パターンを生成する(_a,_表示パターン), append(_,[N|R],L), writef(_表示パターン,[N]), R = []. 表示パターンを生成する(_a,_表示パターン) :- length(L,_a), all(L,'%t '), append(L,['\n'],L2), concat_atom(L2,_表示パターン),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/845 # # [1] 授業単元:ポインタ型、配列型の派生 # [2] 問題文(含コード&リンク): #  [A]宣言による場合   short d[L][M][N]; #  [B]動的確保による場合 ([A]と同じサイズ。生成法は講義時と同様:参考コードhttp://ime.nu/ideone.com/nWTXg) #  short型の3次元配列を生成した場合について、(1)〜(7)の解答を導け。 #  (上の宣言による場合と動的確保による場合の両方について答えよ。 #   なお、short型とポインタ型のサイズはそれぞれ2バイトと8バイトとする) # #  (1)要素d[i][j][k]へのアクセス手順 #  (2)要素d[i][j][k]へのアクセスに要するアドレス計算とメモリアクセスの回数 #  (3)メモリ使用量(L,M,Nを用いて表せ)・・・書き方の例:M×N×sizeof(X)+M×sizeof(X*)+sizeof(X**)バイト #  (4)L=3,M=N=512の場合のメモリ使用量(KB単位、小数点以下1桁まで。1KBは1024Bとする。) #  (5)L=M=512,N=3の場合のメモリ使用量(上と同じ条件) #  (6)関数への渡し方・・・書き方の例:func(aax); #  (7)関数での受け方・・・書き方の例:func(int **aay){ } # '要素d[i][j][k]へのアクセス手順'(L,_i,_j,_k,_d_i_j_k) :- length(L01,_i), length(L02,_j), length(L03,_k), append(L01,[L1|_],L), append(L02,[L2|_],L1), append(L03,[_d_i_j_k|_],L2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/725 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # int型の二つの同じ長さを持つ配列があるとする。 # この二つの配列の値の和を一方の配列に代入する関数 # void add(int *address1, int * address2, int length)を定義し、 # その動作を確認するプログラムkadai7-1.cを作りなさい。 # ただし、答えはaddress1で指定された配列に代入されるものとし、 # lengthは2つの配列の長さを表すものとする。 # ただし、int a[2], b[2]; # scanf("%d %d %d %d", &(a[0]), &(a[1]),&(b[0]),&(b[1])); # で配列の値をセットするものとして、答えは以下で出力されるものとする。 # printf("a = %d %d, b = %d %d\n", a[0], a[1], b[0], b[1]) # 二つの配列の値の和を一方の配列に代入する :- address1(L1), address2(L2), 二つのならびの加算(L1,L2,L3), retract(address2(_)), assertz(address2(L3)). 二つの数値からなるならびを生成しそれぞれ述語address1とasseress2の引数として登録する :- ならびの長さを決める(_ならびの長さ), length(L1,_ならびの長さ), length(L2,_ならびの長さ), ならびに値を詰める(L1), ならびに値を詰める(L2), assertz(address1(L1)), assertz(address2(L2)),!. ならびの長さを決める(_ならびの長さ) :- _ならびの長さ is random mod 98 + 2. ならびに値を詰める([]) :- !. ならびに値を詰める([V|R]) :- V is random(9999), ならびに値を詰める(R). % 以下のサイトは # 包除原理 # 1以上n以下の整数で、a1,a2,....amのうち、すくなくとも1つで割り切れるものの個数を計算しなさい。 # 1 =< n =< 10 ^ 8 # 1 =< m =< 15 # '1以上n以下の整数をランダムに発生させる'(L) :- _m is (random mod 15) + 1, length(L,_m), findall(_n,( append(L0,[_n|_],L), ランダム数を得る(L0,_n)), L). ランダム数を得る(L0,_n) :- _n is (random mod 100000000) + 1. \+(append(_,[_n|_],L0)),!. ランダム数を得る(L0,_n) :- ランダム数を得る(L0,_n). '1以上n以下の整数で、a1,a2,....amのうち、すくなくとも1つで割り切れるものの個数を計算する'(L,_個数) :- var(L), '1以上n以下の整数をランダムに発生させる'(L), すくなくとも1つで割り切れるものの個数を計算する(L,_個数),!. '1以上n以下の整数で、a1,a2,....amのうち、すくなくとも1つで割り切れるものの個数を計算する'(L,_個数) :- \+(var(L)), すくなくとも1つで割り切れるものの個数を計算する(L,_個数). すくなくとも1つで割り切れるものの個数を計算する(_整数ならび,_個数) :- すくなくとも1つで割り切れるもの(_整数ならび,_割り切れない数ならび), length(_割り切れない数ならび,_個数). すくなくとも1つで割り切れるもの([],[]). すくなくとも1つで割り切れるもの([N1|R1],L) :- 割り切れる数字を除外(N1,R1,L1), すくなくとも1つで割り切れるもの(L1,L2), append(L1,L2,L). 割り切れる数字を除外(_,[],[]). 割り切れる数字を除外(N,[N2|R2],[N2|R3]) :- \+(0 is N2 mod N), 割り切れる数字を除外(N,R2,R3). 割り切れる数字を除外(N,[N2|R2],R3) :- 0 is N2 mod N, 割り切れる数字を除外(N,R2,R3). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/590 # # 1] 授業単元:C演習 # [2] 問題文 # 30 29   28 27 26 計 140 # 25 24   23 22 21 計 115 # 20 19 18 17 16 計 90 # 15 14 13 12 11 計 65 # 計  計   計  計  計 # 90 86 82 78 72 # ならび情報([30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11]). ならびから表を形成し表示する(_列数,_表) :- ならびから表を形成する(_列数,_表), 表示する(_列数,_表). ならびから表を形成する(_列数,_表) :- ならび情報(L), length(LS0,_列数), all(LS0,0), 表を形成する(_列数,L,[0|LS0],_表). 表を形成する(_,[],LS,[LS]) :- !. 表を形成する(_n,L1,LS1,[L22|R2]) :- length(L2,_n), append(L2,R,L1), sum(L2,Sum), append(L2,[Sum],L22), 加算(L22,LS1,LS2), 表を形成する(_n,R,LS2,R2). 加算([],[],[]). 加算([A|R1],[B|R2],[C|R3]) :- C is A + B, 加算(R1,R2,R3). sum([],0). sum([A|R],X) :- sum(R,Y), X is A + Y. all([],_). all([A|R],X) :- all(R,X). 表示する(_列数,[L]) :- '計見出し行の表示'(_列数), 表示パターンの生成(_列数,P), append(L0,[_],L), writef(P,L), nl,!. 表示する(_列数,[L|R]) :- 表示パターンの生成(_列数,P), concat_atom([P,'計 ','%t \n'],P2), writef(P2,L). 表示する(_列数,R),!. 計見出し行の表示(_列数) :- 表示パターンの生成(_列数,P), length(L,_列数), all(L,計), writef(P,L), nl,!. 表示パターンの生成(_列数,PL) :- length(L,_列数), all(L,'%t '), concat_atom(L,P). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/908 # # # # [1] 授業単元:計算機プログラミング # [2] 問題文:http://nojiriko.asia/prolog/org1648258.pdf #         リンク先の問題2 # # 2.下記のような,学生 10 名の 5 科目の成績表がある(表の仕様,値などは各自決めてよい)。 # 成績表 # StudentNo. Electromag. Elec.Cct Computer Math English # E001 70 65 85 90 70 # E002 50 45 55 65 60 # E003 78 90 95 70 85 # E004 90 98 87 85 75 # E005 45 75 62 48 50 # # 個人毎,および科目毎の平均を計算するプログラムを組みなさい。 # ただし,プログラムの設計仕様に次の 2 点を必ず含めること。 # # (1) キーボードなどから点数を入力し,結果をファイルに出力すること(kekka.txt など)。 # ファイル(data.txt など)を読込ませてもよい。ただし,値をプログラムに組み込まないこと! # (2) 平均を求める箇所を関数にすること。 '個人毎,および科目毎の平均を計算する。キーボードなどから点数を入力し(ファイル(data.txt など)を読込ませてもよい),結果をファイルに出力する'(_入力ファイル,_出力ファイル) :- 'キーボードなどから点数を入力し(ファイル(data.txt など)を読込ませてもよい)'(_入力ファイル,_見出し項,_生成表), '個人毎,および科目毎の平均を計算する'(_成績表,_個人毎平均,_個人毎平均を付加した成績表,_科目毎平均), ファイルに出力する(_見出し項,_個人毎平均,_科目毎平均). 'キーボードなどから点数を入力し(ファイル(data.txt など)を読込ませてもよい)'(_入力ファイル,_見出し項,_生成表) :- get_split_lines(_入力ファイル,[' '],LL), LL = [_見出し項|_成績表]. '個人毎,および科目毎の平均を計算する'(_成績表,_個人毎平均,_個人毎平均を付加した成績表,_科目毎平均) :- 個人毎の平均を計算する(_成績表,_個人毎平均,_個人毎平均を付加した成績表), 科目毎の平均を計算する(_成績表,_科目毎平均). 個人毎の平均を計算する(_成績表,_個人毎平均を付加した成績表) :- findall(L,( append(_,[L1|_],_成績表), L1 = [_|_個人成績ならび], avg(_個人成績ならび,_個人毎平均), append(L1,[_個人毎平均],L)), _個人毎平均を付加した成績表). 科目毎の平均を計算する(_成績表,_科目毎平均) :- 転置(_成績表,_転置された成績表), findall(Avg,( append(_,[[_|L]|_],_転置された成績表), avg(L,Avg)), _科目毎平均). ファイルに出力する(_見出し項,_個人毎平均,_科目毎平均) :- open(_出力ファイル,write,Outstream), 見出し項を出力する(Outstream,_見出し項), 個人毎の平均を出力する(Outstream,_個人毎平均), 科目毎の平均を出力する(Outstream,_科目毎平均), close(Outstream). 見出し項を出力する(Outstream,_見出し項) :- append(_見出し項,['Average'],_見出し項のニ), write_formattet(Outstream,'%16t %16t %16t %16t %16t %16t %16t %16t \n',_見出し項のニ),!. 個人毎の平均を出力する(Outstream,_個人毎平均) :- append(_,[L|R],_個人毎平均), write_formatted(Outstream,'%16t %16t %16t %16t %16t %16t %16t %16t \n',L), R = []. 科目毎の平均を出力する(Outstream,_科目毎平均) :- write_formatted(Outstream,'avarage %16t %16t %16t %16t %16t %16t %16t \n',_科目毎平均). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1258320456/276 # # ゴールドバッハの予想 # 与えられた値を2つの素数の和で現してください # verは出来れば2.6で # エラトステネスのふるいを用いた素数リストを使って値を出すようにしてください # お願いします # # '与えられた値を2つの素数の和で現してください。エラトステネスのふるいを用いた素数リストを使って値を出す'(_与えられた値,_素数組ならび) :- findall([_素数_1,_素数_2],( '与えられた値を2つの素数の和で現してください。エラトステネスのふるいを用いた素数リストを使って値を出す'(_与えられた値,_素数_1,_素数_2)), _素数組ならび). '与えられた値を2つの素数の和で現してください。エラトステネスのふるいを用いた素数リストを使って値を出す'(_与えられた値,_素数_1,_素数_2) :- ひとまず2から与えられた値までの数値ならびを作る(_与えられた値,_数値ならび), 素数ならびの生成(_数値ならび,_素数ならび), 素数の和(_与えられた値,_素数ならび,_素数_1,_素数_2). ひとまず2から与えられた値までの数値ならびを作る(_与えられた値,_数値ならび) :- findall(N,for(2,N,_与えられた値),_数値ならび). 素数ならびの生成(_数値ならび,_素数ならび) :- エラトステネスの篩(_数値ならび,_素数ならび). 素数の和(_与えられた値,[N|R1],_素数_1,_素数_2) :- _素数_2 is _与えられた値 - N, _素数_2 =< N, !,fail. 素数の和(_与えられた値,[_素数_1|R1],_素数_1,_素数_2) :- _素数_2 is _与えられた値 - _素数_1, append(_,[_素数_2|_],R1). 素数の和(_与えられた値,[_|R1],_素数_1,_素数_2) :- 素数の和(_与えられた値,R1,_素数_1,_素数_2). % *** user: エラトステネスの篩 / 3 *** エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). % *** user: エラトステネスの篩 / 2 *** エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/470 # # # 入力ファイル(成績ファイル)の仕様 # # ファイル名は、ASCII文字で構成されるものとする。 # ファイル名の最大長は FILENAME_MAX である(第2回の課題0を参照)。 # 1行は、「学生番号」、「氏名」、「成績」の順に記述したもので、 # 各項目の区切り文字は、「タブ('\t')」1個である。 # 学生番号は、英数字からなる6桁の文字列である。 # 氏名の文字列長の最大は20バイトとする。 # 成績は、0〜100までの整数である。 # 入力は、最大500行と仮定してよい。 # # 出力形式 # 入力ファイルを読み込み、最初に、成績の最高点と最低点と平均点を出力する。 # 次に、成績の降順にソートして出力する。各項 目間は、「タブ('\t')」1個で区切る。 # 平均点は、小数点以下1桁まで出力する。 # 出力形式は、実行例を参照せよ。 # エラー処理 # 呼出しでファイル名が指定されない場合はエラーとし、「ファイル名を指定してください」と表示し、プログラムを終了する。 # 指定されたファイルのオープンに失敗した場合に、「ファイルを開けませんでした」と表示し、プログラムを終了する。 # 今回のプログラムでは、a. b. 以外のエラー処理はしなくてよい。 # # % cat sample.txt # 03888 八 90 # 03111 一 100 # 03222 二 30 # 03666 六 70 # 03555 五 60 # 03333 三 80 # 03777 七 40 # 03999 九 20 # 03444 四 50 # % ./work31.exe sample.txt # 最高点:100 # 最低点: 20 # 平均点: 60.0 # 100 03111 一 # 90 03888 八 # 80 03333 三 # 70 03666 六 # 60 03555 五 # 50 03444 四 # 40 03777 七 # 30 03222 二 # 20 03999 九 # % # # 言語はCです # よろしくおねがいします # program :- user_parameters([_ファイル名]), '入力ファイルを読み込み、最初に、成績の最高点と最低点と平均点を出力する、次に、成績の降順にソートして出力する。各項 目間は、「タブ(''\\t''[B')」1個で区切る。' (_ファイル名). '入力ファイルを読み込み、最初に、成績の最高点と最低点と平均点を出力する、次に、成績の降順にソートして出力する。各項 目間は、「タブ(''\\t'')」1個で区切る。'(_ファイル名) :- 入力ファイルを読み込み(_ファイル名,LL), '最初に、成績の最高点と最低点と平均点を出力する'(LL), '次に、成績の降順にソートして出力する。各項 目間は、「タブ(''\\t'')」1個で区切る。'(LL). 入力ファイルを読み込み(_ファイル名,LL) :- get_lines(_ファイル名,Lines), 三項ならびに変換(Lines,LL). 三項ならびに変換([],[]) :- !. 三項ならびに変換([Line|R1],[[_成績,_学生番号,_氏名]|R2]) :- atom_chars(Line,Chars), append(L0,['\t'|L1],['\t'|L2],Chars), atom_chars(_学生番号,L0), atom_chars(_氏名,L1), atom_chars(_成績文字列,L2), atom_to_term(_成績文字列,_成績,_), 三項ならびに変換(R1,R2). 最初に、成績の最高点と最低点と平均点を出力する(LL) :- findmax(_成績, append(_,[[_成績,_,_]|_],LL), _最高点成績), findmin(_成績, append(_,[[_成績,_,_]|_],LL), _最低点成績), findavg(_成績, append(_,[[_成績,_,_]|_],LL), _平均点), writef('最高点: %t\n',[_最高点成績]), writef('最低点: %t\n',[_最低点成績]), writef('平均点: %t\n',[_平均点]),!. '次に、成績の降順にソートして出力する。各項 目間は、「タブ(''\\t'')」1個で区切る。'(LL) :- sort(LL,LL1), reverse(LL1,LL2), append(_,[L|R],LL2), writef('%t\t%t\t%t\t\n',L), R = [],!. % *** user: append / 4 *** append([],L1,L2,L) :- append(L1,L2,L). append([A|R1],L1,L2,[A|R]) :- append(R1,L1,L2,R). % *** user: findmax / 3 *** findmax(V,P,Max) :- findall(V,P,L), max(L,Max). % *** user: findmin / 3 *** findmin(V,P,Max) :- findall(V,P,L), min(L,Max). % *** user: findavg / 3 *** findavg(_集約項,_項,_算術平均) :- findall(_集約項,_項,_値ならび), sum(_値ならび,_合計値), length(_値ならび,_ならびの長さ), _算術平均 is _合計値 / _ならびの長さ,!. % *** user: sum / 2 *** sum([],0). sum([N|R],S) :- sum(R,S1), S is N + S1. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/212 # # [1]C言語演習 # [2]問題文 # 次の形式のタブ区切りファイルがある。(行数は最大で1000万行とする) # 生徒ID クラス名 国語得点 数学得点 英語得点 # 生徒IDは8桁の0から9で構成される文字列 # クラス名は4桁の0から9で構成される文字列 # 国語得点、数学得点、英語得点は3桁の0から9で構成される文字列とする。 # # (2)それぞれの教科の得点が所属しているクラスの各教科の平均点の大小関係と # 同じ生徒をリストアップせよ # ただしあるクラスの2つの教科の平均点が一致している場合はその2つの教科の得点の # 大小関係は不問として出力する。(3つが一致している場合はそのクラスの生徒全員 # がリストアップされることになる # [3] OSはLinux,言語はCです。(C++は不可) # [4] 4/30まで # [5] stdlib.h stdio.h string.hをincludeしても良いがそれ以外は不可だそうです # よろしくお願いします。 # # それぞれの教科の得点が所属しているクラスの各教科の平均点の大小関係が同じ生徒をリストアップ(_ファイル) :- get_split_lines(_ファイル,['\t'],LL), findsetof(_クラス,append(_,[[_,_クラス,_,_,_]|_],LL),_クラスならび), findall([_クラス,_パターン],( append(_,[_クラス|_],_クラスならび), パターン(LL,_クラス,_国語平均点,_数学平均点,_英語平均点,_パターン)), _クラス・パターンならび), append(_,[[_ID,_クラス,_国語,_数学,_英語]|R],LL), パターンが一致したら表示(_ID,_クラス,_クラスパターンならび,_国語,_数学,_英語), R = [],!. パターンが一致したら表示(_ID,_クラス,_クラス・パターンならび,_国語,_数学,_英語) :- append(_,[[_クラス,_パターン]|_],_クラス・パターンならび), パターン判断(_パターン,_国語,_数学,_英語), write_formatted('%t\n',[_クラス,_ID]),!. パターンが一致したら表示(_,_,_,_,_,_). パターン(LL,_クラス,_国語平均点,_数学平均点,_英語平均点,_パターン) :- findavg(_国語,append(_,[[_,_クラス,_国語,_,_]|_],LL),_国語平均点), findavg(_数学,append(_,[[_,_クラス,_数学,_,_]|_],LL),_数学平均点), findavg(_英語,append(_,[[_,_クラス,_英語,_,_]|_],LL),_英語平均点), パターン(_パターン,_国語平均点,_数学平均点,_英語平均点). パターン(1,A,B,C) :- A >B,B > C,!. パターン(2,A,B,C) :- A >C,C > B,!. パターン(3,A,B,C) :- B >A,A > C,!. パターン(4,A,B,C) :- B >C,C > A,!. パターン(5,A,B,C) :- C >A,A > B,!. パターン(6,A,B,C) :- C >B,B > A,!. パターン(7,E,E,C) :- \+(E=C),E > C,!. パターン(8,E,E,C) :- \+(E=C),E < C,!. パターン(9,E,B,E) :- \+(E=B),E > B,!. パターン(10,E,B,E) :- \+(E=B),E < B,!. パターン(11,A,E,E) :- \+(E=C),E < A,!. パターン(12,A,E,E) :- \+(E=C),E > A,!. パターン(13,E,E,E). パターン判断(_パターン,A,B,C) :- _パターン < 7, パターン(_パターン,A,B,C),!. パターン判断(7,A,B,C) :- C < A,C < B,!. パターン判断(8,A,B,C) :- C > A,C > B,!. パターン判断(9,A,B,C) :- B < A,B < C,!. パターン判断(10,A,B,C) :- B > A,B > C,!. パターン判断(11,A,E,E) :- A < B,A < C,!. パターン判断(12,A,E,E) :- A > B,A > C,!. パターン判断(13,_,_,_). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/212 # # [1]C言語演習 # [2]問題文 # 次の形式のタブ区切りファイルがある。(行数は最大で1000万行とする) # 生徒ID クラス名 国語得点 数学得点 英語得点 # 生徒IDは8桁の0から9で構成される文字列 # クラス名は4桁の0から9で構成される文字列 # 国語得点、数学得点、英語得点は3桁の0から9で構成される文字列とする。 # # (1)各教科の得点の和が同じ生徒達のグループについて、そのグループが何人で何クラスの # 生徒から構成されているかを、得点和毎に表出力せよ # ただし0人で構成されるグループについては出力する必要がない。 # 形式例 # 得点:123 人数:5人 グループ数:4 # 得点:128 人数:3人 グループ数:3 # 得点:214 人数:11人 グループ数:9 # ............ # # (2)それぞれの教科の得点が所属しているクラスの各教科の平均点の大小関係と # 同じ生徒をリストアップせよ # ただしあるクラスの2つの教科の平均点が一致している場合はその2つの教科の得点の # 大小関係は不問として出力する。(3つが一致している場合はそのクラスの生徒全員 # がリストアップされることになる # [3] OSはLinux,言語はCです。(C++は不可) # [4] 4/30まで # [5] stdlib.h stdio.h string.hをincludeしても良いがそれ以外は不可だそうです # よろしくお願いします。 # # '各教科の得点の和が同じ生徒達のグループについて、そのグループが何人で何クラスの生徒から構成されているかを、得点和毎に表出力せよ'(_ファイル) :- get_split_lines(_ファイル,['\t'],LL), findall([_得点合計,_クラス名],( append(_,[[_生徒ID,_クラス名,_国語得点,_数学得点,_英語得点]|_],LL), _得点合計 is _国語得点,_数学得点,_英語得点), L1), findsetof(_得点合計,( append(_,[[_得点合計,_]|_,L1)), L2), findsetof([_得点合計,_クラス]( append(_,[[_得点合計,_クラス]|_,L1)), L3), findall([_得点合計,_グループ人数,_クラス数],( append(_,[_得点合計|_],L2), count(append(_,[[_得点合計,_]|_],L1),_グループ人数)), count(append(_,[[_得点合計,_]|_],L3),_クラス数)), _得点合計・グループ人数・クラス数集計ならび), 出力する(_得点合計・グループ人数・クラス数集計ならび). 出力する(_得点合計・グループ人数・クラス数集計ならび) :- append(_,[[_得点合計,_グループ人数,_クラス数]|R],_得点合計・グループ人数・クラス数集計ならび), write_formatted('得点:%t 人数:%t人 グループ数:%t\n',[_得点合計,_グループ人数,_クラス数]), R = [],!. % 以下のサイトは # モジュラス10ウェイト3 モジュラス10ウェイト3(_数字列,_冗長符号) :- atom_chars(_数字列,_数字ならび), モジュラス10ウェイト3重み付けならびの生成(_数字ならび,[],_重み付けならび), モジュラス10ウェイト3(_数字ならび,_重み付けならび,0,_冗長符号). モジュラス10ウェイト3([],[],S,_冗長符号) :- _冗長符号整数 is 10 - (S mod 10), number_chars(_冗長符号整数,[_冗長符号]),!. モジュラス10ウェイト3([A|R1],[M|R2],S1,_冗長符号) :- atom_number(A,N), S2 is S1 + N * M, モジュラス10ウェイト3(R1,R2,S2,_冗長符号),!. モジュラス10ウェイト3重み付けならびの生成([],L,L) :- !. モジュラス10ウェイト3重み付けならびの生成([_],L,[3|L]) :- !. モジュラス10ウェイト3重み付けならびの生成([_,_|R1],L1,L) :- モジュラス10ウェイト3重み付けならびの生成(R1,[1,3|L1],L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/97 # # select * from table1 where col1 in (select colx, coly from table2); # # 的な書き方は無い? # ↓ってするしかない? # # select * from table1 where col1 in (select colx from table2) or col1 in (select coly from table2) ; # # 'select * from table1 where col1 in (select colx from table2) or col1 in (select coly from table2)'(L1) :- テーブルの選択(table1,[col1],[_col1],L1,P1), テーブルの選択(table2,[colx,coly],[_colx,_coly],L2,P2), P1, P2, 選択条件(_col1,_colx,_coly). 選択条件(X,X,_) :- !. 選択条件(X,_,X) :- !. %%% テーブルが生成される時に定義される %%% テーブル構造(table1,1,col1). テーブル構造(table2,1,colx). テーブル構造(table2,2,coly). %%% 汎用述語 %%% テーブルの選択(_テーブル名,_鍵名ならび,_鍵変数ならび,L,P) :- findall(_,テーブル構造(_テーブル名,_,_),L), P =.. [_テーブル名|L], 鍵変数の指定(_テーブル名,L,_鍵名ならび,_鍵変数ならび). 鍵変数の指定(_テーブル名,L,[],[]) :- !. 鍵変数の指定(_テーブル名,L,[_鍵名|R1],[_鍵変数|R2]) :- テーブル構造(_テーブル名,_位置,_鍵名), list_nth(_位置,L,_鍵変数), 鍵変数の指定(_テーブル名,R1,R2,L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/92 # # 環境はoracle9iです。 # # ■テーブルの構成 # |年度|月|部署コード|商品コード|金額| # # ■テーブルの内容 # |2010|01|AAA|001|1000| # |2010|02|AAA|001|2000| # |2010|01|AAA|001|3000| # |2010|01|AAA|002|3000| # |2010|02|BBB|003|4000| # |2010|01|CCC|001|5000| # |2010|03|CCC|001|6000| # # 上記のようなテーブルがあり、 # これを # と、ここまでなら上の4つでGROUP BYしてあげれば良いのですが、 # そこに年度,部署コード,商品コードでサマリした # 「累計金額」列を加える必要があります。(イメージは下記のとおりです。) # # # ■抽出結果の構成 # |年度|月|部署コード|商品コード|金額|累計金額| # # ■抽出結果の内容 # |2010|01|AAA|001|4000|6000| # |2010|02|AAA|001|2000|6000| # |2010|02|BBB|003|4000|4000| # |2010|01|CCC|001|5000|11000| # |2010|03|CCC|001|6000|11000| # # # GROUP BYと別の集計単位で列を作ることが可能か、 # 可能であればどのようなSQLを書くべきか、 # というところを教えてください。 # # '|年度|月|部署コード|商品コード|金額| テーブルを年度,月,部署コード,商品コードでサマリした値にさらに年度,部署コード,商品コードでサマリした値を付加した行表示' :- 鍵ならびの生成([_年度,_部署コード,_商品コード],テーブル(_年度,_月,_部署コード,_商品コード,_金額),_鍵ならびの一), 鍵ならびの生成([_年度,_月,_部署コード,_商品コード],テーブル(_年度,_月,_部署コード,_商品コード,_金額),_鍵ならびの二), append(_,[[_年度,_部署コード,_商品コード]|R],_鍵ならびの一), 金額制約(_鍵ならびの二,_年度,_月,_部署コード,_商品コード,_金額月合計,_金額総合計), writef('|%t|%t|%t|%t|%t|%t\n',[_年度,_月,_部署コード,_商品コード,_金額月合計,_金額総合計]), R = []. 金額集約(L2,_年度,_月,_部署コード,_商品コード,_金額月合計,_金額総合計) :- 年度・部署コード・商品コード集約(_年度,_部署コード,_商品コード,_金額総合計), append(_,[[_年度,_月,_部署コード,_商品コード]|_],L2), 年度・月・部署コード・商品コード集約(_年度,_月,_部署コード,_商品コード,_金額月合計). 年度・月・部署コード・商品コード集約(_年度,_月,_部署コード,_商品コード,_金額合計) :- findsum(_金額,( テーブル(_年度,_月,_部署コード,_商品コード,_金額)), _年度・月・部署コード・商品コード集約). 年度・部署コード・商品コード集約(_年度,_部署コード,_商品コード,_金額合計) :- findsum(_金額,( テーブル(_年度,_月,_部署コード,_商品コード,_金額)), _年度・部署コード・商品コード集約). 鍵ならびの生成(_鍵変数ならび,_述語,_鍵ならび) :- findsetof(_鍵変数ならび,_述語,_鍵ならび). % 以下のサイトは 計画停電グループ所属(グループ1,西荻). 計画停電グループ所属(グループ1,所沢). 計画停電グループ所属(グループ1,横浜南). 計画停電グループ所属(グループ1,けやき台). 計画停電グループ所属(グループ1,狭山ヶ丘). 計画停電グループ所属(グループ1,大井). 計画停電グループ所属(グループ4,上野毛). 計画停電グループ所属(グループ4,大井). 計画停電グループ所属(グループ5,埼玉). 計画停電グループ所属(グループ5,熊谷). % *** user: '計画停電' / 1 *** 計画停電(_年月日) :- 計画停電(_年月日,L), 計画停電表示(L). 計画停電表示(L) :- append(L0,[_グループ|R],L), 表示形式の取得(L0,_表示形式), 営業所並び文字列の取得(_グループ,_営業所並び文字列), wr(_表示形式,[_グループ,_営業所並び文字列]), R = []. 表示形式の取得(L0,_表示形式) :- length(L0,Len), 表示形式(Len,_表示形式). 表示形式(0,' %t 6:20-10:00; 13:50-17:30; %s\n'). 表示形式(1,' %t 9:20-13:00; 16:50-20:30; %s\n'). 表示形式(2,' %t 12:20-16:00; %s\n'). 表示形式(3,' %t 15:20-19:00; %s\n'). 表示形式(4,' %t 17:20-22:00; %s\n'). 営業所並び文字列の取得(_グループ,_営業所並び文字列) :- findall(_営業所,計画停電グループ所属(_グループ,_営業所),_営業所ならび), concat_atom(_営業所ならび,',',_営業所並び文字列). /* 計画停電(_日文字列,L) :- atom(_日文字列), sub_atom(_日文字列,_,2,_,_日文字列), 今日(_今日), 年月日から年月取得(_今日,_年月), concat_atom([_年月,_日文字列],_年月日), 計画停電(_年月日,L),!. 計画停電(_日,L) :- integer(_日), _日 =< 31, 今日(_今日), 年月日から年月取得(_今日,_年月), 整数から文字列(2,_日,_日文字列), concat_atom([_年月,_日文字列],_年月日), 計画停電(_年月日,L),!. 計画停電(_月日文字列,L) :- atom(_月日文字列), _月日文字列 @>= '0101', _月日文字列 @=< '1231', 今日(_今日), 年月日から年取得(_今日,_年), concat_atom([_年,_月日文字列],_年月日), 計画停電(_年月日,L),!. 計画停電(_月日,L) :- integer(_月日), _月日 >= 101, _月日 =< 1231, 今日(_今日), 年月日から年取得(_今日,_年), 整数から文字列(4,_月日,_月日文字列), concat_atom([_年,_月日文字列],_年月日), 計画停電(_年月日,L),!. */ 計画停電(_年月日,L) :- atom(_年月日), atom_length(_年月日,8), count((日付の発生('20110317',_年月日_1,_年月日), _年月日_1 @>= '20110317' , _年月日_1 @=< _年月日),_経過日数), ならびの回転(左方向,_経過日数,[グループ4,グループ5,グループ1,グループ2,グルーブ3],L) . ならびの回転(左方向,0,L,L) :- !. ならびの回転(左方向,N,[A|R1],L) :- N_1 is N - 1, append(R1,[A],L2), ならびの回転(左方向,N_1,L2,L). 日付の発生(_日付,_日付,_日付上限) :- _日付 @> _日付上限,!,fail. 日付の発生(_日付,_日付,_日付上限). 日付の発生(_日付の一,_日付,_日付上限) :- 年・月・日に分解(_日付の一,_年の一,_月の一,_日の一), 翌日(_年の一,_月の一,_日の一,_翌日), 日付の発生(_翌日,_日付,_日付上限). 年・月・日に分解(_年月日,_年,_月,_日) :- sub_atom(_年月日,0,4,_,_年), sub_atom(_年月日,4,2,_,_月), sub_atom(_年月日,6,2,_,_日). 翌日(_年,'12','31',_翌日) :- 翌年(_年,_翌年), concat_atom([_翌年,'01','01'],_翌日),!. 翌日(_年,_月,'31',_翌日) :- append(_,[_月|_],['01','03','05','07','08','10','12']), 翌月(_月,_翌月), concat_atom([_年,_翌月,'01'],_翌日),!. 翌日(_年,_月,'30',_翌日) :- append(_,[_月|_],['04','06','09','11']), 翌月(_月,_翌月), concat_atom([_年,_翌月,'01'],_翌日). 翌日(_年,'02','29',_翌日) :- concat_atom([_年,'03','01'],_翌日),!. 翌日(_年,'02','28',_翌日) :- \+(うるう年(_年)), concat_atom([_年,'03','01'],_翌日),!. 翌日(_年,_月,_日,_翌日) :- 翌日(_日,_翌日の日), concat_atom([_年,_月,_翌日の日],_翌日). 翌月(_月,_翌月) :- atom_to_term(_月,M,_), M2 is M + 1, 整数から文字列(2,M2,_翌月). 翌年(_年,_翌年) :- atom_to_term(_年,Y,_), Y2 is Y + 1, 整数から文字列(4,Y2,_翌年). 翌日(_日,_翌日) :- atom_to_term(_日,D,_), D2 is D + 1, 整数から文字列(2,D2,_翌日). うるう年(_年文字列) :- atom(_年文字列), atom_to_term(_年文字列,_年整数,_), !, うるう年(_年整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1295436346/173 # # 質問させてください # selectしたデータを一部だけ別のテーブルに入れる方法ってありますか? # # 例:insert into table2 (aaa,bbb,ccc) select aaa as aaa,bbb as bbb,ccc as ccc from table1 # この場合table1のデータがすべてtable2に入るのでaaaだけ別のデータを入れたいと思っています。 # よろしくお願いします。 # # 海に接していない都道府県名([栃木県,群馬県,埼玉県,山梨県,長野県,岐阜県,滋賀県,奈良県]). table1(奈良県,1000,aa). table1(埼玉県,2000,ab). selectしたデータを一部だけ別のテーブルに入れる方法 :- 海に接していない都道府県名(_海に接していない都道府県名ならび), table1(_都道府県名の一,_bbb,_ccc), 新しい都道府県名の生成(_海に接していない都道府県名ならび,_都道府県名の一,_都道府県名の二), assertz(table2(_都道府県名の二,_bbb,_ccc)), fail. selectしたデータを一部だけ別のテーブルに入れる方法. 新しい都道府県名の生成(_海に接していない都道府県名ならび,_都道府県名の一,_都道府県名の二) :- M is (random mod 8) + 1, list_nth(M,_海に接していない道府県名ならび,_都道府県名の二), \+(_都道府県名の一 = _都道府県名の二), \+(table2(_都道府県名の二,_,_)). 新しい都道府県名の生成(_海に接していない都道府県名ならび,_都道府県名の一,_都道府県名の二) :- 新しい都道府県名の生成(_海に接していない都道府県名ならび,_都道府県名の一,_都道府県名の二). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/12 # # 以下のようなテーブルがあるとします。 # [テーブル名:経費TBL] # 会社 , 部署 , 年度 , 月 , 経費 # ------------------------------- # AAA , AAA01 , 2009 , 1 , 10000 # AAA , AAA01 , 2009 , 1 , 20000 # AAA , AAA01 , 2009 , 2 , 30000 # AAA , AAA01 , 2009 , 3 , 40000 # BBB , AAA01 , 2009 , 4 , 50000 # BBB , AAA01 , 2010 , 1 , 60000 # CCC , AAA01 , 2010 , 1 , 70000 # CCC , AAA01 , 2010 , 1 , 80000 # # ここから以下のような、 # 会社別、部署別の集計データを作成したいとします。 # 会社 , 部署 , 200901経費計 , 200902経費計 , … , 201012経費計 # # この時、経費計列の条件指定はどうしたら良いのでしょうか? # # '会社別、部署別の集計データを作成したいとします。 会社 , 部署 , 200901経費計 , 200902経費計 , … , 2010122経費計 ' :- 見出し表示, findsetof([_会社,_部署],経費TBL(_会社,_部署,_,_,_),L1), append(_,[[_会社,_部署]]|R],L1), findall(_経費計,( 年度・月の生成(_年度,_月), findsum(_経費,( 経費TBL(_会社,_部署,_年度,_月,_経費)), _経費計)), _経費ならび), concat_atom(_経費ならび,',',_経費月別表示), write_formatted('%t,%t,%t\n',[_会社,_部署,_経費月別表示]), R = []. 年度・月の生成(2009,_月) :- for(1,_月,12). 年度・月の生成(2010,_月) :- for(1,_月,12). 見出し表示 :- write(' 会社 , 部署 '), 年度の生成(_年,_月), write_formatted_atom(S,', %4d%02d経費計 ',[_年,_月]), write(S), fail. 見出し表示 :- nl. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/564 # # http://ime.nu/codepad.org/jP4CQKdZ # リストの生成、検索、削除が出来るようにしてもらえないでしょうか? # # リストの生成(end,[]) :- !. リストの生成(gen,L) :- write('name,tel : '), get_line(Line), リストの生成(Line,L),!. リストの生成(Line,[[_name,_tel]|R]) :- split(Line,[','],[_name,_tel]), get_line(Line), リストの生成(Line2,R). リストから削除(L1,L2) :- write('削除キー : '), get_line(_削除キー), write('削除キー値 : '), get_line(_削除キー値), リスト構造(_削除キー,_削除値,_削除要素), リストから削除(_削除要素,L1,L2). リストから削除(_,[],[]) :- !. リストから削除(_削除要素,[_削除要素|R1],L2) :- リストから削除(_削除要素,R1,L2),!. リストから削除(_削除要素,[A|R1],[A|R2]) :- リストから削除(_削除要素,R1,R2). リスト構造(name,_name,[_name,_]). リスト構造(tel,_tel,[_,_tel]). リスト表示(L) :- findall('%t',リスト構造(_,_),L1), concat_atom(L1,',',_パターン), リスト表示(_パターン,L). リスト表示(_パターン,[L|R]) :- write_formatted('%t\n',L), リスト表示(_パターン,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1258320456/222 # # 2011年数学IIB第6問 # nを2以上の自然数とし、以下の操作を考える。 #  (i)nが偶数ならば、nを2で割る。 #  (ii)nが奇数ならば、nを3倍して1を加える。 # 与えられた2以上の自然数にこの操作を行い、得られた自然数が1でなければ、 # 得られた自然数にこの操作を繰り返す。2以上10の5乗以下の自然数から始めると、 # この操作を何回か繰り返すことで必ず1が得られることが確かめられている。 # たとえば、10から始めると #  10→5→16→8→4→2→1 # である。ただし、a→bは1回の操作で自然数aから自然数bが得られたことを意味する。 # Nを2以上10の5乗以下の自然数とするとき、F(N)をNから始めて1が得られるまでの # 上記の操作の回数と定義する。また、F(1)=0とおく。たとえば、上の例から、 # F(10)=6である。 # (1)F(6)=「ア」、F(11)=「イウ」である。 # (2)10の5乗以下の自然数Nについて、F(N)を求めるため、次のような「プログラム」を作った。 # ただし、INT(X)はXを超えない最大の整数を表す関数である。 % % python2_222_1.html と python2_222_2.html では実行時間にさらに大きな差が生じる。 % その原因は何か? % 'nを2以上の自然数とし、以下の操作を考える。 (i)nが偶数ならば、nを2で割る。 (ii)nが奇数ならば、nを3倍して1を加える。得られた自然数が1になるまで繰り返しその回数を計る'(_n,_回数), length(L,_n), 得られた自然数が1になるまで繰り返しその回数を計る(L,X), length(X,_回数). 得られた自然数が1になるまで繰り返しその回数を計る([_],[]) :- !. 得られた自然数が1になるまで繰り返しその回数を計る(L,[_|X]) :- append(L1,L1,L), 得られた自然数が1になるまで繰り返しその回数を計る(L1,X),!. 得られた自然数が1になるまで繰り返しその回数を計る(L,[_|X]) :- append(L,L,L2), append(L2,L,L3), 得られた自然数が1になるまで繰り返しその回数を計る([_|L3],X). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/371 # # [1] 授業単元:万年カレンダーの作成 # [2] 問題文(含コード&リンク): # ユーザーが指定した年・月のカレンダーを表示するアプリケーションを作る。 # ユーザーに年と月の入力させ、指定された月から4ヶ月分のカレンダーを表示させる。 # 詳しい説明・仕様 http://ime.nu/www1.axfc.net/uploader/File/so/58289 # # 1.ユーザーが指定可能な日付の範囲 # 西暦1年の1月から西暦9999年の9月まで ※表示範囲は9999年12月まで # # 2.暦の条件 # 2.1.曜日 #  西暦1年1月1日を月曜日とする。 # # 2.2.うるう年 #  ・4で割り切れる年はうるう年 #  ・ただし100で割り切れる年はうるう年ではない #  ・ただし400で割り切れる年はうるう年 # # 2.3.祝日・国民の休日 #  ・祝日が日曜の場合は翌日以降の平日を振替休日にする #  ・国民の休日とは、国民の祝日にはさまれた平日を指す 例)2009/09/22 # # 元旦     1月1日 # 成人の日   1月第2月曜日 # 建国記念日  2月11日 # 春分の日※ # 昭和の日   4月29日 # 憲法記念日  5月3日 # みどりの日  5月4日 # こどもの日  5月5日 # 海の日    7月の第3月曜日 # 敬老の日   9月の第3月曜日 # 秋分の日※ # 体育の日   10月の第2月曜日 # 文化の日   11月3日 # 勤労感謝の日 11月23日 # 天皇誕生日  12月23日 # # 春分の日・秋分の日は次の計算式によって求める。 # a)西暦1980年〜2099年 #  春分の日(3月X日) #   X=INT(20.8431+0.242194*(Year-1980)-INT((Year-1980)/4)) # 秋分の日(9月X日) #   X=INT(23.2488+0.242194*(Year-1980)-INT((Year-1980)/4)) # (Yearは西暦の年、INT()は、括弧内の小数部切り捨てを意味する) # # b)a以外の年 #  春分の日:3月23日,秋分の日:9月23日 # # 3.動作の流れ # 1)プログラムを実行 # 2)年入力をうながすメッセージの表示 ex.西暦何年のカレンダーを表示しますか? # 3)ユーザーが年情報の入力する # 4)(?)入力された年情報が1〜9999だった場合は、月情報の入力をうながすメッセージが表示される。 ex.何月から表示しますか? #  (?)未入力や、無効な数値・文字が入力された場合はエラーメッセージが表示され、再入力をうながして2)にもどる ex.年は1〜9999の範囲で入力してください # 5)ユーザーが月情報を入力する # 6)(?)入力された月情報が1〜12(9999年の場合は1〜9)だった場合は、指定された年月から4ヶ月分のカレンダーが表示される #  (?)未入力や、無効な数値・文字が入力された場合はエラーメッセージが表示され、再入力をうながして4)(?)にもどる ex.月は1〜12の範囲で入力してください # 7)続いてカレンダーを表示するかをユーザーに問う  # ex.続けて表示しますか? 1:次の4ヶ月を表示/2:年と月を指定する/9:終了する ユーザーの入力値により処理続行または終了する # # 4.出力イメージ # ・カレンダーは指定年月から4ヶ月分を一度に表示する # ・各月を横に2ヶ月ずつ、2段に表示する # ・土日祝日及び振替休日は、日付前にマークをつけ、平日と区別する # ・各月ごとのレイアウトが自由  # # # ↓コマンドプロンプトでの出力イメージ # # # 2009 9月 2009 10月 # 日 月 火 水 木 金 土  9月と同じ要領で  #    1 2 3 4 * 5 # @ 6 7 8 9 10 11 *12 # @13 14 15 16 17 18 *19 # @20 #21 $22 #23 24 25 *26 # @27 28 29 30 # # 2009 11月     2009 12月 # 9月と同じ要領で  9月と同じ要領で # # # # # # # # @:日曜日 *:土曜日 #:祝日 $:休日 &:振替休日 # # 1:次の4ヶ月を表示 2:年と月を指定する 9:終了する  カレンダー表示(_年,_月) :- 四ヶ月分のカレンダー((_年,_月,_カレンダー,_年_1,_月_1,_カレンダー_1,_年_2,_月_2,_カレンダー_2,_年_3,_月_3,_カレンダー_3), カレンダー見出し(_年,_月,_年_1,_月_1), 二ヶ月ならびカレンダー表示(_カレンダー,_カレンダー1), write('\n\n'), カレンダー見出し(_年_2,_月_2,_年_3,_月_3), 二ヶ月ならびカレンダー表示(_カレンダー_2,_カレンダー3),!. カレンダー見出し(_年_1,_月_1,_年_2,_月_2) :- write_formatted('%4d年%2d月 %4d年%2d月\n',[_年_1,_月_1,_年_2,_月_2]),!. 二ヶ月ならびカレンダー表示([],[]) :- !. 二ヶ月ならびカレンダー表示([L1|R1],[L2|R2]) :- flat(L1,S1), flat(L2,S2), write_formatted('%t %t\n',[S1,S2]), 二ヶ月ならびカレンダー表示(R1,R2). 四ヶ月分のカレンダー(_年,_月,_カレンダー,_年_1,_月_1,_カレンダー_1,_年_2,_月_2,_カレンダー_2,_年_3,_月_3,_カレンダー_3) :- カレンダー(_年,_月,_カレンダー), 翌月(_年,_月,_年_1,_月_1), カレンダー(_年_1,_月_1,_カレンダー_1), 翌月(_年_1,_月_1,_年_2,_月_2), カレンダー(_年_2,_月_2,_カレンダー_2), 翌月(_年_2,_月_2,_年_3,_月_3), カレンダー(_年_3,_月_3,_カレンダー_3),!. カレンダー(_年,_月,_カレンダー) :- length(Cal,35), 'Zellerの公式を用いて曜日を得る'(_振替休日の年,_振替休日の月,_日,_曜日を表す値,日曜), length(L0,_曜日を表す値), append(L0,L1,Cal), この月の最終日は(_最終日), 日付を振る(1,_最終日,L1), 付加する符号を振る(1,_最終日,_年,_月,L1), すべての変数に空白を埋める(Cal,_カレンダー),!. 日付を振る(N,_最終日,_) :- N > _最終日,!. 日付を振る(N,_最終日,[[_,_,_,N]|R]) :- N < 10, N2 is N + 1, 日付を振る(N2,_最終日,R),!. 日付を振る(N,_最終日,[[_,_,N10,N0]|R]) :- N >= 10, N10 is N // 10, N0 is N mod 10, N2 is N + 1, 日付を振る(N2,_最終日,R),!. 付加する符号を振る(N,_最終日,_年,_月,[[_,'#',D1,D2]|R]) :- 国民の祝日(_,_年,_月,N), N2 is N + 1, 付加する符号を振る(N2,_最終日,_年,_月,R),!. 付加する符号を振る(N,_最終日,_年,_月,[[_,'$',D1,D2]|R]) :- 国民の休日(_,_年,_月,N), N2 is N + 1, 付加する符号を振る(N2,_最終日,_年,_月,R),!. 付加する符号を振る(N,_最終日,_年,_月,[[_,'&',D1,D2]|R]) :- 振替休日(_,_年,_月,N), N2 is N + 1, 付加する符号を振る(N2,_最終日,_年,_月,R),!. 付加する符号を振る(N,_最終日,_年,_月,[[_,'@',D1,D2]|R]) :- 'Zellerの公式を用いて曜日を得る'(_振替休日の年,_振替休日の月,_日,_曜日を表す値,日曜), N2 is N + 1, 付加する符号を振る(N2,_最終日,_年,_月,R),!. 付加する符号を振る(N,_最終日,_年,_月,[[_,'*',D1,D2]|R]) :- 'Zellerの公式を用いて曜日を得る'(_振替休日の年,_振替休日の月,_日,_曜日を表す値,土曜), N2 is N + 1, 付加する符号を振る(N2,_最終日,_年,_月,R),!. 付加する符号を振る(N,_最終日,_年,_月,[_|R]) :- N2 is N + 1, 付加する符号を振る(N2,_最終日,_年,_月,R),!. すべての変数に空白を埋める([],[]) :- !. すべての変数に空白を埋める([V|R1],[[' ',' ',' ',' ']|R2]) :- var(V), すべての変数に空白を埋める(R1,R2),!. すべての変数に空白を埋める([L|R1],[L1|R2]) :- 変数を空白に変換(L,L1), すべての変数に空白を埋める(R1,R2),!. 変数を空白に変換([],[]) :- !. 変数を空白に変換([V|R1],[' '|R1]) :- var(V), 変数を空白に変換(R1,R2),!. 変数を空白に変換([V|R1],[V|R1]) :- \+(var(V)), 変数を空白に変換(R1,R2),!. この月の最終日は(_年,2,29) :- うるう年(_年),!. この月の最終日は(_年,2,28) :- \+(うるう年(_年)),!. この月の最終日は(_年,_月,31) :- append(_,[_月|_],[1,3,5,7,8,10,12]),!. この月の最終日は(_年,_月,30) :- append(_,[_月|_],[4,6,9,11]),!. 祝日が日曜の場合は翌日以降の平日を振替休日にする(_振替休日の年,_振替休日の月,_振替休日の日) :- 国民の祝日(_,_振替休日の年,_振替休日の月,_日), 'Zellerの公式を用いて曜日を得る'(_振替休日の年,_振替休日の月,_日,_,日曜), 振替休日を探す(_振替休日の年,_振替休日の月,_日,_振替休日の日). 国民の休日とは、国民の祝日にはさまれた平日を指す(_国民の休日の年,_国民の休日の月,_国民の休日の日) :- 前日(_国民の休日の年,_国民の休日の月,_国民の休日の日,_前日の年,_前日の月,_前日の日), 翌日(_国民の休日の年,_国民の休日の月,_国民の休日の日,_翌日の年,_翌日の月,_翌日の日), 国民の祝日(_,_前日の年,_前日の月,_前日の日), 国民の祝日(_,_翌日の年,_翌日の月,_翌日の日),!. 振替休日を探す(_振替休日の年,_振替休日の月,_日,_振替休日の日) :- between(_日,31,_振替休日の日), \+(国民の祝日(_,_振替休日の年,_振替休日の月,_振替休日の日)), 'Zellerの公式を用いて曜日を得る'(_振替休日の年,_振替休日の月,_振替休日の日,_,_曜日), \+(_曜日=日曜),!. 翌月(_年,12,_翌年,1) :- _翌年 is _年 + 1,!. 翌月(_年,_月,_年,_翌月) :- _翌月 is _月 + 1. 前日(_年,_月,_日,_前日の年,_前日の月,_前日の日) :- 前日のの月がわり調整(_年,_月,_日,_前日の年,_前日の月,_前日の日). 翌日(_年,_月,_日,_翌日の年,_翌日の月,_翌日の日) :- 翌日の月がわり調整(_年,_月,_日,_翌日の年,_翌日の月,_翌日の日). 前日の月がわり調整(_整数年,1,1,_変更された整数年,12,31) :- _変更された整数年 は _整数年 - 1,!. 前日の月がわり調整(_整数年,_整数月,1,_整数年,_変更された整数月,31) :- member(_整数月,[2,4,6,8,9,11]), _変更された整数月 は _整数月 - 1,!. 前日の月がわり調整(_整数年,_整数月,1,_整数年,_変更された整数月,30) :- member(_整数月,[5,7,10,12]), _変更された整数月 は _整数月 - 1,!. 前日の月がわり調整(_整数年,3,1,_整数年,2,29) :- 0 is _整数年 mod 4,!. 前日の月がわり調整(_整数年,3,1,_整数年,2,28) :- \+(0 is _整数年 mod 4),!. 前日の月がわり調整(_整数年,_整数月,_整数日,_整数年,_整数月,_変更された整数日) :- _変更された整数日 は _整数日 - 1,!. 翌日の月がわり調整(_整数年,12,31,_変更された整数年,1,1) :- _変更された整数年 は _整数年 + 1,!. 翌日の月がわり調整(_整数年,_整数月,30,_整数年,_変更された整数月,1) :- member(_整数月,[4,6,8,9,11]), _変更された整数月 は _整数月 + 1,!. 翌日の月がわり調整(_整数年,_整数月,31,_整数年,_変更された整数月,1) :- member(_整数月,[1,3,5,7,10]), _変更された整数月 は _整数月 + 1,!. 翌日の月がわり調整(_整数年,2,29,_整数年,3,1) :- 0 is _整数年 mod 4,!. 翌日の月がわり調整(_整数年,2,28,_整数年,3,1) :- \+(うるう年(_整数年)),!. 翌日の月がわり調整(_整数年,_整数月,_整数日,_整数年,_整数月,_変更された整数日) :- _変更された整数日 は _整数日 + 1,!. 祝休日の記号(日曜日,'@'). 祝休日の記号(土曜日,'*'). 祝休日の記号(国民の祝日,'#'). 祝休日の記号(国民の休日,'$'). 祝休日の記号(振替休日,'&'). 国民の祝日(元旦,_年,1,1). 国民の祝日(成人の日,1,_日) :- between(8,14,_日), 'Zellerの公式を用いて曜日を得る'(_年,1,_日,_,月曜). 国民の祝日(建国記念日,_年,2,11). 国民の祝日(春分の日,_年,3,_日) :- 春分の日(_年,3,_日). 国民の祝日(昭和の日,_年,4,29). 国民の祝日(憲法記念日,_年,5,3). 国民の祝日(みどりの日,_年,5,4). 国民の祝日(こどもの日,_年,5,5). 国民の祝日(海の日,_年,7,_日) :- between(15,21,_日), 'Zellerの公式を用いて曜日を得る'(_年,7,_日,_,月曜). 国民の祝日(敬老の日,_年,9,_日) :- between(15,21,_日), 'Zellerの公式を用いて曜日を得る'(_年,9,_日,_,月曜). 国民の祝日(秋分の日,_年,9,_日) :- 秋分の日(_年,9,_日). 国民の祝日(体育の日,_年,10,_日) :- between(8,14,_日), 'Zellerの公式を用いて曜日を得る'(_年,10,_日,_,月曜). 国民の祝日(文化の日,_年,11,3). 国民の祝日(勤労感謝の日,_年,11,23). 国民の祝日(天皇誕生日,_年,12,23). 春分の日(_年,3,_日) :- _年 >= 1980, _年 =< 2099, _日 is truncate(20.8431+0.242194*(_年-1980)-truncate((_年-1980)/4)),!. 春分の日(_年,3,23). 秋分の日(_年,9,_日) :- _年 >= 1980, _年 =< 2099, _日 is truncate(23.2488+0.242194*(_年-1980)-truncate((_年-1980)/4)),!. 秋分の日(_年,9,23). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100, !, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 'Zellerの公式を用いて曜日を得る'(_年,1,_日,_曜日を表す値,_曜日) :- _年_1 is _年 - 1, 'Zellerの公式を用いて曜日を得る'(_年_1,13,_日,_曜日を表す値,_曜日),!. 'Zellerの公式を用いて曜日を得る'(_年,2,_日,_曜日を表す値,_曜日) :- _年_1 is _年 - 1, 'Zellerの公式を用いて曜日を得る'(_年_1,14,_日,_曜日を表す値,_曜日),!. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 曜日を表す値(_曜日を表す値,_曜日),!. 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/313 # # [1] 授業単元:プログラミング演習 2 # [2] 問題文(含コード&リンク) # # 1..キーボードから学生番号と氏名の組をn個読み込み、ファイルに書き込む関数を作れ。 # ただし、nの値とファイル名は引数として取得するものとする。 # 2..引数で取得したファイル名のファイルから同じく引数で取得した個数の学生番号と # 氏名のデータを構造体変数に格納し、学生番号順に表示する関数を作れ。 # 3..以上で作成した関数を使用し、プログラムを完成せよ。ただし、nの値と使用するファイルの名前は # プログラムの引数として与えられるものとする。 program :- user_parameters([_n個文字列,_ファイル]), atom_to_term(_n個文字列,_n個,_), キーボードから学生番号と氏名の組をn個読み込み、ファイルに書き込む(_n個,_ファイル), 引数で取得したファイル名のファイルから同じく引数で取得した個数の学生番号と氏名のデータを構造体変数に格納し、学生番号順に表示する(_ファイル,_n個). 'キーボードから学生番号と氏名の組をn個読み込み、ファイルに書き込む'(_n個,_ファイル) :- length(L,_n個), 学生番号と氏名の組を読み込む(L), open(_ファイル,write,Outstream), append(_,[[_学生番号,_氏名]|R],L), write_foratted(Outstream,'%t,%t\n',[_学生番号,_氏名]), R = [], close(Outstream),!. 引数で取得したファイル名のファイルから同じく引数で取得した個数の学生番号と氏名のデータを構造体変数に格納し、学生番号順に表示する(_ファイル,_n個) :- length(L,_n個), get_line(_ファイル,Lines), append(L,_,Lines), sort(L,_整列済みデータ), append(_,[[_学生番号,_氏名]|R],_整列済みデータ), write_formatted('%t,%t\n',[_学生番号,_氏名]), R = [],!. 学生番号と氏名の組を読み込む([]) :- !. 学生番号と氏名の組を読み込む([[_学生番号,_氏名]|R]) :- 学生番号を読み込む(_学生番号), 氏名を読み込む(_氏名), 学生番号と氏名の組を読み込む(R). 学生番号を読み込む(_学生番号) :- write('学生番号を入力してください : '), get_line(_学生番号),!. 学生番号を読み込む(_氏名) :- write('氏名を入力してください : '), get_line(_氏名),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/965 # # [1] 授業単元: cプログラム # [2] 問題文(含コード&リンク):100点満点の試験の得点データが学生の人数分ある。これを「不定個数のデータの読み込み」の #  どちらかの方法(最初にデータの個数を読み込むか、データの終わりを特別な値で知らせるか) #  で読み込み、10点刻みでの度数分布表を作成しなさい。 # '100点満点の試験の得点データが学生の人数分ある。これを「不定個数のデータの読み込み」のどちらかの方法(最初にデータの個数を読み込むか、データの終わりを特別な値で知らせるか)で読み込み、10点刻みでの度数分布表を作成する' :- 最初にデータの個数を読み込む(_データの個数), length(_得点ならび,_データの個数), 得点データを読み込む(_得点ならび), '10点刻みでの度数分布表を作成する'(_得点ならび,_度数分布ならび), 度数分布表の表示(_度数分布ならび). 最初にデータの個数を読み込む(_データの個数) :- write('データの個数を入力してください : '), get_line(Line), データの個数読み込み診断(Line,_データの個数),!. 最初にデータの個数を読み込む(_データの個数) :- 最初にデータの個数を読み込む(_データの個数). データの個数読み込み診断(Line,_データの個数) :- atom_to_term(Line,_データの個数,_), integer(_データの個数), _データの個数 > 0,!. データの個数読み込み診断(Line,_データの個数) :- write_formatted('入力された %t から正の整数が得られませんでした。再入力をお願いします。\n',[Line]), fail. 得点データを読み込む(L) :- findall(_得点,( append(L0,[_得点|_]),L), 得点データを読み込む([_|L0],_得点)), L). 得点データを読み込む(Ln,_得点) :- length(Ln,Len), write_formatted('%t人目の得点を入力してください : ',[Len]), get_line(Line), 得点データ診断(Line,_得点),!. 得点データを読み込む(Ln,_得点) :- 得点データを読み込む(Ln,_得点). 得点データ診断(Line,_得点) :- atom_to_term(Line,_得点,_), integer(_得点), _得点 >= 0, _得点 =< 100,!. 得点データ診断(Line,_) :- write_formatted('入力された %t から0以上100以下の整数の得点は得られませんでした。\n再入力をお願いします\n',[Line]), fail. '10点刻みでの度数分布表を作成する'(L,_データの個数,_度数分布表) :- '10点刻みでの度数ならびを作成する'(L,[0,0,0,0,0,0,0,0,0,0,0],_度数ならび), findall(U,( append(_,[A|_],_度数ならび), U is truncate(floor((A * 100 / _データの個数) + 0.5))), _度数分布表). '10点刻みでの度数ならびを作成する'([],L,L) :- !. '10点刻みでの度数ならびを作成する'([A|R],L1,L) :- 度数ならびの更新(A,L1,L2), '10点刻みでの度数ならびを作成する'(R,L2,L). 度数ならびの更新(_得点,L1,L2) :- _位置 is _点数 // 10, append(L0,[_度数|R],L1), length(L0,_位置), _度数2 is _度数 + 1, append(L0,[_度数2|R],L2),!. 度数分布表の表示(_度数分布表) :- write('階級 , 度数\n'), 度数分布表の表示(0,_度数分布表). 度数分布表の表示(_,[]) :- !. 度数分布表の表示(100,[_度数|R]) :- write_formatted('%2d ,%3d\n',[N,N1,_度数]),!. 度数分布表の表示(N,[_度数|R]) :- N1 is N + 9, write_formatted('%2d-%2d,%3d\n',[N,N1,_度数]), N2 is N + 10, 度数分布表の表示(N2,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/703 # # [1] 授業単元:プログラミング演習 2 # [2] 問題文(含コード&リンク) # # 1..キーボードから学生番号と氏名の組をn個読み込み、ファイルに書き込む関数を作れ。ただし、nの値とファイル名は引数として取得するものとする。 # 2..引数で取得したファイル名のファイルから同じく引数で取得した個数の学生番号と氏名のデータを構造体変数に格納し、学生番号順に表示する関数を作れ。 # 3..以上で作成した関数を使用し、プログラムを完成せよ。ただし、nの値と使用するファイルの名前はプログラムの引数として与えられるものとする。 キーボードから学生番号と氏名の組をn個読み込み、ファイルに書き込む。その後そのファイルから情報を読み込み学生番号順に表示する(_n,_ファイル名) :- キーボードから学生番号と氏名の組をn個読み込み、ファイルに書き込む(_n,_ファイル名), 引数で取得したファイル名のファイルから同じく引数で取得した個数の学生番号と氏名のデータを構造体変数に格納し、学生番号順に表示する(_n,_ファイル名). 'キーボードから学生番号と氏名の組をn個読み込み、ファイルに書き込む'(_n,_ファイル名) :- write('学生番号と氏名の組みをカンマ区切りで%t行入力してください : '), length(L,_n), findall(_行,( append(_,[_行|_],L)), L), put_lines(_ファイル名,L). 引数で取得したファイル名のファイルから同じく引数で取得した個数の学生番号と氏名のデータを構造体変数に格納し、学生番号順に表示する(_n,_ファイル名) :- length(LL1,_n), see(_ファイル名), findall([_学生番号,_氏名],( append(_,[_|_],L1L), get_split_line(Instream,[','],[_学生番号,_氏名])), LL1), close(Instream), sort(LL1,LL2), append(_,[L|R],LL2), write_formatted('%t%t\n',L), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/666 # # [1] 授業単元: # [2] 問題文: http://ime.nu/ux.getuploader.com/sanada1678/download/17/%E3%82%B3%E3%83%94%E3%83%BC+%EF%BD%9E+%E8%AA%B2%E9%A1%8C.csv # # ある駐車場が昼間20分100円の料金で駐車場を貸しています。 # 左のデータは入出庫のデータです。 # 駐車時間の長さの分類はおもに # 20分,40分,1時間,2時間,6時間,12時間,24時間以上 # です。これをもとに次の問題を解決せよ。 # # 毎時00分時点での(つまり1時間ごとの) # 駐車している駐車台数を自動計算するように表計算のプログラムを作成したい。 # # 1.1時間の間(たとえばその日の13時から14時)に入場してきた車の台数 #   その時間内に清算して出場して行った台数を自動計算するように表計算の #   プログラムを作成せよ。その結果として、00分時点での駐車台数が自動計算できる #   ようにプログラムを作成せよ。 # # 2.一定期間内(例えば1日や一週間と特定して)での #   駐車時間の長さで分類した台数 #   たとえば 30分以内,1H,2H,6H,12H,24H以上 #   が自動計算できるようにプログラムを作成せよ。 # # 3.とりあえず最初に駐車していた台数を0台として表を作成せよ。 #   それが出来たら最初に駐車していた台数を任意に設定することで #   その後の駐車している台数を自動計算できるように表を作成せよ。 # # 11月、12月などのデータを入力しても瞬時に計算できるようにしておく。 # 夜間の駐車料金などもデータから推測せよ。 # # 2010/10/31 20:38,2010/10/31 23:24,,300,300,,,,,,,,, # 2010/10/31 10:47,2010/10/31 22:12,,600,600,,,,,,,,, # 2010/10/31 12:25,2010/10/31 22:06,,600,600,,,,,,,,, # 2010/10/31 19:13,2010/10/31 21:52,,500,500,,,,,,,,, # 2010/10/31 18:49,2010/10/31 21:50,,600,600,,,,,,,,, # 2010/10/31 15:30,2010/10/31 21:45,,600,600,,,,,,,,, # 2010/10/31 10:06,2010/10/31 21:37,,600,600,,,,,,,,, # 2010/10/30 21:57,2010/10/31 21:32,,600,600,,,,,,,,, # 2010/10/31 13:02,2010/10/31 21:29,,600,600,,,,,,,,, # 2010/10/31 20:25,2010/10/31 21:16,,100,100,,,,,,,,, # 2010/10/30 21:19,2010/10/31 21:02,,600,600,,,20,,,,,, # 2010/10/31 9:43,2010/10/31 20:53,,600,600,,,,,,,,, # 2010/10/31 17:45,2010/10/31 20:43,,600,600,,,,,,,,, # 2010/10/31 18:38,2010/10/31 20:38,,600,600,,,00,,,,,, # 2010/10/29 6:53,2010/10/31 20:23,,1800,1800,,,,,,,,, # 2010/10/31 8:04,2010/10/31 19:53,,600,600,,,,,,,,, # 2010/10/31 5:32,2010/10/31 19:25,,600,600,,,,,,,,, # 2010/10/31 12:19,2010/10/31 19:15,,600,600,,,,,,,,, # 2010/10/31 5:53,2010/10/31 19:09,,600,600,,,00,,,,,, /* 'ある駐車場が昼間20分100円の料金で駐車場を貸しています。'. */ '左のデータは入出庫のデータです。'(_入出庫データファイル,_入出庫データならび) :- get_split_lines(_入出庫データファイル,[','],_入出庫データならび). /* '駐車時間の長さの分類はおもに20分,40分,1時間,2時間,6時間,12時間,24時間以上です。'(_駐車開始時刻,_駐車終了時刻,_駐車時間) :- 駐車時間は同一日である(_駐車開始時刻,_駐車終了時刻). '駐車時間の長さの分類はおもに20分,40分,1時間,2時間,6時間,12時間,24時間以上です。'(_駐車開始時刻,_駐車終了時刻,_駐車時間) :- \+(駐車時間は同一日である(_駐車開始時刻,_駐車終了時刻)). */ '毎時00分時点での(つまり1時間ごとの)駐車している駐車台数を自動計算する'(_毎時00分時点での駐車している駐車台数ならび) :- '左のデータは入出庫のデータです。'(_入出庫データファイル,_入出庫データならび), '毎時00分時点での(つまり1時間ごとの)駐車している駐車台数を自動計算するように表計算のプログラムを作成したい。'(_入出庫データならび,_毎時00分時点での駐車している駐車台数ならび). '毎時00分時点での(つまり1時間ごとの)駐車している駐車台数を自動計算する'(LL,LL2) :- findsetof([_年,_月,_日,_時],( append(_,[L|R1],LL), 発生した年・月・日・時(L,_年,_月,_日,_時)), LL1), findall([_年,_月,_日,_時,_駐車台数],( append(_,[[_年,_月,_日,_時]|_],LL1), '毎時00分時点での(つまり1時間ごとの)駐車している駐車台数'(LL,_年,_月,_日,_時,_駐車台数)), LL2). 発生した年・月・日・時([_時刻|_],_年,_月,_日,_時) :- split(_時刻,[' ','/',':'],[_年,_月,_日,_時|_]). 発生した年・月・日・時([_,_時刻|_],_年,_月,_日,_時) :- split(_時刻,[' ','/',':'],[_年,_月,_日,_時|_]). '毎時00分時点での(つまり1時間ごとの)駐車している駐車台数'(LL,_年,_月,_日,_時,_駐車台数) :- count(( member([A,B|_],LL), split(A,['/',' ',':'],LA), split(B,['/',' ',':'],LB), LA @=< [_年,_月,_日,_時,0], LB @>= [_年,_月,_日,_時,0]), _駐車台数),!. '1時間の間(たとえばその日の13時から14時)に入場してきた車の台数その時間内に清算して出場して行った台数を自動計算する'(LL,_年,_月,_日,_時,_入場車数,_出場車数) :- count(( member([A|_],LL), split(A,['/',' ',':'],LA), LA @>= [_年,_月,_日,_時,0], LA @=< [_年,_月,_日,_時,59]), _入場車数), count(( member([_,A|_],LL), split(A,['/',' ',':'],LA), LA @>= [_年,_月,_日,_時,0], LA @=< [_年,_月,_日,_時,59]), _出場車数),!. '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'(LL,_時刻下限,_時刻上限,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上) :- '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'(LL,_時刻下限,_時刻上限,0,0,0,0,0,0,0,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上). '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'([],_時刻下限,_時刻上限,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上) :- !. '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'([[_入場時刻,_出場時刻|_]|R],_時刻下限,_時刻上限,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上) :- split(_入場時刻,[' ','/',':'],[_年_1,_月_1,_日_1,_時_1,_分_1]), split(_出場時刻,[' ','/',':'],[_年_2,_月_2,_日_2,_時_2,_分_2]), [_年_1,_月_1,_日_1,_時_1,_分_1] @>= _時刻下限, [_年_2,_月_2,_日_2,_時_2,_分_2] @=< _時刻上限, 入場時刻と出場時刻の時間差分単位(_入場時刻,_出場時刻,_時間差分単位), 時間差単位(_時間差分単位,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_2,_2H_2,_2H_2,_6H_2,_22H_2,_24H_2,_24H以上_2), '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'(R,_時刻下限,_時刻上限,_30分以内_2,_1H_2,_2H_2,_6H_2,_12H_2,_24H_2,_24H以上_2,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上). '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'([_|R],_時刻下限,_時刻上限,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上) :- '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'(R,_時刻下限,_時刻上限,_30分以内_1,_1H_1,_1H_1,_6H_1,_12H_1,_14H_1,_14H以上_1,_30分以内,_1H,_1H,_6H,_12H,_14H,_14H以上). 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_2,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1) :- _分 =< 30, _30分以内_2 is _30分以内_1 + 1,!. 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_2,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1) :- _分 >= 30,_分 < 60, _1H_2 is _1H_1 + 1,!. 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_1,_2H_2,_6H_1,_12H_1,_24H_1,_24H以上_1) :- _分 >= 60,_分 < 120, _2H_2 is _2H_1 + 1,!. 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_1,_2H_1,_6H_2,_12H_1,_24H_1,_24H以上_1) :- _分 >= 120,_分 < 360, _6H_2 is _6H_1 + 1,!. 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_2,_24H_1,_24H以上_1) :- _分 >= 360,_分 < 720, _12H_2 is _12H_1 + 1,!. 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_2,_24H以上_1) :- _分 >= 720,_分 < 1440, _24H_2 is _24H_1 + 1,!. 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_2) :- _分 >= 1440, _24H以上_2 is _24H以上_1 + 1,!. 'とりあえず最初に駐車していた台数を0台として表を作成せよ。それが出来たら最初に駐車していた台数を任意に設定することでその後の駐車している台数を自動計算できるように表を作成せよ。'. '11月、12月などのデータを入力しても瞬時に計算できるようにしておく。夜間の駐車料金などもデータから推測せよ。'. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 入場時刻と出場時刻の時間差分単位(_入場時刻,_出場時刻,_時間差分単位) :- atom(_入場時刻), atom(_出場時刻), split(_入場時刻,['/',' ',':'],[_年_1,_月_1,_日_1,_時_1,_分_1]), split(_出場時刻,['/',' ',':'],[_年_2,_月_2,_日_2,_時_2,_分_2]), 出場時刻と入場時刻の時間差分単位([_年_1,_月_1,_日_1,_時_1,_分_1],[_年_2,_月_2,_日_2,_時_2,_分_2],_時間差分単位). 入場時刻と出場時刻の時間差分単位([_年,_月,_日,_時,_分_1],[_年,_月,_日,_時,_分_2],_時間差分単位) :- _時間差分単位 is _分2 - _分1,!. 入場時刻と出場時刻の時間差分単位([_年,_月,_日,_時_1,_分_1],[_年,_月,_日,_時_2,_分_2],_時間差分単位) :- _時間差分単位 is (60 * _時_2 + _分_2) - (60 * _時_1 + _分1),!. 入場時刻と出場時刻の時間差分単位([_年,_月,_日_1,_時_1,_分_1],[_年,_月,_日_2,_時_2,_分_2],_時間差分単位) :- _時間差分単位 is (1440 * _日_2 + 60 * _時_2 + _分_2) - (1440 * _日_1 + 60 * _時_1 + _分1),!. 入場時刻と出場時刻の時間差分単位([_年,_月_1,_日_1,_時_1,_分_1],[_年,_月_2,_日_2,_時_2,_分_2],_時間差分単位) :- _月_2_1 is _月_2 - 1, findsum(_月日数,( for(_月_1,_月,_月_2_1), 月日数(_年_1,_月,_月日数)), _月日数合計の一), _月日数合計 is truncate(_月日数合計の一), _時間差分単位 is (1440 * _月日数合計 + 1440 * _日_2 + 60 * _時_2 + _分_2) - (1440 * _日_1 + 60 * _時_1 + _分_1),!. 入場時刻と出場時刻の時間差分単位([_年_1,_月_1,_日_1,_時_1,_分_1],[_年_2,_月_2,_日_2,_時_2,_分_2],_時間差分単位) :- _年_2_1 is _年_2 - 1, findsum(_年日数,( for(_年_1,_年,_年_2_1), 年日数(_年,_年日数)), _年日数合計の一), _年日数合計 is truncate(_年日数合計の一), _月_1_1 is _月_1 - 1, findsum(_月日数,( for(0,_月,_月_1_1), 月日数(_年_1,_月,_月日数)), _月日数合計の一), _月日数合計_1 is truncate(_月日数合計の一), _月_2_1 is _月_2 - 1, findsum(_月日数,( for(0,_月,_月_2_1), 月日数(_年_2,_月,_月日数)), _月日数合計の二), _月日数合計_2 is truncate(_月日数合計の二), _時間差分単位 is (1440 * _年日数の合計 + 1440 * _月日数合計_2 + 1440 * _日_2 + 60 * _時_2 + _分_2) - (1440 * _月日数合計_1 + 1440 * _日_1 + 60 * _時_1 + _分_1),!. 年日数(_年,366) :- うるう年(_年),!. 年日数(_年,365). 月日数(_年,2,29) :- うるう年(_年),!. 月日数(_年,2,29) :- \+(うるう年(_年)),!. 月日数(_年,_月,31) :- append(_,[_月|_],[1,3,5,7,8,10,12]),!. 月日数(_年,_月,30) :- append(_,[_月|_],[4,6,9,11]),!. 月日数(_,0,0). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail . うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/532 # # 2] 問題文(含コード&リンク):「お菓子などのおまけを全種集めるためには平均して何個お菓子を購入すればよいか」を調べるプログラムを作りなさい。また処理概要の説明をしなさい。 # # たとえば、全部で10種類おまけがあったとして、すでに所持2種類ならば、非所持は8種類。 # ⇒1から8の乱数を発生させて1から8が全部集まったら、集まるまでに何度乱数発生させたかを記憶。 # ←これを1万回ほど繰り返して、平均して何度購入すればよいかを求める。 # という流れで作ろうと思うのですが、この例で1から8まで集まったことをどうやって確認するのかわからず、 # お手上げ状態です。どなたかお力添えいただければ幸いです。 おまけが出る確率(1,0.08). おまけが出る確率(2,0.08). おまけが出る確率(3,0.3). おまけが出る確率(4,1.0). おまけが出る確率(5,0.5). おまけが出る確率(6,0.2). おまけが出る確率(7,0.1). おまけが出る確率(8,0.1). おまけが出る確率(9,0.3). おまけが出る確率(10,0.15). おまけ乱数表の生成(LL) :- findall(L,( for(1,_菓子番号,10), おまけが出る確率(_菓子番号,_確率), N is truncate(100 * _確率), length(Ln,N), 'N個分の乱数を確保'(N,[],L)), LL). 'N個分の乱数を確保'(N,L,L) :- length(L,N),!. 'N個分の乱数を確保'(N,L1,L) :- X is random mod 100, \+(append(_,[X|_],L1)), 'N個分の乱数を確保'(N,[X|L1],L),!. 'N個分の乱数を確保'(N,L1,L) :- 'N個分の乱数を確保'(N,L1,L),!. 'お菓子などのおまけを全種集めるためには平均して何個お菓子を購入すればよいか」を調べる'(_すべての菓子のおまけが得られる平均回数) :- おまけ乱数表の生成(LL), findavg(Count,( for(1,_,1000), すべての菓子のおまけが得られるまで(LL,[],0,Count)), _すべての菓子のおまけが得られる平均回数). すべての菓子のおまけが得られるまで(LL,L1,Count,Count) :- length(L1,10),!. すべての菓子のおまけが得られるまで(LL,L1,Count1,Count) :- R is random mod 100, findall(N,( for(1,N,10), \+(append(_,[N|_],L1)), list_nth(N,LL,L), append(_,[R|_],L)), L2), append(L1,L2,L3), Count2 is Count1 + 1, すべての菓子のおまけが得られるまで(LL,L3,Count2,Count). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/771 # # 【課題】 # インスタンス変数として、氏名、生年月日、教員IDを持つTeacherというクラスを実装する必要が生じたとする。 # TeacherはStudentクラスの氏名、生年月日に関するコードの再利用して実装出来そうである。 # 【形態】1. Javaアプリケーション # 【期限】1月13日 # 【補足】もう一度書きなおしてみました。継承を使ってください。Personクラスを新たに導入してください。../test/read.cgi/tech/1267796762/721の問題と関連しています。 # # class 'Person' has instance attribute 氏名,生年月日; end. class 'Teacher' has nature 'Person'; instance attribute 教員ID; end. class 'Student' has nature 'Person'; instance end. % 以下のサイトは # 出典:: 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 # # 5.1 成績データとして最初に学生数が入力され、続いてその数だけ # 0から100までの成績が入力される。入力された成績の、合計、平均、 # 標準偏差を表示するプログラムを作成せよ。ただし、学生数は100を # 越えないものとする。 '成績データとして最初に学生数が入力され、続いてその数だけ0から100までの成績が入力される。入力された成績の、合計、平均、標準偏差を表示するプログラムを作成せよ。ただし、学生数は100を越えないものとする。' :- write('学生の数を入力してください : '), get_integer(_学生の数), _学生の数 =< 100, length(L,_学生の数), その数だけ0から100までの成績が入力される(L), 合計(L,_合計), 平均(L,_平均), 標準偏差(L,_平均,_標準偏差), write_formatted('入力された成績の合計は%t,平均は%t,標準偏差は%tです。\n',[_合計,_平均,_標準偏差). 合計(L,_合計) :- 加算(L,_合計). 平均(L,_平均) :- 相加平均(L,_平均). 標準偏差(L,_平均,_標準偏差) :- length(L,_学生の数), 標準偏差(L,_学生の数,_平均,0.0,_標準偏差). 標準偏差([],N,M,S,V) :- V is sqrt(S / (N - 1)),!. 標準偏差([A|R],N,M,S,V) :- S1 is (A - M) ^ 2, S2 is S + S1, 標準偏差(R,N,M,S2,V). % 以下のサイトは # 出典:: 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.3 乱数を使って計算機とジャンケンをするゲームを作成せよ。 # 人間の入力はグーは0、チョキは1、パーは2などとし、勝ち、負け、 # 引き分けの判定をすること。 '乱数を使って計算機とジャンケンをするゲームを作成せよ。人間の入力はグーは0、チョキは1、パーは2などとし、勝ち、負け、引き分けの判定をする'(_判定) :- repeat, 人間の入力(_人間の拳), 乱数を使って計算機と(_計算機の拳), 判定(_人間の拳,_計算機の拳,_判定). 人間の入力(_人間の拳) :- write('拳を入力してください 0..グー 1..チョキ 2..パー : '), get_integer(_整数), 拳に変換(_整数,_人間の拳). 拳に変換(0,グー). 拳に変換(1,チョキ). 拳に変換(2,パー). 乱数を使って計算機と(_計算機の拳) :- _計算機が生成した整数 is random mod 3, 拳に変換(_計算機が生成した整数,_計算機の拳). 判定(_拳,_拳,引き分け). 判定(グー,チョキ,勝ち). 判定(チョキ,パー,勝ち). 判定(パー,グー,勝ち). 判定(チョキ,グー,負け). 判定(パー,チョキ,負け). 判定(グー,パー,負け). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/721 # # 【課題】Studentというクラスを宣言するプログラムを作成せよ。インスタンス変数には、氏名、生年月日、学籍番号を記録せよ。 # ただし、学籍番号は入学年度を表す二桁の整数、学部を表す一桁の整数、残り四桁の整数を組み合わせた七桁の整数で表現されるものとする。 # インスタンスメソッドとしては、以下のものは必須とする。 # 名字を返すメソッド、名前を返すメソッド、誕生年を和暦で返すメソッド、誕生年を西暦で返すメソッド、入学年度を返すメソッド # 【形態】1. Javaアプリケーション # 【期限】1月11日 # 【ver】linux # 【補足】あまり難しくしないでください。 # データベース構造(学生,1,氏名). データベース構造(学生,2,誕生日). データベース構造(学生,3,学籍番号). 名字を返す(_学籍番号,_名字) :- 学籍番号変換(_学籍番号,_整数学籍番号), 学生(_氏名,_誕生日,_整数学籍番号), split(_氏名,[' ',',','-','_'],[_名字,_]). 名前を返す(_学籍番号,_名前) :- 学籍番号変換(_学籍番号,_整数学籍番号), 学生(_氏名,_誕生日,_整数学籍番号), split(_氏名,[' ',',','-','_'],[_,_名前]). 誕生年を和暦で返す(_学籍番号,_誕生日の和暦) :- 学籍番号変換(_学籍番号,_整数学籍番号), 学生(_氏名,_誕生日,_整数学籍番号), 和暦西暦変換(_誕生日の和暦,_誕生日). 誕生年を西暦で返す(_学籍番号,_誕生日の西暦) :- 学籍番号変換(_学籍番号,_整数学籍番号), 学生(_氏名,_誕生日の西暦,_整数学籍番号). 入学年度を返す(_学籍番号,_入学年度) :- 学籍番号変換(_学籍番号,_整数学籍番号), _入学年度 is _整数学籍番号 // 10000. 学籍番号変換(_学籍番号,_学籍番号) :- integer(_学籍番号),!. 学籍番号変換(_学籍番号,_整数学籍番号) :- \+(integer(_学籍番号)), atom_chars(_学籍番号,Chars), すべてが数字(Chars), atom_to_term(_学籍番号,_整数学籍番号,_),!. 学籍番号変換(_学籍番号ではなくて氏名,_整数学籍番号) :- atom(_学籍番号ではなくて氏名), 学生(_学籍番号ではなくて氏名,_,_整数学籍番号),!. すべてが数字([]) :- !. すべてが数字([A|R]) :- append(_,[A|_],['0','1','2','3','4','5','6','7','8','9']), すべてが数字(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/29 # # 【質問テンプレ】 # [1] 授業単元: 情報数学2 # [2] 問題文(含コード&リンク): #   3行5列の15人の学生の身長が記録されたheight.csvがあります。 #   それぞれの学生に対しランダムで0.1刻みで0.1から0.5までの値を付加します。 #   このポイントを基礎ポイントといいます。 #   \1行目の学生5人を取り出しそれぞれの学生に対し、 #   *ランダムで0.1刻みで0.1から0.5までの値を基礎ポイントに対し付加します。 #   5人の学生の中で与えられたポイントの合計が最も少ない学生を回の代表値とします。* #   基礎ポイントに対しランダム値を付加し回の代表値を選出する作業(*〜*)を、 #   同じ1行目の5人の学生に対し5回行います。 #   5回分の代表値の中で最も多い値を行の代表値とします。\ #   1行分の行の代表者の選出(\〜\)を3行分繰り返します。 #   全てのステップを行い結果をresult.csvとして出力します。 # # http://hibari.2ch.net/test/read.cgi/tech/1294061094/30 #   result.csvの形式は、 #   3行71列の表になります。 #   1〜5列目まではheight.csvと同じ出力です。 #   6〜10列目まではそれぞれの学生にどんな基礎ポイントが付加されたかを示し、 #   11〜15列目は1回目のランダム付加でどのような値が付加されたかを示し、 #   16〜20列目は基礎ポイントと付加ポイントの合計を示し、 #   21列目は1回目の回の代表値を示し、 #   22列目は回の代表者の身長を示します。 #   23〜34列目は2回目、 #   35〜46列目は3回目、 #   47〜58列目は4回目、 #   59〜70列目は5回目を示します。 #   71列目は行の代表者の身長を示します。 # 元のheight.csvの3行5列の並び順と、 #   それ以降の処理での3行5列の部分の値の位置は対応するようにお願いします。 #   長くなって申し訳ありません。 #   よろしくお願いいたします。 # '1行分の行の代表者の選出を3行分繰り返します。' :- '3行5列の15人の学生の身長が記録されたheight.csvがあります。'(LL), 基礎ボイント(_基礎ポイント), tell('height.csv'), '1行分の行の代表者の選出を3行分繰り返します。'(1,LL,_基礎ポイント), told. '1行分の行の代表者の選出を3行分繰り返します。'(_N行目,_,_) :- _N行目 > 3,!. '1行分の行の代表者の選出を3行分繰り返します。'(_N行目,LL,_基礎ポイント) :- '同じN行目の5人の学生に対し5回行います。'(_N行目,LL,_基礎ポイント,_付加された基礎ポイント,_代表の身長). _次の行 is _N行目 + 1, '1行分の行の代表者の選出を3行分繰り返します。'(_次の行,LL,_付加された基礎ポイント). '3行5列の15人の学生の身長が記録されたheight.csvがあります。'(LL) :- get_aplit_lines('height.csv',[' ',','],LL). 基礎ポイント(_基礎ポイント) :- length(_基礎ポイント,3), findall(L,( length(L,5), append(_,[L|_],_基礎ポイント)), _基礎ポイント), 'それぞれの学生に対しランダムで0.1刻みで0.1から0.5までの値を付加します。'(_基礎ポイント). 'それぞれの学生に対しランダムで0.1刻みで0.1から0.5までの値を付加します。'([]) :- !. 'それぞれの学生に対しランダムで0.1刻みで0.1から0.5までの値を付加します。'([L|R]) :- findall(_付加する数,( append(_,[_付加する数|_],L), _付加する数 is ((random mod 5) + 1) / 10)), L), 'それぞれの学生に対しランダムで0.1刻みで0.1から0.5までの値を付加します。'(R). '同じN行目の5人の学生に対し5回行います。'(_N行目,LL,_基礎ポイント,_付加された基礎ポイント,_代表の身長) :- list_nth(_N行目,LL,L), write_formatted('%t,%t,%t,%t,%t,',L), list_nth(_N行目,_基礎ポイント,_N行目の基礎ポイント), write_formatted('%t,%t,%t,%t,%t,',[_N行目の基礎ボイント]), length(Ln,5), '同じN行目の5人の学生に対し5回行います。'(Ln,_N行目,_基礎ポイント,_付加された基礎ポイント,_代表値ならび), 行代表者の身長は(_N行目,LL,_代表値ならび,_代表の身長), write_formatted('%t\n',[_代表の身長]),!. 行代表者の身長は(_N行目,LL,_代表値ならび,_代表の身長). min(_代表値ならび,[_行の代表値,_n人目]), list_nth(_N行目,LL,L), list_nth(_n人目,L,_代表の身長),!. '同じN行目の5人の学生に対し5回行います。'([],_,_基礎ポイント,_基礎ポイント,[]) :- !. '同じN行目の5人の学生に対し5回行います。'([_|Ln],_N行目,_基礎ポイント,_付加された基礎ポイント,[[_代表値,_n人目]|R3]) :- 'N行目の学生5人を取り出しそれぞれの学生に対し、ランダムで0.1刻みで0.1から0.5までの値を基礎ポイントに対し付加します。'(_N行目,_基礎ポイント,_付加された基礎ポイント2,_付加されたポインならび), '5人の学生の中で与えられたポイントの合計が最も少ない学生を回の代表値とします。'(_5人の与えられたポイントの合計ならび,_代表値,_n人目), 代表者の身長(LL,_N行目,_n人目,_代表者の身長), 一回分の表示(_N行目,_付加された基礎ポイント2,_付加されたポイントならび,_代表値,_代表者の身長), '同じN行目の5人の学生に対し5回行います。'(Ln,_N行目,_付加された基礎ポイント2,_付加された基礎ポイント,R3). 代表者の身長(LL,_N行目,_n人目,_代表者の身長) :- list_nth(_N行目,LL,L), list_nth(_n人目,L,_代表者の身長),!. 一回分の表示(_付加された基礎ポイント2,_付加されたポイントならび,_代表値,_代表者の身長) :- list_nth(_N行目,_付加されたポイント2,L), write_formatted('%t,%t,%t,%t,%t,',L), write_formatted('%t,%t,%t,%t,%t,',_付加されたポイントならび), write_formatted('%t,'[_代表値,_代表者の身長]),!. 'N行目の学生5人を取り出しそれぞれの学生に対し、ランダムで0.1刻みで0.1から0.5までの値を基礎ポイントに対し付加します。'(_,_,[],[],[]) :- !. 'N行目の学生5人を取り出しそれぞれの学生に対し、ランダムで0.1刻みで0.1から0.5までの値を基礎ポイントに対し付加します。'(_N行目,_N行目,[_N行目の学生の基礎ポイント|R1],[_付加された基礎ポイント|R2],[_付加する数ならび|R3]) :- findall(_付加する数,( _付加する数 is ((random mod 5) + 1) / 10)), _付加する数ならび), findall(_付加された数,( append(L01,[_学生の基礎ポイント|_],_N行目の学生の基礎ポイント), append(L02,[_付加する数|_],_付加する数ならび), length(L01,Len), length(L02,Len), _付加された数 is _付加する数 + _学生の基礎ポイント), _付加された基礎ポイント), N2 is _N行目 + 1, 'N行目の学生5人を取り出しそれぞれの学生に対し、ランダムで0.1刻みで0.1から0.5までの値を基礎ポイントに対し付加します。'(N2,_N行目,R1,R2,R3). 'N行目の学生5人を取り出しそれぞれの学生に対し、ランダムで0.1刻みで0.1から0.5までの値を基礎ポイントに対し付加します。'(N,_N行目,[L|R1],[L|R2],R3) :- N2 is N1 + 1, 'N行目の学生5人を取り出しそれぞれの学生に対し、ランダムで0.1刻みで0.1から0.5までの値を基礎ポイントに対し付加します。'(N2,_N行目,R1,R2,R3). /* '5人の学生の中で与えられたポイントの合計が最も少ない学生を回の代表値とします。'(_5人の与えられたポイントの合計ならび,_代表値,_n人目) :- min(_5人の与えられたポイントの合計ならび,_代表値), list_nth(_n人目,_5人の与えられたポイントの合計ならび,_代表値),!. '基礎ポイントに対しランダム値を付加し回の代表値を選出する作業'(_基礎ポイント1,_基礎ポイント2,_代表値) :- '1行目の学生5人を取り出しそれぞれの学生に対し、ランダムで0.1刻みで0.1から0.5までの値を基礎ポイントに対し付加します。'(_基礎ポイント1,_基礎ポイント2), '5人の学生の中で与えられたポイントの合計が最も少ない学生を回の代表値とします。'(_基礎ポイント2,_代表値). */ % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/710 # # 【 課題 】 # 1 から n までの整数の合計を返すメソッドをつくる # 【 形態 】Javaアプリケーション(main()で開始) # 【 期限 】1/7 # 【 Ver  】1.6 # 【 補足 】 # n<0の時は-1 + -2 + -3 + -4 + -5 ... +1 =合計 # のように合計を求める。 # nは符号付きint、合計の戻り値は符号付きlongです。 # nはランダムで10万回実行するのにかかる時間が # わかるように表示する。 # 合計が正確な値なのはnがどの範囲か、不正確である # 場合はどのような値が返されるか解答する(例外処理を # 入れろということだと思います)。 # # '1 から n までの整数の合計を返すメソッドをつくる'(_n,_合計) :- _n >= 0, '1 から n までの整数の合計を返すメソッドをつくる'(1,_n,0,_合計). '1 から n までの整数の合計を返すメソッドをつくる'(_n,_合計) :- _n < 0, '-1 から n までの整数の合計を返すメソッドをつくる'(-1,_n,0,_合計). '1 から n までの整数の合計を返すメソッドをつくる'(_n,_n,_合計1,_合計) :- error_protect(_合計 is _合計1 + _n,エラー表示(_合計 is _合計1 + _n)),!. '1 から n までの整数の合計を返すメソッドをつくる'(M,_n,_合計1,_合計) :- error_protect(_合計2 is _合計1 + M,エラー表示(_合計2 is _合計1 + M)), M_2 is M + 1, '1 から n までの整数の合計を返すメソッドをつくる'(M_2,_n,_合計2,_合計). '-1 から n までの整数の合計を返すメソッドをつくる'(_n,_n,_合計1,_合計) :- error_protect(_合計 is _合計1 + _n + 1,エラー表示(_合計 is _合計1 + _n + 1)),!. '-1 から n までの整数の合計を返すメソッドをつくる'(M,_n,_合計1,_合計) :- error_protect(_合計2 is _合計1 + M,エラー表示(_合計2 is _合計1 + M)), M_1 is M - 1, '-1 から n までの整数の合計を返すメソッドをつくる'(M_1,_n,_合計2,_合計). error_protect(Goal,Handler) :- exception_handler(Goal,error(E,I),(set_global(exception,(error(E,I),fail)),Handler)). エラー表示(S is _式) :- write_formatted('桁あふれが発生しました。%t\nこれ以後の計算は正しい答えになっていません。\n',[S is _式]),!. 'ランダムで10万回実行するのにかかる時間がわかるように表示する。' :- A is time, for(1,N,100000), _n is random, '1 から n までの整数の合計を返すメソッドをつくる'(_n,_合計), N = 100000, B is time, C is B - A, write_formatted('10万回の呼び出しにかかった時間は %t 秒です。\n',[C]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/918 # # [1] 授業単元:プログラミング # [2] 問題文: #   5*5の' 'と'#'の2文字から構成される二次元配列のtxtファイルを読み込み、 #    # '5*5の'' ''と''#''の2文字から構成される二次元配列のtxtファイルを読み込み、''#''を1,'' ''を0と表示させる'(_ファイル名) :- '5*5の" "と"#"の2文字から構成される二次元配列のtxtファイルを読み込み'(_ファイル名,LL), '"#"を1," "を0と表示させる'(LL). '''#''を1,'' ''を0と表示させる'(LL) :- append(_,[L|R],LL), append(_,[A|R1],L), '#か空白か'(N,A), write_formatted('%t ',[N]), R1 = [], write('\n'), R = [],!. '5*5の'' ''と''#''の2文字から構成される二次元配列のtxtファイルを読み込み'(_ファイル名,LL) :- open(_ファイ名,read,Instream), read(Instream,LL), close(Instream),!. '二次元配列textファイルの生成'(_ファイル名) :- lenth(LL,5), findall(L,( length(L,5), append(_,[A|R],L), Mod is random mod 2, '#か空白か'(Mod,A)), LL), open(_ファイル,write,Outstream), write_formatted(Outstream,'%q.\n',[LL]), close(Outstream),!. '#か空白か'(1,'#'). '#か空白か'(0,' '). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/332 # # ●環境 # vb.net # # ●したいこと # 3文字以上の繰り返し表現を抽出 # # ●サンプル # 例文1)死にたい死にたい死にたい死にたい死にたい # 結果1)死にたい # # ●したいこと # 2箇所以上出現する3文字以上の文字列 # # 例文2)筋肉バスターと阿修羅バスター # 結果2)バスター # # # ってのを正規表現でやるのは無理でしょうか・・・ # '重複しない3文字以上の繰り返し表現を抽出'(_文字列,_重複しない3文字以上の繰り返し表現ならび) :- findsetof(_3文字以上の繰り返し表現,( '3文字以上の繰り返し表現を抽出'(_文字列,_3文字以上の繰り返し表現), _重複しない3文字以上の繰り返し表現ならび). '3文字以上の繰り返し表現を抽出'(_文字列,_3文字以上の繰り返し表現) :- sub_atom(_文字列,_開始点,_長さ,_残り長さ,[_3文字以上の繰り返し表現|R]), _長さ >= 3, _開始点2 is _開始点 + _長さ, sub_atom(_文字列,_開始点2,_長さ,_残り長さ2,_3文字以上の繰り返し表現). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289816228/237 # # プログラム初心者です。 # 寺の門徒のデータベースを作って管理したいと考えています。 # # データの項目としては # 故人のデータ:法名、俗名、命日(年月日)、年齢、続柄、世帯主 # 世帯主のデータ:氏名、住所、電話番号 # お布施のデータ:世帯主、金額、年月日、種類(月参り、会費、法事・・・) # (どのようにまとめたらいいかはまだ考え中です) # # やりたいことは、 # 1.2011年の年回忌(1,3,7,13,17、・・・)のデータを抽出して世帯主宛に案内の文面を作る # 2.故人のデータ(命日)から中陰表(七日毎のお参りの日程表)を作る # 3.会計 # # 故人のデータや世帯主のデータはExcelで入力済ですが、 # そこから簡単に(数クリックで)1.2のようなことができないかと考えています。 # どのようなプログラムを使えばよいのでしょうか? # 寺名(大徳寺芳春院). '2014年の年回忌(1,3,7,13,17、・・・)のデータを抽出して世帯主宛に案内の文面を作る' :- '2014年の年回忌データの抽出'([1,3,7,13,17,23,27,33,50],_2014年の年回忌データならび), 回忌案内の作成(_2014年の年回忌データならび). '2014年の年回忌データの抽出'([],[]) :- !. '2014年の年回忌データの抽出'([_回忌|R1],[[_回忌,_年回忌データ]|R2]) :- '2014年の年回忌と命日の年変換'(_回忌,_命日の年), findall([_法名,_俗名,_命日,_年齢,_続柄,_世帯主,_住所,_電話番号],( 故人情報(_法名,_俗名,_命日,_年齢,_続柄,_世帯主,_住所,_電話番号)), _年回忌データ), '2014年の年回忌データの抽出'(R1,R2). '2014年の年回忌と命日の年変換'(1,2013) :- !. '2014年の年回忌と命日の年変換'(_回忌,_年) :- _年 is 2014 - _回忌 + 1,!. 故人情報(_法名,_俗名,_命日,_年齢,_続柄,_世帯主,_住所,_電話番号) :- 故人のデータ(_法名,_俗名,_命日,_年齢,_続柄,_世帯主), sub_atom(_命日,0,4,_,_命日の年), _世帯主=_氏名, 世帯主のデータ(_氏名,_住所,_電話番号). 回忌案内の作成([]) :- !. 回忌案内の作成([[_回忌|_回忌データならび]|R]) :- 回忌を指定して回忌案内の作成(_回忌,_回忌データならび), 回忌案内の作成(R). 回忌を指定して回忌案内の作成(_回忌,[_回忌データ|R]) :- 世帯主宛に案内の文面を作る(_回忌,_回忌データ), 回忌を指定して回忌案内の作成(_回忌,R). 世帯主宛に案内の文面を作る(1,[_法名,_俗名,_命日,_年齢,_続柄,_世帯主,_住所,_電話番号]) :- 寺名(_寺名), writef('一周忌法要のご案内\n%t様御中\n今年は故%t様(法名%t)の一周忌のご法要の年となりました。\n%tでは檀家の皆様が故人を偲び\n仏様と故人、そして皆様のめぐりあいの場として\n一周忌法要の準備を整えております。\nここにご案内申しあげます。\n',[_世帯主,_俗名,_法名,_寺名]),!. 世帯主宛に案内の文面を作る(_回忌,[_法名,_俗名,_命日,_年齢,_続柄,_世帯主,_住所,_電話番号]) :- 寺名(_寺名), 回忌の数字変換(_回忌,_回忌漢字表現), writef('%t回忌法要のご案内\n%t様御中\n今年は縁深き故%t様(法名%t)の%t回忌のご法要の年となりました。\n%tでは檀家の皆様が故人を偲び\n仏様と故人、そして皆様のめぐりあいの場として\n%t回忌法要の準備を整えております。\nここにご案内申しあげます。\n',[_回忌漢字表現,_世帯主,_俗名,_法名,_回忌漢字表現,_寺名,_回忌漢字表現]). 回忌の数字変換([1,3,7,13,17,23,27,33,50],[一,三,七,十三,十七,二十三,二十七,三十三,五十]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 故人のデータ(死死死死生生生生居士,尾崎隆大,'20111009',38,長男,尾崎作蔵). 世帯主のデータ(尾崎作蔵,'京都市右京区花園天授ケ岡888','075-444-9999'). /* '中陰表(七日毎のお参りの日程表)を作る'(_中陰逮夜,_故人の命日,_中陰逮夜日) :- 中陰逮夜(_中陰逮夜), 中陰逮夜(_中陰逮夜,_故人の命日,_中陰逮夜日). 中陰逮夜(初七日,_命日,_初七日) :- '5日後'(_命日,_初七日). 中陰逮夜(_初月忌,_命日,_中陰) :- '翌月の同日'(_命日,_中陰). 中陰逮夜(_満中陰,_命日,_中陰) :- 中陰逮夜(百箇日,_命日,_中陰) :- 中陰逮夜(_中陰,_命日,_中陰) :- sub_atom(_中陰,2,1,_,日), sub_atom(_中陰,0,2,_,_数字漢字表現), list_nth(Nth,[二十七,三十七,四十七,五十七,六十七],_数字漢字表現), list_nth(Nth,[27,37,47,57,67], N_1 is N - 1, 'n日後'(N_1,_命日,_中陰). 中陰逮夜(初七日). 中陰逮夜(二七日). 中陰逮夜(三七日). 中陰逮夜(四七日). 中陰逮夜(初月忌). 中陰逮夜(五七日). 中陰逮夜(六七日). 中陰逮夜(満中陰). 中陰逮夜(百箇日). */ % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/773 # # [1]