このディレクトリの索引

% 以下のサイトは # 出典 :: CodeIQ q1565 # 【問題】 # できるだけ多くの人数で、肩車をしようと思います。 #      # # 肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。 # # # 【例】 # 一行ごとに、身長と体重のセットが与えられます。次の例は、5人の身長と体重を表しています。 # 166 71 # 178 84 # 176 94 # 174 85 # 174 65 # # # この中から肩車をする人間を選ぶと、身長と体重が # (166, 71) # (174, 85) # (176, 94) # の3人が最大人数になります。 # # ※身長と体重共に、上の人が下の人“より小さい”場合に肩車が許されるとしていますので、 #  (174, 85)の上に(174, 65)が乗ることはできません。 'できるだけ多くの人数で、肩車をしようと思います。      肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'(_最大人数) :- 身長と体重のセットを得る(_身長と体重のセット), 'できるだけ多くの人数で、肩車をしようと思います。'(_身長と体重のセット,_最大人数). 身長と体重のセットを得る(_身長と体重のセット) :- 行を得る(_行,_終了状態), 身長と体重のセットを得る(_終了状態,_行,_身長と体重のセット). 身長と体重のセットを得る(入力終了,_,[]) :- !. 身長と体重のセットを得る(_,_行,_身長体重ならび) :- 入力終了になるまで行入力を続ける(_,_行,_身長体重ならび). 入力終了になるまで行入力を続ける(_,_行,[[_身長,_体重]|_残りの行ならび]) :- read_term_from_atom(_行,(_身長,_体重),[]), 行を得る(_次の行,_終了状態), 身長と体重のセットを得る(_終了状態,_次の行,_残りの行ならび). 'できるだけ多くの人数で、肩車をしようと思います。'(_人間ならび,_最大人数) :- findall(_肩車人数,( 肩車人数(_人間ならび,_肩車人数)),_肩車人数ならび), max_list(_肩車人数ならび,_最大人数). 肩車人数(_人間ならび,_肩車人数) :- select(_取りだされた人間,_人間ならび,_残りの人間ならび), 肩車を重ねる(_取りだされた人間,_残りの人間ならび,_肩車重ね), length(_肩車重ね,_肩車人数). 肩車を重ねる(_自分,_人間ならび,[_自分|_肩車重ね]) :- 上の人を選択できる限り選択する(_自分,_人間ならび,_肩車重ね). 肩車を重ねる(_一番上の人間,_,[_一番上の人間]). 上の人を選択できる限り選択する(_自分,_人間ならび,_肩車重ね) :- select(_上の人間,_人間ならび,_残りの人間ならび), '肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'(_上の人間,_自分), 肩車を重ねる(_上の人間,_残りの人間ならび,_肩車重ね). '肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'([_上の人間の身長,_上の人間の体重],[_自分の身長,_自分の体重]) :- _上の人間の身長 @< _自分の身長, _上の人間の体重 @< _自分の体重. 行を得る(_行,_終了状態) :- get_char(_文字), 行を得る(_文字,_文字ならび,_終了状態), atomic_list_concat(_文字ならび,_行). 行を得る(_入力文字,[],_終了状態) :- 入力文字が改行文字またはend_of_fileの時停止する(_入力文字,_終了状態),!. 行を得る(_文字,_行ならび,_終了状態) :- 行を得るために文字入力を続ける(_文字,_行ならび,_終了状態). 入力文字が改行文字またはend_of_fileの時停止する('\n',改行終了). 入力文字が改行文字またはend_of_fileの時停止する(end_of_file,入力終了). 行を得るために文字入力を続ける(_文字,[_文字|_残りの文字ならび],_終了状態) :- get_char(_次の文字), 行を得る(_次の文字,_残りの文字ならび,_終了状態). % 以下のサイトは # 出典 :: CodeIQ q1533 # # 中学数学のひとつの山ともいえる、因数分解。 # 数学を嫌いになるきっかけとなってしまった人も多いのではないでしょうか? # そんな因数分解を、プログラミングで解いてみましょう! # # ■問題 # 二次式αx2+βx+γにおいて、係数α、β、γの値が与えられます。 # これを(ax+b)(cx+d)の形に因数分解し、a, b, c, dの値を出力してください。 # # # ■例 # 【入力】 # 4, -23, 15 # 【出力】 # 4, -3, 1, -5 # # つまり、4x2-23x+15=(4x-3)(x-5)という因数分解を行った結果を出力するプログラムです。 # (出力は、順番を入れ替えた1, -5, 4, -3でも正解となりますが、いずれか一方を出力するものとします。) # なお、α、β、γとして与えられる数字は互いに素な整数であるものとします。 # ※出力エラーの表記は、エラーとわかる何らかの出力で構いません。(※2015年4月20日13:30追記) # # # 最低限、以下のテストデータで正しい出力が得られることを確認してください。 # # 【テストデータ1:入力】 # 3, 10, 3 # 【出力】 # 1, 3, 3, 1 または 3, 1, 1, 3 # # 【テストデータ2:入力】 # 6, -1, -15 # 【出力】 # 2, 3, 3, -5 または 3, -5, 2, 3 # # 【テストデータ3:入力】 # 12, -1, -6 # 【出力】 # 3, 2, 4, -3 または 4, -3, 3, 2 # # 【テストデータ4:入力】 # 3, -8, 4 # 【出力】 # 1, -2, 3, -2 または 3, -2, 1, -2 # # 【テストデータ5:入力】 # 3, 5, 7 # 【出力】 # エラー # '二次式αx2+βx+γにおいて、係数α、β、γの値が与えられます。 これを(ax+b)(cx+d)の形に因数分解し、a, b, c, dの値を出力してください。'(_α,_β,_γ,_a,_b,_c,_d) :- findall([_a,_b,_c,_d], '二次式αx2+βx+γにおいて、係数α、β、γの値が与えられます。 これを(ax+b)(cx+d)の形に因数分解し、'(_α,_β,_γ,_a,_b,_c,_d),_解ならび), 重複解を取り除く(_解ならび,_a,_b,_c,_d). '二次式αx2+βx+γにおいて、係数α、β、γの値が与えられます。 これを(ax+b)(cx+d)の形に因数分解し、'(_α,_β,_γ,_a,_b,_c,_d) :- '_a,_b,_c,_dの候補を得る'(_α,_γ,_a,_b,_c,_d), _β is _a * _d + _b * _c. '_a,_b,_c,_dの候補を得る'(_α,_γ,_a,_b,_c,_d) :- '_a,_c候補'(_α,_a,_c), '_b,_d候補'(_γ,_b,_d). '_a,_c候補'(_α,_a,_c) :- 因数に分解する(_α,_a,_c) . '_b,_d候補'(_γ,_b,_d) :- 因数に分解する(_γ,_b,_d) . 因数に分解する(A,B,C) :- 'Aの絶対値からB_1候補を得る'(A,_正のA,B_1), '因数B_1,C_1を得る'(_正のA,B_1,C_1), 符号の組合せ(A,B_1,C_1,B,C). 'Aの絶対値からB_1候補を得る'(A,_正のA,B_1) :- _正のA is abs(A), between(1,_正のA,B_1). '因数B_1,C_1を得る'(_正のA,B_1,C_1) :- 0 is _正のA mod B_1, C_1 is _正のA // B_1. 符号の組合せ(A,B_1,C_1,B,C) :- 'Aが正の時は二数の符号は同じになる'(A,B_1,C_1,B,C). 符号の組合せ(A,B_1,C_1,B,C) :- 'Aが負の時は二数の符号は異なる'(A,B_1,C_1,B,C). 'Aが正の時は二数の符号は同じになる'(A,B_1,C_1,B,C) :- A > 0, 二数の符号は同じになる(A,B_1,C_1,B,C). 二数の符号は同じになる(A,B,C,B,C). 二数の符号は同じになる(A,B_1,C_1,B,C) :- B is B_1 * -1, C is C_1 * -1. 'Aが負の時は二数の符号は異なる'(A,B_1,C_1,B,C) :- A < 0, 二数の符号は異なる(A,B_1,C_1,B,C). 二数の符号は異なる(A,B_1,C,B,C) :- B is B_1 * -1. 二数の符号は異なる(A,B,C_1,B,C) :- C is C_1 * -1. 重複解を取り除く(_解ならび,_a,_b,_c,_d) :- append(L0,[[_a,_b,_c,_d]|_],_解ならび), \+(member([_c,_d,_a,_b],L0)). % 以下のサイトは # 出典 :: CodeIQ q1533 # # 中学数学のひとつの山ともいえる、因数分解。 # 数学を嫌いになるきっかけとなってしまった人も多いのではないでしょうか? # そんな因数分解を、プログラミングで解いてみましょう! # # ■問題 # 二次式αx2+βx+γにおいて、係数α、β、γの値が与えられます。 # これを(ax+b)(cx+d)の形に因数分解し、a, b, c, dの値を出力してください。 # # # ■例 # 【入力】 # 4, -23, 15 # 【出力】 # 4, -3, 1, -5 # # つまり、4x2-23x+15=(4x-3)(x-5)という因数分解を行った結果を出力するプログラムです。 # (出力は、順番を入れ替えた1, -5, 4, -3でも正解となりますが、いずれか一方を出力するものとします。) # なお、α、β、γとして与えられる数字は互いに素な整数であるものとします。 # ※出力エラーの表記は、エラーとわかる何らかの出力で構いません。(※2015年4月20日13:30追記) # # # 最低限、以下のテストデータで正しい出力が得られることを確認してください。 # # 【テストデータ1:入力】 # 3, 10, 3 # 【出力】 # 1, 3, 3, 1 または 3, 1, 1, 3 # # 【テストデータ2:入力】 # 6, -1, -15 # 【出力】 # 2, 3, 3, -5 または 3, -5, 2, 3 # # 【テストデータ3:入力】 # 12, -1, -6 # 【出力】 # 3, 2, 4, -3 または 4, -3, 3, 2 # # 【テストデータ4:入力】 # 3, -8, 4 # 【出力】 # 1, -2, 3, -2 または 3, -2, 1, -2 # # 【テストデータ5:入力】 # 3, 5, 7 # 【出力】 # エラー # '二次式αx2+βx+γにおいて、係数α、β、γの値が与えられます。 これを(ax+b)(cx+d)の形に因数分解し、a, b, c, dの値を出力してください。'(_α,_β,_γ,_a,_b,_c,_d) :- findall([_a,_b,_c,_d], '二次式αx2+βx+γにおいて、係数α、β、γの値が与えられます。 これを(ax+b)(cx+d)の形に因数分解し、'(_α,_β,_γ,_a,_b,_c,_d),_解ならび), 重複解を取り除く(_解ならび,_a,_b,_c,_d). '二次式αx2+βx+γにおいて、係数α、β、γの値が与えられます。 これを(ax+b)(cx+d)の形に因数分解し、'(_α,_β,_γ,_a,_b,_c,_d) :- 検査範囲の確定(_α,_γ,S_1,E_1,S_2,E_2), '_a,_b,_c,_dの候補を得る'(_α,_γ,S_1,E_1,S_2,E_2,_a,_b,_c,_d), _β is _a * _d + _c * _b. '_a,_b,_c,_dの候補を得る'(_α,_γ,S_1,E_1,S_2,E_2,_a,_b,_c,_d) :- '_a,_c候補'(_α,S_1,E_1,_a,_c), '_b,_d候補'(_γ,S_2,E_2,_b,_d). '_a,_c候補'(_α,S_1,E_1,_a,_c) :- between(S_1,E_1,_a), between(S_1,E_1,_c), _α is _a * _c. '_b,_d候補'(_γ,S_2,E_2,_b,_d) :- between(S_2,E_2,_b), between(S_2,E_2,_d), _γ is _b * _d. 検査範囲の確定(_α,_γ,S_1,E_1,S_2,E_2) :- '_αの検査範囲'(_α,S_1,E_1), '_γの検査範囲'(_γ,S_2,E_2). '_αの検査範囲'(_α,S_1,E_1) :- E_1 is abs(_α), S_1 is -1 * E_1. '_γの検査範囲'(_γ,S_2,E_2) :- E_2 is abs(_γ), S_2 is -1 * E_2. 重複解を取り除く(_解ならび,_a,_b,_c,_d) :- append(L0,[[_a,_b,_c,_d]|_],_解ならび), \+(member([_c,_d,_a,_b],L0)), '_a,_cと_b,_dにそれぞれ-1を掛ける'(_a,_b,_c,_d,_a_1,_b_1,_c_1,_d_1), \+(member([_a_1,_b_1,_c_1,_d_1],L0)). '_a,_cと_b,_dにそれぞれ-1を掛ける'(_a,_b,_c,_d,_a_1,_b_1,_c_1,_d_1) :- _a_1 is _a * -1, _b_1 is _b * -1, _c_1 is _c * -1, _d_1 is _d * -1. % 以下のサイトは # 出典 :: 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(_ヘッドゼロサプライ数値表現,_ヘッドゼロサプライされたリスト). % 以下のサイトは # 出典 :: わかりやすい Javaによる医療言語処理入門 p62-65 # # n-gram :: 文字列から文字の出現確率を求める。 # 'n-gram'(_文字列,_文字,_出現確率) :- 文字の出現頻度の総数を求める(_文字列,_文字の出現頻度の総数), 文字の出現頻度(_文字列,_文字,_文字の出現頻度), _出現確率 is _文字の出現頻度 / _文字の出現頻度の総数. 文字の出現頻度の総数を求める(_文字列,_文字の出現頻度の総数) :- sub_atom(_文字列,_,_文字の出現頻度の総数,_,_文字列). 文字の出現頻度(_文字列,_文字,_文字の出現頻度) :- 重複なく文字を取り出す(文字列,_文字), 頻度(文字を取り出す(_文字列,_文字),_文字の出現頻度). 重複なく文字を取り出す(_文字列,_文字) :- 文字の集合(_文字列,_文字の集合), member(_文字,_文字の集合). 文字の集合(_文字列,_文字の集合) :- setof(C,(A,B,C) ^ sub_atom(_文字列,A,1,B,C),_文字の集合). 文字を取り出す(_文字列,_文字) :- sub_atom(_文字列,_,1,_,_文字). 頻度(P,_頻度) :- findall(1,P,L), length(L,_頻度). % 以下のサイトは # 出典 :: わかりやすい Javaによる医療言語処理入門 p90 # # 2つの文字列の先頭から一致する文字数を返す。 # '2つの文字列の先頭から一致する文字数を返す'(_文字列_1,_文字列_2,_2つの文字列の先頭から一致する文字数) :- '2つの文字列の先頭から一致する文字数の最大値を返す'(_文字列_1,_文字列_2,_2つの文字列の先頭から一致する文字数). '2つの文字列の先頭から一致する文字数の最大値を返す'(_文字列_1,_文字列_2,_2つの文字列の先頭から一致する最大文字数) :- findall(文字数,'2つの文字列の先頭から一致する文字数'(_文字列_1,_文字列_2,_文字数),_文字数ならび), max_list(_文字数ならび,_2つの文字列の先頭から一致する最大文字数). '2つの文字列の先頭から一致する文字数'(_文字列_1,_文字列_2,_文字数) :- sub_atom(_文字列_1,0,_文字数,_,_副文字列), sub_atom(_文字列_2,0,_文字数,_,_副文字列). % 以下のサイトは # 出典 :: わかりやすい Javaによる医療言語処理入門 p60-61 # 文字列から二文字の出現頻度を求める。 # 二文字の出現頻度(_文字列,_二文字,_二文字の出現頻度) :- 重複なく二文字を取り出す(文字列,_二文字), 頻度(二文字を取り出す(_文字列,_二文字),_二文字の出現頻度). 重複なく二文字を取り出す(_文字列,_二文字) :- 二文字の集合(_文字列,_二文字の集合), member(_二文字,_二文字の集合). 二文字の集合(_文字列,_二文字の集合) :- setof(C_2,(A,B,C_2) ^ sub_atom(_文字列,A,2,B,C_2),_二文字の集合). 二文字を取り出す(_文字列,_二文字) :- sub_atom(_文字列,_,2,_,_二文字). 頻度(P,_頻度) :- findall(1,P,L), length(L,_頻度). % 以下のサイトは 成績(尾崎,前期,国語,30). 成績(尾崎,前期,社会,40). 成績(山崎,前期,国語,20). 成績(山崎,前期,社会,50). 成績(尾崎,後期,国語,50). 成績(山崎,後期,国語,40). 集約合計を得る(_目標,_集約対象項,_集約鍵ならび,_集約値) :- 鍵となる値ならび(_集約鍵ならび,_目標,_鍵となる値ならび), 集約する鍵値毎に合計を得る(_目標,_集約対象項,_鍵となる値ならび,_集約鍵ならび,_集約値). 集約する鍵値毎に合計を得る(_目標,_集約対象項,_鍵となる値ならび,_集約鍵ならび,_集約値) :- member(_集約鍵ならび,_鍵となる値ならび), 対象項の合計をとる(_集約対象項,_目標,_集約値). 対象項の合計をとる(_対象項,_目標,_合計) :- findall(_対象項,_目標,L), sum_list(L,_合計). 鍵となる値ならび(_集約鍵ならび,_目標,_鍵となる値ならび) :- term_variables(_目標,_全ての変数ならび), setof(_集約鍵ならび,_全ての変数ならび ^ _目標,_鍵となる値ならび). % 実行例 % 以下のサイトは # assertz/retractや大域変数を使わない自作findall。 # 現在目標はユーザ定義述語の単項のみ。 # 連言、選言、組込述語は不可。連言、選言、決定性の組込述語は # これから手を入れれば解決できるが、非決定性の組込述語は永久に無理。 % % このコード間違っていました。n番目のclause選択にfailすることが % あり得て、その場合このコードだと、即終了してしまいます。 項の収集(_収集項,_副目標,_収集項ならび) :- 副目標の実行結果を収集する(_副目標,_収集項,_収集項ならび). 副目標の実行結果を収集する(_頭部,_収集項,_収集項ならび) :- predicate_property(_頭部,number_of_clauses(_節数)), 副目標の実行結果を収集する(1,_節数,_頭部,_収集項,_収集項ならび). 副目標の実行結果を収集する(_n番目,_節数,_,_,[]) :- _n番目 > _節数,!. 副目標の実行結果を収集する(_n番目,_節数,_頭部,_収集項,[_収集項_n|R]) :- succ(_n番目,_次の), 副目標の実行結果を再帰的に収集する(_n番目,_次の,_節数,_頭部,_収集項,_収集項_n,R). 副目標の実行結果を再帰的に収集する(_n番目,_次の,_節数,_頭部,_収集項,_収集項_n,R) :- '頭部、収集項を保存した上で、n番目のclauseを実行する'(_n番目,_頭部,_収集項,_収集項_n),!, 副目標の実行結果を収集する(_次の,_節数,_頭部,_収集項,R). 副目標の実行結果を再帰的に収集する(_n番目,_次の,_節数,_頭部,_収集項,_収集項_n,R) :- 副目標の実行結果を収集する(_次の,_節数,_頭部,_収集項,R). '頭部、収集項を保存した上で、n番目のclauseを実行する'(_n番目,_頭部,_収集項,_収集項_n) :- copy_term((_頭部,_収集項),(_頭部_n,_収集項_n)), n番目のclauseの実行(_n番目,_頭部_n). n番目のclauseの実行(_n番目,_頭部_n) :- n番目のclauseを得る(_n番目,_頭部_n,_本体_n), call(_本体_n). n番目のclauseを得る(_n番目,_頭部,_本体) :- nth_clause(_頭部,_n番目,Reference), clause(_頭部,_本体,Reference). % 以下のサイトは # assertz/retractや大域変数を使わない自作findall。 # 現在目標はユーザ定義述語の単項のみ。 # 連言、選言、組込述語は不可。連言、選言、決定性の組込述語は # これから手を入れれば解決できるが、非決定性の組込述語は永久に無理。 % % このコード間違っていました。n番目のclause選択にfailすることが % あり得て、その場合このコードだと、即終了してしまいます。 単位節の収集(_収集項,_副目標,_収集項ならび) :- 副目標の実行結果を収集する(_副目標,_収集項,_収集項ならび). 副目標の実行結果を収集する(_頭部,_収集項,_収集項ならび) :- 副目標の実行結果を収集する(1,_頭部,_収集項,_収集項ならび). 副目標の実行結果を収集する(_n番目,_頭部,_収集項,[_収集項_n|R]) :- 副目標の実行結果を再帰的に収集する(_n番目,_頭部,_収集項,_収集項_n,R). 副目標の実行結果を収集する(_,_,_,[]). 副目標の実行結果を再帰的に収集する(_n番目,_頭部,_収集項,_収集項_n,R) :- '頭部、収集項を保存した上で、n番目のclauseを実行する'(_n番面,_頭部,_収集項,_収集項_n), succ(_n番目,_次の), 副目標の実行結果を収集する(_次の,_頭部,_収集項,R). '頭部、収集項を保存した上で、n番目のclauseを実行する'(_n番目,_頭部,_収集項,_収集項_n) :- copy_term((_頭部,_収集項),(_頭部_n,_収集項_n)), n番目のclauseの実行(_n番目,_頭部_n). n番目のclauseの実行(_n番目,_頭部_n) :- n番目のclauseを得る(_n番目,_頭部_n,_本体_n), call(_本体_n). n番目のclauseを得る(_n番目,_頭部,_本体) :- nth_clause(_頭部,_n番目,Reference), clause(_頭部,_本体,Reference). % 以下のサイトは 縦書文書を横書行ならびに変形する(_縦書文書,_横書き行ならび) :- 改行を区切りに行ならびに変形する(_縦書文書,_縦書行ならび), 縦書行ならびを横書行ならびに変形する(_縦書行ならび,_横書き行ならび). 縦書行ならびを横書行ならびに変形する(_縦書行ならび,_横書き行ならび) :- 縦書行ならびを反転した行文字ならびに変換(_縦書行ならび,_反転した行文字ならび), 転置(_反転した行文字ならび,_転置した行文字ならび), 転置した行文字ならびを横書き行ならびに変換(_転置した行文字ならび,_横書き行ならび). 縦書行ならびを反転した行文字ならびに変換(_縦書行ならび,_反転した行文字ならび) :- findall(_反転した文字ならび,( member(_行文字列,_縦書行ならび), 文字列を反転した文字ならびに変換(_行文字列,_反転した文字ならび)),_反転した行文字ならび). 文字列を反転した文字ならびに変換(_文字列,_反転した文字ならび) :- 文字列を反転した文字ならびに変換(_文字列,[],_反転した文字ならび). 文字列を反転した文字ならびに変換('',_反転した文字ならび,_反転した文字ならび) :- !. 文字列を反転した文字ならびに変換(_文字列,L1,_反転した文字ならび) :- 先頭文字と残り文字列(_文字列,_先頭文字,_残り文字列), 文字列を反転した文字ならびに変換(_残り文字列,[_先頭文字|L1],_反転した文字ならび). 先頭文字と残り文字列(_文字列,_先頭文字,_残り文字列) :- sub_atom(_文字列,0,1,_末尾からの変位,_先頭文字), sub_atom(_文字列,_,_末尾からの変位,0,_残り文字列). 改行を区切りに行ならびに変形する(_縦書文書,[_前文字列|R]) :- 改行を区切りに(_縦書文書,_前文字列,_後文字列), 改行を区切りに行ならびに変形する(_後文字列,R). 改行を区切りに行ならびに変形する(_文字列,R) :- 改行が存在しない場合停止する(_文字列,R). 改行が存在しない場合停止する('',[]) :- !. 改行が存在しない場合停止する(_文書,[_文書]). 改行を区切りに(_縦書文書,_前文字列,_後文字列) :- sub_atom(_縦書文書,_先頭からの変位,1,_末尾からの変位,'\n'), sub_atom(_縦書文書,0,_先頭からの変位,_,_前文字列), sub_atom(_縦書文書,_,_末尾からの変位,0,_後文字列),!. 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置した行文字ならびを横書き行ならびに変換(_転置した行文字ならび,_横書き行ならび) :- findall(_行文字列,( 空白行を取り除きながら行文字ならびを行文字列に変換する(_転置した行文字ならび,_行文字列)),_横書き行ならび). 空白行を取り除きながら行文字ならびを行文字列に変換する(_転置した行文字ならび,_行文字列) :- member(_行文字ならび,_転置した行文字ならび), 空白行ではない(_行文字ならび), atom_chars(_行文字列,_行文字ならび). 空白行ではない(_行文字ならび) :- \+(空白行(_行文字ならび)). 空白行(_行文字ならび) :- forall(member(_文字,_行文字ならび),_文字 = ' '). % 以下のサイトは # # 横書文書を縦書文書に変形する # # 事例として、あぜといへかの万葉仮名表記部分の生成 # 横書文書を縦書文書に変形する(_横書文書,_縦書文書) :- 横書文書を縦書文書に変形する(_横書文書,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 _式. % 以下のサイトは 分割(_軸要素,_リスト,_軸要素より大きい要素のリスト,_軸要素に等しいか小さい要素のリスト) :- 軸要素より大きい要素のリスト(_軸要素,_リスト,_軸要素より大きい要素のリスト), 軸要素に等しいか小さい要素のリスト(_軸要素,_リスト,_軸要素に等しいか小さい要素のリスト). 軸要素より大きい要素のリスト(_軸要素,_リスト,_軸要素より大きい要素のリスト) :- findall(_軸要素より大きい要素,( member(_軸要素より大きい要素,_リスト), _軸要素より大きい要素 @> _軸要素),_軸要素より大きい要素のリスト). 軸要素に等しいか小さい要素のリスト(_軸要素,_リスト,_軸要素に等しいか小さい要素のリスト) :- findall(_軸要素に等しいか小さい要素,( member(_軸要素に等しいか小さい要素,_リスト), _軸要素に等しいか小さい要素 @=< _軸要素),_軸要素に等しいか小さい要素のリスト). % 以下のサイトは 'PGMファイルの読み取り'(_入力ファイル) :- abolish(画像構造/2), raw_read_pgm(_入力ファイル). raw_read_pgm(_入力ファイル,_画像構造ならび) :- headerを読み取る(_入力ファイル,_headerの文字数), 画像データの読み込み(_入力ファイル,_headerの文字数,_画像データ), assertz(画像構造(画像データ,_画像データ)). headerを読み取る(_入力ファイル,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- open(_入力ファイル,read,Input), '型・矩形サイズ・色の深さを得る'(Input,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数), close(Input). '型・矩形サイズ・色の深さを得る'(Input,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- get_line(Input,Line), '型・矩形サイズ・色の深さを得る'(Input,Line,[],0,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数), '型・矩形サイズ・色の深さを定義する'(_型,_矩形サイズ,_色の深さ). '型・矩形サイズ・色の深さを得る'(Input,Line,[_色の深さ,_矩形サイズ,_型],_ヘッダの文字数,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- !. '型・矩形サイズ・色の深さを得る'(Input,Line,L1,_ヘッダの文字数_1,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- 'コメント行は無視して、_ヘッダの文字数だけ更新'(Input,Line,L1,_ヘッダの文字数_1,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数),!. '型・矩形サイズ・色の深さを得る'(Input,Line,L1,_ヘッダの文字数_1,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- '型・矩形サイズ・色の深さを埋めていく'(Input,Line,L1,_ヘッダの文字数_1,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数). 'コメント行は無視して、_ヘッダの文字数だけ更新'(Input,Line,L1,_ヘッダの文字数_1,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- sub_atom(Line,0,1,_,'#'), '改行を含むコメント行の文字数を求めて_ヘッダ文字数を更新する'(Line,_ヘッダ文字数_1,_ヘッダ文字数_2), get_line(Input,Line2), '型・矩形サイズ・色の深さを得る'(Input,Line2,L1,_ヘッダの文字数_2,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数). '改行を含むコメント行の文字数を求めて_ヘッダ文字数を更新する'(Line,_ヘッダ文字数_1,_ヘッダ文字数_2) :- atom_length(Line,Length), _ヘッダの文字数_2 is _ヘッダの文字数 + Length + 1. '型・矩形サイズ・色の深さを埋めていく'(Input,Line,L1,_ヘッダの文字数_1,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- get_line(Input,Line2), atom_length(Line,Length), _ヘッダの文字数_2 is _ヘッダの文字数_1 + Length + 1, '型・矩形サイズ・色の深さを得る'(Input,Line2,_ヘッダの文字数_2,[Line|L1],_型,_矩形サイズ,_色の深さ,_ヘッダの文字数). '型・矩形サイズ・色の深さを定義する'(_型,_矩形サイズ,_色の深さ) :- assertz(画像構造(型,_型)), assertz(画像構造(矩形サイズ,_矩形サイズ)), assertz(画像構造(色の深さ,_色の深さ)). 画像データの読み込み(_入力ファイル,_ヘッダの文字数,_画像データ) :- open(_入力ファイル,read,Input,[type(binary)]), ヘッダ部分を空読み(Input,_ヘッダの文字数), 画像データ部分の読み取り(Input,_画像データ), close(input). ヘッダ部分を空読み(Input,_ヘッダの文字数) :- between(1,_ヘッダの文字数,N), get_byte(Input,_), N = _ヘッダの文字数,!. 画像データ部分の読み取り(Input,_画像データ) :- findall(C,(repeat,get_byte(Input,C),(C = -1,!,fail;true)),_画像データ). get_line(Input,Line) :- get_char(Input,A), get_line(Input,A,L), atom_chars(Line,L). get_line(Input,'\n',[]) :- !. get_line(Input,A,[A|R]) :- get_char(Input,B), get_line(Input,B,R). % 以下のサイトは マンハッタン距離(_座標点_1,_座標点_2,_マンハッタン距離) :- _マンハッタン距離 = _2点間の距離, 'マンハッタン距離またはL1-距離は、幾何学における距離概念のひとつ。 各座標の差(の絶対値)の総和を2点間の距離とする。'(_座標点_1,_座標点_2,_2点間の距離). 'マンハッタン距離またはL1-距離は、幾何学における距離概念のひとつ。 各座標の差(の絶対値)の総和を2点間の距離とする。'(_座標点_1,_座標点_2,_2点間の距離) :- 総和(_各座標の差,( '各座標の差(の絶対値)の'(_座標点_1,_座標点_2,_各座標の差)),_2点間の距離). 総和(A,P,_総和) :- findall(A,P,L), sum_list(L,_総和). '各座標の差(の絶対値)の'(M,N,_各座標の差) :- 'M,Nが数であればその差の絶対値を取る'(M,N,_各座標の差). '各座標の差(の絶対値)の'(_座標点_1,_座標点_2,_各座標の差) :- 各座標が複合項であれば対応する座標要素の差を取る(_座標点_1,_座標点_2,_各座標の差). 各座標が複合項であれば対応する座標要素の差を取る((M,S1),(N,S2),_各座標の差) :- 'M,Nが数であればその差の絶対値を取る'(M,N,_各座標の差). 各座標が複合項であれば対応する座標要素の差を取る((_,S1),(_,S2),_各座標の差) :- '各座標の差(の絶対値)の'(S1,S2,_各座標の差). 'M,Nが数であればその差の絶対値を取る'(M,N,_各座標の差) :- number(M), number(N), _各座標の差 is abs(M - N). % 以下のサイトは エラトステネスの篩([],[]) :- !. エラトステネスの篩([_確定した素数|R1],[_確定した素数|R2]) :- 'R1の中の_確定した素数で割り切れないものだけを残し篩に掛ける'(_確定した素数,R1,R2). 'R1の中の_確定した素数で割り切れないものだけを残し篩に掛ける'(_確定した素数,R1,R2) :- 'R1の中の_確定した素数で割り切れないものだけを残す'(_確定した素数,R1,_残ったならび), エラトステネスの篩(_残ったならび,R2). 'R1の中の_確定した素数で割り切れないものだけを残す'(_確定した素数,R1,_残ったならび) :- findall(_確定した素数で割り切れないもの,( 'R1の中で_確定した素数で割り切れないもの'(R1,_確定した素数,_確定した素数で割り切れないもの)),_残ったならび). 'R1の中で_確定した素数で割り切れないもの'(R1,_確定した素数,_確定した素数で割り切れないもの) :- member(_確定した素数で割り切れないもの,R1), \+(0 is _確定した素数で割り切れないもの mod _確定した素数). % 以下のサイトは # 出典 :: CodeIQ q1347 # # 3人の几帳面な男たちがいました。 # ジェシー「みかんをたくさん頂いたんだ。みんなで分けようYO!」 # ダニエル「イイネ!…ええと、みかんは全部で30個あるみたいだから、ひとり10個ずつならきちんと分けられるNE!」 # ジョゼフ「それだけじゃダメだYO!みかんは一つひとつ大きさが違うんだから、その辺も考えてきっちり分けNIGHT!」 # # # 【問題】 # # 30個のみかんがあります。3人で10個ずつ分けようと思いますが、不公平にならないよう、みかんの重さの合計が均一になるように分けてください。たとえば、次のような重さのみかん6個 # 101g # 103g # 110g # 105g # 114g # 112g # # を、3人で2つずつ分ける場合、重さの合計が等しくなるように分けると # (101g, 114g) # (103g, 112g) # (105g, 110g) # # のように、合計が215グラムになるように分けることができます。 # # みかんの重さのデータを標準入力から読み込み、それを重さの合計・個数ともに3等分するプログラムを書いてください。 # # # 【入力】 # # 入力はテキストファイルで用意されています。これを標準入力から読み込んでください。 # 入力ファイルの1行目には、みかんの個数Nが与えられます。 # 2行目以降のN行分が、みかんの重さ(正の整数)です。 # # # 【出力】 # # 標準出力に、3等分したみかんのグループを出力してください。 # 1行につき1グループ、計3行を出力します。それ以外は出力しないでください。 # 分け方が複数ある場合、その中の1種類だけを出力してください。 # # # 【入出力例】 # # - sample1.in.txt # 6 # 101 # 103 # 110 # 105 # 114 # 112 # # - sample1.out.txt # (101, 114) # (103, 112) # (105, 110) # # # # - sample2.in.txt # 12 # 147 # 105 # 99 # 116 # 105 # 119 # 93 # 132 # 123 # 95 # 101 # 82 # # - sample2.out.txt # (82, 105, 105, 147) # (93, 95, 119, 132) # (99, 101, 116, 123) '入力ファイルからみかんの重さならびを得て、三人とも同量の重さで、配分した候補を得て、重複を取り除いて出力する'(_入力ファイル,_出力ファイル) :- '入力ファイルからみかんの重さならびを得て、三人とも同量の重さで'(_入力ファイル,_みかんの重さならび,_一人あたりの重さ合計), 配分した候補を得て(_みかんの重さならび,_一人あたりの重さ合計,_重複を許す配分した候補), 重複を取り除いて出力する(_出力ファイル,_重複を許す配分した候補). '入力ファイルからみかんの重さならびを得て、三人とも同量の重さで'(_入力ファイル,_みかんの重さならび,_一人あたりの重さ合計) :- 入力ファイルからみかんの重さならびを得て(_入力ファイル,_みかんの重さならび), sum_list(_みかんの重さならび,_みかんの重さの合計), _一人あたりの重さ合計 is _みかんの重さの合計 // 3. 入力ファイルからみかんの重さならびを得て(_入力ファイル,_みかんの重さならび) :- see(_入力ファイル), 先頭行から行数を得る(_みかんの個数), 残り行からみかんの重さならびを得る(_みかんの個数,_みかんの重さならび), seen. 先頭行から行数を得る(_行数) :- 整数入力(_行数). 残り行からみかんの重さならびを得る(_みかんの個数,_みかんの重さならび) :- findall(_みかんの重さ,( between(1,_みかんの個数,_), 整数入力(_みかんの重さ)),_みかんの重さならび). 配分した候補を得て(_みかんの重さならび,_合計目標,_重複を許す配分した候補) :- findall(LL,同量に配分する(_みかんの重さならび,_合計目標,[],LL),_重複を許す配分した候補). 同量に配分する([],_,LL,LL). 同量に配分する(_みかんの重さならび,_合計目標,LL1,LL) :- 組み合計を得る(_みかんの重さならび,_合計目標,[],L,_残りみかんの重さならび), forall(member(L1,LL1),L1 @>= L), 同量に配分する(_残りみかんの重さならび,_合計目標,[L|LL1],LL). 組み合計を得る(_残りみかんの重さならび,_合計目標,L,L,_残りみかんの重さならび) :- sum_list(L,_合計目標). 組み合計を得る(_みかんの重さならび_1,_合計目標,L1,L,_残りみかんの重さならび) :- select(_一個,_みかんの重さならび_1,_残りみかんの重さならび_2), forall(member(A,L1),A @>= _一個), 組み合計を得る(_残りみかんの重さならび_2,_合計目標,[_一個|L1],L,_残りみかんの重さならび). 重複を取り除いて出力する(_出力ファイル,_重複を許す配分した候補) :- 重複なく昇順に整列する(_重複を許す配分した候補,_候補リスト), 一行ずつ出力する(_出力ファイル,_候補リスト). 重複なく昇順に整列する(L1,L2) :- 重複なく昇順に整列する(L1,[],L2). 重複なく昇順に整列する([],L,L). 重複なく昇順に整列する([_軸要素|L1],L2,L3) :- 重複のない昇順分割(_軸要素,L1,LS,LB), 重複なく昇順に整列する(LS,[_軸要素|L3_2],L3), 重複なく昇順に整列する(LB,L2,L3_2). 重複のない昇順分割(_,[],[],[]). 重複のない昇順分割(_軸要素,[A|R1],[A|R2],R3) :- A @< _軸要素, 重複のない昇順分割(_軸要素,R1,R2,R3). 重複のない昇順分割(_軸要素,[A|R1],R2,[A|R3]) :- A @> _軸要素, 重複のない昇順分割(_軸要素,R1,R2,R3). 重複のない昇順分割(_軸要素,[_軸要素|R1],R2,R3) :- 重複のない昇順分割(_軸要素,R1,R2,R3). 一行ずつ出力する(_出力ファイル,_候補リスト) :- tell(_出力ファイル), forall(member(_三人分のみかんの重さならび,_候補リスト),配分候補ならびを三行で出力する(_三人分のみかんの重さならび)), told. 配分候補ならびを三行で出力する(_三人分のみかんの重さならび) :- forall(member(_みかんの重さならび,_三人分のみかんの重さならび),( 表示パターンのつくり(_みかんの重さならび,_表示パターン), writef(_表示パターン,_みかんの重さならび))). 表示パターンのつくり(_みかんの重さならび,_表示パターン) :- length(_みかんの重さならび,_要素数), findall('%t',between(1,_要素数,_),_表示パターンならび), atomic_list_concat(_表示パターンならび,',',_表示パターン_1), atomic_list_concat(['(',_表示パターン_1,')\n'],_表示パターン). 整数入力(_整数) :- 行入力(_行), read_term_from_atom(_行,_整数,[]). 行入力(_行) :- get_char(_文字), 行の文字ならび(_文字,_行の文字ならび), atom_chars(_行,_行の文字ならび). 行の文字ならび(end_of_file,[]) :- !. 行の文字ならび('\n',[]) :- !. 行の文字ならび(_文字,[_文字|R]) :- get_char(_次の文字), 行の文字ならび(_次の文字,R). ユーザパラメータならび(_ユーザパラメータならび) :- current_prolog_flag(argv,_ユーザパラメータならび). program :- ユーザパラメータならび([_入力ファイル,_出力ファイル]), '入力ファイルからみかんの重さならびを得て、三人とも同量の重さで、配分した候補を得て、重複を取り除いて出力する'(_入力ファイル,_出力ファイル). :- program,halt. % 以下のサイトは # 出典 :: CodeIQ q1346 # # あるとき、マシューは美人な双子と出会った。お姉さん、妹さん、実に美しいのだ!この2人、双子でありつつ、とても仲が良い。仲が良すぎて、同じタイミングで話すという特技がある。 # # 姉&妹 「あ。マシューだ。」 # マシュー「いかにもマシューだ。」 # 姉&妹 「双子ならではのクイズを出してもいい?」 # マシュー「え、あ、いいよ。」 # 姉&妹 「1000以下の双子素数をすべて出力せよ。」 # マシュー「・・・え?」 # 姉&妹 「1000以下の双子素数をすべて出力せよ。」 # # なんだかとんでもないクイズに巻き込まれてしまった!プログラムを書いて答えてほしい。 # # 解き方だが、 (3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力して欲しい。 # '1000以下の双子素数のすべてを(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する' :- '1000以下の素数ならびを小さい順に得る'(_1000以下の素数ならび), '1000以下の双子素数のすべてを(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する'(_1000以下の素数ならび). '1000以下の素数ならびを小さい順に得る'(_1000以下の素数ならび) :- findall(M,between(2,1000,M),_小さい順に並んだ2から1000までの整数ならび), '1000以下の素数ならびを小さい順に得る'(_小さい順に並んだ2から1000までの整数ならび,_1000以下の素数ならび). '1000以下の素数ならびを小さい順に得る'([],[]) :- !. '1000以下の素数ならびを小さい順に得る'([_確定した素数|R1],[_確定した素数|R2]) :- 'R1の中の_確定した素数で割り切れないものだけを残し篩に掛ける'(_確定した素数,R1,R2). 'R1の中の_確定した素数で割り切れないものだけを残し篩に掛ける'(_確定した素数,R1,R2) :- 'R1の中の_確定した素数で割り切れないものだけを残す'(_確定した素数,R1,_残ったならび), '1000以下の素数ならびを小さい順に得る'(_残ったならび,R2). 'R1の中の_確定した素数で割り切れないものだけを残す'(_確定した素数,R1,_残ったならび) :- findall(_確定した素数で割り切れないもの,'R1の中で_確定した素数で割り切れないもの'(R1,_確定した素数,_確定した素数で割り切れないもの),_残ったならび). 'R1の中で_確定した素数で割り切れないもの'(R1,_確定した素数,_確定した素数で割り切れないもの) :- member(_確定した素数で割り切れないもの,R1), \+(0 is _確定した素数で割り切れないもの mod _確定した素数). '1000以下の双子素数のすべてを(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する'(_1000以下の素数ならび) :- '1000以下の双子素数のすべてを'(_1000以下の素数ならび,_1000以下の双子素数ならび), '(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する'(_1000以下の双子素数ならび). '1000以下の双子素数のすべてを'(_1000以下の素数ならび,_1000以下の双子素数ならび) :- findall([_1,_2],'1000以下の双子素数の'(_1000以下の素数ならび,_1,_2),_1000以下の双子素数ならび). '1000以下の双子素数の'(_1000以下の素数ならび,_1,_2) :- append(_,[_1,_2|_],_1000以下の素数ならび), 2 is _2 - _1. '(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する'(_1000以下の双子素数ならび) :- 小さい数の組み合わせから順番に(_1000以下の双子素数ならび,_1,_2,R), 'カンマ区切りで標準出力する'(R,_1,_2), R = []. 小さい数の組み合わせから順番に(_1000以下の双子素数ならび,_1,_2,R) :- append(_,[[_1,_2]|R],_1000以下の双子素数ならび). 'カンマ区切りで標準出力する'(R,_1,_2) :- 'Rが[]の時は_1,_2出力後カンマは省略して改行する'(R,_1,_2). 'カンマ区切りで標準出力する'(R,_1,_2) :- 'Rが[]でない時は_1,_2出力後カンマを出力する'(R,_1,_2). 'Rが[]の時は_1,_2出力後カンマは省略して改行する'([],_1,_2) :- writef('(%t,%t)\n',[_1,_2]). 'Rが[]でない時は_1,_2出力後カンマを出力する'([_|_],_1,_2) :- writef('(%t,%t), ',[_1,_2]). :- '1000以下の双子素数のすべてを(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する',halt. % 以下のサイトは # 出典 :: CodeIQ q1346 # # あるとき、マシューは美人な双子と出会った。お姉さん、妹さん、実に美しいのだ!この2人、双子でありつつ、とても仲が良い。仲が良すぎて、同じタイミングで話すという特技がある。 # # 姉&妹 「あ。マシューだ。」 # マシュー「いかにもマシューだ。」 # 姉&妹 「双子ならではのクイズを出してもいい?」 # マシュー「え、あ、いいよ。」 # 姉&妹 「1000以下の双子素数をすべて出力せよ。」 # マシュー「・・・え?」 # 姉&妹 「1000以下の双子素数をすべて出力せよ。」 # # なんだかとんでもないクイズに巻き込まれてしまった!プログラムを書いて答えてほしい。 # # 解き方だが、 (3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力して欲しい。 # '1000以下の双子素数のすべてを(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する' :- '1000以下の素数ならびを小さい順に得る'(_1000以下の素数ならび), '1000以下の双子素数のすべてを(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する'(_1000以下の素数ならび). '1000以下の素数ならびを小さい順に得る'(_1000以下の素数ならび) :- findall(M,between(2,1000,M),_小さい順に並んだ2から1000までの整数ならび), エラトステネスの篩(_小さい順に並んだ2から1000までの整数ならび,_1000以下の素数ならび). エラトステネスの篩([],[]) :- !. エラトステネスの篩([_確定した素数|R1],[_確定した素数|R2]) :- 'R1の中の_確定した素数で割り切れないものだけを残し篩に掛ける'(_確定した素数,R1,R2). 'R1の中の_確定した素数で割り切れないものだけを残し篩に掛ける'(_確定した素数,R1,R2) :- 'R1の中の_確定した素数で割り切れないものだけを残す'(_確定した素数,R1,_残ったならび), エラトステネスの篩(_残ったならび,R2). 'R1の中の_確定した素数で割り切れないものだけを残す'(_確定した素数,R1,_残ったならび) :- findall(_確定した素数で割り切れないもの,( 'R1の中で_確定した素数で割り切れないもの'(R1,_確定した素数,_確定した素数で割り切れないもの)),_残ったならび). 'R1の中で_確定した素数で割り切れないもの'(R1,_確定した素数,_確定した素数で割り切れないもの) :- member(_確定した素数で割り切れないもの,R1), \+(0 is _確定した素数で割り切れないもの mod _確定した素数). '1000以下の双子素数のすべてを(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する'(_1000以下の素数ならび) :- '1000以下の双子素数のすべてを'(_1000以下の素数ならび,_1000以下の双子素数ならび), '(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する'(_1000以下の双子素数ならび). '1000以下の双子素数のすべてを'(_1000以下の素数ならび,_1000以下の双子素数ならび) :- findall([_1,_2],'1000以下の双子素数の'(_1000以下の素数ならび,_1,_2),_1000以下の双子素数ならび). '1000以下の双子素数の'(_1000以下の素数ならび,_1,_2) :- append(_,[_1,_2|_],_1000以下の素数ならび), 2 is _2 - _1. '(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する'(_1000以下の双子素数ならび) :- 小さい数の組み合わせから順番に(_1000以下の双子素数ならび,_1,_2,R), 'カンマ区切りで標準出力する'(R,_1,_2), R = []. 小さい数の組み合わせから順番に(_1000以下の双子素数ならび,_1,_2,R) :- append(_,[[_1,_2]|R],_1000以下の双子素数ならび). 'カンマ区切りで標準出力する'(R,_1,_2) :- 'Rが[]の時は_1,_2出力後カンマは省略して改行して終わる'(R,_1,_2),!. 'カンマ区切りで標準出力する'(_,_1,_2) :- writef('(%t,%t), ',[_1,_2]). 'Rが[]の時は_1,_2出力後カンマは省略して改行して終わる'([],_1,_2) :- writef('(%t,%t)\n',[_1,_2]). :- '1000以下の双子素数のすべてを(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する',halt. % 以下のサイトは # # データベースに在る一日分売上データを給油所別月別ファイルに追加保存する。 # 保存ファイルは例えば "志村_売上_201501.pro" のようなファイル名である。 # 給油所(志村,'300203'). 給油所(上野毛,'300206'). 給油所(横浜南,'370113'). 給油所(熊谷銀座,'370105'). 給油所(けやき台,'370109'). 給油所(秩父21,'370111'). 給油所(狭山ヶ丘,'370112'). 売上保存(_保存月,_保存日) :- '保存日から入力時刻下限、上限を得る'(_保存日,_入力年月日), forall(売上保存の一日分の読み出し(_保存月,_入力年月日,_出力,_一日分データ), 売上保存の一日分データを書き出す(_出力,_一日分データ)). '保存日から入力時刻下限、上限を得る'(_保存日,_入力年月日) :- '売上保存_年-_月-_日'(_保存日,_年,_月,_日), 売上保存_入力年月日(_年,_月,_日,_入力年月日). '売上保存_年-_月-_日'(_保存日,_年,_月,_日) :- sub_atom(_保存日,0,4,_,_年), sub_atom(_保存日,4,2,_,_月), sub_atom(_保存日,6,2,_,_日). 売上保存_入力年月日(_年,_月,_日,_入力年月日) :- atomic_list_concat([_年,'-',_月,'-',_日],_入力年月日). 売上保存の一日分の読み出し(_保存月,_入力年月日,_出力,_一日分データ) :- 出荷場所ファイルを追加モードで開く(_保存月,_出荷場所,_出力), データベースからの読み出し(_出荷場所,_入力年月日,_一日分データ). 出荷場所ファイルを追加モードで開く(_保存月,_出荷場所,_出力) :- 給油所(_給油所,_出荷場所), atomic_list_concat([_給油所,'_売上_',_保存月,'.pro'],_保存ファイル名), open(_保存ファイル名,append,_出力). データベースからの読み出し(_出荷場所,_入力年月日,_一日分データ) :- findall([_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20],( 売上(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20), 出荷場所と入力時刻から組を得る(_16,_出荷場所,_20,_入力年月日)),_一日データ). 出荷場所と入力時刻から組を得る(_出荷場所,_出荷場所,_入力時刻,_入力年月日,_組) :- sub_atom(_入力時刻,0,10,_,_入力年月日). 売上保存の一日分データを書き出す(_出力,[]) :- close(_出力). 売上保存の一日分データを書き出す(_出力,[_組|_残り]) :- 売上保存一行表示(_出力,_組), 売上保存の一日分データを書き出す(_出力,_残り). 売上保存一行表示(_出力,_組) :- _売上 =.. [売上|_組], writeq(_出力,_売上), write(_出力,'.\n'). % 以下のサイトは # # データベースに在る一日分売上データを給油所別月別ファイルに追加保存する。 # 保存ファイルは例えば "志村_売上_201501.pro" のようなファイル名である。 # 売上保存(_保存月,_保存日) :- '保存日から入力時刻下限、上限を得る'(_保存日,_入力年月日), 売上保存の一日分の読み出し(_保存月,_入力年月日,_出力,_一日分データ,_残り), 売上保存の一日分データを書き出す(_出力,_一日分データ), _残り = []. '保存日から入力時刻下限、上限を得る'(_保存日,_入力年月日) :- '売上保存_年-_月-_日'(_保存日,_年,_月,_日), 売上保存_入力年月日(_年,_月,_日,_入力年月日). '売上保存_年-_月-_日'(_保存日,_年,_月,_日) :- sub_atom(_保存日,0,4,_,_年), sub_atom(_保存日,4,2,_,_月), sub_atom(_保存日,6,2,_,_日). 売上保存_入力年月日(_年,_月,_日,_入力年月日) :- atomic_list_concat([_年,'-',_月,'-',_日],_入力年月日). 売上保存の一日分の読み出し(_保存月,_入力年月日,_出力,_一日分データ,_残り) :- 出荷場所ファイルを追加モードで開く(_保存月,_出荷場所,_出力,_残り), データベースからの読み出し(_出荷場所,_入力年月日,_一日分データ). 出荷場所ファイルを追加モードで開く(_保存月,_出荷場所,_出力,_残り) :- append(_,[[_給油所,_出荷場所]|_残り],[[志村,'300203'],[上野毛,'300206'],[熊谷,'370105'],[けやき台,'370109'],[秩父21,'370111'],[狭山ヶ丘,'370112'],[横浜南,'370113']]), atomic_list_concat([_給油所,'_売上_',_保存月,'.pro'],_保存ファイル名), open(_保存ファイル名,append,_出力). データベースからの読み出し(_出荷場所,_入力年月日,_一日分データ) :- findall([_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20],( 売上(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20), 出荷場所と入力時刻から組を得る(_16,_出荷場所,_20,_入力年月日)),_一日データ). 出荷場所と入力時刻から組を得る(_出荷場所,_出荷場所,_入力時刻,_入力年月日,_組) :- sub_atom(_入力時刻,0,10,_,_入力年月日). 売上保存の一日分データを書き出す(_出力,_一日分データ) :- append(_,[_組|_残り],_一日分データ), 売上保存一行表示(_出力,_組), 売上保存の一日分書き出しを完了する(_出力,_残り). 売上保存一行表示(_出力,_組) :- _売上 =.. [売上|_組], writeq(_出力,_売上), write(_出力,'.\n'). 売上保存の一日分書き出しを完了する(_出力,[]) :- close(_出力). % 以下のサイトは :- 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). % 以下のサイトは # 出典 :: twitter_by_@a_hisame_20150219 # # "aがn回以上続いた直後にbがn回続く"ことを(拡張)正規表現で有限長で表現できるんでしたっけ? (nは0以上の任意の整数) # 'aがn回以上続いた直後にbがn回続く(nは0以上の任意の整数)'(_文字列,_n,_前文字列,_適合文字列,_後文字列) :- 'aがn回以上続いた'(_n,_文字列,_前文字列,L2,L3), '直後にbがn回続く'(_n,L2,L3,L2_2,L3_2), atom_chars(_適合文字列,L2_2), atom_chars(_後文字列,L3_2). 'aがn回以上続いた'(_n,_文字列,_前文字列,L2,L3) :- sub_atom(_文字列,_前文字列,_適合文字列_1,_後文字列_1,L1,L2,L3), all(L2,a), \+(last(L1,a)), \+(L3 = [a|_]), length(L2,Len_1), Len_1 >= _n. '直後にbがn回続く'(_n,L2,L3,L2_2,L3_2) :- findall(b,between(1,_n,_),L), append(L,L3_2,L3), \+(L3_2 = [b|_]), append(L2,L,L2_2). all([],A). all([A|R],A) :- all(R,A). sub_atom(A,H,X,T,HL,XL,TL) :- atomic(X), atom_chars(A,L), atom_chars(X,XL), sub_atom_2(L,S,Len,R,HL,XL,TL), atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL). sub_atom(A,H,X,T,HL,XL,TL) :- var(X), atom_chars(A,L), sub_atom_2(L,S,Len,R,HL,XL,TL), atom_chars(H,HL), atom_chars(X,XL), \+(XL = []), atom_chars(T,TL). % 以下のサイトは %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 情報をリストで保持する (Prologではあまり使いません) wrrior([[nagisa_misumi, futari_ha, black], [honoka_yukishiro, futari_ha, white], [hikari_kujo, max_heart, luminus], [saki_hyuga, splash_star, bloom], [mai_misho, splash_star, eaglette], [nozomi_yumehara, yes, dream], [rin_natsuki, yes, rouge], [urara_kasugano, yes, lemonade], [komachi_akimoto, yes, mint], [karen_minazuki, yes, aqua], [geki, juranger, tirano], [goushi, juranger, manmos], [dan, juranger, torikera], [boy, juranger, tiger], [mei, juranger, ptera], [burai, juranger, dragon]]). series([[precure, splash_star], [precure, futari_ha], [precure, yes], [super_squadron, juranger]]). ?- wrrior(L1),series(L2), member([Name,B,_],L1), member([precure,B],L2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 先にfindall をしてしまうのもあります warrior(nagisa_misumi, futari_ha, black). warrior(honoka_yukishiro, futari_ha, white). warrior(hikari_kujo, max_heart, luminus). warrior(saki_hyuga, splash_star, bloom). warrior(mai_misho, splash_star, eaglette). warrior(nozomi_yumehara, yes, dream). warrior(rin_natsuki, yes, rouge). warrior(urara_kasugano, yes, lemonade). warrior(komachi_akimoto, yes, mint). warrior(karen_minazuki, yes, aqua). warrior(geki, juranger, tirano). warrior(goushi, juranger, manmos). warrior(dan, juranger, torikera). warrior(boy, juranger, tiger). warrior(mei, juranger, ptera). warrior(burai, juranger, dragon). series(precure, splash_star). series(precure, futari_ha). series(precure, yes). series(super_squadron, juranger). ?- findall([A,B],warrior(A,B,_),L1), findall([C],series(precure,C),L2), member([Name,Key],L1), member([Key],L2). ?- findall([A,B],warrior(A,B,_),L1), findall(C,series(precure,C),L2), member([Name,Key],L1), member(Key,L2). ?- findall([A,B],warrior(A,B,_),L1), findall(C,series(precure,C),L2), append(_,[[Name,Key]|_],L1), append(_,[C|_],L2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/669 # # oracleなんですが、次の表に # # 日付 数 # 1/1 5 # 1/2 2 # 1/3 -8 # 1/4 6 # 1/5 8 # # 残と繰越を計算して↓のようにしたいのですが # どのようなSQLにすればいいでしょうか?>< # # 日付 残 数 繰越 # 1/1 0 5 5 ←初日の残はゼロ、繰越=残+数 # 1/2 5 2 7 ←残=前日の繰越 # 1/3 7 -8 -1 # 1/4 0 6 6 ←前日の繰越がマイナスなら残はゼロに # 1/5 6 8 14 # # テーブル('1/1',5). テーブル('1/2',2). テーブル('1/3',-8). テーブル('1/4',6). テーブル('1/5',8). '初日(1/1)の残'(0). 'oracleなんですが、次の表に 日付 数 1/1 5 1/2 2 1/3 -8 1/4 6 1/5 8 残と繰越を計算して↓のようにしたいのです どのようなSQLにすればいいでしょうか?>< 日付 残 数 繰越 1/1 0 55 ←初日の残はゼロ、繰越=残+数 1/2 5 27 ←残=前日の繰越 1/3 7 -8 -1 1/4 0 66 ←前日の繰越がマイナスなら残はゼロに 1/5 6 8 14'(_日付,_残,_数,_繰越) :- findall([_日付,_数],テーブル(_日付,_数),_日付_数ならび), '初日(1/1)の残'(_初日の残), '残と繰越の計算'(_初日の残,_日付_数ならび,_日付,_残,_数,_繰越). '残と繰越の計算'(_前日の繰越,[[_日付_1,_数_1]|R],_日付,_残,_数,_繰越) :- '前日繰越と数から残、繰越を求める'(_前日の繰越,_数_1,_残_1,_繰越_1), '残と繰越を非決定性に計算'(_残_1,_日付_1,_数_1,R,_繰越_1,_日付,_残,_数,_繰越). '残と繰越を非決定性に計算'(_残,_日付,_数,_,_繰越,_日付,_残,_数,_繰越). '残と繰越を非決定性に計算'(_残_1,_,_,R,_繰越_1,_日付,_残,_数,_繰越) :- '残と繰越の計算'(_繰越_1,R,_日付,_残,_数,_繰越). '前日繰越と数から残、繰越を求める'(_前日の繰越,_数,_残,_繰越) :- '前日の繰越がマイナスなら残はゼロに、さもなくば、残=前日の繰越'(_前日の繰越,_残), _繰越 is _残 + _数. '前日の繰越がマイナスなら残はゼロに、さもなくば、残=前日の繰越'(_前日の繰越,_残) :- 前日の繰越がマイナスなら残はゼロに(_前日の繰越,_残). '前日の繰越がマイナスなら残はゼロに、さもなくば、残=前日の繰越'(_前日の繰越,_残) :- 'さもなくば、残=前日の繰越'(_前日の繰越,_残). 前日の繰越がマイナスなら残はゼロに(_前日の繰越,_残) :- _前日の繰越 < 0, _残 = 0. 'さもなくば、残=前日の繰越'(_前日の繰越,_残) :- _前日の繰越 >= 0, _前日の繰越 = _残. % 以下のサイトは ペア数の実装(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). % 以下のサイトは ペア数の実装(0,0). ペア数の実装(X,Y) :- nth1(N,_,_), 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). % 以下のサイトは ペア数の実装(0,0). ペア数の実装(X,Y) :- nth1(N,_,_), 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). %%%%%%%%%%%%%%%%%%%% ?- ペア数の実装(X,Y). X = Y, Y = 0 ; X = 0, Y = 1 ; X = 1, Y = 0 ; X = 0, Y = 2 ; X = Y, Y = 1 ; X = 2, Y = 0 ; X = 0, Y = 3 ; X = 1, Y = 2 ; X = 2, Y = 1 ; X = 3, Y = 0 ; X = 0, Y = 4 ; X = 1, Y = 3 ; X = Y, Y = 2 ; X = 3, Y = 1 ; X = 4, Y = 0 ; X = 0, Y = 5, ・・・ % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/910 # お題:2文字以上の文字列が与えられたとき、隣り合う文字の大きい方の文字を # 隣り合う文字の間に挿入した文字列を返す。 # 例 # "Personal" -> "Peerrsssoonnall" # "Hello, world!" -> "Heellllooo,, wwworrrlldd!" # # '2文字以上の文字列が与えられたとき、隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列を返す。'(_文字列,_全ての隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列) :- findall(_副文字列_2,( sub_atom(_文字列,_,2,_残り文字数,_副文字列), 隣り合う文字の大きい方の文字を隣り合う文字の間に挿入(_副文字列,_残り文字数,_副文字列_2)),L), atomic_list_concat(L,_全ての隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列). 隣り合う文字の大きい方の文字を隣り合う文字の間に挿入(_副文字列,_残り文字数,_副文字列_2) :- 隣り合う2文字の大きい方の文字(_副文字列,_文字_1,_文字_2,_大きい方の文字), 隣り合う文字の大きい方の文字を隣り合う文字の間に挿入(_残り文字数,_文字_1,_文字_2,_大きい方の文字,_副文字列_2). 隣り合う文字の大きい方の文字を隣り合う文字の間に挿入(0,_文字_1,_文字_2,_大きい方の文字,_副文字列_2) :- atomic_list_concat([_文字_1,_大きい方の文字,_文字_2],_副文字列_2),!. 隣り合う文字の大きい方の文字を隣り合う文字の間に挿入(_,_文字_1,_文字_2,_大きい方の文字,_副文字列_2) :- atomic_list_concat([_文字_1,_大きい方の文字],_副文字列_2). 隣り合う2文字の大きい方の文字(_2文字,_文字_1,_文字_2,_大きい方の文字) :- sub_atom(_2文字,0,1,_,_文字_1), sub_atom(_2文字,1,1,_,_文字_2), 隣り合う文字の大きい方の文字(_文字_1,_文字_2,_大きい方の文字). 隣り合う文字の大きい方の文字(_文字_1,_文字_2,_文字_1) :- _文字_1 @>= _文字_2. 隣り合う文字の大きい方の文字(_文字_1,_文字_2,_文字_2) :- _文字_1 @< _文字_2. % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/910 # お題:2文字以上の文字列が与えられたとき、隣り合う文字の大きい方の文字を # 隣り合う文字の間に挿入した文字列を返す。 # 例 # "Personal" -> "Peerrsssoonnall" # "Hello, world!" -> "Heellllooo,, wwworrrlldd!" # # '2文字以上の文字列が与えられたとき、隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列を返す。'(_文字列,_全ての隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列) :- findall(_隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列,( sub_atom(_文字列,_,2,_,_2文字), 隣り合う文字の大きい方の文字を隣り合う文字の間に挿入(_2文字,_隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列)),L), sub_atom(_文字列,0,1,_,_最初の文字), atomic_list_concat([_最初の文字|L],_全ての隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列). 隣り合う文字の大きい方の文字を隣り合う文字の間に挿入(_2文字,_隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列) :- 隣り合う2文字の大きい方の文字(_2文字,_文字_1,_文字_2,_大きい方の文字), atomic_list_concat([_大きい方の文字,_文字_2],_隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列). 隣り合う2文字の大きい方の文字(_2文字,_文字_1,_文字_2,_大きい方の文字) :- sub_atom(_2文字,0,1,_,_文字_1), sub_atom(_2文字,1,1,_,_文字_2), 隣り合う文字の大きい方の文字(_文字_1,_文字_2,_大きい方の文字). 隣り合う文字の大きい方の文字(_文字_1,_文字_2,_文字_1) :- _文字_1 @>= _文字_2. 隣り合う文字の大きい方の文字(_文字_1,_文字_2,_文字_2) :- _文字_1 @< _文字_2. % 以下のサイトは 親(為義). 親(頼朝). 親(範頼). 子(頼朝). 子(範頼). 子(公暁). 親子テーブル候補(_親子テーブル候補) :- 属性集合である親と子の直積上の部分集合候補(_親子テーブル候補). 属性集合である親と子の直積上の部分集合候補(_親子テーブル候補) :- 属性集合である親と子の直積上の(_属性集合_親_と_属性集合_子の直積), 部分集合候補(_属性集合_親_と_属性集合_子の直積,_親子テーブル候補). 属性集合である親と子の直積上の(_親と子の直積) :- 属性集合_親(_属性集合_親), 属性集合_子(_属性集合_子), 直積([_属性集合_親,_属性集合_子],_親と子の直積). 属性集合_親(_属性集合_親) :- 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(_親子テーブル候補,_冪集合). % 以下のサイトは 親(為義). 親(頼朝). 親(載家). 子(頼朝). 子(載家). 属性集合である親と子の直積上の部分集合候補(_親子テーブル候補) :- 属性集合親(_属性集合親), 属性集合子(_属性集合子), 直積(_属性集合親,_属性集合子,_親と子の直積), member(_直積上の部分集合の組,_親と子の直積), 冪集合(_親と子の直積,_冪集合), member(_親子テーブル候補,_冪集合). 属性集合親(_属性集合親) :- setof(_親,親(_親),_属性集合親). 属性集合子(_属性集合子) :- setof(_子,子(_子),_属性集合子). 直積(L1,L2,LL) :- findall([A,B],( member(A,L1), member(B,L2)),LL). % 以下のサイトは % [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). % 以下のサイトは % % SWI-Prolog のコマンド引数の内、ユーザパラメータ部分をリストに得る。 % user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/348 # # [1] C言語演習 # # [2] argvで指定された可変引数個数の情報を別の配列(ary)に格納せよ。 # 但し、第一引数だけは別の配列(ary)に格納はしないこと。 # 例)argv:./test a b c d e f # 例)ary :./test b c d e f # # [3.1] redhat # [3.3] C言語 # [4] 本日中 # [5] 制限:なし # わかる方どうかよろしくお願いします。 # # 'argvで指定された可変引数個数の情報を別の配列(ary)に格納せよ。 但し、第一引数だけは別の配列(ary)に格納はしないこと'(UserParameterList) :- user_parameters([_|UserParameterList]),!. user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/425 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # 与えた文字列を指定した回数繰り返す文字列に変換するプログラムを作成しなさい。 # ただし、main関数を以下のように宣言し、実行時に引数をとれるようにする。 # 第一引数は繰り返し回数とし、第二引数は繰り返される文字列とする。 # すなわち、./prog 3 "ABC"と実行した場合は、ABCABCABCとなる文字列が作られる。 # 作られた文字列は、表示すること。必要に応じて、数字を数値に変換する関数atoi()を使用してもよい。 # その際は、#include<stdlib.h>を加えること。 # # #include <stdio.h> # #include <stdlib.h> # int main( int argc,char*argv[]){ # /** argc:引数の個数、argv[0]:プログラム名、argv[1]〜argv[n]:引数**/ # x=atoi(argv[1]);/*atoiの使用例*/ # return(0); # } # program :- 与えた文字列を指定した回数繰り返す文字列に変換する. 与えた文字列を指定した回数繰り返す文字列に変換する :- user_parameters([_回数文字列,_文字列]), atom_to_term(_回数文字列,_回数,_), length(Ln,_回数), append(_,[_|R],Ln), write(_文字列), R = []. user_parameters(A) :- current_prolog_flag(argv, B), append(_, [--|A], B). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/639 # # [1] C言語演習 # [2] argvで入力された引数 "123:456:78:90" の様な文字列を ":" 区切りで # 別の配列へ順に格納せよ。(strchr関数を使いなさい) # 上記の例では、[0]=123,[1]=456,[2]=78,[3]=90となる。 # 尚、::の連続もありで、"12:34::90" は [0]=12,[1]=34,[2]=null,[3]=90となる。 # # 下の様に処理しているが、スマートに行きません。。。 # p = NULL; # p = strchr(str, ':'); # while (p != NULL) { # printf("length %d\n", strlen(str)-strlen(p)); # p++; # p = strchr(p, ':'); # } # 'argvで入力された引数 "123:456:78:90" の様な文字列を ":" で区切り、プログラム引数述語のリスト引数とする' :- user_parameters([_引数文字列]), split(_引数文字列,[':'],L), assertz(プログラム引数(L)). user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/682 # # [1] 授業単元:C言語演習 # [2] 問題文:引数argvに以下の3種類がある。 # 組み合わせて使用した場合にNGを出力しなさい。 # 例) # 0 ... 指定なし # 1 ... 指定あり # 引数 | --a | --b | --c | # -----+-----+-----+-----+------ # | 0 | 0 | 0 | OK # | 0 | 0 | 1 | OK # | 0 | 1 | 0 | OK # | 0 | 1 | 1 | NG # | 1 | 0 | 0 | OK # | 1 | 0 | 1 | NG # | 1 | 1 | 0 | NG # | 1 | 1 | 1 | NG # '引数argvに以下の3種類がある。組み合わせて使用した場合にNGを出力する' :- current_prolog_flag(argv,ParameterList), パラメータ解析(ParameterList,_a,_b,_c), 組み合わせて使用した場合にNGを出力する(_a,_b,_c,_診断), writef('%t\n',[_診断]). パラメータ解析([_プログラム名|L],_a,_b,_c) :- findall(Y,( member(X,[a,b,c]), member(A,L), split(A,['--','='],[X,Y])), [_a,_b,_c]). 組み合わせて使用した場合にNGを出力する(0,0,0,'OK') :- !. 組み合わせて使用した場合にNGを出力する(1,0,0,'OK') :- !. 組み合わせて使用した場合にNGを出力する(0,1,0,'OK') :- !. 組み合わせて使用した場合にNGを出力する(0,0,1,'OK') :- !. 組み合わせて使用した場合にNGを出力する(1,1,0,'NG') :- !. 組み合わせて使用した場合にNGを出力する(1,0,1,'NG') :- !. 組み合わせて使用した場合にNGを出力する(0,1,1,'NG') :- !. 組み合わせて使用した場合にNGを出力する(1,1,1,'NG') :- !. # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/699 # # ../test/read.cgi/tech/1311089619/682について内容が不足していたので再投稿します。 # [1] 授業単元:C言語演習 # [2] 問題文:引数argvに以下の3種類がある。 # 組み合わせて使用した場合にNGを出力しなさい。 # [3] フラグ・判定にビット演算を使用してください。 # 例) # 0 ... 指定なし # 1 ... 指定あり # 引数 | --a | --b | --c | # -----+-----+-----+-----+------ # | 0 | 0 | 0 | OK # | 0 | 0 | 1 | OK # | 0 | 1 | 0 | OK # | 0 | 1 | 1 | NG # | 1 | 0 | 0 | OK # | 1 | 0 | 1 | NG # | 1 | 1 | 0 | NG # | 1 | 1 | 1 | NG # '引数argvに以下の3種類がある。組み合わせて使用した場合にNGを出力する。判定はビット演算を使う' :- current_prolog_flag(argv,ParameterList), パラメータ解析(ParameterList,_a,_b,_c), 組み合わせて使用した場合にNGを出力する(_a,_b,_c,_診断), writef('%t\n',[_診断]). パラメータ解析([_プログラム名|L],_a,_b,_c) :- findall(Y,( member(X,[a,b,c]), member(A,L), split(A,['--','='],[X,Y])), [_a,_b,_c]). 組み合わせて使用した場合にNGを出力する(_a,_b,_c,'OK') :- 0 is (_a /\ _b) \/ (_a /\ _c) \/ (_b /\ _c),!. 組み合わせて使用した場合にNGを出力する(_a,_b,_c,'NG') :- 1 is (_a /\ _b) \/ (_a /\ _c) \/ (_b /\ _c),!. # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1309076891/453 # # 【 課題 】コマンドラインから入力された点数を集計するプログラムを作成。 #       ソースファイルにコードを追加して、以下の実行結果になるように。 # # 実行結果  #       java CalcMain 69 88 70 45 95 33 #       高得点順: 95点 , 88点 , 70点 , 69点 , 45点 , 33点 #       科目数:6科目 #       合計点:400点 #       平均点: 66.666664点 #        CalcMainクラスはmain()メソッドを持つ。 #        Calculationクラスは、合計点の計算をするgetTotal()メソッド、平均点の計算をするgetAve()メソッド、並び替え処理を行うsort()メソッドを持つ。 #        コマンドライン引数から受け取った不特定数の数値(点数)について、降順並び替え表示、科目数、合計点、平均点の表示を行う。 #        sort()メソッドの並び替え処理には「バブルソート」を使用する # # #       ソースファイル #       http://ime.nu/www.dotup.org/uploda/www.dotup.org2249012.java.html # # http://ime.nu/www.dotup.org/uploda/www.dotup.org2249060.java # # # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】11月14日まで # 【 Ver  】java version "1.6.0_22" # 【 用語 】 # 【 補足 】よろしくお願いします。 # # 'コマンドラインから入力された点数を集計するプログラムを作成。ソースファイルにコードを追加して、以下の実行結果になるように。' :- コマンドラインから入力された点数(_コマンドラインから入力された点数ならび), 高得点順に表示(_コマンドラインから入力された点数ならび), 科目数と合計点と平均点の表示(_コマンドラインから入力された点数ならび). コマンドラインから入力された点数(_コマンドラインから入力された点数ならび) :- current_prolog_flag(argv,_コマンドライン), append(_,['--'|_コマンドラインから入力された点数ならび],_コマンドライン]). 高得点順に表示(L) :- バブルソート降順(L,L2), concat_atom(L2,',',_表示文字列), writef('高得点順: %t\n',[_表示文字列]). 科目数の表示(L,_科目数) :- length(L,_科目数), writef('科目数: %t\n',[_科目数]), 科目数と合計点と平均点の表示(L) :- length(L,_科目数), sum(L,_合計点), _平均点 is _合計点 / _科目数. writef('科目数: %t\n合計点: %t\n平均点: %t\n',[_科目数,_合計点,_平均点]). バブルソート降順(_対象ならび,_整列済みならび) :- 降順交換(_対象ならび,_対象ならびの一), !, バブルソート降順(_対象ならびの一,_整列済みならび). バブルソート降順(_整列済みならび,_整列済みならび). 降順交換([],[]) :- !,fail. 降順交換([A,B|R],[B,A|R]) :- A @< B,!. 降順交換([A|R1],[A|R2]) :- 降順交換(R1,R2). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/670 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # #include<stdio.h> # int main(void) # { # int i=0; # char *ptr; # char str[128]; # # ptr = str; # # scanf("%s",&str); # # while(*ptr++){ # i++; # } # # printf("%d\n",i); # } # # 上記の入力したテキストの文字数を表示するプログラムの読み込み部分をファイル処理に変更せよ。 # fgetc() 関数を使用し、コマンドラインにファイル名が指定できるようにすること。 # ただし、ファイル名を指定しない場合は標準入力とする。 # ファイルが見つからなかった時はエラーメッセージを出し、プログラムを終了する。 # 'length系組込述語を使わず入力したテキストの文字数を表示する' :- get_chars(_文字ならび), ならびの文字数を数える(_文字ならび,_文字数), writef('文字数は %t文字です\n',[_文字数]). ならびの文字数を数える([],0). ならびの文字数を数える([_|R],_文字数) :- ならびの文字数を数える(R,_文字数_1), _文字数 is _文字数_1 + 1. 読み込み部分をファイル処理に変更する :- コマンドラインからファイル名を取り出す(_ファイル名), 読み込み部分をファイル処理に変更する(_ファイル名). 読み込み部分をファイル処理に変更する(user_input,_文字数) :- ファイルから読み出しながら文字数を数える(user_input,_文字数). 読み込み部分をファイル処理に変更する(_ファイル名,_文字数) :- open(_ファイル名,read,Instream), ファイルから読み出しながら文字数を数える(Instream,_文字数), close(Instream). ファイルから読み出しながら文字数を数える(Instream,0) :- at_end_of_stream(Instream),!. ファイルから読み出しながら文字数を数える(Instream,_文字数) :- get_char(Instream,_), ファイルから読み出しながら文字数を数える(Instream,_文字数_1), _文字数 is _文字数_1 + 1. コマンドラインからファイル名を取り出す(_ファイル名) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList), ParameterList = [_ファイル名|_],!. コマンドラインからファイル名を取り出す(user_input). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/613 # # 明日までの課題です。 # まったくわかりません。 # # キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力するプログラムを書きなさい。 # なお、プログラムは次の要件を満たすこと。 # # 1.キーボードからの入力は、Enter(return)キーを2回連続して入力すると終了する # 2.入力終了後、画面に入力した行数を表示する # 3.コマンドラインからプログラムを起動後、入力する文字列に各自の氏名(ローマ字表記)を含めた場合、入力処理終了後、各自の氏名を含む行は何行目にあり、その行の文字列が何であるか表示する。 # 氏名が入力データに含まれていない場合には、含まれていなかったことを表示する # # よろしくお願いします。 # # program :- 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'. 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する' :- user_parameters([_ファイル名]), open(_ファイル名,write,Outstream), get_line(Line), 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,Line,[]), close(Outstream). 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,'',Ln) :- length(Ln,_行数), writef('行数は %t です\n',[_行数]),!. 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,Line,Ln) :- writef(Outstream,'%t\n',[Line]), get_line(Line_2), 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,Line_2,[_|Ln] user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/59 # # [1] 授業単元: c言語 # [2] 問題文(含コード&リンク): # main関数を以下のように宣言し、実行時に引数を取れるようにする。 # 引数がすべて得点であるとして、その平均値を # 求めるプログラムを作成しなさい。 # すなわち、 # ./prog 50 70 90 と実行した場合は、70と表示される。 # 必要に応じて、数字を数値に変換する関数atoi()や # atof()を使用してもよい。 # # #include <stdio.h> # #include <stdlib.h> # int main( int argc, char *argv[] ) { # /** argc: 引数の個数、argv[0]:プログラム名、argv[1]〜argv[n]:実数 **/ # x = atof( argv[1] ); /* atofの使用例 */ # return(0); # } # # ※ 配列のサイズなど、定数は必ず#defineを利用すること. # ※ 表示や入力を目的とする関数以外では、 # 関数の中で標準入力や標準出力への入出力は行わないこと. # # #  [3.1] OS:Linux #  [3.2] コンパイラ名とバージョン:gcc #  [3.3] 言語: c言語 # [4] 期限: 6月15日 # よろしくお願いします! # # program :- user_parameters(_ユーザパラメータならび), プログラム引数を整数ならびに変換(_ユーザパラメータならび,_整数ならび), avg(整数ならび,_相加平均), writef('%t\n',[_相加平均]). user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). プログラム引数を整数ならびに変換([],[]). プログラム引数を整数ならびに変換([A|R1],[N|R2]) :- atom_to_term(A,N,_), integer(N), プログラム引数を整数ならびに変換(R1,R2). プログラム引数を整数ならびに変換([_|R1],R2) :- プログラム引数を整数ならびに変換(R1,R2). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/642 # # [1] 授業単元:C言語演習 # [2] 問題文: # 実行ファイル名をmultiとして、multiに続いて2つの正の整数を入力すると、小さい方の整数から大きい方の整数までの積を出力するプログラムを作成せよ。 # 但し、入力時には小さい方の整数、大きいほうの整数の順で入力されるものとする。 # <入力例>$./multi 3 6 # <計算結果>360 # program :- user_parameters([_引数1,_引数2]), 小さい方の整数から大きい方の整数までの積を出力する(_引数1,_引数2), user_parameters(ParametersList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). 小さい方の整数から大きい方の整数までの積を出力する(_引数1,_引数2) :- atom_number(_引数1,N1), atom_number(_引数2,N2), 小さい方の整数と大きい方の整数(N1,N2,_小さい方の整数,_大きい方の整数), 小さい方の整数から大きい方の整数までの積を(_小さい方の整数,_大きい方の整数,_積), 出力する(_積). 小さい方の整数と大きい方の整数(N1,N2,N1,N2) :- N1 =< N2. 小さい方の整数と大きい方の整数(N1,N2,N2,N1) :- N1 > N2. 小さい方の整数から大きい方の整数までの積を(N,N,N). 小さい方の整数から大きい方の整数までの積を(N,_大きい方の整数,_積) :- N < _大きい方の整数, N1_2 is N1 + 1, 小さい方の整数から大きい方の整数までの積を(N_2,_大きい方の整数,_積_2), _積 is _積_2 * N. 出力する(_積) :- writef('%t\n',[N]). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/786 # # C言語 # gcc # Linux # 問題:cat関数を作りなさい。ただし、fgets,fputsを用いること。です。 # # 明日のお昼までにお願いします。 # # cat :- user_parameters([]), get_code(user_input,Code), ストリームから読み取り書き出す(user_input,Code),!. cat :- user_parameters(L), append(_,[File|R],L), ファイルを書き出す(File), R = [],!. ファイルを書き出す(File) :- open(File,read,Instream), get_code(Instream,Code), ストリームから読み取り書き出す(Instream,Code), close(Instream). ストリームから読み取り書き出す(_,-1) :- !. ストリームから読み取り書き出す(Instream,Code_1) :- put_code(Code_1), get_code(Instream,Code_2), ストリームから読み取り書き出す(Instream,Code_2). user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). % % SWI-Prologの起動は % # swipl -t cat -f プログラムファイル名 -- ファイル1 ファイル名2 ... % # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/907 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 以下のようにmain関数を定義し、mainの引数を合計するプログラムsumを作成せよ。ただし、引数の数は未定であり、実行時に決定されるものとする。 # int main(int argc, char *argv[]) # main :- 利用者引数ならび(_利用者引数ならび), findall(_数値,( member(_数値文字列,_利用者引数ならび), atom_number(_数値文字列,_数値)), _数値ならび), sum(_数値ならび,_合計), writef('%t\n',[_合計]). sum([],0). sum([_数値|R],_合計) :- sum(R,_合計_1), _合計 is _数値 + _合計_1. 利用者引数ならび(_利用者引数ならび) :- current_prolog_flag(argv, _コマンド引数ならび), append(_, [--|_利用者引数ならび], _コマンド引数ならび). % % # swipl --quiet -f c161_907.html -g main -- 33.0 25.1 38.4 % 96.5 % # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/957 # # [1] 授業単元:C言語入門 # [2] 問題文(含コード&リンク): # コマンド行から複数の数値を受け取りその平均値を出力するプログラムを # 作成し、プログラムリストと実行結果を示せ。ヒント:受け取った文字列を # double型に変換するには、関数double atof(const char *nPtr)を使う。 # この関数を使うには<stdlib.h>のインクルードが必要である。 # #include <stdio.h> # #include <stdlib.h> # int main(void) # { # char str[]="1.41421356"; # double x; # x = atof(str); # } # 'コマンド行から複数の数値を受け取りその平均値を出力する' :- 利用者引数ならび(_利用者引数ならび), 数値引数ならびに変換(_利用者引数ならび,_数値引数ならび), 相加平均(_数値引数ならび,_相加平均), writef('平均値は %t です\n',[_相加平均]). 利用者引数ならび(_利用者引数ならび) :- current_prolog_flag(argv, _コマンド引数ならび), append(_, [--|_利用者引数ならび], _コマンド引数ならび). 数値引数ならびに変換(_利用者引数ならび,_数値引数ならび) :- findall(_数値,( member(_数値文字列,_利用者引数ならび), atom_number(_数値文字列,_数値)), _数値引数ならび). 相加平均([],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.0e+00,M). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/142 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ # input関数とshow関数を作ること # コマンド引数にテキストファイルの名前を入れること # 'テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ。コマンド引数にテキストファイルの名前を入れること' :- コマンド引数からテキストファイルの名前を得る(_テキストファイル), テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ(_テキストファイル). コマンド引数からテキストファイルの名前を得る(_テキストファイル) :- current_prolog_flag(argv,ParameterList), append(_,['--'|[_テキストファイル]],ParameterList). テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ(_テキストファイル) :- テキストファイルを作りそのなかに整数5個数字を入れる(_テキストファイル,Outstream), そのテキストファイルの中身を出力せよ(_テキストファイル). テキストファイルを作りそのなかに整数5個数字を入れる(_テキストファイル) :- open(_テキストファイル,write,Outstream). そのなかに整数5個数字を入れる(Outstream), close(Outstream). そのなかに整数5個数字を入れる(Outstream) :- between(1,5,_何番目), 整数を得る(_整数), writef(Outstream,'%t\n',[_整数]), _何番目 = 5. そのテキストファイルの中身を出力せよ(_テキストファイル) :- open(_テキストファイル,read,Instream), copy_stream_data(Instream,user_output), close(Instream). % % ここではズルをして組込述語 copy_stream_data/2 を使って見た。 % % 本来ならget_lines/2とput_lines/2の組合せでコピーを表現するところ。 % % そのテキストファイルの中身を出力せよ(_テキストファイル) :- % get_lines(_テキストファイル,_行ならび), % put_lines(user_output,_行ならび). % % get_lines(_ファイル名,_行ならび) :- % open(_ファイル名,read,Instream), % findall(_行,( % repeat, % ( at_end_of_stream(Instream),!,fail; % get_line(Instream,_行))), % _行ならび), % close(Instream). % % put_lines(_ファイル名,_行ならび) :- % open(_ファイル名,write,Outstream), % forall(nth1(_,_行ならび,_行),writef(Outstream,'%t\n',[_行])), % close(Outstream). % % 以下のサイトは # 出典: http://peace.2ch.net/test/read.cgi/tech/1392388003/745 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 1)変数名 kokugo,shakai,rika を整数型で宣言する。(国語、社会、理科) # 変数名 goukei,heikinを整数型で宣言する。(合計、平均) # 2)「国語の点数=」のように表示し、キーボードよりそれぞれの科目の点数を入力する。 # 3)3科目の合計を求める。 # 4)enumを使うこと # '「国語の点数=」のように表示し、キーボードよりそれぞれの科目の点数を入力する。'(_国語,_社会,_理科) :- forall('「国語の点数=」のように表示し、科目の点数を入力する'(_科目,_点数),assertz(成績(_科目,_点数))). '「国語の点数=」のように表示し、科目の点数を入力する'(_科目,_点数) :- member(_科目,[国語,社会,理科]), swritef(催促文,'%tの点数=',[_科目]), 整数を得る(催促文,integer(_点数),_点数). '3科目の合計を求める(_合計) :- findall(_点数,成績(_,_点数),_点数ならび), sum_list(_点数ならび,_合計). '3科目の平均を求める。'(_平均) :- '3科目の合計を求める(_合計), _平均 is _合計 / 3. % 以下のサイトは # 出典: http://peace.2ch.net/test/read.cgi/tech/1392388003/745 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 1)変数名 kokugo,shakai,rika を整数型で宣言する。(国語、社会、理科) # 変数名 goukei,heikinを整数型で宣言する。(合計、平均) # 2)「国語の点数=」のように表示し、キーボードよりそれぞれの科目の点数を入力する。 # 3)3科目の合計を求める。 # 4)enumを使うこと # '「国語の点数=」のように表示し、キーボードよりそれぞれの科目の点数を入力する。'(_国語,_社会,_理科) :- forall('「国語の点数=」のように表示し、科目の点数を入力する'(_科目,_点数),assertz(成績(_科目,_点数))). '「国語の点数=」のように表示し、科目の点数を入力する'(_科目,_点数) :- member(_科目,[国語,社会,理科]), swritef(催促文,'%tの点数=',[_科目]), 整数を得る(催促文,integer(_点数),_点数). '3科目の合計を求める(_合計) :- findall(_点数,成績(_,_点数),_点数ならび), sum_list(_点数ならび,_合計). '3科目の平均を求める。'(_平均) :- '3科目の合計を求める(_合計), _平均 is _合計 / 3. % 以下のサイトは # 指数表記を使わずに整数を素因数分解することを考えます。 # つまり、「72=2×2×2×3×3」のように表現します。 # このときに使う『×』の数は4つです。 # # ここで、元の数の「各桁の和」が「素因数分解した『×』の数」と等しくなるものを考えます。 # 上の72の例であれば、各桁の和は7+2で「9」ですが、『×』の数は「4」なので不適です。 # # この条件を満たすものとしては、「110=2×5×11」や「210=2×3×5×7」、 # 「512=2×2×2×2×2×2×2×2×2」などがあります。 # # では、4桁の整数で上記の条件を満たす数をすべて求めてください。 # # プログラミング言語は不問です。 # お好きな言語で計算してください。 # # 【解答方法】 # 解答用テキストファイルをダウンロードしてください。 # # 解答用テキストファイルを完成させ、アップロードしてください。 '指数表記を使わずに4桁の整数を素因数分解して、元の数の「各桁の和」が「素因数分解した『×』の数」と等しくなる整数を全て求める' :- findall(_4桁の数,( '4桁の数の各桁の合計'(_4桁の数,_乗算記号度数), 指数表記を使わず素因数分解を乗算記号で表現した場合の乗算記号度数(_4桁の数,_指数表記を使った素因数分解,_乗算記号度数)),L), writef('%t\n',[L]). '4桁の数の各桁の合計'(_4桁の数,_各桁の合計) :- between(1000,9999,_4桁の数), 各桁の合計(_4桁の数,0,_各桁の合計). 各桁の合計(0,_各桁の合計,_各桁の合計) :- !. 各桁の合計(N,_各桁の合計_1,_各桁の合計) :- M is N mod 10, N_1 is N // 10, _各桁の合計_2 is _各桁の合計_1 + M, 各桁の合計(N_1,_各桁の合計_2,_各桁の合計). 指数表記を使わず素因数分解を乗算記号で表現した場合の乗算記号度数(N,_指数表記を使った素因数分解,_乗算記号度数) :- 素因数分解(2,N,N,0,[],L), 素因数分解項構成(L,_指数表記を使った素因数分解,0,_乗算記号度数). 素因数分解(U,M,N,C,X,X) :- U > N // 2,!. 素因数分解(U,M,N,0,Y,X) :- member(J^_,Y), 0 is U mod J, U2 is U + 2, 素因数分解(U2,N,N,0,Y,X),!. 素因数分解(2,M,N,0,Y,X) :- \+(0 is M mod 2), 素因数分解(3,N,N,0,Y,X),!. 素因数分解(2,M,N,C,Y,X) :- \+(0 is M mod 2), 素因数分解(3,N,N,0,[2^C|Y],X),!. 素因数分解(U,M,N,0,Y,X) :- \+(U=2), \+(0 is M mod U), U2 is U + 2, 素因数分解(U2,N,N,0,Y,X),!. 素因数分解(U,M,N,C,Y,X) :- \+(U=2), \+(0 is M mod U), U2 is U + 2, 素因数分解(U2,N,N,0,[U^C|Y],X),!. 素因数分解(U,M,N,C,Y,X) :- 0 is M mod U, C2 is C + 1, M1 is M // U, 素因数分解(U,M1,N,C2,Y,X). 素因数分解項構成([J^M],J^M,_乗算記号度数_1,_乗算記号度数) :- _乗算記号度数 is _乗算記号度数_1 + M -1,!. 素因数分解項構成([J^M|R1],B * J^M,_乗算記号度数_1,_乗算記号度数) :- _乗算記号度数_2 is _乗算記号度数_1 + M, 素因数分解項構成(R1,B,_乗算記号度数_2,_乗算記号度数). :- '指数表記を使わずに4桁の整数を素因数分解して、元の数の「各桁の和」が「素因数分解した『×』の数」と等しくなる整数を全て求める',halt. % 以下のサイトは # 指数表記を使わずに整数を素因数分解することを考えます。 # つまり、「72=2×2×2×3×3」のように表現します。 # このときに使う『×』の数は4つです。 # # ここで、元の数の「各桁の和」が「素因数分解した『×』の数」と等しくなるものを考えます。 # 上の72の例であれば、各桁の和は7+2で「9」ですが、『×』の数は「4」なので不適です。 # # この条件を満たすものとしては、「110=2×5×11」や「210=2×3×5×7」、 # 「512=2×2×2×2×2×2×2×2×2」などがあります。 # # では、4桁の整数で上記の条件を満たす数をすべて求めてください。 # # プログラミング言語は不問です。 # お好きな言語で計算してください。 # # 【解答方法】 # 解答用テキストファイルをダウンロードしてください。 # # 解答用テキストファイルを完成させ、アップロードしてください。 '指数表記を使わずに4桁の整数を素因数分解して、元の数の「各桁の和」が「素因数分解した『×』の数」と等しくなる整数を全て求める'(L) :- findall(N,( between(1000,9999,N), 各桁の合計(N,0,_乗算記号度数), 素因数分解(N,X,_乗算記号度数)),L). 各桁の合計(0,_各桁の合計,_各桁の合計) :- !. 各桁の合計(N,_各桁の合計_1,_各桁の合計) :- M is N mod 10, N_1 is N // 10, _各桁の合計_2 is _各桁の合計_1 + M, 各桁の合計(N_1,_各桁の合計_2,_各桁の合計). 素因数分解表示(N) :- 素因数分解(N,X,_乗算記号度数), writef('%t = %t\n乗算記号度数 = %t\n',[N,X,_乗算記号度数]). 素因数分解(N,X,_乗算記号度数) :- 素因数分解(2,N,N,0,[],L,0,_乗算記号度数_1), 素因数分解項構成(L,X,_乗算記号度数_1,_乗算記号度数). 素因数分解(U,M,N,C,X,X,_乗算記号度数,_乗算記号度数) :- U > N // 2,!. 素因数分解(U,M,N,0,Y,X,_乗算記号度数_1,_乗算記号度数) :- member(J^_,Y), 0 is U mod J, U2 is U + 2, 素因数分解(U2,N,N,0,Y,X,_乗算記号度数_1,_乗算記号度数),!. 素因数分解(2,M,N,0,Y,X,_乗算記号度数_1,_乗算記号度数) :- \+(0 is M mod 2), 素因数分解(3,N,N,0,Y,X,_乗算記号度数_1,_乗算記号度数),!. 素因数分解(2,M,N,C,Y,X,_乗算記号度数_1,_乗算記号度数) :- \+(0 is M mod 2), _乗算記号度数_2 is _乗算記号度数_1 + C - 1, 素因数分解(3,N,N,0,[2^C|Y],X,_乗算記号度数_2,_乗算記号度数),!. 素因数分解(U,M,N,0,Y,X,_乗算記号度数_1,_乗算記号度数) :- \+(U=2), \+(0 is M mod U), U2 is U + 2, 素因数分解(U2,N,N,0,Y,X,_乗算記号度数_1,_乗算記号度数),!. 素因数分解(U,M,N,C,Y,X,_乗算記号度数_1,_乗算記号度数) :- \+(U=2), \+(0 is M mod U), U2 is U + 2, _乗算記号度数_2 is _乗算記号度数_1 + C - 1, 素因数分解(U2,N,N,0,[U^C|Y],X,_乗算記号度数_2,_乗算記号度数),!. 素因数分解(U,M,N,C,Y,X,_乗算記号度数_1,_乗算記号度数) :- 0 is M mod U, C2 is C + 1, M1 is M // U, 素因数分解(U,M1,N,C2,Y,X,_乗算記号度数_1,_乗算記号度数). 素因数分解項構成([A],A,_乗算記号度数,_乗算記号度数) :- !. 素因数分解項構成([A|R1],B * A,_乗算記号度数_1,_乗算記号度数) :- _乗算記号度数_2 is _乗算記号度数_1 + 1, 素因数分解項構成(R1,B,_乗算記号度数_2,_乗算記号度数). % 以下のサイトは # 指数表記を使わずに整数を素因数分解することを考えます。 # つまり、「72=2×2×2×3×3」のように表現します。 # このときに使う『×』の数は4つです。 # # ここで、元の数の「各桁の和」が「素因数分解した『×』の数」と等しくなるものを考えます。 # 上の72の例であれば、各桁の和は7+2で「9」ですが、『×』の数は「4」なので不適です。 # # この条件を満たすものとしては、「110=2×5×11」や「210=2×3×5×7」、 # 「512=2×2×2×2×2×2×2×2×2」などがあります。 # # では、4桁の整数で上記の条件を満たす数をすべて求めてください。 # # プログラミング言語は不問です。 # お好きな言語で計算してください。 # # 【解答方法】 # 解答用テキストファイルをダウンロードしてください。 # # 解答用テキストファイルを完成させ、アップロードしてください。 '指数表記を使わずに4桁の整数を素因数分解して、元の数の「各桁の和」が「素因数分解した『×』の数」と等しくなる整数を全て求める'(_各桁の和と乗算記号度数の一致する4桁の数ならび) :- '9999以下の素数ならび'(_9999以下の素数ならび), findall(_4桁の数,( '4桁の数の各桁の合計'(_4桁の数,_乗算記号度数), 指数表記を使わず素因数分解を乗算記号で表現した場合の乗算記号度数(_4桁の数,_9999以下の素数ならび,_乗算記号度数)),_各桁の和と乗算記号度数の一致する4桁の数ならび). '9999以下の素数ならび'(_9999以下の素数ならび) :- findall(N,between(2,9999,N),_2以上9999以下の数リスト), エラトステネスの篩(_2以上9999以下の数リスト,_9999以下の素数ならび). エラトステネスの篩([],[]) :- !. エラトステネスの篩([M|R1],[M|R2]) :- 'R1の残りの数ならびの中で、Mで割り切れるものは篩い落とす'(M,R1,L), エラトステネスの篩(L,R2). 'R1の残りの数ならびの中で、Mで割り切れるものは篩い落とす'(M,R1,L) :- findall(N,( 'R1の残りの数ならびの中で'(R1,N), 'Mで割り切れるものは篩い落とす'(N,M)),L). 'R1の残りの数ならびの中で'(R1,N) :- member(N,R1). 'Mで割り切れるものは篩い落とす'(N,M) :- \+(0 is N mod M). '4桁の数の各桁の合計'(_4桁の数,_各桁の合計) :- between(1000,9999,_4桁の数), 各桁の合計(_4桁の数,0,_各桁の合計). 各桁の合計(0,_各桁の合計,_各桁の合計) :- !. 各桁の合計(N,_各桁の合計_1,_各桁の合計) :- '下位1桁を切り取って加算する'(N,_各桁の合計_1,_下位一桁を切り取った数,_各桁の合計_2), 各桁の合計(_下位一桁を切り取った数,_各桁の合計_2,_各桁の合計). '下位1桁を切り取って加算する'(N,_各桁の合計_1,_下位一桁を切り取った数,_各桁の合計_2) :- M is N mod 10, _下位一桁を切り取った数 is N // 10, _各桁の合計_2 is _各桁の合計_1 + M. 指数表記を使わず素因数分解を乗算記号で表現した場合の乗算記号度数(N,_素数ならび,_乗算記号度数) :- 素数で何回割り切れるか(N,_素数ならび,[],_素因数の数の合計を表すならび), 素因数の数の合計を表すならびから乗算記号度数を得る(_素因数の数の合計を表すならび,_乗算記号度数). 素数で何回割り切れるか(N,[],_何回,_何回). 素数で何回割り切れるか(N,[_素数|R],_何回_1,_何回) :- 一つの素数で割ることができる数を加算する(N,_素数,_何回_1,_何回_2), 素数で何回割り切れるか(N,R,_何回_2,_何回). 一つの素数で割ることができる数を加算する(N,_素数,_何回,_何回) :- 素数で割り切れなくなったらその素数は終了する(N,_素数),!. 一つの素数で割ることができる数を加算する(N,_素数,L1,L) :- 素数で割れるだけ割っていく(N,_素数,L1,N_1,L). 素数で割り切れなくなったらその素数は終了する(N,_素数) :- \+(0 is N mod _素数). 素数で割れるだけ割っていく(N,_素数,L1,N_1,L) :- N_1 is N // _素数, 一つの素数で割ることができる数を加算する(N_1,_素数,[_|L1],L). 素因数の数の合計を表すならびから乗算記号度数を得る([_|L],_乗算記号度数) :- length(L,_乗算記号度数). % 以下のサイトは # 指数表記を使わずに整数を素因数分解することを考えます。 # つまり、「72=2×2×2×3×3」のように表現します。 # このときに使う『×』の数は4つです。 # # ここで、元の数の「各桁の和」が「素因数分解した『×』の数」と等しくなるものを考えます。 # 上の72の例であれば、各桁の和は7+2で「9」ですが、『×』の数は「4」なので不適です。 # # この条件を満たすものとしては、「110=2×5×11」や「210=2×3×5×7」、 # 「512=2×2×2×2×2×2×2×2×2」などがあります。 # # では、4桁の整数で上記の条件を満たす数をすべて求めてください。 # # プログラミング言語は不問です。 # お好きな言語で計算してください。 # # 【解答方法】 # 解答用テキストファイルをダウンロードしてください。 # # 解答用テキストファイルを完成させ、アップロードしてください。 '指数表記を使わずに4桁の整数を素因数分解して、元の数の「各桁の和」が「素因数分解した『×』の数」と等しくなる整数を全て求める' :- findall(_4桁の数,( '4桁の数の各桁の合計'(_4桁の数,_乗算記号度数), 指数表記を使わず素因数分解を乗算記号で表現した場合の乗算記号度数(_4桁の数,_指数表記を使った素因数分解,_乗算記号度数)),L), writef('%t\n',[L]). '4桁の数の各桁の合計'(_4桁の数,_各桁の合計) :- between(1000,9999,_4桁の数), 各桁の合計(_4桁の数,0,_各桁の合計). 各桁の合計(0,_各桁の合計,_各桁の合計) :- !. 各桁の合計(N,_各桁の合計_1,_各桁の合計) :- M is N mod 10, N_1 is N // 10, _各桁の合計_2 is _各桁の合計_1 + M, 各桁の合計(N_1,_各桁の合計_2,_各桁の合計). 指数表記を使わず素因数分解を乗算記号で表現した場合の乗算記号度数(N,_指数表記を使った素因数分解,_乗算記号度数) :- 素因数分解(2,N,N,0,[],L), 素因数分解項構成(L,_指数表記を使った素因数分解,0,_乗算記号度数). 素因数分解(U,M,N,C,X,X) :- U > N // 2,!. 素因数分解(U,M,N,0,Y,X) :- member(J^_,Y), 0 is U mod J, U2 is U + 2, 素因数分解(U2,N,N,0,Y,X),!. 素因数分解(2,M,N,0,Y,X) :- \+(0 is M mod 2), 素因数分解(3,N,N,0,Y,X),!. 素因数分解(2,M,N,C,Y,X) :- \+(0 is M mod 2), 素因数分解(3,N,N,0,[2^C|Y],X),!. 素因数分解(U,M,N,0,Y,X) :- \+(U=2), \+(0 is M mod U), U2 is U + 2, 素因数分解(U2,N,N,0,Y,X),!. 素因数分解(U,M,N,C,Y,X) :- \+(U=2), \+(0 is M mod U), U2 is U + 2, 素因数分解(U2,N,N,0,[U^C|Y],X),!. 素因数分解(U,M,N,C,Y,X) :- 0 is M mod U, C2 is C + 1, M1 is M // U, 素因数分解(U,M1,N,C2,Y,X). 素因数分解項構成([J^M],J^M,_乗算記号度数_1,_乗算記号度数) :- _乗算記号度数 is _乗算記号度数_1 + M -1,!. 素因数分解項構成([J^M|R1],B * J^M,_乗算記号度数_1,_乗算記号度数) :- _乗算記号度数_2 is _乗算記号度数_1 + M, 素因数分解項構成(R1,B,_乗算記号度数_2,_乗算記号度数). :- '指数表記を使わずに4桁の整数を素因数分解して、元の数の「各桁の和」が「素因数分解した『×』の数」と等しくなる整数を全て求める',halt. % 以下のサイトは # 出題場所 :: 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,土曜). % 以下のサイトは % 使用言語 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 % 以下のサイトは # # qsort # 昇順整列([],[]). 昇順整列(_要素ならび,_昇順に整列した要素ならび) :- 軸要素(_要素ならび,_軸要素,_軸要素を除いた要素ならび), '軸要素より小さい要素ならびを昇順に整列したものと,軸要素に等しいか大きい要素ならびを昇順に整列したものを軸要素を挟んで結合する'(_軸要素を除いた要素ならび,_軸要素,_昇順に整列した要素ならび). 軸要素(_要素ならび,_軸要素,_軸要素を除いた要素ならび) :- select(_軸要素,_要素ならび,_軸要素を除いた要素ならび),!. '軸要素より小さい要素ならびを昇順に整列したものと,軸要素に等しいか大きい要素ならびを昇順に整列したものを軸要素を挟んで結合する'(_軸要素を除いた要素ならび,_軸要素,_昇順に整列した要素ならび) :- 軸要素より小さい要素ならびを昇順に整列したものと(_軸要素を除いた要素ならび,_軸要素,_昇順に整列した軸要素より小さい要素ならび), 軸要素に等しいか大きい要素ならびを昇順に整列したものを(_軸要素を除いた要素ならび,_軸要素,_昇順に整列した軸要素に等しいか大きい要素ならび), 軸要素を挟んで結合する(_昇順に整列した軸要素より小さい要素ならび,_軸要素,_昇順に整列した軸要素に等しいか大きい要素ならび,_昇順に整列した要素ならび). 軸要素より小さい要素ならびを昇順に整列したものと(_軸要素を除いた要素ならび,_軸要素,_昇順に整列した軸要素より小さい要素ならび) :- findall(_軸要素より小さい要素,( member(_軸要素より小さい要素,_軸要素を除いた要素ならび), _軸要素より小さい要素 @< _軸要素),_軸要素より小さい要素ならび), 昇順整列(_軸要素より小さい要素ならび,_昇順に整列した軸要素より小さい要素ならび). 軸要素に等しいか大きい要素ならびを昇順に整列したものを(_軸要素を除いた要素ならび,_軸要素,_昇順に整列した軸要素に等しいか大きい要素ならび) :- findall(_軸要素に等しいか大きい要素,( member(_軸要素に等しいか大きい要素,_軸要素を除いた要素ならび), _軸要素に等しいか大きい要素 @>= _軸要素),_軸要素に等しいか大きい要素ならび), 昇順整列(_軸要素に等しいか大きい要素ならび,_昇順に整列した軸要素に等しいか大きい要素ならび). 軸要素を挟んで結合する(_昇順に整列した軸要素より小さい要素ならび,_軸要素,_昇順に整列した軸要素に等しいか大きい要素ならび,_昇順に整列した要素ならび) :- append(_昇順に整列した軸要素より小さい要素ならび,[_軸要素|_昇順に整列した軸要素に等しいか大きい要素ならび],_昇順に整列した要素ならび). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/db/1402919549/310 # SQLServer2012です # 日々の売上の合計が一定額を越えた日を知るにはどうすればいいでしょうか? # # 10/1 |\100 # 10/2 |\200 # 10/3 |\300 # 10/4 |\200 # 10/5 |\400 # 10/6 |\100 # # 上記で\1000を越えた日=10/5と出したいです # 売上(10/1,100). 売上(10/2,200). 売上(10/3,300). 売上(10/4,200). 売上(10/5,400). 売上(10/6,100). '日々の売上の合計が一定額を越えた日を知る'(_一定額,_日々の売上の合計が一定額を越えた日) :- 整列した_日付_売上ならび(_整列した_日付_売上ならび), 日々の売上の合計が(_整列した_日付_売上ならび,_日々の売上の合計,_日々の売上の合計が一定額を越えた日), 一定額を越えた(_一定額,_日々の売上の合計),!. 整列した_日付_売上ならび(_整列した_日付_売上ならび) :- findall([_日付,_売上],売上(_日付,_売上),_日付_売上ならび), sort(_日付_売上ならび,_整列した_日付_売上ならび). 日々の売上の合計が(_整列した_日付_売上ならび,_日々の売上の合計,_一定額を越えた日) :- append(LL1,_,_整列した_日付_売上ならび), findsum(_売上,member([_,_売上],LL1),_日々の売上の合計), last(LL1,[_一定額を越えた日,_]). 一定額を越えた(_一定額,_日々の売上の合計) :- _日々の売上の合計 >= _一定額,!. findsum(A,P,Sum) :- findall(A,P,L), sum_list(L,Sum). % 以下のサイトは # # 出典::増井技術士事務所 今週のアルゴリズムの@masuipeoさんからのアルゴリズムの問題 # # 有名な「パスカルの三角形」は「右上の数と左上の数の和」を配置していきますが、 ここでは単純な「和」ではなく、「排他的論理和」を使うことを考えます。 # 1段目から順に配置してみると、以下の図のようになります。 # # 上から順番に配置していったとき、2014番目の「0」が出力されるのは何段目になるかを求めてください。 # # 1番めの「0」は、3段目、2・3・4番目の「0」は5段目に出力されています。 # # 【解答方法】 # 解答フォームの1行目に答えを記入してください。 # 2行目以降はあなたが求めた方法を記入してください。プログラムを書いた場合はコードを貼り付けてください。 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか(_何行目) :- 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか([_],[1],[],_何行目),!. 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか(Ln,_,_0ならび,_何行目) :- '0ならびの要素数が2014以上の時は何行目'(Ln,_0ならび,_何行目). 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか(Ln,_パスカルの三角形の行,_0ならび_1,_何行目) :- パスカルの三角形の次の行(_パスカルの三角形の行,_パスカルの三角形の次の行), '0ならびの更新'(_パスカルの三角形の次の行,_0ならび_1,_0ならび_2), 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか([_|Ln],_パスカルの三角形の次の行,_0ならび_2,_何行目). '0ならびの要素数が2014以上の時は何行目'(Ln,_0ならび,_何行目) :- length(_0ならび,_要素数), _要素数 >= 2014, length(Ln,_何行目). パスカルの三角形の次の行(_パスカルの三角形の行,_パスカルの三角形の次の行) :- findall(N,( append(_,[A,B|_],_パスカルの三角形の行), 排他的論理和(A,B,N)),_上段の対の値から排他的論理和を取ったならび), 上段の対の値から排他的論理和を取ったならびの両端に1を付加する(_上段の対の値から排他的論理和を取ったならび,_パスカルの三角形の次の行). 上段の対の値から排他的論理和を取ったならびの両端に1を付加する(_上段の対の値から排他的論理和を取ったならび,_パスカルの三角形の次の行) :- append([1|_上段の対の値から排他的論理和を取ったならび],[1],_パスカルの三角形の次の行). 排他的論理和(0,0,0). 排他的論理和(0,1,1). 排他的論理和(1,0,1). 排他的論理和(1,1,0). '0ならびの更新'([],_0ならび_1,_0ならび_1). '0ならびの更新'([0|R1],_0ならび_1,[0|_0ならび_2]) :- '0ならびの更新'(R1,_0ならび_1,_0ならび_2). '0ならびの更新'([1|R1],_0ならび_1,_0ならび_2) :- '0ならびの更新'(R1,_0ならび_1,_0ならび_2). % 以下のサイトは 等差数列([_],_公差) :- var(_公差),!,fail. 等差数列(_等差数列,_公差) :- 等差数列とは公差確定問題である(_等差数列,_公差). 等差数列とは公差確定問題である([_],_公差). 等差数列とは公差確定問題である([V|_等差数列],_公差) :- '先頭要素が変数の時、後続の数列が等差数列で公差が決まれば、後続の等差数列の先頭要素と公差からVが求まる'([V|_等差数列],_公差). 等差数列とは公差確定問題である([A,B|_等差数列],_公差) :- 先頭要素と公差が変数でない時は後続の等差数列は順に解決できる([A,B|_等差数列],_公差). 等差数列とは公差確定問題である([A|_等差数列],_公差) :- '公差が変数でAは変数でない時は、次の変数でない要素とそれまでの要素数から公差を推計して、等差数列部分を確定していく'([A|_等差数列],_公差). '先頭要素が変数の時、後続の数列が等差数列で公差が決まれば、後続の等差数列の先頭要素と公差からVが求まる'([V|_等差数列],_公差) :- 変数である(V), 等差数列(_等差数列,_公差), _等差数列 = [_後続の等差数列の先頭要素|_], V is _後続の等差数列の先頭要素 - _公差. 先頭要素と公差が変数でない時は後続の等差数列は順に解決できる([A,B|_等差数列],_公差) :- 先頭要素と公差が変数でない時は(A,_公差), 後続ならびは順に解決できる([A,B|_等差数列],_公差). 先頭要素と公差が変数でない時は(A,_公差) :- 変数ではない(A), 変数ではない(_公差). 後続ならびは順に解決できる([A,B|_等差数列],_公差) :- B is A + _公差, 等差数列([B|_等差数列],_公差). '公差が変数でAは変数でない時は、次の変数でない要素とそれまでの要素数から公差を推計して、等差数列部分を確定していく'([A|_等差数列],_公差) :- 公差が変数でAは変数でない時は(A,_公差), 次の変数でない要素とそれまでの要素数から公差を推計して(A,_等差数列,_次の変数でない要素,_変数ならび,_残り等差数列,_公差), 等差数列部分を確定していく(A,_次の変数でない要素,_変数ならび,_残り等差数列,_公差). 公差が変数でAは変数でない時は(A,_公差) :- 変数である(_公差), 変数ではない(A). 次の変数でない要素とそれまでの要素数から公差を推計して(A,_等差数列,A,[],[],_公差) :- '等差数列が全て変数の時は変数は全てAとなり公差は0'(A,_等差数列,_公差),!. 次の変数でない要素とそれまでの要素数から公差を推計して(A,_等差数列,_次の変数でない要素,_変数ならび,_残りならび,_公差) :- 次の変数でない要素とそれまでの要素数から(_等差数列,_次の変数でない要素,_変数ならび,_残りならび), 公差を推計して(A,_次の変数でない要素,_変数ならび,_公差). 等差数列が全て変数の時は変数は全てAとなり公差は0(A,_等差数列,0) :- 等差数列が全て変数の時は(_等差数列), 変数は全てAとなり(A,_等差数列). 等差数列が全て変数の時は(_等差数列) :- forall(member(V,_等差数列),var(V)). 変数は全てAとなり(_等差数列,A) :- findall(A,member(_,_等差数列),_等差数列). 次の変数でない要素とそれまでの要素数から(_等差数列,_次の変数でない要素,_変数ならび,_残りならび) :- append(_変数ならび,[_次の変数でない要素|_残りならび],_等差数列), 要素は全て変数である(_変数ならび), 変数ではない(_次の変数でない要素). 要素は全て変数である(_変数ならび) :- forall(member(_変数,_変数ならび),変数である(_変数)). 公差を推計して(A,_次の変数でない要素,_変数ならび,_公差) :- length([_|_変数ならび],_分割数), _公差 is (_次の変数でない要素 - A) / _分割数. 等差数列部分を確定していく(A,B,L1,R2,_公差) :- 等差数列([A|L1],_公差), 等差数列([B|R2],_公差). 変数である(_変数) :- var(_変数). 変数ではない(_変数ではない項) :- \+(var(_変数ではない項)). % 以下のサイトは :- dynamic(フィボナッチ数/2). 'repeat-failループでのフィボナッチ数列の計算'(0,[0]) :- !. 'repeat-failループでのフィボナッチ数列の計算'(1,[0,1]) :- !. 'repeat-failループでのフィボナッチ数列の計算'(N,_フィボナッチ数列) :- 初期化(N,L), 'フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である。2からNまでのフィボナッチ数を登録する'(L,N), findall(_フィボナッチ数,フィボナッチ数(_,_フィボナッチ数),_フィボナッチ数列). 'フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である。2からNまでのフィボナッチ数を登録する'(L,N) :- repeat, append(L1,[A,B,C|L2],L), フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である(A,B,C), L1=[],!. フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である(A,B,C) :- フィボナッチ数(B,_一つ前のフィボナッチ数), フィボナッチ数(C,_二つ前のフィボナッチ数), _フィボナッチ数 is _一つ前のフィボナッチ数 + _二つ前のフィボナッチ数, フィボナッチ数が未登録ならば登録する(A,_フィボナッチ数). フィボナッチ数が未登録ならば登録する(A,_フィボナッチ数) :- \+(フィボナッチ数(A,_)), assertz(フィボナッチ数(A,_フィボナッチ数)). 初期化(N,L) :- abolish(フィボナッチ数/2), assertz(フィボナッチ数(0,0)), assertz(フィボナッチ数(1,1)), 'Nから0までの逆順リストを用意する'(N,L). 'Nから0までの逆順リストを用意する'(N,L) :- findall(M,between(0,N,M),L1), reverse(L1,L). % 以下のサイトは :- dynamic(フィボナッチ数/2). 'repeat-failループでのフィボナッチ数列の計算'(0,[0]) :- !. 'repeat-failループでのフィボナッチ数列の計算'(1,[0,1]) :- !. 'repeat-failループでのフィボナッチ数列の計算'(N,_) :- 初期化(N,L), 'フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である。2からNまでのフィボナッチ数を登録する'(L,N). 'repeat-failループでのフィボナッチ数列の計算'(_,_フィボナッチ数列) :- findall(M,フィボナッチ数(_,M),_フィボナッチ数列). 'フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である。2からNまでのフィボナッチ数を登録する'(L,N) :- repeat, append(L1,[A,B,C|L2],L), フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である(A,B,C), (L1=[],!,fail;fail). フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である(A,B,C) :- フィボナッチ数(B,_一つ前のフィボナッチ数), フィボナッチ数(C,_二つ前のフィボナッチ数), _フィボナッチ数 is _一つ前のフィボナッチ数 + _二つ前のフィボナッチ数, フィボナッチ数が未登録ならば登録する(A,_フィボナッチ数). フィボナッチ数が未登録ならば登録する(A,_フィボナッチ数) :- \+(フィボナッチ数(A,_)), assertz(フィボナッチ数(A,_フィボナッチ数)). 初期化(N,L) :- abolish(フィボナッチ数/2), assertz(フィボナッチ数(0,0)), assertz(フィボナッチ数(1,1)), 'Nから0までの逆順リストを用意する'(L). 'Nから0までの逆順リストを用意する'(N,L) :- findall(M,between(0,N,M),L1), reverse(L1,L). % 以下のサイトは :- dynamic(フィボナッチ数/2). 'repeat-failループでのフィボナッチ数列の計算'(N,_) :- 初期化, findall(M,between(0,N,M),L1), reverse(L1,L2), フィボナッチ数の解決(L2,N). 'repeat-failループでのフィボナッチ数列の計算'(_,_フィボナッチ数列) :- findall(M,フィボナッチ数(_,M),_フィボナッチ数列). 初期化 :- abolish(フィボナッチ数/2), assertz(フィボナッチ数(0,0)), assertz(フィボナッチ数(1,1)). フィボナッチ数の解決(L,N) :- repeat, append(L1,[A,B,C|L2],L), フィボナッチ数(B,V_1), フィボナッチ数(C,V_2), V is V_1 + V_2, \+(フィボナッチ数(A,V)), assertz(フィボナッチ数(A,V)), (L1=[],!,fail;fail). % 以下のサイトは # # ガリ夫くん:スマ子さん、最近実は数字萌えに目覚めたんです! # # スマ子さん: 藪から棒にアブノーマル宣言をされても困るのだけれども……。 # # ガリ夫くん:特に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). % 以下のサイトは 日曜起点カレンダー(_一日の曜日,_末日整数,_カレンダー) :- findall(_日,between(1,_末日整数,_日),_日付ならび), 第一週の整形(_一日の曜日,_日付ならび,_第一週,_第二週以後), '第二週以後(最終週の整形)'(_第二週以後,_最終週を整形された第二週以後), _カレンダー = [_第一週|_最終週を整形された第二週以後]. 第一週の整形(日曜,[_1,_2,_3,_4,_5,_6,_7|R],[_1,_2,_3,_4,_5,_6,_7],R). 第一週の整形(月曜,[_1,_2,_3,_4,_5,_6|R],[_,_1,_2,_3,_4,_5,_6],R). 第一週の整形(火曜,[_1,_2,_3,_4,_5|R],[_,_,_1,_2,_3,_4,_5],R). 第一週の整形(水曜,[_1,_2,_3,_4|R],[_,_,_,_1,_2,_3,_4],R). 第一週の整形(木曜,[_1,_2,_3|R],[_,_,_,_,_1,_2,_3],R). 第一週の整形(金曜,[_1,_2|R],[_,_,_,_,_,_1,_2],R). 第一週の整形(土曜,[_1|R],[_,_,_,_,_,_,_1],R). '第二週以後(最終週の整形)'([],[]) :- !. '第二週以後(最終週の整形)'([_1,_2,_3,_4,_5,_6,_7|R1],[[_1,_2,_3,_4,_5,_6,_7]|R2]) :- '第二週以後(最終週の整形)'(R1,R2),!. '第二週以後(最終週の整形)'(L1,[_最終週]) :- 一週間は七日だ(_最終週), append(L1,_,_最終週). 一週間は七日だ([_,_,_,_,_,_,_]). % 以下のサイトは 連立一次方程式の解(_拡大係数行列,_解ならび) :- ガウス行列に変形(_拡大係数行列,_ガウス行列,_), 連立一次方程式の一般解(_ガウス行列,_解ならび). 連立一次方程式の一般解(_ガウス行列,_解ならび) :- 解が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 = _ガウス行列の階数). 解がない場合(_ガウス行列). % 以下のサイトは '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- M is _第何行_2 - _第何行_1, '_第何行_1まで切り取る'(_行列,_第何行_1,L1,A,R1), '_第何行_2まで切り取る'(R1,M,A,B,R3), append(L1,[B|R3],_2つの行を交換した行列). '_第何行_1まで切り取る'(_行列,_第何行_1,L1,A,R1) :- append(L1,[A|R1],_行列), length([_|L1],_第何行_1). '_第何行_2まで切り取る'(R1,M,A,B,R3) :- append(L2,[B|R2],R1), length([_|L2],M), append(L2,[A|R2],R3). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- '2つの行を交換する'(1,_第何行_1,_第何行_2,_行列,A,B,_2つの行を交換した行列). '2つの行を交換する'(_,_,_,[],_,_,[]). '2つの行を交換する'(M,M,_n_2,[A|R1],A,B,[B|R2]) :- succ(M,M_2), '2つの行を交換する'(M_2,M,_n_2,R1,A,B,R2),!. '2つの行を交換する'(M,_n_1,M,[B|R1],A,B,[A|R2]) :- succ(M,M_2), '2つの行を交換する'(M_2,_n_1,M,R1,A,B,R2),!. '2つの行を交換する'(M,_n_1,_n_2,[U|R1],A,B,[U|R2]) :- succ(M,M_2), '2つの行を交換する'(M_2,_n_1,_n_2,R1,A,B,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- '2つの行を交換する'(1,_第何行_1,_第何行_2,_行列,A,B,_2つの行を交換した行列). '2つの行を交換する'(_,_,_,[],_,_,[]). '2つの行を交換する'(M,_n_1,_n_2,[C|R1],A,B,[D|R2]) :- 交換の選択(M,_n_1,_n_2,C,A,B,D), succ(M,M_2), '2つの行を交換する'(M_2,_n_1,_n_2,R1,A,B,R2). 交換の選択(M,M,_n_2,A,A,B,B) :- !. 交換の選択(M,_n_1,M,B,A,B,A) :- !. 交換の選択(M,_n_1,_n_2,U,A,B,U). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- 値だけ交換し残りは変数のならび(_行列,_第何行_1,_第何行_2,_2つの行のみ交換して埋めた変数ならび), 残った変数を行列の値で埋める(_行列,_2つの行を交換した行列). 値だけ交換し残りは変数のならび(_行列,_第何行_1,_第何行_2,_2つの行のみ交換して埋めた変数ならび) :- 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2), '2つの行のみ交換して埋めた変数ならび'(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび). 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2) :- nth1(_第何行_1,_行列,_行_1), nth1(_第何行_2,_行列,_行_2). '2つの行のみ交換して埋めた変数ならび'(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび) :- length(_行列,_行列の行数), findall(_,between(1,_行列の行数,_),_2つの行のみ交換して埋めた変数ならび), nth1(_第何行_2,_2つの行のみ交換して埋めた変数ならび,_行_1), nth1(_第何行_1,_2つの行のみ交換して埋めた変数ならび,_行_2). 残った変数を行列の値で埋める([],[]). 残った変数を行列の値で埋める([A|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2),!. 残った変数を行列の値で埋める([_|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2). % 以下のサイトは '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- M is _第何行_2 - _第何行_1, '_第何行_1まで切り取る'(_行列,_第何行_1,L1,A,R1), '_第何行_2まで切り取る'(R1,M,A,B,R3), append(L1,[B|R3],_2つの行を交換した行列). '_第何行_1まで切り取る'(_行列,_第何行_1,L1,A,R1) :- append(L1,[A|R1],_行列), length([_|L1],_第何行_1). '_第何行_2まで切り取る'(R1,M,A,B,R3) :- append(L2,[B|R2],R1), length([_|L2],M), append(L2,[A|R2],R3). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- '2つの行を交換する'(1,_第何行_1,_第何行_2,_行列,A,B,_2つの行を交換した行列). '2つの行を交換する'(_,_,_,[],_,_,[]). '2つの行を交換する'(M,M,_n_2,[A|R1],A,B,[B|R2]) :- succ(M,M_2), '2つの行を交換する'(M_2,M,_n_2,R1,A,B,R2),!. '2つの行を交換する'(M,_n_1,M,[B|R1],A,B,[A|R2]) :- succ(M,M_2), '2つの行を交換する'(M_2,_n_1,M,R1,A,B,R2),!. '2つの行を交換する'(M,_n_1,_n_2,[U|R1],A,B,[U|R2]) :- succ(M,M_2), '2つの行を交換する'(M_2,_n_1,_n_2,R1,A,B,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- '2つの行を交換する'(1,_第何行_1,_第何行_2,_行列,A,B,_2つの行を交換した行列). '2つの行を交換する'(_,_,_,[],_,_,[]). '2つの行を交換する'(M,_n_1,_n_2,[C|R1],A,B,[D|R2]) :- 交換の選択(M,_n_1,_n_2,C,A,B,D), succ(M,M_2), '2つの行を交換する'(M_2,_n_1,_n_2,R1,A,B,R2). 交換の選択(M,M,_n_2,A,A,B,B) :- !. 交換の選択(M,_n_1,M,B,A,B,A) :- !. 交換の選択(M,_n_1,_n_2,U,A,B,U). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- 値だけ交換し残りは変数のならび(_行列,_第何行_1,_第何行_2,_2つの行のみ交換して埋めた変数ならび), 残った変数を行列の値で埋める(_行列,_2つの行を交換した行列). 値だけ交換し残りは変数のならび(_行列,_第何行_1,_第何行_2,_2つの行のみ交換して埋めた変数ならび) :- 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2), '2つの行のみ交換して埋めた変数ならび'(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび). 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2) :- nth1(_第何行_1,_行列,_行_1), nth1(_第何行_2,_行列,_行_2). '2つの行のみ交換して埋めた変数ならび'(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび) :- length(_行列,_行列の行数), findall(_,between(1,_行列の行数,_),_2つの行のみ交換して埋めた変数ならび), nth1(_第何行_2,_2つの行のみ交換して埋めた変数ならび,_行_1), nth1(_第何行_1,_2つの行のみ交換して埋めた変数ならび,_行_2). 残った変数を行列の値で埋める([],[]). 残った変数を行列の値で埋める([A|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2),!. 残った変数を行列の値で埋める([_|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2). % 以下のサイトは '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- 値だけ交換し残りは変数のならび(_行列,_2つの行を交換した行列), 残った変数を行列の値で埋める(_行列,_2つの行を交換した行列). 値だけ交換し残りは変数のならび(_行列,_第何行_1,_第何行_2,_2つの行のみ交換して埋めた変数ならび) :- 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2), 2つの行のみ交換して埋めた変数ならび(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび). 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2) :- nth1(_第何行_1,_行列,_行_1), nth1(_第何行_2,_行列,_行_2). 2つの行のみ交換して埋めた変数ならび(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび) :- length(_行列,_行列の行数), findall(_,between(1,_行列の行数,_),_2つの行のみ交換して埋めた変数ならび), nth1(_第何行_2,_2つの行のみ交換して埋めた変数ならび,_行_1), nth1(_第何行_1,_2つの行のみ交換して埋めた変数ならび,_行_2). 残った変数を行列の値で埋める([],[]). 残った変数を行列の値で埋める([A|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2),!. 残った変数を行列の値で埋める([_|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2). % 以下のサイトは '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- 値だけ交換し残りは変数のならび(_行列,_2つの行を交換した行列), 残った変数を行列の値で埋める(_行列,_2つの行を交換した行列). 値だけ交換し残りは変数のならび(_行列,_第何行_1,_第何行_2,_2つの行のみ交換して埋めた変数ならび) :- 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2), 2つの行のみ交換して埋めた変数ならび(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび). 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2) :- nth1(_第何行_1,_行列,_行_1), nth1(_第何行_2,_行列,_行_2). 2つの行のみ交換して埋めた変数ならび(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび) :- length(_行列,_行列の行数), findall(_,between(1,_行列の行数,_),_2つの行のみ交換して埋めた変数ならび), nth1(_第何行_2,_2つの行のみ交換して埋めた変数ならび,_行_1), nth1(_第何行_1,_2つの行のみ交換して埋めた変数ならび,_行_2). 残った変数を行列の値で埋める([],[]). 残った変数を行列の値で埋める([A|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2),!. 残った変数を行列の値で埋める([_|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2). % 以下のサイトは # 出典::プログラミングのお題スレ Part5 #644 # # お題:硬貨がn枚あり、合計金額がk円のとき、その内訳を求める。 # 硬貨の種類は500円玉、100円玉、50円玉、10円玉、5円玉、1円玉である。 # 内訳は各硬貨の枚数を並べたものとする。 # 複数の解がある場合はすべてを求める。 # 例 # 11枚で1082円のとき # 2 0 1 0 6 2 # # 12枚で777円のとき # 1 0 5 1 3 2 # 1 1 3 0 5 2 # # 25枚で4999円のとき # 9 2 5 4 1 4 # 9 3 3 3 3 4 # 9 4 1 2 5 4 '硬貨がn枚あり、合計金額がk円のとき、その内訳を求める。 硬貨の種類は500円玉、100円玉、50円玉、10円玉、5円玉、1円玉である。 内訳は各硬貨の枚数を並べたものとする。 複数の解がある場合はすべてを求める。'(_n,_k,_500,_100,_50,_10,_5,_1) :- findall(_,between(1,_n,_),L), append(L1,L2,L3,L4,L5,L6,L), 硬貨の枚数([L1,L2,L3,L4,L5,L6],[_500,_100,_50,_10,_5,_1]), _k is 500 * _500 + 100 * _100 + 50 * _50 + 10 * _10 + 5 * _5 + 1 * _1. 硬貨の枚数([],[]). 硬貨の枚数([L|R1],[_枚数|R2]) :- length(L,_枚数), 硬貨の枚数(R1,R2). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). append([],L2,L3,L4,L5) :- append(L2,L3,L4,L5). append([U|L1],L2,L3,L4,[U|L5]) :- append(L1,L2,L3,L4,L5). append([],L2,L3,L4,L5,L6) :- append(L2,L3,L4,L5,L6). append([U|L1],L2,L3,L4,L5,[U|L6]) :- append(L1,L2,L3,L4,L5,L6). append([],L2,L3,L4,L5,L6,L7) :- append(L2,L3,L4,L5,L6,L7). append([U|L1],L2,L3,L4,L5,L6,[U|L7]) :- append(L1,L2,L3,L4,L5,L6,L7). % 以下のサイトは # 出典:: プログラミングのお題スレ 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])),_数ならび). % 以下のサイトは # # append/1 は append/4-n をabolishした後に定義する。 # ただし、_nはappend/1の引数の要素数。 # # ?- append([[1,2],[3,4],[a],[b,c,d],X]). # X = [1,2,3,4,a,b,c,d]. # # ?- append([X,[3,4],[a],Y],[1,2,3,4,a,b,c,d]]). # X = [1,2], # Y = [b,c,d]. # append(LL) :- length(LL,_n), abolish_append_n(_n), append_n_の定義(_n), P =.. [append|LL], call(P). abolish_append_n(_n) :- between(4,_n,M), abolish(append/M), _n = M. append_n_の定義(3) :- !. append_n_の定義(_n) :- succ(_n_1,_n), append_n_の定義(_n_1), append_n_の第一節定義(_n_1), append_n_の第二節定義(_n). append_n_の第一節定義(_n_1) :- findall(_,between(1,_n_1,_),L1), P_1 =.. [append,[]|L1], P_1_1 =.. [append|L1], assertz((P_1 :- P_1_1)). append_n_の第二節定義(_n) :- findall(_,between(1,_n,_),_本体引数ならび), append_n_の第二節頭部引数(_本体引数ならび,_頭部引数ならび), _頭部 =.. [append|_頭部引数ならび], _本体 =.. [append|_本体引数ならび], assertz((_頭部 :- _本体)). append_n_の第二節頭部引数([V|R1],[[U|V]|R2]) :- append_n_の第二節頭部引数(R1,U,R2). append_n_の第二節頭部引数([V],U,[[U|V]]) :- !. append_n_の第二節頭部引数([V|R1],U,[V|R2]) :- append_n_の第二節頭部引数(R1,U,R2). % 以下のサイトは # 最大の利益 # FX取引では、異なる国の通貨を交換することで為替差の利益を得ることができます。例えば、1ドル100円の時に 1000ドル買い、価格変動により 1ドル 108円になった時に売ると、(108円 − 100円) × 1000ドル = 8000円の利益を得ることができます。 # # ある通貨について、時刻 t における価格 R[t] (t=1,2,,,N)が入力として与えられるので、価格の差 R[j]−R[i] (ただし、j>i とする) の最大値を求めてください。 # # 入力 # 最初の行に整数 N が与えられる。 # # 続くN行に整数 R[t] (t=1,2,,,N) が順番に与えられる。 # # 出力 # 最大値を1行に出力せよ。 # # 制約 # 2?N?200000 # 1?R[t]?109 # 入力例 1 # 6 # 2 # 3 # 1 # 3 # 4 # 3 # 入力例 1 に対する出力 # 3 # 入力例 2 # 4 # 4 # 1 # 2 # 1 # 入力例 2 に対する出力 # 1 'FX取引では、異なる国の通貨を交換することで為替差の利益を得ることができます。 例えば、1ドル100円の時に 1000ドル買い、価格変動により 1ドル 108円になった時に売ると、 (108円 − 100円) × 1000ドル = 8000円の利益を得ることができます。 ある通貨について、時刻 t における価格 R[t] (t=1,2,,,N)が入力として与えられるので、 価格の差 R[j]−R[i] (ただし、j>i とする) の最大値を求めてください。' :- ある通貨の時系列為替価格ならびを得る(_ある通貨の時系列為替価格ならび), 最大の為替差の利益(_ある通貨の時系列為替価格ならび,_最大の為替差の利益), 最大の為替差の利益を表示する(_最大の為替差の利益). ある通貨の時系列価格ならびを得る(_ある通貨の時系列価格ならび) :- 時系列数を得る(_時系列数), findall(_価格,( 価格を得る(_時系列数,_価格)), _ある通貨の時系列価格ならび). 時系列数を得る(_時系列数) :- 整数を得る(_時系列数). 価格を得る(_時系列数,_価格) :- between(1,_時系列数,_t), 整数を得る(_価格). 最大の為替差の利益(_ある通貨の時系列価格ならび,_最大の為替差の利益) :- findmax(_時刻tの投資に対する最大利益,( 時刻tの投資に対する最大利益(_ある通貨の時系列価格ならび,_時刻tの投資に対する最大利益)), _最大の為替差の利益). 時刻tの投資に対する最大利益(_ある通貨の時系列価格ならび,_時刻tの投資に対する最大利益) :- append(_,[_時刻tの価格|_その後価格ならび],_ある通貨の時系列価格ならび), 時刻tの投資に対する最大利益(_時刻tの価格,_その後の価格ならび,_時刻tの投資に対する最大利益). 時刻tの投資に対する最大利益(_時刻tの価格,_その後の価格ならび,_時刻tの投資に対する最大利益) :- findmax(_時刻tの価格との価格差,( 時刻tの価格との価格差(_時刻tの価格,_その後の価格ならび,_時刻tの価格との価格差)), _時刻tの投資に対する最大利益). 時刻tの価格との価格差(_時刻tの価格,_その後の価格ならび,_時刻tの価格との価格差) :- member(_その後の時系列での価格,_その後の価格ならび), _時刻tの価格との価格差 is _その後の時系列での価格 - _時刻tの価格. 最大の為替差の利益を表示する(_最大の為替差の利益) :- writef('%t\n',[_最大の為替差の利益]). % 以下のサイトは # 最大の利益 # FX取引では、異なる国の通貨を交換することで為替差の利益を得ることができます。例えば、1ドル100円の時に 1000ドル買い、価格変動により 1ドル 108円になった時に売ると、(108円 − 100円) × 1000ドル = 8000円の利益を得ることができます。 # # ある通貨について、時刻 t における価格 R[t] (t=1,2,,,N)が入力として与えられるので、価格の差 R[j]−R[i] (ただし、j>i とする) の最大値を求めてください。 # # 入力 # 最初の行に整数 N が与えられる。 # # 続くN行に整数 R[t] (t=1,2,,,N) が順番に与えられる。 # # 出力 # 最大値を1行に出力せよ。 # # 制約 # 2?N?200000 # 1?R[t]?109 # 入力例 1 # 6 # 2 # 3 # 1 # 3 # 4 # 3 # 入力例 1 に対する出力 # 3 # 入力例 2 # 4 # 4 # 1 # 2 # 1 # 入力例 2 に対する出力 # 1 'FX取引では、異なる国の通貨を交換することで為替差の利益を得ることができます。 例えば、1ドル100円の時に 1000ドル買い、価格変動により 1ドル 108円になった時に売ると、 (108円 − 100円) × 1000ドル = 8000円の利益を得ることができます。 ある通貨について、時刻 t における価格 R[t] (t=1,2,,,N)が入力として与えられるので、 価格の差 R[j]−R[i] (ただし、j>i とする) の最大値を求めてください。' :- 時刻tに於ける価格ならびを得る(_時刻tに於ける価格ならび), 最大の為替差の利益(_時刻tに於ける価格ならび,_最大の為替差の利益), 最大の為替差の利益を表示する(_最大の為替差の利益). 時刻tに於ける価格ならびを得る(_時刻tに於ける価格ならび) :- 時系列数を得る(_時系列数), findall(_価格,( between(1,_時系列数,_t), 価格を得る(_価格)), _時刻tに於ける価格ならび). 最大の為替差の利益(_時刻tに於ける価格ならび,_最大の為替差の利益) :- findmax(_時刻tの投資に対する最大価格差,( append(_,[_時刻tの価格|_その後価格ならび],_時刻tに於ける価格ならび), 時刻tの投資に対する最大価格差(_時刻tの価格,_その後の価格ならび,_時刻tの投資に対する最大価格差)), _最大の為替差の利益). 時刻tの投資に対する最大価格差(_時刻tの価格,_その後の価格ならび,_時刻tの投資に対する最大価格差) :- findmax(_時刻tの価格との価格差,( member(_その後の時系列での価格,_その後の価格ならび), _時刻tの価格との価格差 is _その後の時系列での価格 - _時刻tの価格), _時刻tの投資に対する最大価格差). 時系列数を得る(_時系列数) :- 整数を得る(_時系列数). 価格を得る(_価格) :- 整数を得る(_価格). 最大の為替差の利益を表示する(_最大の為替差の利益) :- writef('%t\n',[_最大の為替差の利益]). % 以下のサイトは ハイカード(_手札,_数字_1,_数字_2,_数字_3,_数字_4,_数字_5) :- 五枚の数字は(_手札,_数字_1,_数字_2,_数字_3,_数字_4,_数字_5), '大きい順に並んでいて、全て異なっている'(_数字_1,_数字_2,_数字_3,_数字_4,_数字_5), スートは二種類以上混じっている(_手札),!. '大きい順に並んでいて、全て異なっている'(_数字_1,_数字_2,_数字_3,_数字_4,_数字_5) :- 数字順位(L), findall(_数字,( 大きい順に重複しない数字を取り出す(L,_数字_1,_数字_2,_数字_3,_数字_4,_数字_5)), [_数字_1,_数字_2,_数字_3,_数字_4,_数字_5]). 大きい順に重複しない数字を取り出す(L,_数字_1,_数字_2,_数字_3,_数字_4,_数字_5) :- member(_数字,L), select(_数字,[_数字_1,_数字_2,_数字_3,_数字_4,_数字_5],R), \+(member(_数字,R)). ワンペア(_手札,_同位数字,_残りの手札) :- 二枚の同位な数字を取り出す(_手札,_数字,_数字,_残りの手札), この数字は残りの手札の中にはない(_数字,_残りの手札), 残りの手札の中に同位数字がない(_残りの手札),!. 二枚数字を取り出す(_手札,_数字_1,_数字_2,_残りの手札) :- select((_数字_1,_),_手札,_残りの手札_1), select((_数字_2,_),_残りの手札_1,_残りの手札). この数字は残りの手札の中にはない(_数字,_残りの手札) :- \+(member((_数字,_),_残りの手札)). 残りの手札の中に同位数字がない(_残りの手札) :- \+(同位数字がある(_残りの手札)). 同位数字がある(_手札) :- select((_数字,_),_手札,_残りの手札_2), select((_数字,_),_残りの手札_2,_). ツーペア(_手札,_数字_1,_数字_2,_残りの手札) :- 二枚数字を取り出す(_手札,_数字_1,_数字_1,_残りの手札), 二枚数字を取り出す(_残りの手札,_数字_2,[(_数字_3,_)]), '_数字_1と_数字_2は同位でなく、それぞれは_数字_3とも同位ではない'(_数字_1,_数字_2,_数字_3),!. '_数字_1と_数字_2は同位でなく、それぞれは_数字_3とも同位ではない'(_数字_1,_数字_2,_数字_3) :- '_数字_1と_数字_2は同位でなく、'(_数字_1,_数字_2), '_数字_1と_数字_2は_数字_3とも同位でない'(_数字_1,_数字_2,_数字_3). '_数字_1と_数字_2は同位でなく、'(_数字_1,_数字_2) :- \+(_数字_1 = _数字_2). '_数字_1と_数字_2は_数字_3とも同位でない'(_数字_1,_数字_2) :- \+(_数字_3 = _数字_1), \+(_数字_3 = _数字_2). 二枚数字を取り出す(_手札,_数字_1,_数字_2,_残りの手札) :- select((_数字_1,_),_手札,_残りの手札_1), select((_数字_2,_),_残りの手札_1,_残りの手札). 残りの手札に_数字がない(_数字,_残りの手札) :- \+(member((_数字,_),_残りの手札)). 残りの手札に同位数字がない(_残りの手札) :- \+((select((_数字,_),_残りの手札,_残りの手札_2),select((_数字,_),_残りの手札_2,_))). スリーカーズ(_手札,_数字) :- 三枚数字を取り出す(_手札,_数字,_数字,_数字,[(A,_),(B,_)]), 'A,B,_数字はそれぞれ異なる'(_数字,_残りの手札),!. 三枚数字を取り出す(_手札,_数字_1,__数字_2,_数字_3,_残りの手札) :- select((_数字_1,_),_手札,_残りの手札_1), select((_数字_2,_),_残りの手札_1,_残りの手札_2), select((_数字_3,_),_残りの手札_2,_残りの手札). 'A,B,_数字はそれぞれ異なる'(_数字,A,B) :- \+(A = B), '_数字はAでもBでもない'(_数字,_A,B). '_数字はAでもBでもない'(_数字,_A,B) :- \+(_数字 = A), \+(_数字 = B). 'フォー・オブ・ア・カインド'(_手札,_数字) :- 四枚数字を取り出す(_手札,_数字,_数字,_数字,_数字,_残りの手札),!. 五枚数字を取り出す(_手札,_数字_1,_数字_2,_数字_3,_数字_4,_数字_5) :- select((_数字_1,_),_手札,_残りの手札_1), select((_数字_2,_),_残りの手札_1,_残りの手札_2), select((_数字_3,_),_残りの手札_2,_残りの手札_3), select((_数字_4,_),_残りの手札_3,_残りの手札_4), select((_数字_5,_),_残りの手札_4,_). 四枚数字を取り出す(_手札,_数字_1,_数字_2,_数字_3,_数字_4,_残りの手札) :- select((_数字_1,_),_手札,_残りの手札_1), select((_数字_2,_),_残りの手札_1,_残りの手札_2), select((_数字_3,_),_残りの手札_2,_残りの手札_3), select((_数字_4,_),_残りの手札_3,_残りの手札). フルハウス(_手札,_3枚の数字,_2枚の数字) :- 三枚の数字と二枚の数字が同位(_手札),!. 三枚の数字と二枚の数字が同位(_手札,_3枚の数字,_2枚の数字) :- 三枚数字を取り出す(_手札,_3枚の数字,_3枚の数字,_3枚の数字,[(_2枚の数字,_),(_2枚の数字,_)]), \+(_数字_1 = _数字_2),!. フラッシュ(_手札,_スート,_数字_1,_数字_2,_数字_3,_数字_4,_数字_5) :- 五枚の数字は(_手札,_数字_1,_数字_2,_数字_3,_数字_4,_数字_5), \+(連続している(_数字_1,_数字_2,_数字_3,_数字_4,_数字_5)), 全てのスートが同じ(_手札,_スート),!. ストレート(_手札,_数字_1,_数字_2,_数字_3,_数字_4,_数字_5) :- 五枚の数字は連続している(_手札,_数字_1,_数字_2,_数字_3,_数字_4,_数字_5), スートは二種類以上混じっている(_手札),!. ストレートフラッシュ(_手札,_数字_1,_数字_2,_数字_3,_数字_4,_数字_5) :- 五枚の数字は連続している(_手札,_数字_1,_数字_2,_数字_3,_数字_4,_数字_5), 全てのスートが同じ(_手札,_スート),!. 五枚の数字は連続している(_手札,_数字_1,_数字_2,_数字_3,_数字_4,_数字_5) :- 五枚の数字は(_手札,_数字_1,_数字_2,_数字_3,_数字_4,_数字_5), 連続している(_数字_1,_数字_2,_数字_3,_数字_4,_数字_5),!. 五枚の数字は(_手札,_数字_1,_数字_2,_数字_3,_数字_4,_数字_5) :- select((_数字_1,_),_手札,_残りの手札_1), select((_数字_2,_),_残りの手札_1,_残りの手札_2), select((_数字_3,_),_残りの手札_2,_残りの手札_3), select((_数字_4,_),_残りの手札_3,_残りの手札_4), select((_数字_5,_),_残りの手札_4,_残りの手札_5). '連続している'(_数字_1,_数字_2,_数字_3,_数字_4,_数字_5) :- 数字の連続(_数字_1,_数字_2), 数字の連続(_数字_2,_数字_3), 数字の連続(_数字_3,_数字_4), 数字の連続(_数字_4,_数字_5),!. スートは二種類以上混じっている(_手札) :- select((_,_スート_1),_手札,_残りの手札_1), select((_,_スート_2),_残りの手札_1,_), \+(_スート_1 = _スート_2),!. 全てのスートが同じ(_手札,_スート) :- _手札 = [(_,_スート),(_,_スート),(_,_スート),(_,_スート),(_,_スート)]. 数字の連続('A','2'). 数字の連続('2','3'). 数字の連続('3','4'). 数字の連続('4','5'). 数字の連続('5','6'). 数字の連続('6','7'). 数字の連続('7','8'). 数字の連続('8','9'). 数字の連続('9','10'). 数字の連続('10','J'). 数字の連続('J','Q'). 数字の連続('Q','K'). 数字の連続('K','A'). 数字順位(['A','K','Q','J','10','9','8','7','6','5','4','3','2']). % 以下のサイトは 日曜起点カレンダー(_年,_月) :- 一日の曜日(_年,_月,_一日の曜日), 月末日の曜日(_年,_月,_月末日,_), 日曜起点カレンダー(_一日の曜日,_月末日,_カレンダー), カレンダー表示(_カレンダー). 日曜起点カレンダー(_一日の曜日,_月末日,_カレンダー) :- findall(_日,between(1,_月末日,_日),_日付ならび), 第一週の整形(_一日の曜日,_日付ならび,_第一週,_第二週以後), 最終週の整形(_第二週以後,_最終週を整形された第二週以後), _カレンダー = [_第一週|_最終週を整形された第二週以後]. 第一週の整形(日曜,[_1,_2,_3,_4,_5,_6,_7|R],[_1,_2,_3,_4,_5,_6,_7],R). 第一週の整形(月曜,[_1,_2,_3,_4,_5,_6|R],[_,_1,_2,_3,_4,_5,_6],R). 第一週の整形(火曜,[_1,_2,_3,_4,_5|R],[_,_,_1,_2,_3,_4,_5],R). 第一週の整形(水曜,[_1,_2,_3,_4|R],[_,_,_,_1,_2,_3,_4],R). 第一週の整形(木曜,[_1,_2,_3|R],[_,_,_,_,_1,_2,_3],R). 第一週の整形(金曜,[_1,_2|R],[_,_,_,_,_,_1,_2],R). 第一週の整形(土曜,[_1|R],[_,_,_,_,_,_,_1],R). 最終週の整形([_1,_2,_3,_4,_5,_6,_7|R1],[[_1,_2,_3,_4,_5,_6,_7]|R2]) :- 最終週の整形(R1,R2),!. 最終週の整形([],[]) :- !. 最終週の整形(L1,[L2]) :- length(L2,7), append(L1,_,L2). カレンダー表示([]). カレンダー表示([_週|R]) :- カレンダー週表示(_週), カレンダー表示(R). カレンダー週表示([]) :- write('\n'). カレンダー週表示([A|R]) :- 表示項(A,_表示項), writef('%3R',[_表示項]), カレンダー週表示(R). 表示項(' ',' ') :- !. 表示項(N,N). 一日の曜日(1970,1,木曜). 一日の曜日(1970,2,日曜). 一日の曜日(1970,3,日曜). 一日の曜日(1970,4,水曜). 一日の曜日(1970,5,金曜). 一日の曜日(1970,6,月曜). 一日の曜日(1970,7,水曜). 一日の曜日(1970,8,土曜). 一日の曜日(1970,9,火曜). 一日の曜日(1970,10,木曜). 一日の曜日(1970,11,日曜). 一日の曜日(1970,12,火曜). 一日の曜日(1971,1,金曜). 一日の曜日(1971,2,月曜). 一日の曜日(1971,3,月曜). 一日の曜日(1971,4,木曜). 一日の曜日(1971,5,土曜). 一日の曜日(1971,6,火曜). 一日の曜日(1971,7,木曜). 一日の曜日(1971,8,日曜). 一日の曜日(1971,9,水曜). 一日の曜日(1971,10,金曜). 一日の曜日(1971,11,月曜). 一日の曜日(1971,12,水曜). 一日の曜日(1972,1,土曜). 一日の曜日(1972,2,火曜). 一日の曜日(1972,3,水曜). 一日の曜日(1972,4,土曜). 一日の曜日(1972,5,月曜). 一日の曜日(1972,6,木曜). 一日の曜日(1972,7,土曜). 一日の曜日(1972,8,火曜). 一日の曜日(1972,9,金曜). 一日の曜日(1972,10,日曜). 一日の曜日(1972,11,水曜). 一日の曜日(1972,12,金曜). 一日の曜日(1973,1,月曜). 一日の曜日(1973,2,木曜). 一日の曜日(1973,3,木曜). 一日の曜日(1973,4,日曜). 一日の曜日(1973,5,火曜). 一日の曜日(1973,6,金曜). 一日の曜日(1973,7,日曜). 一日の曜日(1973,8,水曜). 一日の曜日(1973,9,土曜). 一日の曜日(1973,10,月曜). 一日の曜日(1973,11,木曜). 一日の曜日(1973,12,土曜). 一日の曜日(1974,1,火曜). 一日の曜日(1974,2,金曜). 一日の曜日(1974,3,金曜). 一日の曜日(1974,4,月曜). 一日の曜日(1974,5,水曜). 一日の曜日(1974,6,土曜). 一日の曜日(1974,7,月曜). 一日の曜日(1974,8,木曜). 一日の曜日(1974,9,日曜). 一日の曜日(1974,10,火曜). 一日の曜日(1974,11,金曜). 一日の曜日(1974,12,日曜). 一日の曜日(1975,1,水曜). 一日の曜日(1975,2,土曜). 一日の曜日(1975,3,土曜). 一日の曜日(1975,4,火曜). 一日の曜日(1975,5,木曜). 一日の曜日(1975,6,日曜). 一日の曜日(1975,7,火曜). 一日の曜日(1975,8,金曜). 一日の曜日(1975,9,月曜). 一日の曜日(1975,10,水曜). 一日の曜日(1975,11,土曜). 一日の曜日(1975,12,月曜). 一日の曜日(1976,1,木曜). 一日の曜日(1976,2,日曜). 一日の曜日(1976,3,月曜). 一日の曜日(1976,4,木曜). 一日の曜日(1976,5,土曜). 一日の曜日(1976,6,火曜). 一日の曜日(1976,7,木曜). 一日の曜日(1976,8,日曜). 一日の曜日(1976,9,水曜). 一日の曜日(1976,10,金曜). 一日の曜日(1976,11,月曜). 一日の曜日(1976,12,水曜). 一日の曜日(1977,1,土曜). 一日の曜日(1977,2,火曜). 一日の曜日(1977,3,火曜). 一日の曜日(1977,4,金曜). 一日の曜日(1977,5,日曜). 一日の曜日(1977,6,水曜). 一日の曜日(1977,7,金曜). 一日の曜日(1977,8,月曜). 一日の曜日(1977,9,木曜). 一日の曜日(1977,10,土曜). 一日の曜日(1977,11,火曜). 一日の曜日(1977,12,木曜). 一日の曜日(1978,1,日曜). 一日の曜日(1978,2,水曜). 一日の曜日(1978,3,水曜). 一日の曜日(1978,4,土曜). 一日の曜日(1978,5,月曜). 一日の曜日(1978,6,木曜). 一日の曜日(1978,7,土曜). 一日の曜日(1978,8,火曜). 一日の曜日(1978,9,金曜). 一日の曜日(1978,10,日曜). 一日の曜日(1978,11,水曜). 一日の曜日(1978,12,金曜). 一日の曜日(1979,1,月曜). 一日の曜日(1979,2,木曜). 一日の曜日(1979,3,木曜). 一日の曜日(1979,4,日曜). 一日の曜日(1979,5,火曜). 一日の曜日(1979,6,金曜). 一日の曜日(1979,7,日曜). 一日の曜日(1979,8,水曜). 一日の曜日(1979,9,土曜). 一日の曜日(1979,10,月曜). 一日の曜日(1979,11,木曜). 一日の曜日(1979,12,土曜). 一日の曜日(1980,1,火曜). 一日の曜日(1980,2,金曜). 一日の曜日(1980,3,土曜). 一日の曜日(1980,4,火曜). 一日の曜日(1980,5,木曜). 一日の曜日(1980,6,日曜). 一日の曜日(1980,7,火曜). 一日の曜日(1980,8,金曜). 一日の曜日(1980,9,月曜). 一日の曜日(1980,10,水曜). 一日の曜日(1980,11,土曜). 一日の曜日(1980,12,月曜). 一日の曜日(1981,1,木曜). 一日の曜日(1981,2,日曜). 一日の曜日(1981,3,日曜). 一日の曜日(1981,4,水曜). 一日の曜日(1981,5,金曜). 一日の曜日(1981,6,月曜). 一日の曜日(1981,7,水曜). 一日の曜日(1981,8,土曜). 一日の曜日(1981,9,火曜). 一日の曜日(1981,10,木曜). 一日の曜日(1981,11,日曜). 一日の曜日(1981,12,火曜). 一日の曜日(1982,1,金曜). 一日の曜日(1982,2,月曜). 一日の曜日(1982,3,月曜). 一日の曜日(1982,4,木曜). 一日の曜日(1982,5,土曜). 一日の曜日(1982,6,火曜). 一日の曜日(1982,7,木曜). 一日の曜日(1982,8,日曜). 一日の曜日(1982,9,水曜). 一日の曜日(1982,10,金曜). 一日の曜日(1982,11,月曜). 一日の曜日(1982,12,水曜). 一日の曜日(1983,1,土曜). 一日の曜日(1983,2,火曜). 一日の曜日(1983,3,火曜). 一日の曜日(1983,4,金曜). 一日の曜日(1983,5,日曜). 一日の曜日(1983,6,水曜). 一日の曜日(1983,7,金曜). 一日の曜日(1983,8,月曜). 一日の曜日(1983,9,木曜). 一日の曜日(1983,10,土曜). 一日の曜日(1983,11,火曜). 一日の曜日(1983,12,木曜). 一日の曜日(1984,1,日曜). 一日の曜日(1984,2,水曜). 一日の曜日(1984,3,木曜). 一日の曜日(1984,4,日曜). 一日の曜日(1984,5,火曜). 一日の曜日(1984,6,金曜). 一日の曜日(1984,7,日曜). 一日の曜日(1984,8,水曜). 一日の曜日(1984,9,土曜). 一日の曜日(1984,10,月曜). 一日の曜日(1984,11,木曜). 一日の曜日(1984,12,土曜). 一日の曜日(1985,1,火曜). 一日の曜日(1985,2,金曜). 一日の曜日(1985,3,金曜). 一日の曜日(1985,4,月曜). 一日の曜日(1985,5,水曜). 一日の曜日(1985,6,土曜). 一日の曜日(1985,7,月曜). 一日の曜日(1985,8,木曜). 一日の曜日(1985,9,日曜). 一日の曜日(1985,10,火曜). 一日の曜日(1985,11,金曜). 一日の曜日(1985,12,日曜). 一日の曜日(1986,1,水曜). 一日の曜日(1986,2,土曜). 一日の曜日(1986,3,土曜). 一日の曜日(1986,4,火曜). 一日の曜日(1986,5,木曜). 一日の曜日(1986,6,日曜). 一日の曜日(1986,7,火曜). 一日の曜日(1986,8,金曜). 一日の曜日(1986,9,月曜). 一日の曜日(1986,10,水曜). 一日の曜日(1986,11,土曜). 一日の曜日(1986,12,月曜). 一日の曜日(1987,1,木曜). 一日の曜日(1987,2,日曜). 一日の曜日(1987,3,日曜). 一日の曜日(1987,4,水曜). 一日の曜日(1987,5,金曜). 一日の曜日(1987,6,月曜). 一日の曜日(1987,7,水曜). 一日の曜日(1987,8,土曜). 一日の曜日(1987,9,火曜). 一日の曜日(1987,10,木曜). 一日の曜日(1987,11,日曜). 一日の曜日(1987,12,火曜). 一日の曜日(1988,1,金曜). 一日の曜日(1988,2,月曜). 一日の曜日(1988,3,火曜). 一日の曜日(1988,4,金曜). 一日の曜日(1988,5,日曜). 一日の曜日(1988,6,水曜). 一日の曜日(1988,7,金曜). 一日の曜日(1988,8,月曜). 一日の曜日(1988,9,木曜). 一日の曜日(1988,10,土曜). 一日の曜日(1988,11,火曜). 一日の曜日(1988,12,木曜). 一日の曜日(1989,1,日曜). 一日の曜日(1989,2,水曜). 一日の曜日(1989,3,水曜). 一日の曜日(1989,4,土曜). 一日の曜日(1989,5,月曜). 一日の曜日(1989,6,木曜). 一日の曜日(1989,7,土曜). 一日の曜日(1989,8,火曜). 一日の曜日(1989,9,金曜). 一日の曜日(1989,10,日曜). 一日の曜日(1989,11,水曜). 一日の曜日(1989,12,金曜). 一日の曜日(1990,1,月曜). 一日の曜日(1990,2,木曜). 一日の曜日(1990,3,木曜). 一日の曜日(1990,4,日曜). 一日の曜日(1990,5,火曜). 一日の曜日(1990,6,金曜). 一日の曜日(1990,7,日曜). 一日の曜日(1990,8,水曜). 一日の曜日(1990,9,土曜). 一日の曜日(1990,10,月曜). 一日の曜日(1990,11,木曜). 一日の曜日(1990,12,土曜). 一日の曜日(1991,1,火曜). 一日の曜日(1991,2,金曜). 一日の曜日(1991,3,金曜). 一日の曜日(1991,4,月曜). 一日の曜日(1991,5,水曜). 一日の曜日(1991,6,土曜). 一日の曜日(1991,7,月曜). 一日の曜日(1991,8,木曜). 一日の曜日(1991,9,日曜). 一日の曜日(1991,10,火曜). 一日の曜日(1991,11,金曜). 一日の曜日(1991,12,日曜). 一日の曜日(1992,1,水曜). 一日の曜日(1992,2,土曜). 一日の曜日(1992,3,日曜). 一日の曜日(1992,4,水曜). 一日の曜日(1992,5,金曜). 一日の曜日(1992,6,月曜). 一日の曜日(1992,7,水曜). 一日の曜日(1992,8,土曜). 一日の曜日(1992,9,火曜). 一日の曜日(1992,10,木曜). 一日の曜日(1992,11,日曜). 一日の曜日(1992,12,火曜). 一日の曜日(1993,1,金曜). 一日の曜日(1993,2,月曜). 一日の曜日(1993,3,月曜). 一日の曜日(1993,4,木曜). 一日の曜日(1993,5,土曜). 一日の曜日(1993,6,火曜). 一日の曜日(1993,7,木曜). 一日の曜日(1993,8,日曜). 一日の曜日(1993,9,水曜). 一日の曜日(1993,10,金曜). 一日の曜日(1993,11,月曜). 一日の曜日(1993,12,水曜). 一日の曜日(1994,1,土曜). 一日の曜日(1994,2,火曜). 一日の曜日(1994,3,火曜). 一日の曜日(1994,4,金曜). 一日の曜日(1994,5,日曜). 一日の曜日(1994,6,水曜). 一日の曜日(1994,7,金曜). 一日の曜日(1994,8,月曜). 一日の曜日(1994,9,木曜). 一日の曜日(1994,10,土曜). 一日の曜日(1994,11,火曜). 一日の曜日(1994,12,木曜). 一日の曜日(1995,1,日曜). 一日の曜日(1995,2,水曜). 一日の曜日(1995,3,水曜). 一日の曜日(1995,4,土曜). 一日の曜日(1995,5,月曜). 一日の曜日(1995,6,木曜). 一日の曜日(1995,7,土曜). 一日の曜日(1995,8,火曜). 一日の曜日(1995,9,金曜). 一日の曜日(1995,10,日曜). 一日の曜日(1995,11,水曜). 一日の曜日(1995,12,金曜). 一日の曜日(1996,1,月曜). 一日の曜日(1996,2,木曜). 一日の曜日(1996,3,金曜). 一日の曜日(1996,4,月曜). 一日の曜日(1996,5,水曜). 一日の曜日(1996,6,土曜). 一日の曜日(1996,7,月曜). 一日の曜日(1996,8,木曜). 一日の曜日(1996,9,日曜). 一日の曜日(1996,10,火曜). 一日の曜日(1996,11,金曜). 一日の曜日(1996,12,日曜). 一日の曜日(1997,1,水曜). 一日の曜日(1997,2,土曜). 一日の曜日(1997,3,土曜). 一日の曜日(1997,4,火曜). 一日の曜日(1997,5,木曜). 一日の曜日(1997,6,日曜). 一日の曜日(1997,7,火曜). 一日の曜日(1997,8,金曜). 一日の曜日(1997,9,月曜). 一日の曜日(1997,10,水曜). 一日の曜日(1997,11,土曜). 一日の曜日(1997,12,月曜). 一日の曜日(1998,1,木曜). 一日の曜日(1998,2,日曜). 一日の曜日(1998,3,日曜). 一日の曜日(1998,4,水曜). 一日の曜日(1998,5,金曜). 一日の曜日(1998,6,月曜). 一日の曜日(1998,7,水曜). 一日の曜日(1998,8,土曜). 一日の曜日(1998,9,火曜). 一日の曜日(1998,10,木曜). 一日の曜日(1998,11,日曜). 一日の曜日(1998,12,火曜). 一日の曜日(1999,1,金曜). 一日の曜日(1999,2,月曜). 一日の曜日(1999,3,月曜). 一日の曜日(1999,4,木曜). 一日の曜日(1999,5,土曜). 一日の曜日(1999,6,火曜). 一日の曜日(1999,7,木曜). 一日の曜日(1999,8,日曜). 一日の曜日(1999,9,水曜). 一日の曜日(1999,10,金曜). 一日の曜日(1999,11,月曜). 一日の曜日(1999,12,水曜). 一日の曜日(2000,1,土曜). 一日の曜日(2000,2,火曜). 一日の曜日(2000,3,水曜). 一日の曜日(2000,4,土曜). 一日の曜日(2000,5,月曜). 一日の曜日(2000,6,木曜). 一日の曜日(2000,7,土曜). 一日の曜日(2000,8,火曜). 一日の曜日(2000,9,金曜). 一日の曜日(2000,10,日曜). 一日の曜日(2000,11,水曜). 一日の曜日(2000,12,金曜). 一日の曜日(2001,1,月曜). 一日の曜日(2001,2,木曜). 一日の曜日(2001,3,木曜). 一日の曜日(2001,4,日曜). 一日の曜日(2001,5,火曜). 一日の曜日(2001,6,金曜). 一日の曜日(2001,7,日曜). 一日の曜日(2001,8,水曜). 一日の曜日(2001,9,土曜). 一日の曜日(2001,10,月曜). 一日の曜日(2001,11,木曜). 一日の曜日(2001,12,土曜). 一日の曜日(2002,1,火曜). 一日の曜日(2002,2,金曜). 一日の曜日(2002,3,金曜). 一日の曜日(2002,4,月曜). 一日の曜日(2002,5,水曜). 一日の曜日(2002,6,土曜). 一日の曜日(2002,7,月曜). 一日の曜日(2002,8,木曜). 一日の曜日(2002,9,日曜). 一日の曜日(2002,10,火曜). 一日の曜日(2002,11,金曜). 一日の曜日(2002,12,日曜). 一日の曜日(2003,1,水曜). 一日の曜日(2003,2,土曜). 一日の曜日(2003,3,土曜). 一日の曜日(2003,4,火曜). 一日の曜日(2003,5,木曜). 一日の曜日(2003,6,日曜). 一日の曜日(2003,7,火曜). 一日の曜日(2003,8,金曜). 一日の曜日(2003,9,月曜). 一日の曜日(2003,10,水曜). 一日の曜日(2003,11,土曜). 一日の曜日(2003,12,月曜). 一日の曜日(2004,1,木曜). 一日の曜日(2004,2,日曜). 一日の曜日(2004,3,月曜). 一日の曜日(2004,4,木曜). 一日の曜日(2004,5,土曜). 一日の曜日(2004,6,火曜). 一日の曜日(2004,7,木曜). 一日の曜日(2004,8,日曜). 一日の曜日(2004,9,水曜). 一日の曜日(2004,10,金曜). 一日の曜日(2004,11,月曜). 一日の曜日(2004,12,水曜). 一日の曜日(2005,1,土曜). 一日の曜日(2005,2,火曜). 一日の曜日(2005,3,火曜). 一日の曜日(2005,4,金曜). 一日の曜日(2005,5,日曜). 一日の曜日(2005,6,水曜). 一日の曜日(2005,7,金曜). 一日の曜日(2005,8,月曜). 一日の曜日(2005,9,木曜). 一日の曜日(2005,10,土曜). 一日の曜日(2005,11,火曜). 一日の曜日(2005,12,木曜). 一日の曜日(2006,1,日曜). 一日の曜日(2006,2,水曜). 一日の曜日(2006,3,水曜). 一日の曜日(2006,4,土曜). 一日の曜日(2006,5,月曜). 一日の曜日(2006,6,木曜). 一日の曜日(2006,7,土曜). 一日の曜日(2006,8,火曜). 一日の曜日(2006,9,金曜). 一日の曜日(2006,10,日曜). 一日の曜日(2006,11,水曜). 一日の曜日(2006,12,金曜). 一日の曜日(2007,1,月曜). 一日の曜日(2007,2,木曜). 一日の曜日(2007,3,木曜). 一日の曜日(2007,4,日曜). 一日の曜日(2007,5,火曜). 一日の曜日(2007,6,金曜). 一日の曜日(2007,7,日曜). 一日の曜日(2007,8,水曜). 一日の曜日(2007,9,土曜). 一日の曜日(2007,10,月曜). 一日の曜日(2007,11,木曜). 一日の曜日(2007,12,土曜). 一日の曜日(2008,1,火曜). 一日の曜日(2008,2,金曜). 一日の曜日(2008,3,土曜). 一日の曜日(2008,4,火曜). 一日の曜日(2008,5,木曜). 一日の曜日(2008,6,日曜). 一日の曜日(2008,7,火曜). 一日の曜日(2008,8,金曜). 一日の曜日(2008,9,月曜). 一日の曜日(2008,10,水曜). 一日の曜日(2008,11,土曜). 一日の曜日(2008,12,月曜). 一日の曜日(2009,1,木曜). 一日の曜日(2009,2,日曜). 一日の曜日(2009,3,日曜). 一日の曜日(2009,4,水曜). 一日の曜日(2009,5,金曜). 一日の曜日(2009,6,月曜). 一日の曜日(2009,7,水曜). 一日の曜日(2009,8,土曜). 一日の曜日(2009,9,火曜). 一日の曜日(2009,10,木曜). 一日の曜日(2009,11,日曜). 一日の曜日(2009,12,火曜). 一日の曜日(2010,1,金曜). 一日の曜日(2010,2,月曜). 一日の曜日(2010,3,月曜). 一日の曜日(2010,4,木曜). 一日の曜日(2010,5,土曜). 一日の曜日(2010,6,火曜). 一日の曜日(2010,7,木曜). 一日の曜日(2010,8,日曜). 一日の曜日(2010,9,水曜). 一日の曜日(2010,10,金曜). 一日の曜日(2010,11,月曜). 一日の曜日(2010,12,水曜). 一日の曜日(2011,1,土曜). 一日の曜日(2011,2,火曜). 一日の曜日(2011,3,火曜). 一日の曜日(2011,4,金曜). 一日の曜日(2011,5,日曜). 一日の曜日(2011,6,水曜). 一日の曜日(2011,7,金曜). 一日の曜日(2011,8,月曜). 一日の曜日(2011,9,木曜). 一日の曜日(2011,10,土曜). 一日の曜日(2011,11,火曜). 一日の曜日(2011,12,木曜). 一日の曜日(2012,1,日曜). 一日の曜日(2012,2,水曜). 一日の曜日(2012,3,木曜). 一日の曜日(2012,4,日曜). 一日の曜日(2012,5,火曜). 一日の曜日(2012,6,金曜). 一日の曜日(2012,7,日曜). 一日の曜日(2012,8,水曜). 一日の曜日(2012,9,土曜). 一日の曜日(2012,10,月曜). 一日の曜日(2012,11,木曜). 一日の曜日(2012,12,土曜). 一日の曜日(2013,1,火曜). 一日の曜日(2013,2,金曜). 一日の曜日(2013,3,金曜). 一日の曜日(2013,4,月曜). 一日の曜日(2013,5,水曜). 一日の曜日(2013,6,土曜). 一日の曜日(2013,7,月曜). 一日の曜日(2013,8,木曜). 一日の曜日(2013,9,日曜). 一日の曜日(2013,10,火曜). 一日の曜日(2013,11,金曜). 一日の曜日(2013,12,日曜). 一日の曜日(2014,1,水曜). 一日の曜日(2014,2,土曜). 一日の曜日(2014,3,土曜). 一日の曜日(2014,4,火曜). 一日の曜日(2014,5,木曜). 一日の曜日(2014,6,日曜). 一日の曜日(2014,7,火曜). 一日の曜日(2014,8,金曜). 一日の曜日(2014,9,月曜). 一日の曜日(2014,10,水曜). 一日の曜日(2014,11,土曜). 一日の曜日(2014,12,月曜). 一日の曜日(2015,1,木曜). 一日の曜日(2015,2,日曜). 一日の曜日(2015,3,日曜). 一日の曜日(2015,4,水曜). 一日の曜日(2015,5,金曜). 一日の曜日(2015,6,月曜). 一日の曜日(2015,7,水曜). 一日の曜日(2015,8,土曜). 一日の曜日(2015,9,火曜). 一日の曜日(2015,10,木曜). 一日の曜日(2015,11,日曜). 一日の曜日(2015,12,火曜). 一日の曜日(2016,1,金曜). 一日の曜日(2016,2,月曜). 一日の曜日(2016,3,火曜). 一日の曜日(2016,4,金曜). 一日の曜日(2016,5,日曜). 一日の曜日(2016,6,水曜). 一日の曜日(2016,7,金曜). 一日の曜日(2016,8,月曜). 一日の曜日(2016,9,木曜). 一日の曜日(2016,10,土曜). 一日の曜日(2016,11,火曜). 一日の曜日(2016,12,木曜). 一日の曜日(2017,1,日曜). 一日の曜日(2017,2,水曜). 一日の曜日(2017,3,水曜). 一日の曜日(2017,4,土曜). 一日の曜日(2017,5,月曜). 一日の曜日(2017,6,木曜). 一日の曜日(2017,7,土曜). 一日の曜日(2017,8,火曜). 一日の曜日(2017,9,金曜). 一日の曜日(2017,10,日曜). 一日の曜日(2017,11,水曜). 一日の曜日(2017,12,金曜). 一日の曜日(2018,1,月曜). 一日の曜日(2018,2,木曜). 一日の曜日(2018,3,木曜). 一日の曜日(2018,4,日曜). 一日の曜日(2018,5,火曜). 一日の曜日(2018,6,金曜). 一日の曜日(2018,7,日曜). 一日の曜日(2018,8,水曜). 一日の曜日(2018,9,土曜). 一日の曜日(2018,10,月曜). 一日の曜日(2018,11,木曜). 一日の曜日(2018,12,土曜). 一日の曜日(2019,1,火曜). 一日の曜日(2019,2,金曜). 一日の曜日(2019,3,金曜). 一日の曜日(2019,4,月曜). 一日の曜日(2019,5,水曜). 一日の曜日(2019,6,土曜). 一日の曜日(2019,7,月曜). 一日の曜日(2019,8,木曜). 一日の曜日(2019,9,日曜). 一日の曜日(2019,10,火曜). 一日の曜日(2019,11,金曜). 一日の曜日(2019,12,日曜). 一日の曜日(2020,1,水曜). 一日の曜日(2020,2,土曜). 一日の曜日(2020,3,日曜). 一日の曜日(2020,4,水曜). 一日の曜日(2020,5,金曜). 一日の曜日(2020,6,月曜). 一日の曜日(2020,7,水曜). 一日の曜日(2020,8,土曜). 一日の曜日(2020,9,火曜). 一日の曜日(2020,10,木曜). 一日の曜日(2020,11,日曜). 一日の曜日(2020,12,火曜). 月末日の曜日(1970,1,31,土曜). 月末日の曜日(1970,2,28,土曜). 月末日の曜日(1970,3,31,火曜). 月末日の曜日(1970,4,30,木曜). 月末日の曜日(1970,5,31,日曜). 月末日の曜日(1970,6,30,火曜). 月末日の曜日(1970,7,31,金曜). 月末日の曜日(1970,8,31,月曜). 月末日の曜日(1970,9,30,水曜). 月末日の曜日(1970,10,31,土曜). 月末日の曜日(1970,11,30,月曜). 月末日の曜日(1970,12,31,木曜). 月末日の曜日(1971,1,31,日曜). 月末日の曜日(1971,2,28,日曜). 月末日の曜日(1971,3,31,水曜). 月末日の曜日(1971,4,30,金曜). 月末日の曜日(1971,5,31,月曜). 月末日の曜日(1971,6,30,水曜). 月末日の曜日(1971,7,31,土曜). 月末日の曜日(1971,8,31,火曜). 月末日の曜日(1971,9,30,木曜). 月末日の曜日(1971,10,31,日曜). 月末日の曜日(1971,11,30,火曜). 月末日の曜日(1971,12,31,金曜). 月末日の曜日(1972,1,31,月曜). 月末日の曜日(1972,2,29,火曜). 月末日の曜日(1972,3,31,金曜). 月末日の曜日(1972,4,30,日曜). 月末日の曜日(1972,5,31,水曜). 月末日の曜日(1972,6,30,金曜). 月末日の曜日(1972,7,31,月曜). 月末日の曜日(1972,8,31,木曜). 月末日の曜日(1972,9,30,土曜). 月末日の曜日(1972,10,31,火曜). 月末日の曜日(1972,11,30,木曜). 月末日の曜日(1972,12,31,日曜). 月末日の曜日(1973,1,31,水曜). 月末日の曜日(1973,2,28,水曜). 月末日の曜日(1973,3,31,土曜). 月末日の曜日(1973,4,30,月曜). 月末日の曜日(1973,5,31,木曜). 月末日の曜日(1973,6,30,土曜). 月末日の曜日(1973,7,31,火曜). 月末日の曜日(1973,8,31,金曜). 月末日の曜日(1973,9,30,日曜). 月末日の曜日(1973,10,31,水曜). 月末日の曜日(1973,11,30,金曜). 月末日の曜日(1973,12,31,月曜). 月末日の曜日(1974,1,31,木曜). 月末日の曜日(1974,2,28,木曜). 月末日の曜日(1974,3,31,日曜). 月末日の曜日(1974,4,30,火曜). 月末日の曜日(1974,5,31,金曜). 月末日の曜日(1974,6,30,日曜). 月末日の曜日(1974,7,31,水曜). 月末日の曜日(1974,8,31,土曜). 月末日の曜日(1974,9,30,月曜). 月末日の曜日(1974,10,31,木曜). 月末日の曜日(1974,11,30,土曜). 月末日の曜日(1974,12,31,火曜). 月末日の曜日(1975,1,31,金曜). 月末日の曜日(1975,2,28,金曜). 月末日の曜日(1975,3,31,月曜). 月末日の曜日(1975,4,30,水曜). 月末日の曜日(1975,5,31,土曜). 月末日の曜日(1975,6,30,月曜). 月末日の曜日(1975,7,31,木曜). 月末日の曜日(1975,8,31,日曜). 月末日の曜日(1975,9,30,火曜). 月末日の曜日(1975,10,31,金曜). 月末日の曜日(1975,11,30,日曜). 月末日の曜日(1975,12,31,水曜). 月末日の曜日(1976,1,31,土曜). 月末日の曜日(1976,2,29,日曜). 月末日の曜日(1976,3,31,水曜). 月末日の曜日(1976,4,30,金曜). 月末日の曜日(1976,5,31,月曜). 月末日の曜日(1976,6,30,水曜). 月末日の曜日(1976,7,31,土曜). 月末日の曜日(1976,8,31,火曜). 月末日の曜日(1976,9,30,木曜). 月末日の曜日(1976,10,31,日曜). 月末日の曜日(1976,11,30,火曜). 月末日の曜日(1976,12,31,金曜). 月末日の曜日(1977,1,31,月曜). 月末日の曜日(1977,2,28,月曜). 月末日の曜日(1977,3,31,木曜). 月末日の曜日(1977,4,30,土曜). 月末日の曜日(1977,5,31,火曜). 月末日の曜日(1977,6,30,木曜). 月末日の曜日(1977,7,31,日曜). 月末日の曜日(1977,8,31,水曜). 月末日の曜日(1977,9,30,金曜). 月末日の曜日(1977,10,31,月曜). 月末日の曜日(1977,11,30,水曜). 月末日の曜日(1977,12,31,土曜). 月末日の曜日(1978,1,31,火曜). 月末日の曜日(1978,2,28,火曜). 月末日の曜日(1978,3,31,金曜). 月末日の曜日(1978,4,30,日曜). 月末日の曜日(1978,5,31,水曜). 月末日の曜日(1978,6,30,金曜). 月末日の曜日(1978,7,31,月曜). 月末日の曜日(1978,8,31,木曜). 月末日の曜日(1978,9,30,土曜). 月末日の曜日(1978,10,31,火曜). 月末日の曜日(1978,11,30,木曜). 月末日の曜日(1978,12,31,日曜). 月末日の曜日(1979,1,31,水曜). 月末日の曜日(1979,2,28,水曜). 月末日の曜日(1979,3,31,土曜). 月末日の曜日(1979,4,30,月曜). 月末日の曜日(1979,5,31,木曜). 月末日の曜日(1979,6,30,土曜). 月末日の曜日(1979,7,31,火曜). 月末日の曜日(1979,8,31,金曜). 月末日の曜日(1979,9,30,日曜). 月末日の曜日(1979,10,31,水曜). 月末日の曜日(1979,11,30,金曜). 月末日の曜日(1979,12,31,月曜). 月末日の曜日(1980,1,31,木曜). 月末日の曜日(1980,2,29,金曜). 月末日の曜日(1980,3,31,月曜). 月末日の曜日(1980,4,30,水曜). 月末日の曜日(1980,5,31,土曜). 月末日の曜日(1980,6,30,月曜). 月末日の曜日(1980,7,31,木曜). 月末日の曜日(1980,8,31,日曜). 月末日の曜日(1980,9,30,火曜). 月末日の曜日(1980,10,31,金曜). 月末日の曜日(1980,11,30,日曜). 月末日の曜日(1980,12,31,水曜). 月末日の曜日(1981,1,31,土曜). 月末日の曜日(1981,2,28,土曜). 月末日の曜日(1981,3,31,火曜). 月末日の曜日(1981,4,30,木曜). 月末日の曜日(1981,5,31,日曜). 月末日の曜日(1981,6,30,火曜). 月末日の曜日(1981,7,31,金曜). 月末日の曜日(1981,8,31,月曜). 月末日の曜日(1981,9,30,水曜). 月末日の曜日(1981,10,31,土曜). 月末日の曜日(1981,11,30,月曜). 月末日の曜日(1981,12,31,木曜). 月末日の曜日(1982,1,31,日曜). 月末日の曜日(1982,2,28,日曜). 月末日の曜日(1982,3,31,水曜). 月末日の曜日(1982,4,30,金曜). 月末日の曜日(1982,5,31,月曜). 月末日の曜日(1982,6,30,水曜). 月末日の曜日(1982,7,31,土曜). 月末日の曜日(1982,8,31,火曜). 月末日の曜日(1982,9,30,木曜). 月末日の曜日(1982,10,31,日曜). 月末日の曜日(1982,11,30,火曜). 月末日の曜日(1982,12,31,金曜). 月末日の曜日(1983,1,31,月曜). 月末日の曜日(1983,2,28,月曜). 月末日の曜日(1983,3,31,木曜). 月末日の曜日(1983,4,30,土曜). 月末日の曜日(1983,5,31,火曜). 月末日の曜日(1983,6,30,木曜). 月末日の曜日(1983,7,31,日曜). 月末日の曜日(1983,8,31,水曜). 月末日の曜日(1983,9,30,金曜). 月末日の曜日(1983,10,31,月曜). 月末日の曜日(1983,11,30,水曜). 月末日の曜日(1983,12,31,土曜). 月末日の曜日(1984,1,31,火曜). 月末日の曜日(1984,2,29,水曜). 月末日の曜日(1984,3,31,土曜). 月末日の曜日(1984,4,30,月曜). 月末日の曜日(1984,5,31,木曜). 月末日の曜日(1984,6,30,土曜). 月末日の曜日(1984,7,31,火曜). 月末日の曜日(1984,8,31,金曜). 月末日の曜日(1984,9,30,日曜). 月末日の曜日(1984,10,31,水曜). 月末日の曜日(1984,11,30,金曜). 月末日の曜日(1984,12,31,月曜). 月末日の曜日(1985,1,31,木曜). 月末日の曜日(1985,2,28,木曜). 月末日の曜日(1985,3,31,日曜). 月末日の曜日(1985,4,30,火曜). 月末日の曜日(1985,5,31,金曜). 月末日の曜日(1985,6,30,日曜). 月末日の曜日(1985,7,31,水曜). 月末日の曜日(1985,8,31,土曜). 月末日の曜日(1985,9,30,月曜). 月末日の曜日(1985,10,31,木曜). 月末日の曜日(1985,11,30,土曜). 月末日の曜日(1985,12,31,火曜). 月末日の曜日(1986,1,31,金曜). 月末日の曜日(1986,2,28,金曜). 月末日の曜日(1986,3,31,月曜). 月末日の曜日(1986,4,30,水曜). 月末日の曜日(1986,5,31,土曜). 月末日の曜日(1986,6,30,月曜). 月末日の曜日(1986,7,31,木曜). 月末日の曜日(1986,8,31,日曜). 月末日の曜日(1986,9,30,火曜). 月末日の曜日(1986,10,31,金曜). 月末日の曜日(1986,11,30,日曜). 月末日の曜日(1986,12,31,水曜). 月末日の曜日(1987,1,31,土曜). 月末日の曜日(1987,2,28,土曜). 月末日の曜日(1987,3,31,火曜). 月末日の曜日(1987,4,30,木曜). 月末日の曜日(1987,5,31,日曜). 月末日の曜日(1987,6,30,火曜). 月末日の曜日(1987,7,31,金曜). 月末日の曜日(1987,8,31,月曜). 月末日の曜日(1987,9,30,水曜). 月末日の曜日(1987,10,31,土曜). 月末日の曜日(1987,11,30,月曜). 月末日の曜日(1987,12,31,木曜). 月末日の曜日(1988,1,31,日曜). 月末日の曜日(1988,2,29,月曜). 月末日の曜日(1988,3,31,木曜). 月末日の曜日(1988,4,30,土曜). 月末日の曜日(1988,5,31,火曜). 月末日の曜日(1988,6,30,木曜). 月末日の曜日(1988,7,31,日曜). 月末日の曜日(1988,8,31,水曜). 月末日の曜日(1988,9,30,金曜). 月末日の曜日(1988,10,31,月曜). 月末日の曜日(1988,11,30,水曜). 月末日の曜日(1988,12,31,土曜). 月末日の曜日(1989,1,31,火曜). 月末日の曜日(1989,2,28,火曜). 月末日の曜日(1989,3,31,金曜). 月末日の曜日(1989,4,30,日曜). 月末日の曜日(1989,5,31,水曜). 月末日の曜日(1989,6,30,金曜). 月末日の曜日(1989,7,31,月曜). 月末日の曜日(1989,8,31,木曜). 月末日の曜日(1989,9,30,土曜). 月末日の曜日(1989,10,31,火曜). 月末日の曜日(1989,11,30,木曜). 月末日の曜日(1989,12,31,日曜). 月末日の曜日(1990,1,31,水曜). 月末日の曜日(1990,2,28,水曜). 月末日の曜日(1990,3,31,土曜). 月末日の曜日(1990,4,30,月曜). 月末日の曜日(1990,5,31,木曜). 月末日の曜日(1990,6,30,土曜). 月末日の曜日(1990,7,31,火曜). 月末日の曜日(1990,8,31,金曜). 月末日の曜日(1990,9,30,日曜). 月末日の曜日(1990,10,31,水曜). 月末日の曜日(1990,11,30,金曜). 月末日の曜日(1990,12,31,月曜). 月末日の曜日(1991,1,31,木曜). 月末日の曜日(1991,2,28,木曜). 月末日の曜日(1991,3,31,日曜). 月末日の曜日(1991,4,30,火曜). 月末日の曜日(1991,5,31,金曜). 月末日の曜日(1991,6,30,日曜). 月末日の曜日(1991,7,31,水曜). 月末日の曜日(1991,8,31,土曜). 月末日の曜日(1991,9,30,月曜). 月末日の曜日(1991,10,31,木曜). 月末日の曜日(1991,11,30,土曜). 月末日の曜日(1991,12,31,火曜). 月末日の曜日(1992,1,31,金曜). 月末日の曜日(1992,2,29,土曜). 月末日の曜日(1992,3,31,火曜). 月末日の曜日(1992,4,30,木曜). 月末日の曜日(1992,5,31,日曜). 月末日の曜日(1992,6,30,火曜). 月末日の曜日(1992,7,31,金曜). 月末日の曜日(1992,8,31,月曜). 月末日の曜日(1992,9,30,水曜). 月末日の曜日(1992,10,31,土曜). 月末日の曜日(1992,11,30,月曜). 月末日の曜日(1992,12,31,木曜). 月末日の曜日(1993,1,31,日曜). 月末日の曜日(1993,2,28,日曜). 月末日の曜日(1993,3,31,水曜). 月末日の曜日(1993,4,30,金曜). 月末日の曜日(1993,5,31,月曜). 月末日の曜日(1993,6,30,水曜). 月末日の曜日(1993,7,31,土曜). 月末日の曜日(1993,8,31,火曜). 月末日の曜日(1993,9,30,木曜). 月末日の曜日(1993,10,31,日曜). 月末日の曜日(1993,11,30,火曜). 月末日の曜日(1993,12,31,金曜). 月末日の曜日(1994,1,31,月曜). 月末日の曜日(1994,2,28,月曜). 月末日の曜日(1994,3,31,木曜). 月末日の曜日(1994,4,30,土曜). 月末日の曜日(1994,5,31,火曜). 月末日の曜日(1994,6,30,木曜). 月末日の曜日(1994,7,31,日曜). 月末日の曜日(1994,8,31,水曜). 月末日の曜日(1994,9,30,金曜). 月末日の曜日(1994,10,31,月曜). 月末日の曜日(1994,11,30,水曜). 月末日の曜日(1994,12,31,土曜). 月末日の曜日(1995,1,31,火曜). 月末日の曜日(1995,2,28,火曜). 月末日の曜日(1995,3,31,金曜). 月末日の曜日(1995,4,30,日曜). 月末日の曜日(1995,5,31,水曜). 月末日の曜日(1995,6,30,金曜). 月末日の曜日(1995,7,31,月曜). 月末日の曜日(1995,8,31,木曜). 月末日の曜日(1995,9,30,土曜). 月末日の曜日(1995,10,31,火曜). 月末日の曜日(1995,11,30,木曜). 月末日の曜日(1995,12,31,日曜). 月末日の曜日(1996,1,31,水曜). 月末日の曜日(1996,2,29,木曜). 月末日の曜日(1996,3,31,日曜). 月末日の曜日(1996,4,30,火曜). 月末日の曜日(1996,5,31,金曜). 月末日の曜日(1996,6,30,日曜). 月末日の曜日(1996,7,31,水曜). 月末日の曜日(1996,8,31,土曜). 月末日の曜日(1996,9,30,月曜). 月末日の曜日(1996,10,31,木曜). 月末日の曜日(1996,11,30,土曜). 月末日の曜日(1996,12,31,火曜). 月末日の曜日(1997,1,31,金曜). 月末日の曜日(1997,2,28,金曜). 月末日の曜日(1997,3,31,月曜). 月末日の曜日(1997,4,30,水曜). 月末日の曜日(1997,5,31,土曜). 月末日の曜日(1997,6,30,月曜). 月末日の曜日(1997,7,31,木曜). 月末日の曜日(1997,8,31,日曜). 月末日の曜日(1997,9,30,火曜). 月末日の曜日(1997,10,31,金曜). 月末日の曜日(1997,11,30,日曜). 月末日の曜日(1997,12,31,水曜). 月末日の曜日(1998,1,31,土曜). 月末日の曜日(1998,2,28,土曜). 月末日の曜日(1998,3,31,火曜). 月末日の曜日(1998,4,30,木曜). 月末日の曜日(1998,5,31,日曜). 月末日の曜日(1998,6,30,火曜). 月末日の曜日(1998,7,31,金曜). 月末日の曜日(1998,8,31,月曜). 月末日の曜日(1998,9,30,水曜). 月末日の曜日(1998,10,31,土曜). 月末日の曜日(1998,11,30,月曜). 月末日の曜日(1998,12,31,木曜). 月末日の曜日(1999,1,31,日曜). 月末日の曜日(1999,2,28,日曜). 月末日の曜日(1999,3,31,水曜). 月末日の曜日(1999,4,30,金曜). 月末日の曜日(1999,5,31,月曜). 月末日の曜日(1999,6,30,水曜). 月末日の曜日(1999,7,31,土曜). 月末日の曜日(1999,8,31,火曜). 月末日の曜日(1999,9,30,木曜). 月末日の曜日(1999,10,31,日曜). 月末日の曜日(1999,11,30,火曜). 月末日の曜日(1999,12,31,金曜). 月末日の曜日(2000,1,31,月曜). 月末日の曜日(2000,2,29,火曜). 月末日の曜日(2000,3,31,金曜). 月末日の曜日(2000,4,30,日曜). 月末日の曜日(2000,5,31,水曜). 月末日の曜日(2000,6,30,金曜). 月末日の曜日(2000,7,31,月曜). 月末日の曜日(2000,8,31,木曜). 月末日の曜日(2000,9,30,土曜). 月末日の曜日(2000,10,31,火曜). 月末日の曜日(2000,11,30,木曜). 月末日の曜日(2000,12,31,日曜). 月末日の曜日(2001,1,31,水曜). 月末日の曜日(2001,2,28,水曜). 月末日の曜日(2001,3,31,土曜). 月末日の曜日(2001,4,30,月曜). 月末日の曜日(2001,5,31,木曜). 月末日の曜日(2001,6,30,土曜). 月末日の曜日(2001,7,31,火曜). 月末日の曜日(2001,8,31,金曜). 月末日の曜日(2001,9,30,日曜). 月末日の曜日(2001,10,31,水曜). 月末日の曜日(2001,11,30,金曜). 月末日の曜日(2001,12,31,月曜). 月末日の曜日(2002,1,31,木曜). 月末日の曜日(2002,2,28,木曜). 月末日の曜日(2002,3,31,日曜). 月末日の曜日(2002,4,30,火曜). 月末日の曜日(2002,5,31,金曜). 月末日の曜日(2002,6,30,日曜). 月末日の曜日(2002,7,31,水曜). 月末日の曜日(2002,8,31,土曜). 月末日の曜日(2002,9,30,月曜). 月末日の曜日(2002,10,31,木曜). 月末日の曜日(2002,11,30,土曜). 月末日の曜日(2002,12,31,火曜). 月末日の曜日(2003,1,31,金曜). 月末日の曜日(2003,2,28,金曜). 月末日の曜日(2003,3,31,月曜). 月末日の曜日(2003,4,30,水曜). 月末日の曜日(2003,5,31,土曜). 月末日の曜日(2003,6,30,月曜). 月末日の曜日(2003,7,31,木曜). 月末日の曜日(2003,8,31,日曜). 月末日の曜日(2003,9,30,火曜). 月末日の曜日(2003,10,31,金曜). 月末日の曜日(2003,11,30,日曜). 月末日の曜日(2003,12,31,水曜). 月末日の曜日(2004,1,31,土曜). 月末日の曜日(2004,2,29,日曜). 月末日の曜日(2004,3,31,水曜). 月末日の曜日(2004,4,30,金曜). 月末日の曜日(2004,5,31,月曜). 月末日の曜日(2004,6,30,水曜). 月末日の曜日(2004,7,31,土曜). 月末日の曜日(2004,8,31,火曜). 月末日の曜日(2004,9,30,木曜). 月末日の曜日(2004,10,31,日曜). 月末日の曜日(2004,11,30,火曜). 月末日の曜日(2004,12,31,金曜). 月末日の曜日(2005,1,31,月曜). 月末日の曜日(2005,2,28,月曜). 月末日の曜日(2005,3,31,木曜). 月末日の曜日(2005,4,30,土曜). 月末日の曜日(2005,5,31,火曜). 月末日の曜日(2005,6,30,木曜). 月末日の曜日(2005,7,31,日曜). 月末日の曜日(2005,8,31,水曜). 月末日の曜日(2005,9,30,金曜). 月末日の曜日(2005,10,31,月曜). 月末日の曜日(2005,11,30,水曜). 月末日の曜日(2005,12,31,土曜). 月末日の曜日(2006,1,31,火曜). 月末日の曜日(2006,2,28,火曜). 月末日の曜日(2006,3,31,金曜). 月末日の曜日(2006,4,30,日曜). 月末日の曜日(2006,5,31,水曜). 月末日の曜日(2006,6,30,金曜). 月末日の曜日(2006,7,31,月曜). 月末日の曜日(2006,8,31,木曜). 月末日の曜日(2006,9,30,土曜). 月末日の曜日(2006,10,31,火曜). 月末日の曜日(2006,11,30,木曜). 月末日の曜日(2006,12,31,日曜). 月末日の曜日(2007,1,31,水曜). 月末日の曜日(2007,2,28,水曜). 月末日の曜日(2007,3,31,土曜). 月末日の曜日(2007,4,30,月曜). 月末日の曜日(2007,5,31,木曜). 月末日の曜日(2007,6,30,土曜). 月末日の曜日(2007,7,31,火曜). 月末日の曜日(2007,8,31,金曜). 月末日の曜日(2007,9,30,日曜). 月末日の曜日(2007,10,31,水曜). 月末日の曜日(2007,11,30,金曜). 月末日の曜日(2007,12,31,月曜). 月末日の曜日(2008,1,31,木曜). 月末日の曜日(2008,2,29,金曜). 月末日の曜日(2008,3,31,月曜). 月末日の曜日(2008,4,30,水曜). 月末日の曜日(2008,5,31,土曜). 月末日の曜日(2008,6,30,月曜). 月末日の曜日(2008,7,31,木曜). 月末日の曜日(2008,8,31,日曜). 月末日の曜日(2008,9,30,火曜). 月末日の曜日(2008,10,31,金曜). 月末日の曜日(2008,11,30,日曜). 月末日の曜日(2008,12,31,水曜). 月末日の曜日(2009,1,31,土曜). 月末日の曜日(2009,2,28,土曜). 月末日の曜日(2009,3,31,火曜). 月末日の曜日(2009,4,30,木曜). 月末日の曜日(2009,5,31,日曜). 月末日の曜日(2009,6,30,火曜). 月末日の曜日(2009,7,31,金曜). 月末日の曜日(2009,8,31,月曜). 月末日の曜日(2009,9,30,水曜). 月末日の曜日(2009,10,31,土曜). 月末日の曜日(2009,11,30,月曜). 月末日の曜日(2009,12,31,木曜). 月末日の曜日(2010,1,31,日曜). 月末日の曜日(2010,2,28,日曜). 月末日の曜日(2010,3,31,水曜). 月末日の曜日(2010,4,30,金曜). 月末日の曜日(2010,5,31,月曜). 月末日の曜日(2010,6,30,水曜). 月末日の曜日(2010,7,31,土曜). 月末日の曜日(2010,8,31,火曜). 月末日の曜日(2010,9,30,木曜). 月末日の曜日(2010,10,31,日曜). 月末日の曜日(2010,11,30,火曜). 月末日の曜日(2010,12,31,金曜). 月末日の曜日(2011,1,31,月曜). 月末日の曜日(2011,2,28,月曜). 月末日の曜日(2011,3,31,木曜). 月末日の曜日(2011,4,30,土曜). 月末日の曜日(2011,5,31,火曜). 月末日の曜日(2011,6,30,木曜). 月末日の曜日(2011,7,31,日曜). 月末日の曜日(2011,8,31,水曜). 月末日の曜日(2011,9,30,金曜). 月末日の曜日(2011,10,31,月曜). 月末日の曜日(2011,11,30,水曜). 月末日の曜日(2011,12,31,土曜). 月末日の曜日(2012,1,31,火曜). 月末日の曜日(2012,2,29,水曜). 月末日の曜日(2012,3,31,土曜). 月末日の曜日(2012,4,30,月曜). 月末日の曜日(2012,5,31,木曜). 月末日の曜日(2012,6,30,土曜). 月末日の曜日(2012,7,31,火曜). 月末日の曜日(2012,8,31,金曜). 月末日の曜日(2012,9,30,日曜). 月末日の曜日(2012,10,31,水曜). 月末日の曜日(2012,11,30,金曜). 月末日の曜日(2012,12,31,月曜). 月末日の曜日(2013,1,31,木曜). 月末日の曜日(2013,2,28,木曜). 月末日の曜日(2013,3,31,日曜). 月末日の曜日(2013,4,30,火曜). 月末日の曜日(2013,5,31,金曜). 月末日の曜日(2013,6,30,日曜). 月末日の曜日(2013,7,31,水曜). 月末日の曜日(2013,8,31,土曜). 月末日の曜日(2013,9,30,月曜). 月末日の曜日(2013,10,31,木曜). 月末日の曜日(2013,11,30,土曜). 月末日の曜日(2013,12,31,火曜). 月末日の曜日(2014,1,31,金曜). 月末日の曜日(2014,2,28,金曜). 月末日の曜日(2014,3,31,月曜). 月末日の曜日(2014,4,30,水曜). 月末日の曜日(2014,5,31,土曜). 月末日の曜日(2014,6,30,月曜). 月末日の曜日(2014,7,31,木曜). 月末日の曜日(2014,8,31,日曜). 月末日の曜日(2014,9,30,火曜). 月末日の曜日(2014,10,31,金曜). 月末日の曜日(2014,11,30,日曜). 月末日の曜日(2014,12,31,水曜). 月末日の曜日(2015,1,31,土曜). 月末日の曜日(2015,2,28,土曜). 月末日の曜日(2015,3,31,火曜). 月末日の曜日(2015,4,30,木曜). 月末日の曜日(2015,5,31,日曜). 月末日の曜日(2015,6,30,火曜). 月末日の曜日(2015,7,31,金曜). 月末日の曜日(2015,8,31,月曜). 月末日の曜日(2015,9,30,水曜). 月末日の曜日(2015,10,31,土曜). 月末日の曜日(2015,11,30,月曜). 月末日の曜日(2015,12,31,木曜). 月末日の曜日(2016,1,31,日曜). 月末日の曜日(2016,2,29,月曜). 月末日の曜日(2016,3,31,木曜). 月末日の曜日(2016,4,30,土曜). 月末日の曜日(2016,5,31,火曜). 月末日の曜日(2016,6,30,木曜). 月末日の曜日(2016,7,31,日曜). 月末日の曜日(2016,8,31,水曜). 月末日の曜日(2016,9,30,金曜). 月末日の曜日(2016,10,31,月曜). 月末日の曜日(2016,11,30,水曜). 月末日の曜日(2016,12,31,土曜). 月末日の曜日(2017,1,31,火曜). 月末日の曜日(2017,2,28,火曜). 月末日の曜日(2017,3,31,金曜). 月末日の曜日(2017,4,30,日曜). 月末日の曜日(2017,5,31,水曜). 月末日の曜日(2017,6,30,金曜). 月末日の曜日(2017,7,31,月曜). 月末日の曜日(2017,8,31,木曜). 月末日の曜日(2017,9,30,土曜). 月末日の曜日(2017,10,31,火曜). 月末日の曜日(2017,11,30,木曜). 月末日の曜日(2017,12,31,日曜). 月末日の曜日(2018,1,31,水曜). 月末日の曜日(2018,2,28,水曜). 月末日の曜日(2018,3,31,土曜). 月末日の曜日(2018,4,30,月曜). 月末日の曜日(2018,5,31,木曜). 月末日の曜日(2018,6,30,土曜). 月末日の曜日(2018,7,31,火曜). 月末日の曜日(2018,8,31,金曜). 月末日の曜日(2018,9,30,日曜). 月末日の曜日(2018,10,31,水曜). 月末日の曜日(2018,11,30,金曜). 月末日の曜日(2018,12,31,月曜). 月末日の曜日(2019,1,31,木曜). 月末日の曜日(2019,2,28,木曜). 月末日の曜日(2019,3,31,日曜). 月末日の曜日(2019,4,30,火曜). 月末日の曜日(2019,5,31,金曜). 月末日の曜日(2019,6,30,日曜). 月末日の曜日(2019,7,31,水曜). 月末日の曜日(2019,8,31,土曜). 月末日の曜日(2019,9,30,月曜). 月末日の曜日(2019,10,31,木曜). 月末日の曜日(2019,11,30,土曜). 月末日の曜日(2019,12,31,火曜). 月末日の曜日(2020,1,31,金曜). 月末日の曜日(2020,2,29,土曜). 月末日の曜日(2020,3,31,火曜). 月末日の曜日(2020,4,30,木曜). 月末日の曜日(2020,5,31,日曜). 月末日の曜日(2020,6,30,火曜). 月末日の曜日(2020,7,31,金曜). 月末日の曜日(2020,8,31,月曜). 月末日の曜日(2020,9,30,水曜). 月末日の曜日(2020,10,31,土曜). 月末日の曜日(2020,11,30,月曜). 月末日の曜日(2020,12,31,木曜). % 以下のサイトは % % 年、月が与えられた時、日曜日から始まるカレンダーを表示する。 % 日曜起点カレンダー(_年,_月) :- 月末日(_年,_月,_月末日), 'Zellerの公式を用いて曜日を表す値と曜日を得る'(_年,_月,1,_曜日を表す値,_曜日), 日曜起点カレンダー(_曜日,_月末日,_カレンダー), カレンダー表示(_カレンダー). 日曜起点カレンダー(_一日の曜日,_月末日,_カレンダー) :- findall(_日,between(1,_月末日,_日),_日付ならび), 第一週の整形(_一日の曜日,_日付ならび,_第一週,_第二週以後), 最終週の整形(_第二週以後,_最終週を整形された第二週以後), _カレンダー = [_第一週|_最終週を整形された第二週以後]. 第一週の整形(日曜,[_1,_2,_3,_4,_5,_6,_7|R],[_1,_2,_3,_4,_5,_6,_7],R). 第一週の整形(月曜,[_1,_2,_3,_4,_5,_6|R],[_,_1,_2,_3,_4,_5,_6],R). 第一週の整形(火曜,[_1,_2,_3,_4,_5|R],[_,_,_1,_2,_3,_4,_5],R). 第一週の整形(水曜,[_1,_2,_3,_4|R],[_,_,_,_1,_2,_3,_4],R). 第一週の整形(木曜,[_1,_2,_3|R],[_,_,_,_,_1,_2,_3],R). 第一週の整形(金曜,[_1,_2|R],[_,_,_,_,_,_1,_2],R). 第一週の整形(土曜,[_1|R],[_,_,_,_,_,_,_1],R). 最終週の整形([_1,_2,_3,_4,_5,_6,_7|R1],[[_1,_2,_3,_4,_5,_6,_7]|R2]) :- 最終週の整形(R1,R2),!. 最終週の整形([],[]) :- !. 最終週の整形(L1,[L2]) :- length(L2,7), append(L1,_,L2). 'Zellerの公式を用いて曜日を表す値と曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を表す値と曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 > 2, 'Zellerの公式'(_年,_月,_日,_曜日を表す値), 'Zellerの公式で曜日を表す値と曜日'(_曜日を表す値,_曜日). 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 =< 2, _年_1 is _年 - 1, _月_2 is _月 + 12, 'Zellerの公式を用いて曜日を表す値と曜日を得る'(_年_1,_月_2,_日,_曜日を表す値,_曜日). 'Zellerの公式'(_年,_月,_日,_曜日を表す値) :- _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7. 'Zellerの公式で曜日を表す値と曜日'(0,日曜). 'Zellerの公式で曜日を表す値と曜日'(1,月曜). 'Zellerの公式で曜日を表す値と曜日'(2,火曜). 'Zellerの公式で曜日を表す値と曜日'(3,水曜). 'Zellerの公式で曜日を表す値と曜日'(4,木曜). 'Zellerの公式で曜日を表す値と曜日'(5,金曜). 'Zellerの公式で曜日を表す値と曜日'(6,土曜). 月末日(_年,2,29) :- うるう年(_年),!. 月末日(_年,2,28) :- !. 月末日(_,_月,31) :- member(_月,[1,3,5,7,8,10,12]). 月末日(_,_月,30) :- member(_月,[4,6,9,11]). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. カレンダー表示([]). カレンダー表示([_週|R]) :- カレンダー週表示(_週), カレンダー表示(R). カレンダー週表示([]) :- write('\n'). カレンダー週表示([A|R]) :- 表示項(A,_表示項), writef('%3R',[_表示項]), カレンダー週表示(R). 表示項(' ',' ') :- !. 表示項(N,N). % 以下のサイトは 日曜起点カレンダー(_一日の曜日,_末日整数,_カレンダー) :- findall(_日,between(1,_末日整数,_日),_日付ならび), 第一週の整形(_一日の曜日,_日付ならび,_第一週,_第二週以後), 最終週の整形(_第二週以後,_最終週を整形された第二週以後), _カレンダー = [_第一週|_最終週を整形された第二週以後]. 第一週の整形(日曜,[_1,_2,_3,_4,_5,_6,_7|R],[_1,_2,_3,_4,_5,_6,_7],R). 第一週の整形(月曜,[_1,_2,_3,_4,_5,_6|R],[_,_1,_2,_3,_4,_5,_6],R). 第一週の整形(火曜,[_1,_2,_3,_4,_5|R],[_,_,_1,_2,_3,_4,_5],R). 第一週の整形(水曜,[_1,_2,_3,_4|R],[_,_,_,_1,_2,_3,_4],R). 第一週の整形(木曜,[_1,_2,_3|R],[_,_,_,_,_1,_2,_3],R). 第一週の整形(金曜,[_1,_2|R],[_,_,_,_,_,_1,_2],R). 第一週の整形(土曜,[_1|R],[_,_,_,_,_,_,_1],R). 最終週の整形([_1,_2,_3,_4,_5,_6,_7|R1],[[_1,_2,_3,_4,_5,_6,_7]|R2]) :- 最終週の整形(R1,R2),!. 最終週の整形(L1,[L2]) :- length(L2,7), append(L1,_,L2). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1411227287/178 # お題 # "この文字列には1が□個,2が□個,3が□個,1から3以外の数字が□個ある。" # の□をそれぞれ適切な数字に置き換え、正しい文章として完成させるコードを書け。 # # 元ネタ:https://www.facebook.com/NewtonScience/photos/a.314504251971427.78296.285001398255046/716155815139600/ # # '"この文字列には1が□個,2が□個,3が□個,1から3以外の数字が□個ある。" という文章がある。□をそれぞれ適切な数字に置き換え、正しい文章として完成させるコードを書け。'(_正しい文章) :- '1が□個,2が□個,3が□個,1から3以外の数字が□個'(_n1,_n2,_n3,_n4,_1,_2,_3,_4), '"この文字列には1が□個,2が□個,3が□個,1から3以外の数字が□個ある。" という文章がある。□をそれぞれ適切な数字に置き換え、正しい文章として完成させる'(_1,_2,_3,_4,_正しい文章), 正しい文章である(_正しい文章,_n1,_n2,_n3,_n4). '1が□個,2が□個,3が□個,1から3以外の数字が□個'(_n1,_n2,_n3,_n4,_1,_2,_3,_4) :- '1が□個'(_n1,_1), '2が□個'(_n2,_2), '3が□個'(_n3,_3), '1から3以外の数字が□個ある'(_n4,_4). '1が□個'(_n1,_1) :- between(0,9,_n1), number_chars(_n1,[_1]). '2が□個'(_n2,_2) :- between(0,9,_n2), number_chars(_n2,[_2]). '3が□個'(_n3,_3) :- between(0,9,_n3), number_chars(_n3,[_3]). '1から3以外の数字が□個ある'(_n4,_4) :- between(0,9,_n4), number_chars(_n4,[_4]). '"この文字列には1が□個,2が□個,3が□個,1から3以外の数字が□個ある。" という文章がある。□をそれぞれ適切な数字に置き換え、正しい文章として完成させる'(_1,_2,_3,_4,_正しい文章) :- swritef(_正しい文章,'この文字列には1が%t個,2が%t個,3が%t個,1から3以外の数字が%t個ある。',[_1,_2,_3,_4]). 正しい文章である(_正しい文章,_n1,_n2,_n3,_n4) :- '1の度数は'(_正しい文章,_n1), '2の度数は'(_正しい文章,_n2), '3の度数は'(_正しい文章,_n3), '1から3以外の数字の度数'(_正しい文章,_n4). '1の度数は'(_正しい文章,_n1) :- 度数(sub_atom(_正しい文章,_,1,_,'1'),_n1). '2の度数は'(_正しい文章,_n2) :- 度数(sub_atom(_正しい文章,_,1,_,'2'),_n2). '3の度数は'(_正しい文章,_n3) :- 度数(sub_atom(_正しい文章,_,1,_,'3'),_n3). '1から3以外の数字の度数'(_正しい文章,_n4) :- 度数((sub_atom(_正しい文章,_,1,_,A),member(A,['4','5','6','7','8','9','0'])),_n4). 度数(_目標,_度数) :- findall(1,_目標,L), length(L,_度数). % 以下のサイトは # 出題場所 :: 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([_短い方から二番目に短い文字列,_短い方から二番目に短い文字数],_連続した文字列と文字数ならび). % 以下のサイトは # プログラミングのお題スレ Part5 #27 # # nこの角砂糖でできる直方体は何種類あるか? # 'nこの角砂糖でできる直方体は何種類あるか?'(_n,_何種類) :- 'nこの角砂糖でできる直方体は'(_n,_直方体ならび), length(_直方体ならび,_何種類). 'nこの角砂糖でできる直方体は'(_n,_直方体ならび) :- findall(M,between(1,_n,M),L), findall([_辺1,_辺2,_辺3],( 直方体(L,_n,_辺1,_辺2,_辺3)),_直方体ならび). 直方体(L,_n,_辺1,_辺2,_辺3) :- '_辺1,_辺2,_辺3を選択'(L,_辺1,_辺2,_辺3), '_辺1,_辺2,_辺3は昇順'(_辺1,_辺2,_辺3), _n is _辺1 * _辺2 + _辺3. '_辺1,_辺2,_辺3を選択'(L,_辺1,_辺2,_辺3) :- select(_辺1,L,R1), select(_辺2,L,R2), select(_辺3,L,R3). '_辺1,_辺2,_辺3は昇順'(_辺1,_辺2,_辺3) :- _辺1 =< _辺2, _辺2 =< _辺3. % 以下のサイトは % 駒場東大前から下北沢までの距離を求めなさい 井の頭線(渋谷,500). 井の頭線(神泉,900). 井の頭線(駒場東大前,1000). 井の頭線(池ノ上,600). 井の頭線(下北沢,500). 井の頭線(新代田,500). 駒場東大前から下北沢までの距離(_駒場東大前から下北沢までの距離) :- 井の頭線リスト(_井の頭線リスト), 駒場東大前から下北沢の区間の距離リスト(_井の頭線リスト,_駅間距離のリスト), sum_list(_駅間距離のリスト,_駒場東大前から下北沢までの距離). 井の頭線リスト(_井の頭線リスト) :- findall((_駅,_次の駅までの距離),井の頭線(_駅,_次の駅までの距離),_井の頭線リスト). 駒場東大前から下北沢の区間の距離リスト(_井の頭線リスト,_駅間距離のリスト) :- _駒場東大前から下北沢までのリスト = [(駒場東大前,_)|_], append(_,_駒場東大前から下北沢までのリスト,[(下北沢,_)|_],_井の頭線リスト), findall(_距離,member((_,_距離),_駒場東大前から下北沢までのリスト),_駅間距離のリスト). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは yes. % 駒場東大前から下北沢までの距離を求めなさい 井の頭線(渋谷,500). 井の頭線(神泉,900). 井の頭線(駒場東大前,1000). 井の頭線(池ノ上,600). 井の頭線(下北沢,500). 井の頭線(新代田,500). 駒場東大前から下北沢までの距離(_駒場東大前から下北沢までの距離) :- findall((_駅,_次の駅までの距離),井の頭線(_駅,_次の駅までの距離),_井の頭線リスト), append(_,[(駒場東大前,_距離_1)|R],[(下北沢,_)|_],_井の頭線リスト), findall(_距離,member((_,_距離),[(駒場東大前,_距離_1)|R]),_駅間距離のリスト), sum_list(_駅間距離のリスト,_駒場東大前から下北沢までの距離). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは # 駒場東大前から下北沢までの距離を求めなさい 井の頭線(渋谷,神泉,500). 井の頭線(神泉,駒場東大前,900). 井の頭線(駒場東大前,池ノ上,1000). 井の頭線(池ノ上,下北沢,600). 井の頭線(下北沢,新代田,500). 駒場東大前から下北沢までの距離(_距離) :- 駒場東大前から下北沢までの距離(駒場東大前,_距離). 駒場東大前から下北沢までの距離(下北沢,0). 駒場東大前から下北沢までの距離(_駅,_距離) :- 井の頭線(_駅,_次の駅,_次の駅までの距離), 駒場東大前から下北沢までの距離(_次の駅,_次の駅から下北沢までの距離), _距離 is _次の駅から下北沢までの距離 + _次の駅までの距離. % データベースの集約問題。 % 駒場東大前から下北沢までの距離を求めなさい 井の頭線(渋谷,500). 井の頭線(神泉,900). 井の頭線(駒場東大前,1000). 井の頭線(池ノ上,600). 井の頭線(下北沢,500). 駒場東大前から下北沢までの距離(_距離) :-   findall((_駅,_次の駅までの距離),井の頭線(_駅,_次の駅までの距離),L),   駒場東大前までを読み飛ばす(L,L2),   駒場東大前から下北沢までの距離(L2,_距離). 駒場東大前までを読み飛ばす([(駒場東大前,_次の駅までの距離)|R],[(駒場東大前,_次の駅までの距離)|R]). 駒場東大前までを読み飛ばす([_|R1],R2) :-   駒場東大前までを読み飛ばす(R1,R2). 駒場東大前から下北沢までの距離([(下北沢,_)|_],0). 駒場東大前から下北沢までの距離([(_,_次の駅までの距離)|R],_下北沢までの距離) :-   駒場東大前から下北沢までの距離(R,_次の駅から下北沢までの距離),   _下北沢までの距離 is _次の駅までの距離 + _次の駅から下北沢までの距離. % 以下のサイトは # # 9―3÷1/3+1=? 尾崎さんならPrologで解きそうだ # '9―3÷1/3+1=? 尾崎さんならPrologで解きそうだ' :- '9―3÷1/3+1=?', 尾崎さんならPrologで解きそうだ. '9―3÷1/3+1=?' :- '全角文字を半角文字にしながら/をrdivに÷を/に置換する'('9―3÷1/3+1',_置換された半角式文字列), '/(実は÷)の演算子結合度をrdiv(実は/)の400より強くする', 置換された半角式文字列を解釈実行する(_置換された半角式文字列,_はてな), 式を復元して表示する('9―3÷1/3+1=',_はてな). '全角文字を半角文字にしながら/をrdivに÷を/に置換する'('9―3÷1/3+1',_置換された半角式文字列) :- 'ここだけの文字列置換(=?は除去される)'('9―3÷1/3+1=?',_置換された半角式文字列). '/(実は÷)の演算子結合度をrdiv(実は/)の400より強くする' :- op(401,yfx,(/)). 置換された半角式文字列を解釈実行する(_置換された半角式文字列,_はてな) :- read_term_from_atom(_置換された半角式文字列,_式,[]), _はてな is _式. 'ここだけの文字列置換(=?は除去される)'(_文字列,_置換された文字列) :- findall(_置換された文字,( sub_atom(_文字列,_,1,_,_文字), ここだけの置換(_文字,_置換された文字)),_置換された文字ならび), atomic_list_concat(_置換された文字ならび,_置換された文字列). ここだけの置換('9','9'). ここだけの置換('―','-'). ここだけの置換('3','3'). ここだけの置換('÷','/'). ここだけの置換('/',' rdiv '). ここだけの置換('+','+'). ここだけの置換('1','1'). ここだけの置換('=',''). ここだけの置換('?',''). ここだけの置換('2','2'). ここだけの置換('4','4'). ここだけの置換('5','5'). ここだけの置換('6','6'). ここだけの置換('7','7'). ここだけの置換('8','8'). ここだけの置換('0','0'). 式を復元して表示する(_表示文字列_1,_はてな) :- '_はてなを全角数字に置換する'(_はてな,_はてな全角文字列), writef('%t%t\n',[_表示文字列_1,_はてな全角文字列]). '_はてなを全角数字に置換する'(_はてな,_はてな全角数字文字列) :- number_chars(_はてな,_はてな数字ならび), 半角文字ならびを全角文字ならびに変換する(_はてな数字ならび,_はてな全角数字ならび), atomic_list_concat(_はてな全角数字ならび,_はてな全角数字文字列). 半角文字ならびを全角文字ならびに変換する(_はてな数字ならび,_はてな全角数字ならび) :- findall(_全角数字,( member(_半角数字,_はてな数字ならび), ここだけの置換(_全角数字,_半角数字)),_はてな全角数字ならび). 尾崎さんならPrologで解きそうだ. % 以下のサイトは # 9―3÷1/3+1=? 尾崎さんならPrologで解きそうだ '9―3÷1/3+1=? 尾崎さんならPrologで解きそうだ' :- '9―3÷1/3+1=?', 尾崎さんならPrologで解きそうだ. '9―3÷1/3+1=?' :- op(401,yfx,(/)), ここだけの文字列置換('9―3÷1/3+1=?',_置換された文字列), read_term_from_atom(_置換された文字列,_式 = ?,[]), X is _式, '?を全角数字の解に置換して表示する'('9―3÷1/3+1=%t\n',X). ここだけの文字列置換(_文字列,_置換された文字列) :- findall(_置換された文字,( sub_atom(_文字列,_,1,_,_文字), ここだけの文字置換(_文字,_置換された文字)),_置換された文字ならび), atomic_list_concat(_置換された文字ならび,_置換された文字列). ここだけの文字置換('9','9'). ここだけの文字置換('―','-'). ここだけの文字置換('3','3'). ここだけの文字置換('÷','/'). ここだけの文字置換('/',' rdiv '). ここだけの文字置換('+','+'). ここだけの文字置換('1','1'). ここだけの文字置換('=','='). ここだけの文字置換('?',' ? '). ここだけの文字置換('2','2'). ここだけの文字置換('4','4'). ここだけの文字置換('5','5'). ここだけの文字置換('6','6'). ここだけの文字置換('7','7'). ここだけの文字置換('8','8'). ここだけの文字置換('0','0'). '?を全角数字の解に置換して表示する'(_表示パターン,X) :- '?を全角数字の解に置換して'(X,_解文字列), writef(_表示パターン,[_解文字列]). '?を全角数字の解に置換して'(X,_解文字列) :- number_chars(X,Chars), findall(_全角数字,( member(_数字,Chars), ここだけの文字置換(_全角数字,_数字)),_解文字ならび), atomic_list_concat(_解文字ならび,_解文字列). 尾崎さんならPrologで解きそうだ. % 以下のサイトは # 9―3÷1/3+1=? 尾崎さんならPrologで解きそうだ '9―3÷1/3+1=? 尾崎さんならPrologで解きそうだ'(X) :- '9―3÷1/3+1=?'(X), 尾崎さんならPrologで解きそうだ. '9―3÷1/3+1=?'(X) :- op(401,yfx,(/)), ここだけの文字列置換('9―3÷1/3+1=?',_置換された文字列), read_term_from_atom(_置換された文字列,_式,[]), X is _式. ここだけの文字列置換(_文字列,_置換された文字列) :- findall(_置換された文字,( sub_atom(_文字列,_,1,_,_文字), ここだけの文字置換(_文字,_置換された文字)),_置換された文字ならび), atomic_list_concat(_置換された文字ならび,_置換された文字列). ここだけの文字置換('9','9'). ここだけの文字置換('―','-'). ここだけの文字置換('3','3'). ここだけの文字置換('÷','/'). ここだけの文字置換('/',' rdiv '). ここだけの文字置換('+','+'). ここだけの文字置換('1','1'). 尾崎さんならPrologで解きそうだ. % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1402622093/884 # 最小値Nから最大値Mまでの約数の総和を出力せよ # # 最小値Nから最大値Mまでの約数の総和を出力せよ(N,M) :- 最小値Nから最大値Mまでの約数の総和を(N,M,_最小値Nから最大値Mまでの約数の総和), 出力せよ(_最小値Nから最大値Mまでの約数の総和). 最小値Nから最大値Mまでの約数の総和を(N,M,_最小値Nから最大値Mまでの約数の総和) :- 総和を(_約数,( 最小値Nから最大値Mまでの(N,M,_整数), 約数の(_整数,_約数)),_最小値Nから最大値Mまでの約数の総和). 最小値Nから最大値Mまでの(N,M,_整数) :- between(N,M,_整数). 約数の(_整数,_約数) :- between(1,_整数,_約数), 0 is _整数 mod _約数. 総和を(A,B,C) :- findsum(A,B,C). 出力せよ(_約数の総和) :- writef('%t\n',[_約数の総和]). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1402622093/884 # 最小値Nから最大値Mまでの約数の総和を出力せよ # # 最小値Nから最大値Mまでの約数の総和を出力せよ(N,M) :- 最小値Nから最大値Mまでの約数の総和を(N,M,_約数の総和), 出力せよ(_約数の総和). 最小値Nから最大値Mまでの約数の総和を(N,M,_約数の総和) :- 最小値Nから最大値Mまでの約数の(N,M,_約数の), 総和を(_約数の,_約数の総和). 最小値Nから最大値Mまでの約数の(N,M,_約数の) :- findall(_約数,最小値Nから最大値Mまでの約数(N,M,_約数),_約数の). 最小値Nから最大値Mまでの約数(N,M,_約数) :- 最小値Nから最大値Mまでの(N,M,_整数), 約数(_整数,_約数). 最小値Nから最大値Mまでの(N,M,_整数) :- between(N,M,_整数). 約数(_整数,_約数) :- between(1,_整数,_約数), 0 is _整数 mod _約数. 総和を(_約数の,_約数の総和) :- sum_list(_約数の,_約数の総和). 出力せよ(_約数の総和) :- writef('%t\n',[_約数の総和]). % 以下のサイトは 標準入力から整数を得る(_催促文言,_検査述語,_整数) :- 催促文言を表示して標準入力から整数を得て検査述語を実行する(_催促文言,_検査述語,_整数),!. 標準入力から整数を得る(_催促文言,_検査述語,_整数) :- 標準入力から整数を得る(_催促文言,_検査述語,_整数). 催促文言を表示して標準入力から整数を得て検査述語を実行する(_催促文言,_検査述語,_整数) :- 催促文言を表示して標準入力から整数を得て(_催促文言,_整数), 検査述語を実行する(_検査述語). 催促文言を表示して標準入力から整数を得て(_催促文言,_整数) :- 催促文言を表示して(_催促文言), 標準入力から整数を得る(_整数). 催促文言を表示して(_催促文言) :- 催促文言の編集(_催促文言,_編集された催促文言), writef('%tを入力してください : ',[_編集された催促文言]). 催促文言の編集(表示しない,'') :- !. 催促文言の編集(_催促文言,_編集された催促文言) :- atom_concat(_催促文言,'を入力して下さい : ',_編集された催促文言). 検査述語を実行する(_検査述語) :- _検査述語. 標準入力から整数を得る(_整数) :- 標準入力から文字列を得る(_文字列), 整数入力検査(_文字列,_整数),!. 標準入力から整数を得る(_整数) :- 標準入力から整数を得る(_整数). 整数入力検査(_文字列,_整数) :- 入力文字列から整数が得られる(_文字列,_整数),!. 整数入力検査(_文字列,_) :- 入力文字列から整数が得られない(_文字列,_). 入力文字列から整数が得られる(_文字列,_整数) :- catch(read_term_from_atom(_文字列,_整数,[valiables(_入力された変数),valiable_names(_入力された変数名)]),E,fail), integer(_整数). 入力文字列から整数が得られない(_文字列,_) :- writef('入力された文字列 %t からは整数が得られません。再入力をお願いします: \n',[_文字列]), fail. 標準入力から文字列を得る(_文字列) :- findall(_文字,( 標準入力から一文字を得る(_文字), (入力終了文字(_文字),!,fail;true)),Chars), atom_chars(_文字列,Chars). 標準入力から一文字を得る(_文字) :- get_char(_文字). 標準入力から一文字を得る(_文字) :- 標準入力から一文字を得る(_文字). 入力終了文字('\n'). 入力終了文字(end_of_file). % 以下のサイトは # 問題文 # 高橋君の国では、N 種類の硬貨が使われています。 1 番目の硬貨の価値は 1 円です。 k 番目の硬貨の価値は、k−1 番目の硬貨の 10 倍あります。 つまり、2 番目の硬貨は 10 円の価値があり、5 番目の硬貨は 10000 円の価値があります。 # # 高橋君は、お釣りが嫌いです。なので、出来るだけぴったりの金額で買い物がしたいと思っています。 そこで高橋君は、今持っている硬貨で、何種類の金額が払えるかを調べたいと思いました。 # # 高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # N # A1 # A2 # : # AN # 1 行目には、硬貨の種類数 N(1≦N≦50) が、1 行で与えられる。 # 2 行目から N 行では、高橋君が各硬貨を何枚持っているかが与えられる。 このうち i(1≦i≦N) 行目では、 i 番目の硬貨を、高橋君が何枚持っているかを表す整数 Ai(0≦Ai≦50000)が与えられる。 # 出力 # 高橋君が払える金額の種類数を、 1000000007 で割った余りを 1 行で出力せよ。出力の末尾は改行をいれること。 # # 入力例1 # 2 # 2 # 1 # 出力例1 # 5 # 払える金額は、1 円, 2 円, 10 円, 11 円, 12 円の 5 通りとなります。 # # 0 円は含まないことに注意してください。 # # 入力例2 # 2 # 32 # 3 # 出力例2 # 62 # 1 円から 62 円の 62 通りの金額を支払うことが出来ます。 # # 入力例3 # 4 # 12 # 3 # 7 # 34 # 出力例3 # 12039 # 入力例4 # 10 # 1234 # 2 # 857 # 3858 # 1 # 5000 # 32 # 4 # 1 # 857 # 出力例4 # 969347336 # 1000000007 で割った余りを出力してください。 # '高橋君の国では、N 種類の硬貨が使われています。 1 番目の硬貨の価値は 1 円です。 k 番目の硬貨の価値は、k‐1 番目の硬貨の 10 倍あります。 つまり、2 番目の硬貨は 10 円の価値があり、5 番目の硬貨は 10000 円の価値があります。 高橋君は、お釣りが嫌いです。なので、出来るだけぴったりの金額で買い物がしたいと思っています。 そこで高橋君は、今持っている硬貨で、何種類の金額が払えるかを調べた いと思いました。 高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるた め、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。' :- 何種類かとそれぞれの硬貨の枚数を得る(_何種類,_種類別枚数ならび), 最大何通り(_種類別枚数ならび,_最大何通り), 最大可能性から重複を差し引く(_種類別枚数ならび,_最大何通り,_何通り), '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り). 何種類かとそれぞれの硬貨の枚数を得る(_何種類,_枚数ならび) :- 標準入力から整数を得る(_何種類), findall([M,_整数],( between(1,_何種類,N), succ(M,N), 標準入力から整数を得る(_整数)), _枚数ならび). 最大何通り(_種類別枚数ならび,_最大何通り) :- 最大何通り(_種類別枚数ならび,1,_最大何通り). 最大何通り([],_最大何通り,_最大何通り). 最大何通り([[_,0]|R]],_最大何通り,_最大何通り) :- 最大何通り(R,_最大何通り,_最大何通り),!. 最大何通り([[A,B]|R],N,_最大何通り) :- N_2 is B * N, 最大何通り(R,N_2,_最大何通り). 最大可能性から重複を差し引く(_種類別枚数ならび,_最大何通り,_何通り) :- findsum(_差し引き数,( append(L1,[[_種類,_枚数]|L2],_種類別枚数ならび), 差し引き数(_種類,_枚数,L1,_差し引き数)), _重複差し引き数), _何通り is _最大何通り - _重複差し引き数. 差し引き数(_種類_1,_枚数_1,L1,_差し引き数)) :- findsum(_差し引き数_3,( member([_種類,_枚数],L1), _差し引き数_1 is _枚数_1 // (_種類_1 // _種類), _差し引き数_2 is _枚数 // (_種類_1 // _種類), 差し引き数選択(_差し引き数_1,_差し引き数_2,_差し引き数_3)), _差し引き数). 差し引き数選択(_差し引き数_1,_差し引き数_2,_差し引き数_1) :- _差し引き数_1 =< _差し引き数_2,!. 差し引き数選択(_差し引き数_1,_差し引き数_2,_差し引き数_2). '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り) :- '1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り),!. '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り) :- writef('%t何通り\n',[_何通り]). '1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り) :- _何通り >= 1000000007, _何通りを1000000007で割った余り is _何通り mod 1000000007, writef('%t何通り\n',[_何通りを1000000007で割った余り]). 標準入力から整数を得る(_整数) :- 標準入力から文字列を得る(_文字列), 整数入力検査(_文字列,_整数),!. 標準入力から整数を得る(_整数) :- 標準入力から整数を得る(_整数). 整数入力検査(_文字列,_整数) :- catch(read_term_from_atom(_文字列,_整数,[]),E,fail), integer(_整数),!. 標準入力から文字列を得る(_文字列) :- findall(_文字,( 標準入力から一文字を得る(_文字), (終了文字(_文字),!,fail;true)),Chars), atom_chars(_文字列,Chars). 標準入力から一文字を得る(_文字) :- get_char(_文字). 標準入力から一文字を得る(_文字) :- 標準入力から一文字を得る(_文字). 終了文字('\n'). 終了文字(end_of_file). % 以下のサイトは # 問題文 # 高橋君の国では、N 種類の硬貨が使われています。 1 番目の硬貨の価値は 1 円です。 k 番目の硬貨の価値は、k−1 番目の硬貨の 10 倍あります。 つまり、2 番目の硬貨は 10 円の価値があり、5 番目の硬貨は 10000 円の価値があります。 # # 高橋君は、お釣りが嫌いです。なので、出来るだけぴったりの金額で買い物がしたいと思っています。 そこで高橋君は、今持っている硬貨で、何種類の金額が払えるかを調べたいと思いました。 # # 高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # N # A1 # A2 # : # AN # 1 行目には、硬貨の種類数 N(1≦N≦50) が、1 行で与えられる。 # 2 行目から N 行では、高橋君が各硬貨を何枚持っているかが与えられる。 このうち i(1≦i≦N) 行目では、 i 番目の硬貨を、高橋君が何枚持っているかを表す整数 Ai(0≦Ai≦50000)が与えられる。 # 出力 # 高橋君が払える金額の種類数を、 1000000007 で割った余りを 1 行で出力せよ。出力の末尾は改行をいれること。 # # 入力例1 # 2 # 2 # 1 # 出力例1 # 5 # 払える金額は、1 円, 2 円, 10 円, 11 円, 12 円の 5 通りとなります。 # # 0 円は含まないことに注意してください。 # # 入力例2 # 2 # 32 # 3 # 出力例2 # 62 # 1 円から 62 円の 62 通りの金額を支払うことが出来ます。 # # 入力例3 # 4 # 12 # 3 # 7 # 34 # 出力例3 # 12039 # 入力例4 # 10 # 1234 # 2 # 857 # 3858 # 1 # 5000 # 32 # 4 # 1 # 857 # 出力例4 # 969347336 # 1000000007 で割った余りを出力してください。 # '高橋君の国では、N 種類の硬貨が使われています。 1 番目の硬貨の価値は 1 円です。 k 番目の硬貨の価値は、k‐1 番目の硬貨の 10 倍あります。 つまり、2 番目の硬貨は 10 円の価値があり、5 番目の硬貨は 10000 円の価値があります。 高橋君は、お釣りが嫌いです。なので、出来るだけぴったりの金額で買い物がしたいと思っています。 そこで高橋君は、今持っている硬貨で、何種類の金額が払えるかを調べた いと思いました。 高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるた め、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。' :- 何種類かとそれぞれの硬貨の枚数を得る(_何種類,_枚数ならび), 硬貨の合計金額種類(_枚数ならび,_何通り), '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り). 何種類かとそれぞれの硬貨の枚数を得る(_何種類,_枚数ならび) :- 標準入力から整数を得る(_何種類), findall(_整数,( between(1,_何種類,_), 標準入力から整数を得る(_整数)), _枚数ならび). 硬貨の合計金額種類(_枚数ならび,_何通り) :- findall(_合計金額,合計金額(0,_枚数ならび,0,_合計金額),L1), sort(L1,L2), length(L2,_何通り). 合計金額(N,[],_合計金額,_合計金額). 合計金額(N,[_枚数|R],_合計金額_1,_合計金額) :- '1から枚数分を増やして合計金額を非決定性に計算していく'(N,_枚数,_ご金額金額_1,_合計金額_2), succ(N,N_2), 合計金額(N_2,R,_合計金額_2,_合計金額). '1から枚数分を増やして合計金額を非決定的に計算していく'(N,_枚数,_合計金額_1,_合計金額_2) :- between(1,_枚数,M), _合計金額_2 is _合計金額_1 + 10 ^ N * M. '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_種類) :- '1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_種類),!. '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_種類) :- writef('%t種類\n',[_種類]). '1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_種類) :- _種類 >= 1000000007, _種類を1000000007で割った余り is _種類 mod 1000000007, writef('%t種類\n',[_種類を1000000007で割った余り]). 標準入力から整数を得る(_整数) :- 標準入力から文字列を得る(_文字列), 整数入力検査(_文字列,_整数),!. 標準入力から整数を得る(_整数) :- 標準入力から整数を得る(_整数). 整数入力検査(_文字列,_整数) :- catch(read_term_from_atom(_文字列,_整数,[]),E,fail), integer(_整数),!. 標準入力から文字列を得る(_文字列) :- findall(_文字,( 標準入力から一文字を得る(_文字), (終了文字(_文字),!,fail;true)),Chars), atom_chars(_文字列,Chars). 標準入力から一文字を得る(_文字) :- get_char(_文字). 標準入力から一文字を得る(_文字) :- 標準入力から一文字を得る(_文字). 終了文字('\n'). 終了文字(end_of_file). % 以下のサイトは # 問題文 # (21:13 追記) |A|=|B|=1のケースがテスト中に一つ含まれていましたので、リジャッジを行います。なお、このケースでNOを出力するプログラムに影響はありません。 # # 文字列 A の文字をちょうど 3 回スワップすることにより、文字列 B に変換できるとき、二つの文字列 A, B を、仲良し文字列と呼ぶことにします。 # # スワップとは、文字列に含まれる 2 つの文字を、入れ替えることを指します。 例えば、abcという文字列であれば、aとcを入れ替えて、cbaのように変換することが出来ます。 # # aaのような文字列に対し、 1 文字目のaと、 2 文字目のaを入れ替えることは許されていますが、同じ場所の文字を指定することはできません。 # # 文字列 A, B が与えられるので、仲良し文字列になっているかどうかを判定しなさい。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # A # B # 1 行目には、文字列 A(2≦|A|≦1000) が与えられる。 # 2 行目には、文字列 B(|B|=|A|) が与えられる。 # A, B 共に、小文字アルファベットのみで構成されていることが保障されている。 # 出力 # 与えられた 2 つの文字列が、仲良し文字列であればYES、そうでなければNOを出力せよ。 出力の末尾には改行をいれること。 # # 入力例1 # abcdef # fedcba # 出力例1 # YES # まず、文字列 A のabcdefのaとfをスワップし、fbcdeaとします。 # # 次に、bとeをスワップし、fecdbaとします。 # # 最後に、cとdをスワップし、fedcbaとすると、文字列 B と一致します。 # # よって、この 2 つの文字列は、仲良し文字列となるため、YESと出力します。 # # 入力例2 # abababab # babababa # 出力例2 # NO # 使っている文字数が同じでも、 3 回のスワップでは同じ文字列にできないパターンも存在します。 # # 入力例3 # nt # nt # 出力例3 # NO # スワップの仕方が 1 通りしかなく、 3 回のスワップを繰り返すと、tnになってしまいます。 よって、同じ 2 つの文字列ですが、仲良し文字列ではありません。 # # 入力例4 # pqqq # pqqq # 出力例4 # YES # まず、 1 番目の文字と 2 番目の文字を入れ替え、qpqqとします。 次に、 3 番目の文字と 4 番目の文字を入れ替え、qpqqとします。この際、同じ文字を選んでいますが、場所が違うので問題ありません。 最後に、1番目の文字と、2番目の文字を入れ替え、pqqqとします。 # # 入力例5 # abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvxyzw # abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz # 出力例5 # YES # 長い文字列が与えらえれることがあることにも注意してください。 # # 入力例6 # abcdef # ghijkl # 出力例6 # NO '文字列 A, B が与えられるので、仲良し文字列になっているかどうかを判定しなさい。'(A,B) :- 標準入力から二つの文字列を得る(A,B), '文字列 A, B が与えられるので、仲良し文字列になっているかどうかを判定しなさい。'(A,B). '文字列 A, B が与えられるので、仲良し文字列になっているかどうかを判定しなさい。'(A,B) :- 文字列と仲良し文字列(A,B), write('YES\n'),!. '文字列 A, B が与えられるので、仲良し文字列になっているかどうかを判定しなさい。'(A,B) :- write('NO\n'). 文字列と仲良し文字列(_文字列,_仲良し文字列) :- 二つの文字列をならびに変換する(_文字列,_仲良し文字列,L1,L2), '二つのならびの差分(L3,L4)と同一部分(L5)'(L1,L2,L3,L4,L5), 三組のスワップが存在する(L3,L4,L5,Len). 二つの文字列をならびに変換する(_文字列,_仲良し文字列,L1,L2) :- atom_chars(_文字列,L1), atom_chars(_仲良し文字列,L2). '二つのならびの差分(L3,L4)と同一部分(L5)'([],[],[],[],[]). '二つのならびの差分(L3,L4)と同一部分(L5)'([A|R1],[A|R2],R3,R4,[A|R5]) :- '二つのならびの差分(L3,L4)と同一部分(L5)'(R1,R2,R3,R4),!. '二つのならびの差分(L3,L4)と同一部分(L5)'([A|R1],[B|R2],[A|R3],[B|R4],R5) :- '二つのならびの差分(L3,L4)と同一部分(L5)'(R1,R2,R3,R4,R5). 三組のスワップが存在する(L3,L4,L5,Len) :- 二つのならびは同一要素からなる(L3,L4,Len), 整列(L5,L6), 同一文字のペアの可能性を含めて三組のスワップが存在するかどうかの検査(Len,L6). 二つのならびは同一要素からなる(L3,L4,Len) :- length(L3,Len), length(L4,Len). 同一の要素からなる(L3,L4). 同一の要素からなる([],[]). 同一の要素からなる([A|R1],L2) :- select(A,L2,R2), 同一の要素からなる(R1,R2). 同一文字のペアの可能性を含めて三組のスワップが存在するかどうかの検査(Len,L6) :- 同一文字ペアを数える(L6,_同一文字ペア数), 同一文字同士のスワップ検査(Len,_同一文字ペア数). 同一文字ペアの数を数える([],[]). 同一文字ペアの数を数える([A,A|R],[_|R2]) :- 同一文字ペアの数を数える(R1,R2),!. 同一文字ペアの数を数える([_|R1],R2) :- 同一文字ペアの数を数える(R1,R2). 同一文字同士のスワップ検査(3,_) :- !. 同一文字同士のスワップ検査(2,[_|_]) :- !. 同一文字同士のスワップ検査(1,[_,_|_]) :- !. 同一文字同士のスワップ検査(0,[_,_,_|_]). 整列([],[]). 整列([_軸要素|_残りならび],_整列したならび) :- 軸要素との大小で分割してそれぞれ整列する(_軸要素,_残りならび,_整列したL1,_整列したL2), append(_整列したL1,[_軸要素|_整列したL2],_整列したならび). 軸要素との大小で分割してそれぞれ整列する(_軸要素,_残りならび,_整列したL1,_整列したL2) :- 分割(_軸要素,_残りならび,L1,L2), 整列(L1,_整列したL1), 整列(L2,_整列したL2). 分割(_軸要素,[],[],[]). 分割(_軸要素,[A|R1],[A|R2],R3) :- 軸要素より大きい時は(_軸要素,A,R1,R2,R3). 分割(_軸要素,[A|R1],[A|R2],R3) :- 軸要素と等しいか小さい時は(_軸要素,A,R1,R2,R3). 軸要素より大きい時は(_軸要素,A,R1,R2,R3) :- _軸要素 @< A, 分割(_軸要素,R1,R2,R3). 軸要素と等しいか小さい時は(_軸要素,A,R1,R2,R3) :- _軸要素 @>= A, 分割(_軸要素,R1,R2,R3). 標準入力から二つの文字列を得る(A,B) :- 標準入力から文字列を得る(A), 標準入力から文字列を得る(B). 標準入力から文字列を得る(_文字列) :- findall(_文字,( 一文字を得る(_文字), (終了文字(_文字),!,fail;true)),_文字ならび), atom_chars(_文字列,_文字ならび). 一文字を得る(_文字) :- get_char(_文字). 一文字を得る(_文字) :- 一文字を得る(_文字). 終了文字('\n'). 終了文字(end_of_file). % 以下のサイトは # 11 で割り切れる数には、奇数桁の数の和と、偶数桁の数の和を比べると、差が 11 の倍数になっている、という性質があります。この際、一の位を 1 桁目、十の位を 2 桁目、というように、小さい数字から数えていくことに注意してください。 # # 例えば、 7392 という数字について、偶数桁に存在する数字は、 2 桁目の 9 と、 4 桁目の 7 であり、その和は 16です。 奇数桁に存在する数字は、 1 桁目の 2 と、 3 桁目の 3 であり、この和は 5 です。 16 と 5 の差は 11 であり、上記の性質を満たします。 # # あなたは、 与えられた整数が、 11 の倍数であるかどうか調べたいです。そのため、偶数桁の数の和と、奇数桁の数の和を求めようと思っています。この 2 つの値を出力するプログラムを書いてください。 'あなたは、 与えられた整数が、 11 の倍数であるかどうか調べたいです。そのため、偶数桁の数の和と、奇数桁の数の和を求めようと思っています。この 2 つの値を出力するプログラムを書いてください。' :- 標準入力から整数を得る(_与えられた整数), '偶数桁の数の和と、奇数桁の数の和を求めよう'(_与えられた整数,0,0,_偶数桁の和,_奇数桁の和), 出力する(_与えられた整数,_奇数桁の和,_偶数桁の和). '偶数桁の数の和と、奇数桁の数の和を求めよう'(0,S_1,S_2,S_1,S_2) :- !. '偶数桁の数の和と、奇数桁の数の和を求めよう'(N,S_1_1,S_2_1,S_1,S_2) :- D is N // 10, S_2_2 is S_2_1 + N mod 10, '偶数桁の数の和と、奇数桁の数の和を求めよう'(D,S_2_2,S_1_1,S_2,S_1). 出力する(_偶数桁の和,_奇数桁の和) :- writef('%t %t\n',[_偶数桁の和,_奇数桁の和]). 標準入力から整数を得る(_整数) :- 標準入力から数字ならびを得る(_数字ならび), 数字ならびを整数に変換する(_数字ならび,_整数). 標準入力から数字ならびを得る(_数字ならび) :- findall(_数字,( 一文字入力(_数字),(改行またはEOF(_数字),!,fail;'10進数字'(_数字))), _数字ならび). 一文字入力(_文字) :- get_char(_文字). 一文字入力(_文字) :- 一文字入力(_文字). 改行またはEOF('\n'). 改行またはEOF(end_of_file). '10進数字'(_数字) :- member(_数字,['0','1','2','3','4','5','6','7','8','9','-','+','.']). 数字ならびを整数に変換する(_数字ならび,_整数) :- atom_chars(_数字文字列,_数字ならび), catch(read_term_from_atom(_数字文字列,_整数,[]),E,fail). integer(_整数). % 以下のサイトは # サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 # # 今、サイコロの上の面に書かれている数字が、 A であることが解っています。 # # この対面にある、底面に書かれた数字を出力してください。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # A # 1 行目には、サイコロの上の面に書かれている数字を表す 1 つの整数 A(1≦A≦6) が与えられる。 # 出力 # サイコロの底の面に書かれている数字を 1 行で出力せよ。出力の末尾には改行をいれること。 # # 入力例1 # 6 # 出力例1 # 1 # 6 の裏に書かれている数字は 1 です。 # # 入力例2 # 3 # 出力例2 # 4 # :- dynamic(対面にある数字/2). 'サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 今、サイコロの上の面に書かれている数字が、 A であることが解っています。 この対面にある、底面に書かれた数字を出力してください。' :- 'サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。', '今、サイコロの上の面に書かれている数字が、 A であることが解っています。'(_A), 'この対面にある、底面に書かれた数字を'(_A,_対面にある底面に書かれた数字), 出力してください(_対面にある底面に書かれた数字). 'サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。' :- ' 1 から 6 までの数字が一つずつ書かれており、'(_1から6までの数字), 対面の和が 7 になるように作られています。'(_1から6までの数字). ' 1 から 6 までの数字が一つずつ書かれており、'(_1から6までの数字) :- between(1,6,_1から6までの数字). '対面の和が 7 になるように作られています。'(_1から6までの数字) :- '対面の和が 7 に'(_1から6までの数字,_対面にある数字), 'なるように作られています。'(_1から6までの数字,_対面にある数字). '対面の和が 7 に'(_1から6までの数字,_対面にある数字) :- length(L1,_1から6までの数字), length(_対面の和を表すならび,7), append(L1,L2,_対面の和を表すならび), length(L2,_対面にある数字). 'なるように作られています。'(_1から6までの数字,_対面にある数字) :- assertz(対面にある数字(_1から6までの数字,_対面にある数字)). '今、サイコロの上の面に書かれている数字が、 A であることが解っています。'(_A) :- 標準入力から整数を得る(_A). 'この対面にある、底面に書かれた数字を'(_A,_対面にある底面に書かれた数字) :- 対面にある数字(_A,_対面にある底面に書かれた数字). 出力してください(_対面にある底面に書かれた数字) :- writef('%t\n',[_対面にある底面に書かれた数字]). 標準入力から整数を得る(_A) :- 標準入力から文字列を得る(_文字列), 整数入力検査(_文字列,_整数),!. 整数入力検査(_文字列,_整数) :- catch(read_term_from_atom(_文字列,_整数,[]),E,fail), integer(_整数),!. 標準入力から文字列を得る(_文字列) :- findall(_文字,( 標準入力から一文字を得る(_文字), (入力終了文字(_文字),!,fail;true)),Chars), atom_chars(_文字列,Chars). 標準入力から一文字を得る(_文字) :- get_char(_文字). 標準入力から一文字を得る(_文字) :- 標準入力から一文字を得る(_文字). 入力終了文字('\n'). 入力終了文字(end_of_file). % 以下のサイトは # サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 # # 今、サイコロの上の面に書かれている数字が、 A であることが解っています。 # # この対面にある、底面に書かれた数字を出力してください。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # A # 1 行目には、サイコロの上の面に書かれている数字を表す 1 つの整数 A(1≦A≦6) が与えられる。 # 出力 # サイコロの底の面に書かれている数字を 1 行で出力せよ。出力の末尾には改行をいれること。 # # 入力例1 # 6 # 出力例1 # 1 # 6 の裏に書かれている数字は 1 です。 # # 入力例2 # 3 # 出力例2 # 4 # 'サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 今、サイコロの上の面に書かれている数字が、 A であることが解っています。 この対面にある、底面に書かれた数字を出力してください。' :- '今、サイコロの上の面に書かれている数字が、 A であることが解っています。'(_A), 'このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 この対面にある、底面に書かれた数字を'(_A,_対面にある底面に書かれた数字), 出力してください(_対面にある底面に書かれた数字). '今、サイコロの上の面に書かれている数字が、 A であることが解っています。'(_A) :- 標準入力から整数を得る(_A). 'このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 この対面にある、底面に書かれた数字を'(_A,_対面にある底面に書かれた数字) :- length(L1,_A), length(L2,_対面にある底面に書かれた数字), length(_対面の和を表すならび,7), append(L1,L2,_対面の和を表すならび). 出力してください(_対面にある底面に書かれた数字) :- writef('%t\n',[_対面にある底面に書かれた数字]). 標準入力から整数を得る(_A) :- 標準入力から文字列を得る(_文字列), 整数入力検査(_文字列,_整数),!. 整数入力検査(_文字列,_整数) :- catch(read_term_from_atom(_文字列,_整数,[]),E,fail), integer(_整数),!. 標準入力から文字列を得る(_文字列) :- findall(_文字,( 標準入力から一文字を得る(_文字), (入力終了文字(_文字),!,fail;true)),Chars), atom_chars(_文字列,Chars). 標準入力から一文字を得る(_文字) :- get_char(_文字). 標準入力から一文字を得る(_文字) :- 標準入力から一文字を得る(_文字). 入力終了文字('\n'). 入力終了文字(end_of_file). % 以下のサイトは # # あなたは既に読んでしまった札を記憶していることにします。 # まだ読まれていない、読み札も分かっていることとします。 # 読み札/2、既に読んでしまった札/2、自陣/1、敵陣/1がそれぞれ # 述語としして定義済みだとして、自陣、敵陣、あるいはその両方の札の # 決まり字を示すプログラムを定義してください。 # :- dynamic(読み札/1). :- dynamic(既に読んでしまった札/1). :- dynamic(自陣/1). :- dynamic(敵陣/1). 自陣または敵陣の全ての札の決まり字(_下の句,_上の句,_決まり字) :- 自陣または敵陣(_下の句), 読み札(_上の句,_下の句), 決まり字(_上の句,_決まり字). 自陣の札の決まり字(_下の句,_上の句,_決まり字) :- 自陣(_下の句), 読み札(_上の句,_下の句), 決まり字(_上の句,_決まり字). 敵陣の札の決まり字(_下の句,_上の句,_決まり字) :- 敵陣(_下の句), 読み札(_上の句,_下の句), 決まり字(_上の句,_決まり字). 決まり字(_上の句,_決まり字) :- 最長共通文字数(_上の句,_最長共通文字数), succ(_最長共通文字数,_決まり字の位置), sub_atom(_上の句,0,_決まり時の位置,_,_決まり字). 最長共通文字数(_上の句,_最長共通文字数) :- findmax(_先頭から最長共通文字数,( 対象としている上の句とは別の上の句を読み札から得る(_上の句,_別の上の句), '先頭から最長共通文字数(0オリジン)'(_上の句,別の上の句,_先頭からの最長共通文字数)),_最長共通文字数). 対象としている上の句とは別の上の句を読み札から得る(_上の句,_別の上の句) :- 読み札(_別の上の句,_), \+(_上の句 = _別の上の句). '先頭から最長共通文字数(0オリジン)'(_上の句,_別の上の句,_文字数) :- nth0(_文字数,_,_), sub_atom(_上の句,_文字数,1,_,_文字_1), sub_atom(_別の上の句,_文字数,1,_,_文字_2), \+(_文字_1=_文字_2),!. 下の句から決まり字を得る(_下の句,_決まり字) :- 自陣または敵陣(_下の句), '下の句から上の句を得る'(_下の句,_上の句), 決まり字(_上の句,_決まり字). 自陣または敵陣(_下の句) :- 自陣(_下の句). 自陣または敵陣(_下の句) :- 敵陣(_下の句). 下の句から上の句を得る(_下の句,_上の句) :- 読み札(_上の句,_下の句). findmax(_値,_目標,_最大値) :- findall(_値,_目標,_値ならび), 最大値(_値ならび,_最大値). 最大値(_標本ならび,_最大値) :- select(_最大値,_標本ならび,_残り標本ならび), forall(member(_標本_1,_残り標本ならび),_標本_1 @=< _最大値),!. /* 読み札('あきのたのかりほのいほのとまをあらみ,わがころもではつゆにぬれつつ'). 読み札('はるすぎてなつきにけらししろたへの,ころもほすてふあまのかぐやま'). 読み札('あしびきのやまどりのをのしだりをの,ながながしよをひとりかもねむ'). 読み札('たごのうらにうちいでてみればしろたへの,ふじのたかねにゆきはふりつつ'). 読み札('おくやまにもみぢふみわけなくしかの,こゑきくときぞあきはかなしき'). 読み札('かささぎのわたせるはしにおくしもの,しろきをみればよぞふけにける'). 読み札('あまのはらふりさけみればかすがなる,みかさのやまにいでしつきかも'). 読み札('わがいほはみやこのたつみしかぞすむ,よをうぢやまとひとはいふなり'). 読み札('はなのいろはうつりにけりないたづらに,わがみよにふるながめせしまに'). 読み札('これやこのゆくもかへるもわかれては,しるもしらぬもあふさかのせき'). 読み札('わたのはらやそしまかけてこぎいでぬと,ひとにはつげよあまのつりぶね'). 読み札('あまつかぜくものかよひぢふきとぢよ,をとめのすがたしばしとどめむ'). 読み札('つくばねのみねよりおつるみなのがは,こひぞつもりてふちとなりぬる'). 読み札('みちのくのしのぶもぢずりたれゆゑに,みだれそめにしわれならなくに'). 読み札('きみがためはるののにいでてわかなつむ,わがころもでにゆきはふりつつ'). 読み札('たちわかれいなばのやまのみねにおふる,まつとしきかばいまかへりこむ'). 読み札('ちはやぶるかみよもきかずたつたがは,からくれなゐにみづくくるとは'). 読み札('すみのえのきしによるなみよるさへや,ゆめのかよひぢひとめよくらむ'). 読み札('なにはがたみじかきあしのふしのまも,あはでこのよをすぐしてよとや'). 読み札('わびぬればいまはたおなじなにはなる,みをつくしてもあはむとぞおもふ'). 読み札('いまこむといひしばかりにながつきの,ありあけのつきをまちいでつるかな'). 読み札('ふくからにあきのくさきのしをるれば,むべやまかぜをあらしといふらむ'). 読み札('つきみればちぢにものこそかなしけれ,わがみひとつのあきにはあらねど'). 読み札('このたびはぬさもとりあへずたむけやま,もみぢのにしきかみのまにまに'). 読み札('なにしおはばあふさかやまのさねかづら,ひとにしられでくるよしもがな'). 読み札('をぐらやまみねのもみぢばこころあらば,いまひとたびのみゆきまたなむ'). 読み札('みかのはらわきてながるるいづみがは,つみきとてかこひしかるらむ'). 読み札('やまざとはふゆぞさびしさまさりける,ひとめもくさもかれぬとおもへば'). 読み札('こころあてにをらばやをらむはつしもの,おきまどはせるしらぎくのはな'). 読み札('ありあけのつれなくみえしわかれより,あかつきばかりうきものはなし'). 読み札('あさぼらけありあけのつきとみるまでに,よしののさとにふれるしらゆき'). 読み札('やまがはにかぜのかけたるしがらみは,ながれもあへぬもみぢなりけり'). 読み札('ひさかたのひかりのどけきはるのひに,しづごころなくはなのちるらむ'). 読み札('たれをかもしるひとにせむたかさごの,まつもむかしのともならなくに'). 読み札('ひとはいさこころもしらずふるさとは,はなぞむかしのかににほひける'). 読み札('なつのよはまだよひながらあけぬるを,くものいづこにつきやどるらむ'). 読み札('しらつゆにかぜのふきしくあきののは,つらぬきとめぬたまぞちりける'). 読み札('わすらるるみをばおもはずちかひてし,ひとのいのちのをしくもあるかな'). 読み札('あさぢふのをののしのはらしのぶれど,あまりてなどかひとのこひしき'). 読み札('しのぶれどいろにいでにけりわがこひは,ものやおもふとひとのとふまで'). 読み札('こひすてふわがなはまだきたちにけり,ひとしれずこそおもひそめしか'). 読み札('ちぎりきなかたみにそでをしぼりつつ,すゑのまつやまなみこさじとは'). 読み札('あひみてののちのこころにくらぶれば,むかしはものをおもはざりけり'). 読み札('あふことのたえてしなくはなかなかに,ひとをもみをもうらみざらまし'). 読み札('あはれともいふべき人はおもほえで,みのいたづらになりぬべきかな'). 読み札('ゆらのとをわたるふなびとかぢをたえ,ゆくへもしらぬこひのみちかな'). 読み札('やへむぐらしげれるやどのさびしきに,ひとこそみえねあきはきにけり'). 読み札('かぜをいたみいはうつなみのおのれのみ,くだけてものをおもふころかな'). 読み札('みかきもりゑじのたくひのよるはもえ,ひるはきえつつものをこそおもへ'). 読み札('きみがためをしからざりしいのちさへ,ながくもがなとおもひけるかな'). 読み札('かくとだにえやはいぶきのさしもぐさ,さしもしらじなもゆるおもひを'). 読み札('あけぬればくるるものとはしりながら,なほうらめしきあさぼらけかな'). 読み札('なげきつつひとりぬるよのあくるまは,いかにひさしきものとかはしる'). 読み札('わすれじのゆくすゑまではかたければ,けふをかぎりのいのちともがな'). 読み札('たきのおとはたえてひさしくなりぬれど,なこそながれてなほきこえけれ'). 読み札('あらざらむこのよのほかのおもひでに,いまひとたびのあふこともがな'). 読み札('めぐりあひてみしやそれともわかぬまに,くもがくれにしよはのつきかな'). 読み札('ありまやまゐなのささはらかぜふけば,いでそよひとをわすれやはする'). 読み札('やすらはでねなましものをさよふけて,かたぶくまでのつきをみしかな'). 読み札('おほえやまいくののみちのとほければ,まだふみもみずあまのはしだて'). 読み札('いにしへのならのみやこのやへざくら,けふここのへににほひぬるかな'). 読み札('よをこめてとりのそらねははかるとも,よにあふさかのせきはゆるさじ'). 読み札('いまはただおもひたえなむとばかりを,ひとづてならでいふよしもがな'). 読み札('あさぼらけうぢのかはぎりたえだえに,あらはれわたるせぜのあじろぎ'). 読み札('うらみわびほさぬそでだにあるものを,こひにくちなむなこそをしけれ'). 読み札('もろともにあはれとおもへやまざくら,はなよりほかにしるひともなし'). 読み札('はるのよのゆめばかりなるたまくらに,かひなくたたむなこそをしけれ'). 読み札('こころにもあらでうきよにながらへば,こひしかるべきよはのつきかな'). 読み札('あらしふくみむろのやまのもみぢばは,たつたのかはのにしきなりけり'). 読み札('さびしさにやどをたちいでてながむれば,いづこもおなじあきのゆふぐれ'). 読み札('ゆふさればかどたのいなばおとづれて,あしのまろやにあきかぜぞふく'). 読み札('おとにきくたかしのはまのあだなみは,かけじやそでのぬれもこそすれ'). 読み札('たかさごのをのへのさくらさきにけり,とやまのかすみたたずもあらなむ'). 読み札('うかりけるひとをはつせのやまおろしよ,はげしかれとはいのらぬものを'). 読み札('ちぎりおきしさせもがつゆをいのちにて,あはれことしのあきもいぬめり'). 読み札('わたのはらこぎいでてみればひさかたの,くもゐにまがふおきつしらなみ'). 読み札('せをはやみいはにせかるるたきがはの,われてもすゑにあはむとぞおもふ'). 読み札('あはぢしまかよふちどりのなくこゑに,いくよねざめぬすまのせきもり'). 読み札('あきかぜにたなびくくものたえまより,もれいづるつきのかげのさやけさ'). 読み札('ながからむこころもしらずくろかみの,みだれてけさはものをこそおもへ'). 読み札('ほととぎすなきつるかたをながむれば,ただありあけのつきぞのこれる'). 読み札('おもひわびさてもいのちはあるものを,うきにたへぬはなみだなりけり'). 読み札('よのなかよみちこそなけれおもひいる,やまのおくにもしかぞなくなる'). 読み札('ながらへばまたこのごろやしのばれむ,うしとみしよぞいまはこひしき'). 読み札('よもすがらものおもふころはあけやらで,ねやのひまさへつれなかりけり'). 読み札('なげけとてつきやはものをおもはする,かこちがほなるわがなみだかな'). 読み札('むらさめのつゆもまだひぬまきのはに,きりたちのぼるあきのゆふぐれ'). 読み札('なにはえのあしのかりねのひとよゆゑ,みをつくしてやこひわたるべき'). 読み札('たまのをよたえなばたえねながらへば,しのぶることのよわりもぞする'). 読み札('みせばやなをじまのあまのそでだにも,ぬれにぞぬれしいろはかはらず'). 読み札('きりぎりすなくやしもよのさむしろに,ころもかたしきひとりかもねむ'). 読み札('わがそではしほひにみえぬおきのいしの,ひとこそしらねかわくまもなし'). 読み札('よのなかはつねにもがもななぎさこぐ,あまのをぶねのつなでかなしも'). 読み札('みよしののやまのあきかぜさよふけて,ふるさとさむくころもうつなり'). 読み札('おほけなくうきよのたみにおほふかな,わがたつそまにすみぞめのそで'). 読み札('はなさそふあらしのにはのゆきならで,ふりゆくものはわがみなりけり'). 読み札('こぬひとをまつほのうらのゆふなぎに,やくやもしほのみもこがれつつ'). 読み札('かぜそよぐならのをがはのゆふぐれは,みそぎぞなつのしるしなりける'). 読み札('ひともをしひともうらめしあぢきなく,よをおもふゆゑにものおもふみは'). 読み札('ももしきやふるきのきばのしのぶにも,なほあまりあるむかしなりけり'). */ % 以下のサイトは # # あなたは既に読んでしまった札を記憶していることにします。 # 現在の自陣にある札のうち、一文字目が決まり字である札は何枚あるでしょうか。 # '現在の自陣にある札のうち、一文字目が決まり字である札は何枚あるでしょうか。'(_まだ読んでいない札,_既に読んでしまった札,_自陣にある札ならび,_何枚) :- 自陣の札の上の句の先頭の文字の未出の読み札数(_まだ読んでいない札,_既に読んでしまった札,_自陣にある札ならび,_度数ならび), 目標の度数(member(1,_度数ならび),_何枚). 自陣の札の上の句の先頭の文字の未出の読み札数(_,_,[],[]). 自陣の札の上の句の先頭の文字の未出の読み札数(_まだ読んでいない札,_既に読んでしまった札,[_下の句|R1],[_度数|R2]) :- 下の句から上の句の先頭の文字を得る(_下の句,_上の句の先頭文字), 上の句の先頭の文字の度数を得る(_まだ読んでいない札,_既に読んでしまった札,_上の句の先頭の文字,_度数), 自陣の札の上の句の先頭の文字の未出の読み札数(_まだ読んでいない札,_既に読んでしまった札,R1,R2). 下の句から上の句の先頭の文字を得る(_下の句,_上の句の先頭の文字) :- 百人一首(_歌), '上の句と下の句'(_歌,_上の句,_下の句), '上の句の先頭の文字、下の句の先頭の文字'(_歌,_,_,_上の句の先頭の文字,_). '上の句と下の句'(_歌,_上の句,_下の句) :- sub_atom(_歌,S,1,R,' '), sub_atom(_歌,_,R,0,_下の句), 目標の度数(sub_atom(_下の句,_,1,_,' ')),1), sub_atom(_歌,0,S,_,_上の句). '上の句の先頭の文字、下の句の先頭の文字'(_歌,_上の句,_下の句,_上の句の先頭の文字,_下の句の先頭の文字) :- '上の句と下の句'(_歌,_上の句,_下の句), sub_atom(_上の句,0,1,_,_上の句の先頭の文字), sub_atom(_下の句,0,1,_,_下の句の先頭の文字). 上の句の先頭の文字の度数を得る(_既に読んでしまった札,_上の句の先頭の文字,_度数) :- 目標の度数(上の句の先頭の文字の(_上の句の先頭の文字),_度数). 上の句の先頭の文字の(_上の句の先頭の文字) :- 百人一首(_歌), \+(member(_歌,_既に読んでしまった札)), sub_atom(_歌,0,1,_,_上の句の先頭の文字). 百人一首('あきのたの かりほのいほの とまをあらみ わがころもでは つゆにぬれつつ'). 百人一首('はるすぎて なつきにけらし しろたへの ころもほすてふ あまのかぐやま'). 百人一首('あしびきの やまどりのをの しだりをの ながながしよを ひとりかもねむ'). 百人一首('たごのうらに うちいでてみれば しろたへの ふじのたかねに ゆきはふりつつ'). 百人一首('おくやまに もみぢふみわけ なくしかの こゑきくときぞ あきはかなしき'). 百人一首('かささぎの わたせるはしに おくしもの しろきをみれば よぞふけにける'). 百人一首('あまのはら ふりさけみれば かすがなる みかさのやまに いでしつきかも'). 百人一首('わがいほは みやこのたつみ しかぞすむ よをうぢやまと ひとはいふなり'). 百人一首('はなのいろは うつりにけりな いたづらに わがみよにふる ながめせしまに'). 百人一首('これやこの ゆくもかへるも わかれては しるもしらぬも あふさかのせき'). 百人一首('わたのはら やそしまかけて こぎいでぬと ひとにはつげよ あまのつりぶね'). 百人一首('あまつかぜ くものかよひぢ ふきとぢよ をとめのすがた しばしとどめむ'). 百人一首('つくばねの みねよりおつる みなのがは こひぞつもりて ふちとなりぬる'). 百人一首('みちのくの しのぶもぢずり たれゆゑに みだれそめにし われならなくに'). 百人一首('きみがため はるののにいでて わかなつむ わがころもでに ゆきはふりつつ'). 百人一首('たちわかれ いなばのやまの みねにおふる まつとしきかば いまかへりこむ'). 百人一首('ちはやぶる かみよもきかず たつたがは からくれなゐに みづくくるとは'). 百人一首('すみのえの きしによるなみ よるさへや ゆめのかよひぢ ひとめよくらむ'). 百人一首('なにはがた みじかきあしの ふしのまも あはでこのよを すぐしてよとや'). 百人一首('わびぬれば いまはたおなじ なにはなる みをつくしても あはむとぞおもふ'). 百人一首('いまこむと いひしばかりに ながつきの ありあけのつきを まちいでつるかな'). 百人一首('ふくからに あきのくさきの しをるれば むべやまかぜを あらしといふらむ'). 百人一首('つきみれば ちぢにものこそ かなしけれ わがみひとつの あきにはあらねど'). 百人一首('このたびは ぬさもとりあへず たむけやま もみぢのにしき かみのまにまに'). 百人一首('なにしおはば あふさかやまの さねかづら ひとにしられで くるよしもがな'). 百人一首('をぐらやま みねのもみぢば こころあらば いまひとたびの みゆきまたなむ'). 百人一首('みかのはら わきてながるる いづみがは いつみきとてか こひしかるらむ'). 百人一首('やまざとは ふゆぞさびしさ まさりける ひとめもくさも かれぬとおもへば'). 百人一首('こころあてに をらばやをらむ はつしもの おきまどはせる しらぎくのはな'). 百人一首('ありあけの つれなくみえし わかれより あかつきばかり うきものはなし'). 百人一首('あさぼらけ ありあけのつきと みるまでに よしののさとに ふれるしらゆき'). 百人一首('やまがはに かぜのかけたる しがらみは ながれもあへぬ もみぢなりけり'). 百人一首('ひさかたの ひかりのどけき はるのひに しづごころなく はなのちるらむ'). 百人一首('たれをかも しるひとにせむ たかさごの まつもむかしの ともならなくに'). 百人一首('ひとはいさ こころもしらず ふるさとは はなぞむかしの かににほひける'). 百人一首('なつのよは まだよひながら あけぬるを くものいづこに つきやどるらむ'). 百人一首('しらつゆに かぜのふきしく あきののは つらぬきとめぬ たまぞちりける'). 百人一首('わすらるる みをばおもはず ちかひてし ひとのいのちの をしくもあるかな'). 百人一首('あさぢふの をののしのはら しのぶれど あまりてなどか ひとのこひしき'). 百人一首('しのぶれど いろにいでにけり わがこひは ものやおもふと ひとのとふまで'). 百人一首('こひすてふ わがなはまだき たちにけり ひとしれずこそ おもひそめしか'). 百人一首('ちぎりきな かたみにそでを しぼりつつ すゑのまつやま なみこさじとは'). 百人一首('あひみての のちのこころに くらぶれば むかしはものを おもはざりけり'). 百人一首('あふことの たえてしなくは なかなかに ひとをもみをも うらみざらまし'). 百人一首('あはれとも いふべき人は 思ほえで 身のいたづらに なりぬべきかな'). 百人一首('ゆらのとを わたるふなびと かぢをたえ ゆくへもしらぬ こひのみちかな'). 百人一首('やへむぐら しげれるやどの さびしきに ひとこそみえね あきはきにけり'). 百人一首('かぜをいたみ いはうつなみの おのれのみ くだけてものを おもふころかな'). 百人一首('みかきもり ゑじのたくひの よるはもえ ひるはきえつつ ものをこそおもへ'). 百人一首('きみがため をしからざりし いのちさへ ながくもがなと おもひけるかな'). 百人一首('かくとだに えやはいぶきの さしもぐさ さしもしらじな もゆるおもひを'). 百人一首('あけぬれば くるるものとは しりながら なほうらめしき あさぼらけかな'). 百人一首('なげきつつ ひとりぬるよの あくるまは いかにひさしき ものとかはしる'). 百人一首('わすれじの ゆくすゑまでは かたければ けふをかぎりの いのちともがな'). 百人一首('たきのおとは たえてひさしく なりぬれど なこそながれて なほきこえけれ'). 百人一首('あらざらむ このよのほかの おもひでに いまひとたびの あふこともがな'). 百人一首('めぐりあひて みしやそれとも わかぬまに くもがくれにし よはのつきかな'). 百人一首('ありまやま ゐなのささはら かぜふけば いでそよひとを わすれやはする'). 百人一首('やすらはで ねなましものを さよふけて かたぶくまでの つきをみしかな'). 百人一首('おほえやま いくののみちの とほければ まだふみもみず あまのはしだて'). 百人一首('いにしへの ならのみやこの やへざくら けふここのへに にほひぬるかな'). 百人一首('よをこめて とりのそらねは はかるとも よにあふさかの せきはゆるさじ'). 百人一首('いまはただ おもひたえなむ とばかりを ひとづてならで いふよしもがな'). 百人一首('あさぼらけ うぢのかはぎり たえだえに あらはれわたる せぜのあじろぎ'). 百人一首('うらみわび ほさぬそでだに あるものを こひにくちなむ なこそをしけれ'). 百人一首('もろともに あはれとおもへ やまざくら はなよりほかに しるひともなし'). 百人一首('はるのよの ゆめばかりなる たまくらに かひなくたたむ なこそをしけれ'). 百人一首('こころにも あらでうきよに ながらへば こひしかるべき よはのつきかな'). 百人一首('あらしふく みむろのやまの もみぢばは たつたのかはの にしきなりけり'). 百人一首('さびしさに やどをたちいでて ながむれば いづこもおなじ あきのゆふぐれ'). 百人一首('ゆふされば かどたのいなば おとづれて あしのまろやに あきかぜぞふく'). 百人一首('おとにきく たかしのはまの あだなみは かけじやそでの ぬれもこそすれ'). 百人一首('たかさごの をのへのさくら さきにけり とやまのかすみ たたずもあらなむ'). 百人一首('うかりける ひとをはつせの やまおろしよ はげしかれとは いのらぬものを'). 百人一首('ちぎりおきし させもがつゆを いのちにて あはれことしの あきもいぬめり'). 百人一首('わたのはら こぎいでてみれば ひさかたの くもゐにまがふ おきつしらなみ'). 百人一首(' せをはやみ いはにせかるる たきがはの われてもすゑに あはむとぞおもふ'). 百人一首('あはぢしま かよふちどりの なくこゑに いくよねざめぬ すまのせきもり'). 百人一首('あきかぜに たなびくくもの たえまより もれいづるつきの かげのさやけさ'). 百人一首('ながからむ こころもしらず くろかみの みだれてけさは ものをこそおもへ'). 百人一首('ほととぎす なきつるかたを ながむれば ただありあけの つきぞのこれる'). 百人一首('おもひわび さてもいのちは あるものを うきにたへぬは なみだなりけり'). 百人一首('よのなかよ みちこそなけれ おもひいる やまのおくにも しかぞなくなる'). 百人一首('ながらへば またこのごろや しのばれむ うしとみしよぞ いまはこひしき'). 百人一首('よもすがら ものおもふころは あけやらで ねやのひまさへ つれなかりけり'). 百人一首('なげけとて つきやはものを おもはする かこちがほなる わがなみだかな'). 百人一首('むらさめの つゆもまだひぬ まきのはに きりたちのぼる あきのゆふぐれ'). 百人一首('なにはえの あしのかりねの ひとよゆゑ みをつくしてや こひわたるべき'). 百人一首('たまのをよ たえなばたえね ながらへば しのぶることの よわりもぞする'). 百人一首('みせばやな をじまのあまの そでだにも ぬれにぞぬれし いろはかはらず'). 百人一首('きりぎりす なくやしもよの さむしろに ころもかたしき ひとりかもねむ'). 百人一首('わがそでは しほひにみえぬ おきのいしの ひとこそしらね かわくまもなし'). 百人一首('よのなかは つねにもがもな なぎさこぐ あまのをぶねの つなでかなしも'). 百人一首('みよしのの やまのあきかぜ さよふけて ふるさとさむく ころもうつなり'). 百人一首('おほけなく うきよのたみに おほふかな わがたつそまに すみぞめのそで'). 百人一首('はなさそふ あらしのにはの ゆきならで ふりゆくものは わがみなりけり'). 百人一首('こぬひとを まつほのうらの ゆふなぎに やくやもしほの みもこがれつつ'). 百人一首('かぜそよぐ ならのをがはの ゆふぐれは みそぎぞなつの しるしなりける'). 百人一首('ひともをし ひともうらめし あぢきなく よをおもふゆゑに ものおもふみは'). 百人一首('ももしきや ふるきのきばの しのぶにも なほあまりある むかしなりけり'). 目標の度数(_目標,_度数) :- findall(1,_目標,L), length(L,_度数). % 以下のサイトは # 問題文 # ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! # でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 # さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 # 「うーむ、どうしたものか……ハッ!」 # 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。 # そうと決まれば、 身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算してくれるプログラムを有能プログラマーである君に作ってもらいたい。 # # # ※ BMI[kg?m2] とは、ボディマス指数と呼ばれるもので、以下の計算式で与えられる。ただし、Height と Weight はそれぞれ身長と体重のことである。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # Height BMI # Height(120.0≦Height≦200.0) は、プログラムに与えられる身長[cm]を表す実数である。小数点第 1 位まで与えられる。 # BMI(10.0≦BMI≦40.0) は、プログラムに与えられる BMI[kg?m2] を表す実数である。小数点第 1 位まで与えられる。 # 出力 # 入力に基づいて逆算した 体重 [kg] を一行に出力せよ。 # 出力は絶対誤差が 10−2 以下であれば許容される。 # なお、出力の最後には改行を入れること。 'ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 「うーむ、どうしたものか……ハッ!」 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。' :- 標準入力から身長とBMIを得る(_身長,_BMI), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(0.0,200.0,_身長,_BMI,_体重), format('~1f\n',[_体重]). 標準入力から身長とBMIを得る(_身長,_BMI) :- 文字列を得る(_文字列), split(_文字列,[' '],[_身長文字列,_BMI文字列]), get_term_from_atom(_身長文字列,_身長,[]), get_term_from_atom(_BMI文字列,_BMI,[]). '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_体重_下,_体重_上,_身長,_BMI,_体重) :- 収束条件を満たす(_体重_下,_体重_上,_体重),!. '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_体重_下,_体重_上,_身長,_BMI,_体重) :- '新しい体重とその時のBMIを計算して、次の体重の計算区間を得る'(_体重_下_1,_体重_上_1,_体重_2,_BMI,_BMI_2,_体重_下,_体重_上), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_体重_下,_体重_上,_身長,_BMI,_体重). 収束条件を満たす(_体重_下,_体重_上,_体重) :- (_体重_上 - _体重_下) < 0.1, _体重 is (_体重_上 + _体重_下) / 2. '新しい体重とその時のBMIを計算して、次の体重の計算区間を得る'(_体重_下_1,_体重_上_1,_BMI,_体重_下,_体重_上) :- '新しい体重とその時のBMIを計算する'(_体重_下_1,_体重_上_1,_BMI_2,_体重_2), '次の体重の計算区間を得る'(_体重_下_1,_体重_上_1,_体重_2,_BMI,_BMI_2,_体重_下,_体_上). '新しい体重とその時のBMIを計算する'(_体重_下,_体重_上,_BMI_2,_体重_2) :- _体重_2 is (_体重_下 + _体重_上) / 2, _BMI_2 is _体重_2 / ((_身長 / 100) ^ 2). '次の体重の計算区間を得る'(_体重_下_1,_体重_上_1,_体重_2,_BMI,_BMI_2,_体重_下,_体_2) :- _BMI_2 =< _BMI,!. '次の体重の計算区間を得る'(_体重_下,_体重_上,_体重_3,_BMI,_BMI_2,_体重_2,_体重_上). 文字列を得る(_文字列) :- findall(_文字,(repeat,get_char(_文字),(_文字=end_of_file,!,fail;_文字='\n',!,fail;true)),L), atomic_list_concat(L,_文字列). 文字列を区切り文字列で分ける(_文字列,_区切り文字列候補,[_前文字列|R]) :- 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列), 文字列を区切り文字列で分ける(_後文字列,_区切り文字列候補,R),!. 文字列を区切り文字列で分ける(_文字列,_,[_文字列]). 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列) :- 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R), 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列). 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R) :- sub_atom(_文字列,S,Len,R,_区切り文字列), member(_区切り文字列,_区切り文字列候補). 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列),!. % 以下のサイトは # 問題文 # ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! # でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 # さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 # 「うーむ、どうしたものか……ハッ!」 # 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。 # そうと決まれば、 身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算してくれるプログラムを有能プログラマーである君に作ってもらいたい。 # # # ※ BMI[kg?m2] とは、ボディマス指数と呼ばれるもので、以下の計算式で与えられる。ただし、Height と Weight はそれぞれ身長と体重のことである。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # Height BMI # Height(120.0≦Height≦200.0) は、プログラムに与えられる身長[cm]を表す実数である。小数点第 1 位まで与えられる。 # BMI(10.0≦BMI≦40.0) は、プログラムに与えられる BMI[kg?m2] を表す実数である。小数点第 1 位まで与えられる。 # 出力 # 入力に基づいて逆算した 体重 [kg] を一行に出力せよ。 # 出力は絶対誤差が 10−2 以下であれば許容される。 # なお、出力の最後には改行を入れること。 'ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 「うーむ、どうしたものか……ハッ!」 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。' :- 標準入力から身長とBMIを得る(_身長,_BMI), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_身長,_BMI,_体重), format('~1f\n',[_体重]). 標準入力から身長とBMIを得る(_身長,_BMI) :- 文字列を得る(_文字列), split(_文字列,[' '],[_身長文字列,_BMI文字列]), get_term_from_atom(_身長文字列,_身長,[]), get_term_from_atom(_BMI文字列,_BMI,[]). '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_身長,_BMI,_体重) :- '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(0,_身長,_BMI,_体重_BMIとの差ならび), 'BMIの計算差が最小のものの体重'(_体重_BMIとの差ならび,_体重). '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(2000,_身長,_BMI,[]) :- !. '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(N,_身長,_BMI,[[N,_BMI_の計算差]|R]) :- '身長、体重から、BMIの計算差を得る'(N,_身長,_BMI,N_2,_体重,_BMIの計算差), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(N_2,_身長,_BMI,R). '身長、体重から、BMIの計算差を得る'(N,_身長,_BMI,N_2,_体重,_BMIの計算差) :- _BMIの計算差 is abs((N / 10) / ((_身長 / 100) ^ 2)) - _BMI), succ(N,N_2), _体重 is N / 10. 'BMIの計算差が最小のものの体重'(_N_BMIとの差ならび,_体重) :- select([_体重,_BMIの差],_N_BMIとの差ならび,R), forall(member([_,_BMIの差_1],R),_BMIの差 =< _BMIの差_1). 文字列を得る(_文字列) :- findall(_文字,(repeat,get_char(_文字),(_文字=end_of_file,!,fail;_文字='\n',!,fail;true)),L), atomic_list_concat(L,_文字列). 文字列を区切り文字列で分ける(_文字列,_区切り文字列候補,[_前文字列|R]) :- 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列), 文字列を区切り文字列で分ける(_後文字列,_区切り文字列候補,R),!. 文字列を区切り文字列で分ける(_文字列,_,[_文字列]). 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列) :- 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R), 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列). 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R) :- sub_atom(_文字列,S,Len,R,_区切り文字列), member(_区切り文字列,_区切り文字列候補). 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列),!. % 以下のサイトは # 問題文 # ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! # でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 # さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 # 「うーむ、どうしたものか……ハッ!」 # 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。 # そうと決まれば、 身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算してくれるプログラムを有能プログラマーである君に作ってもらいたい。 # # # ※ BMI[kg?m2] とは、ボディマス指数と呼ばれるもので、以下の計算式で与えられる。ただし、Height と Weight はそれぞれ身長と体重のことである。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # Height BMI # Height(120.0≦Height≦200.0) は、プログラムに与えられる身長[cm]を表す実数である。小数点第 1 位まで与えられる。 # BMI(10.0≦BMI≦40.0) は、プログラムに与えられる BMI[kg?m2] を表す実数である。小数点第 1 位まで与えられる。 # 出力 # 入力に基づいて逆算した 体重 [kg] を一行に出力せよ。 # 出力は絶対誤差が 10−2 以下であれば許容される。 # なお、出力の最後には改行を入れること。 'ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 「うーむ、どうしたものか……ハッ!」 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。' :- 標準入力から身長とBMIを得る(_身長,_BMI), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_身長,_BMI,_体重), format('~1f\n',[_体重]). 標準入力から身長とBMIを得る(_身長,_BMI) :- 文字列を得る(_文字列), split(_文字列,[' '],[_身長文字列,_BMI文字列]), get_term_from_atom(_身長文字列,_身長,[]), get_term_from_atom(_BMI文字列,_BMI,[]). '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_身長,_BMI,_体重) :- _体重 is _BMI * (_身長 / 100) ^ 2. 文字列を得る(_文字列) :- findall(_文字,(repeat,get_char(_文字),(_文字=end_of_file,!,fail;_文字='\n',!,fail;true)),L), atomic_list_concat(L,_文字列). 文字列を区切り文字列で分ける(_文字列,_区切り文字列候補,[_前文字列|R]) :- 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列), 文字列を区切り文字列で分ける(_後文字列,_区切り文字列候補,R),!. 文字列を区切り文字列で分ける(_文字列,_,[_文字列]). 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列) :- 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R), 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列). 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R) :- sub_atom(_文字列,S,Len,R,_区切り文字列), member(_区切り文字列,_区切り文字列候補). 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列),!. % 以下のサイトは # 問題文 # 天下一王国では整数は辞書順比較で表します。入国したばかりのダイキ君はとりあえず 1000 までの整数を書き出すことにしました。 # # 1 以上 1000 以下のすべての整数を十進数で表した文字列を辞書順比較で昇順にソートして、1 行ずつ出力してください。 # # 辞書順比較について # 文字列 A に対して、 Ai で i 番目の文字を表し、 |A| で文字列 A の文字数を表すことにすると、文字列 A と文字列 B を辞書順比較で比較するとは、 # # Ai≠Bi となる最小の i (1?i?min(|A|, |B|))に対して # AiBi であれば、文字列 A は文字列 B より大きい # そのような i が存在しなければ、文字数が少ない方を小さいとする # として文字列 A と文字列 B の大小関係を決めることである。 # # 例えば、 1, 2, 11, 12, 21 を辞書順比較で昇順にソートすると 1, 11, 12, 2, 21 となる。 # # 入力 # この問題では入力は与えられない。 # # # 出力 # 1 以上 1000 以下のすべての整数を十進数で表した文字列を辞書順比較で昇順にソートして、1 行ずつ出力せよ。 # # なお、行の終端には改行が必要である。 '1 以上 1000 以下のすべての整数を十進数で表した文字列を辞書順比較で昇順にソートして、1 行ずつ出力してください。' :- '1 以上 1000 以下のすべての整数を十進数で表した文字列を'(_十進文字列ならび), '辞書順比較で昇順にソートして、'(_十進文字列ならび,_辞書順比較で昇順にソートされた文字列ならび), '1 行ずつ出力してください。'(_辞書順比較で昇順にソートされた文字列ならび). '1 以上 1000 以下のすべての整数を十進数で表した文字列を'(_十進文字列ならび) :- findall(_十進文字列,'1 以上 1000 以下のすべての整数を十進数で表した'(_十進数文字列),_十進文字列ならび). '1 以上 1000 以下のすべての整数を十進数で表した'(_十進数文字列) :- '1 以上 1000 以下のすべての整数を'(_整数), 十進数で表した(_整数,_十進数で表した). '1 以上 1000 以下のすべての整数を'(_整数) :- between(1,1000,_整数). 十進数で表した文字列を(_整数,_十進数で表した文字列) :- number_chars(_整数,Chars), atom_chars(_十進数で表した文字列,Chars). '辞書順比較で昇順にソートして、'([],[]). '辞書順比較で昇順にソートして、'([_軸要素|L1],L2) :- '辞書順比較で軸要素との大小で分割'(_軸要素,L1,L1_1,L1_2), '辞書順比較で昇順にソートして、'(L1_1,L1_1_2), '辞書順比較で昇順にソートして、'(L1_2,L1_2_2), append(L1_1_2,[_軸要素|L1_2_2],L2). '辞書順比較で軸要素との大小で分割'(_,[],[],[]). '辞書順比較で軸要素との大小で分割'(_軸要素,[A|R2],[A|R3],R4) :- '辞書順に小さい'(A,_軸要素),!, '辞書順比較で軸要素との大小で分割'(_軸要素,R2,R3,R4). '辞書順比較で軸要素との大小で分割'(_軸要素,[A|R2],R3,[A|R4]) :- '辞書順比較で軸要素との大小で分割'(_軸要素,R2,R3,R4). '辞書順に小さい'(_文字列_1,_文字列_2) :- '文字列_1に小さい文字が先に出現した'(_文字列_1,_文字列_2),!. '辞書順に小さい'(_文字列_1,_文字列_2) :- 文字列の差分が文字列_2にある(_文字列_1,_文字列_2). '文字列_1に小さい文字が先に出現した'(_文字列_1,_文字列_2) :- 先頭から同一位置の文字を比較して(_文字列_1,_文字列_2,_文字_1,_文字_2), \+(_文字_1 = _文字_2),!, _文字_1 @< _文字_2. 先頭から同一位置の文字を比較して(_文字列_1,_文字列_2,_文字_1,_文字_2) :- sub_atom(_文字列_1,_同一位置,1,_,_文字_1), sub_atom(_文字列_2,_同一位置,1,_,_文字_2). '文字列の差分が文字列_2にある'(_文字列_1,_文字列_2) :- sub_atom(_文字列_2,0,_文字列_1の長さ,_差分文字数,_文字列_1), _差分文字数 > 0. '1 行ずつ出力してください。'(L2) :- forall(member(M,L2),writef('%t\n',[M])). % 以下のサイトは # 要件 # # ユーザーテーブル(users)は入会日(joined_on)と退会日(left_on)を持っている # 退会していないユーザーの場合、退会日にはNULLが入る # ユーザー数の増減を確認するために、日付単位で入会したユーザーの人数と退会したユーザーの人数を一覧化したい。どうすれば取得できるか? # 例 # # ユーザーテーブル(users) # # id joined_on left_on # 1 2014-08-01 2014-08-10 # 2 2014-08-01 2014-08-05 # 3 2014-08-03 NULL # 4 2014-08-03 2014-08-10 # 5 2014-08-10 NULL # 期待する出力結果 # # date joined_count left_count # 2014-08-01 2 0 # 2014-08-03 2 0 # 2014-08-05 0 1 # 2014-08-10 1 2 # ユーザーテーブル(1,'2014-08-01','2014-08-10'). ユーザーテーブル(2,'2014-08-01','2014-08-05'). ユーザーテーブル(3,'2014-08-03','NULL'). ユーザーテーブル(4,'2014-08-03','2014-08-10'). ユーザーテーブル(5,'2014-08-10','NULL'). 'ユーザーテーブル(users)は入会日(joined_on)と退会日(left_on)を持っている 退会していないユーザーの場合、退会日にはNULLが入る ユーザー数の増減を確認するために、日付単位で入会したユーザーの人数と 退会したユーザーの人数を一覧化したい。どうすれば取得できるか?' :- findsetof(_日付,'joined_onの候補+left_offの候補'(_日付),_日付候補), '日付単位で入会したユーザーの人数と退会したユーザーの人数を一覧したい。'(_日付候補). 'joined_onの候補+left_offの候補'(_日付) :- ユーザーテーブル(_,_入会日付,_退会日付), member(_日付,[_入会日付,_退会日付]), \+(_日付 = 'NULL'). '日付単位で入会したユーザーの人数と退会したユーザーの人数を一覧したい。'(_日付候補) :- '日付単位で入会したユーザーの人数と退会したユーザーの人数を'(_日付候補,_日付,_入会したユーザーの人数,_退会したユーザーの人数,R), 表示する(_日付,_入会したユーザーの人数,_退会したユーザーの人数), R = []. '日付単位で入会したユーザーの人数と退会したユーザーの人数を'(_日付候補,_日付,_入会したユーザーの人数,_退会したユーザーの人数,R) :- append(_,[_日付|R],_日付候補), 度数(ユーザーテーブル(_,_日付,_),_入会したユーザーの人数), 度数(ユーザーテーブル(_,_,_日付),_退会したユーザーの人数). 表示する(_日付,_入会したユーザーの人数,_退会したユーザーの人数) :- writef('%t %3r %3r\n',[_日付,_入会したユーザーの人数,_退会したユーザーの人数]). findsetof(A,B,C) :- findall(A,B,D), setof(A,member(A,D),C). 度数(_目標,_度数) :- findall(1,_目標,L), length(L,_度数). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/933 # [1] 授業単元:プログラミング基礎 # [2] 問題文: # 氏名が"end"になるまで、氏名と点数を入力する。データがなくなったら点数の平均を算出 # する。平均と各人の点数を比較し、平均より20点以上下回っていたら"***"、10点以上 # 下回っていたら"**"、1点以上下回っていたら"*"を備考欄に表示する。 # _____________________________ #   氏名   点数  備考  # --------------------- #   井上    70   #   田口    65  * #   佐藤    100   #   田中    30  ***   # ===================== # [3.1] Windows 8 #  [3.2] Visual studio 2008 #  [3.3] C # # '氏名が"end"になるまで、氏名と点数を入力する。データがなくなったら点数の平均を算出する。氏名と点数を表示するが、平均と各人の点数を比較し、平均より20点以上下回っていたら"***"、10点以上下回っていたら"**"、1点以上下回っていたら"*"を備考欄に表示する。' :- '氏名が"end"になるまで、氏名と点数を入力する。'(_氏名_点数ならび), 'データがなくなったら点数の平均を算出する。'(_氏名_点数ならび,_平均), '氏名と点数を表示するが、平均と各人の点数を比較し、平均より20点以上下回っていたら"***"、10点以上下回っていたら"**"、1点以上下回っていたら"*"を備考欄に表示する。'(_氏名_点数ならび,_平均). '氏名が"end"になるまで、氏名と点数を入力する。'(_氏名_点数ならび) :- findall([_氏名,_点数],( 氏名の入力(_氏名),(_氏名=end,!,fail;点数の入力(_点数))), _氏名_点数ならび). 氏名の入力(_氏名) :- get_line(_氏名). 点数の入力(_点数) :- 整数を得る(_整数). 'データがなくなったら点数の平均を算出する。'(_氏名_点数ならび,_平均) :- length(_氏名_点数ならび,_人数), findall(_点数,member([_,_点数],_氏名_点数ならび),_点数ならび), sum_list(_点数ならび,_合計点), _平均 is _合計点 / _人数. '氏名と点数を表示するが、平均と各人の点数を比較し、平均より20点以上下回っていたら"***"、10点以上下回っていたら"**"、1点以上下回っていたら"*"を備考欄に表示する。'(_氏名_点数ならび,_平均). forall( member([_氏名,_点数],_氏名_点数_ならび), '氏名と点数を表示するが、平均と各人の点数を比較し、平均より20点以上下回っていたら"***"、10点以上下回っていたら"**"、1点以上下回っていたら"*"を備考欄に表示する。'(_氏名,_点数,_平均)). '氏名と点数を表示するが、平均と各人の点数を比較し、平均より20点以上下回っていたら"***"、10点以上下回っていたら"**"、1点以上下回っていたら"*"を備考欄に表示する。'(_氏名,_点数,_平均) :- 備考(_氏名,_点数,_備考), writef('20r10r %4l\n,[_氏名,_点数,_備考]). 備考(_点数,_平均,_備考) :- '平均と各人の点数を比較し、平均より20点以上下回っていたら"***"、'(_点数,_平均). 備考(_点数,_平均,_備考) :- '平均より10点以上下回っていたら"***"、'(_点数,_平均). 備考(_点数,_平均,_備考) :- '平均より1点以上下回っていたら"***"、'(_点数,_平均). 点数が平均点より低い場合(_点数,_平均,_備考),!. 備考(_,_,''). '平均と各人の点数を比較し、平均より20点以上下回っていたら"***"、'(_点数,_平均,'***') :- 点数が平均点より低い場合(_点数,_平均,_備考) :- '平均と各人の点数を比較し、平均より20点以上下回っていたら"***"、'(_点数,_平均,'***') :- _平均 - _点数 >= 20. '10点以上下回っていたら"**"、'(_点数,_平均,'**') :- _平均 - _点数 >= 10, _平均 - _点数 < 20. '1点以上下回っていたら"*"を備考欄に表示する。'(_点数,_平均,'*') :- _平均 - _点数 < 10, _平均 - _点数 >= 1. % 以下のサイトは # 出典: Regular Expression(正規表現) Part12 #723 # # ●Regular Expressionの使用環境 # JavaScript # # ●検索か置換か? # 置換 # # ●説明 # 例えばある文字列の中の「体」を「體」へ、「旧」を「舊」へ…、というように変換したいときに全て書き連ねるのではなく正規表現で簡潔に表現する方法はないでしょうか # '例えばある文字列の中の「体」を「體」へ、「旧」を「舊」へ…、というように変換したいときに全て書き連ねるのではなく正規表現で簡潔に表現する方法はないでしょうか'(_文字列,_置換された文字列) :- findall(_文字,文字列中の文字を可能ならば異体字に変換する(_文字列,_文字),L), atomic_list_concat(L,_置換された文字列). 文字列中の文字を可能ならば異体字に変換する(_文字列,_文字) :- sub_atom(_文字列,_,1,_,_文字_1), 異体字変換(_文字_1,_文字). 異体字変換(_文字_1,_文字_2) :- 異体字(_文字_1,_文字_2),!. 異体字変換(_文字,_文字). % 以下のサイトは 攪乱順列(_n,_撹乱順列) :- 完全順列(_n,_撹乱順列). 完全順列(_n,_完全順列) :- findall(_m,between(1,_n,_m),L), 完全順列(L,[_],_完全順列). 完全順列([],_,[]). 完全順列(L,Lm,[N|R]) :- select(N,L,L2), \+(length(Lm,N)), 完全順列(L2,[_|Lm],R). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1402622093/754 # お題:与えられた文字列を正方形にして出力 # 縦横の字数が等しければ正方形とします # 字数が足りない場合は'*'で埋めること # 余る場合は余計な文字を捨ててかまいません # ただし与えられた字数により近い正方形にすること # 例:http://jump.2ch.net/?ideone.com/mA41q6 # 1, 2=1x1 # 3, 4, 5, 6=2x2 # 7, 8, 9, 10, 11, 12=3x3 # 13, 14, 15, 16=4x4 # 最終行が*だけにならないようにすること。 # '与えられた文字列を正方形にして出力 縦横の字数が等しければ正方形とします 字数が足りない場合は'*'で埋めること 余る場合は余計な文字を捨ててかまいません ただし与えられた字数により近い正方形にすること 例:http://jump.2ch.net/?ideone.com/mA41q6 1, 2=1x1 3, 4, 5, 6=2x2 7, 8, 9, 10, 11, 12=3x3 13, 14, 15, 16=4x4 最終行が*だけにならないようにすること。'(_与えられた文字列,_正方形の文字列) :- 縦横の字数(_与えられた文字列,_縦横の字数), '与えられた文字列を正方形にして出力 縦横の字数が等しければ正方形とします 字数が足りない場合は'*'で埋めること 余る場合は余計な文字を捨ててかまいません'(_与えられた文字列,_縦横の字数,_正方形の文字列). 縦横の字数(_文字列ならび,_縦横の字数) :- sub_atom(_与えられた文字列,0,_文字列の長さ,1,_与えられた文字列), _縦横の字数_1 is floor(sqrt(_文字列の長さ)), _縦横の字数_2 is ceiling(sqrt(_文字列の長さ)), 縦横の字数の選択(_文字列の長さ,_縦横の字数_1,_縦横の字数_2,_縦横の字数). 縦横の字数の選択(_文字列の長さ,_縦横の字数_1,_縦横の字数_2,_縦横の字数_1) :- abs(_縦横の字数_1 ^ 2 - _文字列の長さ) =< abs(_縦横の字数_2 ^ 2 - _文字列の長さ),!. 縦横の字数の選択(_文字列の長さ,_縦横の字数_1,_縦横の字数_2,_縦横の字数_2). '与えられた文字列を正方形にして出力 縦横の字数が等しければ正方形とします 字数が足りない場合は * で埋めること 余る場合は余計な文字を捨ててかまいません'(_文字列,_縦横の字数,_正方形の文字列) :- findall(_行,( sub_atom(_文字列,_変位,_縦横の字数,_残り文字数,_行), 0 is _変位 mod _縦横の字数, (_行=_行_1;_残り文字数 < _縦横の字数,'字数が足りない場合は * で埋めること'(_文字列,_縦横の字数,_残り文字数,_行),!,fail)), _正方形の文字列). '字数が足りない場合は * で埋めること'(_文字列,_縦横の字数,_残り文字数,_行) :- atom_length(_文字列,_文字数), _星の時数 is _縦横の字数 - _残り文字数, 星文字列(_星の字数,_星文字列), sub_atom(_文字列,_,_残り文字数,0,_副文字列), atom_concat(_副文字列,_星文字列,_行). 星文字列(_字数,_星文字列) :- findall(*,between(1,_字数,_),_星ならび), atomic_list_concat(_星ならび,_星文字列). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/861 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # (Run Length圧縮) # 文字列が連続した場合、ある規則で文字を置き換え、 # 文字列を短くすることができます。 # 例えば、AAAAという文字列の場合、@4Aと表現すれば # 1文字分圧縮されます。 # この規則で圧縮された文字列を入力して # もとの文字列に復元して終了するプログラムを # 作成してください。 # ただし、復元した文字列に@文字は出現しないものとします。 # # 原文の文字列は半角の英大文字、英小文字、数字、記号であり100文字以内、連続する文字は9文字以内です。 # # 実行例) # ab@5C1@8050 入力 # abCCCCC10000000050 出力 # @99+1=1@90 入力 # 999999999+1=1000000000 出力 # '文字列が連続した場合、ある規則で文字を置き換え、 文字列を短くすることができます。 例えば、AAAAという文字列の場合、@4Aと表現すれば 1文字分圧縮されます。 この規則で圧縮された文字列を入力して もとの文字列に復元して終了するプログラムを 作成してください。 ただし、復元した文字列に@文字は出現しないものとします。 原文の文字列は半角の英大文字、英小文字、数字、記号であり100文字以内、連続する文字は9文字以内です。 実行例) ab@5C1@8050 入力 abCCCCC10000000050 出力 @99+1=1@90 入力 999999999+1=1000000000 出力' :- '文字列が連続した場合、ある規則で文字を置き換え、 文字列を短くすることができます。 例えば、AAAAという文字列の場合、@4Aと表現すれば 1文字分圧縮されます。 この規則で圧縮された文字列を入力して もとの文字列に復元して終了する'. '文字列が連続した場合、ある規則で文字を置き換え、 文字列を短くすることができます。 例えば、AAAAという文字列の場合、@4Aと表現すれば 1文字分圧縮されます。 この規則で圧縮された文字列を入力して もとの文字列に復元して終了する' :- 圧縮された文字列を入力し(_圧縮された文字列), もとの文字列に復元して(_圧縮された文字列,_復元された文字列), 終了する(_復元された文字列). 圧縮された文字列を入力し(_圧縮された文字列) :- get_line(_圧縮された文字列). もとの文字列に復元して(_圧縮された文字列,_復元された文字列) :- '前文字列、圧縮部の復元された数字列,後文字列に分解'(_圧縮された文字列,_前文字列,_圧縮部の復元された数字列,_後文字列), もとの文字列に復元して(_後文字列,_復元された文字列_2), atomic_list_concat([_前文字列,_数字列,_復元された文字列_2],_復元された文字列),!. もとの文字列に復元して(_文字列,_文字列). '前文字列、圧縮部の復元された数字列,後文字列に分解'(_圧縮された文字列,_前文字列,_圧縮部の復元された数字列,_後文字列) :- '前文字列、圧縮部,後文字列に分解'(_圧縮された文字列,_前文字列,_圧縮部,_後文字列), 圧縮部を復元する(_圧縮部,_圧縮部の復元された数字列). '前文字列、圧縮部,後文字列に分解'(_圧縮された文字列,_前文字列,_圧縮部,_後文字列) :- sub_atom(_圧縮された文字列,S,3,R,_圧縮部), sub_atom(_圧縮部,0,1,2,'@'), sub_atom(_圧縮された文字列,0,S,_,_前文字列), sub_atom(_圧縮された文字列,_,R,0,_後文字列). 圧縮部を復元する(_圧縮部,_圧縮部の復元された数字列) :- sub_atom(_圧縮部,1,1,_,_繰り返し回数文字), sub_atom(_圧縮部,2,1,_,_繰り返される数文字), atom_numbers(_繰り返し回数文字,[_繰り返し回数]), findall(_繰り返される数字,between(1,_繰り返し回数数,_),_圧縮部の復元された数字列). 終了する(_復元された文字列) :- writef('%t\n',[_復元された文字列]). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #674 # あなた(霧島京子) は20万人月の巨大なプロジェクトを一ヶ月で終わらせるために無数の下請け会社から人員をかき集める仕事をすることになりました。 # プロジェクトを終わらせるのに必要な人員数 m 名 と、発注可能な下請け会社の数 n 社、各下請け会社のアサイン可能なエンジニア人員数 q_i 名 と、発注に必要な費用 r_i 万円が与えられます。 # # 各下請け会社の人員は、一部を使うなどは出来ず全員を使わなくてはいけません。 # プロジェクトに必要な人員数 m 以上を満たせる組み合わせで、最も安くすむ合計金額(単位:万円)を出力してください。 # 各下請け会社の人員数の合計はプロジェクトの規模 m 人月以上になるものとします。 # ヒントを見る # ※ 実際のプロジェクトではこの様には行きませんので、人員を増やす場合は慎重に検討する事をお勧めいたします。 # ※この物語はフィクションであり、実在の人物・団体とは一切関係ありません # # # # 入力される値 # 入力は以下のフォーマットで与えられます。 # # m (プロジェクトに必要な人員数) # n (下請け会社の数) # q_1 r_1 (1番目の下請け会社の人員数 発注に必要な費用[単位:万円]) # q_2 r_2 (2番目の下請け会社の人員数 発注に必要な費用[単位:万円]) # ・・・ # q_i r_i (n 番目の下請け会社の人員数 発注に必要な費用[単位:万円]) # 条件 # 1 ≦ m ≦ 200000(プロジェクトに必要な人数:最大20万人) # 1 ≦ n ≦ 50(下請け会社数:最大50社) # 1 ≦ q_i ≦ 10000(各下請け会社の人員数:最大1万人) # 1 ≦ r_i ≦ 5000000(各下請け会社のへの発注費用[単位:万円]:1万円〜最大500億円) # m ≦ q_1 + q_2 + q_3 ... + q_i(各下請け会社の人員数の合計はプロジェクトに必要な人数 m 人以上になる) # 期待する出力 # 最もコストが安くなる組み合わせの総コストを出力して下さい。 # 最後は改行し、余計な文字、空行を含んではいけません。 # 入力例1 # 60 # 3 # 40 4300 # 30 2300 # 20 2400 # # # 出力例1 # 6600 # 入力例2 # 250 # 5 # 35 3640 # 33 2706 # 98 9810 # 57 5472 # 95 7790 # 出力例2 # 23072 'あなた(霧島京子) は20万人月の巨大なプロジェクトを一ヶ月で終わらせるために 無数の下請け会社から人員をかき集める仕事をすることになりました。 プロジェクトを終わらせるのに必要な人員数 m 名 と、発注可能な下請け会社の数 n 社、 各下請け会社のアサイン可能なエンジニア人員数 q_i 名 と、発注に必要な費用 r_i 万円が与えられます。 各下請け会社の人員は、一部を使うなどは出来ず全員を使わなくてはいけません。 プロジェクトに必要な人員数 m 以上を満たせる組み合わせで、 最も安くすむ合計金額(単位:万円)を出力してください。 各下請け会社の人員数の合計はプロジェクトの規模 m 人月以上になるものとします。' :- 'プロジェクトを終わらせるのに必要な人員数 m 名 と、発注可能な下請け会社の数 n 社、 各下請け会社のアサイン可能なエンジニア人員数 q_i 名 と、発注に必要な費用 r_i 万円が与えられます。'(_m,_n,_下請け人数_費用ならび), findmin(_合計金額,( 'プロジェクトに必要な人員数 m 以上を満たせる組み合わせで、 最も安くすむ合計金額(単位:万円)を'(_m,_n,_下請け人数_費用ならび,0,0,_合計人数,_合計金額)),_最も安くすむ合計金額), '出力してください。'(_最も安くすむ合計金額). 'プロジェクトを終わらせるのに必要な人員数 m 名 と、発注可能な下請け会社の数 n 社、 各下請け会社のアサイン可能なエンジニア人員数 q_i 名 と、発注に必要な費用 r_i 万円が与えられます。'(_m,_n,_下請け人数_費用ならび) :- get_split_line([' ',','],[_m,_n]), findall([_下請け人数,_費用],( between(1,_n,_), get_split_line([' ',','],[_下請け人数,_費用])),_下請け人数_費用ならび). 'プロジェクトに必要な人員数 m 以上を満たせる組み合わせで、 最も安くすむ合計金額(単位:万円)を'(_m,_n,_下請け人数_費用ならび,_合計人数,_合計金額,_合計人数,_合計金額) :- _合計人数 >= _m,!. 'プロジェクトに必要な人員数 m 以上を満たせる組み合わせで、 最も安くすむ合計金額(単位:万円)を'(_m,_n,_下請け人数_費用ならび,_合計人数_1,_合計金額_1,_合計人数,_合計金額) :- ひとつ下請け人数と費用を取り出す(_下請け人数_費用ならび,_合計人数_1,_合計金額_1,_合計人数_2,_合計金額_2,_残りならび), 'プロジェクトに必要な人員数 m 以上を満たせる組み合わせで、 最も安くすむ合計金額(単位:万円)を'(_m,_n,_残りならび,_合計人数_2,_合計金額_2,_合計人数,_合計金額). ひとつ下請け人数と費用を取り出す(_下請け人数_費用ならび,_合計人数_1,_合計金額_1,_合計人数_2,_合計金額_2,_残りならび) :- select([_下請け人数_1,_費用_1],_下請け人数_費用ならび,_残りならび), _合計金額_2 is _合計金額_1 + _費用_1, _合計人数_2 is _合計人数_1 + _下請け人数_1. '出力してください。'(_最も安くすむ合計金額) :- writef('%t万円\n',[_最も安くすむ合計金額]). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/851 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 入力された数字まで、1から順に # 表示すること # (入力される数字の最小は、1) # (入力される数字の最大は、20) # # 実行例 # 5 入力 # 1 2 3 4 5 出力 # 11 入力 # 1 2 3 4 5 6 7 8 9 10 11 出力 # 1 入力 # 1 出力 # # '入力された数字まで、1から順に 表示すること (入力される数字の最小は、1) (入力される数字の最大は、20)' :- '入力された数字まで、(入力される数字の最小は、1最大は、20)'(_入力された数字), '1から順に表示すること'(_入力された数字). '1から順に表示すること'(_入力された数字) :- findall(_整数,between(1,_入力された数字,_整数),L), atomic_list_concat(L,' ',_表示文字列), writef('%t\n',[_表示文字列]). % 以下のサイトは # 出典: http://peace.2ch.net/test/read.cgi/tech/1392388003/808 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 担当者はなん人でも構わない、担当者名と売上を入力する。売上合計を求める。各担当の売 # 上が売上合計の何%になるかの比率の計算を行い、担当者名、売上、比率を表示する。 # ________________________________ # 担当者  売上  比率 # --------------------- # 山田  12000  30.0% # 鈴木   8000  20.0% # 井上  20000  50.0% # 合計  40000  100.0% # ===================== # '担当者はなん人でも構わない、担当者名と売上を入力する。売上合計を求める。各担当の売上が売上合計の何%になるかの比率の計算を行い、担当者名、売上、比率を表示する。' :- '担当者はなん人でも構わない、担当者名と売上を入力する。', '売上合計を求める。'(_売上合計), '各担当の売上が売上合計の何%になるかの比率の計算を行い、担当者名、売上、比率を表示する。'. '担当者はなん人でも構わない、担当者名と売上を入力する。' :- 担当者名と売上を入力(_担当者名,_売上), 担当者と売上を追加定義する(_担当者名,_売上), '担当者はなん人でも構わない、担当者名と売上を入力する。',!. '担当者はなん人でも構わない、担当者名と売上を入力する。'. 担当者名と売上を入力(_担当者名,_売上) :- 担当者名の入力(_担当者名), \+(_担当者名=''), 売上の入力(_売上). 担当者名の入力(_担当者名) :- write('担当者名を入力して下さい : '), get_line(_担当者名). 売上の入力(_売上) :- 整数を得る(売上,integer(_売上),_売上). 担当者と売上を追加定義する(_担当者,_売上) :- assertz('担当者・売上'(_担当者,_売上)). 売上合計を得る(_売上合計) :- findall(_売上,( '担当者・売上'(_,_売上)), _売上ならび), sum_list(_売上ならび,_売上合計). '各担当の売上が売上合計の何%になるかの比率の計算を行い、担当者名、売上、比率を表示する。'(_売上合計) :- write('担当者  売上  比率 \n'), forall('担当者・売上'(_担当者名,_売上),'各担当の売上が売上合計の何%になるかの比率の計算を行い、担当者名、売上、比率を表示する。'(_担当者名,_売上,_売上合計)), write('===================== \n'). '各担当の売上が売上合計の何%になるかの比率の計算を行い、担当者名、売上、比率を表示する。'(_担当者名,_売上,_売上合計) :- \+(_売上合計 = 0), _比率 is _売上 / _売上合計 * 100, '担当者名、売上、比率を表示する。'(_担当者名,_売上,_比率). '担当者名、売上、比率を表示する。'(_担当者名,_売上,_比率) :- format('~w ~0f ~1f%\n',[_担当者名,_売上,_比率]). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1402622093/555 # お題:全n巻の全集があり各巻の頁数はすべてp頁である。毎日x頁づつ読んだら # 最後の日は1頁だけだった。p,xから最小のnを求める。解がない場合は偽を返す。 # 例 # p=213, x=16 -> 13 # p=214, x=16 -> false # p=333, x=29 -> 27 # # '全n巻の全集があり各巻の頁数はすべてp頁である。毎日x頁づつ読んだら 最後の日は1頁だけだった。p,xから最小のnを求める。解がない場合は偽を返す。'(_p頁,_x頁,_n巻) :- '全n巻の全集があり'(_全集,_n巻), '各巻の頁数はすべてp頁である。'(_全集,_p頁), 毎日x頁づつ読んだら最後の日は(_全集,_x頁,_最後の日に読んだ頁数),!, '1頁だけだった。解がない場合は偽を返す。'(_最後の日に読んだ頁数). '全n巻の全集があり'(_全集,_n巻) :- length(_全集,_n巻). '各巻の頁数はすべてp頁である。'(_全集,_p頁) :- findall(_各巻,( member(_各巻,_全集), length(_各巻,_p頁)),_全集). 毎日x頁づつ読んだら最後の日は(_全集,_x頁,_最後の日に読んだ頁数) :- flatten(_全集,_全集の全頁数), length(_x頁ならび,_x頁), 最後の日は(_全集の全頁数,_x頁ならび,_最後の日に読んだ頁数). 最後の日は(_最後の日に読んだ頁数,_最後の日に読んだ頁数,_最後の日に読んだ頁数). 最後の日は([_],_,[_]). 最後の日は(L,_x頁ならび,_最後の日に読んだ頁数) :- append(_x頁ならび,L2,L), 最後の日は(L2,_x頁ならび,_最後の日に読んだ頁数). '1頁だけだった。解がない場合は偽を返す。'(_最後の日に読んだ頁数) :- _最後の日に読んだ頁数 = [_]. % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1402622093/555 # お題:全n巻の全集があり各巻の頁数はすべてp頁である。毎日x頁づつ読んだら # 最後の日は1頁だけだった。p,xから最小のnを求める。解がない場合は偽を返す。 # 例 # p=213, x=16 -> 13 # p=214, x=16 -> false # p=333, x=29 -> 27 # # '全n巻の全集があり各巻の頁数はすべてp頁である。毎日x頁づつ読んだら 最後の日は1頁だけだった。p,xから最小のnを求める。解がない場合は偽を返す。'(_p頁,_x頁,_n巻) :- '全n巻の全集があり'(_全集,_n巻), '各巻の頁数はすべてp頁である。'(_全集,_p頁), '毎日x頁づつ読んだら最後の日は1頁だけだった。'(_全集,_x頁,_最後の日に読んだ頁数),!, _最後の日に読んだ頁数 = [_]. '全n巻の全集があり'(_全集,_n巻) :- length(_全集,_n巻). '各巻の頁数はすべてp頁である。'(_全集,_p頁) :- findall(_各巻,( member(_各巻,_全集), length(_各巻,_p頁)), _全集). '毎日x頁づつ読んだら最後の日は1頁だけだった。'(_全集,_x頁,_最後の日に読んだ頁数) :- flatten(_全集,_全集の全頁数), length(_x頁ならび,_x頁), 最後の日は(_全集の全頁数,_x頁ならび,_最後の日に読んだ頁数). 最後の日は(_最後の日に読んだ頁数,_最後の日に読んだ頁数,_最後の日に読んだ頁数). 最後の日は([_],_,[_]). 最後の日は(L,_x頁ならび,_最後の日に読んだ頁数) :- append(_x頁ならび,L2,L), 最後の日は(L2,_x頁ならび,_最後の日に読んだ頁数). % 以下のサイトは # 出題場所 :: 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/1402622093/549 # お題:数独の答を表す文字列が与えられたとき、'1'が各列の何行目にあるかを # いちばん左の列から順に調べて表示する。 # 入力 # 145327698 # 839654127 # 672918543 # 496185372 # 218473956 # 753296481 # 367542819 # 984761235 # 521839764 # # 出力 # 159438276 # # '数独の答を表す文字列が与えられたとき、1が各列の何行目にあるかをいちばん左の列から順に調べて表示する。'(_数独文字列,_列目,_行目) :- 数独文字列を数独に変換(_数独文字列,_数独), 転置(_数独,_転置された数独), forall('1が各列の何行目にあるかをいちばん左の列から順に調べて'(_転置された数独,_行目),write(_行目)). 数独文字列を数独に変換(_数独文字列,_数独) :- split(_数独文字列,['\n'],_数独文字列行ならび), findall(_数独行,( findall(_数,( sub_atom(_数独文字列,_,1,_,_文字), 数値に変換(_文字,_数)), _数独行)), _数独). '1が各列の何行目にあるかをいちばん左の列から順に調べて'(_転置された数独,_行目) :- nth1(_列目,_転置された数独,_列), nth1(_行目,_列,'1'). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). % 以下のサイトは # 出典: 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,_星文字列). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/757 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 担当者名が"end"になるまで、担当者名と売上を入力する。 # 売上合計、平均、最も売上が多い担当者名とその売上、 # 最も売上が低い担当者名とその売上を表示する。 # '担当者名が"end"になるまで、担当者名と売上を入力する。 売上合計、平均、最も売上が多い担当者名とその売上、 最も売上が低い担当者名とその売上を表示する。' :- '担当者名が"end"になるまで、担当者名と売上を入力する。'(_担当者名_売上ならび), '売上合計、平均、最も売上が多い担当者名とその売上、 最も売上が低い担当者名とその売上を表示する。'(_担当者_売上ならび). '担当者名が"end"になるまで、担当者名と売上を入力する。'(_担当者名_売上ならび) :- findall([_担当者名,_売上],( 担当者の入力(_担当者名), ( _担当者名 = end,!,fail; 売上の入力(_売上))), _担当者名_売上ならび). 担当者の入力(_担当者名) :- write('担当者名を入力してください (endで終了する) : '), get_line(_担当者名). 売上の入力(_売上) :- 整数を得る('売上を入力して下さい : ',true,_売上). '売上合計、平均、最も売上が多い担当者名とその売上、 最も売上が低い担当者名とその売上を表示する。'(_担当者_売上ならび) :- '売上合計、平均、'(_担当者_売上ならび,_売上合計,_平均), '最も売上が多い担当者名とその売上、最も売上が低い担当者名とその売上を'(_担当者_売上ならび,_最も売上が多い担当者名,_最も売上が多い担当者の売上,_最も売上が低い担当者名,_最も売上が低い担当者の売上), 表示する(_売上合計,_平均,_最も売上が多い担当者名,_最も売上が多い担当者の売上,_最も売上が低い担当者名,_最も売上が低い担当者の売上). '売上合計、平均、'(_担当者_売上ならび,_売上合計,_平均) :- findall(_売上,( member([_,_売上],_担当者名_売上ならび)), _売上ならび), sum_list(_売上ならび,_売上合計), length(_売上ならび,_要素数), _平均 is _売上合計 / _要素数. '最も売上が多い担当者名とその売上、最も売上が低い担当者名とその売上を'(_担当者_売上ならび,_最も売上が多い担当者名,_最も売上が多い担当者の売上,_最も売上が低い担当者名,_最も売上が低い担当者の売上) :- findsetof(_担当者,member([_担当者,_],_担当者_売上ならび),_担当者名ならび), 担当者別の売上合計(_担当者_売上ならび,_担当者名ならび,_担当者別売上合計ならび), '最も売上が多い担当者名とその売上、'(_担当者別売上合計ならび,_最も売上が多い担当者,_最も売上が多い担当者の売上), '最も売上が低い担当者名とその売上'(_担当者別売上合計ならび,_最も売上が低い担当者,_最も売上が低い担当者の売上). 担当者別の売上合計(_担当者_売上ならび,_担当者名ならび,_担当者別売上合計ならび) :- findall([_担当者名,_売上合計],( member(_担当者名,_担当者名ならび), findsum(_売上,( member([_担当者名,_売上],_担当者別売上ならび), _売上合計))), _担当者別売上合計ならび). '最も売上が多い担当者名とその売上、'(_担当者別売上合計ならび,_最も売上が多い担当者,_最も売上が多い担当者の売上) :- append(L1,[[_最も売上が多い担当者,_最も売上が多い担当者の売上]|L2],_担当者別売上合計ならび), \+((member([_,_売上合計],L1),_売上合計 > _最も売上が多い担当者の売上)), \+((member([_,_売上合計],L2),_売上合計 > _最も売上が多い担当者の売上)). '最も売上が低い担当者名とその売上、'(_担当者別売上合計ならび,_最も売上が低い担当者,_最も売上が低い担当者の売上) :- append(L1,[[_最も売上が低い担当者,_最も売上が低い担当者の売上]|L2],_担当者別売上合計ならび), \+((member([_,_売上合計],L1),_売上合計 < _最も売上が低い担当者の売上)), \+((member([_,_売上合計],L2),_売上合計 < _最も売上が低い担当者の売上)). 表示する(_売上合計,_平均,_最も売上が多い担当者名,_最も売上が多い担当者の売上,_最も売上が低い担当者名,_最も売上が低い担当者の売上) :- writef('売上合計 = %t\n平均 = %t\n',[_売上合計,_平均]), writef('最も売上が多い担当者名 = %t\n最も売上が多い担当者の売上 = %t\n最も売上が低い担当者名 = %t\n',[_最も売上が多い担当者名,_最も売上が多い担当者の売上]), writef('最も売上が低い担当者名 = %t\n最も売上が低い担当者の売上 = %t\n',[_最も売上が低い担当者名,_最も売上が低い担当者の売上]). % 以下のサイトは # 出典: http://peace.2ch.net/test/read.cgi/tech/1392388003/745 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 1)変数名 kokugo,shakai,rika を整数型で宣言する。(国語、社会、理科) # 変数名 goukei,heikinを整数型で宣言する。(合計、平均) # 2)「国語の点数=」のように表示し、キーボードよりそれぞれの科目の点数を入力する。 # 3)3科目の合計を求める。 # 4)enumを使うこと # '「国語の点数=」のように表示し、キーボードよりそれぞれの科目の点数を入力する。'(_国語,_社会,_理科) :- forall(科目の点数を入力する(_科目,_点数),assertz(成績(_科目,_点数))). 科目の点数を入力する(_科目,_点数) :- member(_科目,[国語,社会,理科]), swritef(催促文,'%tの点数=',[_科目]), 整数を得る(催促文,integer(_点数),_点数). '3科目の合計を求める。'(_合計) :- findall(_点数,( 成績(_,_点数)), _点数ならび), sum_list(_点数ならび,_合計). '3科目の平均を求める。'(_国語,_社会,_理科,_平均) :- findall(_点数,( 成績(_,_点数)), _点数ならび), sum_list(_点数ならび,_合計), _平均 is _合計 / 3. % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/740 # [1] 授業単元: プログラミング基礎 # [2] 問題文、ブラックジャックの判定処理を行う # 1人目の数字列を入力(1個〜10個まで) # 2人目の数字列を入力(1個〜10個まで) # 数字は、1から13。 # 合計が21を超えたら点数は、0点。 # 1は、1点または、11点として使える。 # 11以上は10点として数える。 # それ以外は、数字がそのまま点数。 # 勝った方を番号で表示(1 or 2) # 引き分けは、2の勝ちとする # 実行例) # 1 5 8 入力1(14) # 5 7 4 入力2(16) # 2 出力 # 13 1 入力1(21) # 12 10 入力2(20) # 1 出力 # 13 8 入力1(18) # 1 9 入力2(20) # 2 出力 # 1 1 8 入力1(20) # 3 4 7 入力2(14) # 1 出力 # 10 8 7 入力1(25) # 3 5 8 入力2(16) # 2 出力 # 'ブラックジャックの判定処理を行う 合計が21を超えたら点数は、0点。 1は、1点または、11点として使える。 11以上は10点として数える。 それ以外は、数字がそのまま点数。 勝った方を番号で表示(1 or 2) 引き分けは、2の勝ちとする' :- ブラックジャックの札を配る(_1人目の数字ならび,_2人目の数字ならび), '合計が21を超えたら点数は、0点。 1は、1点または、11点として使える。 11以上は10点として数える。 それ以外は、数字がそのまま点数。'(_1人目の数字ならび,_2人目の数字ならび,_点数_1,_点数_2), ブラックジャックの判定(_点数_1,_点数_2,_勝者), 勝った方を番号で表示(_勝者). ブラックジャックの札を配る(_1人目の数字ならび,_2人目の数字ならび) :- カードの準備(_配り札_1), ブラックジャックの札を配る(_配り札_1,[],_1人目の数字ならび,_配り札_2), ブラックジャックの札を配る(_配り札_2,[],_2人目の数字ならび,_),!. カードの準備(_配り札) :- findall(N,( between(1,13,N), between(1,4,_)), _配り札). ブラックジャックの札を配る(_配り札,_数字ならび,_数字ならび,_配り札) :- 合計点の最高(_数字ならび,_合計点の最高), between(14,21,_合計点の最高),!. ブラックジャックの札を配る(_配り札_1,_現在までの数字ならび,_数字ならび,_残り配り札) :- 一枚配る(_配り札_1,_数字,_配り札_2), ブラックジャックの札を配る(_配り札_2,[_数字|_現在までの数字ならび],_数字ならび,_残り配り札). 一枚配る(_配り札_1,_数字,_配り札_2) :- length(_配り札_1,_配り札の枚数), _抜き位置 is random(_配り札の枚数), length(L1,_抜き位置), append(L1,[_数字|L2],_配り札_1), append(L1,L2,_配り札_2). '合計が21を超えたら点数は、0点。 1は、1点または、11点として使える。 11以上は10点として数える。 それ以外は、数字がそのまま点数。'(_1人目の数字ならび,_2人目の数字ならび,_点数_1,_点数_2) :- 合計点の最高(_1人目の数字ならび,_点数_1), 合計点の最高(_2人目の数字ならび,_点数_2). 合計点の最高(_数字ならび,_合計点の最高) :- findall(_合計点,( 合計点(_数字ならび,_合計点)), _合計点ならび), findmax(_合計点,( member(_合計点,_合計点ならび), _合計点 =< 21), _合計点の最高),!. 合計点の最高(_,0). 合計点([],0). 合計点([N|R],S) :- 合計点(R,S_2), 点数の数え方(N,N_2), S is N_2 + S_2. 点数の数え方(1,1). 点数の数え方(1,11). 点数の数え方(11,10). 点数の数え方(12,10). 点数の数え方(13,10). 点数の数え方(N,N) :- between(2,10,N). ブラックジャックの判定(_点数_1,_点数_2,2) :- _点数_2 >= _点数_1,!. ブラックジャックの判定(_,_,1). 勝った方を番号で表示(_勝者) :- writef('勝ったのは %t です\n',[_勝者]). % 以下のサイトは # 出典: http://peace.2ch.net/test/read.cgi/tech/1392388003/736 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 以下のプログラムを作成しなさい. # 文字列を5つ入力し、その中の # 一番小さい文字列を表示 # (英数字のみ) # (文字列は、50文字以内) # (英字の大文字と小文字は、 #  特に考慮しないで、そのまま比較 #  して良いこととする) # # 実行例) # abc 入力1 # aaaa 入力2 # wsdd 入力3 # gfd 入力4 # xxxd 入力5 # aaaa 出力 # 19dfc 入力1 # xuw29 入力2 # 12k2 入力3 # mnnn 入力4 # bccd1 入力5 # 12k2 出力 # '文字列を5つ入力し、その中の一番小さい文字列を表示 (英数字のみ)(文字列は、50文字以内)(英字の大文字と小文字は、特に考慮しないで、そのまま比較して良いこととする)' :- '文字列を5つ入力し、'(_文字列ならび), 一番小さい文字列を表示(_文字列ならび). '文字列を5つ入力し、'(_文字列ならび) :- findall(_文字列,( between(1,5,_), get_line(_文字列)), _文字列ならび). 一番小さい文字列を表示([_文字列|_残り文字列ならび],_一番小さい文字列) :- 一番小さい文字列を(_残り文字列ならび],_文字列,_一番小さい文字列), 表示(_一番小さい文字列). 一番小さい文字列を([],_一番小さい文字列,_一番小さい文字列). 一番小さい文字列を([_文字列|_残り文字列ならび],_現時点で一番小さい文字列,_一番小さい文字列) :- _文字列 @< _現時点で一番小さい文字列, 一番小さい文字列を(_残り文字列ならび,_文字列,_一番小さい文字列). 一番小さい文字列を([_文字列|_残り文字列ならび],_現時点で一番小さい文字列,_一番小さい文字列) :- _文字列 @>= _現時点で一番小さい文字列, 一番小さい文字列を(_残り文字列ならび,_現時点で一番小さい文字列,_一番小さい文字列). 表示(_一番小さい文字列) :- writef('%t\n',[_一番小さい文字列]). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #525 # お題:バイトごとに固定値とのXORでバイナリが暗号化される。正しい # バイナリを引数として指定するとtrueを返すような関数examがある。 # 正しいバイナリを暗号化した後、examを使って暗号化されたバイナ # リを解読するプログラムを作れ。正しいバイナリは{0x20,0x11,0x03,0x11}とし、 # 暗号化に使う固定値はプログラムの起動時にランダムに選ぶものとする。 'バイトごとに固定値とのXORでバイナリが暗号化される。 正しいバイナリを引数として指定するとtrueを返すような関数examがある。 正しいバイナリを暗号化した後、examを使って暗号化されたバイナリを解読するプログラムを作れ。 正しいバイナリは{0x20,0x11,0x03,0x11}とし、 暗号化に使う固定値はプログラムの起動時にランダムに選ぶものとする。'(_固定値,_正しいバイナリ,_暗号化されたバイナリ) :- _固定値 is random(255), '正しいバイナリを暗号化された後、'(_正しいバイナリ,_固定値,_暗号化されたバイナリ), exam(_正しいバイナリ). '正しいバイナリを暗号化された後、'(_正しいバイナリ,_固定値,_暗号化されたバイナリ) :- findall(_暗号化された値,( member(_値,_正しいバイナリ), _暗号化された値 is _値 # _固定値), _暗号化されたバイナリ), assertz(固定値(_固定値)), assertz(暗号化されたバイナリ(_暗号化されたバイナリ)). exam(_正しいバイナリ) :- 正しいバイナリを引数として指定すると(_正しいバイナリ), 暗号化されたバイナリ(_暗号化されたバイナリ), 固定値(_固定値), 各バイナリを固定値とXORすることによって復号化する(_暗号化されたバイナリ,_固定値,_正しいバイナリ). 正しいバイナリを引数として指定すると(_正しいバイナリ) :- \+(var(_正しいバイナリ)). 各バイナリを固定値とXORすることによって復号化する(_暗号化されたバイナリ,_固定値,_正しいバイナリ) :- findall(_復号化された値,( member(_値,_暗号化されたバイナリ), _復号化された値 is _値 # _固定値), _正しいバイナリ). % 以下のサイトは # 出典: C/C++の宿題片付けます 167代目 #715 # [1] 授業単元: プログラミング基礎 # [2] 問題文:英語、理科の点数を整数として入力し、高い方の点数を表示しなさい。 # (同じ点数の時はどちらの点数が表示されてもよい。) # [3] 環境 #   OS: Windows7 #   言語: C # [4] 期限:急ですが明日中までにお願いします # 何卒ご教示お願いします。 '英語、理科の点数を整数として入力し、高い方の点数を表示しなさい。(同じ点数の時はどちらの点数が表示されてもよい。)' :- '英語、理科の点数を整数として入力し、'(_科目_点数_ならび), '高い方の点数を表示しなさい(同じ点数の時はどちらの点数が表示されてもよい。)'(__科目_点数_ならび). '英語、理科の点数を整数として入力し、'(_科目_点数_ならび) :- findall([_科目,_点数],'英語、理科の点数を整数として入力し、'(_科目,_点数),_科目_点数_ならび). '英語、理科の点数を整数として入力し、'(_科目,_点数) :- '英語、理科の'(_科目), '点数を整数として入力し、'(_科目,_点数). '英語、理科の'(_科目) :- member(_科目,[英語,理科]). '点数を整数として入力し、'(_科目,_点数) :- swritef(_表示文字列,'%tの点数を入力しなさい : ',[_科目]), 整数を得る(_表示文字列,integer(_点数),_点数). '高い方の点数を表示しなさい(同じ点数の時はどちらの点数が表示されてもよい。)'([[_科目_1,_点数_1],[_科目_2,_点数_2]]) :- '高い方の(同じ点数の時はどちらの点数が表示されてもよい。)'(_科目_1,_点数_1,_科目_2,_点数_2,_点数が高い方の科目,_高い方の点数), 点数を表示しなさい(_点数が高い方の科目,_高い方の点数). '高い方の(同じ点数の時はどちらの点数が表示されてもよい。)'(_科目_1,_点数_1,_科目_2,_点数_2,_科目_1,_点数_1) :- _点数_1 >= _点数_2. '高い方の(同じ点数の時はどちらの点数が表示されてもよい。)'(_科目_1,_点数_1,_科目_2,_点数_2,_科目_2,_点数_2) :- _点数_1 < _点数_2. 点数を表示しなさい(_点数が高い方の科目,_高い方の点数) :- writef('%t点(%t)\n',[_高い方の点数,_点数が高い方の科目]). % 以下のサイトは バイナリファイル (標準入力) に一致しました % 以下のサイトは % % SWI-Prologに於いてfindall/3と同等の述語をmesage_queueを使って定義してみる。 % % findall/3と同じ機能の述語をメッセージキューを利用して定義する。 % メッセージキューを使って全解を収集する(_限界数,_選択項,_副目標,_回収値ならび) :- message_queue_create(_キュー番号), スレッド上でメッセージキューに限界数までの選択項を登録する(_限界数,_キュー番号,_選択項,_副目標), 'メッセージを待ち合わせ、回収する'(_キュー番号,_回収値ならび), message_queue_destroy(_キュー番号). スレッド上でメッセージキューに限界数までの選択項を登録する(_限界数,_キュー番号,_選択項,_副目標) :- thread_create(メッセージキューに限界数までの選択項を登録する(_限界数,_キュー番号,_選択項,_副目標),_,[]). 'メッセージを待ち合わせ、回収する'(_キュー番号,_回収値ならび) :- メッセージを待ち合わせる(_キュー番号), メッセージを回収する(_キュー番号,_回収値ならび). メッセージを待ち合わせる(_キュー番号) :- repeat, thread_peek_message(_キュー番号,end_of_file),!. メッセージを回収する(_キュー番号,_回収値ならび) :- findall(_回収値,( thread_get_message(_キュー番号,_回収値), ( _回収値 = end_of_file,!,fail; true)), _メッセージならび). %%%%%%%%%%%%%%%%%%%% スレッド側 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% メッセージキューに限界数までの選択項を登録する(_限界数,_キュー番号,_選択項,_副目標) :- 副目標を実行して選択項を登録する(_キュー番号,_選択項,_副目標), ( メッセージが限界数を超えた(_キュー番号,_限界数),!,fail; fail). メッセージキューに限界数までの選択項を登録する(_,_キュー番号,_,_) :- thread_send_message(_キュー番号,end_of_file). メッセージが限界数を超えた(_キュー番号,_限界数) :- メッセージの現在の度数を数える(_キュー番号,_度数), _度数 >= _限界数, thread_send_message(_キュー番号,end_of_file),!. 副目標を実行して選択項を登録する(_キュー番号,_選択項,_副目標) :- call(_副目標), 重複メッセージにはならない(_キュー番号,_選択項), thread_send_message(_キュー番号,_選択項). 重複メッセージにはならない(_キュー番号,_選択項) :- \+(thread_peek_message(_キュー番号,_選択項)). メッセージの現在の度数を数える(_キュー番号,_度数) :- message_queue_property(_キュー番号,size(_度数)). % 以下のサイトは % % SWI-Prologに於いてfindall/3と同等の述語をmesage_queueを使って定義してみる。 % % findall/3と同じ機能の述語をメッセージキューを利用して定義する。 % メッセージキューを使って全解を収集する(_限界数,_選択項,_副目標,_回収値ならび) :- message_queue_create(_キュー番号), スレッド上でメッセージキューに限界数までの選択項を登録(_限界数,_キュー番号,_選択項,_副目標), メッセージを回収する(_キュー番号,_回収値ならび), message_queue_destroy(_キュー番号). スレッド上でメッセージキューに限界数までの選択項を登録(_限界数,_キュー番号,_選択項,_副目標) :- thread_create(メッセージキューに限界数までの選択項を登録(_限界数,_キュー番号,_選択項,_副目標),_,[]). メッセージを回収する(_キュー番号,L) :- thread_peek_message(_キュー番号,end_of_file), thread_get_message(_キュー番号,_回収値_1), メッセージを回収する(_キュー番号,_回収値_1,L),!. メッセージを回収する(_キュー番号,L) :- メッセージを回収する(_キュー番号,L). メッセージを回収する(_キュー番号,end_of_file,[]) :- !. メッセージを回収する(_キュー番号,_回収値,[_回収値|R]) :- thread_get_message(_キュー番号,_回収値_2), メッセージを回収する(_キュー番号,_回収値_2,R). %%%%%%%%%%%%%%%%%%%% スレッド側 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% メッセージキューに限界数までの選択項を登録(_限界数,_キュー番号,_選択項,_副目標) :- 副目標の実行と選択項の登録(_キュー番号,_選択項,_副目標), ( メッセージが限界数を超えた(_キュー番号,_限界数),!,fail; fail). メッセージキューに限界数までの選択項を登録(_,_キュー番号,_,_) :- thread_send_message(_キュー番号,end_of_file). メッセージが限界数を超えた(_キュー番号,_限界数) :- メッセージの現在の度数(_キュー番号,_度数), _度数 >= _限界数, thread_send_message(_キュー番号,end_of_file),!. 副目標の実行と選択項の登録(_キュー番号,_選択項,_副目標) :- call(_副目標), 重複メッセージにはならない(_キュー番号,_選択項), thread_send_message(_キュー番号,_選択項). 重複メッセージにはならない(_キュー番号,_選択項) :- \+(thread_peek_message(_キュー番号,_選択項)). メッセージの現在の度数(_キュー番号,_度数) :- message_queue_property(_キュー番号,size(_度数)). % 以下のサイトは % % tic-tac-toe検査 % 'tic-tac-toe検査'(LL) :- member([A,A,A],LL). 'tic-tac-toe検査'(LL) :- between(1,3,_nth1), findall(A,( member(L,LL), nth1(_nth1,L,A)), [A,A,A]). 'tic-tac-toe検査'(LL) :- 'tic-tac-toe角行検査'(LL,[1,2,3]). 'tic-tac-toe検査'(LL) :- 'tic-tac-toe角行検査'(LL,[3,2,1]). 'tic-tac-toe角行検査'(LL,_順序ならび) :- findall(L,( member(_nth1,_順序ならび), nth1(_nth1,LL,L), nth1(_nth1,L,A)), [A,A,A]). % 以下のサイトは # # 述語名は'$解の度数','$射影項' の述語名は必須ではない。 # :- dynamic(['$解の度数'/2,'$射影項'/2]). 解の数を制限した全解照会(_限界実行回数,_射影項,_実行項,_射影項ならび) :- 履歴管理(_管理指標), forall(解の数を制限した解照会(_限界実行回数,_管理指標,_射影項,_実行項),true), 射影項の収集(_管理指標,_射影項ならび). 解の数を制限した解照会(_限界実行回数,_管理指標,_射影項,_実行項) :- 解の数を勘定しながらの実行(_管理指標,N,_射影項,_実行項), ( N = _限界実行回数; N = _限界実行回数,!,fail; asserta('$解の度数'(_管理指標,N))). 解の数を勘定しながらの実行(_管理指標,N,_射影項,_実行項) :- call(_実行項), 解は既出解を捨てて収集する(_管理指標,_射影項,_実行項), retract('$解の度数'(_管理指標,N_1)), succ(N_1,N). 解は既出解を捨てて収集する(_管理指標,_射影項,_実行項) :- \+(catch('$射影項'(_管理指標,_射影項),E,fail)), asserta('$解の度数'(_管理指標,_射影項)),!. 履歴管理(_管理指標) :- _管理指標 is random(2147483647), \+(catch('$射影項'(_管理指標,_),E,fail)), asserta('$解の度数'(_管理指標,0)),!. 履歴管理(_管理指標) :- 履歴管理(_管理指標). 射影項の収集(_管理指標,_射影項ならび) :- findall(_射影項,'$射影項'(_管理指標,_射影項)),_射影項ならび). % 以下のサイトは # 出典: C/C++の宿題片付けます 167代目 #698 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # ?以下のプログラムを作成しなさい. # 5件の数字を入力し、上位3位までの # 数字を順に表示する # (数字の大きい順) # # 実行例) # 22 入力1 # 30 入力2 # 10 入力3 # 40 入力4 # 2 入力5 # 40 30 22 出力 # 123 入力1 # 25 入力2 # 294 入力3 # -100 入力4 # 80 入力5 # 294 123 80 出力 # -20 入力1 # -25 入力2 # -394 入力3 # -50 入力4 # -80 入力5 # -20 -25 -50 出力 # [3] 環境 . #  [3.1] Windows 8.1 #  [3.2] Visual studio 2013 #  [3.3] C # [4] 期限:2014年7月14日0:00 '5件の数字を入力し、上位3位までの 数字を順に表示する (数字の大きい順)' :- '5件の数字を入力し、'(_5件の数字ならび), '上位3位までの数字を順に表示する(数字の大きい順)'(_5件の数字ならび). '5件の数字を入力し、'(_5件の数字ならび) :- findall(_数字,( 数字の入力(_数字)), _5件の数字ならび). 数字の入力(_数字) :- append(L1,[_件目|R],[1,2,3,4,5]), length([_件目|R],_残り件数), writef('%t件目(残り%t件) の数字を入力して下さい : ',[_件目,_残り件数]), read(_数字). '上位3位までの数字を順に表示する(数字の大きい順)'(_5件の数字ならび) :- '上位3位までの数字を順に(数字の大きい順)'(_5件の数字ならび,[],_上位3位までの数字ならび), 表示する(_上位3位までの数字ならび). '上位3位までの数字を順に(数字の大きい順)'([],[_1,_2,_3|_],[_1,_2,_3]). '上位3位までの数字を順に(数字の大きい順)'([M|R1],L1,_上位3位までの数字ならび) :- 挿入(M,L1,L2), '上位3位までの数字を順に(数字の大きい順)'(R1,L2,_上位3位までの数字ならび). 挿入(M,[],[M]). 挿入(M,[N|R],[M,N|R]) :- M >= N,!. 挿入(M,[N|R2],[N|R3]) :- M < N, 挿入(M,R2,R3). 表示する(_上位3位までの数字ならび) :- writef('%t %t %t\n',_上位3位までの数字ならび). % 以下のサイトは # 出典: twitter_by_@mooopan_20140711 # Prologで[cell(1,_a),cell(2,_a)]と[cell(1,1),cell(1,2),cell(2,1),cell(2,2),cell(3,1),cell(3,2)]から[cell(1,1),cell(1,2),cell(2,1),cell(2,2)]を得たい 'Prologで[cell(1,_a),cell(2,_a)]と [cell(1,1),cell(1,2),cell(2,1),cell(2,2),cell(3,1),cell(3,2)]から [cell(1,1),cell(1,2),cell(2,1),cell(2,2)]を得たい'(L1,L2,X) :- findall(cell(A,C),( member(cell(A,B),L1), member(cell(A,C),L2)), X). % 以下のサイトは 魔方陣(_魔方陣) :- 魔方陣の構成要素を得る(_魔方陣,Ln1,Ln2,_数ならび), 魔方陣を構成してみる(Ln1,Ln2,_数ならび,_行_列_合計,_魔方陣), 魔方陣列検査(_魔方陣,_行_列_合計). 魔方陣の構成要素を得る(_魔方陣,Ln1,Ln2,_数ならび) :- length(_魔方陣,_n), length(Ln1,_n), length(Ln2,_n), _n掛けるn is _n * _n, findall(M,between(1,_n掛けるn,M),_数ならび). 魔方陣を構成してみる([],Ln2,_,_行の合計,[]). 魔方陣を構成してみる([_|Ln1],Ln2,_数ならび_1,_行の合計,[L|R]) :- 魔方陣の一行を得る(Ln2,_数ならび_1,L,_数ならび_2), sum_list(L,_行の合計), 魔方陣を構成してみる(Ln1,Ln2,_数ならび_2,_行の合計,R). 魔方陣の一行を得る([],_残り数ならび,[],_残り数ならび). 魔方陣の一行を得る([_|Ln],_数ならび_1,[_n|R4],_残り数ならび) :- select(_n,_数ならび_1,_数ならび_2), 魔方陣の一行を得る(Ln,_数ならび_2,R4,_残り数ならび). 魔方陣列検査(_行列,_行_列の合計) :- 転置(_行列,_転置行列), 行の合計が全て一致する(_転置行列,_行_列の合計). 行の合計が全て一致する([],_). 行の合計が全て一致する([L|R],S) :- sum_list(L,S), 行の合計が全て一致する(R,S). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #466 # お題 # 昇順の数列A[a0,a1,..,an]とAの要素amを一つ指定する # Aの要素からなる数列Bを与えて[am,am+1,..,an,a0,a1,..,am-1]の順番で整列させよう # 例 # 入: A = [2,3,5,7,9], a = 2, B = [9,2,5] # 出: [2,5,9] # 入: A = [2,3,5,7,9], a = 9, B = [9,2,5] # 出: [9,2,5] # 入: A = [2,3,5,7,9], a = 5, B = [9,2,5] # 出: [5,9,2] # 入: A = [2,3,5,7,9], a = 3, B = [9,2,5,5,2] # 出: [5,5,9,2,2] '昇順の数列A[a0,a1,..,an]とAの要素amを一つ指定する Aの要素からなる数列Bを与えて[am,am+1,..,an,a0,a1,..,am-1]の順番で整列させよう'(A,_am,B,_整列したならび) :- '[am,am+1,..,an,a0,a1,..,am-1]の順番で'(A,_am,_順番ならび), 整列させよう(B,_順番ならび,_整列したならび). '[am,am+1,..,an,a0,a1,..,am-1]の順番で'(A,_am,_順番ならび) :- append(L1,[_am|L2],A), append([_am|L2],L1,_順番ならび),!. 整列させよう(B,_順番ならび,_整列したならび) :- findall(_a,( append(L0,[_a|_],_順番ならび), \+(member(_a,L0)), member(_a,B)), _整列したならび). % 以下のサイトは # 出典: 問題 # 詳細な問題文 # 私のツイート(1) # 私のツイート(2) # 私のツイート(3) # Dは前に二人いると言っているから3人以上の部屋にいる。 # 部屋は4人1部屋か、3人と1人の二つの可能性しかない。 # 自分が前から2人目を主張するCは必然的に4人または3人の部屋にいる # この部屋のCの主張から先頭が白で、Dの主張から1人目2人目は白か黒のどちらだから2人目のCは黒とわかる # 'Dは前に二人いると言っているから3人以上の部屋にいる。部屋は4人1部屋か、3人と1人のふた部屋の、二つの可能性しかない'(LL) :- length([_,_,D|_],N), findall(L,'3人以上の部屋がある'(L),LL). '3人以上の部屋にいる'(L) :- 総組合せ([1,2,3,4],L), sum_list(L,4), member(M,L), M >= 3. 総組合せ([],_). 総組合せ(L1,L2) :- length(L1,N), between(1,N,D), 重複組合せ(L1,D,L2). 重複組合せ(X,1,[A]) :- member(A,X). 重複組合せ([A|Y],N,[A|X]) :- N > 1, M is N - 1, 重複組合せ([A|Y],M,X). 重複組合せ([_|Y],N,A) :- N > 1, 重複組合せ(Y,N,A). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #393 # 文字列A(2≦N≦100000)が与えられる # どうしていするかな # うしていするかなど # していするかなどう # ていするかなどうし # いするかなどうして # するかなどうしてい # るかなどうしていす # かなどうしていする # などうしていするか 例('どうしていするかな うしていするかなど していするかなどう ていするかなどうし いするかなどうして するかなどうしてい るかなどうしていす かなどうしていする などうしていするか'). '文字列A(2≦N≦100000)が与えられる どうしていするかな うしていするかなど していするかなどう ていするかなどうし いするかなどうして するかなどうしてい るかなどうしていす かなどうしていする などうしていするか'(_文字列,_一文字づつ回転した文字列ならび) :- '文字列A(2≦N≦100000)が与えられる。全文を回転して、例と一致するか調べる。 一致した場合の題意は 「文字列A(2≦N≦100000)が与えられる。文字列を一文字づつ回転する。(ただし最終行は元に戻らない)」 であると考えられる', '文字列A(2≦N≦100000)が与えられる。文字列を一文字づつ回転する。(ただし最終行は元に戻らない)'(_文字列,_一文字づつ回転した文字列ならび). '文字列A(2≦N≦100000)が与えられる。全文を回転して、例と一致するか調べる。 一致した場合の題意は 「文字列A(2≦N≦100000)が与えられる。文字列を一文字づつ回転する。(ただし最終行は元に戻らない)」 であると考えられる' :- 例(_回転する例文), '文字列A(2≦N≦100000)が与えられる。文字列を一文字づつ回転する。(ただし最終行は元に戻らない)'(どうしていするかな,_一文字づつ回転した文字列ならび), atomic_list_concat(_一文字づつ回転した文字列ならび,'\n',_回転する例文). '文字列A(2≦N≦100000)が与えられる。文字列を一文字づつ回転する。(ただし最終行は元に戻らない)'(_文字列,_一文字づつ回転した文字列ならび) :- findall(_一文字づつ回転して文字列,( 文字列を一文字づつ回転する(_文字列,_一文字づつ回転した文字列,R), ただし最終行は元に戻らない(R)), _一文字づつ回転した文字列ならび). 文字列を一文字づつ回転する(_文字列,_一文字づつ回転した文字列,R) :- sub_atom(_文字列,0,N,R,_副文字列_1), sub_atom(_文字列,N,R,0,_副文字列_2), atom_concat(_副文字列_2,_副文字列_1,_一文字づつ回転した文字列). ただし最終行は元に戻らない(R) :- \+(R = 0). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '文字列A(2≦N≦100000)が与えられる。文字列を一文字づつ回転する。(ただし最終行は元に戻らない)'(_文字列,_文字列長,_回転する例文) :- atom_concat(_文字列,_文字列,_連結した文字列), findall(_副文字列,( sub_atom(_連結した文字列,_,_文字列長,_残り文字数,_副文字列), \+(_残り文字数 = 0)), _位置文字づつ回転した文字列ならび), atomic_list_concat(_位置文字づつ回転した文字列ならび,'\n',_回転する例文). % 以下のサイトは # # min-heapで以下のクエリを実装せよ # # 1.push(t, v) 時刻tに値vをpushするクエリがあったことにする # 2.pop(t) 時刻tにおける最小値をpopしたことにする # 3.min(t)時刻tにおける最小値を出力する # 時刻tに値vをpushするクエリがあったことにする(_t,_v,_stack,[[_t,_v]|_stack]). 時刻tにおける最小値をpopしたことにする(_t,_stack_1,_stack_2) :- findmin(_v,member([_t,_v],_stack_1),_min), findall([_t_1,_v_1],( member([_t_1,_v_1],_stack_1), \+((_t_1=_t,_v_1=_min))), _stack_2). 時刻tにおける最小値を出力する(_t,_stack_1,_stack_2) :- findmin(_v,member([_t,_v],_stack_1),_min), writef('%t',[_min]). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #353 # # 素数pと素数qから(p-1)と(q-1)の最小公倍数を求める。 # 最大p*qまでの数で、n*最小公倍数+1の集合を求める。 # この集合の中から、eで割り切れる数を探す。 # 例:p=5,q=7:(5-1)と(7-1)つまり4と6の最小公倍数は12。 # 例:p*q=35なので12+1,24+1,36+1(>35)つまり13と25。 # 例:25/5=5=dとなる。eは割り切れる数があらかじめ入力される。 '素数pと素数qから(p-1)と(q-1)の最小公倍数を求める。 最大p*qまでの数で、n*最小公倍数+1の集合を求める。 この集合の中から、eで割り切れる数を探す。'(_p,_q,_e,X) :- _n is _p * _q, '素数pと素数qから(p-1)と(q-1)の最小公倍数を求める。'(_p,_q,_最小公倍数), '最大p*qまでの数で、n*最小公倍数+1の集合を求める。'(_n,_最小公倍数,_集合), 'この集合の中から、eで割り切れる数を探す。'(_集合,_e,X). '素数pと素数qから(p-1)と(q-1)の最小公倍数を求める。'(_p,_q,_最小公倍数) :- _p_1 is _p - 1, _q_1 is _q - 1, 最小公倍数(_p_1,_q_1,_最小公倍数). '最大p*qまでの数で、n*最小公倍数+1の集合を求める。'(_n,_最小公倍数,_集合) :- findall(_s,( between(1,_n,_), _s is _n * _最小公倍数 + 1), _集合). 'この集合の中から、eで割り切れる数を探す。'(_集合,_e,X) :- member(X,_集合), 0 is X mod _e. 最小公倍数(A,B,X) :- 最大公約数をユークリッドの互除法で求める(A,B,C), X is A * B // C. 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). % 以下のサイトは '与えられた数値を先頭から順に桁ごとに区切って使って数列を作りる'(_与えられた数値,_全数値分割) :- number_chars(_与えられた数値,_数字ならび), findall(_数値分割,( 数字ならびから数値分割(_数字ならび,_数値分割)), _全数値分割). 数字ならびから数値分割([],[]). 数字ならびから数値分割(_数字ならび,[N|LL2]) :- append(L1,L2,_数字ならび), number_chars(N,L1), 数字ならびから数値分割(L2,LL2). % 以下のサイトは # お題:与えられた数値を先頭から順に桁ごとに区切って使って数列を作り、隣り合う数の「差の二乗」の合計が最大になるような分割を求めよ。 # 例:123は、1,23 1,2,3 12,3のように分割出来る。 # 1,23 ---> 22*22 ---> 484 # 1,2,3 ---> 1*1+1*1 --> 2 # 12,3 ---> 9*9 ---> 81 # です。 '与えられた数値を先頭から順に桁ごとに区切って使って数列を作り、 隣り合う数の「差の二乗」の合計が最大になるような分割を求めよ。'(_与えられた数値列,_隣り合う数の差の二乗の合計が最大になるような分割) :- '与えられた数値を先頭から順に桁ごとに区切って使って数列を作り、'(_与えられた数値,_全数値分割), '隣り合う数の「差の二乗」の合計が最大になるような分割を求めよ。'(_全数値分割,_隣り合う数の差の二乗の合計が最大になるような分割). '与えられた数値を先頭から順に桁ごとに区切って使って数列を作り、'(_与えられた数値,_全数値分割) :- number_chars(_与えられた数値,_数字ならび), findall(_数値分割,( 数字ならびから数値分割(_数字ならび,_数値分割)), _全数値分割). 数字ならびから数値分割([],[]). 数字ならびから数値分割(_数字ならび,[N|LL2]) :- append(L1,L2,_数字ならび), number_chars(N,L1), 数字ならびから数値分割(L2,LL2). '隣り合う数の「差の二乗」の合計が最大になるような分割を求めよ。'(_全数値分割,_隣り合う数の差の二乗の合計が最大になるような分割) :- findall(_隣り合う数の差の二乗の合計,( member(_分割,_全数値分割), '隣り合う数の「差の二乗」の合計が'(_分割,_隣り合う数の差の二乗の合計)), _隣り合う数の差の二乗の合計ならび), 最大になるような分割(_全数値分割,_隣り合う数の差の二乗の合計ならび,_合計の最大値). '隣り合う数の「差の二乗」の合計が'(_全数値分割,_隣り合う数の差の二乗の合計) :- findsum(_隣り合う数の差の二乗,( append(_,[N1,N2|_],_全数値分割), _隣り合う数の差の二乗 is (N1 - N2) ^ 2), _隣り合う数の差の二乗の合計). 最大になるような分割(_全数値分割,_隣り合う数の差の二乗の合計ならび,_隣り合う数の差の二乗の合計が最大になるような分割) :- 最大になる(_隣り合う数の差の二乗の合計ならび,_位置,_合計の最大値), nth1(_位置,_全数値分割,_隣り合う数の差の二乗の合計が最大になるような分割). 最大になる(_隣り合う数の差の二乗の合計ならび,_位置,_合計の最大値) :- append(L1,[_合計の最大値|L2],_隣り合う数の差の二乗の合計ならび), forall(member(N1,L1),N1 =< _合計の最大値), forall(member(N2,L2),N2 =< _合計の最大値), length([_|L1],_位置). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). % 以下のサイトは # 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])). % 以下のサイトは # 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 # '_行数 is S * L, S(1≦S≦10) L(100≦L≦100) 標準入力から以下の形式で与えられる S L' :- 'S Lを得る'(S,L), 行パターンABを得る(S,L,A,B), findall(AorB,( between(1,L,N), 'AorB'(N,A,B,AorB)), X), 出力する(X). 'S Lを得る'(S,L) :- get_line(Line), split(Line,[' '],[S,L]). 出力する(LL) :- flatten(LL,L), forall(member(A,L),format('~w\n',[A])). 'AorB'(N,A,_,A) :- 1 is N mod 2. 'AorB'(N,_,B,B) :- 0 is N mod 2. 行パターンABを得る(S,L,A,B) :- 合計L行(L,白,黒,S,L,A), 合計L行(L,黒,白,S,L,B). 合計L行(0,_,_,_,_,[]) :- !. 合計L行(L_2,_文字_1,_文字_2,S,L,[_行文字列|R]) :- 行文字列(_文字_1,_文字_2,S,L,_行文字列), succ(L_1,L_2), 合計L行(L_1,_文字_1,_文字_2,S,L,R). 行文字列(_,_,_,0,'') :- !. 行文字列(_文字_1,_文字_2,S,L,_文字列) :- 連続文字列(_文字_1,S,_連続文字列), succ(L_1,L), 行文字列(_文字_2,_文字_1,S,L_1,_連続文字列_1), atom_concat(_連続文字列,_連続文字列_1,_文字列). 連続文字列(_文字,S,_連続文字列) :- findall(_文字,between(1,S,_),L), atom_chars(_連続文字列,L). % 以下のサイトは # # append/4からappend/nまでを一気に定義してしまう、 'append/4から/nの定義'/1 。 # append/nの定義、 'append/nの定義'/1 。 # 'append/4からappend/nの定義'(_n) :- between(4,_n,M), 'abolish_append/n'(M), 'append/nの定義'(M), _n = M. 'append/nの定義'(_n) :- 'L2からLnまで'(_n,_L2_Ln), 'L2からLn_1まで'(_n,_L2_Ln_1), 'L1からLnまで'(_n,_L1_Ln), 'append/nの定義'(_n,_L2_Ln,_L2_Ln_1,_L1_Ln). 'append/nの定義'(_n,_L2_Ln,_L2_Ln_1,_L1_Ln) :- 'append/nの第一節の定義'(_n,_L2_Ln), 'append/nの第二節の定義'(_n,_L2_Ln_1,_L1_Ln). 'append/nの第一節の定義'(_n,_L2_Ln) :- format(atom(S1),'append([],~w) :-~n append(~p).~n',[_L2_Ln,_L2_Ln]), read_term_from_atom(S1,Clause_1,[variables(_変数ならび),variable_names(_変数名ならび)]), assertz(Clause_1). 'append/nの第二節の定義'(_n,_L2_Ln_1,_L1_Ln) :- format(atom(S2),'append([U|L1],~w,[U|L~p]) :-~n append(~w).\n',[_L2_Ln_1,_n,_L1_Ln]), read_term_from_atom(S2,Clause_2,[variables(_変数ならび),variable_names(_変数名ならび)]), assertz(Clause_2). 'L2からLnまで'(_n,_L2_Ln) :- findall(A,( between(2,_n,M), atom_concat('L',M,A)), L), atomic_list_concat(L,',',_L2_Ln). 'L2からLn_1まで'(_n,_L2_Ln_1) :- _m is _n - 1, findall(A,( between(2,_m,M), atom_concat('L',M,A)), L), atomic_list_concat(L,',',_L2_Ln_1). 'L1からLnまで'(_n,_L1_Ln) :- findall(A,( between(1,_n,M), atom_concat('L',M,A)), L), atomic_list_concat(L,',',_L1_Ln). 'abolish_append/n'(_n) :- abolish(append,_n). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #224 # # お題:自然数nが偶数なら2で割り、奇数なら1を足して3を掛ける操作を値が3になるまで繰り返す。10000以下でこの操作の繰り返し回数が最大となる自然数nを求める。 # '自然数nが偶数なら2で割り、奇数なら1を足して3を掛ける操作を値が3になるまで繰り返す。10000以下でこの操作の繰り返し回数が最大となる自然数nを求める。'(_自然数n) :- findall([_繰り返し回数,_自然数n],( between(1,10000,_自然数n), '自然数nが偶数なら2で割り、奇数なら1を足して3を掛ける操作を値が3になるまで繰り返す。'(_自然数n,_繰り返し回数)), _繰り返し数_自然数nならび), 繰り返し数が最大の自然数nを得る(_繰り返し数_自然数nならび,_自然数n). '自然数nが偶数なら2で割り、奇数なら1を足して3を掛ける操作を値が3になるまで繰り返す。'(_n,_繰り返し回数) :- '自然数nが偶数なら2で割り、奇数なら1を足して3を掛ける操作を値が3になるまで繰り返す。'(_n,0,_繰り返し回数). '自然数nが偶数なら2で割り、奇数なら1を足して3を掛ける操作を値が3になるまで繰り返す。'(3,_繰り返し回数,_繰り返し回数) :- !. '自然数nが偶数なら2で割り、奇数なら1を足して3を掛ける操作を値が3になるまで繰り返す。'(_n,_繰り返し回数_1,_繰り返し回数) :- '偶数なら2で割り、奇数なら1を足して3を掛ける操作を'(_n,_n_2), succ(_繰り返し回数_1,_繰り返し回数_2), '自然数nが偶数なら2で割り、奇数なら1を足して3を掛ける操作を値が3になるまで繰り返す。'(_n_2,_繰り返し回数_2,_繰り返し回数). '偶数なら2で割り、奇数なら1を足して3を掛ける操作を'(_n,_n_2) :- 偶数(_n), _n_2 is _n // 2,!. '偶数なら2で割り、奇数なら1を足して3を掛ける操作を'(_n,_n_2) :- 奇数(_n), _n_2 is (_n + 1) * 3. 繰り返し数が最大の自然数nを得る(_繰り返し数_自然数nならび,_自然数n) :- findmax(_繰り返し回数,( member([_繰り返し回数,_],_繰り返し数_自然数nならび)), _最大繰り返し回数), member([_最大繰り返し回数,_自然数n],_繰り返し数_自然数nならび). 偶数(_n) :- 0 is _n mod 2. 奇数(_n) :- 1 is _n mod 2. findmax(A,P,Max) :- findall(A,P,L), 最大値(L,Max). 最大値(L,_最大値) :- L = [A|R], 最大値(R,A,_最大値). 最大値([],_最大値,_最大値). 最大値([A|R],_これまでの最大値,_最大値) :- _これまでの最大値 @>= A, 最大値(R,_これまでの最大値,_最大値),!. 最大値([A|R],_,_最大値) :- 最大値(R,A,_最大値). % 以下のサイトは # プログラミングのお題スレ Part4 #197 # アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。 # 例に沿って連続する文字をカウントするプログラムを作成せよ。 # # 出力の最後に改行を挿入すること。 # 標準入力から以下の形式で与えられる。 # S # # 例) # In: # aaaaaaaaaabbbbbbbbbbbbcccccccddddddddddeeeeeeefffffffffghiiiiiiiii # # Out: # a10b12c7d10e7f9ghi9 # # In: # # Out: # 0 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。 例に沿って連続する文字をカウントするプログラムを作成せよ。 出力の最後に改行を挿入すること。 標準入力から以下の形式で与えられる。' :- 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(_文字ならび), 連続する文字をカウントする(_文字ならび,_文字_連続数ならび), 出力する(_文字_連続数ならび). 連続する文字をカウントする(L4,_文字_連続数ならび) :- findall([_文字,_連続数],( append(L1,L2,L3,L4), 'L2は限界連続文字ならび'(L1,L2,L3,_文字,_連続数)), _文字_連続数ならび). 'L2は限界連続文字ならび'(L1,L2,L3,_文字,_連続数) :- all(L2,_文字), \+(nth1(1,L3,_文字)), \+(last(L1,_文字)), length(L2,_連続数). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). all([],_). all([A|R],A) :- all(R,A). 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(_文字ならび) :- length(S,100), write('In: '), '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'(_文字), 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(S,_文字,_文字ならび). 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる,'([],_,[]) :- !. 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(_,end_of_file,[]) :- !. 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(_,'\n',[]) :- !. 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる'([_|S],_文字,[_文字|R]) :- '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'(S,_次の文字), 'アルファベットの小文字aからzで成り立つS(S,0≦S≦100)が標準入力から与えられる。'(S,_次の文字,R). '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'(end_of_file) :- !. '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'('\n') :- !. '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'(_文字) :- get_char(_文字), 文字はアルファベットの小文字aからzで成り立つ(_文字),!. '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'(_文字) :- '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'(_文字). 文字はアルファベットの小文字aからzで成り立つ(end_of_file) :- !. 文字はアルファベットの小文字aからzで成り立つ('\n') :- !. 文字はアルファベットの小文字aからzで成り立つ(_文字) :- _文字 @>= 'a', _文字 @=< 'z',!. 出力する(LL) :- flatten(LL,L), atomic_list_concat(L,_出力文字列). writef('Out:\n%t\n',[_出力文字列]). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #132 # お題:ふたつの自然数が与えられたとき、数字が一致している桁の個数を求める。 # 例 # 110, 119 -> 2 # 1234, 214 -> 2 # 567, 23 -> 0 # 'ふたつの自然数が与えられたとき、数字が一致している桁の個数を求める'(_自然数_1,_自然数_2,_数字が一致している桁の個数) :- ふたつの自然数をふたつの数字文字列に変換(_自然数_1,_自然数_2,_数字文字列_1,_数字文字列_2), 数字が一致している桁の個数を求める(_数字文字列_1,_数字文字列_2,_数字が一致している桁の個数). ふたつの自然数をふたつの数字文字列に変換(_自然数_1,_自然数_2,_数字文字列_1,_数字文字列_2) :- atom_number(_数字文字列_1,_自然数_1), atom_number(_数字文字列_2,_自然数_2). 数字が一致している桁の個数を求める(_数字文字列_1,_数字文字列_2,_数字が一致している桁の個数) :- 個数を求める(数字が一致している桁の(_数字文字列_1,_数字文字列_2),_数字が一致している桁の個数). 数字が一致している桁の(_数字文字列_1,_数字文字列_2) :- sub_atom(_数字文字列_1,_,1,_残り文字数,_数字), sub_atom(_数字文字列_2,_,1,_残り文字数,_数字). 個数を求める(_実行項,_個数) :- findall(1,_実行項,L), length(L,_個数). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #132 # お題:ふたつの整数が与えられたとき、数字が一致している桁の個数を求める。 # 例 # 110, 119 -> 2 # 1234, 214 -> 2 # 567, 23 -> 0 # :- op(600,xfx,'個数を求める。'). 'ふたつの整数が与えられたとき、数字が一致している桁の個数を求める。'(_数_1,_数_2,_数字が一致している桁の個数) :- ふたつの整数をふたつの数字文字列に変換(_数_1,_数_2,_数字文字列_1,_数字文字列_2), '数字が一致している桁の個数を求める。'(_数字文字列_1,_数字文字列_2,_数字が一致している桁の個数). ふたつの整数をふたつの数字文字列に変換(_数_1,_数_2,_数字文字列_1,_数字文字列_2) :- atom_number(_数字文字列_1,_数_1), atom_number(_数字文字列_2,_数_2). '数字が一致している桁の個数を求める。'(_数字文字列_1,_数字文字列_2,_数字が一致している桁の個数) :- 数字が一致している桁の(_数字文字列_1,_数字文字列_2) '個数を求める。' _数字が一致している桁の個数. '数字が一致している桁の'(_数字文字列_1,_数字文字列_2) :- sub_atom(_数字文字列_1,_,1,_残り文字数,_数字), sub_atom(_数字文字列_2,_,1,_残り文字数,_数字), \+(_数字 = '-'). '個数を求める。'(P,_個数). findall(1,P,L), length(L,_個数). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #132 # お題:ふたつの整数が与えられたとき、数字が一致している桁の個数を求める。 # 例 # 110, 119 -> 2 # 1234, 214 -> 2 # 567, 23 -> 0 # 'ふたつの整数が与えられたとき、数字が一致している桁の個数を求める。'(_数_1,_数_2,_数字が一致している桁の個数) :- number_chars(_数_1,_数字ならび_1), number_chars(_数_2,_数字ならび_2), reverse(_数字ならび_1,_反転した数字ならび_1), reverse(_数字ならび_2,_反転した数字ならび_2), '数字が一致している桁の個数を求める。'(_反転した数字ならび_1,_反転した数字ならび_2,_数字が一致している桁の個数). '数字が一致している桁の個数を求める。'(_反転した数字ならび_1,_反転した数字ならび_2,_数字が一致している桁の個数) :- '個数を調べる。'(数字が一致している桁の(_反転した数字ならび_1,_反転した数字ならび_2,_数字が一致している桁),_数字が一致している桁の個数). '数字が一致している桁の'(L1,L2,_数字が一致している桁) :- nth1(_数字が一致している桁,L1,_数字), nth1(_数字が一致している桁,L2,_数字), ('L1かL2のどちらかが[]の時'(L1,L2),!,fail;true). 'L1かL2のどちらかが[]の時'([],_) :- !. 'L1かL2のどちらかが[]の時'(_,[]). '個数を調べる。'(P,_個数) :- findall(1,P,L), length(L,_個数). % 以下のサイトは # 出典: twitter_by_@_ktwr_20140620 # 出典: Qiita::Prologカットについて # # stream を使って書きなおしてみる。 "findallterm_from_stream.pro"に保存。 # findallterm_from_stream(Stream,_):- at_end_of_stream(Stream),!. findallterm_from_stream(Stream,Term) :- read(Stream,Term0), process(Term0,Term), findallterm_from_stream(Stream,Term). process(Term0,Term) :- \+(Term0=Term),!. process(Term0,_) :- write(Term0), nl. :- open('findallterm_from_stream.pro',read,Input), findallterm_from_stream(Input,_), close(Input). findallterm_from_stream(_G1737,_G1738):-at_end_of_stream(_G1737),! findallterm_from_stream(_G1748,_G1749):-read(_G1748,_G1752),process(_G1752,_G1749),findallterm_from_stream(_G1748,_G1749) process(_G1769,_G1770):- \+_G1769=_G1770,! process(_G1783,_G1784):-write(_G1783),nl Input = (0x8e49350). % 以下のサイトは # 出典: twitter_by_@mandel59_20140619 # # 1) 「1から10までの数」を用意する。 # 2) 用意したデータの各要素を「すべて足す」という操作をする。 # これはまさに手続きだ '1) 「1から10までの数」を用意する。 2) 用意したデータの各要素を「すべて足す」という操作をする。 これはまさに手続きだ'(_合計) :- '1) 「1から10までの数」を用意する。'(LL), '2) 用意したデータの各要素を「すべて足す」という操作をする。'(LL,_合計). '1) 「1から10までの数」を用意する。'(LL) :- findall(L,( nth1(_,L,_)), LL). '2) 用意したデータの各要素を「すべて足す」という操作をする。'(LL,_合計) :- flatten(LL,L), length(L,_合計). % 以下のサイトは # 出典: プログラミングのお題スレ Part3 #935 # # W=横の長さ、H=縦の長さ # 2<=W<=1000、2<=H<=1000 # 箱の枠は「+」、箱の中は「@」で出力しなさい # # 入力は以下の形式で標準入力から与えられます # W H # # 例 # --------------------- # 2 2 # ++ # ++ # --------------------- # 10 4 # ++++++++++ # +@@@@@@@@+ # +@@@@@@@@+ # ++++++++++ '# W=横の長さ、H=縦の長さ 2<=W<=1000、2<=H<=1000 箱の枠は「+」、箱の中は「@」で出力しなさい 入力は以下の形式で標準入力から与えられます W H' :- 標準入力からWとHを得る(W,H), split(Line,[' '],[W,H]), 全体像(W,H,_全体像), 全体像を描画する(_全体像). 標準入力からWとHを得る(W,H) :- read_line_to_codes(Codes,[]), 中間の32を一個のの44に置き換える(Codes,Codes2), string_to_atom(Codes2,Atom), read_term_from_atom(Atom,(W,H,[]). 中間の32を一個のカンマに置き換える(Codes,Codes2) :- append(L1,L2,L3,Codes), all(L2,32), \+(member(32,L1)), \+(member(32,L2)), append(L1,[44|L3],Codes2). 全体像(W,H,_全体像) :- findall(L,( between(1,H,_), findall(_,( between(1,W,_)), L)), _全体像), 全体像(_全体像). 全体像(_全体像) :- append([_第一行],_中間行ならび,[_最終行],_全体像), all(_第一行,'+'), all(_最終行,'+'), '内側は先頭要素と最後の要素が+、中間要素は@となる'(_中間行ならび). '内側は先頭要素と最後の要素が+、中間要素は@となる'([]). '内側は先頭要素と最後の要素が+、中間要素は@となる'([L|R]) :- '先頭要素と最後の要素が+、中間要素は@となる'(L), '内側は先頭要素と最後の要素が+、中間要素は@となる'(R). '先頭要素と最後の要素が+、中間要素は@となる'(L) :- append(['+'],L2,['+'],L), all(L2,'@'),!. 全体像を描画する([]). 全体像を描画する([L|R]) :- atom_chars(_行表示,L), writef('%t\n',[_行表示]), 全体像を描画する(R). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% all([]). all([A|R],A) :- all(R,A). append([],L2,L3,L4) :- append(L2,L3,L4). append([A|L1],L2,L3,[A|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは # 出題: プログラミングのお題スレ Part3 #902 # # お題:文字列sにあるn個の文字からなる集合を # 要素とする集合をつくる # # 例1:以下n=2 # "today"-> {to td ta ty od oa oy da dy ay} # "book" -> {bo bk ok} # "ababab" -> {ab} # "ab" -> {ab} # "aa" -> {} # "a" -> {} # "" -> {} # # 例2:以下n=3 # "today"-> {tod toa toy oda ody day dat ayt ayo} # "book" -> {boo bok okb} # "abc" -> {abc} # "ababab" ->{} # "ab" -> {} # "a" -> {} # "" -> {} 文字列にあるn個の文字からなる集合を要素とする集合をつくる(_文字列,_n,_文字列集合要素) :- atom_chars(_文字列,_文字ならび), 要素の重複を取り除いた文字ならび(_文字ならび,_要素に重複のない文字ならび), 組合せ(_要素に重複のない文字ならび,_n,_組合せ), atom_chars(_文字列集合要素,_組合せ). 要素の重複を取り除いた文字ならび(_文字ならび,_要素に重複のない文字ならび) :- findall(_文字,( append(L1,[_文字|_],_文字ならび), \+(member(_文字,L1))), _要素に重複のない文字ならび). 組合せ(L,1,[A]) :- !, member(A,L). 組合せ([A|R1],N,[A|R2]) :- N_1 is N - 1, 組合せ(R1,N_1,R2). 組合せ([_|R1],N,L) :- 組合せ(R1,N,L). % 以下のサイトは # 出題: プログラミングのお題スレ Part3 #902 # # お題:文字列sにあるn個の文字からなる集合を # 要素とする集合をつくる # # 例1:以下n=2 # "today"-> {to td ta ty od oa oy da dy ay} # "book" -> {bo bk ok} # "ababab" -> {ab} # "ab" -> {ab} # "aa" -> {} # "a" -> {} # "" -> {} # # 例2:以下n=3 # "today"-> {tod toa toy oda ody day dat ayt ayo} # "book" -> {boo bok okb} # "abc" -> {abc} # "ababab" ->{} # "ab" -> {} # "a" -> {} # "" -> {} 文字列にあるn個の文字からなる集合を要素とする集合をつくる(_文字列,_n,_文字列集合要素) :- atom_chars(_文字列,_文字ならび), 文字列の要素の重複を取り除いた文(_文字ならび,_要素に重複のない文字ならび), 組合せ(_要素に重複のない文字ならび,_n,_組合せ), atom_chars(_文字列集合要素,_組合せ). 文字列の要素の重複を取り除いた文(_文字ならび,_要素に重複のない文字ならび) :- findall(_文字,( append(L1,[_文字|_],_文字ならび), \+(member(_文字,L1))), _要素に重複のない文字ならび). 組合せ(L,1,[A]) :- member(A,L). 組合せ([_先頭要素|_残りならび],N,[_先頭要素|_組合せ]) :- 'Nが1より大きい時、_残りならびから、一個少ない選択の組合せの前に先頭要素を付加する'(_残りならび,N,L). 組合せ([_|_残りならび],N,_組合せ) :- 'Nが1より大きい時、ならびの先頭要素を取り去った_残りならびから同じくN個取り出す組合せ'(_残りならび,N,L). 'Nが1より大きい時、_残りならびから、一個少ない選択の組合せの前に先頭要素を付加する'(_残り要素,N,_組合せ) :- N > 1, _一個少ない選択 is N - 1, 組合せ(_残りならび,_一個少ない選択,_組合せ). 'Nが1より大きい時、ならびの先頭要素を取り去った_残りならびから同じくN個取り出す組合せ'(_残りならび,N,_組合せ) :- N > 1, 組合せ(_残りならび,N,_組合せ). % 以下のサイトは # 出題: プログラミングのお題スレ Part3 #902 # # お題:文字列sにあるn個の文字からなる集合を # 要素とする集合をつくる # # 例1:以下n=2 # "today"-> {to td ta ty od oa oy da dy ay} # "book" -> {bo bk ok} # "ababab" -> {ab} # "ab" -> {ab} # "aa" -> {} # "a" -> {} # "" -> {} # # 例2:以下n=3 # "today"-> {tod toa toy oda ody day dat ayt ayo} # "book" -> {boo bok okb} # "abc" -> {abc} # "ababab" ->{} # "ab" -> {} # "a" -> {} # "" -> {} 文字列にあるn個の文字からなる集合を要素とする集合をつくる(_文字列,_n,_文字列集合要素) :- 文字列の重複文字を取り除く(_文字列,_重複を取り除いた文字列), 文字列組合せ(_重複を取り除いた文字列,_n,_文字列集合要素). 文字列の重複文字を取り除く(_文字列,_重複を取り除いた文字列) :- findall(_文字,( 既に採用されていない文字(_文字列,_文字)), _重複を取り除いた文字ならび), atom_chars(_重複を取り除いた文字列,_重複を取り除いた文字ならび). 既に採用されていない文字(_文字列,_文字) :- sub_atom(_文字列,S,1,_,_文字), sub_atom(_文字列,0,S,_,_前文字列), \+(sub_atom(_前文字列,_,1,_,_文字)). 文字列組合せ(_文字列,1,_文字) :- sub_atom(_文字列,_,1,_,_文字). 文字列組合せ(_文字列_1,N,_文字列) :- 先頭文字と残り文字列(_文字列,N,M,_先頭文字,_残り文字列), 文字列組合せ(_残り文字列,M,_残り文字列_2), atom_concat(_先頭文字,_残り文字列_2,_文字列). 文字列組合せ(_文字列_1,N,_文字列) :- 先頭文字を除く残り文字列(_文字列,1,_,0,_残り文字列), 文字列組合せ(_残り文字列,N,_文字列). 先頭文字と残り文字列(_文字列,N,M,_先頭文字,_残り文字列) :- N > 1, M is N - 1, sub_atom(_文字列,0,1,_,_先頭文字), sub_atom(_文字列,1,_,0,_残り文字列). 先頭文字を除く残り文字列(_文字列,1,_,0,_残り文字列) :- N > 1, sub_atom(_文字列,1,_,0,_残り文字列). % 以下のサイトは 色(赤). 色(青). 色(緑). 色(黄). 区画(a). 区画(b). 区画(c). 区画(d). 隣接(a,b). 隣接(b,d). 隣接(a,c). 隣接(c,d). 塗り絵(_区画の定義順に対応した区画色変数ならび) :- 色組合せならび(_色組合せならび), 区画変数組合せ(_区画の定義順に対応した区画色変数ならび,_区画変数組合せならび), 色合わせ(_色組合せならび,_区画変数組合せならび). 色組合せならび(_色組合せならび) :- findall(_色,色(_色),_色ならび), findall([_色_1,_色_2],( 色を双方向に順列で取る(_色_1,_色_2)), _色組合せならび). 色を順列で双方向に取る(_色_1,_色_2) :- 順列(_色ならび,2,[A,B]), 双方向に取る(A,B,_色_1,_色_2). 双方向に取る(A,B,A,B). 双方向に取る(A,B,B,A). 色合わせ(L1,L2) :- select([A,B],L2,R2), member([A,B],L1), 色合わせ(L1,R2). 区画変数組合せ(_区画変数ならび,_区画変数組合せならび) :- 区画名ならびと区画変数ならびを得る(_区画名ならび,_区画変数ならび), findall([_区画変数_1,_区画変数_2],( 順列(_区画名ならび,2,[_区画名_1,_区画名_2]), 区画変数に変換(_区画名_1,_区画名_2,_区画変数_1,_区画変数_2)), _区画変数組合せならび). 区画名ならびと区画変数ならびを得る(_区画名ならび,_区画変数ならび) :- findall(_区画名,区画(_区画名),_区画名ならび), length(_区画名ならび,_要素数), length(_区画変数ならび,_要素数),!. 区画変数に変換(_区画変数ならび,_区画名_1,_区画名_2,_区画変数_1,_区画変数_2) :- nth1(_nth1,_区画名ならび,_区画名_1), nth1(_nth2,_区画名ならび,_区画名_2), nth1(_nth1,_区画変数ならび,_区画変数_1_1), nth1(_nth2,_区画変数ならび,_区画変数_2_1), 双方向にに変換(_区画変数_1_1,_区画変数_2_1,_区画変数_1,_区画変数_2). 双方向に変換(_区画変数_1_1,_区画変数_2_1,_区画変数_1_1,_区画変数_2_1). 双方向に変換(_区画変数_1_1,_区画変数_2_1,_区画変数_2_1,_区画変数_1_1). % 以下のサイトは 色(赤). 色(青). 色(緑). 色(黄). 区画(a). 区画(b). 区画(c). 区画(d). 隣接(a,b). 隣接(b,d). 隣接(a,c). 隣接(c,d). 区画変数([_1,_2,_3,_4]). 塗り絵(_区画変数ならび) :- 色組合せならび(_色組合せならび), 区画変数組合せ(_区画変数組合せ), 色合わせ(_色組合せならび,_区画変数組合せ). 色組合せならび(_色組合せならび) :- findall(_色,色(_色),_色ならび), findall([_色_1,_色_2],( 色を双方向に順列で取る(_色_1,_色_2)), _色組合せならび). 色を順列で双方向に取る(_色_1,_色_2) :- 順列(_色ならび,2,[A,B]), 双方向に取る(A,B,_色_1,_色_2). 双方向に取る(A,B,A,B). 双方向に取る(A,B,B,A). 色合わせ(_,[]). 色合わせ(L1,L2) :- select([A,B],L2,R2), member([A,B],L1), 色合わせ(L1,R2). 区画変数組合せ(_区画変数ならび,_区画変数組合せならび) :- findall(_区画名,区画(_区画名),_区画名ならび), findall([_区画変数_1,_区画変数_2],( 順列(_区画名ならび,2,[_区画名_1,_区画名_2]), 区画変数に変換(_区画名_1,_区画名_2,_区画変数_1,_区画変数_2)), _区画変数組合せならび). 区画変数に変換(_区画名_1,_区画名_2,_区画変数_1,_区画変数_2) :- nth1(_nth1,_区画名ならび,_区画名_1), nth1(_nth2,_区画名ならび,_区画名_2), nth1(_nth1,_区画変数ならび,_区画変数_1_1), nth1(_nth2,_区画変数ならび,_区画変数_2_1), 双方向にに変換(_区画変数_1_1,_区画変数_2_1,_区画変数_1,_区画変数_2). 双方向に変換(_区画変数_1_1,_区画変数_2_1,_区画変数_1_1,_区画変数_2_1). 双方向に変換(_区画変数_1_1,_区画変数_2_1,_区画変数_2_1,_区画変数_1_1). % 以下のサイトは % 出典: 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). % 以下のサイトは % 出典: 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]). 丸ノ内線新宿駅池袋方面標準時刻表(_何時,_時刻ならび) :- 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). % 以下のサイトは % 出典: 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]). 丸ノ内線新宿駅池袋方面標準時刻表(_何時,_時刻ならび) :- 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). % 以下のサイトは % 出典: 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]). 丸ノ内線新宿駅池袋方面標準時刻表(_何時,_時刻ならび) :- between(11,14,_何時), '11時から14時までの時刻ならび'(1,[3,4,5],_時刻ならび). '11時から14時までの時刻ならび'(N,[],L) :- '11時から14時までの時刻ならび'(N,[3,4,5],L). '11時から14時までの時刻ならび'(N,[M|R2],[]) :- N > 59,!. '11時から14時までの時刻ならび'(N,[M|R2],[N|R3]) :- N2 is N + M, '11時から14時までの時刻ならび'(N2,R2,R3). % 以下のサイトは % 出典: 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]). % 以下のサイトは # 複数の持ち回りのタスクを、同じ人が連続しないとかの条件付きでスケヂュールしてくれるプログラム作るとしたら言語は何で作る? # あーエクセルでも出来そうだなー。なんか解の探索?みたいな問題になって、使ったことないけど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(_学生,学生(_学生,_),_研究進捗報告者ならび). % 以下のサイトは 九九表([ [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. % 以下のサイトは 覆面算(kadokawa+dwango+kada=kandouii,N1+N2+N3=N4,_文字と数字の対応) :- 覆面(kadokawa+dwango+kada=kandouii,L0_1,L0_2,L0_3,L1,L2,L3,L4), 覆面算(L0_3,L0_2), 覆面算計算(L1,L2,L3,L4,N1,N2,N3,N4), 文字と数字の対応(L0_1,L0_2,_文字と数字の対応). 覆面(A_1+A_2+A_3=A_4,L0_1,L0_2,L0_3,L1,L2,L3,L4) :- 文字出現順の決定([A_1,A_2,A_3,A_4],L0_1), findall(N,between(1,9,_),L0_2), L0_3 = ['1','2','3','4','5','6','7','8','9','0'], 覆面文字と変数の対応付け(L0_1,L0_2,A_1,A_2,A_3,A_4,L1,L2,L3,L4). 文字出現順の決定(L,L0_1) :- atomic_list_concat(L,A), atom_chars(A,Chars), 唯一の文字ならびを得る(Chars,L0_1). 要素に重複のない文字ならび(_文字ならび,_要素に重複のない文字ならび) :- findall(_文字,( append(L1,[_文字|_],_文字ならび), \+(member(_文字,L1))), _要素に重複のない文字ならび). 数式の対応付け(L0_1,L0_2,A_1,A_2,A_3,A_4,L1,L2,L3,L4) :- 数式の対応付け(L0_1,L0_2,A_1,L1), 数式の対応付け(L0_1,L0_2,A_2,L2), 数式の対応付け(L0_1,L0_2,A_3,L3), 数式の対応付け(L0_1,L0_2,A_4,L4). 覆面文字と変数の対応付け(L0_1,L0_2,_覆面文字列,_変数ならび) :- atom_chars(_覆面文字列,_覆面文字ならび), findall(V,( nth1(_nth1,_覆面文字ならび,_文字), nth1(_nth1,L0_1,_文字), nth1(_nth1,L0_2,V)), _変数ならび). 覆面算計算(L1,L2,L3,L4,N1,N2,N3,N4) :- number_chars(N1,L1), number_chars(N2,L2), number_chars(N3,L3), number_chars(N4,L4), N1 + N2 + N3 =:= N4. 覆面算(_,[]). 覆面算(L,[A|R2]) :- select(A,L,R), 覆面算(R,R2). 文字と数字の対応(L0_1,L0_2,_文字と数字の対応) :- findall(A=B,( nth1(_nth1,L0_1,A), nth1(_nth1,L0_2,B)), _文字と数字の対応). 唯一の文字ならびを得る([],[]). 唯一の文字ならびを得る([A|R1],[A|R2]) :- \+(member(A,R1)), 唯一の文字ならびを得る(R1,R2). 唯一の文字ならびを得る([A|R1],R2) :- member(A,R1), 唯一の文字ならびを得る(R1,R2). % 以下のサイトは # 出典: SQL質疑応答スレ 14問目 #934 # たとえばですがある大会で1位3P・2位2P・3位1P・4位以下は0Pという風な加点があって # それぞれのチームの競技結果がデータとしてあるとします # # というわけでテーブル # ・競技結果 # 順位,チームコード,競技コード # ・加点 # 順位,得点 # ・チーム # チーム名,チームコード # # このとき大会後の各チームの総得点とチーム名を出力させたいわけですが0点のチームがうまく出せません # # select チーム名, sum(得点) as 総得点 # from (チーム join 競技結果 using (チームコード)) join 加点 using (順位) # where 順位 <= 3 # group by チーム名, チームコード # # こうすると総得点が0点のチームはチーム名すら出なくなってしまうわけですが上手い方法はありませんか? 競技結果(3,1,16,13). 競技結果(8,2,16,7). 競技結果(4,1,3,6). 競技結果(2,2,3,10). 競技結果(1,1,1,8). チーム(雨夜の星座,1). チーム(消えた蠍,2). 'ある大会で1位3P・2位2P・3位1P・4位以下は0Pという風な加点があって、それぞれのチームの競技結果から加算された総得点とチーム名を求める'(_総得点,_チーム名) :- チーム(_チーム名,_チームコード), 総得点(_チームコード,_総得点). 総得点(_チームコード,_総得点) :- findsum(_加算された得点,( 競技結果(_順位,_チームコード,_競技コード,_得点), 加点(_順位,_加点), _加算された得点 is _得点 + _加点),_総得点). 加点(1,3) :- !. 加点(2,2) :- !. 加点(3,1) :- !. 加点(_,0). findsum(A,P,Sum) :- findall(A,P,L), sum_list(L,Sum). % 以下のサイトは # 出典 :: SQL質疑応答スレ 14問目 #896 # 質問です。 # PostgreSQL9.3 # # テーブル # DATE, VALUE # 20140401,-13 # 20140402,-11 # 20140403, 12 # 20140404, 13 # 20140405, 12 # 20140406,-11 # # 欲しい結果 # DATE, VALUE ,COUNT # 20140401,-13, 1 # 20140402,-11, 2 # 20140403, 12, 1 # 20140404, 13, 2 # 20140405, 12, 3 # 20140406,-11, 1 # # このように、VALUEの値の正負の連続数をCOUNTし出力するようなSQLは書けるのですか? 'VALUEの値の正負の連続数をCOUNTし出力する' :- findall([_DATE,_VALUE],( テーブル(_DATE,_VALUE)), LL), 'VALUEの値の正負の連続数をCOUNTし出力する'(LL). 'VALUEの値の正負の連続数をCOUNTし出力する'(LL) :- append(LL1,LL2,LL3,LL), 同一の符号の最大連続(LL1,LL2,LL3), 'COUNTして出力する'(LL2). LL3 = []. 同一の符号の最大連続(LL1,LL2,LL3) :- 全てが同一符号(LL2,_符号), 'LL1の最後の要素の符号は異なる'(LL1,_符号), 'LL3の最初の要素の符号は異なる'(LL3,_符号). 全てが同一符号([],_). 全てが同一符号([[_,_VALUE]|R],_符号) :- 符号(_VALUE,_符号), 全てが同一符号(R,_符号). 符号(_VALUE,+) :- _VALUE >= 0. 符号(_VALUE,-) :- _VALUE < 0. 'LL1の最後の要素の符号は異なる'(LL1,_符号) :- \+((append(_,[[_,_VALUE]],LL1),符号(_VALUE,_符号))). 'LL3の最初の要素の符号は異なる'(LL3,_符号) :- \+((LL3 = [[_,_VALUE]|_],符号(_VALUE,_符号))). 'COUNTして出力する'(LL2) :- forall( nth1(_nth1,LL2,[_DATE,_VALUE]), writef('%t,%t,%t\n',[_DATE,_VALUE,_nth1])). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは # 出典 :: スレ立てるまでもない質問はここで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. 重複順列(L,0,[]). 重複順列(L,N,[A|R3]) :- N > 0, member(A,L), N_1 is N - 1, 重複順列(L,N_1,R3) . % 以下のサイトは # 出典 :: スレ立てるまでもない質問はここで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, 重複組合せ(_候補ならび,_要素数,_重複組合せ). % 以下のサイトは # 出典 :: スレ立てるまでもない質問はここで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. 重複組合せ(X,1,[A]) :- member(A,X). 重複組合せ([A|Y],N,[A|X]) :- N > 1, M is N - 1, 重複組合せ([A|Y],M,X). 重複組合せ([_|Y],N,A) :- N > 1, 重複組合せ(Y,N,A). % 以下のサイトは # 出典 :: SQL質疑応答スレ14問目 #890 # 質問させてください。MySQLです。 # 上位100件を抽出してその中から10件をランダムに抽出したい。 # SELECT文はどう書けばいいですか?1行でできますか? '上位100件を抽出してその中から10件をランダムに抽出したい。'(_10件をランダムに抽出) :- 上位100件を抽出して(_上位100件), length(_10件をランダムに抽出,10), '上位100件の中から10件をランダムに抽出したい。'(_上位100件,[],_10件をランダムに抽出). '上位100件を抽出して'(_上位100件) :- findall(_値,テーブル(_値),_値ならび), 降順整列(_値ならび,_降順整列した値ならび), length(_上位100件,100), append(_上位100件,_,_降順整列した値ならび). '上位100件の中から10件をランダムに抽出したい。'(_,_,[]). '上位100件の中から10件をランダムに抽出したい。'(_上位100件,_既に選択した位置,[_選択値|R]) :- 重複なくランダムに一件抽出する(_上位100件,_既にに選択した位置,_選択値), '上位100件の中から10件をランダムに抽出したい。'(_上位100件,[_選択した位置|_既に選択した位置],R). 重複なくランダムに一件抽出する(_上位100件,_既にに選択した位置,_選択値) :- ランダムに一件抽出する(_上位100件,_既にに選択した位置,_選択値),!. 重複なくランダムに一件抽出する(_上位100件,_既にに選択した位置,_選択値) :- 重複なくランダムに一件抽出する(_上位100件,_既にに選択した位置,_選択値). ランダムに一件抽出する(_上位100件,_既にに選択した位置,_選択値) :- _選択する位置 is random(100) + 1, \+(member(_選択する位置,_既に選択した位置)), nth1(_選択する位置,_上位100件,_選択値). 降順整列([],[]). 降順整列([A|R1],L) :- 降順分割(A,R1,L1,L2), 降順整列(L1,L1_2), 降順整列(L2,L2_2), append(L1_2,[A|L2_2],L). 降順分割(_,[],[],[]). 降順分割(A,[B|R],[B|L1],L2) :- B @> A, 降順分割(A,R,L1,L2). 降順分割(A,[B|R],L1,[B|L2]) :- B @=< A, 降順分割(A,R,L1,L2). % 以下のサイトは # このディレクトリの索引 # 出典 :: スレ立てるまでもない質問はここで135代目 #755 # **--* # ***-* # *---* # **-** # **-** # # var a=[ # "**--*", # "***-*", # "*---*", # "**-**", # "**-**", # ]; # ハイフンの位置を取得して連想配列に入れる方法おしえてください # var ithi = [ # [2,3], # [3], # [1,2,3], # [2], # [2], # ] ハイフンの位置を取得して連想配列に入れる方法おしえてください(_文字列,_行ならび,_ハイフンの位置ならび) :- ハイフンの位置を取得して連想配列に入れる(_文字列,_行ならび,_ハイフンの位置ならび). ハイフンの位置を取得して連想配列に入れる(_文字列,_行ならび,_ハイフンの位置ならび) :- 行ならびを得る(_文字列,_行ならび), findall(_各行のハイフン位置ならび,( member(_各行,_行ならび), ハイフンの位置を取得して(_各行,_各行のハイフン位置ならび)),_ハイフンの位置ならび). ハイフンの位置を取得して(_副文字列,_ハイフンの位置ならび) :- findall(_位置0オリジン,( sub_atom(_副文字列,_位置0オリジン,1,_,'-')),_ハイフンの位置ならび). 行ならびを得る(_文字列,L) :- 停止条件は文字列が空となるか改行を含まない場合(_文字列,L),!. 行ならびを得る(_文字列,[_改行までの文字列|R]) :- 改行までの文字列を切り取りながら行ならびを得る(_文字列,_改行までの文字列,R). 停止条件は文字列が空となるか改行を含まない場合('',[]) :- !. 停止条件は文字列が空となるか改行を含まない場合(_文字列,[_文字列]) :- 改行を含まない(_文字列). 改行を含まない(_文字列) :- \+(sub_atom(_文字列,_,1,_,'\n')). 改行までの文字列を切り取りながら行ならびを得る(_文字列,_改行までの文字列,R) :- 改行までの文字列を得る(_文字列,_改行までの文字列,_後文字列), 行ならびを得る(_後文字列,R). 改行までの文字列を得る(_文字列,_改行までの文字列,_後文字列) :- sub_atom(_文字列,S,1,R,'\n'), sub_atom(_文字列,0,S,_,_改行までの文字列), sub_atom(_文字列,_,R,0,_後文字列),!. % 以下のサイトは # このディレクトリの索引 # 出典 :: スレ立てるまでもない質問はここで135代目 #755 # **--* # ***-* # *---* # **-** # **-** # # var a=[ # "**--*", # "***-*", # "*---*", # "**-**", # "**-**", # ]; # ハイフンの位置を取得して連想配列に入れる方法おしえてください # var ithi = [ # [2,3], # [3], # [1,2,3], # [2], # [2], # ] ハイフンの位置を取得して連想配列に入れる方法おしえてください(_文字列,L,LL) :- split(_文字列,['\n'],L), findall(L1,( member(_副文字列,L), findall(_nth0,( sub_abom(_副文字列,_nth0,1,_,'-')), L1)), LL). % 以下のサイトは # 出典 :: プログラミングのお題スレ part3 #573 # # お題:自然数nが与えられたとき、n桁の自然数で各桁の数のn乗の和が元の数と等しくなるもの(たとえばn=3のとき 370 = 3^3 + 7^3 + 0^3 = 27 + 343 + 0)をすべて求める。 # 例 # n=4 -> 1634 8208 9474 # n=5 -> 54748 92727 93084 # n=8 -> 24678050 24678051 88593477 # '自然数nが与えられたとき、n桁の自然数で各桁の数のn乗の和が元の数と等しくなるもの(たとえばn=3のとき 370 = 3^3 + 7^3 + 0^3 = 27 + 343 + 0)をすべて求める。'(_n,_自然数nが与えられたときn桁の自然数で各桁の数のn乗の和が元の数と等しくなるものをすべて) :- findall(_n桁の自然数,( n桁の自然数で各桁の数のn乗の和と等しくなる(_n,_n桁の自然数)), _自然数nが与えられたときn桁の自然数で各桁の数のn乗の和が元の数と等しくなるものをすべて). n桁の自然数で各桁の数のn乗の和と等しくなるもの(_n,_n桁の自然数) :- n桁の自然数で(_n,_n桁の自然数), 各桁の数のn乗の和と等しくなるもの(_n,_n桁の自然数). n桁の自然数で(_n,_n桁の自然数) :- n桁の自然数の下限と上限(_n,_n桁の自然数下限,_n桁の自然数上限), between(_n桁の自然数下限,_n桁の自然数上限,_n桁の自然数). n桁の自然数の下限と上限(_n,_n桁の自然数下限,_n桁の自然数上限) :- _n桁の自然数下限 is 10 ^ (_n - 1), _n桁の自然数上限 is 10 ^ _n - 1. 各桁の数のn乗の和と等しくなるもの(_n,_n桁の自然数), 各桁の数のn乗の(_n,_n桁の自然数,[],_各桁の数のn乗のならび), 和(_各桁の数のn乗のならび,_n桁の自然数). 和(_数ならび,_和) :- sum_list(_数ならび,_和). 各桁の数のn乗の(_n,0,_各桁の数のn乗のならび,_各桁の数のn乗のならび) :- !. 各桁の数のn乗の(_n,N,L1,_各桁の数のn乗のならび) :- _各桁の数のn乗 is (N mod 10) ^ _n, N_1 is N // 10, 各桁の数のn乗の(_n,N,[_各桁の数のn乗|L1],_各桁の数のn乗のならび) :- % 以下のサイトは # 出典 :: プログラミングのお題スレ part3 #573 # # お題:自然数nが与えられたとき、n桁の自然数で各桁の数のn乗の和が元の数と等しくなるもの(たとえばn=3のとき 370 = 3^3 + 7^3 + 0^3 = 27 + 343 + 0)をすべて求める。 # 例 # n=4 -> 1634 8208 9474 # n=5 -> 54748 92727 93084 # n=8 -> 24678050 24678051 88593477 # '自然数nが与えられたとき、n桁の自然数で各桁の数のn乗の和が元の数と等しくなるもの(たとえばn=3のとき 370 = 3^3 + 7^3 + 0^3 = 27 + 343 + 0)をすべて求める。'(_n,_自然数nが与えられたときn桁の自然数で各桁の数のn乗の和が元の数と等しくなるものをすべて) :- findall(_n桁の自然数,( n桁の自然数で各桁の数のn乗の和と等しくなる(_n,_n桁の自然数)), _自然数nが与えられたときn桁の自然数で各桁の数のn乗の和が元の数と等しくなるものをすべて). n桁の自然数で各桁の数のn乗の和と等しくなるもの(_n,_n桁の自然数) :- n桁の自然数で(_n,_n桁の自然数), 各桁の数のn乗の和と等しくなるもの(_n,_n桁の自然数). n桁の自然数で(_n,_n桁の自然数) :- n桁の自然数の下限と上限(_n,_n桁の自然数下限,_n桁の自然数上限), between(_n桁の自然数下限,_n桁の自然数上限,_n桁の自然数). n桁の自然数の下限と上限(_n,_n桁の自然数下限,_n桁の自然数上限) :- _n桁の自然数下限 is 10 ^ (_n - 1), _n桁の自然数上限 is 10 ^ _n - 1. 各桁の数のn乗の和と等しくなるもの(_n,_n桁の自然数) :- findsum(_各桁の数のn乗,( 各桁の数(_n桁の自然数,_各桁の数), _各桁の数のn乗 is _各桁の数 ^ _n), _n桁の自然数). 各桁の数(N,_各桁の数) :- N > 0, _各桁の数 is N mod 10. 各桁の数(N,_各桁の数) :- N > 0, N_1 is N // 10, 各桁の数(N_1,_各桁の数). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum_list(_値ならび,_合計値). % 以下のサイトは # 出典 :: プログラミングのお題スレ part3 #573 # # お題:自然数nが与えられたとき、n桁の自然数で各桁の数のn乗の和が元の数と等しくなるもの(たとえばn=3のとき 370 = 3^3 + 7^3 + 0^3 = 27 + 343 + 0)をすべて求める。 # 例 # n=4 -> 1634 8208 9474 # n=5 -> 54748 92727 93084 # n=8 -> 24678050 24678051 88593477 # '自然数nが与えられたとき、n桁の自然数で各桁の数のn乗の和が元の数と等しくなるもの(たとえばn=3のとき 370 = 3^3 + 7^3 + 0^3 = 27 + 343 + 0)をすべて求める。'(_n,_自然数nが与えられたときn桁の自然数で各桁の数のn乗の和が元の数と等しくなるものをすべて) :- n桁の自然数の下限と上限(_n,_自然数下限,_自然数上限), findall(_自然数,( between(_自然数下限,_自然数上限,_自然数), n桁の自然数で各桁の数のn乗の和と等しくなる(_n,_自然数)), _自然数nが与えられたときn桁の自然数で各桁の数のn乗の和が元の数と等しくなるものをすべて). n桁の自然数の下限と上限(_n,_n桁の自然数下限,_n桁の自然数上限) :- _n桁の自然数下限 is 10 ^ (_n - 1), _n桁の自然数上限 is 10 ^ _n - 1. n桁の自然数で各桁の数のn乗の和と等しくなる(_n,_自然数) :- findsum(_各桁の数のn乗,( 各桁の数(_自然数,_各桁の数), _各桁の数のn乗 is _各桁の数 ^ _n), _自然数). 各桁の数(N,_各桁の数) :- N > 0, _各桁の数 is N mod 10. 各桁の数(N,_各桁の数) :- N > 0, N_1 is N // 10, 各桁の数(N_1,_各桁の数). % 以下のサイトは ぶどうの房パズル([[_1,_2,_3,_4,_5],[_6,_7,_8,_9],[_10,_11,_12],[_13,_14],[_15]]) :- flatten([[_1,_2,_3,_4,_5],[_6,_7,_8,_9],[_10,_11,_12],[_13,_14],[_15]],L), 三つ組候補([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],LL2), ぶどうの房パズル([[_6,_1,_2],[_7,_2,_3],[_8,_3,_4],[_9,_4,_5],[_10,_6,_7],[_11,_7,_8],[_12,_8,_9],[_13,_10,_11],[_14,_11,_12],[_15,_13,_14]],LL2,L). 三つ組候補(L,LL) :- findall([_1,_2,_3],( 順列(L,3,[_1,_2,_3]), _3 is abs(_1 - _2)), LL). ぶどうの房パズル([],_,[]). ぶどうの房パズル(LL1,LL2,[L|R]) :- select(L,LL1,RR1), select(L,LL2,RR2), ぶどうの房パズル(RR1,RR2,R). 順列(Y,0,[]). 順列(Y,N,[A|X]) :- select(A,Y,Z), M is N - 1, 順列(Z,M,X). % 以下のサイトは # ●Regular Expressionの使用環境 # サクラエディタ 2.1.1.1 # # ●検索か置換か? # 置換 # # ●説明 # []内の文字だけにしたい # ※ [ と ] と (半角スペース)の3つを消したい # # ●対象データ # [あいうえお] ←最後に半角スペースあり(以下同じ) # [カキクケコ] # [AIUEO] # [漢字等々] # # ●希望する結果 # あいうえお←最後の半角スペースも消したい(以下同じ) # カキクケコ # AIUEO # 漢字等々 '[]内の文字だけとしたい'(_文字列,_変換されたデータ) :- '[]内の文字だけとしたい'(_文字列,S1,S2_2,S3), '[]内の文字だけにしたい'(S3,S3_2), atomic_list_concat([S1,S2_2,S3_2],_変換されたデータ),!. '[]内の文字だけとしたい'(_文字列,_文字列). '[]内の文字だけとしたい'(_文字列,S1,S2_2,S3) :- sub_atom(_文字列,S1,S2,S3,L1,L2,L3), sub_atom(S2,0,1,_,'['), sub_atom(S2,_,1,0,']'), '[]とスペースを削除する'(S2,S2_2),!. '[]とスペースを削除する'(S2,S2_2) :- '[]を削除する'(S2,S2_1), スペースを削除する(S2_1,S2_2). '[]を削除する'(S2,S2_1) :- sub_atom(S2,1,_,1,S2_2). スペースを削除する(S2_1,S2_2) :- findall(A,( スペースでない文字を取り出す(S2_1,A)), L), atom_chars(S2_2,L). スペースでない文字を取り出す(S2,A) :- sub_atom(S2,_,1,_,A), \+(A = ' ')). % 以下のサイトは # 問題 # # 「mldsg」のうち3文字からなる英小文字の文字列を # 英大文字に変換して標準出力してください。 # 同じ文字を複数回使っても構いません。 # 言語はideoneで選択可能な言語を利用可能です。 # '「mldsg」のうち3文字からなる英小文字の文字列を 英大文字に変換して標準出力してください。 同じ文字を複数回使っても構いません。 言語はideoneで選択可能な言語を利用可能です。' :- forall( '「mldsg」のうち3文字からなる英小文字の文字列を'(_3文字からなる英小文字の文字列), '英大文字に変換して標準出力してください。'(_3文字からなる英小文字の文字列)). '「mldsg」のうち3文字からなる英小文字の文字列を'(_3文字からなる英小文字の文字列) :- '3文字からなる英小文字の文字列を'(mldsg,[],_3文字からなる英小文字の文字列). '3文字からなる英小文字の文字列を'(_,[_1,_2,_3],_3文字の文字列) :- atom_chars(_3文字の文字列,[_1,_2,_3]),!. '3文字からなる英小文字の文字列を'(_文字列,L,_3文字の文字列) :- sub_atom(_文字列,_,1,_,_文字), '3文字からなる英小文字の文字列を'(_文字列,[_文字|L],_3文字の文字列). '英大文字に変換して標準出力してください。'(_3文字からなる英小文字の文字列) :- 英大文字に変換して(_3文字からなる英小文字の文字列,_3文字からなる英大文字の文字列), '標準出力してください。'(_3文字からなる英大文字の文字列). 英大文字に変換して(_3文字からなる英小文字の文字列,_3文字からなる英大文字の文字列) :- findall(_大文字,( sub_atom(_3文字からなる英小文字の文字列,_,1,_,_小文字), 英小文字大文字(_小文字,_大文字)), _3文字からなる英大文字のならび), atom_chars(_3文字からなる英大文字の文字列,_3文字からなる英大文字のならび). 英小文字大文字(a,'A'). 英小文字大文字(b,'B'). 英小文字大文字(c,'C'). 英小文字大文字(d,'D'). 英小文字大文字(e,'E'). 英小文字大文字(f,'F'). 英小文字大文字(g,'G'). 英小文字大文字(h,'H'). 英小文字大文字(i,'I'). 英小文字大文字(j,'J'). 英小文字大文字(k,'K'). 英小文字大文字(l,'L'). 英小文字大文字(m,'M'). 英小文字大文字(n,'N'). 英小文字大文字(o,'O'). 英小文字大文字(p,'P'). 英小文字大文字(q,'Q'). 英小文字大文字(r,'R'). 英小文字大文字(s,'S'). 英小文字大文字(t,'T'). 英小文字大文字(u,'U'). 英小文字大文字(v,'V'). 英小文字大文字(w,'W'). 英小文字大文字(x,'X'). 英小文字大文字(y,'Y'). 英小文字大文字(z,'Z'). '標準出力してください。'(_3文字からなる英大文字の文字列) :- writef('%t\n',[_3文字からなる英大文字の文字列]). :- '「mldsg」のうち3文字からなる英小文字の文字列を 英大文字に変換して標準出力してください。 同じ文字を複数回使っても構いません。 言語はideoneで選択可能な言語を利用可能です。'. % 以下のサイトは # 出典 :: プログラミングのお題スレ Part3 #435 # # お題:10進数を2進数にしてビットごとに反転したものを10進数に戻す。 # 例 # 1 -> 0 # 12345 -> 4038 # 256 -> 255 '10進数を2進数にしてビットごとに反転したものを10進数に戻す。'(_10進数を,_2進数にしてビットごとに反転したものを10進数戻す) :- '10進数を2進数にして'(_10進数を,[],_2進数にして), ビットごとに反転したものを(_2進数にして,_ビットごとに反転したものを), '10進数に戻す'(_ビットごとに反転したものを,0,_2進数にしてビットごとに反転したものを10進数戻す). '10進数を2進数にして'(0,_2進数にして,_2進数にして) :- !. '10進数を2進数にして'(_10進数,_2進数ならび,_2進数にして) :- _ビット is _10進数 mod 2, _10進数_1 is _10進数 // 2, '10進数を2進数にして'(_10進数_1,[_ビット|_2進数ならび],_2進数にして). ビットごとに反転したものを(_2進数にして,_ビットごとに反転したものを) :- findall(_反転した,( ビットを(_2進数にして,_ビットを), 反転した(_ビットを,_反転した)), _ビットごとに反転したものを). ビットを(_2進数にして,_ビットを) :- nth1(_,_2進数にして,_ビットを). 反転した(0,1). 反転した(1,0). '10進数に戻す'([],_10進数に戻す,_10進数に戻す). '10進数に戻す'([_ビット|R],_10進数の積み上げ_1,_10進数に戻す) :- _10進数の積み上げ_2 is _10進数の積み上げ_1 * 2 + _ビット, '10進数に戻す'(R,_10進数の積み上げ_2,_10進数に戻す). % 以下のサイトは # 出典 :: プログラミングのお題スレ Part3 #435 # # お題:10進数を2進数にしてビットごとに反転したものを10進数に戻す。 # 例 # 1 -> 0 # 12345 -> 4038 # 256 -> 255 '10進数を2進数にしてビットごとに反転したものを10進数に戻す。'(_10進数を,_2進数にしてビットごとに反転したものを10進数戻す) :- '10進数を2進数にして'(_10進数を,[],_2進数にして), ビットごとに反転したものを(_2進数にして,_ビットごとに反転したものを), '10進数に戻す'(_ビットごとに反転したものを,0,_2進数にしてビットごとに反転したものを10進数戻す). '10進数を2進数にして'(0,_2進数,_2進数) :- !. '10進数を2進数にして'(_10進数,_2進数_1,_2進数) :- _ビット is _10進数 mod 2, _10進数_1 is _10進数 // 2, '10進数を2進数にして'(_10進数_1,[_ビット|_2進数_1],_2進数). ビットごとに反転したものを(_2進数にして,_ビットごとに反転したものを) :- findall(_ビットごとに反転,( member(_ビット,_2進数にして), ビットごとに反転(_ビット,_ビットごとに反転)), _ビットごとに反転したものを). ビットごとに反転(0,1). ビットごとに反転(1,0). '10進数に戻す'([],_10進数,_10進数). '10進数に戻す'([_ビット|R],_累計_1,_10進数) :- _累計_2 is _累計_1 * 2 + _ビット, '10進数に戻す'(R,_累計_2,_10進数). % 以下のサイトは # 出題 :: プログラミングのお題スレ Part3 #482 # # お題:二種類の文字からなる長さが奇数の文字列があるとき多数派の文字を求める。 # 例 # aabaabbab -> a '二種類の文字からなる長さが奇数の文字列があるとき多数派の文字を求める。'(_二種類の文字からなる長さが奇数の文字列,_多数派の文字) :- 二種類の文字(_二種類の文字からなる長さが奇数の文字列,_文字_1,_文字_2), findall(_,sub_atom(_二種類の文字からなる長さが奇数の文字列,_,1,_,_文字_1),L1), findall(_,sub_atom(_二種類の文字からなる長さが奇数の文字列,_,1,_,_文字_2),L2), 多数派の文字(L1,L2,_文字_1,_文字_2,_多数派の文字). 二種類の文字(_二種類の文字からなる長さが奇数の文字列,_文字_1,_文字_2) :- sub_atom(_二種類の文字からなる長さが奇数の文字列,_,2,_,_二文字), atom_chars(_二文字,[_文字_1,_文字_2]), \+(_文字_1 = _文字_2),!. 多数派の文字(L1,L2,_多数派の文字,_,_多数派の文字) :- append(L2,[_|_],L1). 多数派の文字(L1,L2,_,_多数派の文字,_多数派の文字) :- append(L1,[_|_],L2). % 以下のサイトは # # 出典 :: 竹渕瑛一氏のtwitter 20140417より # 各駅下り(_駅) :- 下り起点駅(_下り起点駅), 下り終点駅(_下り起点駅,_下り終点駅), 各駅下り(_下り起点駅,_下り終点駅,_駅). 下り起点駅(_下り起点駅) :- 駅が隣接する(_下り起点駅,_),!. 下り終点駅(_駅,_下り終点駅) :- 駅が隣接する(_駅,_次の駅), 下り終点駅(_次の駅,_下り終点駅). 下り終点駅(_下り終点駅,_下り終点駅). 各駅上り(_駅) :- 上り終点駅(_上り終点駅), 上り起点駅(_上り終点駅,_下り起点駅), 各駅上り(_上り起点駅,_上り終点駅,_駅). 上り終点駅(_上り終点駅) :- 駅が隣接する(_上り終点駅,_),!. 上り起点駅(_駅,_上り起点駅) :- 駅が隣接する(_駅,_次の駅), 上り起点駅(_次の駅,_上り起点駅). 上り起点駅(_上り起点駅,_上り起点駅). 各駅下り(_起点駅,_終点駅,_終点駅) :- 起点駅が終点駅に到達(_起点駅,_終点駅),!. 各駅下り(_起点駅,_終点駅,_駅) :- 駅が隣接する(_起点駅,_駅_2), この先に終点駅がある(_起点駅,_終点駅), 各駅下り(_起点駅,_終点駅,_駅_2,_駅). 各駅下り(_駅,_,_駅) :- \+(駅が隣接する(_駅,_)). 各駅下り(_駅,_,_,_駅). 各駅下り(_,_終点駅,_駅_2,_駅) :- 各駅下り(_駅_2,_終点駅,_駅). この先に終点駅がある(_,_終点駅) :- var(_終点駅),!. この先に終点駅がある(_起点駅,_) :- var(_起点駅),!. この先に終点駅がある(_終点駅,_終点駅) :- !. この先に終点駅がある(_駅,_終点駅) :- 駅が隣接する(_駅,_次の駅), この先に終点駅がある(_次の駅,_終点駅). 各駅上り(_起点駅,_終点駅,_終点駅) :- 起点駅が終点駅に到達(_起点駅,_終点駅),!. 各駅上り(_起点駅,_終点駅,_駅) :- 駅が隣接する(_駅_2,_起点駅), この前に終点駅がある(_起点駅,_終点駅), 各駅上り(_起点駅,_終点駅,_駅_2,_駅). 各駅上り(_駅,_,_駅) :- \+(駅が隣接する(_,_駅)). 各駅上り(_駅,_,_,_駅). 各駅上り(_,_終点駅,_駅_2,_駅) :- 各駅上り(_駅_2,_終点駅,_駅). この前に終点駅がある(_,_終点駅) :- var(_終点駅),!. この前に終点駅がある(_起点駅,_) :- var(_起点駅),!. この前に終点駅がある(_終点駅,_終点駅) :- !. この前に終点駅がある(_駅,_終点駅) :- 駅が隣接する(_次の駅,_駅), この前に終点駅がある(_次の駅,_終点駅). 起点駅が終点駅に到達(_起点駅,_終点駅) :- var(_起点駅), var(_終点駅),!,fail. 起点駅が終点駅に到達(_起点駅,_終点駅) :- var(_起点駅),!,fail. 起点駅が終点駅に到達(_起点駅,_終点駅) :- \+(var(_起点駅)), \+(var(_終点駅)), _起点駅 = _終点駅,!. 駅(相模大野). 駅(東林間). 駅(中央林間). 駅(南林間). 駅(鶴間). 駅(大和). 駅(桜ヶ丘). 駅(高座渋谷). 駅(長後). 駅(湘南台). 駅(六会日大前). 駅(善行). 駅(藤沢本町). 駅(藤沢). 駅(本鵠沼). 駅(鵠沼海岸). 駅(片瀬江ノ島). 駅が隣接する(相模大野, 東林間). 駅が隣接する(東林間, 中央林間). 駅が隣接する(中央林間, 南林間). 駅が隣接する(南林間, 鶴間). 駅が隣接する(鶴間, 大和). 駅が隣接する(大和, 桜ヶ丘). 駅が隣接する(桜ヶ丘, 高座渋谷). 駅が隣接する(高座渋谷, 長後). 駅が隣接する(長後, 湘南台). 駅が隣接する(湘南台, 六会日大前). 駅が隣接する(六会日大前, 善行). 駅が隣接する(善行, 藤沢本町). 駅が隣接する(藤沢本町, 藤沢). 駅が隣接する(藤沢, 本鵠沼). 駅が隣接する(本鵠沼, 鵠沼海岸). 駅が隣接する(鵠沼海岸, 片瀬江ノ島). /* 各駅下り(相模大野, 東林間). 各駅下り(東林間, 中央林間). 各駅下り(中央林間, 南林間). 各駅下り(南林間, 鶴間). 各駅下り(鶴間, 大和). 各駅下り(大和, 桜ヶ丘). 各駅下り(桜ヶ丘, 高座渋谷). 各駅下り(高座渋谷, 長後). 各駅下り(長後, 湘南台). 各駅下り(湘南台, 六会日大前). 各駅下り(六会日大前, 善行). 各駅下り(善行, 藤沢本町). 各駅下り(藤沢本町, 藤沢). 各駅下り(藤沢, 本鵠沼). 各駅下り(本鵠沼, 鵠沼海岸). 各駅下り(鵠沼海岸, 片瀬江ノ島). 各駅上り(片瀬江ノ島, 鵠沼海岸). 各駅上り(鵠沼海岸, 本鵠沼). 各駅上り(本鵠沼, 藤沢). 各駅上り(藤沢, 藤沢本町). 各駅上り(藤沢本町, 善行). 各駅上り(善行, 六会日大前). 各駅上り(六会日大前, 湘南台). 各駅上り(湘南台, 長後). 各駅上り(長後, 高座渋谷). 各駅上り(高座渋谷, 桜ヶ丘). 各駅上り(桜ヶ丘, 大和). 各駅上り(大和, 鶴間). 各駅上り(鶴間, 南林間). 各駅上り(南林間, 中央林間). 各駅上り(中央林間, 東林間). 各駅上り(東林間, 相模大野). */ 急行停車駅(相模大野). 急行停車駅(藤沢). 急行停車駅(片瀬江ノ島). 急行停車駅(長後). 急行停車駅(本鵠沼). 急行停車駅(鵠沼海岸). 急行停車駅(南林間). 急行停車駅(大和). 急行停車駅(南林間). 急行停車駅(湘南台). 駅間距離(相模大野, 東林間, 1.7). 駅間距離(東林間, 中央林間, 1.3). 駅間距離(中央林間, 南林間, 1.5). 駅間距離(南林間, 鶴間, 0.6). 駅間距離(鶴間, 大和, 2.5). 駅間距離(大和, 桜ヶ丘, 2.2). 駅間距離(桜ヶ丘, 高座渋谷, 2.0). 駅間距離(高座渋谷, 長後, 2.2). 駅間距離(長後, 湘南台, 1.8). 駅間距離(湘南台, 六会日大前, 1.5). 駅間距離(六会日大前, 善行, 2.4). 駅間距離(善行, 藤沢本町, 1.6). 駅間距離(藤沢本町, 藤沢, 1.8). 駅間距離(藤沢, 本鵠沼, 1.5). 駅間距離(本鵠沼, 鵠沼海岸, 1.3). 駅間距離(鵠沼海岸, 片瀬江ノ島, 1.7). 駅のならびを得る([_起点となる駅|L]) :- 駅が隣接する(_起点となる駅,_),!, findall(_駅,駅が隣接する(_,_駅),L). 全ての急行区間(_始点駅,_終点駅,_急行区間駅ならび,_急行停車駅ならび) :- 駅のならびを得る(_駅のならび), 全ての急行区間(_駅のならび,_始点駅,_終点駅,_急行区間駅ならび,_急行停車駅ならび). 全ての急行区間(_終点駅,_始点駅,_急行区間駅ならび,_急行停車駅ならび) :- 駅のならびを得る(_駅のならび), reverse(_駅のならび,_反転した駅のならび), 全ての急行区間(_反転した駅のならび,_終点駅,_始点駅,_急行区間駅ならび,_急行停車駅ならび). 全ての急行区間(_駅のならび,_始点駅,_終点駅,_急行区間駅ならび,_急行停車駅ならび) :- append(L1,[_始点駅|R],_駅のならび), last(R,_終点駅), _急行区間駅ならび = [_始点駅|R], findall(_駅,( member(_駅,[_始点駅|R]), 急行停車駅(_駅)), _急行停車駅ならび). last([A],A) :- !. last([_|R],A) :- last(R,A). 急行を使って停車駅を最小にする(_出発点駅,_到着点駅,_駅のならび,_出発駅から急行区間までの各駅停車駅ならび,_急行区間駅ならび,_終点急行停止駅から到着駅までの各駅停車駅ならび) :- append(L1,_急行区間駅ならび,L2,_駅のならび), 全ての急行区間(_,_,_急行区間駅ならび,_), 出発駅から急行区間までの駅ならび(_出発駅,L1,_出発駅から急行区間までの各駅停車駅ならび), 終点急行停止駅から到着駅までの各駅停車駅ならび(_到着点駅,L2,_終点急行停止駅から到着駅までの各駅停車駅ならび). 出発駅から急行区間までの駅ならび(_出発駅,L1,_出発駅から急行区間までの各駅停車駅ならび) :- append(_,[_出発駅|_出発駅から急行区間までの各駅停車駅ならび],L1), \+((member(_駅,_出発駅から急行区間までの各駅停車駅ならび),急行停車駅(_駅))). 終点急行停止駅から到着駅までの各駅停車駅ならび(_到着点駅,L2,_終点急行停止駅から到着駅までの各駅停車駅ならび) :- append(_終点急行停止駅から到着駅までの駅ならび,[_到着点駅|_],L2), \+((member(_駅,_終点急行停止駅から到着駅までの駅ならび),急行停車駅(_駅))). 区間距離(_起点駅,_終点駅,_区間距離) :- 区間距離(_起点駅,_終点駅,0.0,_区間距離),!. 区間距離(_起点駅,_終点駅,_区間距離) :- 区間距離(_終点駅,_起点駅,_区間距離). 区間距離(_終点駅,_終点駅,_区間距離,_区間距離) :- !. 区間距離(_駅,_終点駅,_区間距離_1,_区間距離) :- 駅間距離(_駅,_次の駅,_駅間距離), _区間距離_2 is _区間距離_1 + _駅間距離, 区間距離(_次の駅,_終点駅,_区間距離_2,_区間距離). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは # [1] 授業単元: プログラミング基礎 # [2] 問題文(含コード&リンク): # 10000以下の自然数のうち素因数分解を行ったときにその因子の数が最多となる数を求め,その数,因子の数,素因数分解の結果を表示するプログラムを作成して下さい. # # 出力形 # 8192 = 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 # 因子数:13 # # [3] 環境 #  [3.1] OS: Linux #  [3.2] コンパイラ名とバージョン: gcc 3.4 #  [3.3] 言語: C # [4] 期限: 3月30日まで # [5] その他の制限: # ヒントを教授に聞きに行ったら自分で考えろと一蹴されました # よろしくお願いします '10000以下の自然数のうち素因数分解を行ったときにその因子の数が最多となる数を求め,その数,因子の数,素因数分解の結果を表示するプログラムを作成して下さい.' :- '10000以下の素数を求める'(_10000以下の素数ならび), '10000以下の自然数のうち素因数分解を行ったときに'(_10000以下の自然数,_10000以下の素数ならび,_素因子分解ならび), 'その因子の数が最多となる数を求め、'(_素因子分解ならび,_最多因子数), 'その数,因子の数,素因数分解の結果を表示する'(_素因子分解ならび,_最多因子数). '10000以下の自然数のうち素因数分解を行ったときに'(_10000以下の自然数,_10000以下の素数ならび,_素因子分解ならび) :- findall([_10000以下の自然数,_10000の素因子の数,_素因子ならび],( between(1,10000,_10000以下の自然数), '10000の素因子分解'(_10000以下の素数ならび,_素因子ならび), length(_素因子ならび,_10000の素因子の数)), _素因子分解ならび). '10000以下の素数を求める'(_10000以下の素数ならび) :- エラトステネスの篩によって10000以下の素数を求める(_10000以下の素数ならび). エラトステネスの篩によって10000以下の素数を求める(_10000以下の素数ならび) :- findall(N,between(1,10000,N),_10000以下の自然数ならび), エラトステネスの篩(_10000以下の自然数ならび,_10000以下の素数ならび). '10000以下の自然数のうち素因数分解を行ったときに'(_,[],[]) :- !. '10000以下の自然数のうち素因数分解を行ったときに'(M,[N|R1],[N|R2]) :- 0 is M mod N, M_1 is M // N, '10000以下の自然数のうち素因数分解を行ったときに'(M_1,[N|R1],R2). '10000以下の自然数のうち素因数分解を行ったときに'(M,[_|R1],R2) :- '10000以下の自然数のうち素因数分解を行ったときに'(M,R1,R2). 'その因子の数が最多となる数を求め、'(_素因子分解ならび,_最多因子数) :- findmax(_素因子の数,( member([_,_因子の数,_],_素因子分解ならび)), _最多因子数). 'その数,因子の数,素因子分解の結果を表示する'(_素因子分解ならび,_最多因子数) :- forall( member([_数,_最多因子数,_素因子分解の結果],_素因子分解ならび), writef('%t,%t,%t\n',[_数,_最多因子数,_素因子分解の結果])). findmax(_選択項,_評価項,_最大値) :- findall(_選択項,_評価項,_評価ならび), 最大値(_評価ならび,_最大値). 最大値(_ならび,_最大値) :- append(L1,[_最大値|L2],_ならび), ならび要素に最大値を超えるものはない(L1,_最大値), ならび要素に最大値を超えるものはない(L2,_最大値). ならびの要素に最大値を超えるものはない(_ならび,_最大値) :- \+((member(_要素,_ならび),_要素 @> _最大値)). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). % 以下のサイトは # 出典 :: http://pc12.2ch.net/test/read.cgi/tech/1136994325/954 # pascal pcpad # 1個の自然数nを適当に決めて、nチームが参加する # リーグ戦の全試合を表示するプログラムを書きなさい。 '1個の自然数nを適当に決めて、nチームが参加するリーグ戦の全試合を表示する' :- '1個の自然数nを適当に決めて、'(_n), 'nチームが参加するリーグ戦の全試合を表示する'(_n). '1個の自然数nを適当に決めて、'(_n) :- _n is random(16) + 3. 'nチームが参加するリーグ戦の全試合を表示する'(_n) :- 'nチームが参加する'(_n,_nチームが参加する), forall( リーグ戦の全試合を(_nチームが参加する,_チーム番号_1,_チーム番号_2), 表示する(_チーム番号_1,_チーム番号_2)). 'nチームが参加する'(_n,_nチームが参加する) :- findall(M,between(1,_n,M),_nチームが参加する). リーグ戦の全試合を(_nチームが参加する,_チーム番号_1,_チーム番号_2) :- 組合せ(_nチームが参加する,2,[_チーム番号_1,_チーム番号_2]). 組合せ(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). 表示する(_チーム番号_1,_チーム番号_2) :- チーム(_チーム番号_1,_チーム名_1), チーム(_チーム番号_2,_チーム名_2), writef('%t-%t\n',[_チーム名_1,_チーム名_2]). チーム(1,サンフレッチェ広島). チーム(2,'横浜F・マリノス'). チーム(3,川崎フロンターレ). チーム(4,セレッソ大阪). チーム(5,鹿島アントラーズ). チーム(6,浦和レッズ). チーム(7,アルビレックス新潟). チーム(8,'FC東京'). チーム(9,清水エスパルス). チーム(10,柏レイソル). チーム(11,名古屋グランパス). チーム(12,サガン鳥栖). チーム(13,ベガルタ仙台). チーム(14,大宮アルディージャ). チーム(15,ヴァンフォーレ甲府). チーム(16,湘南ベルマーレ). チーム(17,ジュビロ磐田). チーム(18,大分トリニータ). % 以下のサイトは '1' :- '2'(_1),'3'(_1),'11'. '1'. '2'(_1) :- '12'(mldsg,_2),'4'(_2,3,_4),'12'(_1,_4). '3'(_1) :- '5'(_1,_2),'7'(_2). '4'(_,0,[]). '4'(_1,_2,[_3|_4]) :- '13'(_2,0),'14'(_3,_1),'15'(_5,_2 - 1),'4'(_1,_5,_4). '5'(_1,_2) :- '16'(_3,('17'(_1,_,1,_,_4),'6'(_4,_3)),_5),'12'(_2,_5). '6'(_1,_2) :- '18'(_1,_3),'15'(_4,_3 - 32),'18'(_2,_4). '7'(_1) :- '19'(_1),'20'. '11' :- fail. '12'(_1,_2) :- atom_chars(_1,_2). '13'(_1,_2) :- _1 > _2. '14'(_1,_2) :- member(_1,_2). '15'(_1,_2) :- _1 is _2. '16'(_1,_2,_3) :- findall(_1,_2,_3). '17'(_1,_2,_3,_4,_5) :- sub_atom(_1,_2,_3,_4,_5). '18'(_1,_2) :- char_code(_1,_2). '19'(_1) :- write(_1). '20' :- nl. :- initialization('1'). % 以下のサイトは '1' :- '2'(_1),'3'(_1),'11'. '1'. '2'(_1) :- '12'(mldsg,_2),'4'(_2,3,_4),'12'(_1,_4). '3'(_1) :- '5'(_1,_2),'7'(_2). '4'(_,0,[]). '4'(_1,_2,[_3|_4]) :- _2 > 0,'13'(_3,_1),_5 is _2 - 1,'4'(_1,_5,_4). '5'(_1,_2) :- '14'(_3,('15'(_1,_,1,_,_4),'6'(_4,_3)),_5),'12'(_2,_5). '6'(_1,_2) :- '16'(_1,_3),_4 is _3 -32,'16'(_2,_4). '7'(_1) :- '17'(_1),'18'. '11' :- fail. '12'(_1,_2) :- atom_chars(_1,_2). '13'(_1,_2) :- member(_1,_2). '14'(_1,_2,_3) :- findall(_1,_2,_3). '15'(_1,_2,_3,_4,_5) :- sub_atom(_1,_2,_3,_4,_5). '16'(_1,_2) :- char_code(_1,_2). '17'(_1) :- write(_1). '18' :- nl. '19'(_1) :- initialization(_1). :- '19'('1'). % 以下のサイトは '1' :- '2'(_1),'3'(_1),fail. '1'. '2'(_1) :- atom_chars(mldsg,_2),'4'(_2,3,_4),atom_chars(_1,_4). '3'(_1) :- '5'(_1,_2),'7'(_2). '4'(_,0,[]). '4'(_1,_2,[_3|_4]) :- _2 > 0,member(_3,_1),_5 is _2 - 1,'4'(_1,_5,_4). '5'(_1,_2) :- findall(_3,(sub_atom(_1,_,1,_,_4),'6'(_4,_3)),_5),atom_chars(_2,_5). '6'(_1,_2) :- char_code(_1,_3),_4 is _3 -32,char_code(_2,_4). '7'(_1) :- write(_1),nl. :- initialization('1'). % 以下のサイトは % % ?- 戦艦(_艦船名,_レベル,_耐久,_火力,_雷装,_対空,_速力). 出典('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 リレーショナルデータベース'). % 以下のサイトは mecab(文,_文,LL) :- tmpnam(TMPNAM), tell(TMPNAM), writef('%t\n',[_文]), told, mecab(TMPNAM,LL). mecab(_ファイル,LL) :- atomic_list_concat(['cat ',_ファイル,' | mecab'],S), sh(S,LL_1), findall([S1,S3],( member([U|_],LL_1), sub_atom(U,_,_,_,S1,'\t',S3,_,_,_)), LL). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). shs(Command,X) :- popen(Command,L), shs_3(L,X). shs_3(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_3(R1,R). shs_3([],[]) :- !. shs_3(L,[S]) :- atom_chars(S,L). mecab(_ファイル,LL) :- atomic_list_concat(['cat ',_ファイル,' | mecab'],S), sh(S,LL_1), findall([S1,S3],( member([U|_],LL_1), sub_atom(U,S1,'\t',S3)), LL). sh(Command,X) :- shs(Command,Y), findall(U,( member(V,Y), split(V,[' ',','],U)), X). split(_文字列,_区切り文字ならび,L) :- atom_chars(_文字列,_文字ならび), split_list(_文字ならび,_区切り文字ならび,L). split_list([],_,[]). split_list(L1,_区切り文字ならび,[_文字列|R]) :- split_list_2(_区切り文字ならび,L1,_文字列), split_list(L3,_区切り文字ならび,R),!. split_list(L1,_区切り文字ならび,[_文字列]) :- atom_chars(_文字列,L1). split_list_2(_区切り文字ならび,L,_文字列,L3) :- append(L1,L2,L3,L), member(_区切り文字,_区切り文字ならび), split_list_3(_区切り文字,L1,L2,L3), atom_chars(_文字列,L1),!. split_list_3(_区切り文字,L1,L2,L3) :- all(L2,_区切り文字), \+(append(_,[_区切り文字],L1)), \+(L3 = [_区切り文字|_]),!. tmpnam(TMPNAM) :- 'TMPNAM'(TMPNAM), \+(exist_file(TMPNAM)),!. tmpnam(TMPNAM) :- tmpnam(TMPNAM). 'TMPNAM'(TMPNAM) :- '英小文字大文字数字からなる6要素の文字ならび'(_6要素の文字ならび), atomic_list_concat(['/tmp/file'|_6要素の文字ならび],TMPNAM). '英小文字大文字数字からなる6要素の文字ならび'(_6要素の文字ならび) :- findall(_任意の文字,( between(1,6,_), '英小文字大文字数字から任意の文字'(_任意の文字)), _6要素の文字ならび). '英小文字大文字数字から任意の文字'(_任意の文字) :- _文字コード is random(75) + 48, '文字コード48-122の範囲で記号のコードではない'(_文字コード), char_code(_任意の文字,_文字コード),!. '英小文字大文字数字から任意の文字'(_任意の文字) :- '英小文字大文字数字から任意の文字'(_任意の文字). '文字コード48-122の範囲で記号のコードではない'(_文字コード) :- '文字コード範囲58-64ではない'(_文字コード), '文字コード範囲91-96ではない'(_文字コード). '文字コード範囲58-64ではない'(_文字コード) :- \+((_文字コード>=58,_文字コード=<64)). '文字コード範囲91-96ではない'(_文字コード) :- \+((_文字コード>=91,_文字コード=<96)). sub_atom(A,H,X,T) :- atom(A), sub_atom(A,S,L,R,X), sub_atom(A,0,S,_,H), sub_atom(A,_,R,0,T). % 以下のサイトは # # 既に整列されている成績 [氏名,成績1,成績2, ... 成績n]の成績の合計点順の # 順位を振る非決定性述語 # 成績の合計順に順位付けする(_成績ならび,_順位,_組) :- 成績の合計順に(_成績ならび,_成績の合計順に降順整列したならび), 順位付けする(_整列した組みならび,_順位,_組). 成績の合計順に(_成績ならび,_成績の合計順に降順整列したならび) :- 整列の対象鍵となる合計点を先頭に付加する(_成績ならび,_合計点を先頭に付加された成績ならび), 降順整列(_合計点を先頭に付加された成績ならび,_成績の合計順に降順整列した合計点を先頭に付加された成績ならび), 先頭の合計点は削除する(_成績の合計順に降順整列した合計点を先頭に付加された成績ならび,_成績の合計順に降順整列したならび). 整列の対象鍵となる合計点を先頭に付加する(_成績ならび,_合計点を先頭に付加された成績ならび) :- findall([_合計点,_氏名|成績ならび],( member([_氏名|_成績ならび],_成績ならび), sumlist(_成績ならび,_合計点)), _合計点を先頭に付加された成績ならび). 先頭の合計点は削除する(_成績の合計順に降順整列した合計点を先頭に付加された成績ならび,_成績の合計順に降順整列したならび) :- findall(L,( member([_|L],_成績の合計順に降順整列した合計点を先頭に付加された成績ならび)), _成績の合計順に降順整列したならび). 降順整列([],[]). 降順整列([_軸要素|R],L) :- 降順整列の分割(_軸要素,R,L1,L2), 降順整列(L1,L1_2), 降順整列(L2,L2_2), append(L1_2,[_軸要素|L2_2],L). 降順整列の分割(_,[],[],[]). 降順整列の分割(_軸要素,[_要素|R],[_要素|L1],L2) :- A @>= _軸要素, 降順整列の分割(_軸要素,R,L1,L2). 降順整列の分割(_軸要素,[_要素|R],L1,[_要素|L2]) :- A @< _軸要素, 降順整列の分割(_軸要素,R,L1,L2). 順位付けする(_整列した組みならび,_順位,_組) :- 順位付けする(_整列した組みならび,[],[],_順位,_組). 順位付けする([_組|_],Ln,_,_順位,_組) :- length([_|Ln],_順位). 順位付けする([_組_1,_組_2|R],Ln,Ln_2,_順位,_組) :- 第二項以降の合計点が同じ(_組_1,_組_2),!, 順位付けする([_組_2|R],Ln,[_|Ln_2],_順位,_組). 順位付けする([_|R],_,Ln_2,_順位,_組) :- 順位付けする(R,[_|Ln_2],[_|Ln_2],_順位,_組). 第二項以降の合計点が同じ([_|R1],[_|R2]) :- sumlist(R1,S), sumlist(R2,S). % 以下のサイトは # # 既に整列されている成績 [氏名,成績1,成績2, ... 成績n]の成績の合計点順の # 順位を振る非決定性述語 # 順位付け(_整列した組みならび,_順位,_組) :- 順位付け(_整列した組みならび,[],[],_順位,_組). 順位付け([_組|_],Ln,_,_順位,_組) :- length([_|Ln],_順位). 順位付け([_組_1,_組_2|R],Ln,Ln_2,_順位,_組) :- 第二項以降の合計点が同じ(_組_1,_組_2),!, 順位付け([_組_2|R],Ln,[_|Ln_2],_順位,_組). 順位付け([_|R],_,Ln_2,_順位,_組) :- 順位付け(R,[_|Ln_2],[_|Ln_2],_順位,_組). 第二項以降の合計点が同じ([_|R1],[_|R2]) :- sumlist(R1,S), sumlist(R2,S). 成績の合計順に降順整列(_成績ならび,_成績の合計順に降順整列したならび) :- 整列の対象鍵となる合計点を先頭に付加する(_成績ならび,_合計点を先頭に付加された成績ならび), 降順整列(_合計点を先頭に付加された成績ならび,_成績の合計順に降順整列した合計点を先頭に付加された成績ならび), 先頭の合計点は削除する(_成績の合計順に降順整列した合計点を先頭に付加された成績ならび,_成績の合計順に降順整列したならび). 整列の対象鍵となる合計点を先頭に付加する(_成績ならび,_合計点を先頭に付加された成績ならび) :- findall([_合計点,_氏名|成績ならび],( member([_氏名|_成績ならび],_成績ならび), sumlist(_成績ならび,_合計点)), _合計点を先頭に付加された成績ならび). 先頭の合計点は削除する(_成績の合計順に降順整列した合計点を先頭に付加された成績ならび,_成績の合計順に降順整列したならび) :- findall(L,( member([_|L],_成績の合計順に降順整列した合計点を先頭に付加された成績ならび)), _成績の合計順に降順整列したならび). 降順整列([],[]). 降順整列([_軸要素|R],L) :- 降順整列の分割(_軸要素,R,L1,L2), 降順整列(L1,L1_2), 降順整列(L2,L2_2), append(L1_2,[_軸要素|L2_2],L). 降順整列の分割(_,[],[],[]). 降順整列の分割(_軸要素,[_要素|R],[_要素|L1],L2) :- _要素 @>= _軸要素, 降順整列の分割(_軸要素,R,L1,L2). 降順整列の分割(_軸要素,[_要素|R],L1,[_要素|L2]) :- _要素 @< _軸要素, 降順整列の分割(_軸要素,R,L1,L2). % 以下のサイトは # 中学生になるホンガツオ君はいつも学校の成績が悪く、父・海平に怒られます。 # 今回も中間テストでどれもひどい点数をとってしまい、海平の雷が落ちるのは間違いありません。 # # 全教科のテスト結果を同時にみせると、海平の怒りは最大級となり、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]). % 以下のサイトは # twitter_by_@dll7_20140324 # @dll7 29分 # 正規表現で # AXAYAZ # BXBYBZ # CXCYZC # のA B Cがマッチするように書くには何が一番楽? # ただし、 # AXBYCZ # BXAYAZ # とかはマッチしないようにする。三つ同じ時だけマッチしたいとき '正規表現で AXAYAZ BXBYBZ CXCYZC のA B Cがマッチするように書くには何が一番楽?'(_文字列,_検索文字) :- 文字候補(_文字列,_検索文字), findall(_,sub_atom(_文字列,_,1,_,_検索文字),[_,_,_]). 文字候補(_文字列,_文字) :- setof(_文字,一文字ずつ取り出す(_文字列,_文字),_文字ならび), member(_文字,_文字ならび). 一文字ずつ取り出す(_文字列,_文字) :- sub_atom(_文字列,_,1,_,_文字). % 以下のサイトは # # 文字列の先頭から連続文字を切り出す # 文字列の先頭から同じ文字による文字列を切り出す(_文字列,_同じ文字の文字列,_残り文字列) :- sub_atom(_文字列,0,1,_,_文字), 同じ文字による文字列の文字数を得る(_文字列,_文字,_文字数), sub_atom(_文字列,0,_文字数,R,_同じ文字の文字列), sub_atom(_文字列,_,R,0,_残り文字列). 同じ文字による文字列の文字数を得る(_文字列,_文字,_文字数) :- findall(_,( sub_atom(_文字列,_,1,_,_文字_1), ( \+(_文字_1 = _文字),!,fail;true)), L), length(L,_文字数). % 以下のサイトは # ●Regular Expressionの使用環境 # # # ●検索か置換か? # 置換 # # ●説明 # 複数行の空行を1つの空行にしたい # # ●対象データ # # # # # # ●希望する結果 # 複数行の空行を1つの空行にしたい(_ファイル) :- get_chars(_ファイル,_文字ならび), 複数行の空行を1つの空行にしたい(_行ならび,_複数の空行を1つの空行にした文字ならび), put_chars(_ファイル,_複数の空行を1つの空行にした文字ならび). 複数行の空行を1つの空行にしたい([],[]). 複数行の空行を1つの空行にしたい(['\n','\n'|_残り行ならび],_複数の空行を1つの空行にした行ならび) :- 複数行の空行を1つの空行にしたい(['\n'|_残り行ならび],_複数の空行を1つの空行にした行ならび),!. 複数行の空行を1つの空行にしたい([A|R1],[A|R2]) :- 複数行の空行を1つの空行にしたい(R1,R2),!. get_chars(_ファイル,_文字ならび) :- open(_ファイル,read,Instream), findall(_文字,( at_end_of_stream(Instream),!,fail; get_char(Instream,_文字))), _文字ならび), close(Instream). put_chars(_ファイル,_文字ならび) :- open(_ファイル,write,Outstream), append(_,[_文字|R],_文字ならび), putchar(Outstream,_文字), R = [], close(Outstream). % 以下のサイトは # 出題場所 :: 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/1387257592/351 # ●Regular Expressionの使用環境 # サクラエディタ # # ●検索か置換か? # 置換 # # ●説明 # Exampleの文字列を含まない行を削除したい # # ●対象データ # ABCA Test # BCAA Example # CABA Abc # # ●希望する結果 # BCAA Example # # # ネットで検索して出てきた^(?!.*Example).+$や^((?!Example).)*$ # で試したんですが空行が残ってしまいました # # 'Exampleの文字列を含まない行を削除したい'(_文字列,_Exampleの文字列を含まない行を削除された文字列) :- 改行記号付きの行ならびを得る(_文字列,_改行記号付きの行ならび), findall(_行,( member(_行,_文字列ならび), \+(sub_atom(_行,_,_,_,'Example'))), _Exampleの文字列を含まない行を削除された行ならび), atomic_list_concat(_Exampleの文字列を含まない行を削除された行ならび,_Exampleの文字列を含まない行を削除された文字列). 改行記号付きの行ならびを得る('',[]) :- !. 改行記号付きの行ならびを得る(_文字列,[_改行記号付き行|R]) :- 改行記号を含む行を得る(_文字列,_改行記号付き行,_残り文字列), 改行記号付きの行ならびを得る(_残り文字列,R). 改行記号を含む行を得る(_文字列,_改行記号付き行,_残り文字列) :- sub_atom(_文字列,S,1,R,'\n'), sub_atom(_文字列,0,_,R,_改行記号付き行), sub_atom(_文字列,_,R,0,_残り文字列),!. 改行記号を含む行を得る(_文字列,_文字列,''). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/282 # お題:1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。 # のこりの数からとりのぞいた2個の数を求める。 # 例 # 3,1,2,6 -> 4,5 # # '1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。 のこりの数からとりのぞいた2個の数を求める。'(_n,_とりのぞいた数_1,_とりのぞいた数_2) :- '1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。'(_n,_2個をとりのぞいたのこりの数), 'のこりの数からとりのぞいた2個の数を求める。'(1,_2個をとりのぞいたのこりの数,[],[_とりのぞいた数_1,_とりのぞいた数_2]). '1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。'(_n,_2個をとりのぞいたのこりの数) :- '1からnのn個の連続した整数を'(_n,_1からnのn個の連続した整数), シャッフルして(_n,_1からnのn個の連続した整数,_シャッフルした1からnのn個の連続した整数), '適当に選んだ2個をとりのぞく。'(_シャッフルした1からnのn個の連続した整数,_2個をとりのぞいたのこりの数). '1からnのn個の連続した整数を'(_n,_1からnのn個の連続した整数) :- findall(M,between(1,_n,M),_1からnのn個の連続した整数). シャッフルして(_n,L1,L2) :- シャッフルして(1000,_n,L1,L2),!. シャッフルして(0,_,L,L). シャッフルして(M,_n,L1,L) :- R is random(_n) + 1, select(R,L1,L2), M_1 is M - 1, シャッフルして(M_1,_n,[R|L2],L). '適当に選んだ2個をとりのぞく。'(_シャッフルした1からnのn個の連続した整数,_2個をとりのぞいたのこりの数) :- _シャッフルした1からnのn個の連続した整数=[_,_|_2個をとりのぞいたのこりの数]. 'のこりの数からとりのぞいた2個の数を求める。'(_,_,L,L) :- length(L,2),!. 'のこりの数からとりのぞいた2個の数を求める。'(_n,L1,L2,L) :- select(_n,L1,L1_2),!, _n_2 is _n + 1, 'のこりの数からとりのぞいた2個の数を求める。'(_n_2,L1_2,L2,L). 'のこりの数からとりのぞいた2個の数を求める。'(_n,L1,L2,L) :- _n_2 is _n + 1, 'のこりの数からとりのぞいた2個の数を求める。'(_n_2,L1,[_n|L2],L). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/282 # お題:1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。 # のこりの数からとりのぞいた2個の数を求める。 # 例 # 3,1,2,6 -> 4,5 # # '1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。 のこりの数からとりのぞいた2個の数を求める。'(_n,_とりのぞいた数_1,_とりのぞいた数_2) :- '1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。'(_n,_2個をとりのぞいたのこりの数), 'のこりの数からとりのぞいた2個の数を求める。'(1,_2個をとりのぞいたのこりの数,[],[_とりのぞいた数_1,_とりのぞいた数_2]). '1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。'(_n,_2個をとりのぞいたのこりの数) :- '1からnのn個の連続した整数を'(_n,_1からnのn個の連続した整数), シャッフルして(_n,_1からnのn個の連続した整数,_シャッフルした1からnのn個の連続した整数), '適当に選んだ2個をとりのぞく。'(_シャッフルした1からnのn個の連続した整数,_2個をとりのぞいたのこりの数). '1からnのn個の連続した整数を'(_n,_1からnのn個の連続した整数) :- findall(M,between(1,_n,M),_1からnのn個の連続した整数). シャッフルして(_n,L1,L2) :- シャッフルして(1000,_n,L1,L2),!. シャッフルして(0,_,L,L). シャッフルして(M,_n,L1,L) :- R is random(_n) + 1, select(R,L1,L2), M_1 is M - 1, シャッフルして(M_1,_n,[R|L2],L). '適当に選んだ2個をとりのぞく。'(_シャッフルした1からnのn個の連続した整数,_2個をとりのぞいたのこりの数) :- 適当に選んだ2個を(_シャッフルした1からnのn個の連続した整数,[],[_数_1,_数_2]), 'とりのぞく。'(_シャッフルした1からnのn個の連続した整数,_2個をとりのぞいたのこりの数). 適当に選んだ2個を(_シャッフルした1からnのn個の連続した整数,[A,B],[A,B]) :- !. 適当に選んだ2個を(_シャッフルした1からnのn個の連続した整数,L1,L) :- 適当に選んだ(_シャッフルした1からnのn個の連続した整数,_適当に選んだ数), 適当に選んだ2個を(_シャッフルした1からnのn個の連続した整数,[_適当に選んだ数|L1],L). 適当に選んだ(_シャッフルした1からnのn個の連続した整数,_適当に選んだ数) :- length(_シャッフルした1からnのn個の連続した整数,Len), R1 is random(Len), nth0(R1,_シャッフルした1からnのn個の連続した整数,_適当に選んだ数), \+(member(_適当に選んだ数,L1)),!. 適当に選んだ(_シャッフルした1からnのn個の連続した整数,_適当に選んだ数) :- 適当に選んだ(_シャッフルした1からnのn個の連続した整数,_適当に選んだ数). 'とりのぞく。'(_数_1,_数_2,_シャッフルした1からnのn個の連続した整数,_2個をとりのぞいたのこりの数) :- select(_数_1,_シャッフルした1からnのn個の連続した整数,L1), select(_数_2,L1,_2個をとりのぞいたのこりの数). 'のこりの数からとりのぞいた2個の数を求める。'(_,_,L,L) :- length(L,2),!. 'のこりの数からとりのぞいた2個の数を求める。'(_n,L1,L2,L) :- select(_n,L1,L1_2),!, _n_2 is _n + 1, 'のこりの数からとりのぞいた2個の数を求める。'(_n_2,L1_2,L2,L). 'のこりの数からとりのぞいた2個の数を求める。'(_n,L1,L2,L) :- _n_2 is _n + 1, 'のこりの数からとりのぞいた2個の数を求める。'(_n_2,L1,[_n|L2],L). % 以下のサイトは # # 上部の基壇に幅をもたせたピラミッドの矩形 # # # _向き = 上向き, _頂点の高さ = 2, _上部の基壇の幅 = 3 の場合 # # *** # ***** # # _向き = 右向き, _頂点の高さ = 3, _上部の基壇の幅 = 2 の場合 # # * # ** # *** # *** # ** # * # ピラミッドの矩形(右向き,_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形) :- 下向きピラミッドの矩形を転置する(_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形),!. ピラミッドの矩形(左向き,_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形) :- 上向きピラミッドの矩形を転置する(_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形),!. ピラミッドの矩形(_向き,_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形) :- '上・下向きピラミッドの矩形を描く'(_向き,_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形). 下向きピラミッドの矩形を転置する(_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形) :- ピラミッドの矩形(下向き,_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形_1), 転置(_ピラミッドの矩形_1,_ピラミッドの矩形). 上向きピラミッドの矩形を転置する(_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形) :- ピラミッドの矩形(上向き,_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形_1), 転置(_ピラミッドの矩形_1,_ピラミッドの矩形). '上・下向きピラミッドの矩形を描く'(_向き,_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形) :- _底辺の幅 is _頂点の高さ * 2 + _上部基壇の幅, length(L,_底辺の幅), findall(L4,( append(L1,L2,L), 行にピラミッドの文様を描く(_向き,_上部基壇の幅,L1,L2,L4)), _ピラミッドの矩形). 行にピラミッドの文様を描く(上向き,_上部基壇の幅,[A|L1],L2,L4) :- length(L0,_上部基壇の幅), append(L0,L1,L), 行にピラミッドの文様を描く(L,L2,L4). 行にピラミッドの文様を描く(下向き,_上部基壇の幅,L1,[A|L2],L4) :- length(L0,_上部基壇の幅), append(L0,L2,L), 行にピラミッドの文様を描く(L,L1,L4). 行にピラミッドの文様を描く(L1,L2,L4) :- all(L1,'*'), all(L2,' '), append(L3,L3,L2), append(L3,L1,L3,L4). ピラミッドの矩形を表示する([]). ピラミッドの矩形を表示する([L|R]) :- atomic_list_concat(L,A), writef('%t\n',[A]), ピラミッドの矩形を表示する(R). all([],_). all([A|R],A) :- all(R,A). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). % 以下のサイトは ピラミッドの矩形(右向き,_頂点の高さ,_ピラミッドの矩形) :- 下向きピラミッドの矩形を転置する(_頂点の高さ,_ピラミッドの矩形),!. ピラミッドの矩形(左向き,_頂点の高さ,_ピラミッドの矩形) :- 上向きピラミッドの矩形を転置する(_頂点の高さ,_ピラミッドの矩形),!. ピラミッドの矩形(_向き,_頂点の高さ,_ピラミッドの矩形) :- '上・下向きピラミッドの矩形を描く'(_向き,_頂点の高さ,_ピラミッドの矩形). 下向きピラミッドの矩形を転置する(_頂点の高さ,_ピラミッドの矩形) :- ピラミッドの矩形(下向き,_頂点の高さ,_ピラミッドの矩形_1), 転置(_ピラミッドの矩形_1,_ピラミッドの矩形). 上向きピラミッドの矩形を転置する(_頂点の高さ,_ピラミッドの矩形) :- ピラミッドの矩形(上向き,_頂点の高さ,_ピラミッドの矩形_1), 転置(_ピラミッドの矩形_1,_ピラミッドの矩形). '上・下向きピラミッドの矩形を描く'(_向き,_頂点の高さ,_ピラミッドの矩形) :- _底辺の幅 is _頂点の高さ * 2 - 1, length(L,_底辺の幅), findall(L4,( append(L1,L2,L), 行にピラミッドの文様を描く(_向き,L1,L2,L4)), _ピラミッドの矩形). 行にピラミッドの文様を描く(上向き,[A|L1],L2,L4) :- all([A|L1],'*'), all(L2,' '), append(L3,L3,L2). append(L3,[A|L1],L3,L4). 行にピラミッドの文様を描く(下向き,L1,[A|L2],L4) :- all([A|L2],'*'), all(L1,' '), append(L3,L3,L1), append(L3,[A|L2],L3,L4). ピラミッドの矩形を表示する([]). ピラミッドの矩形を表示する([L|R]) :- atomic_list_concat(L,A), writef('%t\n',[A]), ピラミッドの矩形を表示する(R). all([],_). all([A|R],A) :- all(R,A). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). % 以下のサイトは 横向きに星のピラミッドを描く(_ピラミッドの頂点の高さ) :- 横向きに星のピラミッドを描く(1,_ピラミッドの頂点の高さ). 横向きに星のピラミッドを描く(_ピラミッドの頂点の高さ,_ピラミッドの頂点の高さ) :- 星で行表示する(_ビラミッドの頂点の高さ),!. 横向きに星のピラミッドを描く(N,_ピラミッドの頂点の高さ) :- 星で行表示する(N), N_2 is N + 1, 横向きに星のピラミッドを描く(N_2,_ピラミッドの頂点の高さ), 星で行表示する(N). 星で行表示する(_表示する星の数) :- findall(*,between(1,_表示する星の数,_),L), atomic_list_concat(L,A), writef('%t\n',[A]). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/db/1371476534/599 # こういうSQLがあって、 # select groups.name as "group", members.name as "member" # from groups # join members on groups.id = members.group_id # order by groups.id, members.id; # # 実行結果はこうなっています。 # group | member # --------------------+----------------- # 麦わら | ルフィ # 麦わら | ナミ # 麦わら | チョッパー # 木ノ葉隠れの里 | ナルト # 木ノ葉隠れの里 | カカシ # # ここで、memberに対してグループごとの連番をつけるにはどうしたらいいですか。 # 希望する出力結果はつぎのとおり # # group | num | member # --------------------+-----+-------------- # 麦わら | 1 | ルフィ # 麦わら | 2 | ナミ # 麦わら | 3 | チョッパー # 木ノ葉隠れの里 | 1 | ナルト # 木ノ葉隠れの里 | 2 | カカシ # # なおPostgres 9.2です。よろしくお願いします。 # # 'memberに対してグループごとの連番をつけるにはどうしたらいいですか。'(_group,_連番,_member) :- 'memberに対してグループごとの'(LL1), 連番を付ける(1,LL1,LL2), member([_group,_連番,_member],LL2). 'memberに対してグループごとの'(LL1) :- findall([_group,_member],( 'member.group'(_group,_member), members(_member)), LL1). 連番を付ける(_,[],[]). 連番を付ける(N,[[A,B],[A,C]|R1],[[A,N,B]|R2]) :- N_2 is N + 1, 連番を付ける(N_2,[[A,C]|R1],R2),!. 連番を付ける(N,[[A,B]|R1],[[A,N,B]|R2]) :- N_2 is N + 1, 連番を付ける(1,R1,R2). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/db/1371476534/577 # こんなSQLがあります。 # # select id, name, utime # from something # order by utime desc; # # このとき、idが、ある指定された値までは読み飛ばし、それ以降のレコードを取得するにはどうしたらいいですか。 # ポイントは、 # * id順とutime順とで順番が異なること # * ソートキーは utime だが、読み飛ばす条件は id を使っていること # # whileループなら簡単な処理ですが、SQLだとどうするのでしょうか。 # # (使用DB: PostgreSQL 9.3) # 'こんなSQLがあります。 select id, name, utime from something order by utime desc; idが、ある指定された値までは読み飛ばし、それ以降のレコードを取得する'(_指定された値,_id,_name,_utime) :- 'idが、ある指定された値までは読み飛ばし、'(_指定された値,_それ以降), それ以降のレコードを取得する(_それ以降,_id,_name,_utime). 'idが、ある指定された値までは読み飛ばし、'(_指定された値,_それ以降) :- findall([_utime,_id,_name],something(_id,_name,_utime),LL1), 降順整列(LL1,LL2), append(_,[[_,_指定された値,_|_それ以降],LL2),!. それ以降のレコードを取得する(_それ以降,_id,_name,_utime) :- member([_utime,_id,_name],_それ以降). 降順整列([],[]). 降順整列([_軸要素|_残りならび],_降順に整列したならび) :- 軸要素より大きい要素ならびと等しいか小さい要素要素ならびに分割(_軸要素,_残りならび,_軸要素より大きい要素ならび,_軸要素に等しいか小さい要素ならび), それぞれのならびを降順に整列する(_軸要素より大きい要素ならび,_軸要素に等しいか小さい要素ならび,_降順整列ならび_1,_降順整列ならび_2), append(_降順整列ならび_1,[_軸要素|_降順整列ならび_2],_降順に整列したならび). 軸要素より大きい要素ならびと等しいか小さい要素要素ならびに分割(_軸要素,[],[],[]) :- !. 軸要素より大きい要素ならびと等しいか小さい要素要素ならびに分割(_軸要素,[A|R1],[A|R2],R3) :- A @> _軸要素, 軸要素より大きい要素ならびと等しいか小さい要素要素ならびに分割(_軸要素,R1,R2,R3). 軸要素より大きい要素ならびと等しいか小さい要素要素ならびに分割(_軸要素,[A|R1],R2,[A|R3]) :- A @=< _軸要素, 軸要素より大きい要素ならびと等しいか小さい要素要素ならびに分割(_軸要素,R1,R2,R3). それぞれのならびを降順に整列する(_軸要素より大きい要素ならび,_軸要素に等しいか小さい要素ならび,_降順整列ならび_1,_降順整列ならび_2) :- 降順整列(_軸要素より大きい要素ならび,_降順整列ならび_1), 降順整列(_軸要素に等しいか小さい要素ならび,_降順整列ならび_2),!. % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1392388003/31 # [1] プログラミング言語 入門 # [2] 変数を入力して、入力された値と以下の条件を満たした値を表示する # # 1 : 6の倍数なら2で割った値 # 2 : 3の倍数なら二乗した値 # 3: 2の倍数なら2で割った値 # 4: 上記以外の倍数は、二乗した値から元の値を引いた値 # ☆ 複数の条件が合致した場合は大きい倍数の条件のみとする # ☆ 自作で関数を1つは作成する # # なにとぞよろしくお願いします。 # # '変数を入力して、入力された値と以下の条件を満たした値を表示する 1 : 6の倍数なら2で割った値 2 : 3の倍数なら二乗した値 3: 2の倍数なら2で割った値 4: 上記以外の倍数は、二乗した値から元の値を引いた値 ☆ 複数の条件が合致した場合は大きい倍数の条件のみとする'(_入力された値) :- findall([_倍数,_条件を満たした値候補],'変数を入力して、入力された値と以下の条件を満たした値を'(_入力された値,_倍数,_条件を満たした値候補),LL), '☆ 複数の条件が合致した場合は大きい倍数の条件のみとする'(LL,_条件を満した値), 表示する(_入力された値,_条件を満たした値). '変数を入力して、入力された値と以下の条件を満たした値を'(_入力された値,6,_6の倍数なら2で割った値) :- '1 : 6の倍数なら2で割った値'(_入力された値,_6の倍数なら2で割った値). '変数を入力して、入力された値と以下の条件を満たした値を'(_入力された値,3,_3の倍数なら二乗した値) :- 2 : 3の倍数なら二乗した値'(_入力された値,_3の倍数なら二乗した値). '変数を入力して、入力された値と以下の条件を満たした値を'(_入力された値,2,_2の倍数なら2で割った値) :- '3: 2の倍数なら2で割った値'(_入力された値,_2の倍数なら2で割った値). '変数を入力して、入力された値と以下の条件を満たした値を'(_入力された値,_倍数,_二乗した値から元の値を引いた値) :- '4: 上記以外の倍数は、二乗した値から元の値を引いた値'(_入力された値,_倍数,_二乗した値から元の値を引いた値). '1 : 6の倍数なら2で割った値'(_入力された値,_2で割った値) :- '6の倍数なら'(_入力された値), '2で割った値'(_入力された値,_2で割った値). '6の倍数なら'(_入力された値) :- 0 is _入力された値 mod 6. '2で割った値'(_入力された値,_2で割った値) :- _2で割った値 is _入力された値 // 2. '2 : 3の倍数なら二乗した値'(_入力された値,_二乗した値) :- '3の倍数なら'(_入力された値), 二乗した値(_入力された値,_二乗した値). '3の倍数なら'(_入力された値) :- 0 is _入力された値 mod 3. 二乗した値(_入力された値,_二乗した値) :- _二乗した値 is _入力された値 ^ 2. '3: 2の倍数なら2で割った値'(_入力された値,_2で割った値) :- '2の倍数なら'(_入力された値), '2で割った数'(_入力された値,_2で割った値). '2の倍数なら'(_入力された値) :- 0 is _入力された値 mod 2. '2で割った値'(_入力された値,_2で割った値) :- _2で割った値 is _入力された値 // 2. '4: 上記以外の倍数は、二乗した値から元の値を引いた値'(_入力された値,_倍数,_二乗した値から元の値を引いた値) :- '上記以外の倍数は、'(_入力された値,_倍数), 二乗した値から元の値を引いた値(_入力された値,_二乗した値から元の値を引いた値). '上記以外の倍数は、'(_入力された値,_倍数) :- between(1,_入力された値,_倍数), \+(0 is _倍数 mod 6), \+(0 is _倍数 mod 3), \+(0 is _倍数 mod 2), 0 is _入力された値 mod _倍数. 二乗した値から元の値を引いた値'(_入力された値,_二乗した値から元の値を引いた値) :- _二乗した値から元の値を引いた値 is _入力された値 ^ 2 - _入力された値. '☆ 複数の条件が合致した場合は大きい倍数の条件のみとする'(LL,_条件を満たした値) :- 最大値(LL,[_最も大きい倍数,_条件を満たした値]). 表示する(_入力された値,_条件を満たした値) :- writef('入力された値=%t,条件を満たした値=%t\n',[_入力された値,_条件を満たした値]). 最大値([A|R],_最大値) :- 最大値([A|R],A,_最大値),!. 最大値([],_最大値,_最大値). 最大値([A|R],B,_最大値) :- A @> B, 最大値(R,A,_最大値). 最大値([A|R],B,_最大値) :- A @=< B, 最大値(R,B,_最大値). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/170 # お題:分母が自然数m以下の既約分数で0より大きく1より小さいものを小さい順にならべる。 # m=3 -> 1/3,1/2,2/3 # m=5 -> 1/5,1/4,1/3,2/5,1/2,3/5,2/3,3/4,4/5 # # '分母が自然数m以下の既約分数で0より大きく1より小さいものを小さい順にならべる。'(_m,_整列した分数ならび) :- findall(_分子 rdiv _分母,( between(2,_m,_分母), '_分母の既約分数'(_分母,_分子)), _分数ならび), sort(_分数ならび,_整列した分数ならび). '_分母の既約分数'(_分母,_分子) :- findall(N,between(1,_分母,N),_数ならび), 分母を分子候補で割り切れきれるものを篩に掛ける(1,_分母,_数ならび,_篩に掛けられた分子ならび), member(_分子,_篩に掛けられた分子ならび). 分母を分子候補で割り切れきれるものを篩に掛ける(_分母,_分母,_篩に掛けられた分子ならび,_篩に掛けられた分子ならび) :- !. 分母を分子候補で割り切れきれるものを篩に掛ける(M,_分母,_数ならび_1,_篩に掛けられた分子ならび) :- 'Mで割り切れる数を取り除く'(M,_数ならび_1,_数ならび_2), M_2 is M + 1, 分母を分子候補で割り切れきれるものを篩に掛ける(M_2,_分母,_数ならび_2,_篩に掛けられた分子ならび). 'Mで割り切れる数を取り除く'(M,_数ならび_1,_数ならび_2) :- findall(_分子候補,( nth1(_,_数ならび_1,_分子候補), \+(0 is _数 mod M)), _数ならび_2). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/103 # お題:与えられた年月のカレンダーを表示せよ。 # '与えられた年月のカレンダーを表示せよ。'(_年,_月) :- カレンダー矩形(_年,_月,_カレンダー矩形), カレンダーを表示する(_年,_月,_カレンダー矩形). カレンダー矩形(_年,_月,_カレンダー矩形) :- '1日の曜日を表す値'(_年,_月,_1日の曜日を表す値), 月末日(_年,_月,_月末日), 日付を埋めて週カレンダーならびを作る(_1日の曜日を表す値,_月末日,_カレンダー矩形). '1日の曜日を表す値'(_年,_月,_曜日を表す値) :- 'Zellerの公式を用いて曜日を表す値と曜日を得る'(_年,_月,1,_曜日を表す値,_). 'Zellerの公式'(_年,_月,_日,_曜日を表す値) :- _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7. 'Zellerの公式を用いて曜日を表す値と曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を表す値と曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 > 2, 'Zellerの公式'(_年,_月,_日,_曜日を表す値), 'Zellerの公式で曜日を表す値と曜日'(_曜日を表す値,_曜日). 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 =< 2, _年_1 is _年 - 1, _月_2 is _月 + 12, 'Zellerの公式を用いて曜日を表す値と曜日を得る'(_年_1,_月_2,_日,_曜日を表す値,_曜日). 'Zellerの公式で曜日を表す値と曜日'(0,日曜). 'Zellerの公式で曜日を表す値と曜日'(1,月曜). 'Zellerの公式で曜日を表す値と曜日'(2,火曜). 'Zellerの公式で曜日を表す値と曜日'(3,水曜). 'Zellerの公式で曜日を表す値と曜日'(4,木曜). 'Zellerの公式で曜日を表す値と曜日'(5,金曜). 'Zellerの公式で曜日を表す値と曜日'(6,土曜). 月末日(_年,2,29) :- うるう年(_年),!. 月末日(_年,2,28) :- !. 月末日(_,_月,31) :- member(_月,[1,3,5,7,8,10,12]). 月末日(_,_月,30) :- member(_月,[4,6,9,11]). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- \+(0 is _年 mod 100),!. うるう年(_年) :- 0 is _年 mod 4. 日付を埋めて週カレンダーならびを作る(_1日の曜日を表す値,_月末日,_週カレンダーならび) :- 日付を埋める(_1日の曜日を表す値,_月末日,_42日分の日枠), 週ごとに折り返す(_42日分の日枠,_週カレンダーならび). 日付を埋める(_1日の曜日を表す値,_月末日,_42日分の日枠) :- findall(A,( between(1,42,N), _日付 is N - _1日の曜日を表す値, 日付か空白を選択(_日付,_月末日,A)), _42日分の日枠). 日付か空白を選択(_日付,_月末日,' ') :- _日付 < 0,!. 日付か空白を選択(_日付,_月末日,' ') :- _日付 > _月末日,!. 日付か空白を選択(_日付,_月末日,_日付). 週ごとに折り返す([],[]). 週ごとに折り返す([_1,_2,_3,_4,_5,_6,_7|R1],[[_1,_2,_3,_4,_5,_6,_7]|R2]) :- 週ごとに折り返す(R1,R2). カレンダーを表示する(_年,_月,_週カレンダーならび) :- カレンダーの年月を表示する(_年,_月), カレンダーの日付部を表示する(_週カレンダーならび). カレンダーの年月を表示する(_年,_月) :- writef('\n%10R年%3R月 \n\n',[_年,_月]). カレンダーの日付部を表示する([]) :- !. カレンダーの日付部を表示する([_週カレンダー|R]) :- writef('%3R%3R%3R%3R%3R%3R%3R\n',_週カレンダー), カレンダーの日付部を表示する(R). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/83 # お題:次の式をn=10について計算し、大きい順に式と値を表示する。 # logは自然対数、sqrtは平方根、!は階乗、^は累乗とする。 # 2^n # 2^log(n) # 4^n # n # n^2 # n! # n*log(n) # log(n!) # log(log(n)) # sqrt(log(n)) # # '次の式をn=10について計算し、大きい順に式と値を表示する。 logは自然対数、sqrtは平方根、!は階乗、^は累乗とする。 2^n,2^log(n),4^n,n,n^2,n!,n*log(n),log(n!),log(log(n)),sqrt(log(n))' :- _n = 10, _nの階乗 is 10*9*8*7*6*5*4*3*2*1, findall([X,A],( nth1(_nth1,[2^_n,2^log(_n),4^_n,_n,_n^2,_nの階乗,_n*log(_n),log(_nの階乗),log(log(_n)),sqrt(log(_n))],F), nth1(_nth1,[2^_n,2^log(_n),4^_n,_n,_n^2,'10!',_n*log(_n),log('10!'),log(log(_n)),sqrt(log(_n))],A), X is F), L1), '大きい順に式と値を表示する。'(L1). '大きい順に式と値を表示する。'(L1) :- sort(L1,L2), reverse(L2,L3), forall(member([X,F],L3),writef('%t=%t\n',[F,X])). % 以下のサイトは # 出題場所 :: 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/db/1371476534/541 # 質問です教えてください # # データベース = access # テーブル名 = T_DATA # # SQLで取得したい結果は、KEYごとに日数を取得したいのですが # 重複する日数はカウントから除外したいです。 # どんなSQLを書けばいいですか? # # ・キーは、日数=5日 # ・キーは、日数=1日 # # ---------------------------------- # キー, 開始日, 終了日 # ---------------------------------- # 1, 2014/01/01, 2014/01/01 |→ 日数=1日 # 1, 2014/01/02, 2014/01/02 |→ 日数=1日 # 1, 2014/01/02, 2014/01/02 |→ 日数=0日(重複) # 1, 2014/01/03, 2014/01/03 |→ 日数=1日 # 1, 2014/01/04, 2014/01/05 |→ 日数=2日、合計=5日 # --- # 2, 2014/01/01, 2014/01/01 |→ 日数=1日 # 2, 2014/01/01, 2014/01/01 |→ 日数=0日(重複)、合計=1日 # # ↓これだと重複がカウントされてしまいます。 # SELECT # キー # ,SUM(DATEDIFF('d', 開始日, 終了日)+1) AS 日数 # FROM # T_DATA # GROUP BY # キー # 'データベース = access テーブル名 = T_DATA SQLで取得したい結果は、KEYごとに日数を取得したいのですが 重複する日数はカウントから除外したいです。'(_キーごとの日数) :- findsetof(_キー,'T_DATA'(_キー,_,_),_キーならび), findall([_キー,_日数],( member(_キー,_キーならび), キーの日数を得る(_キー,_日数)), _キーごとの日数). キーの日数を得る(_キー,_日数) :- findall(_日,( 'T_DATA'(_キー,_開始日,_終了日), 整数構造に変換(_開始日,_終了日,_開始日整数構造,_終了日整数構造), 範囲の日を引出す(_開始日整数構造,_終了日整数構造,_日)), L1), 重複日を取り除いた日数(L1,_日数). 整数構造に変換(_開始日,_終了日,_開始日整数構造,_終了日整数構造) :- read_term_from_atom(_開始日,_開始日整数構造), read_term_from_atom(_終了日,_終了日整数構造). 範囲の日を引出す(_終了日,_終了日,_終了日) :- !. 範囲の日を引出す(_日,_終了日,_日). 範囲の日を引出す(_日_1,_終了日,_日) :- 翌日(_日_1,_翌日), 範囲の日を引出す(_翌日,_終了日,_日). 翌日(_年/12/_31,_翌年/1/1) :- _翌年 is _年 + 1,!. 翌日(_年/_月/_日,_年/_翌月/1) :- 月末日(_年/_月/_日), _翌月 is _月 + 1,!. 翌日(_年/_月/_日,_年/_月/_翌日の日) :- _翌日の日 is _日 + 1,!. 月末日(_年/2/29) :- うるう年(_年),!. 月末日(_年/2/28) :- \+(うるう年(_年)),!. 月末日(_年/_月/30) :- member(_月,[4,6,9,11]),!. 月末日(_年/_月/31) :- member(_月,[1,3,5,7,8,10,12]). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 重複日を取り除いた日数(L1,_日数) :- sort(L1,L2), length(L2,_日数). findsetof(_パターン,_目標,_パターン集合) :- findall(_パターン,_目標,L), sort(L,_パターン集合). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/43 # お題 与えられた集合の要素を数珠順列に並べたもの全てを列挙せよ。 # # 例 # # {'a','b','c','d'} の数珠順列の全て # necklace=λ kfsAg:sum([[(kfsAg.sl[0],y)+x+(z,) for x in permutate(kfsAg-kfs([kfsAg.sl[0],y,z]))] for y,z in combinate(kfsAg.sl[1:],2)],[]); necklace(kfs("abcd")) # =============================== # [('a', 'b', 'd', 'c'), ('a', 'b', 'c', 'd'), ('a', 'c', 'b', 'd')] # # # # [1, 2, 3, 4, 5] の数珠順列の全て # necklace=λ kfsAg:sum([[(kfsAg.sl[0],y)+x+(z,) for x in permutate(kfsAg-kfs([kfsAg.sl[0],y,z]))] for y,z in combinate(kfsAg.sl[1:],2)],[]); necklace(kfs([1,2,3,4,5])) # =============================== # [(1, 2, 4, 5, 3), (1, 2, 5, 4, 3), (1, 2, 3, 5, 4), (1, 2, 5, 3, 4), (1, 2, 3, 4, 5), (1, 2, 4, 3, 5), # (1, 3, 2, 5, 4), (1, 3, 5, 2, 4), (1, 3, 2, 4, 5), (1, 3, 4, 2, 5), (1, 4, 2, 3, 5), (1, 4, 3, 2, 5)] # # 参考 URL;;http://ime.nu/www.geocities.jp/m_hiroi/light/pyalgo62.html # # '与えられた集合の要素を数珠順列に並べたもの全てを列挙せよ。'(_集合,_数珠順列) :- _集合 = [_首に掛ける要素|_残り集合], length(_残り集合,_残り集合の要素数), findall([_首に掛ける要素|L],( 順列(_残り集合,_残り集合の要素数,L)), _数珠順列). 順列(Y,0,[]). 順列(Y,N,[A|X]) :- select(A,Y,Z), M is N - 1, 順列(Z,M,X). % 以下のサイトは # 出典: プログラミングのお題スレ Part3 #24 # お題: # リストを与え、昇順でソートされている部分列のリスト出力する # [8,3,4,9,9,10,6,1,4,3] => [[8],[3,4,9,9,10],[6],[1,4],[3]] # [1,3,3,4,4,6,8,9,9,10] => [[1,3,3,4,4,6,8,9,9,10]] # [10,9,9,8,6,4,4,3,3,1] => [[10],[9,9],[8],[6],[4,4],[3,3],[1]] # [1,1,1,1,1,1,1,1,1,1] => [[1,1,1,1,1,1,1,1,1,1]] # [] => [] # [1] => [[1]] 'リストを与え、昇順でソートされている部分列のリスト出力する'(L) :- 'リストを与え、昇順でソートされている部分列のリストを'(L,LL), 出力する(LL) :- 'リストを与え、昇順でソートされている部分列のリストを'(L,LL) :- findall(L2,( append(L1,L2,L3,L), 昇順(L2), 'L1,L3とL2は昇順の接続になっていない'(L1,L2,L3)), LL). 昇順([A]) :- !. 昇順([A,B|R]) :- A =< B, 昇順([B|R]). 'L1,L3とL2は昇順の接続になっていない'(L1,L2,L3) :- 'L1とL2は昇順の接続になっていない'(L1,L2), 'L1とL3は昇順の接続になっていない'(L1,L3). 'L1とL2は昇順の接続になっていない'(L1,L2) :- \+((L2=[A|_],最後の要素(L1,B),A >= B)). 'L1とL3は昇順の接続になっていない'(L1,L3) :- \+((最後の要素(L2,A),L3=[B|_],A =< B))). 最後の要素(_ならび,_最後の要素) :- append(_,[_最後の要素],_ならび). 出力する(L,LL) :- writef('%t => %t\n',[L,LL]). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/23 # お題: # リストを与え、ソートされていれば昇順(AS)か降順(DES)か全て同じ要素(EQ)かを出力する # ソートされていなければ先頭からソートされている個数を出力する # [6,6,3,2,6,4,7,4,7,4] => 4 # [2,3,4,4,4,6,6,6,7,7] => AS # [7,7,6,6,6,4,4,4,3,2] => DES # [1,1,1,1,1,1,1,1,1,1] => EQ # [] => EQ # [1] => EQ # # 'リストを与え、ソートされていれば昇順(AS)か降順(DES)か全て同じ要素(EQ)かを出力する。ソートされていなければ先頭からソートされている個数を出力する'(_リスト,全て同じ要素) :- 全て同じ要素である(_リスト),!. 'リストを与え、ソートされていれば昇順(AS)か降順(DES)か全て同じ要素(EQ)かを出力する。ソートされていなければ先頭からソートされている個数を出力する'(_リスト,昇順) :- 昇順にソートされている(_リスト),!. 'リストを与え、ソートされていれば昇順(AS)か降順(DES)か全て同じ要素(EQ)かを出力する。ソートされていなければ先頭からソートされている個数を出力する'(_リスト,降順) :- 降順にソートされている(_リスト),!. 'リストを与え、ソートされていれば昇順(AS)か降順(DES)か全て同じ要素(EQ)かを出力する。ソートされていなければ先頭からソートされている個数を出力する'(_リスト,_個数) :- ソートされていなければ先頭からソートされている個数を出力する(_リスト,_個数). 全て同じ要素である([],_). 全て同じ要素である([A|R],A) :- 全て同じ要素である(R,A). 昇順にソートされている(_リスト) :- forall(append(_,[A,B|_],_リスト),A @=< B). 降順にソートされている(_リスト) :- forall(append(_,[A,B|_],_リスト),A @>= B). ソートされていなければ先頭からソートされている個数を出力する(L,_先頭からソートされている個数) :- findall(Len,( append(L1,L2,L), length(L1,Len), (昇順にソートされている(L1);降順にソートされている(L1)), _長さならび), 最大値(_長さならび,_先頭からソートされている個数). 最大値([A|R],_最大値) :- 最大値(R,A,_最大値). 最大値([],_最大値,_最大値). 最大値([A|R],_最大値_1,_最大値) :- A @> _最大値_1, 最大値(R,A,_最大値),!. 最大値([A|R],_最大値_1,_最大値) :- 最大値(R,_最大値_1,_最大値). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/3 # お題:aをもっとも近いbの倍数に丸める。ちょうど中間の場合は # 0から遠ざかる方向へ丸める。bが実数の場合は誤差はやむを得ないものとする。 # 例 # a=123,b=12 -> 120 # a=126,b=12 -> 132 # a=-123,b=12 -> -120 # a=-126,b=12 -> -132 # a=1.234,b=0.01 -> 1.23 # a=1.235,b=0.01 -> 1.24 # # 'aをもっとも近いbの倍数に丸める。ちょうど中間の場合は0から遠ざかる方向へ丸める。 bが実数の場合は誤差はやむを得ないものとする。'(_a,_b,_aにもっとも近いbの倍数) :- findall(_bの倍数,( nth1(_倍数,_,_), _bの倍数 is _b * _倍数, ( bの倍数がaをb以上超えたら終了(_bの倍数,_a,_b),!,fail;'bの倍数がaの前後(ただしaを超える場合はbの倍数とaの差はb未満)'(_bの倍数,_a,_b))), [_aに等しいかaより小さい数,_aに等しいかaより大きい数]), 'aをもっとも近いbの倍数に丸める。ちょうど中間の場合は0から遠ざかる方向へ丸める。'(_a,_aに等しいかaより小さい数,_aに等しいかaより大きい数,_aにもっとも近いbの倍数). bの倍数がaをb以上超えたら終了(_bの倍数,_a,_b) :- abs(_bの倍数) >= abs(_a + _b). 'bの倍数がaの前後(ただしaを超える場合はbの倍数とaの差はb未満)'(_bの倍数,_a,_b) :- abs(_bの倍数 - _a) =< abs(_b). 'aをもっとも近いbの倍数に丸める。ちょうど中間の場合は0から遠ざかる方向へ丸める。'(_a,_aに等しいかaより小さい数,_aに等しいかaより大きい数,_aに等しいかaより大きい数) :- abs(_aに等しいかaより大きい数 - _a) =< abs(_aに等しいかaより小さい数 - _a),!. 'aをもっとも近いbの倍数に丸める。ちょうど中間の場合は0から遠ざかる方向へ丸める。'(_,_aに等しいかaより小さい数,_aに等しいかaより大きい数,_aに等しいかaより小さい数). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/990 # お題:円周率の歴史の長さからみれば出来立てほやほやのBBPの式を使って # 円周率を小数点以下15桁まで求める。 #   ∞ # π=Σ(4/(8*k+1)-1/(4*k+2)-1/(8*k+5)-1/(8*k+6))/(16^k) #   k=0 # # '円周率の歴史の長さからみれば出来立てほやほやのBBPの式を使って円周率を小数点以下15桁まで求める。'(_円周率) :- 'BBPの式'(_円周率_1), sformat(S,'~15f',[_円周率_1]), read_term_from_atom(S,_円周率,[]). 'BBPの式'(_円周率) :- findsum(A,( between(0,20,_k), A is (4/(8*_k+1)-1/(4*_k+2)-1/(8*_k+5)-1/(8*_k+6))/(16^_k)), _円周率). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/885 # 夜分遅くに申し訳ございません… # 本日9時提出の課題を今になって気づいたのですが、私の頭ではさっぱりわからないのでお助け下さい… # # [1]プログラミングC # [2] 問題文(含コード&リンク): # 問1:以下の実行結果に示すような、3つの実数を入力した後、最大値と最小値の差を求めるプログラムを作成せよ。 # ※例 # 3つの整数を入力してください。 # na=12 # nb=65 # nc=44 # 65と12の差は53です。 # # 問2:以下の文字列(programming_jissyu)が配列に格納されているとする。 # この文字列を任意の位置で2つ分割して表示するプログラムを作成せよ。 # ※例 # 難文字目で分割しますか:11 # 文字列の前半 # programming # 文字列の後半 # _jissyu # '問1:以下の実行結果に示すような、3つの整数を入力した後、最大値と最小値の差を求めるプログラムを作成せよ。 ※例 3つの整数を入力してください。 na=12 nb=65 nc=44 65と12の差は53です。' :- '3つの整数を入力した後、'(_3つの整数), 最大値と最小値の差(_3つの整数,_最大値,_最小値,_最大値と最小値の差), writef('%tと%tの差は%tです。',[_最大値,_最小値,_最大値と最小値の差]). '3つの整数を入力した後、'(_3つの整数) :- write('3つの整数を入力してください。\n'), findall(_整数,( member(A,[na,nb,nc]), writef('%t=',[A]), 整数を得る(_整数)), _3つの整数). 最大値と最小値の差(_3つの整数,_最大値,_最小値,_最大値と最小値の差) :- 最大値(_3つの整数,_最大値), 最小値(_3つの整数,_最小値), _最大値と最小値の差 is _最大値 - _最小値. 最大値(_整数ならび,_最大値) :- select(N,_整数ならび,R), forall(member(M,R),M =< N). 最小値(_整数ならび,L_最小値) :- select(N,_整数ならび,R), forall(member(M,R),M >= N). 整数を得る(_整数) :- 一行読み込む(Line), '診断: 整数を得る'(Line,_整数),!. 整数を得る(_整数) :- 整数を得る(_整数). '診断: 整数を得る'(Line,_整数) :- read_term_from_atom(Line,_整数,[]), integer(_整数),!. '診断: 整数を得る'(Line,_整数) :- writef('入力された値"%t"から整数は得られません。再入力をお願いします。\n',[Line]), fail. 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/955 # お題:自然数nの階乗の素因数2の個数を求める。(2014年センター試験) # n=5 -> 3 # n=13 -> 10 # # '自然数nの階乗の素因数2の個数を求める。(2014年センター試験)'(_n,_自然数nの階乗の素因数2の個数) :- findsum(_素因数2の個数,( between(1,_n,N), findsum(1,( nth1(_nth1,_,_), (\+(0 is N mod (2 ^ _nth1)),!,fail;true)), _素因数2の個数)), _自然数nの階乗の素因数2の個数). findsum(A,B,C) :- findall(A,B,L), sumlist(L,C). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/955 # お題:自然数nの階乗の素因数2の個数を求める。(2014年センター試験) # n=5 -> 3 # n=13 -> 10 # # '自然数nの階乗の素因数2の個数を求める。(2014年センター試験)'(_自然数n,_自然数nの階乗の素因数2の個数) :- findsum(_ある自然数の素因数2の個数,( between(1,_自然数n,_ある自然数), ある自然数の素因数2の個数を求める(_ある自然数,_ある自然数の素因数2の個数)), _自然数nの階乗の素因数2の個数). ある自然数の素因数2の個数を求める(_ある自然数,_ある自然数の素因数2の個数) :- nth0(_ある自然数の素因数2の個数,_,_), \+(0 is _ある自然数 mod (2 ^ (_ある自然数の素因数2の個数 + 1))),!. findsum(_選択項,_副目標,_合計) :- findall(_選択項,_副目標,_選択項ならび), sumlist(_選択項ならび,_合計). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/868 # [2] 入力した5文字までの文字列を5個まで格納して表示する。 # 5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、入力したすべての文字列を表示。 # '入力した5文字までの文字列を5個まで格納して表示する。5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、入力したすべての文字列を表示。' :- '入力した5文字までの文字列を5個まで格納する。5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、'(_文字列を5個まで格納), '入力したすべての文字列を表示。'(_文字列を5個まで格納). '入力した5文字までの文字列を5個まで格納する。5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、'(_文字列を5個まで格納) :- length(Ln,5), '入力した5文字までの文字列を5個まで格納する。5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、'(Ln,_文字列を5個まで格納). '入力した5文字までの文字列を5個まで格納する。5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、'([_|Ln],[_5文字までの文字列|R]) :- 入力した5文字までの文字列を(_5文字までの文字列), \+(_文字列=''), '入力した5文字までの文字列を5個まで格納する。5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、'(Ln,R). '入力した5文字までの文字列を5個まで格納する。5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、'(_,_,[]). 入力した5文字までの文字列を(_5文字までの文字列) :- findall(_文字,( nth1(Nth1,_,_), ( Nth1 > 5,!,fail; get_char(_文字), ( _文字 = '\n',!,fail; true))), _入力文字ならび), atomic_list_concat(_入力文字ならび,_5文字までの文字列). '入力したすべての文字列を表示。'(_文字列を5個まで格納) :- forall(member(_文字列,_文字列を5個まで格納),writef('%t\n',[_文字列])). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/929 # お題:3次元の配列を連番で初期化する。 # Jの場合 # a=:i.2 3 4 # a # 0 1 2 3 # 4 5 6 7 # 8 9 10 11 # # 12 13 14 15 # 16 17 18 19 # 20 21 22 23 # # (<1;2;3){a # 23 # # '3次元のならびを連番で初期化する。'(_3次元のならび,_初期化された3次元のならび) :- ならびの構造(_3次元のならび,_1,_2,_3), findall(_初期化された2次元ならび,( nth0(N1,_3次元のならび,_), findall(_初期化された1次元ならび,( nth0(N2,_2次元ならび,_), findall(N,( U is _1 * _2, U_2 is U + _3 - 1, between(U,U_2,N)), _初期化された1次元ならび)), _初期化された2次元ならび)), _初期化された3次元ならび). ならびの構造(LLL,_1,_2,_3) :- length(_3次元のならび,_1), _3次元のならび = [_2次元のならび|_], length(_2次元のならび,_2), _2次元のならび = [_1次元のならび|_], length(_1次元のならび,_3). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/910 # お題:2文字以上の文字列が与えられたとき、隣り合う文字の大きい方の文字を # 隣り合う文字の間に挿入した文字列を返す。 # 例 # "Personal" -> "Peerrsssoonnall" # "Hello, world!" -> "Heellllooo,, wwworrrlldd!" # % このブログラムは間違っている。最後の一文字が削られてしまう。 % この問題を解消したプログラム '2文字以上の文字列が与えられたとき、隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列を返す。'(_文字列,_全ての隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列) :- findall(_隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列,( sub_atom(_文字列,_,2,_,_2文字), 隣り合う文字の大きい方の文字を隣り合う文字の間に挿入(_2文字,_隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列)),L), atomic_list_concat(L,_全ての隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列). 隣り合う文字の大きい方の文字を隣り合う文字の間に挿入(_2文字,_隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列) :- 隣り合う2文字の大きい方の文字(_2文字,_文字_1,_文字_2,_大きい方の文字), atomic_list_concat([_文字_1,_大きい方の文字],_隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列). 隣り合う2文字の大きい方の文字(_2文字,_文字_1,_文字_2,_大きい方の文字) :- sub_atom(_2文字,0,1,_,_文字_1), sub_atom(_2文字,1,1,_,_文字_2), 隣り合う文字の大きい方の文字(_文字_1,_文字_2,_大きい方の文字). 隣り合う文字の大きい方の文字(_文字_1,_文字_2,_文字_1) :- _文字_1 @>= _文字_2. 隣り合う文字の大きい方の文字(_文字_1,_文字_2,_文字_2) :- _文字_1 @< _文字_2. % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1387257592/189 # ●Regular Expressionの使用環境 # ruby # # ●検索か置換か? # 置換 # # ●説明 # 行中の改行を削除したい # 以下でやると改行だけでなく改行の前の一文字も何故か消えてうまくいきません # 対象データの場合は「元」が消えてしまいます # # ruby -e 'puts open("input.txt").read.gsub(/[^。¥n]¥n/,"")' > output.txt # # ●対象データ # こんにちはお元 # 気ですか。 # 私は元気です。 # # ●希望する結果 # こんにちはお元気ですか。 # 私は元気です。 # # 文字列中の改行を削除したい(_文字列,_改行を削除された文字列) :- findall(_文字,( sub_atom(_文字列,_,1,_,_文字), \+(_文字 = '\n')), _改行を削除された文字ならび), atomic_list_concat(_改行を削除された文字ならび,_改行を削除された文字列). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/896 # お題:単語データファイル「words.txt」から英単語リストを読み取り、アルファベットでしりとりを行い、 # 一番長いしりとりの単語列を出力せよ。同じ単語は二度使わない。 # # '一番長いしりとりの単語列を出力せよ。同じ単語は二度使わない。'(_単語列,_一番長いしりとりの単語列) :- '同じ単語は二度使わない。'(_単語列,_整列した重複のない単語列), forall(一番長いしりとり単語列を(_整列した重複のない単語列,_一番長いしりとりの単語列),'出力せよ。'(_一番長いしりとりの単語列)). 一番長いしりとり単語列を(_整列した重複のない単語列,_一番長いしりとりの単語列) :- findall([_長さ,_しりとりの単語列],しりとりの単語列(_整列した重複のない単語列,_しりとりの単語列,_長さ),LL), 一番長い(LL,_一番長い), member([_一番長い,_しりとりの単語列],LL), reverse(_しりとりの単語列,_一番長いしりとりの単語列). '同じ単語は二度使わない。'(_単語列,_整列した重複のない単語列) :- sort(_単語列,_整列した重複のない単語列). しりとりの単語列(_単語列,_しりとりの単語列,_長さ) :- select(_単語,_単語列,_残り単語列), しりとり(_単語,_残り単語列,[_単語],_しりとりの単語列), length(_しりとりの単語列,_長さ). しりとり(_単語,_単語列,L1,_しりとりの単語列) :- 単語列の中から単語の末尾文字と同じ先頭文字を持つ単語を捜す(_単語,_単語列,_次の単語候補,_残り単語列), しりとり(_次の単語候補,_残り単語列,[_次の単語候補|L1],_しりとりの単語列). しりとり(_,_,_しりとりの単語列,_しりとりの単語列). 単語列の中から単語の末尾文字と同じ先頭文字を持つ単語を捜す(_単語,_単語列,_単語_2,_残り単語列) :- sub_atom(_単語,_,1,0,_文字), select(_単語_2,_単語列,_残り単語列), sub_atom(_単語_2,0,1,_,_文字). 一番長い(LL,_一番長い) :- 最大値を捜す(_長さ,member([_長さ,_],LL),_一番長い),!. 最大値を捜す(A,B,C) :- findall(A,B,L), 最大値(L,C). 最大値(L,C) :- select(C,L,R), forall(member(A,R),A @=< C). '出力せよ。'(_一番長いしりとりの単語列) :- atomic_list_concat(_一番長いしりとりの単語列,' ',_一番長いしりとりの単語列表現), writef('%t\n',[_一番長いしりとりの単語列表現]). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/854 # 四つの塔がある。幽霊に任意の座標を与えたとき、そこから最も近くにある塔を出力しなさい。 # # 塔A、B、C、Dの座標: # A(2, 2) B(5, 2) C(2, 5) D(5, 5) # # 幽霊の座標: # 0≦y≦7, 0≦x≦7, # # 図1:塔の配置 # □□□□□□□□ # □□□□□□□□ # □□A □□B,□□ # □□□□□□□□ # □□□□□□□□ # □□C □□D,□□ # □□□□□□□□ # □□□□□□□□ # # 図2:幽霊の座標(3, 3) # □□□□□□□□ # □□□□□□□□ # □□A □□B,□□ # □□□幽□□□□ # □□□□□□□□ # □□C □□D,□□ # □□□□□□□□ # □□□□□□□□ # # 入力と出力例: # in  : (3, 3) # out : A # # 塔('A',2,2). 塔('B',5,2). 塔('C',2,5). 塔('D',5,5). '四つの塔がある。幽霊に任意の座標を与えたとき、そこから最も近くにある塔を出力しなさい。' :- '幽霊に任意の座標を与えたとき、'(X,Y), 'そこから最も近くにある塔を出力しなさい。'(X,Y). '幽霊に任意の座標を与えたとき、'(X,Y) :- 整数を得る('幽霊のX座標',(X >= 0,X =< 7),X), 整数を得る('幽霊のY座標',(Y >= 0,Y =< 7),Y). 'そこから最も近くにある塔を出力しなさい。'(X,Y) :- 幽霊と四つの塔との距離ならび(_距離と塔ならび), 最短距離は(_距離と塔ならび,_最短距離), '最も近くにある塔を出力しなさい。'(_距離と塔ならび,_最短距離). 幽霊と四つの塔との距離ならび(_距離と塔ならび) :- findall([_距離,_塔],(塔(_塔,_x,_y),_距離 is abs(X - _x) + abs(Y - _Y)),_距離と塔ならび). 最短距離は(_距離と塔ならび,_最短距離) :- findmin(_距離,member([_距離,_],_距離と塔ならび),_最短距離). '最も近くにある塔を出力しなさい。'(_距離と塔ならび,_最短距離) :- forall(member([_最短距離,_塔],_距離と塔ならび),writef('%t\n',[_塔])). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/db/1371476534/493 # SQLServer2008R2です. # テーブルデータはDATE(YYYYMMの6けたのint型),CODE(varchar型),VALUE(float型) # の3カラムからなります.各DATEの各CODEに対して過去3か月分の総和を算出したいと思います. # 元テーブル # DATE, CODE, VALUE # .... # 200101, AAA, 1 # 200102, AAA, 2 # 200103, AAA, 3 # 200104, AAA, 4 # 200101, BBB, 1 # .... # # 欲しい結果 # 200103, AAA, 6 # 200104, AAA, 9 # ....... # # 下記のようなSQLを書いたのですが,同じ結果の行が12か月分でてきます. # 何処を修正すればよろしいでしょうか?もしくは全然違うSQLでしょうか? # # SELECT A.DATE, A.CODE, SUM(B.VALUE) OVER (PARTITION BY B.DATE, B.CODE) # FROM TABLE A, TABLE B # WHERE A.CODE=B.CODE AND B.DATE>=A.DATE AND B.DATE>=(A.DATEの3か月前←計算式が長いので省略です) # ORDER BY A.DATE, A.CODE # # よろしくお願いいたします. # '3ヶ月前の起点月'(_今日,_3ヶ月前の起点年月) :- 今日が1月から3月の範囲では前年となる(_今日,_3ヶ月前の起点年月),!. '3ヶ月前の起点月'(_今日,_3ヶ月前の起点年月) :- 今日が4月から12月の範囲では今年となる(_今日,_3ヶ月前の起点年月). 今日が1月から3月の範囲では前年となる(_今日,_3ヶ月前の起点月) :- M is _今月 mod 100, M =< 3, _3ヶ月前の起点月 is _今日 - 100 + 9. 今日が4月から12月の範囲では今年となる(_今日,_3ヶ月前の起点月) :- _3ヶ月前の起点月 is _今日 - 3. 過去三ヶ月の集計(_過去三ヶ月の集計ならび) :- findsetof([_DATE,CODE],( 'A'(_DATE,CODE,_)), _DATE_CODEならび), findall([_DATE,_CODE,_集計],( member([_DATE,_CODE],_DATE_CODEならび), 'DATE,CODEでVAULEを集約'(_DATE,_CODE,_集計)), _過去三ヶ月の集計ならび). 'DATE,CODEでVAULEを集約'(_DATE,_CODE,_集計) :- findsum(_VALUE,( '3ヶ月前の起点月'(_DATE,_3ヶ月前の起点月), 'A'(_DATE_1,_CODE,_VALUE), _DATE_1 >= _3ヶ月前の起点月, _DATE_1 =< _DATE), _集計). % 以下のサイトは 構文解析(L,LL) :- findall([_語ならび,_品詞],( append(L1,L2,L), 語句解析(L1,L2,_品詞,_語ならび)), LL). 語句解析(_前方,[私|_],名詞,[私]). 語句解析(_前方,[は|_],後置詞,[は]). 語句解析(_前方,[反対です|_],動詞,[反対です]). % ?- 構文解析([私,は,反対です],LL). % % LL = [[['私'],'名詞'],[['は'],'後置詞'],[['反対です'],'動詞']]. % yes. % ?- % 以下のサイトは # 出題場所 :: 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/775 # お題:文字を円形に並べる。一番上が最初の文字。時計回りに等間隔で並べる。 # 半径は文字間隔が離れすぎず近すぎない程度になるよう適当に選ぶ。 # # '文字を円形に並べる。一番上が最初の文字。時計回りに等間隔で並べる。'(_文字列) :- atom_chars(_文字列,_文字ならび), 文字盤を用意する(_文字ならび,_文字盤), 文字盤に円形に文字を書き込む(_文字ならび,_文字盤), 文字を表示する(_文字盤). 文字盤を用意する(_文字ならび,_文字盤) :- length(_文字ならび,_文字数), '_文字数+1の文字盤を作る'(_文字数,_文字盤). '_文字数+1の文字盤を作る'(_文字数,_文字盤) :- _文字数_1 is _文字数 + 1, length(_文字盤,_文字数_1), findall(L,( length(L,_文字数_1)), _文字盤). 円形に文字を書き込む(_文字ならび,_文字盤) :- length(_文字ならび,_文字ならびの要素数), _半径 is _文字ならびの要素数 // 2, 点に文字を書き込む(0,_文字ならび,_文字ならびの要素数,_半径,_文字盤). 点に文字を書き込む(_,[],_,_,_文字盤) :- !. 点に文字を書き込む(_n,[_文字|R],_分割数,_半径,_文字盤) :- '_x,_yの座標点を得る'(_n,_半径,_分割数,_x,_y), '文字盤の_x,_yに_文字を埋める'(_x,_y,_文字,_文字盤), _n_2 is _n + 1, 点に文字を書き込む(_n_2,R,_分割数,_半径,_文字盤). '_x,_yの座標点を得る'(_n,_半径,_分割数,_x,_y) :- _x is truncate(sin((2 * pi) / _分割数 * _n + (pi / 2)) * _半径 + _半径 + 0.5), _y is truncate(cos((2 * pi) / _分割数 * _n + (pi / 2)) * _半径 + _半径 + 0.5). '文字盤の_x,_yに_文字を埋める'(_x,_y,_文字,_文字盤) :- nth1(_y,_文字盤,L), nth1(_x,L,_文字),!. 文字を表示する([]) :- !. 文字を表示する([L|R]) :- forall(member(A,L),変数は空白に埋めて文字を出力する(A)), write('\n'), 文字を表示する(R). 変数は空白に埋めて文字を出力する(A) :- var(A), write(' '),!. 変数は空白に埋めて文字を出力する(A) :- write(A). % 以下のサイトは % % SWI-Prolog の readln/1 では % ?- readln(X). % :| abc,def % X = [abc,',',def] が期待される。 % ところが漢字を用いると % ?- readln(X). % :| 尾崎,隆大 % X = [尾,崎,',',隆,大] となって漢字の部分を語と認識しない。 % この問題を回避する為の一時凌ぎが以下の述語である。 % 予め、アトムを構成する文字コードのリストを utf16_code/1 で定義して置く。 % :- findall(X,between(12288,40959,X),L1), findall(Y,between(65280,65299,Y),L2), append(L1,L2,L), assertz(utf16_code(L)). readln(X) :- utf16_code(U), readln(X,_,_,U,_). % 以下のサイトは タブ区切り(_文字列,_列ならび) :- findall(_列,( 先頭からタブ区切り(_文字列,_,_列)), _列ならび). 先頭からタブ区切り(_文字列,_列目,_副文字列) :- 先頭からタブ区切り(_文字列,_列目,_,_副文字列,_). 先頭からタブ区切り(_文字列,_列目,_区切り文字,_前文字列,_副文字列,_後文字列) :- 先頭からタブ区切り(_文字列,'',1,_列目,_区切り文字,_前文字列,_副文字列,_後文字列). 先頭からタブ区切り('',_,_,_,_,_,_,_) :- !,fail. 先頭からタブ区切り(_文字列,_前文字列_1,_列目_1,_列目,_区切り文字,_前文字列,_副文字列,_後文字列) :- タブ区切りが成立する(_文字列,_区切り文字_1,_副文字列_1,_後文字列_1),!, 先頭からタブ区切り(_列目_1,_区切り文字_1,_前文字列_1,_副文字列_1,_後文字列_1,_列目,_区切り文字,_前文字列,_副文字列,_後文字列). 先頭からタブ区切り(_文字列,_前文字列,_列目,_列目,'',_前文字列,_文字列,''). 先頭からタブ区切り(_列目,_区切り文字,_前文字列,_副文字列,_後文字列,_列目,_区切り文字,_前文字列,_副文字列,_後文字列). 先頭からタブ区切り(_列目_1,_,_前文字列_1,_副文字列_1,_後文字列_1,_列目,_区切り文字,_前文字列,_副文字列,_後文字列) :- _列目_2 is _列目_1 + 1, atomic_list_concat([_前文字列_1,_副文字列_1,'\t'],_前文字列_2), 先頭からタブ区切り(_後文字列_1,_前文字列_2,_列目_2,_列目,_区切り文字,_前文字列,_副文字列,_後文字列). タブ区切りが成立する(_文字列,'\t',_副文字列_1,_後文字列_1) :- sub_atom(_文字列,S,1,R,'\t'), sub_atom(_文字列,0,S,_,_副文字列_1), sub_atom(_文字列,_,R,0,_後文字列_1),!. % 以下のサイトは 語候補(2,_,_,尾崎,尾崎). 語候補(3,_前文字列,_後文字列,太加夫,隆大) :- sub_atom(_前文字列,_,_,_,尾崎). 語候補(3,_前文字列,_後文字列,太加夫,太加夫) :- \+(sub_atom(_前文字列,_,_,_,尾崎)). 文字列から最長一致法を用いて語候補を検索する(_文字列,_前文字列,_適合文字列,_後文字列) :- 候補文字列長さならび(_候補文字列長さならび), 文字列から最長一致法を用いて語候補を検索する(_文字列,_候補文字列長さならび,_前文字列,_適合文字列,_後文字列). 文字列から最長一致法を用いて語候補を検索する(_文字列,_候補文字列長さならび,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_開始位置,_長さ,_残り長さ,_適合文字列_1), member(_長さ,_候補文字列長さならび), 文字列の長さと候補文字列を得る(_文字列,_候補文字列長さならび,_長さ,_適合文字列_1,_適合文字列_1_2), 前文字列と後文字列を得る(_文字列,_開始位置,_長さ,_残り長さ,_前文字列_1,_後文字列_1), 文字列から最長一致法を用いて語候補を検索する(_候補文字列長さならび,_文字列長により降順整列した語候補ならび,_前文字列_1,_適合文字列_1_2,_後文字列_1,_前文字列,_適合文字列,_後文字列). 文字列から最長一致法を用いて語候補を検索する(_候補文字列長さならび,_前文字列,_適合文字列,_後文字列,_前文字列,_適合文字列,_後文字列). 文字列から最長一致法を用いて語候補を検索する(_候補文字列長さならび,_前文字列_1,_適合文字列_1,_後文字列_1,_前文字列,_適合文字列,_後文字列) :- 文字列から最長一致法を用いて語候補を検索する(_後文字列_1,_候補文字列長さならび,_前文字列_2,_適合文字列,_後文字列), atomic_list_concat([_前文字列_1,_適合文字列_1,_前文字列_2],_前文字列). 候補文字列長さならび(_候補文字列長さならび) :- findall(_長さ,( setof(_長さ,語候補(_長さ,_,_,_,_),[_長さ])), _候補文字列長さならび_1), reverse(_候補文字列長さならび_1,_候補文字列長さならび),!. '文字列の長さと前文字列・適合文字列・後文字列を得る'(_文字列,_開始位置,_長さ,_残り長さ,_語候補,_前文字列_1,_適合文字列_1,_後文字列_1) :- 前文字列と後文字列を得る(_文字列,_開始位置,_長さ,_残り長さ,_前文字列_1,_後文字列_1), 語候補(_長さ,_前文字列,_後文字列,_語候補,_適合文字列_1). 前文字列と後文字列を得る(_文字列,_開始位置,_長さ,_残り長さ,_前文字列_1,_後文字列_1) :- sub_atom(_文字列,0,_開始位置,_,_前文字列_1), sub_atom(_文字列,_,_残り長さ,0,_後文字列_1). % 以下のサイトは 語候補(2,尾崎,尾崎). 語候補(3,太加夫,隆大). 文字列から最長一致法を用いて語候補を検索する(_文字列,_前文字列,_適合文字列,_後文字列) :- 候補文字列長さならび(_候補文字列長さならび), [_最長候補文字列長さ|_] = _候補文字列長さならび, 文字列から最長一致法を用いて語候補を検索する(_文字列,_候補文字列長さならび,_最長候補文字列長さ,_前文字列,_適合文字列,_後文字列). 文字列から最長一致法を用いて語候補を検索する(_文字列,_候補文字列長さならび,_最長候補文字列長さ,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_開始位置,_長さ,_残り長さ,_適合文字列_1), _長さ =< _最長候補文字列長さ, 文字列の長さと候補文字列を得る(_文字列,_候補文字列長さならび,_長さ,_適合文字列_1,_適合文字列_1_2), 前文字列と後文字列を得る(_文字列,_開始位置,_長さ,_残り長さ,_前文字列_1,_後文字列_1), 文字列から最長一致法を用いて語候補を検索する(_候補文字列長さならび,_前文字列_1,_適合文字列_1_2,_後文字列_1,_前文字列,_適合文字列,_後文字列). 文字列から最長一致法を用いて語候補を検索する(_候補文字列長さならび,_前文字列,_適合文字列,_後文字列,_前文字列,_適合文字列,_後文字列). 文字列から最長一致法を用いて語候補を検索する(_候補文字列長さならび,_前文字列_1,_適合文字列_1,_後文字列_1,_前文字列,_適合文字列,_後文字列) :- 文字列から最長一致法を用いて語候補を検索する(_後文字列_1,_候補文字列長さならび,_前文字列_2,_適合文字列,_後文字列), atomic_list_concat([_前文字列_1,_適合文字列_1,_前文字列_2],_前文字列). 候補文字列長さならび(_候補文字列長さならび) :- findall(_長さ,( setof(_長さ,語候補(_長さ,_,_),[_長さ])), _候補文字列長さならび_1), reverse(_候補文字列長さならび_1,_候補文字列長さならび),!. 文字列の長さと候補文字列を得る(_文字列,_候補文字列長さならび,_長さ,_適合文字列_1,_適合文字列_1_2) :- member(_長さ,_候補文字列長さならび), 語候補(_長さ,_適合文字列_1,_適合文字列_1_2). 前文字列と後文字列を得る(_文字列,_開始位置,_長さ,_残り長さ,_前文字列_1,_後文字列_1) :- sub_atom(_文字列,0,_開始位置,_,_前文字列_1), sub_atom(_文字列,_,_残り長さ,0,_後文字列_1). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/726 # お題:連続した自然数の和が2014になるものをすべて求める。 # # '連続した自然数の和が2014になるものをすべて求める。'(_和が2014になる連続した自然数) :- N_1 is 2014 // 2, findall(N,between(1,N_1,N),L), append(L1,L2,L), 和が2014になる連続した自然数(L2,_和が2014になる連続した自然数). 和が2014になる連続した自然数(L2,_和が2014になる連続した自然数) :- 和が2014以上になる連続した自然数(L2,_和が2014になる連続した自然数,2014). 和が2014以上になる連続した自然数(L2,_和が2014以上になる連続した自然数,_和) :- append(_和が2014を以上の連続した自然数,_,L2), sumlist(_和が2014を以上の連続した自然数,_和), _和 >= 2014,!. % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/726 # お題:連続した自然数の和が2014になるものをすべて求める。 # # '連続した自然数の和が2014になるものをすべて求める。'(_和が2014になる連続した自然数) :- N_1 is 2014 // 2, findall(N,between(1,N_1,N),L), append(L1,L2,L), 和が2014になる連続した自然数(L2,_和が2014になる連続した自然数). 和が2014になる連続した自然数(L2,_和が2014になる連続した自然数) :- 和が2014以上になる連続した自然数(L2,_和が2014以上になる連続した自然数,_和), _和 = 2014, _和が2014以上になる連続した自然数 = _和が2014になる連続した自然数. 和が2014以上になる連続した自然数(L2,_和が2014以上になる連続した自然数,_和) :- append(_和が2014を以上の連続した自然数,_,L2), sumlist(_和が2014を以上の連続した自然数,_和), _和 >= 2014,!. % 以下のサイトは # 出題場所 http://twitter.com/genkuroki/statuses/416777263229575168" # @genkuroki # #掛算 たとえば「かけざん」のテストで常に掛算以外の方法で解く問題を # 混ぜておくとか、問題文中に無駄な数値を混ぜておいて答えを出すために # 必要な情報を文中から抜き出せるかを見るとか、すでに様々な手段が提案され、 # 自分の子の理解度を測るために実行している保護者もいる 'たとえば「かけざん」のテストで常に掛算以外の方法で解く問題を 混ぜておくとか、問題文中に無駄な数値を混ぜておいて答えを出すために 必要な情報を文中から抜き出せるかを見るとか、すでに様々な手段が提案され、 自分の子の理解度を測るために実行している保護者もいる'(A,B,C) :- findall(1,( between(1,A,_), between(1,B,_)),L), length(L,C). % 以下のサイトは # 出題場所 http://twitter.com/genkuroki/statuses/416777263229575168" # @genkuroki # #掛算 たとえば「かけざん」のテストで常に掛算以外の方法で解く問題を # 混ぜておくとか、問題文中に無駄な数値を混ぜておいて答えを出すために # 必要な情報を文中から抜き出せるかを見るとか、すでに様々な手段が提案され、 # 自分の子の理解度を測るために実行している保護者もいる 'たとえば「かけざん」のテストで常に掛算以外の方法で解く問題を 混ぜておくとか、問題文中に無駄な数値を混ぜておいて答えを出すために 必要な情報を文中から抜き出せるかを見るとか、すでに様々な手段が提案され、 自分の子の理解度を測るために実行している保護者もいる'(A,B,C) :- length(L1,A), findall(L1,between(1,B,_),LL), flatten(LL,L2), length(L2,C). % 以下のサイトは # 出題場所 http://toro.2ch.net/test/read.cgi/tech/1387257592/131 # すいません。VBScriptで # 抽出した文字列にダブりがあります。 # 例: # AAA # BBB # AAA # CCC # BBB # CCC # これを # AAA # BBB # CCC # のように抽出し直すにはどうすればいいでしょうか? '抽出した文字列にダブりがあります。\\n例:\\nAAA\\nBBB\\nAAA\\nCCC\\nBBB\\nCCC\\nこれを\\nAAA\\nBBB\\nCCC\\nのように抽出し直すにはどうすればいいでしょうか?'(_文字列ならび,_抽出し直した文字列ならび) :- findall(_文字列,( append(L1,[_文字列|R],_文字列ならび), \+(member(_文字列,L1))), _抽出し直した文字列ならび). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/576 # 西暦何年かを入力するとその年に月曜日が何回あるか数え # 52回なら1を、53回なら0を出力するプログラムお願いします… # # 1回1回判定するのではなく、一気に何回か入力し、一気に判定を出力するものでお願いします # (0を入力したら終わりです) # # 入力できるのは1989〜5000です # # '西暦何年かを入力するとその年に月曜日が何回あるか数え 52回なら1を、53回なら0を出力するプログラムお願いします… 1回1回判定するのではなく、一気に何回か入力し、一気に判定を出力するものでお願いします (0を入力したら終わりです) 入力できるのは1989〜5000です' :- '西暦何年かを一気に何回か入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_西暦ならび), 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'(_西暦ならび). '西暦何年かを一気に何回か入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_西暦ならび) :- findall(_西暦,( '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'('西暦(1989~5000)を入力して下さい',_西暦),( _西暦=0,!,fail;true)),_西暦ならび). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'([]). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'([_西暦|_残りならび]) :- 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を'(_西暦,_0または1), writef('%t年 %t\n',[_西暦,_0または1]), 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'(_残りならび). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を'(_西暦,_0または1) :- うるう年で1月1日が日曜か月曜の時は0それ以外は1(_西暦,_0または1). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を'(_西暦,_0または1) :- うるう年でない年は1月1日が月曜の時は0それ以外は1(_西暦,_0または1). うるう年で1月1日が日曜か月曜の時は0それ以外は1(_西暦,0) :- うるう年(_西暦), '1月1日が日曜か月曜の時は'(_西暦),!. うるう年で1月1日が日曜か月曜の時は0それ以外は1(_西暦,1) :- うるう年(_西暦). '1月1日が日曜か月曜の時は'(_西暦) :- 'Zellerの公式を用いて曜日を得る'(_西暦,1,1,_曜日を表す値,_曜日), member(_曜日,[日曜,月曜]). うるう年でない年は1月1日が月曜の時は0それ以外は1(_西暦,0) :- \+(うるう年(_西暦)), 'Zellerの公式を用いて曜日を得る'(_西暦,1,1,_曜日を表す値,月曜),!. うるう年でない年は1月1日が月曜の時は0それ以外は1(_西暦,1) :- \+(うるう年(_西暦)). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 > 2, _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 曜日を表す値(_曜日を表す値,_曜日). 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 =< 2, _年_1 is _年 - 1, _月_2 is _月 + 12, 'Zellerの公式を用いて曜日を得る'(_年_1,_月_2,_日,_曜日を表す値,_曜日). 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_催促文,_西暦) :- writef('%t ',[_催促文]), get_line(_入力行), '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_入力行,_西暦). '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_催促文,_西暦) :- '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_催促文,_西暦). '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'('0',0) :- !. '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_入力行,_西暦) :- read_term_from_atom(_入力行,_西暦,[]), integer(_西暦), between(1989,5000,_西暦),!. '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_入力行,_) :- writef('入力された文字列"%t"から1899年から5000年範囲の西暦が得られませんでした\n再入力をお願いします\n',[_入力行]), fail. get_line(Line) :- get_line(user_input,Line). get_line(Instream,Line) :- get_char(Instream,C), get_line_1(Instream,C,Chars), atom_chars(Line,Chars) . get_line_1(_,'\n',[]) :- !. get_line_1(_,end_of_file,[]) :- !. get_line_1(Instream,C,[C|R]) :- get_char(Instream,C2), get_line_1(Instream,C2,R). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/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/658 # 任意精度整数モジュールを使ってバグ修正したかったが、 # 諸事情でそれもできなかったので出題の意図を縮小して訂正。 # # お題:1から10000までの整をすべて足せ。 # すべて足したら、その合計を表示せよ。 # # 回答例: Objective Caml version 3.08.1 # let sum1to n = # let rec f sum n = # if n = 0 then sum # else f (sum + n) (n - 1) in # f 0 n;; # print_int (sum1to 10000);; # ↓ # 50005000 # # '1から10000までの整数をすべて足せ。すべて足したら、その合計を表示せよ。' :- '1からNまでの整数をすべて足せ。'(10000,_合計), 'すべて足したら、その合計を表示せよ。'(_合計). '1からNまでの整数をすべて足せ。'(N,_合計) :- findall(M,between(1,N,M),_1からNまでのならび), sumlist(_1からNまでのならび,_合計). 'すべて足したら、その合計を表示せよ。'(_合計) :- writef('その合計は%t\n',[_合計]). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/658 # 任意精度整数モジュールを使ってバグ修正したかったが、 # 諸事情でそれもできなかったので出題の意図を縮小して訂正。 # # お題:1から10000までの整をすべて足せ。 # すべて足したら、その合計を表示せよ。 # # 回答例: Objective Caml version 3.08.1 # let sum1to n = # let rec f sum n = # if n = 0 then sum # else f (sum + n) (n - 1) in # f 0 n;; # print_int (sum1to 10000);; # ↓ # 50005000 # # '1から10000までの整数をすべて足せ。すべて足したら、その合計を表示せよ。' :- '1から10000までの整数をすべて足せ。'(_合計), すべて足したら、その合計を表示せよ。'(_合計). '1から10000までの整数をすべて足せ。'(_合計) :- findall(N,between(1,10000,N),_1から10000までのならび), atomic_list_concat(_1から10000までのならび,'+',_式文字列), read_term_form_atom(_式文字列,_式,[]), _合計 is _式. 'すべて足したら、その合計を表示せよ。'(_合計) :- writef('その合計は%t\n',[_合計]). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/658 # 任意精度整数モジュールを使ってバグ修正したかったが、 # 諸事情でそれもできなかったので出題の意図を縮小して訂正。 # # お題:1から10000までの整をすべて足せ。 # すべて足したら、その合計を表示せよ。 # # 回答例: Objective Caml version 3.08.1 # let sum1to n = # let rec f sum n = # if n = 0 then sum # else f (sum + n) (n - 1) in # f 0 n;; # print_int (sum1to 10000);; # ↓ # 50005000 # # '1から10000までの整数をすべて足せ。すべて足したら、その合計を表示せよ。' :- '1から10000までの整数をすべて足せ。'(_合計), すべて足したら、その合計を表示せよ。'(_合計). '1から10000までの整数をすべて足せ。'(_合計) :- findall(N,between(1,10000,N),L), sumlist(L,_合計). 'すべて足したら、その合計を表示せよ。'(_合計) :- writef('その合計は%t\n',[_合計]). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/658 # 任意精度整数モジュールを使ってバグ修正したかったが、 # 諸事情でそれもできなかったので出題の意図を縮小して訂正。 # # お題:1から10000までの整をすべて足せ。 # すべて足したら、その合計を表示せよ。 # # 回答例: Objective Caml version 3.08.1 # let sum1to n = # let rec f sum n = # if n = 0 then sum # else f (sum + n) (n - 1) in # f 0 n;; # print_int (sum1to 10000);; # ↓ # 50005000 # # '1から10000までの整数をすべて足せ。すべて足したら、その合計を表示せよ。' :- '1から10000までの整数をすべて足せ。'(_合計), 'すべて足したら、その合計を表示せよ。'(_合計). '1から10000までの整数をすべて足せ。'(_合計) :- findall(N,between(1,10000,N),L), sumlist(L,_合計). 'すべて足したら、その合計を表示せよ。'(_合計) :- writef('合計は %t\n',[_合計]). % 以下のサイトは # 出題場所 :: 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). % 以下のサイトは # 出題場所 :: 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回繰り返し、途中経過を表示する。' :- length(Ln,10), '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'(Ln,'1'). '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'([],_文字列) :- !. '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'([_|Ln],_文字列) :- writef('%t\n',[_文字列]), この操作を(_文字列,_次の文字列), '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'(Ln,_次の文字列). この操作を(_文字列,_次の文字列) :- findall(_個数と連続した記号の結合文字列,( '文字列の連続した記号(1個を含む)とその個数を得る'(_文字列,_連続した記号,_個数), atomic_list_concat([_個数,_連続した記号],_個数と連続した記号の結合文字列)), _個数と連続した記号の結合文字列ならび), 次の文字列は個数と連続した記号の結合文字列ならびを結合したもの(_個数と連続した記号の結合文字列ならび,_次の文字列). '文字列の連続した記号(1個を含む)とその個数を得る'(_文字列,_連続した記号,_個数) :- atom_chars(_文字列,_文字ならび), 'ならびの連続した記号(1個を含む)とその個数を得る'(_文字ならび,_連続した記号,_個数). 'ならびの連続した記号(1個を含む)とその個数を得る'(_文字ならび,_連続した記号,_個数) :- append(L1,L2,L3,_文字ならび), 'L2は_記号が_個数連続している'(L2,_連続した記号,_個数), '両隣は_連続した記号と異なる'(_連続した記号,L1,L3). '両隣は_連続した記号と異なる'(_連続した記号,L1,L3) :- \+((last(L1,A0),A0=_連続した記号)), \+((nth1(1,L3,A3),A3=_連続した記号)). 次の文字列は個数と連続した記号の結合文字列ならびを結合したもの(_個数と連続した記号の結合文字列ならび,_次の文字列) :- atomic_list_concat(_個数と連続した記号の結合文字列ならび,_次の文字列). 'L2は_記号が_個数連続している'(L2,_記号,_個数) :- L2 = [_記号|R], all(R,_記号), length([_記号|R],_個数). all([],_). all([V|R],V) :- all(R,V). append([],L2,L3,L) :- append(L2,L3,L). append([U|R1],L2,L3,[U|R4]) :- append(R1,L2,L3,R4). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/db/1371476534/487 # 次のようなデータがあります。 # tozai nihon # 関東 関東 # 関西 関西 # −− 関西 # 関西 関東 # −− 関東 # −− −− # 関東 関東 # 関西 関西 # # (−−)は空のデータ # # # tozaiとnihonではtozaiが優先されます。 # 例えば、tozai=関西,nihon=関東となっていた場合、tozaiが優先されるので「関西」と見なされます。 # この条件で、関東と関西のデータがそれぞれ何件あるか調査する為に次の3つのSQL文を出しました。 # これらを一つの文にまとめたいのですが、どのようにしたらよいでしょうか? # # select count(*) from hoge where tozai='関東' or (tozai='' and nihon='関東'); # 結果=3 # # select count(*) from hoge where tozai='関西' or (tozai='' and nihon='関西'); # 結果=4 # # select count(*) from hoge where tozai='' and nihon=''; # 結果=1 # # 'tozaiとnihonではtozaiが優先されます。 例えば、tozai=関西,nihon=関東となっていた場合、tozaiが優先されるので「関西」と見なされます。 この条件で、関東と関西のデータがそれぞれ何件あるか調査する為に次の3つのSQL文を出しました。 これらを一つの文にまとめたいのですが、どのようにしたらよいでしょうか?'(_関東,_関西) :- findall([N1,N2],( hoge(_tozai,_nihon), hoge_select(_tozai,_hihon,N1,N2)), LL), 転置(LL,[L1,L2]), sumlist(L1,_関東), sumlist(L2,_関西). hoge_select('','',_,_) :- !,fail. hoge_select('',関東,1,0). hoge_select('',関西,0,1). hoge_select(関東,_,1,0). hoge_select(関西,_,0,1). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). % 以下のサイトは # 出題場所 :: 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回繰り返し、途中経過を表示する。' :- length(Ln,10), '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'(Ln,'1'). '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'([],_文字列) :- !. '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'([_|Ln],_文字列) :- writef('%t\n',[_文字列]), この操作を(_文字列,_次の文字列), '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'(Ln,_次の文字列). この操作を(_文字列,_次の文字列) :- findall(_個数と連続した記号の結合文字列,( '文字列の連続した記号(1個を含む)とその個数を得る'(_文字列,_連続した記号,_個数), atomic_list_concat([_個数,_連続した記号],_個数と連続した記号の結合文字列)), _個数と連続した記号の結合文字列ならび), 次の文字列は個数と連続した記号の結合文字列ならびを結合したもの(_個数と連続した記号の結合文字列ならび,_次の文字列). '文字列の連続した記号(1個を含む)とその個数を得る'(_文字列,_連続した記号,_個数) :- atom_chars(_文字列,_文字ならび), 'ならびの連続した記号(1個を含む)とその個数を得る'(_文字ならび,_連続した記号,_個数). 'ならびの連続した記号(1個を含む)とその個数を得る'(_文字ならび,_連続した記号,_個数) :- append(L1,L2,L3,_文字ならび), 'L2は_記号が_個数連続している'(L2,_連続した記号,_個数), '両隣は_連続した記号と異なる'(_連続した記号,L1,L3). '両隣は_連続した記号と異なる'(_連続した記号,L1,L3) :- \+((last(L1,A0),A0=_連続した記号)), \+((nth1(1,L3,A3),A3=_連続した記号)). 次の文字列は個数と連続した記号の結合文字列ならびを結合したもの(_個数と連続した記号の結合文字列ならび,_次の文字列) :- atomic_list_concat(_個数と連続した記号の結合文字列ならび,_次の文字列). 'L2は_記号が_個数連続している'(L2,_記号,_個数) :- L2 = [_記号|R], all(R,_記号), length([_記号|R],_個数). all([],_). all([V|R],V) :- all(R,V). append([],L2,L3,L) :- append(L2,L3,L). append([U|R1],L2,L3,[U|R4]) :- append(R1,L2,L3,R4). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/561 # n個の実数x(i)をキーボードから読み込み、それらの平均と標準偏差を出力するプログラムを作りなさい。ただし、n個の実数の平均を求める関数mean(size,x[ ])と標準偏差を求める関数stdev(size,x[ ])を定義し、これを用いること。 # がわかりませぬ。どなたか教えてください。 # # 'n個の実数x(i)をキーボードから読み込み、それらの平均と標準偏差を出力するプログラムを作りなさい。ただし、n個の実数の平均を求める関数mean(size,x[ ])と標準偏差を求める関数stdev(size,x[ ])を定義し、これを用いること。' :- 'n個の実数x(i)をキーボードから読み込み、'(_n個,_n個の実数), 'それらの平均と標準偏差を出力する'(_n個,_n個の実数). 'n個の実数x(i)をキーボードから読み込み、'(_n個,_n個の実数) :- length(_n個の実数,_n個), findall(_個々の実数,( 個々の実数(_n個の実数,_個々の実数), 実数を得る(_個々の実数)), _n個の実数). 'それらの平均と標準偏差を出力する'(_n個,_n個の実数) :- 'n個の実数の平均を求める関数mean(size,x[ ])'(_n個,_n個の実数,_n個の実数の平均), 'n個の実数の標準偏差を求める関数stdev(size,x[ ])'(_n個,_n個の実数,_n個の実数の標準偏差), writef('平均  = %t\n標準偏差 = %t\n',[_n個の実数の平均,_n個の実数の標準偏差). 'n個の実数の平均を求める関数mean(size,x[ ])'(_n個,_n個の実数,_n個の実数の平均) :- sum_list(_n個の実数,_n個の実数の合計), _n個の実数の平均 is _n個の実数の合計 / _n個. 'n個の実数の標準偏差を求める関数stdev(size,x[ ])'(_n個,_n個の実数,_n個の実数の標準偏差) :- 'n個の実数の平均を求める関数mean(size,x[ ])'(_n個,_n個の実数,_n個の実数の平均), findsum(_個々の実数と平均の差の二乗,( 個々の実数(_n個の実数,_個々の実数), _個々の実数と平均の差の二乗 is (_個々の実数 - _n個の実数の平均) ^ 2), _個々の実数と平均の差の二乗の合計), _n個の実数の標本の分散 is _個々の実数と平均の差の二乗の合計 / _n個, _n個の実数の標準偏差 is sqrt(_n個の実数の標本の分散). 個々の実数(_n個の実数,_個々の実数) :- nth1(_,_n個の実数,_個々の実数). 実数を得る(_個々の実数) :- get_line(Line), read_term_from_atom(Line,_実数,[]), 実数診断(Line,_実数),!. 実数を得る(_個々の実数) :- 実数を得る(_個々の実数). 実数診断(Line,_実数) :- float(_実数),!. 実数診断(Line,_実数) :- writef('入力された %t から実数が得られません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 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,_要素数). % 以下のサイトは # prologについてです。 # 2乗和のプログラムが書けなくて困っています。1からXまでの2乗和Yを計算するプログラムssq(X,Y)を”一切isを用いず”に作成していただけないでしょうか?よろしくお願いします。 ssq(X,Y) :- findall(LL,( between(1,X,M), length(L,M), findall(L,nth1(_,L,_),LL)), LL2), flatten(LL2,L2), length(L2,Y). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/465 # お題:与えられた文字列中の各文字数をカウントして表示せよ。 # 表示順や形式は定めない。 # # 回答例およびチェック用出力例: c # #include <stdio.h> # void check(const char *cs) { # int i, counts[256] = {0}; # for (i = 0; cs[i] != '\0'; i++) counts[cs[i]] += 1; # for (i = 0; i < 256; i++) { # if (counts[i]) printf("'%c'=>%d, ", (char)i, counts[i]); # } # } # int main() { # check("We will encourage you to develop the three great virtues of a programmer: laziness, impatience, and hubris."); # return 0; # } # ↓ # ' '=>16, ','=>2, '.'=>1, ':'=>1, 'W'=>1, 'a'=>7, 'b'=>1, 'c'=>2, 'd'=>2, 'e'=>14 # , 'f'=>1, 'g'=>3, 'h'=>3, 'i'=>6, 'l'=>4, 'm'=>3, 'n'=>4, 'o'=>6, 'p'=>3, 'r'=>8 # , 's'=>4, 't'=>6, 'u'=>4, 'v'=>2, 'w'=>1, 'y'=>1, 'z'=>1, # # '与えられた文字列中の各文字数をカウントして表示せよ。表示順や形式は定めない。'(_文字列,_各文字数のカウント) :- findall(_文字_1,( setof(_文字_1,sub_atom(_文字列,_,1,_,_文字_1),[_文字_1])), _重複のない文字ならび), findall([_文字,_文字数のカウント],( member(_文字,_重複のない文字ならび), カウント(sub_atom(_文字列,_,1,_,_文字),_文字数のカウント)), _各文字数のカウント). カウント(P,_カウント) :- findall(1,P,L), length(L,_カウント). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/449 # お題:与えられた配列をなるべくN等分せよ。 # 要素の順番は入れ替えず、配列の配列として返す。 # Nは1以上とする。 # データ構造は、リスト、ベクタ、タプルなどでも可。 # # 回答例およびチェック用出力例: ruby 1.8.6 # def narudiv(a, n) # d, m = a.size.divmod(n) # (1..n).map {|i| a.slice!(0, d + (i <= m ? 1 : 0))} # end # p narudiv((1..10).to_a, 3) # p narudiv((1..15).to_a, 4) # ↓ # [[1, 2, 3, 4], [5, 6, 7], [8, 9, 10]] # [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15]] # # '与えられた配列をなるべくN等分せよ。 要素の順番は入れ替えず、配列の配列として返す。 Nは1以上とする。 データ構造は、リスト、ベクタ、タプルなどでも可。'(_N,_ならび,_N等文されたならび) :- length(_ならび,_要素数), _D is _要素数 // _N, _M is _要素数 mod N, '_Mを各_Dに割り振る'(_D,_M,_N,_N等分されたならび), flatten(_N等分されたならび,_ならび). '_Mを各_Dに割り振る'(_D,_M,_N,_N等分されたならび) :- length(_N等分されたならび,_N), findall(_n,between(1,_N,_n),L1), 組合せ(L1,_M,_組合せ), '_N等分されたならびを充実させる'(_D,_組合せ,_N等分されたならび). '_N等分されたならびを充実させる'(_D,_組合せ,_N等分されたならび) :- findall(L2,( nth1(_nth1,_N等分されたならび,L), length(L,_D), '_nth1が_組合せに存在するときには枠を追加する'(_nth1,L,_組合せ,L2)), _N等分されたならび). '_nth1が_組合せに存在するときには枠を追加する'(_nth1,L,_組合せ,[_|L]) :- member(_nth1,_組合せ),!. '_nth1が_組合せに存在するときには枠を追加する'(_,L,_組合せ,L). 組合せ(L,1,[A]) :- member(A,L). 組合せ([A|R1],N,[A|R3]) :- N > 1, M is N - 1, 組合せ(R1,M,R3). 組合せ([_|R1],N,L) :- N > 1, 組合せ(R1,N,L). % 以下のサイトは # 出題場所:: http://toro.2ch.net/test/read.cgi/tech/1357191974/435 # お題:1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は # 元のデータの順に)表示する。 '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)表示する。' :- '1から100までのチャンパーノウン定数'(_チャンパーノウン定数), '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(_チャンパーノウン定数,_整列した_開始位置_数値定数ならび), 表示する(_整列した_開始位置_数値定数ならび). '1から100までのチャンパーノウン定数'(_チャンパーノウン定数) :- findall(_数値定数,( between(1,100,_数値), atom_number(_数値定数,_数値)), _数値定数ならび), atomic_list_concat(['0.'|_数値定数ならび],_チャンパーノウン定数). '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(_チャンパーノウン定数,_整列した_開始位置_数値ならび) :- findall([_開始位置,_数値],( between(1,100,_数値), atom_number(_数値定数,_数値), sub_atom(_チャンパーノウン定数,_開始位置,_,_,_数値定数)), _開始位置_数値ならび), sort(_開始位置_数値ならび,_整列した_開始位置_数値ならび). 表示する(_整列した_開始位置_数値ならび) :- 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://toro.2ch.net/test/read.cgi/tech/1357191974/198 # # お題:チャンパーノウン定数を表示せよ。 # 表示された文字列中に"991"を一つだけ含むこと。 'お題:チャンパーノウン定数を表示せよ。 表示された文字列中に"991"を一つだけ含むこと。' :- 'チャンパーノウン定数を表示せよ。表示された文字列中に"991"を一つだけ含むこと。'(1,'0.'). 'チャンパーノウン定数を表示せよ。表示された文字列中に"991"を一つだけ含むこと。'(N,A) :- count(sub_atom(A,_,3,_,'991'),2),!,fail. 'チャンパーノウン定数を表示せよ。表示された文字列中に"991"を一つだけ含むこと。'(N,A) :- atom_number(B,N), atom_concat(A,B,C), '表示された文字列中に"991"を一つだけ含むこと。'(N,C). '表示された文字列中に"991"を一つだけ含むこと。'(N,_チャンパーノウン定数) :- '文字列中に"991"を一つだけ含むこと。'(_チャンパーノウン定数), writef('%t\n',[_チャンパーノウン定数]). '表示された文字列中に"991"を一つだけ含むこと。'(N,C) :- N_2 is N + 1, チャンパーノウン定数を表示せよ。表示された文字列中に"991"を一つだけ含むこと。'(N_2,C,_チャンパーノウン定数). '文字列中に"991"を一つだけ含むこと。'(_チャンパーノウン定数) :- count(sub_atom(_チャンパーノウン定数,_,3,_,'991'),1). count(P,N) :- findall(1,P,L), length(L,Count). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357191974/159 # # お題:値が奇数のデータだけ昇順にソートする。 # 例 # 37,61,86,9,81,50 -> 9,37,86,61,81,50 'お題:値が奇数のデータだけ昇順にソートする。 例 37,61,86,9,81,50 -> 9,37,86,61,81,50'(_値ならび,_奇数のデータだけ昇順にソートされた値ならび) :- 奇数のデータだけソートする(_値ならび,_昇順にソートされた奇数データならび), 奇数のデータだけ昇順に入れ替える(_値ならび,_昇順にソートされた奇数データならび,_奇数のデータだけ昇順にソートされた値ならび). 奇数のデータだけソートする(_値ならび,_奇数データならび) :- 奇数のデータだけ(_値ならび,_奇数のデータならび), ソートする(_奇数のデータならび,_昇順にソートされた奇数データならび). 奇数のデータだけ(_値ならび,_奇数のデータならび) :- findall(_値,( member(_値,_値ならび), 奇数(_値)), _奇数データならび). 奇数のデータだけ昇順に入れ替える([],_,[]). 奇数のデータだけ昇順に入れ替える([N1|R1],[N2|R2],[N2|R3]) :- 奇数(N1), 奇数のデータだけ昇順に入れ替える(R1,R2,R3). 奇数のデータだけ昇順に入れ替える([N1|R1],R2,[N1|R3]) :- 偶数(N1), 奇数のデータだけ昇順に入れ替える(R1,R2,R3). 奇数(N) :- 1 is N mod 2. 偶数(N) :- 0 is N mod 2. ソートする([],[]). ソートする([_軸要素|R1],L2) :- 分割(_軸要素,R1,L1_1,L1_2), ソートする(L1_1,L2_1), ソートする(L1_2,L2_2), append(L2_1,[_軸要素|L2_2],L2). 分割(_軸要素,[],[],[]). 分割(_軸要素,[N|R1],[N|R2],R3) :- N @=< _軸要素, 分割(_軸要素,R1,R2,R3). 分割(_軸要素,[N|R1],R2,[N|R3]) :- N @> _軸要素, 分割(_軸要素,R1,R2,R3). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/328 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # a) 4桁の西暦を入力として受け取り # b) その年のすべての日について次の演算を行い # c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日 # (例) # 20 + 13 + 11 + 25 = 69 # d) 各日の小計を大きいものから順に # 20131231 = 76 # ... # 20131125 = 69 # ... # 20130101 = 35 # のように表示させるプログラムを作りなさい # 'a) 4桁の西暦を入力として受け取り b) その年のすべての日について次の演算を行い c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日 (例) 20 + 13 + 11 + 25 = 69 d) 各日の小計を大きいものから順に 20131231 = 76 ... 20131125 = 69 ... 20130101 = 35 のように表示させるプログラムを作りなさい '(_四桁の西暦) :- findall([_小計,_年月日整数],( 'b) その年のすべての日について'(_四桁の西暦,_年月日整数), '次の演算を行い c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日'(_年月日整数,_小計)), _小計_年月日整数ならび), 'd) 各日の小計を大きいものから順に 20131231 = 76 ... 20131125 = 69 ... 20130101 = 35 のように表示させる'(_四桁の西暦,_小計_年月日整数ならび). 'b) その年のすべての日について'(_四桁の西暦,_年月日整数) :- between(1,12,_月整数), 月末日(_四桁の西暦,_月整数,_月末日整数), between(1,_月末日整数,_日整数), _年月日整数 is _四桁の西暦 * 10000 + _月整数 * 10 + _日整数. 月末日(_年整数,_月整数,_月末日整数) :- うるう年(_年整数), nth1(_月整数,[31,29,31,30,31,30,31,31,30,31,30,31],_月末日整数). 月末日(_年整数,_月整数,_月末日整数) :- \+(うるう年(_年整数)), nth1(_月整数,[31,28,31,30,31,30,31,31,30,31,30,31],_月末日整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4. '次の演算を行い c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日'(_年月日整数,_小計) :- 年の上位2桁(_年月日整数,_年の上位2桁), 年の下位2桁(_年月日整数,_年の下位2桁), 月(_年月日整数,_月整数), 日(_年月日整数,_日整数), _小計 is _年の上位2桁 + _年の下位2桁 + _月整数 + _日整数. 年の上位2桁(_年月日整数,_年の上位2桁) :- _年の上位2桁 is _年月日整数 // 1000000. 年の下位2桁(_年月日整数,_年の下位2桁) :- _剰余 is _年月日整数 mod 10000, _年の下位2桁 is _剰余 mod 100. 月(_年月日整数,_月整数) :- _剰余 is _年月日整数 mod 10000, _月整数 is _剰余_1 // 100. 日(_年月日整数,_日整数) :- _日整数 is _年月日整数 mod 100. 'd) 各日の小計を大きいものから順に 20131231 = 76 ... 20131125 = 69 ... 20130101 = 35 のように表示させる'(_年整数,_小計_年月日整数ならび) :- 年の組みの合計(_年整数,_年の組みの合計), forall((for(43,N,2),_小計 is _年の組みの合計 + N,member([_小計,_年月日整数],_小計_年月日整数ならび)),writef('%t = %t\n',[_年月日整数,_小計])). 年の組みの合計(_年整数,_年の組みの合計) :- _年の組みの合計 is _年整数 // 100 + _年整数 mod 100. % for/3 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/328 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # a) 4桁の西暦を入力として受け取り # b) その年のすべての日について次の演算を行い # c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日 # (例) # 20 + 13 + 11 + 25 = 69 # d) 各日の小計を大きいものから順に # 20131231 = 76 # ... # 20131125 = 69 # ... # 20130101 = 35 # のように表示させるプログラムを作りなさい # 'a) 4桁の西暦を入力として受け取り b) その年のすべての日について次の演算を行い c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日 (例) 20 + 13 + 11 + 25 = 69 d) 各日の小計を大きいものから順に 20131231 = 76 ... 20131125 = 69 ... 20130101 = 35 のように表示させるプログラムを作りなさい '(_四桁の西暦) :- findall([_小計,_年月日整数],( 'b) その年のすべての日について'(_四桁の西暦,_年月日整数), '次の演算を行い c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日'(_年月日整数,_小計)), _小計_年月日整数ならび), 'd) 各日の小計を大きいものから順に 20131231 = 76 ... 20131125 = 69 ... 20130101 = 35 のように表示させる'(_小計_年月日整数ならび). 'b) その年のすべての日について'(_四桁の西暦,_年月日整数) :- between(1,12,_月整数), 月末日(_四桁の西暦,_月整数,_月末日整数), between(1,_月末日整数,_日整数), _年月日整数 is _四桁の西暦 * 10000 + _月整数 * 10 + _日整数. 月末日(_年整数,_月整数,_月末日整数) :- うるう年(_年整数), nth1(_月整数,[31,29,31,30,31,30,31,31,30,31,30,31],_月末日整数). 月末日(_年整数,_月整数,_月末日整数) :- \+(うるう年(_年整数)), nth1(_月整数,[31,28,31,30,31,30,31,31,30,31,30,31],_月末日整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4. '次の演算を行い c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日'(_年月日整数,_小計) :- 年の上位2桁(_年月日整数,_年の上位2桁), 年の下位2桁(_年月日整数,_年の下位2桁), 月(_年月日整数,_月整数), 日(_年月日整数,_日整数), _小計 is _年の上位2桁 + _年の下位2桁 + _月整数 + _日整数. 年の上位2桁(_年月日整数,_年の上位2桁) :- _年の上位2桁 is _年月日整数 // 1000000. 年の下位2桁(_年月日整数,_年の下位2桁) :- _剰余 is _年月日整数 mod 10000, _年の下位2桁 is _剰余 mod 100. 月(_年月日整数,_月整数) :- _剰余 is _年月日整数 mod 10000, _月整数 is _剰余_1 // 100. 日(_年月日整数,_日整数) :- _日整数 is _年月日整数 mod 100. 'd) 各日の小計を大きいものから順に 20131231 = 76 ... 20131125 = 69 ... 20130101 = 35 のように表示させる'(_小計_年月日整数ならび) :- 各日の小計を大きいものから順に(_小計_年月日整数ならび,_大きいものから順に整列した_小計_年月日整数ならび), forall(member([_小計,_年月日整数],_大きいものから順に整列した_小計_年月日整数ならび),writef('%t = %t\n',[_年月日整数,_小計])). 各日の小計を大きいものから順に(_小計_年月日整数ならび,_大きいものから順に整列した_小計_年月日整数ならび) :- sort(_小計_年月日整数ならび,_小さいものから順に整列した_小計_年月日整数ならび), reverse(_小さいものから順に整列した_小計_年月日整数ならび,_大きいものから順に整列した_小計_年月日整数ならび), % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357191974/68 # # お題:文字列をランダムに並べ替える。 # ただし、どの文字も元と同じ位置ではないこと。 '文字列をランダムに並べ替える。 ただし、どの文字も元と同じ位置ではないこと。'(_文字列,_ランダムに並べ替えた文字列) :- 文字列の置換位置ならび(_文字列,_文字列の置換位置ならび), 文字列の置換位置ならびからランダムに並び替えた文字列を得る(_文字列の置換位置ならび,_文字列,_ランダムに並べ替えた文字列). 文字列の置換位置ならび(_文字列,_文字列の置換位置ならび) :- atom_length(_文字列,_文字列の長さ), length(_位置決めならび,_文字列の長さ), findall(N,between(1,_文字列の長さ,N),_整数順ならび), 位置を置換する(_整数順ならび,_文字列の置換位置ならび). 位置を置換する([],_位置決めならび) :- !. 位置を置換する([_位置1,_位置2,_位置3],_位置決めならび) :- 三つ巴交換(_位置1,_位置2,_位置3,_位置決めならび). 位置決めならび(L,_位置決めならび) :- 位置の交換(L,R,_位置決めならび), 位置を置換する(R,_位置決めならび). 三つ巴交換(_位置1,_位置2,_位置3,_位置決めならび) :- nth1(_位置1,_位置決めならび,_位置2), nth1(_位置2,_位置決めならび,_位置3), nth1(_位置3,_位置決めならび,_位置1),!. 位置の交換(L,L2,_位置決めならび) :- 位置選択(L,N1,L1), 位置選択(N2,L1,L2), nth1(N1,_位置決めならび,N2), nth1(N2,_位置決めならび,N1),!. 位置選択(L,_位置,L2) :- length(L,Len), _乱数値 is random(Len), length(L0,Len), append(L0,[_位置|R],L), append(L0,R,L2),!. 文字列の置換位置ならびからランダムに並び替えた文字列を得る(_文字列の置換位置ならび,_文字列,_ランダムに並べ替えた文字列) :- findall(_文字,( member(_位置,_文字列の置換位置ならび), _位置_1 is _位置 - 1, sub_atom(_文字列,_位置_1,1,_,_文字)), _ランダムに並べ替えた文字ならび), atomic_list_concat(_ランダムに並べ替えた文字ならび,_ランダムに並べ替えた文字列). % 以下のサイトは # 回文数 # コマ大数学科の問題だそうですよ。 # 引用 # ある数字とその数字を逆さに並べた数字を足して # 回文数になるまでこの操作を繰り返すとき # 1番回文数になりにくい2桁の数字を答えなさい。 # # *回文数:逆から読んでも同じ数になる数 # 例えば…96なら # 【1回目】96+69=165 # 【2回目】165+561=726 # 【3回目】726+627=1353 # 【4回目】1353+3531=4884 # となります。 'ある数字とその数字を逆さに並べた数字を足して 回文数になるまでこの操作を繰り返すとき 1番回文数になりにくい2桁の数字を答えなさい。'(_2桁の数字,_回文数になるまでの最大回数,_回文数) :- 'ある数字とその数字を逆さに並べた数字を足して 回文数になるまでこの操作を繰り返すとき'(_ある数字と回文数になるまでの回数と回文数のならび), '1番回文数になりにくい'(_ある数字と回文数になるまでの回数と回文数のならび,_2桁の数字,_回文数になるまでの最大回数,_回文数). 'ある数字とその数字を逆さに並べた数字を足して 回文数になるまでこの操作を繰り返すとき'(_ある数字と回文数になるまでの回数と回文数のならび) :- findall([_ある数字,_回文数になるまでの回数,_回文数],( 2桁の数字(_ある数字), 'ある数字とその数字を逆さに並べた数字を足して回文数になるまでこの操作を繰り返す'(_ある数字,[],_回文数になるまでの回数,_回文数)), _ある数字と回文数になるまでの回数と回文数のならび). ある数字とその数字を逆さに並べた数字を足して回文数になるまでこの操作を繰り返す(_回文数,Ln,_回文数になるまでの回数,_回文数) :- 回文数(_回文数), length(Ln,_回文数になるまでの回数),!. ある数字とその数字を逆さに並べた数字を足して回文数になるまでこの操作を繰り返す(_数字_1,L,_回文数になるまでの回数,_回文数) :- ある数字とその数字を逆さに並べた数字を足して(_数字_1,_数字_3), ある数字とその数字を逆さに並べた数字を足して回文数になるまでこの操作を繰り返す(_数字_3,[_|L],_回文数になるまでの回数,_回文数). 回文数(_数字) :- number_chars(_数字,L), reverse(L,L). ある数字とその数字を逆さに並べた数字を足して(_数字_1,_数字_3) :- number_chars(_数字_1,L2), reverse(L1,L2), number_chars(_数字_2,L2), 数字_3 is _数字_1 + _数字_2. '1番回文数になりにくい'(_ある数字と回文数になるまでの回数のならび,_ある数,_回文数になるまでの最大回数,_回文数) :- findmax(_回文数になるまでの回数,( member([_,_回文数になるまでの回数,_],_ある数字と回文数になるまでの回数のならび)), _回文数になるまでの最大回数), member([_ある数字,_回文数になるまでの最大回数,_回文数],_ある数字と回文数になるまでの回数のならび). '2桁の数字'(_2桁の数字) :- between(11,99,_2桁の数字). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/861 # # # お題:たとえば整数20010307なら21370000のように0を右側に寄せ集めた整数を返す # 'たとえば整数20010307なら21370000のように0を右側に寄せ集めた整数を返す'(_整数,_0を右側に寄せ集めた整数) :- number_chars(_整数,_整数文字ならび), '0を右側に寄せ集めた'(_整数文字ならび,_0以外の文字ならび,_0の文字ならび), 整数を返す(_0以外の文字ならび,_0の文字ならび,_0を右側に寄せ集めた整数). '0を右側に寄せ集めた'(_整数文字ならび,_0以外の文字ならび,_0の文字ならび) :- findall('0',member('0',_整数文字ならび),_0の文字ならび), findall(_整数文字,( member(_整数文字,_整数文字ならび), \+(_整数文字='0')), _0以外の文字ならび). 整数を返す(_0以外のならび,_0のならび,_0を右側に寄せ集めた整数) :- append(_0以外のならび,_0のならび,_0を右側に寄せ集めたならび), number_chars(_0を右側に寄せ集めた整数,_0を右側に寄せ集めたならび). % 以下のサイトは # お題: # 例:数列[3,1,-7,1,5]について、 # ->[4,-3,-2,3] (累計) # ->12 (絶対値の合計) # のように計算する。 # 最初の数列の並び順を変えると、最後の合計計も変わる。 # 任意数列について、上記合計が最小になるように並び替える関数を作成 '例:数列[3,1,-7,1,5]について、 ->[4,-3,-2,3] (累計) ->12 (絶対値の合計) のように計算する。 任意数列について、上記合計が最小になるように並び替える'(_数列,_最小となる数列) :- 絶対値の合計が最小になるように並び替える(_数列,_最小となる数列). 絶対値の合計が最小になるように並び替える(_数列,_絶対値の合計が最小となる順列) :- length(_数列,_要素数), findall([_絶対値の合計,_順列],( 順列(_数列,_要素数,_順列), 絶対値の合計(_順列,_絶対値の合計)), _絶対値_数列ならび), 絶対値の合計が最小となる数列を得る(_絶対値_数列ならび,_絶対値の合計が最小となる数列). 絶対値の合計が最小となる数列を得る(_絶対値_数列ならび,_絶対値の合計が最小となる数列) :- findmin(_絶対値,( member([_絶対値,_],_絶対値_数列ならび)), _最小の絶対値), member([_最小の絶対値,_絶対値の合計が最小となる数列],_絶対値_数列ならび). 絶対値の合計([_値],_絶対値の合計) :- _絶対値の合計 is abs(_値),!. 絶対値の合計(_値ならび,_絶対値の合計) :- 累計の途中経過を得る(_値ならび,_累計の途中経過ならび), 要素の絶対値の合計(_累計の途中経過ならび,_絶対値の合計). 累計の途中経過を得る([_],[]). 累計の途中経過を得る([_数_1,_数_2|R1],[_累計の途中経過|R2]) :- _累計の途中経過 is _数_1 + _数_2, 累計の途中経過を得る([_数_3|R1],R2). 要素の絶対値の合計(_累計の途中経過ならび,_絶対値の合計) :- findsum(_絶対値,( member(_値,_累計の途中経過ならび), _絶対値 is abs(_値)), _絶対値の合計). 順列(_,0,[]). 順列(L1,N,[A|R]) :- select(A,L1,R1), N_1 is N - 1, 順列(R1,N_1,R). findmin(V,P,Min) :- findall(V,P,L), min(L,Min). % 以下のサイトは # お題: # 例:数列[3,1,-7,-1,5]について、 # ->[4,-3,-2,3] (累計) # ->12 (絶対値の合計) # のように計算する。 # 最初の数列の並び順を変えると、最後の合計計も変わる。 # 任意数列について、上記合計が最小になるように並び替える関数を作成 '例:数列[3,1,-7,-1,5]について、 ->[4,-3,-2,3] (累計) ->12 (絶対値の合計) のように計算する。 任意数列について、上記合計が最小になるように並び替える'(_数列,_最小となる数列) :- 絶対値の合計が最小になるように並び替える(_数列,_最小となる数列). 絶対値の合計が最小になるように並び替える(_数列,_絶対値が最小となる数列) :- length(_数列,_要素数), findall([_絶対値の合計,_順列],( 順列(_数列,_要素数,_順列), 絶対値の合計(_順列,_絶対値の合計)), _絶対値_数列ならび), 絶対値の合計が最小となる数列を得る(_絶対値_数列ならび,_絶対値の合計が最小となる数列). 絶対値の合計(_数列,_絶対値の合計) :- 数列から累計を得る(_数列,_累計数列), 絶対値の合計を得る(_累計数列,_絶対値の合計). 数列から累計を得る([_数],_数) :- !. 数列から累計を得る([_数_1,_数_2|R1],[_数_3|R2]) :- _数_3 is _数_1 + _数_2, 数列から累計を得る([_数_3|R1],R2). 絶対値の合計を得る([],0). 絶対値の合計を得る([N|R1],_合計) :- 絶対値の合計を得る(R1,_合計_2), _合計 is abs(N) + _合計_2. 絶対値の合計が最小となる数列を得る(_絶対値_数列ならび,_絶対値の合計が最小となる数列) :- findmin(_絶対値,( member([_絶対値,_],_絶対値_数列ならび)), _最小の絶対値), member([_最小の絶対値,_絶対値の合計が最小となる数列],_絶対値_数列ならび). 順列(_,0,[]). 順列(L1,N,[A|R]) :- select(A,L1,R1), N_1 is N - 1, 順列(R1,N_1,R). findmin(V,P,Min) :- findall(V,P,L), min(L,Min). % 以下のサイトは # お題: # 入力 # AND # # 出力 # DDDDD # DNNND # DNAND # DNNND # DDDDD # 囲み(_入力) :- atom_chars(_入力,[_中心の文字|_囲み文字ならび]), 囲み(_囲み文字ならび,[[_中心の文字]],_囲み), 出力(_囲み). 囲み([],_囲み,_囲み) :- !. 囲み([_文字|R],_囲み_1,_囲み) :- 文字で囲む(_文字,_囲み_1,_囲み_2), 囲み(R,_囲み_2,_囲み). 文字で囲む(_文字,_囲み_1,_囲み_2) :- 囲みの先頭と末尾に_文字の行を付加する(_文字,_囲み_1,_先頭と末尾に_文字の行を付加された囲み_1), 囲みの各行の先頭と末尾に_文字を付加する(_文字,_先頭と末尾に_文字の行を付加された囲み_1,_囲み_2). 囲みの先頭と末尾に_文字の行を付加する(_文字,_囲み,_先頭と末尾に_文字の行を付加された囲み_1) :- 転置(_囲み_1,_転置された囲み_1), 行の先頭と末尾に文字を付加する(_文字,_転置された囲み_1,_行の先頭と末尾に_文字を付加された転置された囲み_1), 転置(_行の先頭と末尾に文字を付加された転置された囲み_1,_先頭と末尾に_文字の行を付加された囲み_1). 囲みの各行の先頭と末尾に_文字を付加する(_文字,_囲み,_行の先頭と末尾に_文字を付加された囲み) :- findall(_先頭と末尾に_文字を付加された行,( member(_行,_囲み), append([_文字|_行],[_文字],_先頭と末尾に_文字を付加された行)), _行の先頭と末尾に_文字を付加された囲み). 出力(_囲み) :- forall(member(_行,_囲み),(atomic_list_concat(_行,_行文字列),writef('%t\n',[_行文字列])). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/194 # # [1] 授業単元:C言語 # # [2] 問題文(含コード&リンク): # 1〜100の整数のうち「6の倍数」の個数を表示するプログラムを作成しなさい、ただし、for文とif文を用いて作成すること # 1次元配列を用いて5人分の数学の得点を100点満点で入力し、「数学の得点の最小値と最大値」を画面表示、およびファイルに書き出すプログラムを作成しなさい。ただし、書き出し用ファイル名は「sugaku.txt」にしなさい。 # # '1〜100の整数のうち「6の倍数」の個数を表示するプログラムを作成しなさい、ただし、for文とif文を用いて作成すること' :- '1〜100の整数のうち「6の倍数」の個数を'(_6の倍数の個数), 表示する(_6の倍数の個数). '1〜100の整数のうち「6の倍数」の個数を'(_6の倍数の個数) :- 個数(('1〜100の整数のうち'(N),'「6の倍数」'(N)),_6の倍数の個数). '1〜100の整数のうち'(N) :- between(1,100,N). '「6の倍数」'(N) :- 0 is N mod 6. 表示する(_6の倍数の個数) :- writef('6の倍数の個数は %t です\n',[_6の倍数の個数]). 個数(_副目標,_真になる度数) :- findsum(1,_副目標,_真になる度数). findsum(_選択項,_副目標,_合計値) :- findall(_選択項,_副目標,_値ならび), sum_list(_値ならび,_合計値),!. % 以下のサイトは # お題:値が整数のn個の数列がある。隣同士の項の和の数列をつくる。 # この操作を繰り返して項が1個になったらその値を返す。 # 例 # 31,41,59,2 -> 333 # 31,41,59,2 # →(31+41),(41+59),(59+2) # →(31+41+41+59),(41+59+59+2) # →(31+41+41+59+41+59+59+2) # 三角数と初めの数列の長さに関係してる。数学問題だな '値が整数のn個の数列がある。隣同士の項の和の数列をつくる。この操作を繰り返して項が1個になったらその値を返す。'([_1個になったらその値],_1個になったらその値) :- !. '値が整数のn個の数列がある。隣同士の項の和の数列をつくる。この操作を繰り返して項が1個になったらその値を返す。'(_値が整数の数列,_1個になったらその値) :- \+(_値が整数の数列 = []), findall(_隣同士の項の和,( append(_,[_項_1,_項_2|_],_値が整数の数列), _隣同士の項の和 is _項_1 + _項_2), _隣同士の項の和の数列), '値が整数のn個の数列がある。隣同士の項の和の数列をつくる。この操作を繰り返して項が1個になったらその値を返す。'(_隣同士の項の和の数列,_1個になったらその値). % 以下のサイトは # 【 課題 】 # 入力: 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,_順列ならび) :- findall(N,between(1,_n,N),_数ならび), findall(_数値,( 順列(_数ならび,_n,_順列), 一桁の数値ならびから整数(_順列,_数値)), _順列ならび). 順列(_,0,[]). 順列(L,N,[A|R]) :- select(A,L,L2), N_1 is N - 1, 順列(L2,N_1,R). 一桁の数値ならびから整数(_一桁の数値ならび,_数値) :- 一桁の数値ならびから整数(_一桁の数値ならび,M,_数値). 一桁の数値ならびから整数([N],1,N). 一桁の数値ならびから整数([N|R],M,_整数) :- 一桁の数値ならびから整数(R,M_1,_整数_1), M is M_1 + 1, _整数 is 10 ^ M_1 * N + _整数_1. % 以下のサイトは # 【 課題 】 # 入力: 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). % 以下のサイトは # 以下の2次元配列「Shopping」のデータを用い、 # 以下のように、各商品の単価、個数、小計を表示し、 # 最後に合計を表示させる。 # var shopping = [ [500, 9], [5000, 8], [50, 1], [10000, 2] ]; # # 単価:500 個数:9 小計:4500 # 単価:5000 個数:8 小計:40000 # 単価:50 個数:1 小計:50 # 単価:10000 個数:2 小計:20000 # 合計:64550 # # できる人は、下図のように小計の降順表示させよ # # 単価:5000 個数:8 小計:40000 # 単価:10000 個数:2 小計:20000 # 単価:500 個数:9 小計:4500 # 単価:50 個数:1 小計:50 # 合計:64550 # '「Shopping」のデータを用い、 # var shopping = [ [500, 9], [5000, 8], [50, 1], [10000, 2] ]; 以下のように、各商品の単価、個数、小計を表示し、最後に合計を表示させる。 # 単価:5000 個数:8 小計:40000 # 単価:10000 個数:2 小計:20000 # 単価:500 個数:9 小計:4500 # 単価:50 個数:1 小計:50 # 合計:64550' :- '「Shopping」のデータを用い、'(_Shopping), '各商品の単価、個数、小計を表示し、'(_Shopping,_小計_単価_数量_ならび), '最後に合計を表示させる。'(_小計_単価_数量_ならび). '「Shopping」のデータを用い、'(_Shopping) :- 'Shopping'(_Shopping). 'Shopping'([ [500, 9], [5000, 8], [50, 1], [10000, 2] ]). '各商品の単価、個数、小計を表示し、'(_Shopping,_小計_単価_数量_ならび) :- '各商品の単価、個数、小計を'(_Shopping,_小計_単価_数量_ならび), '表示し、'(_小計_単価_数量_ならび). '各商品の単価、個数、小計を'(_Shopping,_小計_単価_数量_ならび) :- findall([_小計,_単価,_数量],( member([_単価,_数量],_Shopping), _小計 is _単価 * _数量), _小計_単価_数量_ならび). '表示し、'(_小計_単価_数量_ならび) :- 降順整列(_小計_単価_数量_ならび,_降順の_小計_単価_数量_ならび), forall(member([_小計,_単価,_数量],_降順の_小計_単価_数量_ならび), writef('単価:%t 数量:%t 小計:%t\n',[_単価,_数量,_小計])). 降順整列(L1,L2) :- sort(L1,L3), reverse(L3,L2). '最後に合計を表示させる。'(_小計_単価_数量_ならび) :- findsum(_小計,member([_小計,_,_],_小計_単価_数量_ならび),_合計). writef('合計:%t\n',[_合計]). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum_list(_値ならび,_合計値),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/835 # # 【課題】X * Y = 115 になる 素数Xと素数Yをクラスを3つ使って求め結果を表示しなさい # 【 期限 】2013/11/06 # 【 Ver  】"1.7.0_11" # # いまいちわからず困っています。 # よろしくお願いします。 'X * Y = 115 になる 素数Xと素数Yをクラスを3つ使って求め結果を表示しなさい' :- forall('X * Y = 115 になる 素数Xと素数Yを求める'(_X,_Y), 表示しなさい(_X,_Y)). 'X * Y = 115 になる 素数Xと素数Yを求める'(_X,_Y) :- '115以下の素数ならびを得る'(_115以下の素数ならび), 組合せ(_115以下の素数ならび,2,[_X,_Y]), 115 is _X * _Y. '115以下の素数ならびを得る'(_115以下の素数ならび) :- findall(N,between(2,115,N),_2から115までの整数ならび), エラトステネスの篩(_2から115までの整数ならび,_115以下の素数ならび). 組合せ(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). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). 表示しなさい(_X,_Y) :- writef('%t\n',[_X,_Y]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/832 # # 【課題】X * Y = 125 になる 素数Xと素数Yをクラスを3つ使って求め結果を表示しなさい # 【 期限 】2013/11/06 # 【 Ver  】"1.7.0_11" # # いまいちわからず困っています。 # よろしくお願いします。 'X * Y = 125 になる 素数Xと素数Yをクラスを3つ使って求め結果を表示しなさい' :- 'X * Y = 125 になる 素数Xと素数Yを求める'(_X_Y_組合せならび),!, forall(member([_X,_Y],_X_Y_組合せならび), 表示しなさい(_X,_Y)). 'X * Y = 125 になる 素数Xと素数Yをクラスを3つ使って求め結果を表示しなさい' :- writef('解がありません!\n'), fail. 'X * Y = 125 になる 素数Xと素数Yを求める'(_X_Y_組合せならび) :- '125以下の素数ならびを得る'(_125以下の素数ならび), findall([_X,_Y],( 組合せ(_125以下の素数ならび,2,[_X,_Y]), 125 is X * Y), _X_Y_組合せならび), \+(_X_Y_組合せならび=[]). '125以下の素数ならびを得る'(_125以下の素数ならび) :- findall(N,between(2,125,N),_2から125までの整数ならび), エラトステネスの篩(_2から125までの整数ならび,_125以下の素数ならび). 組合せ(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). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). 表示しなさい(_X,_Y) :- writef('%t %t\n',[_X,_Y]). % 以下のサイトは # wshのjscriptで # abc123def456 # これのcと1の間とfと4の間だけに一致させる方法ないですかね? # "abc123def456".splitに投げたら["abc", "123def", "456"]が返ってくるのが理想です 'wshのjscriptで abc123def456 これのcと1の間とfと4の間だけに一致させる方法ないですかね? "abc123def456".splitに投げたら["abc", "123def", "456"]が返ってくるのが理想です'(_文字列,_区切られた文字列ならび) :- '文字列の_文字1と_文字2の間と_文字3と_文字4の間だけに一致させる方法ないですかね?'('abc123def456',c,'1',f,'4',_区切りられた文字列ならび). '文字列の_文字1と_文字2の間と_文字3と_文字4の間だけに一致させる方法ないですかね?'(_文字列,_文字1,_文字2,_文字3,_文字4,_区切られた文字列ならび) :- sub_atom(_文字列,_,_対象とする副文字列,_), findall(_区切り候補,( 対象とする副文字列_文字1と_文字2の間と_文字3と_文字4の間だけに一致させる(_対象とする副文字列,_区切り候補)), _区切り候補ならび), sPLIT(_文字列,_区切り候補ならび,_区切られた文字列ならび). 対象とする副文字列の_文字1と_文字2の間と_文字3と_文字4の間だけに一致させる(_対象とする副文字列,_文字1,_文字2,_文字3,_文字4,_区切り候補) :- 先頭文字と末尾文字の間の文字列(_対象とする副文字列,_文字1,_文字2,_区切り候補). 対象とする副文字列の_文字1と_文字2の間と_文字3と_文字4の間だけに一致させる(_対象とする副文字列,_文字1,_文字2,_文字3,_文字4,_区切り候補) :- 先頭文字と末尾文字の間の文字列(_対象とする副文字列,_文字3,_文字4,_区切り候補). 先頭文字と末尾文字の間の文字列(_対象とする副文字列,_先頭文字,_末尾文字,_先頭文字と末尾文字の間の文字列) :- sub_atom(_対象とする副文字列,0,1,_,_先頭文字), sub_atom(_対象とする副文字列,_,1,0,_末尾文字), sub_atom(_対象とする副文字列,1,_,1,_先頭文字と末尾文字の間の文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/142 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ # input関数とshow関数を作ること # コマンド引数にテキストファイルの名前を入れること # 'テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ。コマンド引数にテキストファイルの名前を入れること' :- コマンド引数からテキストファイルの名前を得る(_テキストファイル), テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ(_テキストファイル). コマンド引数からテキストファイルの名前を得る(_テキストファイル) :- current_prolog_flag(argv,ParameterList), append(_,['--'|[_テキストファイル]],ParameterList). テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ(_テキストファイル) :- テキストファイルを作りそのなかに整数5個数字を入れる(_テキストファイル,Outstream), そのテキストファイルの中身を出力せよ(_テキストファイル). テキストファイルを作りそのなかに整数5個数字を入れる(_テキストファイル) :- open(_テキストファイル,write,Outstream). そのなかに整数5個数字を入れる(Outstream), close(Outstream). そのなかに整数5個数字を入れる(Outstream) :- between(1,5,_何番目), 整数を得る(_整数), writef(Outstream,'%t\n',[_整数]), _何番目 = 5. そのテキストファイルの中身を出力せよ(_テキストファイル) :- open(_テキストファイル,read,Instream), copy_stream_data(Instream,user_output), close(Instream). % % ここではズルをして組込述語 copy_stream_data/2 を使って見た。 % % 本来ならget_lines/2とput_lines/2の組合せでコピーを表現するところ。 % % そのテキストファイルの中身を出力せよ(_テキストファイル) :- % get_lines(_テキストファイル,_行ならび), % put_lines(user_output,_行ならび). % % get_lines(_ファイル名,_行ならび) :- % open(_ファイル名,read,Instream), % findall(_行,( % repeat, % ( at_end_of_stream(Instream),!,fail; % get_line(Instream,_行))), % _行ならび), % close(Instream). % % put_lines(_ファイル名,_行ならび) :- % open(_ファイル名,write,Outstream), % forall(nth1(_,_行ならび,_行),writef(Outstream,'%t\n',[_行])), % close(Outstream). % % 以下のサイトは % % カレンダーの形式(何曜日から始まるか)と % 月日数と1日の曜日が分かっている時 % カレンダーをならびに得る。 % 第一週と最終週を変数で補正した曜日起点月カレンダー補正(_起点曜日形式,_月日数,_1日の曜日,_カレンダー) :- 曜日起点月カレンダー(_起点曜日形式,_月日数,_1日の曜日,_カレンダー_1), 第一週と最終週を変数で補正した(_カレンダー_1,_カレンダー). 曜日起点月カレンダー(_起点曜日形式,_月日数,_1日の曜日,_カレンダー) :- findall(N,between(1,_月日数,N),_日ならび), 起点曜日番号を得る(_起点曜日形式,_月日数,_1日の曜日,_起点曜日番号), 曜日番号からカレンダーを作成する(_起点曜日番号,_日ならび,_カレンダー). 起点曜日番号を得る(_起点曜日形式,_月日数,_1日の曜日,_起点曜日番号) :- 曜日番号(_曜日番号_1,_起点曜日形式), 曜日番号(_曜日番号,_1日の曜日), _起点曜日番号 is (7 - (_曜日番号 + _曜日番号_1)) mod 7. 曜日番号からカレンダーを作成する(0,_日ならび,_カレンダー) :- 'N個組'(7,_日ならび,_カレンダー),!. 曜日番号からカレンダーを作成する(_曜日番号,_日ならび,[L0|LL]) :- length(L0,_曜日番号), append(L0,L1,_日ならび), 'N個組'(7,L1,LL). 曜日番号(0,日曜) :- !. 曜日番号(1,月曜) :- !. 曜日番号(2,火曜) :- !. 曜日番号(3,水曜) :- !. 曜日番号(4,木曜) :- !. 曜日番号(5,金曜) :- !. 曜日番号(6,土曜) :- !. 'N個組'(_,[],[]) :- !. 'N個組'(N,L,[U|R]) :- 先頭からN個(N,L,U,R1), 'N個組'(N,R1,R). 先頭からN個(_,[],[],[]) :- !. 先頭からN個(0,L,[],L) :- !. 先頭からN個(N,[A|R1],[A|R2],R) :- M is N - 1, 先頭からN個(M,R1,R2,R). 第一週と最終週を変数で補正した([L|LL1],[[_1,_2,_3,_4,_5,_6,_7]|LL2]) :- 第一週を変数で補正(L,[_1,_2,_3,_4,_5,_6,_7]), 最終週を変数で補正(LL1,LL2). 第一週を変数で補正(L,[_1,_2,_3,_4,_5,_6,_7]) :- append(_,L,[_1,_2,_3,_4,_5,_6,_7]). 最終週を変数で補正(LL1,LL2) :- append(LL1_1,[L_2],LL1), append(L_2,_,[_11,_12,_13,_14,_15,_16,_17]), append(LL1_1,[[_11,_12,_13,_14,_15,_16,_17]],LL2),!. 変数だけ値を詰める([],_). 変数だけ値を詰める([V|R],V) :- 変数だけ値を詰める(R,V),!. 変数だけ値を詰める([_|R],V) :- 変数だけ値を詰める(R,V). 変数だけ要素位置番号を詰める([],_). 変数だけ要素位置番号を詰める([N|R],N) :- N_2 is N + 1, 変数だけ要素位置番号を詰める(R,N_2),!. 変数だけ要素位置番号を詰める([_|R],N) :- N_2 is N + 1, 変数だけ要素位置番号を詰める(R,N_2). % 以下のサイトは % % 再帰を使わず、かつ、バックトラックを駆使したハノイの塔 % :- 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. % 以下のサイトは # WinXP HomeでBorland C++ Compiler 5.5 # ・1からnまでの整数1個ずつで構成される全部でn個の要素から、 # r個の要素を重複なく取り出した場合の組み合わせを全て昇順で並べたものの中で、 # 具体的な組み合わせと具体的な序列が何番目かを相互に返すプログラム。 # 例 43C6なら、序数5054214は組み合わせ11,14,17,18,34,36 # 例 43C6なら、組み合わせ13,28,29,37,38,41は5498643 # コマンドはncr.exe [n],[r] [co][ra] x.txtの様な感じで '1からnまでの整数1個ずつで構成される全部でn個の要素から、 r個の要素を重複なく取り出した場合の組み合わせを全て昇順で並べたものの中で、 具体的な組み合わせと具体的な序列が何番目かを相互に返す'(_n,_r,_序数,_具体的な組合せ) :- findall(M,between(1,_n,M),L), findall(_組合わせ,組合せ(L,_r,_組合わせ),_組合わせならび), nth1(_序数,_組合わせならび,_具体的な組合わせ). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 組合せ(L,1,[A]) :- member(A,L). 組合せ([A|R1],N,[A|R3]) :- N > 1, M is N - 1, 組合せ(R1,M,R3). 組合せ([_|R1],N,L) :- N > 1, 組合せ(R1,N,L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/777 # # 【課題】X * Y = 123 になる素数 XとYを求め、結果をすべて表示しなさい。 # 【 期限 】2013/10/15 # 【 Ver  】"1.7.0_11" # がんばってますが期限までに理解できる気がしないので # 基礎的なことだとは思いますが、よろしく御願いします 'X * Y = 123 になる素数 XとYを求め、結果をすべて表示しなさい。' :- forall('X * Y = 123 になる素数 XとYを求め、'(X,Y), '結果をすべて表示しなさい。'(X,Y)). 'X * Y = 123 になる素数 XとYを求め、'(X,Y) :- findall(N,between(2,123,N),L), エラトステネスの篩(L,_素数ならび), 重複組合せ(_素数ならび,2,[X,Y]), 123 is X * Y. '結果をすべて表示しなさい。'(X,Y) :- writef('X=%t,Y=%t\n',[X,Y]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 重複組合せ(X,1,[A]) :- member(A,X). 重複組合せ([A|Y],N,[A|X]) :- N > 1, M is N - 1, 重複組合せ([A|Y],M,X) . 重複組合せ([_|Y],N,A) :- N > 1, 重複組合せ(Y,N,A) . エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). % 以下のサイトは # お題:数字を3桁ごとにカンマ区切りでフォーマットした文字列をふたつ取り # 合計を同じフォーマット文字列で返す。 # 例 # "18,446,744,073,709,551,616" # "1,099,511,627,776" #   ↓ # "18,446,745,173,221,179,392" # 'お題:数字を3桁ごとにカンマ区切りでフォーマットした文字列をふたつ取り合計を同じフォーマット文字列で返す。'(_文字列_1,_文字列_2,_文字列_3) :- カンマ区切り文字列を数値に戻す(_文字列_1,_数値_1), カンマ区切り文字列を数値に戻す(_文字列_2,_数値_2), _数値_3 is _数値_1 + _数値_2, 数値を3桁ごとにカンマ区切りでフォーマットした文字列とする(_数値_3,_文字列_3). カンマ区切り文字列を数値に戻す(_文字列,_数値) :- findall(_文字,( sub_atom(_文字列,_,1,_,_文字), \+(_文字=',')), _数字文字ならび), number_chars(_数値,_数字文字ならび). 数値を3桁ごとにカンマ区切りでフォーマットした文字列とする(_数値,_カンマが挿入された文字列) :- number_chars(_数値,_数字ならび), length(_数字ならび,_桁), atomic_list_concat(_数字ならび,_カンマが挿入されていない数字文字列), _剰余 is _桁 mod 3, 数字文字列にカンマを挿入(_剰余,_カンマが挿入されていない数字文字列,_カンマが挿入された文字列). 数字文字列にカンマを挿入(0,_カンマが挿入されていない数字文字列,_カンマが挿入された数字文字列) :- findall(_3字文字列,( sub_atom(_カンマが挿入されていない数字文字列,St,3,R,_3字文字列), 0 is St mod 3), L), atomic_list_concat(L,',',_カンマが挿入された数字文字列),!. 数字文字列にカンマを挿入(N,_数字文字列,_カンマが挿入された数字文字列) :- sub_atom(_数字文字列,0,N,R,_先頭文字列), sub_atom(_数字文字列,_,R,0,_残り文字列), 数字文字列にカンマを挿入(0,_残り文字列,_カンマが挿入された数字文字列_1), atomic_list_concat([_先頭文字列,',',_カンマが挿入された数字文字列_1],_カンマが挿入された数字文字列). % 以下のサイトは 行列から行を取り出す(_行列,_行) :- 行列から行を取り出す(_行列,_,_行). 行列から行を取り出す(_行列,_行目,_行) :- nth1(_行目,_行列,_行). 行列から列を取り出す(_行列,_列) :- 行列から列を取り出す(_行列,_nth1,_列). 行列から列を取り出す(_行列,_列目,_列) :- 転置(_行列,_転置された行列), nth1(_列目,_転置された行列,_列). 行列の位置要素を取り出す(_行列,_行目,_列目,_要素) :- nth1(_行目,_行列,_行), nth1(_列目,_行,_要素). 行列の要素を置換する(_行列,_置換対象値,_置換値,_置換された行列) :- findall(_置換された行,( member(_行,_行列), 行を全置換する(_行,_置換対象値,_置換値,_置換された行)), _置換された行列). 行を全置換する([],_,_,[]). 行を全置換する([A|R1],A,B,[B|R4]) :- 行を全置換する(R1,A,B,R4),!. 行を全置換する([C|R1],A,B,[C|R4]) :- 行を全置換する(R1,A,B,R4). 行列の位置要素を置換する(_行列,_行目,_列目,_値,_置換された行列) :- 行を取り出す(_行列,_行目,_それまでの行ならび,_行,_それより後の行ならび), 行の列要素を置換する(_行,_列目,_値,_置換された行),!, append(_それまでの行ならび,[_置換された行|_それより後の行ならび],_置換された行列). 行を取り出す(_行列,_行目,_それまでの行ならび,_行,_それより後の行ならび) :- _行目_1 is _行目 - 1, length(_それまでの行ならび,_行目_1), append(_それまでの行ならび,[_行|_それより後の行ならび],_行列). 行の列要素を置換する(_行,_列目,_値,_置換された行) :- _列目_1 is _列目 - 1, length(L0,_列目_1), append(L0,[_|R],_行), append(L0,[_値|R],_置換された行). 行列の行を入れ替える(_行列,_行目_1,_行目_2,_入れ替えた行列) :- _行目_1 > _行目_2, 行列の行を入れ替える(_行列,_行目_2,_行目_1,_入れ替えた行列). 行列の行を入れ替える(_行列,_行目_1,_行目_2,_入れ替えた行列) :- _行目_1 < _行目_2, 行列の行を取り出す(_行列,_行目_2,_前ならび_2,_行_2,_後ろならび_2), 行列の行を取り出す(_前ならび_2,_行目_1,_前ならび_1,_行_1,_後ろならび_1), append(_前ならび_1,[_行_2|_後ろならび_1],_前ならび_2_2), append(_前ならび_2_2,[_行_1|_後ろならび_2],_入れ替えた行列). 行列の行を取り出す(_行列,_行目_2,_前ならび_2,_行_2,_後ろならび_2) :- _行目_2_1 is _行目_2 - 1, length(_前ならび_2,_行目_2_1), append(_前ならび_2,[_行_2|_後ろならび_2],_行列). 行列の行を取り出す(_前ならび_2,_行目_1,_前ならび_1,_行_1,_後ろならび_1) :- _行目_1_1 is _行目_1 - 1, length(_前ならび_1,_行目_1_1), append(_前ならび_1,[_行_1|_後ろならび_1],_前ならび_2). 行列の列を入れ替える(_行列,_列目_1,_列目_2,_入れ替えた行列) :- 転置(_行列,_転置された行列), 行列の行を入れ替える(_転置された行列,_列目_1,_列目_2,_入れ替えた転置された行列), 転置(_入れ替えた転置された行列,_入れ替えた行列). 行全体をn倍する(_行列,_行目,_n倍,_行がn倍された行列) :- _行目_1 is _行目 - 1, length(L0,_行目_1), append(L0,[_行|R],_行列), 行要素全てをn倍する(_行,_n倍,_全ての要素がn倍された行), append(L0,[_全ての要素がn倍された行|R],_行がn倍された行列). 行要素全てをn倍する([],_,[]) :- !. 行要素全てをn倍する([A|R1],_n倍,[B|R2]) :- B is A * _n倍, 行要素全てをn倍する(R1,_n倍,R2). 列全体をn倍する(_行列,_列目,_n倍,_列がn倍された行列) :- 転置(_行列,_転置された行列), 行全体をn倍する(_転置された行列,_列目,_n倍,_行がn倍された転置された行列), 転置(_行がn倍された転置された行列,_列がn倍された行列). 二つの行のある列要素がそれぞれの最小公倍数になるように二つの行を倍する(_行列,_行目_1,_行目_2,_列目,_変形した行列) :- 行列の位置要素を取り出す(_行列,_行目_1,_列目,_要素_1), 行列の位置要素を取り出す(_行列,_行目_2,_列目,_要素_2), 最小公倍数を取る(_要素_1,_要素_2,_最小公倍数), _行目_1の倍数 is _最小公倍数 // _要素_1, _行目_2の倍数 is _最小公倍数 // _要素_2, 行全体をn倍する(_行列,_行目_1,_行目_1の倍数,_行列_2), 行全体をn倍する(_行列,_行目_2,_行目_2の倍数,_変形した行列). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). % 以下のサイトは :- dynamic(階乗保存計算/2). 'ウィルソンの定理を使って素数を判定する関数is_primeを実装し、100000以下の素数以外をリストに得る'(_10000以下の素数リスト) :- findall(_p,( between(1,10000,_p), is_prime(_p)), _10000以下の素数リスト). is_prime(_p) :- 'ウィルソンの定理とは pが素数 <=> (p-1)!+1 (mod p) == 0'(_p). 'ウィルソンの定理とは pが素数 <=> (p-1)!+1 (mod p) == 0'(_p) :- _p > 0, Y is _p - 1, 階乗保存計算(Y,Z), 0 is (Z + 1) mod _p,!. 階乗保存計算(0,1) :- !. 階乗保存計算(1,1) :- !. 階乗保存計算(N,X) :- N2 is N - 1, 階乗保存計算(N2,Y), X is N * Y, asserta((階乗保存計算(N,X) :- !)). % 以下のサイトは # Prolog問題: http://nojiriko.asia/prolog/olympic.html # をCopy&Pasteしてあなたの環境に 夏季オリンピック/2 と 冬季オリンピック/2 を # 定義した上で、述語 オリンピック/3 を夏季、冬季オリンピック混在して、 # 開催年の古い順に節定義せよ。 '夏季オリンピック/2 と 冬季オリンピック/2 を定義した上で、述語 オリンピック/3 を夏季、冬季オリンピック混在して、開催年の古い順に節定義せよ。' :- '述語 オリンピック/3 を夏季、冬季オリンピック混在して、'(LL1), 開催年の古い順に節定義せよ(LL1). '述語 オリンピック/3 を夏季、冬季オリンピック混在して、'(LL1) :- findall([_年,_冬季または夏季,_都市],( 夏季オリンピック(_年,_都市), _冬季または夏季=夏季; 冬季オリンピック(_年,_都市), _冬季または夏季=冬季), LL1). 開催年の古い順に節定義せよ(LL1) :- sort(LL1,LL2), forall(member([_年,_冬季または夏季,_都市],LL2),assertz(オリンピック(_冬季または夏季,_年,_都市))). 夏季オリンピック(1896,アテネ). 夏季オリンピック(1900,パリ). 夏季オリンピック(1904,セントルイス). 夏季オリンピック(1906,アテネ). 夏季オリンピック(1908,ロンドン). 夏季オリンピック(1912,ストックホルム). 夏季オリンピック(1920,アントワープ). 夏季オリンピック(1924,パリ). 夏季オリンピック(1928,アムステルダム). 夏季オリンピック(1932,ロサンジェルス). 夏季オリンピック(1936,ベルリン). 夏季オリンピック(1948,ロンドン). 夏季オリンピック(1952,ヘルシンキ). 夏季オリンピック(1956,メルボルン). 夏季オリンピック(1960,ローマ). 夏季オリンピック(1964,東京). 夏季オリンピック(1968,メキシコシチー). 夏季オリンピック(1972,ミュンヘン). 夏季オリンピック(1976,モントリオール). 夏季オリンピック(1980,モスクワ). 夏季オリンピック(1984,ロサンジェルス). 夏季オリンピック(1988,ソウル). 夏季オリンピック(1992,バルセロナ). 夏季オリンピック(1996,アトランタ). 夏季オリンピック(2000,シドニー). 夏季オリンピック(2004,アテネ). 夏季オリンピック(2008,北京). 夏季オリンピック(2012,ロンドン). 冬季オリンピック(1924,シャモニー). 冬季オリンピック(1928,サンモリッツ). 冬季オリンピック(1932,レークプラシッド). 冬季オリンピック(1936,ガルミッシュパルテンキルヒェン). 冬季オリンピック(1948,サンモリッツ). 冬季オリンピック(1952,オスロ). 冬季オリンピック(1956,コルティナダンペッツォ). 冬季オリンピック(1960,スコーバレー). 冬季オリンピック(1964,インスブルック). 冬季オリンピック(1968,グルノーブル). 冬季オリンピック(1972,札幌). 冬季オリンピック(1976,インスブルック). 冬季オリンピック(1980,レークプラシッド). 冬季オリンピック(1984,サラエボ). 冬季オリンピック(1988,カルガリー). 冬季オリンピック(1992,アルベールビル). 冬季オリンピック(1994,リレハンメル). 冬季オリンピック(1998,長野). 冬季オリンピック(2002,ソルトレイクシティ). 冬季オリンピック(2006,トリノ). 冬季オリンピック(2010,バンクーバー). % 以下のサイトは # Prolog問題: http://nojiriko.asia/prolog/olympic.html # をCopy&Pasteしてあなたの環境に 夏季オリンピック/2 と 冬季オリンピック/2 を # 定義した上で、述語 オリンピック/2 を夏季、冬季オリンピック混在して、 # 開催年の古い順に節定義せよ。 '夏季オリンピック/2 と 冬季オリンピック/2 を 定義した上で、述語 オリンピック/2 を夏季、冬季オリンピック混在して、 開催年の古い順に節定義せよ。' :- '述語 オリンピック/2 を夏季、冬季オリンピック混在して、'(LL1), 開催年の古い順に節定義せよ(LL1). '述語 オリンピック/2 を夏季、冬季オリンピック混在して、'(LL1) :- findall([_年,_都市],( 夏季オリンピック(_年,_都市); 冬季オリンピック(_年,_都市)), LL1). 開催年の古い順に節定義せよ(LL1) :- sort(LL1,LL2), forall((member([_年,_都市],LL2),assertz(オリンピック(_年,_都市))). 夏季オリンピック(1896,アテネ). 夏季オリンピック(1900,パリ). 夏季オリンピック(1904,セントルイス). 夏季オリンピック(1906,アテネ). 夏季オリンピック(1908,ロンドン). 夏季オリンピック(1912,ストックホルム). 夏季オリンピック(1920,アントワープ). 夏季オリンピック(1924,パリ). 夏季オリンピック(1928,アムステルダム). 夏季オリンピック(1932,ロサンジェルス). 夏季オリンピック(1936,ベルリン). 夏季オリンピック(1948,ロンドン). 夏季オリンピック(1952,ヘルシンキ). 夏季オリンピック(1956,メルボルン). 夏季オリンピック(1960,ローマ). 夏季オリンピック(1964,東京). 夏季オリンピック(1968,メキシコシチー). 夏季オリンピック(1972,ミュンヘン). 夏季オリンピック(1976,モントリオール). 夏季オリンピック(1980,モスクワ). 夏季オリンピック(1984,ロサンジェルス). 夏季オリンピック(1988,ソウル). 夏季オリンピック(1992,バルセロナ). 夏季オリンピック(1996,アトランタ). 夏季オリンピック(2000,シドニー). 夏季オリンピック(2004,アテネ). 夏季オリンピック(2008,北京). 夏季オリンピック(2012,ロンドン). 冬季オリンピック(1924,シャモニー). 冬季オリンピック(1928,サンモリッツ). 冬季オリンピック(1932,レークプラシッド). 冬季オリンピック(1936,ガルミッシュパルテンキルヒェン). 冬季オリンピック(1948,サンモリッツ). 冬季オリンピック(1952,オスロ). 冬季オリンピック(1956,コルティナダンペッツォ). 冬季オリンピック(1960,スコーバレー). 冬季オリンピック(1964,インスブルック). 冬季オリンピック(1968,グルノーブル). 冬季オリンピック(1972,札幌). 冬季オリンピック(1976,インスブルック). 冬季オリンピック(1980,レークプラシッド). 冬季オリンピック(1984,サラエボ). 冬季オリンピック(1988,カルガリー). 冬季オリンピック(1992,アルベールビル). 冬季オリンピック(1994,リレハンメル). 冬季オリンピック(1998,長野). 冬季オリンピック(2002,ソルトレイクシティ). 冬季オリンピック(2006,トリノ). 冬季オリンピック(2010,バンクーバー). % 以下のサイトは # # 問題 15-2 2つの文字列がある場合、最長共通部分文字列を見つける方法を述べよ。 # '2つの文字列がある場合、最長共通部分文字列を見つける方法を述べよ。'(_文字列_1,_文字列_2,_最長共通部分) :- findall([_長さ,_共通部分],( sub_atom(_文字列_1,_,_長さ,_,_共通部分), sub_atom(_文字列_2,_,_長さ,_,_共通部分)), LL1), 最長の長さを得る(LL1,_最長の長さ), member([_最長の長さ,_最長共通部分],LL1). 最長の長さを得る(LL1,_最長の長さ) :- findall(_長さ,member([_長さ,_],LL1),L), max_list(L,_最長の長さ). % 以下のサイトは # # 問題 14-13 ある文字列から特定の文字列に含まれる文字を削除するアルゴリズムを示せ。 # # 入門「データ構造とアルゴリズム」Narasimha Karumanchi著 黒川利明/木下哲也訳 オライリージャパン刊 p385 より # 'ある文字列から特定の文字列に含まれる文字を削除する'(_ある文字列,_特定の文字列,_特定の文字列に含まれる文字を削除した文字列) :- 文字選択された文字列(_ある文字列,_文字,\+(sub_atom(_特定の文字列,_,1,_,_文字)),_特定の文字列に含まれる文字を削除した文字列). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字選択された文字列(_文字列,_構成する文字,_文字選択条件,_文字選択された文字列) :- findall(_構成する文字,( sub_atom(_文字列,_,1,_,_構成する文字), _文字選択条件), _文字選択された文字ならび), atomic_list_concat(_文字選択された文字ならび,_文字選択された文字列). % 以下のサイトは # # 問題 14-13 ある文字列から特定の文字列に含まれる文字を削除するアルゴリズムを示せ。 # # 入門「データ構造とアルゴリズム」Narasimha Karumanchi著 黒川利明/木下哲也訳 オライリージャパン刊 p385 より # 'ある文字列から特定の文字列に含まれる文字を削除する'(_ある文字列,_特定の文字列,_特定の文字列に含まれる文字を削除した文字列) :- findall(_文字,( ある文字列から(_ある文字列,_文字), \+(特定の文字列に含まれる文字(_特定の文字列,_文字))), _特定の文字列に含まれる文字を削除した文字ならび), atomic_list_concat(_特定の文字列に含まれる文字を削除した文字ならび,_特定の文字列に含まれる文字を削除した文字列). ある文字列から(_ある文字列,_文字) :- sub_atom(_ある文字列,_,1,_,_文字). 特定の文字列に含まれる文字を(_特定の文字列,_特定の文字列に含まれる文字) :- sub_atom(_特定の文字列,_,1,_,_特定の文字列に含まれる文字). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字選択された文字列(_文字列,_文字,_文字選択条件,_文字選択された文字列) :- findall(_文字,_文字選択条件,_文字選択された文字ならび), atomic_list_concat(_文字選択された文字ならび,_文字選択された文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/879 # # # 問題 # 1    ランチ (Lunch) # 問題 # # JOI パスタ店では,ランチのおすすめパスタと搾りたてジュースのセットメニューが好評である.このセットメニューを注文するときは,その日の 3 種類のパスタと 2 種類のジュースから 1 つずつ選ぶ.パスタとジュースの値段の合計から 50 円を引いた金額が代金となる. # # ある日のパスタとジュースの値段が与えられたとき,その日のセットメニューの代金の最小値を求めるプログラムを作成せよ. # # 入力 # # 入力は 5 行からなり,1 行に 1 つずつ正の整数が書かれている. # 1 行目の整数は 1 つ目のパスタの値段である. # 2 行目の整数は 2 つ目のパスタの値段である. # 3 行目の整数は 3 つ目のパスタの値段である. # 4 行目の整数は 1 つ目のジュースの値段である. # 5 行目の整数は 2 つ目のジュースの値段である. # ただし,与えられる入力データにおいては全てのパスタとジュースの値段は 100 円以上 2000 円以下であることが保証されている. # # 出力 # # その日のセットメニューの代金の最小値を 1 行で出力せよ. # # 入出力例 # # 入力例 1 入力例 2 # 800 # 700 # 900 # 198 # 330 # # 1999 # 1999 # 100 # 189 # 100 # # 出力例 1 出力例 2 # 848 # # 150 # # 入出力例 1 では,2 つ目のパスタと 1 つ目のジュースを組み合わせた場合の 700 + 198 - 50 = 848 がその日のセットメニューの代金の最小値である. # # 入出力例 2 では,3 つ目のパスタと 2 つ目のジュースを組み合わせた場合の 100 + 100 - 50 = 150 がその日のセットメニューの代金の最小値である. # # ※各入出力例のデータは,右クリック等によりファイルに保存して利用可能です. 'JOI パスタ店では,ランチのおすすめパスタと搾りたてジュースのセットメニューが好評である.このセットメニューを注文するときは,その日の 3 種類のパスタと 2 種類のジュースから 1 つずつ選ぶ.パスタとジュースの値段の合計から 50 円を引いた金額が代金となる. ある日のパスタとジュースの値段が与えられたとき,その日のセットメニューの代金の最小値を求めるプログラムを作成せよ. 入力 入力は 5 行からなり,1 行に 1 つずつ正の整数が書かれている. 1 行目の整数は 1 つ目のパスタの値段である. 2 行目の整数は 2 つ目のパスタの値段である. 3 行目の整数は 3 つ目のパスタの値段である. 4 行目の整数は 1 つ目のジュースの値段である. 5 行目の整数は 2 つ目のジュースの値段である. ただし,与えられる入力データにおいては全てのパスタとジュースの値段は 100 円以上 2000 円以下であることが保証されている. 出力 その日のセットメニューの代金の最小値を 1 行で出力せよ.' :- '入力 入力は 5 行からなり,1 行に 1 つずつ正の整数が書かれている. 1 行目の整数は 1 つ目のパスタの値段である. 2 行目の整数は 2 つ目のパスタの値段である. 3 行目の整数は 3 つ目のパスタの値段である. 4 行目の整数は 1 つ目のジュースの値段である. 5 行目の整数は 2 つ目のジュースの値段である. ただし,与えられる入力データにおいては全てのパスタとジュースの値段は 100 円以上 2000 円以下であることが保証されている.'(_3種類のパスタの価格ならび,_2種類のジュースの価格ならび), 'JOI パスタ店では,ランチのおすすめパスタと搾りたてジュースのセットメニューが好評である.このセットメニューを注文するときは,その日の 3 種類のパスタと 2 種類のジュースから 1 つずつ選ぶ.パスタとジュースの値段の合計から 50 円を引いた金額が代金となる. ある日のパスタとジュースの値段が与えられたとき,その日のセットメニューの代金の最小値を求める.'(_3種類のパスタの価格ならび,_2種類のジュースの価格ならび,_セットメニューの代金の最小値), 'その日のセットメニューの代金の最小値を 1 行で出力せよ.' (_セットメニューの代金の最小値). '入力 入力は 5 行からなり,1 行に 1 つずつ正の整数が書かれている. 1 行目の整数は 1 つ目のパスタの値段である. 2 行目の整数は 2 つ目のパスタの値段である. 3 行目の整数は 3 つ目のパスタの値段である. 4 行目の整数は 1 つ目のジュースの値段である. 5 行目の整数は 2 つ目のジュースの値段である. ただし,与えられる入力データにおいては全てのパスタとジュースの値段は 100 円以上 2000 円以下であることが保証されている.'([_1つ目のパスタの値段,_2つ目のパスタの値段,_3つ目のパスタの値段],[_1つ目のジュースの値段,_2つ目のジュースの値段]) :- '「ただし,与えられる入力データにおいては全てのパスタとジュースの値段は 100 円以上 2000 円以下であることが保証されている.」とあるから、整数範囲の検査は行わなくてよい。', '1 行目の整数は 1 つ目のパスタの値段である.'(_1つ目のパスタの値段), '2 行目の整数は 2 つ目のパスタの値段である.'(_2つ目のパスタの値段), '3 行目の整数は 3 つ目のパスタの値段である.'(_3つ目のパスタの値段), '4 行目の整数は 1 つ目のジュースの値段である.'(_1つ目のジュースの値段), '5 行目の整数は 2 つ目のジュースの値段である.'(_2つ目のジュースの値段). '1 行目の整数は 1 つ目のパスタの値段である.'(_1つ目のパスタの値段) :- 整数を得る(_1つ目のパスタの値段). '2 行目の整数は 2 つ目のパスタの値段である.'(_2つ目のパスタの値段) :- 整数を得る(_2つ目のパスタの値段). '3 行目の整数は 3 つ目のパスタの値段である.'(_3つ目のパスタの値段) :- 整数を得る(_2つ目のパスタの値段). '4 行目の整数は 1 つ目のジュースの値段である.'(_1つ目のジュースの値段) :- 整数を得る(_1つ目のジュースの値段). '5 行目の整数は 2 つ目のジュースの値段である.'(_2つ目のジュースの値段) :- 整数を得る(_2つ目のジュースの値段). 'JOI パスタ店では,ランチのおすすめパスタと搾りたてジュースのセットメニューが好評である.このセットメニューを注文するときは,その日の 3 種類のパスタと 2 種類のジュースから 1 つずつ選ぶ.パスタとジュースの値段の合計から 50 円を引いた金額が代金となる. ある日のパスタとジュースの値段が与えられたとき,その日のセットメニューの代金の最小値を求める.'(_3種類のパスタの価格ならび,_2種類のジュースの価格ならび,_セットメニューの代金の最小値) :- findmin(_セットメニューの代金,( 'このセットメニューを注文するときは,その日の 3 種類のパスタと 2 種類のジュースから 1 つずつ選ぶ.'(_3種類のパスタの価格ならび,_2種類のジュースの価格ならび,_パスタの価格,_ジュースの価格), 'パスタとジュースの値段の合計から 50 円を引いた金額が代金となる.'(_パスタの価格,_ジュースの価格,_セットメニューの代金)), _セットメニューの代金の最小値). 'このセットメニューを注文するときは,その日の 3 種類のパスタと 2 種類のジュースから 1 つずつ選ぶ.'(_3種類のパスタの価格ならび,_2種類のジュースの価格ならび,_パスタの価格,_ジュースの価格) :- member(_パスタの価格,_3種類のパスタの価格ならび), member(_ジュースの価格,_2種類のジュースの価格ならび). 'パスタとジュースの値段の合計から 50 円を引いた金額が代金となる.'(_パスタの価格,_ジュースの価格,_セットメニューの合計) :- _セットメニーの合計 is _パスタの価格 + _ジュースの価格 - 50. 'その日のセットメニューの代金の最小値を 1 行で出力せよ.' (_セットメニューの代金の最小値) :- writef('その日のメニューの最小値は %t\n',[_セットメニューの代金の最小値]). '「ただし,与えられる入力データにおいては全てのパスタとジュースの値段は 100 円以上 2000 円以下であることが保証されている.」とあるから、整数範囲の検査は行わなくてよい。' :- true. findmin(A,P,_min) :- findall(A,P,L), min_list(L,_min). 整数を得る(_整数) :- read_line_to_codes(Codes), number_codes(_整数,Codes), integer(_整数),!. 整数を得る(_整数) :- 整数を得る(_整数). % 以下のサイトは # # お題:n番目からn+9番目のフィボナッチ数の総和を求めよ。 # 'n番目からn+9番目のフィボナッチ数の総和'(Nth,_フィボナッチ数の総和) :- 'n番目からn+9番目のフィボナッチ数ならび'(Nth,_フィボナッチ数ならび), sum_list(_フィボナッチ数ならび,_フィボナッチ数の総和),!. 'n番目からn+9番目のフィボナッチ数ならび'(Nth,_フィボナッチ数ならび) :- findall(X,'n番目からn+9番目のフィボナッチ数'(Nth,X),_フィボナッチ数ならび). 'n番目からn+9番目のフィボナッチ数'(Nth_1,X) :- Nth_9 is Nth_1 + 9, 'n番目からn+9番目のフィボナッチ数'(0,0,1,Nth_1,Nth_9,X). 'n番目からn+9番目のフィボナッチ数'(Nth,M,N,Nth_1,Nth_9,M) :- between(Nth_1,Nth_9,Nth). 'n番目からn+9番目のフィボナッチ数'(Nth,M,N,Nth_1,Nth_9,X) :- M2 is M + N, Nth_2 is Nth + 1, Nth_2 =< Nth_9, 'n番目からn+9番目のフィボナッチ数'(Nth_2,N,M2,Nth_1,Nth_9,X). % 以下のサイトは # # お題:テキストファイルを読み込み、その中で最もよく使われている単語ベスト3を表示するプログラム # 'テキストファイルを読み込み、その中で最もよく使われている単語ベスト3を表示する'(_テキストファイル) :- テキストファイルを読み込み(_テキストファイル,_文), 'その中で最もよく使われている単語ベスト3を表示する'(_文). テキストファイルを読み込み(_テキストファイル,_文) :- get_lines(_テキストファイル,_行ならび), atomic_list_concat(_行ならび,_文). 'その中で最もよく使われている単語ベスト3を表示する'(_文) :- 形態素解析(文,_文,_形態素ならび), 最もよく使われている単語ベスト3を(_形態素ならび,_最もよく使われている単語ベスト3), 表示する(_最もよく使われている単語ベスト3). その中で最もよく使われている単語ベスト3を(_形態素ならび,[_単語1,_単語2,_単語3]) :- setof(A,member(A,_形態素ならび),_単語ならぴ), findall([_度数,_単語],( member(_単語,_単語ならび), count(_単語,_形態素ならび,_度数)), LL), sort(LL,_整列したLL), append(_,[[_,_単語3],[_,_単語2],[_,_単語1]],_整列したLL). 表示する([_単語1,_単語2,_単語3]) :- writef('%t %t %t\n',[_単語1,_単語2,_単語3]). count(P,N) :- findsum(1,P,F), N is truncate(F). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum_list(_値ならび,_合計値),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 形態素解析サーバー(mecab). 形態素解析([],[]) :-!. 形態素解析([['EOS'|_]|_],[]) :-!. 形態素解析([[A|_],[@,B|_]|R],[R1_1|R3]) :- 形態素解析_2(R,R1,R2), 形態素解析_2_重複削除([A,B|R1],[],R1_1), 形態素解析(R2,R3),!. 形態素解析([[A|_]|R],[B|R2]) :- 形態素解析サーバー(mecab), make_list(A,['\t'],AL), AL = [B|_], 形態素解析(R,R2),!. 形態素解析([[A|_]|R],[A|R2]) :- 形態素解析サーバー(juman), 形態素解析(R,R2),!. 形態素解析_2([],[],[]) :- !. 形態素解析_2([[A|R1]|R],[],[[A|R1]|R]) :- \+(A = (@)),!. 形態素解析_2([[@,A|_]|R],[A|R2],R3) :- 形態素解析_2(R,R2,R3),!. 形態素解析_2_重複削除([],L1,L) :- reverse(L1,L),!. 形態素解析_2_重複削除([A|R],Y,X) :- member(A,Y), 形態素解析_2_重複削除(R,Y,X),!. 形態素解析_2_重複削除([A|R],Y,X) :- \+(member(A,Y)), 形態素解析_2_重複削除(R,[A|Y],X). 形態素解析(ファイル,_テキストファイル,L) :- 形態素解析サーバー(_形態素解析サーバー), concat(['cat ',_テキストファイル,' | ',_形態素解析サーバー],S), sh(S,L1), 形態素解析(L1,L2), 形態素解析_3(L2,L). 形態素解析(文,S,L) :- tmpnam(_仮のファイル), tell(_仮のファイル), wr('%t',[S]), told, 形態素解析(ファイル,_仮のファイル,L) . 形態素解析_3([],[]). 形態素解析_3([A|R],[A|R2]) :- \+(list(A)), 形態素解析_3(R,R2) . 形態素解析_3([A|R],[B|R2]) :- list(A), member(B,A), 形態素解析_3(R,R2). system(Command,X) :- shell(Command,X). system(Command) :- shell(Command). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). sh(Command,X) :- shs(Command,Y), findall(U,( member(V,Y) , split(V,[' ',','],U)), X). shs(Command,X) :- popen(Command,L), shs_3(L,X). shs_3(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_3(R1,R). shs_3([],[]) :- !. shs_3(L,[S]) :- atom_chars(S,L). tmpnam(TMPNAM) :- 乱数からTMPNAMを得る(TMPNAM),!. tmpnam(TMPNAM) :- tmpnam(TMPNAM). 乱数からTMPNAMを得る(TMPNAM) :- アルファベットに変換([_1,_2,_3,_4,_5,_6]), atomic_list_concat(['/tmp/file'|[_1,_2,_3,_4,_5,_6]],TMPNAM), \+(exists_file(TMPNAM)). アルファベットに変換([]). アルファベットに変換([A|R]) :- C is random(62), アルファベットに変換の二(C,A), アルファベットに変換(R). アルファベットに変換の二(N,A) :- '基数62のコード・アルファベットコード変換表'(S,E,B), between(S,E,N), C is N - S + B, char_code(A,C). '基数62のコード・アルファベットコード変換表'(0,9,48). '基数62のコード・アルファベットコード変換表'(10,35,65). '基数62のコード・アルファベットコード変換表'(36,60,97). % 以下のサイトは # # 読み順というか文字コード順でソートしているからこうなるので、 # 漢数字がいい感じで並ぶ順を定義して実装して使えばいい # 漢数字文字列の並べ替え(_漢数字文字列,_並べ直された漢数字文字列) :- いい感じで並ぶ順(_いい感じで並ぶ順), findall(_選択文字,( sub_atom(_いい感じで並ぶ順,_,1,_,_選択文字), sub_atom(_漢数字文字列,_,1,_,_選択文字)), _並べ直された漢数字文字ならび), atomic_list_concat(_並べ直された漢数字文字ならび,_並べ直された漢数字文字列). いい感じで並ぶ順(一二三四五六七八九). % 以下のサイトは nクイーン(_nクイーン,_一解) :- '1からnまでの数ならびを得る(縦横の利き筋はこれを行ごとに一つずつ選択することで回避される)'(_nクイーン,_数ならび), 行ごとに順に駒を置き利き筋を調べて一解を得る(_数ならび,[],_一解). 行ごとに順に駒を置き利き筋を調べて一解を得る([],_一解,_一解). 行ごとに順に駒を置き利き筋を調べて一解を得る(_位置ならび,Qs,_一解) :- '駒の位置と残り駒の位置ならびを得る(この選択自体が縦横の利き筋検査になっている)'(_駒の位置,_位置ならび,_残り駒の位置ならび), 斜めの利き筋に駒はない(_駒の位置,1,Qs), 行ごとに順に駒を置き利き筋を調べて一解を得る(_残り駒の位置ならび,[_駒の位置|Qs],_一解). '駒の位置と残り駒の位置ならびを得る(この選択自体が縦横の利き筋検査になっている)'(_駒の位置,[_駒の位置|_残り駒の位置ならび],_残り駒の位置ならび). '駒の位置と残り駒の位置ならびを得る(この選択自体が縦横の利き筋検査になっている)'(X,[H|T],[H|T1]) :- '駒の位置と残り駒の位置ならびを得る(この選択自体が縦横の利き筋検査になっている)'(X,T,T1). 斜めの利き筋に駒はない(_,_,[]). 斜めの利き筋に駒はない(Q,_隔たり,[Q1|Qs]) :- Q + _隔たり =\= Q1, Q - _隔たり =\= Q1, _隔たり_2 is _隔たり + 1, 斜めの利き筋に駒はない(Q,_隔たり_2,Qs). '1からnまでの数ならびを得る(縦横の利き筋はこれを行ごとに一つずつ選択することで回避される)'(_nクイーン,_数ならび) :- findall(M,between(1,_nクイーン,M),_数ならび). % 以下のサイトは # # 【東電問題】汚染水を保存するためのタンクを毎日1個作るとします。 # タンクは10日後には必ず壊れ作り直すとします。 # タンク作製作業量はどのように変移するでしょうか? # なお、汚染水の移動作業、タンク点検作業などは考える必要はありません。 :- dynamic(タンク/3). '【東電問題】汚染水を保存するためのタンクを毎日1個作るとします。 タンクは10日後には必ず壊れ作り直すとします。 タンク作製作業量はどのように変移するでしょうか? なお、汚染水の移動作業、タンク点検作業などは考える必要はありません。'(_何日目,_作業量) :- 'タンク作製作業量はどのように変移するでしょうか?'(_何日目,_作業量). 'タンク作製作業量はどのように変移するでしょうか?'(_何日目,_作業量) :- タンク作製作業量はどのように変移([_],_何日目,_作業量). タンク作製作業量はどのように変移(_日の変数ならび,_何日目,_作業量) :- length(_日の変数ならび,_何日目), '汚染水を保存するためのタンクを毎日1個作るとします。', findall(_,'タンクは10日後には必ず壊れ作り直すとします。',_作り直した個数の変数ならび), length([_|_作り直した個数の変数ならび],_作業量). タンク作製作業量はどのように変移(_日の変数ならび,_何日目,_作業量) :- 一日経ちました(_日の変数ならび,_何日目,_作業量). 一日経ちました(_,_,_) :- retract(タンク(_状態,_経た日数,_内容)), assertz(タンク(_状態,[_|_経た日数],_内容)), fail. 一日経ちました(_日の変数ならび,_何日目,_作業量) :- タンク作製作業量はどのように変移([_|_日の変数ならび],_何日目,_作業量). '汚染水を保存するためのタンクを毎日1個作るとします。' :- assertz(タンク(使えます,[],_汚染水)). 'タンクは10日後には必ず壊れ作り直すとします。' :- 'タンクは10日後には必ず壊れ', '作り直すとします。'. 'タンクは10日後には必ず壊れ' :- retract(タンク(使えます,[_,_,_,_,_,_,_,_,_,_],_汚染水)), assertz(タンク(壊れました,[_,_,_,_,_,_,_,_,_,_],_汚染水)). '作り直すとします。' :- assertz(タンク(使えます,[],[])). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1377511459/294 # # 縦横6マスのボックスがあります。 # 全てのマスを○×で埋めます。 # ○と×はそれぞれ連続2個まで繋がっててOK。 # 縦横の各列は○と×の数は同じにならなければいけない。 # ○と×の並び方が他の列と重複するのはNG。(縦と横を比較して同じなのはOK。縦と縦、横と横が同じ並びって言うのがNG) # これはどうやって解けばいいのか教えてください。 # # '縦横6マスのボックスがあります。 全てのマスを○×で埋めます。 ○と×はそれぞれ連続2個まで繋がっててOK。 縦横の各列は○と×の数は同じにならなければいけない。 ○と×の並び方が他の列と重複するのはNG。(縦と横を比較して同じなのはOK。縦と縦、横と横が同じ並びって言うのがNG) これはどうやって解けばいいのか教えてください。'(LL) :- 行候補ならびを得る(_行候補ならび), 面を規定する(LL), 転置(LL,_転置されたLL), 面候補を得る(_行候補ならび,LL), 転置診断(_転置されたLL,_行候補ならび). 行候補ならびを得る(_行候補ならび) :- findall(L,( 順列([○,○,○,×,×,×],6,L), \+(append(_,[A,A,A|_],L))), _重複があり得る行候補ならび), sort(_重複があり得る行候補ならび,_行候補ならび). 面を規定する(LL) :- length(LL,6), findall(L,( member(L,LL), length(L,6)), LL). 面候補を得る(_行候補ならび,[L1,L2,L3,L4,L5,L6]) :- member(L1,_行候補ならび), member(L2,_行候補ならび), member(L3,_行候補ならび), member(L4,_行候補ならび), member(L5,_行候補ならび), member(L6,_行候補ならび), sort([L1,L2,L3,L4,L5,L6],[_,_,_,_,_,_]). 転置診断(_転置されたLL,_行候補ならび) :- sort(_転置されたLL,[_,_,_,_,_,_]), findall(_,( member(L,_転置されたLL), member(L,_行候補ならび), \+(append(_,[A,A,A|_],L))), [_,_,_,_,_,_]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 順列(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/1354393458/650 # # # 81以下の自然数で九九に現れない数を昇順にすべて表示せよ。 # '81以下の自然数で九九に現れない数を昇順にすべて表示せよ。' :- '81以下の自然数ならび'(_81以下の自然数ならび), '81以下の自然数で九九に現れない数を昇順にすべて'([_],[_],_81以下の自然数ならび,_81以下の自然数で九九に現れない数ならび), '表示せよ。'(_81以下の自然数で九九に現れない数ならび). '81以下の自然数ならび'(_81以下の自然数ならび) :- findall(_数,between(1,81,_数),_81以下の自然数ならび). '81以下の自然数で九九に現れない数を昇順にすべて'([_,_,_,_,_,_,_,_,_],[_,_,_,_,_,_,_,_,_,_],_81以下の自然数で九九に現れない数ならび,_81以下の自然数で九九に現れない数ならび). '81以下の自然数で九九に現れない数を昇順にすべて'(Ln1,[_,_,_,_,_,_,_,_,_,_],L1,L) :- '81以下の自然数で九九に現れない数を昇順にすべて'([_|Ln1],[_],L1,L). '81以下の自然数で九九に現れない数を昇順にすべて'(Ln1,Ln2,L1,L) :- 九九に現れる数を削除(Ln1,Ln2,L1,L2), '81以下の自然数で九九に現れない数を昇順にすべて'(Ln1,[_|Ln2],L2,L). 九九に現れる数を削除(Ln1,Ln2,L1,L2) :- ならび掛け算(Ln1,Ln2,Ln3), length(Ln3,_九九に現れる数), 数をL1から削除してL2とする(_九九に現れる数,L1,L2),!. 九九に現れる数を削除(_,_,L,L). ならび掛け算(_,[],[]). ならび掛け算(L1,[B|R2],L) :- ならび掛け算(L1,R2,L2), append(L1,L2,L). 数をL1から削除してL2とする(_数,L1,L2) :- append(L0,[_数|R],L1), append(L0,R,L2). '表示せよ。'(_81以下の自然数で九九に現れない数ならび) :- atomic_list_concat(_81以下の自然数で九九に現れない数ならび,' ',_表示文字列), writef('%t\n',[_表示文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/650 # # # 81以下の自然数で九九に現れない数を昇順にすべて表示せよ。 # '81以下の自然数で九九に現れない数を昇順にすべて表示せよ。' :- '81以下の自然数ならび'(_81以下の自然数ならび), '81以下の自然数で九九に現れない数を'([_],[_],_81以下の自然数ならび,_81以下の自然数で九九に現れない数ならび), '表示せよ。'(_81以下の自然数で九九に現れない数ならび). '81以下の自然数ならび'(_81以下の自然数ならび) :- findall(_数,between(1,81,_数),_81以下の自然数ならび). '81以下の自然数で九九に現れない数を昇順にすべて'([_,_,_,_,_,_,_,_,_],[_,_,_,_,_,_,_,_,_,_],_81以下の自然数で九九に現れない数ならび,_81以下の自然数で九九に現れない数ならび). '81以下の自然数で九九に現れない数を昇順にすべて'(Ln1,[_,_,_,_,_,_,_,_,_,_],L1,L) :- '81以下の自然数で九九に現れない数を'([_|Ln1],[_],L1,L). '81以下の自然数で九九に現れない数を昇順にすべて'(Ln1,Ln2,L1,L) :- 九九に現れる数を削除(Ln1,Ln2,L1,L2), '81以下の自然数で九九に現れない数を昇順にすべて'(Ln1,[_|Ln2],L2,L). 九九に現れる数を削除(Ln1,Ln2,L1,L2) :- ならびの要素数表現を数表現に変換(Ln1,Ln2,_数_1,_数_2), _九九に現れる数 is _数_1 * _数_2, 数をL1から削除してL2とする(_九九に現れる数,L1,L2),!. 九九に現れる数を削除(_,_,L,L). ならびの要素数表現を数表現に変換(Ln1,Ln2,_数_1,_数_2) :- length(Ln1,_数_1), length(Ln2,_数_2). 数をL1から削除してL2とする(_数,L1,L2) :- append(L0,[_数|R],L1), append(L0,R,L2). '表示せよ。'(_81以下の自然数で九九に現れない数ならび) :- atomic_list_concat(_81以下の自然数で九九に現れない数ならび,' ',_表示文字列), writef('%t\n',[_表示文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/650 # # # 81以下の自然数で九九に現れない数を昇順にすべて表示せよ。 # '81以下の自然数で九九に現れない数を昇順にすべて表示せよ。' :- '81以下の自然数で九九に現れない数を昇順にすべて'(_81以下の自然数で九九に現れない数ならび), '表示せよ。'(_81以下の自然数で九九に現れない数ならび). '81以下の自然数で九九に現れない数を昇順にすべて'(_81以下の自然数で九九に現れない数ならび) :- '81以下の自然数ならび'(_81以下の自然数ならび), 九九に現れる数ならび(_九九に現れる数ならび), '81以下の自然数で九九に現れない数を昇順にすべて'(_81以下の自然数ならび,_九九に現れる数ならび,_81以下の自然数で九九に現れない数ならび). '81以下の自然数ならび'(_81以下の自然数ならび) :- findall(_数,between(1,81,_数),_81以下の自然数ならび). 九九に現れる数ならび(_九九に現れる数ならび) :- findall(_九九,( 九九(_九九)), _九九に現れる数ならび). 九九(_九九) :- between(1,9,_数_1), between(1,9,_数_2), _九九 is _数_1 * _数_2. '81以下の自然数で九九に現れない数を昇順にすべて'([],_,[]) :- !. '81以下の自然数で九九に現れない数を昇順にすべて'([_数|R1],_九九に現れる数ならび,[_数|R3]) :- 九九に現れない数(_数,_九九に現れる数ならび), '81以下の自然数で九九に現れない数を昇順にすべて'(R1,_九九に現れる数ならび,R3),!. '81以下の自然数で九九に現れない数を昇順にすべて'([_|R1],_九九に現れる数ならび,R3) :- '81以下の自然数で九九に現れない数を昇順にすべて'(R1,_九九に現れる数ならび,R3). 九九に現れない数(_数,_九九に現れる数ならび) :- \+(member(_数,_九九に現れる数ならび)). '表示せよ。'(_81以下の自然数で九九に現れない数ならび) :- atomic_list_concat(_81以下の自然数で九九に現れない数ならび,' ',_表示文字列), writef('%t\n',[_表示文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/650 # # # 81以下の自然数で九九に現れない数を昇順にすべて表示せよ。 # '81以下の自然数で九九に現れない数を昇順にすべて表示せよ。' :- '81以下の自然数ならび'(_81以下の自然数ならび), 九九に現れる数ならび(_九九に現れる数ならび), '81以下の自然数で九九に現れない数を昇順にすべて'(_81以下の自然数ならび,_九九に現れる数ならび,_81以下の自然数で九九に現れない数ならび), '表示せよ。'(_81以下の自然数で九九に現れない数ならび). '81以下の自然数ならび'(_81以下の自然数ならび) :- findall(_数,between(1,81,_数),_81以下の自然数ならび). 九九に現れる数ならび(_九九に現れる数ならび) :- findall(_九九,( 九九(_九九)), _九九に現れる数ならび). 九九(_九九) :- between(1,9,_数_1), between(1,9,_数_2), _九九 is _数_1 * _数_2. '81以下の自然数で九九に現れない数を昇順にすべて'([],_,[]) :- !. '81以下の自然数で九九に現れない数を昇順にすべて'([_数|R1],_九九に現れる数ならび,[_数|R3]) :- \+(member(_数,_九九に現れる数ならび)), '81以下の自然数で九九に現れない数を昇順にすべて'(R1,_九九に現れる数ならび,R3),!. '81以下の自然数で九九に現れない数を昇順にすべて'([_|R1],_九九に現れる数ならび,R3) :- '81以下の自然数で九九に現れない数を昇順にすべて'(R1,_九九に現れる数ならび,R3). '表示せよ。'(_81以下の自然数で九九に現れない数ならび) :- atomic_list_concat(_81以下の自然数で九九に現れない数ならび,' ',_表示文字列), writef('%t\n',[_表示文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/650 # # # 81以下の自然数で九九に現れない数を昇順にすべて表示せよ。 # '81以下の自然数で九九に現れない数を昇順にすべて表示せよ。' :- findall(N,between(1,81,N),L_1), '81以下の自然数で九九に現れない数を昇順ですべて'(1,1,L_1,L_2), '表示せよ。'(L_2). '81以下の自然数で九九に現れない数を昇順ですべて'(_n_1,_,L,L) :- _n_1 > 9,!. '81以下の自然数で九九に現れない数を昇順ですべて'(_n_1,_n_2,L_1,L) :- _n_2 > 9, _n_1_2 is _n_1 + 1, '81以下の自然数で九九に現れない数を昇順ですべて'(_n_1_2,1,L_1,L). '81以下の自然数で九九に現れない数を昇順ですべて'(_n_1,_n_2,L_1,L_2) :- _n_3 is _n_1 * _n_2, 空白に置換(_n_3,L_1,L_2), _n_2_2 is _n_2 + 1, '81以下の自然数で九九に現れない数を'(_n_1,_n_2_2,L_3,L). 空白に置換(N,L_1,L_2) :- append(L0,[N|R],L_1), append(L0,[' '|R],L_2). 表示せよ(L) :- atomic_list_concat(L,_表示文字列), writef('%t\n',[_表示文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/650 # # # 81以下の自然数で九九に現れない数を昇順にすべて表示せよ。 # '81以下の自然数で九九に現れない数を昇順にすべて表示せよ。' :- '81以下の自然数で九九に現れない数を昇順にすべて'(_81以下の自然数で九九に現れない数ならび), '表示せよ。'(_81以下の自然数で九九に現れない数ならび). '81以下の自然数で九九に現れない数を昇順にすべて'(_81以下の自然数で九九に現れない数ならび) :- findall(_81以下の自然数,( '81以下の自然数で'(_81以下の自然数), 九九に現れない数(_81以下の自然数)),_81以下の自然数で九九に現れない数ならび). '81以下の自然数で'(_81以下の自然数) :- between(1,81,_81以下の自然数). 九九に現れない数(_81以下の自然数) :- \+(九九に現れる数(_81以下の自然数)). 九九に現れる数(_九九に現れる数) :- between(1,9,_数_1), between(1,9,_数_2), _九九に現れる数 is _数_1 * _数_2. '表示せよ。'(_81以下の自然数で九九に現れない数ならび) :- atomic_list_concat(_81以下の自然数で九九に現れない数ならび,' ',_表示文字列), writef('%t\n',[_表示文字列]). % 以下のサイトは 重複要素を削る(_ならび,_重複要素を削ったならび) :- findall(_要素,( append(L0,[_要素|R],_ならび), \+(member(_要素,L0))), _重複要素を削ったならび). 重複要素を削って表示する(_ならび) :- forall(( append(L0,[要素|_],_ならび), \+(member(要素,L0))), writef('%t ',[_要素])). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1376111807/98 # # '10円と100円と1000円の買い物をした時に払う # 金額のリストを考えてみました # # map(sum)[[x,y,z]|x<-[0,10],y<-[0,100],z<-[0,1000]] # # これを任意の組に拡張するには # どういう方法があるでしょうか? # '10円と100円と1000円の買い物をした時に払う 金額のリストを考えてみました map(sum)[[x,y,z]|x<-[0,10],y<-[0,100],z<-[0,1000]] これを任意の組に拡張するには どういう方法があるでしょうか?'(_買い物をした時に支払う金額ならび,_金額組合せ) :- 買い物をした時に払う金額(_買い物をした時に支払う金額ならび,_重複を許す金額ならび), sort(_重複を許す金額ならび,_金額組合せ). 買い物をした時に払う金額(_買い物をした時に支払う金額ならび,_金額ならび) :- length(_買い物をした時に支払う金額ならび,_ならびの長さ), findall(_金額,( between(1,_ならびの長さ,N), 組合せ(_買い物をした時に支払う金額ならび,N,L), sum(L,_金額)), _金額ならび). % 以下のサイトは スレッドとメッセージキューを使って全解を収集する(_選択項,_副目標,_回収値ならび) :- message_queue_create(_キュー番号), thread_create(スレッドで副目標を実行する(_キュー番号,_選択項,_副目標),_,[]), メッセージを回収する(_キュー番号,_回収値ならび), message_queue_destroy(_キュー番号). スレッドで副目標を実行する(_キュー番号,_選択項,_副目標) :- call(_副目標), thread_send_message(_キュー番号,_選択項), fail. スレッドで副目標を実行する(_キュー番号,_,_) :- thread_send_message(_キュー番号,end_of_file). メッセージを回収する(_キュー番号,_メッセージならび) :- メッセージを確実に得る(_キュー番号,_回収値), メッセージを回収する(_キュー番号,_回収値,_メッセージならび). メッセージを回収する(_キュー番号,end_of_file,[]) :- !. メッセージを回収する(_キュー番号,_回収値,[_回収値|R]) :- メッセージを確実に得る(_キュー番号,_回収値_2), メッセージを回収する(_キュー番号,_回収値_2,R). メッセージを確実に得る(_キュー番号,_メッセージ) :- repeat, thread_peek_message(_キュー番号,_), thread_get_message(_キュー番号,_メッセージ),!. % 以下のサイトは % % SWI-Prologに於いてfindall/3と同等の述語をmesage_queueを使って定義してみる。 % % findall/3と同じ機能の述語をメッセージキューを利用して定義する。 % メッセージキューを使って全解を収集する(_選択項,_副目標,_回収値ならび) :- message_queue_create(_キュー番号), ( call(_副目標), thread_send_message(_キュー番号,_選択項), fail; メッセージを回収する(_キュー番号,_回収値ならび)), message_queue_destroy(_キュー番号). メッセージを回収する(_キュー番号,[]) :- \+(thread_peek_message(_キュー番号,_)),!. メッセージを回収する(_キュー番号,[_回収値|R]) :- thread_get_message(_キュー番号,_回収値), メッセージを回収する(_キュー番号,R). % 以下のサイトは # # 直積 # 直積(_集合ならび,_直積集合) :- member項の生成(_集合ならび,_member項,_要素変数ならび), findall(_要素変数ならび,_member項,_直積集合). member項の生成([_集合],member(_要素変数,_集合),[_要素変数]). member項の生成([_集合|R1],(member(_要素変数,_集合),U),[_要素変数|R2]) :- member項の生成(R1,U,R2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/785 # # 与えられた自然数nを上回る2の冪を返す関数をなるべく最短処理になるように自作してください # 宿題じゃないので期限は問いません # 例: # n=1 → 1 # n=2 → 2 # n=3 → 4 # n=6 → 8 # n=300 → 512 # # 与えられた自然数nを上回る2の冪を返す(_n,_2の冪) :- count('1ビット右シフト'(_n),_冪), _2の冪 is 2 ^ _冪. '1ビット右シフト'(0) :- !,fail. '1ビット右シフト'(N). '1ビット右シフト'(N) :- M is N >> 1, '1ビット右シフト'(M). count(P,N) :- findall(1,P,L), length(L,N). % 以下のサイトは 全順列(L,LL) :- length(L,Len), ダミー要素を付加する(Len,L,L_2), findall(L_4,( 順列(L_2,3,L_3), findall(A,(member(A,L_3),\+(var(A))),L_4)), LL_1), sort(LL_1,LL). 全組合せ(L,LL) :- length(L,Len), ダミー要素を付加する(Len,L,L_2), findall(L_4,( 組合せ(L_2,3,L_3), findall(A,(member(A,L_3),\+(var(A))),L_4)), LL_1), sort(LL_1,LL). ダミー要素を付加する(Len,L_1,L_2) :- length(L_v,Len), append(L_1,L_v,L_2),!. % 以下のサイトは # # 目標を限界度数成功させて指定した蒐集項をならびとして得る # 目標を限界度数成功させて指定した蒐集項をならびとして得る(_限界度数,_蒐集項,_目標,_蒐集項ならび) :- 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(度数(_限界度数,_キュー番号),_,[]); findnall(_目標,( thread_get_message(_キュー番号,_項), ( _項 = 0,!,fail;call(_目標))), _目標ならび)). 度数(_限界度数,_キュー番号) :- between(1,_限界度数,_度数), _剰余 is _度数 mod ( _限界度数 + 1 ), thread_send_message(_キュー番号,_剰余), _度数 = _限界度数. % 以下のサイトは # # 目標を限界度数成功させて指定した蒐集項をならびとして得る # 目標を限界度数成功させて指定した蒐集項をならびとして得る(_限界度数,_蒐集項,_目標,_蒐集項ならび) :- 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も % 全く同様の問題があるし、解決策も同じである。 % 以下のサイトは # # 目標を限界度数成功させて指定した蒐集項をならびとして得る # 目標を限界度数成功させて指定した蒐集項をならびとして得る(_限界度数,_蒐集項,_目標,_蒐集項ならび) :- findall_n(_限界度数,_蒐集項,_目標,_蒐集項ならび). findall_n(_限界度数,_蒐集項,_目標,_蒐集項ならび) :- message_queue_create(_キュー番号), 度数(_限界度数,_キュー番号), findall(_蒐集項,( thread_get_message(_キュー番号,_項), ( _項 = 0,!,fail;call(_目標))), _蒐集項ならび). 度数(_限界度数,_キュー番号) :- between(1,_限界度数,_度数), _剰余 is _度数 mod ( _限界度数 + 1 ), thread_send_message(_キュー番号,_剰余), _度数 = _限界度数. % % ?- length(L,4),findall(N,between(1,10000000,N),L). % false. % 1000万要素と4要素のリストの単一化。この結論を得るまでに数秒を要する。 % % ?- length(L,4),findall_n(4,N,between(1,10000000,N),L). % L = [1,2,3,4] % % ?- length(L,4),findall_n(5,N,between(1,10000000,N),L). % false. % % ?- length(L,4),findall_n(5,N,between(1,4,N),L). % L = [1,2,3,4] % % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/676 # # 【 課題 】カンマ区切られているtest.txtのx列のみを取り出し移動平均で値を出しなさい。平均をとる範囲は10とする。 # 【 形態 】Javaアプリケーション(main()で開始) # 【 GUI  】制限なし # 【 期限 】提出期限なし # 【 Ver  】java version "1.7.0_21" # 【 補足 】txtははこちらです。よろしくお願いします。 # www.dotup.org/uploda/www.dotup.org4425870.txt.html # # 'カンマ区切られているtest.txtのx列のみを取り出し移動平均で値を出しなさい。平均をとる範囲は10とする。'(_x列,_x列の移動平均ならび) :- 'カンマ区切られているtest.txtのx列のみを取り出し'(_x列,_x列ならび), '移動平均で値を出しなさい。平均をとる範囲は10とする。'(_x列ならび,_x列の移動平均ならび). 'カンマ区切られているtest.txtのx列のみを取り出し'(_x列,_x列ならび) :- get_split_lines('test.txt',[','],LL), findall(S,( member(L,LL), nth1(_x列,L,S)), _x列ならび). '移動平均で値を出しなさい。平均をとる範囲は10とする。'(_x列ならび,_x列の移動平均ならび) :- findall(_単純移動平均,( 単純移動平均(_x列ならび,10,_単純移動平均)), _x列の移動平均ならび). 単純移動平均(_データならび,_サンプル数,_単純移動平均) :- length(L1,_サンプル数), append(L0,L1,_データならび), 相加平均(L1,_単純移動平均). % 以下のサイトは # # お題:整数同士の掛け算の筆算の計算過程を表示するプログラム # 整数同士の掛け算の筆算の計算過程を表示する(_整数_1,_整数_2) :- それぞれの整数を数値ならびに変換(_整数_1,_整数_2,_整数ならび_1,_整数ならび_2), 掛け算の筆算の計算過程を表示する(_整数ならび_1,_整数ならび_2). それぞれの整数を数値ならびに変換(_整数_1,_整数_2,_整数ならび_1,_整数ならび_2) :- number_chars(_整数_1,Chars_1), number_chars(_整数_2,Chars_2), 数字ならびを数値ならびに変換(Chars_1,_整数ならび_1), 数字ならびを数値ならびに変換(Chars_2,_整数ならび_2). 数字ならびを数値ならびに変換([],[]). 数字ならびを数値ならびに変換([A|R1],[N|R2]) :- atom_number(A,N), 数字ならびを数値ならびに変換(R1,R2). 掛け算の筆算の計算過程を表示する(_整数ならび_1,_整数ならび_2) :- reverse(_整数ならび_1,_反転した整数ならび_1), reverse(_整数ならび_2,_反転した整数ならび_2), '掛け算の筆算の計算過程(下の桁から掛ける)を表示する'(0,_反転した整数ならび_1,_反転した整数ならび_2,_前段の数ならび), 各桁の加算を表示する(_全段の数ならび). '掛け算の筆算の計算過程(下の桁から掛ける)を表示する'(_,_,[],[]). '掛け算の筆算の計算過程(下の桁から掛ける)を表示する'(_n,L1,[_m|R2],[L2|R4]) :- 乗数がn桁目の掛算(_n,_m,L1,L2), '掛け算の筆算の計算過程の表示'(_n,_m,L1,L2), _n_2 is _n + 1, '掛け算の筆算の計算過程(下の桁から掛ける)を表示する'(_n_2,L1,R2,R4). '掛け算の筆算の計算過程の表示'(_n,_m,L1,L2) :- reverse(L1,L1_2), atomic_list_concat(L1_2,S1), atomic_list_concat(L2_2,S2), writef('%t×%t=% t ... (%t)\n',[S1,_m,S,_n2]). 乗数がn桁目の掛算(_n,_m,L1,L2) :- length(L4,_n), all(L4,0), append(L4,L1,L1_2), 段の掛算(_m,L1_2,0,[],L2),!. 段の掛算(_,[],0,L,L) :- !. 段の掛算(_,[],C,L1,[C|L1]) :- !. 段の掛算(M,[N|R2],C,L3,L) :- 九九掛算(M,N,N1,N2), D is (N1 * 10 + C + N2) // 10, M2 is (C + N2) mod 10, 段の掛算(_n,M,R2,D,[M2|L3],L). 各桁の加算を表示する(_全段の数ならび) :- 全段を逆順に並べ直す(_全段の数ならび,_逆順の全段の数ならび), length(_全段の数ならび,Len), 各桁の加算を表示する(_逆順の全段の数ならび,0). 各桁の加算を表示する([],Len,S) :- findall(S,( between(1,Len,N), swritef(S,'(%t)',[N])), L), atomic_list_concat(L,'+',S1), writef('%t=%t\n',[S1,S]),!. 各桁の加算を表示する(_逆順の全段の数ならび,Len,S) :- 下の桁から加算する(_逆順の前段の数ならび,0,S1,R2), 各桁の加算を表示する(R2,Len,S1). 全段を逆順に並べ直す([],[]). 全段を逆順に並べ直す([L1|R1],[L2|R2]) :- reverse(L1,L2), 全段を逆順に並べ直す(R1,R2). 下の桁から加算する([],S,S,[]). 下の桁から加算する([[M|R1_1]|R1],S1,S,[R1_1|R2]) :- S2 is S1 + M, 下の桁から加算する(R,S2,S,R2),!. 下の桁から加算する([[]|R1],S1,S,R2) :- 下の桁から加算する(R,S1,S,R2). 九九掛算(M,N,X_1,X_2) :- length(L1,M), length(L2,N), append(L1,L2,L3), ならびの割り算(L3,[_,_,_,_,_,_,_,_,_,_],L4,L5), length(L4,X_1), length(L5,X_2). 九九掛算(0,0,0,0). 九九掛算(0,1,0,0). 九九掛算(0,2,0,0). 九九掛算(0,3,0,0). 九九掛算(0,4,0,0). 九九掛算(0,5,0,0). 九九掛算(0,6,0,0). 九九掛算(0,7,0,0). 九九掛算(0,8,0,0). 九九掛算(0,9,0,0). 九九掛算(1,0,0,0). 九九掛算(1,1,0,1). 九九掛算(1,2,0,2). 九九掛算(1,3,0,3). 九九掛算(1,4,0,4). 九九掛算(1,5,0,5). 九九掛算(1,6,0,6). 九九掛算(1,7,0,7). 九九掛算(1,8,0,8). 九九掛算(1,9,0,9). 九九掛算(2,0,0,0). 九九掛算(2,1,0,2). 九九掛算(2,2,0,4). 九九掛算(2,3,0,6). 九九掛算(2,4,0,8). 九九掛算(2,5,1,0). 九九掛算(2,6,1,2). 九九掛算(2,7,1,4). 九九掛算(2,8,1,6). 九九掛算(2,9,1,8). 九九掛算(3,0,0,0). 九九掛算(3,1,0,3). 九九掛算(3,2,0,6). 九九掛算(3,3,0,9). 九九掛算(3,4,1,2). 九九掛算(3,5,1,5). 九九掛算(3,6,1,8). 九九掛算(3,7,2,1). 九九掛算(3,8,2,4). 九九掛算(3,9,2,7). 九九掛算(4,0,0,0). 九九掛算(4,1,0,4). 九九掛算(4,2,0,8). 九九掛算(4,3,1,2). 九九掛算(4,4,1,6). 九九掛算(4,5,2,0). 九九掛算(4,6,2,4). 九九掛算(4,7,2,8). 九九掛算(4,8,3,2). 九九掛算(4,9,3,6). 九九掛算(5,0,0,0). 九九掛算(5,1,0,5). 九九掛算(5,2,1,0). 九九掛算(5,3,1,5). 九九掛算(5,4,2,0). 九九掛算(5,5,2,5). 九九掛算(5,6,3,0). 九九掛算(5,7,3,5). 九九掛算(5,8,4,0). 九九掛算(5,9,4,5). 九九掛算(6,0,0,0). 九九掛算(6,1,0,6). 九九掛算(6,2,1,2). 九九掛算(6,3,1,8). 九九掛算(6,4,2,4). 九九掛算(6,5,3,0). 九九掛算(6,6,3,6). 九九掛算(6,7,4,2). 九九掛算(6,8,4,8). 九九掛算(6,9,5,4). 九九掛算(7,0,0,0). 九九掛算(7,1,0,7). 九九掛算(7,2,1,4). 九九掛算(7,3,2,1). 九九掛算(7,4,2,8). 九九掛算(7,5,3,5). 九九掛算(7,6,4,2). 九九掛算(7,7,4,9). 九九掛算(7,8,5,6). 九九掛算(7,9,6,3). 九九掛算(8,0,0,0). 九九掛算(8,1,0,8). 九九掛算(8,2,1,6). 九九掛算(8,3,2,4). 九九掛算(8,4,3,2). 九九掛算(8,5,4,0). 九九掛算(8,6,4,8). 九九掛算(8,7,5,6). 九九掛算(8,8,6,4). 九九掛算(8,9,7,2). 九九掛算(9,0,0,0). 九九掛算(9,1,0,9). 九九掛算(9,2,1,8). 九九掛算(9,3,2,7). 九九掛算(9,4,3,6). 九九掛算(9,5,4,5). 九九掛算(9,6,5,4). 九九掛算(9,7,6,3). 九九掛算(9,8,7,2). 九九掛算(9,9,8,1). % 以下のサイトは # # お題:100以下の自然数でふたつの素数の積で表せる数を昇順にすべて表示せよ。 # '100以下の自然数でふたつの素数の積で表せる数を昇順にすべて表示せよ。' :- '100までの素数をエラトステネスの篩で求める'(_100までの素数ならび), '100以下の自然数でふたつの素数の積で表せる数を'(_100までの素数ならび,_ふたつの素数の積で表せる数ならび), '昇順にすべて表示せよ。'(_ふたつの素数の積で表せる数ならび). '100以下の自然数でふたつの素数の積で表せる数を'(_100までの素数ならび,_ふたつの素数の積で表せる数ならび) :- findall(_100までの自然数,( '100以下の自然数で'(_100以下の自然数), ふたつの素数の積で表せる数(_100までの自然数,_100までの素数ならび)), _ふたつの素数の積で表せる数ならび). '100以下の自然数で'(_100以下の自然数) :- between(1,100,_100以下の自然数). ふたつの素数の積で表せる数(_100以下の自然数,_100までの素数ならび) :- 組合せ(_100までの素数ならび,2,[_素数_1,_素数_2]), _100以下の自然数 is _素数_1 * _素数_2,!. '昇順にすべて表示せよ。'(_ふたつの素数の積で表せる数ならび) :- sort(_ふたつの素数の積で表せる数ならび,_整列したふたつの素数の積で表せる数ならび), atomic_list_concat(_整列したふたつの素数の積で表せる数ならび,' ',_表示文字列), writef('%t\n',[_表示文字列]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '100までの素数をエラトステネスの篩で求める'(_100までの素数ならび) :- findall(N,between(2,100,N),L), エラトステネスの篩(L,_100までの素数ならび). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). 組合せ(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). % 以下のサイトは 苗字を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). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/777 # # [1] 授業単元:標準入力から N を入力し、N 個のサイコロの出目の和の確率の一覧を作成せよ。 # [2] 問題文:確率は小数三位を四捨五入すること。 # N = 2 # 1 : 0.00% # 2 : 2.78% # 3 : 5.56% # 4 : 8.33% # 5 : 11.11% # 6 : 13.89% # 7 : 16.17% # 8 : 13.89% # 9 : 11.11% # 10 : 8.33% # 11 : 5.56% # 12 : 2.78% # [3.3] 言語:C # [4] 期限:2013-08-04 22:00 # # '標準入力から N を入力し、N 個のサイコロの出目の和の確率の一覧を作成せよ。 確率は小数三位を四捨五入すること。' :- '標準入力から N を入力し、'(_N), 'N 個のサイコロの出目の和の確率の一覧を作成せよ。確率は小数三位を四捨五入すること。'(_N). '標準入力から N を入力し、'(_N) :- 整数を得る('サイコロの個数を入力してください',_N > 0,_N). 'N 個のサイコロの出目の和の確率の一覧を作成せよ。確率は小数三位を四捨五入すること。'(_N) :- 'N 個のサイコロの出目の和'(_N,_N_6,_出目の和ならび), between(1,_N_6,_M), 'サイコロの出目の和の確率を表示する。確率は小数三位を四捨五入すること。'(_出目の和ならび,_M,_N_6,_確率), '表示する。確率は小数三位を四捨五入すること。'(_M,_確率), _M = _N. 'N 個のサイコロの出目の和'(_N,_N_6,_出目の和ならび) :- _N_6 is 6 * _N, findall(Sum,( 重複順列([1,2,3,4,5,6],_N,L), sum(L,Sum)), _出目の和ならび). 'サイコロの出目の和の確率。確率は小数三位を四捨五入すること。'(_出目の和ならび,_出目の和,_N_6,_確率) :- count(member(_出目の和,_出目の和ならび),Count), _確率 is ((Count / _N_6) * 1000 + 5) / 1000. '表示する。確率は小数三位を四捨五入すること。'(_M,_確率) :- writef('%t : ',[_M]), format('~2f%\n',[_確率]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/767 # # どなたか助けてください。困ってます。 # [1] 授業単元: 課題 # [2] 問題文: テキストファイル test.txtを呼び出し、平滑化したデータを # 違うファイルtest1.txtに出力しなさい。 # 'テキストファイル test.txtを呼び出し、平滑化したデータを違うファイルtest1.txtに出力しなさい。' :- 'テキストファイル test.txtを呼び出し、平滑化したデータを'(_平滑化したデータならび), '違うファイルtest1.txtに出力しなさい。'(_平滑化したデータならび). 'テキストファイル test.txtを呼び出し、平滑化したデータを'(_平滑化したデータならび) :- 'テキストファイル test.txtを呼び出し、'(_データならび), 平滑化したデータを'(_データならび,_平滑化したデータならび). 'テキストファイル test.txtを呼び出し、'(_データならび) :- get_chars('test.txt',Chars), atom_chars(Atom,Chars), split(Atom,[' ','\n','\t'],_データならび). 平滑化したデータを(_データならび,_平滑化したデータならび). 'テキストファイル test.txtを呼び出し、'(_データならび) :- get_chars('test.txt',Chars), atom_chars(Atom,Chars), split(Atom,[' ','\n','\t'],_データならび). 平滑化したデータを(_データならび,_平滑化したデータならび) :- 単純移動平均(_データならび,_平滑化したデータならび). 単純移動平均(_データならび,_平滑化したデータならび) :- length(L2,25), findall(_相加平均,( append(L1,L2,L3,_データならび), 相加平均(L2,_相加平均)), _平滑化したデータならび). '違うファイルtest1.txtに出力しなさい。'(_平滑化したデータならび) :- open('test1.txt',write,Outstream), '違うファイルtest1.txtに出力しなさい。'(Outstream,_平滑化したデータならび), close(Outstream). '違うファイルtest1.txtに出力しなさい。'(Outstream,[]). '違うファイルtest1.txtに出力しなさい。'(Outstream,[V|R]) :- writef('%t ',[V]), '違うファイルtest1.txtに出力しなさい。'(Outstream,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/751 # # (sum, kosu)に対して、 # sum = a1 + ・・・  + an ( n <= kosu , 1 <= ai <= 4 ) # を満たす、数列 (a1,・・・ ,an)は何通りあるか? # # '(sum, kosu)に対して、sum = a1 + ・・・  + an ( n <= kosu , 1 <= ai <= 4 ) を満たす、数列 (a1,・・・ ,an)は何通りあるか? '(_sum,_kosu,_何通り) :- findall(_n,between(1,_n,_kosu),_1からの_kosuまでの整数ならび), count('(sum, kosu)に対して、sum = a1 + ・・・  + an ( n <= kosu , 1 <= ai <= 4 ) を満たす、数列 (a1,・・・ ,an)'(_1からの_kosuまでの整数ならび,_sum,_kosu,L),_何通り). '(sum, kosu)に対して、sum = a1 + ・・・  + an ( n <= kosu , 1 <= ai <= 4 ) を満たす、数列 (a1,・・・ ,an)'(_1からの_kosuまでの整数ならび,_sum,_kosu,L) :- between(1,_n,_kosu), 組み合わせ(_1からの_kosuまでの整数ならび,_n,L), sum(L,_sum). % 以下のサイトは # # キーボードからNを入力し、Sum = 1の4乗 + 2の4乗 + ... + Nの4乗 を表示しなさい # 'キーボードからNを入力し、Sum = 1の4乗 + 2の4乗 + ... + Nの4乗 を表示しなさい' :- 'キーボードからNを入力し、'(_N), 'Sum = 1の4乗 + 2の4乗 + ... + Nの4乗 を表示しなさい'(_N). 'キーボードからNを入力し、'(_N) :- 整数を得る('N',_N > 2,_N). 'Sum = 1の4乗 + 2の4乗 + ... + Nの4乗 を計算して、表示しなさい'(_N) :- 'Sum = 1の4乗 + 2の4乗 + ... + Nの4乗 を計算して、'(_N,_式表示文字列,_Sum), 表示しなさい(_Sum,_式表示文字列). 'Sum = 1の4乗 + 2の4乗 + ... + Nの4乗 を計算して、'(_N,_式表示文字列,_Sum) :- '1の4乗 + 2の4乗 + ... + Nの4乗 を'(_N,_式文字列,_式表示文字列), 計算して(_式文字列,_Sum). '1の4乗 + 2の4乗 + ... + Nの4乗 を'(_N,_式文字列,_式表示文字列) :- findall([_4乗項文字列,_4乗表示文字列],( between(1,_M,_N), atomic_list_concat([_M,の4乗],_4乗表示文字列), atomic_list_concat([_M,' ^ ',4],_4乗項文字列)), LL), 式文字列と式表示文字列を分離(LL,_式文字列,_式表示文字列). 式文字列と式表示文字列を分離(LL,_式文字列,_式表示文字列) :- 転置(LL,[L1,L2]), atomic_list_concat(L1,' + ',_式文字列), atomic_list_concat(L2,' + ',_式表示文字列). 計算して(_式文字列,_Sum) :- atom_to_term(_式文字列,_式,_), _Sum is _式. 表示しなさい(_Sum,_式表示文字列) :- writef('%t = %t\n',[_Sum,_式文字列]). % 以下のサイトは # # キーボードからNを入力し、Sum = 14 + 24 + ... + N4 を表示しなさい # 'キーボードからNを入力し、Sum = 14 + 24 + ... + N4 を表示しなさい' :- 'キーボードからNを入力し、'(_N), 'Sum = 14 + 24 + ... + N4 を表示しなさい'(_N). 'キーボードからNを入力し、'(_N) :- 整数を得る('N',_N > 2,_N). 'Sum = 14 + 24 + ... + N4 を計算して、表示しなさい'(_N) :- 'Sum = 14 + 24 + ... + N4 を計算して、'(_N,_式文字列,_Sum), 表示しなさい(_Sum,_式文字列). 'Sum = 14 + 24 + ... + N4 を計算して、'(_N,_式文字列,_Sum) :- '14 + 24 + ... + N4 を'(_N,_式文字列), 計算して(_式文字列,_Sum). '14 + 24 + ... + N4 を'(_N,_式文字列) :- findall(_計算の対象となる整数,( between(1,_M,_N), _計算の対象となる整数 is 10 * _M + 4), _計算の対象となる整数ならび), atomic_list_concat(_計算の対象となる整数ならび,' + ',_式文字列). 計算して(_式文字列,_Sum) :- atom_to_term(_式文字列,_式,_), _Sum is _式. 表示しなさい(_Sum,_式文字列) :- writef('%t = %t\n',[_Sum,_式文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/744 # # [1] 授業単元:プログラミング実習 # [2] 問題文(含コード&amp;リンク): # 次の式を計算するプログラムを作れ。 # Sum = 14 + 24 + ... + N4 # (注意) ・ Nの値は、キーボードから入力できるようにすること。 #     ・scanfではなくgetcharを用いること # '次の式を計算するプログラムを作れ Sum = 14 + 24 + ... + N4 (注意) ・ Nの値は、キーボードから入力できるようにすること。     ・scanfではなくgetcharを用いること' :- 'Nの値は、キーボードから入力できるようにすること。・scanfではなくgetcharを用いること'(_N), 'Sum = 14 + 24 + ... + N4 の式を'(_N,L), 計算する(L,Sum), atomic_list_concat(L,' + ',S1), write('%t = %t\n',[Sum,S1]). 'Nの値は、キーボードから入力できるようにすること。・scanfではなくgetcharを用いること'(_N) :- write('整数N[3-9]を入力して下さい : '), get_line(Line), '診断 : Nの値はキーボードから入力'(Line,_N),!. 'Nの値は、キーボードから入力できるようにすること。・scanfではなくgetcharを用いること'(_N) :- 'Nの値は、キーボードから入力できるようにすること。・scanfではなくgetcharを用いること'(_N). '診断 : Nの値はキーボードから入力'(Line,_N) :- atom_number(Line,_N), integer(_N), _N > 2,!. '診断 : Nの値はキーボードから入力'(Line,_N) :- writef('入力された値%tは3以上9以下の整数ではありません。再入力をお願いします。\n',[Line]), fail. 'Sum = 14 + 24 + ... + N4 の式を'(_N,L) :- findall(_m_1,( between(1,_m,_N), _m_1 is _m * 10 + 4), L). 計算する(L,Sum) :- sum(L,Sum). sum([],0). sum([N|R],Sum) :- sum(R,Sum_1), Sum is Sum_1 + N. % 以下のサイトは '差集合 A-B とは、Aの要素からBの要素を取り去った集合である'(A,B,_差集合) :- findall(_要素, 'Aの要素がBの要素ではない'(A,B,_要素), _差集合). 'Aの要素がBの要素ではない'(A,B,_要素) :- member(_要素,A), \+(member(_要素,B)). % 以下のサイトは 最大部分列和(_数値ならび,_最大部分列和,_最大部分列) :- length(_数値ならび,_長さ), '全ての部分列・部分列和を得る'(_数値ならび,_長さ,_全ての部分列_部分列和), 全ての部分列和から最大部分列和とその部分列を選別する(_全ての部分列和,_最大部分列和,_最大部分列). '全ての部分列・部分列和を得る'(_数値ならび,_長さ,_全ての部分列_部分列和) :- findall([_部分列,_合計],( between(1,_長さ,_n), 組み合わせ(_数値ならび,_n,_部分列), sum(_部分列,_合計)), _全ての部分列_部分列和). 全ての部分列和から最大部分列和とその部分列を選別する(LL,_最大部分列和,_最大部分列) :- LL = [[_部分列_1,_合計_1]|R], 最大部分列_部分列和(R,_合計_1,[_部分列_1],_最大部分列和,_最大部分列). 最大部分列_部分列和([],_最大部分列和,_最大部分列,_最大部分列和,_最大部分列). 最大部分列_部分列和([[_部分列,_合計]|R],_合計,LL_1,_最大部分列和,_最大部分列) :- 最大部分列_部分列和(R,_合計,[_部分列|LL_1],_最大部分列和,_最大部分列). 最大部分列_部分列和([[_部分列,_合計]|R],_合計_1,LL_1,_最大部分列和,_最大部分列) :- _合計 > _合計_1, 最大部分列_部分列和(R,_合計,[_部分列],_最大部分列和,_最大部分列). 最大部分列_部分列和([[_部分列,_合計]|R],_合計_1,LL_1,_最大部分列和,_最大部分列) :- _合計 < _合計_1, 最大部分列_部分列和(R,_合計_1,LL_1,_最大部分列和,_最大部分列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/329 # # [1] 授業単元:ソート # [2] 問題文(含コード&amp;リンク): # # 次の条件を満たす関数を作ってください。 # # 第1引数はint型の配列。 # 第2引数はint型で第1引数の配列の要素数。 # 第3引数はint型の値。 # # 配列内の要素を並び替えて、第3引数の値より小さなものが配列の最初の方に位置するようにし、 # その次に第3引数の値と同じものが位置するようにし、その次に第3引数の値より大きなものが位置するように # してください。 # # 戻り値は、第3引数の値より小さなもののうち最も後方のインデックスをstruct Pairのfirstにセットし、 # 第3引数の値と同じもののうち、最も後方のインデックスをstruct Pairのsecondにセットして # struct Pair型の値を返してください。 # # struct Pair { # int first; # int second; # }; # # できるだけ速く処理できるよう実装を工夫してください。 # # '次の条件を満たす関数を作ってください。 第1引数はint型の配列。 第2引数はint型で第1引数の配列の要素数。 第3引数はint型の値。 配列内の要素を並び替えて、第3引数の値より小さなものが配列の最初の方に位置するようにし、 その次に第3引数の値と同じものが位置するようにし、その次に第3引数の値より大きなものが位置するように してください。 戻り値は、第3引数の値より小さなもののうち最も後方のインデックスをstruct Pairのfirstにセットし、 第3引数の値と同じもののうち、最も後方のインデックスをstruct Pairのsecondにセットして struct Pair型の値を返してください。 '(_ならび,_要素数,_第3引数の値,_第3引数の値より小さなもののうち最も後方のインデックス,_第3引数の値と同じのもののうち最も後方のインデックス) :- findall(_nth1,( nth1(_nth,_ならび,A), A @< _第3引数の値), L1), findall(_第3引数の値,( nth1(_nth1,_ならび,_第3引数の値)), L2), findall(A,( nth1(_nth1,_ならび,A), A @> _第3引数の値), L3), append(L1,L2,L3,_並び替えたならび), last(L1,_第3引数の値より小さなもののうち最も後方のインデックス), last(L2,_第3引数の値と同じのもののうち最も後方のインデックス), % 以下のサイトは ある文字数以上の単語をすべて抽出する(_ある文字数以上の単語ならび) :- 形態素解析(_文字列,_形態素ならび), findall(_ある文字数以上の単語,( member(_ある文字数以上の単語,_形態素ならび), atom_length(_ある文字数以上の単語,_文字数), _文字数 >= _ある文字数), _ある文字数以上の単語ならび). 形態素解析(S,L) :- tmpnam(F), tell(F), writef('%t',[S]), told, 形態素解析サーバによる形態素解析(ファイル,F,L) . 形態素解析サーバによる形態素解析(_ファイル名,_形態素ならび) :- 形態素解析サーバー(_形態素解析サーバー), atomic_list_concat(['cat ',_ファイル名,' | ',_形態素解析サーバー],S), sh(S,L1), 形態素解析(L1,L2), 形態素解析_3(L2,L). 形態素解析_1([],[]) :- !. 形態素解析_1([['EOS'|_]|_],[]) :- !. 形態素解析_1([[A|_],[@,B|_]|R],[R1_1|R3]) :- 形態素解析_2(R,R1,R2), 形態素解析_2_重複削除([A,B|R1],[],R1_1), 形態素解析_1(R2,R3),!. 形態素解析_1([[A|_]|R],[B|R2]) :- mecabサーバーによる形態素解析(A,B,R,R2),!. 形態素解析_1([[A|_]|R],[A|R2]) :- jumanサーバーによる形態素解析(A,B,R,R2). mecabサーバーによる形態素解析(A,B,R,R2) :- 形態素解析サーバー(mecab), split(A,['\t'],AL), AL = [B|_], 形態素解析_1(R,R2),!. jumanサーバーによる形態素解析(A,B,R,R2) :- 形態素解析サーバー(juman), 形態素解析_1(R,R2),!. 形態素解析_2([],[],[]) :- !. 形態素解析_2([[A|R1]|R],[],[[A|R1]|R]) :- \+(A = (@)),!. 形態素解析_2([[@,A|_]|R],[A|R2],R3) :- 形態素解析_2(R,R2,R3),!. 形態素解析_3([],[]). 形態素解析_3([A|R],[A|R2]) :- \+(list(A)), '形態素解析_3(R,R2) . 形態素解析_3([A|R],[B|R2]) :- list(A), member(B,A), 形態素解析_3(R,R2) . 形態素解析_2_重複削除([],L1,L) :- reverse(L1,L),!. 形態素解析_2_重複削除([A|R],Y,X) :- member(A,Y), 形態素解析_2_重複削除(R,Y,X),!. 形態素解析_2_重複削除([A|R],Y,X) :- \+(member(A,Y)), 形態素解析_2_重複削除(R,[A|Y],X) . sh(Command,X) :- shs(Command,Y), findall(U,( member(V,Y), split(V,[' ',','],U)), X). shs(Command,X) :- popen(Command,L), shs_3(L,X). shs_3(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_3(R1,R). shs_3([],[]) :- !. shs_3(L,[S]) :- atom_chars(S,L). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). % 以下のサイトは # 例題の1つに、すべての製品を注文したすべての顧客の平均の売掛残高、および # すべての製品を注文していない顧客の平均の売掛残高を求めるといったものがありました。 % 単位節データベースを抽象するならば、 すべての製品を注文したすべての顧客の平均の売掛残高を求める(_すべての製品を注文したすべての顧客の平均の売掛残高) :- findavg(_売掛残高,( すべての製品を注文した顧客の売掛残高(_売掛残高)), _すべての製品を注文したすべての顧客の平均の売掛残高). すべての製品を注文した顧客の売掛残高(_売掛残高) :- すべての製品を注文した顧客(_顧客), 売掛残高(_顧客,_売掛残高). すべての製品を注文した顧客(_顧客) :- 顧客(_顧客), forall(商品(_商品),注文(_顧客,_商品)). findavg(_選択,_目標,_平均値) :- findall(_選択,_目標,L), sum_list(L,_合計), length(L,_標本数), _平均値 is _合計 / _標本数. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/321 # # 総当りをする関数を作成して下さい # # VC++2010 # Windows Vista Home SP2 # # 例 # 第1引数 総当りの初めの文字 # 第2引数 総当りの最後の文字 # 第3引数 総当りする桁数 # func('a', 'z', 3); # とした時の動作は # aaa〜zzz、aa〜zz、a〜z # の全てを出力するようにしたいです # # よろしくお願いします # # 総当り(_総当りの初めの文字,_総当りの最後の文字,_総当りする桁数,_総当り) :- 文字ならびを確定する(_総当りの初めの文字,_総当りの最後の文字,_文字ならび), 総当り(_総当りする桁数,_文字ならび,_総当り). 総当り(1,_文字ならび,_文字ならび). 総当り(_桁数,_文字ならび,_総当り) :- _桁数 > 1, _桁数_1 is _桁数 - 1, 総当り(_桁数_1,_文字ならび,_総当り_2), 総当り_2(_文字ならび,_総当り_2,_総当り). 総当り_2(_文字ならび,_総当り_2,_総当り) :- findall(_文字列,( member(_文字_1,_文字ならび), member(_文字列_2,_総当り_2), atom_concat(_文字_1,_文字列_2,_文字列)), _総当り_1), append(_総当り_1,_総当り_2,_総当り). 文字ならびを確定する(_総当りの初めの文字,_総当りの最後の文字,_文字ならび) :- char_code(_総当りの初めの文字,_総当りの初めの文字コード), char_code(_総当りの最後の文字,_総当りの最後の文字コード), findall(_文字,( between(_総当りの初めの文字コード,_総当りの最後の文字コード,_文字コード), char_code(_文字,_文字コード)), _文字ならび). % 以下のサイトは ダイクストラ法による最短距離探索(_出発点,_距離,_最短経路,_確定集合) :- _確定集合_1 = [[_出発点,0,[_出発点]]], 初期の未確定集合を得る(_出発点,_未確定集合), ダイクストラ法による最短距離探索(_確定集合_1,_未確定集合,_確定集合). 初期の未確定集合を得る(_出発点,_初期未確定集合) :- findsetof([_出発点,9999,[]],( 経路(_点,_,_), \+(_点 = _出発点)), _初期未確定集合). ダイクストラ法による最短距離探索(_確定集合,[],_確定集合). ダイクストラ法による最短距離探索([[_直前に確定した点,_距離,_経路]|R],_未確定集合_1,_確定集合) :- 直前に確定した点から全ての隣接点の未確定集合を更新する(_直前に確定した点,_距離,_経路,_未確定集合_1,_未確定集合_2), 未確定集合から最小距離点を抜き取る(_未確定集合_2,_最小距離点,_最小距離,_最小距離点の経路,_未確定集合_3), 確定集合に追加(_最小距離点,_最小距離,_最小経路点の経路,[[_直前に確定した点,_距離,_経路]|R],_確定集合_2), ダイクストラ法による最短距離探索(_確定集合_2,_未確定集合_3,_確定集合). 直前に確定した点から全ての隣接点の未確定集合を更新する(_直前に確定した点,_距離,_経路,_未確定集合_1,_未確定集合_2) :- findall([_隣接点,_距離], 隣接点を得る(_直前に確定した点,_未確定集合,_隣接点,_距離), LL), 直前に確定した点から全ての隣接点の未確定集合を更新する(_直前に確定した点,_距離,_経路,LL,_未確定集合_1,_未確定集合_2). 直前に確定した点から全ての隣接点の未確定集合を更新する(_直前に確定した点,_直前に確定した点までの距離,_直前に確定した点までの経路,[[_隣接点,_距離]|R],_未確定集合_1,_未確定集合_2) :- 未確定集合の更新(_直前に確定した点,_直前に確定した点までの距離,_直前に確定した点までの経路,_隣接点,_距離,_未確定集合_1,_未確定集合_3), 直前に確定した点から全ての隣接点の未確定集合を更新する(_直前に確定した点,_直前に確定した点までの距離,_直前に確定した点までの経路,R,_未確定集合_3,_未確定集合_2). 隣接点を得る(_直前に確定した点,_未確定集合,_隣接点,_距離) :- 経路(_直前に確定した点,_隣接点,_距離), member([_隣接点,_,_],_未確定集合). 未確定集合の更新(_直前に確定した点,_直前に確定した点までの距離,_直前に確定した点までの経路,_隣接点,_距離,_未確定集合_1,_未確定集合_2) :- _距離_2 is _直前に確定した点までの距離 + _距離, append(L1,[[_隣接点,_距離_1,_経路_1]|L2],_未確定集合_1), _距離_1 > _距離_2, append(L1,[[_隣接点,_距離_1,[_隣接点|_直前に確定した点までの経路]]|L2],_未確定集合_2),!. 未確定集合の更新(_,_,_,_,_,_未確定集合,_未確定集合). 未確定集合から最小距離点を抜き取る(_未確定集合_1,_最小距離点,_最小距離,_最小距離点の経路,_未確定集合_2) :- append(L1,[[_最小距離点,_最小距離,_最小距離の経路]|L2],_未確定集合_1), forall(member([_,_距離_1,_],L1),_距離_1 >= _最小距離), forall(member([_,_距離_2,_],L1),_距離_2 >= _最小距離), append(L1,L2,_未確定集合_2),!. 確定集合に追加(_点,_距離,_経路,_確定集合_1,[[_点,_距離,_経路]|_確定集合_1]). findsetof(A,B,L) :- findall(A,B,C), setof(A,member(A,C),L). % 以下のサイトは # # 文字列から数字列を検索する # 数字文字列を検索してその数値を得る(_文字列,_前文字列,_数字文字列,_後文字列,_数値) :- 数字文字列を検索して(_文字列,_前文字列,_数字文字列,_後文字列), その数値を得る(_数字文字列,_数値). 数字文字列を検索して(_文字列,_前文字列,_数字文字列,_後文字列) :- 数字文字列を検索する(_文字列,_前文字列,_数字文字列,_後文字列). その数値を得る(_数字文字列,_数値) :- atom_number(_数字文字列,_数値). 数字文字列を検索する(_文字列,_前文字列,_数字文字列,_後文字列) :- '前文字列・数字文字列・後文字列に分割'(_文字列,_前文字列,_数字文字列,_後文字列), 前文字列が空文字であるか前文字列の最後の文字が数字ではない(_前文字列), 後文字列が空文字であるか後文字列の最初の文字が数字ではない(_後文字列). '前文字列・数字文字列・後文字列に分割'(_文字列,_前文字列,_数字文字列,_後文字列) :- sub_atom(_文字列,_開始点,_長さ,_残り長さ,_数字文字列), _長さ > 0, 数字文字列である(_数字文字列), sub_atom(_文字列,0,_開始点,_,_前文字列), sub_atom(_文字列,_,_残り長さ,0,_後文字列). 前文字列が空文字であるか前文字列の最後の文字が数字ではない(''). 前文字列が空文字であるか前文字列の最後の文字が数字ではない(_前文字列) :- sub_atom(_前文字列,_,1,0,_文字), 符号とピリオドを含む数字ではない(_文字). 後文字列が空文字であるか後文字列の最初の文字が数字ではない(''). 後文字列が空文字であるか後文字列の最初の文字が数字ではない(_後文字列) :- sub_atom(_後文字列,0,1,_,_文字), 符号とピリオド含む数字ではない(_文字). 符号とピリオドを含む数字である('+'). 符号とピリオドを含む数字である('-'). 符号とピリオドを含む数字である('.'). 符号とピリオドを含む数字である(_文字) :- 数字である(_文字). 符号とピリオドを含む数字ではない(_文字) :- \+(符号とピリオドを含む数字である(_文字)). 数字である(_文字) :- _文字 @>= '0', _文字 @=< '9'. 数字ではない(_文字) :- \+(数字である(_文字)). 数字文字列である(_数字文字列) :- 'IEEE974等の浮動小数点数表示形式'(_数字文字列). 数字文字列である(_数字文字列) :- 全ての文字が数字である(_数字文字列), \+(数字列の禁則(_数字文字列)). 全ての文字が符号とピリオドを含む数字である(_数字文字列) :- forall(sub_atom(_数字文字列,_,1,_,_文字),符号とピリオドを含む数字である(_文字)). 全ての文字が数字である(_数字文字列) :- forall(sub_atom(_数字文字列,_,1,_,_文字),数字である(_文字)). 'IEEE974等の浮動小数点数表示形式'(_数字文字列) :- sub_atom(_数字文字列,S,2,R,_二文字), member(_二文字,['E+','E-','e+','e-']), 二文字は先頭または末尾にはこない(S,R), 前後文字列の形式が正しい(_数字文字列,S,R). 二文字は先頭または末尾にはこない(S,R) :- S > 0, R > 0. 前後文字列の形式が正しい(_数字文字列,S,R) :- sub_atom(_数字文字列,0,S,_,_数字文字列_1), sub_atom(_数字文字列,_,S,0,_数字文字列_2), 全ての文字が符号とピリオドを含む数字である(_数字文字列_1), 全ての文字が数字である(_数字文字列_2). 数字列の禁則(_数字文字列) :- ピリオドが2個以上ある(_数字文字列),!. 数字列の禁則(_数字文字列) :- ピリオドが先頭文字か末尾文字にある(_数字文字列),!. 数字列の禁則(_数字文字列) :- 'ピリオドの前後に+か-がある'(_数字文字列),!. 数字列の禁則(_数字文字列) :- '+が先頭文字以外にある'(_数字文字列),!. 数字列の禁則(_数字文字列) :- '-が先頭文字以外にある'(_数字文字列),!. ピリオドが2個以上ある(_数字文字列) :- findall(1,sub_atom(_数字文字列,_,1,_,'.'),L), length(L,_度数), _度数 > 1,!. ピリオドが先頭文字か末尾文字にある(_数字文字列) :- sub_atom(_数字文字列,0,1,_,'.'),!. ピリオドが先頭文字か末尾文字にある(_数字文字列) :- sub_atom(_数字文字列,_,1,0,'.'),!. 'ピリオドの前後に+か-がある'(_数字文字列) :- sub_atom(_数字文字列,_,2,_,'+.'),!. 'ピリオドの前後に+か-がある'(_数字文字列) :- sub_atom(_数字文字列,_,2,_,'-.'),!. 'ピリオドの前後に+か-がある'(_数字文字列) :- sub_atom(_数字文字列,_,2,_,'.+'),!. 'ピリオドの前後に+か-がある'(_数字文字列) :- sub_atom(_数字文字列,_,2,_,'.-'),!. '+が先頭文字以外にある'(_数字文字列) :- sub_atom(_数字文字列,_開始点,1,_,'+'), _開始点 > 0,!. '-が先頭文字以外にある'(_数字文字列) :- sub_atom(_数字文字列,_開始点,1,_,'-'), _開始点 > 0,!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370620300/140 # # [1] 授業数学の問題をC言語で解く # [2] 問題 # 整数xを0から100000までの整数として,xが3つの素数の和で表現できるなら # その三素数を出力するプログラムを作成せよ。複数組み合わせの場合最初に # 見つけたものを出力せよ。 # [3.1] 7 # [3.2] gcc # [3.3] C # [4] 期限:28日9:00 # [5] その他制限: 純粋Cライブラリ。 # # 差が6となる素数ペアをリストアップする(L) :- 整数を得る(整数x,_x), findall([_素数_1,_素数_2],( 二つの素数の差が6となる(_x,_素数_1,_素数_2)), L). 二つの素数の差が6となる(_x,_素数_1,_素数_2) :- findall(N,between(2,_x,N),_2から_xまでの整数ならび), エラトステネスの篩(_2から_xまでの整数ならび,_2から高々_xまでの素数ならび), 組合せ(_2から高々_xまでの素数ならび,2,[_素数_1,_素数_2]), 6 is abs(_素数_1 - _素数_2). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). 組合せ(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). % 整数を得る/2 % % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/889 # # [1] 授業数学の問題をC言語で解く # [2] 問題 # 整数xを0から100000までの整数として,xが3つの素数の和で表現できるなら # その三素数を出力するプログラムを作成せよ。複数組み合わせの場合最初に # 見つけたものを出力せよ。 # [3.1] 7 # [3.2] gcc # [3.3] C # [4] 期限:28日9:00 # [5] その他制限: 純粋Cライブラリ。 # # '整数xを0から100000までの整数として,xが3つの素数の和で表現できるなら その三素数を出力するプログラムを作成せよ。 複数組み合わせの場合最初に見つけたものを出力せよ。'(_素数_1,_素数_2,_素数_3) :- 整数を得る(整数x,(_x >= 2,_x =< 100000),_x), findall([_素数_1,_素数_2,_素数3],( xが3つの素数の和で表現できる(_x,_素数_1,_素数_2,_素数_3)), _3つの素数のならび), 'その三素数を出力せよ。複数組み合わせの場合最初に見つけたものを出力せよ。'(_x,_3つの素数のならび). xが3つの素数の和で表現できる(_x,_素数_1,_素数_2,_素数_3) :- findall(N,between(2,_x,N),_2から_xまでの整数ならび), エラトステネスの篩(_2から_xまでの整数ならび,_2から高々_xまでの素数ならび), 組合せ(_2から高々_xまでの素数ならび,3,[_素数_1,_素数_2,_素数_3]), _x is _素数_1 + _素数_2 + _素数_3. 'その三素数を出力せよ。複数組み合わせの場合最初に見つけたものを出力せよ。'(_x,_3つの素数のならび) :- member([_素数_1,_素数_2,_素数_3],_3つの素数のならび), 'その三素数を出力せよ。'(_x,_素数_1,_素数_2,_素数_3),!. 'その三素数を出力せよ。'(_x,_素数_1,_素数_2,_素数_3) :- writef('%t+%t+%t = %t\n',[_素数_1,_素数_2,_素数_3,_x). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). 組合せ(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). % 整数を得る/3 % % 注意 % % ここでは、findall/3を用いて、xが3つの素数の和で表現できる/4の全解を % 一旦ならびに取得することによって、 % その後の出力述語を決定性にすることを可能にしている。 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/889 # # [1] 授業数学の問題をC言語で解く # [2] 問題 # 整数xを0から100000までの整数として,xが3つの素数の和で表現できるなら # その三素数を出力するプログラムを作成せよ。複数組み合わせの場合最初に # 見つけたものを出力せよ。 # [3.1] 7 # [3.2] gcc # [3.3] C # [4] 期限:28日9:00 # [5] その他制限: 純粋Cライブラリ。 # # '整数xを0から100000までの整数として,xが3つの素数の和で表現できるなら その三素数を出力するプログラムを作成せよ。 複数組み合わせの場合最初に見つけたものを出力せよ。'(_素数_1,_素数_2,_素数_3) :- 整数を得る(整数x,(_x >= 2,_x =< 100000),_x), xが3つの素数の和で表現できる(_x,_素数_1,_素数_2,_素数_3), 'その三素数を出力せよ。'(_x,_素数_1,_素数_2,_素数_3),!. xが3つの素数の和で表現できる(_x,_素数_1,_素数_2,_素数_3) :- findall(N,between(2,_x,N),_2から_xまでの整数ならび), エラトステネスの篩(_2から_xまでの整数ならび,_2から高々_xまでの素数ならび), 組合せ(_2から高々_xまでの素数ならび,3,[_素数_1,_素数_2,_素数_3]), _x is _素数_1 + _素数_2 + _素数_3. 'その三素数を出力せよ。'(_x,_素数_1,_素数_2,_素数_3) :- writef('%t+%t+%t = %t\n',[_素数_1,_素数_2,_素数_3,_x). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). 組合せ(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). % 整数を得る/3 % % % 注意 % % 「複数組み合わせの場合最初に見つけたものを出力せよ。」は述語定義できない。 % !(カット)を述語に置き換えることはできない。 % % 最初の述語の最後の ! が「複数組み合わせの場合最初に見つけたものを出力せよ。」の意味である。 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/119 # # [1] 授業単元:課題 # [2] 問題文(含コード&リンク): # 自然数 n の各桁の数を2乗しその和を求める。できた数値も同様に繰り返していき # 最終的に 1 収束するものを Happy number と呼ぶ。 # # 28…〇 # 2^2 + 8^2 = 68 # 6^2 + 8^2 = 100 # 1^2 + 0^2 + 0^2 = 1 # # 89…× # 8^2 + 9^2 = 145 # 1^2 + 4^2 + 5^2 = 42 # 4^2 + 2^2 = 20 # 2^2 + 0^2 = 4 # # 1 <= n <= 10000 とした時の全ての Happy number を列挙せよ。 # '自然数 n の各桁の数を2乗しその和を求める。できた数値も同様に繰り返していき 最終的に 1 収束するものを Happy number と呼ぶ。 28…〇 2^2 + 8^2 = 68 6^2 + 8^2 = 100 1^2 + 0^2 + 0^2 = 1 89…× 8^2 + 9^2 = 145 1^2 + 4^2 + 5^2 = 42 4^2 + 2^2 = 20 2^2 + 0^2 = 4 1 <= n <= 10000 とした時の全ての Happy number を列挙せよ。'(_Happy_numberならび) :- '1 <= n <= 10000 とした時の全ての Happy number を列挙せよ。'(_Happy_numberならび). '1 <= n <= 10000 とした時の全ての Happy number を列挙せよ。'(_Happy_numberならび) :- findall(_n,( between(1,1000,_n), 'Happy number'(_n)), _Happy_numberならび). 'Happy number'(_n) :- '自然数 n の各桁の数を2乗しその和を求める。できた数値も同様に繰り返していき最終的に 1 収束するものを Happy number と呼ぶ。'(_n,[]). '自然数 n の各桁の数を2乗しその和を求める。できた数値も同様に繰り返していき最終的に 1 収束するものを Happy number と呼ぶ。'(1,_) :- !. '自然数 n の各桁の数を2乗しその和を求める。できた数値も同様に繰り返していき最終的に 1 収束するものを Happy number と呼ぶ。'(_n,L) :- \+(member(_n,L)), '自然数 n の各桁の数を2乗しその和を求める。'(_n,0,_各桁の数の2乗の和), '自然数 n の各桁の数を2乗しその和を求める。できた数値も同様に繰り返していき最終的に 1 収束するものを Happy number と呼ぶ。'(_各桁の数の2乗の和,[_n|L]). '自然数 n の各桁の数を2乗しその和を求める。'(0,_各桁の数の2乗の和,_各桁の数の2乗の和) :- !. '自然数 n の各桁の数を2乗しその和を求める。'(_n,_s_1,_各桁の数の2乗の和) :- _n_1 is _n mod 10, _n_2 is _n // 10, _s_2 is _s_1 + (_n_1 * _n_1), '自然数 n の各桁の数を2乗しその和を求める。'(_n_2,_s_2,_各桁の数の2乗の和). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/959 # # 質問させてください # # アマゾンとかでよくある商品の評価ポイントを集計するクエリを作りたいです # アマゾンと少し違うのは、商品そのものの評価ポイントではなく、 # 商品を登録した出品者くくりでの、「その出品者が出品した全ての商品の評価ポイント」の平均値をとることです # # まとめると、 # ・特定の出品者の出品した商品の評価ポイントの平均値をとる # ・同時に、レビューの件数をとる # ・判明してるキーはt_prof.keyのみです # # テーブルは以下の通り。 # # レビューtable =t_review # =============================== # reviewId -- int(11) :プライマリキー、auto_increment # workId -- int(11) :商品のID # userId -- int(11) :出品者のID # point -- tinyInt(1):評価ポイント(1〜5) # # 出品者プロフィールtable =t_prof # =============================== # userId -- int(11) :プライマリキー、auto_increment # namae -- text :出品者の名前 # key -- int(3):キー。ユニーク # # どんなクエリを書いたらいいんでしょうか # すみません、よろしくお願いします # 'アマゾンとかでよくある商品の評価ポイントを集計するクエリを作りたいです アマゾンと少し違うのは、商品そのものの評価ポイントではなく、 商品を登録した出品者くくりでの、「その出品者が出品した全ての商品の評価ポイント」の平均値をとることです まとめると、 ・特定の出品者の出品した商品の評価ポイントの平均値をとる ・同時に、レビューの件数をとる ・判明してるキーはt_prof.keyのみです テーブルは以下の通り。 レビューtable =t_review =============================== reviewId -- int(11) :プライマリキー、auto_increment workId -- int(11) :商品のID userId -- int(11) :出品者のID point -- tinyInt(1):評価ポイント(1〜5) 出品者プロフィールtable =t_prof =============================== userId -- int(11) :プライマリキー、auto_increment namae -- text :出品者の名前 key -- int(3):キー。ユニーク どんなクエリを書いたらいいんでしょうか すみません、よろしくお願いします'(_商品のID,_出品者のID,_出品者の名前,_レビューの件数,_評価点の平均) :- '商品を登録した出品者くくりでの、「その出品者が出品した全ての商品の評価ポイント」の平均値をとる'(_商品のID,_出品者のID,_出品者の名前,_レビューの件数,_評価点の平均). '商品を登録した出品者くくりでの、「その出品者が出品した全ての商品の評価ポイント」の平均値をとる'(_商品のID,_出品者のID,_出品者の名前,_レビューの件数,_評価点の平均) :- 商品から出品者を得る(_商品のID,_出品者のID), レビューの件数と評価点の平均を得る(_商品のID,_レビューの件数,_評価点の平均), 出品者の名前を得る(_出品者のID,_出品者の名前). 商品から出品者を得る(_商品のID,_出品者のID) :- レビュー(_,_商品のID,_出品者のID,_). レビューの件数と評価点の平均を得る(_出品者のID,_レビューの件数,_評価点の平均) :- findall(_評価点,( レビュー(_,_商品のID,_出品者のID,_評価点)), _評価点ならび), レビューの件数と評価点の平均を得る(_評価点ならび,_評価点の平均), length(_評価点ならび,_レビューの件数), 相加平均(_評価点ならび,_評価点の平均). 出品者の名前を得る(_出品者のID,_出品者の名前) :- 出品者プロフィール(_,_出品者の名前,_出品者のID). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/35 # # 【質問テンプレ】 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):標準入力から正の数Xを入力し、1からXまでの整数のうち、素数だけを出力するプログラムを作成し、実行せよ。 # 実行時にはX = 50となるように数字を入力する。 # '標準入力から正の数Xを入力し、1からXまでの整数のうち、素数だけを出力するプログラムを作成し、実行せよ。 実行時にはX = 50となるように数字を入力する。' :- 標準入力から正の数Xを入力し(X), '1からXまでの整数のうち、素数だけを出力する'(X). 標準入力から正の数Xを入力し(X) :- 整数を得る(正の整数X,X > 0,X). '1からXまでの整数のうち、素数だけを出力する'(X) :- 素数だけ選別する(X,_素数ならび), '1からXまでの整数のうち'(_整数), 素数だけ出力する(_整数,_素数ならび), X = _整数. 素数だけ選別する(X,_素数ならび) :- '2からXまでのならび'(_2からXまでのならび), エラトステネスの篩(_2からXまでのならび,_素数ならび). '2からXまでのならび'(_2からXまでのならび) :- findall(N,between(2,X,N),_2からXまでのならび). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). '1からXまでの整数のうち'(_整数) :- between(1,X,_整数). 素数だけ出力する(_素数,_素数ならび) :- member(_素数,_素数ならび), writef('%t ',[_素数]),!. 素数だけ出力する(_,_). % 以下のサイトは # 出典:: http://stackoverflow.com/questions/17029097/prolog-creating-list-with-consecutive-numbers # # I'm newbie in Prolog and I've tried to create a list. # For example when I write mazeCreator(3,List). # I want to push every number like 1/1,1/2,1/3,2/1,2/2,2/3,3/1,3/2,3/3 in a list.To do this, # I wrote a predicate but It does not work, # Is there anyone who can help me ? Thanks in advance!. mazeCreater(M,L) :- findall(K/J,( between(1,M,J), between(1,M,K)), L). % 以下のサイトは 冪集合和(_対象集合,_冪集合和) :- findall(_部分集合和,( 部分集合和(_対象集合,_部分集合和)), _冪集合和). 部分集合和([], 0). 部分集合和([_|R1],_部分集合和) :- 部分集合和(R1,_部分集合和). 部分集合和([N|R1], _部分集合和) :- 部分集合和(R1,_部分集合和_2), _部分集合和 is _部分集合和_2 + N. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 冪集合和(_集合,_冪集合和) :- length(_集合,Len), findall(S,( between(1,Len,N), 組合せ和(_集合,N,L,S)), LS), _冪集合和 = [0|LS]. 組合せ和(X,1,[A],A) :- member(A,X). 組合せ和([A|Y],N,[A|X],S) :- N > 1, M is N - 1, 組合せ和(Y,M,X,S1), S is S1 + A. 組合せ和([_|Y],N,A,S) :- N > 1, 組合せ和(Y,N,A,S). % 以下のサイトは 冪集合(_対象集合,_冪集合) :- findall(_部分集合,( 部分集合(_対象集合,_部分集合)), _冪集合). 部分集合([], []). 部分集合([_|R1], LL) :- 部分集合(R1,LL). 部分集合([L|R1], [L|R2]) :- 部分集合(R1,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 冪集合(_集合,_冪集合) :- length(_集合,Len), findall(L,( between(1,Len,N), 組合せ(_集合,N,L)), _冪集合_0), _冪集合 = [[]|_冪集合_0]. 組合せ(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). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 以下のサイトは 隣接(1,2). 隣接(1,3). 隣接(2,4). 隣接(3,4). 色(赤). 色(青). 色(緑). 塗り分けならび(_塗り分けならび) :- findall(_塗り分けならび,塗り分け(_塗り分けならび),_塗り分けならび). 全色塗り分けならび(_塗り分けならび) :- findall(_塗り分けならび,全色塗り分け(_塗り分けならび),_塗り分けならび). 塗り分け(_塗り分けならび) :- 領域名と色の対ならび(_色ならび,_塗り分けならび), 色を割り振る(_色ならび,_塗り分けならび), 色検査(_塗り分けならび). 全色塗り分け(_塗り分けならび) :- 領域名と色の対ならび(_色ならび,_塗り分けならび), 色を割り振る(_色ならび,_塗り分けならび), forall(member(_色,_色ならび),member([_,_色],_塗り分けならび)), 色検査(_塗り分けならび). 領域名と色の対ならび(_色ならび,_塗り分けならび) :- 領域名ならび(_領域名ならび), 色ならび(_色ならび), 対ならびの形成(_領域名ならび,_色ならび,_塗り分けならび). 領域名ならび(_領域名ならび) :- findall(A,隣接(A,_),L1), findall(B,隣接(_,B),L2), append(L1,L2,L3), sort(L3,_領域名ならび). 色ならび(_色ならび) :- findall(_色,色(_色),_色ならび). 対ならびの形成(_領域名ならび,_色ならび,_塗り分けならび) :- length(_領域名ならび,Len), length(_塗り分けならび,Len), findall([_領域名,_色],( nth1(N,_領域名ならび,_領域名), nth1(N,_塗り分けならび,_色)), _塗り分けならび). 色を割り振る(_,[]). 色を割り振る(_色ならび,[[_,_色]|R]) :- member(_色,_色ならび), 色を割り振る(_色ならび,R). 色検査(_塗り分けならび) :- forall((member([A,C],_塗り分けならび),領域が隣接している(A,B)),\+(member([B,C],_塗り分けならび))). 領域が隣接している(A,A) :- 領域が孤立している,!,fail. 領域が隣接している(A,B) :- 隣接(A,B). 領域が孤立している. % 以下のサイトは 隣接(1,2). 隣接(1,3). 隣接(2,4). 隣接(3,4). 塗り分け(_色ならび,_塗り分けならび) :- 領域名ならび(_領域名ならび), length(_領域名ならび,Len), length(LL1,Len), findall(LL1,塗り分け(_領域名ならび,_色ならび,LL1),_塗り分けならび). 全色塗り分け(_色ならび,_塗り分けならび) :- 領域名ならび(_領域名ならび), length(_領域名ならび,Len), length(_塗り分けならび,Len), findall(_塗り分けならび,塗り分け(_領域名ならび,_色ならび,_塗り分けならび),_塗り分けならび). 塗り分け(_領域名ならび,_色ならび,_塗り分けならび) :- 領域名と色の対ならび(_領域名ならび,_色ならび,_塗り分けならび), 色を割り振る(_色ならび,_塗り分けならび), 色検査(_塗り分けならび). 全色塗り分け(_領域名ならび,_色ならび,_塗り分けならび) :- 領域名と色の対ならび(_領域名ならび,_色ならび,_塗り分けならび), 色を割り振る(_色ならび,_塗り分けならび), forall(member(_色,_色ならび),member([_,_色],_塗り分けならび)), 色検査(_塗り分けならび). 領域名ならび(_領域名ならび) :- findall(A,隣接(A,_),L1), findall(B,隣接(_,B),L2), append(L1,L2,L3), sort(L3,_領域名ならび). 領域名と色の対ならび(_領域名ならび,_色ならび,_塗り分けならび) :- findall([_領域名,_色],( nth1(N,_領域名ならび,_領域名), nth1(N,_塗り分けならび,_色)), _塗り分けならび). 色を割り振る(_,[]). 色を割り振る(_色ならび,[[_,_色]|R]) :- member(_色,_色ならび), 色を割り振る(_色ならび,R). 色検査(_塗り分けならび) :- forall((member([A,C],_塗り分けならび),隣接(A,B)),\+(member([B,C],_塗り分けならび))). % 以下のサイトは 隣接(1,2). 隣接(1,3). 隣接(2,4). 隣接(3,4). 塗り分け(_色ならび,_塗り分けならび) :- 領域名ならび(_領域名ならび), length(_領域名ならび,Len), length(LL1,Len), findall(LL1,塗り分け(_領域名ならび,_色ならび,LL1),_塗り分けならび). 全色塗り分け(_色ならび,_塗り分けならび) :- 領域名ならび(_領域名ならび), length(_領域名ならび,Len), length(LL1,Len), findall(LL1,塗り分け(_領域名ならび,_色ならび,LL1),_塗り分けならび). 塗り分け(_領域名ならび,_色ならび,LL) :- 領域名と色の対ならび(_領域名ならび,_色ならび,LL), 色を割り振る(_色ならび,LL), 色検査(LL). 全色塗り分け(_領域名ならび,_色ならび,LL) :- 領域名と色の対ならび(_領域名ならび,_色ならび,LL), 色を割り振る(_色ならび,LL), forall(member(_色,_色ならび),member([_,_色],LL)), 色検査(LL). 領域名ならび(_領域名ならび) :- findall(A,隣接(A,_),L1), findall(B,隣接(_,B),L2), append(L1,L2,L3), sort(L3,_領域名ならび). 領域名と色の対ならび(_領域名ならび,_色ならび,LL) :- findall([_領域名,_色],( nth1(N,_領域名ならび,_領域名), nth1(N,LL,_色)), LL). 色を割り振る(_,[]). 色を割り振る(_色ならび,[[_,_色]|R]) :- member(_色,_色ならび), 色を割り振る(_色ならび,R). 色検査(L) :- forall((member([A,C],L),隣接(A,B)),\+(member([B,C],L))). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/835 # # お願いします。 # [1] 授業単元:情報処理演習 # [2] 問題文:3 つの整数a, b, s を入力として, ax + by = s を満たす整数x, y を一組求めてそれらを表 # 示するプログラムを作成せよ. ただし, 望みの整数x, y が存在しないときは, その旨を表 # 示するようにすること. # '3 つの整数a, b, s を入力として, ax + by = s を満たす整数x, y を一組求めてそれらを表示するプログラムを作成せよ. ただし, 望みの整数x, y が存在しないときは, その旨を表示するようにすること.' :- '3 つの整数a, b, s を入力として'(_a,_b,_s), 'ax + by = s を満たす整数x, y を一組求めて'(_a,_b,_s,_x,_y), それらを表示する(_a,_b,_s,_x,_y),!. '3 つの整数a, b, s を入力として, ax + by = s を満たす整数x, y を一組求めてそれらを表示するプログラムを作成せよ. ただし, 望みの整数x, y が存在しないときは, その旨を表示するようにすること.'(_a,_b,_s) :- 'ただし、望みの整数x, y が存在しないときは, その旨を表示する'. '3 つの整数a, b, s を入力として'(_a,_b,_s) :- 整数を得る('ax+by=s のa',true,_a), 整数を得る('ax+by=s のb',true,_b), 整数を得る('ax+by=s のs',true,_s). 'ax + by = s を満たす整数x, y を一組求めて'(_a,_b,_s,_x,_y) :- _a_1 is _a * -1, _b_1 is _b * -1, for(_a_1,_x,_a), for(_b_1,_y,_b), _s is _a * _x + _b * _y. それらを表示する(_a,_b,_s,_x,_y) :- write(' ax + by = s\n'), writef('%t*%t + %t*%t = %t\n',[_a,_x,_b,_y,_s]). 'ただし, 望みの整数x, y が存在しないときは, その旨を表示する' :- writef('望みのx,yが存在しません。\n'). for(S,N,E) :- E >= S, for_2(S,N,E). for(S,N,E) :- E < S, for_1(S,N,E). for_1(S,_,E) :- S < E,!,fail. for_1(S,N,E) :- N is S. for_1(S,N,E) :- S1 is S - 1, for_1(S1,N,E). for_2(S,_,E) :- S > E,!,fail. for_2(S,N,E) :- N is S. for_2(S,N,E) :- S1 is S + 1, for_2(S1,N,E). 整数を得る(Instream,_催促文ならび,_整数を含む条件,_整数ならび) :- list(_催促文ならび), findall(_整数,( member(_催促文,_催促文ならび), 整数を得る(Instream,_催促文,_整数を含む条件,_整数)), _整数ならび),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 整数を得る'(Line,_整数を含む条件,_整数),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 整数を得る(Instream,_催促文,_整数を含む条件,_整数). '診断: 整数を得る'(end_of_file,_整数を含む条件,end_of_file) :- !. '診断: 整数を得る'('',_,_) :- !,fail. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), '診断: 整数を含む条件'(_整数,_整数を含む条件),!. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- \+((atom_to_term(Line,_整数,_),integer(_整数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]), fail. '診断: 整数を得る'(end_of_file,end_of_file) :- !. '診断: 整数を得る'('',_) :- !,fail. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- call(_整数を含む条件),!. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_整数,_整数を含む条件]), fail. 整数を得る(_催促文,_整数を含む条件,_整数) :- 整数を得る(user_input,_催促文,_整数を含む条件,_整数). 整数を得る(_催促文,_整数) :- 整数を得る(user_input,_催促文,true,_整数). 整数を得る(_整数) :- 整数を得る(user_input,'',true,_整数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). n個の整数を得る(_n,_催促文,_整数ならび) :- length(_整数ならび,_n), findall(_整数,( 部分ならび(_整数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 整数を得る(_催促文,_整数)), _整数ならび). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/827 # # [1] 授業単元:整数演算 # [2] 問題文(含コード&リンク):以下の問題に答えなさい # # 50 # Σ((3*i)/2) = A の計算式を計算できるプログラムを完成させなさい。 # i=0 # # :- op(300,xfx,(..)). '50 Σ((3*i)/2) = A の計算式を計算できるプログラムを完成させなさい。 i=0'(_A) :- 'Σ'([_k = 0 .. 50],((3 * _k) / 2),_A). 'Σ'([_k = A .. B],_式,_累計値) :- findsum(Y,( between(A,B,_k), Y is _式), _累計値). findsum(A,P,S) :- findall(A,P,L), sum(L,S). sum([],0). sum([A|R],S) :- sum(R,S2), S is S2 + A. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/821 # # [1] 授業数学の問題をC言語で解く # [2] 問題 # 整数xを0から100000までの整数として,xが3つの素数の和で表現できるなら # その三素数を出力するプログラムを作成せよ。複数組み合わせの場合最初に # 見つけたものを出力せよ。 # [3.1] 7 # [3.2] gcc # [3.3] C # [4] 期限:25日 # [5] その他制限: 純粋Cライブラリ。 # '整数xを0から100000までの整数として,xが3つの素数の和で表現できるならその三素数を出力するプログラムを作成せよ。複数組み合わせの場合最初に見つけたものを出力せよ。'(_x) :- findall(N,between(1,100000,N),L1), エラトステネスの篩(L1,_100000以下の素数ならび), 組合せ(_100000以下の素数ならび,3,[N1,N2,N3]), _x is N1 + N2 + N3, writef('%t,%t,%t\n',[N1,N2,N3]),!. 組合せ(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). % 以下のサイトは # 子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。 # このとき、考え得る階段の上がり方が何通りあるか求めるメソッドを実装してください。 '子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方が何通りあるか求める。'(_n,_何通り) :- length(Ln,_n), 度数('子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方。'([],Ln,L),_何通り). '子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方。'(L,L,[]). '子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方。'(_前回までに登った段,Ln,[_一歩で何段|_残りの段]) :- append(_前回までに登った段,[_|_],Ln), '一歩で1段、2段、もしくは3段を登ることができます'(_前回までに登った段,_一歩で何段,_登った段), '子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方。'(_登った段,Ln,_残りの段). '一歩で1段、2段、もしくは3段を登ることができます'(_前回までに登った段,_一歩で何段,_登った段) :- member(_一歩で何段,[[_],[_,_],[_,_,_]]), append(_前回までに登った段,_一歩で何段,_登った段). 度数(P,_度数) :- findall(1,P,L), length(L,_度数). % 以下のサイトは # 子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。 # このとき、考え得る階段の上がり方が何通りあるか求めるメソッドを実装してください。 '子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方が何通りあるか求める。'(_n,_何通り) :- 度数('子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方。'(0,_n,L),_何通り). '子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方。'(_n,_n,[]). '子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方。'(_前回までに登った段段,_n,[_一歩で何段|_残りの段]) :- _前回までに登った段 < _n, '一歩で1段、2段、もしくは3段を登ることができます'(_前回までに登った段,_一歩で何段,_登った段), '子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方。'(_登った段,_n,_残りの段). '一歩で1段、2段、もしくは3段を登ることができます'(_前回までに登った段,_一歩で何段,_登った段) :- member(_一歩で何段,[1,2,3]), _登った段 is _前回までに登った段 + _一歩で何段. 度数(P,_度数) :- findall(1,P,L), length(L,_度数). % 以下のサイトは '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/1364009659/344 # # uniq :: Eq a => [a] -> [a] # uniq [] = [] # uniq [x] = [x] # uniq (x1:xs@(x2:_)) # | x1 == x2 = uniq xs # | otherwise = x1 : uniq xs # 'uniq :: Eq a => [a] -> [a] uniq [] = [] uniq [x] = [x] uniq (x1:xs@(x2:_)) | x1 == x2 = uniq xs | otherwise = x1 : uniq xs'(L1,L2) :- uniq(L1,L2). uniq(L1,L2) :- findall(E,( append(_,[E|R],L1), \+(member(E,R))), L2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1232627790/958 # # 【 課題 】テキストファイルから文字列5行を読み込み、別のテキストへ右縦書きで書き出す # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】7/14 am6:00 # 【 Ver  】Eclipse Version: 3.4.2 # 【 補足 】 # あいう # かきく # さしす # 上記のようなテキストファイルを読み込み、 # さかあ # しきい # すくう # のように別のテキストファイルに書き出す感じです。 'テキストファイルから文字列5行を読み込み、別のテキストへ右縦書きで書き出す'(InFile,OutFile) :- テキストファイルから文字列5行を読み込み(Infile,_文字列5行), 別のテキストへ右縦書きで(_文字列5行,_右書き用に置換された文字列ならび), 書き出す(OutFile,_右書きように置換された文字列ならび), テキストファイルから文字列5行を読み込み(Infile,_文字列5行) :- open(InFile,read,Instream), findall(_行,( between(1,5,N), get_line(Instream,_行)), _文字列5行), close(InFile). 別のテキストへ右縦書きで(_文字列5行,_右書き用に置換された文字列ならび) :- findmax(_行の長さ,( member(_行,_文字列5行), atom_length(_行,_行の長さ), _最長文字数), 空白文字を付加して文字数一致させる(_最長文字数,_文字列5行,_空白文字を付加して矩形にした文字列5行), 右書き用に置換する(_空白文字を付加して矩形にした文字列5行,_右書き用に置換された文字列ならび). 右書き用に置換する(_空白文字を付加して矩形にした文字列5行,_右書き用に置換された文字列ならび) :- 行を反転しながら転置する(_空白文字を付加して矩形にした文字列5行,_右書き用に置換された文字列ならび). 行を反転しながら転置する(_空白文字を付加して矩形にした文字列5行,_右書き用に置換された文字列ならび) :- '一旦文字ならびに変換して、行を反転して転置する'(_空白文字を付加して矩形にした文字列5行,LL2), 文字列に戻す(LL2,_右書き用に置換された文字列ならび). '一旦文字ならびに変換して、行を反転して転置する'(_空白文字を付加して矩形にした文字列5行,LL2) :- findall(L,( member(_行,_空白文字を付加して矩形にした文字列5行), atom_chars(_行,Chars), reverse(Chars,L)), LL1), 転置(LL1,LL2). 文字列に戻す(LL2,_右書き用に置換された文字列ならび) :- findall(_文字列,( member(Chars,LL2), atom_chars(_文字列,Chars)), _右書き用に置換された文字列ならび). 空白文字を付加して文字数を一致させる(_最大文字数,_文字列5行,_空白を付加した文字列5行) :- findall(_空白を付加された文字列,( member(_文字列,_文字列5行), atom_length(_文字列,_文字列長さ), 空白文字を付加する(_最大文字数,_文字列の長さ,_文字列,_空白を付加された文字列)), _空白を付加された文字列5行). 空白文字を付加する(_最大文字数,_文字列の長さ,_文字列,_空白を付加された文字列) :- _空白文字数 is _最大文字数 - _文字列の長さ, findall(' ',between(1,_空白文字数,_),_空白文字ならび), atomic_list_concat([_文字列|_空白文字ならび],_空白を付加された文字列). 書き出す(OutFile,_右書き用に置換された文字列ならび) :- open(OutFile,write,Outstream), append(_,[_行|R],_右書き用に置換された文字列ならび), writef(Outstream,'%t\n',[_行]), R = [], close(Outstream). % % この符にはfindall/3だけで表現するという主題がある。 % % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/295 # # # お題 頂点座標から多角形の面積を求める # 頂点座標から多角形の面積を求める(_閉路をなす多角形の頂点座標ならび,_多角形の面積) :- '多角形の面積は iが1からnまで変化する範囲で Xi * (Yi+1 - Yi-1) の総計となる。(ただし Yn+1 = Y1 Y0 = Yn)'(_閉路をなす多角形の頂点座標ならび,_多角形の面積). '多角形の面積は iが1からnまで変化する範囲で Xi * (Yi+1 - Yi-1) の総計の半分となる。(ただし Yn+1 = Y1 Y0 = Yn)'(_閉路をなす多角形の頂点座標ならび,_多角形の面積) :- 'ただし Yn+1 = Y1 Y0 = Yn'(_閉路をなす多角形の頂点座標ならび,_拡張した座標ならび), '多角形の面積は iが1からnまで変化する範囲で Xi * (Yi+1 - Yi-1) の総計の半分となる。'(_拡張した座標ならび,_多角形の面積). '多角形の面積は iが1からnまで変化する範囲で Xi * (Yi+1 - Yi-1) の総計の半分となる。'(_拡張した座標ならび,_多角形の面積) :- findsum(U,( append(_,[(_x1,_y1),(_x2,_y2),(_x3,_y3)|_],_拡張した座標ならび), U is _x2 * (_y3 - _y1)), S), _多角形の面積 is S / 2. 'ただし Yn+1 = Y1 Y0 = Yn'([_0,_1|_残り座標ならび],_拡張した座標ならび) :- append([_0,_1|_残り座標ならび],[_0,_1],_拡張した座標ならび). findsum(U,P,Sum) :- findall(U,P,L), sum(L,Sum). sum([],0). sum([A|R],Sum) :- sum(R,Sum1), Sum is Sum1 + A. % 以下のサイトは # お題:表計算ソフトで使われる列名 A,B,C,...,Z,AA,AB,AC,...,AZ,BA,BB,BC,... # をAを1番目とした番号に変換せよ '表計算ソフトで使われる列名 A,B,C,...,Z,AA,AB,AC,...,AZ,BA,BB,BC,...をAを1番目とした番号に変換せよ'(_列名,_番号) :- '列名を文字順序番号ならびに変換'(_列名,_文字順序番号ならび), 文字順序番号ならびを連続番号に変換(_文字順序番号ならび,0,_番号). '列名を文字順序番号ならびに変換'(_列名,_文字順序番号ならび) :- findall(_文字順序番号,( sub_atom(_列名,_,1,_,_文字), 文字順序番号(_文字,_文字順序番号)), _文字順序番号ならび). 文字順序番号(_文字,_文字順序番号) :- nth1(_文字順序番号,['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'],_文字). 文字順序番号ならびを連続番号に変換([],_連続番号,_連続番号). 文字順序番号ならびを連続番号に変換([N|R],_番号_1,_連続番号) :- _番号_2 is _番号_1 * 26 + N, 文字順序番号ならびを連続番号に変換(R,_番号_2,_連続番号). % 以下のサイトは # @nishio # Prologで重複順列([t, f], 3, _重複順列)とかやったら_重複順列が[[t, t, t], [t, t, f], ..., [f, f, f]]になるような述語重複順列の作り方に悩んでいる # 'Prologで重複順列([t, f], 3, _重複順列)とかやったら_重複順列が[[t, t, t], [t, t, f], ..., [f, f, f]]になるような述語重複順列の作り方に悩んでいる'(_要素リスト,N,_重複順列) :- 重複順列(_要素リスト,N,_重複順列). 重複順列(_要素リスト,N,_重複順列) :- findall(L,重複順列_1(N,_要素リスト,L),_重複順列). 重複順列_1(0,_,[]). 重複順列_1(N,_要素リスト,[_要素|R]) :- N > 0, member(_要素,_要素リスト), N_1 is N - 1, 重複順列_1(N_1,_要素リスト,R). % 以下のサイトは # 御題 # # 1から100までの数を出力するプログラムを書け。 # ただしフィボナッチ数列に現れる数のときは数の代わりに 'Fib' と、 # 素数のときは 'Prime' と出力し、 # フィボナッチ数列に現れて且つ素数の場合には 'FibPrime' と出力すること。 # また出力先は'fibprime.bz2'というファイル名のbzip2圧縮形式ファイルとする。 '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。' :- '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(1,0,1). '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数,_,_) :- _数 > 100,!. '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数_1,_fib_1,_fib_2) :- 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数_1,_fib_1,_fib_2,_fib_1_2,_fib_2_2), _数_2 is _数_1 + 1, '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数_2,_fib_1_2,_fib_2_2). 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数_1,_fib_1,_fib_2,_fib_1_2,_fib_2_2) :- 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数_1,_fib_1,_fib_2,_fib_2_2,_fib_2_2,Fib), '素数のときは ''Prime'' と'(_数,Prime), '出力する'(_数_1,Fib,Prime),!. 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数_1,_fib_1,_fib_2,_fib_2_2,_数_1,'Fib') :- _数_1 is _fib_1 + _fib_2,!. 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数_1,_fib_1,_fib_2,_fib_1,_fib_2,''). '素数のときは ''Prime'' と'(_数,'Prime') :- 素数である(_数),!. '素数のときは ''Prime'' と'(_,''). '出力する'(_数_1,'','') :- write('%t ',[_数_1]),!. '出力する'(_数_1,Fib,Prime) :- write('%t%t ',[Fib,Prime]). % このプログラムの骨組みは %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 素数である(1) :- !. 素数である(X) :- X > 0, Y is X - 1, 階乗(Y,Z), 0 is (Z + 1) mod X. 階乗(_n,X) :- findall(M,between(1,_n,M),L), atomic_list_concat(L,*,S), atom_to_term(S,_式,_), X is _式. % 以下のサイトは # 御題 # # 1から100までの数を出力するプログラムを書け。 # ただしフィボナッチ数列に現れる数のときは数の代わりに 'Fib' と、 # 素数のときは 'Prime' と出力し、 # フィボナッチ数列に現れて且つ素数の場合には 'FibPrime' と出力すること。 # また出力先は'fibprime.bz2'というファイル名のbzip2圧縮形式ファイルとする。 '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。' '100以下のフィボナッチ数列を得る'(_100以下のフィボナッチ数ならび), '100以下の素数を得る'(_100以下の素数ならび), between(1,100,_数), 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、素数のときは ''Prime'' と出力し、フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数,_100以下のフィボナッチ数ならび,_100以下の素数ならび,L), 'Nが100になるまで出力する'(N,L). 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、素数のときは ''Prime'' と出力し、フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数,_100以下のフィボナッチ数ならび,_100以下の素数ならび,L) :- 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数,_100以下のフィボナッチ数ならび,L), '素数のときは ''Prime'' と'(_数,_100以下の素数ならび,L), それ以外の場合は数を(_数,L). 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数,_100以下のフィボナッチ数ならび,['Fib',_,_]) :- member(_数,_100以下のフィボナッチ数ならび),!. 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_,_,['',_,_]). '素数のときは ''Prime'' と'(_数,_100以下の素数ならび,[_,'Prime',_]) :- member(_数,_100以下の素数ならび),!. '素数のときは ''Prime'' と'(_,_,[_,'',_]). それ以外の場合は数を(_数,['','',_数]) :- !. それ以外の場合は数を(_,[_,_,'']). '100以下のフィボナッチ数列を得る'(L) :- '100以下のフィボナッチ数列'([1,0],L). '100以下のフィボナッチ数列'([B,A|R],L) :- C is A + B, C =< 100, '100以下のフィボナッチ数列'([C,B,A|R],L),!. '100以下のフィボナッチ数列'(L,L). '100以下の素数を得る'(_100以下の素数ならび) :- findall(N,( between(1,100,N)), _1から100までのならび), エラトステネスの篩(_1から100までのならび,_100以下の素数ならび). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). 'Nが100になるまで出力する'(N,L) :- atomic_list_concat(L,_表示文字列), writef('%t ',[_表示文字列]), N = 100. % 以下のサイトは # 御題 # # 1から100までの数を出力するプログラムを書け。 # ただしフィボナッチ数列に現れる数のときは数の代わりに 'Fib' と、 # 素数のときは 'Prime' と出力し、 # フィボナッチ数列に現れて且つ素数の場合には 'FibPrime' と出力すること。 # また出力先は'fibprime.bz2'というファイル名のbzip2圧縮形式ファイルとする。 '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。' '100以下のフィボナッチ数列を得る'(_100以下のフィボナッチ数ならび), '100以下の素数を得る'(_100以下の素数ならび), between(1,100,_数), 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、素数のときは ''Prime'' と出力し、フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数,_100以下のフィボナッチ数ならび,_100以下の素数ならび,L), 'Nが100になるまで出力する'(N,L). 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、素数のときは ''Prime'' と出力し、フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数,_100以下のフィボナッチ数ならび,_100以下の素数ならび,L) :- 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数,_100以下のフィボナッチ数ならび,L), '素数のときは ''Prime'' と'(_数,_100以下の素数ならび,L), それ以外の場合は数を(_数,L). 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数,_100以下のフィボナッチ数ならび,['Fib',_,_]) :- member(_数,_100以下のフィボナッチ数ならび),!. 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_,_,['',_,_]). '素数のときは ''Prime'' と'(_数,_100以下の素数ならび,[_,'Prime',_]) :- member(_数,_100以下の素数ならび),!. '素数のときは ''Prime'' と'(_,_,[_,'',_]). それ以外の場合は数を(_数,['','',_数]) :- !. それ以外の場合は数を(_,[_,_,'']). '100以下のフィボナッチ数列を得る'(L) :- '100以下のフィボナッチ数列'([1,0],L). '100以下のフィボナッチ数列'([B,A|R],L) :- C is A + B, C =< 100, '100以下のフィボナッチ数列'([C,B,A|R],L),!. '100以下のフィボナッチ数列'(L,L). '100以下の素数を得る'(L) :- findall(N,( between(1,100,N), 素数である(N)), L). 素数である(1) :- !. 素数である(X) :- X > 0, Y is X - 1, 階乗(Y,Z), 0 is (Z + 1) mod X. 階乗(_n,X) :- findall(M,between(1,_n,M),L), atomic_list_concat(L,*,S), atom_to_term(S,_式,_), X is _式. 'Nが100になるまで出力する'(N,L) :- atomic_list_concat(L,_表示文字列), writef('%t ',[_表示文字列]), N = 100. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1244449887/905 # # [1]c++ # [2]2次元配列n[10][10]のすべての要素に1を代入してから、その内容を表示しなさい。 # また、対角要素だけを1を代入し、ほかはすべて0を代入してから、表示しなさい。 # ただし、対角要素は左上隅から右下隅への対角線上の要素とする。次の図は実行例であ る。 # --- (2)配列nの内容 --- # # 100000000 # 010000000 # 001000000 # 000100000 # 000010000 # 000001000 # 000000100 # 000000010 # 000000001 '2次元配列n[10][10]のすべての要素に1を代入してから、その内容を表示しなさい。' :- '2次元配列n[10][10]のすべての要素に1を代入してから'(LL), 'その内容を表示しなさい。'(LL). '2次元配列n[10][10]のすべての要素に1を代入してから'(LL) :- findall(L,( between(1,10,_n), length(L,10), all(L,1)), LL). all([],_). all([V|R],V) :- all(R,V). '対角要素だけを1を代入し、ほかはすべて0を代入してから、表示しなさい。' :- 対角要素だけ1を代入しほかは全て0を代入してから(LL), 表示しなさい(LL). 対角要素だけ1を代入しほかは全て0を代入してから(LL) :- findall(L,( between(1,10,_n), length(L,10), nth1(_n,L,1), 他の全ての要素は0に(L)), LL). 他の全ての変数要素は0に([]). 他の全ての変数要素は0に([0|R]) :- 他の全ての変数要素は0に(R). 他の全ての変数要素は0に([_|R]) :- 他の全ての変数要素は0に(R). その内容を表示しなさい(LL) :- 表示しなさい(LL). 表示しなさい(LL) :- append(_,[L|R],LL), atomic_list_concat(L,S), writef('%t\n',[S]), R = []. % 以下のサイトは # [1] 授業単元:Python # [2] 問題文(含コード&リンク): 課題2 # http://pc12.2ch.net/test/read.cgi/tech/1153585095/789 [1] 授業単元:Python [2] 問題文(含コード&リンク): 下の例参照 与えられた数字のみからなる文字列から各桁の数字に分割し、 隣り合う数字の合計の下一桁の値を並べたものを次の文字列とし、 結果が一桁になるまで繰り返しそれぞれの過程の文字列を出力する。 [3] 環境:特になし [4] 期限: 明日まで [5] その他の制限: 例 # 525123214112431 # 77635535523674 # 4398088075931 # 727886872424 # 99564459666 # 8410894522 # 251873974 # 76950261 # 3545287 # 899705 # 78675 # 5432 # 95 # 4 # # 上から2段目から最後の段までに現れる0から9数字の # 総出現数と各数字毎の出現比率を出力する。 # [3] 環境:特になし # [4] 期限: 明日まで # [5] その他の制限: # # 129個 # 0: 10回 3% # 1: 43回 20% # 2: 8回 2% # ... # 9: 18回 6% # のように出力してください。 対象となる文字列('525123214112431'). 対象となる文字列('77635535523674'). 対象となる文字列('4398088075931'). 対象となる文字列('727886872424'). 対象となる文字列('99564459666'). 対象となる文字列('8410894522'). 対象となる文字列('251873974'). 対象となる文字列('76950261'). 対象となる文字列('3545287'). 対象となる文字列('899705'). 対象となる文字列('78675'). 対象となる文字列('5432'). 対象となる文字列('95'). 対象となる文字列('4'). '上から2段目から最後の段までに現れる0から9までの数字の総出現数と各数字毎の出現比率を出力する。' :- findall(_文字列,( 対象となる文字列(_対象となる文字列), _行ならび), '上から2段目から最後の段までに現れる0から9までの数字の総出現数と各数字毎の出現比率を'(_行ならび,_数字の総出現数,_各数字毎の出現比率), 出力する(_0から9までの数字の出現数ならび,_各数字毎の出現比率). '上から2段目から最後の段までに現れる0から9数字の総出現数と各数字毎の出現比率を'(_行ならび,_数字の総出現数,_各数字毎の出現比率) :- '上から2段目から最後の段までに現れる'(_行ならび,_上から2段目から最後の段まで), '0から9までの数字の総出現数'(_上から2段目から最後の段まで,_0から9までの数字の出現数ならび,_総出現数), '各数字毎の出現比率を'(_0から9までの数字の出現数ならび,_総出現数,_各数字毎の出現比率). '上から2段目から最後の段までに現れる'(_行ならび,_上から2段目から最後の段まで) :- _行ならび = [_|_上から2段目から最後の段まで]. '0から9までの数字の総出現数'(_上から2段目から最後の段まで,_0から9までの数字の出現数ならび,_総出現数) :- atomic_list_concat(_上から2段目から最後の段まで,_文字列), findall(_度数,( member(_数字文字,['0','1','2','3','4','5','6','7','8','9']), count(sub_atom(_文字列,_,1,_,_数字文字),_度数)), _0から9までの数字の出現ならび), sum(_0から9までの数字の出現ならび,_総出現数). '各数字毎の出現比率を'(_0から9までの数字の出現数ならび,_総出現数,_各数字毎の出現比率) :- findall(_出現比率,( member(_度数,_0から9までの数字の出現数ならび), _出現比率 is _度数 / _総出現数 * 100.0)), _各数字毎の出現比率). 出力する(_0から9までの数字の出現数ならび,_各数字毎の出現比率) :- write('数: 出現数 出現比率\n'), '数字の出現数・出現比率を一行で出力する'(_0から9までの数字の出現数ならび,_各数字毎の出現比率,N), N = 9. '数字の出現数・出現比率を一行で出力する'(N,_0から9までの数字の出現数ならび,_各数字毎の出現比率,N) :- nth0(N,_0から9までの数字の出現数ならび,_出現数), nth0(N,_各数字毎の出現比率,_出現比率), writef(' %t: %t回 ',[N,_出現数]), format('~1f%\n',[_出現比率]). % 以下のサイトは # [1] 授業単元:Python # [2] 問題文(含コード&リンク): 課題2 # http://pc12.2ch.net/test/read.cgi/tech/1153585095/789 [1] 授業単元:Python [2] 問題文(含コード&リンク): 下の例参照 与えられた数字のみからなる文字列から各桁の数字に分割し、 隣り合う数字の合計の下一桁の値を並べたものを次の文字列とし、 結果が一桁になるまで繰り返しそれぞれの過程の文字列を出力する。 [3] 環境:特になし [4] 期限: 明日まで [5] その他の制限: 例 # 525123214112431 # 77635535523674 # 4398088075931 # 727886872424 # 99564459666 # 8410894522 # 251873974 # 76950261 # 3545287 # 899705 # 78675 # 5432 # 95 # 4 # # 上から2段目から最後の段までに現れる0から9数字の # 総出現数と各数字毎の出現比率を出力する。 # [3] 環境:特になし # [4] 期限: 明日まで # [5] その他の制限: # # 129個 # 0: 10回 3% # 1: 43回 20% # 2: 8回 2% # ... # 9: 18回 6% # のように出力してください。 対象となる文字列('525123214112431 77635535523674 4398088075931 727886872424 99564459666 8410894522 251873974 76950261 3545287 899705 78675 5432 95 4'). '上から2段目から最後の段までに現れる0から9までの数字の総出現数と各数字毎の出現比率を出力する。' :- 対象となる文字列(_対象となる文字列), split(_対象となる文字列,['\n'],_行ならび), '上から2段目から最後の段までに現れる0から9までの数字の総出現数と各数字毎の出現比率を'(_行ならび,_数字の総出現数,_各数字毎の出現比率), 出力する(_0から9までの数字の出現数ならび,_各数字毎の出現比率). '上から2段目から最後の段までに現れる0から9数字の総出現数と各数字毎の出現比率を'(_行ならび,_数字の総出現数,_各数字毎の出現比率) :- '上から2段目から最後の段までに現れる'(_行ならび,_上から2段目から最後の段まで), '0から9までの数字の総出現数'(_上から2段目から最後の段まで,_0から9までの数字の出現数ならび,_総出現数), '各数字毎の出現比率を'(_0から9までの数字の出現数ならび,_総出現数,_各数字毎の出現比率). '上から2段目から最後の段までに現れる'(_行ならび,_上から2段目から最後の段まで) :- _行ならび = [_|_上から2段目から最後の段まで]. '0から9までの数字の総出現数'(_上から2段目から最後の段まで,_0から9までの数字の出現数ならび,_総出現数) :- atomic_list_concat(_上から2段目から最後の段まで,_文字列), findall(_度数,( member(_数字文字,['0','1','2','3','4','5','6','7','8','9']), count(sub_atom(_文字列,_,1,_,_数字文字),_度数)), _0から9までの数字の出現ならび), sum(_0から9までの数字の出現ならび,_総出現数). '各数字毎の出現比率を'(_0から9までの数字の出現数ならび,_総出現数,_各数字毎の出現比率) :- findall(_出現比率,( member(_度数,_0から9までの数字の出現数ならび), _出現比率 is _度数 / _総出現数 * 100.0)), _各数字毎の出現比率). 出力する(_0から9までの数字の出現数ならび,_各数字毎の出現比率) :- write('数: 出現数 出現比率\n'), '数字の出現数・出現比率を一行で出力する'(_0から9までの数字の出現数ならび,_各数字毎の出現比率,N), N = 9. '数字の出現数・出現比率を一行で出力する'(N,_0から9までの数字の出現数ならび,_各数字毎の出現比率,N) :- nth0(N,_0から9までの数字の出現数ならび,_出現数), nth0(N,_各数字毎の出現比率,_出現比率), writef(' %t: %t回 ',[N,_出現数]), format('~1f%\n',[_出現比率]). % 以下のサイトは # [1] 授業単元:プログラミング # [2] 問題文 # ・1から100までの数をプリントするプログラムを書け。ただしフェルマー素数のときは # 数の代わりに「Fizz」と、オイラー素数のときは「Buzz」とプリントし、フェルマー素数とオイラー素数両方の倍数の場合には「FizzBuzz」とプリントすること。 # '1から100までの数をプリントするプログラムを書け。ただしフェルマー素数のときは数の代わりに「Fizz」と、オイラー素数のときは「Buzz」とプリントし、フェルマー素数とオイラー素数両方の倍数の場合には「FizzBuzz」とプリントすること。' :- '1から100までの範囲のフェルマー素数とオイラー素数を得る'(_フェルマー素数ならび,_オイラー素数ならび), '1から100までの範囲のフェルマー素数とオイラー素数両方の倍数を得る'(_フェルマー素数ならび,_オイラー素数ならび,_フェルマー素数とオイラー素数両方の倍数ならび), '1から100までの数をプリントする。ただしフェルマー素数のときは数の代わりに「Fizz」と、オイラー素数のときは「Buzz」とプリントし、フェルマー素数とオイラー素数両方の倍数の場合には「FizzBuzz」とプリントすること。'(_フェルマー素数ならび,_オイラー素数ならび,_フェルマー素数とオイラー素数両方の倍数ならび,_n), write(' '), _n = 100. '1から100までの範囲のフェルマー素数とオイラー素数を得る'(_フェルマー素数ならび,_オイラー素数ならび) :- '1から100までの範囲のフェルマー素数を得る'(_フェルマー素数ならび), '1から100までの範囲のオイラー素数を得る'(_オイラー素数ならび). '1から100までの範囲のフェルマー素数を得る'(_フェルマー素数ならび) :- findall(_n,( between(1,100,_n), フェルマー素数(_n)), _フェルマー素数ならび). '1から100までの範囲のオイラー素数を得る'(_オイラー素数ならび) :- findall(_n,( between(1,100,_n), オイラー素数(_n)), _オイラー素数ならび). '1から100までの範囲のフェルマー素数とオイラー素数両方の倍数を得る'(_フェルマー素数ならび,_オイラー素数ならび,_フェルマー素数とオイラー素数両方の倍数ならび) :- findall(_n,( between(1,100,_n), フェルマー素数とオイラー素数両方の倍数(_n,_フェルマー素数ならび,_オイラー素数ならび)), _フェルマー素数とオイラー素数両方の倍数ならび). フェルマー素数とオイラー素数両方の倍数(_n,_フェルマー素数ならび,_オイラー素数ならび) :- member(_フェルマー素数,_フェルマー素数ならび), member(_オイラー素数,_オイラー素数ならび), 0 is _n mod _フェルマー素数, 0 is _n mod _オイラー素数,!. '1から100までの数をプリントする。ただしフェルマー素数のときは数の代わりに「Fizz」と、オイラー素数のときは「Buzz」とプリントし、フェルマー素数とオイラー素数両方の倍数の場合には「FizzBuzz」とプリントすること。'(_フェルマー素数ならび,_オイラー素数ならび,_フェルマー素数とオイラー素数両方の倍数ならび,_n) :- '1から100までの'(_n), '数をプリントする。ただしフェルマー素数のときは数の代わりに「Fizz」と、オイラー素数のときは「Buzz」とプリントし、フェルマー素数とオイラー素数両方の倍数の場合には「FizzBuzz」とプリントすること。'(_n,_フェルマー素数ならび,_オイラー素数ならび,_フェルマー素数とオイラー素数両方の倍数ならび). '1から100までの'(_n) :- between(1,100,_n). '数をプリントする。ただしフェルマー素数のときは数の代わりに「Fizz」と、オイラー素数のときは「Buzz」とプリントし、フェルマー素数とオイラー素数両方の倍数の場合には「FizzBuzz」とプリントすること。'(_n,_,_,_フェルマー素数とオイラー素数両方の倍数ならび) :- 'フェルマー素数とオイラー素数両方の倍数の場合には「FizzBuzz」と'(_n,_フェルマー素数とオイラー素数両方の倍数ならび),!. '数をプリントする。ただしフェルマー素数のときは数の代わりに「Fizz」と、オイラー素数のときは「Buzz」とプリントし、フェルマー素数とオイラー素数両方の倍数の場合には「FizzBuzz」とプリントすること。'(_n,_フェルマー素数ならび,_,_) :- 'フェルマー素数のときは数の代わりに「Fizz」と'(_n,_フェルマー素数ならび),!. '数をプリントする。ただしフェルマー素数のときは数の代わりに「Fizz」と、オイラー素数のときは「Buzz」とプリントし、フェルマー素数とオイラー素数両方の倍数の場合には「FizzBuzz」とプリントすること。'(_n,_,_オイラー素数ならび,_) :- 'オイラー素数のときは「Buzz」と'(_n,_オイラー素数ならび),!. '数をプリントする。ただしフェルマー素数のときは数の代わりに「Fizz」と、オイラー素数のときは「Buzz」とプリントし、フェルマー素数とオイラー素数両方の倍数の場合には「FizzBuzz」とプリントすること。'(_n,_,_,_) :- writef('%t',[_n]). 'フェルマー素数とオイラー素数両方の倍数の場合には「FizzBuzz」と'(_n,_フェルマー素数とオイラー素数両方の倍数ならび) :- member(_n,_フェルマー素数とオイラー素数両方の倍数ならび), write('FizzBuzz'),!. 'フェルマー素数のときは数の代わりに「Fizz」と'(_n,_フェルマー素数ならび) :- member(_n,_フェルマー素数ならび), write('Fizz'). 'オイラー素数のときは「Buzz」と'(_n,_オイラー素数ならび) :- member(_n,_オイラー素数ならび), write('Buzz'). オイラー素数(_オイラー素数) :- between(0,39,_n), _オイラー素数 is _n * _n + _n + 41. フェルマー素数(_フェルマー素数) :- between(0,4,_n), _フェルマー素数 is truncate(2 ^ (2 ^ _n) + 1). % 以下のサイトは # # mysql 5.5.9 # master # code # last_tradingdate # # data_tbl # code # data1 # tradingdate # # で、data_tblにはcode毎に取引日が入っています # それでmasterのlast_tradingdateにcode毎の入力最新日をセット # したいのですが、どう書けばいいんでしょうか。 :- dynamic(master/2,data_tbl/3). 'master code last_tradingdate data_tbl code data1 tradingdate で、data_tblにはcode毎に取引日が入っています それでmasterのlast_tradingdateにcode毎の入力最新日をセット したいのですが、どう書けばいいんでしょうか。' :- findall([_code,_最終取引日],( master(_code,_), findmax(_trandingdate,( data_tble(_code,_,_tradingdate)), _最終取引日)), LL), masterの_last_tradingdateを書き換える(LL). masterの_last_tradingdateを書き換える(LL) :- append(_,[[_code,_最終取引日]|R],LL), retract(master(_code,_)), assertz(master(_code,_最終取引日)), R = []. % 以下のサイトは # # mysql 5.5.9 # master # code # last_tradingdate # # data_tbl # code # data1 # tradingdate # # で、data_tblにはcode毎に取引日が入っています # それでmasterのlast_tradingdateにcode毎の入力最新日をセット # したいのですが、どう書けばいいんでしょうか。 :- dynamic(master/2,data_tbl/3). 'master code last_tradingdate data_tbl code data1 tradingdate で、data_tblにはcode毎に取引日が入っています それでmasterのlast_tradingdateにcode毎の入力最新日をセット したいのですが、どう書けばいいんでしょうか。' :- findall([_code,_最終取引日],( master(_code,_), findmax(_trandingdate,( data_tble(_code,_,_tradingdate)), _最終取引日)), LL), masterの_last_tradingdateを書き換える(LL). masterの_last_tradingdateを書き換える([]). masterの_last_tradingdateを書き換える([[_code,_最終取引日]|R]) :- retract(master(_code,_)), assertz(master(_code,_最終取引日)), masterの_last_tradingdateを書き換える(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1363522503/91 # # Youtubeみたいなランダムでユニークなn文字数の文字列を作る方法を教えてください 選択可能文字リスト( ['0','1','2','3','4','5','6','7','8','9', 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z', a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]). 'Youtubeみたいなランダムでユニークなn文字数の文字列を作る'(_n,_ランダムでユニークなn文字数の文字列) :- findall(_ランダムでユニークな文字,~( ランダムでユニークな文字(_n,_ランダムでユニークな文字)), _ランダムでユニークなn文字数の文字リスト). atom_chars(_ランダムでユニークなn文字数の文字列,_ランダムでユニークなn文字数の文字リスト). ランダムでユニークな文字(_n,_ランダムでユニークな文字) :- length(Ln,_n), 選択可能文字リスト(_選択可能文字リスト), ランダムでユニークな文字_1(Ln,_選択可能文字リスト,_ランダムでユニークな文字). ランダムでユニークな文字_1([_|Ln],_選択可能文字リスト,_ランダムでユニークな文字) :- リストからランダムに値を抜き取る(_選択可能文字リスト,_文字_1,_選択文字を抜き取った選択可能文字リスト), ランダムでユニークな文字_2([_|Ln],_文字_1,_選択文字を抜き取った選択可能文字リスト,_ランダムでユニークな文字). ランダムでユニークな文字_2([_|Ln],_文字,_,_文字). ランダムでユニークな文字_2([_|Ln],_,_選択文字を抜き取った選択可能文字リスト,_文字) :- ランダムでユニークな文字(Ln,_選択文字を抜き取った選択可能文字リスト,_文字). リストからランダムに値を抜き取る(_リスト,_値,_値を抜き取ったリスト) :- 乱数値をリストの抜き取り位置とする(_リスト,_乱数値,_乱数値を要素数とした変数リスト), リストから値を抜き取る(_リスト,_乱数値を要素数とした変数リスト,_値,_値を抜き取ったリスト). 乱数値をリストの抜き取り位置とする(_リスト,_乱数値,_乱数値を要素数とした変数リスト) :- length(_リスト,_要素数), _乱数値 is random(_要素数), length(_乱数値を要素数とした変数リスト,_乱数値). リストから値を抜き取る(_リスト,_乱数値を要素数とした変数リスト,_値,_値を抜き取ったリスト) :- append(_乱数値を要素数とした変数リスト,[_値|_残りリスト],_リスト), append(_乱数値を要素数とした変数リスト,_残りリスト,_値を抜き取ったリスト). % 以下のサイトは アルファベットのならびを生成する(_アルファベットのならび) :- findall(_アルファベット,( アルファベットの文字コードの範囲(_文字コード), char_code(_アルファベット,_文字コード)), _アルファベットのならび). アルファベットの文字コードの範囲(_文字コード) :- 数字文字コード(_文字コード). アルファベットの文字コードの範囲(_文字コード) :- 英大文字コード(_文字コード). アルファベットの文字コードの範囲(_文字コード) :- 英小文字コード(_文字コード). 数字文字コード(_文字コード) :- between(48,57,_文字コード). 英大文字コード(_文字コード) :- between(65,90,_文字コード). 英小文字コード(_文字コード) :- between(97,122,_文字コード). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1361082416/727 # # [1] 授業単元: 暇つぶし # [2] 問題文:迷路を解くプログラム。 #  下記のようなテキストを入力とし、スタートからゴールまでの道を表示してください。 # ----- ここからテキスト ----- # 5 5 # sxrrr # rxrrr # rrrxr # rrxgr # ----- ここまでテキスト ----- #  テキストの1行目は順番に迷路の横幅と縦幅を表します。 #  二行目以降は迷路を表しており、sはスタート、gはゴール、xは壁、rは道を表します。 #  壁は通り抜けることはできず、道を通る必要があります。迷路の端は壁として扱います。 #  表示の仕様は以下の通り。ゴールまでの道がないと判断した場合はNot Foundと表示。 # 1 step # sxrrr # +xrrr # rrrxr # rrxgr # <中略> # 9 step # sxrrr # +x+++ # +++x+ # rrxg+ # '問題文:迷路を解くプログラム。  下記のようなテキストを入力とし、スタートからゴールまでの道を表示してください。 ----- ここからテキスト ----- 5 5 sxrrr rxrrr rrrxr rrxgr ----- ここまでテキスト -----  テキストの1行目は順番に迷路の横幅と縦幅を表します。  二行目以降は迷路を表しており、sはスタート、gはゴール、xは壁、rは道を表します。  壁は通り抜けることはできず、道を通る必要があります。迷路の端は壁として扱います。  表示の仕様は以下の通り。ゴールまでの道がないと判断した場合はNot Foundと表示。 1 step sxrrr +xrrr rrrxr rrxgr <中略> 9 step sxrrr +x+++ +++x+ rrxg+ '(_テキスト) :- 'テキストを入力とし、スタートからゴールまでの道を表示してください。'(_テキスト). 'テキストを入力とし、スタートからゴールまでの道を表示してください。'(_テキスト) :- テキストを入力とし(_テキスト,LL1,LL2), スタートからゴールまでの(LL1,LL2,_スタートからゴールまでの道順), '道を表示してください。'(_スタートからゴールまでの道順,LL1). スタートからゴールまでの(LL1,LL2,_スタートからゴールまでの道順) :- スタートを探す(LL1,LL2,_スタートの行,_スタートの列), ゴールを探す(LL1,LL2,_ゴールの行,_ゴールの列), 隣に移動する(_スタートの行,_スタートの列,_ゴールの行,_ゴールの列,LL1,LL2,[],_スタートからゴールまでの道順). テキストを入力とし(_テキスト,LL1,LL2) :- get_lines(_テキスト,[_不要要素|_行ならび]), findall(_文字ならび,( member(_一行,_行ならび), atom_chars(_一行,_文字ならび)), LL1), 転置(LL1,LL2). スタートを探す(LL1,LL2,_スタートの行,_スタートの列) :- nth1(_スタートの行,LL1,L), nth1(_スタートの列,L,s). ゴールを探す(LL1,LL2,_ゴールの行,_ゴールの列) :- nth1(_ゴールの行,LL1,L), nth1(_ゴールの列,L,g). 隣に移動する(_ゴールの行,_ゴールの列,_ゴールの行,_ゴールの列,LL1,LL2,_,[[_ゴールの行,_ゴールの列]]). 隣に移動する(_行,_列,_ゴールの行,_ゴールの列,LL1,LL2,_履歴1,[[_行,_列]|R]) :- 移動可能な隣接点を得る(_行,_列,LL1,LL2,_隣の行,_隣の列), \+(member([_隣の行,_隣の列],_履歴1)), 隣に移動する(_隣の行,_隣の列,_ゴールの行,_ゴールの列,LL1,LL2,[[_行,_列]|_履歴1],R). 移動可能な隣接点を得る(_行,_列,LL1,LL2,_行,_隣の列) :- 行の移動可能な隣接点(_行,_列,LL1,LL2,_行,_隣の列). 移動可能な隣接点を得る(_行,_列,LL1,LL2,_行,_隣の列) :- 列の移動可能な隣接点(_行,_列,LL1,LL2,_行,_隣の列). 行の移動可能な隣接点(_行,_列,LL1,LL2,_行,_隣の列) :- nth1(_行,LL1,L), length([_|L0],_列), append(L0,[_|R],L), 移動可能な隣接点(L0,R,_隣の列). 列の移動可能な隣接点(_行,_列,LL1,LL2,_隣の行,_隣の列) :- nth1(_列,LL2,L), length([_|L0],_行), append(L0,[_|R],L), 移動可能な隣接点(L0,R,_隣の行). 移動可能な隣接点(L0,R,_隣) :- last(L0,r), length(L0,_隣). 移動可能な隣接点(L0,R,_隣) :- R = [r|_], length([_,_|L0],_隣). '道を表示してください。'(_スタートからゴールまでの道順,LL) :- append(LL0,[[_行,_列]|RR],_スタートからゴールまでの道順), length([_|LL0],_ステップ), write('%t\n',[_ステップ]), '通過点を+に置換してLLを表示する'(_行,_列,LL), R = []. '通過点を+に置換してLLを表示する'(_行,_列,LL) :- append(L0,[L1|R],LL), length([_|L0],_行_1), 列の置換(_行_1,_行,_列,L1,L2), ならびを文字列に変換して表示(L2), R = []. 列の置換(_行,_行,_列,L1,L2) :- length([_|L0],_列), append(L0,[_|R],L1), append(L0,[+|R],L2),!. 列の置換(_,_,_,L,L). ならびを文字列に変換して表示(L) :- atomic_list_concat(L,S), writef('%t\n',[S]). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/705 # # SQL SERVER 2010ですが # TOP 2を求めて残りをその他として合計表示したいです。 # よろしくお願いします。 # # 元のデータ # 列1 # A # A # A # B # B # C # D # # 求めたい結果 # A 3 # B 2 # その他 2 # # 'TOP 2を求めて残りをその他として合計表示したい'(_A,_B,_その他) :- findsetof(_列1,テーブル(_列1),_一意の列1ならび), 'TOP 2を求めて'(_一意の列1ならび,_A,_B,R), '残りをその他として合計表示したい'(R,_その他). 'TOP 2を求めて'(_一意の列1ならび,_A,_B,R) :- findall([_度数,_列1],( member(_列1,_一意の列1ならび), count(テーブル(_列1),_度数)), LL), sort(LL1,LL2), append(R,[_B,_A],LL2). '残りをその他として合計表示したい'(R,_その他) :- findsum(_度数,member([_度数,_],R),_その他). % 以下のサイトは # p=1231, q=4567を選びます。 # eに65537 # e^-1=d mod φ(n) のdを計算して求めます。 #     d=3988493 # となります。 # # 暗号化と複合化の手順 # 公開鍵:N = 1231 * 4567 # E = 65537 # d = 3988493 # 文字コード:「a〜z」=01〜26、「A〜Z」=27〜52、空白=53 # 文書:This Anser p(1231). q(4567). 'E'(65537). d(3988493). n(5621977). 'RSA暗号化'(_文書,_暗号文字コードならび) :- 文書を文字コードで数値化します(_文書,_文字コードならび), 'RSA方式によるコード暗号化'(_文字コードならび,_暗号文字コードならび). 'RSA復号化'(_暗号文字コードならび,_文書) :- 'RSA方式によるコード復号化'(_暗号文字コードならび,_文字コードならび), 文字コードならびから文書を復元します(_文字コードならび,_文書). 'RSA方式によるコード暗号化'(_文字コードならび,_暗号コードならび) :- 'E'(_E), n(_n), findall(_暗号コード,( member(_文字コード,_文字コードならび), _暗号コード is _文字コード ^ _E mod _n), _暗号コードならび). 'RSA方式によるコード復号化'(_暗号文字コードならび,_文字コードならび) :- d(_d), n(_n), findall(_複合コード,( member(_暗号文字コード,_暗号文字コードならび), _複合コード is _暗号文字コード ^ _d mod _n), _文字コードならび). 文書を文字コードで数値化します(_文書,_文字コードならび) :- findall(_文字コード,( sub_atom(_文書,_,1,_,_文字), 文字コード(_文字,_文字コード)), _文字コードならび). 暗号コードを暗号文に変換(_暗号コードならび,_暗号文) :- findall(_暗号文字,( member(_暗号コード,_暗号コードならび), 文字コード(_暗号文字,_暗号コード)), _暗号文字ならび), atom_chars(_暗号文,_暗号文字ならび). 文字コードならびから文書を復元します(_文字コードならび,_文書) :- findall(_文字,( member(_文字コード,_文字コードならび), 文字コード(_文字,_文字コード)), _文字ならび), atom_chars(_文書,_文字ならび). 文字コード(_文字,_コード) :- char_code(_文字,_コード). % 以下のサイトは % ユーティリティ述語 sub_atom/10 の提案 % % A .. 文字列 (atom) % S .. 検索文字列開始変位 (integer) % L .. 検索文字列の長さ (integer) % R .. 残り長さ (integer) % H .. 検索文字列より前側の文字列 (atom) % X .. 検索文字列 (atom) % T .. 検索文字列より後の残り文字列 (atom) % HL .. 検索文字列より前側の文字ならび (chars) % XL .. 検索文字列文字ならび (chars) % TL .. 検索文字列より後の残り文字ならび (chars) % A がvarである時はH-HL,X-XL,T-TLの3組の中にvar-varの組があってはなりません。 sub_atom_12(A,W1,W2,S,L,R,H,X,T,HL,XL,TL) :- '文字列W1から始まりW2で終わる。W1,W2の間にW1,W2は現れない'(A,V,W,S,L,R,H,X,T,HL,XL,TL). '文字列W1から始まりW2で終わる。W1,W2の間にW1,W2は現れない'(A,W1,W2,S,L,R,H,X,T,HL,XL,TL) :- sub_atom(A,S,L,R,H,X,T,HL,XL,TL), 文字列W1から始まりW2で終わる(X,W1,W2,S1,S2), 'W1,W2の間の文字列にW1,W2は現れない'(X,S1,S2,W1,W2). 文字列W1から始まりW2で終わる(X,W1,W2,S1,S2) :- sub_atom(X,0,S1,_,W1), sub_atom(X,S2,_,0,W2). 'W1,W2の間の文字列にW1,W2は現れない'(X,W1,W2,S1,S2) :- sub_atom(X,S1,_,S2,_W1とW2の間の文字列), \+(sub_atom(_W1とW2の間の文字列,_,_,_,W1)), \+(sub_atom(_W1とW2の間の文字列,_,_,_,W2)). count(P,N) :- findsum(1,P,F), N is truncate(F). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum(_値ならび,_合計値),!. sum([],0). sum([N|R],S) :- sum(R,S1), S is N + S1. sub_atom(A,S,L,R,H,X,T,HL,XL,TL) :- atom(A), !, sub_atom(A,S,L,R,X), sub_atom(A,0,S,_,H), N is S + L, sub_atom(A,N,R,_,T), atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL). sub_atom(A,S,L,R,H,X,T,HL,XL,TL) :- var(A), !, atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL), length(HL,S), length(XL,L), length(TL,R), concat_atom([H,X,T],A), sub_atom(A,S,L,R,H,X,T,HL,XL,TL). % 以下のサイトは # # ある専門学校の受験資格のデシジョンテーブル # # <条件> 1 2 3 4 5 6 7 8 # # 体重が軽い N N N N Y Y Y Y # 体が柔らかい N N Y Y N Y N Y # 敏捷である N Y Y N N N Y Y # # <行動> # # 受験資格がある X # 受験資格がない X X X X X X X 体重が軽い(偽,偽,偽,偽,真,真,真,真). 体が柔らかい(偽,偽,真,真,偽,真,偽,真). 敏捷である(偽,真,真,偽,偽,偽,真,真). 受験資格がある(偽,偽,偽,偽,偽,偽,偽,真). デシジョンテーブル(_アリティ,_条件述語名ならび,_真偽値ならび,_行動述語名ならび,_nth1,_行動ならび) :- デシジョンテーブル引数を取得して転置する(_アリティ,_条件述語名ならび,LL2), nth1(_nth1,LL2,_真偽値ならび), 行動述語から行動ならびを得る(_アリティ,_nth1,_行動述語名ならび,_行動ならび). デシジョンテーブル引数を取得して転置する(_アリティ,_条件述語名ならび,LL2) :- findall(_引数ならび,( member(_条件述語名,_条件述語名ならび), length(_引数ならび,_アリティ), P =.. [_条件述語名|_引数ならび], call(P)), LL2), 転置(LL1,LL2), 行動述語から行動ならびを得る(_アリティ,_nth1,_行動述語名ならび,_行動ならび) :- findall(_行動,( '行動述語の_nth1引数を得る'(_アリティ,_nth1,_行動述語名ならび,_行動)), _行動ならび). '行動述語の_nth1引数を得る'(_アリティ,_nth1,_行動述語名ならび,_行動) :- member(_行動述語名,_行動述語名ならび), length(L,_アリティ), P =.. [_行動述語名|L], call(P), nth1(_nth1,L,_行動). % % ?- デシジョンテーブル(8,[体重が軽い,体が柔らかい,敏捷である],[真,偽,真],[受験資格がある],_nth1,_行動ならび). % % _nth1 = 7, % _行動ならび = [偽] % % 以下のサイトは # # ある専門学校の受験資格のデシジョンテーブル # # <条件> 1 2 3 4 5 6 7 8 # # 体重が軽い N N N N Y Y Y Y # 体が柔らかい N N Y Y N Y N Y # 敏捷である N Y Y N N N Y Y # # <行動> # # 受験資格がある X # 受験資格がない X X X X X X X 体重が軽い(偽,偽,偽,偽,真,真,真,真). 体が柔らかい(偽,偽,真,真,偽,真,偽,真). 敏捷である(偽,真,真,偽,偽,偽,真,真). 受験資格がある(偽,偽,偽,偽,偽,偽,偽,真). デシジョンテーブル(_アリティ,_条件述語名ならび,_真偽値ならび,_行動述語名ならび,_nth1,_行動ならび) :- デシジョンテーブル(_アリティ,_条件述語名ならび,_真偽値ならび,_nth1), findall(_行動,( '行動述語の_nth1引数を得る'(_アリティ,_nth1,_行動述語名ならび,_行動)), _行動ならび). デシジョンテーブル(_,[],_,_nth1). デシジョンテーブル(_アリティ,[_述語名|R1],[_真偽値|R2],_nth1) :- length(L,_アリティ), P =.. [_述語名|L], call(P), nth1(_nth1,L,_真偽値), デシジョンテーブル(_アリティ,R1,R2,_nth1). '行動述語の_nth1引数を得る'(_アリティ,_nth1,_行動述語名ならび,_行動) :- member(_行動述語名,_行動述語名ならび), length(L,_アリティ), P =.. [_行動述語名|L], call(P), nth1(_nth1,L,_行動). % % ?- デシジョンテーブル(8,[体重が軽い,体が柔らかい,敏捷である],[真,偽,真],[受験資格がある],_nth1,_行動ならび). % % _nth1 = 7, % _行動ならび = [偽] % % 以下のサイトは # # モンテカルロ法により円周率を求める # 試行限界数(10000000). モンテカルロ法により円周率を求める(_試行限界数,_円周率) :- var(_試行限界数), 試行限界数(_試行限界数), モンテカルロ法により円周率を求める(_試行限界数,_円周率),!. モンテカルロ法により円周率を求める(_試行限界数,_円周率) :- count('_x,_yを乱数から求め、ピタゴラスの定理を使って座標点(_x,_y)が四分の一円の内部であるか判定する'(_試行限界数), _四分の一円の内部に落ちた数), _円周率 is (_四分の一円の内部に落ちた数 * 4.0) / _試行限界数. '_x,_yを乱数から求め、ピタゴラスの定理を使って座標点(_x,_y)が四分の一円の内部であるか判定する'(_試行限界数) :- between(1,_試行限界数,_), '0から1の乱数2つをペアにし、片方をx座標、もう1方をyとする'(_x,_y), ピタゴラスの定理を使って座標点が円の内部であるか判定する(_x,_y). '0から1の乱数2つをペアにし、片方をx座標、もう1方をyとする'(_x,_y) :- _x is random(100001) / 100000, _y is random(100001) / 100000,!. ピタゴラスの定理を使って座標点が円の内部であるか判定する(_x,_y) :- 1.0 >= _x * _x + _y * _y. count(P,N) :- findall(1,P,L), length(L,N). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362715265/18 # :- dynamic(todo/1). 'お題 こんな感じにコマンドラインで動くTODO管理アプリを作りなさい $ ./todo add "本屋でPythonの本を買ってくる" $ ./todo add "たいやきを買ってくる" $ ./todo list 1: 本屋でPythonの本を買ってくる 2: たいやきを買ってくる $ ./todo done 2 $ ./todo list 1: たいやきを買ってくる アドリブも可' :- todoを準備する, user_parameters(_パラメーター), 解析実行(_パラメーター), todoデータを保存する. 解析実行([add,_文字列]) :- assertz(todo(_文字列)),!. 解析実行([done,N]) :- 'N行目のtodoデータを削除する'(N). 解析実行([list]) :- 行番号を振ってtodoデータを表示する. 'N行目のtodoデータを削除する'(N) :- 一旦todoデータを削除しながらリストに取得し(L1), 'N番目の要素を削除して'(N,L1,L2), todoデータを定義し直す(L2). 一旦todoデータを削除しながらリストに取得し(L) :- findall(_データ,( retract(todo(_データ)), L). 'N番目の要素を削除して'(N,L1,L2) :- length([_|L0],N), append(L0,[_|R],L1), append(L0,R,L2). todoデータを定義し直す(L2) :- forall( member(_データ,L2), assertz(todo(_データ))). 行番号を振ってtodoデータを表示する :- findall(_データ,todo(_データ),L), forall(( nth1(No,L,_データ), writef('%t %t\n',[No,_データ]). todoデータを準備する :- reconsult('todo.pro'). todoデータを保存する :- tell('todo.pro'), listing(todo/1), told. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/140 # # [1] 授業単元: Cプロ # [2] 問題文(含コード&リンク): # 3行3列の行列aを入力後、余因子行列で行列値|a|を求める # '3行3列の行列aを入力後、余因子行列で行列値|a|を求める' :- '3行3列の行列aを入力'(_a), '余因子行列で行列値|a|を求める'(_a,_行列式_aの値), writef('行列値|a|は%tです。\n',[_行列式_aの値]). '3行3列の行列aを入力'(_a) :- length(_a,3), findall(L,( nth1(_nth1,_a,L), length(L,3), '3列入力する'(_nth1,1,L)), _a). '3列入力する'(_,_,[]). '3列入力する'(_行位置,_列位置,[V|R]) :- writef('列入力[%t][%t] : ',[_行位置,_列位置]), get_line(Line), atom_to_term(Line,V,_), _列位置_2 is _列位置 + 1, '3列入力する'(_行位置,_列位置_2,R). '余因子行列を使って逆行列を得る'(_n,_正方行列,_逆行列) :- '余因子行列で行列値|a|を求める'(_正方行列,_行列式の値), 余因子行列(_n,_正方行列,_余因子行列), 転置(_余因子行列,_転置された余因子行列), 行列のすべての要素に値を掛ける(1,_n,_転置された余因子行列,1 / _行列式の値,_逆行列). 行列のすべての要素に値を掛ける(_行目,_n,LL,_,LL) :- _行目 > _n,!. 行列のすべての要素に値を掛ける(_行目,_n,LL1,_乗数 / _除数,LL2) :- '行基本変形'(_乗数 / _除数 # _行目,LL1,LL3), _行目_2 is _行目 + 1, 行列のすべての要素に値を掛ける(_行目_2,_n,LL3,_乗数 / _除数,LL2). '余因子行列で行列値|a|を求める'(_a,_行列式_aの値) :- 余因子行列(_a,_余因子行列), _a = [_aの第一行|_], _余因子行列 = [_余因子行列の第一行|_], '二つのならびの積の和'(_aの第一行,_余因子行列の第一行,_行列式_aの値). '二つのならびの積の和'([],[],0). '二つのならびの積の和'([A|R1],[B|R2],S) :- '二つのならびの積の和'(R1,R2,S_1), S is S_1 + A * B. 余因子行列(_正方行列,_余因子行列) :- length(_正方行列,_n), 余因子行列(_n,_正方行列,_余因子行列). 余因子行列(_n,_正方行列,_余因子行列) :- length(_余因子行列,_n), findall(L,( nth1(_i,_余因子行列,L), 余因子行列の要素が余因子である(_n,_正方行列,_i,L)), _余因子行列). 余因子行列の要素が余因子である(_n,_正方行列,_i,L) :- length(L,_n), findall(_余因子,( nth1(_j,L,_余因子), 余因子(_n,_正方行列,_i,_j,_余因子)), L). 行列式の値(1,[[_]],1) :- !. 行列式の値(2,_正方行列,_行列式の値) :- 二つの対角要素の積の差を得る(_n,_正方行列,_行列式の値),!. 行列式の値(_n,_正方行列,_行列式の値) :- '余因子行列で行列値|a|を求める'(_正方行列,_行列式の値). 余因子(_n,_正方行列,_i,_j,_余因子) :- 'n次正方行列から、第i行と第j列を取り除いた正方行列(n-1次正方行列の行列式に、(-1)のi+j乗をかけたものを、Aの(i,j)余因子といい、Cijで表します。'(_n,_正方行列,_i,_j,_余因子). 'n次正方行列から、第i行と第j列を取り除いた正方行列(n-1次正方行列の行列式に、(-1)のi+j乗をかけたものを、Aの(i,j)余因子といい、Cijで表します。'(_n,_正方行列,_i,_j,_余因子) :- '正方行列からi行j列を取り除いた行列式の値'(_n,_正方行列,_i,_j,_n_1次正方行列の行列式の値), 'i,jから乗数を得る'(_i,_j,_乗数), _余因子 is _乗数 * _n_1次正方行列の行列式の値. '正方行列からi行j列を取り除いた行列式の値'(_n,_正方行列,_i,_j,_n_1次正方行列の行列式の値) :- '正方行列から第i行と第j列を取り除く'(_正方行列,_i,_j,_n_1次正方行列), _n_1 is _n - 1, 行列式の値(_n_1,_n_1次正方行列,_n_1次正方行列の行列式の値). '正方行列から第i行と第j列を取り除く'(_正方行列,_i,_j,_n_1次正方行列) :- '第何行を取り除く'(_正方行列,_i,_第i行が取り除かれた行列), 転置(_第i行が取り除かれた行列,_転置された第i行が取り除かれた行列), '第何行を取り除く'(_転置された第i行が取り除かれた行列,_j,_転置された第i行第j列が取り除かれた行列), 転置(_転置された第i行第j列が取り除かれた行列,_n_1次正方行列). '第何行を取り除く'(_正方行列,_第何行,_第i行が取り除かれた行列) :- append(L0,[L|R],_正方行列), length([_|L0],_第何行), append(L0,R,_第i行が取り除かれた行列). 二つの対角要素の積の差を得る(0,[],1) :- !. 二つの対角要素の積の差を得る(1,[[N]],N) :- !. 二つの対角要素の積の差を得る(_n,_正方行列,_二つの対角要素の積の差) :- 二つの対角要素の積を得る(_正方行列,_右下がり対角要素の積,_右上がり対角要素の積), _二つの対角要素の積の差 is _右下がり対角要素の積 - _右上がり対角要素の積. 二つの対角要素の積を得る(_正方行列,_右下がり対角要素の積,_右上がり対角要素の積) :- 二つの対角要素を得る(_正方行列,_右下がり対角要素ならび,_右上がり対角要素ならび), 対角要素の掛算(_右下がり対角要素ならび,_右下がり対角要素の積), 対角要素の掛算(_右上がり対角要素ならび,_右上がり対角要素の積). 二つの対角要素を得る(_正方行列,_右下がり対角要素ならび,_右上がり対角要素ならび) :- 右下がり対角要素ならび(_正方行列,_右下がり対角要素ならび), 右上がり対角要素ならび(_正方行列,_右上がり対角要素ならび). 右下がり対角要素ならび(_正方行列,_右下がり対角要素ならび) :- findall(V,( nth1(_nth1,_正方行列,L), nth1(_nth1,L,V)), _右下がり対角要素ならび). 右上がり対角要素ならび(_正方行列,_右上がり対角要素ならび) :- reverse(_正方行列,_行を逆転した正方行列), 右下がり対角要素ならび(_行を逆転した正方行列,_右上がり対角要素ならび). 左下がり対角要素ならび(_正方行列,_左下がり対角要素ならび) :- findall(V,( nth1(_nth1,_正方行列,L), length([_|R],_nth1), append(_,[V|R],L)), _左下がり対角要素ならび),!. 左上がり対角要素ならび(_正方行列,_左上がり対角要素ならび) :- reverse(_正方行列,_行を逆転した正方行列), 左下がり対角要素ならび(_行を逆転した正方行列,_左上がり対角要素ならび). 'i,jから乗数を得る'(_i,_j,(-1)) :- 1 is (_i + _j) mod 2,!. 'i,jから乗数を得る'(_i,_j,1) :- 0 is (_i + _j) mod 2,!. 対角要素の掛算([],1). 対角要素の掛算([A|R],X) :- 対角要素の掛算(R,Y), X is A * Y. 'n次正方行列の要素を行・列順序で取り出す'(_n,_正方行列,_i行,_j列,_正方行列の要素) :- between(1,_n,_i行), nth1(_i行,_正方行列,L), nth1(_j列,L,_正方行列の要素). 'n次正方行列の要素を列・行順序で取り出す'(_n,_正方行列,_i行,_j列,_正方行列の要素) :- between(1,_n,_j列), nth1(_i行,_正方行列,L), nth1(_j列,L,_正方行列の要素). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/669 # # oracleなんですが、次の表に # # 日付 数 # 1/1 5 # 1/2 2 # 1/3 -8 # 1/4 6 # 1/5 8 # # 残と繰越を計算して↓のようにしたいのですが # どのようなSQLにすればいいでしょうか?>< # # 日付 残 数 繰越 # 1/1 0 5 5 ←初日の残はゼロ、繰越=残+数 # 1/2 5 2 7 ←残=前日の繰越 # 1/3 7 -8 -1 # 1/4 0 6 6 ←前日の繰越がマイナスなら残はゼロに # 1/5 6 8 14 # # テーブル('1/1',5). テーブル('1/2',2). テーブル('1/3',-8). テーブル('1/4',6). テーブル('1/5',8). '1/1の期首残'(0). 'oracleなんですが、次の表に 日付 数 1/1 5 1/2 2 1/3 -8 1/4 6 1/5 8 残と繰越を計算して↓のようにしたいのです どのようなSQLにすればいいでしょうか?>< 日付 残 数 繰越 1/1 0 5 5 ←初日の残はゼロ、繰越=残+数 1/2 5 2 7 ←残=前日の繰越 1/3 7 -8 -1 1/4 0 6 6 ←前日の繰越がマイナスなら残はゼロに 1/5 6 8 14'(_日付,_残,_数,_繰越) :- '1/1の期首残'(_期首残), findall([_日付,_数],( テーブル(_日付,_数)), _日付_数ならび), 残と繰越を計算する(_期首残,_日付_数ならび,_日付,_残,_数,_繰越). 残と繰越を計算する(_期首残,_日付_数ならび,_日付,_残,_数,_繰越) :- append(L0,[[_日付,_数]|_],_日付_数ならび), 調整前の残を求める([[_,_期首残]|L0],_調整前の残), 残と繰越の調整(_調整前の残,_数,_残,_繰越). 調整前の残を求める(LL,_調整前の残) :- findall(_数,member([_,_数],LL),_数ならび), sum_list(_数ならび,_調整前の残). 残と繰越の調整(_残,_数,_残,_繰越) :- _残 >= 0, _繰越 is _残 + _数,!. 残と繰越の調整(_残_1,_数,0,_数) :- _残_1 < 0. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/651 # # 2010年度の月毎の件数をまとめたデータですが # 累計を求めたいです。 # # 月 2010年度 # 01 1 # 02 2 # 03 1 # 04 3 # 05 2 # 06 2 # 07 2 # 08 1 # 09 2 # 10 2 # 11 2 # 12 1 # # 求めたい結果 # 月 2010年度累計 # 04 3 # 05 5 # 06 7 # 07 9 # 08 10 # 09 12 # 10 14 # 11 16 # 12 17 # 01 18 # 02 20 # 03 21 # # これだけのデータから # スタートを4月にして累計を求める方法は # ありますでしょうか? # よろしくお願いします。 # '2010年度データ'('01',1). '2010年度データ'('02',2). '2010年度データ'('03',1). '2010年度データ'('04',3). '2010年度データ'('05',2). '2010年度データ'('06',2). '2010年度データ'('07',2). '2010年度データ'('08',1). '2010年度データ'('09',2). '2010年度データ'('10',2). '2010年度データ'('11',2). '2010年度データ'('12',1). '2010年度の月毎の件数をまとめたデータですが累計を求めたいです。'(_月,_累計件数) :- _月順序 = ['04','05','06','07','08','09','10','11','12','01','02','03'], findall(_件数,( member(_月,_月順序), '2010年度データ'(_月,_件数)), _月別件数), 累計表示(_月順序,_月別件数,_月,_累計件数). 累計表示(_月順序,_月別件数,_月,_累計件数) :- append(L1,[_件数|R],_月別件数), length(L1,_nth0), nth0(_nth0,_月順序,_月), sum([_件数|L1],_累計件数). sum([],0). sum([N|R],S) :- sum(R,S_1), S is S_1 + N. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/651 # # 2010年度の月毎の件数をまとめたデータですが # 累計を求めたいです。 # # 月 2010年度 # 01 1 # 02 2 # 03 1 # 04 3 # 05 2 # 06 2 # 07 2 # 08 1 # 09 2 # 10 2 # 11 2 # 12 1 # # 求めたい結果 # 月 2010年度累計 # 04 3 # 05 5 # 06 7 # 07 9 # 08 10 # 09 12 # 10 14 # 11 16 # 12 17 # 01 18 # 02 20 # 03 21 # # これだけのデータから # スタートを4月にして累計を求める方法は # ありますでしょうか? # よろしくお願いします。 # '2010年度データ'('01',1). '2010年度データ'('02',2). '2010年度データ'('03',1). '2010年度データ'('04',3). '2010年度データ'('05',2). '2010年度データ'('06',2). '2010年度データ'('07',2). '2010年度データ'('08',1). '2010年度データ'('09',2). '2010年度データ'('10',2). '2010年度データ'('11',2). '2010年度データ'('12',1). '2010年度の月毎の件数をまとめたデータですが累計を求めたいです。'(_月,_累計件数) :- _月順序 = ['04','05','06','07','08','09','10','11','12','01','02','03'], findall(_件数,( member(_月,_月順序), '2010年度データ'(_月,_件数)), _月別件数), 累計表示(_月順序,_月別件数,0,_月,_累計件数). 累計表示([_月|R1],[_件数|R2],_累計件数_1,_月,_累計件数) :- _累計件数 is _累計件数_1 + _件数. 累計表示([_|R1],[_件数|R2],_累計件数_1,_月,_累計件数) :- _累計件数_2 is _累計件数_1 + _件数, 累計表示(R1,R2,_累計件数_2,_月,_累計件数). % 以下のサイトは %%%% zipの再帰的定義 %%%% zip([],[],[]). zip([A|R1],[B|R2],[[A,B]|R3]) :- zip(R1,R2,R3). %%%% zipの再帰を使わない定義 %%%% zip(L1,L2,L3) :- findall([A,B],( nth1(_nth1,L1,A), nth1(_nth1,L2,B)), L3). % L1,L2の要素数がそれぞれ1000だとすると, 1000 * 1000 = 1000000回 nth1が導出される % から注意。 % 以下のように改善が可能。 zip(L1,L2,L3) :- findall([A,B],( nth1(_nth1,L1,A), zip_1(_nth1,L2,B)), L3). zip_1(_nth1,L2,B) :- nth1(_nth1,L2,B),!. % 以下のサイトは # # 集約鍵の詳細化 (坂内広蔵氏による集約キーのグラフ化の研究の一部をなぞったもの) # 集約鍵の詳細化(_集約鍵ならび,_詳細化された集約鍵) :- append(_詳細化された集約鍵,_,_集約鍵ならび). % % ?- 集約鍵の詳細化([部,課,係],_詳細化された集約鍵). % % _詳細化された集約鍵 = []; % _詳細化された集約鍵 = [部]; % _詳細化された集約鍵 = [部,課]; % _詳細化された集約鍵 = [部,課,係]; % % false. % % ?- findall(L,集約鍵の詳細化([部,課,係],L),_詳細化された集約鍵ならび). % % _詳細化された集約鍵ならび = [[],[部],[部,課],[部,課,係]] % % ?- % % それでは、 % 集約鍵の詳細化とはどういう意味か。SQLを使って説明する。 ここでは社員数を把握している。 % % 集約鍵 = [] の場合、 % % select count(*) from 社員; % 336 % % % 集約鍵 = [部] の場合、 % % select 部,count(*) from 社員 group by 部; % 営業,200 % 開発,136 % % % 集約鍵 = [部,課] の場合、 % % select 部,課,count(*) from 社員 group by 部,課; % 営業,食品,112 % 営業,薬品,88 % 開発,食品,70 % 開発,薬品,60 % 開発,検査,6 % % % 集約鍵 = [部,課,係] の場合、 % % select 部,課,係,count(*) from 社員 group by 部,課,係; % 営業,食品,東東京,18 % 営業,食品,西東京,20 % 営業,食品,神奈川,20 % 営業,食品,埼玉,16 % 営業,食品,千葉,16 % 営業,食品,群馬,8 % 営業,食品,栃木,7 % 営業,食品,茨城,7 % 営業,薬品,東京,19 % 営業,薬品,神奈川,12 % <以下省略> % % 以下のサイトは # 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/1361082416/169 # # http://toro.2ch.net/test/read.cgi/tech/1357748713/775 # それで過去問さんにお願いがあるのですか、選りすぐった問題を一日一題のペースで載せていただけないでしょうか。 # # 1: http://toro.2ch.net/test/read.cgi/tech/1357748713/777 # 2: .http://toro.2ch.net/test/read.cgi/tech/1357748713/874 # 3.: ../test/read.cgi/tech/1361082416/59 # 4: .http://pc11.2ch.net/test/read.cgi/tech/1208268461/726 # [1] 授業単元:情報実験第一 # [2] 問題文:リストの全要素の最大公約数を求める述語 gcdlist を実装 # せよ。また、要素数が n であるリストに自然数 n 個を読み込み、関数 # gcdlist を用いてそれらの最大公約数を求めるプログラムを作成せよ。 # 'リストの全要素の最大公約数を求める述語 gcdlist を実装せよ。 また、要素数が n であるリストに自然数 n 個を読み込み、述語 gcdlist を用いて それらの最大公約数を求めるプログラムを作成せよ。'(_n,_最大公約数) :- '要素数が n であるリストに自然数 n 個を読み込み、gcdlist を用いて それらの最大公約数を求める'(_n,_最大公約数). gcdlist([N],N). gcdlist([N|R],_最大公約数) :- gcdlist(R,_最大公約数_2), 最大公約数をユークリッドの互除法で求める(N,_最大公約数_2,_最大公約数). 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). '要素数が n であるリストに自然数 n 個を読み込み、gcdlist を用いて それらの最大公約数を求める'(_n,_最大公約数) :- '要素数が n であるリストに自然数 n 個を読み込み'(_n,_リスト), gcdlist(_リスト,_最大公約数). '要素数が n であるリストに自然数 n 個を読み込み'(_n,_リスト) :- '要素数が n であるリスト'(_n,_リスト), findall(_自然数,( member(_,_リスト), 自然数を得る(自然数,_自然数)), _リスト). '要素数が n であるリスト'(_n,_リスト) :- length(_リスト,_n). % 以下のサイトは % % 文字列検索/8 % 文字列検索(_文字列,_切り取り開始文字列ならび,_切り取り終了文字列ならび,_切り取り開始以前文字列,_切り取り開始文字列,_切り取り文字列,_切り取り終了文字列,_残り文字列) :- atom_chars(_文字列,_文字ならび), 切り取り文字列ならびを文字ならびのならびに変換(_切り取り開始文字列ならび,_切り取り終了文字列ならび,_切り取り開始文字ならび候補,_切り取り終了文字ならび候補), 切り取り文字列まで読み飛ばし(_文字ならび,_切り取り開始文字ならび候補,_切り取り開始以前文字ならび,_切り取り開始文字ならび,_残り文字ならびの一), 文字ならび切り取り(_残り文字ならびの一,_切り取り終了文字ならび候補,_切り取り文字ならび,_切り取り終了文字ならび,_残り文字ならび), 切り取り文字列文字ならび変換(_切り取り開始以前文字ならび,_切り取り文字ならび,_切り取り終了文字ならび,_残り文字ならび,_切り取り開始文字ならび,_切り取り開始以前文字列,_切り取り文字列,_切り取り終了文字列,_残り文字列,_切り取り開始文字列). 切り取り文字列ならびを文字ならびのならびに変換(_切り取り開始文字列ならび,_切り取り終了文字列ならび,_切り取り開始文字ならび候補,_切り取り終了文字ならび候補) :- findall(_切り取り開始文字ならびの一,( member(_切り取り開始文字列の一,_切り取り開始文字列ならび) , atom_chars(_切り取り開始文字列の一,_切り取り開始文字ならびの一)), _切り取り開始文字ならび候補), findall(_切り取り終了文字ならびの一,( member(_切り取り終了文字列の一,_切り取り終了文字列ならび), atom_chars(_切り取り終了文字列の一,_切り取り終了文字ならびの一)), _切り取り終了文字ならび候補). 切り取り文字列文字ならび変換(_切り取り開始以前文字ならび,_切り取り文字ならび,_切り取り終了文字ならび,_残り文字ならび,_切り取り開始文字ならび,_切り取り開始以前文字列,_切り取り文字列,_切り取り終了文字列,_残り文字列,_切り取り開始文字列) :- atom_chars(_切り取り開始以前文字列,_切り取り開始以前文字ならび), atom_chars(_切り取り文字列,_切り取り文字ならび), atom_chars(_切り取り終了文字列,_切り取り終了文字ならび), atom_chars(_残り文字列,_残り文字ならび), atom_chars(_切り取り開始文字列,_切り取り開始文字ならび). 切り取り文字列まで読み飛ばし(_文字ならび,[],[],[],_文字ならび) :- !. 切り取り文字列まで読み飛ばし(_文字ならび,_切り取り開始文字ならび候補,[],_切り取り開始文字ならび,_残り文字ならび) :- member(_切り取り開始文字ならび,_切り取り開始文字ならび候補), append(_切り取り開始文字ならび,_残り文字ならび,_文字ならび). 切り取り文字列まで読み飛ばし([A|R1],_切り取り開始文字ならび候補,[A|R2],_切り取り開始文字ならび,R3) :- 切り取り文字列まで読み飛ばし(R1,_切り取り開始文字ならび候補,R2,_切り取り開始文字ならび,R3). 文字ならび切り取り([],_,[],[],[]) :- !. 文字ならび切り取り(_文字ならび,[],_文字ならび,[],[]) :- !. 文字ならび切り取り(_残り文字ならびの一,_終了文字ならび候補,_切り取り文字ならび,_終了文字ならび,_残り文字ならび) :- member(_終了文字ならび,_終了文字ならび候補), append(_終了文字ならび,_残り文字ならび,_終了文字ならびの二), append(_切り取り文字ならび,_終了文字ならびの二,_残り文字ならびの一). % 以下のサイトは % % PrologというのはFizzBuzz問題向きなのだろうか。 % fizzbuzz(N) :- findall(M,between(1,N,M),L), fizzbuzz([_],[_],L). fizzbuzz([_,_,_],[_,_,_,_,_],[_|R]) :- fizzbuzz([],[],['FizzBuzz'|R]). fizzbuzz([_,_,_],L2,[_|R]) :- fizzbuzz([],L2,['Fizz'|R]). fizzbuzz(L1,[_,_,_,_,_],[_|R]) :- fizzbuzz(L1,[],['Buzz'|R]). fizzbuzz(L1,L2,[A|R]) :- writef('%t ',[A]), fizzbuzz([_|L1],[_|L2],R). fizzbuzz(_,_,[]). fizzbuzz(N) :- fizbuzz(1,N,['','','Fizz'],['','','','','Buzz']). fizzbuzz(M,N,_,_) :- M > N,!. fizzbuzz(M,N,[_31,_32,_33],[_51,_52,_53,_54,_55]) :- 出力情報(_31,_51,M,_N), writef('%t%t%t ',[_31,_51,_N]), fizzbuzz(M,N,[_32,_33,_31],[_52,_53,_54,_55,_51]). 出力情報('','',_N,_N) :- !. 出力情報(_,_,_,''). fizzbuzz(N) :- findall(M,between(1,N,M),L), forall(fizzbuzz(['','','Fizz'],['','','','','Buzz'],L),true). fizzbuzz([A|R1],[B|R2],[N|R3]) :- fizzbuzz(A,B,N,C), writef('%t%t%t ',[A,B,C]). fizzbuzz([A|R1],[B|R2],[_|R3]) :- append(R1,[A],L1), append(R2,[B],L2), fizzbuzz(L1,L2,R3). fizzbuzz('','',N,N) :- !. fizzbuzz(A,B,_,''). % PrologによるFizzBuzz問題プログラムの比較 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/998 # # [1] 授業単元: # [2] 問題文(含コード&リンク): # FizzBuzz問題の要領で、1から100までの整数を、かいぎょう区切りで出力せよ、ただし、 # 3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」を、 # 数値の代わりに出力することとする # 'FizzBuzz問題の要領で、1から100までの整数を、かいぎょう区切りで出力せよ、ただし、 3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」を、 数値の代わりに、かいぎょう区切りで出力することとする' :- '1から100までの整数を、'(_整数), '3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」を、数値の代わりに、かいぎょう区切りで出力することとする'(_整数), _整数 = 100. '1から100までの整数を、'(_整数) :- between(1,100,_整数). '3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」を、数値の代わりに、かいぎょう区切りで出力することとする'(_整数) :- '3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」を、該当しない時は数値を'(_整数,_出力値), writef('%t\n',[_出力値]). '3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」を、該当しない時は数値を'(_整数,_出力文字列) :- '3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」のどれかが該当したとき'(_整数,_表示ならび), atomic_list_concat(_表示ならび,_表示文字列),!. '3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」を、該当しない時は数値を'(_整数,_整数). '3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」のどれかが該当したとき'(_整数,_表示ならび) :- findall(A,( '3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」の'(_整数,A)), _表示ならび), どれかが該当したとき(_表示ならび). '3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」の'(_整数,A) :- member([_除数,A],[[3,'Fizz'],[5,'Buzz'],[7,hoge]]), 0 is _整数 mod _除数. どれかが該当したとき([_|_]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/874 # # ../test/read.cgi/tech/1357748713/775 # http://pc11.2ch.net/test/read.cgi/tech/1202135539/607 # [1] 授業単元:プログラミング # [2] 問題文 :キーボードから西暦と月を入力するとカレンダーを #       表示するプログラムを作成せよ # キーボードから西暦と月を入力するとカレンダーを表示する :- キーボードから西暦と月を入力すると(_西暦,_月), カレンダーを表示する(_西暦,_月). キーボードから西暦と月を入力すると(_西暦,_月) :- 整数を得る(西暦,true,_西暦), 整数を得る(月,between(1,12,_月),_月). カレンダーを表示する(_西暦,_月) :- カレンダーを(_西暦,_月,_カレンダー), 表示する(_西暦,_月,_カレンダー). カレンダーを(_西暦,_月,_カレンダー) :- 月末日(_西暦,_月,_月末日), 'Zellerの公式を用いて曜日を得る'(_年,_月,1,_曜日を表す値,_曜日), findall(D,between(1,_月末日,D),L1), カレンダーの先頭に0を詰める(L1,L2), '7個組に分解'(L2,_カレンダー). 月末日(_西暦,2,29) :- うるう年(_西暦),!. 月末日(_,2,28) :- !. 月末日(_,_月,31) :- member(_月,[1,3,5,7,8,10,12]),!. 月末日(_,_月,30) :- member(_月,[4,6,9,11]),!. うるう年(_年) :- 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, 'Zellerの公式で使う曜日を表す値'(_曜日を表す値,_曜日),!. 'Zellerの公式で使う曜日を表す値'(0,日曜). 'Zellerの公式で使う曜日を表す値'(1,月曜). 'Zellerの公式で使う曜日を表す値'(2,火曜). 'Zellerの公式で使う曜日を表す値'(3,水曜). 'Zellerの公式で使う曜日を表す値'(4,木曜). 'Zellerの公式で使う曜日を表す値'(5,金曜). 'Zellerの公式で使う曜日を表す値'(6,土曜). all([],_). all([V|R],V) :- all(R,V). カレンダーの先頭に0を詰める(L1,L2) :- length(L0,_曜日を表す値), append(L0,L1,L2), all(L0,0),!. '7個組に分解'([],[]) :- !. '7個組に分解'([_1,_2,_3,_4,_5,_6,_7|R1],[[_1,_2,_3,_4,_5,_6,_7]|R2]) :- '7個組に分解'(R1,R2),!. '7個組に分解'(L,[L]). 表示する(_西暦,_月,_カレンダー) :- writef('\n%8r年 %t月\n\n',[_西暦,_月]), member(L,_カレンダー), 一行表示する(L), fail. 表示する(_西暦,_月,_カレンダー) :- write('\n'). 一行表示する([]) :- write('\n'). 一行表示する([0|R]) :- writef('%3r',[' ']), 一行表示する(R),!. 一行表示する([N|R]) :- writef('%3r',[N]), 一行表示する(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/705 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # [3] 環境 # 問題1メイン関数でキーボードから二つの整数n1とn2を読み込み,それらをexponent関数を呼び出して, # n1のn2乗を計算し,結果をメイン関数で表示するプログラムを書きなさい. # <実行例> # 二つの整数を入力してください. # n1 = 5 # n2 = 2 # 5の2乗は25です. # 問題2 5人の点数を読み込んでいき、その最高点を表示するプログラムを作成しなさい。 # 問題3 円の面積の一覧表を計算するプログラムを作成しなさい。 # <実行結果> # 半径 --- 面積 # 1.0 --- 3.14 # 1.1 --- 3.80 # 1.2 --- 4.52 # 1.3 --- 5.31 # 問題4 球の体積を計算するプログラムを作成しなさい。 # 実行例 # 体積 = 1766.25 # [3.1] OS: unix #  [3.2] コンパイラ名とバージョン: gcc #  [3.3] 言語: C # [4] 期限:2月19日 # [5] その他の制限: なし # よろしくお願いします。 球の体積を計算する(_球の半径,_球の体積) :- count(( between(1,100000,_), '3座標を乱数で得る'(X,Y,Z), 原点からの距離が球の半径の範囲(X,Y,Z)), _球の半径の範囲内の個数), _球の体積 is (_球の半径の範囲内の個数 / 100000) * (_球の半径 ^ 3) * 8. '3座標を乱数で得る'(X,Y,Z) :- X is random(1001) / 1000, Y is random(1001) / 1000, Z is random(1001) / 1000. 原点からの距離が球の半径の範囲(X,Y,Z) :- sqrt(X ^ 2 + Y ^ 2 + Z ^ 2) =< 1.0. count(P,N) :- findsum(1,P,F), N is truncate(F). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum(_値ならび,_合計値),!. sum(L,Sum) :- sum(L,0,Sum). sum([],Sum,Sum) :- !. sum([N|R],Sum_1,Sum) :- Sum_2 is Sum_1 + N, sum(R,Sum_2,Sum). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/705 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # [3] 環境 # 問題1メイン関数でキーボードから二つの整数n1とn2を読み込み,それらをexponent関数を呼び出して, # n1のn2乗を計算し,結果をメイン関数で表示するプログラムを書きなさい. # <実行例> # 二つの整数を入力してください. # n1 = 5 # n2 = 2 # 5の2乗は25です. # 問題2 5人の点数を読み込んでいき、その最高点を表示するプログラムを作成しなさい。 # 問題3 円の面積の一覧表を計算するプログラムを作成しなさい。 # <実行結果> # 半径 --- 面積 # 1.0 --- 3.14 # 1.1 --- 3.80 # 1.2 --- 4.52 # 1.3 --- 5.31 # 問題4 球の体積を計算するプログラムを作成しなさい。 # 実行例 # 体積 = 1766.25 # [3.1] OS: unix #  [3.2] コンパイラ名とバージョン: gcc #  [3.3] 言語: C # [4] 期限:2月19日 # [5] その他の制限: なし # よろしくお願いします。 '5人の点数を読み込んでいき、その最高点を表示する' :- findall(_点数,( between(1,5,_), 数を得る(点数,true,_点数)), _5人の点数ならび), 最高点(_5人の点数ならび,_最高点), writef('最高点は%tです\n',[_最高点). 最高点(_5人の点数ならび,_最高点) :- append(_,[_最高点|R],_5人の点数ならび), \+((member(A,R),A > _最高点)),!. % 以下のサイトは # http://mimizun.com/log/2ch/tech/972032579/115 # 115 :初心者 :2000/10/23(月) 16:45 # Cでのプログラミングをはじめて1ヶ月なんですが、 # 逆行列を計算するプログラムを作るという宿題が出ました。 # 手始めに4×4行列の逆行列を作ることが宿題です。 # おねいさんお願いします '4×4行列の逆行列を作る'(_対象行列,_4×4行列の逆行列) :- 単位行列(4,_単位行列), 対象行列の各行に対応する単位行列行を追加(_対象行列,_単位行列,_対象行列_2), 既約ガウス行列に変形(_対象行列_2,_既約ガウス行列), '5-8列を切り取る'(_既約ガウス行列,_4×4行列の逆行列),!. 対象行列の各行に対応する単位行列行を追加(_対象行列,_単位行列,_対象行列_2) :- findall(_行,( nth1(_nth1,_対象行列,_行_1), nth1(_nth1,_単位行列,_行_2), append(_行_1,_行_2,_行)), _対象行列_2). '5-8列を'(_既約ガウス行列,_4×4行列の逆行列) :- findall(R,( member([_,_,_,_|R],_既約ガウス行列)), _4×4行列の逆行列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/595 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): # 5列5行の多次元配列(0または1が適当に並べられているもの)を用意し # 1がある配列の上下左右の配列のうち2または3個1が存在するならその配列を0に変更し # そうでない場合は1のままにする この操作を10回行った配列を求めるプログラムを作成する # またこの配列は上下左右繋がっていて1,1の配列の場合上は1,5、左は5.1である # '5列5行の多次元配列(0または1が適当に並べられているもの)を用意し 1がある配列の上下左右の配列のうち2または3個1が存在するならその配列を0に変更し そうでない場合は1のままにする この操作を10回行った配列を求めるプログラムを作成する またこの配列は上下左右繋がっていて1,1の配列の場合上は1,5、左は5.1である'(_5列5行の多次元配列,_変換された5列5行の多次元配列) :- '5列5行の多次元配列(0または1が適当に並べられているもの)を用意し1がある配列の上下左右の配列のうち2または3個1が存在するならその配列を0に変更しそうでない場合は1のままにするこの操作を10回行った配列を求める'(_5列5行の多次元配列,_変換された5列5行の多次元配列). '5列5行の多次元配列(0または1が適当に並べられているもの)を用意し1がある配列の上下左右の配列のうち2または3個1が存在するならその配列を0に変更しそうでない場合は1のままにするこの操作を10回行った配列を求める'(_5列5行の多次元配列,_変換された5列5行の多次元配列) :- 前後左右の配列に1が2または3個存在するならこの配列の列全体を0に置換する(0,_5列5行の多次元配列,_変換された5列5行の多次元配列). 前後左右の配列に1が2または3個存在するならこの配列の列全体を0に置換することを10回繰り返す(10,_5列5行の多次元配列,_5列5行の多次元配列) :- !. 前後左右の配列に1が2または3個存在するならこの配列の列全体を0に置換することを10回繰り返す(N,_5列5行の多次元配列_1,_変換された5列5行の多次元配列) :- 前後左右の配列に1が2または3個存在するならこの配列の列全体を0に置換する(_5列5行の多次元配列_1,_5列5行の多次元配列_2), N_2 is N + 1, 前後左右の配列に1が2または3個存在するならこの配列の列全体を0に置換することを10回繰り返す(N2,_5列5行の多次元配列_2,_変換された5列5行の多次元配列). 前後左右の配列に1が2または3個存在するならこの配列の列全体を0に置換する(_5列5行の多次元配列_1,_5列5行の多次元配列_2) :- 列の置換(_5列5行の多次元配列_1,_置換された5列5行の多次元配列_1), 行の置換(_5列5行の多次元配列_1,_置換された5列5行の多次元配列_2), 二つの配列の論理積を取る(_置換された5列5行の多次元配列_1,_置換された5列5行の多次元配列_2,_5列5行の多次元配列_2). 行の置換(_5列5行の多次元配列,_置換された5列5行の多次元配列) :- '最終行を前、第一行を後ろに付加した5列6行の多次元配列'(_5列5行の多次元配列,_5列7行の多次元配列), findall(L,( append(L0,[_前の行,_行,_後の行|R],_5列7行の多次元配列), '1が2または3個存在するならこの配列の列全体を0に置換する'(_前の行,_行,_後の行,L)), _置換された5列5行の多次元配列). 列の置換(_5列5行の多次元配列,_置換された5列5行の多次元配列) :- 転置(_5列5行の多次元配列,_転置された5列5行の多次元配列), 行の置換(_転置された5列5行の多次元配列,_置換された転置された5列5行の多次元配列_1), 転置(_置換された転置された5列5行の多次元配列_1,_置換された5列5行の多次元配列). '最終行を前、第一行を後ろに付加した5列7行の多次元配列'(_5列5行の多次元配列,_5列7行の多次元配列) :- last(_5列5行の多次元配列,_最終行), _5列5行の多次元配列 = [_第一行|_], append([_最終行|_5列5行の多次元配列],[_第一行],_5列7行の多次元配列),!. '1が2または3個存在するならこの配列の列全体を0に置換する'(_前の行,_行,_後の行,[0,0,0,0,0]) :- count(member(1,_前の行),_前の行の1の個数), between(2,3,_前の行の1の個数),!. '1が2または3個存在するならこの配列の列全体を0に置換する'(_前の行,_行,_後の行,[0,0,0,0,0]) :- count(member(1,_後の行),_後の行の1の個数), between(2,3,_後の行の1の個数),!. '1が2または3個存在するならこの配列の列全体を0に置換する'(_,_行,_,_行). 二つの配列の論理積を取る([],[],[]) :- !. 二つの配列の論理積を取る([L1|R1],[L2|R2],[L3|R3]) :- '2つのならび要素の論理積'(L1,L2,L3), 二つの配列の論理積を取る(R1,R2,R3). '2つのならび要素の論理積'([],[],[]) :- !. '2つのならび要素の論理積'([N1|R1],[N2|R2],[N3|R3]) :- N3 is N1 /\ N2, '2つのならび要素の論理積'(R1,R2,R3). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/637 # # 1] 授業単元: プログラミング 演習(構造体) # [2] 問題文(含コード&リンク): 3冊の本の名前、ISBN、著者名を入力し一覧表示しなさい。 # ただし、ISBNの4,6,12,16桁目に'-'が入っていない場合エラー表示しなさい。 # '3冊の本の名前、ISBN、著者名を入力し一覧表示しなさい。ただし、ISBNの4,6,12,16桁目に'-'が入っていない場合エラー表示しなさい。' :- '3冊の本の名前、ISBN、著者名を入力し'(_3冊の本), 一覧表示しなさい(_3冊の本). '3冊の本の名前、ISBN、著者名を入力し'(_3冊の本) :- findall([_本の名前,_ISBN,_著者名],( between(1,3,_), 本の名前の入力(_本の名前), 'ISBNの入力'(_ISBN), 著者名の入力(_著者名)), _3冊の本). 本の名前の入力(_本の名前) :- write('本の名前を入力してください : '), get_line(_本の名前). 'ISBNの入力'(_本の名前) :- write('ISBNを入力してください : '), get_line(_ISBN). 著者名の入力(_著者名) :- write('著者名を入力してください : '), get_line(_著者名). 一覧表示しなさい([]). 一覧表示しなさい([[_本の名前,_ISBN,_著者名]|R]) :- writef('%20l %17l %12l',[_本の名前,_ISBN,_著者名]), 'ただし、ISBNの4,6,12,16桁目に'-'が入っていない場合エラー表示しなさい。'(_ISBN), write('\n'), 一覧表示しなさい(R). 'ただし、ISBNの4,6,12,16桁目に'-'が入っていない場合エラー表示しなさい。'(_ISBN文字列) :- atom_chars(_ISBN文字列,[_,_,_,-,_,-,_,_,_,_,_,-,_,_,_,-|_]),!. 'ただし、ISBNの4,6,12,16桁目に'-'が入っていない場合エラー表示しなさい。'(_ISBN文字列) :- write(' %ISBN形式エラー '). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/609 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # 問題1 キーボードから入力した複数個の整数の、加算と積算の計算結果を表示するプログラムを作成しなさい。
ただし、このプログラムは、連続して実行される前半と後半の2部構成で作成してください。 # 0が入力された時点で、入力処理を終了し結果の表示を行ってください。 # すなわち、前半の処理では、キーボードから入力した数値の加算合計の表示を、0が入力されるまで繰返し、後半の処理ではキーボードから入力した数値の積算値の表示を、0が入力されるまで繰返すプログラムを作成してください。 # 【条件】 
前半の「和を求める」繰返しは while 文、後半の「積を求める」繰返しは do-while 文を使用して作成すること。 # 【実行例】
=加算処理= # 
値:6
 # 値:8 # 
値:12
 # 値:0 # 
合計は26です。 # 
=積算処理= # 
値:2 # 
値:6 # 
値:3 # 
値:3 # 
値:0
 # 積算値は108です。 # 問題2 繰返し処理を用いて、m ÷ nの計算をするプログラム(商を求める)を作成しなさい。 
ただし、演算に割り算記号 / を使ってはいけません。また、mとnはキーボードから入力してください。 # 【ヒント】 
・割り算をするとは、mからnを何回引くことができたか?を調べることと等価です 。元の数mが正の間、nを引くことができた回数が、割り算の商となります。 # この回数を、 繰返し処理を使って数えさせてください。 
・繰返し条件は、「mからnを引いた結果が正の値の間」繰り返し、商を1ずつ増やしていきます。 # 負の値になったら、繰返しを終了します。 # '問題1 キーボードから入力した複数個の整数の、加算と積算の計算結果を表示するプログラムを作成しなさい。 ただし、このプログラムは、連続して実行される前半と後半の2部構成で作成してください。 0が入力された時点で、入力処理を終了し結果の表示を行ってください。 すなわち、前半の処理では、キーボードから入力した数値の加算合計の表示を、0が入力されるまで繰返し、 後半の処理ではキーボードから入力した数値の積算値の表示を、0が入力されるまで繰返すプログラムを作成してください。' :- 'キーボードから複数個の整数を入力する(0が入力されるまで繰返す)'(_整数ならび), '前半の処理では、キーボードから入力した数値の加算合計の表示を'(_整数ならび), '後半の処理ではキーボードから入力した数値の積算値の表示を'(_整数ならび). 'キーボードから複数個の整数を入力する(0が入力されるまで繰返す)'(_整数ならび) :- findall(_整数,( 整数を得る('整数(0の入力で終了)',true,_整数), ( _整数 = 0,!,fail; true)), _整数ならび). '前半の処理では、キーボードから入力した数値の加算合計の表示を'(_整数ならび) :- atomic_list_concat(_整数ならび,' + ',_加算対象文字列), atom_to_term(_加算対象文字列,_加算式,_), _加算合計 is _加算式, writef('%t = %t\n',[_加算対象文字列,_加算合計]). '後半の処理ではキーボードから入力した数値の積算値の表示を'(_整数ならび) :- atomic_list_concat(_整数ならび,' * ',_積算対象文字列), atom_to_term(_積算対象文字列,_積算式,_), _数値の積算値 is _積算式, writef('%t = %t\n',[_積算対象文字列,_数値の積算値]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/609 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # 問題1 キーボードから入力した複数個の整数の、加算と積算の計算結果を表示するプログラムを作成しなさい。
ただし、このプログラムは、連続して実行される前半と後半の2部構成で作成してください。 # 0が入力された時点で、入力処理を終了し結果の表示を行ってください。 # すなわち、前半の処理では、キーボードから入力した数値の加算合計の表示を、0が入力されるまで繰返し、後半の処理ではキーボードから入力した数値の積算値の表示を、0が入力されるまで繰返すプログラムを作成してください。 # 【条件】 
前半の「和を求める」繰返しは while 文、後半の「積を求める」繰返しは do-while 文を使用して作成すること。 # 【実行例】
=加算処理= # 
値:6
 # 値:8 # 
値:12
 # 値:0 # 
合計は26です。 # 
=積算処理= # 
値:2 # 
値:6 # 
値:3 # 
値:3 # 
値:0
 # 積算値は108です。 # 問題2 繰返し処理を用いて、m ÷ nの計算をするプログラム(商を求める)を作成しなさい。 
ただし、演算に割り算記号 / を使ってはいけません。また、mとnはキーボードから入力してください。 # 【ヒント】 
・割り算をするとは、mからnを何回引くことができたか?を調べることと等価です 。元の数mが正の間、nを引くことができた回数が、割り算の商となります。 # この回数を、 繰返し処理を使って数えさせてください。 
・繰返し条件は、「mからnを引いた結果が正の値の間」繰り返し、商を1ずつ増やしていきます。 # 負の値になったら、繰返しを終了します。 # '問題1 キーボードから入力した複数個の整数の、加算と積算の計算結果を表示するプログラムを作成しなさい。 ただし、このプログラムは、連続して実行される前半と後半の2部構成で作成してください。 0が入力された時点で、入力処理を終了し結果の表示を行ってください。 すなわち、前半の処理では、キーボードから入力した数値の加算合計の表示を、0が入力されるまで繰返し、 後半の処理ではキーボードから入力した数値の積算値の表示を、0が入力されるまで繰返すプログラムを作成してください。' :- 'キーボードから複数個の整数を入力する(0が入力されるまで繰返す)'(_整数ならび), '前半の処理では、キーボードから入力した数値の加算合計の表示を'(_整数ならび), '後半の処理ではキーボードから入力した数値の積算値の表示を'(_整数ならび). 'キーボードから複数個の整数を入力する(0が入力されるまで繰返す)'(_整数ならび) :- findall(_整数,( 整数を得る('整数(0の入力で終了)',true,_整数), ( _整数 = 0,!,fail; true)), _整数ならび). '前半の処理では、キーボードから入力した数値の加算合計の表示を'(_整数ならび) :- 数値の加算合計(_整数ならび,_加算合計), atomic_list_concat(_整数ならび,' + ',_加算対象文字列表示), writef('%t = %t\n',[_加算対象文字列表示,_加算合計]). 数値の加算合計([],0). 数値の加算合計([N|R],_加算合計) :- 数値の加算合計(R,_加算合計_1), _加算合計 is N + _加算合計_1. '後半の処理ではキーボードから入力した数値の積算値の表示を'(_整数ならび) :- 数値の積算値(_整数ならび,_数値の積算値), atomic_list_concat(_整数ならび,' * ',_積算対象文字列表示), writef('%t = %t\n',[_積算対象文字列表示,_数値の積算値]). 数値の積算値([N],N) :- !. 数値の積算値([N|R],_数値の積算値) :- 数値の積算値(R,_数値の積算値_1), _数値の積算値 is N * _数値の積算値_1. % 以下のサイトは # 出典:: http://viva2ch.net/tech/976462999.html # # プロローグについて質問です。 # SWI-Prologのplwin Version5.2.13でプログラムを組んでいます。 # atomに重複があれば最初のatomは残して後ろの重複したatomは消す、という # プログラムを作りたいのですが…できません。 # # 動作は # remdup([a, b, c, a, d, c], X). # は # X=[a, b, c, d] # となるはずです。 # # 本に載っていたのを試したのですが # 順番が逆になってしまいます。↓ # # remdup(L, M) :- dupacc(L, [], M). # dupacc([], A, A). # dupacc([H|T], A, L) :- member(H, A), dupacc(T, A, L). # dupacc([H|T], A, L) :- dupacc(T, [H|A], L). # # 結果: # 1 ?- remdup([a, b, c, a, d, c], X). # X = [d, c, b, a] # # reverse()を「使わずに」どうにか完成させたいのですが # できますでしょうか? # ちなみにmember()やappend()、atomp()、listp()、last()など基本的な関数は既に作りました、 # ですからそれらは使えます。 # どうかお助けください。m(__)m remdup(L,X) :- atomに重複があれば最初のatomは残して後ろの重複したatomは消す(L,X). atomに重複があれば最初のatomは残して後ろの重複したatomは消す(L,X) :- findall(A,( append(L0,[A|_],L), \+(member(A,L0))), X). % 以下のサイトは # 出典:: http://viva2ch.net/tech/976462999.html # # プロローグについて質問です。 # SWI-Prologのplwin Version5.2.13でプログラムを組んでいます。 # atomに重複があれば最初のatomは残して後ろの重複したatomは消す、という # プログラムを作りたいのですが…できません。 # # 動作は # remdup([a, b, c, a, d, c], X). # は # X=[a, b, c, d] # となるはずです。 # # 本に載っていたのを試したのですが # 順番が逆になってしまいます。↓ # # remdup(L, M) :- dupacc(L, [], M). # dupacc([], A, A). # dupacc([H|T], A, L) :- member(H, A), dupacc(T, A, L). # dupacc([H|T], A, L) :- dupacc(T, [H|A], L). # # 結果: # 1 ?- remdup([a, b, c, a, d, c], X). # X = [d, c, b, a] # # reverse()を「使わずに」どうにか完成させたいのですが # できますでしょうか? # ちなみにmember()やappend()、atomp()、listp()、last()など基本的な関数は既に作りました、 # ですからそれらは使えます。 # どうかお助けください。m(__)m atomに重複があれば最初のatomは残して後ろの重複したatomは消す(L,X) :- remdup(L,X). remdup(L,X) :- findall(A,( append(L0,[A|_],L), \+(member(A,L0))), X). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/528 # # [1] 授業単元: C言語入門 # [2] 問題文(含コード&リンク): # 入力された数値の回数分だけ乱数を使ってコイン投げを行い, # 表裏が出る枚数をカウントして表示させるプログラム を作りなさい。 # '入力された数値の回数分だけ乱数を使ってコイン投げを行い,表裏が出る枚数をカウントして表示させる' :- '入力された数値の'(_入力された数値), '数値の回数分だけ乱数を使ってコイン投げを行い,表裏が出る枚数をカウントして'(_入力された数値,_表が出た枚数,_裏が出た枚数), 表示させる(_表が出た枚数,_裏が出た枚数). '入力された数値の'(_入力された数値) :- 整数を得る(コイン投げをする回数,_入力された数値 > 0,_入力された数値). '数値の回数分だけ乱数を使ってコイン投げを行い,表裏が出る枚数をカウントして'(_入力された数値) :- findall([_表,_裏],( between(1,_入力された数値,_), '乱数を使ってコイン投げを行い'(_表,_裏)), LL), 列要素の加算(LL,[_表が出た枚数,_裏が出た枚数]), '乱数を使ってコイン投げを行い'(1,0) :- 1 is random(2),!. '乱数を使ってコイン投げを行い'(0,1). 列要素の加算(LL,_合計ならび) :- 転置(LL,LL2), findall(_合計,( member(L,LL2), sum(L,_合計)), _合計ならび). 表示させる(_表が出た枚数,_裏が出た枚数) :- writef('表が出た枚数 = %t, 裏が出た枚数 = %t\n',[_表が出た枚数,_裏が出た枚数]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1359210850/199 # # テキストで # 11111 # 22222 # 33333 # 44444 # 55555 # # というのを # # 12345 # 12345 # 12345 # 12345 # 12345 # # という風に90度変更したようにする方法を教えてください # # 'テキストで 11111 22222 33333 44444 55555 というのを 12345 12345 12345 12345 12345 という風に90度変更したようにする方法を教えてください' :- 'テキストで 11111 22222 33333 44444 55555 というのを'(LL1), '12345 12345 12345 12345 12345 という風に90度変更する'(LL1,_転置された文字列). 'テキストで 11111 22222 33333 44444 55555 というのを'(LL) :- split('11111 22222 33333 44444 55555',['\n'],L1), findall(L,( member(_文字列,L1), atom_chars(_文字列,L)), LL). '12345 12345 12345 12345 12345 という風に90度変更する'(LL1,_転置された文字列) :- 転置(LL1,LL2), findall(S,( member(L,LL2), atomic_list_concat(L,S)), L4), atomic_list_concat(L4,'\n',_転置された文字列). % 以下のサイトは # @nishio # Prologでfoo([t, f], 3, RET)とかやったらRETが[[t, t, t], [t, t, f], ..., [f, f, f]]になるような述語fooの作り方に悩んでいる # 'Prologでfoo([t, f], 3, RET)とかやったらRETが[[t, t, t], [t, t, f], ..., [f, f, f]]になるような述語fooの作り方に悩んでいる'(_要素リスト,N,RET) :- foo(_要素リスト,N,RET). foo(_要素リスト,N,RET) :- findall(L,foo_1(N,_要素リスト,L),RET). foo_1(0,_,[]). foo_1(N,_要素リスト,[_要素|R]) :- N > 0, member(_要素,_要素リスト), N_1 is N - 1, foo_1(N_1,_要素リスト,R). % 以下のサイトは # @nishio # Prologでfoo([t, f], 3, RET)とかやったらRETが[[t, t, t], [t, t, f], ..., [f, f, f]]になるような述語fooの作り方に悩んでいる # 'Prologでfoo([t, f], 3, RET)とかやったらRETが[[t, t, t], [t, t, f], ..., [f, f, f]]になるような述語fooの作り方に悩んでいる'(_要素リスト,N,RET) :- foo(_要素リスト,N,RET). foo(_要素リスト,N,RET) :- findall(L,foo_1(N,_要素リスト,L),RET). foo_1(0,_,[]). foo_1(N,_要素リスト,[_要素|R]) :- N > 0, member(_要素,_要素リスト), N_1 is N - 1, foo_1(N_1,_要素リスト,R). % 以下のサイトは 加算器型相加平均(_累計,_相加平均) :- 加算器型相加平均([],0,_累計,_相加平均). 加算器型相加平均(Ln,_累計_1,_累計,_相加平均) :- 数を得る(_数), _累計_2 is _累計_1 + _数, _相加平均 is _累計_2 / Len, 加算器型相加平均_1(Ln,_累計_2,_累計,_相加平均). 加算器型相加平均_1(Ln,_累計,_累計,_相加平均) :- length([_|Ln],Len), _相加平均 is _累計 / Len. 加算器型相加平均_1(Ln,_累計_2,_累計,_相加平均) :- 加算器型相加平均([_|Ln],_累計_2,_累計,_相加平均). 数を得る(Instream,_催促文ならび,_数を含む条件,_数ならび) :- list(_催促文ならび), findall(_数,( member(_催促文,_催促文ならび), 数を得る(Instream,_催促文,_数を含む条件,_数)), _数ならび),!. 数を得る(Instream,_催促文,_数を含む条件,_数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 数を得る'(Line,_数を含む条件,_数),!. 数を得る(Instream,_催促文,_数を含む条件,_数) :- 数を得る(Instream,_催促文,_数を含む条件,_数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). '診断: 数を得る'(end_of_file,_,end_of_file) :- !. '診断: 数を得る'('',_,_) :- !,fail. '診断: 数を得る'(Line,_数を含む条件,_数) :- atom_to_term(Line,_数,_), number(_数), '診断: 数を含む条件'(_数,_数を含む条件),!. '診断: 数を得る'(Line,_数を含む条件,_数) :- \+((atom_to_term(Line,_数,_),number(_数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]),!, fail. '診断: 数を含む条件'(_数,_数を含む条件) :- number(_数), call(_数を含む条件),!. '診断: 数を含む条件'(_数,_数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_数,_数を含む条件]),!, fail. 数を得る(_催促文,_数を含む条件,_数) :- 数を得る(user_input,_催促文,_数を含む条件,_数). 数を得る(_催促文,_数) :- 数を得る(user_input,_催促文,true,_数). 数を得る(_数) :- 数を得る(user_input,'',true,_数). n個の数を得る(_n,_催促文,_数ならび) :- length(_数ならび,_n), findall(_数,( 部分ならび(_数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 数を得る(_催促文,_数)), _数ならび). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/420 # # [1]c言語 # [2]5進数のかけ算九九(五五?)の表を画面に表示するプログラムを作成せよ(原文ママ) # [3.1]OS:fedora17 # [3.2]gcc 4.7.2 # [3.3]C # [4]無期限 # [5]なし # # '5進数のかけ算九九(五五?)の表を画面に表示する' :- write(' 1 2 3 4 5'), '5進数のかけ算九九(五五?)の表を画面に表示する'([],[_,_,_,_,_,_]),!. '5進数のかけ算九九(五五?)の表を画面に表示する'([_,_,_,_,_],[_,_,_,_,_,_]) :- !. '5進数のかけ算九九(五五?)の表を画面に表示する'(L1,[_,_,_,_,_,_]) :- length([_|L1],N), writef('\n%t ',[N]), '5進数のかけ算九九(五五?)の表を画面に表示する'([_|L1],[_]). '5進数のかけ算九九(五五?)の表を画面に表示する'(L1,L2) :- findall(L2,member(L,L1),LL), flatten(LL,L3), 表示(L3), '5進数のかけ算九九(五五?)の表を画面に表示する'(L1,[_|L2]). 表示(L) :- 表示(L,[],L1,L2), length(L1,N1), length(L2,N2), writef('%t%t ',[N1,N2]). 表示([_,_,_,_,_|R1],L1,A,B) :- 表示(R1,[_|L1],A,B). 表示(L2,L1,L1,L2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/345 # # [1] 授業単元: #     計算機概論 # [2] 問題文(含コード&amp;リンク): #     キーボードから入力された自然数が素数であるかを調べるプログラムを作りなさい。 #     ただし、0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること。 # 'キーボードから入力された自然数が素数であるかを調べるプログラムを作りなさい。 ただし、0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること。' :- 'キーボードから入力された自然数が(0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること)'(_入力された自然数), 素数であるかを調べる(_入力された自然数). 'キーボードから入力された自然数が(0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること)'(_入力された自然数) :- write('自然数を入力してください : '), get_line(Line), '診断 :: 自然数入力'(Line,_入力された自然数),!. 'キーボードから入力された自然数が(0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること)'(_入力された自然数) :- 'キーボードから入力された自然数が(0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること)'(_入力された自然数). '診断 :: 自然数入力'(Line,_入力された自然数) :- atom_to_term(Line,_入力された自然数,_), integer(_入力された自然数), _入力された自然数 > 0,!. '診断 :: 自然数入力'(Line,_) :- writef('入力された %t から自然数を得ることができません。再入力をお願いします。\n',[Line]), fail. 素数であるかを調べる(1) :- write('プログラムを終了します\n'),!. 素数であるかを調べる(X) :- ウィルソンの定理による素数判定(X), write('素数です\n'),!. 素数であるかを調べる(_) :- write('素数ではありません\n'). ウィルソンの定理による素数判定(X) :- X > 0, Y is X - 1, 階乗(Y,Z), 0 is (Z + 1) mod X. 階乗(_n,X) :- findall(M,between(1,N,M),L), atomic_list_concat(L,*,S), atom_to_term(S,_式,_), X is _式. % 以下のサイトは # 出典:: 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',_合計点ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/176 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 下記の文字列を2次元配列に入力する。 # LISP # C++ # Ada # 次に配列の2列の文字 # S+a # を表示する。 # '下記の文字列を2次元配列に入力する。 LISP C++ Ada 次に配列の2列の文字 S+a を表示する。' :- '下記の文字列を2次元配列に入力する。'('LISP C++ Ada',_二次元配列), '次に配列の2列の文字 S+a を表示する。'(_二次元配列). '下記の文字列を2次元配列に入力する。'('LISP C++ Ada',_二次元配列) :- split('LISP C++ Ada',['\n'],L), findall(Chars,( member(A,L), atom_chars(A,Chars)), _二次元配列). '次に配列の2列の文字 S+a を表示する。'(_二次元配列) :- append(_,[[_,_,_文字|_]|R],_二次元配列), writef('%t',[_文字]), R = [], write('\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/149 # # [1] 授業単元:データ構造アルゴリズム # [2] 問題文(含コード&リンク) : qsort関数を用いてソートするプログラムを作成しなさい。身長の昇順、視力の降順など、複数の条件でソートすること。 # ※qsort関数 # 書式 void qsort(void*base,size_t nmemb,size_t size,int(*compar)(const void*,const void)) # 'qsort関数を用いてソートするプログラムを作成しなさい。身長の昇順、視力の降順など、複数の条件でソートすること。'(_テーブル名,_昇順降順,_鍵ならび,L) :- 単位節からリストに変換(_テーブル名,_属性名ならび,L1), 鍵位置ならびを得る(_鍵ならび,_属性名ならび,_鍵位置ならび), 鍵付きqsort(L1,_昇順降順,_鍵位置ならび,L2). 単位節からリストに変換(_テーブル名,_属性名ならび,L1) :- findall(_属性名,( テーブル定義(_テーブル名,_,_属性名)), _属性名ならび), length(_属性名ならび,Len), length(_引数ならび,Len), P =.. [_身体検査|_引数ならび], findall(_引数ならび,( call(P)), L1). 鍵位置ならびを得る([],_,[]). 鍵位置ならびを得る([_鍵|R1],_属性名ならび,[_鍵位置|R3]) :- nth1(_鍵位置,_属性名ならび,_鍵), 鍵位置ならびを得る(R1,_属性名ならび,R3). 鍵付きqsort([],_,_,[]) :- !. 鍵付きqsort([_軸要素|R1],_昇順降順,_鍵位置ならび,LL2) :- 鍵取得(_鍵位置ならび,_軸要素,_軸要素の鍵ならび), 分割(_軸要素の鍵ならび,R1,_昇順降順,_鍵位置ならび,LL1,LL2), 鍵付きqsort(LL1,_鍵位置ならび,LL1_s), 鍵付きqsort(LL2,_鍵位置ならび,LL2_2), append(LL1_s,[_軸要素|LL2_s],LL2). 鍵取得([],_,[]). 鍵取得([_鍵位置|R1],L,[_鍵|R3]) :- nth1(_鍵位置,L,_鍵), 鍵取得(R1,L,R3). 分割(_軸要素の鍵ならび,[],_,_鍵位置ならび,[],[]). 分割(_軸要素の鍵ならび,[L1|R2],_昇順降順,_鍵位置ならび,L2,L3) :- 鍵取得(_鍵位置ならび,L1,_鍵ならび_2), 分割_2(_昇順降順,_軸要素の鍵ならび,_鍵ならび_2,R2,R3,L2,L3), 分割(_軸要素の鍵ならび,R2,_昇順降順,_鍵位置ならび,R2,R3). 分割_2(昇順,_軸要素の鍵ならび,_鍵ならび_2,R2,R3,[_鍵ならび|R2],R3) :- _軸要素の鍵ならび @=< _鍵ならび. 分割_2(昇順,_軸要素の鍵ならび,_鍵ならび_2,R2,R3,R2,[_鍵ならび|R3]) :- _軸要素の鍵ならび @> _鍵ならび. 分割_2(降順,_軸要素の鍵ならび,_鍵ならび_2,R2,R3,[_鍵ならび|R2],R3) :- _軸要素の鍵ならび @>= _鍵ならび. 分割_2(降順,_軸要素の鍵ならび,_鍵ならび_2,R2,R3,R2,[_鍵ならび|R3]) :- _軸要素の鍵ならび @< _鍵ならび. % 以下のサイトは yes. # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/158 # # [1] 授業単元: プログラミング 〜構造体〜 # [2] 問題文(含コード&リンク): 3名の名前と性別、10桁の会員番号を入力し表示せよ # *会員番号は数字のみで入力し、2,6桁目の後に「-」を出力で表示せよ # 入力(1234567890)→出力(12-3456-7890) # *入力された会員番号が10桁に満たない場合、 # または大きい場合は再度入力する指示を入れること # '3名の名前と性別、10桁の会員番号を入力し表示せよ *会員番号は数字のみで入力し、2,6桁目の後に「-」を出力で表示せよ 入力(1234567890)→出力(12-3456-7890) *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること' :- '3名の名前と性別、10桁の会員番号を入力し *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_3名の名前と性別と会員番号), '表示せよ *会員番号は数字のみで入力し、2,6桁目の後に「-」を出力で表示せよ 入力(1234567890)→出力(12-3456-7890)'(_3名の名前と性別と会員番号). '3名の名前と性別、10桁の会員番号を入力し *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_3名の名前と性別と会員番号) :- findall([_名前,_性別,_会員番号],( between(1,3,_), 名前を得る(_名前), 性別を得る(_性別), '会員番号を得る *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_会員番号)), _3名の名前と性別と会員番号). 名前を得る(_名前) :- write('名前を入力してください : '), get_line(_名前). 性別を得る(_性別) :- 整数を得る('性別を番号で入力してください 1..男 2..女\n',between(1,2,_性別番号),_性別番号), 性別番号から性別を得る(_性別番号,_性別). 性別番号から性別を得る(1,男). 性別番号から性別を得る(2,女). '会員番号を得る *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_会員番号) :- write('会員番号(数字10桁)を入力してください : '), get_line(Line), '診断:: 会員番号を得る'(Line,_会員番号),!. '会員番号を得る *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_会員番号) :- '会員番号を得る *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_会員番号). '診断:: 会員番号を得る'(Line,_会員番号) :- atom_chars(Line,Chars), 会員番号は数字のみで入力し(Chars), '入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(Chars),!. '診断:: 会員番号を得る'(Line,_会員番号) :- write('再入力をお願いします\n'), fail. 会員番号は数字のみで入力し(Chars) :- forall((member(A,Chars), member(A,['0','1','2','3','4','5','6','7','8','9'])),true),!. 会員番号は数字のみで入力し(Chars) :- writef('入力された文字列 %t には数字以外の文字が混入しています\n',[Chars]), fail. '入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(Chars) :- length(Chars,10),!. '入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(Chars) :- writef('入力された文字列 %t は10桁でありません\n',[Chars]), fail. '表示せよ *会員番号は数字のみで入力し、2,6桁目の後に「-」を出力で表示せよ 入力(1234567890)→出力(12-3456-7890)'(_3名の名前と性別と会員番号) :- append(_,[[_名前,_性別,_会員番号]|R],_3名の名前と性別と会員番号), number_chars(_会員番号,[_1,_2,_3,_4,_5,_6,_7,_8,_9,_10]), atomic_list_concat([[_1,_2,-,_3,_4,_5,_6,-,_7,_8,_9,_10],_会員表示文字列), writef('名前: %t\n性別: %t\n会員番号: %t\n\n',[_会員番号表示文字列]), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/490 # # SQL SERVER2012です。 # # 列1をaとbで検索して # 新しく列2,列3を作成。 # 列2にaの値を # 列3にbの値を表示することが # 可能ならばやり方を教えてもらえませんでしょうか。 # # 列1 # a # b # a # b # c # # 求めたい結果 # 列2 列3 # a b # a b # # 宜しくお願いします。 # # '列1をaとbで検索して 新しく列2,列3を作成。 列2にaの値を 列3にbの値を表示する'(_列2,_列3) :- findall(a,table(a),L1), findall(b,table(b),L2), nth1(_nth1,L1,_列2), nth1(_nth1,L2,_列3). % 以下のサイトは # [1] 授業単元:C言語 # [2] 問題 http://ime.nu/codepad.org/yV0KrZox # # 問題4 # 9行9列の九九の表のそれぞれの値を計算によって算出し、表示するプログラムを、二次元配列を用いて作成しなさい。 # ------------------------------------------------------------------- # 1 2 3 4 5 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 26 # 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 # -------------------------------------------------------------------- # '9行9列の九九の表のそれぞれの値を計算によって算出し、表示するプログラムを、二次元配列を用いて作成しなさい。' :- length(LL,9), findall(L,行の計算(LL,L),LL), 表示する(LL). 行の計算(LL,L) :- nth1(M,LL,L), length(L,9), findall(X,列の計算(M,L,X),L). 列の計算(M,L,X) :- nth1(N,L,_), X is M * N. 表示する(LL) :- write('-------------------------------------------------------------------\n'), 行を表示する(LL,R), R = [], write('-------------------------------------------------------------------\n'). 行を表示する(LL,R) :- append(_,[L|R],LL), writef('%3r%3r%3r%3r%3r%3r%3r%3r%3r\n',L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/78 # # [1] 授業単元:C言語 # [2] 問題 http://ime.nu/codepad.org/yV0KrZox # # 問題2 # 以下2つの3行3列の行列の和を求め、表示するプログラムを、配列を用いて作成しなさい。 # ---------------------------------------------------------------------- # A = # 8 6 9 # 1 5 2 # 2 5 5 # B = # 3 2 3 # 8 6 7 # 2 5 1 # A + B = # 11 8 12 # 9 11 9 # 4 10 6 # --------------------------------------------------------------------- '2つの3行3列の行列の和を求め、表示する'([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]],[[_B_1_1,_B_1_2,_B_1_3],[_B_2_1,_B_2_2,_B_2_3],[_B_3_1,_B_3_2,_B_3_3]],[[_C_1_1,_C_1_2,_C_1_3],[_C_2_1,_C_2_2,_C_2_3],[_C_3_1,_C_3_2,_C_3_3]]) :- '2つの3行3列の行列の和を求め、'([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]],[[_B_1_1,_B_1_2,_B_1_3],[_B_2_1,_B_2_2,_B_2_3],[_B_3_1,_B_3_2,_B_3_3]],[[_C_1_1,_C_1_2,_C_1_3],[_C_2_1,_C_2_2,_C_2_3],[_C_3_1,_C_3_2,_C_3_3]]), 表示する([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]],[[_B_1_1,_B_1_2,_B_1_3],[_B_2_1,_B_2_2,_B_2_3],[_B_3_1,_B_3_2,_B_3_3]],[[_C_1_1,_C_1_2,_C_1_3],[_C_2_1,_C_2_2,_C_2_3],[_C_3_1,_C_3_2,_C_3_3]]). '2つの3行3列の行列の和を求め、'([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]],[[_B_1_1,_B_1_2,_B_1_3],[_B_2_1,_B_2_2,_B_2_3],[_B_3_1,_B_3_2,_B_3_3]],[[_C_1_1,_C_1_2,_C_1_3],[_C_2_1,_C_2_2,_C_2_3],[_C_3_1,_C_3_2,_C_3_3]]) :- _C_1_1 is _A_1_1 + _B_1_1, _C_1_2 is _A_1_2 + _B_1_2, _C_1_3 is _A_1_3 + _B_1_3, _C_2_1 is _A_2_1 + _B_2_1, _C_2_2 is _A_2_2 + _B_2_2, _C_2_3 is _A_2_3 + _B_2_3, _C_3_1 is _A_3_1 + _B_3_1, _C_3_2 is _A_3_2 + _B_3_2, _C_3_3 is _A_3_3 + _B_3_3. 表示する([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]],[[_B_1_1,_B_1_2,_B_1_3],[_B_2_1,_B_2_2,_B_2_3],[_B_3_1,_B_3_2,_B_3_3]],[[_C_1_1,_C_1_2,_C_