このディレクトリの索引

% 以下のサイトは 'コールユーブンゲン No.45 a) の階名'(['ミ-1','ミ-1','ド-1','ソ-1','ファ-1','ミ-1','ファ-1','レ-1','ラ-1','ソ-1','ファ-1','ソ-1','ミ-1','シ-1','ド-2','ファ-1','ラ-1','レ-1','ファ-1','シ-0','ソ-1','ファ-1','ミ-1','ド-1','ソ-1','ファ-1','ミ-1','ラ-1','ファ-1','ド-2','シ-1','ラ-1','ソ-1','ド-2','ミ-1','ラ-1','レ-1','ファ-1','シ-0','レ-1','ソ-1','ド-1','ミ-1','ド-2','シ-1','ラ-1','ド-2','ラ-1','シ-1','ミ-1','シ-1','ド-2','シ-1','ラ-1','ソ-1','ファ-1','ラ-1','ファ-1','ソ-1','ド-1','ソ-1','ラ-1','シ-1','ド-2','ソ-1','レ-2','シ-1','ド-2','ラ-1','ド-2','ラ-1','シ-1','ラ-1','ミ-1','レ-1','ラ-1','ソ-1','ラ-1','ファ-1','ミ-1','ソ-1','ド-1','ド-1','レ-1','ミ-1','ファ-1','ソ-1','ラ-1','ファ-1','ド-2','ラ-1','ソ-1','ファ-1','ラ-1','レ-1','レ-1','ミ-1','ファ-1','ソ-1','ラ-1','シ-1','ソ-1','レ-2','ド-2','シ-1','ド-2','ミ-1','シ-1','ド-2','シ-1','ラ-1','ド-1','ソ-1','ラ-1','ソ-1','ファ-1','ラ-1','ミ-1','ファ-1','ド-1','レ-1','シ-0','レ-1','ソ-1','ド-1']). 'この練習曲がコールユーブンゲンの代表曲だという根拠として、音階の出現数が最も多いことが挙げられる。それではそのことを示す資料を作っておくことにしよう。' :- 'コールユーブンゲン No.45 a) の音階出現表'. 'コールユーブンゲン No.45 a) の音階出現表' :- forall(('コールユーブンゲン No.45 a) に出現する音階とその出現数'(A,B,_出現数),_出現数 > 0), writef('%t,%t,%t\n',[A,B,_出現数])). 'コールユーブンゲン No.45 a) に出現する音階とその出現数'(A,B,_出現数) :- 'コールユーブンゲン No.45 a) に出現する音階と'(L,A,B), その出現数(L,A,B,_出現数). 'コールユーブンゲン No.45 a) に出現する音階と'(L,A,B) :- 'コールユーブンゲン No.45 a) の階名'(L), setof(A,member(A,L),L2), 順列(L2,2,[A,B]). その出現数(L,A,B,_出現数) :- count(append(_,[A,B|_],L),_出現数). 順列(Y,0,[]). 順列(Y,N,[A|X]) :- select(A,Y,Z), M is N - 1, 順列(Z,M,X). % 以下のサイトは 'Σ'(_n_1,_n_2,_k,_目標の集約値,_目標,_集約合計) :- findsum(_目標の集約値,( between(_n_1,_n_2,_k),_目標),_集約合計). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). '最小二乗法を用いて、1次関数 ax+b をモデルとして近似し、係数a,bを決定する。 最小二乗法とは、測定で得られた数値の組を、適当なモデルから想定される 想定する関数が測定値に対してよい近似となるように、残差の二乗和を最小と するような係数を決定する方法。'(_測定で得られた数値の組,_a,_b) :- length(_測定で得られた数値の組,_標本数), '測定で得られた数値の組をLx,Lyに分解する'(_測定で得られた数値の組,Lx,Ly), '適当なモデルから想定される1次関数 ax+b を用いて近似するときに、 想定する関数が測定値に対してよい近似となるように、残差の二乗和を 最小とするような係数を決定する'(_標本数,Lx,Ly,_a,_b). '測定で得られた数値の組をLx,Lyに分解する'([],[],[]). '測定で得られた数値の組をLx,Lyに分解する'([(X,Y)|R],[X|Rx],[Y|Ry]) :- '測定で得られた数値の組をLx,Lyに分解する'(R,Rx,Ry). '適当なモデルから想定される1次関数 ax+b を用いて近似するときに、 想定する関数が測定値に対してよい近似となるように、残差の二乗和を 最小とするような係数を決定する'(_標本数,Lx,Ly,_a,_b) :- 係数a(_標本数,Lx,Ly,_a), 係数b(_標本数,Lx,Ly,_b). 係数a(_標本数,Lx,Ly,_a) :- 係数aの式の分子(_標本数,Lx,Ly,_分子), 係数aの式の分母(_標本数,Lx,Ly,_分母), _a is _分子 / _分母. 係数aの式の分子(_標本数,Lx,Ly,_分子) :- 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),nth1(_k,Ly,Y),S is X * Y),_合計_1), 'Σ'(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_2), 'Σ'(1,_標本数,_k,S,nth1(_k,Ly,S),_合計_3), _分子 is _標本数 * _合計_1 - _合計_2 * _合計_3. 係数aの式の分母(_標本数,Lx,Ly,_分母) :- 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_1), 'Σ'(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_2), _分母 is _標本数 * _合計_1 - _合計_2 ^ 2. 係数b(_標本数,Lx,Ly,_b) :- 係数bの式の分子(_標本数,Lx,Ly,_分子), 係数bの式の分母(_標本数,Lx,Ly,_分母), _b is _分子 / _分母. 係数bの式の分子(_標本数,Lx,Ly,_分子) :- 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_1), 'Σ'(1,_標本数,_k,S,nth1(_k,Ly,S),_合計_2), 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),nth1(_k,Ly,Y),S is X * Y),_合計_3), 'Σ'(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_4), _分子 is _合計_1 * _合計_2 - _合計_3 * _合計_4. 係数bの式の分母(_標本数,Lx,Ly,_分母) :- 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_1), 'Σ'(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_2), _分母 is _標本数 * _合計_1 - _合計_2 ^ 2. % 以下のサイトは 'Σ'(_n_1,_n_2,_k,_目標の集約値,_目標,_集約合計) :- findsum(_目標の集約値,( between(_n_1,_n_2,_k),_目標),_集約合計). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). '最小二乗法を用いて、1次関数 ax+b をモデルとして近似し、係数a,bを決定する。 最小二乗法とは、測定で得られた数値の組を、適当なモデルから想定される 想定する関数が測定値に対してよい近似となるように、残差の二乗和を最小と するような係数を決定する方法。'(_測定で得られた数値の組,_a,_b) :- length(_測定で得られた数値の組,_標本数), '測定で得られた数値の組をLx,Lyに分解する'(_測定で得られた数値の組,Lx,Ly), '適当なモデルから想定される1次関数 ax+b を用いて近似するときに、 想定する関数が測定値に対してよい近似となるように、残差の二乗和を 最小とするような係数を決定する'(_標本数,Lx,Ly,_a,_b). '測定で得られた数値の組をLx,Lyに分解する'([],[],[]). '測定で得られた数値の組をLx,Lyに分解する'([(X,Y)|R],[X|Rx],[Y|Ry]) :- '測定で得られた数値の組をLx,Lyに分解する'(R,Rx,Ry). '適当なモデルから想定される1次関数 ax+b を用いて近似するときに、 想定する関数が測定値に対してよい近似となるように、残差の二乗和を 最小とするような係数を決定する'(_標本数,Lx,Ly,_a,_b) :- 係数a(_標本数,Lx,Ly,_a), 係数b(_標本数,Lx,Ly,_b). 係数a(_標本数,Lx,Ly,_a) :- 係数aの式の分子(_標本数,Lx,Ly,_分子), 係数aの式の分母(_標本数,Lx,Ly,_分母), _a is _分子 / _分母. 係数aの式の分子(_標本数,Lx,Ly,_分子) :- 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),nth1(_k,Ly,Y),S is X * Y),_合計_1), 'Σ'(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_2), 'Σ'(1,_標本数,_k,S,nth1(_k,Ly,S),_合計_3), _分子 is _標本数 * _合計_1 - _合計_2 * _合計_3. 係数aの式の分母(_標本数,Lx,Ly,_分母) :- 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_1), 'Σ'(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_2), _分母 is _標本数 * _合計_1 - _合計_2 ^ 2. 係数b(_標本数,Lx,Ly,_b) :- 係数bの式の分子(_標本数,Lx,Ly,_分子), 係数bの式の分母(_標本数,Lx,Ly,_分母), _b is _分子 / _分母. 係数bの式の分子(_標本数,Lx,Ly,_分子) :- 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_1), 'Σ'(1,_標本数,_k,S,nth1(_k,Ly,S),_合計_2), 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),nth1(_k,Ly,Y),S is X * Y),_合計_3), 'Σ'(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_4), _分子 is _合計_1 * _合計_2 - _合計_3 * _合計_4. 係数bの式の分母(_標本数,Lx,Ly,_分母) :- 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_1), 'Σ'(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_2), _分母 is _標本数 * _合計_1 - _合計_2 ^ 2. % 以下のサイトは Σ(_n_1,_n_2,_k,_目標の集約値,_目標,_集約合計) :- findsum(_目標の集約値,( between(_n_1,_n_2,_k), call(_目標)),_集約合計). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). '一次方程式 y=ax+b の係数_a,_bを最小二乗法を使って得る'(_標本数,Lx,Ly,_a,_b) :- 係数a(_標本数,Lx,Ly,_a), 係数b(_標本数,Lx,Ly,_b). 係数a(_標本数,Lx,Ly,_a) :- Σ(1,_標本数,_k,S,(nth1(_k,Lx,X),nth1(_k,Ly,Y),S is X * Y),_合計_1), Σ(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_2), Σ(1,_標本数,_k,S,nth1(_k,Ly,S),_合計_3), Σ(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_4), Σ(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_5), _a is (_標本数 * _合計_1 - _合計_2 * _合計_3) / ( _標本数 * _合計_4 - _合計_5 ^ 2). 係数b(_標本数,Lx,Ly,_b) :- Σ(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_1), Σ(1,_標本数,_k,S,nth1(_k,Ly,S),_合計_2), Σ(1,_標本数,_k,S,(nth1(_k,Lx,X),nth1(_k,Ly,Y),S is X * Y),_合計_3), Σ(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_4), Σ(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_5), Σ(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_6), _b is (_合計_1 * _合計_2 - _合計_3 * _合計_4) / ( _標本数 * _合計_5 - _合計_6 ^ 2). % 以下のサイトは sigma(_n_1,_n_2,_k,S,P,_合計) :- findsum(S,( between(_n_1,_n_2,_k), call(P)),_合計). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). '一次方程式 y=ax+b の係数_a,_bを最小二乗法を使って得る'(_標本数,Lx,Ly,_a,_b) :- 係数a(_標本数,Lx,Ly,_a), 係数b(_標本数,Lx,Ly,_b). 係数a(_標本数,Lx,Ly,_a) :- sigma(1,_標本数,_k,S,(nth1(_k,Lx,X),nth1(_k,Ly,Y),S is X * Y),_合計_1), sigma(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_2), sigma(1,_標本数,_k,S,nth1(_k,Ly,S),_合計_3), sigma(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_4), sigma(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_5), _a is (_標本数 * _合計_1 - _合計_2 * _合計_3) / ( _標本数 * _合計_4 - _合計_5 ^ 2). 係数b(_標本数,Lx,Ly,_b) :- sigma(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_1), sigma(1,_標本数,_k,S,nth1(_k,Ly,S),_合計_2), sigma(1,_標本数,_k,S,(nth1(_k,Lx,X),nth1(_k,Ly,Y),S is X * Y),_合計_3), sigma(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_4), sigma(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_5), sigma(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_6), _b is (_合計_1 * _合計_2 - _合計_3 * _合計_4) / ( _標本数 * _合計_5 - _合計_6 ^ 2). % 以下のサイトは sigma(_n_1,_n_2,S,P,_合計) :- findsum(S,P,_合計). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). '一次方程式 y=ax+b の係数_a,_bを最小二乗法を使って得る'(_標本数,Lx,Ly,_a,_b) :- 係数a(_標本数,Lx,Ly,_a), 係数b(_標本数,Lx,Ly,_b). 係数a(_標本数,Lx,Ly,_a) :- sigma(1,_標本数,S,(nth1(_nth1,Lx,X),nth1(_nth1,Ly,Y),S is X * Y),_合計_1), sigma(1,_標本数,S,member(S,Lx),_合計_2), sigma(1,_標本数,S,member(S,Ly),_合計_3), sigma(1,_標本数,S,(member(X,Lx),S is X ^ 2),_合計_4), sigma(1,_標本数,S,member(S,Lx),_合計_5), _a is (_標本数 * _合計_1 - _合計_2 * _合計_3) / ( _標本数 * _合計_4 - _合計_5 ^ 2). 係数b(_標本数,Lx,Ly,_b) :- sigma(1,_標本数,S,(member(X,Lx),S is X * X),_合計_1), sigma(1,_標本数,S,member(S,Ly),_合計_2), sigma(1,_標本数,S,(nth1(_nth1,Lx,X),nth1(_nth1,Ly,Y),S is X * Y),_合計_3), sigma(1,_標本数,S,member(S,Lx),_合計_4), sigma(1,_標本数,S,(member(X,Lx),S is X * X),_合計_5), sigma(1,_標本数,S,member(S,Lx),_合計_6), _b is (_合計_1 * _合計_2 - _合計_3 * _合計_4) / ( _標本数 * _合計_5 - _合計_6 ^ 2). % 以下のサイトは # 出典 :: わかりやすい 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による医療言語処理入門 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(_集約鍵ならび,_全ての変数ならび ^ _目標,_鍵となる値ならび). % 実行例 % 以下のサイトは # 出典 :: CodeIQ q1385 言語不問:通分と約分を実装しよう # # 小学生が分数を学ぶときに、最初に躓くのが「通分」です。 # # 分母の異なる分数の足し算や引き算を行うとき、先に通分を行っておく必要があります。 # # また、計算した結果、「約分」できる場合は、可能な限り簡単な分数にしないと正解になりません。 # # 【問題】 # # では、入力される二つの分数について足し算を行った時に、 # # 正しい答えを出力するプログラムを作り、 # # 問1〜問5の標準入力に対して、出力内容を答えてください。 # # ※分母が1の時には整数として出力してください。 # # ■例 # # 例1) # # 【標準入力】 # # 5/6 # # 1/10 # # 【標準出力】 # # 14/15 # # 例2) # # 【標準入力】 # # 1/3 # # 2/3 # # 【標準出力】 # # 1 # # ■問1〜5 # # 問1) # # 1/3 # # 2/7 # # 問2) # # 2/8 # # 3/5 # # 問3) # # 3/10 # # 1/6 # # 問4) # # 3/4 # # 5/8 # # 問5) # # 2/5 # # 2/3 # # 【解答方法】 # # 解答用テキストファイルanswer_q1385.txtをダウンロードし、必要事項をご記入ください。 # # 必須事項がすべて記入されていることをご確認いただいた後、テキストファイルのままアップロードしてください。 # # 【注意】 # # ・ご提出いただいたプログラムは個別に実行テストを行いますので、 # #  解答用テキストファイルに書かれた解答が正解していても最高評価になるとは限りません。 # # ・プログラミング言語は不問ですが、古すぎる実行環境・特殊な設備を要する実行環境では採点できない場合がございます。 # # ・使用する言語は1解答につき必ず1種類でお願いします。 # #  どうしても複数の言語を用いる場合は、解答に「メインの言語名」を明記してください。 # '問1〜問5の標準入力に対して、出力内容を答えてください。 ■問1〜5 問1) 1/3 2/7 問2) 2/8 3/5 問3) 3/10 1/6 問4) 3/4 5/8 問5) 2/5 2/3' :- between(1,5,N), '入力される二つの分数について足し算を行った時に、正しい答えを出力する', N = 5. '入力される二つの分数について足し算を行った時に、正しい答えを出力する' :- 入力される二つの分数(_分子_1 / _分母_1,_分子_2 / _分母_2), 分数の加算(_分子_1 / _分母_1,_分子_2 / _分母_2,_加算された分子 / _加算された分母), 約分(_加算された分子 / _加算された分母,_約分された分子 / _約分された分母), 答えを出力する(_約分された分子 / _約分された分母). 分数の加算(_分子_1 / _分母_1,_分子_2 / _分母_2,_加算された分子 / _通分された分母) :- 通分(_分子_1 / _分母_1,_分子_2 / _分母_2,_通分された分子_1 / _通分された分母,_通分された分子_2 / _通分された分母), _加算された分子 is _通分された分子_1 + _通分された分子_2,!. 入力される二つの分数(_分子_1 / _分母_1,_分子_2 / _分母_2) :- 入力される分数(_分子_1 / _分母_1), 入力される分数(_分子_2 / _分母_2). 入力される分数(_分子_1 / _分母_1) :- 行入力(_行), read_term_from_atom(_行,_分子 / _分母,[]). 行入力(_行) :- get_char(_先読み文字), 行ならびを得る(_先読み文字,_行ならび), atom_chars(_行,_行ならび). 行ならびを得る('\n',[]). 行ならびを得る(_先読み文字,[_先読み文字|R]) :- get_char(_次の文字), 行ならびを得る(_次の文字,R). 答えを出力する(_約分された分子 / _約分された分母) :- writef('%t\n',[_約分された分子 / _約分された分母]). 約分(_分子 / _分母,X) :- 最大公約数で分子分母を割って約分する(_分子,_分母,_分子_1,_分母_1), 負数の場合のマイナス符号は分子側に付ける(_分子_1,_分母_1,_分子_2,_分母_2), 分母が1の時は整数に変形(_分子_2,_分母_2,X). 最大公約数で分子分母を割って約分する(_分子_1,_分母_1,_分子,_分母) :- 最大公約数(_分子_1,_分母_1,_最大公約数), _分子 is _分子_1 // _最大公約数, _分母 is _分母_1 // _最大公約数. 負数の場合のマイナス符号は分子側に付ける(_分子_1,_分母_1,_分子,_分母) :- 分母が負数だったら分子分母ともに符号を反転する(_分子_1,_分母_1,_分子,_分母),!. 負数の場合のマイナス符号は分子側に付ける(_分子,_分母,_分子,_分母). 分母が負数だったら分子分母ともに符号を反転する(_分子_1,_分母_1,_分子,_分母) :- _分母_1 =< 0, _分子 is _分子_1 * -1, _分母 is _分母_1 * -1. 分母が1の時は整数に変形(_分子,1,_分子) :- !. 分母が1の時は整数に変形(_分子,1.0,_分子) :- !. 分母が1の時は整数に変形(_分子,_分母,_分子 / _分母). 通分(_分子_1 / _分母_1,_分子_2 / _分母_2,_通分された分子_1 / _最小公倍数,_通分された分子_2 / _最小公倍数) :- 最小公倍数([_分母_1,_分母_2],_最小公倍数), _通分された分子_1 is _分子_1 * (_最小公倍数 // _分母_1), _通分された分子_2 is _分子_2 * (_最小公倍数 // _分母_2). 最大公約数([_整数],_整数). 最大公約数([_整数|R],_最大公約数) :- 最大公約数(R,_最大公約数_2), 二つの整数の最大公約数(_整数,_最大公約数_2,_最大公約数). 二つの整数の最大公約数(M,N,X) :- 二つの整数の絶対値をとる(M,N,M_2,N_2), 最大公約数をユークリッドの互除法で求める(M_2,N_2,Y), 負数解の可能性も探る(M,M_2,N,N_2,Y,X). 負数解の可能性も探る(M,M_2,N,N_2,Y,X) :- setof(X,[M,M_2,N,N_2,Y,X] ^ 負数解の可能性(M,M_2,N,N_2,Y,X),L), member(X,L). 負数解の可能性(M,M_2,_,_,Y,X) :- X is Y * (M // M_2). 負数解の可能性(_,_,N,N_2,Y,X) :- X is Y * (N // N_2). 二つの整数の絶対値をとる(M,N,M_2,N_2) :- M_2 is abs(M), N_2 is abs(N). 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). 最小公倍数(_整数ならび,_最小公倍数) :- '最小公倍数とは、0ではない複数の整数の公倍数のうち最小のものをさす'(_整数ならび,_最小公倍数). '最小公倍数とは、0ではない複数の整数の公倍数のうち最小のものをさす'([_整数],_整数). '最小公倍数とは、0ではない複数の整数の公倍数のうち最小のものをさす'([_整数|R],_最小公倍数) :- '最小公倍数とは、0ではない複数の整数の公倍数のうち最小のものをさす'(R,_最小公倍数_1), 二つの整数の最小公倍数(_整数,_最小公倍数_1,_最小公倍数). 二つの整数の最小公倍数(A,B,X) :- 二つの整数の最大公約数(A,B,_最大公約数), setof(X,[X,A,B,_最大公約数] ^ (X is A * B // _最大公約数),L), member(X,L). % 以下のサイトは 親(為義). 親(頼朝). 親(範頼). 子(頼朝). 子(範頼). 子(公暁). 親子テーブル候補(_親子テーブル候補) :- 属性集合である親と子の直積上の部分集合候補(_親子テーブル候補). 属性集合である親と子の直積上の部分集合候補(_親子テーブル候補) :- 属性集合である親と子の直積上の(_属性集合_親_と_属性集合_子の直積), 部分集合候補(_属性集合_親_と_属性集合_子の直積,_親子テーブル候補). 属性集合である親と子の直積上の(_親と子の直積) :- 属性集合_親(_属性集合_親), 属性集合_子(_属性集合_子), 直積([_属性集合_親,_属性集合_子],_親と子の直積). 属性集合_親(_属性集合_親) :- 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). % 以下のサイトは # 出典:: 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). % 以下のサイトは # 出題場所 :: 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). % 以下のサイトは ベクトルの内積(_ベクトル_1,_ベクトル_2,_ベクトルの内積) :- findsum(U,( nth1(_nth1,_ベクトル_1,[U1]), nth1(_nth1,_ベクトル_2,[U2]), U is U1 * U2),_ベクトルの内積). % 以下のサイトは ベクトルのノルム(_ベクトル,_ノルム) :- findsum(U2,( member([U1],_ベクトル), U2 is U1 * U1),S), _ノルム is sqrt(S). % 以下のサイトは 昇順鍵整列(L1,_鍵ならび,L2) :- 昇順鍵整列(1,_鍵ならび,L1,KL,L3), 昇順整列(KL,KL2), findall(L,( member(L4,KL2), last(L4,K), member([K|L],L3)),L2). 昇順鍵整列(_,_,[],[],[]) :- !. 昇順鍵整列(N,KL,[L1|R1],[KL_1|KR],[[N|L1]|R3]) :- 鍵生成(N,KL,L1,KL_1), succ(N,N_2), 昇順鍵整列(N_2,KL,R1,KR,R3). 鍵生成(N,KL,L1,KR_2) :- findall(A,( member(K,KL), nth1(K,L1,A)),KR_1), append(KR_1,[N],KR_2). 昇順整列([],[]). 昇順整列([_軸要素|L1],L2) :- 昇順分割(_軸要素,L1,L1_2,L2_2), 昇順整列(L1_2,L1_3), 昇順整列(L2_2,L2_3), append(L1_3,[_軸要素|L2_3],L2). 昇順分割(_,[],[],[]). 昇順分割(A,[B|R2],[B|R3],R4) :- A @>= B, 昇順分割(A,R2,R3,R4). 昇順分割(A,[B|R2],R3,[B|R4]) :- A @< B, 昇順分割(A,R2,R3,R4). % 以下のサイトは # 出典:: プログラミングのお題スレ Part5 # お題:自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返すという操作を繰り返す。 # # 例1:14,17,50,25,29,85,89,145,190,730,730,... # 例2:59,106,217,352,160,217,352,160,... # # この操作によるループ(上記の例では[730],[160,217,352])を好きなだけ求めよ。 '自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返すという操作を繰り返す。'(N,L,_ループ) :- '自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返すという操作を繰り返す。'(N,[],L,_ループ). '自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返すという操作を繰り返す。'(N,L1,L,_ループ) :- ループが発生したら終了する(L1,L,_ループ). '自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返すという操作を繰り返す。'(N,L1,L,_ループ) :- '自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返す'(N,_Nの各桁のk乗の和), '自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返すという操作を繰り返す。'(_Nの各桁のk乗の和,[_Nの各桁のk乗の和|L1],L,_ループ). ループが発生したら終了する(L1,L,_ループ) :- L1 = [N1|R], append(L0,[N1|_],R), reverse(L1,L), reverse([N1|L0],_ループ). '自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返す'(N,_Nの各桁のk乗の和) :- 各桁の数ならびを得る(N,_数ならび), length(Chars,_k), findsum(_nの各桁のk乗,( member(_数,_数ならび), _nの各桁のk乗 is _数 ^ _k),_Nの各桁のk乗の和). 各桁の数ならびを得る(N,_数ならび) :- number_chars(N,Chars), findall(_数,( member(A,Chars), number_chars(_数,[A])),_数ならび). % 以下のサイトは # 駒場東大前から下北沢までの距離を求めなさい 井の頭線(渋谷,神泉,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 _次の駅までの距離 + _次の駅から下北沢までの距離. % 以下のサイトは # 出題場所 :: 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). % 以下のサイトは # 問題文 # 高橋君の国では、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). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/db/1402919549/274 # よろしくお願いいたします。 # 【DBMS名とバージョン】Oracle 11g # 【テーブルデータ】 # ID   YMD # 1  20140101 # 1  20140102 # 1  20140103 # 1  20140105 # 1  20140106 # 2  20140101 # 2  20140102 # 【欲しい結果 】 # ID START_YMD END_YMD # 1 20140101 20140103 # 1 20140105 20140106 # 2 20140101 20140102 # 【説明】 # レコード単位で一日の日付を持つデータをグループかして、 # 開始日付と終了日付に集約したいです。 # ただし、一日でも間があれば、集約データ内では別レコードとして扱いたいです。 # # どなたかいいお知恵がございましたら、よろしくお願いいたしますm(_ _)m # # 'レコード単位で一日の日付を持つデータをグループかして、 開始日付と終了日付に集約したいです。 ただし、一日でも間があれば、集約データ内では別レコードとして扱いたいです。'(_id,_START_YMD,_END_YMD) :- findsetof(_ID,table(_ID,_),_id候補), member(_ID,_ID候補), findsetof(_YMD,table(_ID,_YMD),_YMD候補), 連続性検査(_YMD候補,_START_YMD,_END_YMD). 連続性検査(_YMD候補,_START_YMD,_END_YMD) :- append(L1,[_START_YMD|R2],L2,_YMD候補), 連続している([_START_YMD|R2],_END_YMD), 連続していない(L1,[_START_YMD]), 連続していない([_END_YMD],L2). 連続している([_END_YMD],_END_YMD) :- !. 連続している([_YMD_1,_YMD_2|R1],_END_YMD) :- 翌日(_YMD_1,_YMD_2), 連続している([_YMD_2|R1],_END_YMD). 連続していない(L1,[_YMD_2|_]) :- last(L1,_YMD_1), \+(翌日(_YMD_1,_YMD_2)). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 翌日(_YMD,_翌日) :- 年月日(_YMD,_年,_月,_日), 翌日(_年,_月,_日,_翌日). 年月日(_YMD,_年,_月,_日) :- sub_atom(_YMD,0,2,_,_年), sub_atom(_YMD,2,2,_,_月), sub_atom(_YMD,4,2,_,_日). 翌日(_年,_月,_日,_翌日) :- 年月換わり(年,_月,_日,_翌日),!. 翌日(_年,_月,_日,_翌日) :- 翌日の日(_日,_翌日の日), atomic_list_concat([_年,_月,_翌日の日],_翌日). 年月換わり(_年,'02',_月末日,_翌日) :- 二月月末(_年,'02',_月末日,_翌日). 年月換わり(_年,_月,_月末日,_翌日) :- 小の月の月末日の翌日(_月,_月末日,_翌日). 年月換わり(_年,_月,_月末日,_翌日) :- 大の月の月末日の翌日(_年,_月,_月末日,_翌日). 二月月末(_年,'02','29',_翌日) :- atomic_list_concat([_年,'03','01'],_翌日). 二月月末(_年,'02','28',_翌日) :- atom_number(_年,_年整数), \+(うるう年(_年整数)), atomic_list_concat([_年,'03','01'],_翌日). 小の月の月末日の翌日(_月,'30',_翌日) :- member(_月,['04','06','09','11']), 翌月(_月,_翌月), atomic_list_concat([_年,_翌月,'01'],_翌日). 大の月の月末日の翌日(_年,_月,'31',_翌日) :- member(_月,['01','03','05','07','08','10','12']), 翌月(_月,_翌月), 年換わり(_年,_月,_年_1), atomic_list_concat([_年_1,_翌月,'01'],_翌日). 年換わり(_年,'12',_翌年) :- 翌年(_年,_翌年). 年換わり(_年,_月,_年) :- \+(_月='12'). うるう年(_うるう年) :- 0 is mod _うるう年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_うるう年) :- 0 is _うるう年 mod 4. 翌月('01','02'). 翌月('02','03'). 翌月('03','04'). 翌月('04','05'). 翌月('05','06'). 翌月('06','07'). 翌月('07','08'). 翌月('08','09'). 翌月('09','10'). 翌月('10','11'). 翌月('11','12'). 翌月('12','01'). 翌日の日('01','02'). 翌日の日('02','03'). 翌日の日('03','04'). 翌日の日('04','05'). 翌日の日('05','06'). 翌日の日('06','07'). 翌日の日('07','08'). 翌日の日('08','09'). 翌日の日('09','10'). 翌日の日('10','11'). 翌日の日('11','12'). 翌日の日('12','13'). 翌日の日('13','14'). 翌日の日('14','15'). 翌日の日('15','16'). 翌日の日('16','17'). 翌日の日('17','18'). 翌日の日('18','19'). 翌日の日('19','20'). 翌日の日('20','21'). 翌日の日('21','22'). 翌日の日('22','23'). 翌日の日('23','24'). 翌日の日('24','25'). 翌日の日('25','26'). 翌日の日('26','27'). 翌日の日('27','28'). 翌日の日('28','29'). 翌日の日('29','30'). 翌日の日('30','31'). 翌年(_年,_翌年) :- atom_number(_年,_年整数), succ(_年整数,_翌年の年整数), atom_number(_翌年,_翌年の年整数). % 以下のサイトは # 要件 # # ユーザーテーブル(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/860 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # n個の整数を含む集合Sと、 # q個の異なる整数を含む集合Tを入力とし、 # Tに含まれる整数の中でSに含まれるものの数Cを # 出力するプログラムを作成せよ。 # # 入力 # 1行目にSを表すn個の整数、 # 2行目にTを表すq個の整数が与えられる。 # 出力 # Tに含まれる整数の中でSに含まれるものの数Cを出力せよ。 # 条件 # n : 10以下 # q : 5以下 # 集合に含まれる整数の値 以上、6未満 # # 実行例) # 3 8 4 1 9 2 5 7 6 入力(集合S:n個(9)) # 1 3 5 10 入力(集合T:q個(4)) # 3 出力(C) # 21 30 5 21 10 39 14 入力(集合S:n個(7)) # 1 21 10 入力(集合T:q個(3)) # 2 出力(C) # 'n個の整数を含む集合Sと、 q個の異なる整数を含む集合Tを入力とし、 Tに含まれる整数の中でSに含まれるものの数Cを 出力するプログラムを作成せよ。'(_n,_q) :- 'n個の整数を含む集合Sと、q個の異なる整数を含む集合Tを入力とし、'(_n,_S,_q,_T), 'Tに含まれる整数の中でSに含まれるものの数Cを'(_T,_S,_C), 出力する(_C). 'n個の整数を含む集合Sと、q個の異なる整数を含む集合Tを入力とし、'(_n,_S,_q,_T) :- 'n個の整数を含む集合Sの入力、'(_n,_S), 'q個の異なる整数を含む集合Tの入力'(_q,_T). 'n個の整数を含む集合Sの入力、'(_n,_S) :- writef('集合S 入力する整数は%t個です : ',[_n]), get_split_line([' '],_S). 'q個の異なる整数を含む集合Tの入力'(_q,_T) :- writef('集合T 入力する整数は%t個で、同じ数字であってはいけません : ',[_q]), get_split_line([' '],_T). 'Tに含まれる整数の中でSに含まれるものの数Cを'(_T,_S,_C) :- setof(_整数,member(_整数,_T),_T_1), count((member(_N,_T_1),member(_N,_S)),_C). 出力する(_C) :- writef('%t\n',[_C]). % 以下のサイトは # 出題場所 :: 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',[_最も売上が低い担当者名,_最も売上が低い担当者の売上]). % 以下のサイトは # お題:与えられた数値を先頭から順に桁ごとに区切って使って数列を作り、隣り合う数の「差の二乗」の合計が最大になるような分割を求めよ。 # 例: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). % 以下のサイトは # 出典: 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). % 以下のサイトは # # [1] 授業単元:プログラミングII # [2] 問題文(含コード&リンク): # 課題: #   #include < stdio.h > # int main (void){ # int i; # float taiju[10]={58.6,65.2,74.4,46.0,52.8,62.4,55.0,51.2,54.8,48.4}; # float total,average; # total=0; # # for(i=0;i<10;i++){ # total+=taiju[i]; # } # average=total/10; # printf("Total=%.1f\n",total); # printf("Average=%.1f\n",average); # return 0; # このプログラムを関数にするにはどこをどうしたらいいですか? # } # これをPrologの全く異なったプログラムに作り変えなさい。 # 標本体重(58.6). 標本体重(65.2). 標本体重(74.4). 標本体重(46.0). 標本体重(52.8). 標本体重(62.4). 標本体重(55.0). 標本体重(51.2). 標本体重(54.8). 標本体重(48.4). 標本の体重の合計と相加平均を求める(_標本体重の合計,_標本体重の相加平均) :- 標本体重の合計(_標本体重の合計), 標本体重の相加平均(_標本体重の相加平均). 標本体重の合計(_標本体重の合計) :- 目標から合計値を得る(_体重,標本体重(_体重),_標本体重の合計). 標本体重の相加平均(_標本体重の相加平均) :- 目標から相加平均を得る(_体重,標本体重(_体重),_標本体重の相加平均). 目標から合計値を得る(_集約対象項,_目標,_合計値) :- findall(_集約対象項,_目標,_値ならび), sum_list(_値ならび,_合計値). 目標から相加平均を得る(_集約対象項,_目標,_相加平均) :- findall(_集約対象項,_目標,_値ならび), 相加平均(_値ならび,_相加平均). 相加平均(_値ならび,_相加平均) :- sum_list(_値ならび,_合計値), length(_値ならび,_要素数), _相加平均 is _合計値 / _要素数. % 以下のサイトは # 質問です。 # 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). % 以下のサイトは # 出典 :: プログラミングのお題スレ 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, ... 成績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,_,_文字). % 以下のサイトは # 出題場所 :: 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/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/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/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/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), _集計). % 以下のサイトは 語候補(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/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までの整数をすべて足せ。すべて足したら、その合計を表示せよ。' :- findsum(N,between(1,10000,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までの整数をすべて足せ。すべて足したら、その合計を表示せよ。' :- findsum(N,between(1,10000,N),_合計), 'すべて足したら、その合計を表示せよ。'(_合計). 'すべて足したら、その合計を表示せよ。'(_合計) :- writef('その合計は%t\n',[_合計]). % 以下のサイトは # 出題場所 :: 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/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. % 以下のサイトは # 出題場所 :: 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/1381909900/240 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): http://ime.nu/ideone.com/2viXY6 forかwhileをつかって # 1から10までの整数のうち、偶数の合計を求めなさい。 # 1から100までの整数で、奇数だけの合計、偶数だけの合計、総合計をもとめよ; # y=5x+8の値をxが0〜10まで、1ずつ増やした時のyの値 # 10^3+30^3+50^3+70^3+90^3の計算 # '1から10までの整数のうち、偶数の合計を求めなさい。'(_1から10までの整数のうち_偶数の合計) :- findsum(_1から10までの整数のうち_偶数の,( '1から10までの整数のうち、偶数の'(_1から10までの整数のうち_偶数の)), _1から10までの整数のうち_偶数の合計). '1から10までの整数のうち、偶数の'(_1から10までの整数のうち_偶数の) :- '1から10までの整数のうち、'(_1から10までの整数のうち_偶数の), 偶数(_1から10までの整数のうち_偶数の). '1から10までの整数のうち、'(_1から10までの整数のうち_偶数の) :- between(1,10,_1から10までの整数のうち_偶数の). 偶数(_1から10までの整数のうち_偶数の) :- 0 is _1から10までの整数のうち_偶数の mod 2. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '1から100までの整数で、奇数だけの合計、偶数だけの合計、総合計をもとめよ'(_奇数だけの合計,_偶数だけの合計,_総合計) :- findsum([_奇数,_偶数,_1から100までの整数],( '1から100までの整数で、'(_1から100までの整数), '奇数、偶数'(_1から100までの整数,_奇数,_偶数)), [_奇数だけの合計,_偶数だけの合計,_総合計]). '1から100までの整数で、'(_1から100までの整数) :- between(1,100,_1から100までの整数). '奇数、偶数'(_1から100までの整数,_1から100までの整数,0) :- 1 is _1から100までの整数 mod 2,!. '奇数、偶数'(_1から100までの整数,0,_1から100までの整数) :- 0 is _1から100までの整数 mod 2,!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'y=5x+8の値をxが0〜10まで、1ずつ増やした時のyの値'(_yの値) :- between(0,10,_x), _yの値 is 5 * _x + 8, _x = 10. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '10^3+30^3+50^3+70^3+90^3の計算'(_計算結果) :- findsum(X,( member([M,N],[[10,3],[50,3],[70,3],[90,3]]), '^'(M,N,X)), _計算結果). '^'(_,0,1) :- !. '^'(M,N,X) :- N_1 is N - 1, '^'(M,N_1,Y), X is M * Y. % 以下のサイトは # お題: # 例:数列[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). % 以下のサイトは # 出典:: 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(_値ならび,_合計値),!. % 以下のサイトは # 以下の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(_値ならび,_合計値),!. % 以下のサイトは # # お題:テキストファイルを読み込み、その中で最もよく使われている単語ベスト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_n(_限界度数,_蒐集項,_目標,_蒐集項ならび). findall_n(_限界度数,_蒐集項,_目標,_蒐集項ならび) :- message_queue_create(_キュー番号), ( '子スレッドで、生成された度数を、限界度数に達したら0をキューに送る'(_限度度数,_キュー番号); キューから限界度数を示す0を受信するまで目標を成功させて蒐集項ならびを得る(_蒐集項,_目標,_キュー番号,_蒐集項ならび)). キューから限界度数を示す0を受信するまで目標を成功させて蒐集項ならびを得る(_蒐集項,_目標,_キュー番号,_蒐集項ならび) :- findall(_蒐集項,( thread_get_message(_キュー番号,_項), ( _項 = 0,!,fail;call(_目標))), _蒐集項ならび). '子スレッドで、生成された度数を、限界度数に達したら0をキューに送る'(_限度度数,_キュー番号) :- thread_create(度数(_限界度数,_キュー番号),_,[]). 度数(_限界度数,_キュー番号) :- between(1,_限界度数,_度数), _剰余 is _度数 mod ( _限界度数 + 1 ), thread_send_message(_キュー番号,_剰余), _度数 = _限界度数. % % 先にlength/2等で解の枠が決まっている場合があるが、 % findall/3述語だと、その枠を無視して、全解を蒐集して、 % その上で第三引数のならびとの単一化を試みようとする。 % 目標の解が1000万個というように多量の場合は、 % スタックオーバーフローが生じてエラーとなって終了する。 % % これに対して、この述語は子スレッドを作り出して、ここで % 本来は現在の解数を数えさせてキュー経由で親スレッドは % これを受信する。この為には親スレッドから子スレッドに解が % 取れたことを送信するためのキューが必要であるがここでは % それを省略した。子から親への片方向の通信になっている。 % % 子スレッドは1から解の限界数まで整数をキューに一気に詰め、 % さらに、終了の合図である0を詰める。親スレッドは目標が % 達成される度にキューから一つ度数情報を取り出す。 % 解の数が限界数に達した時に子スレッドが既に送信してあった % 0を受信することになり、親スレッドのfindall_n/4の目標内の % カットが発動されて強制的にfindall_n/4を終了させることが % できる。 % % ここではfindall/3を対象にしているがsetof/3やbagof/3も % 全く同様の問題があるし、解決策も同じである。 % 以下のサイトは # # 目標を限界度数成功させて指定した蒐集項をならびとして得る # 目標を限界度数成功させて指定した蒐集項をならびとして得る(_限界度数,_蒐集項,_目標,_蒐集項ならび) :- findall_n(_限界度数,_蒐集項,_目標,_蒐集項ならび). findall_n(_限界度数,_蒐集項,_目標,_蒐集項ならび) :- message_queue_create(_キュー番号), ( thread_create(度数(_限界度数,_キュー番号),_,[]); findall(_蒐集項,( call(_目標), thread_get_message(_キュー番号,_項), ( _項 = 0,!,fail;true)), _蒐集項ならび)). 度数(_限界度数,_キュー番号) :- between(1,_限界度数,_度数), _剰余 is _度数 mod ( _限界度数 + 1 ), thread_send_message(_キュー番号,_剰余), _度数 = _限界度数. % % 先にlength/2等で解の枠が決まっている場合があるが、 % findall/3述語だと、その枠を無視して、全解を蒐集して、 % その上で第三引数のならびとの単一化を試みようとする。 % 目標の解が1000万個というように多量の場合は、 % スタックオーバーフローが生じてエラーとなって終了する。 % % これに対して、この述語は子スレッドを作り出して、ここで % 本来は現在の解数を数えさせてキュー経由で親スレッドは % これを受信する。この為には親スレッドから子スレッドに解が % 取れたことを送信するためのキューが必要であるがここでは % それを省略した。子から親への片方向の通信になっている。 % % 子スレッドは1から解の限界数まで整数をキューに一気に詰め、 % さらに、終了の合図である0を詰める。親スレッドは目標が % 達成される度にキューから一つ度数情報を取り出す。 % 解の数が限界数に達した時に子スレッドが既に送信してあった % 0を受信することになり、親スレッドのfindall_n/4の目標内の % カットが発動されて強制的にfindall_n/4を終了させることが % できる。 % % ここではfindall/3を対象にしているがsetof/3やbagof/3も % 全く同様の問題があるし、解決策も同じである。 % 以下のサイトは # # sum=Σ(n=1~100)n^2の計算結果とsumが初めて100以上になるnの値を表示せよ。 # 'sum=Σ(n=1~100)n^2の計算結果とsumが初めて100以上になるnの値を表示せよ。' :- 'sum=Σ(n=1~100)n^2の計算結果と'(_sumの計算結果), sumが初めて100以上になるnの値を(1,0,_sumが初めて100以上になるnの値), 'sum=Σ(n=1~100)n^2の計算結果とsumが初めて100以上になるnの値を表示する。'(_sumの計算結果,_sumが初めて100以上になるnの値). 'sum=Σ(n=1~100)n^2の計算結果と'(_sumの計算結果) :- findsum(S,( between(1,100,_n), S is _n ^ 2), _sumの計算結果). sumが初めて100以上になるnの値を(_n,_sum,_sumが初めて100以上になるnの値) :- sum_2 is _sum + _n ^ 2, _n_2 is _n + 1, sumが初めて100以上になるnの値を(_n,_n_2,_sum,_sum_2,_sumが初めて100以上になるnの値). sumが初めて100以上になるnの値を(_sumが初めて100以上になるnの値,_,_sum,_,_sumが初めて100以上になるnの値) :- _sum >= 100,!. sumが初めて100以上になるnの値を(_n,_n_2,_sum,_sum_2,_sumが初めて100以上になるnの値) :- sumが初めて100以上になるnの値を(_n_2,_sum_2,_sumが初めて100以上になるnの値). 'sum=Σ(n=1~100)n^2の計算結果とsumが初めて100以上になるnの値を表示する。'(_sumの計算結果,_sumが初めて100以上になるnの値) :- writef('sumの計算結果 %t, sumが初めて100以上になるnの値 %t\n',[_sumの計算結果,_sumが初めて100以上になるnの値]). % 以下のサイトは # # sum=Σ(n=1~100)n^2の計算結果とsumが初めて100以上になるnの値を表示せよ。 # 'sum=Σ(n=1~100)n^2の計算結果とsumが初めて100以上になるnの値を表示せよ。' :- 'sum=Σ(n=1~100)n^2の計算結果と'(_sumの計算結果), sumが初めて100以上になるnの値を(1,0,_sumが初めて100以上になるnの値), '表示せよ。'(_sumの計算結果,_sumが初めて100以上になるnの値). 'sum=Σ(n=1~100)n^2の計算結果と'(_sumの計算結果) :- findsum(S,( between(1,100,_n), S is _n ^ 2), _sumの計算結果). sumが初めて100以上になるnの値を(_n,_sum,_sumが初めて100以上になるnの値) :- sum_2 is _sum + _n ^ 2, _n_2 is _n + 1, sumが初めて100以上になるnの値を(_n,_n_2,_sum,_sum_2,_sumが初めて100以上になるnの値). sumが初めて100以上になるnの値を(_sumが初めて100以上になるnの値,_,_sum,_,_sumが初めて100以上になるnの値) :- _sum >= 100,!. sumが初めて100以上になるnの値を(_n,_n_2,_sum,_sum_2,_sumが初めて100以上になるnの値) :- sumが初めて100以上になるnの値を(_n_2,_sum_2,_sumが初めて100以上になるnの値). '表示せよ。'(_sumの計算結果,_sumが初めて100以上になるnの値) :- writef('sumの計算結果 %t, sumが初めて100以上になるnの値 %t\n',[_sumの計算結果,_sumが初めて100以上になるnの値]). % 以下のサイトは # 例題の1つに、すべての製品を注文したすべての顧客の平均の売掛残高、および # すべての製品を注文していない顧客の平均の売掛残高を求めるといったものがありました。 % 単位節データベースを抽象するならば、 すべての製品を注文していない顧客の平均の売掛残高を求める(_すべての製品を注文していない顧客の平均の売掛残高) :- findsum(_売掛残高,( すべての製品を注文していない顧客の売掛残高(_売掛残高)), _すべての製品を注文していないすべての顧客の平均の売掛残高). すべての製品を注文していない顧客の平均の売掛残高(_売掛残高) :- すべての製品を注文していない顧客(_顧客), 売掛残高(_顧客,_売掛残高). すべての製品を注文していない顧客(_顧客) :- 顧客(_顧客), forall(商品(_商品),\+(注文(_顧客,_商品))). % 以下のサイトは ハミング距離(_a,_b,_ハミング距離) :- length(_a,_n), length(_b,_n), findsum(X,( nth1(_k,_a,A), nth1(_k,_b,B), X is abs(A-B)), _ハミング距離). % 以下のサイトは ダイクストラ法による最短距離探索(_出発点,_距離,_最短経路,_確定集合) :- _確定集合_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). % 以下のサイトは # 出典:: 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/db/1343899481/819 # 環境:アクセス2007 # # 得点テーブル # 日 科目 得点 # 1/1 英語 80 # 1/1 国語 50 # 1/1 数学 90 # # 1/2 英語 70 # 1/2 国語 70 # # 1/3 国語 60 # 1/3 数学 80 # # 1/4 英語 60 # 1/4 国語 60 # 1/4 数学 60 # # このようなテーブルから、下記のようにデータを取ってエクセルに張り付けたいのですが # どのようにすればよいでしょうか。 # # 日 英語  国語  数学 # 1/1 80 50 90 # 1/2 70 70 # 1/3 60 80 # 1/4 60 60 60 # # '環境:アクセス2007 得点テーブル 日 科目 得点 1/1 英語 80 1/1 国語 50 1/1 数学 90 1/2 英語 70 1/2 国語 70 1/3 国語 60 1/3 数学 80 1/4 英語 60 1/4 国語 60 1/4 数学 60 このようなテーブルから、下記のようにデータを取ってエクセルに張り付けたいのですが どのようにすればよいでしょうか。 日 英語  国語  数学 1/1 80 50 90 1/2 70 70 1/3 60 80 1/4 60 60 60' :- write('日,英語,国語,数学\n'), 日付ごとに三科目の得点を表示する(R). 日付ごとに三科目の得点を表示する :- forall(日付の選択(_日),三科目の得点を表示する(_日,_英語,_国語,_数学)). 日付の選択(_日) :- findsetof(_日,得点テーブル(_日,_,_),_日ならび), member(_日,_日ならび). 三科目の得点を表示する(_日) :- writef('%t,',[_日]), 英語表示(_日), 国語表示(_日), 数学表示(_日). 英語表示(_日) :- 得点テーブル(_日,英語,_得点), writef('%3r,',[_得点]),!. 英語表示(_日) :- writef('%t,',[' ']). 国語表示(_日) :- 得点テーブル(_日,国語,_得点), writef('%3r,',[_得点]),!. 国語表示(_日) :- writef('%t,',[' ']). 数学表示(_日) :- 得点テーブル(_日,数学,_得点), writef('%3r\n',[_得点]),!. 数学表示(_日) :- writef('%t\n',[' ']). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/361 # # お題:自然数Nが与えられたとき、Nの各桁の和をとり結果が一桁でなければ各桁の和 # をとることを繰り返す。最後の一桁の数を求めよ。 # 例 # 412205725 -> 4+1+2+2+0+5+7+2+5=28 # 28 -> 2+8=10 # 10 -> 1+0=1 '自然数Nが与えられたとき、Nの各桁の和をとり結果が一桁でなければ各桁の和をとることを繰り返す。最後の一桁の数を求めよ。'(N,N) :- N < 10,!. '自然数Nが与えられたとき、Nの各桁の和をとり結果が一桁でなければ各桁の和をとることを繰り返す。最後の一桁の数を求めよ。'(N,X) :- 'Nの各桁の和をとり'(N,N_2), '自然数Nが与えられたとき、Nの各桁の和をとり結果が一桁でなければ各桁の和をとることを繰り返す。最後の一桁の数を求めよ。'(N_2,X). 'Nの各桁の和をとり'(N,N_2) :- findsum(Y,( 'Nの各桁'(N,Y)), N_2). 'Nの各桁'(N,N) :- N < 10,!. 'Nの各桁'(N,X) :- X is N mod 10. 'Nの各桁'(N,X) :- N_2 is N // 10, 'Nの各桁'(N_2,X). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/ # # # お題:ヴィジュネル暗号で暗号・復号化する関数を作成せよ。 # ・平文は "programming" とする。 # ・鍵は任意とする。 # ヴィジュネル復号化(_平文,_鍵,_暗号文) :- \+(atom(_平文)), atom_chars(_暗号文,_暗号文文字ならび), atom_chars(_鍵,_鍵文字ならび), ヴィジュネル暗号(_平文文字ならび,_鍵文字ならび,_暗号文文字ならび), atom_chars(_平文,_平文文字ならび). ヴィジュネル暗号化(_平文,_鍵,_暗号文) :- atom(_平文), atom_chars(_平文,_平文文字ならび), atom_chars(_鍵,_鍵文字ならび), ヴィジュネル暗号(_平文文字ならび,_鍵文字ならび,_暗号文文字ならび), atom_chars(_暗号文,_暗号文文字ならび). ヴィジュネル暗号([],_,[]). ヴィジュネル暗号([_文字|R1],_鍵文字ならび,[_暗号文字|R3]) :- ヴィジュネル暗号の文字変換(_文字,_鍵文字ならび,_一文字回転した鍵文字ならび,_暗号文字), ヴィジュネル暗号(R1,_一文字回転した鍵文字ならび,R3). ヴィジュネル暗号の文字変換(_文字,[_鍵文字|R2],_一文字回転した鍵文字ならび,_暗号文字) :- ならびの回転(左方向,_,['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'],[_鍵文字|R]), nth1(_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],_文字), nth1(_nth1,[_鍵文字|R],_暗号文字), ならびの回転(左方向,1,[_鍵文字|R2],_一文字回転した鍵文字ならび),!. % 以下のサイトは # 出典:: 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. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/747 # # MySQL 5.5.29 # # ┏━┳━━┳━━┓ # ┃no┃.date┃名前┃ # ┣━╋━━╋━━┫ # ┃.1 ┃12-3┃榊  ┃ # ┣━╋━━╋━━┫ # ┃.2 ┃12-3┃山下┃ # ┣━╋━━╋━━┫ # ┃.3 ┃12-3┃斎藤┃ # ┣━╋━━╋━━┫ # ┃.4 ┃12-4┃山下┃ # ┣━╋━━╋━━┫ # ┃.5 ┃12-4┃斎藤┃ # ┗━┻━━┻━━┛ # # result: # no:1 # 名前:榊 # # このようなテーブルデータから、12-4に対して絞込みを行った際、前日に名前があり、当日に名前の消えているデータを抽出したいと思っています。 # 当初は2回SQLを実行しPHPで配列に流しこみそこで比較していたのですが処理の遅さが気になり、どうにかデータベース内で完結出来ないかと思い質問に来ました。 # 宜しくお願いします。 # 'このようなテーブルデータから、12-4に対して絞込みを行った際、前日に名前があり、当日に名前の消えているデータを抽出したい'(_絞込みdate,_名前) :- 前日に名前があり(_絞込みdate,_前日に名前があり), 当日に名前の消えている(_絞込みdate,_前日に名前があり,_当日に名前の消えている), データを抽出したい(_当日に名前の消えている,_名前). 前日に名前があり(_当日,_前日に名前があり) :- findmax(_date,( テーブル(_,_date,_), _date @< _当日), _事実上の前日), findsetof(_名前,( テーブル(_,_事実上の前日,_名前)), _前日に名前があり). 当日に名前の消えている(_当日,_前日に名前があり,_当日に名前の消えている) :- findsetof(_名前,( member(_名前,_前日に名前があり), \+(テーブル(_,_当日,_名前))), _当日に名前の消えている). データを抽出したい(_当日に名前の消えている,_名前) :- member(_名前,_当日に名前の消えている). % 以下のサイトは # 出典:: 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). % 以下のサイトは # 出典:: 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,_年度,_月). % 以下のサイトは # 出典:: 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/659 # # A_table # # ID | title | keyword # ------------------- # 1 | いうえ | あいうえお # 2 | きくけ | かきくけこ # 3 | しすせ | さしすせそ # # select * from A_table where "あいうえお" like "%titel%" # # 結果を # ID 1 の "いうえ" を結果としてだしたいのですが、 # WEBで入力した文字列の中に titleの中身を like検索してヒットする物をだしたい感じです。 # # MYSQLですが、、なかなかいい方法がわからなくて・・・ # 'A_table ID | title | data ------------------- 1 | いうえ | あいうえお 2 | きくけ | かきくけこ 3 | しすせ | さしすせそ select * from A_table where "あいうえお" like "%titel%" 結果を ID 1 の "いうえ" を結果としてだしたいのですが、 WEBで入力した文字列の中に titleの中身を like検索してヒットする物をだしたい感じです。'(_WEBで入力した文字列,_ID,_title,_data) :- 'A_table'(_ID,_title,_data), sub_atom(_WEBで入力した文字列,_,_,_,_title). % 以下のサイトは # # 集約鍵の詳細化 (坂内広蔵氏による集約キーのグラフ化の研究の一部をなぞったもの) # 集約鍵の詳細化(_集約鍵ならび,_詳細化された集約鍵) :- 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 % <以下省略> % % 以下のサイトは # Prolog 21世紀における0〜3の数字を2個ずつ使ってできる年月日の個数 # # 【出典】https://twitter.com/c_oi/status/301346035094126593 # https://twitter.com/c_oi/status/301346039590436864 # 【引用】「0〜3の数字を2個ずつ使ってできる年月日は21世紀(2001/01/01〜2100/12/31)の間に何日間あるでしょう?」 # '21世紀における0〜3の数字を2個ずつ使ってできる年月日の個数'(_個数) :- setof(_年月日ならび,( 重複を許す年月日ならびの選択(_年月日ならび)), LL), length(LL,_個数). 重複を許す年月日ならびの選択(_年月日ならび) :- 順列([0,0,1,1,2,2,3,3],8,_年月日ならび), _年月日ならび @>= [2,0,0,1,0,1,0,1], _年月日ならび @=< [2,1,0,0,1,2,3,1], \+(禁則(_年月日ならび)). 禁則([_,_,_,_,0,2,3,_]) :- !. 禁則([_,_,_,_,2,_,_,_]) :- !. 禁則([_,_,_,_,3,_,_,_]) :- !. 禁則([_,_,_,_,1,3,_,_]) :- !. 禁則([_,_,_,_,_,_,3,3]) :- !. 禁則([_,_,_,_,_,_,3,2]) :- !. 順列(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/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/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/tech/1357748713/512 # # [1] 授業単元:C言語基礎実習 # [2] 問題文(含コード&リンク):ある整数 a をその数自身を除く約数をすべて足したときに # その合計の値がaと同じになるとき、その数を和の完全数といいます。 # 512以下の和の完全数を見つけて表示するプログラムを作成しなさい。 # 出力は以下のようにする事。 # 6=1+2+3 # 28=1+2+4+7+14 # ・ # ・ # ・ # # 'ある整数 a をその数自身を除く約数をすべて足したときに その合計の値がaと同じになるとき、その数を和の完全数といいます 512以下の和の完全数を見つけて表示するプログラムを作成しなさい。 出力は以下のようにする事。 6=1+2+3 28=1+2+4+7+14 ・ ・ ・ ' :- between(1,512,_a), 'ある整数 a をその数自身を除く約数をすべて足したときにその合計の値がaと同じになるとき、その数を和の完全数といいます'(_診断,_a,_約数ならび), 完全数を表示する(_診断,_a,_約数ならび), _a = 512,!. 'ある整数 a をその数自身を除く約数をすべて足したときにその合計の値がaと同じになるとき、その数を和の完全数といいます'(和の完全数,_a,_約数ならび), _a_1 is _a - 1, findsum(_約数,( between(1,_a_1,_約数), 0 is _a mod _約数), _a),!. 'ある整数 a をその数自身を除く約数をすべて足したときにその合計の値がaと同じになるとき、その数を和の完全数といいます'(和の完全数ではない,_,_). 完全数を表示する(和の完全数,_a,_約数ならび) :- atomic_list_concat(_約数ならび,' + ',_式表現文字列), writef('%t=%t\n',[_a,_式表現文字列]),!. 完全数を表示する(和の完全数ではない,_,_). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/562 # # t_all #  id/groupType/userId # t_groupA #  id/c1/c2/c3 # t_groupB #  id/c1/c2/c3 # # 以上のような3つのテーブルがあって、t_all.groupTypeの値はgroupAまたはgroupBのいずれか # かつ、t_all.userId は t_groupA.id または t_groupB.id のいずれかである構造になっています # # この状況で、t_all.idしかわかっていない時に最短で # t_all.groupType、t_all.userId と、それに付随するt_groupAの全カラムまたはt_groupBの全カラムを # 取得するにはどういうクエリ文を書いたら良いでしょうか? # # select t_all.groupType, t_all.userId from t_all where t_all.id = $id; # として、その返り値のgroupTypeとuserIdを元にif文で分けてもう一度グループのテーブルにselectをするしかないですか? # よろしくお願いします。環境はmysql5.5です # # 't_all  id/groupType/userId t_groupA  id/c1/c2/c3 t_groupB  id/c1/c2/c3 以上のような3つのテーブルがあって、t_all.groupTypeの値はgroupAまたはgroupBのいずれか かつ、t_all.userId は t_groupA.id または t_groupB.id のいずれかである構造になっています この状況で、t_all.idしかわかっていない時に最短で t_all.groupType、t_all.userId と、それに付随するt_groupAの全カラムまたはt_groupBの全カラムを 取得するにはどういうクエリ文を書いたら良いでしょうか?'(_id,_goupType,_userId,_c1,_c2,_c3) :- t_all(_id,_groupType,_userId), atomic_list_concat(['t_',_groupType],_t_groupType), list_call([_t_groupType,_userId,_c1,_c2,_c3]). % 以下のサイトは # 出典:: 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/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]) :- _軸要素の鍵ならび @< _鍵ならび. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/94 # # [1] 授業単元: Cコーディング初級 # [2] 問題文(含コード&リンク): # # プログラムを実行した日がその年の第何週目にあるかを終了コードとして整数で返す # # [3] 環境 #  [3.1] OS: Windows #  [3.2] gcc 4.3.4 #  [3.3] 言語: C # [4] 期限: 1/17 # [5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々) time.h を使います # 週の頭は日曜から始まります # 1月1日を含む週に4日以上ある場合に第1週となります # つまり1月1日が日曜から始まっているときはその週が第1週ですが # 1月4日が日曜から始まっているときはその週が第1週になります 'プログラムを実行した日がその年の第何週目にあるかを終了コードとして整数で返す 週の頭は日曜から始まります 1月1日を含む週に4日以上ある場合に第1週となります つまり1月1日が日曜から始まっているときはその週が第1週ですが 1月4日が日曜から始まっているときはその週が第1週になります'(_その年の第何週目) :- プログラムを実行した日が(_年,_月,_日), 'その年の第何週目にあるかを終了コードとして整数で返す 1月1日を含む週に4日以上ある場合に第1週となります つまり1月1日が日曜から始まっているときはその週が第1週ですが 1月4日が日曜から始まっているときはその週が第1週になります'(_年,_月,_日,_その年の第何週目). プログラムを実行した日が(_年,_月,_日) :- date(_年,_月,_日). 'その年の第何週目にあるかを終了コードとして整数で返す 1月1日を含む週に4日以上ある場合に第1週となります つまり1月1日が日曜から始まっているときはその週が第1週ですが 1月4日が日曜から始まっているときはその週が第1週になります'(_年,_月,_日,_その年の第何週目) :- 'Zellerの公式を用いて曜日を得る'(_年,1,1,_曜日を表す値,_曜日), _曜日を表す値 >= 4, _今年に入ってからの第一週以前の日数 is 7 - _曜日を表す値, 一月一日からの累積日数(_年,_月,_日,_一月一日からの累積日数), _その年の第何週目 is (_一月一日からの累積日数 - _今年に入ってからの第一週以前の日数) // 7 + 1. 'その年の第何週目にあるかを終了コードとして整数で返す 1月1日を含む週に4日以上ある場合に第1週となります つまり1月1日が日曜から始まっているときはその週が第1週ですが 1月4日が日曜から始まっているときはその週が第1週になります'(_年,_月,_日,_その年の第何週目) :- 'Zellerの公式を用いて曜日を得る'(_年,1,1,_曜日を表す値,_曜日), _曜日を表す値 < 4, 一月一日からの累積日数(_年,_月,_日,_一月一日からの累積日数), _その年の第何週目 is _一月一日からの累積日数 // 7 + 1. 一月一日からの累積日数(_年,_月,_日,_一月一日からの累積日数) :- うるう年(_年), findsum(_日数,( nth1(_nth1,[31,29,31,30,31,30,31,31,30,31,31],_日数), _nth1 < _月), 累積日数_1), _累積日数 is _累積日数 + _日. 一月一日からの累積日数(_年,_月,_日,_一月一日からの累積日数) :- \+(うるう年(_年)), findsum(_日数,( nth1(_nth1,[31,28,31,30,31,30,31,31,30,31,31],_日数), _nth1 < _月), 累積日数_1), _累積日数 is _累積日数 + _日. '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,'土曜'). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100, !,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/992 # # [2] 問題文(含コード&リンク):2つの数列の相関係数を求めるプログラムを作成する。 # '2つの数列の相関係数を求める'(_数列a,_数列b,_相関係数) :- 相加平均(_数列a,_数列aの相加平均), 相加平均(_数列b,_数列bの相加平均), 分子計算(_数列a,_数列b,_数列aの相加平均,_数列bの相加平均,_相関係数式の分子), 分母計算(_数列a,_数列b,_数列aの相加平均,_数列bの相加平均,_相関係数式の分母), _相関係数 is _相関係数式の分子 / _相関係数式の分母. 分子計算(_数列a,_数列b,_数列aの相加平均,_数列bの相加平均,_分子) :- findsum(S,( nth1(_nth1,_数列a,_数列aの要素), nth1(_nth1,_数列b,_数列bの要素), S is (_数列aの要素 - _数列aの相加平均) * (_数列bの要素 - _数列bの相加平均)), _分子). 分母計算(_数列a,_数列b,_数列aの相加平均,_数列bの相加平均,_分母) :- findsum_a(_数列a,_数列aの相加平均,S_a), findsum_b(_数列b,_数列bの相加平均,S_b), _分母 is S_a * S_b. findsum_a(_数列a,_数列aの相加平均,S) :- findsum(U,( member(_x,_数列a), U is (_x - _数列aの相加平均) ^ 2), S). findsum_b(_数列b,S) :- findsum(U,( member(_x,_数列b), U is (_x - _数列bの相加平均) ^ 2), S). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/33 # # [1] 授業単元:リスト構造 # [2] 問題文(含コード&amp;リンク): # http://ime.nu/iup.2ch-library.com/i/i0825590-1357830189.gif # # 以下のようなメニューを表示,各項目の機能を実現して結果を表示するプログラムを作 成せよ. # リストは1つとし,初期値は「15 4 32 1」である. # ・データの追加,削除は練習課題(挿入や削除)のものを参考にすればよい. # ・データの追加に関して,そのデータはリストの最後に挿入されるものとする. # ・データのソート(降順)を行う関数を作成する. # ・リストの平均値を計算し出力する関数を作成する。 # # ------表示例------ # 1. データの追加 # 2. データの削除 # 3. データのソート(降順) # 4. リストの平均値 # 5. 終了 # 何を実行しますか : # ------------------ # # ------実行例------- # 1. データの追加 # 2. データの削除 # 3. データのソート(降順) # 4. リストの平均値 # 5. 終了 # 何を実行しますか : 1 # 追加するデータを入力してください : 10 # リスト : 15 4 32 1 10 # # 1. データの追加 # 2. データの削除 # 3. データのソート(降順) # 4. リストの平均値 # 5. 終了 # 何を実行しますか : 4 # リストの平均値 : 12.4 # リスト : 15 4 32 1 10 # # 1. データの追加 # 2. データの削除 # 3. データのソート(降順) # 4. リストの平均値 # 5. 終了 # 何を実行しますか : 3 # リスト : 32 15 10 4 1 # :- dynamic(リスト/1). '以下のようなメニューを表示,各項目の機能を実現して結果を表示するプログラムを作成せよ. リストは1つとし,初期値は「15 4 32 1」である. ・データの追加,削除は練習課題(挿入や削除)のものを参考にすればよい. ・データの追加に関して,そのデータはリストの最後に挿入されるものとする. ・データのソート(降順)を行う関数を作成する. ・リストの平均値を計算し出力する関数を作成する。 ------表示例------ 1. データの追加 2. データの削除 3. データのソート(降順) 4. リストの平均値 5. 終了 何を実行しますか : ' :- 'リストは1つとし,初期値は「15 4 32 1」である', メニューを表示, 各項目の機能を実現して結果を表示する. 'リストは1つとし,初期値は「15 4 32 1」である' :- assertz(リスト([15,4,32,1])). メニューを表示 :- write('1. データの追加\n2. データの削除\n3. データのソート(降順)\n4. リストの平均値\n5. 終了\n何を実行しますか : '). メニューを表示 :- メニューを表示. 各項目の機能を実現して結果を表示する :- 機能番号を選択する(_機能番号), 機能を実現して結果を表示する(_機能番号), _機能番号 = 5,!. 機能番号を選択する(_機能番号) :- get_line(Line), '診断:: メニューの選択'(Line,_機能番号),!. 機能番号を選択する(_機能番号) :- 機能番号を選択する(_機能番号). '診断:: メニューの選択'(Line,_機能番号) :- atom_number(Line,_機能番号), integer(_機能番号), between(1,5,_機能番号),!. '診断:: メニューの選択'(Line,_機能番号) :- writef('選択された %t からは適切な機能番号が得られません。再入力をお願いします。\n',[Line]), fail. 機能を実現して結果を表示する(5) :- !. 機能を実現して結果を表示する(1) :- データの追加. 機能を実現して結果を表示する(2) :- データの削除. 機能を実現して結果を表示する(3) :- 'データのソート(降順)'. 機能を実現して結果を表示する(4) :- リストの平均値. データの追加 :- write('追加するデータを入力してください : '), 整数を得る(_データ), retract(リスト(L1)), append(L1,[_データ],L2), assertz(リスト(L2)). データの削除 :- write('削除するデータを入力してください : '), 整数を得る(_データ), retract(リスト(L1)), ならびから削除(_データ,L1,L2), assertz(リスト(L2)). 'データのソート(降順)' :- リスト(L1), 降順整列(L1,L2), atomic_list_concat(L2,' ',S), writef('リスト : %t\n',[S]). リストの平均値 :- リスト(L1), findavg(_データ,( member(_データ,L1)), _平均値), atomic_list_concat(L1,_リスト表示), writef('平均値 : %t\nリスト : %t\n',[_平均値,_リスト表示]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,_,[e,n,d,'_',o,f,'_',f,i,l,e]) :- at_end_of_stream(Stream),!. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_line(user_input,X). ならびから削除(_,[],[]) :- !. ならびから削除(_削除する要素,[_削除する要素|_残り対象ならび],_削除されたならび) :- ならびから削除(_削除する要素,_残り対象ならび,_削除されたならび),!. ならびから削除(_削除する要素,[_要素|_残り対象ならび],[_要素|_残り削除ならび]) :- ならびから削除(_削除する要素,_残り対象ならび,_残り削除ならび),!. 降順整列([],[]). 降順整列([_軸要素|R1],_降順に整列されたならび) :- 降順分割(_軸要素,R,_軸要素に等しいか大きいならび,_軸要素より小さいならび), 降順整列(_軸要素に等しいか大きいならび,_整列した軸要素に等しいか大きいならび), 降順整列(_軸要素より小さいならび,_整列した軸要素より小さいならび), append(_整列した軸要素に等しいか大きいならび,[_軸要素|_整列した軸要素より小さいならび],_降順に整列したならび). 降順分割(_,[],[],[]). 降順分割(_軸要素,[_要素|R],[_要素|_軸要素に等しいか大きいならび],_軸要素より小さいならび) :- _要素 @>= _軸要素, 降順分割(_軸要素,R,_軸要素に等しいか大きいならび,_軸要素より小さいならび). 降順分割(_軸要素,[_要素|R],_軸要素に等しいか大きいならび,[_要素|_軸要素より小さいならび]) :- _要素 @< _軸要素, 降順分割(_軸要素,R,_軸要素に等しいか大きいならび,_軸要素より小さいならび). findavg(_集約項,_項,_相加平均) :- findall(_集約項,_項,_値ならび), sum(_値ならび,_合計値), length(_値ならび,_ならびの長さ), _相加平均 is _合計値 / _ならびの長さ,!. sum([],0). sum([N|R],S) :- sum(R,S_1), S is N + S_1. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/431 # # UPDATE list SET target=1 WHERE id=1 # というので更新をかけたいのですが、id=1が複数あります。 # どれでもいいのでid=1のものを1つ更新をかけたいのですがそういったことは可能でしょうか? # 最後に「LIMIT 1」とつけたら # SQLSTATE[HY000]: General error: 1 near "LIMIT": syntax errorとエラーが表示されましたので間違っているとは思うのですが # こういったことが可能であれば構文的にご指摘いただけないでしょうか。 # # 'UPDATE list SET target=1 WHERE id=1 というので更新をかけたいのですが、id=1が複数あります。 どれでもいいのでid=1のものを1つ更新をかけたい' :- テーブルの更新(list,[id],[1],true,[target],[1]). テーブルの更新(_テーブル名,_鍵属性ならび,_鍵値ならび,_条件,_置換属性ならび,_置換値ならび) :- テーブル定義から実行項と引数ならびを得る(_テーブル名,P,_引数ならび), 鍵を設定する(_テーブル名,_鍵属性ならび,_鍵値ならび,_引数ならび), 条件に適合した節を削除する(P,_条件), 引数ならびの値を置換する(_テーブル名,_置換属性ならび,_置換値ならび,_引数ならび,_置換された引数ならび), 置換された節を先頭に加える(_テーブル名,_置換された引数ならび). 条件に適合した節を削除する(P,_条件) :- retract(P), '診断: 条件に適合した節を削除する'(P,_条件). '診断: 条件に適合した節を削除する'(P,_条件) :- call(_条件),!. '診断: 条件に適合した節を削除する'(P,_条件) :- asserta(P). テーブル定義から実行項と引数ならびを得る(_テーブル名,P,_引数ならび) :- findall(_,テーブル定義(_テーブル名,_,_),_引数ならび), P =.. [_テーブル名|_引数ならび],!. 鍵を設定する(_,[],[],_引数ならび). 鍵を設定する(_テーブル名,[_鍵属性|R1],[_鍵値|R2],_引数ならび) :- テーブル定義(_テーブル名,_nth1,_鍵属性), nth1(_nth1,_引数ならび,_鍵値), 鍵を設定する(_テーブル名,R1,R2,_引数ならび). 引数ならびの値を置換する(_,[],[],_置換された引数ならび,_置換された引数ならび). 引数ならびの値を置換する(_テーブル名,[_置換属性|R1],[_置換値|R2],_引数ならび,_置換された引数ならび) :- テーブル定義(_テーブル名,_nth1,_置換属性), 要素番号によるならびの置換(_nth1,_置換値,_引数ならび,_引数ならび_2), 引数ならびの値を置換する(_テーブル名,R1,R2,_引数ならび_2,_置換された引数ならび). 要素番号によるならびの置換(_要素番号,_置換要素,_対象ならび,_置換ならび) :- length([_|L0],_要素番号), append(L0,[_|R],_対象ならび), append(L0,[_置換要素|R],_置換ならび),!. 置換された節を先頭に加える(_テーブル名,_置換された引数ならび) :- P =.. [_テーブル名|_置換された引数ならび], asserta(P). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/188 # # [1]C言語 # [2]hashについて # 問題文 http://ime.nu/www.dotup.org/uploda/www.dotup.org3723526.jpg # [3]Linux # [3.1]gcc C言語 # [4]木曜日6:00まで # [5]宜しくお願いします… # # # 問題1. 整数データに対してハッシュ探索を行うことを考える。 # (1) 1~50までの値の乱数を20回呼び出し、テーブル長が23のハッシュテーブル # にチェイン法によってデータを格納せよ。ここでハッシュ関数は(mod23)と # する。 # (2) hash表の内容をすべて画面表示する関数print_hashを定義して、確認しな # さい。 # (3) (2)によって格納されたデータに対して各i(1=% 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/138 # # [1] 授業単元: ファイル読み取り コサイン類似度 # [2] 問題文(含コード&amp;リンク):http://ime.nu/codepad.org/pX1MdXpC #   問題中のsample.txtの例 http://ime.nu/www1.axfc.net/uploader/so/2707638.txt #   問題中のtest.txtの例 http://ime.nu/www1.axfc.net/uploader/so/2707641.txt # # /* # 二つのtxtファイルがある # sample.txtはファイル名と500個の数値の文字列が一行書かれている。 # txtファイルを例として上げる # 例: # # test.txtはsample.txtと同じようなファイル名と500個の数値の文字列を一行とした文字列が # 不特定多数並んでいる。txtファイルを例として上げる。 # 例: # # この2つのtxtファイルを使って次の動作をするプログラムを作れ # # ?sample.txtに書かれている数値を読み取って、配列a[n]に格納する。 # nは数値の番号で0からはじめる。 # # ?test.txtを読み取って、一行ごとに数値を配列b[i][j]に格納する #  iには行数、jには数値の番号を入れる。番号は0からはじめる。 #  余裕があれば、ファイル名を別の配列に格納する # # ?それぞれ格納された配列の数値をつかって繰り返し文を使い # # c[i]=a[n]*b[i][j]をすべて足した数/{sqrt(a[n]*a[n])をすべて足した数*sqrt(b[i][j]*b[i][j])をすべて足した数} # # の計算を行う。 # 考え方は下の用になる # # c[0]=(a[0]*b[0][0]+a[1]*b[0][1]+a[2]*b[0][2]+...+a[n]*b[0][j]) # / (sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]+...+a[n]*a[n])*sqrt(b[0][0]*b[0][0]+b[0][1]*b[0][1]+b[0][2]*b[0][2]+...+b[0][j]*b[1][j])); # # c[1]=(a[0]*b[1][0]+a[1]*b[1][1]+a[2]*b[1][2]+...+a[n]*b[1][j]) # / (sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]+...+a[n]*a[n])*sqrt(b[1][0]*b[1][0]+b[1][1]*b[1][1]+b[1][2]*b[1][2]+...+b[1][j]*b[1][j])); # # c[2]=(a[0]*b[2][0]+a[1]*b[2][1]+a[2]*b[2][2]+...+a[n]*b[2][j]) # / (sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]+...+a[n]*a[n])*sqrt(b[2][0]*b[2][0]+b[2][1]*b[2][1]+b[2][2]*b[2][2]+...+b[2][j]*b[2][j])); # # ・ # ・ # ・ # # c[i]=(a[0]*b[i][0]+a[1]*b[i][1]+a[2]*b[i][2]+...+a[n]*b[i][j]) # / (sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]+...+a[n]*a[n])*sqrt(b[i][0]*b[i][0]+b[i][1]*b[i][1]+b[i][2]*b[i][2]+...+b[i][j]*b[i][j])); # # # ?画面にc[i]をすべて表示させる。余裕があれば同時に?で格納したファイル名も出力する # # # /* # '二つのtxtファイルがある sample.txtはファイル名と500個の数値の文字列が一行書かれている。 txtファイルを例として上げる 例: test.txtはsample.txtと同じようなファイル名と500個の数値の文字列を一行とした文字列が 不特定多数並んでいる。txtファイルを例として上げる。 例: この2つのtxtファイルを使って次の動作をするプログラムを作れ 1)sample.txtに書かれている数値を読み取って、配列a[n]に格納する。 nは数値の番号で0からはじめる。 2)test.txtを読み取って、一行ごとに数値を配列b[i][j]に格納する  iには行数、jには数値の番号を入れる。番号は0からはじめる。  余裕があれば、ファイル名を別の配列に格納する 3)それぞれ格納された配列の数値をつかって繰り返し文を使い c[i]=a[n]*b[i][j]をすべて足した数/{sqrt(a[n]*a[n])をすべて足した数*sqrt(b[i][j]*b[i][j])をすべて足した数} の計算を行う。'(_c) :- 'sample.txtに書かれている数値を読み取って、_aに格納する'(_a), 'test.txtを読み取って、配列bに格納する'(_b), 'c[i]=a[n]*b[i][j]をすべて足した数/{sqrt(a[n]*a[n])をすべて足した数の計算を行う'(_a,_b,_c). 'sample.txtに書かれている数値を読み取って、_aに格納する。'(_a) :- get_numbers('sample.txt',_a). 'test.txtを読み取って、配列bに格納する'(_b) :- 'test.txtを読み取って'(Lines), 配列bに格納する(Lines,_b). 'test.txtを読み取って'(Lines) :- get_lines('test.txt',Lines). 配列bに格納する(Lines,_b) :- findall(L,( member(A,Lines), atom_codes(A,L)), _b). 'c[i]=a[n]*b[i][j]をすべて足した数/{sqrt(a[n]*a[n])をすべて足した数の計算を行う'(_a,_b,_c) :- 'sqrt(a[n]*a[n])をすべて足した数'(_a,V), findsum(X,( 'a[n]*b[i][j]をすべて足した数'(_a,_b,W), X is W / (V * sqrt(S_1))), _c). 'sqrt(a[n]*a[n])をすべて足した数'(_a,X) :- findsum(U,( member(A,_a), U is A * A), S_0), X is sqrt(S_1). 'a[n]*b[i][j]をすべて足した数'(_a,_bW) :- member(L,_b), findsum(Y,( nth0(_nth0_1,L,N), nth0(_nth0_1,_a,M), Y is M * N), W). get_numbers(File,Numbers) :- get_lines(File,Lines), findall(Number,( member(Line,Lines), atom_to_number(Line,Number)), Numbers). % 以下のサイトは # 出典:: http://test/read.cgi/tech/1354715494/33 # # 【お題】 # ウィルソンの定理を使って素数を判定する関数is_primeを実装し、 # 10000以下の素数以外の数の和を求めよ # # ウィルソンの定理 # pが素数 <=> (p-1)!+1 (mod p) == 0 :- dynamic(階乗保存計算/2). :- retract((階乗保存計算(_,_) :- _)),fail;true. 'ウィルソンの定理を使って素数を判定する関数is_primeを実装し、 10000以下の素数以外の数の和を求めよ ウィルソンの定理 pが素数 <=> (p-1)!+1 (mod p) == 0'(_10000以下の素数以外の数の和) :- findsum(_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) :- !)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/125 # # [1] 授業単元:c言語 関数&配列 # [2] 問題文 関数配列の問題です。 # http://www.dotup.org/uploda/www.dotup.org3703015.pdf # ベクトルの内積(_ベクトル_1,_ベクトル_2,_ベクトルの内積) :- findsum(X,( nth1(_nth1,_ベクトル_1,[X_1]), nth1(_nth1,_ベクトル_2,[X_2]), X is X_1 * X_2), _ベクトルの内積). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum(_値ならび,_合計値). sum([],0). sum([A|R],S) :- sum(R,S1), S is A + S1. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/313 # # SET型について質問です。 # # 'りんご', 'みかん', 'ばなな', 'めろん' # # のようなfruitという名のフィールドがあった時、 # 'りんご' と 'ばなな' 両方が含まれているデータを取得したいのですが、どのようにしたら良いでしょうか? # # WHERE `fruit` & 5 # # このようにしたら、 'りんご' または 'ばなな' のいずれかを持つデータが取得されてしまいます。 # # # MySQL5を使用しています。 # どなたかご教授お願いしますm(_ _)m # # 'りんご, みかん, ばなな, めろん のようなfruitという名のフィールドがあった時、 りんご と ばなな 両方が含まれているデータを取得したいのですが、どのようにしたら良いでしょうか?'(_fruit) :- テーブル検索の副目標を得る(テーブル1,[fruit],_テーブル定義,_副目標,_値ならび,[_fruit]), _副目標, 'fruitという名のフィールドがあった時、りんご と ばなな 両方が含まれているデータを取得したい'(_fruit). テーブル検索の副目標を得る(_テーブル名,_鍵名ならび,_テーブル定義,_副目標,_値ならび,_鍵の変数ならび) :- テーブル定義の取得(_テーブル名,_テーブル定義,_副目標,_値ならび). 副目標に鍵を設定する(_テーブル定義,_鍵名ならび,_値ならび,_鍵の変数ならび),!. テーブル定義の取得(_テーブル名,_テーブル定義,_副目標,_値ならび) :- findall([_位置,_属性名],( テーブル定義(_テーブル名,_位置,_属性名)), _テーブル定義), length(_テーブル定義,Len), length(_値ならび,Len), _副目標 =.. [_テーブル名|_値ならび]. 副目標に鍵を設定する(_,[],_,[]). 副目標に鍵を設定する(_テーブル定義,[_鍵名|R2],_値ならび,[_鍵の変数|R4]) :- member([_鍵の位置,_鍵名],_テーブル定義), nth1(_鍵の位置,_値ならび,_鍵の変数), 副目標に鍵を設定する(_テーブル定義,R2,_値ならび,R4). 'fruitという名のフィールドがあった時、りんご と ばなな 両方が含まれているデータを取得したい'(_fruit) :- sub_atom(_fruit,_,_,_,りんご), sub_atom(_fruit,_,_,_,ばなな). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/318 # # MySQL5.1 # # table1 # id,hoge1,hoge2 # # idが2,4,6の中で、hoge1が1,3,5のidを取得したい。 # # SELECT `id` FROM `table1` WHERE (`id` IN (2,4,6)) AND (`hoge1` IN (1,3,5)); # # このsqlでidが2,4,6の3件からの検索なりますか? # もっといいsqlありますか? # # 'table1 id,hoge1,hoge2 idが2,4,6の中で、hoge1が1,3,5のidを取得したい。'(_id) :- テーブル検索の副目標を得る(table1,[id,hoge1],_,_副目標,_,[_id,_hoge1]), member(_id,[2,4,6]), member(_hoge1,[1,3,5]), _副目標. テーブル検索の副目標を得る(_テーブル名,_鍵名ならび,_テーブル定義,_副目標,_値ならび,_鍵の変数ならび) :- テーブル定義の取得(_テーブル名,_テーブル定義,_副目標,_値ならび). 副目標に鍵を設定する(_テーブル定義,_鍵名ならび,_値ならび,_鍵の変数ならび),!. テーブル定義の取得(_テーブル名,_テーブル定義,_副目標,_値ならび) :- findall([_位置,_属性名],( テーブル定義(_テーブル名,_位置,_属性名)), _テーブル定義), length(_テーブル定義,Len), length(_値ならび,Len), _副目標 =.. [_テーブル名|_値ならび]. 副目標に鍵を設定する(_,[],_,[]). 副目標に鍵を設定する(_テーブル定義,[_鍵名|R2],_値ならび,[_鍵の変数|R4]) :- member([_鍵の位置,_鍵名],_テーブル定義), nth1(_鍵の位置,_値ならび,_鍵の変数), 副目標に鍵を設定する(_テーブル定義,R2,_値ならび,R4). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/102 # # [1] 授業単元:言語処理 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/0VyMr7kt # 上記のプログラムを変更して、逆ポーランド記法で記載された式が書かれたテキストファイルを読み込み,計算結果を出力するプログラムを作成せよ. # さらに,各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を表示するプログラムを作成せよ. # '逆ポーランド記法で記載された式が書かれたテキストファイルを読み込み,計算結果を出力する.さらに,各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を表示する'(_テキストファイル) :- 逆ポーランド記法で記載された式が書かれたテキストファイルを読み込み(_テキストファイル,_逆ポーランド式ならび), 計算結果を出力する(_逆ポーランド式ならび), 'さらに,各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を表示する'(_テキストファイル). 逆ポーランド記法で記載された式が書かれたテキストファイルを読み込み(_テキストファイル,_逆ポーランド式ならび) :- get_Chars(_テキストファイル,_文字ならび), 数字を値に変換する(_文字ならび,_文字ならび_1), 空白を除去する(_文字ならび_1,_逆ポーランド式ならび). 数字を値に変換する([],[]). 数字を値に変換する([A|R1],[B|R1]) :- 数字ならば数に変換(A,B), 数字を値に変換する(R1,R2),!. 数字を値に変換する([A|R1],[A|R2]) :- 数字を値に変換する(R1,R2). 空白改行などを除去する([],[]). 空白改行などを除去する([A|R1],[A|R1]) :- member(A,[+,-,*,/,0,1,2,3,4,5,6,7,8,9]), 空白改行などを除去する(R1,R2),!. 空白改行などを除去する([_|R1],[_|R2]) :- 空白改行などを除去する(R1,R2). 数字ならば数に変換(A,B) :- A @>= '0', A @=< '9', atom_number(A,B). 計算結果を出力する(_逆ポーランド式ならび) :- 計算結果(_逆ポーランド式ならび,[],_値), writef('%t\n',[_値]). 計算結果([],[_値],_値). 計算結果([N|R1],L1,_値) :- number(N), 計算結果(R1,[N|L1],_値),!. 計算結果([_演算子|R1],[N1,N2|R2],_値) :- 演算(_演算子,N1,N2,N3), 計算結果(R1,[N3|R2],_値). 演算(_演算子,N1,N2,N3) :- F =.. [_演算子,N1,N2], N3 is F. 'さらに,各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を表示する'(_テキストファイル) :- get_lines(_テキストファイル,Lines), '各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を表示する'(Lines). '各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を表示する'(Lines) :- append(_,[_行|R],Lines), '各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を'(_行), 表示する(_頻度ならび), R = []. '各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を'(_行,_頻度ならび) :- '各行の内容を字句解析(トークンに分解)し'(_行,_字句ならび), 各要素の個数をカウントした結果を(_字句ならび,_頻度ならび). '各行の内容を字句解析(トークンに分解)し'(_行,_字句ならび) :- sPLIT(_行,[' ','+','-','*','/','1','2','3','4','5','6','7','8','9','0'],L_1), 空白を取り除く(L_1,_字句ならび). 各要素の個数をカウントした結果を(_字句ならび,_頻度ならび) :- findsetof(_要素,( member(_要素,_字句ならび)), L_1), findall([_頻度,_字句],( member(_字句,L_1), count(member(_字句,_字句ならび),_頻度)), _頻度ならび). 表示する(_頻度ならび) :- append(_,[[_頻度,_字句]|R],_頻度ならび), writef('%t,%t回 ',[_字句,_頻度]), R = [], write('\n'). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/295 # # 複数のデータベースからデータを取り出したいのですが # 似たようなデータが並んでいて、SELECTと同じようにコンマ区切りでやれば・・・と思い、 # SELECT * FROM A,Bと # してみたのですが、取り出せず、 # SELECT * FROM A B # としたのですが、Aのデータしか取り出せません。 # どのようにすれば両方のデータを取り出せるのでしょうか。 # 共通のキーでくっつけるではなく、 # # A あほ # A ばか # A あほ # A あほ # B あほ # B ばか # B ばか # B あほ # # のように取り出したいのです。 # # '複数のデータベースからデータを取り出したいのですが 似たようなデータが並んでいて、SELECTと同じようにコンマ区切りでやれば・・・と思い、 SELECT * FROM A,Bと してみたのですが、取り出せず、 SELECT * FROM A B としたのですが、Aのデータしか取り出せません。 どのようにすれば両方のデータを取り出せるのでしょうか。 共通のキーでくっつけるではなく、 A あほ A ばか A あほ A あほ B あほ B ばか B ばか B あほ のように取り出したいのです。'(_値ならび) :- テーブルの引数ならびを得る(テーブルA,_,_Aの引数ならび), テーブルの引数ならびを得る(テーブルB,_,_Bの引数ならび), テーブルAを取り出す(_Aの引数ならび,_Aを取り出す条件,_値ならび), テーブルBを取り出す(_Bの引数ならび,_Bを取り出す条件,_値ならび). テーブルAを取り出す(_引数ならび,_取り出す条件,_値ならび) :- P =.. [テーブルA|_引数ならび], call(P), call(_取り出す条件). テーブルBを取り出す(_引数ならび,_取り出す条件,_値ならび) :- P =.. [テーブルB|_引数ならび], call(P), call(_取り出す条件). テーブルの引数ならびを得る(_テーブル名,_属性名ならび,_引数ならび) :- findsetof([_属性位置,_属性名,_],( テーブル構造(_テーブル名,_属性位置,_属性名)), LL1), 整列(LL1,LL2), 第二要素のみ取り出す(LL2,_属性名ならび), 第三要素のみ取り出す(LL2,_引数ならび). 第二要素のみ取り出す([],[]). 第二要素のみ取り出す([[_,A|_]|R1],[A|R2]) :- 第二要素のみ取り出す(R1,R2). 第三要素のみ取り出す([],[]). 第三要素のみ取り出す([[_,_,A|_]|R1],[A|R2]) :- 第三要素のみ取り出す(R1,R2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/281 # # SQL Server 2000においてです。 # # テーブルのフィールドに電話番号、携帯番号、FAX とあった場合、これらから例えば"0123"と検索するのに # Or で接続する以外に検索する方法はありますか? # # 普通?に考えれば以下の方になるかと思いますが、これを簡易的?にインデックスが利く状態で書き換えたい。 # > SELECT * # > FROM Tablehoge # > WHERE (電話番号="0123") OR (携帯番号="0123") OR (FAX="0123") # # なので以下の様なものは却下になります。 # > SELECT * # > FROM Tablehoge # > WHERE "|" & 電話番号 & "|" & 携帯番号 & "|" & FAX & "|" Like "*|0123|*" # # 'テーブルのフィールドに電話番号、携帯番号、FAX とあった場合、これらから例えば"0123"と検索するのにOr による遅い検索'(_電話番号,_携帯番号,_FAX) :- findsetof([_電話番号,_携帯番号,_FAX],( 'Or による遅い検索'(_電話番号,_携帯番号,_FAX)), LL), member([_電話番号,_携帯番号,_FAX],LL). 'Or による遅い検索'(_電話番号,_携帯番号,_FAX) :- テーブル(_電話番号,_携帯番号,_FAX), sub_atom(_電話番号,_,4,_,'0123'). 'Or による遅い検索'(_電話番号,_携帯番号,_FAX) :- テーブル(_電話番号,_携帯番号,_FAX), sub_atom(_携帯番号,_,4,_,'0123'). 'Or による遅い検索'(_電話番号,_携帯番号,_FAX) :- テーブル(_電話番号,_携帯番号,_FAX), sub_atom(_Fax,_,4,_,'0123'). 'テーブルのフィールドに電話番号、携帯番号、FAX とあった場合、これらから例えば"0123"と検索するのにOr で検索する'(_電話番号,_携帯番号,_FAX) :- テーブル(_電話番号,_携帯番号,_FAX), 'Orで検索する'(_電話番号,_携帯番号,_FAX). 'Orで検索する'(_電話番号,_携帯番号,_FAX) :- sub_atom(_電話番号,_,4,_'0123'),!. 'Orで検索する'(_電話番号,_携帯番号,_FAX) :- sub_atom(_携帯番号,_,4,_'0123'),!. 'Orで検索する'(_電話番号,_携帯番号,_FAX) :- sub_atom(_Fax,_,4,_'0123'). 'テーブルのフィールドに電話番号、携帯番号、FAX とあった場合、これらから例えば"0123"と検索するのにOr 以外で検索する'(_電話番号,_携帯番号,_FAX) :- テーブル(_電話番号,_携帯番号,_FAX), 'Or以外で検索する'(_電話番号,_携帯番号,_FAX). 'Or以外で検索する'(_電話番号,_携帯番号,_FAX) :- atomic_list_concat([_電話番号,_携帯番号,_FAX],S), sub_atom(S,_,4,_,'0123'),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/271 # # Oracle11gR2で # # ID  Count # 1 3 # 2 2 # 3 3 # # こういうデータを元に # # Seq ID # 1 1 # 2 1 # 3 1 # 4 2 # 5 2 # 6 3 # 7 3 # 8 3 # # こんな感じのCount(*)の逆を作りたいけど、PL/SQL使わずに作るには、どうしたらいい? # Seqはなくてもいい # 'ID  Count 1 3 2 2 3 3 こういうデータを元に Seq ID 1 1 2 1 3 1 4 2 5 2 6 3 7 3 8 3 こんな感じのCount(*)の逆を作りたいけど、PL/SQL使わずに作るには、どうしたらいい?'(_テーブル名,_Seq,_ID) :- 実行項の生成(_テーブル名,_ID,_実行項), 'IDごとのカウントを取る'(_ID,_実行項,_ID_頻度ならび), sort(_ID_頻度ならび,_整列した_ID_頻度ならび), 'Seq組を生成'(1,_整列した_ID_頻度ならび,_Seq,_ID). 実行項の生成(_テーブル名,_ID,_実行項) :- findmax(Nth1,テーブル定義(_テーブル名,Nth1,_),_組の要素数), length(L,_組の要素数), _実行項 =.. [_テーブル名|L], テーブル定義(_テーブル名,_IDの位置,'ID'), nth1(_IDの位置,L,_ID). 'IDごとのカウントを取る'(_ID,_実行項,_ID_頻度ならび) :- findsetof(_ID,( _実行項), _IDならび), findall([_ID,_頻度],( member(_ID,_IDならび), count(_実行項,_頻度ならび)), _ID_頻度ならび). 'Seq組を生成'(N_1,[[_ID,_頻度]|R],_Seq,_ID) :- N_2 is N_1 + _頻度 - 1, between(N_1,N_2,_Seq). 'Seq組を生成'(N_1,[[_ID,_頻度]|R],_Seq,_ID) :- N_2 is N_1 + _頻度, 'Seq組を生成'(N_2,R,_Seq,_ID). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/722 # # [1] 授業単元:C言語 アルゴリズム # [2] 問題文 行列ベクトル積 # http://ime.nu/ideone.com/21ECGq # 行列ベクトル積(_行列,_ベクトル,_行列ベクトル積) :- findall([S],( append(_,[L|_],_行列), findsum(U,( nth1(Nth1,L,A), nth1(Nth1,_ベクトル,[B]), U is A * B), S)), _行列ベクトル積). findsum(T,P,Sum) :- findall(T,P,L), sum_list(L,Sum). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/212 # # 質問です。 # 開始地点を表すカラム start_point と終了地点を表すカラム end_point があり、その距離は # ST_Distance(ST_GeographyFromText(ST_AsText(start_point)), ST_GeographyFromText(ST_AsText(end_point))) # で計算できます。 # それで、 # ・select で距離を計算するときは round() するけど # ・order by でソートする時は round() なしで(つまりfloatのまま)ソートする # ということをしたいです。 # SQLはこんな感じになるんですけど、 # select round(ST_Distance(ST_GeographyFromText(ST_AsText(start_point)), ST_GeographyFromText(ST_AsText(end_point)))) as distance # from geo_data # order by ST_Distance(ST_GeographyFromText(ST_AsText(start_point)), ST_GeographyFromText(ST_AsText(end_point))) # これだと距離の計算が二重に行われてしまい、無駄です。 # これを、距離の計算を二重に行わずに意図した通りのSQLを発行することはできますか。 # よろしくお願いします。 # 環境:PostgreSQL 9.1 # テーブル定義(geo,1,id). テーブル定義(geo,2,start_point). テーブル定義(geo,3,end_point). '開始地点を表すカラム start_point と終了地点を表すカラム end_point があり、その距離を小さい順に取り出す(距離を四捨五入)'(_start_point,_end_point,_distance) :- テーブル述語を得る(geo,[start_point,end_point],[_start_point,_end_point],P), 四捨五入しない距離で整列(P,_start_point,_end_point,L2), member([_distance_1,_start_point,_end_point],L2), 四捨五入(_distance_1,_distance). テーブル述語を得る(_テーブル名,_カラムならび,_カラム変数ならび,_テーブル述語) :- findall(_,( テーブル定義(テーブル名,_,_)), L, カラム変数ならびを得る(_テーブル名,_カラムならび,_カラム変数ならび,L), _テーブル述語 =.. [_テーブル名|L]. カラム変数ならびを得る(_テーブル名,_カラムならび,[],L) :- !. カラム変数ならびを得る(_テーブル名,[_カラム|R1],[_カラム変数|R2],L) :- テーブル定義(_テーブル名,Nth,_カラム), nth1(Nth,L,_カラム変数), カラム変数ならびを得る(_テーブル名,R1,R2,L). 四捨五入しない距離で整列(P,_start_point,_end_point,L2) :- findall([_distance,_start_point,_end_point],( _テーブル述語, _distance is _end_point - _start_point), L1), 整列(L1,L2). 四捨五入(A,B) :- B is round(A). % 以下のサイトは # 課題で「自作の関数(main)以外)を少なくとも一つ実装して使用せよ」という条件が出されたんですが、次レスようなプログラムで条件を満たしていますか? # # ちなみに課題はx要素の二乗和を求める課題で、元となった参考プログラムにsum(void)はありませんでした。 # 'x要素の二乗和を求める'(_x要素,_二乗和) :- length(Ln,_x要素), findsum(_x2,( member(_,Ln), 整数を得る(整数,_x), _x2 is _x * _x), _二乗和). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/209 # # MySQLの初歩的な質問です # # テーブル名y2010 主キー 場所 # # 場所 人口 # ---------------- # 東京 1500 # 大阪 800 # 福岡  500 #  ・・・ # # テーブル名 y2011 主キー 場所 # # 場所 人口 # ---------------- # 東京 1600 # 大阪 900 # 福岡  600 # # のようなテーブルがあるときに、 # # テーブル名 y_sum 主キー 場所 # # 場所 人口 # ---------------- # 東京 3100 # 大阪 1700 # 福岡 1100 # # のように、複数のテーブルから主キーを含むフィールドを参照して # 参照した或るフィールドの値の和を代入したフィールドをもつテーブルを新たに作成するには # どのようなクエリにすればよいのでしょうか? # # おねがいしますm(._.)m おねがい # :- dynamic(y_sum/2). '複数のテーブルから主キーを含むフィールドを参照して参照した或るフィールドの値の和を代入したフィールドをもつテーブルを新たに作成する' :- findsetof(_場所,場所(_場所),_場所ならび), append(_,[_場所|R],_場所ならび), 人口の合計(_場所,_人口の合計), assertz(y_sum(_場所,_人口の合計)), R = []. 場所(_場所) :- y2010(_場所,_). 場所(_場所) :- y2011(_場所,_). 人口(_場所,_人口) :- y2010(_場所,_人口). 人口(_場所,_人口) :- y2011(_場所,_人口). 人口の合計(_場所,_人口の合計) :- findsum(_人口,人口(_場所,_人口),_人口の合計). % 以下のサイトは # [1] プログラミング # [2] 50円切手が 5 枚, 80円切手が 4 枚, 120円切手が 3 枚あるとき, キーボードから金額 t を入力し, 金額の合計がちょうど t 円になるような切手の枚数の組合せを求めるプログラムを作成せよ. # # 次のような出力が得られることを確認せよ (表示形式は各自工夫せよ). # o 310円 → 50円×3枚+80円×2枚+120円×0枚 # o 390円 → 50円×3枚+80円×0枚+120円×2枚, 50円×3枚+80円×3枚+120円×0枚 # [3] 環境 #  [3.1] winXP sp2 #  [3.2] cygwin #  [3.3] C # [4] 2006年10月23日23時59分 # [5] 途中までやったんで埋める形でお願いします # 途中までやったぶんは次書きます '50円切手が 5 枚, 80円切手が 4 枚, 120円切手が 3 枚あるとき, キーボードから金額 t を入力し, 金額の合計がちょうど t 円になるような切手の枚数の組合せを求めるプログラムを作成せよ. ' :- 'キーボードから金額 t を入力し'(_金額t), findsetof([_50円切手の枚数,_80円切の手枚数,_120円切手の枚数],( 組合せ合計が金額tと一致する(_金額t,_50円切手の枚数,_80円切手の枚数,_120円切手の枚数)), _切手枚数の組合せならび), 組合せを表示する(_切手枚数の組合せならび). 'キーボードから金額 t を入力し'(_金額t) :- 整数を得る('金額t',_金額t > 0,_金額t). 組合せ合計が金額tと一致する(_金額t,_50円切手の枚数,_80円切手の枚数,_120円切手の枚数) :- between(1,12,N), 組合せ([50,50,50,50,80,80,80,80,120,120,120],N,L), sum(L,_金額t), 組合せ枚数を数える(L,_50円切手の枚数,_80円切手の枚数,_120円切手の枚数). 組合せ枚数を数える(L,_50円切手の枚数,_80円切手の枚数,_120円切手の枚数) :- count(member(50,L),_50円切手の枚数), count(member(80,L),_80円切手の枚数), count(member(120,L),_120円切手の枚数). 組合せを表示する(_切手枚数の組合せならび) :- append(_,[[_50円切手の枚数,_80円切手の枚数,_120円切手の枚数]|R],_切手枚数の組合せならび), writef('50円切手%t枚,80円切手%t枚,120円切手%t枚\n',[_50円切手の枚数,_80円切手の枚数,_120円切手の枚数]), R = [],!. 組合せを表示する(_) :- write('切手の組合せは作れません\n'). findsetof(A,B,L) :- findall(A,B,C), setof(A,member(A,C),L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/425 # # [1]C言語 プログラミング # [2]http://ime.nu/codepad.org/UrZpvr24 # 制御構造について。 # 文字制限のためコードでお願いします。 # [3]Windows 7 # [3.1]vs2010 # [3.2]C言語 # [4]明日 午前中まで # [5]現在制御構造について学んでいます。 # 配列・ポインタ・関数はまだです。 # # /*問題1 # n>=m>=2を満たす整数nとmをキーボードから入力するとm進数でnを出力するプログラムを # 作成せよ。ただしm<=10としていい。表示は逆順でも良い。 # # 問題2 # 2<=n<=10000を満たす整数nをキーボードから入力すると2以上n以下の素数とその個数を表示する # プログラムを作成せよ。ただし最後の行に素数の個数のみを表示しその他の各行には # 最後の一行を除いてちょうど10個の素数を表示しなければならない。 # 例:n=50 # 2 3 5 7 11 13 17 19 23 29 # 31 37 41 43 47 # 15 # # 問題3 # 絶対値が1未満の実数xと正の整数nが入力されるまで繰り返してキーボードからxとnを入力し # xとnが正しく入力されたら関数log(1+x)の近似値を次の式で計算して表示するプログラム。 # # log(x+1)=nΣi=1 (-1)^i+1 / i    のx^i    # # 例:n=100 x=0.5とすると0.405465と表示される。*/ '絶対値が1未満の実数xと正の整数nが入力されるまで繰り返してキーボードからxとnを入力しxとnが正しく入力されたら関数log(1+x)の近似値を次の式で計算して表示する' :- '絶対値が1未満の実数xと正の整数nが入力されるまで繰り返してキーボードからxとnを入力し'(_x,_n), '関数log(1+x)の近似値を次の式で計算して表示する'(_x,_n). '絶対値が1未満の実数xと正の整数nが入力されるまで繰り返してキーボードからxとnを入力し'(_x,_n) :- 実数を得る('絶対値が1未満の実数x',abs(_x) < 1.0,_x), 整数を得る('正の整数n',_n > 0,_n),!. '絶対値が1未満の実数xと正の整数nが入力されるまで繰り返してキーボードからxとnを入力し'(_x,_n) :- '絶対値が1未満の実数xと正の整数nが入力されるまで繰り返してキーボードからxとnを入力し'(_x,_n). '関数log(1+x)の近似値を次の式で計算して表示する'(_x,_n) :- '関数log(1+x)の近似値を次の式で計算して'(_x,_n,_近似値), writef('関数log(1+x)の近似値は %t です\n',[_近似値]). '関数log(1+x)の近似値を次の式で計算して'(_x,_n,_近似値) :- findsum(U,( between(1,_n,_x), U is (((-1) ^ _i / _i) * _x ^ _i)), _近似値). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/205 # # MS SQL server 2012です。 # TableA # 商品名 製造数 # A 1000 # B 2000 # C 1000 # # TableB # 商品名 単価 # A 100 # A 120 # B 90 # C 120 # C 125 # # TableBには同一商品名で複数の単価が登録されています。 # TableBの商品名毎の一番高い単価を基にして # TableAの製造数 x 単価を求めたいのですが # 一発で出す方法有りましたら教えてください。 # # 得たい結果 # A 12000 # B 18000 # C 12500 # # 'TableBには同一商品名で複数の単価が登録されています。 TableBの商品名毎の一番高い単価を基にしてTableAの製造数 x 単価を求める'(_商品名,_金額) :- findsetof(_商品名,( テーブルB(_商品名,_)), _商品名ならび), 'TableBの商品名毎の一番高い単価を基にしてTableAの製造数 x 単価を求める'(_商品名ならび,_商品名,_金額). 'TableBの商品名毎の一番高い単価を基にしてTableAの製造数 x 単価を求める'([_商品名|R1],_商品名,_金額) :- findmax(_単価,( テーブルB(_商品名,_単価)), _一番高い単価), テーブルA(_商品名,_製造数), _金額 is _一番高い単価 * _製造数. 'TableBの商品名毎の一番高い単価を基にしてTableAの製造数 x 単価を求める'([_|R1],_商品名,_金額) :- 'TableBの商品名毎の一番高い単価を基にしてTableAの製造数 x 単価を求める'(R1,_商品名,_金額). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/345 # # [1]計算機基礎実習 # [2]問題文:http://ime.nu/codepad.org/dCFDDyhz #  上記の「各桁の値の合計」を求めるプログラミングを #  用いて、3の倍数を判定する再帰プログラムを作りなさい。 # [3.1]Linux # [3.2]gcc # [3.3]C言語 # [4]10月25日 木曜日まで # よろしくお願いします。 # # # #include # # int keta(int a); //与えられた桁数を全て足して返す関数 # # int main(){ # int a; # # printf("数を入力して下さい:"); # scanf("%d",&a); # # printf("\n%dの桁数を足すと%dです.\n",a,keta(a)); # return(0); # } # # int keta(int a){ # if(a < 10)return(a); # return a % 10 + keta(a / 10); # } '「各桁の値の合計」を用いて、3の倍数を非再帰的に判定する'(_正の整数) :- number_chars(_正の整数,_数字ならび), '「各桁の値の合計」を用いて、3の倍数を判定する'(_数字ならび). '「各桁の値の合計」を用いて、3の倍数を判定する'(_数字ならび) :- 各桁の値の合計(_数字ならび,_各桁の値の合計), '3の倍数を判定する'(_各桁の値の合計). 各桁の値の合計(_数字ならび,_各桁の値の合計) :- findsum(_数値,( member(_数字アトム,_数字ならび), atom_number(_数字アトム,_数値)), _各桁の値の合計). '3の倍数を判定する'(_各桁の値の合計) :- 0 is _各桁の値の合計 mod 3. % % 非再帰版 % % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/844 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # http://ime.nu/codepad.org/DXRUGC3J # http://ime.nu/codepad.org/e9CIf3Iy # # /* # # 2.以下のように各行に整数だけを記したファイルがあるとします.このファイルを開いて,各 # 行の数値の和を求めるプログラムを書きなさい.ファイル名はプログラムの引数にすること. # # ----ファイルdata.txtの中身---- # 12 # 2 # -4 # 6 # 321 # --------------------------- # # 実行例337 # # */ # # /* # 3.2のプログラムを,数値は標準入力から得るようにしなさい.そして,以下の # 命令で2 と同じ結果が出るようにしなさい. # # 実行例 # # */ # # type datatxt | prog # .sum is # prog dat.txt337 # sum is a '数値は標準入力から得る.そして各行の数値の和を求める'(_各行の数値の和) :- get_lines(Lines), findsum(_値,( member(_行,Lines), atom_number(_行,_値)), _各行の数値の和). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/844 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # http://ime.nu/codepad.org/DXRUGC3J # http://ime.nu/codepad.org/e9CIf3Iy # # /* # # 2.以下のように各行に整数だけを記したファイルがあるとします.このファイルを開いて,各 # 行の数値の和を求めるプログラムを書きなさい.ファイル名はプログラムの引数にすること. # # ----ファイルdata.txtの中身---- # 12 # 2 # -4 # 6 # 321 # --------------------------- # # 実行例337 # # */ # # /* # 3.2のプログラムを,数値は標準入力から得るようにしなさい.そして,以下の # 命令で2 と同じ結果が出るようにしなさい. # # 実行例 # # */ # # type datatxt | prog # .sum is # prog dat.txt337 # sum is a '各行に整数だけを記したファイルがあるとします.このファイルを開いて,各行の数値の和を求める'(_ファイル名,_各行の数値の和) :- get_lines(_ファイル名,Lines), findsum(_値,( member(_行,Lines), atom_number(_行,_値)), _各行の数値の和). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/154 # # Oracle10g # # 企業TBL # 1:企業ID # 2:企業名 # 3:電話番号 # 4:最終発送日 # # 上記のようなテーブルがあり、同一企業でも # 複数のレコードに登録されています。 # 電話番号が同一であれば、同一企業とみなし、 # 最終発送日を同一企業内で最新の日付で # 一斉更新したいのですが、プログラムを使わず # SQL文だけで完結することは可能でしょうか? # # 下記のSQLで表示される電話番号のデータを # MAX(最終発送日)で更新するイメージです。 # # SELECT 電話番号,MAX(最終発送日),COUNT(*) # FROM 企業TBL # GROUP BY 電話番号 # HAVING COUNT(*) > 1; # '同一企業でも複数のレコードに登録されています。電話番号が同一であれば、同一企業とみなし、最終発送日を同一企業内で最新の日付で一斉更新したい' :- findsetof(_電話番号,( 企業TBL(_企業ID,_企業名,_電話番号,_最終発送日)), _電話番号ならび), findall([_電話番号,_最終発送日],( member(_電話番号,_電話番号ならび), findmax(_最終発送日,( 企業TBL(_企業ID,_企業名,_電話番号,_最終発送日)), _最終発送日)), _電話番号_最終発送日ならび), 最終発送日の更新(_電話番号_最終発送日ならび). 最終発送日の更新(_電話番号_最終発送日ならび) :- member([_電話番号,_最終発送日],_電話番号_最終発送日ならび), retract(企業TBL(_企業ID,_企業名,_電話番号,_最終発送日_1)), assertz(企業TBL(_企業ID,_企業名,_電話番号,_最終発送日)), fail. 最終発送日の更新(_). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/70 # # 使用DB:postgresql # # DBにこんなテーブルがあり # name price # りんご 100 # バナナ 200 # みかん 150 # # 手元にこんなCSVデータがあって # りんご,150 # みかん,100 # # CSVのデータを元に一括でUPDATEしたいです。 # name price # りんご 150 # バナナ 200 # みかん 100 # # CSVデータの文字列加工はPHP使うので大体のことは出来ます。 # 最悪1行ずつUPDATEでいいのですが、行数が多いので出来ればSQL発行を1回にしたいです。お願いします。 # # :- dynamic(テーブル/1). 'CSVデータによってテーブルを更新する'(_CSVファイル) :- get_split_lines(_CSVファイル,[','],LL), '第一項を鍵にデータが存在すれば更新、存在しなければ追加する'(LL). '第一項を鍵にデータが存在すれば更新、存在しなければ追加する'([]). '第一項を鍵にデータが存在すれば更新、存在しなければ追加する'([L|R]) :- テーブルを更新する(L), '第一項を鍵にデータが存在すれば更新、存在しなければ追加する'(R). '第一項を鍵にデータが存在すれば更新、存在しなければ追加する'([L|R]) :- テーブルに追加する(L), '第一項を鍵にデータが存在すれば更新、存在しなければ追加する'(R). テーブルを更新する([_1,_2]) :- retract(テーブル(_1,_)), assertz(テーブル(_1,_2)), fail. テーブルを更新する(_). テーブルに追加する([_1,_2]) :- \+(テーブル(_1,_)), assertz(テーブル(_1,_2)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/526 # # 【質問テンプレ】 # [1] 授業単元: プログラミング演習 # [2] 問題文 # 巡回セールスマン問題の厳密解を総当たり法で求めるプログラムを、再帰呼び出しを用いて作成せよ # (例)  1  2  3  4  5  6 #   1 0 470 550 420 300 200 #   2 470 0 800 900 770 560 #   3 550 800 0 330 650 750 #   4 420 900 330 0 450 400 #   5 300 770 650 450 0 180 #   6 200 560 750 400 180 0 # '巡回セールスマン問題の厳密解を総当たり法で求めるプログラムを、再帰呼び出しを用いて作成せよ'(_出発都市,L) :- findsetof(_都市,( 隣接(_都市,_)), _都市ならび), length(_都市ならび,_都市数), '巡回セールスマン問題の厳密解を総当たり法で求める'(_都市数,_出発都市,[],LL). '巡回セールスマン問題の厳密解を総当たり法で求める'(_都市数,_出発都市,L,L). L = [[_都市_1,_出発都市]|L1], findsetof(_都市,( member([_都市,_,_],L)), L2), length(L2,_都市数). '巡回セールスマン問題の厳密解を総当たり法で求める'(_出発都市,L1,L) :- 隣接(_出発都市,_隣接都市,_距離), \+(member([_出発都市,_隣接都市],L1)), \+(member([_隣接都市,_出発都市],L1)), '巡回セールスマン問題の厳密解を総当たり法で求める'(_隣接都市,[[_出発都市,_隣接都市,_距離]|L1],L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/466 # # # [1] 授業単元:C言語 # [2] 問題文:プレイフェア暗号の作成 #       参考:http://ime.nu/www.tamagaki.com/math/PlayfairCipher.html # # #  プレイフェア暗号(Playfair cipher) # # プレイフェア暗号はイギリス人サー・チャールズ・ホイートストン(Sir Charles Wheatstone)により開発されライアン・プレイフェア(Lyon Playfair)が普及させました。プレイフェア暗号を用いて暗号化するとき、まずキーワードまたはキーフレーズをあらかじめ決めておきます。仮にキーワードをPlayfairとします。次にこのキーワードをアルファベットが重複することなく下の5×5の表に入れていきます。 # # ここで残りのセルに余ったアルファベットを挿入していくわけですが、アルファベットは26文字あって5×5では一字余ります。そこで I と J は同じセルに入れるとあらかじめ決めておきます。そこで新たに作られた表が下のようになります。 # # 準備ができたところで、次のメッセージを暗号化してみましょう。 # # メッセージ Abandon hope, all ye who enter here. # # このメッセージをまず二文字ずつ区切っていきます。 # # Ab-an-do-nh-op-ea-ll-ye-wh-oe-nt-er-he-re # # ここで7番目に ll と同じ文字が重複しているので間に x を入れます。 # # Ab-an-do-nh-op-ea-lx-ly-ew-ho-en-te-rh-er-e # # そうすると最後に e が一つ余ります。ここにもやはり x を入れておきます。 # # Ab-an-do-nh-op-ea-lx-ly-ew-ho-en-te-rh-er-ex # # まず最初の二文字 ab を暗号化してみましょう。ab は先ほど作った表では同じ列にあります。このときは ab の列のすぐ下の文字で置き換えます。 # # つまり ab は BH に変わります。ただし一番下の文字例えば w は一番上の文字 A に変換されます。 # # 同様に同じ行に入る二文字も出てきたとします。例えば ap などは右隣の文字に置き換えます。 # # つまり ap は YL になるわけですね。この場合も一番右の文字例えば f は一番左の文字 p に変換されます。 # # 最後に行も列も違う二文字が出てきた場合は次のようにします。例えば an を考えます。下の表のように a n それぞれの行および列を塗り分け、その交点となる文字を見ます。この場合、P と Q になります。 # # そこで a は、a h と同じ行の P に、n は、n と同じ行の Q に変換します。つまり、 # # do → RT # # nh → QE # # op → NL # # となるわけです。このルールに従って、先ほどのメッセージを暗号化すると、 # # 平文  Ab-an-do-nh-op-ea-lx-ly-ew-ho-en-te-rh-er-ex # # 暗号文 BH PQ RT QE NL HP YV AF HU GQ NU NM BG GI KU # # これでプレイフェア暗号による暗号化が終了したわけです。 # # この暗号はイギリスがボーア戦争(ブール戦争 BoreWar)で使用したといわれています。 プレイフェア暗号表の作成(_鍵文,_暗号表) :- 鍵文を25要素のならびに拡張して(_鍵文,_25要素ならび,_鍵文字以外の変数ならび), 'Jを除いたA-Zならびを切る'(_Jを除いたA_Zならび), 変数を埋める(_Jを除いたA_Zならび,Chars,_鍵文字以外の変数ならび), 'N個組'(5,_25要素のならび,_暗号表). 鍵文を25要素のならびに拡張して(_鍵文,_25要素ならび,_鍵文字ならび,_鍵文字以外の変数ならび) :- length(_25要素ならび,25), atom_chars(_鍵文,_鍵文字ならび), append(_鍵文字ならび,_鍵文字以外の変数ならび,_25要素ならび). 'A-Zならびを切る'(_Jを除いたA_Zならび) :- _切る回数 is random(113) + 1, トランプを切るようにならびを切る(_切る回数,25,['A','B','C','D','E','F','G','H','I','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'],_Jを除いたA_Zならび). 変数を埋める(_,_,[]). 変数を埋める(L_1,Chars,[V|R]) :- select(V,L_1,L_R), \+(member(V,Chars)), 変数を埋める(L_R,Chars,R). プレイフェア暗号による暗号化(_平文,_暗号文) :- メッセージをまず二文字ずつ区切っていきます(_平文,_二文字ずつに区切られたならび), プレイフェア暗号化(_二文字ずつに区切られたならび,_暗号文字ならび), atomic_list_concat(_暗号文字ならび,_暗号文). メッセージをまず二文字ずつ区切っていきます(_平文,_二文字ずつに区切られたならび) :- atom_chars(_平文,Chars), すべての文字を大文字に変換(Chars,_大文字の文字ならび), メッセージをまず二文字ずつ区切っていきます(_大文字の文字ならび,_二文字ずつに区切られたならび). メッセージをまず二文字ずつ区切っていきます([],[]). メッセージをまず二文字ずつ区切っていきます(['J'|R1],[['J','J']|R2]) :- メッセージをまず二文字ずつ区切っていきます(R1,R2). メッセージをまず二文字ずつ区切っていきます([A],[[A,'X']]). メッセージをまず二文字ずつ区切っていきます([A,A|R1],[[A,'X']|R2]) :- メッセージをまず二文字ずつ区切っていきます([A|R1],R2). メッセージをまず二文字ずつ区切っていきます([A,B|R1],[[A,B]|R2]) :- \+(A=B), メッセージをまず二文字ずつ区切っていきます(R1,R2). プレイフェア暗号化(_二文字ずつに区切られたならび,_暗号文字ならび) :- 暗号表(_暗号表), 転置(_暗号表,_転置された暗号表), プレイフェア暗号化(_二文字ずつに区切られたならび,_暗号表,_転置された暗号表,_暗号文字ならび). プレイフェア暗号化([],_,_,[]). プレイフェア暗号化([['J','J']|R1],_暗号表,_転置された暗号表,['J'|R2]) :- プレイフェア暗号化(R1,_暗号表,_転置された暗号表,R2). プレイフェア暗号化([[A,B]|R1],_暗号表,_転置された暗号表,[C,D|R2]) :- 暗号に変換(A,B,_暗号表,C,D), プレイフェア暗号化(R1,_暗号表,_転置された暗号表,R2). 暗号に変換(A,B,_暗号表,_転置された暗号表,C,D) :- member(L,_転置された暗号表), 'A,Bが暗号表の同一行または列にある'(A,B,L,C,D). 暗号に変換(A,B,_暗号表,_転置された暗号表,C,D) :- member(L,_暗号表), 'A,Bが暗号表の同一行にある'(A,B,L,C,D). 暗号に変換(A,B,_暗号表,_転置された暗号表,C,D) :- 暗号コードは矩形を仮想した時の他の二角(A,B,_暗号表,C,D). 'A,Bが暗号表の同一行または列にある'(A,B,L,C,D) :- member(A,L), member(B,L), 'A,Bの次の要素'(L,A,C), 'A,Bの次の要素'(L,B,D). 'A,Bの次の要素'(L,X,Y) :- append([Y|_],[X],L). 'A,Bの次の要素'(L,X,Y) :- append(_,[X,Y|_],L). 暗号コードは矩形を仮想した時の他の二角(A,B,_表,C,D) :- 'A,Bの行と列位置を得る'(A,B,_表,L_1,_列_A,L_2,_列_B), nth1(_列_B,L_1,C), nth1(_列_A,L_2,D). 'A,Bの行と列位置を得る'(A,B,_表,L_1,_列_A,L_2,_列_B) :- nth1(_行_A,_表,L_1), nth1(_列_A,L_1,A), nth1(_行_B,_表,L_2), nth1(_列_B,L_2,B). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1269704830/946 # # # 質問です。メモ帳のデータをfortranで読み込んだ後、指定したデータを掛け算し、 # その合計値を算出したいいのですが、どのようにプログラミングしたらいいでしょうか? # # depth 0, 5 cm P, S, P+S # 1 .000E+00 .121E+06 .121E+06 .000E+00 .859E+06 .859E+06 # 2 .320E+02 .325E+06 .325E+06 .170E+02 .798E+06 .798E+06 # 3 .300E+01 .671E+06 .671E+06 .100E+01 .116E+07 .116E+07 # 4 .247E+05 .173E+07 .175E+07 .120E+05 .160E+07 .161E+07 # 5 .440E+06 .151E+07 .195E+07 .229E+06 .152E+07 .175E+07 # 6 .146E+07 .474E+06 .194E+07 .793E+06 .899E+06 .169E+07 # 7 .253E+07 .124E+06 .266E+07 .143E+07 .763E+06 .219E+07 # 8 .329E+07 .280E+05 .332E+07 .191E+07 .757E+06 .267E+07 # 9 .373E+07 .526E+04 .373E+07 .222E+07 .753E+06 .297E+07 # 10 .391E+07 .315E+04 .392E+07 .239E+07 .732E+06 .312E+07 # 11 .394E+07 .516E+05 .399E+07 .245E+07 .772E+06 .322E+07 # 12 .387E+07 .910E+02 .387E+07 .245E+07 .636E+06 .309E+07 # 13 .375E+07 .480E+02 .375E+07 .242E+07 .583E+06 .300E+07 # ↓ #  ↓ #  ↓ #  400 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 # # 上記のデータの説明をさせていただきます。深さ0cmと5cmのそれぞれにP,S,P+Sという3種類のデータ # が存在し、まず、5cmのP+Sのデータを縦に読み込み、X=1〜400とおいて各数字をX*50-25と変更した後、 # 5cmのP+Sの行と対応した「1〜400の変更した値」で順番に掛けてその合計を計算するようにプログラミング # したいのですが、うまくできず、困っています。 # (5cmのP+Sのデータは、左から数えて7番目のデータです。.859E+06から始まる行になります。) # # 具体的には、1〜400までの数字をそれぞれ1の場合、(1×50-25)×.859E+06という計算を縦に行っていき、 # (400×50-25)×.000E+00まで計算し、その合計値を算出できるようにプログラミングしたいと考えています。 # # '5cmのP+Sのデータを縦に読み込み、X=1〜400とおいて各数字をX*50-25と変更した後、5cmのP+Sの行と対応した「1〜400の変更した値」で順番に掛けてその合計を計算する'(_ファイル名,_合計) :- '5cmのP+Sのデータを縦に読み込み、X=1〜400とおいて各数字をX*50-25と変更した後'(_ファイル名,L), findsum(Y,( nth1(_nth,L,X), Y is _nth * X), _合計). '5cmのP+Sのデータを縦に読み込み、X=1〜400とおいて各数字をX*50-25と変更した後'(_ファイル名,L) :- get_lines(_ファイル名,[' '],LL), findall(X,( member(L_1,LL), nth1(7,L_1,X_1), X is X_1 * 50 - 25), L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/984 # # ・SQL Server2008R2Express # テーブルデータ # ・2012-08-01 11:35:00, りんご, 1 # ・2012-08-01 16:22:00, みかん, 2 # ・2012-08-02 13:54:00, りんご, 2 # ・2012-08-02 14:32:00, りんご, 1 # ・2012-08-04 16:22:00, みかん, 3 # # ・欲しい結果 # 2012-08-01 # 2012-08-02 # 2012-08-04 # # ・説明 # 件数に関係なく売り上げがあった日だけのリストが欲しいのですが # うまい方法あるでしょうか # # 件数に関係なく売り上げがあった日(_売上のあった日) :- 件数に関係なく売り上げがあった日だけのリスト(_売上のあった日だけのリスト), member(_売上のあった日,_売上のあった日だけのリスト). 件数に関係なく売り上げがあった日だけのリスト(_売上のあった日だけのリスト) :- findsetof(_年月日,( 売上(_日付,_品名,_件数), _件数 > 0, sub_atom(_日付,0,10,_,_年月日)), _売上のあった年月日ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/238 # # [1] 授業単元:C言語プログラム # [2] 問題文: # http://ime.nu/codepad.org/yL0GUnrC # \\次のような家計簿データkakeibo.datがテキストでかかれてあり、中身を見ると \\meat 125 1 \\rice 2000 1 \\juice 110 10 \\となっているものとする。このうち右端は商品名、真ん中は単価、左端は数量を表して \\いる。このようなデータを読み取って使用金額の合計を計算するプログラミングを作り \\たい。以下のプログラムをコンパイルがとおり、目的の動作をするように直接書き込み \\なさい。(どこを補うべきかも考えること)ただし商品名は空欄を含まない文字列とする。 # # #include # #include # # #define FILENAME "kakeibo.dat" # # int goukei(FILE *fp); # # # int main(){ # FILE *fp; # # fp = fopen(FILENAME,"r"); # if(fp==NULL){ # fprintf(stderr,"%s is not found!\n",FILENAME); # exit(1); # } # # printf("goukei = %d\n",goukei(fp)); # } # # int goukei(FILE *fp){ # int sum =0, tanka, suryou, # char str[50]; # while (fscanf()!=EOF){ # } # return ; # } '次のような家計簿データkakeibo.datがテキストでかかれてあり、中身を見ると meat 125 1\\nrice 2000 1\\njuice 110 10\\n となっているものとする。このうち右端は商品名、真ん中は単価、左端は数量を表している。このようなデータを読み取って使用金額の合計を計算する'(_使用金額の合計) :- '家計簿データkakeibo.dat(各行の右端は商品名、真ん中は単価、左端は数量を表している)を読み取って使用金額の合計を計算する'(_使用金額の合計). '家計簿データkakeibo.dat(各行の右端は商品名、真ん中は単価、左端は数量を表している)を読み取って使用金額の合計を計算する'(_使用金額の合計) :- findsum(_使用金額,( '家計簿データkakeibo.dat(各行の右端は商品名、真ん中は単価、左端は数量を表している)を読み取って使用金額の'(_使用金額)), _使用金額の合計). '家計簿データkakeibo.dat(各行の右端は商品名、真ん中は単価、左端は数量を表している)を読み取って使用金額の'(_金額) :- get_split_lines('kakeibo.dat',[' ',','],LL), member([_品物,_単価,_数量],LL), _金額 is _単価 * _数量. % 以下のサイトは 相対番号を付加して降順に整列する(_対象ならび,_降順に整列したならび) :- 相対番号を付加する(1,_対象ならび,_相対番号付きならび), 相対番号を付加されたならびを降順に整列する(_相対番号付きならび,_降順に整列した相対番号付きならび), 相対番号を鍵に対象ならびから降順に整列したならびを得る(_降順に整列した相対番号付きならび,_対象ならび,_降順に整列したならび). 相対番号を付加する(_,[],[]). 相対番号を付加する(N,[A|R1],[[A,N]|R2]) :- N_2 is N + 1, 相対番号を付加する(N_2,R1,R2). 相対番号を付加されたならびを降順に整列する([],[]). 相対番号を付加されたならびを降順に整列する([[_軸要素,_相対番号]|_残り要素],_降順に整列した相対番号付きならび) :- 降順分割([_軸要素,_相対番号],_残り要素,_軸要素より大きい要素のならび,_軸要素に等しいか小さいならび), 相対番号を付加されたならびを降順に整列する(_軸要素より大きい要素のならび,_降順に整列した軸要素より大きいならび), 相対番号を付加されたならびを降順に整列する(_軸要素に等しいか小さいならび,_降順に整列した軸要素に等しいか小さいならび), append(_降順に整列した軸要素より大きいならび,[[_軸要素,_軸要素の相対番号]|_降順に整列した軸要素に等しいか小さいならび],_降順に整列した相対番号付きならび). 降順分割(_,[],[],[]). 降順分割(_軸要素,[_要素|R1],[_要素|R2],R3) :- _要素 @> _軸要素, 降順分割(_軸要素,R1,R2,R3). 降順分割(_軸要素,[_要素|R1],R2,[_要素|R3]) :- _要素 @=< _軸要素, 降順分割(_軸要素,R1,R2,R3). 相対番号を鍵に対象ならびから降順に整列したならびを得る([],_,[]). 相対番号を鍵に対象ならびから降順に整列したならびを得る([[_,_nth1]|R1],_対象ならび,[_対象ならび要素|R2]) :- nth1(_nth1,_対象ならび,_対象ならび要素), 相対番号を鍵に対象ならびから降順に整列したならびを得る(R1,_対象ならび,R2 % 以下のサイトは 相対番号を付加して昇順に整列する(_対象ならび,_昇順に整列したならび) :- 相対番号を付加する(1,_対象ならび,_相対番号付きならび), 相対番号を付加されたならびを昇順に整列する(_相対番号付きならび,_昇順に整列した相対番号付きならび), 相対番号を鍵に対象ならびから昇順に整列したならびを得る(_昇順に整列した相対番号付きならび,_対象ならび,_昇順に整列したならび). 相対番号を付加する(_,[],[]). 相対番号を付加する(N,[A|R1],[[A,N]|R2]) :- N_2 is N + 1, 相対番号を付加する(N_2,R1,R2). 相対番号を付加されたならびを昇順に整列する([],[]). 相対番号を付加されたならびを昇順に整列する([_相対番号を付加した軸要素|_残り要素],_昇順に整列した相対番号付きならび) :- 昇順分割(_相対番号を付加した軸要素,_残り要素,_軸要素より小さい要素のならび,_軸要素に等しいか大きい要素ならび), 相対番号を付加されたならびを昇順に整列する(_軸要素より小さい要素のならび,_昇順に整列した軸要素より小さいならび), 相対番号を付加されたならびを昇順に整列する(_軸要素に等しいか大きいならび,_昇順に整列した軸要素に等しいか大きいならび), append(_昇順に整列した軸要素より小さいならび,[_相対番号を付加した軸要素|_昇順に整列した軸要素に等しいか大きいならび],_昇順に整列した相対番号付きならび). 昇順分割(_,[],[],[]). 昇順分割(_軸要素,[_要素|R1],[_要素|R2],R3) :- _要素 @< _軸要素, 昇順分割(_軸要素,R1,R2,R3). 昇順分割(_軸要素,[_要素|R1],R2,[_要素|R3]) :- _要素 @>= _軸要素, 昇順分割(_軸要素,R1,R2,R3). 相対番号を鍵に対象ならびから昇順に整列したならびを得る([],_,[]). 相対番号を鍵に対象ならびから昇順に整列したならびを得る([[_,_nth1]|R1],_対象ならび,[_対象ならび要素|R2]) :- nth1(_nth1,_対象ならび,_対象ならび要素), 相対番号を鍵に対象ならびから昇順に整列したならびを得る(R1,_対象ならび,R2 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/963 # # ・DBMS名とバージョン # SQLite3 # # ・テーブルデータ # テーブル名 directory # folder   val # /contact/  index # /test/    connect # /example/  foo # /hoge/    bar # /fuga/    com # # ・欲しい結果 # 問い合わせ内容とfolderの内容が部分一致していればvalを返す # /contact/ にアクセスがあった場合はindexを返す # /contact/foo の場合もindexを返す # # ・説明 # $folder_hensuu = "%/contact/%"; # select * from directory WHERE folder LIKE $folder_hensuu # とした場合はヒットするが # # $folder_hensuu = "%/contact/hogehoge%"; # の場合はヒットしない。 # この場合はどうすれば一致判定が出来るようになりますか? # # '欲しい結果'(_検索語,_val) :- direcrory(_folder,_val), sub_atom(_folder,_,_,_,検索語). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/46 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):次のプログラムを一つ一つ手順を追って説明せよ。 # http://ime.nu/codepad.org/iARWUPGk # # #include # #include # # #define BIRDTHDAY_SIZE (3) # #define BOOKSIZE (128) # # struct addressSheet { # char *name; # int group; # char *phone; # char *address; # int birthday[BIRDTHDAY_SIZE]; /* 年月日 */ # }; # # #define NUM (4) # struct addressSheet addressBook[BOOKSIZE] = { # {"Mary", 2, "075-123-1232", "Aneyakouji, Shimogyo", {1983, 12, 1}}, # {"John", 1, "075-123-2135", "Rokkaku, Shimogyo", {1978, 5, 17}}, # {"Tom", 3, "075-123-1234", "Takoyakushi, Shimogyo", {1980, 1, 15}}, # {"Sam", 1, "075-321-2214", "Nishiki, Shimogyo", {1979, 6, 25}}, # }; # # void sortByName(struct addressSheet *, int); # int findMin(struct addressSheet *, int, int); # void swap(struct addressSheet *, int, int); # int compare(struct addressSheet *, struct addressSheet *); # void printSheet(struct addressSheet *); # # int main(void) # { # int i; # # sortByName(addressBook, 4); # # for (i=0; iname, q->name)); # } # # void swap(struct addressSheet ary[], int i, int j) # { # struct addressSheet tmp; /* データの待避先 */ # # tmp = ary[i]; # ary[i] = ary[j]; # ary[j] = tmp; # # return; # } # # void printSheet(struct addressSheet *sheet) # { # printf("Name:\t%s\n", sheet->name); # printf("Group:\t%d\n", sheet->group); # printf("Tel:\t%s\n", sheet->phone); # printf("Address:\t%s\n", sheet->address); # printf("Birthday:\t%d/%d/%d\n", sheet->birthday[0], sheet->birthday[1], sheet->birthday[2]); # # return; # } 住所録(毬,2,'075-123-1232','姉屋小路,下京', 1983/12/1). 住所録(慈恩,2,'075-123-2135','六角,下京', 1978/5/17). 住所録(富武,3,'075-123-1234','凧薬師,下京',1980/1/15). 住所録(佐武,1,'075-321-2214','西区,下京',1979/6/25). テーブル定義(住所録,1,名前). テーブル定義(住所録,2,所属). テーブル定義(住所録,3,電話番号). テーブル定義(住所録,4,住所). テーブル定義(住所録,5,生年月日). 名前順に整列(_名前順に整列した住所録) :- 名前を鍵として副目標を生成する(_副目標,_鍵,L1), findall([_鍵|L1],( call(_副目標)), LL1), 名前を鍵に整列して取り出す(LL1,_名前順に整列した住所録). 名前を鍵として副目標を生成する(_副目標,_鍵,L) :- findall(_,( テーブル定義(住所録,_,_)), L), _副目標 =.. [住所録|L], テーブル定義(住所録,N,名前), nth1(N,L,_鍵). 名前を鍵に整列して取り出す(LL1,_名前順に整列した住所録) :- sort(LL1,LL2), 鍵を取り除く(LL2,_名前順に整列した住所録). 鍵を取り除く(LL2,_名前順に整列した住所録) :- findall(L,( member([_|L],LL2)), _名前順に整列した住所録). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/46 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):次のプログラムを一つ一つ手順を追って説明せよ。 # http://ime.nu/codepad.org/iARWUPGk # # #include # #include # # #define BIRDTHDAY_SIZE (3) # #define BOOKSIZE (128) # # struct addressSheet { # char *name; # int group; # char *phone; # char *address; # int birthday[BIRDTHDAY_SIZE]; /* 年月日 */ # }; # # #define NUM (4) # struct addressSheet addressBook[BOOKSIZE] = { # {"Mary", 2, "075-123-1232", "Aneyakouji, Shimogyo", {1983, 12, 1}}, # {"John", 1, "075-123-2135", "Rokkaku, Shimogyo", {1978, 5, 17}}, # {"Tom", 3, "075-123-1234", "Takoyakushi, Shimogyo", {1980, 1, 15}}, # {"Sam", 1, "075-321-2214", "Nishiki, Shimogyo", {1979, 6, 25}}, # }; # # void sortByName(struct addressSheet *, int); # int findMin(struct addressSheet *, int, int); # void swap(struct addressSheet *, int, int); # int compare(struct addressSheet *, struct addressSheet *); # void printSheet(struct addressSheet *); # # int main(void) # { # int i; # # sortByName(addressBook, 4); # # for (i=0; iname, q->name)); # } # # void swap(struct addressSheet ary[], int i, int j) # { # struct addressSheet tmp; /* データの待避先 */ # # tmp = ary[i]; # ary[i] = ary[j]; # ary[j] = tmp; # # return; # } # # void printSheet(struct addressSheet *sheet) # { # printf("Name:\t%s\n", sheet->name); # printf("Group:\t%d\n", sheet->group); # printf("Tel:\t%s\n", sheet->phone); # printf("Address:\t%s\n", sheet->address); # printf("Birthday:\t%d/%d/%d\n", sheet->birthday[0], sheet->birthday[1], sheet->birthday[2]); # # return; # } 住所録(毬,2,'075-123-1232','姉屋小路,下京', 1983/12/1). 住所録(慈恩,2,'075-123-2135','六角,下京', 1978/5/17). 住所録(富武,3,'075-123-1234','凧薬師,下京',1980/1/15). 住所録(佐武,1,'075-321-2214','西区,下京',1979/6/25). テーブル定義(住所録,1,名前). テーブル定義(住所録,2,所属). テーブル定義(住所録,3,電話番号). テーブル定義(住所録,4,住所). テーブル定義(住所録,5,生年月日). 名前順に整列(_名前順に整列した住所録) :- 名前を鍵として副目標を生成する(_副目標,_鍵,L1), findall([_鍵|L1],( call(_副目標)), LL1), 名前を鍵に整列して取り出す(LL1,_名前順に整列した住所録). 名前を鍵として副目標を生成する(_副目標,_鍵,L) :- findall(_,( テーブル定義(住所録,_,_)), L), _副目標 =.. [住所録|L], テーブル定義(住所録,N,名前), nth1(N,L,_鍵). 名前を鍵に整列して取り出す(LL1,_名前順に整列した住所録) :- sort(LL1,LL2), 鍵を取り除く(LL2,_名前順に整列した住所録). 鍵を取り除く(LL2,_名前順に整列した住所録) :- findall(L,( member([_|L],LL2)), _名前順に整列した住所録). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/46 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):次のプログラムを一つ一つ手順を追って説明せよ。 # http://ime.nu/codepad.org/iARWUPGk # # #include # #include # # #define BIRDTHDAY_SIZE (3) # #define BOOKSIZE (128) # # struct addressSheet { # char *name; # int group; # char *phone; # char *address; # int birthday[BIRDTHDAY_SIZE]; /* 年月日 */ # }; # # #define NUM (4) # struct addressSheet addressBook[BOOKSIZE] = { # {"Mary", 2, "075-123-1232", "Aneyakouji, Shimogyo", {1983, 12, 1}}, # {"John", 1, "075-123-2135", "Rokkaku, Shimogyo", {1978, 5, 17}}, # {"Tom", 3, "075-123-1234", "Takoyakushi, Shimogyo", {1980, 1, 15}}, # {"Sam", 1, "075-321-2214", "Nishiki, Shimogyo", {1979, 6, 25}}, # }; # # void sortByName(struct addressSheet *, int); # int findMin(struct addressSheet *, int, int); # void swap(struct addressSheet *, int, int); # int compare(struct addressSheet *, struct addressSheet *); # void printSheet(struct addressSheet *); # # int main(void) # { # int i; # # sortByName(addressBook, 4); # # for (i=0; iname, q->name)); # } # # void swap(struct addressSheet ary[], int i, int j) # { # struct addressSheet tmp; /* データの待避先 */ # # tmp = ary[i]; # ary[i] = ary[j]; # ary[j] = tmp; # # return; # } # # void printSheet(struct addressSheet *sheet) # { # printf("Name:\t%s\n", sheet->name); # printf("Group:\t%d\n", sheet->group); # printf("Tel:\t%s\n", sheet->phone); # printf("Address:\t%s\n", sheet->address); # printf("Birthday:\t%d/%d/%d\n", sheet->birthday[0], sheet->birthday[1], sheet->birthday[2]); # # return; # } 住所録(毬,2,'075-123-1232','姉屋小路,下京', 1983/12/1). 住所録(慈恩,2,'075-123-2135','六角,下京', 1978/5/17). 住所録(富武,3,'075-123-1234','凧薬師,下京',1980/1/15). 住所録(佐武,1,'075-321-2214','西区,下京',1979/6/25). テーブル定義(住所録,1,名前). テーブル定義(住所録,2,所属). テーブル定義(住所録,3,電話番号). テーブル定義(住所録,4,住所). テーブル定義(住所録,5,生年月日). 名前順に整列(_名前順に整列した住所録) :- 名前を鍵として副目標を生成する(_副目標,_鍵,L1), findall([_鍵|L1],( call(_副目標)), LL1), 名前を鍵に整列して取り出す(LL1,_名前順に整列した住所録). 名前を鍵として副目標を生成する(_副目標,_鍵,L) :- findall(_,( テーブル定義(住所録,_,_)), L), _副目標 =.. [住所録|L], テーブル定義(住所録,N,名前), nth1(N,L,_鍵). 名前を鍵に整列して取り出す(LL1,_名前順に整列した住所録) :- sort(LL1,LL2), 鍵を取り除く(LL2,_名前順に整列した住所録). 鍵を取り除く(LL2,_名前順に整列した住所録) :- findall(L,( member([_|L],LL2)), _名前順に整列した住所録). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/932 # # SQLの質問がありまして、書きます。 # # Aテーブル # A B C # 1 11 # 2 22 # 3 33 # # # Bテーブル # A B C # 4 44 1 # 5 55 2 # 6 66 # # 欲しい結果 # A B # 1 44 # 2 55 # 3 33 # 6 66 # # BテーブルのCがAテーブルのAと一致したらBテーブル参照したいですが、A項目のみ値をAテーブルの値にしたいです。 # 何かアドバイスお願いします。。。。。 # 調べても、よくわからなかったので。。。 # お願いします。。。 # 'BテーブルのCがAテーブルのAと一致したらBテーブル参照したいですが、A項目のみ値をAテーブルの値にしたいです。'(A,B) :- findall([A,C],( 'Aテーブルの値を収集する。ただし、AテーブルAとBテーブルをCを鍵に結合できる時はBの値はBテーブルのものに置換される'(A,C)), L1), findall([A,B],( 'Bテーブルの値を収集する。ただし、AテーブルAとBテーブルをCを鍵に結合できる時はこれを除く'(A,B,C)), L2), append(L1,L2,L), member([A,B],L). 'Aテーブルの値を収集する。ただし、AテーブルAとBテーブルをCを鍵に結合できる時はBの値はBテーブルのものに置換される'(A,X) :- 'Aテーブル'(A,B), 'Bテーブルと結合可の時はBテーブルのCを使う'(A,C). 'Bテーブルの値を収集する。ただし、AテーブルAとBテーブルをCを鍵に結合できる時はこれを除く'(A,B,C) :- 'Bテーブル'(A,B,C), 'Aテーブルと結合可のものは除く'(C). 'Bテーブルと結合可の時はBテーブルのCを使う'(A,C) :- 'Bテーブル'(_,C,A),!. 'Bテーブルと結合可の時はBテーブルのCを使う'(A,A). 'Aテーブルと結合可のものは除く'(C) :- \+('Aテーブル'(_,C)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/924 # # [1] 授業単元:C言語 # [2] 問題文: # 学生の英語、国語、数学の合計の得点データを処理するために、次のようなデータ型と名前のメンバを持つSCORE型構造体を考える。 # 学籍番号:整数型 number # 氏名:文字型 name[20] # 英語得点:整数型 eigo # 国語得点:整数型 kokugo # 数学得点:整数型 sugaku # 合計得点:整数型 goukei # SCORE型の2つの構造体変数x1,x2を宣言せよ。 # そしてキーボードから番号、氏名、各教科の得点を入力すると英語、国語、数学の3教科の合計点が計算され、合計点の高い方の学生の氏名と合計点が出力されるプログラムを作成せよ。 # <データ例> # 変数 番号 氏名 英語得点 国語得点 数学得点 # x1  1  nakashima 75  80    75 # x2  2  takada  77   82    70 # <出力列> # nakashima 230 # 'キーボードから番号、氏名、各教科の得点を入力すると英語、国語、数学の3教科の合計点が計算され、合計点の高い方の学生の氏名と合計点が出力される' :- 'キーボードから番号、氏名、各教科の得点を入力すると', '英語、国語、数学の3教科の合計点が計算され'(_合計点_番号ならび), '合計点の高い方の学生の氏名と合計点が出力される'(_合計点_番号ならび). 'キーボードから番号、氏名、各教科の得点を入力すると' :- 一人分の成績を定義する, 'キーボードから番号、氏名、各教科の得点を入力すると'. 'キーボードから番号、氏名、各教科の得点を入力すると'. 一人分の成績を定義する :- 番号を得る(_番号), 氏名を得る(_氏名), 各教科の得点を得る(_英語得点,_国語得点,_数学得点), 成績を定義する(_番号,_氏名,_英語得点,_国語得点,_数学得点). 番号を得る(_番号) :- 整数を得る(番号,_番号),!, \+(_番号==0). 氏名を得る(_氏名) :- write('氏名を入力してください : '), get_line(_氏名). 各教科の得点を得る(_英語得点,_国語得点,_数学得点) :- 整数を得る(英語得点,_英語得点), 整数を得る(国語得点,_国語得点), 整数を得る(数学得点,_数学得点). 成績を定義する(_番号,_氏名,_英語得点,_国語得点,_数学得点) :- 変数xxを得る(_XX), 成績を定義する(XX,_番号,_氏名,_英語得点,_国語得点,_数学得点). 成績を定義する(XX,_番号,_氏名,_英語得点,_国語得点,_数学得点) :- assertz(成績(_XX,番号,_番号)), assertz(成績(_XX,氏名,_氏名)), assertz(成績(_XX,英語成績,_英語成績)), assertz(成績(_XX,国語成績,_国語成績)), assertz(成績(_XX,数学成績,_数学成績)),!. 変数xxを得る(_XX) :- N is random(99999999) + 1, 整数から文字列(8,N,A), atomic_list_concat([x,A],_XX), \+(成績(_XX,番号,_)),!. 変数xxを得る(_XX) :- 変数xxを得る(_XX). '英語、国語、数学の3教科の合計点が計算され'(_合計点_変数番号ならび) :- findsetof(_XX,( 成績(_XX,番号,_)), _XXならび), findall([_合計点,_XX],( member(_XX,_XXならび), 合計点を計算する(_XX,_合計点)), _合計点_変数番号ならび). 合計点を計算する(_XX,_合計点) :- 成績(_XX,英語成績,_英語成績), 成績(_XX,国語成績,_国語成績), 成績(_XX,数学成績,_数学成績), _合計点 is _英語成績 + _国語成績 + _数学成績. '合計点の高い方の学生の氏名と合計点が出力される'(_合計点_番号ならび) :- sort(_合計点_番号ならび,_整列された合計点_番号ならび), reverse(_整列された合計点_番号ならび,_降順に整列された合計点_番号ならび), _整列された合計点_番号ならび = [[_合計点,_XX]|_], 成績(_XX,氏名,_氏名), writef('合計点が高い方は %t で合計点 %t 点です。\n',[_氏名,_合計点]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/911 # # 【質問テンプレ】 # ・SQLite3 # ・テーブル # id,unixtime # 100001,1341404056 # 100001,1341997094 # 100001,1341987930 # 100002,1341997860 # 100002,1341989037 # # ・欲しい結果 # 100001,1341997094 # 100002,1341997860 # # ・説明 # 上記テーブルでid毎にunixtimeが一番大きいデータを1つだけ取り出すには # どのようなクエリでできるでしょうか。1回では無理でしょうか。 # # id,unixtime,value # "1" "1341404056" "内容1" # "1" "1341997094" "内容2" # "1" "1341987930" "内容3" # "2" "1341997860" "内容1" # "2" "1341989037" "内容2" # '上記テーブルでid毎にunixtimeが一番大きいデータを1つだけ取り出す'(_id,_unixtime,_value) :- findsetof(_id,( テーブル(_id,_unixtime,_value)), L1), member(_id,L1), findmax([_unixtime,_id,_value],( テーブル(_id,_unixtime,_value)), [_unixtime,_id,_value]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/900 # # テーブル名:PRODUCT # # CODE, PRODUCT_NAME, M_Type # 001,パソコン,01 # 002,パソコン NEC,01 # 003,パソコン FUJITSU,01 # 004,パソコン,01 # 005,パソコン,02 # 006,プリンター,03 # ・・・ # # とあるとき # # # PRODUCT_NAMEの重複するデータを抽出するにはどうしたらいいでしょうか? # # 001,パソコン,01 # 004,パソコン,01 # 005,パソコン,02 # # が出て欲しい # # # PRODUCT_NAMEかつM_Typeも一緒のデータを抽出するにはどうしたらいいでしょうか? # # 001,パソコン,01 # 004,パソコン,01 # # が出て欲しい # # お願いします。 # 'PRODUCT_NAMEの重複するデータを抽出する'(_CODE,_PRODUCT_NAME,_M_Type) :- findsetof([_PRODUCT_NAME,_M_Type],( 'PRODUCT'(_CODE,_PRODUCT_NAME,_M_Type)), L1), findall([_PRODUCT_NAME,_M_Type],( member(_PRODUCT_NAME,L1), count('PRODUCT'(_CODE,_PRODUCT_NAME,_M_Type),COUNT), COUNT >= 2), L2), member([_PRODUCT_NAME,_M_Type],L2), 'PRODUCT'(_CODE,_PRODUCT_NAME,_M_Type). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/900 # # テーブル名:PRODUCT # # CODE, PRODUCT_NAME, M_Type # 001,パソコン,01 # 002,パソコン NEC,01 # 003,パソコン FUJITSU,01 # 004,パソコン,01 # 005,パソコン,02 # 006,プリンター,03 # ・・・ # # とあるとき # # # PRODUCT_NAMEの重複するデータを抽出するにはどうしたらいいでしょうか? # # 001,パソコン,01 # 004,パソコン,01 # 005,パソコン,02 # # が出て欲しい # # # PRODUCT_NAMEかつM_Typeも一緒のデータを抽出するにはどうしたらいいでしょうか? # # 001,パソコン,01 # 004,パソコン,01 # # が出て欲しい # # お願いします。 # 'PRODUCT_NAMEの重複するデータを抽出する'(_CODE,_PRODUCT_NAME,_M_Type) :- findsetof(_PRODUCT_NAME,( 'PRODUCT'(_CODE,_PRODUCT_NAME,_M_Type)), L1), findall(_PRODUCT_NAME,( member(_PRODUCT_NAME,L1), count('PRODUCT'(_CODE,_PRODUCT_NAME,_M_Type),COUNT), COUNT >= 2), L2), member(_PRODUCT_NAME,L2), 'PRODUCT'(_CODE,_PRODUCT_NAME,_M_Type). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/693 # # 問題 # # 左端からn桁目の数のn乗を合計したものが元の数に等しい4桁以下の数をすべて求めよ。 # 例 # 89 => 8^1 + 9^2 = 89 OK # 123 => 1^1 + 2^2 + 3^3 = 14 NG # '左端からn桁目の数のn乗を合計したものが元の数に等しい4桁以下の数をすべて求める'(_4桁以下の数) :- '0から9999までの数'(_4桁以下の数), '4桁以下の数を数ならびに変換'(_4桁以下の数,_数ならび), 左端からn桁目の数のn乗を合計(_数ならび,_4桁の整数). '0から9999までの数'(_0から9999までの数) :- between(0,9999,_0から9999までの数). '4桁以下の数を数ならびに変換'(_4桁以下の数,_数ならび) :- '4桁以下の数を数字ならびに変換'(_4桁以下の数,_数字ならび), findall(_数,( 数字ならびの中の数字(_数字ならび,_数字), 数字を数に変換(_数字,_数)), _数ならび). '4桁以下の数を数字ならびに変換'(_4桁以下の数,_数字ならび) :- number_chars(_4桁以下の数,_数字ならび). 数字ならびの中の数字(_数字ならび,_数字) :- member(_数字,_数字ならび). 数字を数に変換(_数字,_数) :- atom_number(_数字,_数). 左端からn桁目の数のn乗を合計(_数字ならび,_4桁の整数) :- findsum(X,( 'n番目(1から始めて)の数を取り出す'(_数ならび,_n番目,_数), n乗する(_数,_n番目,X)), _4桁以下の数). n乗する(_数,_n,X) :- X is truncate(_数 ^ _n). 'n番目(1から始めて)の数を取り出す'(_数ならび,_n番目,_数) :- nth1(_n番目,_数ならび,_数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/693 # # 問題 # # 左端からn桁目の数のn乗を合計したものが元の数に等しい4桁以下の数をすべて求めよ。 # 例 # 89 => 8^1 + 9^2 = 89 OK # 123 => 1^1 + 2^2 + 3^3 = 14 NG # '左端からn桁目の数のn乗を合計したものが元の数に等しい4桁以下の数をすべて求める'(_4桁以下の数) :- '0から9999までの数'(_4桁以下の数), '4桁以下の数を数ならびに変換'(_4桁以下の数,_数ならび), 左端からn桁目の数のn乗を合計(_数ならび,_4桁の整数). '0から9999までの数'(_0から9999までの数) :- between(0,9999,_0から9999までの数). '4桁以下の数を数ならびに変換'(_4桁以下の数,_数ならび) :- '4桁以下の数を数字ならびに変換'(_4桁以下の数,_数字ならび), findall(_数,( 数字ならびの中の数字(_数字ならび,_数字), 数字を数に変換(_数字,_数)), _数ならび). '4桁以下の数を数字ならびに変換'(_4桁以下の数,_数字ならび) :- number_chars(_4桁以下の数,_数字ならび). 数字ならびの中の数字(_数字ならび,_数字) :- member(_数字,_数字ならび). 数字を数に変換(_数字,_数) :- atom_number(_数字,_数). 左端からn桁目の数のn乗を合計(_数字ならび,_4桁の整数) :- findsum(X,( 'n番目(1から始めて)の数を取り出す'(_数ならび,_n番目,_数), n乗する(_数,_n番目,X)), _4桁以下の数). n乗する(_数,_n,X) :- X is truncate(_数 ^ _n). 'n番目(1から始めて)の数を取り出す'(_数ならび,_n番目,_数) :- nth1(_n番目,_数ならび,_数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/693 # # 問題 # # 左端からn桁目の数のn乗を合計したものが元の数に等しい4桁以下の数をすべて求めよ。 # 例 # 89 => 8^1 + 9^2 = 89 OK # 123 => 1^1 + 2^2 + 3^3 = 14 NG # '左端からn桁目の数のn乗を合計したものが元の数に等しい4桁以下の数をすべて求める'(_4桁以下の数) :- between(0,9999,_4桁以下の数), number_chars(_4桁以下の数,_数字ならび), findsum(X,( nth1(_nth,_数字ならび,_数字), 'A^_n'(_数字,_nth,X)), _4桁以下の数). 'A^_n'(A,_n,X) :- atom_number(A,N), X is truncate(N ^ X). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/693 # # 問題 # # 左端からn桁目の数のn乗を合計したものが元の数に等しい4桁以下の数をすべて求めよ。 # 例 # 89 => 8^1 + 9^2 = 89 OK # 123 => 1^1 + 2^2 + 3^3 = 14 NG # '左端からn桁目の数のn乗を合計したものが元の数に等しい4桁以下の数をすべて求める'(_4桁以下の数) :- between(0,9999,_4桁以下の数), number_codes(_4桁以下の数,Codes), findsum(_左端からn桁目の数のn乗,( append(L0,[_左端からn桁目のcode|_],Codes), length([_|L0],_n), _左端からn桁目の数のn乗 is truncate((_左端からn桁目のcode-48) ^ _n), _4桁以下の数). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum(_値ならび,_合計値). sum([],0). sum([N|R],S) :- sum(R,S_1), S is S_1 + N. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/881 # # 入庫、出庫、締め用のテーブルがあるとし、それぞれ、HEADER、DETAILがあり # HEADERには、入出庫、締め番号、日付、ACTIVE(該当月Y/N)など # DETAILには、アイテムと数量が入っているとします # そこでDAILY MOVEMENTを作成したいのですが、 # 1~31のように固定ではなく、トランザクションがあった日のみ、つまり # SELECT TRANS_DATE FROM # (SELECT TRANS_DATE FROM INCOMING WHERE ACTIVE='Y' # UNION ALL # SELECT TRANS_DATE FROM OUTGOING WHERE ACTIVE='Y') T_DATE # group by TRANS_DATE ORDER BY 1 # でTRANS_DATE抽出しておきます # 結果をREPORT WRITEとかWEBを用いずに # TRANS_DATEが横方向に1行目に表され、 # 2行目1カラムは、アイテム、2カラム目はOPENING数量で、 # 3カラム以降はIN又はOUTの数量を表記したいのですが # JUL/8はトランザクションがありませんので表記されていません # 最後のカラムは、その月の現在までのSUMMARY # #   JUL/7  JUL/9           JUL # IN OUT IN OUT IN OUT CLOSE #    3 5   3 3 8  15 # # みなさんなら、どうSQLを書きますか、教えてください # # % % 入庫(_入出庫,_締め番号,_日付,_ACTIVE,_アイテム,_数量). % % 出庫(_入出庫,_締め番号,_日付,_ACTIVE,_アイテム,_数量). % % 締め用(_入出庫,_締め番号,_日付,_ACTIVE,_アイテム,_数量). % みなさんならどう書きますか :- 重複のない入出庫日付ならび(_重複のない入出庫日付ならび), 表を作成する(_重複のない入出庫日付ならび,_表), '入庫・出庫・締め用数量合計'(_入庫数量合計,_出庫数量合計,_締め用数量合計), 転置(_表,_転置された表), 表を出力する(_転置された表,_入庫数量合計,_出庫数量合計,_締め用数量合計). 重複のない入出庫日付ならび(_重複のない入出庫日付ならび) :- findsetof(_日付_1,( 入庫(_,_,_日付_1,'Y',_,_)), _入庫日付ならび), findsetof(_日付_2,( 出庫(_,_,_日付_2,'Y',_,_)), _出庫日付ならび), append(_入庫日付ならび,_出庫日付ならび,_入出庫日付ならび), setof(_日付,member(_日付,_入出庫日付ならび),_重複のない入出庫日付ならび). 表を作成する(_重複のない入出庫日付ならび,_表) :- findall([_日付,_入庫数量,_出庫数量],( member(_日付,_重複のない入出庫日付ならぴ), 入庫数量を得る(_日付,_入庫数量), 出庫数量を得る(_日付,_出庫数量), 表示パターン(_入庫数量,_出庫数量,_表示パターン)), _表). 入庫数量を得る(_日付,_入庫数量) :- 入庫(_入出庫,_締め番号,_日付,'Y',_アイテム,_入庫数量),!. 入庫数量を得る(_日付,0.0). 出庫数量を得る(_日付,_出庫数量) :- 入庫(_入出庫,_締め番号,_日付,'Y',_アイテム,_出庫数量),!. 出庫数量を得る(_日付,0.0). '入庫・出庫・締め用数量合計'(_入庫数量合計,_出庫数量合計,_締め用数量合計) :- findsum(_数量,( 入庫(_入出庫,_締め番号,_日付,'Y',_アイテム,_数量)), _入庫数量合計), findsum(_数量,( 出庫(_入出庫,_締め番号,_日付,'Y',_アイテム,_数量)), _出庫数量合計), findsum(_数量,( 締め用(_入出庫,_締め番号,_日付,'Y',_アイテム,_数量)), _締め用数量合計). 表示パターン(_入庫数量,0.0,1) :- \+(_入庫数量 = 0.0),!. 表示パターン(0.0,_出庫数量,2) :- \+(_出庫数量 = 0.0),!. 表示パターン(_,_,3). 表を出力する([_日付ならび,_パターンならび,_入庫数量ならび,_出庫数量ならび],_入庫数量合計,_出庫数量合計,_締め用数量合計) :- 日付を表示する(_日付ならび), '入庫・出庫・合計見出し'(_パターンならび), 数量ならびを表示する(_入庫数量ならび,_出庫数量ならび), '入庫数量合計・出庫数量合計・締め用数量合計表示'(_入庫数量合計,_出庫数量合計,_締め用数量合計). 日付を表示する([]) :- write('\n'). 日付を表示する([_日付|R]) :- 日付表示文字列(_日付,_日付表示文字列), write('%12c',[_日付表示文字列]), 日付を表示する(R). 日付表示文字列(_日付,_日付表示文字列) :- sub_atom(_日付,4,2,_月), sub_atom(_日付,6,2,_日), atomic_list_concat([_月,'/',_日],_日付表示文字列). '入庫・出庫・合計見出し'([]) :- writef(' 入庫 出庫 締め用 \n'). '入庫・出庫・合計見出し'([_パターン|R]) :- '入庫・出庫・合計見出し表示文字列'(_パターン,_表示文字列), writef('%t',[_表示文字列]), '入庫・出庫・合計見出し'(R). '入庫・出庫・合計見出し表示文字列'(1,' 入庫 '). '入庫・出庫・合計見出し表示文字列'(2,' 出庫 '). '入庫・出庫・合計見出し表示文字列'(3,' 入庫 出庫 '). 数量ならびの表示([]) :- 数量ならびを表示する([_入庫|R1],[_出庫|R2]) :- 数量表示文字列(_入庫数量,_出庫数量,_入庫表示文字列,_出庫表示文字列), writef(' %t %t ',[_入庫表示文字列,_出庫表示文字列]), 数量ならびを表示する(R1,R2). 数量表示文字列(0.0,_出庫数量,' ',_出庫表示文字列) :- swritef(_出荷表示文字列,' %4r ',[_出庫数量]),!. 数量表示文字列(0.0,_入庫数量,_入庫表示文字列,' ') :- swritef(_入庫表示文字列,' %4r ',[_入庫数量]),!. 数量表示文字列(_入荷数量,_出庫数量,_入庫数量文字列,_出庫表示文字列) :- swritef(_入庫表示文字列,' %4r ',[_入庫数量]), swritef(_出庫表示文字列,' %4r ',[_出庫数量]),!. '入庫数量合計・出庫数量合計・締め用数量合計表示'(_入庫数量合計,_出庫数量合計,_締め用数量合計) :- writef(' %4r %4r %4r\n',[_入庫数量合計,_出庫数量合計,_締め用数量合計]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/573 # # [1] 授業単元: STL # [2] 問題文(含コード&リンク): # 問 二つの値xとyを使用して差を返す関数形式マクロdiff(x,y)を使用し, # キーボードからint型の2つの数値n1とn2を入力した場合に、入力した2つの数値とその差を出力するmain関数のプログラムを作成しなさい。 # 問 四季を表す列挙体seasonを定義し、キーボードから0,1,2,3を入力した場合に、 # それぞれ"Spring", "Summer", "Fall", "Winter"と表示するプログラムを作成しなさい。ただし、enum season {Spring, Summer, Fall, Winter};を使用し、キーボードから0,1,2,3以外の数字が入力された場合には、入力し直す処理を含めなさい。 # 問 数字文字の出現回数の百分率を小数点以下1桁まで求め、 # '*'のグラフと共に表示するmain関数のプログラムを作成しなさい。 # 問 キーボードから入力した行数と空白以外の文字数を求め, # 行数と文字数を表示するmain関数のプログラムを作成しなさい。ただし、文字入力は、全角文字はなく、半角文字だけであるとする。 # 'キーボードから入力した行数と空白以外の文字数を求め,行数と文字数を表示する。ただし、文字入力は、全角文字はなく、半角文字だけであるとする。' :- 'キーボードから入力した'(Lines), '行数と空白以外の文字数を求め'(Lines,_行数,_空白以外の文字数), '行数と文字数を表示する'(_行数,_空白以外の文字数). キーボードから入力した([]) :- at_end_of_stream(user_input). キーボードから入力した([Line|R]) :- get_line(Line), キーボードから入力した(R). 行数と空白以外の文字数を求め(Lines,_行数,_空白以外の文字数) :- length(Lines,_行数), findsum(_一行の中にある空白以外の文字数,( member(_行,Lines), 一行の中にある空白以外の文字数(_行,_一行の中にある空白以外の文字数)), _空白以外の文字数). 一行の中にある空白以外の文字数(Line,_一行の中にある空白以外の文字数) :- count(( sub_atom(Line,_,1,_,_文字), \+(_文字 = ' ')), _一行の中にある空白以外の文字数). '行数と文字数を表示する'(_行数,_空白以外の文字数) :- writef('%t %t\n',[_行数,_空白以外の文字数]). % 以下のサイトは # 問題 # 数字がひとつ不明な13桁のISBNコードを復元せよ。 # 例(不明な所を?とする) # 9784062?72211 => 9784062772211 # 978415031?684 => 9784150310684 '数字がひとつ不明な13桁のISBNコードを復元せよ。'(_未知符号を含む13桁のISBNコード,_復元された13桁のISBNコード) :- atom_chars(_未知符号を含む13桁のISBNコード,_未知符号を含む13要素のならび), '各桁を数値に変換した上で、12要素の数値ならびと最終桁の数に分離し'(_未知符号を含む13要素のならび,_未知符号を解決した12要素の数値ならび,_最終桁の数), '12要素の数値ならびを逆順にして、順に3,1を掛けて加算し'(_未知符号を解決した12要素の数値ならび,_加算された数), '加算された数を10で割った余りをさらに10から引いたものが最終桁の数になる'(_加算された数,_最終桁の数), 'ISBNコードを復元する'(_未知符号を解決した12要素の数値ならび,_最終桁の数,_復元された13桁のISBNコード). '各桁を数値に変換した上で、12要素の数値ならびと最終桁の数に分離し'(L1,L2,_最終桁の数) :- 各桁を数値に変換したならび(L1,L3), append(L2,[_最終桁の数],L3). 各桁を数値に変換したならび([],[]). 各桁を数値に変換したならび([_文字|R1],[_数値または変数|R2]) :- 数値または変数に変換(_文字,_数値または変数), 各桁を数値に変換したならび(R1,R2). 数値または変数に変換((?),_数値または変数) :- member(_数値または変数,[0,1,2,3,4,5,6,7,8,9]). 数値または変数に変換(A,_数値または変数) :- atom_number(A,_数値または変数). '12要素の数値ならびを逆順にして、順に3,1を掛けて加算し'(_12要素の数値ならび,_加算された数) :- reverse(_12要素の数値ならび,_反転した12要素の数値ならび), findsum(S,( append(L0,[N1,N2|_],_反転した12要素の数値ならび), 要素数が偶数(L0), S is N1 * 3 + N2 * 1), _加算された数). '加算された数を10で割った余りをさらに10から引いたものが最終桁の数になる'(_加算された数,_最終桁の数) :- _最終桁の数 is 10 - (_加算された数 mod 10). 要素数が偶数(L) :- length(L,_要素数), 0 is _要素数 mod 2. 'ISBNコードを復元する'(_未知符号を解決した12要素の数値ならび,_最終桁の数,_復元された13桁のISBNコード) :- append(_未知符号を解決した12要素の数値ならび,[_最終桁の数],L1), atomic_list_concat(L1,_復元された13桁のISBNコード). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/816 # # table1 # id | name # ----------- # 0 | りんご # 1 | みかん # # table2 # no | id # ---------- # 0 | 0 # 1 | 0 # 2 | 1 # 3 | 1 # 4 | 1 # # この二つのテーブルから以下の結果を得るSQLの書き方を教えてください # id | name | num # ------------------- # 0 | りんご | 2 # 1 | みかん | 3 # # select id, name, (select count(code) from table2 as t2, table1 as t1 where t1.id=t2.code) as num from table1; # 自分で考えた↑では2行ともnumが5になってしまいました # # SELECT id, COUNT(id) # FROM table2 # GROUP BY id # # の結果と table1 を結合 # table1(0,りんご). table1(1,みかん). table2(0,0). table2(1,0). table2(2,1). table2(3,1). table2(4,1). 'table2をidで集約したテーブルにtable1を結合する'(_id,_name,_度数) :- findsetof(_id,( table2(_,_id)), _idならび), member(_id,_idならび), count(table2(_,_id),_度数), table1(_id,_name). % findsetof/3 % count/2 % 以下のサイトは '13桁のISBNコードを検査せよ。'(_13桁のISBNコード) :- '各桁を数値に変換した上で、12要素の数値ならびと最終桁の数に分離し'(_13桁のISBNコード,L,_最終桁の数), '12要素の数値ならびを逆順にして、順に3,1を掛けて加算し'(_13桁のISBNコード,_加算された数), '加算された数を10で割った余りをさらに10から引いたものが最終桁の数になる'(_加算された数,_最終桁の数). '各桁を数値に変換した上で、12要素の数値ならびと最終桁の数に分離し'(_13桁のISBNコード,_12要素の数値ならび,_最終桁の数) :- atom_number(_13桁のISBNコード,_数値ならび), append(_12要素の数値ならび,[_最終桁の数],_数値ならび). '12要素の数値ならびを逆順にして、順に3,1を掛けて加算し'(_12要素の数値ならび,_加算された数) :- reverse(_12要素の数値ならび,_反転した12要素の数値ならび), findsum(S,( append(L0,[N1,N2|_],_反転した12要素の数値ならび), 要素数が偶数(L0), S is N1 * 3 + N2 * 1), _加算された数). '加算された数を10で割った余りをさらに10から引いたものが最終桁の数になる'(_加算された数,_最終桁の数) :- _最終桁の数 is 10 - (_加算された数 mod 10). 要素数が偶数(L) :- length(L,_要素数), 0 is _要素数 mod 2. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/365 # # [1] プログラミング入門 # [2] 問題文 # # a[3][4] # # = # # | 3 5 -1 8 | # | 2 3 2 4 | # | 4 2 -5 3 | # # の内容をすべて加算した値を出せ # '# a[3][4] # = # | 3 5 -1 8 | # | 2 3 2 4 | # | 4 2 -5 3 | # の内容をすべて加算した値を出せ' :- findsum(N,( member(L,[[3,5,-1,8],[2,3,2,4],[4,2,-5,3]]), member(N,L)), S), writef('すべてを加算した値は %t です\n',[S]). % findsum/3 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/289 # # [1] 授業単元:プログラミング # [2] 問題文: http://ime.nu/www.fluid.cse.nagoya-u.ac.jp/~ishihara/c/Sec7kadai0.html # # 末尾のプログラム「ベクトル(1次元配列)を引数にする関数の例」を参考にして、 # ベクトルの大きさを返す関数 mag # # ベクトルを大きさ1に規格化する関数 normal # # を作成せよ。 ベクトルの大きさ(_ベクトル,_ベクトルの大きさ) :- findsum(_y,( member([_x],_ベクトル), _y is _x * _x), S), _ベクトルの大きさ is sqrt(S). ベクトルを大きさ1に規格化する(_ベクトル,_大きさを1に規格化されたベクトル) :- ベクトルの大きさ(_ベクトル,_ベクトルの大きさ), ベクトルの割り算(_ベクトル,_ベクトルの大きさ,_大きさを1に規格化されたベクトル). ベクトルの割り算([],_,[]). ベクトルの割り算([[_v1]|R1],_除数,[[_v2]|R2]) :- _v2 is _v1 / _除数, ベクトルの割り算(R1,_除数,R2). % 以下のサイトは # 出典:: 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/1316769778/773 # # ・DBMS名とバージョン: Access2003 # ・テーブルデータ: ID、作業開始日、作業完了日、作業区分 # ・欲しい結果 #  一定期間の作業開始日及び作業完了日を日付別にカウントしたい。 # ・説明 # 例えば、2012/06/01から2012/06/07の期間を指定した場合、以下の様に取得したい。 # # 日付     作業開始 作業完了 # 2012/06/01    10      10 # 2012/06/02     5      5 # 2012/06/03    20      15 # 2012/06/04    21      20 # 2012/06/05     7      10 # 2012/06/06    10      15 # 2012/06/07     4      10 # # '一定期間の作業開始及び作業完了を日付別に作業開始・終了度数で表示する'(_期間日下限,_期間日上限) :- 一定期間の作業開始及び作業完了を(_期間日下限,_期間日上限,_日付ならび), '日付別に作業開始・終了度数で表示する'(_日付ならび). 一定期間の作業開始及び作業完了を(_期間日下限,_期間日上限,_日付ならび) :- findsetof(_日付,( テーブルデータ(_ID,_作業開始日,_作業完了日,_作業区分), 作業開始日か作業完了日が期間内(_期間日下限,_期間日上限,_作業開始日,_作業完了日,_日付)),_日付ならび). 作業開始日か作業完了日が期間内(_期間日下限,_期間日上限,_作業開始日,_作業完了日,_作業開始日) :- _作業開始日 @>= _期間日下限, _作業開始日 @=< _期間日上限. 作業開始日か作業完了日が期間内(_期間日下限,_期間日上限,_作業開始日,_作業完了日,_作業完了日) :- _作業完了日 @>= _期間日下限, _作業完了日 @=< _期間日上限. '日付別に作業開始・終了度数で表示する'(_日付ならび) :- 日付別に(_日付ならび,_日付,R), '作業開始・終了度数を得る'(_日付,_作業開始度数,_作業終了度数), '作業開始・終了度数で表示する'(_日付,_作業開始度数,_作業終了度数), R = []. 日付別に(_日付ならび,_日付,R) :- append(_,[_日付|R],_日付ならび). '作業開始・終了度数を得る'(_日付,_作業開始度数,_作業終了度数) :- count(テーブルデータ(_,_日付,_,_),_作業開始度数), count(テーブルデータ(_,_,_日付,_),_作業終了度数). '作業開始・終了度数で表示する'(_日付,_作業開始度数,_作業終了度数) :- writef('%t %t %t\n',[_日付,_作業開始度数,_作業終了度数]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/763 # # A Table # a1 a2 # -- -- # 1 A # 3 B # 5 C # 6 D # # B Table # b1 b2 # -- -- # 2 E # 4 F # 6 G # # を select で # a1 a2 b1 b2 # -- -- -- -- # 1 A null null # 3 B 2 E # 5 C 4 F # 6 D 6 G # # にしたいけど、どうしたらいいでしょうか? 'A テーブルの_a1をキーに、B テーブルの_b1が_aに等しいか最も近い小さな値である組と結合する。ただし対象組が見つからない時はBテーブルの二つのフィールドはnullで埋める' :- 'A テーブルの_a1をキーに'(_a1,_a2), 'B テーブルの_b1が_aに等しいか最も近い小さな値である組と結合する。ただし対象組が見つからない時はBテーブルの二つのフィールドはnullで埋める'(_a1,_b1_b2). 'A テーブルの_a1をキーに'(_a1,_a2) :- 'A テーブル'(_a1,_a2). 'B テーブルの_b1が_aに等しいか最も近い小さな値である組と結合する。ただし対象組が見つからない時はBテーブルの二つのフィールドはnullで埋める'(_a1,_b1_b2) :- findsetof(_b1,( 'B Table'(_b1,_b2), _b1 @=< _a1), L1), 'Lの最大値から_b1,_b2を見つける。ただし対象組が見つからない時はBテーブルの二つのフィールドはnullで埋める'(L1,B1,B2). 'Lの最大値から_b1,_b2を見つける。ただし対象組が見つからない時はBテーブルの二つのフィールドはnullで埋める'([],'','') :- !. 'Lの最大値から_b1,_b2を見つける。ただし対象組が見つからない時はBテーブルの二つのフィールドはnullで埋める'(L,B1,B2) :- findmax(B1,( member(B1,L)), MaxB1), findmax([MaxB1,B2],( 'B Table'(MaxB1,B2)), [B1,B2]). % findsetof/3 % findmax/3 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/763 # # A Table # a1 a2 # -- -- # 1 A # 3 B # 5 C # 6 D # # B Table # b1 b2 # -- -- # 2 E # 4 F # 6 G # # を select で # a1 a2 b1 b2 # -- -- -- -- # 1 A null null # 3 B 2 E # 5 C 4 F # 6 D 6 G # # にしたいけど、どうしたらいいでしょうか? 'A Table \n a1 a2 \n -- -- \n 1 A \n 3 B \n 5 C \n 6 D \n B Table \n b1 b2 \n -- -- \n 2 E \n 4 F \n 6 G \n を \n a1 a2 b1 b2 \n -- -- -- -- \n 1 A null null \n 3 B 2 E \n 5 C 4 F \n 6 D 6 G にしたい'(_a1,_a2,_b1,_b2) :- 'A テーブルの_aをキーにB テーブルの_b1が_aに等しいか最も近い小さな値である組と結合する。ただし対象組が見つからない時はBテーブルの二つのフィールドはnullで埋める'. 'A テーブルの_aをキーにB テーブルの_b1が_aに等しいか最も近い小さな値である組と結合する。ただし対象組が見つからない時はBテーブルの二つのフィールドはnullで埋める' :- 'A Table'(_a1,_a2), 'B Table の中で _b1 の値が _a1 に等しいか最も近い組'(_a1,_b1,_b2). 'B Table の中で _b1 の値が _a1 に等しいか最も近い組'(_a1,B1,B2) :- findsetof(_b1,( 'B Table'(_b1,_b2), _b1 @=< _a1), L1), '_b1の最大値'(L1,B1,B2). '_b1の最大値'(L,'','') :- 'L が[]の時はB1,B2はそれぞれnull'(L). '_b1の最大値'(L,B1,B2) :- findmax(B1,( member(B1,L)), MaxB1), findmax([MaxB1,B2],( 'B Table'(MaxB1,B2)), [B1,B2]) 'L が[]の時はB1,B2はそれぞれnull'([]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/186 # # [1] 授業単元:数値解析 # [2] 問題文(含コード&リンク): # ある実験を行って,2 つの量(x; y) に関するデータが500 組得られたとする # この実験データとそれに対する近似直線および近似直線の傾きと切片の値を求める # プログラムを完成させよ # 'ある実験を行って,2 つの量(x; y) に関するデータが500 組得られたとする。この実験データとそれに対する近似直線および近似直線の傾きと切片の値を求める'(_傾き,_切片) :- 'ある実験を行って,2 つの量(x; y) に関するデータが500 組得られた'(_データ組ならび), 'この実験データとそれに対する近似直線および近似直線の傾きと切片の値を求める'(_データ組ならび,_傾き,_切片). 'この実験データとそれに対する近似直線および近似直線の傾きと切片の値を求める'(_データ組ならび,_a,_b) :- 整列(_データ組ならび,_整列したデータ組ならび), length(_整列したデータ組ならび,_n), xy系列に分割(_整列したデータ組ならび,Lx,Ly), 一次方程式への近似(_n,Lx,Ly,_a,_b). 一次方程式への近似(_n,Lx,Ly,_a,_b) :- sigma_xy(Lx,Ly,Sxy), sigma_x(Lx,Sx), sigma_y(Ly,Sy), sigma_x2(Lx,Sx2), _a is (_n * Sxy - Sx * Sy) / (_n * Sx2 - Sx * Sx), _b is (_n * Sx2 * Sy - Sxy * Sx) / (_n * Sx2 - Sx * Sx). sigma_x2(Lx,S) :- findsum(_x,( member(_x,Lx), _x_2 is _x * _x), S). sigma_x1(Lx,S) :- findsum(_x,( member(_x,Lx)), S). sigma_y1(Ly,S) :- findsum(_x,( member(_y,Ly)), S). sigma_xy([],[],0). sigma_xy([_x|R1],[_y|R2],S) :- sigma_xy(R1,R2,S1), S is _x * _y + S1. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/70 # # 【 課題 】DB上に給与の支給テーブルがあります。 #       支店・部・課・社員番号・基本給・役職手当・残業時間 #       これらの情報をDBから読み込み、各支店ごとの部、課の合計、支店合計 #       総合計を求めなさい。最後に全ての合計を印字する事。 #       集計項目は基本給・役職手当・残業手当・総支給額の4項目とする。 # 【 形態 】1. Javaアプリケーション(main()で開始すること) # 【期限】6/17 午後20時 # 【Ver 】java version "1.7.0_02" # 【 補足 】 # 残業手当 =(基本給+役職手当)/160*1.2 # 総支給額 = 基本給+役職手当+残業手当 で計算します。 # # データベースの設定ですが # 支店varcher2(14)部varcher2(14)課varcher2(14)社員番号number(8)基本給number(20)役職手当number(20) # 残業時間number(20) # 一意キーは社員番号です # # 追試の追試課題です。 # 今晩がんばりますが、明日の21時にはメールで提出しないといけません。 # お力添えお願いします。 # 'DB上に給与の支給テーブルがあります。支店・部・課・社員番号・基本給・役職手当・残業時間、これらの情報をDBから読み込み、各支店ごとの部、課の合計、支店合計、総合計を求めなさい。 最後に全ての合計を印字する事。集計項目は基本給・役職手当・残業手当・総支給額の4項目とする。' :- 鍵ならびを生成(_支店候補,_支店_部候補,_支店_部_課候補), 支店の表示(_支店候補,_支店_部候補,_支店_部_課候補,_支店), fail; 総合計の表示. 支店の表示(_支店候補,_支店_部候補,_支店_部_課候補,_支店) :- member([_支店,_部],_支店_部候補), '支店,部の表示'(_支店_部候補,_支店_部_課候補,_支店,_部), fail. 支店の表示(_支店候補,_支店_部候補,_支店_部_課候補,_支店) :- '支店を鍵に集約'(_支店候補,_支店,_基本給,_役職手当,_残業手当,_総支給額), writef('支店集約: 支店=%t: 基本給=%t,役職手当=%t,残業手当%t,総支給額=%t\n',[_支店,_基本給,_役職手当,_残業手当,_総支給額]). '支店,部の表示'(_支店_部候補,_支店_部_課候補,_支店,_部) :- member([_支店,_部,_課],_支店_部_課候補), '支店,部,課の表示'(_支店_部_課候補,_支店,_部,_課), fail. '支店,部の表示'(_支店_部_課候補,_支店,_部) :- '支店,部を鍵に集約'(_支店_部候補,_支店,_部,_基本給,_役職手当,_残業手当,_総支給額), writef('支店・部集約: 支店=%t,部=%t: 基本給=%t,役職手当=%t,残業手当%t,総支給額=%t\n',[_支店,_部,_基本給,_役職手当,_残業手当,_総支給額]). '支店,部,課の表示'(_支店_部_課候補,_支店,_部,_課) :- '支店,部,課を鍵に集約'(_支店_部_課候補,_支店,_部,_課,_基本給,_役職手当,_残業手当,_総支給額), writef('支店・部・課集約: 支店=%t,部=%t,課=%t: 基本給=%t,役職手当=%t,残業手当%t,総支給額=%t\n',[_支店,_部,_課,_基本給,_役職手当,_残業手当,_総支給額]). 鍵ならびを生成(_支店候補,_支店_部候補,_支店_部_課候補) :- '支店を鍵'(_支店候補), '支店,部を鍵'(_支店_部候補), '支店,部,課を鍵'(_支店_部_課候補). '支店を鍵'(_支店候補) :- findsetof([_支店],( 給与(_支店,_,_,_社員番号,_基本給,_役職手当)), _支店候補). '支店,部を鍵'(_支店_部候補) :- findsetof([_支店,_部],( 給与(_支店,_部,_課,_社員番号,_基本給,_役職手当)), _支店_部候補). '支店,部,課を鍵'(_支店_部_課候補) :- findsetof([_支店,_部,_課],( 給与(_支店,_部,_課,_社員番号,_基本給,_役職手当)), _支店_部候補). '支店,部,課を鍵に集約'(_支店_部_課候補,_支店,_部,_課,_基本給,_役職手当,_残業手当,_総支給額) :- member([_支店,_部,_課],_支店_部_課候補), findsum([_基本給,_役職手当,_残業手当,_総支給額],( 給与(_支店,_部,_課,_社員番号,_基本給,_役職手当), _残業手当と総支給額の算出(_基本給,_役職手当,残業手当,_総支給額)), [_基本給,_役職手当,_残業手当,_総支給額]). '支店,部を鍵に集約'(_支店_部候補,_支店,_部,_基本給,_役職手当,_残業手当,_総支給額) :- member([_支店,_部],_支店_部候補), findsum([_基本給,_役職手当,_残業手当,_総支給額],( 給与(_支店,_部,_,_社員番号,_基本給,_役職手当), _残業手当と総支給額の算出(_基本給,_役職手当,残業手当,_総支給額)), [_基本給,_役職手当,_残業手当,_総支給額]). '支店を鍵に集約'(_支店候補,_支店,_基本給,_役職手当,_残業手当,_総支給額) :- member([_支店],_支店候補), findsum([_基本給,_役職手当,_残業手当,_総支給額],( 給与(_支店,_,_,_社員番号,_基本給,_役職手当), _残業手当と総支給額の算出(_基本給+_役職手当,残業手当,_総支給額)), [_基本給,_役職手当,_残業手当,_総支給額]). すべての合計(_基本給,_役職手当,_残業手当,_総支給額) :- findsum([_基本給,_役職手当,_残業手当,_総支給額],( 給与(_,_,_,_社員番号,_基本給,_役職手当), _残業手当と総支給額の算出(_基本給+_役職手当,残業手当,_総支給額)), [_基本給,_役職手当,_残業手当,_総支給額]). 残業手当と総支給額の算出(_基本給,_役職手当,_残業手当,_総支給額) :- 残業手当の算出(_基本給,_役職手当,_残業手当), 総支給額の算出(_基本給,_役職手当,_残業手当,_総支給額). 残業手当の算出(_基本給,_役職手当,_残業手当) :- _残業手当 is (_基本給+_役職手当)/160*1.2. 総支給額の算出(_基本給,_役職手当,_残業手当,_総支給額) :- _総支給額 is _基本給+_役職手当+_残業手当. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/134 # # 内容: # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/ideone.com/t5qL2 # # 名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し, # BMI指数の小さい順に並べた線形リストを作成した上で, # BMI指数の小さい順にBMI指数,身長,体重,名前を出力するプログラムを作成せよ。 # ただし,入力件数は不定とし,名前の1文字目に'0'を入れることでデータ入力を終了するものとする。 # # BMI指数は以下の式で算出できる。 # BMI = 体重[kg]/(身長[m])^2 '名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し,BMI指数の小さい順に並べた線形リストを作成した上で,BMI指数の小さい順にBMI指数,身長,体重,名前を出力する。ただし,入力件数は不定とし,名前の1文字目に"0"を入れることでデータ入力を終了するものとする' :- '名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し,'(_BMI指数を鍵とした線形リスト), 'BMI指数の小さい順に並べた線形リストを作成した上で'(_BMI指数を鍵とした線形リスト,_BMI指数の小さい順に並べた線形リスト), 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'(_BMI指数の小さい順並べた線形リスト). '名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し,'(_BMI指数を鍵とした線形リスト) :- findall([_BMI指数,_名前,_身長,_体重],( 名前を得る(_名前), ( sub_atom(_名前,0,1,_,'0'),!,fail; '身長[cm],体重[kg]を入力'(_身長,_体重), 'BMI指数を算出する'(_身長,_体重,_BMI指数))), _BMI指数を鍵とした線形リスト). 名前を得る(_名前) :- write('名前(半角英字によるローマ字表記)を入力してください : '), get_line(_名前), 半角英字によるローマ字表記(_名前). 名前を得る(_名前) :- 名前を得る(_名前). '身長[cm],体重[kg]を入力'(_身長,_体重) :- 数を得る('身長[cm]',_身長), 数を得る('体重[kg]',_体重),!. 'BMI指数を算出する'(_身長,_体重,_BMI指数) :- _BMI指数 is _体重 / (_身長 ^ 2). 'BMI指数の小さい順に並べた線形リストを作成した上で'(_BMI指数を鍵とした線形リスト,_BMI指数の小さい順に並べた線形リスト) :- sort(_BMI指数を鍵とした線形リスト,_BMI指数の小さい順に並べた線形リスト). 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'([]). 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'([[_BMI指数,_氏名,_身長,_体重]|R]) :- writef('%t,%t,%t,%t\n',[_BMI指数,_身長,_体重,_名前]), 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'(R). 半角英字によるローマ字表記(_名前) :- findall(_文字,( sub_atom(_名前,_,1,_,_文字), 空白または半角英字の文字(_文字)), _空白または半角英字であった文字ならび), atomic_list_concat(_空白または半角英字であった文字ならび,_名前). 空白または半角英字の文字(' '). 空白または半角英字の文字(_文字) :- _文字 @>= 'A', _文字 @=< 'Z'. 空白または半角英字の文字(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. % 数を得る/2 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/134 # # 内容: # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/ideone.com/t5qL2 # # 名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し, # BMI指数の小さい順に並べた線形リストを作成した上で, # BMI指数の小さい順にBMI指数,身長,体重,名前を出力するプログラムを作成せよ。 # ただし,入力件数は不定とし,名前の1文字目に'0'を入れることでデータ入力を終了するものとする。 # # BMI指数は以下の式で算出できる。 # BMI = 体重[kg]/(身長[m])^2 '名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し,BMI指数の小さい順に並べた線形リストを作成した上で,BMI指数の小さい順にBMI指数,身長,体重,名前を出力する。ただし,入力件数は不定とし,名前の1文字目に"0"を入れることでデータ入力を終了するものとする' :- '名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し,'(_BMI指数を鍵とした線形リスト), 'BMI指数の小さい順に並べた線形リストを作成した上で'(_BMI指数を鍵とした線形リスト,_BMI指数の小さい順に並べた線形リスト), 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'(_BMI指数の小さい順並べた線形リスト). '名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し,'(_BMI指数を鍵とした線形リスト) :- findall([_BMI指数,_名前,_身長,_体重],( 名前を得る(_名前), ( sub_atom(_名前,0,1,_,'0'),!,fail; '身長[cm],体重[kg]を入力'(_身長,_体重), 'BMI指数を算出する'(_身長,_体重,_BMI指数))), _BMI指数を鍵とした線形リスト). 名前を得る(_名前) :- write('名前(半角英字によるローマ字表記)を入力してください : '), get_line(_名前), 半角英字によるローマ字表記(_名前). 名前を得る(_名前) :- 名前を得る(_名前). '身長[cm],体重[kg]を入力'(_身長,_体重) :- 数を得る('身長[cm]',_身長), 数を得る('体重[kg]',_体重),!. 'BMI指数を算出する'(_身長,_体重,_BMI指数) :- _BMI指数 is _体重 / (_身長 ^ 2). 'BMI指数の小さい順に並べた線形リストを作成した上で'(_BMI指数を鍵とした線形リスト,_BMI指数の小さい順に並べた線形リスト) :- sort(_BMI指数を鍵とした線形リスト,_BMI指数の小さい順に並べた線形リスト). 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'([]). 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'([[_BMI指数,_氏名,_身長,_体重]|R]) :- writef('%t,%t,%t,%t\n',[_BMI指数,_身長,_体重,_名前]), 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'(R). 半角英字によるローマ字表記(_名前) :- findall(_文字,( sub_atom(_名前,_,1,_,_文字), 空白または半角英字の文字(_文字)), _空白または半角英字であった文字ならび), atomic_list_concat(_空白または半角英字であった文字ならび,_名前). 空白または半角英字の文字(' '). 空白または半角英字の文字(_文字) :- _文字 @>= 'A', _文字 @=< 'Z'. 空白または半角英字の文字(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. % 数を得る/2 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/102 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # 商品の種類の数をまず入力し、それから各商品の価格と 購入した個数を入力して、合計金額を計算して表示するプログラムを作成しなさい。 # それぞれの商品番号に対して、単価と個数の2つの要素を持つような 2次元配列を使ってプログラムを作成しなさい。 # ただし商品の種類の数は100以下とする。 # '商品の種類の数をまず入力し、それから各商品の価格と購入した個数を入力して、合計金額を計算して表示する。それぞれの商品番号に対して、単価と個数の2つの要素を持つような2次元配列を使ってプログラムを作成しなさい。ただし商品の種類の数は100以下とする。' :- '商品の種類の数をまず入力し(ただし商品の種類の数は100以下とする)'(_商品の種類の数), 'それから各商品の価格と購入した個数を入力して、それぞれの商品番号に対して、単価と個数の2つの要素を持つような_各商品の価格と購入した個数ならびを生成する'(_商品の種類の数,_各商品の価格と購入した個数ならび), 合計金額を計算して表示する(_各商品の価格と購入した個数のならび). '商品の種類の数をまず入力し(ただし商品の種類の数は100以下とする)'(_商品の種類の数) :- write('商品の種類の数を設定してください : '), get_line(Line), '診断: 商品の種類の数'(Line,_商品の種類の数),!. '商品の種類の数をまず入力し(ただし商品の種類の数は100以下とする)'(_商品の種類の数) :- '商品の種類の数をまず入力し(ただし商品の種類の数は100以下とする)'(_商品の種類の数). '診断: 商品の種類の数'(Line,_商品の種類の数) :- atom_to_term(Line,_商品の種類の数,_), integer(_商品の種類の数), _商品の種類の数 > 0,!. '診断: 商品の種類の数'(Line,_商品の種類の数) :- writef('入力された %t からは適切な商品の種類の数が得られません。再入力をお願いします。\n',[Line]), fail. 'それから各商品の価格と購入した個数を入力して、それぞれの商品番号に対して、単価と個数の2つの要素を持つような_各商品の価格と購入した個数ならびを生成する'(_商品の種類の数,_各商品の価格と購入した個数ならび) :- length(_各商品の価格と購入した個数ならび,_商品の種類の数), findall([_商品番号,_商品価格,_購入した個数],( append(_,[_|_],_各商品の価格と購入した個数ならび), 商品の価格と購入した個数を入力して(_商品番号,_商品価格,_購入した個数)), _各商品の価格と購入した個数ならび). 商品の価格と購入した個数を入力して(_商品番号,_商品価格,_購入した個数) :- 商品番号の入力(_商品番号), 商品価格の入力(_商品番号,_商品価格), 購入した個数の入力(_商品番号,_購入した個数). 商品番号の入力(_商品番号) :- get_line(_商品番号). 商品価格の入力(_商品番号,_商品価格) :- writef('商品番号%tの商品価格を入力してください : ',[_商品番号]), get_line(Line), '診断: 商品価格の入力'(Line,_商品価格),!. 商品価格の入力(_商品番号,_商品価格) :- 商品価格の入力(_商品番号,_商品価格). '診断: 商品価格の入力'(Line,_商品価格) :- atom_to_term(Line,_商品価格,_), number(_商品価格), _商品価格 >= 0.0,!. '診断: 商品価格の入力'(Line,_商品価格) :- writef('入力された %t からは適切な商品価格が得られません。再入力をお願いします。\n',[Line]), fail. 購入した個数の入力(_商品番号,_購入した個数) :- writef('商品番号%tの購入した個数を入力してください : ',[_商品番号]), get_line(Line), '診断: 購入した個数の入力'(Line,_購入した個数),!. 購入した個数の入力(_商品番号,_購入した個数) :- 購入した個数の入力(_商品番号,_購入した個数). '診断: 購入した個数の入力'(Line,_購入した個数) :- atom_to_term(Line,_購入した個数,_), number(_購入した個数), _購入した個数 >= 0.0,!. '診断: 購入した個数の入力'(Line,_購入した個数) :- writef('入力された %t からは適切な購入した個数が得られません。再入力をお願いします。\n',[Line]), fail. 合計金額を計算して表示する(_各商品の価格と購入した個数のならび) :- 合計金額を計算して(_各商品の価格と購入した個数のならび,_合計金額), 表示する(_合計金額). 合計金額を計算して(_各商品の価格と購入した個数のならび,_合計金額) :- findsum(_金額,( member([_,_商品の価格,_購入した個数],_各商品の価格と購入した個数のならび), _金額 is _商品価格 * _購入した個数), _合計金額). 表示する(_合計金額) :- writef('合計金額は %t です\n',[_合計金額]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/48 # # 【課題】売り上げをコード事に個別に集計した後に全体の合計を出しなさい。 #    <エリアコード> <県コード> <地区コード> #     A \5000 C \4000 E \7000 # A \90000 C \6500 E \8000 # A \7500 C \5500 E \4000 # A \6000 C \3000 F \2000 # A \3500 C \9000 F \6500 # A \4200 C \4500 F \3000 # A \3500 D \8000 E \3000 # A \40000 D \9500 E \4880 # B \3500 C \8000 E \4500 # B \4200 C \9500 E \5000 # # 【形態】javaアプリケーション # 【期限】6/12 お昼 # 【Ver 】java version "1.7.0_02" # 【補足】キーブレイクの処理の参考書がなくて進みません。 # ACEから切り替わるときに<E地区合計> # ACFから切り替わるときに<F地区合計><C県合計> # ADEから切り替わるときに<E地区合計><D県合計><Aエリア合計> # BCEの後に       <E地区合計><C県合計><Bエリア合計> # 最後に<A+Bエリア合計>を出力する形でお願いします。 # # 売り上げ('A',5000,'C',4000,'E',7000). 売り上げ('A',90000'C',6500','E',8000). 売り上げ('A',7500,'C',5500,'E',4000). 売り上げ('A',6000,'C',3000,'F',2000). 売り上げ('A',3500,'C',9000,'F',6500). 売り上げ('A',4200,'C',4500,'F',3000). 売り上げ('A',3500,'D',8000,'E',3000), 売り上げ('A',40000,'D',9500,'E',4880). 売り上げ('B',3500,'C',8000,'E',4500). 売り上げ('B',4200,'C',9500,'E',5000). 'エリアコード鍵'(_鍵ならび) :- findsetof(_エリアコード,( 売り上げ(_エリアコード,_,_,_,_,_)), _鍵ならび). 'エリアコード・県コード鍵'(_鍵ならび) :- findsetof([_エリアコード,_県コード],( 売り上げ(_エリアコード,_,_県コード,_,_,_)), _鍵ならび). 'エリアコード・県コード・地区コード鍵'(_鍵ならび) :- findsetof([_エリアコード,_県コード,_地区コード],( 売り上げ(_エリアコード,_,_県コード,_,_地区コード,_)), _鍵ならび). 売り上げを表示する :- 'エリアコード鍵'(_鍵ならび_1), 'エリアコード・県コード鍵'(_鍵ならび_2), 'エリアコード・県コード・地区コード鍵'(_鍵ならび_3), 売り上げ集約を表示する(_鍵ならび_1,_鍵ならび_2,_鍵ならび_3). 売り上げ集約を表示する([],_鍵ならび_2,_鍵ならび_3) :- findsum(_金額_1,( 売り上げ(_,_金額_1,_,_,_,_)), 合計金額), writef('全エリア合計 %t 円\n',[_合計金額]),!. 売り上げ集約を表示する([_エリア鍵|R1],_鍵ならび_2,_鍵ならび_3) :- エリアで分類する(_エリア鍵,_鍵ならび_2,_鍵ならび_3), 売り上げを表示する(R1,_鍵ならび_2,_鍵ならび_3). エリアで分類する(_エリア鍵,[],_) :- findsum(_金額_1,( 売り上げ(_エリア鍵,_金額_1,_,_,_,_)), _合計金額), writef('%tエリア合計 %t 円\n',[_エリア鍵,_合計金額]),!. エリアで分類する(_エリア鍵,[[_エリア鍵,_県鍵]|R2],_鍵ならび_3) :- 県で分類する(_エリア鍵,_県鍵,_鍵ならび_3), エリアで分類する(_エリア鍵,R2,_鍵ならび_3). 県で分類する(_エリア鍵,_県鍵,[]) :- findsum(_金額_2,( 売り上げ(_エリア鍵,_1,_県鍵,_金額_2,_,_3)), _合計金額), writef('%t県合計 %t 円\n',[_県鍵,_合計金額]),!. 県で分類する(_エリア鍵,_県鍵,[[_エリア鍵,_県鍵,_地区鍵]|R3]) :- findsum(_金額_3,( 売り上げ(_エリア鍵,_1,_県鍵,_2,_地区鍵,_金額_3)), _合計金額), writef(\n'%t%t合計 %t 円 ',[_地区鍵,地区,_合計金額]), 県で分類する(_エリア鍵,_県鍵,R3). 県で分類する(_エリア鍵,_県鍵,[_|R3]) :- 県で分類する(_エリア鍵,_県鍵,R3). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/729 # # DBはSQLiteを想定してますが、MySQLでもpostgreSQLでも全然かまいません # # # 採取リスト # |番号|名称|コード|登録日|登録者|公開| # # というテーブルがあります。 # イメージとして、とある物体がありまして、登録者が各自で次々と登録していきます。 # 各物体には登録者の間で共有されていてぶれのないコード(A-0001とか)があるものの、 # 名称に関しては、ある程度の裁量があるため、登録者によって表記にぶれが起きます。 # # |番号|名称 |コード | 登録日  |登録者|公開| # |01  |クラゲ |A-001|2012/6/1 | 田中 | 1  | # |02  |くらげ |A-001 |2012/6/2 | 鈴木 | 0  | # |03  |海月 |A-001 |2012/6/3 | 佐藤 | 1  | # |04  |クラゲ |A-001|2012/6/4 | 高橋 | 0  | # |05  |ひとで |A-002|2012/6/5 | 小林 | 0  | # # 番号はオートナンバーで主キー。 # 登録日はそのままINSERTされた日。 # 告知フラグは0か1で、外部に公開されていたら1です。 # # んで、ここから公開されてない行を抜き出すビューを作りたいんです。 # CREATE VIEW 未公開リスト (番号, 名称, コード) # AS SELECT 番号, 名称, コード FROM 採取リスト WHERE 公開 = 0 # みたいなSQLを走らせると、 # # |番号|名称  |コード| # |02  |くらげ |A-001| # |04  |クラゲ |A-001| # |05  |ひとで |A-002| # # という風になってしまいますが「くらげ」と「クラゲ」で実質的に重複してしまいます。 # これを例えば「コードを基準にして重複がないように選んだ」上で、 # 名称には、特定の登録者の名称を用いてまとめることはできないのでしょうか? # 単に、DISTINCTを使うだけでは無理なようですが・・・。 # # 未公開リスト(_番号,_名称,_コード) :- '「コードを基準にして重複がないように選んだ」上で、名称には、特定の登録者の名称を用いてまとめる'(_番号,_名称,_コード). '「コードを基準にして重複がないように選んだ」上で、名称には、特定の登録者の名称を用いてまとめる'(_番号,_名称,_コード) :- 名称を登録者で置換したコードならび(_名称を登録者で置換したコードならび), 採取リスト(_番号,_名称_1,_コード,_登録日,_登録者,0), 名称を選択(_コード,_名称_1,_名称を登録者で置換したコードならび,_名称). 名称を登録者で置換したコードならび(_重複するコードならび) :- findsetof(_コード,( 採取リスト(_番号,_名称,_コード,_登録日,_登録者,_公開)), L1), findsetof([_コード,_名称],( 採取リスト(_番号,_名称,_コード,_登録日,_登録者,_公開)), L2), 名称を登録者で置換したコードならび(L1,L2,_重複するコードならび),!. 名称を登録者で置換したコードならび(L1,L2,名称を登録者で置換したコードならび) :- findall([_コード,_],( member(_コード,L1), count(member([_コード,_],L2),_度数)), _度数 > 1), _重複するコードならび), 名称を早い者勝ちに登録者名に決定する(_重複するコードならび,名称を登録者で置換したコードならび),!. 名称を早い者勝ちに登録者名に決定する([]). 名称を早い者勝ちに登録者名に決定する([[_コード,_登録者]|R]) :- 採取リスト(_番号,_名称,_コード,_登録日,_登録者,_公開), 名称を早い者勝ちに登録者名に決定する(R). 名称を選択(_コード,_,_名称を登録者で置換したコードならび,_名称) :- member([_コード,_名称],_名称を登録者で置換したコードならび),!. 名称を選択(_コード,_名称,_,_名称) :- \+(member([_コード,_],_名称を登録者で置換したコードならび)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/54 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # http://ime.nu/codepad.org/Q5HCQPvq # 上記のプログラムを参考にしてa君、b君、c君の5教科(英語、数学、国語、理科、社会)の試験の得点をそれぞれ # a[5]={55,32,67,61,77};,b[5]={74,80,56,78,42};,c[5]={38,67,78,62,82}; と初期化する。 # 但し上記の3つの配列の要素番号0,1,2,3,4の得点は、それぞれ英語、数学、国語、理科、社会の得点に対応する。 # このとき、教科別の3人の平均点を求めるプログラムをポインタ配列を用いて作成せよ。 # 'a君、b君、c君の5教科(英語、数学、国語、理科、社会)の試験の得点をそれぞれ a[5]={55,32,67,61,77};,b[5]={74,80,56,78,42};,c[5]={38,67,78,62,82}; と初期化する。' :- split(_文字列,[';','=[5]','{','}'],L), 定義情報の選択(L,_君,_英語,_数学,_国語,_理科,_社会,R), 得点を定義する(_君,[英語,数学,国語,理科,社会],[_英語,_数学,_国語,_理科,_社会]), R = []. 定義情報の選択(L,_君,_英語,_数学,_国語,_理科,_社会,R) :- append(Ln,[_君,_英語,_数学,_国語,_理科,_社会|R],L), length(Ln,Len), 0 is Len mod 6. 得点を定義する(_,[],[]). 得点を定義する(_君,[_科目|R1],[_得点|R2]) :- assertz(得点(_君,_科目,_得点)), 得点を定義する(_君,R1,R2). 教科別の3人の平均点を求める(_科目,_相加平均) :- 教科別の3人の平均点を求める(_科目別相加平均ならび), member([_科目,_相加平均],_科目別相加平均ならび). 教科別の3人の平均点を求める(_科目別相加平均ならび) :- finsetof(_科目,( 得点(_,_科目,_)), _教科ならび), findall([_科目,_相加平均],( member(_科目,_教科ならび), findavg(_得点,( 得点(_,_科目,_得点)), _相加平均)), _科目別相加平均ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/54 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # http://ime.nu/codepad.org/Q5HCQPvq # 上記のプログラムを参考にしてa君、b君、c君の5教科(英語、数学、国語、理科、社会)の試験の得点をそれぞれ # a[5]={55,32,67,61,77};,b[5]={74,80,56,78,42};,c[5]={38,67,78,62,82}; と初期化する。 # 但し上記の3つの配列の要素番号0,1,2,3,4の得点は、それぞれ英語、数学、国語、理科、社会の得点に対応する。 # このとき、教科別の3人の平均点を求めるプログラムをポインタ配列を用いて作成せよ。 # 'a君、b君、c君の5教科(英語、数学、国語、理科、社会)の試験の得点をそれぞれ a[5]={55,32,67,61,77};,b[5]={74,80,56,78,42};,c[5]={38,67,78,62,82}; と初期化する。' :- 得点を定義する(a,[英語,数学,国語,理科,社会],[55,32,67,61,77]), 得点を定義する(b,[英語,数学,国語,理科,社会],[74,80,56,78,42]), 得点を定義する(c,[英語,数学,国語,理科,社会],[38,67,78,62,82]). 得点を定義する(_,[],[]). 得点を定義する(_君,[_科目|R1],[_得点|R2]) :- assertz(得点(_君,_科目,_得点)), 得点を定義する(_君,R1,R2). 教科別の3人の平均点を求める(_科目,_相加平均) :- 教科別の3人の平均点を求める(_科目別相加平均ならび), member([_科目,_相加平均],_科目別相加平均ならび). 教科別の3人の平均点を求める(_科目別相加平均ならび) :- finsetof(_科目,( 得点(_,_科目,_)), _教科ならび), findall([_科目,_相加平均],( member(_科目,_教科ならび), findavg(_得点,( 得点(_,_科目,_得点)), _相加平均)), _科目別相加平均ならび). % 以下のサイトは # 出典:: 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/tech/1323566370/896 # # すみません # Objective-CのNSRegularExpressionで、ある文字列について、 # ・順番通りに # ・一部が欠けてもよく # ・途中に余計な文字が入ってもよく # ・一致する数を数える # ようなパターンを組みたいのですが、 # 例えばABCDEという文字列があったとして # ABCDE→5(全件一致) # AABBCCDDEE→5(全件一致) # ADCBE→3(A,C,Eが一致) # AFGHBCDE→5(全件一致) # EDCBA→1(Eのみ一致) # というように数えたいのですが、上手くいきません。 # .*?(A)?.*?(B)?.*?(C)?.*?(D)?.*?(E)?.*? # ではダメみたいなのですがどうするのが正しいでしょうか # # '・順番通りに ・一部が欠けてもよく ・途中に余計な文字が入ってもよく ・一致する数を数えるようなパターンを評価する'(_文字列,_パターン,_評価) :- atom_chars(_文字列,Chars), 指定検索パターンの昇順要素のみ評価する('A',Chars,['A','B','C','D','E'],_重複可能なパターン), パターン評価(_重複可能なパターン,_パターン,_評価). 指定検索パターンの昇順要素のみ評価する(_,[],[]). 指定検索パターンの昇順要素のみ評価する(U,[A|R1],_検索文字ならび,[A|R2]) :- member(A,_検索文字ならび), U @=< A, 指定検索パターンの昇順要素のみ評価する(A,R1,_検索文字ならび,R2). 指定検索パターンの昇順要素のみ評価する(U,[A|R1],_検索文字ならび,R2) :- member(A,_検索文字ならび)), U @> A, 指定検索パターンの昇順要素のみ評価する(U,R1,_検索文字ならび,R2). 指定検索パターンの昇順要素のみ評価する(U,[A|R1],_検索文字ならび,R2) :- \+(member(A,_検索文字ならび)), 指定検索パターンの昇順要素のみ評価する(U,R1,_検索文字ならび,R2). パターン評価(_重複可能なパターン,_検索文字ならび,_パターン,_評価) :- 重複する文字を取り除く(_重複可能なパターン,_パターン), length(_パターン,_パターンの文字数), length(_検索文字ならび,_全件数), 評価(_パターンの文字数,_全件数,_評価). 重複する文字を取り除く(_重複可能なパターン,_パターン) :- setof(A,member(A,_重複可能なパターン),_パターン). 評価(_全件数,_全件数,全件一致). 評価(_パターンの文字数,_,_評価) :- atomic_list_concat([_パターンの文字数,件一致],_評価). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/602 # # [1] 授業単元:配列 # [2] 問題文(含コード&リンク): 文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。 # '文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。' :- get_line(_文字列), findsum([A,B,C],( sub_atom(ab34cd6,_,1,_,_文字), 文字種判定(_文字,A,B,C)), [_英字の数,_数字の数,_その他の文字の数]), writef('英字の数は %t,数字の数は %t,その他の文字の数は %t\n',[_英字の数,_数字の数,_その他の文字の数]). 文字種判定(_文字,1,0,0) :- 英字(_文字),!. 文字種判定(_文字,0,1,0) :- 数字(_文字),!. 文字種判定(_文字,0,0,1). % findsum/3 % 英字/1 % 数字/1 % 以下のサイトは 調和平均(L,_調和平均) :- length(L,_要素数), findsum(V,( member(V,L), W is 1 / V)), Sum1), _調和平均 is _要素数 / Sum1. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/517 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # http://ime.nu/www1.axfc.net/uploader/Sc/so/347163 # # 学生番号 1 2 3 4 5 6 # グループA 35 63 25 62 73 53 # グループB 45 53 81 53 34 45 # グループC 56 76 34 45 67 65 # # 上記のグループ別学生毎の得点データを適当な整数型配列data[4][7]に読み込み、グループ別及び全体の平均点を計算せよ。 # '上記のグループ別学生毎の得点データを読み込み、グループ別及び全体の平均点を計算する' :- '上記のグループ別学生毎の得点データを読み込み'(LL), グループ別及び全体の平均点を計算する(LL,_グループ別平均点ならび,_全体の平均点), グループ別平均点を表示する(_グループ別平均点ならび), 全体の平均点を表示する(_全体の平均点). '上記のグループ別学生毎の得点データを読み込み'([]) :- at_end_of_stream(user_input),!. '上記のグループ別学生毎の得点データを読み込み'([L|R]) :- get_line(Line), split(Line,[' ','\t'],L), '上記のグループ別学生毎の得点データを読み込み'(R). グループ別及び全体の平均点を計算する(LL,_グループ別平均点ならび,_全体の平均点) :- グループ別平均点を計算する(LL,_グループ別平均点ならび), 全体の平均点を計算する(LL,_全体の平均点). グループ別平均点を計算する([_見出し部分|_グループ名付き得点表],_グループ別平均点ならび) :- findall([_グループ,_平均点],( member([_グループ|_得点ならび],_グループ名付き得点表), 相加平均(_得点ならび,_平均点)), _グループ別平均点ならび). 全体の平均点を計算する([_見出し部分|_グループ名付き得点表],_全体の平均点) :- findsum(_得点,( member([_グループ名|_得点ならび],_グループ名付き得点表]), member(_得点,_得点ならび)), _全体の平均点). グループ別平均点を表示する(_グループ別平均点ならび) :- append(_,[[_グループ,_平均点]|R],_グループ別平均点ならび), writef('%t の平均点: %t点\n',[_グループ,_平均点]), R = []. 全体の平均点を表示する(_全体の平均点) :- writef(' 全体の平均点: %t点\n',[_全体の平均点]). % 以下のサイトは # We are given a graph with the following facts: # # edge(a,b) # edge(a,c) # edge(b,a) # edge(c,d) # edge(d,d) # edge(d,e) # edge(e,f) # edge(f,g) # edge(g,e) # And we are asked to define a rule, cycle(X), that determines if there is a cycle starting from the node X. # # I am really lost on how to do this, I tried attempting to traverse the nodes and checking if the next one would be the starting one again but I cannot seem to get it to work 端点(a,b) 端点(a,c) 端点(b,a) 端点(c,d) 端点(d,d) 端点(d,e) 端点(e,f) 端点(f,g) 端点(g,e) サイクル(X) :- findsetof(_出発点,端点(_出発点,_),_出発点集合), member(_出発点,_出発点集合), 到着点が出発点として既に現れている端点を探す(_出発点,[],X). 到着点が出発点として既に現れている端点を探す(_出発点,L,X) :- 端点(_出発点,X), member(X,L),!. 到着点が出発点として既に現れている端点を探す(_出発点,L1,X) :- 端点(_出発点,_到着点), 到着点が出発点として既に現れている端点を探す(_到着点,[_出発点|L1],X). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/458 # # [1] 授業単元:プログラミング演習 # [2] 問題文: # 1から100までの整数のうち,奇数の合計値を求めるプログラムをfor文を用いて作成 # 1から100までの整数のうち,奇数の合計値を求めるプログラムをwhile文を用いて作成 # '1から100までの整数のうち,奇数の合計値を求める'(_1から100までの整数のうち奇数の合計値) :- findsum(N,( for(1,N,100), 1 is N mod 2), _1から100までの整数のうち奇数の合計値). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '1から100までの整数のうち,奇数の合計値を求める'(_1から100までの整数のうち奇数の合計値) :- length(L,100), findsum(N,( append(L0,[_|_],L), length([_|L0],N), 1 is N mod 2), _1から100までの整数のうち奇数の合計値). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '1から100までの整数のうち,奇数の合計値を求める'(_1から100までの整数のうち奇数の合計値) :- '1から100までの整数のうち,奇数の合計値を求める'(1,0,_1から100までの整数のうち奇数の合計値). '1から100までの整数のうち,奇数の合計値を求める'(N,_1から100までの整数のうち奇数の合計値,_1から100までの整数のうち奇数の合計値) :- N > 100,!. '1から100までの整数のうち,奇数の合計値を求める'(N,_合計値_1,_1から100までの整数のうち奇数の合計値) :- 1 is N mod 2, _合計値_2 is _合計値_1 + N, N_2 is N + 1, '1から100までの整数のうち,奇数の合計値を求める'(N_2,_合計値_2,_1から100までの整数のうち奇数の合計値). '1から100までの整数のうち,奇数の合計値を求める'(N,_合計値_1,_1から100までの整数のうち奇数の合計値) :- 0 is N mod 2, N_2 is N + 1, '1から100までの整数のうち,奇数の合計値を求める'(N_2,_合計値_1,_1から100までの整数のうち奇数の合計値). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '1から100までの整数のうち,奇数の合計値を求める'(_1から100までの整数のうち奇数の合計値) :- '1から100までの整数のうち,奇数の合計値を求める'(1,_1から100までの整数のうち奇数の合計値). '1から100までの整数のうち,奇数の合計値を求める'(N,0) :- N > 100,!. '1から100までの整数のうち,奇数の合計値を求める'(N,_合計値_1) :- 1 is N mod 2, N_2 is N + 1, '1から100までの整数のうち,奇数の合計値を求める'(N_2,_合計値_2). _合計値_1 is _合計値_2 + N. '1から100までの整数のうち,奇数の合計値を求める'(N,_合計値_1) :- 0 is N mod 2, N_2 is N + 1, '1から100までの整数のうち,奇数の合計値を求める'(N_2,_合計値_1). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/423 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # 100点満点の試験の学生10人の得点データをキーボードから # 整数型配列data[10]に入力すると、最高点とその要素番号が出力されるプログラムを作成。 # 同点はないものとする。 # '100点満点の試験の学生10人の得点データをキーボードから入力すると、最高点とその要素番号が出力されるプログラムを作成。同点はないものとする。' :- '100点満点の試験の学生10人の得点データをキーボードから入力すると'(_学生10人の得点データ), '最高点とその要素番号が出力される'(_学生10人の得点データ). '100点満点の試験の学生10人の得点データをキーボードから入力すると'(_学生10人の得点データ) :- length(_学生10人の得点データ,10), findall(_得点,( append(L0,[_得点|R],_学生10人の得点データ), '100点満点の得点の入力'(L0,_得点)), _学生10人の得点データ). '最高点とその要素番号が出力される'(_学生10人の得点データ) :- max(_学生10人の得点データ,_最高点), nth1(_要素番号,_学生10人の得点データ,_最高点), writef('最高点 = %t点, その要素番号(1起点) = %t\n',[_最高点,_要素番号]). '100点満点の得点の入力'(L0,_得点) :- length([_|L0],_何人目), writef('%t人目の得点を入力してください : ',[_何人目]), get_line(Line), '100点満点の得点の入力診断'(Line,_得点),!. '100点満点の得点の入力'(L0,_得点) :- '100点満点の得点の入力'(L0,_得点). '100点満点の得点の入力診断'(Line,_得点) :- atom_to_term(Line,_得点,_), integer(_得点), _得点 =< 100,!. '100点満点の得点の入力診断'(Line,_得点) :- writef('入力された%tからは適切な得点が得られません。再入力をお願いします。\n',[Line]), fail. % % この一般的な入力プログラムはこの課題には適さない。 % バックトラックしての入力はこれまでどのような入力があったかを % 検査することができない。 % この課題では同点はないものとするという条件があり、これを入力時に % 検査する為には再帰的な制御、すなわち集約が必要になる。 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/395 # # ../test/read.cgi/tech/1335517816/393 # ありがとうございます。 # {1] 授業単元:プログラミング # [2] 問題文: # くじの0等から4等までの本数と賞金は次の通りである。 # 0等  1等  2等 3等 4等 # 5 10 25 150 810 本数[本] # 10000 3000 400 100  0 賞金[円] # くじを1本引くときの賞金の期待値(平均値)を計算するプログラムを作成しなさい。 # くじ本数('0等',5). くじ本数('1等',10). くじ本数('2等',25). くじ本数('3等',150). くじ本数('4等',810). くじ賞金('0等',10000). くじ賞金('1等',3000). くじ賞金('2等',400). くじ賞金('3等',100). くじ賞金('4等',0). 'くじを1本引くときの賞金の期待値(平均値)を計算する'(_賞金の期待値) :- くじの賞金総額を計算する(_くじの賞金総額), くじの本数(_本数), _賞金の期待値 is _くじの賞金総額 / _本数. くじの賞金総額を計算する(_くじの賞金総額) :- findsum(_等級別賞金総額,( くじ本数(_くじ等級,_等級別本数), くじ賞金(_くじ等級,_等級別賞金), _等級別賞金総額 is _等級別賞金 * _等級別本数), _くじの賞金総額). くじの本数(_本数) :- findsum(_等級別本数,( くじ本数(_くじ等級,_等級別本数)), _本数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/391 # # {1] 授業単元:プログラミング # [2] 問題文: # くじの0等から4等までの本数と賞金は次の通りである。 # 0等  1等  2等 3等 4等 # 5 10 25 150 810 本数[本] # 10000 3000 400 100  0 賞金[円] # 0等から4等までの本数をそれぞれ配列honsuu[5]に代入。 # このくじの本数(合計)を計算しなさい。 # くじ本数('0等',5). くじ本数('1等',10). くじ本数('2等',25). くじ本数('3等',150). くじ本数('4等',810). くじ賞金('0等',10000). くじ賞金('1等',3000). くじ賞金('2等',400). くじ賞金('3等',100). くじ賞金('4等',0). 'くじの0等から4等までの本数と賞金は次の通りである。 # 0等  1等  2等 3等 4等 # 5 10 25 150 810 本数[本] # 10000 3000 400 100  0 賞金[円] # このくじの本数(合計)を計算しなさい。'(_本数) :- findsum(_等級別本数,( くじ本数(_くじ等級,_等級別本数)), _本数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/103 # # [1] 授業単元:院試過去問(データ構造とアルゴリズム?) # 下記リンク専門科目蟻莪賁(3)がわかりません。(2ページ目) # http://ime.nu/www.i.u-tokyo.ac.jp/edu/course/cs/pdf/2010computer.pdf # (2009年東京大) # 問題1 # 二分木のすべてのノードをたどり、ノードに格納されている整数の総和を計算したい。 # 以下の問に答えよ.ただし、プログラムはPrologで書くこととする。 # [3-5]環境無指定(出題はCだが大意があっていればC++でも可)、無期限 # 二分木の根(1). '二分木のすべてのノードをたどり、ノードに格納されている整数の総和を計算したい。'(_ノードに格納されている整数の総和) :- 二分木の根(_根), findsum(_ノードに格納されている整数,( 二分木のすべてのノードをたどり(_根,_ノードに格納されている整数)), _ノードに格納されている整数の総和). 二分木のすべてのノードをたどり([],_) :- !,fail. 二分木のすべてのノードをたどり(_ノード,_ノードに格納されている整数) :- 二分木(_ノード,_ノード_1,_ノード_2,_ノードに格納されている整数). 二分木のすべてのノードをたどり(_ノード,_ノードに格納されている整数) :- 二分木(_ノード,_ノード_1,_,_), 二分木のすべてのノードをたどり(_ノード_1,_ノードに格納されている整数). 二分木のすべてのノードをたどり(_ノード,_ノードに格納されている整数) :- 二分木(_ノード,_,_ノード_2,_), 二分木のすべてのノードをたどり(_ノード_2,_ノードに格納されている整数). % 以下のサイトは 分散(L,V) :- length(L,N), 相加平均(L,M), 分散(L,N,M,0.0e+00,V). 分散([],N,M,S,V) :- V is S / N,!. 分散([A|R],N,M,S,V) :- S1 is (A - M) ^ 2, S2 is S + S1, 分散(R,N,M,S2,V). 標本分散(_標本ならび,_標本分散) :- 標本平均(_標本ならび,_標本平均), length(_標本ならび,_標本数), findsum(U,( member(_標本,_標本ならび), U is (_標本 - _標本平均) ^ 2), S), _標本分散 is S / (_標本数 - 1). 標本平均(_標本ならび,_標本平均) :- 相加平均(_標本ならび,_標本平均). 不偏分散(_標本ならび,_分散) :- 不偏分散とは標本の二乗の相加平均から相加平均の二乗を引いた数(_標本ならび,_分散). 不偏分散とは標本の二乗の相加平均から相加平均の二乗を引いた数(_標本ならび,_分散) :- 標本の二乗の相加平均(_標本ならび,_標本の二乗の相加平均), 相加平均の二乗(_標本ならび,_相加平均の二乗), _分散 is _標本の二乗の相加平均 - _相加平均の二乗. 標本の二乗の相加平均(_標本ならび,_標本の二乗の相加平均) :- findavg(V,( 標本の二乗(_標本ならび,_標本の二乗)), _標本の二乗の相加平均). 標本の二乗(_標本ならび,_標本の二乗) :- member(_標本,_標本ならび), _標本の二乗 is _標本 * _標本. 相加平均の二乗(_標本ならび,_相加平均の二乗) :- 相加平均(_標本ならび,_相加平均), _相加平均の二乗 is _相加平均 * _相加平均. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/945 # # # テキストフィールドから入力した学習時間の平均を求める。 # # ただし、テキストフィールドの入力が改行のみの時、入力は[]となり終了する。 # テキストフィールドから入力した学習時間の平均を求める(_学習時間の平均) :- テキストフィールドから入力した学習時間の(_学習時間ならび), 学習時間の平均を求める(_学習時間ならび,_学習時間の平均). テキストフィールドから入力した学習時間の(_学習時間ならび) :- テキストフィールドから入力した学習時間(_学習時間), テキストフィールドから入力した学習時間の(_学習時間,_学習時間ならび). テキストフィールドから入力した学習時間の(_入力,[]) :- 'テキストフィールドの入力が改行のみの時、入力は[]となり終了する'(_入力),!. テキストフィールドから入力した学習時間の(_学習時間,[_学習時間|R]) :- テキストフィールドから入力した学習時間(_学習時間_2), テキストフィールドから入力した学習時間の(_学習時間_2,R). テキストフィールドから入力した学習時間(_学習時間) :- write('学習時間をスペース区切りで _時 _分 _秒 : '), readln(L), テキストフィールドから入力した学習時間診断(L,_学習時間),!. テキストフィールドから入力した学習時間(_学習時間) :- テキストフィールドから入力した学習時間(_学習時間). テキストフィールドから入力した学習時間診断([],[]) :- !. テキストフィールドから入力した学習時間診断([_時,_分,_秒],[_時,_分,_秒]) :- 時の範囲内(_時), 分の範囲内(_分), 秒の範囲内(_秒),!. テキストフィールドから入力した学習時間診断(L,_学習時間) :- writef('%t Input Error: ',[L]), fail. 時の範囲内(_時) :- integer(_時), _時 >= 0. 分の範囲内(_分) :- integer(_分), _分 >= 0, _分 < 60,!. 秒の範囲内(_秒) :- integer(_秒), _秒 >= 0, _秒 < 60,!. 学習時間の平均を求める([],_) :- write('テキストフィールドから入力した学習時間が有りません\n'), fail,!. 学習時間の平均を求める(_学習時間ならび,_学習時間の平均) :- length(_学習時間ならび,_人数), findsum([_時,_分,_秒],( member([_時,_分,_秒],_学習時間ならび)), [_合計時,_合計分,_合計秒]), 学習時間の平均を求める(_人数,_合計時,_合計分,_合計秒,_平均時,_平均分,_平均秒). 学習時間の平均を求める(_人数,_合計時,_合計分,_合計秒,_平均時,_平均分,_平均秒) :- 一旦秒に換算する(_合計時,_合計分,_合計秒,_換算された秒), _平均秒 is truncate((_換算された秒 + 0.5) / _人数), '換算された秒を時、分、秒に還元'(_換算された秒,_平均時,_平均分,_平均日). 一旦秒に換算する(_合計時,_合計分,_合計秒,_換算された秒) :- _換算された秒 is _合計時 * 3600 + _合計分 * 60 + _合計秒. '換算された秒を時、分、秒に還元'(_換算された秒,_時,_分,_秒) :- _時 is _換算された秒 // 3600, _剰余_1 is _換算された秒 mod 3600, _分 is _剰余_1 // 60, _秒 is _剰余_1 mod 60. 'テキストフィールドの入力が改行のみの時、入力は[]となり終了する'([]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/945 # # 【課題】最終課題のプログラムを,テキストフィールドから入力した学習時間の平均を求めるように書き換えてみよう。 #      例えば,次のような仕様にするといいでしょう。(paintメソッドではなく,actionPerformedメソッドで合計していく) # # 仕様 # 合計時間を参照するMyTime型の変数を,アプレットクラスのフィールドとして用意しておき, actionPerformedメソッド内で,テキストフィールドから入力された時間データを加えていく。 # 学習時間を1人分ずつ(時間,分,秒)を3つのテキストフィールドから入力していく。 # 合計の学習時間も,テキストフィールドに表示する。 # 時間が入力されてEnterキーが押されると, actionPerfomedメソッドが呼び出されるので,そこでそれまでに入力された学習時間の平均を求めて,表示する。 # 「何人分のデータが入力されたか」なども表示するようにするといいかもしれません。 #      # 【形態】Javaアプレット # 【期限】2012年4月27日(金)15時まで # 【補足】Eclipse 3.1で動作できるソース # # # よろしくお願いします。 # # テキストフィールドから入力した学習時間の平均を求める(_学習時間の平均) :- テキストフィールドから入力した学習時間の(_学習時間ならび), 学習時間の平均を求める(_学習時間ならび,_学習時間の平均). テキストフィールドから入力した学習時間の(_学習時間ならび) :- テキストフィールドから入力した学習時間(_学習時間), テキストフィールドから入力した学習時間の(_学習時間,_学習時間ならび). テキストフィールドから入力した学習時間の([],[]) :- !. テキストフィールドから入力した学習時間の(_学習時間,[_学習時間|R]) :- テキストフィールドから入力した学習時間(_学習時間_2), テキストフィールドから入力した学習時間の(_学習時間_2,R). テキストフィールドから入力した学習時間(_学習時間) :- write('学習時間をスペース区切りで _時 _分 _秒 : '), readln(L), テキストフィールドから入力した学習時間診断(L,_学習時間),!. テキストフィールドから入力した学習時間(_学習時間) :- テキストフィールドから入力した学習時間(_学習時間). テキストフィールドから入力した学習時間診断([],[]) :- !. テキストフィールドから入力した学習時間診断([_時,_分,_秒],[_時,_分,_秒]) :- 時の範囲内(_時), 分の範囲内(_分), 秒の範囲内(_秒),!. テキストフィールドから入力した学習時間診断(L,_学習時間) :- writef('%t Input Error: ',[L]), fail. 時の範囲内(_時) :- integer(_時), _時 >= 0. 分の範囲内(_分) :- integer(_分), _分 >= 0, _分 < 60,!. 秒の範囲内(_秒) :- integer(_秒), _秒 >= 0, _秒 < 60,!. 学習時間の平均を求める([],_) :- write('テキストフィールドから入力した学習時間が有りません\n'), fail,!. 学習時間の平均を求める(_学習時間ならび,_学習時間の平均) :- length(_学習時間ならび,_人数), findsum([_時,_分,_秒],( member([_時,_分,_秒],_学習時間ならび)), [_合計時,_合計分,_合計秒]), 学習時間の平均を求める(_人数,_合計時,_合計分,_合計秒,_平均時,_平均分,_平均秒). 学習時間の平均を求める(_人数,_合計時,_合計分,_合計秒,_平均時,_平均分,_平均秒) :- 一旦秒に換算する(_合計時,_合計分,_合計秒,_換算された秒), _平均秒 is truncate((_換算された秒 + 0.5) / _人数), '換算された秒を時、分、秒に還元'(_換算された秒,_平均時,_平均分,_平均日). 一旦秒に換算する(_合計時,_合計分,_合計秒,_換算された秒) :- _換算された秒 is _合計時 * 3600 + _合計分 * 60 + _合計秒. '換算された秒を時、分、秒に還元'(_換算された秒,_時,_分,_秒) :- _時 is _換算された秒 // 3600, _剰余_1 is _換算された秒 mod 3600, _分 is _剰余_1 // 60, _秒 is _剰余_1 mod 60. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/945 # # 【課題】最終課題のプログラムを,テキストフィールドから入力した学習時間の平均を求めるように書き換えてみよう。 #      例えば,次のような仕様にするといいでしょう。(paintメソッドではなく,actionPerformedメソッドで合計していく) # # 仕様 # 合計時間を参照するMyTime型の変数を,アプレットクラスのフィールドとして用意しておき, actionPerformedメソッド内で,テキストフィールドから入力された時間データを加えていく。 # 学習時間を1人分ずつ(時間,分,秒)を3つのテキストフィールドから入力していく。 # 合計の学習時間も,テキストフィールドに表示する。 # 時間が入力されてEnterキーが押されると, actionPerfomedメソッドが呼び出されるので,そこでそれまでに入力された学習時間の平均を求めて,表示する。 # 「何人分のデータが入力されたか」なども表示するようにするといいかもしれません。 #      # 【形態】Javaアプレット # 【期限】2012年4月27日(金)15時まで # 【補足】Eclipse 3.1で動作できるソース # # # よろしくお願いします。 # # テキストフィールドから入力した学習時間の平均を求める(_学習時間の平均) :- テキストフィールドから入力した学習時間の(_学習時間ならび), 学習時間の平均を求める(_学習時間ならび,_学習時間の平均). テキストフィールドから入力した学習時間の(_学習時間ならび) :- テキストフィールドから入力した学習時間(_学習時間), テキストフィールドから入力した学習時間の(_学習時間,_学習時間ならび). テキストフィールドから入力した学習時間の([],[]) :- !. テキストフィールドから入力した学習時間の(_学習時間,[_学習時間|R]) :- テキストフィールドから入力した学習時間(_学習時間_2), テキストフィールドから入力した学習時間の(_学習時間_2,R). テキストフィールドから入力した学習時間(_学習時間) :- write('学習時間をスペース区切りで _時 _分 _秒 : '), readln(L), テキストフィールドから入力した学習時間診断(L,_学習時間),!. テキストフィールドから入力した学習時間(_学習時間) :- テキストフィールドから入力した学習時間(_学習時間). テキストフィールドから入力した学習時間診断([],[]) :- !. テキストフィールドから入力した学習時間診断([_時,_分,_秒],[_時,_分,_秒]) :- 時の範囲内(_時), 分の範囲内(_分), 秒の範囲内(_秒),!. テキストフィールドから入力した学習時間診断(L,_学習時間) :- writef('%t Input Error: ',[L]), fail. 時の範囲内(_時) :- integer(_時), _時 >= 0. 分の範囲内(_分) :- integer(_分), _分 >= 0, _分 < 60,!. 秒の範囲内(_秒) :- integer(_秒), _秒 >= 0, _秒 < 60,!. 学習時間の平均を求める([],_) :- write('テキストフィールドから入力した学習時間が有りません\n'), fail,!. 学習時間の平均を求める(_学習時間ならび,_学習時間の平均) :- length(_学習時間ならび,_人数), findsum([_時,_分,_秒],( member([_時,_分,_秒],_学習時間ならび)), [_合計時,_合計分,_合計秒]), 学習時間の平均を求める(_人数,_合計時,_合計分,_合計秒,_平均時,_平均分,_平均秒). 学習時間の平均を求める(_人数,_合計時,_合計分,_合計秒,_平均時,_平均分,_平均秒) :- 一旦秒に換算する(_合計時,_合計分,_合計秒,_換算された秒), _平均秒 is truncate((_換算された秒 + 0.5) / _人数), '換算された秒を時、分、秒に還元'(_換算された秒,_平均時,_平均分,_平均日). 一旦秒に換算する(_合計時,_合計分,_合計秒,_換算された秒) :- _換算された秒 is _合計時 * 3600 + _合計分 * 60 + _合計秒. '換算された秒を時、分、秒に還元'(_換算された秒,_時,_分,_秒) :- _時 is _換算された秒 // 3600, _剰余_1 is _換算された秒 mod 3600, _分 is _剰余_1 // 60, _秒 is _剰余_1 mod 60. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/896 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): # 1からNまでの値の中で3の倍数の和を求めるプログラムkadai2.cを書きなさい。但しNはキーボードから入力するものとして,出力は以下で出力されるものとする。 # printf("sum = %d\n", answer); # # '1からNまでの値の中で3の倍数の和を求める。ただしNはキーぼどから入力するものとする' :- 'Nはキーぼどから入力する'(N), '1からNまでの値の中で3の倍数の和を求める'(N,_1からNまでの値の中で3の倍数の和), writef('1から%tまでの値の中で3の倍数の和=%t\n',[_1からNまでの値の中で3の倍数の和]). '1からNまでの値の中で3の倍数の和を求める'(N,_1からNまでの値の中で3の倍数の和) :- findsum(M,( for(1,M,N), 0 is M mod 3), _1からNまでの値の中で3の倍数の和). 'Nはキーぼどから入力する'(N) :- write('0より大きい整数 N を入力して下さい : '), get_line(Line), 整数入力検査(Line,N),!. 'Nはキーぼどから入力する'(N) :- 'Nはキーぼどから入力する'(N). 整数入力検査(Line,N) :- atom_to_term(Line,N,_), integer(N), N > 0,!. 整数入力検査(Line,N) :- writef('入力された %t からは適切な N が得られません。再入力をお願いします。\n',[Line]), fail. findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum(_値ならび,_合計値),!. sum([],0). sum([N|R],Sum) :- sum(R,Sum_1), Sum is Sum_1 + N. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/895 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): # [問1] 1からNまでの平均値を求めるプログラムkadai1.cを書きなさい。ただしNはキーぼどから入力するものとし、出力は以下で出力されるものとする。 # printf("average = %f\n", answer); # '1からNまでの平均値を求める。ただしNはキーぼどから入力するものとする' :- 'Nはキーぼどから入力する'(N), findavg(M,for(1,M,N),_相加平均), writef('平均値 = %t\n',[_相加平均]). 'Nはキーぼどから入力する'(N) :- write('0より大きい整数 N を入力して下さい : '), get_line(Line), 整数入力検査(Line,N),!. 'Nはキーぼどから入力する'(N) :- 'Nはキーぼどから入力する'(N). 整数入力検査(Line,N) :- atom_to_term(Line,N,_), integer(N), N > 0,!. 整数入力検査(Line,N) :- writef('入力された %t からは適切な N が得られません。再入力をお願いします。\n',[Line]), fail. findavg(_集約項,_項,_算術平均) :- findall(_集約項,_項,_値ならび), sum(_値ならび,_合計値), length(_値ならび,_ならびの長さ), _算術平均 is _合計値 / _ならびの長さ,!. sum([],0). sum([N|R],S) :- sum(R,Sum_1), Sum is Sum_1 + N. % 以下のサイトは # So I have a set of facts: # # course(cs61, "intro to cs") # ... # course(cs62b, "data structure") # ... # grade(adam, cs61, spring11, "A") # ... # grade(chrisitian, cs61, fall2010, "A-") I need to define a predicate good_standing(Student) to determine whether the Student got A in every class he took. I must use 2 different approaches: # # use setof/3 # use NAF # on the 1st. I have tried to figure out get Result_list: the set of students that got A from every class he took. and then call member(Student, Result_list). But I don't know what to get the Result_list since the syntax is a bit strange to me. '科目の全てを受講し、かつ成績がAの者'(_氏名) :- findsetof(_氏名,( 成績(_氏名,_,_,_)), _氏名ならび), findsetof(_科目, 科目(_科目,_)), _科目ならび), member(_氏名,_氏名ならび), 受講した科目と成績(_氏名,_受講した科目ならび,_成績ならび), \+(受講していない科目がある(_受講した科目ならび)), all(_成績ならび,'A'). 受講した科目と成績(_氏名,_受講した科目ならび,_成績ならび) :- findall(_科目,( 成績(_氏名,_科目,_成績)), _受講した科目ならび), findall(_成績,( 成績(_氏名,_科目,_成績)), _成績ならび). 受講していない科目がある(_受講した科目ならび,_科目ならび) :- member(_科目,_科目ならび), \+(member(_科目,_受講した科目ならび)). all([],_). all([V|R],V) :- all(R,V). % 以下のサイトは # 出典:: 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). % 以下のサイトは # I have a database looks like; # # airport(ist, 90). # airport(saw, 45). # airport(esb, 60). # airport(adb, 60). # airport(erz, 30). # airport(ayt, 90). # airport(mlx, 30). # airport(tzx, 30). # # airplane(f1, ist, [esb,tzx,saw]). # airplane(f2, ist, [mlx,esb,erz,esb]). # airplane(f3, ist, [esb,ist,esb,ist]). # airplane(f4, saw, [ayt,saw,ayt,saw]). # airplane(f5, erz, [esb,erz,esb]). # airplane(f6, mlx, [ist,esb,tzx,saw]). # and I have a predicate called "testing" takes two lists as parameter. So, if you write testing([ist],X). you should get X=[esb,mlx]. I wrote this code. # # testing([],[]). # # testing([D|D1],[L|L1]) :- # airport(D,_), # airplane(_,D,[L|_]), # testing(D1,L1). # This works and the output is: # # [8] 60 ?- listConnections([ist],X). # X = [esb] ; # X = [mlx] ; # X = [esb]. # But this is not that I want. So the first problem is I need a single line answer like X=[esb,mlx]. The second problem is there shouldn't duplicate elements in the list. I hope my problem is clear. Any help would be greatly appreciated # airport(ist, 90). airport(saw, 45). airport(esb, 60). airport(adb, 60). airport(erz, 30). airport(ayt, 90). airport(mlx, 30). airport(tzx, 30). airplane(f1, ist, [esb,tzx,saw]). airplane(f2, ist, [mlx,esb,erz,esb]). airplane(f3, ist, [esb,ist,esb,ist]). airplane(f4, saw, [ayt,saw,ayt,saw]). airplane(f5, erz, [esb,erz,esb]). airplane(f6, mlx, [ist,esb,tzx,saw]). testing([],[]). testing([_airport|R1],[L|R2]) :- findsetof(_airport_1,( airport(_airport,_), airplane(_,_airport,[_airport_1|_])), L), testing(R1,R2). findsetof(A,B,L) :- findall(A,B,C), setof(A,member(A,C),L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/662 # # MySQL5 # # 開始日、終了日を持ったテーブルを日付単位に表示したいです。 # tbl_job は、以下の構造です。 # # id, name, start_date, end_date # --------------------------- # 1, JOB1, 2012-04-01, 2012-04-03 # 2, JOB2, 2012-04-02, 2012-04-04 # # 上記テーブルから以下のように日付単位でJOBを表示するSQLを教えてほしいです。 # # date, id, name # -------------------- # 2012-04-01, 1, JOB1 # 2012-04-02, 1, JOB1 # 2012-04-02, 2, JOB2 # 2012-04-03, 1, JOB1 # 2012-04-03, 2, JOB2 # 2012-04-04, 2, JOB2 # # '開始日、終了日を持ったテーブルを日付単位に表示したい' :- 日付単位tbl_jobの生成(_日付単位tbl_jobならび), findsetof(_日付,( member([_date,_,_],_日付単位tbl_jobならび)), _日付ならび), 日付単位に表示する(_日付ならび,_日付単位tbl_jobならび). 日付単位tbl_jobの生成(_日付単位tbl_jobならび) :- findall(_日付,( tbl_job(_id,_name,_start_date,_end_date), 日付の生成(_start_date,_end_date,_日付)), _日付単位tbl_jobならび). 日付の生成(_終了年-_終了月-_終了日,_終了年-_終了月-_終了日,_終了年-_終了月-_終了日) :- !. 日付の生成(_開始年-_開始月-_開始日,_終了年-_終了月-_終了日,_開始年-_開始月-_開始日). 日付の生成(_開始年-_開始月-_開始日,_終了年-_終了月-_終了日,_年-_月-_日) :- 翌日(_開始年,_開始月,_開始日,_翌日年,_翌日月,_翌日日), 日付の生成(_翌日年-_翌日月-_翌日日,_終了年-_終了月-_終了日,_年-_月-_日). 翌日(_年,12,31,_翌年,1,1) :- !. 翌日(_年,_月,30,_年,_翌月,1) :- member(_月,[4,6,9,11]), _翌月 is _月 + 1,!. 翌日(_年,_月,31,_年,_翌月,1) :- _翌月 is _月 + 1,!. 翌日(_年,2,29,_年,3,1) :- !. 翌日(_年,2,28,_年,3,1) :- \+(うるう年(_年)), 翌日(_年,_月,_日,_年,_月,_翌日) :- _翌日 is _日 + 1. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 日付単位に表示する(_日付ならび,_日付単位tbl_jobならび) :- member(_日付,_日付ならび), member([_日付,_id,_name],_日付単位tbl_jobならび), 日付の形式を整えながら一行表示する(_日付,_id,_name), fail. 日付単位に表示する(_日付ならび,_日付単位tbl_jobならび). 日付の形式を整えながら一行表示する(_年-_月-_日,_id,_name) :- swritef(S,'%2r-%2r-%2r',[_年-_月-_日]), 空白を0に置換した日付文字列(S,_空白を0に置換した日付文字列), writef('%t, %t, %t\n',[_空白を0に置換した日付文字列,_id,_name). 空白を0に置換した日付文字列(S,_空白を0に置換した日付文字列) :- findall(_文字_2,( sub_atom(S,_,1,_,_文字), 空白を0に置換(_文字,_文字_2)), _空白を0に置換した日付文字列). 空白を0に置換(' ','0') :- !. 空白を0に置換(A,A). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/649 # # SQLというよりテーブル設計の質問なんですがいいでしょうか? # # ユーザごとの日々変化するデータを1日1レコードずつ保存するために # 以下のようなテーブル構造を考えました。 # # USERSテーブル #  user_no (ユーザ番号 PK) #  latest_gen_no (最新世代番号) #  氏名その他の属性 # # RECORDSテーブル #  user_no (ユーザ番号 PK*) #  gen_no (世代番号 PK*) #  日々変化する値 # *user_no, gen_no のペアでPK # # GENERATIONSテーブル #  gen_no (世代番号 PK) #  date (日時) # # 全ユーザの最新世代の値を取得するべく、 # select ... from users u, records r # where u.user_no=r.user_no and u.latest_gen_no=r.gen_no; # というSQLを発行すると、ものすごく時間が掛かります。 # # PKやインデックスの設定の仕方に問題があるのでしょうか? # そもそもテーブルの構成がまずいでしょうか? # テーブル副目標(_テーブル名,_引数ならび,_属性名ならび,_副目標) :- findall(_,テーブル定義(_テーブル名,_,_属性名),_引数ならび), findall(_属性名,テーブル定義(_テーブル名,_,_属性名),_属性名ならび), _利用者が指示する引数構造 = L, _副目標 =.. [_テーブル名|_引数ならび]. 'USERSテーブルを最新世代に更新する' :- ユーザごとの現在の最新世代を得る(_ユーザごとの最新世代ならび), 'USERSテーブルを更新する'(_ユーザごとの最新世代ならび). ユーザごとの現在の最新世代を得る(_ユーザごとの最新世代ならび) :- 'テーブル副目標'('USERS',[_ユーザ番号,_最新世代番号|_氏名その他の属性],_,_USERS), findsetof(_ユーザ番号,( _USERS), _対象ユーザ番号ならび), ユーザごとの現在の最新世代を得る(_対象ユーザ番号ならび,_ユーザごとの最新世代ならび). ユーザごとの現在の最新世代を得る([],[]). ユーザごとの現在の最新世代を得る([_ユーザ番号|R1],[[_ユーザ番号,_最新世代番号]|R2]) :- テーブル副目標('RECORDS',[_ユーザ番号,_世代番号|_],_,_RECORDS), findmax([_日時,_世代番号],( _RECORDS, 'GENERATIONS'(_世代番号,_日時)), [_,_最新世代番号]), ユーザごとの現在の最新世代を得る(R1,R2). 'USERSテーブルを更新する'([]). 'USERSテーブルを更新する'([[_ユーザ番号,_最新世代番号]|R]) :- テーブル副目標('USERS',[_ユーザ番号,_|_氏名その他の属性],_,_USERS_1), テーブル副目標('USERS',[_ユーザ番号,_最新世代番号|_氏名その他の属性],_,_USERS_2), retract(_USERS_1), assertz(_USERS_2), 'USERSテーブルを更新する'(R),!. % 以下のサイトは # # 売上('20120416',トマト,3000). # 売上('20120417',ナス,1000). # 売上('20120416',トマト,1500). # 売上('20120417',ナス,2200). # # の時に、日付ごとの合計売上が欲しい。 # # ?- 集約加算(_集約値,[_日付,_集約値],[_日付],[_金額],売上(_日付,_品目,_金額),_解). # # _解 = [['20120416',4500],['20120417',3200]] # 集約加算(_集約解変数指定,_選択項,_鍵項,_集約項,P,_解) :- findsetof(_鍵項,P,L1), findkeysort(_選択項,_鍵項,( member(_鍵項,L1), findsum(_集約項,P,_集約解変数指定)), _解_1), 集約加算の解を平坦化する(_解_1,_解). 集約加算の解を平坦化する(_解_1,_解) :- findall(L3,( member(L2,_解_1), 平坦化(L2,L3)), _解) . %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% findsetof(A,B,L) :- findall(A,B,C), setof(A,member(A,C),L). findkeysort(Select,Keys,P,List) :- append(Keys,Select,Keys2), findall(Keys2,P,List1), sort(List1,List2), findall(Select,member(Keys2,List2),List). 平坦化(_深いならび,_平坦化されたならび) :- 差分ならびによる平坦化(_深いならび,_平坦化されたならび - []) . 差分ならびによる平坦化([_項|_残りならび],_差分ならび頭部 - _差分ならび尾部) :- 差分ならびによる平坦化(_項,_差分ならび頭部 - _不完全な差分ならび), 差分ならびによる平坦化(_残りならび,_不完全な差分ならび - _差分ならび尾部) . 差分ならびによる平坦化([],_差分ならび頭部 - _差分ならび尾部) :- _差分ならび頭部 = _差分ならび尾部 . 差分ならびによる平坦化(_項,[_項|_差分ならび尾部] - _差分ならび尾部) :- \+(list(_項)),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/647 # # #インデントが崩れる場合は http://ime.nu/pastebin.com/26BkXDHs をみてください。 # # -- # -- 商品テーブルと、 # -- # create table items ( # id serial primary key, # name varchar(255) not null, # price integer not null -- 単価 # ); # # -- # -- 販売テーブルがあるとする。 # -- # create table sales ( # id serial primary key, # item_id integer not null references items(id), # count integer not null default 1, -- 個数 # total integer not null, -- 単価 * 個数 # created_at timestamp not null default current_datetime # ) # # -- # -- 日付を指定して、その日の商品別販売金額合計を大きい順に表示したい。 # -- どういうSQLを書けばいいの? # -- こんなかんじで書けたらいいんだけど。 # -- # select items.id, items.name # from items, # (select item_id, sum(total) as sum_total # from sales # where date(created_at) = '2012-04-01' # group by item_id) as totals # where items.id = totals.item_id # order by totals.sum_total desc; # # '日付を指定して、その日の商品別販売金額合計を大きい順に表示したい' :- '日付を指定して、'(_日付), その日の商品別販売金額合計を(_日付,L1), 大きい順に表示する(L1). '日付を指定して、'(_日付) :- write('日付を8桁の整数で入力して下さい : '), get_line(Line), '日付を指定して、の診断'(Line,_日付),!. '日付を指定して、'(_日付) :- '日付を指定して、'(_日付). '日付を指定して、の診断'(Line,_日付) :- atom_to_term(Line,_8桁の整数,_), '8桁の整数'(_8桁の整数), '8桁の整数から日付を得る'(_8桁の整数,_日付),!. '日付を指定して、の診断'(Line,_日付) :- writef('入力された %t からは日付が得られませんでした。再入力をお願いします\n',[Line]), fail. '8桁の整数'(_8桁の整数) :- integer(_8桁の整数), _8桁の整数 >= 10000000, _8桁の整数 =< 99999999. '8桁の整数から日付を得る'(_8桁の整数,_日付) :- swritef(_日付文字列,'%t',[_8桁の整数]), sub_atom(_日付文字列,0,4,_,_年), sub_atom(_日付文字列,4,2,_,_月), sub_atom(_日付文字列,6,2,_,_日), atomic_list_concat([_年,'-',_月,'-',_日],_日付),!. その日の商品別販売金額合計を(_日付,L1) :- findsetof(_id,( sales(_id,_item_id,_count,_total,_日付)), L), findall([_total,_id],( append(_,[_id|R],L), 商品の販売合計(_日付,_id,_合計金額)), L1). 商品の販売合計(_日付,_id,_合計金額) :- findsum(_total,( sales(_id,_item_id,_count,_total,_日付)), _合計金額). 大きい順に表示する(L1) :- 大きい順に(L1,L2), 表示する(L2). 大きい順に(L1,L2) :- sort(L1,L3), reverse(L3,L2). 表示する(_日付,[]). 表示する(_日付,[[_合計金額,_id]|R]) :- items(_id,_name,_price), writef('%t %t %20l %10r\n',[_日付,_id,_name,_合計金額]), 表示する(_日付,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1258320456/308 # # ・1から2000までの数字が昇順に格納された # 要素2000個の配列を用意 # ・乱数にて1から2000までのキー値を生成し、 # 上記配列を二分探索で探索してキー値を見つけるまでの # 探索回数を記録 # ・以上を1000回繰り返し、平均探索回数を算出 # ・上記の平均探索回数を、理論値log2・2000と比較して示せ # # という宿題を出されたのですが、まるでわかりません。 # よろしくお願いします。 # # '1から2000までの数字が昇順に格納された要素2000個の配列を用意'(L) :- findall(N,for(1,N,2000),L). '1から2000までの数字が昇順に格納された要素2000個の配列を用意し、乱数にて1から2000までのキー値を生成し、上記配列を二分探索で探索してキー値を見つけるまでの探索回数を記録。以上を1000回繰り返し、平均探索回数を算出する'(_探索回数合計) :- '1から2000までの数字が昇順に格納された要素2000個の配列を用意'(L), findsum(_探索回数,( for(1,_,1000), _キー値 is random(2000) + 1, 上記配列を二分探索で探索してキー値を見つけるまでの探索回数を記録(1000,L,_キー値,_探索回数)), _探索回数合計). 上記配列を二分探索で探索してキー値を見つけるまでの探索回数を記録(_要素数,L,_キー値,_探索回数) :- 二分(_要素数,L,N1,N2,L1,A,L2), 上記配列を二分探索で探索してキー値を見つけるまでの探索回数を記録(N1,N2,L1,A,L2,_キー値,1,_探索回数). 上記配列を二分探索で探索してキー値を見つけるまでの探索回数を記録(N1,N2,L1,_キー値,L2,_キー値,_探索回数,_探索回数) :- !. 上記配列を二分探索で探索してキー値を見つけるまでの探索回数を記録(N1,N2,L1,A,L2,_キー値,_探索回数_1,_探索回数) :- _キー値 @< A, 上記配列を二分探索で探索してキー値を見つけるまでの探索回数を記録(N1,L1,_キー値,_探索回数_2), _探索回数 is _探索回数_1 + _探索回数_2,!. 上記配列を二分探索で探索してキー値を見つけるまでの探索回数を記録(N1,N2,L1,A,L2,_キー値,_探索回数_1,_探索回数) :- _キー値 @> A, 上記配列を二分探索で探索してキー値を見つけるまでの探索回数を記録(N2,L2,_キー値,_探索回数_2), _探索回数 is _探索回数_1 + _探索回数_2,!. 二分(_要素数,L,N,N,L1,A,L2) :- 1 is _要素数 mod 2, N is _要素数 // 2, append(L1,[A|L2],L), length(L1,N),!. 二分(_要素数,L,N,N_1,L1,A,L2) :- N is _要素数 // 2, N_1 is N - 1, append(L1,[A|L2],L), length(L1,N),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1258320456/308 # # ・1から2000までの数字が昇順に格納された # 要素2000個の配列を用意 # ・乱数にて1から2000までのキー値を生成し、 # 上記配列を二分探索で探索してキー値を見つけるまでの # 探索回数を記録 # ・以上を1000回繰り返し、平均探索回数を算出 # ・上記の平均探索回数を、理論値log2・2000と比較して示せ # # という宿題を出されたのですが、まるでわかりません。 # よろしくお願いします。 # # '1から2000までの数字が昇順に格納された要素2000個の配列を用意'(L) :- findall(N,for(1,N,2000),L). '1から2000までの数字が昇順に格納された要素2000個の配列を用意し、乱数にて1から2000までのキー値を生成し、上記配列を二分探索で探索してキー値を見つけるまでの探索回数を記録。以上を1000回繰り返し、平均探索回数を算出する'(_探索回数合計) :- '1から2000までの数字が昇順に格納された要素2000個の配列を用意'(L), findsum(_探索回数,( for(1,_,1000), _キー値 is random(2000) + 1, 上記配列を二分探索で探索してキー値を見つけるまでの探索回数を記録(1000,L,_キー値,_探索回数)), _探索回数合計). 上記配列を二分探索で探索してキー値を見つけるまでの探索回数を記録(_要素数,L,_キー値,_探索回数) :- 二分(_要素数,L,N1,N2,L1,A,L2), 上記配列を二分探索で探索してキー値を見つけるまでの探索回数を記録(N1,N2,L1,A,L2,_キー値,1,_探索回数). 上記配列を二分探索で探索してキー値を見つけるまでの探索回数を記録(N1,N2,L1,_キー値,L2,_キー値,_探索回数,_探索回数) :- !. 上記配列を二分探索で探索してキー値を見つけるまでの探索回数を記録(N1,N2,L1,A,L2,_キー値,_探索回数_1,_探索回数) :- _キー値 @< A, 上記配列を二分探索で探索してキー値を見つけるまでの探索回数を記録(N1,L1,_キー値,_探索回数_2), _探索回数 is _探索回数_1 + _探索回数_2,!. 上記配列を二分探索で探索してキー値を見つけるまでの探索回数を記録(N1,N2,L1,A,L2,_キー値,_探索回数_1,_探索回数) :- _キー値 @> A, 上記配列を二分探索で探索してキー値を見つけるまでの探索回数を記録(N2,L2,_キー値,_探索回数_2), _探索回数 is _探索回数_1 + _探索回数_2,!. 二分(_要素数,L,N,N,L1,A,L2) :- 1 is _要素数 mod 2, N is _要素数 // 2, append(L1,[A|L2],L), length(L1,N),!. 二分(_要素数,L,N,N_1,L1,A,L2) :- N is _要素数 // 2, N_1 is N - 1, append(L1,[A|L2],L), length(L1,N),!. % 以下のサイトは # # Prologの集約問題 # 述語体重が定義されている時、各節で定義されているメンバーの # 平均体重を求めるという問題だ。 # # 体重(島田,57). # 体重(服部,65). # 体重(内山,70). % % 最初に最も普通の定義を示す。 体重(島田,57). 体重(服部,65). 体重(内山,70). 平均体重(_平均体重) :- findall(_体重,体重(_,_体重),_メンバーの体重リスト), length(_メンバーの体重リスト,_人数), sum(_メンバーの体重リスト,_体重合計), _平均体重 is _体重合計 / _人数. sum([],0). sum([N|R],Sum) :- sum(R,Sum_1), Sum is N + Sum_1. % % Prologを単位節データとして使用する場合、以下のfindavg/3を使います。 % findavg/3 をライブラリに加えておきます。 % 体重(島田,57). 体重(服部,65). 体重(内山,70). 平均体重(_平均体重) :- findavg(_体重,体重(_,_体重),_平均体重). findavg(_集約項,_項,_算術平均) :- findall(_集約項,_項,_値リスト), sum(_値リスト,_合計値), length(_値リスト,_リストの長さ), _算術平均 is _合計値 / _リストの長さ,!. sum([],0). sum([N|R],Sum) :- sum(R,Sum_1), Sum is N + Sum_1. % % % 次の定義は体重データベースの構造を変更してしまう対処です。 % 定義自体を一引数増やして、有向グラフの述語表現にしてみます。 % 体重(島田,服部,57). 体重(服部,内山,65). 体重(内山,島田,70). 平均体重(_平均体重) :- 体重(_最初の人,_次の人,_最初の人の体重), 合計体重(_次の人,_最初の人,_人数,_合計体重), _平均体重 is _合計体重 / _人数,!. 合計体重(_最初の人,_最初の人,1,_最初の人の体重) :- 体重(_最初の人,_,_最初の人の体重). 合計体重(_前の人,_最初の人,_人数,_合計体重) :- 体重(_前の人,_次の人,_体重), 合計体重(_次の人,_最初の人,_人数_1,_合計体重_1), _合計体重 is _体重 + _合計体重_1, _人数 is _人数_1 + 1. % % 直ぐにわかることは、同姓が出てくると困る。 % それで、普通は名前でノードを構成することはせず、 % 所謂、IDを振ります。この振り方が大問題となりますが。 % ここではIDは a,b,8 を使っています。 % 体重(a,b,島田,57). 体重(b,8,服部,65). 体重(8,a,内山,70). 平均体重(_平均体重) :- 体重(_id,_id_1,_,_体重), 合計体重(_id_1,_id,_人数,_合計体重), _平均体重 is _合計体重 / _人数,!. 合計体重(_id,_id,1,_体重) :- 体重(_id,_,_体重),!. 合計体重(_id_1,_id,_人数,_合計体重) :- 体重(_id_1,_id_2,_,_体重), 合計体重(_id_2,_id,_人数_1,_合計体重_1), _合計体重 is _体重 + _合計体重_1, _人数 is _人数_1 + 1. % % もしIDが1を先頭とする連続した整数であることを維持できるのなら % 体重(1,島田,57). 体重(2,服部,65). 体重(3,内山,70). 平均体重(_平均体重) :- 合計体重(1,_人数,_合計体重), _平均体重 is _合計体重 / _人数. 合計体重(_id,_人数,_合計体重) :- 体重(_id,_,_体重), _id_2 is _id + 1, 合計体重(_id_2,_人数_2,_合計体重_2), _人数 is _人数_2 + 1, _合計体重 is _体重 + _合計体重_2,!. 合計体重(_,0,0). % 以下のサイトは # 出典:: 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/628 # # Mysql5を使っています。以下のようなテーブルがある時、 # ・table_male(カラム:id/name/address) # ・table_female(カラム:id/name/address) # ・table_X(カラム:id/sex_id/sex/unique_key) ※sex_idはtable_male.idもしくはtable_female.id # # クエリA # select `sex`, `sex_id` from table_X where unique_key = $key limit 1; # の結果(sexの値にmaleかfemaleが返る)に応じて # table_maleもしくはtable_femaleからaddressを引き出したいと思います # 今まではクエリAのあとに以下のようにしていたんですが、両方をまとめてやることはできないでしょうか? # select `address` from table_male where `id`=$sex_id limit 1; # # 最初のクエリの取得結果に応じて、続けて実行するクエリの対象テーブルを変更させるということに # なると思うんですが… # よろしくお願いします # # 'select `sex`, `sex_id` from table_X where unique_key = $key limit 1; select `address` from table_male where `id`=$sex_id limit 1;'(_uniqkey,_address) :- table_x(_id,_sexid,_sex,_uniqkey), 'maleテーブルまたはfemaleテーブルを参照する'(_sex,_id,_name,_address). 'maleテーブルまたはfemaleテーブルを参照する'(male,_id,_name,_address) :- table_male(_id,_name,_address),!. 'maleテーブルまたはfemaleテーブルを参照する'(female,_id,_name,_address) :- table_female(_id,_name,_address),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/621 # # ■DBMS名とバージョン # MySQL 5.0 # # ■テーブルデータ # 店舗テーブル # AreaID      int(1)←この2つでキーになってます # TenpoID     int(1)←この2つでキーになってます # uriage       int(16) # # 社員テーブル # SyainNo      int(255) # AreaID       int(1) # TenpoID      int(1) # SyainName    varchar(256) # # ■欲しい結果 # # uriageが5000以下の店舗に属してる社員を抜き出す # のと # その社員をいっぺんに消す # # どのようにSQL文を書けばいいでしょうか? # % % この問題のように、findall/3を使って、単位節データベースから読み取る場合は % 単純にappend/3を使って解を組み上げていくのがよい。 % 'uriageが5000以下の店舗に属してる社員を抜き出す'(_uriageが5000以下の店舗に属してる社員Noと社員名ならび) :- 'uriageが5000以下の店舗'(_uriageが5000以下の店舗ならび), 'uriageが5000以下の店舗に属してる社員を抜き出す'(_uriageが5000以下の店舗,_uriageが5000以下の店舗に属してる社員Noと社員名ならび). 'uriageが5000以下の店舗に属してる社員を抜き出す'([],[]). 'uriageが5000以下の店舗に属してる社員を抜き出す'([[_AreaID,_TempoID]|R1],_uriageが5000以下の店舗に属してる社員Noと社員名ならび) :- 店舗に属してる社員(_AreaID,_TempoID,_店舗に属してる社員Noと社員名ならび), 'uriageが5000以下の店舗に属してる社員を抜き出す'(R1,_uriageが5000以下の店舗に属してる社員Noと社員名ならび_1), append(_店舗に属してる社員Noと社員名ならび,_uriageが5000以下の店舗に属してる社員Noと社員名ならび_1,_uriageが5000以下の店舗に属してる社員Noと社員名ならび). 'uriageが5000以下の店舗'(_uriageが5000以下の店舗ならび) :- findsetof([_AreaID,_TempoID],( 店舗(_AreaID,_TempoID,_uriage), _uriage =< 5000), _uriageが5000以下の店舗ならび). 店舗に属してる社員(_AreaID,_TempID,_店舗に属してる社員Noと社員名ならび) :- findall([_SyainNo,_SyainName],( 社員(_SyainNo,_AreaID,_TempoID,_SyainName)), _店舗に属してる社員Noと社員名ならび). 'uriageが5000以下の店舗に属してる社員を抜き出した上、その社員をいっぺんに消す' :- 'uriageが5000以下の店舗に属してる社員を抜き出す'(_uriageが5000以下の店舗に属してる社員Noと社員名ならび), append(_,[[_SyainNo,_SyainName]|R],_uriageが5000以下の店舗に属してる社員Noと社員名ならび), retract(社員(_SyainNo,_AreaID,_TempoID,_SyainName)), R = []. % findsetof/3 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/614 # # ・DBMS名とバージョン # MySQL # # ・テーブルデータ # 店舗(店舗ID 店舗名) # # 商品(商品ID 店舗ID 商品名) # (※同じ名前の商品が複数の店舗にあっても、別の商品として扱う) # # 売り上げ(売り上げID 商品ID 個数) # # ・欲しい結果 # 店舗名 商品名 売り上げ個数合計 # (※店舗名、商品名でソート) # # ・説明 # SELECT * FROM `店舗` ORDER BY `店舗名`; # この結果をプログラム側でループ # SELECT * FROM 商品 WHERE 店舗ID=? ORDER BY `商品名`; # さらにこの結果をループ # SELECT SUM(個数) FROM 売り上げ WHERE 商品ID=? # # これだと時間がかかりすぎるので、これを1つ、または2つのSQLにまとめたいです。 # # # SELECT *, SUM(`売り上げ`.個数`) AS `売り上げ個数合計` # FROM `商品` # LEFT JOIN `売り上げ` ON `商品`.`商品ID` = `売り上げ`.`商品ID` # WHERE `商品`.`店舗ID`=? # # とりあえず下2つだけでもまとめようとしてみたのですが、合計が商品毎ではなく店舗毎の合計になってしまいます。 # # # '店舗名・商品名を鍵として売り上げ個数合計を集約する'(_店舗名,_商品名,_売り上げ個数合計) :- '店舗名・商品名を鍵ならびとする'(LL1), '店舗名・消費名を鍵に売り上げ個数合計を集約する'(LL1,LL2), member([_店舗名,_商品名,_売り上げ個数合計],LL2). '店舗名・商品名を鍵ならびとする'(LL1) :- findsetof([_店舗名,_商品名],( 店舗(_店舗ID,_店舗名), 商品(_商品ID,_店舗ID,_商品名)), LL1). '店舗名・消費名を鍵に売り上げ個数合計を集約する'(LL1,LL2) :- findall([_店舗名,_商品名,_売り上げ個数合計],( count((member([_店舗名,_商品名],LL1), 店舗(_店舗ID,_店舗名), 商品(_商品ID,_店舗ID,_商品名)),_売り上げ個数合計)), LL2). % findsetof/3 % count/2 % findsum/3 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/591 # # ・RDBMS # MySQL 5.1.6 # # ・テーブルデータ # aji_table //調味料テーブル # rank int(3) //表示順位 NULL許可 # name varchar(16) //調味料の品名 # price int(5) //調味料の値段 # # ・インサートされているデータ # NULL|さとう  |100 # 0   |しお   |200 # 3   |こしょう |300 # NULL|みそ   |400 # NULL|みりん  |500 # # ・欲しい結果 # 0   |しお   |200 # NULL|さとう  |100 # NULL|みそ   |400 # 3   |こしょう |300 # NULL|みりん  |500 # # # ・説明 # お世話になります。 # 上記にある調味料値段データベースにおいて # 表示順をソートする際に # ・順位に数字が入っているものは、一覧表示を行う際にその数字に応じた順位に出す。 # ・それ以外は、値段昇順で出力する。 # # というSELECT文が組めないものかと思っております。 # # 単純に値段順で表示したいんですけど、いくつかの商品は # 表示結果におけるその順番の位置を固定したい!という内容でして # 順位のフィールドをおいてなんとか解決しようとしているのですがうまく組めません。 # # 対応策を是非、ご教授頂ければと思います。 # # なお、そんなテーブルの組み方はダメだ、そういうときはこう組め!等もありましたら # ご教授お願いいたします。 # # # よろしくお願いいたします。 # # '順位に数字が入っているものは、一覧表示を行う際にその数字に応じた順位に、それ以外は、値段昇順で出力する。 単純に値段順で表示したいんですけど、いくつかの商品は表示結果におけるその順番の位置を固定したい'(_表示行) :- '順位に数字が入っているものは、一覧表示を行う際にその数字に応じた順位に'(_表示位置固定ならび), 'それ以外は、値段昇順で'(_表示位置自由ならび), 二つのならびを併合する(0,_表示位置固定ならび,_表示位置自由ならび,_表示ならび), member(_表示行,_表示ならび). '順位に数字が入っているものは、一覧表示を行う際にその数字に応じた順位に'(_表示位置固定ならび) :- findall([_表示位置,_調味料の値段,_調味料の品名],( 調味料テーブル(_表示位置,_調味料の品名,_調味料の値段), _表示位置>=0), _表示位置固定ならび). 'それ以外は、値段昇順で'(_表示位置自由ならび) :- findall([_調味料の値段,_調味料の品名,_表示位置],( 調味料テーブル(_表示位置,_調味料の品名,_調味料の値段), \+(_表示位置>=0)), _鍵順に並べ直した表示位置自由ならび), sort(_鍵順に並べ直した表示位置自由ならび,_整列した表示位置自由ならび), フィールド順を元に戻す(_整列した表示位置自由ならび,_表示位置自由ならび). 二つのならびを併合する(_,L1,[],L1). 二つのならびを併合する(_,[],L2,L2). 二つのならびを併合する(N,[[N,_調味料の品名,_調味料の値段]|R1],L2,[[N,_調味料の品名,_調味料の値段]|R3]) :- N_2 is N + 1, 二つのならびを併合する(N_2,R1,L2,R3),!. 二つのならびを併合する(N,L1,[[_表示位置,_調味料の品名,_調味料の値段]|R2],[[_表示位置,_調味料の品名,_調味料の値段]|R3]) :- N_2 is N + 1, 二つのならびを併合する(N_2,R1,L2,R3). フィールド順を元に戻す([],[]). フィールド順を元に戻す([[_調味料の値段,_調味料の品名,_表示位置]|R1],[[_表示位置,_調味料の品名,_調味料の値段]|R2]) :- フィールド順を元に戻す(R1,R2). % 以下のサイトは # # localtime/8 localtime/9 を定義する # localtime(_年,_月,_日,_曜日,_累計日数,_時,_分,_秒) :- get_time(Time), グリニッヂ時と地域時間の差(_グリニッヂ時との時間差), _地域秒 is truncate(Time) + _グリニッヂ時との時間差, localtime(_地域秒,_年,_月,_日,_曜日,_累計日数,_時,_分,_秒). localtime(_地域秒,_年,_月,_日,_曜日,_累計日数,_時,_分,_秒) :- localtime(1970,0,_地域秒,L), last(L,[_年,_開始秒]), _当年累秒数 is _地域秒 - _開始秒, '_年,_月,_日,_曜日,_累計日数,_時,_分,_秒を計算する'(_当年累積秒,_年,_月,_日,_曜日,_累計日数,_時,_分,_秒),!. localtime(_年,_開始秒,_現在秒,[]) :- _開始秒 > _現在秒,!. localtime(_年,_開始秒,_現在秒,[[_年,_開始秒]|R]) :- 年間秒(_年,_年間秒), _開始秒_2 is _開始秒 + _年間秒, _年_2 is _年 + 1, localtime(_年_2,_開始秒_2,_現在秒,R). 月の年初来の累秒数(_年,_月,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数) :- うるう年(_年), うるう年の月の年初来の累秒数(_年,_月,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数). 月の年初来の累秒数(_年,_月,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数) :- \+(うるう年(_年)), うるう年でない年の月の年初来の累秒数(_年,_月,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数). うるう年の月の年初来の累秒数(_年,_月,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数) :- 月初めの累積日数(_年,_月,[0,31,29,31,30,31,30,31,31,30,31,30],_月初めの累積日数), nth1(_月,[31,29,31,30,31,30,31,31,30,31,30,31,31],_月日数), _月初めの年初来の累秒数 is _月初めの年初来の累秒数 + 86400 * _月初めの累積日数, _月末の年初来の累積秒 is _月初めの年初来の累積秒 + 86400 * _月日数. うるう年でない年の月の年初来の累秒数(_年,_月,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数) :- 月初めの累積日数(_年,_月,[0,31,28,31,30,31,30,31,31,30,31,30],_月初めの累積日数), nth1(_月,[31,28,31,30,31,30,31,31,30,31,30,31,31],_月日数), _月初めの年初来の累秒数 is _月初めの年初来の累秒数 + 86400 * _月初めの累積日数, _月末の年初来の累積秒 is _月初めの年初来の累積秒 + 86400 * _月日数. 月初めの累積日数(_年,_月,_0から始まる月日数ならび,_月初めの累積日数) :- findsum(_日数,( for(1,N,_月), nth1(N,_0から始まる月日数ならび,_日数)), _月初めの累積日数_1), _月初めの累積日数 is truncate(_月初めの累積日数_1). '_年,_月,_日,_曜日,_累計日数,_時,_分,_秒を計算する'(_当年累積秒,_年,_月,_日,_曜日を表す値,_累計日数,_時,_分,_秒) :- '当年累積秒と月初めの年初来の累積秒と月末の年初来の累積秒から_月を得る'(_当年累積秒,_年,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数,_月), '_当年累積秒と_月初めの年初来の累積秒から_月,_日,_時,_分,_秒,を求める'(_当年累積秒,_月初めの年初来の累積秒,_月,_日,_時,_分,_秒), _累積日数 is _月初めの累積日数 + _日 - 1, 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日),!. '当年累積秒と月初めの年初来の累積秒と月末の年初来の累積秒から_月を得る'(_当年累積秒,_年,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数,_月) :- for(1,_月,12), 月初めの年初来の累秒数(_年,_月,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数), _当年累積秒 >= _月初めの年初来の累秒数, _当年累積秒 =< _月末の年初来の累秒数,!. '_当年累積秒と_月初めの年初来の累積秒から_月,_日,_時,_分,_秒,を求める'(_当年累積秒,_月初めの年初来の累積秒,_月,_日,_時,_分,_秒) :- _今月に入っての累積秒数 is _当年累積秒 - _月初めの年初来の累積秒, '_秒数から _日,_時,_分,_秒を求める'(_今月に入っての累積秒数,_日,_時,_分,_秒),!. '_秒数から _日,_時,_分,_秒を求める'(_秒数,_日,_時,_分,_秒) :- 商ならびと剰余ならび(_秒数,[86400,3600,600],[_日,_時,_分],[_,_,_秒]). うるう年(_年文字列) :- atom(_年文字列), atom_to_term(_年文字列,_年整数,_),!, うるう年(_年整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 年間秒(_年,31536000) :- \+(うるう年(_年)),!. 年間秒(_年,31622400) :- うるう年(_年). グリニッヂ時と地域時間の差((-32400)). '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の公式を用いて曜日を得る'(_年月日,_曜日) :- atom(_年月日), atom(_曜日), '曜日'(_年月日,V), !, V = _曜日 . 'Zellerの公式を用いて曜日を得る'(_年月日,_曜日) :- atom(_年月日), var(_曜日), '8桁文字列で表された年月日を整数の年・月・日に分解'(_年月日,_年整数,_月整数,_日整数), 'Zellerの公式を用いて曜日を得る'(_年整数,_月整数,_日整数,_曜日を表す値,_曜日),!. 'Zellerの公式で使う曜日を表す値'(0,'日曜'). 'Zellerの公式で使う曜日を表す値'(1,'月曜'). 'Zellerの公式で使う曜日を表す値'(2,'火曜'). 'Zellerの公式で使う曜日を表す値'(3,'水曜'). 'Zellerの公式で使う曜日を表す値'(4,'木曜'). 'Zellerの公式で使う曜日を表す値'(5,'金曜'). 'Zellerの公式で使う曜日を表す値'(6,'土曜'). '8桁文字列で表された年月日を整数の年・月・日に分解'(_年月日,_年整数,_月整数,_日整数) :- atom_to_term(_年月日,_年月日整数,_), 商ならびと剰余ならび(_年月日整数,[10000,100],[_年整数,_月整数],[_,_日整数]). 商ならびと剰余ならび(_,[],[],[]). 商ならびと剰余ならび(_被除数,[_除数|R2],[_商|R3],[_剰余|R4]) :- 商と剰余(_被除数,_除数,_商,_剰余), 商ならびと剰余ならび(_剰余,R2,R3,R4). 商と剰余(_被除数,_除数,_商,_剰余) :- _商 is _被除数 // _除数, _剰余 is _被除数 mod _除数. % 以下のサイトは ?- '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/569 # # code | val # ------------ # A | 11 # A | 23 # A | 34 # A | 42 # B | 321 # B | 112 # B | 23 # B | 245 # というようなテーブルがあり、ここから # 同じcodeを持つ行が4行以上ある場合、val順で小さい方から3行残してのこりを削除 # したいのですが、SQL一発でできますか?DBMSはMySQLです。 # # ↓ほしい結果 # code | val # ------------ # A | 11 # A | 23 # A | 34 # B | 112 # B | 23 # B | 245 # # '同じcodeを持つ行が4行以上ある場合、val順で小さい方から3行残してのこりを削除したい' :- findsetof(_code,( table(_code,_)), _code候補ならび), append(_,[_code|R],_code候補ならび), 'code毎にvalの小さい順4位以下の組を'(_code,_4位以下の組ならび), '削除する'(_4位以下の組ならび), R = []. 'code毎にvalの小さい順4位以下の組を'(_code,_4位以下の組ならび) :- findall([_val,_code],( table(_code,_val)), L1), sort(L1,L2), 'valの小さい順4位以下の組'(L2,_4位以下の組ならび). 'valの小さい順4位以下の組'([_,_,_|R],R) :- !. 'valの小さい順4位以下の組'(_,[]). 削除する([]). 削除する([[A,B]|R]) :- retract(table(B,A)), 削除する(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/569 # # code | val # ------------ # A | 11 # A | 23 # A | 34 # A | 42 # B | 321 # B | 112 # B | 23 # B | 245 # というようなテーブルがあり、ここから # 同じcodeを持つ行が4行以上ある場合、val順で小さい方から3行残してのこりを削除 # したいのですが、SQL一発でできますか?DBMSはMySQLです。 # # ↓ほしい結果 # code | val # ------------ # A | 11 # A | 23 # A | 34 # B | 112 # B | 23 # B | 245 # # '同じcodeを持つ行が4行以上ある場合、val順で小さい方から3行残してのこりを削除したい' :- findsetof(_code,( table(_code,_)), _code候補ならび), append(_,[_code|R],_code候補ならび), 'code毎にvalの小さい順最大3件'(_code,L), '最大3件を書き戻す'(L), R = []. 'code毎にvalの小さい順最大3件'(_code,L) :- findall([_val,_code],( retract(table(_code,_val))), L1), sort(L1,L2), 'valの小さい順最大3件'(L1,L). 'valの小さい順最大3件'([],[]). 'valの小さい順最大3件'([[A1,B1],[A2,B2],[A3,B3]|_],[[B1,A1],[B2,A2],[B3,A3]]) :- !. 'valの小さい順最大3件'([[A,B]|R1],[[B,A]|R2]) :- 'valの小さい順最大3件'(R1,R2). '最大3件を書き戻す'([]). '最大3件を書き戻す'([[A,B]|R]) :- assertz(table(A,B)), '最大3件を書き戻す'(R). % 以下のサイトは # # Prologという宣言型プログラミング言語にふれる。ルールを定義するという点を除くと、 # 確かにSQL(データに対しこれ欲しいみたいなクエリ)に近しい感じがします。 # ということで、アクセスパス(性能)が気になるのは、命令型に侵されてるからかな? % % Prologの述語の定義節の間では基本的に情報の授受ができません。 % 具体的に示しましょう。 % 成績(阿部,70). 成績(尾崎,55). 成績(山田,90). % と定義されている時、三人の平均点を取りたいとします。(集約問題) ?- 成績(_,_成績). _ = 阿部, _成績 = 70; _ = 尾崎, _成績 = 55; _ = 山田, _成績 = 90; false % というように取得できますが、_ = _尾崎,_成績 = 55が取得できた時には阿部の % 情報は変数の束縛を開放してしまっていますから、利用できません。 % 個々の節が全く独立しているわけですから合計していくことができないことになります。 % ただし、以下のように情報が連鎖するように仕組めば可能になります。 % 成績(阿部,尾崎,70). 成績(尾崎,山田,55). 成績(山田,阿部,90). 成績の平均(_起点,_平均点) :- 成績(_起点,_生徒,_), 成績の合計(_起点,_生徒,_人数,_合計), _平均点 is _合計 / _人数. 成績の合計(_起点,_起点,1,_成績) :- 成績(_起点,_,_成績),!. 成績の合計(_起点,_生徒_1,_人数,_合計) :- 成績(_生徒_1,_生徒_2,_成績), 成績の合計(_起点,_生徒_2,_人数_2,_合計_2), _合計 is _合計_2 + _成績, _人数 is _人数_2 + 1. % と一応はできました。 % 実は集約するために必要な条件は情報の連鎖なのです。 % Prologで扱う連鎖構造の代表にリストがあります。 % ここでも、[70,55,90]というリストが欲しい。 % 成績という述語の節の中にある成績(点数)だけを抜き出してリストとしたい。 % これを実現するfindallというメタ述語がPrologには用意されています。 成績(阿部,70). 成績(尾崎,55). 成績(山田,90). 成績リスト(_成績リスト) :- findall(_成績,成績(_,_成績),_成績リスト). ?- 成績リスト(_成績リスト). _成績リスト = [70,55,90]; false % と成ります。 % % このfindallこそ SQL にそっくりですね。 % 成績の平均(_平均点) :- 成績リスト(_成績リスト), sum(_成績リスト,_合計), length(_成績リスト,_人数), _平均点 is _合計 / _人数. % ただし、sumの定義は sum([],0). sum([N|R],_合計) :- sum(R,_合計_2), _合計 is _合計_2 + N. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/190 # # [1] 授業単元:C言語 # [2] リスト構造を使ったアドレス帳の作成。  # リスト構造で管理し次の機能が実現できること。 # •追加(データの新規登録) # •削除(任意のデータの削除) # •探索(任意のデータの詳細表示) # •一覧表示 # •データのソー扱うデータは氏名、住所、電話番号、eメールアドレス # http://ime.nu/ideone.com/lMgd3 # :- dynamic(アドレス帳/1). 追加(_氏名,_住所,_電話番号,_eメールアドレス) :- retract(アドレス帳(_追加前のアドレス帳)), 追加(_氏名,_住所,_電話番号,_eメールアドレス,_追加前のアドレス帳),!. 追加(_氏名,_住所,_電話番号,_eメールアドレス) :- asserta(アドレス帳([[_氏名,_住所,_電話番号,_eメールアドレス]]). 追加(_氏名,_住所,_電話番号,_eメールアドレス,_現在のアドレス帳) :- member([_氏名,_住所,_電話番号,_eメールアドレス],_現在のアドレス帳), asserta(アドレス帳(_現在のアドレス帳)), writef('追加指定された %t,%t,%t,%t,%t は既に登録されています\n',[_氏名,_住所,_電話番号,_eメールアドレス]),!. 追加(_氏名,_住所,_電話番号,_eメールアドレス,_追加前のアドレス帳) :- asserta(アドレス帳([[_氏名,_住所,_電話番号,_eメールアドレス]|_追加前のアドレス帳]). 削除(_氏名,_住所,_電話番号,_eメールアドレス) :- retract(アドレス帳(_削除前のアドレス帳)), 削除(_氏名,_住所,_電話番号,_eメールアドレス,_削除前のアドレス帳),!. 削除(_氏名,_住所,_電話番号,_eメールアドレス) :- asserta(アドレス帳([])). 削除(_氏名,_住所,_電話番号,_eメールアドレス,_削除前のアドレス帳) :- append(L0,[[_氏名,_住所,_電話番号,_eメールアドレス]|R],_削除前のアドレス帳), append(L0,R,_削除後のアドレス帳), asserta(アドレス帳(_削除後のアドレス帳)),!. 削除(_氏名,_住所,_電話番号,_eメールアドレス,_現在のアドレス帳) :- asserta(アドレス帳(_現在ののアドレス帳)), writef('指定された %t,%t,%t,%t で削除するべきアドレスは発見できませんでした\n',[_氏名,_住所,_電話番号,_eメールアドレス,_現在のアドレス帳]). 探索(_鍵項目ならび) :- list(_鍵項目ならび), 探索組生成(_鍵項目ならび,_組), 組表示(_組). 探索(_鍵項目,_鍵の値) :- 検索組生成(_鍵項目,_鍵の値,_組), 組表示(_組). 一覧表示 :- アドレス帳(_アドレス帳), writef('%20r,%32r,%14r,%64l\n',[氏名,住所,電話番号,eメールアドレス]), append(_,[[_氏名,_住所,_電話番号,_eメールアドレス]|R],_アドレス帳), writef('%20r,%32r,%14r,%64l\n',[_氏名,_住所,_電話番号,_eメールアドレス]), R = []. 探索組生成([],_). 探索組生成([[_鍵,_鍵の値]|R],_組) :- 検索組生成(_鍵,_鍵の値,_組), 探索組生成(R,_組). 検索組生成(氏名,_鍵の値,[_鍵の値,_,_,_]). 検索組生成(住所,_鍵の値,[_,_鍵の値,_,_]). 検索組生成(電話番号,_鍵の値,[_,_,_鍵の値,_]). 検索組生成(eメールアドレス,_鍵の値,[_,_,_,_鍵の値]). 組表示(_組) :- アドレス帳(_アドレス帳), append(_,[_組|R],_アドレス帳), writef('%t,%t,%t,%t\n',_組), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/668 # # [1] 授業単元:ソート # [2] 問題文(含コード&リンク): # 1. savadata.txt内にあるデータを読み取り、名前順にソートして # 全員分のLEVEL、PLAYER NAME、POINTを表示するプログラムを # 作成せよ. # # 2. savadata.txt内にあるデータを読み取り、レベル別にPOINTが上位3人までのPlayerNameとそのPOINTおよび # レベル別の全体の平均点(Average)を表示させるプログラムを作成せよ. # # 出力例) # ■EASY # Rank1 : Tanaka 1000 POINT # Rank2 : Onishi 875 POINT # Rank3 : KItano 685 POINT # Average : 256 POINT # # ■Normal # Rank1 : Kuriyama 900 POINT # Rank2 : Onishi 775 POINT # Rank3 : KItano 605 POINT # Average : 232 POINT # # savedata.txt # http://ime.nu/www.kent-web.com/pubc/book/test/uploader/uploader.cgi?mode=downld&no=5099 # # HARD Ichihashi 230 # HARD Tanaka 170 # HELL Nakamura 10 # EASY kanzaki 130 # HARD Ichihashi 20 # VERY HARD Tamura 570 # HELL Ishii 1000 # EASY kanagawa 200 # HARD Kuriyama 250 # DETH Takeda 180 # HELL Nakanishi 10 # NORMAL kamida 450 # HARD Iguchi 290 # VERY HARD Tanaka 370 # DETH Murata 800 # VERY HARD THirano 290 # HARD Kanemoto 230 # NORNAL Yano 110 # HELL Kuji 10 # EASY Arai 130 # EASY Hamada 20 # VERY HARD Satoh 120 # NORNAL ishimura 900 # EASY Ushijima 200 # HARD Kumada 230 # NORNAL Nasuno 820 # HELL Hashimoto 0 # EASY Kim 130 # HARD John 20 # VERY HARD Kimura 170 # HARD Nishioka 470 # NORNAL Honda 400 # 'savadata.txt内にあるデータを読み取り、名前順にソートして全員分のLEVEL、PLAYER NAME、POINTを表示する' :- 'savadata.txt内にあるデータを読み取り'(LL), '名前順にソートして全員分のLEVEL、PLAYER NAME、POINTを表示する'(LL). 'savadata.txt内にあるデータを読み取り'(LL) :- get_lines('savadata.txt',Lines), Lines = [_見出し|_実データならび], '各行をLEVEL,PLAYER NAME,POINTに分割する'(1,_実データならび,LL). '各行をLEVEL,PLAYER NAME,POINTに分割する'(_,[],[]). '各行をLEVEL,PLAYER NAME,POINTに分割する'(N,[_行|R1],[[N,_LEVEL,_PLAYER_NAME,_POINT]|R2]) :- split(_行,[' ','\t'],L), 'LEVEL,PLAYER NAME,POINTに分割する'(L,_LEVEL,_PLAYER_NAME,_POINT), N2 is N + 1, '各行をLEVEL,PLAYER NAME,POINTに分割する'(N2,R1,R2). 'LEVEL,PLAYER NAME,POINTに分割する'(['VERY','HARD',_PLAYER_NAME,_POINT],'VERY HARD',_PLAYER_NAME,_POINT). 'LEVEL,PLAYER NAME,POINTに分割する'([_LEVEL,_PLAYER_NAME,_POINT],_LEVEL,_PLAYER_NAME,_POINT). '名前順にソートして全員分のLEVEL、PLAYER NAME、POINTを表示する'(LL) :- 名前を順に(LL,LL1), ソートして(LL1,LL2), '全員分のLEVEL、PLAYER NAME、POINTを表示する'(LL2,LL). 名前を順に(LL,LL1) :- '鍵(名前)と行番号の対を作る'(LL,LL1). '鍵(名前)と行番号の対を作る'(LL,LL1) :- findall([_NAME,_行位置],( member([_行位置,_LEVEL,_PLAYER_NAME,_POINT],LL)), LL1). ソートして(LL1,LL2) :- 整列(LL1,LL2). '全員分のLEVEL、PLAYER NAME、POINTを表示する'(LL1,LL) :- append(_,[[_,_行番号]|R],LL1), nth1(_行番号_1,LL,[_,_LEVEL,_PLAYER_NAME,_POINT]), writef('%t %t %t\n',[_LEVEL,_PLAYER_NAME,_POINT]), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/650 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 出席番号、算数、国語、社会の点数(適当で)からできている成績データを # 読み込み、各生徒の3科目の平均点と最高点を算出して、それを各生徒の # データとして加え、3科目の平均点の順番にソートするプログラムを # 選択ソートでかきなさい。 # '出席番号、算数、国語、社会の点数(適当で)からできている成績データを読み込み、各生徒の3科目の平均点と最高点を算出して、それを各生徒のデータとして加え、3科目の平均点の順番にソートする'(_成績データファイル,_3科目の平均点の順ならび) :- '出席番号、算数、国語、社会の点数(適当で)からできている成績データを読み込み'(LL), '各生徒の3科目の平均点と最高点を算出して、それを各生徒のデータとして加え'(LL,LL2), '3科目の平均点の順番にソートする'(LL2,_3科目の平均点の順ならび). '出席番号、算数、国語、社会の点数(適当で)からできている成績データを読み込み'(LL) :- get_split_lines(_成績データファイル,[','],LL). '各生徒の3科目の平均点と最高点を算出して、それを各生徒のデータとして加え'(LL,LL2) :- findall(L2,( member([_出席番号|L],LL), 平均(L,_平均点), 最大値(L,_最高点), append([_出席番号|L],[_平均点,_最高点],L2)), LL2). '3科目の平均点の順番にソートする'(LL2,_3科目の平均点の順ならび) :- '3科目の平均点を鍵として行頭に付加する'(LL2,LL3), 逆順整列(LL3,LL4), '付加した整列鍵を削除する'(LL4,_3科目の平均点の順ならび). '3科目の平均点を鍵として行頭に付加する'(LL2,LL3) :- findall([_平均点|L],( member(L,LL2), append(_,[_平均点,_],L)), LL3). '付加した整列鍵を削除する'(LL4,_3科目の平均点の順ならび) :- findall(L,( member([_|L],LL4)), _3科目の平均点の順ならび). 逆順整列(L1,L2) :- sort(L1,L3), reverse(L3,L2). 平均(L,_平均) :- length(L,Len), sum(L,_合計), _平均 is _合計 / Len. 最大値([A|R],_最大値) :- append(_,[B|R2],R), B @> A, 最大値([B|R2],_最大値),!. 最大値([_最大値|_],_最大値). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/526 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):このスレの../test/read.cgi/tech/1325685876/464と同じ質問ですhttp://ime.nu/2ch.ac.la/read.php/tech/1201083176/ # # 「8名分の氏名、学籍番号、身長の入力を構造体の配列を利用して行い、 # それらのデータをクイックソートし身長の低い順に氏名、学籍番号、身長を # 画面に出力するプログラムを作成せよ」という問題がでました。 '8名分の氏名、学籍番号、身長の入力を構造体の配列を利用して行い、それらのデータをクイックソートし身長の低い順に氏名、学籍番号、身長を画面に出力するプログラムを作成せよ' :- '8名分の氏名、学籍番号、身長の入力を構造体の配列を利用して行い'(_入力されたならび), '整列の鍵項目(身長)を先頭に付加する'(_入力されたならび,_鍵の付加されたならび), 整列(_鍵の付加されたならび,_整列されたならび), '身長の低い順に氏名、学籍番号、身長を画面に出力する'(_整列されたならび). '8名分の氏名、学籍番号、身長の入力を構造体の配列を利用して行い'(_入力されたならび) :- length(_入力されたならび,8), findall([_氏名,_学籍番号,_身長],( append(_,[L|_],_入力されたならび), '氏名・学籍番号・身長を得る'(_氏名,_学籍番号,_身長)), _入力されたならび). '氏名・学籍番号・身長を得る'(_氏名,_学籍番号,_身長) :- 催促付き入力('氏名を入力してください : ',_氏名), 催促付き入力('学籍番号を入力してください : ',_学籍番号), 催促付き入力('身長を入力してください : ',_身長文字列), atom_to_term(_身長文字列,_身長,_). '整列の鍵項目(身長)を先頭に付加する'(_入力されたならび,_鍵の付加されたならび) :- findall([_身長,_氏名,_学籍番号,_身長],( member([_氏名,_学籍番号,_身長],_入力されたならび)), _鍵の付加されたならび). 整列([],[]). 整列([_軸要素|R1],_整列されたならび) :- 分割(_軸要素,R1,_軸要素より小さい要素ならび,_軸要素と等しいか大きい要素ならび), 整列(_軸要素より小さい要素ならび,_整列した軸要素より小さい要素ならび), 整列(_軸要素と等しいか大きい要素ならび,_整列した軸要素と等しいか大きい要素ならび), append(_整列した軸要素より小さい要素ならび,[_軸要素|_整列した軸要素と等しいか大きい要素ならび],_整列されたならび). 分割(_,[],[],[]). 分割(_軸要素,[A|R1],[A|R2],R3) :- A @< _軸要素, 分割(_軸要素,R1,R2,R3). 分割(_軸要素,[A|R1],R2,[A|R3]) :- A @>= _軸要素, 分割(_軸要素,R1,R2,R3). '身長の低い順に氏名、学籍番号、身長を画面に出力する'(_整列されたならび) :- append(_,[[_身長,_氏名,_学籍番号,_身長]|R],_整列されたならび), writef('%t, %t, %t\n',[_氏名,_学籍番号,_身長]), R = []. % 以下のサイトは # # データセット # date # 2001-10-19 # 2001-10-19 # 2003-12-7 # 2004-9-7 # .... # # といったidと日付の集まりがあります。日付は重複しています。 # ここから,SELECT count(date) FROM table GROUP BY dateで日付ごとの集計が # とれたのですが、さらにmaxを使って集計が最大の日の日付とカウント数を # 出したいのですがうまくいきません。 # 上の例では、2001-10-19,2というのを取りたいのですが、どうやったらいいんでしょうか? '集計が最大の日の日付とカウント数'(_日付,_度数) :- findsetof(_日付,( データセット(_日付)), _日付ならび), member(_日付,_日付ならび), count(データセット(_日付),_度数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/516 # # [1] 授業単元:キーボード入力 # [2] 問題文(含コード&リンク): # 打ち込む文章を表示して,それをユーザがそっくりに打ち込ませ # その正確さを判定するプログラムを作成せよ. # '打ち込む文章を表示して,それをユーザにそっくりに打ち込ませその正確さを判定する' :- 打ち込む文章を表示して(_打ち込む文章ファイル,_打ち込む文章), それをユーザにそっくりに打ち込ませ(_ユーザの打ち込んだ文章), その正確さを判定する(_打ち込む文章,_ユーザの打ち込んだ文章,_減点数,_正確さの判定), 判定を表示する(_減点数,_正確さの判定). 打ち込む文章を表示して(_打ち込む文章ファイル,_打ち込む文章) :- get_lines(_打ち込む文章ファイル,Lines), append(_,[_打ち込む文章|_],Lines), writef('%t\n',[_打ち込む文章]). それをユーザにそっくりに打ち込ませ(_ユーザの打ち込んだ文章) :- get_line(_ユーザの打ち込んだ文章). その正確さを判定する(_打ち込む文章,_ユーザの打ち込んだ文章,_減点数,_正確さの判定). atom_chars(_打ち込む文章,_打ち込む文章の文字ならび), atom_chars(_ユーザの打ち込んだ文章,_ユーザの打ち込んだ文章の文字ならび), 語彙判定(_打ち込む文章,_ユーザの打ち込んだ文章,_同一語彙数判定), 誤字脱字等判定(_打ち込む文章の文字ならび,_ユーザの打ち込んだ文章の文字ならび,_誤字脱字度数判定), 総合判定(_同一語彙数判定,_誤字脱字度数判定,_減点数,_正確さの判定). 同一語彙数判定(_打ち込む文章,_ユーザの打ち込んだ文章,_同一語彙数判定) :- 形態素解析(_打ち込む文章,_形態素解析_1), 形態素解析(_ユーザの打ち込んだ文章,_形態素解析_2), 語彙の出現数の差異(_形態素解析_1,_形態素解析_2,_語彙の出現数差異度数), _同一語彙数判定 is (-1) * 2 * _語彙の出現数差異度数. 語彙の出現数の差異(_形態素解析_1,_形態素解析_2,_語彙の出現数の差異度数) :- setof(_形態素,member(_形態素,_形態素解析_1),_整列した形態素), findall(_出現数差異,( member(_形態素,_整列した形態素), count(member(_形態素,_形態素解析_1),_度数_1), count(member(_形態素,_形態素解析_2),_度数_2), _出現数差異 is abs(_度数_1 - _度数_2)), _語彙の出現数の差異ならび), sum(_語彙の出現数の差異ならび,_語彙の出現数の差異度数). 誤字脱字等判定(_打ち込む文章の文字ならび,_ユーザの打ち込んだ文章の文字ならび,_誤字脱字度数判定) :- 誤字脱字度数(_打ち込む文章の文字ならび,_ユーザの打ち込んだ文章の文字ならび,_誤字脱字数ならび), findall(_文字数,( member([_,_文字数],_誤字脱字数ならび)), _誤字脱字文字数ならび), sum(_誤字脱字文字数ならび,_誤字脱字度数), _誤字脱字数判定 is (-1) * _誤字脱字度数. 誤字脱字度数([],[],[]). 誤字脱字度数([A,B|R1],[B|R2],[[脱字,1]|R3]) :- \+(A == B), 誤字脱字度数(R1,R2,R3). 誤字脱字度数([B|R1],[A,B|R2],[[誤字挿入,1]|R3]) :- \+(A == B), 誤字脱字度数(R1,R2,R3). 誤字脱字度数([A,B|R1],[C,B|R2],[[誤字,1]|R3]) :- \+(A == C), 誤字脱字度数(R1,R2,R3). 誤字脱字度数([A|R1],[A|R2],R3) :- 誤字脱字度数(R1,R2,R3). 総合判定(_同一語彙数判定,_誤字脱字度数判定,_減点数,_正確さの判定) :- _減点数 is _同一語彙数判定 + _誤字脱字度数判定, 分類判定(_減点数,_正確さの判定). 分類判定(0,'1級'). 分類判定(_減点数,'2級') :- _減点数 < 0, _減点数 >= (-3). 分類判定(_減点数,'3級') :- _減点数 < (-3), _減点数 >= (-7). 分類判定(_減点数,'4級') :- _減点数 < (-7), _減点数 >= (-12). 分類判定(_減点数,'5級') :- _減点数 < (-12). 判定を表示する(_減点数,_正確さの判定) :- writef('入力された文章の正確さ判定は誤り減点数 %t で %t です。\n',[_減点数,_正確さの判定]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/729 # # 【 課題 】<プログラムの仕様> # ・N人の、M科目の成績が書かれたCSVファイルを読み込む # ・平均点、最高点、最低点、度数分布を各科目毎に出力する # ・各科目、総合点のランキングリストを出力する # ・成績の処理結果をテキストファイルに出力する # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI  】4. 制限なし # 【 期限 】1/26(木) 20:00 # 【 Ver  】java version "1.7.0" # 【 補足 】http://ime.nu/www1.axfc.net/uploader/Sc/so/311237.zip #       上記のリンクが、課題のCSVファイルと、 #       参考資料としてあげられていたCSVファイルの読み込み・書き込みを行うプログラムです。 #       CSVファイルは編集してはならないとのことです。 #       CSVファイルは、左から順番に、 #       「国語」「数学」「英語」「社会」「理科」「美術」「工芸」「書道」「音楽」「体育」の科目で、 #       上から順番に「生徒1」「生徒2」・・・「生徒100」となっております。 #       よろしくお願いいたします。 # '・N人の、M科目の成績が書かれたCSVファイルを読み込む ・平均点、最高点、最低点、度数分布を各科目毎に出力する ・各科目、総合点のランキングリストを出力する ・成績の処理結果をテキストファイルに出力する'(_CSVファイル,_書き込みテキストファイル) :- get_split_lines(_CSVファイル,[','],LL), 転置(LL,_転置LL), '平均点、最高点、最低点、度数分布を各科目毎に集約する'([国語,数学,英語,社会,理科,美術,工芸,書道,音楽,体育],_転置LL,_集約リスト), 総合点のランキングリスト(LL,_総合点のランキングリスト), 出力する(_書き込みテキストファイル,_集約リスト,_総合点のランキングリスト). '平均点、最高点、最低点、度数分布を各科目毎に集約する'([],[],[]). '平均点、最高点、最低点、度数分布を各科目毎に集約する'([_科目|R1],[_列|R2],[[_科目,_平均点,_最高点,_最低点,_度数分布,_ランキングリスト]|R3]) :- 最高点(_列,_最高点), 最低点(_列,_最低点), 平均点(_列,_平均点), 度数分布(_列,_度数分布), 科目毎のランキングリスト(_列,_ランキングリスト), '平均点、最高点、最低点、度数分布を各科目毎に集約する'(R1,R2,R3). 総合点のランキングリスト(LL,_ランキングリスト) :- 総合点集約(1,LL,LL1), sort(LL1,LL2), reverse(LL3,_ランキングリスト). 総合点集約(_,[],[]). 総合点集約(N,[_行|R1],[[_合計点,N]|R2]) :- sum(_行,_合計点), N2 is N + 1, 集合点集約(N2,R1,R2). 度数分布(_列,_度数分布) :- findall(_度数,( member([_点数下限,_点数上限],[[0,19],[20,39],[40,59],[60,79],[80,100]]), count(( member(_点数,_列), _点数 >= _点数下限, _点数 =< _点数上限), _度数分布). 科目毎のランキングリスト(_列,_ランキングリスト), 整列用ランキングリスト(1,_列,_整列用ランキングリスト), sort(_整列用ランキングリスト,_整列済みランキングリスト), reverse(_整列済みランキングリスト,_ランキングリスト). 整列用ランキングリスト(_,[],[]). 整列用ランキングリスト(N,[_得点|R1],[[_得点,N]|R2]) :- N2 is N + 1, 整列用ランキングリスト(N2,R1,R2). 出力する(_書き込みテキストファイル,_集約リスト,_総合点のランキングリスト) :- open(_書き込みテキストファイル,write,Outstream), 科目別項目の書き込み(Outstream,_集約リスト), 総合点のランキングの書き込み(Outstream,_総合点ランキングリスト), close(Outstream). 科目別項目の書き込み(Outstream,_集約リスト) :- append(_,[[_科目,_平均点,_最高点,_最低点,_度数分布,_ランキングリスト]|R],_集約リスト), writef(Outstream,'科目 %t\n',[_科目]), writef(Outstream,'平均点 %4r\n最高点 %4r\n最低点 %4r\n',[_平均点,_最高点,_最低点]), writef(Outstream,'0~19点 %4r\n20~39点 %4r\n40~59点 %4r\n60~79点 %4r\n80~100点 %4r\n',_度数分布), write('%tランキングリスト\n',[_科目]), ランキングリストの書き込み(Outstream,_ランキングリスト), R = []. ランキングリストの書き込み(Outstream,_ランキングリスト) :- ランキングリストの書き込み(Outstream,1,1,_ランキングリスト). ランキングリストの書き込み(Outstream,_,_,[]) :- !. ランキングリストの書き込み(Outstream,_順位,_順位_1,[[_得点,_生徒番号_1],[_得点,_生徒番号_2]|R]) :- writef(Outstream,'%4r 生徒%2l %4r\n',[_順位,_生徒番号_1,_得点]), _順位_2 is _順位_1 + 1, ランキングリストの書き込み(Outstream,_順位,_順位_2,[[_得点,_生徒番号_2]|R]). ランキングリストの書き込み(Outstream,_順位,_順位_1,[[_得点,_生徒番号]|R]) :- write(Outstream,N1,N2,'科目毎ランキング\n'), writef(Outstream,'%4r 生徒%2l %4r\n',[_順位,_生徒番号,_得点]), _順位_2 is _順位_1 + 1, ランキングリストの書き込み(Outstream,_順位_2,_順位_2,R). 総合点のランキングの書き込み(Outstream,_総合点ランキングリスト) :- write('総合点ランキング\n'), ランキングリストの書き込み(Outstream,_総合点ランキングリスト). % 以下のサイトは バイナリファイル (標準入力) に一致しました % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/727 # # 【 課題 】 名前、生年月日、電話番号、メールアドレスと入った一文が複数あるファイルがある。 # このファイルを読み込み生年月日順にソートして表示せよ。 # ただし生年月日は和暦に変換して表示する。 # 【 形態 】1. Javaアプリケーション(main()で開始 # 【 GUI  】4. 制限なし # 【 期限 】1月23日 《必須》 # 【 Ver  】java version "1.6.0_21" # 【 用語 】数学用語、専門用語の意味、説明を書きます。 《あれば必須》 # 【 補足 】ファイルは各自で用意します。 # 例 田中一郎、1887/05/08、123-456-789、tanaka_ichiro@aa.jp # よろしくお願いします。 # # ' 名前、生年月日、電話番号、メールアドレスと入った一文が複数あるファイルがある。このファイルを読み込み生年月日順にソートして表示せよ。ただし生年月日は和暦に変換して表示する。'(_ファイル) :- get_split_lines(_ファイル,['、'],LL), 整列鍵を先頭に付加する(LL,LL1), 整列(LL1,LL2), 西暦和暦変換をしながら表示する(LL2). 整列鍵を先頭に付加する(LL,LL1) :- findall([_生年月日,_名前,_生年月日,_電話番号,_メールアドレス],LL), member([_名前,_生年月日,_電話番号,_メールアドレス],LL)), LL1). 西暦和暦変換をしながら表示する(LL) :- append(_,[[_,_生年月日,_名前,_生年月日,_電話番号,_メールアドレス]|R],LL), 西暦を和暦に変換する(_生年月日,_和暦表示生年月日), concat_atom([_生年月日,_名前,_生年月日,_電話番号,_メールアドレス],'、',_表示行), writef('%t\n',[_表示行]), R = []. 西暦を和暦に変換する(_生年月日,_和暦表示生年月日) :- split(_生年月日,[/],[_年,_月,_日]), 西暦年を和暦年に変換する(_年,_和暦年表示), concat_atom([_和暦年表示,_月,月,_日,_日],_和暦表示生年月日). 西暦年を和暦年に変換する(_年,_和暦年表示) :- _年 > 1867, _年 < 1912, _和暦年 is 1867 + _年, concat_atom([明治,_和暦年,年],_和暦年表示). 西暦年を和暦年に変換する(_年,_和暦年表示) :- _年 > 1911, _年 < 1926, _和暦年 is 1911 + _年, concat_atom([大正,_和暦年,年],_和暦年表示). 西暦年を和暦年に変換する(_年,_和暦年表示) :- _年 > 1925, _年 < 1989, _和暦年 is 1926 + _年, concat_atom([昭和,_和暦年,年],_和暦年表示). 西暦年を和暦年に変換する(_年,_和暦年表示) :- _年 > 1988, _和暦年 is 1988 + _年, concat_atom([平成,_和暦年,年],_和暦年表示). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/204 # # [1] 授業単元:計算機アルゴリズム # [2] 問題文(含コード&リンク): # ttp://www.dotup.org/uploda/www.dotup.org2509145.txt.html # # # 設問1 # 構造体を使って、各自の所有している本のうち5点を textbook[5] で宣言せよ。 # メンバーは少なくとも次のものを含んでいるとする。それぞれのメンバーの型は各自で決めること。 # # ・著者 ・書名 ・出版社 ・発行年 ・定価 # # 設問1-1 # 次の(?)、(?)の機能をもった1つのプログラムを作成せよ。 # (?)5冊の本のメンバーをすべて書き出す機能 # (?)5冊の本の定価の合計を求める機能 # # 但し、あらかじめプログラム「メモ帳」等で作成したファイル「info.txt」から、 # 著者、書名、出版社、発行年、定価を読み込むものとする。 # ファイル「info.txt」には下記のように著者、書名、出版社、発行年、定価が # 記述されているものとする。 # # ファイル「info.txt」の記述例: # 森泰親 制御工学(大学講義シリーズ) コロナ社 2001 2800 # 木村英紀 制御工学の考え方(ブルーバックス) 講談社 2002 880 # … # # ファイルinfo.txt # ttp://www.dotup.org/uploda/www.dotup.org2509138.txt.html # '各自の所有している本のうち5点をで宣言する' :- get_split_lines('info.txt',[' '],LL), append(_,[[_著者,_書名,_出版社,_発行年,_定価]|R],LL), assertz(本(_著者,_書名,_出版社,_発行年,_定価)), R = []. '5冊の本のメンバーをすべて書き出す' :- 本(_著者,_書名,_出版社,_発行年,_定価), writef('%t %t %t %t %t\n',[_著者,_書名,_出版社,_発行年,_定価]), fail. '5冊の本のメンバーをすべて書き出す'. '5冊の本の定価の合計を求める' :- findsum(_定価,( 本(_著者,_書名,_出版社,_発行年,_定価)), _定価の合計), writef('定価の合計は %t です\n',[_定価の合計]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/26 # # 問題:4桁の数字が与えられたとき、その4個の数字で組み合わせって、作れる? # 1001 ならば 0011,0101,0110,1001,1010,1100 が出来るなど。 # 言語・コンパイラ:C gcc # '4桁の数字が与えられたとき、その4個の数字の組み合わせ'(_4桁の数字,_4個の数字の組み合わせ) :- atom_chars(_4桁の数字,Chars), setof(X,順列(Chars,4,X),_4個の数字の組合せ). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/411 # # 質問です。DBはSQLite3です。 # 構成が同じなので../test/read.cgi/db/1316769778/244のテーブルを説明に使わせてもらいます # # shop # id name # 1 Aカンパニー # 2 Bカンパニー # 3 Cカンパニー # # area # 1 北海道 # 2 青森 # 3 岩手 # 4 秋田 # # shop_area # shop_id area_id # 1 1 # 1 2 # 1 3 # 2 2 # 2 4 # 3 2 # 3 3 # # # 北海道なら、Bカンパニー・Cカンパニー # 青森なら、無し # 岩手なら、Bカンパニー # 秋田なら、Aカンパニー・Cカンパニー # 北海道・秋田なら、Cカンパニー # # 除外検索の要領で、対象の支社が無い会社を呼び出したい時はどうすればよいのでしょうか # '除外検索の要領で、対象の支社が無い会社を呼び出す' :- '除外検索の要領で、対象の支社が無い会社を呼び出す'(_地域ならび,_対象の支社が無い会社ならび), concat_atom(_地域ならび,'・',S1), concat_atom(_対象の支社が無い会社ならび,'・',S2), writef('%tなら、%t\n',[S1,S2]), fail. '除外検索の要領で、対象の支社が無い会社を呼び出す'. '除外検索の要領で、対象の支社が無い会社を呼び出す'(_地域ならび,_対象の支社が無い会社ならび) :- findall([_area_name,_対象の支社が無い会社ならび],( '対象の支社が無い会社を呼び出す'(_area_name,_対象の支社が無い会社ならび)), L1), findsetof(_対象の支社が無い会社ならび,( append(_,[[_,_対象の支社が無い会社ならび]|_],L1)), _対象の支社が無い会社ならびパターン), append(_,[_対象の支社が無い会社ならび|_],_対象の支社が無い会社ならびパターン), findall(_area_name,( append(_,[[_area_name,_対象の支社が無い会社ならび]|_],L1)), _地域ならび). '対象の支社が無い会社を呼び出す'(_area_name,_対象の支社が無い会社ならび) :- area(_area_id,_area_name), findsetof([_shop_id,_name],( shop_area(_shop_id,_area_id), shop(_shop_id,_name)), L1), findall(_name,( append(_,[[_shop_id,_name]|_],L1), \+(shop_area(_shop_id,_area_id))), _対象の支社が無い会社ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/365 # # ・DB名:Firebird1.03 # ・テーブル #  ■メイン #   受注番号 受注日 注文社 #   11    2011/12/20 A社 #   12    2011/12/21 B社 #  ■サブ #   連番 受注番号 商品コード 数 #   50  11    A10    100 #   51  11    C30    20 #   52  12    A10    10 #  ■商品 #   商品コード 商品名 カテゴリ 納品番号(商品ごとで重複していません) #   A10     コート 洋服   100 #   C30     帯   和服   504 # # メインの受注番号とサブの受注番号、サブの商品コードと商品の商品コードで # リンクしています。 # # 欲しい結果 # 受注日の期間(いつからいつまで)と、商品のカテゴリと納品番号で、 # 受注の全内容(商品)が知りたいです。 # 受注日:2011/12/01から12/31まで # カテゴリ:洋服 納品番号:100で検索をして # # 受注番号 受注日 注文者 商品コード 商品名 数量 # 11    2011/12/20 A社 A10    コート 100 # 11    2011/12/20 A社 C30    帯   20----★ # 12    2011/12/21 B社 A10    コート 10 # ★受注の全内容が知りたいので、該当する受注番号のサブはすべて表示 # したい。メインの内容は重複表示となります。 # # 丸投げですみませんが、どなたかSQL文をお願いできませんでしょうか。 # テーブルが3つになるとどうしてよいものかわからないです。 # よろしくお願いします。 # # # '受注日の期間(いつからいつまで)と、商品のカテゴリと納品番号で、受注の全内容(商品)が知りたい'(_受注日下限,_受注日上限,_商品カテゴリ,_納品番号) :- 受注番号候補を得る(_受注日下限,_受注日上限,_カテゴリ,_納品番号,_受注番号ならび), findall([_受注番号,_受注日,_注文者,_商品コード,_商品名,_数量],( append(_,[_受注番号|_],_受注番号ならび), 受注番号を鍵にデータベースからの選択(_受注番号,_受注日,_注文者,_商品コード,_商品名,_数量)), LL1), 整列(LL1,LL2), 表示する(LL2). 受注番号候補を得る(_受注日下限,_受注日上限,_カテゴリ,_納品番号,_受注番号ならび) :- findsetof(_受注番号,( メイン(_受注番号,_受注日,_注文社), _受注日 @>= _受注日下限, _受注日 @=< _受注日上限, サブ(_連番,_受注番号,_商品コード,_数量), 商品(_商品コード,_商品名,_カテゴリ,_納品番号)), _受注番号ならび). 受注番号を鍵にデータベースを結合(_受注番号,_受注日,_注文者,_商品コード,_商品名,_数量) :- メイン(_受注番号,_受注日,_注文社), サブ(_連番,_受注番号,_商品コード,_数量), 商品(_商品コード,_商品名,_カテゴリ,_納品番号). 表示する(LL) :- write('受注番号 受注日 注文者 商品コード 商品名 数量\n'), append(_,[[_受注番号,_受注日,_注文者,_商品コード,_商品名,_数量]|R],LL), writef('%10l %8l %8c %8c %8c %14l %8r\n',[_受注番号,_受注日,_注文者,_商品コード,_商品名,_数量]), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/353 # # MySQL 5.1 # 株価テーブル kabuka # stock_code ←銘柄コード # vol_date ←出来高年月日 # sp # hp # lp # cp # vol # # 銘柄マスタ stock_info # stoc_code ←銘柄コード # shkbn ←商品区分(0,1,2,3,4) # stk_name ← 銘柄名 # delete_flg 削除区分 # 〜その他いろいろな項目 # # 銘柄マスタの商品区分0及び1は除外して銘柄名を付けて株価テーブルから銘柄ごとの最古登録日と最新登録日の一覧を出したい # # select a.stock_code,stk_name,shkbn,min(vol_date),max(vol_date) # from kabuka a # inner join stock_info b # on a.stock_code = b.stock_code # where # a.stock_code in # (select b.stock_code from stock_info # where delete_flg=0 and shkbn not in(0,4)) # group by a.stock_code # order by shkbn,a.stock_code; # # で、上記のSQLを書いてみたんですが、shkbnが0及び4のもでてしまいます # 出さないようにするにはどうすればいいのでしょうか? # # '銘柄マスタの商品区分0及び1は除外して銘柄名を付けて株価テーブルから銘柄ごとの最古登録日と最新登録日の一覧を出したい' :- '銘柄マスタの商品区分0及び1は除外して銘柄名を付けて'(_銘柄,_銘柄名,R), '株価テーブルから銘柄ごとの最古登録日と最新登録日の一覧を出したい'(_銘柄,_銘柄名), R = []. '銘柄マスタの商品区分0及び1は除外して銘柄名を付けて'(_銘柄,_銘柄名,R) :- findsetof([_stoc_code,_stk_name],( stock_info(_stoc_code,_shkbn,_stk_name,_delete_flg), \+(_shkbn==0), \+(_shkbn==1)), LL), append(_,[[_銘柄,_銘柄名]|R],LL). '株価テーブルから銘柄ごとの最古登録日と最新登録日の一覧を出したい'(_stock_code,_銘柄名) :- findmin(_vol_date,kabuka(_stock_code,_vol_date,_sp,_hp,_lp,_cp,_vol),_最古登録日), findmin(_vol_date,kabuka(_stock_code,_vol_date,_sp,_hp,_lp,_cp,_vol),_最新登録日), writef('%t,%t,最古登録日=%t,最新登録日=%t\n',[_stoc_code,_銘柄名,_最古登録日,_最新登録日),!. '株価テーブルから銘柄ごとの最古登録日と最新登録日の一覧を出したい'(_,_). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/351 # # 解決気味です。 # # 上記を諦め、 # # T1 マスタテーブル # ID | DATE    | DATA |ckbox # --+----------+----- |------ # 1 | 2007-11-11 | aaa | 201,202,205,401,403,404 # 2 | 2007-11-11 | bbb | 202,203 # 3 | 2007-11-10 | ccc | 203,204,403,404,405 # # 上記の形式にして # select ID,DATE,DATA from `T1` # where # CONCAT(',',chkbox,',') like '%,201,%' # and # CONCAT(',',chkbox,',') like '%,202,%' # and # CONCAT(',',chkbox,',') like '%,403,%' # # こういった形で取得。 # # チェックボックスは計300個程ありそれぞれユニークを振っています。 # チェックされている数は平均50個程。 # レコード数は約1万程なのですがこの方法で大丈夫かどうか心配です。 # 'チェックボックスならびを指定してT1の組を検索'(_チェックボックスならび,_ID,_DATE,_DATA,_ckbox) :- 'T1'(_ID,_DATE,_DATA,_ckbox), split(_ckbox,[','],L), 'チェックボックスならびの要素はすべてLの中にある'(_チェックボックスならび,L). 'チェックボックスならびの要素はすべてLの中にある'([],_). 'チェックボックスならびの要素はすべてLの中にある'([_要素|R],L) :- member(_要素,L), 'チェックボックスならびの要素はすべてLの中にある'(R,L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/348 # # (質問) #  チェックボックス値による検索を行いたいと思っています。 # # MYSQL5.1 # # T1 マスタテーブル # ID | DATE     | DATA # --+----------+----- # 1 | 2007-11-11 | aaa # 2 | 2007-11-11 | bbb # 3 | 2007-11-10 | ccc # # T2 チェックボックステーブル1 # ID | cate1     | # --+--------- | # 1 | 201      | # 1 | 202      | # 1 | 205      | # 2 | 202      | # 2 | 203      | # 3 | 203      | # 3 | 204      | # # T3チェックボックステーブル2 # ID | cate2     | # --+--------- | # 1 | 401      | # 1 | 403      | # 1 | 404      | # 3 | 403      | # 3 | 404      | # 3 | 405      | # # このような3つのテーブルから、下記のように出したいがどうすれば # # T2で 201、202、を含み # 且つ # T3で 403 を含む  # # 結果 T1のIDレコード # 1 | 2007-11-11 | aaa # # 試した事 # select * from `T1` # join `T2` using(ID) # join `T3` using(ID) # where # cate1 in(201,202) # and cate2 in(403) # group by ID # having count(*)=?? # # 絞るのにカウント数がT1、T2のチェックレコード数で # 可変するので詰まっています。 # そもそも、考え方がおかしいのかもしれません。 # 良い方法をご教示ください。 # 'T2で 201、202、を含み 且つ T3で 403 を含む T1のIDレコード' :- 'T1'(_ID,_DATE,_DATA), 'T2'(_ID,_cate1), '201、202、を含み'(_cate1), 'T3'(_ID,403), writef('%t | %t | %t\n',[_ID,_DATE,_DATA]), fail. 'T2で 201、202、を含み 且つ T3で 403 を含む T1のIDレコード'. '201、202、を含み'(201). '201、202、を含み'(202). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/332 # # oracleです。 # # ・テーブルデータ # テーブルA #  ID |日付 #  100|10/1 #  100|10/2 # 100|10/5 #  101|11/1 #  102|11/1 #  102|11/2 #  103|12/1 # # # テーブルB #  ID |期間(自)|期間(至) #  100|10/1  |10/4 #  101|10/1  |10/30 #  102|11/1  |11/5 #  103|12/1  |12/1 #   # # ・欲しい結果 # #  ID |期間内のカウント #  100|2 #  101|0 #  102|2 #  103|1 #   # # ・説明: # IDをキーに、期間内のIDごとのカウントをとりたいです。 # SQL1本で取得する方法はありますでしょうか? # 列は増やしたくないです。 # テーブルA(100,10/1). テーブルA(100,10/2). テーブルA(100,10/5). テーブルA(101,11/1). テーブルA(102,11/1). テーブルA(102,11/2). テーブルA(103,12/1). テーブルB(100,10/1,10/4). テーブルB(101,10/1,10/30). テーブルB(102,11/1,11/5). テーブルB(103,12/1,12/1). 'IDをキーに、期間内のIDごとのカウントをとりたい'(_ID,_期間_自,_期間_至,_度数) :- findsetof([_ID,_期間_自,_期間_至],( テーブルB(_ID,_期間_自,_期間_至)), LL1), append(_,[[_ID,_期間_自,_期間_至]|_],LL1), count(( テーブルA(_ID,_日付), _日付 @>= _期間_自, _日付 @=< _期間_至), _度数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/323 # # 【質問テンプレ】 # ・DBMS名とバージョン MySQL 5.1 # ・テーブルデータ # ・欲しい結果 # ・説明 # # テーブル「カート」 # カラム 「セッションID」「商品種別」「カートに入れた時刻」 # # テーブル「カート詳細」 # カラム 「セッションID」「商品コード」 # # テーブル「商品リスト」 # カラム「商品コード」「商品種別」 # # というテーブルがあります。 # # 最後にカートに入れた時刻から12時間以上経過したセッションIDを検索して、 # そのセッションIDを持つレコードを「カート」「カート詳細」の両方から # 全て削除したいのです。 # # 同じセッションIDを持つレコードは、両方のテーブルに複数あります。 # 「注文」テーブルで「セッションID」「商品種別」の組合せはユニークで、 # 「注文詳細」テーブルでは「セッションID」「商品コード」の組合せにユニークです。 # # 結合や副問い合わせを試してみましたが、うまいこと抽出できません。 # SQLで書くやり方があれば教えてください。よろしくお願いします。 # # '最後にカートに入れた時刻から12時間以上経過したセッションIDを検索して、そのセッションIDを持つレコードを「カート」「カート詳細」の両方から全て削除する' :- '最後にカートに入れた時刻から12時間以上経過したセッションIDを検索して'(_セッションID,R), 'そのセッションIDを持つレコードを「カート」「カート詳細」の両方から全て削除する'(_セッションID), R = []. '最後にカートに入れた時刻から12時間以上経過したセッションIDを検索して'(_セッションID,R) :- findsetof(_セッションID,( カート(_セッションID,_商品種別,_カートに入れた時刻)), _セッションIDならび), append(_,[_セッションID|R],_セッションIDならび), findmax(_カートに入れた時刻,( カート(_セッションID,_商品種別,_カートに入れた時刻)), _最後にカートに入れた時刻), 最後にカートに入れた時刻から12時間以上経過している(_セッションID,_最後にカートに入れた時刻). 'そのセッションIDを持つレコードを「カート」「カート詳細」の両方から全て削除する'(_セッションID) :- retractall(カート(_セッションID,_,_)), retractall(カート詳細(_セッションID,_)). 最後にカートに入れた時刻から12時間以上経過している(_セッションID,_最後にカートに入れた時刻) :- split(_最後に入れた時刻,['/',' ',':'],[_年,_月,_日,_時,_分]), 現在の時刻(_年_1,_月_1,_日_1,_時_1,_分_1), '12時間後の日時'(_年,_月,_日,_時,_分,_年_2,_月_2,_日_2,_時_2,_分_2), [_年_1,_月_1,_日_1,_時_1,_分_1] @>= [_年_2,_月_2,_日_2,_時_2,_分_2],!. '12時間後の日時'(_年,_月,_日,_時,_分,_年,_月,_日,_時_2,_分) :- _時_2 is _時 + 12, _時_2 < 24,!. '12時間後の日時'(_年,_月,_日,_時,_分,_年,_月,_日_2,_時_2,_分) :- _時_1 is _時 + 12, _時_2 is _時_1 - 24, _日_2 is _日 + 1,!. retractall(P) :- retract(P), fail. retractall(_). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/319 # # tbl_rosen (駅名と備考は1:1) # 路線名  駅名  備考 # ---------------------- # A線   i駅   備考1 # A線   j駅   備考2 # A線   k駅   備考3 # B線   k駅   備考3 # B線   l駅   備考4 # B線   m駅   備考5 # C線   n駅   備考6 # D線   k駅   備考3 # D線   o駅   備考7 # # tbl_shop # 店名  最寄駅 # --------------- # X店   j駅 # X店   m駅 # X店   o駅 # Y店   l駅 # Z店   k駅 # # tbl_rosenは鉄道路線とその駅名のテーブル(1路線に対して1〜n駅ある)、 # tbl_shopは、スーパーの名前と最寄駅(1店に対して0〜nの最寄駅がある) # # <やりたいこと> # ・その店に鉄道で行くことが出来る駅のリストを作成したい # ・ある特定の路線は除外(上の例だと、D線は対象外) # ・乗り換えは考慮しない。 # # →例えば、Z店はk駅が最寄りで、k駅はA線、B線、D線の乗り入れ。D線を除外すると、 # i、j、k、l、m駅から電車(±徒歩)でZ店に行ける # # <最終的に出力したいテーブル) # tbl_output # 店名  最寄駅  備考 # ---------------------- # X店   i駅   備考1 # X店   j駅   備考2 # X店   k駅   備考3 # X店   l駅   備考4 # X店   m駅   備考5 # Y店   k駅   備考3 # Y店   l駅   備考4 # Y店   m駅   備考5 # Z店   i駅   備考1 # Z店   j駅   備考2 # Z店   k駅   備考3 # Z店   l駅   備考4 # Z店   m駅   備考5 # # # 2段階に分ければ(駅で結合して店名、路線名でグループ化(D線除外)した # テンポラリテーブルをつくって、さらにtbl_rosenと結合する)普通にできるのですが、 # 出来れば一発のSQLで出力したいのですが、SQL自体にまだ馴染みが薄く、 # どのように書いて良いのかわかりません # # よろしくお願いします(PostgreSQL8.4です) # # 'その店に鉄道で行くことが出来る駅のリストを作成したい ・ある特定の路線は除外(上の例だと、D線は対象外)・乗り換えは考慮しない。 '(_店名,_除外する路線名ならび,L) :- 店候補(_店名,R), その店に鉄道で行くことができる駅候補(_店名,_路線名ならび), その店に鉄道で行くことが出来る駅のリストを作成する(_店名,_除外する路線名ならび,_路線名ならび), R = []. 店候補(_店名,R) :- findsetof(_店名,( tbl_shop(_店名,_,_)), _店名ならび), append(_,[_店名|R],_店名ならび). その店に鉄道で行くことができる駅候補(_店名,_路線名ならび) :- findsetof(_路線名,( tbl_shop(_店名,_最寄駅,_備考1), tbl_rosen(_路線名,_最寄駅,_備考2)), _路線名ならび). その店に鉄道で行くことが出来る駅のリストを作成する(_店名,_除外する路線名ならび,_路線名ならび) :- append(_,[_路線名|R],_路線名ならび), tbl_rosen(_路線名,_駅名,_備考), \+((member(_路線名,_除外する路線名ならび)), assertz(tbl_output(_店名,_駅名,_備考)), R = []. findsetof(A,B,L) :- findall(A,B,C), setof(A,member(A,C),L). findsetof(A,B) :- findall(A,B,C), setof(A,member(A,C),D), member(A,D). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1316769778/317 # # 検索結果の集合の共通部分は求められますか。 # たとえばid=1の結果が{a, b, c, d}でid=2の結果が{b, c, e}なら{b, c}を求めたいです。 # '検索結果の集合の共通部分は求める'(_id1,_id2,_共通する値) :- setof(_値,(テーブル(_id1,_値),テーブル(_id2,_値)),L), member(_共通する値,L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1316769778/293 # # oracleです。 # # ・テーブルデータ # テーブルA #  ID |状態 #  100|○ #  100|○ #  101|○ #  102|○ #  104|○ #  105|× # テーブルB #  ID |状態 #  100|○ #  100|○ #  100|○ #  103|○ #  105|○ #  106|× # # ・欲しい結果 # #  ID |AのCOUNT(ID)|BのCOUNT(ID) #  100|2 |3 #  101|1 |null #  102|1 |null #  104|1 |null #  105|null |1 # # ・説明: # A,B各テーブルの状態が○であるものをID単位でカウントし、 #  AとBのテーブルを結合したいのですが、SQL1本で可能でしょうか? #  結合する際、どちらかのテーブルのカウントが1以上であれば出力したいです。 # # 'A,B各テーブルの状態が○であるものをID単位でカウントし、AとBのテーブルを結合したいのですが、SQL1本で可能でしょうか? 結合する際、どちらかのテーブルのカウントが1以上であれば出力したいです。'(_ID,CountA,CountB) :- findsetof(_ID,( テーブルA(_ID,○ ); テーブルB(_ID,○ )), L), append(_,[_ID|_],L), count(テーブルA(_ID,○ ),CountA), count(テーブルB(_ID,○ ),CountB). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1316769778/301 # # MySQLで質問させてください。 # ある条件で絞ったレコードを日付でソートして # 最新のn件以降を削除したい場合はどのようなSQLを書くのが良いでしょうか? # 'ある条件で絞ったレコードを日付でソートして最新のn件以降を削除する'(_テーブル,_条件,_n件) :- ある条件で絞ったレコードを(_テーブル,_条件,LL1), 日付でソートして(LL1,LL), 最新のn件以降を(LL,_n件,LL2), 削除する(_テーブル,LL2). ある条件で絞ったレコードを(_テーブル,_条件,_削除する件数,_ある条件で絞ったレコード) :- 属性ならびの取得(_テーブル,_属性名ならび,_属性ならび), P =.. [_テーブル|_属性ならび], findall(_属性ならび,( P, _条件), _ある条件で絞ったレコード). 属性ならびの取得(_テーブル,_属性名ならび,_属性ならび) :- setof([_属性順序,_属性名],( テーブル定義(_テーブル,_属性順序,_属性名)), L1), findall(_属性名,( member([_,_属性名],L2)), _属性名ならび), length(_属性名ならび,Len), length(_属性ならび,Len),!. 日付でソートして(_組ならび,_整列した組ならび) :- テーブル定義(_テーブル,_nth,日付), findall([_日付|_属性ならび],( member(_属性ならび,_組ならび)), LL2), sort(LL2,LL3), 鍵の日付を取り除く(LL3,_整列した組ならび). 最新のn件以降を(LL,_n件,LL2) :- length(LL2,_n件), append(LL1,LL2,LL),!. 削除する(_テーブル,LL) :- append(_,[L|R],LL). P =.. [_テーブル|L], retract(P), R = []. 鍵の日付を取り除く([],[]). 鍵の日付を取り除く([[_|L]|R1],[L|R2]) :- 鍵の日付を取り除く(R1,R2). % 以下のサイトは バイナリファイル (標準入力) に一致しました % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1309076891/573 # # 【 課題 】自然数nの全ての約数の和sを求めよ。 #  sに初め0をいれておく。nを順に1,2,・・・nで割っていき、割り切れるときは # 約数なのでその値を加えてゆけばよい。 # 【 用語 】なし # 【 期限 】12月8日 # 【 Ver  】特に無し # 【 補足 】 # int n = Integer.parseInt(JOptionPane.showInputDialog # (null,"自然数nの値を入力してください")); # int s =0; # for(int i =2; i<=n; i++){ # if(n % i == 0){ # s = s + i; # } # else if(i == n){ # JOptionPane.showMessageDialog(null, s); # break; # } # } # } # } #     起動しても何も起こりません・・・ # よろしくお願いします。 # # '自然数nの全ての約数の和sを求めよ'(_n,_s) :- 'sに初め0をいれておく。nを順に1,2,・・・nで割っていき、割り切れるときは約数なのでその値を加えてゆけばよい'(_n,_s). 'sに初め0をいれておく。nを順に1,2,・・・nで割っていき、割り切れるときは約数なのでその値を加えてゆけばよい'(_対象値,_合計値) :- findsum(N,( 値を割り切れる除数(_対象値,N)), _合計値). 値を割り切れる除数(_対象値,_除数) :- for(1,_除数,_対象値), 0 is _対象値 mod _除数. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/245 # # [1] 授業単元:2分探索 # [2] 問題文(含コード&リンク): # http://ime.nu/ideone.com/YJwRQ # データが昇順ではなく、降順に並んでいる場合の2分探索をプログラムを作成せよ # 'データが昇順ではなく、降順に並んでいる場合の2分探索をプログラム'(_降順ならび,_鍵,_値) :- ならびの二分(_降順ならび,L1,[(A,B)|L2]), '降順に並んでいる場合の2分探索診断'(_鍵,A,B,L1,L2,_値). '降順に並んでいる場合の2分探索診断'(_鍵,_鍵,_値,L1,L2,_値) :- !. '降順に並んでいる場合の2分探索診断'(_鍵,A,B,L1,L2,_値) :- _鍵 @< A, 'データが昇順ではなく、降順に並んでいる場合の2分探索をプログラム'(L2,_鍵,_値). '降順に並んでいる場合の2分探索診断'(_鍵,A,B,L1,L2,_値) :- _鍵 @> A, 'データが昇順ではなく、降順に並んでいる場合の2分探索をプログラム'(L1,_鍵,_値). ならびの二分(L,L1,L2) :- length(L,Len), Len1 is Len // 2, length(L1,Len1), append(L1,L2,L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/172 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # 前日商品別に在庫を登録したファイル "zaiko.txt" と # 当日商品別に入庫を記録したファイル "nyuko.txt" の2つのファイルを入力し、 # 新たな在庫ファイル "zaiko_new.txt" を出力するプログラムを作成せよ。 # ファイルの各レコード(行)は次の形式であり、ひとつの商品に対してひとつのレコードとする。 # # 商品コード 整数 4桁 # 数量 数字 4桁 # # なお、各ファイルは商品コードの昇順にソートされているものとする。 # ※実行例:http://ime.nu/s2.etowns.slyip.net/~c_cpp_homework/cgi-bin/joyful/img/256.txt # '前日商品別に在庫を登録したファイル "zaiko.txt" と当日商品別に入庫を記録したファイル "nyuko.txt" の2つのファイルを入力し、新たな在庫ファイル "zaiko_new.txt" を出力する' :- '前日商品別に在庫を登録したファイル "zaiko.txt" と当日商品別に入庫を記録したファイル "nyuko.txt" の2つのファイルを入力し'(LL1,LL2), '新たな在庫ファイル "zaiko_new.txt" を出力する'(LL1,LL2). '前日商品別に在庫を登録したファイル "zaiko.txt" と当日商品別に入庫を記録したファイル "nyuko.txt" の2つのファイルを入力し'(LL1,LL2) :- get_lines('zaiko.txt',Lines1), get_lines('nyuko.txt',Lines2), 行を商品番号と数量に分解する(Lines1,LL1), 行を商品番号と数量に分解する(Lines2,LL2). 行を商品番号と数量に分解する(Lines,LL) :- findall([_商品番号,_数量],( append(_,[_行|_],Lines), 商品番号と数量に分解(_行,_商品番号,_数量)), LL). 商品番号と数量に分解(_行,_商品番号,_数量) :- sub_atom(_行,0,4,4,S1), sub_atom(_行,4,4,0,S2), atom_to_term(S1,_商品番号,_), atom_to_term(S2,_数量,_). '新たな在庫ファイル "zaiko_new.txt" を出力する'(LL1,LL2) :- '新たな在庫ファイル'(LL1,LL2,LL3), 出力する('zaiko_new.txt',LL3). '新たな在庫ファイル "zaiko_new.txt" を出力する'(LL1,[],LL1) :- !. '新たな在庫ファイル "zaiko_new.txt" を出力する'([],LL2,LL2) :- !. '新たな在庫ファイル "zaiko_new.txt" を出力する'([[_商品番号,_数量_1]|R1],[[_商品番号,_数量_2]|R2],[[_商品番号,_数量_3]|R3]) :- _数量_2_1 is _数量_1 + _数量_2, 入庫の集約(_商品番号,R2,_数量_2_1,_数量_3,R2_2), '新たな在庫ファイル "zaiko_new.txt" を出力する'(R1,R2_2,R3). '新たな在庫ファイル "zaiko_new.txt" を出力する'([[_商品番号_1,_数量_1]|R1],[[_商品番号_2,_数量_2]|R2],[[_商品番号_1,_数量_1]|R3]) :- _商品番号_1 @< _商品番号_2, '新たな在庫ファイル "zaiko_new.txt" を出力する'(R1,[[_商品番号_2,_数量_2]|R2],R3). '新たな在庫ファイル "zaiko_new.txt" を出力する'([[_商品番号_1,_数量_1]|R1],[[_商品番号_2,_数量_2]|R2],[[_商品番号_2,_数量_3]|R3]) :- _商品番号_1 @> _商品番号_2, 入庫の集約(_商品番号_2,R2,_数量_2,_数量_3,R2_2), '新たな在庫ファイル "zaiko_new.txt" を出力する'([[_商品番号_1,_数量_1]|R1],R2_2,R3). 入庫の集約(_商品番号,[],_数量_3,_数量_3,[]) :- !. 入庫の集約(_商品番号,[[_商品番号,_数量]|R],_数量_2_1,_数量_3,R2_2) :- _数量_2_2 is _数量_2_1 + _数量, 入庫の集約(_商品番号,R,_数量_2_2,_数量_3,R2_2),!. 入庫の集約(_商品番号,[[_商品番号_2_2,_数量]|R2],_数量_3,_数量_3,[[_商品番号_2,_数量_2]|R2]) :- \+(_商品番号=_商品番号_2). 出力する(File,LL) :- open(File,write,Outstream), append(_,[[_商品番号,_数量]|R],LL), writef(Outstream,'%4r%4r\n',[_商品番号,_数量]), R = [], close(Outstream). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/166 # # [1] 授業単元:2分探索 # [2] 問題文(含コード&リンク): # 2分探索を呼び出すmain関数を作成し、実際の動作を確認せよ。 # ただし各データの値は構造体配列の初期設定で設定するものとする。 # また、プログラムは以下のように動作するものとする。 # Please input a key: 8 # Found! Key=8, Name=Hanada # Please input a key: 24 # Found! Key=24, Name=Nishida # Please input a key: 6 # Not Found! # Please input a key: # ・ # ・ # # 鍵付き整列済みならびの二分探索(_整列済みならび,_鍵,_取り出しデータ) :- ならびの二分(_整列済みならび,L1,L2), 鍵付き整列済みならびの二分探索(_鍵,L1,L2,_取り出しデータ). 鍵付き整列済みならびの二分探索(_鍵,L1,[(_鍵,_取り出しデータ)|_],_取り出しデータ) :- !. 鍵付き整列済みならびの探索(_鍵,L1,[(A,_)|R],_取り出しデータ) :- _鍵 @> A, 鍵付き整列済みならびの二分探索(R,_鍵,_取り出しデータ). 鍵付き整列済みならびの探索(_鍵,L1,[(A,_)|R],_取り出しデータ) :- _鍵 @< A, 鍵付き整列済みならびの二分探索(L1,_鍵,_取り出しデータ). ならびの二分(L,L1,L2) :- length(L,Len), Len1 is Len // 2, length(L1,Len1), append(L1,L2,L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/111 # # [1] 授業単元:C言語プログラミング # [2] 問題文(含コード&リンク):テキストファイルを読み込み1次元の離散コサイン変換を行って、その結果を新たなテキストファイルに書き込むプログラムを作れ。 # # [5] その他の制限: 例 10,15,20,80,120,160,210,10,20,100...と続く # テキストデータ3つ(data.txt data2.txt data3.txt)を(それぞれ内容は違う)読み込む。 # それぞれに1次元の離散コサイン変換を行う。 # 変換後の値を新たなテキストファイルに(data,data2,data3)改行(data,data2,data3)改行...といったような表示で書き込む。 'テキストデータ3つ(data.txt data2.txt data3.txt)を(それぞれ内容は違う)読み込む。それぞれに1次元の離散コサイン変換を行う。変換後の値を新たなテキストファイルに(data,data2,data3)改行(data,data2,data3)改行...といったような表示で書き込む。' :- 'テキストデータ3つ(data.txt data2.txt data3.txt)を(それぞれ内容は違う)読み込む'(Lines1,Lines2,Lines3), テキストデータ3つを3つのならびに変換(Lines1,Lines2,Lines3,L1_1,L2_1,L3_1), それぞれに1次元の離散コサイン変換を行う(L1_1,L2_1,L3_1,L1_2,L2_2,L3_2), '変換後の値を新たなテキストファイルに(data,data2,data3)改行(data,data2,data3)改行...といったような表示で書き込む。'(L1_2,L2_2,L3_2). テキストデータ3つを3つのならびに変換(L1,L2,L3) :- テキストデータを3つ取得(Lines1,Lines2,Lines3), 要素ならびに変換(Lines1,Lines2,Lines3,L1,L2,L3). テキストデータを3つ取得(Lines1,Lines2,Lines3) :- get_lines('data.txt',Lines1), get_lines('data2.txt',Lines2), get_lines('data3.txt',Lines3). それぞれに1次元の離散コサイン変換を行う(L1_1,L2_1,L3_1,L1_2,L2_2,L3_2) :- '1次元の離散コサイン変換'(L1_1,L1_2), '1次元の離散コサイン変換'(L2_1,L2_2), '1次元の離散コサイン変換'(L3_1,L3_2). '1次元の離散コサイン変換'(L1,L2) :- append([_第一要素],L,[_最終要素],L1), length(L1,N), '1次元の離散コサイン変換'(L,L,N,-1,_第一要素,_最終要素,L2). '1次元の離散コサイン変換'([],_,_,_,_第一要素,_最終要素,[]). '1次元の離散コサイン変換'([N|R1],L,N,-1,_第一要素,_最終要素,[Xk|R2]) :- findsum(U,( append(L0,[B|_],L), length([_|L0],K), U is _最終要素 * cos(pi/(N-1) * N * K)), Sum), Xk is _第一要素/2 + Sum + ((-1) / 2) * (_最終要素-1)), '1次元の離散コサイン変換'(R1,L,N,1,_第一要素,_最終要素,R2). '1次元の離散コサイン変換'([N|R1],L,N,1,_第一要素,_最終要素,[Xk|R2]) :- findsum(U,( append(L0,[B|_],L), length([_|L0],K), U is _最終要素 * cos((pi / (N-1)) * N * K), Sum), Xk is _第一要素/2 + Sum + ((1 / 2) * (_最終要素-1)), '1次元の離散コサイン変換'(R1,L,N,-1,_第一要素,_最終要素,R2). '変換後の値を新たなテキストファイルに(data,data2,data3)改行(data,data2,data3)改行...といったような表示で書き込む。'(L1,L2,L3) :- open('data4.txt',write,Outstream), '変換後の値を新たなテキストファイルに(data,data2,data3)改行(data,data2,data3)改行...といったような表示で書き込む。'(Outstream,L1,L2,L3), close(Outstream). '変換後の値を新たなテキストファイルに(data,data2,data3)改行(data,data2,data3)改行...といったような表示で書き込む。'(_,[],[],[]). '変換後の値を新たなテキストファイルに(data,data2,data3)改行(data,data2,data3)改行...といったような表示で書き込む。'(Outstream,[A|R1],[B|R2],[C|R3]) :- writef(Outstream,'%t,%t,%t\n',[A,B,C]), '変換後の値を新たなテキストファイルに(data,data2,data3)改行(data,data2,data3)改行...といったような表示で書き込む。'(Outstream,R1,R2,R3). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/111 # # [1] 授業単元:C言語プログラミング # [2] 問題文(含コード&リンク):テキストファイルを読み込み1次元の離散コサイン変換を行って、その結果を新たなテキストファイルに書き込むプログラムを作れ。 # # [5] その他の制限: 例 10,15,20,80,120,160,210,10,20,100...と続く # テキストデータ3つ(data.txt data2.txt data3.txt)を(それぞれ内容は違う)読み込む。 # それぞれに1次元の離散コサイン変換を行う。 # 変換後の値を新たなテキストファイルに(data,data2,data3)改行(data,data2,data3)改行...といったような表示で書き込む。 'テキストファイルを読み込み1次元の離散コサイン変換を行って、その結果を新たなテキストファイルに書き込む'(_テキストファイル名,_出力ファイル名) :- get_lines(_テキストファイル名,Lines), データ要素のならびとする(Lines,_要素ならび), '1次元の離散コサイン変換'(L1,L2), '新たなテキストファイルに書き込む'(_出力ファイル名,L2). データ要素のならびとする(Lines,_要素ならび) :- concat_atom(Lines,',',S), split(S,[',',' '],_要素ならび). '1次元の離散コサイン変換'(L1,L2) :- append([_第一要素],L,[_最終要素],L1), length(L1,N), '1次元の離散コサイン変換'(L,L,N,-1,_第一要素,_最終要素,L2). '1次元の離散コサイン変換'([],_,_,_,_第一要素,_最終要素,[]). '1次元の離散コサイン変換'([M|R1],L,N,-1,_第一要素,_最終要素,[Xk|R2]) :- findsum(U,( append(_,[B|_],L), length([_|L0],K), U is _最終要素 * cos(pi/(M-1) * N * K)), Sum), Xk is _第一要素/2 + Sum + ((-1) / 2) * (_最終要素-1)), '1次元の離散コサイン変換'(R1,L,N,1,_第一要素,_最終要素,R2). '1次元の離散コサイン変換'([M|R1],L,N,1,_第一要素,_最終要素,[Xk|R2]) :- findsum(U,( append(L0,[B|_],L), length([_|L0],K), U is _最終要素 * cos((pi / (M-1)) * N * K), Sum), Xk is _第一要素/2 + Sum + ((1 / 2) * (_最終要素-1)), '1次元の離散コサイン変換'(R1,L,N,-1,_第一要素,_最終要素,R2). '新たなテキストファイルに書き込む'(_テキストファイル名,L) :- open(_テキストファイル名,write,Outstream), append(_,[A|R],L), writef(Outstream,'%t,',[A]), R = [B], writef(Outstream,'%t\n',[B]), close(Outstream). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1294641578/718 # # 最後から任意の件数を問い合わせたいのですが # select time from test order by time desc offset 0 limit 3;で # 呼び出すと下記のようになりますが # # time         # ------------------ # 2011-11-28 08:20:16 # 2010-10-26 06:20:16 # 2009-09-24 04:20:16 # # # ↓のように更にソートして呼び出すにはどう書けばよいのでしょうか? # time           # ------------------ # 2009-09-24 04:20:16 # 2010-10-26 06:20:16 # 2011-11-28 08:20:16 # # '最後から任意の件数を問い合わせる'(_任意の件数,L) :- テーブル構造の取得(test,time,P,_time), 全テーブルの取得(P,_time,LL1), 最後から任意の件数を取り出す(_任意の件数,LL1,L). テーブル構造の取得(_テーブル名,_鍵名,P,_項) :- findall(_,( テーブル定義(_テーブル名,_,_)), L), テーブル定義(_テーブル名,_項番号,_鍵名), nth1(_項番号,L,_項), P =.. [_テーブル名|L]. 全テーブルの取得(P,_time,LL1) :- findall([_time],( P), LL1). 逆順に整列(LL1,LL2) :- sort(LL1,LL3), reverse(LL3,LL2). 最後から任意の件数を取り出す(_任意の件数,LL,L) :- length(LL3,_任意の件数), append(LL3,_,LL2), 逆順に整列(LL1,LL2), member(L,LL3). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/822 # # [1] 授業単元:c言語プログラミング # [2] 問題文(含コード&リンク):(1,2,3) (1,2,4)...といった数列が続くのlist.txtを読み込み、 # 左の数字が同じかつ真ん中の数字も同じとき、右の数字が大きいものを削除し、link2.txtに書きこむプログラムを作りなさい。 # (この場合、左が1と1かつ真ん中が2と2で右が3と4なので4の方が大きいので(1,2,4)を削除する) # '(1,2,3) (1,2,4)...といった数列が続くのlist.txtを読み込み、左の数字が同じかつ真ん中の数字も同じとき、右の数字が大きいものを削除し、link2.txtに書きこむ' :- get_chars('list.txt',Chars), '左の数字が同じかつ真ん中の数字も同じとき、右の数字が大きいものを削除し、link2.txtに書きこむ'(Chars). '左の数字が同じかつ真ん中の数字も同じとき、右の数字が大きいものを削除し、link2.txtに書きこむ'(Chars) :- ならびに変換(Chars,LL1), '左の数字が同じかつ真ん中の数字も同じとき、右の数字が大きいものを削除し'(LL1,LL2), 'link2.txtに書きこむ'(LL2). ならびに変換([],[]). ならびに変換(['('|R1],[[A,B,C]|R2]) :- append(L0,[)|R3],R1), concat_atom(L0,S), atom_to_term(S,(A,B,C),_), ならびに変換(R3,R2),!. ならびに変換([_|R1],R2) :- ならびに変換(R1,R2). '左の数字が同じかつ真ん中の数字も同じとき、右の数字が大きいものを削除し'(LL1,LL2) :- 左の数字と真ん中の数字でグループを作る(LL1,LL3), グループの中の最小ならびを蒐める(LL3,LL2). 左の数字と真ん中の数字でグループを作る(LL1,LL3) :- findsetof([A,B],( append(_,[[A,B,_]|_],LL1)), LL3). グループの中の最小ならびを蒐める(LL3,LL2) :- findall(L,( グループの中での最小ならび(LL3,L)), LL2). グループの中での最小ならび(LL3,L) :- append(_,[[A,B]|_],LL3), findmin([A,B,C],( append(_,[[A,B,C]|_],LL1)), L). 'link2.txtに書きこむ'(LL2) :- open('link2.txt',write,Outstream), 'link2.txtに書きこむ'(Outstream,LL2), close(Outstream). 'link2.txtに書きこむ'(Outstream,LL2) :- append(_,[[A,B,C]|R],LL2), writef(Outstream,'(%t,%t,%t) ',[A,B,C]), R = [], 最後に改行(Outstream). 最後に改行(Outstream) :- write(Outstream,'\n'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/610 # # 【質問テンプレ】 # [1] 授業単元:情報技術 # [2] 問題文(含コード&リンク): # 以下の2つの要件を満たす、3行3列の行列の積を計算し、表示するプログラムmultiply.cを作成せよ。 # # (1)整数型の行列A,Bおよびそれらの行列積A*Bを、以下の配列名で宣言する(A,Bの値は各個人で自由に設定)。 # # int matrix_a[3][3]={{1,2,3},{4,5,6},{7,8,9}};/*行列A*/ # int matrix_b[3][3]={{10,11,12},{13,14,15},{16,17,18}};/*行列B*/ # int matrix_multiply_a_by_b[3][3]={{0,0,0},{0,0,0},{0,0,0}};/*計算結果代入用の行列*/ # # (2)行列の積A*Bのi行j列目の要素の計算を、for文を用いて行うこと。 # # matrix_a([[1,2,3],[4,5,6],[7,8,9]]). matrix_b([[10,11,12],[13,14,15],[16,17,18]]). '行列の積A*Bのi行j列目の要素の計算を、for文を用いて行うこと。'(_i行,_j列,_i行j列の要素) :- 'matrix_aのi行とmatrix_bのj列'(_i行目,_j列目,L1,L2), findsum(S,( for(1,N,3), nth1(N,L1,A), nth1(N,L2,B), S is A * B), _i行j列の要素). 'matrix_aのi行とmatrix_bのj列'(_i行目,_j列目,L1,L2) :- matrix_a(LL1), matrix_b(LL2), nth1(_i行,LL1,L1), 'matrix_bのj列ならび'(_j列目,LL2,L2). 'matrix_bのj列ならび'(_,_,[],[]). 'matrix_bのj列ならび'(_j列目,[L1|R1],[X|R2]) :- nth1(_j列目,L1,X), 'matrix_bのj列ならび'(_j列目,R1,R2). findsum(A,B,C) :- findall(A,B,L), sum(L,C). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '行列の積A*Bのi行j列目の要素の計算'(_i行,_j列,_i行j列の要素) :- 'matrix_aのi行とmatrix_bのj列'(_i行目,_j列目,L1,L2), 'i行j列目の要素は'(L1,L2,_i行j列目の要素). 'i行j列目の要素は'([A],[B],S) :- S is A * B,!. 'i行j列目の要素は'([A|R1],[B|R2],S) :- 'i行j列目の要素は'(R1,R2,S_2), S is A * B + S_2. 'matrix_aのi行とmatrix_bのj列'(_i行目,_j列目,L1,L2) :- matrix_a(LL1), matrix_b(LL2), 転置(LL2,LL2_2), nth1(_i行,LL1,L1), nth1(_j列,LL2_2,L2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '行列の積A*Bのi行j列目の要素の計算'(_i行,_j列,_i行j列の要素) :- matrix_a(LL1), matrix_b(LL2), '3×3の行列の掛算演算表'(LL1,LL2,LL3), nth1(_i行,LL3,L), nth1(_j列,L,_式), _i行j列の要素 is _式. '3×3の行列の掛算演算表'([ [A11,A12,A13], [A21,A22,A23], [A31,A32,A33]], [[B11,B12,B13], [B21,B22,B23], [B31,B32,B33]], [[A11*B11+A12*B21+A13*B31,A11*B12+A12*B22+A13*B32,A11*B13+A12*B23+A13*B33], [A21*B11+A22*B21+A23*B31,A21*B12+A22*B22+A23*B32,A21*B13+A22*B23+A23*B33], [A31*B11+A32*B21+A33*B31,A31*B12+A32*B22+A33*B32,A31*B13+A32*B23+A33*B33]]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/477 # # [1] 授業単元:C言語 # [2] 問題文:3*3の逆行列Aをもとめよ # http://ime.nu/ideone.com/erZBk # '3*3の逆行列Aをもとめよ'(_a,_逆行列A) :- var(_a), '3行3列の行列aを入力'(_a), 正方行列の逆行列(_a,_逆行列A). '3*3の逆行列Aをもとめよ'(_a,_逆行列A) :- \+(var(_a)), 正方行列の逆行列(_a,_逆行列A). 正方行列の逆行列(_正方行列,_正方行列の逆行列) :- 余因子行列(_正方行列,_余因子行列), 転置(_余因子行列,_チルダ余因子行列), 行列式の値(_正方行列,_正方行列の行列式の値), チルダ余因子行列を正方行列の行列式の値で割る(_チルダ余因子行列,_正方行列の行列式の値,_正方行列の逆行列). チルダ余因子行列を正方行列の行列式の値で割る([],_,[]). チルダ余因子行列を正方行列の行列式の値で割る(_チルダ余因子行列,_正方行列の行列式の値,_正方行列の逆行列) :- _チルダ余因子行列 = [_行_1|R1], 行列要素の割り算(_行_1,_正方行列の行列式の値,_行_2), _正方行列の逆行列 = [_行_2|R2], チルダ余因子行列を正方行列の行列式の値で割る(R1,_正方行列の行列式の値,R2). 行列要素の割り算([],_,[]). 行列要素の割り算([_被除数|R1],_除数,[N2|R2]) :- 約分(_被除数/_除数,N2), 行列要素の割り算([N1|R1],D,[N2|R2]). 約分(B / A,V) :- \+(integer(B)), V is B / A,!. 約分(B / A,V) :- \+(integer(A)), V is B / A,!. 約分(B / A,X) :- 最大公約数(B,A,C), _分子 is B // C, _分母 is A // C, 約分の二(_分子,_分母,X),!. 約分の二(_分子,1,_分子) :- !. 約分の二(_分子,1.0,_分子) :- !. 約分の二(_分子,_分母,_分子 / _分母). '余因子行列で行列値|a|を求める'(_a,_行列式_aの値) :- 余因子行列(_n,_a,_余因子行列), _a = [_aの第一行|_], _余因子行列 = [_余因子行列の第一行|_], 二つのならびの積の和(_aの第一行,_余因子行列の第一行,_行列式_aの値). 余因子行列(_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). 行列式の値(_正方行列,_i,_n,_行列式の値) :- findsum(W,( 'n次正方行列の要素を列・行取り出す'(_n,_正方行列,_i,_j,_正方行列の要素), 余因子(_n,_正方行列,_i,_j,_余因子), W is _正方行列の要素 * _余因子), _行列式の値). 余因子(_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列を取り除く'(_正方行列,_i,_j,_n_1次正方行列), 'i,jから乗数を得る'(_i,_j,_乗数), 二つの対角要素の積を得る(_n,_n_1次正方行列,_右下がり対角要素の積,_右上がり対角要素の積), _余因子 is _乗数 * (_右下がり対角要素の積-_右上がり対角要素の積). '正方行列から第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行が取り除かれた行列). 二つの対角要素の積を得る(_n,_正方行列,_右下がり対角要素の積,_右上がり対角要素の積) :- 二つの対角要素を得る(_n,_正方行列,_右下がり対角要素ならび,_右上がり対角要素ならび), 対角要素の掛算(_右下がり対角要素ならび,_右下がり対角要素の積), 対角要素の掛算(_右上がり対角要素ならび,_右上がり対角要素の積). 二つの対角要素を得る(_n,_正方行列,_右下がり対角要素ならび,_右上がり対角要素ならび) :- 右下がり対角要素ならび(_n,_正方行列,_右下がり対角要素ならび), 右上がり対角要素ならび(_n,_正方行列,_右上がり対角要素ならび). 右下がり対角要素ならび(_n,_正方行列,_右下がり対角要素ならび) :- findall(V,( nth1(_nth1,_正方行列,L), nth1(_nth1,L,V)), _右下がり対角要素ならび). 右上がり対角要素ならび(_n,_正方行列,_右上がり対角要素ならび) :- findall(V,( append(_,[L|R],_正方行列), length([_|R],_nth1), nth1(_nth1,L,V)), _右上がり対角要素ならび),!. '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. % 以下のサイトは # twitter_by_@nooyosh_20111115_1 # # カレントディレクトリ以下にあるすべてのPDFファイルのサイズを合計して表示 # 'カレントディレクトリ以下にあるすべてのPDFファイルのサイズを合計して表示'(_合計サイズ) :- shs('ls -s *.pdf',L), findsum(_サイズ,( append(_,[_行|_],L), split(_行,[' '],[_サイズ|_])), _合計サイズ). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1316769778/249 # # ・MySQL5です # ・テーブルデータ #  ID|名前|データ #  01|鈴木|0001 #  02|佐藤|0002 #  01|鈴木|0003 # ・欲しい結果 #  ID|名前|*|DATA1|DATA2 #  01|鈴木|2|0001 |0003 #  02|佐藤|1|0002 | # # ・説明:group by と count(*) を使うと↓のように、グループ化され消えてしまう列の値を(この場合`0003`の部分)、↑みたく、行に書出す方法はありますか? #  ID|名前|*|データ #  01|鈴木|2|0001 #  02|佐藤|1|0002 # # ・補足:IDは1~1400、count数は1~97、DATAは1~4000位あります。 # # 欲しい結果(_組) :- 欲しい結果(_組,_). 欲しい結果(_組,_残り鍵ならび) :- 鍵ならびを作る(_鍵ならび), 鍵データの収集(_鍵ならび,_組,_残り鍵ならび). 欲しい結果の表示 :- 欲しい結果(_組,_残り鍵ならび), concat_atom(_組,'|',_組表示文字列), writef('%t\n',[_組表示文字列]), _残り鍵ならび = []. 鍵ならびを作る(_鍵ならび) :- findsetof([_ID,_名前],( テーブルデータ(_ID,_名前,_データ)), _鍵ならび). 鍵データの収集(_鍵ならび,_既に処理した鍵ならび,_組,_残り鍵ならび) :- 一つ鍵を取り出し(_鍵ならび,_既に処理した鍵ならび,_鍵,_残り鍵ならび), 鍵に対応するデータならび(_鍵,_鍵に対応するデータならび), 組の構成(_鍵,_鍵に対応するデータならび,_組). 一つ鍵を取り出し(_鍵ならび,_既に処理した鍵ならび,_鍵,_残り鍵ならび) :- append(_既に処理した鍵ならび,[_鍵|_残り鍵ならび],_鍵ならび). 鍵に対応するデータならび(_鍵,_鍵に対応するデータならび) :- _鍵 = [_ID,_名前], findall(_データ,( テーブルデータ(_ID,_名前,_データ)), _鍵に対応するデータならび). 組の構成(_鍵,_鍵に対応するデータならび,_組) :- length(_鍵に対応するデータならび,_度数), append(_鍵,[_度数|_鍵に対応するデータならび],_組). % 以下のサイトは # 出典:: 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の値) :- 余因子行列(_n,_a,_余因子行列), _a = [_aの第一行|_], _余因子行列 = [_余因子行列の第一行|_], '二つのならびの積の和'(_aの第一行,_余因子行列の第一行,_行列式_aの値). '二つのならびの積の和'([],[],0). '二つのならびの積の和'([A|R1],[B|R2],S) :- '二つのならびの積の和'(R1,R2,S_1), S is S_1 + A * B. 余因子行列(_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). 行列式の値(_正方行列,_i,_n,_行列式の値) :- findsum(W,( 'n次正方行列の要素を列・行取り出す'(_n,_正方行列,_i,_j,_正方行列の要素), 余因子(_n,_正方行列,_i,_j,_余因子), W is _正方行列の要素 * _余因子), _行列式の値). 余因子(_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列を取り除く'(_正方行列,_i,_j,_n_1次正方行列), 'i,jから乗数を得る'(_i,_j,_乗数), 二つの対角要素の積を得る(_n,_n_1次正方行列,_右下がり対角要素の積,_右上がり対角要素の積), _余因子 is _乗数 * (_右下がり対角要素の積-_右上がり対角要素の積). '正方行列から第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行が取り除かれた行列). 二つの対角要素の積を得る(_n,_正方行列,_右下がり対角要素の積,_右上がり対角要素の積) :- 二つの対角要素を得る(_n,_正方行列,_右下がり対角要素ならび,_右上がり対角要素ならび), 対角要素の掛算(_右下がり対角要素ならび,_右下がり対角要素の積), 対角要素の掛算(_右上がり対角要素ならび,_右上がり対角要素の積). 二つの対角要素を得る(_n,_正方行列,_右下がり対角要素ならび,_右上がり対角要素ならび) :- 右下がり対角要素ならび(_n,_正方行列,_右下がり対角要素ならび), 右上がり対角要素ならび(_n,_正方行列,_右上がり対角要素ならび). 右下がり対角要素ならび(_n,_正方行列,_右下がり対角要素ならび) :- findall(V,( nth1(_nth1,_正方行列,L), nth1(_nth1,L,V)), _右下がり対角要素ならび). 右上がり対角要素ならび(_n,_正方行列,_右上がり対角要素ならび) :- findall(V,( append(_,[L|R],_正方行列), length([_|R],_nth1), nth1(_nth1,L,V)), _右上がり対角要素ならび),!. 左下がり対角要素ならび(_n,_正方行列,_左下がり対角要素ならび) :- findall(V,( nth1(_nth1,_正方行列,L), length([_|R],_nth1), append(_,[V|R],L)), _左下がり対角要素ならび),!. 左上がり対角要素ならび(_n,_正方行列,_左下がり対角要素ならび) :- findall(V,( append(_,[L|R1],_正方行列), length([_|R1],_nth1), length([_|R2],_nth1), append(_,[V|R2],L)), _左上がり対角要素ならび),!. '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. 行列式の値(_正方行列,_i,_n,_行列式の値) :- findsum(W,( 'n次正方行列の要素を列・行順序で取り出す'(_n,_正方行列,_i,_j,_正方行列の要素), 余因子(_n,_正方行列,_i,_j,_余因子), W is _正方行列の要素 * _余因子), _行列式の値). '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://hibari.2ch.net/test/read.cgi/db/1316769778/221 # # DBMSはMysqlの5.0.87です。 # # +------+------------+---------+----------+ # | id   | product_id | assy_id | parts_id | # +------+------------+---------+----------+ # |    1 |          1 |      12 |        1 | # |    2 |          1 |      12 |        2 | # |    3 |          1 |      12 |        3 | # |    4 |          1 |      12 |        3 | # |    5 |          1 |      12 |        5 | # +------+------------+---------+----------+ # # 上記のテーブルで、product_id、assy_id、parts_idが同じレコードが2行以上有るものを抽出したいのです。 # 上記の例だとidが3と4のレコードになります。 # # # '上記のテーブルで、product_id、assy_id、parts_idが同じレコードが2行以上有るものを抽出する'(_id) :- findsetof([_product_id,_assy_id,_parts_id],( テーブル(_id,_product_id,_assy_id,_parts_id)), LL), append(_,[[_product_id,_assy_id,_parts_id]|_],LL), count(テーブル(_,_product_id,_assy_id,_parts_id),Count), Count >= 2. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1294641578/678 # # point順に並び替え、ランクを表示する # # テーブル名 :tbl_point # フィールド名:point # name # gender # # 表示    :p_rank, name, gender, point # # select rank() over (order by [point] desc) as [p_rank], name, point from [tbl_point]; # # p_rank | name | gender | point # # 1 | hoge | 1 | 98 # 2   | fuga | 2 | 80 # 3  | poyo | 2 | 70 # 4  | boke | 1 | 60 # # ここまではできるのですが # # p_rank | mp_rank | wp_rank | name | gender | point # # 1 | 1 | | hoge | 1 | 98 # 2 | | 1 | fuga | 2 | 80 # 3  | | 2 | poyo | 2 | 70 # 4  | 2 | | boke | 1 | 60 # # gender毎のも表示するにはどうすればいいですか? # 'gender毎のも表示する' :- ランクの作成(LL_R,LL1_R,LL2_R), write('p_rank | mp_rank | wp_rank | name | gender | point\n\n'), append(L0,[[_point,_gender,_name]|R],LL_R), 性別ランクを得る(LL1_R,LL2_R,_name,_gender,_mp_rank), 表示する(L0,_point,_name,_gender,_mp_rank), R = []. ランクの作成(LL_R,LL1_R,LL2_R) :- ポイントランクの作成(LL_R), 男性ランクの作成(LL1_R), 女性ランクの作成(LL2_R). ポイントランクの作成(LL_R) :- findall([_point,_name,_gender],( tbl_point(_point,_name,_gender)), LL), rsort(LL,LL_R),!. 男性ランクの作成(LL1_R) :- findall([_point,_name],( tbl_point(_point,_name,1)), LL1), rsort(LL1,LL1_R). 女性ランクの作成(LL2_R) :- findall([_point,_name],( tbl_point(_point,_name,2)), LL2), rsort(LL2,LL2_R), 性別ランクを得る(LL1_R,LL2_R,_name,1,_rank) :- nth1(_rank,LL1_R,[_,_name]),!. 性別ランクを得る(LL1_R,LL2_R,_name,2,_rank) :- nth1(_rank,LL2_R,[_,_name]),!. 表示する(L0,_point,_name,1,_mp_rank) :- length([_|L0],_p_rank), writef('%7l|%9c|%9c|%6c|%8c|%6r\n',[_p_rank,_mp_rank,' ',_name,1,_point]),!. 表示する(L0,_point,_name,2,_wp_rank) :- length([_|L0],_p_rank), writef('%7l|%9c|%9c|%6c|%8c|%6r\n',[_p_rank,' ',_wp_rank,_name,2,_point]),!. rsort(L1,L2) :- sort(L1,L3), reverse(L3,L2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/10 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク):例に示すように、二つの整数値を読み込んで、 #               小さい方の数以上で大きいほうの数以下の整数 #               を全て加えた値を表示するプログラムを作成せよ。 #               (例) #                  二つの整数を入力してください。 #                  整数1: 37 # 整数2: 28 # 28以上37以下の全整数の和は325です。 #                # '二つの整数値を読み込んで、小さい方の数以上で大きいほうの数以下の整数を全て加えた値を表示する' :- '二つの整数値を読み込んで、'(_二つの整数値), 小さい方の数以上で大きいほうの数以下の整数を全て加えた値を(_二つの整数値,_小さい方の数,_大きい方の数,_小さい方の数以上で大きいほうの数以下の整数を全て加えた値), 小さい方の数以上で大きいほうの数以下の整数を全て加えた値を表示する(_小さい方の数,_大きい方の数,_小さい方の数以上で大きいほうの数以下の整数を全て加えた値). '二つの整数値を読み込んで、'(_二つの整数値) :- write('二つの整数を入力して下さい。\n'), findall(_整数,( for(1,_何番目,2), 整数入力(_何番目,_整数)), _二つの整数値). 整数入力(_何番目,_整数) :- writef('整数%t: ',[_何番目]), get_line(Line), 整数入力診断(Line,_整数),!. 整数入力(_何番目,_整数) :- 整数入力(_何番目,_整数). 整数入力診断(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. 整数入力診断(Line,_整数) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. 小さい方の数以上で大きいほうの数以下の整数を全て加えた値を([N1,N2],N1,N2,_小さい方の数以上で大きいほうの数以下の整数を全て加えた値) :- N1 =< N2, findsum(N,( for(N1,N,N2)), _小さい方の数以上で大きいほうの数以下の整数を全て加えた値). 小さい方の数以上で大きいほうの数以下の整数を全て加えた値を([N1,N2],N2,N1,_小さい方の数以上で大きいほうの数以下の整数を全て加えた値) :- N1 > N2, findsum(N,( for(N2,N,N1)), _小さい方の数以上で大きいほうの数以下の整数を全て加えた値). 小さい方の数以上で大きいほうの数以下の整数を全て加えた値を表示する(_小さい方の数,_大きい方の数,_小さい方の数以上で大きいほうの数以下の整数を全て加えた値) :- writef('%t以上%t以下の全整数を加えた値は%tです。\n',[_小さい方の数,_大きい方の数,_小さい方の数以上で大きいほうの数以下の整数を全て加えた値]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/968 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク):文字列st の中に含まれる文字ch の個数(含まれて # いなければ0 とする)を返す関数 # int str_chnum(const char st[], int ch) # を作成せよ.以下の実行例のように,関数の動作を確認 # 例.文字列を入力してください:Koukadai # 検索する文字を入力してください:a # その文字は2 個含まれています。 # # '文字列st の中に含まれる文字ch の個数(含まれていなければ0 とする)を返す'(_st,_ch,_文字の個数) :- count(sub_atom(_st,_,1,_,_ch),_個数). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% count(P,N) :- findsum(1,P,F), N is truncate(F) . findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum(_値ならび,_合計値),!. sum([],0). sum([N|R],S) :- sum(R,S2), S is N + S2. % 以下のサイトは # 出典:: 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://hibari.2ch.net/test/read.cgi/db/1316769778/147 # # 特定のidが持つintカラムから最も近いかつ小さい数字を持つidを求めたいのですが、 # # select id from t1 where int_col < (select int_col from t1 where id=特定のid) order by int_col desc # でできたのですが # もっとよいSQLありませんか? # # '特定のidが持つintカラムから最も近いかつ小さい数字を持つidを求める'(_id,_id_2) :- t1(_id,_int_col), findmax([_int_col_x,_id_x],( t1(_id_x,_int_col_x), _int_col_x < _int_col), [_int_col_2,_id_2]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1316769778/136 # # SQLserverの質問です # # 以下のようなテーブルがあります # *はユニークキーです。 # # DATE* ID1* ID2* VALUE # _______________ # # 200103 AAA 111 20 # 200103 AAA 112 10 # 200103 AAA 113 55 # 200103 AAA 121 60 # 200103 AAA 122 54 # 200103 AAA 123 44 # 200103 BBB 111 24 # 200103 BBB 113 43 # 200103 BBB 114 11 # 200103 BBB 121 11 # ・ # ・ # ・ # 200104 AAA 111 20 # 200104 AAA 112 10 # 200104 AAA 114 5 # 200104 AAA 122 54 # 200104 AAA 123 4 # 200104 BBB 111 24 # 200104 BBB 113 43 # 200104 BBB 112 21 # 200104 BBB 121 11 # 200105 AAA 122 54 # 200105 BBB 113 43 # 200105 BBB 112 21 # 200106 AAA 123 4 # 200106 BBB 111 24 # 200106 BBB 112 21 # # これをDATE=200103とDATE=200104だけとってきて # いかのように外部結合したいのですがどのようにすればよいでしょうか? # FULL JOINを利用したのですがうまくいきません。 # # ID1 ID2 VALUE_201103 VALUE_201104 # _________________________________________ # AAA 111 20 20 # AAA 112 10 10 # AAA 113 55 NULL # AAA 114 NULL 5 # AAA 121 60 NULL # ・ # ・ # ・ # # よろしくお願いいたします。 # # '以下のようなテーブルがあります *はユニークキーです。 DATE* ID1* ID2* VALUE これをDATE=200103とDATE=200104だけとってきて外部結合する'(_ID1,_ID2,_VALUE_200103,_VALUE_200104) :- findsetof([_ID1,_ID2],( テーブル(_日付,_ID1,_ID2,_), '日付が200103か200104'(_日付)), LL1), append(_,[[_ID1,_ID2]|_],LL1), '日付が200103か200104の適合組'(_ID1,_ID2,_VALUE_200103,_VALUE_200104). '日付が200103か200104'('200103'). '日付が200103か200104'('200104'). '日付が200103か200104の適合組'(_ID1,_ID2,_VALUE_200103,_VALUE_200104) :- テーブル('200103',_ID1,_ID2,_VALUE_200103), テーブル('200104',_ID1,_ID2,_VALUE_200104),!. '日付が20103か200104の適合組'(_ID1,_ID2,'NULL',_VALUE_200104) :- \+(テーブル('200103',_ID1,_ID2,_)), テーブル('200104',_ID1,_ID2,_VALUE_200104),!. '日付が200103か200104の適合組'(_ID1,_ID2,_VALUE_200103,'NULL') :- テーブル('200103',_ID1,_ID2,_VALUE_2001003), \+(テーブル('200104',_ID1,_ID2,_)),!. % 以下のサイトは # ・DBMS名とバージョン : SQL-Server 2008 # # 売り上げ # ID | AMOUNT     | # --+---------------------- # 1,200 # 1,300 # 1,400 # 2,100 # 4,100 # 5,200 # 5,300 # 6,400 # # 得意先マスタ # ID | NAME     | OYA_CODE # --+----------------------+-------------- # 1,abc商事 本店,1 # 2,abc商事 い支店,1 # 3,abc商事 う支店,1 # 4,def工務店 本店,4 # 5,def工務店 い支店,4 # 6,ghiサービス,6 # 7,jklシステム,7 # # ・欲しい結果 # 1,abc商事 本店,900 # 4,def工務店 本店,600 # 6,ghiサービス,6 # 7,jklシステム,400 # # ・説明 # 会社ごとに、売り上げ合計を出したいです。 # 得意先マスタに親会社コードを持っているので、親会社がある場合は親会社に合算したいです。 # 自分が親会社の場合は自らのコードが入っています。 # '会社ごとに、売り上げ合計を出す' :- 親会社ならび(_親会社ならび), 親会社ごとの合計ならび(_親会社ごとの合計ならび), 表示する(_親会社ごとの合計ならび). 親会社ならび(_親会社ならび) :- findall(_OYA_CODE,( 得意先マスタ(_OYA_CODE,_NAME,_OYA_CODE)), _親会社ならび). 親会社ごとの合計ならび(_親会社ごとの合計ならび) :- findall([_OYA_CODE,_合計],( append(_,[_OYA_CODE|_],_親会社ならび), 親会社の合計(_OYA_CODE,_NAME,_合計)), _親会社ごとの合計ならび). 親会社の合計(_OYA_CODE,_NAME,_合計) :- findall(_ID,( 得意先マスタ(_ID,_NAME,_OYA_CODE)), _子会社ならび), findsum(_AMOUNT,( 売上(_ID,_AMOUNT), member(_ID,_子会社ならび)), _合計). 表示する([]). 表示する([[_OYA_CODE,_,0.0]|R]) :- 表示する(R). 表示する([[_OYA_CODE,_NAME,_合計]|R]) :- \+(_合計=0.0), writef('%t,%t,%t\n',[_OYA_CODE,_NAME,_合計]), 表示する(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/629 # # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク): # scanf により n を受け取り, n×n 行列を二次元乱数配列で定 義する (二次元乱数配列の作成には下記の参考プログラムを利用せよ). その行列の対角より下の成分の和を求めよ. ただし乱数の範囲は 0 〜 3 とする. # 'n を受け取り, n×n 行列を二次元乱数ならびで定 義する (二次元乱数ならびの作成には下記の参考プログラムを利用せよ). その行列の対角より下の成分の和を求める. ただし乱数の範囲は 0 〜 3 とする'(_n,_対角より下の成分の和) :- 'n×n 行列を二次元乱数ならびで定 義する ただし乱数の範囲は 0 〜 3 とする'(_n,_乱数行列), 'その行列の対角より下の成分の和を求める ただし乱数の範囲は 0 〜 3 とする'(_乱数行列,_対角より下の成分の和). 'n×n 行列を二次元乱数ならびで定 義する ただし乱数の範囲は 0 〜 3 とする'(_n,_乱数行列) :- length(_乱数行列,_n), findall(L,( append(_,[L|_],LL), length(L,3), '乱数ならびで定義する ただし乱数の範囲は 0 〜 3 とする'(L)), _乱数行列). '乱数ならびで定義する ただし乱数の範囲は 0 〜 3 とする'([]). '乱数ならびで定義する ただし乱数の範囲は 0 〜 3 とする'([N|R]) :- N is random(4), '乱数ならびで定義する ただし乱数の範囲は 0 〜 3 とする'(R). 'その行列の対角より下の成分の和を求める'(_乱数行列,_対角より下の成分の和) :- 'その行列の対角より下の成分の和を求める'(1,3,_乱数行列,_対角より下の成分の和),!. 'その行列の対角より下の成分の和を求める'(N,N,_,0) :- !. 'その行列の対角より下の成分の和を求める'(M,N,_行列,_総計) :- M2 is M + 1, list_nth(M2,_行列,_行), findsum(_値,( for(1,I,M), nth1(I,_行,_値)), _行の合計), 'その行列の対角より下の成分の和を求める'(M2,N,_行列,_総計の一), _総計 is _行の合計 + _総計の一. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/569 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # int k を受け取り, 以下の級数 # # Sk= 1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + ... + (-1)k/(2k+1) # の値を返す関数 double my_series ( int k ) を作成せよ. main 文では scanf で int n を受け取り, 級数 Sk の値を k = 0, 1, 2, ..., n について計算し, 結果を表示せよ. # (ヒント k が大きくなると 4Sk は円周率に近づく.) # f(X,Y) :- Y is (-1) * X / ( 2 * X + 1). 'Sk= 1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + ... + (-1)k/(2k+1)'(_k,_SK) :- findsum(S, for(1,N,_k), f(N,S)), _SK). main(_n) :- for(0,_k,_n), 'Sk= 1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + ... + (-1)k/(2k+1)'(_k,_SK), writef('%t\n',[_SK]), _k = _n,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/503 # # あんまり暇なんでΣのプログラムの例を作ってみた # #include <stdio.h> # typedef double(*fk)(double); # double sigma(int k,int klimit,fk); # /* # 例えば # 5 # Σ (2k+1) # k=1 # */ # double func(double k) # { # return 2*k+1; # } # double sigma(int k,int klimit,fk FK) # { # double red = 0; # for(;k <= klimit;k++){ # printf("%.0lf",FK(k)); # if(k<klimit) # putchar('+'); # red += FK(k); # } # return red; # } # int main() # { # double result = sigma(1,5,func); # printf("=%.0lf \n",result); # return 0; # } # # シグマ(_k,S,E,_式,X) :- findsum(Y,( for(S,_k,E), Y is _式), X). % ?- シグマ(_k,1,5,2 * _k + 1,X). % X = 35.0 % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/968 # # # テーブル A: フィールド t, r # テーブル B: フィールド p, t # # テーブル B から p の値を指定して t の値を読み込みたいです。 # これだけなら select t from B where p = hoge で済むと思います。 # # さらに条件を追加して、テーブルAにおいて t の値がそれに等しいようなレコードの数が最小なものを選ぶにはどのようにすればよいでしょうか? # # 例えば # テーブルAが (0, 1), (0, 2), (0, 3), (1, 1), (1, 2) # テーブルBが (0, 0), (0, 1), (1, 0), (1, 1), ... # となっていたら # (0), (1) # ではなく # (1) # だけを得たいです。 # # 'テーブル A: フィールド t, r テーブル B: フィールド p, t テーブル B から p の値を指定して t の値を読み込み テーブルAにおいて t の値がそれに等しいようなレコードの数が最小なものを選ぶ'(_p,_t) :- findall([Count,_t],( 'B'(_p,_t), count('A'(_t,_r),Count)), L), min(L,[Count,_]), member([Count,_t],L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/941 # # DBMS : Mysql # # 説明 # データは10万件あると想定します。 # 挿入する際に一つのワードを二つのカラムに大して重複チェックを行いたいです。 # どちらか片方にそのワードが含まれていたらcountで0を返す結果が欲しいです。 # # select count(*) from table where colA = 'ワード' OR colB = 'ワード' # これだと現在2秒程度かかるので高速化したいです。 # # よろしくお願いします。 # # '挿入する際に一つのワードを二つのカラムに大して重複チェックを行いたいです。どちらか片方にそのワードが含まれていたらcountで0を返す結果が欲しい'(_ワード,_colA,_colB) :- 'どちらか片方にそのワードが含まれていたらcountで0を返す結果が欲しい'(_ワード,_colA,_colB), assertz(table(_colA,_colB)). 'どちらか片方にそのワードが含まれていたらcountで0を返す結果が欲しい'(_ワード,_colA,_colB) :- count(( table(_colA,_colB), どちらかに片方にワードが存在(_ワード,_colA,_colB,Count)), 0). どちらかに片方にワードが存在(_ワード,_ワード,_) :- !. どちらかに片方にワードが存在(_ワード,_,_ワード) :- !. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/924 # # # 外部結合したテーブルに内部結合ってできます? # 例 # A 契約テーブル # B 顧客テーブル # C コードテーブル # # パターン1 # select # A.key # B.bangou # C.code # from # A.key = B.key(+) # B.code_key = C.code_key # # Bが存在しない場合 B.bangou、C.codeはNULLでとれてほしい # 無理でしょうか? # '外部結合したテーブルに内部結合'(_A_key,_B_bango,_c_code) :- 契約テーブル(_A_key), 顧客テーブル_1(_B_key,_B_code_key,_B_bango), _A_key = _B_key, コードテーブル_1(_c_code_key,_c_code), _B_code_key = _c_code_key. 顧客テーブル_1(_B_key,_B_code_key,_B_bango) :- 顧客テーブル(_B_key,_B_code_key,_B_bango),!. 顧客テーブル_1(_B_key,[],[]). コードテーブル_1(_c_code_key,_c_code) :- コードテーブル(_c_code_key,_c_code). コードテーブル_1([],[]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/890 # # 初心者ですが失礼いたします。 # ID | DATA | TIME # --+------ # 1 | aaa | 01:02 # 2 | bbb | 03:42 # 1 | ccc | 02:11 # 3 | bbb | 01:32 # # というデータがあるとしまして # タイムが早い順に並べ替えて重複するIDを除外(この場合は1) # するにはどのようなクエリを書けばよいのでしょうか? # # select * from table ORDER BY `time` DESC # でタイム順には並べることができていますが重複するID(人物) # を除外したいのです。 # # % findsetof/3 % findmin/3 % を参照してください。 'タイムが早い順に並べ替えて重複するIDを除外する'(_ID,_DATA,_TIME) :- findsetof(_ID,( テーブル(_ID,_DATA,_TIME)), L1), append(_,[_ID|_],L1), findmax([_TIME,_ID,_DATA],( テーブル(_ID,_DATA,_TIME)), [_TIME,_ID,_DATA]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/860 # # 09/01 りんご # 09/02 りんご # 09/02 みかん # 09/03 りんご # 09/03 みかん # 09/03 バナナ # ・・・ # # このようなテーブルからりんごとみかんとバナナの3つ # 全てがある日付を取り出す構文はどうすれば出来ますか? # # '09/01 りんご\n09/02 りんご\n09/02 みかん\n09/03 りんご\n09/03 みかん\n09/03 バナナ\n・・・ このようなテーブルからりんごとみかんとバナナの3つ全てがある日付を取り出す'(_日付) :- findsetof(_日付,( テーブル(_日付,_)), L1), 'りんごとみかんとバナナの3つ全てがある日付'(L1,_日付). 'りんごとみかんとバナナの3つ全てがある'([_日付|R],_日付) :- 'りんごとみかんとバナナの3つ全てがある'(_日付). 'りんごとみかんとバナナの3つ全てがある'([_|R],_日付) :- 'りんごとみかんとバナナの3つ全てがある'(R,_日付). 'りんごとみかんとバナナの3つ全てがある'(_日付) :- テーブル(_日付,りんご), テーブル(_日付,みかん), テーブル(_日付,バナナ),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/846 # # あるカラムの重複のみを外したものをSELECTするにはどうとればいいですか? # # kadenテーブル # id item price # 1 パソコン 100000 # 2 パソコン 80000 # 3 デジカメ 50000 # 4 プリンター 20000 # 5 デンワ 6000 # # 結果 # 1 パソコン 100000 # 3 デジカメ 50000 # 4 プリンター 20000 # 5 デンワ 6000 # # パソコンを区別するのはidとpriceがありますがidが若い方でお願いします # # 'あるカラムの重複のみを外したものをSELECTする' :- findsetof(_item,( kaden(_id,_item,_price)), L), append(_,[_item|_],L), 第一解のみ取得(_id,_item,_price). 第一解のみ取得(_id,_item,_price) :- kaden(_id,_item,_price),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/839 # # MySQLです。 # テーブルから最初コラムAで並びかえて、その中の上位30個を # コラムBで並び替えた結果がほしい時はどう書けばいいのでしょうか # # SELECT * FROMT T ORDER BY A,B # だと、Aの中の同じ値の物しかBでソートされないみたいです。 # # 'テーブルから最初コラムAで並びかえて、その中の上位30個をコラムBで並び替えた結果がほしい'(_A,_B) :- length(L0,30), findsetof([_A,_B],( 'T'(_A,_B)), L1), sort(L1,L2), append(L0,_,L2), findall([_B,_A],member([_A,_B],L0),L3), sort(L3,L4), member([_B,_A],L4). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/804 # # 以下のようなテーブルTABがあります。 # # A B C # 1 40 35 # 2 80 50 # 3 10 5 # 4 20 15 # 5 70 60 # # 列Aで昇順にソートして一番小さい値を持つ行を基準に、 # 以下の計算式で列Dを求めたいです。 # # D(n+1)= C(n)× D(n)÷ B(n+1) # nは列Aの順位で求めたい結果は、 # # A B C D # 1 40 35 1 # 2 80 50 0.4375 # 3 10 5 2.1875 # 4 20 15 0.546875 # 5 70 60 0.1171875 # # みたいな感じになります。 # # これってSQLで可能でしょうか? # DBMSはOracle11gR2です。 # # # '列Aで昇順にソートして一番小さい値を持つ行を基準に、以下の計算式で列Dを求めたいです。 D(n+1)= C(n)× D(n)÷ B(n+1)'(L) :- findsetof([_A,_B,_C],'TAB'(_A,_B,_C),LL), LL = [[_A,_B,_C]|R], '以下の計算式で列Dを求める。 D(n+1)= C(n)× D(n)÷ B(n+1)'(R,[_A,_B,_C,1],L). '以下の計算式で列Dを求める。 D(n+1)= C(n)× D(n)÷ B(n+1)'(R,L,L). '以下の計算式で列Dを求める。 D(n+1)= C(n)× D(n)÷ B(n+1)'([[_A_1,_B_1,_C_1]|R],[_A,_B,_C,_D],L) :- _D_1 is _C * _D / _B_1, '以下の計算式で列Dを求める。 D(n+1)= C(n)× D(n)÷ B(n+1)'(R,[_A_1,_B_1,_C_1,_D_1],L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/788 # # prd1テーブル # # p_id 商品ID # p_name 商品名前 # ---- # prd2テーブル # # p_id 商品ID # p_date 製造年 # ----- # prd3テーブル # # p_id # p_date # p_frame 種類1 # ---- # prd4テーブル # # p_frame # p_pattern 種類2(0又は1が入る) # ---- # prd1の商品IDとprd2の商品IDは1対Nの関係です。 # prd1の全商品に対して # prd1に対するprd2を抽出(inner join でも where でも)した以下のテーブル # # p_id p_date # 1 2001-01-01 # 1 2001-01-02 # 2 2001-01-01 # 2 2001-01-02 # 2 2001-01-03 # # に対して、prd3とprd4によって抽出したテーブルを結合するときに # 商品IDと製造年をキーに結合したいと思っています。 # # prd3はちなみに # # p_id p_date p_frame # 1 2001-01-01 1 # 1 2001-01-02 2 # 1 2001-01-03 3 # 1 2001-01-04 4 # 3 2001-01-01 5 # # prd4は、 # # p_frame p_pattern # 1 0 # 2 1 # 3 0 # 4 1 # 5 1 # 6 1 # # p_id p_date SUM(p_pattern_0) SUM(p_pattern_1) というテーブルを抽出したいです。 # # 1 2001-01-01 5 2 # 1 2001-01-02 3 NULL # 2 2001-01-01 NULL NULL # # といった感じです。prd1とprd2を結合したモノに、 prd3とprd4を結合したいのです。 # 'prd3とprd4によって抽出したテーブルを結合するときに商品IDと製造年をキーに結合する'(_p_id,_p_date,_sum_p_pattern_0,_sum_p_pattern_1) :- findsetof([_p_id,_p_date],( prd1(_p_id), prd2(_p_id,_p_date)), L1), append(_,[[_p_id,_p_date]|_],L1), prd3(_p_id,_p_date,_p_frame), findsum([_p_pattern_0,_p_pattern_1],( prd4(_p_frame,_p_pattern), p_pattern_x(_p_pattern,_p_pattern_0,_p_pattern_1)), [_sum_p_pattern_0,_sum_p_pattern_1]). p_pattern_x(0,1,0). p_pattern_x(1,0,1). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/730 # # MySQLで、以下のような2つのテーブルがあり、parent_idはparentの外部キーとなってます。 # # parent # id p_value # 1 AAA # 2 BBB # # children # parent_id c_value # 1 aaa # 1 bbb # 1 ccc # 2 ddd # 2 eee # # これを # # parent_id p_value c_value # 1 AAA (aaa, bbb, ccc) # 2 BBB (ddd, eee) # # のような形で取り出すことはできますか? # GROUP BYでparent_idでまとめることはできたのですが、c_valueをまとめて取り出す方法がわかりません。 # # 結合情報を一行に纏める(_parent_id,_p_value,_子供の名前ならび) :- findsetof(_parent_id,( parent(_parent_id,_)), _親の名前ならび), append(_,[_parent_id|R],_親の名前ならび), parent(_parent_id,_p_value), findall(c_value,( children(_parent_id,_c_value)), _子供の名前ならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/721 # # ユーザ毎に各商品を何点購入、合計何点購入したかを集計するSQLがうまく書けず悩んでおります。 # 下記のようなテーブルを想定しております。 # # Shohinテーブル # 商品id, 商品名 # sid, sname # 1, "商品A" # 2, "商品B" # 3, "商品C" # 4, "商品D" # # Userテーブル # ユーザid, ユーザ名 # uid, uname # 1, "ユーザA" # 2, "ユーザB" # 3, "ユーザC" # # Rirekiテーブル(購入履歴) # rid,uid, sid, kazu # 1, 2, 3, 2 # 2, 1, 1, 1 # 3, 3, 2, 4 # # Shohinテーブルの商品,Userテーブルのユーザは追加・削除される可能性があります。 # # このような場合に下のように集計結果を得るにはどのようなSQLを書けばよいでしょうか。 # # 集計結果 # ユーザ名 商品A 商品B 商品 商品D … 合計 # ユーザA 1 2 0 2 5 # ユーザB 3 1 2 2 8 # ユーザC 0 2 0 0 2 # … # # 使用予定のデータベースはMySQL 5.0です。 # 何卒よろしくお願い致します。 # # 'ユーザ毎に各商品を何点購入、合計何点購入したかを集計する' :- 見出し表示, 行表示フォーマット(_行表示フォーマット), forall( 'ユーザ毎に各商品を何点購入、合計何点購入したかを集計する'(_行表示フォーマット,_uname,_商品合計ならび,_ユーザ毎総合計), ユーザ合計表示(_行表示フォーマット,_uname,_商品合計ならび,_ユーザ毎総合計)). 'ユーザ毎に各商品を何点購入、合計何点購入したかを集計する'(_行表示フォーマット,_uname,_商品合計ならび,_ユーザ毎総合計) :- ユーザ毎に(_uid,_uname), findall(_何点,( '各商品を何点購入、'(_uid,_何点)), _各商品何点), 合計何点購入したか(_各商品何点,_合計何点). ユーザ毎に(_uid,_uname) :- user(_uid,_uname). '各商品を何点購入、'(_uid,_何点) :- shohin(_sid,_), findsum(_kazu,( rireki(_,_uid,_sid,_kazu), _何点). 合計何点購入したか(_各商品何点,_合計何点) :- sumlist(_各商品何点,_合計何点). 見出し表示 :- 見出し項目ならび(_見出し項目ならび), 見出し表示フォーマット(_見出し表示フォーマット), writef(_見出し表示フォーマット,_見出し項目ならび). 見出し項目ならび(_見出し項目ならび) :- findall(_sname,( shohin(_sid,_sname)), _商品名ならび), append(_商品名ならび,[合計],_見出し項目ならび). 見出し表示フォーマット(_見出し表示フォーマット) :- findall('%8r',shohin(_,_),L1), atomic_list_concat(L1,S1), atomic_list_concat([' ',S1,'%8r'],_見出し表示フォーマット). 行表示フォーマット(_行表示フォーマット) :- findall('%8r',shohin(_,_),L1), atomic_list_concat(L1,S1), atomic_list_concat(['%8l',S1,'%8r\n'],_行表示フォーマット). ユーザ合計表示(_行表示フォーマット,_uname,_商品合計ならび,_ユーザ毎総合計) :- append([_uname|_商品合計ならび],[_ユーザ毎総合計],L), writef(_行表示フォーマット,L),!. findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sumlist(_値ならび,_合計値),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/943 # # これらが5個の課題です。 # お願いします。 # # (5) 3×3行列に整数のデータを入力し,その縦・横・斜めに足した合計がすべて等しくなるかを確認するプログラムを作成せよ.プログラムは以下を満たすものとする. # 整数のデータの入力では,for文を用いること. # 予め3×3個の整数の要素を持つ二次元配列を準備する. # 縦は3本,横は3本,斜め2本のそれぞれの合計が等しいかを確認する必要がある. # '予め3×3個の整数の要素を持つ二次元配列を準備する'(_二次元配列) :- length(_二次元配列,3), findall(L,( append(L0,[L|_],_二次元配列), length(L,3), findall(_要素,( append(L01,[_要素|_],L), length([_|L0],_何行目), length([_|L01],_何列目), writef('[%t][%t] : ',[_何行目,_何列目]), get_integer(_要素)), L)), _二次元配列), assertz(予め用意した二次元配列(_二次元配列)),!. '3×3行列に整数のデータを入力し,その縦・横・斜めに足した合計がすべて等しくなるかを確認する' :- 予め用意した二次元配列(_二次元配列), 行合計が一致する(_二次元配列,_一致した合計), 転置(_二次元配列,_転置された二次元配列), 行合計が一致する(_転置された二次元配列,_一致した合計), 斜め要素の合計(_二次元配列,_一致した合計). 行合計が一致する(_二次元配列,_一致した合計) :- findsum(_合計,( append(_,[_行|_],_二次元配列), sum(_行,_合計)), L), all(L,_一致した合計). 斜め要素の合計(_二次元配列,_一致した合計) :- findsum(_斜め要素,( for(1,N,3), nth1(N,_二次元配列,_行), nth1(N,_行,_斜め要素)), _一致した合計), findsum(_斜め要素,( for(1,N,3), nth1(N,_二次元配列,_行), reverse(_行,_反転した行), nth1(N,_反転した行,_斜め要素)), _一致した合計),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/548 # # [1] 授業単元:計算機プログラミング # [2] 問題文:http://ime.nu/www.uproda.net/down/uproda333628.pdf # # [問題6-1] 関数f(X) = |sin(2x)|を1周期積分するプログラムを作成せよ。このとき、 # 分割数をN = 2^k (k = 1,2,3, ... ) として、シンプソン則、台形則、および中点則で # 計算したときの結果の収束状況を比較せよ。なお、積分結果は1である。 # '関数f(X) = |sin(2x)|を1周期積分する'(中間点則,_分割単位,_積分値) :- '中間点則で関数f(X) = |sin(2x)|を1周期積分する'(_分割単位,_積分値). '中間点則で関数f(X) = |sin(2x)|を1周期積分する'(_分割単位,_積分値) :- _分割数 is truncate(2 ^ _分割単位), _h is pi / _分割数, findsum(Y,( for(1,N,_分割数), X is (N-1) * _h + _h / 2, Y is abs(sin(X))), Sum), _積分値 is Sum * _h. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/666 # # id id2 hoge # 1 1 a # 2 1 b # 3 1 c # 4 1 d # 5 2 a # 6 2 b # # こんなテーブルにselect * from test group by id2とやると # 4 1 d # 6 2 b # # が出ますが最初に登録した # 1 1 a # 5 2 b # # と出したいのですがどうしたらいいでしょうか? # # 'testテーブル上のid2をキーにグループ参照をして最初の組みを取り出す'(_組) :- findsetof(_id2,( test(_,_id2,_)), L), 最初の組を取り出す(L,_組). 最初の組を取り出す([],_組) :- !,fail. 最初の組を取り出す([_鍵|R],_組) :- test(_id,_id2,_hoge). 最初の組を取り出す([_|R],_組) :- 最初の組を取り出す(R,_組). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/710 # # お願いします。 # # [1] 授業単元: 課題 # [2] 問題文 # # 1. ランダムに決めた10個の整数(0〜50)を要素とする配列Aと配列Bを用意する。 # 2. 配列Aと配列Bに共通する整数を表示する。 # # # '1. ランダムに決めた10個の整数(0〜50)を要素とする配列Aと配列Bを用意する。 2. 配列Aと配列Bに共通する整数を表示する。' :- 'ランダムに決めた10個の整数(0〜50)を要素とするならびAとならびBを用意する。'(_ならびA,_ならびB), 'ならびAとならびBに共通する整数を表示する'(_ならびA,_ならびB). 'ランダムに決めた10個の整数(0〜50)を要素とするならびAとならびBを用意する。'(_ならびA,_ならびB) :- length(_ならびA,10), length(_ならびB,10), findall(_要素,( append(_,[_|_],_ならびA), _要素 is random(51)), _ならびA), findall(_要素,( append(_,[_|_],_ならびB), _要素 is random(51)), _ならびB),!. 'ならびAとならびBに共通する整数を表示する'(_ならびA,_ならびB) :- 共通する整数ならび(_ならびA,_ならびB,_共通する整数ならび), 表示する(_ならびA,_ならびB,_共通する整数ならび). 共通する整数ならび(_ならびA,_ならびB,_共通する整数ならび) :- setof(_共通する整数,( member(_共通する整数,_ならびA), member(_共通する整数,_ならびB)), _共通する整数ならび). 表示する(_ならびA,_ならびB,_共通する整数ならび) :- writef('%t,%t,の共通する整数は\n',[_ならびA,_ならびB]), append(_,[_共通する整数|R],_共通する整数ならび), writef('%t ',[__共通する整数]), R = [], write(' です。\n'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/602 # # SQL Server2008 以下のテーブル「値段」から # # id | 食品 | 値段合計 | 値段1 | 値段2 | 値段3 # ________________________ # # 1 | 肉 |  500  |  500 | # 1 | 魚 |  300  |     | 300 # 1 | 卵 |  200 | 100 | 50 | 50 # 2 | 肉 |  350 | 250 | 100 # 2 | 魚 |  400 | 150 | 250 # # # 以下の結果を得て、新しくテーブル「値段合計」を作りたいです。 # # # id |値段id合計|肉値段合計|肉値段1|肉値段2|肉値段3|魚値段合計|魚値段1|魚値段2|魚値段3|卵値段合計|卵値段1|卵値段2|卵値段3| # _________________________________________________________________________________________________________________________________ # 1 | 1000 | 500 | 500 | | | 300 | | 300 | | 200 | 100 | 50 | 50 | # 2 | 750 | 350 | 250 | 100 | | 400 | 150 | 250 # # # 肉、魚、卵はそれぞれのidに一行しかなく、 # 肉と魚は必ずありますが、卵はあるとは限りません。 # シンプル縦横問題はわかったのですが、複雑になると一挙にわからなくなりました。。 # ご教示お願い致します。 # '「値段合計」を作る' :- findsetof(id,値段(_id,_,_,_,_,_),_idならび), append(_,[_id|R],_idならび), 食品の値段を得る(_id,肉,_肉値段合計,_肉値段1,_肉値段2,_肉値段3), 食品の値段を得る(_id,魚,_魚値段合計,_魚値段1,_魚値段2,_魚値段3), 食品の値段を得る(_id,卵,_卵値段合計,_卵値段1,_卵値段2,_卵値段3), _値段id合計 is _肉値段合計 + _魚値段合計 + _卵値段合計, assertz(値段合計(_id,_値段id合計,_肉値段合計,_肉値段1,_肉値段2,_肉値段3,_魚値段合計,_魚値段1,_魚値段2,_魚値段3,_卵値段合計,_卵値段1,_卵値段2,_卵値段3)), R = []. 食品の値段を得る(_id,_食品,_値段合計,_値段1,_値段2,_値段3) :- 値段(_id,_食品,_値段合計,_値段1,_値段2,_値段3),!. 食品の値段を得る(_id,_食品,0,0,0,0). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/597 # # 下記のようなデータがあるとき、投票回数が3以上に該当する投票者の # レコードを全て除いた結果が欲しいのですがどのようにしたらよいでしょうか? # 595ですがすみません重要なカラムを省いていました。 # その投票者を省くのはそのアンケートNoだけに限定したいのです # # アンケートNo ,投票者 ,投票回数, 誰に投票したか # ------------------------------- # 1   , A   , 1   , D # 1   , B   , 1   , E # 1   , B   , 2   , F # 1   , B   , 3   , G # 1   , C   , 2   , H # 1   , C   , 2   , I # 2   , A   , 1   , D # 2   , B   , 1   , E # 2   , C   , 1   , H # 2   , C   , 2   , I # 2   , C   , 3   , J # # 欲しいデータ # 1   , A   , 1   , D # 1   , C   , 2   , H # 1   , C   , 2   , I # 2   , A   , 1   , D # 2   , B   , 1   , E # # '投票回数が3以上に該当する投票者のレコードを全て除いた結果'(_アンケートNo,_投票者,_投票回数,_誰に投票したか) :- findsetof([_アンケートNo,_投票者],( データ(_アンケートNo,_投票者,_投票回数,_誰に投票したか), _投票回数 >= 3), L), データ(_アンケートNo,_投票者,_投票回数,_誰に投票したか), \+(member([_アンケートNo,_投票者],L)). findsetof(A,B,L) :- findall(A,B,C), setof(A,member(A,C),L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/595 # # 下記のようなデータがあるとき、投票回数が3以上に該当する投票者の # レコードを全て除いた結果が欲しいのですがどのようにしたらよいでしょうか? # # 投票者 ,投票回数, 誰に投票したか # ------------------------------- # A   , 1   , D # B   , 1   , E # B   , 2   , F # B   , 3   , G # C   , 2   , H # C   , 2   , I # # (3以上に該当する投票者Bのレコードを除く) # A   , 1   , D # C   , 2   , H # C   , 2   , I # # '投票回数が3以上に該当する投票者のレコードを全て除いた結果'(_投票者,_投票回数,_誰に投票したか) :- findsetof(_投票者,( データ(_投票者,_投票回数,_誰に投票したか), _投票回数 >= 3), L), データ(_投票者,_投票回数,_誰に投票したか), \+(member(_投票者,L)). findsetof(A,B,L) :- findall(A,B,C), setof(A,member(A,C),L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/558 # # create table aaa ( # id integer not null, # test text not null, # test2 integer not null, # unique (id,test) # ); # # create table bbb ( # id integer not null, # test text not null, # test2 integer not null # unique (id,test) # ); # # aaa # id test test2 # 10 aaa 100 # 10 bbb 200 # 10 ccc 100 # 10 ddd 100 # # bbb # id test test2 # 10 aaa 200 # 10 bbb 100 # # ほしい結果 # id test test2 # 10 aaa 200 # 10 bbb 100 # 10 ccc 100 # 10 ddd 100 # aaa(10,111,200). aaa(10,bbb,100). bbb(10,aaa,200). bbb(10,bbb,100). bbb(10,ccc,100). bbb(10,ddd,100). ほしい結果(_id,_test,_test2) :- findall([_id,_test,_test2],( aaa(_id,_test,_test2)), LL1), findall([_id,_test,_test2],( bbb(_id,_test,_test2)), LL2), append(LL1,LL2,LL), findsetof([_id,_test],( append(_,[[_id,_test]|_],LL)), LL3), findmax([_test2,_id,_test],( append(_,[[_id,_test]|_],LL3), append(_,[[_id,_test,_test2]|_],LL)), LL4), append(_,[[_test2,_id,_test]|_],LL4). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/699 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # # 次のプログラムにおいて,sumrangeは,M行N列の行列A = (a_{ij})(実際には, # 大きさM×Nのint 型の2次元配列で表される)を引数として渡されると,各行の最大値から最小値を # 引いた値の(全体での)和を返す関数である.(ここでは,C 言語の配列の添え字にならって,i, jは # 0から始まると考えている) 例えば,M = 3, N = 4のとき,主プログラム中で,配列aの値に # { 7 5 -2 4 # -3 11 -5 6 # 2 6 6 14 }が入力された場合,0行目の最大値は7,最小値は-2であり,その差は7 - (-2) = 9, # 1行目の最大値は11,最小値は-5であり,その差は11 - (-5) = 16, 2行目の最大値は14,最小値は2であり, # その差は14 - 2 = 12 となるので,sumrangeは9 + 16 + 12 = 37を返す.関数sumrangeを,下記のプログラムの # /* INSERT HERE */ の部分に挿入できるように書け.なお,行列の(i, j)成分は,2次元配列の[i][j]要素に # 対応するものとせよ.また,配列中のデータは,-10000以上10000未満であると仮定してよい. # # #include # #define M (適当な正整数) # #define N (適当な正整数) # /* INSERT HERE */ # int main(void) # { # int a[M][N]; # /* ここで a[0][0]〜a[M-1][N-1] の値を入力する */ # printf("sumrange = %2d\n", sumrange(a)); # return 0; # } '行列の各行の最大値から最小値を引いた値の(全体での)和を返す'(_行列,_和) :- findsum(_行の最大値と最小値の差,( append(_,[_行|_],_行列), max(_行,_最大値), min(_行,_最小値), _行の最大値と最小値の差 is _最大値 - _最小値), _和). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/538 # # select *, tableid=1 from test # みたいに全てのカラムに加えてtableid=1を加えたものを取得したいのですが # どういうSQLかけばいいのでしょう? # *はidとnameが入ってるとしたらこんな感じのものを期待してます # # ++++++++++++++++++++ # + id + name + .tableid .+ # ++++++++++++++++++++ # + 1 .+ .加藤 +   1   + # ++++++++++++++++++++ # + 2 .+ .伊藤 +   1   + # ++++++++++++++++++++ # + 3 .+ .佐藤 +   1   + # ++++++++++++++++++++ # # 'select *, tableid=1 from test みたいに全てのカラムに加えてtableid=1を加えたものを取得する'(X) :- count(テーブル構造(_テーブル,_,_項目名),_項目数), length(L,_項目数), P =.. [_テーブル|L], call(P), append(L,['tableid=1'],X). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/520 # # SQLiteを使っています。 # # 顧客A(顧客idは100)さんの最新の購入物を表示したいのですが、 # select 顧客.顧客名, 購入物.顧客名 from 顧客 natural join 購入物 where 顧客id=100 order by 購入日 desc limit 1; # # っていま書いていますが、無駄が多い気がします。 # これを手直していただきたいのですが、よろしくお願いします。 # # '顧客A(顧客idは100)さんの最新の購入物を表示する'(_id,_最新購入物) :- findmax([_購入日,_商品名],( 顧客(_id,_顧客名), 購入履歴(_id,_商品名,_購入日)), [_,_最新購入物]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/483 # # 全校学生健康診断表で # 身長の高い人50人を選ぶ場合 # select 学生ID, 学生名, 学生身長 from 健康診断表 order by 学生身長 desc limit 50 # とかでいいと思いますが # その次の50人を選ぶ場合はどうしたらいいのでしょうか? # # 身長の高い人50人づつ選ぶ場合 :- findall([_学生身長,_学生ID,_学生名],( 健康診断表(_学生ID,_学生名,_学生身長)), LL1), sort(LL1,LL2), reverse(LL2,LL3), 身長の高い人50人を選ぶ(LL3). 身長の高い人50人を選ぶ(LL) :- length(LL0,50), append(LL0,LL2,LL), append(_,[[_学生身長,_学生ID,_学生名]|R],LL0), writef('%t,%t,%t\n',[_学生ID,_学生名,_学生身長]), R = []. 身長の高い人50人を選ぶ(LL) :- length(LL0,50), append(LL0,LL2,LL), 身長の高い人50人を選ぶ(LL2). 身長の高い人50人を選ぶ(LL) :- append(_,[[_学生身長,_学生ID,_学生名]|R],LL), writef('%t,%t,%t\n',[_学生ID,_学生名,_学生身長]), R = []. 身長の高い人50人を選ぶ([]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/487 # [1] 授業単元:計算機入門及び演習 # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10311.txt # # 以下の問題を解くプログラムをC言語を用いて作成しなさい. # # AさんとBさんは点数が書かれたカードを何枚か持っている. Aさんのカードと # Bさんのカードを1枚ずつ交換して,Aさんの持つカードの合計点数とBさんの持つ # カード合計点数が等しくなるようにしたい. # このときどのカードとどのカードを交換したらよいか.ただし,カードを # 交換しなくても合計点数が等しい場合でも,必ずカードの交換を行うものとする. # # 入力は,いくつかのデータセットからなる.各データセットは次の形式で与えられる. n m # s1 # s2 # ... # sn # sn+1 # sn+2 # ... # sn+m # 各データセットの最初の行は空白ひとつで区切られたふたつの数 n と m を含み, # n はAさんのカードの枚数,m はBさんのカードの枚数を表す.続く n+m 行には, # 各カードの点数が 1 行にひとつずつ並ぶ. # 最初の n 個の点数 (s1 から sn まで) はAさんのカードの点数,残りの # m 個の点数 (sn+1 から sn+m まで) はBさんのカードの点数を表す. # n および m は 100 以下の正の整数とし,カードの点数は 0 以上 100 以下の # 整数値とする.入力の終わりは,空白ひとつで区切られたふたつの 0 を含む # 1 行で示される. # 各データセットに対し,Aさん,Bさんの交換前のすべてのカードと交換すべき2つの # カードを出力すること.形式は特に問わない(実行例を参考にすること). # なお,合計を等しくするようなカードの交換の方法が複数ある場合は, # 交換するカードの点数の和が最小となるもののみを出力すること. # また,カードの点数の合計を等しくするような交換が存在しない場合はその旨を # 出力すること. # 'AさんとBさんは点数が書かれたカードを何枚か持っている. AさんのカードとBさんのカードを1枚ずつ交換して,Aさんの持つカードの合計点数とBさんの持つカード合計点数が等しくなるようにする'(LA,LB,LX) :- quicksort(LA,LA1), quicksort(LB,LB1), length(LA1,LenA), length(LB1,LenB), append(LA1,LB1,L), findall([L1,L2],( 組合せ(L,LenA,L1), sum(L1,Sum), 'L1分をLから取り除く'(L1,L,L3), 組合せ(L3,LenB,L2),sum(L2,Sum)), LX), 最短手順を探る(LA1,LX,_交換候補). 'L1分をLから取り除く'([],L,L) :- !. 'L1分をLから取り除く'([A|R1],L1,L2) :- 'AをL1から取り除く'(A,L1,L3), 'L1分をLから取り除く'(R1,L3,L2). 'AをL1から取り除く'(A,L1,L2) :- append(L0,[A|R],L1), append(L0,R,L2),!. sum([],0) :- !. sum([A|R],X) :- sum(R,Y), X is A + Y. 最短手順を探る(LA1,LL,_放出,_受け取り) :- findall([_放出,_受取],( append(_,[[L1,_]|_],LL), 交換候補(LA1,L1,_放出,_受取)), LX), findmin(Len,( append(_,[[U1,U2]|_],LX), length(U1,Len)), Min), append(_,[[_放出,_受け取り]|_],LX), length(U1,Min). 交換候補([],L,[],L) :- !. 交換候補(L,[],L,[]) :- !. 交換候補([A|R1],[A|R2],R3,R4) :- 交換候補(R1,R2,R3,R4),!. 交換候補([A|R1],[B|R2],[A|R3],R4) :- A < B, 交換候補(R1,[B|R2],R3,R4),!. 交換候補([A|R1],[B|R2],R3,[B|R4]) :- A > B, 交換候補([A|R1],R2,R3,R4),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/240 # # 【1】c言語 【2】二つの西暦で入力された年月日から、その間の日数を計算するプログラムを作成してください。 # ここに処理が入る というとこのプログラムをお願いします # プログラムのベース # int uruu(int y); # int monthday(int y, int m); # //---------------------------------------------------- # int main(){ # int year_a, month_a, day_a; # int year_b, month_b, day_b; # int days; int i; days = 0; # printf("日数計算プログラム\n"); # printf("数え始める西暦年月日を入力してください\n"); # scanf("%d,%d,%d",&year_a, &month_a, &day_a); # printf("数え終わる西暦年月日を入力してください\n"); # scanf("%d,%d,%d",&year_b, &month_b, &day_b); # ここに処理が入いる # printf("%d年%d月%d日から%d年%d月%d日までの日数は%d日です。\n", year_a, month_a, day_a, year_b, month_b, day_b, days); # return 0; } # //うるう年ならtrue(1)、そうでないならfalse(0)を返す関数 # int uruu(int y){ # int ret; # ここに処理が入る # return ret; } # //年、月を受け取り、その月の日数を返す関数 # int monthday(int y, int m){ # int d; # ここに処理が入る # return d; } # # '日数計算プログラム' :- 数え始める西暦年月日を入力してください(_年_1,_月_1,_日_1), 数え終わる西暦年月日を入力してください(_年_2,_月_2,_日_2), 日数計算(_年_1,_月_1,_日_1,_年_2,_月_2,_日_2,_日数), writef('%d年%d月%d日から%d年%d月%d日までの日数は%d日です。',[_年_1,_月_1,_日_1,_年_2,_月_2,_日_2,_日数]). 数え始める西暦年月日を入力してください(_数え始める西暦年月日) :- write('数え始める西暦年月日を入力してください(yyyy,mm,dd) : '), 年月日の入力(_年,_月,_日). 数え終わる西暦年月日を入力してください(_年,_月,_日) :- write('数え終わる西暦年月日を入力してください(yyyy mm dd) : '), 年月日の入力(_年,_月,_日). 年月日の入力(_年,_月,_日) :- readln([_年,_月,_日]). 日数計算(_年_1,_月_1,_日_1,_年_2,_月_2,_日_2,_日数) :- _年_2 - _年_1 > 1, _開始年の翌年 is _年_1 + 1, _最終年の前年 is _年_2 - 1, findsum(_年日数,( for(_開始年の翌年,_年,_最終年の前年), 一年間の日数(_年,_年日数)), _間の年の日数合計), 翌年の正月までの日数(_年_1,_月_1,_日_1,_翌年の正月までの日数), 積算日(_年_2,_月_2,_日_2,_積算日), _日数 is truncate(_翌年の正月までの日数 + _間の年の日数合計 + _積算日). '年、月を受け取り、その月の日数を返す'(_年,_月,31) :- member(_月,[1,3,5,7,8,10,12]),!. '年、月を受け取り、その月の日数を返す'(_年,_月,30) :- member(_月,[4,6,9,11]),!. '年、月を受け取り、その月の日数を返す'(_年,2,29) :- うるう年(_年),!. '年、月を受け取り、その月の日数を返す'(_年,2,28) :- \+(うるう年(_年)). 一年間の日数(_年,365) :- \+(うるう年(_年)). 一年間の日数(_年,366) :- うるう年(_年),!. 積算日(_,1,_日,_日) :- !. 積算日(_年,_月,_日,_積算日) :- _前月 is _月 - 1, findsum(_月日数,( for(1,_月_1,_前月), '年、月を受け取り、その月の日数を返す'(_年,_月_1,_月日数)), _正月から前月末日までの積算日), _積算日 is truncate(_正月から前月末日までの積算日 + _日). 翌年の正月までの日数(_年,_月,_日,_翌年の正月までの日数) :- findsum(_月日数,( for(_月,_月_1,12), '年、月を受け取り、その月の日数を返す'(_年,_月_1,_月日数)), _当月初日から翌年正月までの日数), _翌年の正月までの日数 is truncate(_当月初日から翌年正月までの日数 - _日 + 1). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/429 # # ・DB2 v9.5 # ・テーブルの内容 # ■テーブル成績 # 名前,教科コード,点数 # ========== # Aさん,1,50 # Aさん,2,70 # Bさん,3,80 # # ■テーブル教科 # 教科コード,教科名 # ========== # 1,数学 # 2,国語 # 3,社会 # # ・欲しい結果 # Aさん,数学,50 # Aさん,国語,70 # Aさん,社会,0 # Bさん,数学,0 # Bさん,国語,0 # Bさん,社会,80 # # ・説明 # どう結合したら目的の結果が得られるかわかりません。 # おしえてくださいますでしょうか。 # 成績('Aさん','1',50). 成績('Aさん','2',70). 成績('Bさん','3',80). 教科('1',数学). 教科('2',国語). 教科('3',社会). 成績の表示 :- '成績と教科の結合。ただし、成績がない教科の点数は0とする'(_教科成績ならび), append(_,[[[_名前,_教科名,_点数]|R],_教科成績ならび), writef('%t,%t,%t\n',[_名前,_教科名,_点数]), R = []. '成績と教科の結合。ただし、成績がない教科の点数は0とする'(_教科成績ならび) :- findsetof(_名前,成績(_名前,_,_),_名前ならび), findall([_名前,_教科名,_点数],( append(_,[_名前|R],_名前ならび), 教科(_教科コード,_教科名), 科目成績を得る(_名前,_教科コード,_点数)), _教科成績ならび). 科目成績を得る(_名前,_教科コード,_点数) :- テーブル成績(_名前,_教科コード,_点数),!. 科目成績を得る(_,_,0). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/220 # # ●正規表現の使用環境 # grepとかegrepとか # # ●検索か置換か? # 検索 # # ●説明 # a,nの2文字のみが含まれる行を検索したい # # ●対象データ # aaa # ann # nana # anana # sin # anans # # ●希望する結果 # 上4つのみ出力 # 下二つは引っかからない # # 'a,nの2文字のみが含まれる行を検索したい'(_行ならび,_行) :- append(_,[_行|_],_行ならび), findsetof(_文字,sub_atom(_行,_,1,_,_文字),[a,n]). % 以下のサイトは # ・以下の実行結果になるようプログラムを作成せよ。 # # 実行結果 # 人数 > 5 # 0人目: # 名前 > Taro # 電話番号 > 090-111-1111 # 1人目: # 名前 > Hanako # 電話番号 > 090-222-2222 # 2人目: # 名前 > Ichiro # 電話番号 > 090-333-3333 # 3人目: # 名前 > Jiro # 電話番号 > 090-444-4444 # 4人目: # 名前 > Hanayo # 電話番号 > 090-555-5555 # # 電話帳: # Taro, 090-111-1111 # Hanako, 090-222-2222 # Ichiro, 090-333-3333 # Jiro, 090-444-4444 # Hanayo, 090-555-5555 # # 名前 > Hanayo # Hanayo, 090-555-5555 # # 実行結果 # 人数 > 2 # 0人目: # 名前 > Taro # 電話番号 > 090-111-1111 # 1人目: # 名前 > Taro # 電話番号 > 090-222-2222 # # 電話帳: # Taro, 090-111-1111 # Taro, 090-222-2222 # # 名前 > Taro # Taro, 090-111-1111 # Taro, 090-222-2222 # # 実行結果 # 人数 > 0 # # 電話帳: # # 名前 > Taro # 該当者なし '電話番号を登録し、それを表示し、さらに検索する' :- 電話番号登録, 電話番号表示, 電話番号検索. 電話番号登録 :- abolish(電話帳/2), 処理人数を入力する(_人数), length(Ln,_人数), append(L0,[_|R],Ln), length(L0,_人目), writef('%t人目:\n',[_人目]), 名前を入力する(_名前), 電話番号を入力する(_電話番号), assertz(電話帳(_名前,_電話番号)), R = [],!. 電話番号登録. 処理人数を入力する(_人数) :- write('\n人数 > '), get_line(Line), 処理人数入力診断(Line,_人数),!. 処理人数を入力する(_人数) :- 処理人数を入力する(_人数). 処理人数入力診断(Line,_人数) :- atom_to_term(line,_人数,_), integer(_人数), _人数 > 0,!. 処理人数入力診断(Line,_人数) :- writef('入力された %t から適切な人数が得られませんでした。再入力をお願いします。\n',[Line]), fail. 名前を入力する(_名前) :- write('名前 > '), get_line(_名前). 電話番号を入力する(_電話番号) :- write('電話番号 > '), get_line(Line), 電話番号入力診断(Line,_電話番号),!. 電話番号を入力(_電話番号) :- 電話番号を入力する(_電話番号). 電話番号入力診断(Line,Line) :- split(Line,['(',')','-',' '],L), concat_atom(L,S), atom_chars(S,Chars), 全てが数字(Chars),!. 電話番号入力診断(Line,_電話番号) :- writef('入力された%tは電話番号として不適切です。再入力をお願いします。\n',[Line]), fail. 電話番号表示 :- writef('\n電話帳 >\n'), 電話帳(_名前,_電話番号), writef('%t, %t\n',[_名前,_電話番号]), fail. 電話番号表示. 電話番号検索 :- 名前を鍵に電話番号を得る. 名前を鍵に電話番号を得る :- 名前を入力(_名前), 電話番号の検索と出力(_名前),!. 電話番号の検索と出力(_名前,_電話番号) :- 電話帳(_名前,_電話番号), 名前と電話番号を出力する(_名前,_電話番号), fail. 電話番号の検索と出力(_名前,_電話番号) :- \+(電話帳(_名前,_電話番号)), write('該当者なし\n'),!. 電話番号の検索と出力(_,_). 名前と電話番号を出力する(_名前,_電話番号) :- writef('%t, %t\n',[_名前,_電話番号]). 全てが数字([]) :- !. 全てが数字([A|R]) :- member(A,['0','1','2','3','5','5','6','7','8','9']), 全てが数字(R). % 以下のサイトは # [1] 授業単元:計算機演習 # [2] 問題文(含コード&リンク): # 20から120までの整数の中で17で割り切れる値をすべて表示し、 # その総個数を求めるプログラムを作成しなさい。 '20から120までの整数の中で17で割り切れる値をすべて表示し、その総個数を求める'(_総個数) :- 総個数を求める(_総個数). 総個数を求める(_総個数) :- findsum(N,( '20から120までの整数の中で17で割り切れる値を全て表示し'(N)), _総個数). '20から120までの整数の中で17で割り切れる値を全て表示し'(N) :- '20から120までの整数の中で17で割り切れる値を'(N), 全て表示し(N). '20から120までの整数の中で17で割り切れる値を'(N) :- for(20,N,120), 0 is N mod 17. 全て表示し(N) :- writef('%t\n',[N]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum(_値ならび,_合計値),!. % 以下のサイトは # [1] 授業単元:計算機演習 # [2] 問題文(含コード&リンク): # 20から120までの整数の中で17で割り切れる値をすべて表示し、 # その総個数を求めるプログラムを作成しなさい。 '20から120までの整数の中で17で割り切れる値をすべて表示し、その総個数を求める' :- findsum(N,( for(20,N,120), 0 is N mod 17, writef('%t\n',[N])), _総個数), writef('総個数は%tです。\n',[_総個数]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/981 # # [1] 授業単元:C言語応用 # [2] 問題文(含コード&リンク): # キーボードから入力した数だけのロッカーを割り付け、各ロッカーにキーボードから入力したデータを保存し、最後に保存した内容を表示するプログラムkadai10-1.cを次のステップにしたがって作成せよ。 # 但し、各ロッカーには次のロッカーへのポインター(次のロッカーの鍵と思えばわかりやすい)も荷物に相当するデータといっしょに保存するものとする。 # ./a.out # 3      説明:ロッカーの数を入力 # 1 3 4       データ入力 # 'キーボードから入力した数だけのロッカーを割り付け、各ロッカーにキーボードから入力したデータを保存し、最後に保存した内容を表示する' :- キーボードから入力した数だけのロッカーを割り付け(_ロッカーならび), 各ロッカーにキーボードから入力したデータを保存し(_ロッカーならび), 最後に保存した内容を表示する(_ロッカーならび). キーボードから入力した数だけのロッカーを割り付け(_ロッカーならび) :- キーボードから入力した数(_キーボードから入力した数), ロッカーを割り付け(_ロッカーならび). キーボードから入力した数(_キーボードから入力した数) :- get_line(Line), キーボードから入力した数診断(Line,_キーボードから入力した数),!. キーボードから入力した数(_キーボードから入力した数) :- キーボードから入力した数(_キーボードから入力した数). キーボードから入力した数診断(Line,_キーボードから入力した数) :- atom_to_term(Line,_キーボードから入力した数), integer(_キーボードから入力した数), _キーボードから入力した数 > 0,!. キーボードから入力した数診断(Line,_キーボードから入力した数) :- writef('入力された %t からロッカーの数が得られませんでした。再入力をお願いします。\n',[Line]), fail. ロッカーを割り付け(_キーボードから入力した数,_ロッカーならび) :- length(_ロッカーならび,_キーボードから入力した数). 各ロッカーにキーボードから入力したデータを保存し(_ロッカーならび) :- readln(_入力したデータならび), データを保存(_入力したデータならび,_ロッカーならび). データを保存(_入力したデータならび,_ロッカーならび) :- ロッカーは入力データより大きいか等しい(_入力したデータならび,_ロッカーならび),!. データを保存(_入力したデータならび,_ロッカーならび) :- 入力データの方がロッカーよりも多い場合は(_入力したデータならび,_ロッカーならび). ロッカーは入力データより大きいか等しい(_入力したデータならび,_ロッカーならび) :- append(_入力したデータならび,_,_ロッカーならび). 入力データの方がロッカーよりも多い場合は(_入力したデータならび,_ロッカーならび) :- append(_ロッカーならび,_,入力したデータならび). 最後に保存した内容を表示する([]) :- !. 最後に保存した内容を表示する([_データ|R]) :- writef('%t\n',[_データ]), 最後に保存した内容を表示する(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/945 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # strcmp()を利用し、input.txtを読み込み、キーボードから英単語を1つ入力し、その単語が、input.txtに何個含まれるかを出力するプログラムを作成しなさい。 # 'input.txtを読み込み、キーボードから英単語を1つ入力し、その単語が、input.txtに何個含まれるかを出力する' :- 'input.txtを読み込み'(LL), キーボードから英単語を1つ入力し(_英単語), 英単語から何個含まれるか(LL,_英単語,_何個), writef('英単語%tはinput.txtに%t個含まれる\n',[_英単語,_何個]). 'input.txtを読み込み'(LL) :- see('input.txt'), readln(X,_終了状態), 'input.txtを読み込み'(X,_終了状態,LL), seen. 'input.txtを読み込み'(_,end_of_file,[]) :- !. 'input.txtを読み込み'(L,_,[L|R]) :- readln(L2,_終了状態2), 'input.txtを読み込み'(L2,_終了状態2,R). キーボードから英単語を1つ入力し(_英単語) :- get_line(_英単語),!. 英単語から何個含まれるか(LL,_英単語,_何個) :- flatten(LL,L), count(member(_英単語,L),_何個). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% count(P,N) :- findsum(1,P,F), N is truncate(F). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum(_値ならび,_合計値),!. sum([],0) :- !. sum([N|R],X) :- sum(R,Y), X is N + Y. % split/3の定義 % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/929 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # strcmp()を利用し、../test/read.cgi/tech/1307166756/904で利用したものと同様のimput.txtを読み込む。 # キーボードから英単語を1つ入力し、その単語が、input.txtに何個含まれるかを出力するプログラムを作成しなさい。 # 'キーボードから英単語を1つ入力し、その単語が、input.txtに何個含まれるかを出力するプログラムを作成しなさい' :- 'キーボードから英単語を1つ入力し'(_英単語), 'その単語が、input.txtに何個含まれるかを出力する'(_英単語). 'キーボードから英単語を1つ入力し'(_英単語) :- get_line(_英単語). 'その単語が、input.txtに何個含まれるかを出力する'(_英単語) :- 'input.txtを読み込む'(LL), 何個含まれるか(LL,_英単語,_何個), 出力する(_英単語,_何個). 'input.txtを読み込む'(LL) :- see('input.txt'), readln(X,_終了状態), 'input.txtを読み込む'(X,_終了状態,LL), seen,!. 'input.txtを読み込む'(_,end_of_file,[]) :- !. 'input.txtを読み込む'(A,_,[A|R]) :- readln(B,_終了状態2), 'input.txtを読み込む'(B,_終了状態2,R). 何個含まれるか(LL,_英単語,_何個) :- flatten(LL,L), count(member(_英単語,L),_何個). 出力する(_英単語,_何個) :- writef('%t はinput.txt中に %t個含まれます。\n',[_英単語,_何個]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% count(P,N) :- findsum(1,P,F), N is truncate(F). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum(_値ならび,_合計値),!. sum([],0) :- !. sum([N|R],X) :- sum(R,Y), X is N + Y. % split/3の定義 % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/908 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # strcmp()を利用し、../test/read.cgi/tech/1307166756/904で利用したものと同様のimput.txtを読み込む。 # キーボードから英単語を1つ入力し、その単語が、input.txtに何個含まれるかを出力するプログラムを作成しなさい。 # 'キーボードから英単語を1つ入力し、その単語が、input.txtに何個含まれるかを出力する' :- 'キーボードから英単語を1つ入力し'(_英単語), 'その単語が、input.txtに何個含まれるかを出力する'(_英単語). 'キーボードから英単語を1つ入力し'(_英単語) :- get_line(_英単語). 'その単語が、input.txtに何個含まれるかを出力する'(_英単語) :- 'その単語が、input.txtに何個含まれるか'(_英単語,_何個), 出力する(_英単語,_何個). 'その単語が、input.txtに何個含まれるか'(_英単語,_何個) :- get_chars('input.txt',Chars), concat_atom(Chars,S), split(S,[' ','\n'],_単語ならび), count(member(_英単語,_単語ならび),_何個). 出力する(_英単語,_何個) :- writef('単語 %t は %t個あります。\n',[_英単語,_何個]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% count(P,N) :- findsum(1,P,F), N is truncate(F). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum(_値ならび,_合計値),!. sum([],0) :- !. sum([N|R],X) :- sum(R,Y), X is N + Y. % split/3の定義 % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/904 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # strlen()を利用し、ファイルinput.txtには、複数の英単語のみが(改行を挟みながら)記載されている。 # input.txtをEOFまで読み込み、何文字の単語が何個あったのかを表示するプログラムを作成しなさい。このとき、1行には最大80字記載されており、1単語の最大の文字数は15とする。 # 例) # 1文字の単語: 20単語 # 3文字の単語: 10単語 # 8文字の単語: 4単語 # 全34単語 # # 'input.txtをEOFまで読み込み、何文字の単語が何個あったのかを表示する' :- get_chars('input.txt',Chars), 英単語ならびを得る(Chars,LL1), sort(LL1,LL2), 何文字の単語が何個あったのかを表示する(LL2). 英単語ならびを得る(Chars,LL) :- findall([Len,L],( 空白または改行で区切る(Chars,L), length(L,Len)), LL). 空白または改行で区切る(Chars,L0) :- append(L0,[A|R],Chars), 空白または改行(A). 空白または改行で区切る(Chars,L) :- append(L0,[A|R],Chars), 空白または改行(A), 空白または改行で区切る(R,L). 空白または改行で区切る(L,L). 空白または改行(' '). 空白または改行('\n'). 何文字の単語が何個あったのかを表示する(LL) :- 何文字の単語が何個あったのか(LL,LL2), 全単語数を集計する(LL2,_全単語数), 表示する(LL2,_全単語数). 何文字の単語が何個あったのかを表示する(LL,[[_文字数,_個数]|R2]) :- append(L0,[[_文字数,L1]|R1],LL), \+(append(_,[[_文字数,_]|_],L0)), all(L0,[_文字数0,_]), length(L0,_個数), 何文字の単語が何個あったのかを表示する([[_文字数,L1]|R1],R2). 何文字の単語が何個あったのかを表示する([[_文字数,_]|R1],[[_文字数,_個数]]) :- length([[_文字数,_]|R1],_個数). 全単語数を集計する(LL,_全単語数) :- findsum(_単語数,( append(_,[[_,_単語数]|_],LL)), _全単語数の一), _全単語数 is truncate(_全単語数の一). 表示する(LL,_全単語数) :- append(_,[[_文字数,_何個]|R],LL), writef('%t文字の単語: %t単語\n',[_文字数,_何個]), R = [], writef('全%t単語\n',[_全単語数]),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% count(P,N) :- findsum(1,P,F), N is truncate(F). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum(_値ならび,_合計値),!. sum([],0) :- !. sum([N|R],X) :- sum(R,Y), X is N + Y. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/891 # # [1] C言語演習 # [2] http://ime.nu/codepad.org/Qbz0E2cP を改良して、 # 「乗除」の回数を減らすプログラムを作成しなさい。 # ただし、http://ime.nu/codepad.org/ko7MPFKI 以外の方法を使用すること。 # ,離廛蹈哀薀爐鰺用して、以下のプログラムを作成せよ。 # 1.各素数の各桁の和が偶数になる数のみを表示するプログラム # 2.表示されている1の個数を表示するプログラム # [3.1] Windows7 # [3.3] C言語 # [4] 今日の21時まで # [5]配列まで # ,呂匹里茲Δ砲靴堂鷽瑤鮓困蕕靴燭も教えていただけると幸いです。 # どうかよろしくお願いします。 # # :- dynamic(階乗保存計算/2). 各素数の各桁の和が偶数になる数のみを表示する :- '1000未満の素数ならび'(_素数ならび), 各素数の各桁の和が偶数になる数のみを表示する(_素数ならび). 各素数の各桁の和が偶数になる数のみを表示する([]). 各素数の各桁の和が偶数になる数のみを表示する([N|R]) :- number_codes(N,Codes), findsum(N2,( append(_,[N1|_],Codes), N2 is N1 - 48), Sum), 0 is Sum mod 2, write('%t ',[N]), 各素数の各桁の和が偶数になる数のみを表示する(R). 各素数の各桁の和が偶数になる数のみを表示する([_|R]) :- 各素数の各桁の和が偶数になる数のみを表示する(R). '1000未満の素数ならび'(_素数ならび) :- '1000未満の素数ならび'(5,[2,3],_素数ならび). '1000未満の素数ならび'(1000,_素数ならび,_素数ならび) :- !. '1000未満の素数ならび'(N,L1,_素数ならび) :- 奇数(N), 既に計算済みの素数では割り切れない(N,L1), L1 = [M|_], ウィルソンの定理による素数判定(N,素数です), N2 is N + 1, '1000未満の素数ならび'(N2,[N|L1],_素数ならび). '1000未満の素数ならび'(N,L1,_素数ならび) :- N2 is N + 1, '1000未満の素数ならび'(N2,L1,_素数ならび). 既に計算済みの素数では割り切れない(N,[]) :- !. 既に計算済みの素数では割り切れない(N,[M|R]) :- 0 is N mod M,!, fail. 既に計算済みの素数では割り切れない(N,[M|R]) :- 既に計算済みの素数では割り切れない(N,R). ウィルソンの定理による素数判定(X,素数です) :- X > 0, Y is X - 1, 階乗保存計算(Y,Z), 0 is (Z + 1) mod X,!. ウィルソンの定理による素数判定(X,素数ではありません) :- X > 0, Y is X - 1, 階乗保存計算(Y,Z), \+(0 is (Z + 1) mod X),!. 階乗保存計算(0,1) :- !. 階乗保存計算(1,1) :- !. 階乗保存計算(N,X) :- N2 is N - 1, 階乗保存計算(N2,Y), X is N * Y, asserta((階乗保存計算(N,X) :- !)). 奇数(N) :- 1 is N mod 2. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/889 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/MysbRMqT # # キーボードから入力した数だけのロッカーを割り付け、各ロッカーにキーボード # から入力したデータを保存し、最後に保存した内容を表示するプログラム # kadai10-1.cを次のステップにしたがって 作成せよ。但し、各ロッカーには # 次のロッカーへのポインター(次のロッカーの鍵と思えばわかりやすい)も # 荷物に相当するデータといっしょに保存するものとする。 # # 1-1 データ構造として次の構造体を用意する。 # struct rocker { # int data; //保存するデータ # struct rocker *next; //次のボックスのアドレス(鍵) # }; # # 1-2 最初の鍵として次のポインターを大域変数として用意する。 # struct rocker *head; # # 1-3 1個のロッカーを割り当てて、最後に割り当てたロッカーに新しく割り当てた # ロッカーのアドレス(鍵)を保存する関数 struct rocker *new_rocker(struct rocker *last_rocker)を定義しなさい。 # ただし引数 last_rockerは最後に作ったボックスのポインターとする。この間数は # 新しく割り当てたロッカーのアドレスを返すものとする。 # # 1-4 全てのロッカーに保存したデータを最初のロッカーから順番に表示していく # 関数 void display_rockers(struct rocker *pt)を定義しなさい。 # ただし、実行結果が次のようになるように定義しなさい。 # # gcc kadai10-1.c # ./a.out # 3      説明:ロッカーの数を入力 # 1 3 4       データ入力 # [ data = 1 ]->[ data = 3 ]->[ data = 4 ]       表示 # # ※ 表示部分では printf("[ data = %d ]->", xxxxx); もしくは printf("[ data = %d ]\n", xxxxxx);を使用する # 'キーボードから入力した数だけのロッカーを割り付け、各ロッカーにキーボードから入力したデータを保存し、最後に保存した内容を表示する' :- キーボードから入力した数だけのロッカーを割り付け(_ロッカーならび), 各ロッカーにキーボードから入力したデータを保存し(_ロッカーならび), 最後に保存した内容を表示する(_ロッカーならび). キーボードから入力した数だけのロッカーを割り付け(_ロッカーならび) :- キーボードから入力した数(_キーボードから入力した数), length(_ロッカーならび,_キーボードから入力した数). キーボードから入力した数(_キーボードから入力した数) :- write('ロッカーの数を入力してください : '), get_line(Line), キーボードから入力した数診断(Line,_キーボードから入力した数),!. キーボードから入力した数(_キーボードから入力した数) :- キーボードから入力した数(_キーボードから入力した数). キーボードから入力した数診断(Line,_キーボードから入力した数) :- atom_to_term(Line,_キーボードから入力した数,_), integer(_キーボードから入力した数), _キーボードから入力した数 >= 1,!. キーボードから入力した数診断(Line,_キーボードから入力した数) :- writef('入力された %t から適切な整数が得られません。再入力をお願いします。\n',[Line]), fail. 各ロッカーにキーボードから入力したデータを保存し([]). 各ロッカーにキーボードから入力したデータを保存し([Line|R]) :- キーボードから入力したデータを(Line), 各ロッカーにキーボードから入力したデータを保存し(R). 最後に保存した内容を表示する(_ロッカーならび) :- append(L0,[_データ|R],_ロッカーならび), length([_|L0],_n番目), writef('ロッカー[%t]: %t\n',[_n番目,_データ]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/843 # # [1] 授業単元:文字列 # [2] 問題文(含コード&リンク): # ファイルinput.txtに、1行最大80文字で空白を挟みながら、英数字が記載されている。 # このinput.txtを読み込み、その中に含まれるアルファベット・数字の各文字が何文字ずつあるかを表示するプログラムを作りなさい # 'ファイルinput.txtに、1行最大80文字で空白を挟みながら、英数字が記載されている。このinput.txtを読み込み、その中に含まれるアルファベット・数字の各文字が何文字ずつあるかを表示する' :- 'このinput.txtを読み込み'(Chars), 'その中に含まれるアルファベット・数字の各文字が何文字ずつあるか'(Chars,L), 表示する(L). 'このinput.txtを読み込み'(Chars) :- get_chars('input.txt',Chars),!. その中に含まれるアルファベット・数字の各文字が何文字ずつあるか(Chars,L) :- 'アルファベット・数字'(Alphabets), setof(Char,( member(Char,Chars), member(Char,Alphabets)), L1), findall([Char,Count],( member(Char,L1), count(member(Char,Chars),Count)), L),!. 表示する(L) :- append(_,[[_文字,_出現数]|R],L), writef('文字 %t %t回\n',[_文字,_出現数]), R = []. 'アルファベット・数字'(Chars) :- findall(Char1,( for(65,N1,90), char_code(Char1,N1)), L1), findall(Char2,( for(97,N2,122), char_code(Char2,N1)), L2), findall(Char3,( for(48,N3,57), char_code(Char3,N3)), L3), append(L1,L2,L4), append(L4,L3,Chars),!. % 以下のサイトは # 出典:: 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/tech/1307166756/670 # # 問題 # 入力ファイル中のアルファベット各文字の個数を数えるプログラムを作成せよ。(大文字と小文字は合わせて数える) # スペースや記号、数字などは数えない。 # # そして、結果を文字数の多い順にソートして出力せよ。 # # コンパイラ # gcc # # 期限 # 2011/6/18 # '入力ファイル中のアルファベット各文字の個数を数えるプログラムを作成せよ。(大文字と小文字は合わせて数える)スペースや記号、数字などは数えない。そして、結果を文字数の多い順にソートして出力する'(_入力ファイル) :- get_chars(_入力ファイル,Chars), setof([_大文字/_小文字],( アルファベットを大文字小文字対にする(Chars,_大文字/_小文字)), L1), findall([Count,_大文字/_小文字],( append(_,[_大文字/_小文字|_],L1), 大文字と小文字の数は合わせる(Chars,_大文字,_小文字Count)), L2), 文字数の多い順にソートして出力する(L2). ファイルに現れるアルファベットを大文字小文字対にする(Chars,_大文字/_小文字) :- member(Char,Chars), アルファベット(Char), to_upper(Char,_大文字), to_lower(Char1,_小文字). 大文字と小文字の数は合わせる(Chars,_大文字,_小文字,Count) :- count(member(_大文字,Chars),Count1), count(member(_小文字,Chars),Count2), Count is Count1 + Count2,!. 文字数の多い順にソートして出力せよ(L2) :- sort(L2,L3), reverse(L3,L), append(_,[Count,A/B]|R],L), writef('%t/%t, %t個\n',[A,B,Count]), R = []. アルファベット(A) :- A @>= 'A', A @=< 'Z',!. アルファベット(A) :- A @>= 'a', A @=< 'z',!. % 以下のサイトは # # I need to write a small Prolog program to count the number of occurrence # of each element in a list. # # numberOfRepetition(input, result) # For example: # # numberOfRepetition([a,b,a,d,c,a,b], X) # can be satisfied with X=[a/3,b/2,d/1,c/1] because a occurs three times, # b occurs 2 times and c and d one time. numberOfRepetition(_input,_result) :- setof(A,member(A,_input),L1), findall(B/Count,( member(B,L1), count(B,_input,Count)), _result). count(A,[],0). count(A,[A|R],X) :- count(A,R,Y), X is Y + 1. count(A,[_|R],X) :- count(A,R,X). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/589 # # [1] C言語演習 # [2] for文を使用して以下のプログラムを作成せよ。 #    0から100までの奇数だけの和を求めて表示するプログラム #   ◆0から2011までの奇数の個数を求めて表示するプログラム #  [3.1] Windows7 #  [3.3] C言語 # [4] 水曜19時まで # [5] 多重ループまで # どなたかよろしくお願いします。 # # '0から1000までの奇数だけの和を求めて表示する' '0から1000までの奇数だけの和を求めて'(_和), 項名付きで表示する(和,'',_和). '0から1000までの奇数だけの和を求めて'(_和) :- findsum(_奇数,( for(0,_奇数,100), 1 is _奇数 mod 2), _和). '0から2011までの奇数の個数を求めて表示する' :- '0から2011までの奇数の個数を求めて'(_個数), 項名付きで表示する(個数,個,_個数). '0から2011までの奇数の個数を求めて'(_個数) :- count(( for(0,_奇数,2011), 1 is _奇数 mod 2), _個数). 項名付きで表示する(_項名,_単位,N) :- writef('%tは %t%t です\n',[_項名,N,_単位]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/402 # # 下記のようなユーザーに対する取得ポイントと、消費したポイントのテーブルがあり、 # それらの合計を各ユーザー毎にまとめたいのですが、どうしたらいいでしょうか? # # [取得テーブル t1] # id | user_id | point # --+-------+----- # 1 | 1    | 30 # 2 | 2    | 10 # 3 | 3    | 50 # 4 | 1    | 20 # 5 | 2    | 10 # 6 | 3    | 50 # # [消費テーブル t2] # id | user_id | used_point # --+-------+----- # 1 | 1    | -10 # 2 | 2    | -10 # 3 | 4    | -50 # 4 | 1    | -20 # 5 | 4    | -10 # # <欲しい結果> # user_id | point # -------+----- # 1    | 20 # 2    | 10 # 3    | 100 # 4    | -60 # # # DBMSはMySQLです。 # お願いしますm(_ _)m # # t1(1,1,30). t1(2,2,10). t1(3,3,50). t1(4,1,20). t1(5,2,10). t1(6,3,50). t2(1,1,-10). t2(2,2,-10). t2(3,4,-50). t2(4,1,-20). t2(5,4,-10). '下記のようなユーザーに対する取得ポイントと、消費したポイントのテーブルがあり、それらの合計を各ユーザー毎にまとめたい'(_ユーザごとの合計) :- ユーザを取得(L), findall([_user_id,_合計],( append(_,[_user_id|_],L), t1テーブルの合計(_user_id,_合計1), t2テーブルの合計(_user_id,_合計2), _合計 is _合計1 - _合計2), _ユーザごとの合計). ユーザを取得(L) :- findsetof(_user_,t1(_user_id,_),L1), findsetof(_user_,t2(_user_id,_),L2), 和集合(L1,L2,L). t1テーブルの合計(_user_id,_合計) :- findsum(_point,t1(_user_id,_point),_合計). t2テーブルの合計(_user_id,_合計) :- findsum(_userpoint,t2(_user_id,_userpoint),_合計). 和集合(_集合1,_集合2,_和集合) :- append(_集合1,_集合2,_ならび3), findall(_要素,( append(L0,[_要素|_],_ならび3), \+(append(_,[_要素|_],L0))), _和集合) . % 参照 % findsum/3 http://nojiriko.asia/prolog/findsum.html % findsetof/3 http://nojiriko.asia/prolog/findsetof.html % 以下のサイトは # この問題は秋葉拓哉、岩田陽一、北川宣捻共著 「プログラミングコンテストチャレンジブック」2010年9月 株式会社毎日コミュニケーションズ刊 # のp73より出題させていただきました。 # # プライオリティキューを用いる問題 # Expedition (POJ2431) # # トラックで距離Lの道を移動します。はじめトラックにはガソリンPが # 積まれています。このトラックは距離1走るとガソリンが1消費されます。 # 途中でガソリンが0になってしまうとトラックは停止してしまい、移動に # 失敗してしまいます。途中にはN個ガソリンスタンドがあります。 # 各ガソリンスタンドiは道のスタート地点Aiの地点にあって、Biだけ # ガソリンを補給することができます。トラックの燃料タンクの容量に # 制限はなく、いくらでもガソリンを補給することができます。 # Lトラックは移動完了できるでしょうか? # またその際、最少で何回のガソリンの補給が必要でしょう? # 完了できる場合は最小の補給回数を、できない場合は-1を出力してください。 # # !! 制約 # ・ 1 =< N =< 10000 # ・ 1 =< L =< 1000000, 1 =< P =< 1000000 # ・ 1 =< Ai, 1 =< Bi =< 100 # # # 以下は@Nikoriksこと、紀信邦さんの書いたプログラム。著作権は同氏にあります。 # % On Monday 6th June 2011, @Nikoriks said: % % #lpjp 以前尾崎さんが見つけたトラックとガソリンの問題 % ftp://nojiriko.asia/prolog/POJ2431.html http://poj.org/problem?id=2431 をやってみました.(今日も空き時間に泳いだので) % いくつか例題を試してみないと合ってるかどうかわかりませんね. % q(給油回数,残り距離,燃料量,残りガススタンドのリスト) % Qは横型探索のためのq()のリスト. go:-poj2431(R),display(R),ttynl. a(4,4). a(5,2). a(11,5). a(15,10). road(25,10). init(Q):- road(L,P), setof(xl(Pos,X),a(Pos,X),X0), reverse(X0,Xl), write(Xl),nl, Q=[q(0,L,P,Xl)]. poj2431(Result):- init(Q), solve(Q,Result). poj2431(-1). solve(Q,Result):- pdeq(q(N,A,P,Xl),Q,Q1), A =< P,!, Result=N. solve(Q,Result):- pdeq(q(N,A,P,Xl),Q,Q1), write(q(N,A,P,Xl)),nl, proceed(Xl,N,A,P,Q1,Q2), solve(Q2,Result). proceed([xl(Ai,Bi)|Xl], N,A,P,Q1,Q3):- P >= A-Ai,!, Pi is P-(A-Ai)+Bi, Ni is N+1, penq(q(Ni,Ai,Pi,Xl),Q1,Q2), proceed(Xl,N,A,P,Q2,Q3). proceed(_,_,_,_, Q,Q). penq(X,[Y|L],R):- X @=< Y,!,R=[X,Y|L]. penq(X,[Y|L],[Y|R]):-!, penq(X,L,R). penq(X,[],[X]). pdeq(X,[X|L],L). reverse(L,R):- reverse(L,[],R). reverse([E|X],Y,Z):-!, reverse(X,[E|Y],Z). reverse([],Y,Y). % 以下のサイトは # テーブル: # no comment id(テーブル名:テーブル) # 1 aaaaa 春 # 2 bbbbb 夏 # 3 ccccc 春 # 4 ddddd 春 # : # # 欲しい結果: # no comment id count(*) # 3 ccccc 春 2 # # # idが春のものの数を集計したく、 # select *,count(*) from baka group by id where id = '春'; # でそれは可能なんですが、selectで取れる他の結果(commentとか)は、noが3のものを表示したいんです # % 別々に計算するつもり、定義する。 節を取得時に集約値を併記する(_no,_commnet,_id,_度数) :- テーブル(_no,_comment,_id), count(テーブル(_,_,_id)),_度数). % 以下のサイトは # 売上高はお客様の喜びの総和。 # 売上高はお客様の喜びの総和。(_売上高) :- お客様の喜びの総和(_喜びの総和), お客様の喜びの総和それが売上高だ(_喜びの総和,_売上高). お客様の喜びの総和(_喜びの総和) :- お客様の喜びを集める(_お客様の喜びの集まり), 喜びの総和(_お客様の喜びの集まり,_喜びの総和). お客様の喜びを集める(_お客様の喜びの集まり) :- findall(_喜び,( お客様(_お客様), 来場(_お客様), 喜び(_お客様,_喜び)), _お客様の喜びの集まり). 喜びの総和(_お客様の喜びの集まり,_喜びの総和) :- 何らかの集約(_お客様の喜びの集まり,_喜びの総和). お客様の喜びの総和それが売上高だ(_喜びの総和,_売上高) :- 深淵なる関係(_喜びの総和,_売上高). %% 以後は事実上未定義 何らかの集約(X,X). 深淵なる関係(X,X). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/324 # # NAME FRUIT NUM # # TARO banana 10 # TARO orange 4 # TARO tomato 3 # TARO grape 2 # TARO apple 1 # TARO melon 1 # TARO mango 1 # HANAKO tomato 30 # HANAKO orange 21 # HANAKO apple 2 # HANAKO banana 1 # GEN mango 12 # GEN grape 6 # GEN orange 4 # GEN banana 1 # GEN apple 1 # # # というテーブルで、各人間の持つ果物のうち上位3種類を取得したいのですが、 # どうすればよろしいでしょうか? # # 欲しい結果 # NAME FRUIT NUM # # TARO banana 10 # TARO orange 4 # TARO tomato 3 # HANAKO tomato 30 # HANAKO orange 21 # HANAKO apple 2 # GEN mango 12 # GEN grape 6 # GEN orange 4 # # # SQLserver2008です。よろしくお願いいたします。 # # テーブルで、各人間の持つ果物のうち上位3種類を取得したい :- findsetof(_名前,テーブル(_名前,_果物,_数量),LL1), append(_,[_名前|R],LL1), findall([_名前,_数量,_果物],( テーブル(_名前,_果物,_数量)), LL2), 大きい順に(LL2,LL3), 上位3位(LL3,[_名前,_果物,_数量]), writef('%t %t %t\n',[_名前,_果物,_数量]), R = []. 大きい順に(L1,L2) :- sort(L1,L3), reverse(L3,L2),!. 上位3位(L,[_名前,_果物,_数量]) :- append(L0,[[_名前,_数量,_果物]|_],L), length(L0,Length), Length =< 2. % 以下のサイトは # Hi everyone, i'm having a bit of a problem with a prolog exercise. # # Assume i have a list of actors that have won oscars. Like this: # # (steven spielberg, steven spielberg, francis ford coppola, michael curtiz) # When a name appears two times, it means that the person won 2 oscars and so on. # What i need to do is to go trough this list and find every actor # that won N or more Oscars, with a predicate like # # wonMoreOscars(Number, Activity):- # Where the number is the N we have to compare with the list. # I already have a function that counts the person that occurs the more times # in a list and the activity the function that person has in the movie, # but is already covered. # # Can somebody help me, i have the code to find the person who has won more Oscars: # # occS([],_,_,_,_):- # write(0),nl, # write('+'),nl, !. # occS([H|T],_,_,_,_):- # occ([H|T],0,0,H,H). # occ([],_,Top,_,Nome):- # write(Nome),nl, # write(Top),nl, # write('+'),nl,!. # occ([H|T],Count,Top,El_corrente,_):- # compare(=,H,El_corrente), # C is Count + 1, # C>=Top, # occ(T,C,C,El_corrente,El_corrente), !. # occ([H|T],_,Top,El_corrente,Nome):- # not(compare(=,H,El_corrente)), # occ(T,1,Top,H,Nome),!. # occ([H|T],Count,Top,_,Nome):- # C is Count + 1, # occ(T,C,Top,H,Nome),!. # But now i'm having trouble with this case. Can somebody help me ? Thx in advance. 'Oscars'(['steven spielberg', 'steven spielberg', 'francis ford coppola', 'michael curtiz']). wonMoreOscars(Number, Activity):- 'Oscars'(L), setof(Name,member(Name,L),L1), findall([Name,Count],( append(_,[Name|_],L1), count(append(_,[Name|_],L),Count), Count >= Number), Activity). count(P,N) :- findall(1,P,L), length(L,N). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/300 # # 上手くいかないので質問させてください。 # ACCESS2007を使っています。 # 年フィールドと月フィールドを用いて「年度」の件数を抽出したいのですが、 # 以下のクエリでは月部分が干渉してか上手く抽出出来ません。 # # 22年4月〜23年3月 といった結果を出したいのですがどうしたらよいでしょうか? # # SELECT 年 FROM Table1 # WHERE (年>21 AND 月>3) AND (年<23 AND 月<4) # # '年フィールドと月フィールドを用いて「年度」の件数を抽出したい'(_テーブル,L) :- テーブル構造(_テーブル,年,M), テーブル構造(_テーブル,月,N), findmax(U,テーブル構造(_テーブル,_,U),Max), length(L1,Max), nth1(M,L1,_年), nth1(N,L1,_月), P =.. [_テーブル|L1], findall(_年度,( P, 年度のルール(_年,_月,_年度)), _年度ならび), findsetof(_年度,( append(_,[_年度|_],_年度ならび), L2), findall([_年度,_度数],( append(_,[_年度|_],L2), count(append(_,[_年度|_],_年度ならび),_度数)), L). 年度のルール(_年,_月,_年度) :- _月 >= 4, _年 = _年度,!. 年度のルール(_年,_月,_年度) :- _月 < 4, _年度 is _年 - 1,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/288 # # sqlite v3.6.23.1で、 # comment (text) ,postedtime (int) という形式にて掲示板を作っているのですが、 # 「最新の5コメント、但し、24時間以内の投稿については最大50個まで」を求めたくて # # SELECT comment FROM mm ORDER BY postedtime DESC LIMIT 50 # UNION # SELECT comment FROM mm WHERE postedtime > $nowtime - 3600*24 ORDER BY ptime DESC LIMIT 50 # # としてみたのですが($nowtimeには今の時間を入れてます)、 # 1st ORDER BY term does not match in the result set というエラーが出ます。 # (union前後のクエリそれぞれ単独ではエラーは出ません) # # 欲しい結果を求めるにはどのように書けばいいのでしょうか? # # '最新の5コメント、但し、24時間以内の投稿については最大50個まで'(_テーブル,_現在の時刻,P) :- split(_現在の時刻,[' ','/','-',':','.'],[_年,_月,_日,_時,_分,_秒,_]), テーブル構造(_テーブル,時刻,N), findmax(M,テーブル構造(_テーブル,_,M),Max), length(L1,Max), nth1(N,L1,_時刻), P =.. [_テーブル|L1], 選択(P,_年,_月,_日,_時,_分,_秒,L), append(_,[_時刻|_],L), call(P). 選択(P,_年,_月,_日,_時,_分,_秒,L) :- findsetof(_時刻,( call(P), 時刻が24時間以内(_年,_月,_日,_時,_分,_秒,_時刻)), L1), 要素切り取り(L1,L),!. 選択(P,_年,_月,_日,_時,_分,_秒,L) :- findall(_時刻,( call(P), 時刻が24時間以内(_年,_月,_日,_時,_分,_秒,_時刻)), L1), 整列(L1,L2), 要素切り取り(L2,L),!. 選択(P,_,_,_,_,_,_,L) :- findall(_時刻,( call(P)), L1), 整列(L1,L2), length(L,5), append(_,L,L2),!. 要素切り取り(L1,L) :- length(L1,Length), Length >= 50, length(L,50), append(_,L,L1),!. 要素切り取り(L1,L1) :- length(L1,Length), Length >= 5, length < 50,!. 時刻が24時間以内(_年,12,31,_時,_分,_秒,_時刻) :- split(_時刻,['/','-',':','.'],[_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]), _年_1 is _年 + 1, [_年_1,1,1,_時,_分,_秒,_時刻] @>= [_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]),!. 時刻が24時間以内(_年,2,29,_時,_分,_秒,_時刻) :- うるう年(_年), [_年,3,1,_時,_分,_秒,_時刻] @>= [_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]),!. 時刻が24時間以内(_年,2,28,_時,_分,_秒,_時刻) :- \+(うるう年(_年)), [_年,3,1,_時,_分,_秒,_時刻] @>= [_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]),!. 時刻が24時間以内(_年,_月,30,_時,_分,_秒,_時刻) :- append(_,[_月|_],[4,6,9,11]), _月_1 is _月 + 1, [_年,_月_1,1,_時,_分,_秒,_時刻] @>= [_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]),!. 時刻が24時間以内(_年,_月,31,_時,_分,_秒,_時刻) :- append(_,[_月|_],[1,3,5,7,8,10]), _月_1 is _月 + 1, [_年,_月_1,1,_時,_分,_秒,_時刻] @>= [_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]),!. 時刻が24時間以内(_年,_月,_日,_時,_分,_秒,_時刻) :- split(_時刻,['/','-',':','.'],[_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]), _日_1 is _日 + 1, [_年,_月,_日_1,_時,_分,_秒,_時刻] @>= [_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]),!. うるう年(_年文字列) :- atom(_年文字列), atom_to_term(_年文字列,_年整数,_), !, うるう年(_年整数) . うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100, !, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/286 # # sql初心者で申し訳ありません。2つの要素でソートをしたい場合どのようにすればよいでしょうか? # point01(int)、point02(int)があります。point01でソートを行い、point01が同じ場合point02でさらにソートをしなければいけません。 # # '2つの要素でソートをしたい場合どのようにすればよいでしょうか?'(_テーブル,P) :- テーブル構造(_テーブル,point01,N1), テーブル構造(_テーブル,point02,N2), count(テーブル構造(_,_,_),Count), length(L,Count), nth1(N1,L,Point01), nth1(N2,L,Point02), P =.. [_テーブル|L], setof([Point01,Point02],P,L2), append(_,[[Point01,Point02]|R],L2), call(P). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/159 # # [1] 授業単元: プログラム # [2] 問題文(含コード&リンク): # 英語のテキストデータを入力とし、ファイル内に現れる「単語」(文字列)と # そのカウントをプリントするプログラムを作成せよ。同時に現れた「単語」の総数を # プリントすること。なお、ここで「単語」とはデリミタで区切られるアルファベットだけ # からなる文字列と定義する。「単語」は各データファイルにつき、総単語数は高々2,000単語 # しか現れないと仮定して良い。配列でプログラムする場合、1単語長の最大値を適当に固定して良い。 # # ヒント # デリミタとは、この課題では以下のASCII文字と定義する。 # (a) 制御文字 (iscntrl(c)が1となる文字c) # (b) 数字 (isdigit(c)が1となる文字c) # (c) アルファベット以外の印刷可能文字 (isprint(c)が1で、isalpha(c)が0となる文字c) # '英語のテキストデータを入力とし、ファイル内に現れる「単語」(文字列)とそのカウントをプリントする。同時に現れた「単語」の総数をプリントする'(_ファイル) :- get_chars(_ファイル,Chars), 単語を抽出する(Chars,[],_単語ならび), '「単語」(文字列)とそのカウント'(_単語ならび,_単語とそのカウントならび), 単語とそのカウントをプリントする(_単語とそのカウントならび), 単語の総数(_単語ならび,_単語の総数), 単語の総数をプリントする(_単語の総数). 単語を抽出する([],[],[]) :- !. 単語を抽出する([],L,[_単語]) :- concat_atom(L,_単語),!. 単語を抽出する([_文字|R1],[],R2) :- 'デリミタとは、この課題では以下のASCII文字と定義する'(_文字), 単語を抽出する(R1,[],R2),!. 単語を抽出する([_文字|R1],L1,R2) :- 'デリミタとは、この課題では以下のASCII文字と定義する'(_文字), concat_atom(L1,_単語), 単語を抽出する(R1,[],[_単語|R2]),!. 単語を抽出する([_文字|R1],L1,R2) :- append(L1,[_文字],L2), 単語を抽出する(R1,L2,R2),!. 'デリミタとは、この課題では以下のASCII文字と定義する'(_文字) :- 制御文字(_文字). 'デリミタとは、この課題では以下のASCII文字と定義する'(_文字) :- 数字(_文字). 'デリミタとは、この課題では以下のASCII文字と定義する'(_文字) :- アルファベット以外の印刷可能文字(_文字). 制御文字(_文字) :- char_code(_文字,Char_code), Char_code < 32,!. 数字(_文字) :- append(_,[_文字|_],['0','1','2','3','4','5','6','7','8','9']). アルファベット以外の印刷可能文字(_文字) :- アルファベット以外の(_文字), 印刷可能文字(_文字),!. アルファベット以外の(_文字) :- \+(アルファベット(_文字)). アルファベット(_文字) :- append(_[_文字|_],['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']),!. アルファベット(_文字) :- append(_,[_文字|_],[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]),!. 印刷可能文字(_文字) :- char_code(_文字,Char_code), Char_code >= 32,!. '「単語」(文字列)とそのカウント'(_単語ならび,_単語とそのカウントならび) :- setof(_単語,member(_単語,_単語ならび),_単語ならびのニ), length(_単語ならびのニ,_単語の総数), findall([_単語,_カウント],( append(_,[_単語|_],_単語ならびのニ), count(member(_単語,_単語ならび),_カウント)), _単語とそのカウントならび). 単語とそのカウントをプリントする(_単語とそのカウントならび) :- append(_,[[_単語,_カウント]|R],_単語とそのカウントならび), writef('%t %t\n',[_単語,_カウント]), R = []. 単語の総数(_単語ならび,_単語の総数) :- length(_単語ならび,_単語の総数),!. 単語の総数をプリントする(_単語の総数) :- writef('単語の総数は %t です\n',[_単語の総数]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/119 # # 【質問テンプレ】 # [1] 授業単元:アルゴリズム # [2] 問題文(任意の整数を入力、位が高いほうから一桁ずつ表示、各位の合計を算出): # '任意の整数を入力、位が高いほうから一桁ずつ表示、各位の合計を算出'(_任意の整数,_各位の合計) :- 位が高いほうから一桁ずつ表示(_整数), nunber_codes(_整数,Codes), findsum(N,( append(_,[M|_],Codes), N is M - 48), _各位の合計). 位の高いほうから一桁ずつ表示(_整数) :- number_chars(_整数,Chars), append(_,[A|R],Chars), writef('%t\n',[A]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/12 # # [1]c言語 # [2]英文字を読み込み、その一つ一つの文字の個数を求めるプログラム。 # # 実行結果 # 英文字 BBACC # 変換後 B2A1C2 英文字を読み込み、その一つ一つの文字の個数を求める :- 英文字を読み込み(_英文字列), その一つ一つの文字の個数を求める(_英文字列,_その一つ一つの文字の個数), 表示する(その一つ一つの文字の個数). 英文字を読み込み(_英文字列) :- write('英文字列を入力してください : '), get_line(_英文字列), 英文字読み込み診断(_英文字列),!. 英文字を読み込み(_英文字列) :- 英文字を読み込み(_英文字列). 英文字読み込み診断(_英文字列) :- atom_chars(_英文字列,Chars), 全て英文字(Chars),!. 英文字読み込み診断(_文字列) :- writef('読み込まれた文字列 %t に英文字以外の文字が含まれています。\n再入力をお願いします\n',[_文字列]),fail. 全て英文字([]). 全て英文字([A|R]) :- member(A,['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]), 全て英文字(R). その一つ一つの文字の個数を求める(_英文字列,_その一つ一つの文字の個数) :- atom_chars(_英文字列,Chars), setof(_文字,member(_文字,Chars),L1), findall(_文字の個数,( member(_文字,L1), count(member(_文字,Chars),Count), concat_atom([_文字,Count],_文字の個数)), L2), concat_atom(L2,_その一つ一つの文字の個数). 表示する(_その一つ一つの文字の個数) :- writef('%t\n',[_その一つ一つの文字の個数]). % 以下のサイトは # [14回演習問題2.1.1]整数のリストを第一引数に与え,そのリストの要素の中から、 # 和が15になるような3つの数を選ぶ述語fifteen/2をつくりなさい、 # ただしあるひとつの組み合わせに関して、同じ数が重複してはいけない。 # fifteen(_整数のリスト,N1,N2,N3) :- setof(N,member(N,_整数のリスト),L), 組合せ(L,3,[N1,N2,N3]), 15 is 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). % 以下のサイトは # I'm trying to write a Prolog function that given a list returns the element(s) that repeats most times in that list, like: # # ['a', 'a', 'b', 'c', 'b'] should return ['a', 'b'] ['c', 'a', 'a', 'c', 'b', 'c', 'b'] should return ['c'] etc... # # I'm trying to do it with another function (that counts the number of times something exists on a list (countlist), but I'm not getting anywhere. A little help please? # # listMax(In, Out) :- # listMax(In, Out, 0). # # listMax([H | L], [H | O], Max) :- # countlist(H, [H | L], N), # N > Max, # listMax(L, [H | O], N). # # listMax([H | L], O, Max) :- # countlist(H, [H | L], N), # <=(Max, N), # listMax(L, O, Max). # # listMax([], [], _Max). # # listMax([], _O, _Max). listmax(In,Out) :- setof(A,member(A,In),L1), findall([Count,A],( member(A,L1), count(A,In,Count)), L2), max_1(L2,Max), findall(A,member([Max,A],L2),Out). count(A,[],0). count(A,[A|R],X) :- count(A,R,Y), X is Y + 1. count(A,[_|R],X) :- count(A,R,X). max_1(L,Max) :- findall(A,member([A|_],L),L1), max(L1,Max). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/256 # # カラムA, B, Cがあり、次のような順序で抽出したいと考えています。 # # A  B  C # ○ ○ ○ # ○ ○ × # ○ × × # × ○ × # × × ○ # # どのようにORDER BYを設定すればよいか、よろしければ教えて頂きたいと思います。 # よろしくおねがいしますm(__)m # # 'カラムA, B, Cがあり、次のような順序で抽出したいと考えています。 \\nA  B  C\\n ○ ○ ○ \\n○ ○ × \\n○ × × \\n× ○ × \\n× × ○ \\n'(L) :- setof([_A,_B,_C],テーブル(_A,_B,_C),L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1294641578/215 # # one_side the_other value # 30 31 23 # 31 30 23 # 4 31 20 # 31 6 20 # 6 31 20 # 31 4 20 # 19 30 19 # 30 19 19 # 7 27 17 # 35 18 17 # : : : # # one_sideとthe_otherのペアとして認識して # 逆順になっているだけのペアは纏める方法を教えて下さい # 'one_sideとthe_otherのペアとして認識して逆順になっているだけのペアは纏める方法を教えて下さい'(_テーブル名,_逆順になっているペア) :- findall([_one_side,_the_other],( 'one_sideとthe_otherのペアとして認識して逆順になっているだけのペアは纏める方法を教えて下さい'(_テーブル名,_one_side,_the_other,L2)), _逆順になっているペア). 'one_sideとthe_otherのペアとして認識して逆順になっているだけのペアは纏める方法を教えて下さい'(_テーブル名,_one_side,_the_other,L2) :- P =.. [_テーブル名,_one_side,_the_other,_value], findsetof([_one_side,_the_other],( call(P)), L1), append(_,[[_one_side,_the_other]|_],L1), findall(_value,( call(P)), L2), ニ要素以上の逆順ならび(L2). ニ要素以上の逆順ならび([A,B]) :- A @> B,!. ニ要素以上の逆順ならび([A,B|R1]) :- A @> B, ニ要素以上の逆順ならび([B|R]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/745 # # [1] 授業単元:プログラム実習 # [2] 問題文(含コード&リンク): # 名前・身長・体重・血液型が記録されたメモ帳(ファイル)がある。 # これを身長順にソートして並べ替えてコマンドプロンプト上に # 表示させるプログラムを作成せよ。 # なお、今回メモ帳はstudentsdata.txtという名前で保存されていることとする。 # # program :- get_lines('studentsdata.txt',Lines), 身長を取り出して鍵とする(Lines,LL1), sort(LL1,LL2), append(_,[[_,Line]|R],LL2), writef('%t\n',[Line]), R = [],!. 身長を取り出して鍵とする([],[]) :- !. 身長を取り出して鍵とする([Line|R1],[[_身長,Line]|R2]) :- split(Line,[' ',','],[_,_身長,_,_]), 身長を取り出して鍵とする(R1,R2). % 以下のサイトは # Hello, I'm trying to make a prolog function (I know it's not a function # but I can't recall it's name) that given a list and a number N # returns a list with the elements that repeat at least N times. # # xpto(['a', 'a', 'a', 'b', 'b', 'c'], Out, 3) should return Out = ['a'] # # xpto(['a', 'a', 'a', 'b', 'b', 'c'], Out, 2) should return Out = ['a', 'b'] # # etc. # # I currently have: # # xpto([], _, _). # # xpto([H | L], O, Num) :- # count(H, [H | L], N), # N = Num, # xpto(L, [H | O], Num). # # xpto([H | L], O, Num) :- # count(H, [H | L], N), # N \= Num, # xpto(L, O, Num). # where in count(A, L, N) N is the number of times A repeats in L, however it doesn't work. I'm pretty sure my algorithm works on paper. # # Any help is appreciated :) xpro(L,Out,N) :- setof(M,member(M,L),L1), findall(A,( member(A,L1), count(member(A,L),Count), Count >= N), Out). % 以下のサイトは # # I'm terrible with prolog. I keep getting a duplicate result in this simple code" # # mates(bob, john). # mates(bob, bill). # mates(andrea, sara). # mates(andrea, bill). # friends(X, Y) :- mates(X, Z), mates(Y, Z). # Calling friends(bob, X). I get bob twice. If only I could use and IF statement argh!!! # # How can I elimiate duplicate results? IE If(result1 == result2) dont print; # # Im looking for similar friends, ie the result should be bob and andrea (because of bill). # mates(bob, john). mates(bob, bill). mates(andrea, sara). mates(andrea, bill). friends(X, Y) :- setof([X,Y],(friends2(X,Y),\+(X=Y)),L), append(L0,[[X,Y]|_],L), \+(append(_,[[Y,X]|_],L0)). friends2(X, Y) :- mates(X, Z), mates(Y, Z). friends2(X, Y) :- mates(X, Z), mates(Z, Y). friends2(X, Y) :- mates(Z, X), mates(Z, Y). friends2(X, Y) :- mates(Z, X), mates(Y, Z). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/680 # # 1]授業単元:プログラミング # [2]問題文:自己参照型構造体を用いて、以下の処理をするプログラムを作成せよ。 # # 正の数入力→連結リストを辿り、初めて入力された数ならばカウンタを1増やす。同じ数が続けて入力されたらその数のカウンタをさらに1増やす。 # 負の数入力→負の数の絶対値と同じ回数入力された数のデータを削除(例えば、-3を入力し、それ以前に14が3回入力されていたら、それを削除) # 0を入力→データを出力して終了。 # # データ出力→終了の流れはどうにかなりましたが、それ以外で上手い発想が思いつきません。 # # http://ime.nu/codepad.org/yayuXIUa # # 期限は明日までです。 # # 正の数入力後連結リストを辿り、初めて入力された数ならばカウンタを1増やす。負の数入力後負の数の絶対値と同じ回数入力された数のデータを削除0を入力後データを出力して終了 :- 数入力(_数), 連結リストとカウンタを更新していく(_数,[],0,_連結リスト,_カウンタ), データを出力して終了(_連結リスト,_カウンタ),!. 連結リストとカウンタを更新していく(_数,L_1,_カウンタ_1,L,_カウンタ) :- 負の数が入力されたら負の数の絶対値と同じ回数入力された数のデータを削除して連結リストの最後に0を加える(_数,L_1,_カウンタ_1,L,_カウンタ),!. 連結リストとカウンタを更新していく(_数,L_1,_カウンタ_1,L,_カウンタ) :- 初めて入力された数ならばカウンタを1増やす(_数,L_1,_カウンタ_1,L_2,_カウンタ_2), 数入力(_数_2), 連結リストとカウンタを更新していく(_数_2,L_2,_カウンタ_3,L,_カウンタ). 連結リストとカウンタを更新していく(_数,L_1,_カウンタ_1,L,_カウンタ) :- \+(初めて入力された数ならばカウンタを1増やす(_数,L_1,_カウンタ_1,L,_カウンタ)), 数入力(_数_2), 連結リストの最後に数を追加(_数,L_1,L_2), 連結リストとカウンタを更新していく(_数_2,L_2,_カウンタ_1,L,_カウンタ). データを出力して終了(_連結リスト,_カウンタ) :- writef('実行後の連結リストは %t です\nその時点のカウンタは %t です\n',[_連結リスト,_カウンタ]),!. 負の数が入力されたら負の数の絶対値と同じ回数入力された数のデータを削除して連結リストの最後に0を加える(_負の数,L_1,_カウンタ_1,L_2,_カウンタ_2) :- _負の数 < 0, _負の数の絶対値 is abs(_負の数), 負の数の絶対値と同じ回数入力された数のデータを削除(_負の数の絶対値,L_1,L_3), 連結リストの最後に0を加える(L3,L2),!. 連結リストの最後に0を加える(L3,L2) :- append(L_3,[0],L_2),!. 負の数の絶対値と同じ回数入力された数のデータを削除(_負の数の絶対値,L_1,L_2) :- 既に入力された重複しない数ならびを得る(L_1,_数ならび), 削除する数を選択する(_負の数の絶対値,_数ならび,L_1,_削除する数候補), 連結リストからデータを削除(_削除する数候補,L_1,L_2). 既に入力された重複しない数ならびを得る(L_1,_数ならび) :- findsetof(_数,append(_,[_数|_],L_1),_数ならび),!. 削除する数を選択する(_負の数の絶対値,_数ならび,L_1,_削除する数候補) :- findall(_数,( append(_,[_数|_],_数ならび), 負の数の絶対値に要素数が一致する数(_負の数の絶対値,L_1,_数)), _削除する数候補),!. 負の数の絶対値に要素数が一致する数(_負の数の絶対値,L_1,_数) :- count(append(_,[_数|_],L_1),_負の数の絶対値)),!. 連結リストからデータを削除([],L,L) :- !. 連結リストからデータを削除([_数|R],L_1,L) :- ならびから削除(_数,L_1,L_2), 連結リストからデータを削除(R,L_2,L). ならびから削除(_,[],[]) :- !. ならびから削除(_削除する要素,[_削除する要素|_残り対象ならび],_削除されたならび) :- ならびから削除(_削除する要素,_残り対象ならび,_削除されたならび),!. ならびから削除(_削除する要素,[_要素|_残り対象ならび],[_要素|_残り削除ならび]) :- ならびから削除(_削除する要素,_残り対象ならび,_残り削除ならび),!. 初めて入力された数ならばカウンタを1増やす(_数,L_1,_カウンタ_1,L_2,_カウンタ_3) :- \+(append(_,[_数|_],L_1)), _カウンタ_2 is _カウンタ_1 + 1, 同じ数が続けて入力されたらその数のカウンタをさらに1増やす(_数,L_1,_カウンタ_2,_カウンタ_3), 連結リストの最後に数を追加(_数,L_1,L_2),!. 同じ数が続けて入力されたらその数のカウンタをさらに1増やす(_数,L_1,_カウンタ_1,_カウンタ_2) :- last(L_1,_数), _カウンタ_2 is _カウンタ_1 + 1,!. 同じ数が続けて入力されたらその数のカウンタをさらに1増やす(_,_,_カウンタ_1,_カウンタ_1). 連結リストの最後に数を追加(_数,L_1,L_2) :- append(L_1,[_数],L_2). 数入力(_数) :- write('数を入力してください : '), get_line(Line), 数入力診断(Line,_数),!. 数入力(_数) :- 数入力(_数). 数入力診断(Line,_数) :- atom_to_term(Line,_数,_), number(_数),!. 数入力診断(Line,_数) :- writef('入力された %t からは数値が得られません。再入力をお願いします\n',[Line]), fail. % 以下のサイトは # もう一度。テーブルtableにキーAの列とキーBの列がある。 # キーBは時系列で、例えば2011年5月6日なら20110506みたいな感じ。 # 昨日なら20110505だな。つまりプライマリではある。 # こいつをキーA毎に上位5つずつ抜き出したデータテーブル(VIEW)を作りたい # 曜日ごとに、日付の早い順5tuplesをとりだす。 # # 曜日(金曜,'20110401'). # 曜日(月曜,'20110404'). # 曜日(火曜,'20110405'). # 曜日(水曜,'20110406'). # 曜日(金曜,'20110408'). # 曜日(土曜,'20110409'). # 曜日(月曜,'20110411'). # 曜日(火曜,'20110412'). # 曜日(木曜,'20110414'). # 曜日(金曜,'20110415'). # 曜日(土曜,'20110416'). # 曜日(日曜,'20110417'). # 曜日(月曜,'20110418'). # 曜日(火曜,'20110419'). # 曜日(木曜,'20110421'). # 曜日(金曜,'20110422'). # 曜日(土曜,'20110423'). # 曜日(月曜,'20110425'). # 曜日(火曜,'20110426'). # 曜日(水曜,'20110427'). # 曜日(木曜,'20110428'). # 曜日(日曜,'20110501'). # 曜日(月曜,'20110502'). # 曜日(火曜,'20110503'). # 曜日(水曜,'20110504'). # 曜日(木曜,'20110505'). # 曜日(土曜,'20110507'). # 曜日(日曜,'20110508'). # 曜日(月曜,'20110509'). # 曜日(火曜,'20110510'). # 曜日(金曜,'20110513'). # 曜日(土曜,'20110514'). # 曜日(日曜,'20110515'). # 曜日(火曜,'20110517'). # 曜日(水曜,'20110518'). # 曜日(木曜,'20110519'). # 曜日(日曜,'20110522'). # 曜日(月曜,'20110523'). # 曜日(火曜,'20110524'). # 曜日(水曜,'20110525'). # 曜日(木曜,'20110526'). # 曜日(金曜,'20110527'). # 曜日(土曜,'20110528'). # 曜日(日曜,'20110529'). # 曜日(月曜,'20110530'). # 曜日(火曜,'20110531'). 曜日ごとの最初の五つの日付(_曜日,_最初の五つの日付ならび) :- eachsetof(_曜日,曜日(_曜日,_日付),_曜日_1), setof(_日付_1,曜日(_曜日_1,_日付_1),L), limit_n(5,L,_最初の五つの日付ならび). %%%% 汎用述語(ユーザ定義) %%%% limit_n(N,L,_limit_n_L) :- length(L,Len), Len < N, L = _limit_n_L),!. limit_n(N,L,_limit_n_L) :- length(_limit_n_L,N), append(_limit_n_L,_,L). eachsetof(A,B,E) :- findsetof(A,B,L), append(_,[E|_],L). findsetof(A,B,L) :- findall(A,B,C), setof(A,member(A,C),L). % 以下のサイトは # I am sorry to ask this question, but it has been a lot since I programmed in Prolog. I think I am used to imperative paradigm. :-( # # I am trying to obtain itemsets from a Prolog relation # # % transaction(Time, Client, Item) # transaction(1, 2, 10). # transaction(1, 2, 20). # transaction(2, 5, 90). # transaction(3, 2, 30). # transaction(4, 2, 40). # transaction(4, 2, 60). # transaction(4, 2, 70). # transaction(5, 4, 30). # transaction(5, 3, 30). # transaction(5, 3, 50). # transaction(5, 3, 70). # transaction(5, 1, 30). # transaction(6, 1, 90). # transaction(6, 4, 40). # transaction(6, 4, 70). # transaction(7, 4, 90). # # % Transformation of transactions to Lists of items per Time per Client. # transaction2(Time, Client, List) :- # setof(Item, Time^Client^transaction(Time, Client, Item), List). # # % Itemsets. # itemsets :- # transaction(Time, Client, _), # transaction2(Time, Client, List), # assert(init(List)). # % Main: # main(Itemsets) :- # itemsets, # setof(Basket, init(Basket), Itemsets), # retractall(init(Basket)). # Then if I consult main(X) I would like to obtain: # # X = [[10, 20], [30], [30, 50, 70], [40, 60, 70], [40, 70], [90]] # I just can't figure out a proper way of doing this. # # If I can get a pointer or a little help I will appreciate very much. # main(Items) :- findsetof([T1,C1],transaction(T1,C1,_),L1), findsetof(L2,( append(_,[[T2,C2]|_],L1), findsetof(Item,transaction(T2,C2,Item),L2)), Items). findsetof(A,B,L) :- findall(A,B,C), setof(A,member(A,C),L). % 以下のサイトは # 現在または過去に所属しているコーチの髪の色(C)と少なくともそれより大きい年齢(A)が与えられた時, # プレーヤー(P)の現在または過去に所属したチーム(L1)を探します。 '現在または過去に所属しているコーチの髪の色(C)と少なくともそれより大きい年齢(A)が与えられた時,プレーヤー(P)の現在または過去に所属したチーム(L1)を探します。'(P,C,A,L1) :- find(P,C,A,L1). find(P,C,A,L1) :- setof(P1,( coach(Name,C,A1), A1 > A, team(Team1,Name), player(Team1,L2), append(_,[P1|_],L2)), L3), append(_,[P|_],L3), findall(Team2,( player(Team2,L4), append(_,[P|_],L4)), L1). % **COACH(NAME,SKIN COLOR,AGE)** coach(allegri,blonde,45). coach(leonardo,dark,42). coach(mourinho,blonde,40). % **TEAM(NAME,COACH)** team(milan,allegri). team(inter,leonardo). team(realmadrid,mourinho). % **PLAYER(TEAM,[PLAYERS])** player(milan,[seedorf,zambrotta,gattuso]). player(inter,[seedorf,ronaldo,zambrotta]). player(realmadrid,[seedorf,zidane,ronaldo]). % 以下のサイトは # 1.. 全ての人から尊敬されている # 2.. 自分自身を尊敬している 全ての人から尊敬されている(A) :- findall(B,(尊敬されている(A,B),\+(A==B)),L1), findall(C,(尊敬されている(_,C),\+(A==C)),L2), setof(D,member(D,L2),L3), length(L1,Len), length(L3,Len). 自分自身を尊敬している(A) :- 尊敬されている(A,A). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/470 # # # 入力ファイル(成績ファイル)の仕様 # # ファイル名は、ASCII文字で構成されるものとする。 # ファイル名の最大長は FILENAME_MAX である(第2回の課題0を参照)。 # 1行は、「学生番号」、「氏名」、「成績」の順に記述したもので、 # 各項目の区切り文字は、「タブ('\t')」1個である。 # 学生番号は、英数字からなる6桁の文字列である。 # 氏名の文字列長の最大は20バイトとする。 # 成績は、0〜100までの整数である。 # 入力は、最大500行と仮定してよい。 # # 出力形式 # 入力ファイルを読み込み、最初に、成績の最高点と最低点と平均点を出力する。 # 次に、成績の降順にソートして出力する。各項 目間は、「タブ('\t')」1個で区切る。 # 平均点は、小数点以下1桁まで出力する。 # 出力形式は、実行例を参照せよ。 # エラー処理 # 呼出しでファイル名が指定されない場合はエラーとし、「ファイル名を指定してください」と表示し、プログラムを終了する。 # 指定されたファイルのオープンに失敗した場合に、「ファイルを開けませんでした」と表示し、プログラムを終了する。 # 今回のプログラムでは、a. b. 以外のエラー処理はしなくてよい。 # # % cat sample.txt # 03888 八 90 # 03111 一 100 # 03222 二 30 # 03666 六 70 # 03555 五 60 # 03333 三 80 # 03777 七 40 # 03999 九 20 # 03444 四 50 # % ./work31.exe sample.txt # 最高点:100 # 最低点: 20 # 平均点: 60.0 # 100 03111 一 # 90 03888 八 # 80 03333 三 # 70 03666 六 # 60 03555 五 # 50 03444 四 # 40 03777 七 # 30 03222 二 # 20 03999 九 # % # # 言語はCです # よろしくおねがいします # program :- user_parameters([_ファイル名]), '入力ファイルを読み込み、最初に、成績の最高点と最低点と平均点を出力する、次に、成績の降順にソートして出力する。各項 目間は、「タブ(''\\t''[B')」1個で区切る。' (_ファイル名). '入力ファイルを読み込み、最初に、成績の最高点と最低点と平均点を出力する、次に、成績の降順にソートして出力する。各項 目間は、「タブ(''\\t'')」1個で区切る。'(_ファイル名) :- 入力ファイルを読み込み(_ファイル名,LL), '最初に、成績の最高点と最低点と平均点を出力する'(LL), '次に、成績の降順にソートして出力する。各項 目間は、「タブ(''\\t'')」1個で区切る。'(LL). 入力ファイルを読み込み(_ファイル名,LL) :- get_lines(_ファイル名,Lines), 三項ならびに変換(Lines,LL). 三項ならびに変換([],[]) :- !. 三項ならびに変換([Line|R1],[[_成績,_学生番号,_氏名]|R2]) :- atom_chars(Line,Chars), append(L0,['\t'|L1],['\t'|L2],Chars), atom_chars(_学生番号,L0), atom_chars(_氏名,L1), atom_chars(_成績文字列,L2), atom_to_term(_成績文字列,_成績,_), 三項ならびに変換(R1,R2). 最初に、成績の最高点と最低点と平均点を出力する(LL) :- findmax(_成績, append(_,[[_成績,_,_]|_],LL), _最高点成績), findmin(_成績, append(_,[[_成績,_,_]|_],LL), _最低点成績), findavg(_成績, append(_,[[_成績,_,_]|_],LL), _平均点), writef('最高点: %t\n',[_最高点成績]), writef('最低点: %t\n',[_最低点成績]), writef('平均点: %t\n',[_平均点]),!. '次に、成績の降順にソートして出力する。各項 目間は、「タブ(''\\t'')」1個で区切る。'(LL) :- sort(LL,LL1), reverse(LL1,LL2), append(_,[L|R],LL2), writef('%t\t%t\t%t\t\n',L), R = [],!. % *** user: append / 4 *** append([],L1,L2,L) :- append(L1,L2,L). append([A|R1],L1,L2,[A|R]) :- append(R1,L1,L2,R). % *** user: findmax / 3 *** findmax(V,P,Max) :- findall(V,P,L), max(L,Max). % *** user: findmin / 3 *** findmin(V,P,Max) :- findall(V,P,L), min(L,Max). % *** user: findavg / 3 *** findavg(_集約項,_項,_算術平均) :- findall(_集約項,_項,_値ならび), sum(_値ならび,_合計値), length(_値ならび,_ならびの長さ), _算術平均 is _合計値 / _ならびの長さ,!. % *** user: sum / 2 *** sum([],0). sum([N|R],S) :- sum(R,S1), S is N + S1. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/137 # # お世話になっています。 # # どのようなSQLになるか教えてください。 # # テーブルA テーブルB テーブルC # E111,001,AR E111,001,AR E111,001,AR # E111,001,AY E111,001,AY E111,001,AY # E111,002,AR E111,003,AR E111,004,AR # # 上記のような同じキー項目(ID,番号,コード)を持つ3つのテーブルがあるとき、 # # E111,001,AR,E111,001,AR,E111,001,AR # E111,001,AY,E111,001,AY,E111,001,AY # E111,002,AR,'','','','','','' # '','','',E111,003,AR,'','','' # '','','','','','',E111,004,AR # # の形でレコードを取得するにはどのようなSQLになりますか? # # お願いします。 # # # '上記のような同じキー項目(ID,番号,コード)を持つ3つのテーブルがあるとき、3レコードを併記する'(L) :- findsetof([A,B],テーブルA(A,B,_),L1), findsetof([A,B],テーブルB(A,B,_),L2), findsetof([A,B],テーブルC(A,B,_),L3), append(L1,L2,L3,L4), findsetof([A,B],append(_,[[A,B]|_],L4),L5), findall([A1,B1,X,A2,B2,Y,A3,B3,Z],( append(_,[[A,B]|_],L5), '3レコード選択'(A,B,A1,B1,X,A2,B2,Y,A3,B3,Z), \+((X='',Y='',Z=''))),L). '3レコード選択'(A,B,A1,B1,X,A2,B2,Y,A3,B3,Z) :- 選択A(A,B,A1,B1,X), 選択B(A,B,A2,B2,Y), 選択C(A,C,A3,B3,Z). 選択A(A,B,'','','') :- \+(テーブルA(A,B,X)),!. 選択A(A,B,A,B,X) :- テーブルA(A,B,X). 選択B(A,B,'','','') :- \+(テーブルB(A,B,X)),!. 選択B(A,B,A,B,X) :- テーブルB(A,B,X). 選択C(A,B,'','','') :- \+(テーブルC(A,B,X)),!. 選択C(A,B,A,B,X) :- テーブルC(A,B,X). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/212 # # [1]C言語演習 # [2]問題文 # 次の形式のタブ区切りファイルがある。(行数は最大で1000万行とする) # 生徒ID クラス名 国語得点 数学得点 英語得点 # 生徒IDは8桁の0から9で構成される文字列 # クラス名は4桁の0から9で構成される文字列 # 国語得点、数学得点、英語得点は3桁の0から9で構成される文字列とする。 # # (2)それぞれの教科の得点が所属しているクラスの各教科の平均点の大小関係と # 同じ生徒をリストアップせよ # ただしあるクラスの2つの教科の平均点が一致している場合はその2つの教科の得点の # 大小関係は不問として出力する。(3つが一致している場合はそのクラスの生徒全員 # がリストアップされることになる # [3] OSはLinux,言語はCです。(C++は不可) # [4] 4/30まで # [5] stdlib.h stdio.h string.hをincludeしても良いがそれ以外は不可だそうです # よろしくお願いします。 # # それぞれの教科の得点が所属しているクラスの各教科の平均点の大小関係が同じ生徒をリストアップ(_ファイル) :- get_split_lines(_ファイル,['\t'],LL), findsetof(_クラス,append(_,[[_,_クラス,_,_,_]|_],LL),_クラスならび), findall([_クラス,_パターン],( append(_,[_クラス|_],_クラスならび), パターン(LL,_クラス,_国語平均点,_数学平均点,_英語平均点,_パターン)), _クラス・パターンならび), append(_,[[_ID,_クラス,_国語,_数学,_英語]|R],LL), パターンが一致したら表示(_ID,_クラス,_クラスパターンならび,_国語,_数学,_英語), R = [],!. パターンが一致したら表示(_ID,_クラス,_クラス・パターンならび,_国語,_数学,_英語) :- append(_,[[_クラス,_パターン]|_],_クラス・パターンならび), パターン判断(_パターン,_国語,_数学,_英語), write_formatted('%t\n',[_クラス,_ID]),!. パターンが一致したら表示(_,_,_,_,_,_). パターン(LL,_クラス,_国語平均点,_数学平均点,_英語平均点,_パターン) :- findavg(_国語,append(_,[[_,_クラス,_国語,_,_]|_],LL),_国語平均点), findavg(_数学,append(_,[[_,_クラス,_数学,_,_]|_],LL),_数学平均点), findavg(_英語,append(_,[[_,_クラス,_英語,_,_]|_],LL),_英語平均点), パターン(_パターン,_国語平均点,_数学平均点,_英語平均点). パターン(1,A,B,C) :- A >B,B > C,!. パターン(2,A,B,C) :- A >C,C > B,!. パターン(3,A,B,C) :- B >A,A > C,!. パターン(4,A,B,C) :- B >C,C > A,!. パターン(5,A,B,C) :- C >A,A > B,!. パターン(6,A,B,C) :- C >B,B > A,!. パターン(7,E,E,C) :- \+(E=C),E > C,!. パターン(8,E,E,C) :- \+(E=C),E < C,!. パターン(9,E,B,E) :- \+(E=B),E > B,!. パターン(10,E,B,E) :- \+(E=B),E < B,!. パターン(11,A,E,E) :- \+(E=C),E < A,!. パターン(12,A,E,E) :- \+(E=C),E > A,!. パターン(13,E,E,E). パターン判断(_パターン,A,B,C) :- _パターン < 7, パターン(_パターン,A,B,C),!. パターン判断(7,A,B,C) :- C < A,C < B,!. パターン判断(8,A,B,C) :- C > A,C > B,!. パターン判断(9,A,B,C) :- B < A,B < C,!. パターン判断(10,A,B,C) :- B > A,B > C,!. パターン判断(11,A,E,E) :- A < B,A < C,!. パターン判断(12,A,E,E) :- A > B,A > C,!. パターン判断(13,_,_,_). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/212 # # [1]C言語演習 # [2]問題文 # 次の形式のタブ区切りファイルがある。(行数は最大で1000万行とする) # 生徒ID クラス名 国語得点 数学得点 英語得点 # 生徒IDは8桁の0から9で構成される文字列 # クラス名は4桁の0から9で構成される文字列 # 国語得点、数学得点、英語得点は3桁の0から9で構成される文字列とする。 # # (1)各教科の得点の和が同じ生徒達のグループについて、そのグループが何人で何クラスの # 生徒から構成されているかを、得点和毎に表出力せよ # ただし0人で構成されるグループについては出力する必要がない。 # 形式例 # 得点:123 人数:5人 グループ数:4 # 得点:128 人数:3人 グループ数:3 # 得点:214 人数:11人 グループ数:9 # ............ # # (2)それぞれの教科の得点が所属しているクラスの各教科の平均点の大小関係と # 同じ生徒をリストアップせよ # ただしあるクラスの2つの教科の平均点が一致している場合はその2つの教科の得点の # 大小関係は不問として出力する。(3つが一致している場合はそのクラスの生徒全員 # がリストアップされることになる # [3] OSはLinux,言語はCです。(C++は不可) # [4] 4/30まで # [5] stdlib.h stdio.h string.hをincludeしても良いがそれ以外は不可だそうです # よろしくお願いします。 # # '各教科の得点の和が同じ生徒達のグループについて、そのグループが何人で何クラスの生徒から構成されているかを、得点和毎に表出力せよ'(_ファイル) :- get_split_lines(_ファイル,['\t'],LL), findall([_得点合計,_クラス名],( append(_,[[_生徒ID,_クラス名,_国語得点,_数学得点,_英語得点]|_],LL), _得点合計 is _国語得点,_数学得点,_英語得点), L1), findsetof(_得点合計,( append(_,[[_得点合計,_]|_,L1)), L2), findsetof([_得点合計,_クラス]( append(_,[[_得点合計,_クラス]|_,L1)), L3), findall([_得点合計,_グループ人数,_クラス数],( append(_,[_得点合計|_],L2), count(append(_,[[_得点合計,_]|_],L1),_グループ人数)), count(append(_,[[_得点合計,_]|_],L3),_クラス数)), _得点合計・グループ人数・クラス数集計ならび), 出力する(_得点合計・グループ人数・クラス数集計ならび). 出力する(_得点合計・グループ人数・クラス数集計ならび) :- append(_,[[_得点合計,_グループ人数,_クラス数]|R],_得点合計・グループ人数・クラス数集計ならび), write_formatted('得点:%t 人数:%t人 グループ数:%t\n',[_得点合計,_グループ人数,_クラス数]), R = [],!. % 以下のサイトは # http://bit.ly/dIOWsn test(t1,[a,b,c]). test(t2,[a,b]). test(t3,[a,d]). test(t4,[e,f]). test(t5,[e,f,b,c,a]). ある要素を含む集合名を蒐集する(_要素ならび,_蒐集された集合名) :- findsetof(_集合名,( append(_,[_要素|_],_要素ならび), test(_集合名,_集合), append(_,[_要素|_],_集合)), _蒐集された集合名). findsetof(A,B,L) :- findall(A,B,C), setof(A,member(A,C),L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/99 # # [1] 授業単元:整数演算 # [2] 問題文(含コード&リンク):以下の問題に答えなさい # # 50 # Σ((3*i)/2) = A の計算式を計算できるプログラムを完成させなさい。 # i=0 # # '50\\nΣ((3*i)/2) = A の計算式を計算できるプログラムを完成させなさい\\ni=0'(_A) :- findsum(_j,( for(0,_i,50), _j is 3 * _i / 2), _A). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/106 # # ストアドプロシージャについて質問させてください。 # # 簡単な結果を返すクエリ # SELECT A,B,C FROM TEST # # といったクエリの結果を戻り値として返すストアドを作成したいのですが # どのように書けば良いのかわかりません。 # # 単一の列のみを返す方法ならわかったのですが、複数列を返す方法が # 分からないといった状態です。 # テーブル構造('TEST',1,'A'). テーブル構造('TEST',2,'B'). テーブル構造('TEST',3,'C'). 簡単な結果を返すクエリ(_テーブル名,_選択項ならび,_値ならび) :- count(テーブル構造('TEST',_,_),Len), length(_値ならび,Len), findsetof(_,( テーブル構造(_テーブル名,Nth,_)), L), P =.. [_テーブル|_変数ならび], call(P), 選択項と値の結合(L,_選択項ならび,_値ならび). 選択項と値の結合(_テーブル名,L,[],[]) :- !. 選択項と値の結合(_テーブル名,L,[_選択項|R1],[_値|R2]) :- テーブル構造(_テーブル名,Nth,_選択項), list_nth(Nth,L,_値), 選択項と値の結合(_テーブル名,L,R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/9 # # どなたかご教授ください・・・ # ●正規表現の使用環境 # EmEditor # # ●検索か置換か? # 置換 # # ●説明 # 鍵カッコ内の文字列と前方の文字列を入れ替えたい。 # # ●対象データ # AAA「BBB」/CCC「DDD」/EEE「FFF」…YYY「ZZZ」 # # ●希望する結果 # BBB「AAA」/DDD「CCC」/FFF「EEE」…ZZZ「YYY」 # # 鍵カッコ内の文字列と前方の文字列を入れ替えたい。(_文字列,_置換された文字列) :- 置換部分の確定(_文字列,S1,S2,S3,R1,R2,R3,_前文字列,_後文字列), 鍵カッコ内の文字列と前方の文字列を入れ替えたい。(_後文字列,_置換された文字列の二), concat_atom([_前文字列,_置換された文字列の二],_置換された文字列),!. 鍵カッコ内の文字列と前方の文字列を入れ替えたい。(_文字列,_文字列) :- !. 置換部分の確定(_文字列,S1,S2,S3,R1,R2,R3,_前文字列,_後文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,[/|R1],[「|R2],[」|R3]), \+(append(_,[」|_],R1), append([/|R2],[「|R1],[」],L0), atom_chars(_前文字列,L0), atom_chars(_後文字列,R3),!. 置換部分の確定(_文字列,S1,S2,S3,R1,R2,R3,_前文字列,_後文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,[「|R2],[」|R3]), \+(append(_,[」|_],R1), append(R2,[「|L1],[」],L0), atom_chars(_前文字列,L0), atom_chars(_後文字列,R3),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/97 # # select * from table1 where col1 in (select colx, coly from table2); # # 的な書き方は無い? # ↓ってするしかない? # # select * from table1 where col1 in (select colx from table2) or col1 in (select coly from table2) ; # # 'select * from table1 where col1 in (select colx from table2) or col1 in (select coly from table2)'(L1) :- テーブルの選択(table1,[col1],[_col1],L1,P1), テーブルの選択(table2,[colx,coly],[_colx,_coly],L2,P2), P1, P2, 選択条件(_col1,_colx,_coly). 選択条件(X,X,_) :- !. 選択条件(X,_,X) :- !. %%% テーブルが生成される時に定義される %%% テーブル構造(table1,1,col1). テーブル構造(table2,1,colx). テーブル構造(table2,2,coly). %%% 汎用述語 %%% テーブルの選択(_テーブル名,_鍵名ならび,_鍵変数ならび,L,P) :- findall(_,テーブル構造(_テーブル名,_,_),L), P =.. [_テーブル名|L], 鍵変数の指定(_テーブル名,L,_鍵名ならび,_鍵変数ならび). 鍵変数の指定(_テーブル名,L,[],[]) :- !. 鍵変数の指定(_テーブル名,L,[_鍵名|R1],[_鍵変数|R2]) :- テーブル構造(_テーブル名,_位置,_鍵名), list_nth(_位置,L,_鍵変数), 鍵変数の指定(_テーブル名,R1,R2,L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/92 # # 環境はoracle9iです。 # # ■テーブルの構成 # |年度|月|部署コード|商品コード|金額| # # ■テーブルの内容 # |2010|01|AAA|001|1000| # |2010|02|AAA|001|2000| # |2010|01|AAA|001|3000| # |2010|01|AAA|002|3000| # |2010|02|BBB|003|4000| # |2010|01|CCC|001|5000| # |2010|03|CCC|001|6000| # # 上記のようなテーブルがあり、 # これを # と、ここまでなら上の4つでGROUP BYしてあげれば良いのですが、 # そこに年度,部署コード,商品コードでサマリした # 「累計金額」列を加える必要があります。(イメージは下記のとおりです。) # # # ■抽出結果の構成 # |年度|月|部署コード|商品コード|金額|累計金額| # # ■抽出結果の内容 # |2010|01|AAA|001|4000|6000| # |2010|02|AAA|001|2000|6000| # |2010|02|BBB|003|4000|4000| # |2010|01|CCC|001|5000|11000| # |2010|03|CCC|001|6000|11000| # # # GROUP BYと別の集計単位で列を作ることが可能か、 # 可能であればどのようなSQLを書くべきか、 # というところを教えてください。 # # '|年度|月|部署コード|商品コード|金額| テーブルを年度,月,部署コード,商品コードでサマリした値にさらに年度,部署コード,商品コードでサマリした値を付加した行表示' :- 鍵ならびの生成([_年度,_部署コード,_商品コード],テーブル(_年度,_月,_部署コード,_商品コード,_金額),_鍵ならびの一), 鍵ならびの生成([_年度,_月,_部署コード,_商品コード],テーブル(_年度,_月,_部署コード,_商品コード,_金額),_鍵ならびの二), append(_,[[_年度,_部署コード,_商品コード]|R],_鍵ならびの一), 金額制約(_鍵ならびの二,_年度,_月,_部署コード,_商品コード,_金額月合計,_金額総合計), writef('|%t|%t|%t|%t|%t|%t\n',[_年度,_月,_部署コード,_商品コード,_金額月合計,_金額総合計]), R = []. 金額集約(L2,_年度,_月,_部署コード,_商品コード,_金額月合計,_金額総合計) :- 年度・部署コード・商品コード集約(_年度,_部署コード,_商品コード,_金額総合計), append(_,[[_年度,_月,_部署コード,_商品コード]|_],L2), 年度・月・部署コード・商品コード集約(_年度,_月,_部署コード,_商品コード,_金額月合計). 年度・月・部署コード・商品コード集約(_年度,_月,_部署コード,_商品コード,_金額合計) :- findsum(_金額,( テーブル(_年度,_月,_部署コード,_商品コード,_金額)), _年度・月・部署コード・商品コード集約). 年度・部署コード・商品コード集約(_年度,_部署コード,_商品コード,_金額合計) :- findsum(_金額,( テーブル(_年度,_月,_部署コード,_商品コード,_金額)), _年度・部署コード・商品コード集約). 鍵ならびの生成(_鍵変数ならび,_述語,_鍵ならび) :- findsetof(_鍵変数ならび,_述語,_鍵ならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1295436346/173 # # 質問させてください # selectしたデータを一部だけ別のテーブルに入れる方法ってありますか? # # 例:insert into table2 (aaa,bbb,ccc) select aaa as aaa,bbb as bbb,ccc as ccc from table1 # この場合table1のデータがすべてtable2に入るのでaaaだけ別のデータを入れたいと思っています。 # よろしくお願いします。 # # 海に接していない都道府県名([栃木県,群馬県,埼玉県,山梨県,長野県,岐阜県,滋賀県,奈良県]). table1(奈良県,1000,aa). table1(埼玉県,2000,ab). selectしたデータを一部だけ別のテーブルに入れる方法 :- 海に接していない都道府県名(_海に接していない都道府県名ならび), table1(_都道府県名の一,_bbb,_ccc), 新しい都道府県名の生成(_海に接していない都道府県名ならび,_都道府県名の一,_都道府県名の二), assertz(table2(_都道府県名の二,_bbb,_ccc)), fail. selectしたデータを一部だけ別のテーブルに入れる方法. 新しい都道府県名の生成(_海に接していない都道府県名ならび,_都道府県名の一,_都道府県名の二) :- M is (random mod 8) + 1, list_nth(M,_海に接していない道府県名ならび,_都道府県名の二), \+(_都道府県名の一 = _都道府県名の二), \+(table2(_都道府県名の二,_,_)). 新しい都道府県名の生成(_海に接していない都道府県名ならび,_都道府県名の一,_都道府県名の二) :- 新しい都道府県名の生成(_海に接していない都道府県名ならび,_都道府県名の一,_都道府県名の二). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/15 # # select id, info_date from t_information order by info_date desc; # というクエリで、 # +----+---------------------+ # | id | info_date | # +----+---------------------+ # | 18 | 2011-03-03 17:00:00 | # | 17 | 2011-03-03 15:00:00 | # | 16 | 2011-03-01 10:00:00 | # | 4 | 2011-01-13 14:00:00 | # | 3 | 2011-01-13 07:00:00 | # | 2 | 2011-01-13 03:00:00 | # | 1 | 2011-01-13 00:00:00 | # | 15 | 2011-01-12 00:00:00 | # +----+---------------------+ # というデータの場合に # info_dateを基準に目的idの次のidを取得したいです。 # 例えば目的idが15とすると、1を取得したいです。 # # mysqlです。 # よろしくおねがいします。 # t_information(18,'2011-03-03 17:00:00'). t_information(17,'2011-03-03 15:00:00'). t_information(16,'2011-03-01 10:00:00'). t_information( 4,'2011-01-13 14:00:00'). t_information( 3,'2011-01-13 07:00:00'). t_information( 2,'2011-01-13 03:00:00'). t_information( 1,'2011-01-13 00:00:00'). t_information(15,'2011-01-12 00:00:00'). 'キー値を基準に目的idの次のidを取得する'(_キー値,_id) :- findmin([_info_date,_id],( t_information(_id,_info_date), _info_date @> _キー値), [_info_date,_id]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/12 # # 以下のようなテーブルがあるとします。 # [テーブル名:経費TBL] # 会社 , 部署 , 年度 , 月 , 経費 # ------------------------------- # AAA , AAA01 , 2009 , 1 , 10000 # AAA , AAA01 , 2009 , 1 , 20000 # AAA , AAA01 , 2009 , 2 , 30000 # AAA , AAA01 , 2009 , 3 , 40000 # BBB , AAA01 , 2009 , 4 , 50000 # BBB , AAA01 , 2010 , 1 , 60000 # CCC , AAA01 , 2010 , 1 , 70000 # CCC , AAA01 , 2010 , 1 , 80000 # # ここから以下のような、 # 会社別、部署別の集計データを作成したいとします。 # 会社 , 部署 , 200901経費計 , 200902経費計 , … , 201012経費計 # # この時、経費計列の条件指定はどうしたら良いのでしょうか? # # '会社別、部署別の集計データを作成したいとします。 会社 , 部署 , 200901経費計 , 200902経費計 , … , 2010122経費計 ' :- 見出し表示, findsetof([_会社,_部署],経費TBL(_会社,_部署,_,_,_),L1), append(_,[[_会社,_部署]]|R],L1), findall(_経費計,( 年度・月の生成(_年度,_月), findsum(_経費,( 経費TBL(_会社,_部署,_年度,_月,_経費)), _経費計)), _経費ならび), concat_atom(_経費ならび,',',_経費月別表示), write_formatted('%t,%t,%t\n',[_会社,_部署,_経費月別表示]), R = []. 年度・月の生成(2009,_月) :- for(1,_月,12). 年度・月の生成(2010,_月) :- for(1,_月,12). 見出し表示 :- write(' 会社 , 部署 '), 年度の生成(_年,_月), write_formatted_atom(S,', %4d%02d経費計 ',[_年,_月]), write(S), fail. 見出し表示 :- nl. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/8 # # よくある質問3 # # (問) # ID HOGE # 01 A # 01 B # 01 C # 02 A # 03 B # # HOGEをAもBもCも持っている、ID:01だけ取り出すにはどうすればよかですか # # (答1) # SELECT id # FROM TableName # WHERE hoge in ('A','B','C') # GROUP BY id # HAVING count(DISTINCT hoge) = 3 # ; # # (答2) # select * # from TableName T1 # where not exists (select * #          from (values 'A', 'B', 'C') T2 (HOGE) #          where not exists (select * #                   from TableName T3 #                   where T1.ID = T3.ID #                   and T2.HOGE = T3.HOGE #                   ) #          ) # ; # ※valuesの部分(Table Value Constructor)はDBMSによって文法がかなり違うので注意 # # 'HOGEをAもBもCも持っている、ID:01だけ取り出す'(L,_ID) :- findsetof(_ID,'TableName'(_ID,_)), 関係の割り算(_ID,L). 関係の割り算(_,[]):- !. 関係の割り算(_ID,[_HOGE|R]) :- 'TableName'(_ID,_HOGE), 関係の割り算(_ID,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/7 # # よくある質問2 # # (問) # key   data # ---------------- # 1     a # 1     a # 1     b # 1     b # 1     a # 2     b # 2     a # 2     a # # というテーブルから # # key   a   b # -------------------- # 1    3   2 # 2    2   1 # # というExcelのピボットの様なデータを取得したいのですが、どういうSQLになりますか? # a,bというのは固定なので、仮にcというデータがあっても無視して構いません。 # # (答) # SELECT key, #     SUM(CASE data WHEN 'a' THEN 1 END) AS a, #     SUM(CASE data WHEN 'b' THEN 1 END) AS b # FROM table # GROUP BY key # ORDER BY key # ; # 'Excelのピボットの様なデータを取得したい' :- findsetof(_data,table(_,_data),L1), findsetof(_key,table(_key,_data),L2), append(_,[_key|R],L2), findall(Count, count((append(_,[_data|_],L1),table(_key,_data)),Count), L3), concat_atom([_key|L3],',',S), write_formatted('%t\n',[S]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/6 # # よくある質問1 # # (問) # ID | DATE     | DATA # --+----------+----- # 1 | 2007-11-11 | aaa # 2 | 2007-11-11 | bbb # 1 | 2007-11-10 | ccc # 3 | 2007-11-12 | ddd # 3 | 2007-11-11 | eee # 4 | 2007-11-10 | fff # 1 | 2007-11-12 | ggg # # このようなテーブルから、下記のように # # 1 | 2007-11-12 | ggg # 3 | 2007-11-12 | ddd # 2 | 2007-11-11 | bbb # 4 | 2007-11-10 | fff # # 各idに対して最新の1件だけ抽出するSQLの書き方を教えてください。 # # (答) # select A.ID, #     A.DATE, #     A.DATA # from TableName A #    inner join #    (select ID, max(DATE) as MAX_DATE #     from TableName #     group by ID #    ) B #    on A.ID = B.ID #    and A.DATE = B.MAX_DATE # ; # 'TableName'(1,'2007-11-11',aaa). 'TableName'(2,'2007-11-11',bbb). 'TableName'(1,'2007-11-10',ccc). 'TableName'(3,'2007-11-12',ddd). 'TableName'(3,'2007-11-11',eee). 'TableName'(4,'2007-11-10',fff). 'TableName'(1,'2007-11-12',ggg). '各idに対して最新の1件だけ抽出する'(_ID,_DATE,_DATA) :- findsetof(_ID,'TableName'(_ID,_,_),L1), append(_,[_ID|_],L1), findmax([_DATE,_ID,_DATA],( 'TableName'(_ID,_DATE,_DATA)), [_DATE,_ID,_DATA]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/967 # # # ■DBMS名とバージョン # Firebird 1.03 # ■テーブルデータ (注文データベースのようなものです) # ・Main 主情報テーブルMIDがキー # MID HACCHUBI # 1 2011/03/01 # ・DETAIL 明細テーブルDIDがキー MID,IIDが参照キー # DID MID IID KOSU # 1  1  1  100 # 2  1  2  30 # ・ITEM 商品テーブルIIDがキー # IID NAMAE ZAIKO OPOINT BIKO # 1  HOGE  20  10   0 # 2  HUGA  50  5    1 # ■欲しい結果 # 2011/1/1から1/31の注文のあった各アイテムの個数(DETAIL.KOSU)の平均値が10以上の場合、 # 該当するアイテムの注文ライン(ITEM.OPOINT)に、その平均値を入れて更新。平均値が10未満の場合、 # ITEM.OPOINTに0を入れる。ただしアイテムの備考(ITEM.BIKO)が1の場合は、ITEM.OPOINTには # 空欄(NULL)にする。 # ■説明 # といいますか、上記の欲しい結果が全てなのですが、どう書いていいのかちょっと見当がつきません。 # 在庫の仕入れをする個数(ITEM.OPOINT)の設定をコンピュータにさせようとしているのですが・・・。 # 丸投げで申し訳ありませんが、どなたかお願いします。 '2011/1/1から1/31の注文のあった各アイテムの個数(DETAIL.KOSU)の平均値が10以上の場合、該当するアイテムの注文ライン(ITEM.OPOINT)に、その平均値を入れて更新。平均値が10未満の場合、ITEM.OPOINTに0を入れる。ただしアイテムの備考(ITEM.BIKO)が1の場合は、ITEM.OPOINTには空欄(NULL)にする' :- findsetof(_MID,( 'Main'(_MID,_HACCHUBI), _HACCHUBI @>= '20110101', _HACCHUBI @=< '20110131'), L1), findsetof(_IID,( 'DETAIL'(_DID,_MID,_IID,_KOSU), append(_,[_MID|_],L1)), L2), append(_,[IID|R],L2), findavg(_KOSU,( 'DETAIL'(_DID,_MID,_IID,_KOSU), append(_,[_MID|_],L1)), AVG), 'ITEM更新'(IID,AVG), R = []. 'ITEM更新'(IID,AVG) :- retract('ITEM'(_IID,_NAMAE,_ZAIKO,_OPOINT,'1')), assertz('ITEM'(_IID,_NAMAE,_ZAIKO,'',_BIKO)),!. 'ITEM更新'(IID,AVG) :- AVG >= 10, write_formatted_atom(S,'%t',[AVG]), retract('ITEM'(_IID,_NAMAE,_ZAIKO,_OPOINT,_BIKO)), assertz('ITEM'(_IID,_NAMAE,_ZAIKO,S,_BIKO)),!. 'ITEM更新'(IID,AVG) :- AVG < 10, retract('ITEM'(_IID,_NAMAE,_ZAIKO,_,_BIKO)), assertz('ITEM'(_IID,_NAMAE,_ZAIKO,'0',_BIKO)),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/580 # # [1]授業単元:プログラミング # [2]問題文 # 担当者名が"end"になる迄、担当者名と売上を入力する。売上合計を求める。 # [3]環境 #  [3.1]OS:Windows #  [3.2]コンパイラ名 Borland C++ compiler 5.5 #  [3.3]言語:C # [4]期限:無期限 # '担当者名が"end"になる迄、担当者名と売上を入力する。売上合計を求める。' :- abolish(担当者別売上/2), 担当者名と売上を入力する(_担当者名,_売上), '担当者名が"end"になる迄、担当者名と売上を入力する。売上合計を求める。'(_担当者名,_売上),!. '担当者名が"end"になる迄、担当者名と売上を入力する。売上合計を求める。' :- 担当者別売上合計の表示, 売上合計の表示. 担当者名と売上を入力する(_担当者名,_売上) :- write('担当者名を入力してください : '), get_line(_担当者名), \+(_担当者名 = 'END'), write('売上を入力してください : '), get_integer(_売上),!. '担当者名が"end"になる迄、担当者名と売上を入力する。売上合計を求める。'(_担当者名,売上) :- assertz(担当者別売上(_担当者名,_売上)), 担当者名と売上を入力する(_担当者名2,_売上2), '担当者名が"end"になる迄、担当者名と売上を入力する。売上合計を求める。'(_担当者名2,売上2). 担当者別売上合計の表示 :- findsetof(_担当者,( 担当者別売上(_担当者,_)), _担当者ならび), append(_,[_担当者|R],_担当者ならび), findsum(_売上,担当者別売上(_担当者,_売上),_担当者別売上合計), wr('担当者:%t,売上合計:%t\n',[_担当者,_担当者別売上合計]), R = []. 売上合計の表示 :- findsum(_売上,担当者別売上(_,_売上),_売上合計), write_formatted('総売上合計は %t です。\n',[_売上合計]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/923 # # 初歩的ですみません、相関副問合せでinの仕組みを教えてください。 # # in句の使いかたとして、 # select * from テーブル where フィールド1 in (値1,値2,値3) # みたいな使い方は素直に読めるのですが、 # # # 社員テーブル syain # id | name | busyoid | # ------------------ # 1  | yamada |100 | # 2  | satou |100 | # 3  | suzuki |200 | # # 部所テーブル busyo # busyoid | busyomei | # ------------------ # 100 | soumu | # 200 | eigyo | # # の2つのテーブルで、総務所属の人のみ抽出するとき、 # # select * from syain where 'soumu' in (select busyomei from busyo where busyo.busyoid = syain.busyoid) # # で答えが出るとき、where 'soumu' in(select文)のin句の使い方はどう理解すれば良いのでしょうか。 # 'select * from syain where ''soumu'' in (select busyomei from busyo where busyo.busyoid = syain.busyoid) をどう理解すればよいか'(_id,_name,_bushoid) :- 社員テーブル(_id,_name,_busyoid), findall(_busyomei,部署テーブル(_busyoid,_busyomei),L), member(soumu,L). 社員テーブル(1,yamada,100). 社員テーブル(2,satou,100). 社員テーブル(3,suzuki,200). 部所テーブル(100,soumu). 部所テーブル(200,eigyo). テーブル構造(社員テーブル,1,id). テーブル構造(社員テーブル,2,name). テーブル構造(社員テーブル,3,busyoid). テーブル構造(部所テーブル,1,busyoid). テーブル構造(部所テーブル,2,busyomei). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/879 # # ・DBMS名とバージョン # oracle9i / 10g # ・テーブルデータ # 部署ID 大分類 中分類 小分類 予算 # -------+------+-------+------+--- # 01 01 01 01 2500 # 01 02 01 01 1000 # 01 02 02 02 100 # 02 01 01 01 100 # 02 01 02 02 0 # 02 02 02 02 1000 # 02 03 01 01 0 # 03 01 01 01 500 # # ・欲しい結果 # 上のテーブルの時、 # (大分類=01and予算>50) and (大分類=02and予算<2000) # の部署IDを取得したい。 # ・説明 # とりたい結果は01,02ですが上のSQLを # そのまま書くと当然結果はnullですし、 # 括弧の間のandをorにすると03も取得されてしまいます。 # なにか良い方法はないでしょうか? # # テーブルデータ('01','01','01','01',2500). テーブルデータ('01','02','01','01',1000). テーブルデータ('01','02','02','02',100). テーブルデータ('02','01','01','01',100). テーブルデータ('02','01','02','02',0). テーブルデータ('02','02','02','02',1000). テーブルデータ('02','03','01','01',0). テーブルデータ('03','01','01','01',500). '(大分類=01and予算>50) and (大分類=02and予算<2000)の部署IDを取得したい'(_部署ID) :- findsetof([_部署ID,_大分類],( テーブルデータ(_部署ID,_大分類,_,_,_)), L), findall([_部署ID,_大分類,_予算計],( append(_,[[_部署ID,_大分類]|_],L)), findsum(_予算,( テーブルデータ(_部署ID,_大分類,_,_,_予算)), _予算計)), _部署ID・大分類・予算計ならび), append(_,[[_部署ID,'01',_予算計_1]|_],_部署ID・大分類・予算計ならび), _予算計_1 > 50, append(_,[[_部署ID,'02',_予算計_2]|_],_部署ID・大分類・予算計ならび), _予算計_2 < 2000. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/873 # # ・DBバージョン # MySQL5.0.77 # # id|_regDate_| # --+----------+ # 1 |2010-10-10| # 2 |2010-10-10| # 3 |2010-10-10| # 4 |2010-10-11| # 5 |2010-10-11| # 6 |2010-10-11| # 7 |2010-10-11| # 8 |2010-10-12| # 9 |2010-10-12| # 10|2010-10-12| # 11|2010-10-12| # # ・欲しい結果 # 何件レコードがあったかを日別に出力したい。 # # 例として # _regDate__|件数 # ----------+- # 2010-10-10|3 # 2010-10-11|4 # 2010-10-12|4 # # こうなってるとうれしいです。 # # ・説明 # 自前でクリックカウンターを作っております。 # ほかにカラムとしてユーザーエージェントやリモートホストのアドレスを設置してありまして # 日別に集計して見れるようにしたいと思ったのですが、PHPでループを書いて出力するより # SQLの問い合わせ段階で、上記のように整形できないかなと思いました。 # # よろしくお願いいたします。 # # 何件レコードがあったかを日別に出力する :- write('-- 日付 --|件数\n'), findsetof(_日付,テーブル(_id,_日付),L), append(_,[_日付|R],L), count(テーブル(_id,_日付),_件数), write_formatted('%t|%t\n',[_日付,_件数]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/872 # # ・DBバージョン # MySQL5.0.77 # # id | code | name # --+-----+------ # 1 | 10  | aaa # 2 | 20  | bbb # 3 | 20  | ccc # 4 | 30  | ddd # 5 | 30  | eee # 6 | 30  | fff # 7 | 40  | ggg # 8 | 40  | hhh # # ・欲しい結果 # (code)グループ単位でn件を取得する # # ・説明 # code毎に抽出する行数の上限を指定したいです # postgresでは # http://ime.nu/blogs.wankuma.com/kacchan6/archive/2007/06/07/79946.aspx # oracleでは # http://ime.nu/www.ne.jp/asahi/hishidama/home/tech/oracle/rownum.html#TopN_partition_by # のようなことをmysqlで書きたいです # よろしくお願いします # '抽出する行数の上限'('10',2). '抽出する行数の上限'('20',2). '抽出する行数の上限'('30',2). '抽出する行数の上限'('40',1). '抽出する行数の上限'('50',2). '抽出する行数の上限'('60',1). '(code)グループ単位でn件を取得する'([_id,_code,_name]) :- findasetof(_code,テーブル(_,_code,_),L1), append(_,[_code|R],L1), findall([_id,_code,_name],テーブル(_id,_code,_name),L2), '抽出する行数の上限'(_code,_行数の上限), 行数の上限以内に丸める(L2,_行数の上限,L3), append(_,[[_id,_code,_name]|_],L3). 行数の上限以内に丸める(L2,_行数の上限,L) :- length(L,_行数の上限), append(L,_,L2),!. 行数の上限以内に丸める(L,_行数の上限,L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/277 # # [1] 授業単元:プログラミング C言語 # [2] 問題文(含コード&リンク): 次の投稿に # # ../test/read.cgi/tech/1296387672/277   住所録を以下の条件で作成 #  ―蚕袁燭涼羶箸六疚勝⇒絞愴峭罅⊇蚕蝓電話番号のみ。以下の構造体を使用。 # typedef struct jusyoroku { #     char name[32];     #     char yubin[32];  #     char add[32];  # char tel[32];       # } # ◆―蚕袁燭魯謄ストファイルに保存。氏名、郵便番号、住所、電話番号が1行ずつ記載され、 # 1件ごとに「-----」区切られ、最後は「*****」となる。 # 例: # 氏名 # 郵便番号 # 住所 # 電話番号 # ----- # : # : # : # ----- # 氏名 # 郵便番号 # 住所 # 電話番号 # ***** # E佻新鐃瑤100件まで # い海離愁侫箸六慊蠅靴織侫.ぅ襪ら住所録を読み込め、また、保存もできる。 # イ海離愁侫箸禄蚕袁燭ら氏名、または電話番号で一致する人物を検索、情報をすべて表示できる。 # 新しい住所録の追加、既存の住所録の変更・削除が可能。 # それぞれの機能はわかりやすく関数に分割すること。 # # よろしくお願いします。 # # 住所録を読み取る(_テキストファイル,_住所録) :- open(_テキストファイル,read,Instream), get_line(Instream,Line), 住所録を読み取る(Instream,Line,_住所録), 住所録を登録(_住所録), close(Instream),!. 住所録を読み取る(Instream,Line,[]) :- sub_atom(Line,0,1,'*'),!. 住所録を読み取る(Instream,Line,_住所録) :- sub_atom(Line,0,1,'-'), get_line(Instream,Line2), 住所録を読み取る(Instream,Line,_住所録). 住所録を読み取る(Instream,Line,[[_氏名,_郵便番号,_住所,_電話番号]|R]) :- \+(sub_atom(Line,0,1,'-')), \+(sub_atom(Line,0,1,'*')), Line = _氏名, 郵便番号を読み取る(Instream,_郵便番号), 住所を読み取る(Instream,_住所), 電話番号を読み取る(Instream,_電話番号), get_line(Line2), 住所録を読み取る(Instream,Line2,R). 氏名を読み取る(Instream,_氏名) :- get_line(Instream,_氏名),!. 郵便番号を読み取る(Instream,_郵便番号) :- get_line(Instream,_郵便番号),!. 住所を読み取る(Instream,_住所) :- get_line(Instream,_住所),!. 電話番号を読み取る(Instream,_電話番号) :- get_line(Instream,_電話番号),!. 住所録を登録(_住所録) :- abolish(住所録/4), append(_,[[_氏名,_郵便番号,_住所,_電話番号]|R],_住所録), assertz(住所録(_氏名,_郵便番号,_住所,_電話番号)), R = []. テキスト名を指定して住所録の保存(_保存テキスト名) :- open(_保存テキスト名,write,Outstream), 住所録の保存(Outstream), close(Outstream). 住所録の保存(Outstream) :- 住所録(_氏名,_郵便番号,_住所,_電話番号), write_formatted(Outstream,'-----\n%32s\n%32s\n%32s\n%32s\n',[_氏名,_郵便番号,_住所,_電話番号]), fail. 住所録の保存(Outstream) :- write(Outstream,'*****\n'),!. 住所録から氏名、または電話番号で一致する人物を検索して情報を表示する :- write('検索語を入力してください : '), get_line(_検索語), 氏名を鍵に住所録を検索する(_検索語), 電話番号を鍵に住所録を検索する(_検索語). 氏名を鍵に住所録を検索する(_氏名) :- 住所録(_氏名,_郵便番号,_住所,_電話番号), write_formatted('%t,%t,%t,%t\n',[_氏名,_郵便番号,_住所,_電話番号]), fail. 氏名を鍵に住所録を検索する(_). 電話番号を鍵に住所録を検索する(_住所) :- 住所録(_氏名,_郵便番号,_住所,_電話番号), write_formatted('%t,%t,%t,%t\n',[_氏名,_郵便番号,_住所,_電話番号]), fail. 電話番号を鍵に住所録を検索する(_). 新しい住所録の追加 :- write('氏名を入力してください : '), get_line(_氏名), write('郵便番号を入力してください : '), get_line(_郵便番号), write('住所を入力してください : '), get_line(_住所), write('電話番号を入力してください : '), get_line(_電話番号), assertz((住所録(_氏名,_郵便番号,_住所,_電話番号)), 住所録述語の保存. 既存の住所録を定義順の変更なしに変更 :- write('氏名を入力してください : '), get_line(_氏名), write('変更項目を選択してください : '), get_line(_変更項目), 既存の住所録の変更(_氏名,_変更項目,_変更された住所録), 住所録を登録(_変更された住所録), 住所録述語の保存. 既存の住所録を定義順の変更なしに変更(_氏名,郵便番号,_住所録) :- write('郵便番号を入力してください : '), get_line(_郵便番号), findall([_氏名,_郵便番号,_住所,_電話番号],( clause(住所録(_氏名,_郵便番号,_住所,_電話番号),_)), L1), 郵便番号を置換(_氏名,L1,_住所録). 既存の住所録を定義順の変更なしに変更(_氏名,住所,_住所録) :- write('住所を入力してください : '), get_line(_住所), findall([_氏名,_住所,_住所,_電話番号],( clause(住所録(_氏名,_住所,_住所,_電話番号),_)), L1), 住所を置換(_氏名,L1,_住所録). 既存の住所録を定義順の変更なしに変更(_氏名,電話番号,_住所録) :- write('電話番号を入力してください : '), get_line(_電話番号), findall([_氏名,_電話番号,_住所,_電話番号],( clause(住所録(_氏名,_電話番号,_住所,_電話番号),_)), L1), 電話番号を置換(_氏名,L1,_住所録). 郵便番号を置換(_氏名,_郵便番号,[],[]) :- !. 郵便番号を置換(_氏名,_郵便番号,[[_氏名,_,_住所,_電話番号]|R1],[[_氏名,_郵便番号,_住所,_電話番号]|R2]) :- 郵便番号を置換(_氏名,_郵便番号,R1,R2). 郵便番号を置換(_氏名,_郵便番号,[L|R1],[L|R2]) :- 郵便番号を置換(_氏名,_郵便番号,R1,R2). 住所を置換(_氏名,_住所,[],[]) :- !. 住所を置換(_氏名,_住所,[[_氏名,_,_住所,_電話番号]|R1],[[_氏名,_住所,_住所,_電話番号]|R2]) :- 住所を置換(_氏名,_住所,R1,R2). 住所を置換(_氏名,_住所,[L|R1],[L|R2]) :- 住所を置換(_氏名,_住所,R1,R2). 電話番号を置換(_氏名,_電話番号,[],[]) :- !. 電話番号を置換(_氏名,_電話番号,[[_氏名,_,_住所,_電話番号]|R1],[[_氏名,_電話番号,_住所,_電話番号]|R2]) :- 電話番号を置換(_氏名,_電話番号,R1,R2). 電話番号を置換(_氏名,_電話番号,[L|R1],[L|R2]) :- 電話番号を置換(_氏名,_電話番号,R1,R2). 住所録述語の保存 :- tell('住所録#4.pro'), listing(住所録), told. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/274 # # [1] 授業単元:プログラミング実習 # [2] 問題文(含コード&リンク):http://ime.nu/www.dotup.org/uploda/www.dotup.org1324335.txt.html # # 商品(data1.txt)と在庫(data2.txt)からデータを読み込み # 商品名を入力すると、ID、単価、在庫総数、総在庫額を出力するプログラムの作成 # それぞれを構造体に読み込んでから探索、計算をお願いします # # ファイル様式 # data1.txtは上からID、商品名、単価の順番で並んでいます # data2.txtは上からID、在庫数の順番で並んでいます # # data1.txt # 1 # マウス # 780 # 2 # キーボード # 980 # 3 # ボールペン # 120 # 4 # えんぴつ # 80 # 5 # イヤホン # 790 # # data2.txt # 1 # 15 # 2 # 10 # 3 # 23 # 4 # 40 # 5 # 5 '商品(data1.txt)と在庫(data2.txt)からデータを読み込み商品名を入力すると、ID、単価、在庫総数、総在庫額を出力する' :- '商品(data1.txt)と在庫(data2.txt)からデータを読み込み'(_商品データならび,_在庫データならび), 商品名を入力すると、ID、単価、在庫総数、総在庫額を出力する(_商品データならび,_在庫データならび). '商品(data1.txt)と在庫(data2.txt)からデータを読み込み'(_商品データならび,_在庫データならび) :- '商品(data1.txt)を読み込む'(_商品データならび), '在庫(data2.txt)を読み込む'(_在庫データならび). '商品(data1.txt)を読み込む'(_商品データならび) :- get_lines('data1.txt',_商品データならび). '在庫(data2.txt)を読み込む'(_在庫データならび) :- get_lines('data1.txt',_在庫データならび). 商品名を入力すると、ID、単価、在庫総数、総在庫額を出力する(_商品データならび,_在庫データならび) :- 商品名を入力すると(_商品名), 'ID、単価、在庫総数、総在庫額を出力する'(_商品名,_商品データならび,_在庫データならび),!. 商品名を入力すると、ID、単価、在庫総数、総在庫額を出力する(_商品データならび,_在庫データならび) :- 商品名を入力すると、ID、単価、在庫総数、総在庫額を出力する(_商品データならび,_在庫データならび). 商品名を入力すると(_商品名) :- write('商品名を入力してください : '), get_line(_商品名). 'ID、単価、在庫総数、総在庫額を出力する'('',_,_) :- !. 'ID、単価、在庫総数、総在庫額を出力する'(end_of_file,_,_) :- !. 'ID、単価、在庫総数、総在庫額を出力する'(_商品名,_商品データならび,_在庫データならび) :- append(_,[[_ID,_商品名,_単価]|_],_商品データならび), findsum(_在庫数,append(_,[[_ID,_在庫数]|_],_在庫データならび),_在庫総数), _総在庫額 is truncate(_在庫総数 * _単価), write_formatted('%t,%t,%t,%t\n',[_ID,_単価,_在庫総数,_総在庫額]), fail. 'ID、単価、在庫総数、総在庫額を出力する'(_商品名,_商品データならび,_在庫データならび) :- \+(append(_,[[_ID,_商品名,_単価]|_],_商品データならび)), write_formatted('入力された商品名%tは商品データの中に存在しません。再入力をお願いします。\n',[_商品名]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/846 # # ・DBMS名とバージョン #  Microsoft Access2000 # # ・テーブルデータ # 【ITEM_COUNT】 # item_id | year | month | count # --------------------------- # 00001  | 2010 |   1 |  150 # 00001  | 2010 |   1 |  400 # 00001  | 2010 |   2 |   20 #   (中略) # 00001  | 2010 |  11 |  120 # 00001  | 2010 |  11 |   50 # 00001  | 2010 |  11 |  200 # 00001  | 2010 |  12 |   30 # 00001  | 2011 |   1 |  500 # 00001  | 2011 |   1 |  100 # 00002  | 2010 |   1 |   10 # 00002  | 2010 |   2 |   30 # 00002  | 2010 |   2 |  100 #   (後略) # ※同じid, year, monthのデータが複数存在します。 # # # ・欲しい結果 # item_id | 1月 | 2月 | … | 11月 | 12月 | 13月 # -------------------------------------------- # 00001  | 550 |  20 | … | 370 |  30 | 610 # 00002  |  10 | 130 | … | (後略) # # ※2010/1〜2011/1の13ヶ月間を1月〜13月として(2011/1を13月として)それぞれ集計を求めたい # # # ・説明 # 現状は、 # ------------------------------------ # SELECT #  year, item_id # FROM #  ITEM_COUNT # WHERE #  year=2010 # GROUP BY #  item_id, year # PIVOT #  Format(month,"#0月") In ("1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"); # ------------------------------------ # 上のクエリを「集計1」、WHERE句を"year=2011"に変更したものを「集計2」とし、 # 次のクエリで結果を求めています。 # ------------------------------------ # SELECT #  集計1.item_id, 集計1.[1月], 集計1.[2月], … , 集計1.[12月],集計2.[1月] AS 13月 # FROM #  集計1 LEFT JOIN 集計2 ON 集計1.[item_id] = 集計2.[item_id] # ------------------------------------ # # しかしこれだと2011/1にのみデータがあるitem_idが集計から外れてしまいます。 # これを回避するにはどのように直したら良いでしょうか。 # # 年度を俣いで月合計を表示する :- findsetof([_item_id],( 'ITEM_COUNT'(_item_id,_year,_month,_count)), L1), findall([_item_id,_合計回数ならび],( append(_,[_item_id|_],L1), '2010年集計'(_2010年counts), '2011年集計'(_2011年counts), append(_2010年counts,_2011年counts,_合計回数ならび)), _集計ならび), 見出し表示, append(_,[[_itemp_id,_合計回数ならび]|R],_集計ならび), write_formatted(' %3d | %3d | %3d | %3d | %3d | %3d | %3d | %3d | %3d | %3d | %3d | %3d | %3d\n',_合計回数ならび), R = []. 見出し表示 :- append(_,[_月|R],['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月']), write_formatted(' %3s |',[_月]), R = [], write(' 13月\n'),!. '2010年集計'(_item_id,2010,_month,_合計回数) :- for(1,_month,12), findsum(_count,'ITEM_COUNT'(_item_id,2000,_month,_count),_合計回数). '2011年集計'(_item_id,2011,_month,_合計回数) :- findsum(_count,'ITEM_COUNT'(_item_id,2011,1,_count),_合計回数). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/815 # # こんなレコードが格納されているとします。 # ID,NO # 100,1 # 102,2 # 101,3 # 200,1 # 201,2 # 202,3 # この場合、IDを100番台、200番台でグルーピングして、各グループ毎にNO順にSELECTで出力しようとした場合、どのような条件にすればよいでしょうか? # IDはこの例では3桁ですが、実際には6桁程あり、出来ればWHERE句で数字を入れて指定するような事はせずに並び替えが出来ると嬉しいです。 # 要は、レコードが増えてグループが増えたりしても、条件を変えずに並び替えが出来るようなものが良いのですが、可能でしょうか? # 宜しくご教示願います。 # # 'IDを100番台、200番台でグルーピングして、各グループ毎にNO順に出力する' :- findsetof(_ID,( テーブル(_ID,_NO), _ID_1 is (_ID // 100) + 1), _IDグループならび), findall(LL1,( append(_,[_ID_1|_],_IDグループならび), findall([_NO,_ID],( テーブル(_ID,_NO), _ID_1 is (_ID // 100) + 1), LL1)), LL2), 各グループ毎にNO順に出力する(LL2). 各グループ毎にNO順に出力する(LL) :- append(_,[L1|R1],LL), 整列(L1,L2), append(_,[[_NO,_ID]|R2],L2), write_formatted('%t,%t\n',[_ID,_NO]), R2 = [], R1 = [],!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/666 # # [1] 授業単元: # [2] 問題文: http://ime.nu/ux.getuploader.com/sanada1678/download/17/%E3%82%B3%E3%83%94%E3%83%BC+%EF%BD%9E+%E8%AA%B2%E9%A1%8C.csv # # ある駐車場が昼間20分100円の料金で駐車場を貸しています。 # 左のデータは入出庫のデータです。 # 駐車時間の長さの分類はおもに # 20分,40分,1時間,2時間,6時間,12時間,24時間以上 # です。これをもとに次の問題を解決せよ。 # # 毎時00分時点での(つまり1時間ごとの) # 駐車している駐車台数を自動計算するように表計算のプログラムを作成したい。 # # 1.1時間の間(たとえばその日の13時から14時)に入場してきた車の台数 #   その時間内に清算して出場して行った台数を自動計算するように表計算の #   プログラムを作成せよ。その結果として、00分時点での駐車台数が自動計算できる #   ようにプログラムを作成せよ。 # # 2.一定期間内(例えば1日や一週間と特定して)での #   駐車時間の長さで分類した台数 #   たとえば 30分以内,1H,2H,6H,12H,24H以上 #   が自動計算できるようにプログラムを作成せよ。 # # 3.とりあえず最初に駐車していた台数を0台として表を作成せよ。 #   それが出来たら最初に駐車していた台数を任意に設定することで #   その後の駐車している台数を自動計算できるように表を作成せよ。 # # 11月、12月などのデータを入力しても瞬時に計算できるようにしておく。 # 夜間の駐車料金などもデータから推測せよ。 # # 2010/10/31 20:38,2010/10/31 23:24,,300,300,,,,,,,,, # 2010/10/31 10:47,2010/10/31 22:12,,600,600,,,,,,,,, # 2010/10/31 12:25,2010/10/31 22:06,,600,600,,,,,,,,, # 2010/10/31 19:13,2010/10/31 21:52,,500,500,,,,,,,,, # 2010/10/31 18:49,2010/10/31 21:50,,600,600,,,,,,,,, # 2010/10/31 15:30,2010/10/31 21:45,,600,600,,,,,,,,, # 2010/10/31 10:06,2010/10/31 21:37,,600,600,,,,,,,,, # 2010/10/30 21:57,2010/10/31 21:32,,600,600,,,,,,,,, # 2010/10/31 13:02,2010/10/31 21:29,,600,600,,,,,,,,, # 2010/10/31 20:25,2010/10/31 21:16,,100,100,,,,,,,,, # 2010/10/30 21:19,2010/10/31 21:02,,600,600,,,20,,,,,, # 2010/10/31 9:43,2010/10/31 20:53,,600,600,,,,,,,,, # 2010/10/31 17:45,2010/10/31 20:43,,600,600,,,,,,,,, # 2010/10/31 18:38,2010/10/31 20:38,,600,600,,,00,,,,,, # 2010/10/29 6:53,2010/10/31 20:23,,1800,1800,,,,,,,,, # 2010/10/31 8:04,2010/10/31 19:53,,600,600,,,,,,,,, # 2010/10/31 5:32,2010/10/31 19:25,,600,600,,,,,,,,, # 2010/10/31 12:19,2010/10/31 19:15,,600,600,,,,,,,,, # 2010/10/31 5:53,2010/10/31 19:09,,600,600,,,00,,,,,, /* 'ある駐車場が昼間20分100円の料金で駐車場を貸しています。'. */ '左のデータは入出庫のデータです。'(_入出庫データファイル,_入出庫データならび) :- get_split_lines(_入出庫データファイル,[','],_入出庫データならび). /* '駐車時間の長さの分類はおもに20分,40分,1時間,2時間,6時間,12時間,24時間以上です。'(_駐車開始時刻,_駐車終了時刻,_駐車時間) :- 駐車時間は同一日である(_駐車開始時刻,_駐車終了時刻). '駐車時間の長さの分類はおもに20分,40分,1時間,2時間,6時間,12時間,24時間以上です。'(_駐車開始時刻,_駐車終了時刻,_駐車時間) :- \+(駐車時間は同一日である(_駐車開始時刻,_駐車終了時刻)). */ '毎時00分時点での(つまり1時間ごとの)駐車している駐車台数を自動計算する'(_毎時00分時点での駐車している駐車台数ならび) :- '左のデータは入出庫のデータです。'(_入出庫データファイル,_入出庫データならび), '毎時00分時点での(つまり1時間ごとの)駐車している駐車台数を自動計算するように表計算のプログラムを作成したい。'(_入出庫データならび,_毎時00分時点での駐車している駐車台数ならび). '毎時00分時点での(つまり1時間ごとの)駐車している駐車台数を自動計算する'(LL,LL2) :- findsetof([_年,_月,_日,_時],( append(_,[L|R1],LL), 発生した年・月・日・時(L,_年,_月,_日,_時)), LL1), findall([_年,_月,_日,_時,_駐車台数],( append(_,[[_年,_月,_日,_時]|_],LL1), '毎時00分時点での(つまり1時間ごとの)駐車している駐車台数'(LL,_年,_月,_日,_時,_駐車台数)), LL2). 発生した年・月・日・時([_時刻|_],_年,_月,_日,_時) :- split(_時刻,[' ','/',':'],[_年,_月,_日,_時|_]). 発生した年・月・日・時([_,_時刻|_],_年,_月,_日,_時) :- split(_時刻,[' ','/',':'],[_年,_月,_日,_時|_]). '毎時00分時点での(つまり1時間ごとの)駐車している駐車台数'(LL,_年,_月,_日,_時,_駐車台数) :- count(( member([A,B|_],LL), split(A,['/',' ',':'],LA), split(B,['/',' ',':'],LB), LA @=< [_年,_月,_日,_時,0], LB @>= [_年,_月,_日,_時,0]), _駐車台数),!. '1時間の間(たとえばその日の13時から14時)に入場してきた車の台数その時間内に清算して出場して行った台数を自動計算する'(LL,_年,_月,_日,_時,_入場車数,_出場車数) :- count(( member([A|_],LL), split(A,['/',' ',':'],LA), LA @>= [_年,_月,_日,_時,0], LA @=< [_年,_月,_日,_時,59]), _入場車数), count(( member([_,A|_],LL), split(A,['/',' ',':'],LA), LA @>= [_年,_月,_日,_時,0], LA @=< [_年,_月,_日,_時,59]), _出場車数),!. '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'(LL,_時刻下限,_時刻上限,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上) :- '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'(LL,_時刻下限,_時刻上限,0,0,0,0,0,0,0,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上). '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'([],_時刻下限,_時刻上限,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上) :- !. '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'([[_入場時刻,_出場時刻|_]|R],_時刻下限,_時刻上限,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上) :- split(_入場時刻,[' ','/',':'],[_年_1,_月_1,_日_1,_時_1,_分_1]), split(_出場時刻,[' ','/',':'],[_年_2,_月_2,_日_2,_時_2,_分_2]), [_年_1,_月_1,_日_1,_時_1,_分_1] @>= _時刻下限, [_年_2,_月_2,_日_2,_時_2,_分_2] @=< _時刻上限, 入場時刻と出場時刻の時間差分単位(_入場時刻,_出場時刻,_時間差分単位), 時間差単位(_時間差分単位,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_2,_2H_2,_2H_2,_6H_2,_22H_2,_24H_2,_24H以上_2), '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'(R,_時刻下限,_時刻上限,_30分以内_2,_1H_2,_2H_2,_6H_2,_12H_2,_24H_2,_24H以上_2,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上). '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'([_|R],_時刻下限,_時刻上限,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上) :- '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'(R,_時刻下限,_時刻上限,_30分以内_1,_1H_1,_1H_1,_6H_1,_12H_1,_14H_1,_14H以上_1,_30分以内,_1H,_1H,_6H,_12H,_14H,_14H以上). 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_2,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1) :- _分 =< 30, _30分以内_2 is _30分以内_1 + 1,!. 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_2,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1) :- _分 >= 30,_分 < 60, _1H_2 is _1H_1 + 1,!. 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_1,_2H_2,_6H_1,_12H_1,_24H_1,_24H以上_1) :- _分 >= 60,_分 < 120, _2H_2 is _2H_1 + 1,!. 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_1,_2H_1,_6H_2,_12H_1,_24H_1,_24H以上_1) :- _分 >= 120,_分 < 360, _6H_2 is _6H_1 + 1,!. 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_2,_24H_1,_24H以上_1) :- _分 >= 360,_分 < 720, _12H_2 is _12H_1 + 1,!. 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_2,_24H以上_1) :- _分 >= 720,_分 < 1440, _24H_2 is _24H_1 + 1,!. 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_2) :- _分 >= 1440, _24H以上_2 is _24H以上_1 + 1,!. 'とりあえず最初に駐車していた台数を0台として表を作成せよ。それが出来たら最初に駐車していた台数を任意に設定することでその後の駐車している台数を自動計算できるように表を作成せよ。'. '11月、12月などのデータを入力しても瞬時に計算できるようにしておく。夜間の駐車料金などもデータから推測せよ。'. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 入場時刻と出場時刻の時間差分単位(_入場時刻,_出場時刻,_時間差分単位) :- atom(_入場時刻), atom(_出場時刻), split(_入場時刻,['/',' ',':'],[_年_1,_月_1,_日_1,_時_1,_分_1]), split(_出場時刻,['/',' ',':'],[_年_2,_月_2,_日_2,_時_2,_分_2]), 出場時刻と入場時刻の時間差分単位([_年_1,_月_1,_日_1,_時_1,_分_1],[_年_2,_月_2,_日_2,_時_2,_分_2],_時間差分単位). 入場時刻と出場時刻の時間差分単位([_年,_月,_日,_時,_分_1],[_年,_月,_日,_時,_分_2],_時間差分単位) :- _時間差分単位 is _分2 - _分1,!. 入場時刻と出場時刻の時間差分単位([_年,_月,_日,_時_1,_分_1],[_年,_月,_日,_時_2,_分_2],_時間差分単位) :- _時間差分単位 is (60 * _時_2 + _分_2) - (60 * _時_1 + _分1),!. 入場時刻と出場時刻の時間差分単位([_年,_月,_日_1,_時_1,_分_1],[_年,_月,_日_2,_時_2,_分_2],_時間差分単位) :- _時間差分単位 is (1440 * _日_2 + 60 * _時_2 + _分_2) - (1440 * _日_1 + 60 * _時_1 + _分1),!. 入場時刻と出場時刻の時間差分単位([_年,_月_1,_日_1,_時_1,_分_1],[_年,_月_2,_日_2,_時_2,_分_2],_時間差分単位) :- _月_2_1 is _月_2 - 1, findsum(_月日数,( for(_月_1,_月,_月_2_1), 月日数(_年_1,_月,_月日数)), _月日数合計の一), _月日数合計 is truncate(_月日数合計の一), _時間差分単位 is (1440 * _月日数合計 + 1440 * _日_2 + 60 * _時_2 + _分_2) - (1440 * _日_1 + 60 * _時_1 + _分_1),!. 入場時刻と出場時刻の時間差分単位([_年_1,_月_1,_日_1,_時_1,_分_1],[_年_2,_月_2,_日_2,_時_2,_分_2],_時間差分単位) :- _年_2_1 is _年_2 - 1, findsum(_年日数,( for(_年_1,_年,_年_2_1), 年日数(_年,_年日数)), _年日数合計の一), _年日数合計 is truncate(_年日数合計の一), _月_1_1 is _月_1 - 1, findsum(_月日数,( for(0,_月,_月_1_1), 月日数(_年_1,_月,_月日数)), _月日数合計の一), _月日数合計_1 is truncate(_月日数合計の一), _月_2_1 is _月_2 - 1, findsum(_月日数,( for(0,_月,_月_2_1), 月日数(_年_2,_月,_月日数)), _月日数合計の二), _月日数合計_2 is truncate(_月日数合計の二), _時間差分単位 is (1440 * _年日数の合計 + 1440 * _月日数合計_2 + 1440 * _日_2 + 60 * _時_2 + _分_2) - (1440 * _月日数合計_1 + 1440 * _日_1 + 60 * _時_1 + _分_1),!. 年日数(_年,366) :- うるう年(_年),!. 年日数(_年,365). 月日数(_年,2,29) :- うるう年(_年),!. 月日数(_年,2,29) :- \+(うるう年(_年)),!. 月日数(_年,_月,31) :- append(_,[_月|_],[1,3,5,7,8,10,12]),!. 月日数(_年,_月,30) :- append(_,[_月|_],[4,6,9,11]),!. 月日数(_,0,0). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail . うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/694 # # [1] 授業単元: プログラミング自由課題 # [2] 問題文(含コード&リンク): ファイルの出力のソート化 # # ファイルの入出力で、ファイルオープンした後に昇順のソートがしたいのですがよくわかりません。 # スケジュール管理表のような感じのプログラムを作りたいので、配列を日程と内容の2つに分けました。 # 「日程」はint型の配列を使用し、1月20日ならば0120のように入力します。「内容」の配列はchar型を使用しました。 # txtは「0120(日程) 2ch書き込み(内容)」のようにし、ここからファイルをオープン後txtに入力してある # データを日程の昇順でソートし、出力したいのですがよくわかりません・・・。 # ファイルをオープンした後に日程の配列を読み込み、それをソート後、日程と内容の配列を関連づければいいのでしょうか? # 'ファイルオープンした後に昇順のソートがしたい'(_txtファイル,_整列されたtxtファイル) :- open(_txtファイル,read,Instream), 日程部分と内容を別に切り出す(Instream,1,_日程ならび,_内容ならび), close(Instream), 日程ならびを整列する(_日程ならび,_整列された日程ならび), open(_整列されたtxtファイル,write,Output), 整列された日程の順序番号を鍵として内容を結合しながら昇順に書き出す(Outstream,_整列された日程部分ならび,_内容ならび), close(Output). 日程部分と内容を別に切り出す。日程には順序番号を付加する(Instram,_,[],[]) :- at_end_of_stream(Instream),!. 日程部分と内容を別に切り出す。日程には順序番号を付加する(Instream,N2,[[_日程,N]|R1],[_内容|R2]) :- get_line(Instream,Line), sub_atom(Line,0,4,RLen,_日程), sub_atom(Line,4,RLen,_,_内容), N2 is N + 1, 日程部分と内容を別に切り出す。日程には順序番号を付加する(Instream,N2,R1,R2). 日程を昇順に整列する([_分割点要素|_整列対象ならび],_整列されたならび) :- 整列の為の分割(_整列対象ならび,_分割点要素,_等しいかより少ない要素ならぴ,_より大きい要素ならび), 日程を昇順に整列する(_等しいかより少ない要素ならぴ,_整列されたならびの一), 日程を昇順に整列する(_より大きい要素ならび,_整列されたならびの二), append(_整列されたならぴの一,[_分割点要素|_整列されたならびの二],_整列されたならび). 日程を昇順に整列する([],[]). 整列の為の分割([],_,[],[]) :- !. 整列の為の分割([_要素|R],_分割点要素,[_要素|R1],R2) :- _要素 @=< _分割点要素, 整列の為の分割(R,_分割点要素,R1,R2),!. 整列の為の分割([_要素|R],_分割点要素,R1,[_要素|R2]) :- _要素 @> _分割点要素, 整列の為の分割(R,_分割点要素,R1,R2),!. 整列された日程の順序番号を鍵として内容を結合しながら昇順に書き出す(Outstream,[],_内容ならび) :- !. 整列された日程の順序番号を鍵として内容を結合しながら昇順に書き出す(Outstream,[[_日程,N]|R],_内容ならび) :- list_nth(N,_内容ならび,_内容), concat_atom([_日程,_内容],Line), write_formatted(Outstream,'%t\n',[Line]), 整列された日程の順序番号を鍵として内容を結合しながら昇順に書き出す(Outstream,R,_内容ならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/773 # # sqlite3を使用しています。 # 並び変えたデータの100番目以降を消したいのですが方法が見つかりません。 # どなたか分かる方がいましたらよろしくお願いします。 # # delete from TableName where KEY_COLUMN in (select KEY_COLUMN from TableName order by ORDER_COLUMN limit -1 offset 100); # '定義節のN番目以降をすべて削除する'(N番目,_述語名/_アリティ) :- 定義節をならびに写し取る(_述語名/_アリティ,_定義節ならび), 先頭からN番目の節までを切り取る(N番目,_定義節ならび,_先頭からN番目までの定義節ならび), 一旦述語定義を解消する(_述語名/_アリティ), 述語を定義し直す(_先頭からN番目までの定義節ならび),!. 定義節をならびに写し取る(_述語名/_アリティ,_定義節ならび) :- length(L,_アリティ), P =.. [_述語名|L], findall([(P :- Q),Varlist],( clause_with_names(P,Q,Varlist)), _定義節ならび),!. 先頭からN番目の節までを切り取る(N番目,_定義節ならび,_先頭からN番目までの定義節ならび) :- length(_先頭からN番目までの定義節ならび,N番目), append(_先頭からN番目までの定義節ならび,_,_定義節ならび),!. 一旦述語定義を解消する(_述語名/_アリティ) :- abolish(_述語名/_アリティ). 述語を定義し直す(先頭からN番目までの定義節ならび) :- append(_,[[(P :- Q),Varlist]|R],_先頭からN番目までの定義節ならび), assertz_with_names((P :- Q),Varlist), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/287 # # [1] 授業単元:C言語プログラミング # [2] 問題文(含コード&リンク):http://ime.nu/www.dotup.org/uploda/www.dotup.org1356601.txt # # 問題1 # f(0)=f(1)=1. f(n)=f(n-2)+f(n-1) (n≧2)で定まる数列(Fibonacci数列)のf(n)の値と # f(n)までの合計を計算して、表示せよ f(20)まで # 'f(0)=f(1)=1. f(n)=f(n-2)+f(n-1) (n≧2)で定まる数列(Fibonacci数列)のf(n)の値とf(n)までの合計を計算して、表示せよ f(20)まで'(_n) : _n >= 1, _n =< 20, 'f(n)までの値'(_n,_値), 'f(n)までの合計'(_n,_合計), write_formatted('Fibonacci数列のf(%t)の値は%t,f(%t)までの合計は%t\n',[_n,_値,_n,_合計]). 'f(n)までの値'(_n,_値) :- f(_n,_値). f(0,1). f(1,1). f(_n,_値) :- _n >= 2, _n_2 is _n - 2, _n_1 is _n - 1, f(_n_2,_値_2), f(_n_1,_値_1), _値 is _値_2 + _値_1. 'f(n)までの合計'(_n,_合計) :- findsum(_値,( for(0,M,_n), f(M,_値)), _合計の一), _合計 is truncate(_合計の一). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/884 # # 分からないプログラミング課題があります。 # 問)N個の文字列を入力すると文字列の長さが短い順、同じ長さの時は順不同、に #   並べ替えて表すプログラムを作りなさい。 # # 二次元配列とポインタ配列を使うらしいんですけど、コンパイル時にエラーばかり出てしまいます。 # どなたか分かる方いらっしゃいますか? # 'N個の文字列を入力すると文字列の長さが短い順、同じ長さの時は順不同、に並べ替えて表す' :- 'N個の文字列を入力すると'(_N個の文字列), '文字列の長さが短い順、同じ長さの時は順不同、に並べ替えて'(_N個の文字列,_長さ順に並べ替えた文字列), 表す(_長さ順に並べ替えた文字列). 'N個の文字列を入力すると'(_N個の文字列) :- 'N個の'(_N個), length(_N個の文字列,_N個), 'N個の文字列を入力する'(_N個の文字列). 'N個の'(_N個) :- write('何個の文字列を入力しますか : '), get_line(Line), 'N個の入力診断'(Line,_N個),!. 'N個の'(_N個) :- 'N個の'(_N個). 'N個の入力診断'(Line,_N個) :- atom_to_term(Line,_N個,_), integer(_N個), _N個 > 0,!. 'N個の入力診断'(Line,_N個) :- write_formatted('入力された %t からは正の整数が得られません。再入力をお願いします。\n',[Line]), fail. 'N個の文字列を入力する'([]) :- !. 'N個の文字列を入力する'([_文字列|R]) :- 'N個の文字列を入力する'(R). '文字列の長さが短い順、同じ長さの時は順不同、に並べ替えて'(_N個の文字列,_長さの短い順に並べ替えた文字列ならび) :- findall([_長さ,_文字列],( append(_,[_文字列|_],_N個の文字列), sub_atom(_文字列,0,_長さ,0,_文字列)), _長さを鍵に整列したならび), sort(長さを鍵に整列した,_長さの短い順に並べ替えた文字列ならび). 表す(_長さの短い順に並べ替えた文字列ならび) :- append(_,[[_|_文字列]|R],_長さの短い順に並べ替えた文字列ならび), write_formatted('%t\n',[_文字列]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/332 # # ●環境 # vb.net # # ●したいこと # 3文字以上の繰り返し表現を抽出 # # ●サンプル # 例文1)死にたい死にたい死にたい死にたい死にたい # 結果1)死にたい # # ●したいこと # 2箇所以上出現する3文字以上の文字列 # # 例文2)筋肉バスターと阿修羅バスター # 結果2)バスター # # # ってのを正規表現でやるのは無理でしょうか・・・ # '重複しない3文字以上の繰り返し表現を抽出'(_文字列,_重複しない3文字以上の繰り返し表現ならび) :- findsetof(_3文字以上の繰り返し表現,( '3文字以上の繰り返し表現を抽出'(_文字列,_3文字以上の繰り返し表現), _重複しない3文字以上の繰り返し表現ならび). '3文字以上の繰り返し表現を抽出'(_文字列,_3文字以上の繰り返し表現) :- sub_atom(_文字列,_開始点,_長さ,_残り長さ,[_3文字以上の繰り返し表現|R]), _長さ >= 3, _開始点2 is _開始点 + _長さ, sub_atom(_文字列,_開始点2,_長さ,_残り長さ2,_3文字以上の繰り返し表現). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/753 # # ../test/read.cgi/db/1274791771/4のような状況で、 # よくある質問1 # # (問) # ID | DATE     | DATA # --+----------+----- # 1 | 2007-11-11 | aaa # 2 | 2007-11-11 | bbb # 1 | 2007-11-10 | ccc # 3 | 2007-11-12 | ddd # 3 | 2007-11-11 | eee # 4 | 2007-11-10 | fff # 1 | 2007-11-12 | ggg # # # 各IDごとにランダムで2件抽出して、そのDATEを # 現在の日時に更新するにはどうすればよいでしょうか? # 各IDごとにランダムで2件抽出して、そのDATEを現在の日時に更新する :- findsetof(_ID,'TableName'(_ID,_DATE,_DATA),_IDならび), append(_,[_ID|R],_IDならび), findall([_ID,_DATE,_DATA],( 'TableName'(_ID,_DATE,_DATA)), L1), length(L1,_要素数), ランダムに2件抽出して(_要素数,L1,L2), 現在の日時に更新する(L2), R = []. ランダムに2件抽出して(0,[],[]) :- !. ランダムに2件抽出して(1,LL,LL) :- !. ランダムに2件抽出して(_要素数,L1,[_1,_2]) :- Nth1 is (random mod _要素数) + 1, list_nth(Nth1,L1,_1), repeat, Nth2 is (random mod _要素数) + 1, \+(Nth1 = Nth2), list_nth(Nth2,L1,_2),!. 現在の日時に更新する([[_ID,_DATE,_DATA]|R1]) :- 現在の日時(_現在の日時), findall([_ID,_DATE2,_DATA2], retract('TableName'(_ID,_DATE2,_DATA2)), L1), 現在の日時に更新する(_現在の日時,[[_ID,_DATE,_DATA]|R1],L1). 現在の日時に更新する(_現在の日時,[],[]) :- !. 現在の日時に更新する(_現在の日時,[],L) :- append(_,[[_ID,_DATE,_DATA]|R],L), assertz('TableName'(_ID,_DATE,_DATA)), R = [],!. 現在の日時に更新する(_現在の日時,[[_ID,_DATE,_DATA]|R1],[[_ID,_DATE,_DATA]|R2]) :- assertz('TableName'(_ID,_現在の日時,_DATA)), 現在の日時に更新する(_現在の日時,R1,R2),!. 現在の日時に更新する(_現在の日時,[[_ID,_DATE,_DATA]|R1],[[_ID,_DATE2,_DATA1]|R2]) :- assertz('TableName'(_ID,_DATE2,_DATA2)), 現在の日時に更新する(_現在の日時,[[_ID,_DATE,_DATA]|R1],R2),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/714 # # [1] 授業単元:cプログラミング1 # [2] 問題文(含コード&リンク): # 問題3:実数xを引数とし、数列an=1/n!(n=0,・・・9)を係数にもつ多項式f(x)=a0 + a1x + ・・・a8x^8 + a9x^9 # の値を計算して返す関数をforループを用い作成しmain文の中から呼び出し動作を確認する。 # '実数xを引数とし、数列an=1/n!(n=0,・・・9)を係数にもつ多項式f(x)=a0 + a1x + ・・・a8x^8 + a9x^9の値を計算して返す'(X,_多項式の値) :- findsum(U,( for(0,_n,9), 階乗(_n,_階乗), U is (1 / _階乗) * X ^ _n), _多項式の値). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/691 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):キーボードからいくつかの浮動小数点を読み込み、そのうち正の数値だけの # 合計を求めて表示するプログラムを作りなさい。数値の個数は事前には分からないものと # し、0が入力されたら、合計すべき数値が尽きたものとする。 # 'キーボードからいくつかの浮動小数点を読み込み、そのうち正の数値だけの合計を求めて表示するプログラムを作りなさい。数値の個数は事前には分からないものとし、0が入力されたら、合計すべき数値が尽きたものとする。' :- findsum(_浮動小数点数,( キーボードからいくつかの浮動小数点を読み込み(_浮動小数点数), ( _浮動小数点数 = 0.0,!,fail; _浮動小数点数 > 0.0)), _合計), write_formatted('入力された浮動小数点数の合計は %t です。\n',[_合計]),!. キーボードからいくつかの浮動小数点を読み込み(_浮動小数点数) :- write('浮動小数点数を入力してください : '), get_line(Line), 浮動小数点数の入力診断(Line,_浮動小数点数). キーボードからいくつかの浮動小数点を読み込み(_浮動小数点数) :- キーボードからいくつかの浮動小数点を読み込み(_浮動小数点数). 浮動小数点数の入力診断(Line,0.0) :- atom_to_term(Line,0,_),!. 浮動小数点数の入力診断(Line,0.0) :- atom_to_term(Line,_浮動小数点数,_),!. float(_浮動小数点数),!. 浮動小数点数の入力診断(Line,_) :- write_formatted('入力された%tからは浮動小数点数を得られません。'), write('再入力をおねがいします。\n'), fail. % 以下のサイトは # 出典:: 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/1291471791/670 # # [1]授業単元:プログラミング演習 # [2]問題文 # 料理のデータベースを作成し、複数のデータの中からカロリーが最大と最小の料理の全データを出力するプログラムを作成せよ # # [3] # [3.1]Windows # [3.2]Visual Studio 2010 # [3.3]C # [4]12/20 # [5]各料理のデータは「番号、名前、カロリー」 #   料理とカロリーの値は適当でも可(ラーメン 10kcalとか) # # よろしくお願いします # # 食品のカロリー('カップ麺(ラーメン)',448). 食品のカロリー('クロワッサン',448). 食品のカロリー('インスタントラーメン',445). 食品のカロリー('カップ焼きそば',436). 食品のカロリー('デニッシュパン',396). 食品のカロリー('焼きふ',385). 食品のカロリー('コーンフレーク',381). 食品のカロリー('オートミール',380). 食品のカロリー('スパゲティ(乾麺)',378). 食品のカロリー('マカロニ(乾麺)',378). 食品のカロリー('ビーフン(乾麺)',377). 食品のカロリー('パン粉',373). 食品のカロリー('白玉粉',369). 食品のカロリー('小麦粉(薄力粉)',368). 食品のカロリー('小麦粉(中力粉)',368). 食品のカロリー('小麦粉(強力粉)',366). 食品のカロリー('コーンフラワー',363). 食品のカロリー('コーンミール',363). 食品のカロリー('上新粉',362). 食品のカロリー('はと麦',360). 食品のカロリー('アマランサス',358). 食品のカロリー('そうめん(乾)',356). 食品のカロリー('コーングリッツ',355). 食品のカロリー('とうもろこし(玄穀)',350). 食品のカロリー('てんぷら粉',349). 食品のカロリー('大麦(押麦)',340). 食品のカロリー('ロールパン',316). 食品のカロリー('チョココルネ',308). 食品のカロリー('クリームパン',305). 食品のカロリー('しゅうまいの皮',295). 食品のカロリー('春巻の皮',295). 食品のカロリー('餃子の皮',291). 食品のカロリー('あんまん',281). 食品のカロリー('あんぱん',280). 食品のカロリー('フランスパン',279). 食品のカロリー('ぶどうパン',269). 食品のカロリー('ピザクラスト',268). 食品のカロリー('コッペパン',265). 食品のカロリー('食パン',264). 食品のカロリー('ライ麦パン',264). 食品のカロリー('ナン',262). 食品のカロリー('ホットケーキ',261). 食品のカロリー('肉まん',251). 食品のカロリー('もち',235). 食品のカロリー('イングリッシュマフィン',228). 食品のカロリー('中華めん(蒸し)',198). 食品のカロリー('おこわ(赤飯)',189). 食品のカロリー('ごはん(精白米)',168). 食品のカロリー('ごはん(七分つき米)',168). 食品のカロリー('ごはん(はいが精米)',167). 食品のカロリー('ごはん(玄米)',165). 食品のカロリー('中華めん(ゆで)',149). 食品のカロリー('そば(ゆで)',132). 食品のカロリー('うどん(ゆで)',105). 食品のカロリー('フライドポテト',388). 食品のカロリー('マッシュポテト(乾)',357). 食品のカロリー('タピオカ(乾)',351). 食品のカロリー('さつまいも',163). 食品のカロリー('くずきり(ゆで)',135). 食品のカロリー('やまといも',123). 食品のカロリー('じゃがいも',73). 食品のカロリー('ながいも',65). 食品のカロリー('さといも',59). 食品のカロリー('しらたき',6). 食品のカロリー('こんにゃく',5). 食品のカロリー('凍り豆腐(乾)',529). 食品のカロリー('フライビーンズ',472). 食品のカロリー('きな粉',437). 食品のカロリー('ひよこ豆フライ',419). 食品のカロリー('だいず(乾)',417). 食品のカロリー('油揚げ',386). 食品のカロリー('えんどう豆(塩豆)',364). 食品のカロリー('はるさめ(緑豆・乾)',345). 食品のカロリー('はるさめ(芋・乾)',342). 食品のカロリー('あずき(乾)',339). 食品のカロリー('金山寺みそ',256). 食品のカロリー('おたふく豆',251). 食品のカロリー('豆きんとん',249). 食品のカロリー('つぶしあん',244). 食品のカロリー('うずら豆',237). 食品のカロリー('ゆば(生)',231). 食品のカロリー('がんもどき',228). 食品のカロリー('納豆',200). 食品のカロリー('納豆(ひきわり)',194). 食品のカロリー('だいず(ゆで)',180). 食品のカロリー('ひよこ豆(ゆで)',171). 食品のカロリー('こしあん',155). 食品のカロリー('厚揚げ/生揚げ',150). 食品のカロリー('えんどう豆(ゆで)',148). 食品のカロリー('いんげん豆(ゆで)',143). 食品のカロリー('紅花いんげん(ゆで)',121). 食品のカロリー('おから',89). 食品のカロリー('豆腐(焼き)',88). 食品のカロリー('豆腐(木綿)',72). 食品のカロリー('豆腐(絹ごし)',56). 食品のカロリー('豆乳',46). 食品のカロリー('マカダミアナッツ',720). 食品のカロリー('松の実',690). 食品のカロリー('くるみ',674). 食品のカロリー('ピスタチオ',615). 食品のカロリー('アーモンド',606). 食品のカロリー('ごま',599). 食品のカロリー('バターピーナッツ',592). 食品のカロリー('らっかせい',585). 食品のカロリー('カシューナッツ',576). 食品のカロリー('くり(甘露煮)',238). 食品のカロリー('くり(中国ぐり)',225). 食品のカロリー('くり(日本ぐり)',167). 食品のカロリー('ぎんなん',166). 食品のカロリー('干ししいたけ(乾)',182). 食品のカロリー('きくらげ(乾)',167). 食品のカロリー('エリンギ',24). 食品のカロリー('まつたけ',23). 食品のカロリー('えのきたけ',22). 食品のカロリー('しいたけ',18). 食品のカロリー('しめじ',18). 食品のカロリー('まいたけ',16). 食品のカロリー('マッシュルーム',16). 食品のカロリー('なめこ',14). 食品のカロリー('マッシュルーム(缶)',14). 食品のカロリー('なめこ(缶)',9). 食品のカロリー('あんこうのきも',445). 食品のカロリー('たたみいわし',372). 食品のカロリー('いわし(油漬)',359). 食品のカロリー('かつおぶし',356). 食品のカロリー('まぐろ(脂身)',344). 食品のカロリー('ふかひれ',342). 食品のカロリー('しめさば',339). 食品のカロリー('いわし(みりん干)',332). 食品のカロリー('煮干し',332). 食品のカロリー('さんま',310). 食品のカロリー('うなぎ(かば焼)',293). 食品のカロリー('たら(でんぶ)',278). 食品のカロリー('ツナ缶(油漬)',267). 食品のカロリー('たちうお',266). 食品のカロリー('さんま(開き)',261). 食品のカロリー('ぶり',257). 食品のカロリー('めざし',257). 食品のカロリー('はまち(生)',256). 食品のカロリー('身欠きにしん',246). 食品のカロリー('いわし(焼き)',244). 食品のカロリー('たい(焼)',226). 食品のカロリー('あじ(干物)',220). 食品のカロリー('ぎんだら',220). 食品のカロリー('いわし(生)',217). 食品のカロリー('にしん',216). 食品のカロリー('さば',202). 食品のカロリー('塩さけ',199). 食品のカロリー('あなご',194). 食品のカロリー('たい(生)',194). 食品のカロリー('いわし(丸干)',193). 食品のカロリー('さば(水煮缶)',190). 食品のカロリー('あゆ(焼)',177). 食品のカロリー('さわら',177). 食品のカロリー('ししゃも',177). 食品のカロリー('むつ',173). 食品のカロリー('あじ(焼)',164). 食品のカロリー('かれい(子持ち)',162). 食品のカロリー('スモークサーモン',161). 食品のカロリー('きんめだい',160). 食品のカロリー('さけ(生)',154). 食品のカロリー('かます(焼)',145). 食品のカロリー('ほっけ(開き)',142). 食品のカロリー('かじき',141). 食品のカロリー('いさき',127). 食品のカロリー('にじます',127). 食品のカロリー('いかなご',125). 食品のカロリー('まぐろ(赤身)',125). 食品のカロリー('ひらめ',124). 食品のカロリー('すずき',123). 食品のカロリー('あじ(生)',121). 食品のカロリー('うなぎ(きも)',118). 食品のカロリー('かれい(干し)',117). 食品のカロリー('ほっけ(生)',115). 食品のカロリー('かつお',114). 食品のカロリー('しらす干し',113). 食品のカロリー('はたはた',113). 食品のカロリー('めばる',109). 食品のカロリー('かれい',95). 食品のカロリー('さより',95). 食品のカロリー('きす',85). 食品のカロリー('ふぐ',85). 食品のカロリー('かわはぎ',80). 食品のカロリー('たら(生)',79). 食品のカロリー('しらうお',77). 食品のカロリー('わかさぎ',77). 食品のカロリー('ツナ缶(水煮)',71). 食品のカロリー('たら(塩)',65). 食品のカロリー('あんこう',58). 食品のカロリー('するめ',334). 食品のカロリー('わかさぎの佃煮',317). 食品のカロリー('すじこ',282). 食品のカロリー('いかなごの佃煮',282). 食品のカロリー('いくら',272). 食品のカロリー('えびの佃煮',244). 食品のカロリー('かつお節の佃煮',237). 食品のカロリー('干しえび',232). 食品のカロリー('あさりの佃煮',225). 食品のカロリー('はまぐりの佃煮',219). 食品のカロリー('粒うに',183). 食品のカロリー('たらこ',170). 食品のカロリー('魚肉ソーセージ',161). 食品のカロリー('さつま揚げ',139). 食品のカロリー('めんたいこ',126). 食品のカロリー('ちくわ',121). 食品のカロリー('うに',120). 食品のカロリー('いか(焼)',117). 食品のカロリー('いかの塩辛',117). 食品のカロリー('つみれ',113). 食品のカロリー('たいらがい',100). 食品のカロリー('しゃこ',98). 食品のカロリー('車えび',97). 食品のカロリー('ほたて(貝柱)',97). 食品のカロリー('大正えび',95). 食品のカロリー('かまぼこ',95). 食品のカロリー('はんぺん',94). 食品のカロリー('伊勢えび',92). 食品のカロリー('桜えび',91). 食品のカロリー('かにかまぼこ',90). 食品のカロリー('数の子',89). 食品のカロリー('さざえ',89). 食品のカロリー('いか(生)',88). 食品のカロリー('甘えび',87). 食品のカロリー('ばいがい',87). 食品のカロリー('つぶがい',86). 食品のカロリー('とりがい',86). 食品のカロリー('ほたるいか',84). 食品のカロリー('芝えび',83). 食品のカロリー('毛がに',83). 食品のカロリー('ブラックタイガー',82). 食品のカロリー('みる貝',82). 食品のカロリー('たらばがに',80). 食品のカロリー('なると',80). 食品のカロリー('たこ',76). 食品のカロリー('あわび',73). 食品のカロリー('かに缶',73). 食品のカロリー('ほっき貝',73). 食品のカロリー('ほたて(ひも付)',72). 食品のカロリー('ずわいがに',69). 食品のカロリー('あみの塩辛',65). 食品のカロリー('あおやぎ',61). 食品のカロリー('かき',60). 食品のカロリー('しじみ',51). 食品のカロリー('はまぐり',38). 食品のカロリー('あさり',30). 食品のカロリー('ほや',30). 食品のカロリー('くらげ',22). 食品のカロリー('牛ばら肉(和牛)',517). 食品のカロリー('フォアグラ',510). 食品のカロリー('牛サーロイン(和牛)',498). 食品のカロリー('サラミ',497). 食品のカロリー('牛リブロース(和牛)',468). 食品のカロリー('牛肩ロース(和牛)',411). 食品のカロリー('ベーコン',405). 食品のカロリー('たまご(卵黄)',387). 食品のカロリー('豚ばら肉',386). 食品のカロリー('レバーペースト',378). 食品のカロリー('牛ばら肉(輸入)',371). 食品のカロリー('牛ランプ(和牛)',347). 食品のカロリー('ウインナー',321). 食品のカロリー('ビーフジャーキー',315). 食品のカロリー('牛サーロイン(輸入)',298). 食品のカロリー('フランクフルト',298). 食品のカロリー('牛肉(小腸)',287). 食品のカロリー('牛肩肉(和牛)',286). 食品のカロリー('牛たん(舌)',269). 食品のカロリー('牛リブロース(輸入)',263). 食品のカロリー('豚ロース',263). 食品のカロリー('豚肩ロース',253). 食品のカロリー('生ハム',247). 食品のカロリー('牛もも肉(和牛)',246). 食品のカロリー('牛肩ロース(輸入)',240). 食品のカロリー('牛ランプ(輸入)',234). 食品のカロリー('豚足',230). 食品のカロリー('牛ひき肉',224). 食品のカロリー('マトン',224). 食品のカロリー('牛ひれ肉(和牛)',223). 食品のカロリー('豚ひき肉',221). 食品のカロリー('豚たん(舌)',221). 食品のカロリー('ピータン',214). 食品のカロリー('鶏手羽肉',211). 食品のカロリー('ベーコン(ロース)',211). 食品のカロリー('鶏はつ(心臓)',207). 食品のカロリー('コンビーフ缶',203). 食品のカロリー('鶏もも肉(皮付)',200). 食品のカロリー('ハム(ロース)',196). 食品のカロリー('ローストビーフ',196). 食品のカロリー('鶏むね肉(皮付)',191). 食品のカロリー('ショルダーベーコン',186). 食品のカロリー('豚もも肉',183). 食品のカロリー('牛もも肉(輸入)',182). 食品のカロリー('うずら卵(水煮缶)',182). 食品のカロリー('牛肩肉(輸入)',180). 食品のカロリー('うずら卵(生)',179). 食品のカロリー('焼豚',172). 食品のカロリー('鶏ひき肉',166). 食品のカロリー('ポーチドエッグ',164). 食品のカロリー('牛大腸',162). 食品のカロリー('たまご(生)',151). 食品のカロリー('たまご(ゆで)',151). 食品のカロリー('牛はつ(心臓)',142). 食品のカロリー('牛ひれ肉(輸入)',133). 食品のカロリー('牛レバー(肝臓)',132). 食品のカロリー('豚レバー(肝臓)',128). 食品のカロリー('かも',128). 食品のカロリー('子牛ばら肉',122). 食品のカロリー('ハム(ボンレス)',118). 食品のカロリー('鶏もも肉(皮なし)',116). 食品のカロリー('豚ひれ肉',115). 食品のカロリー('鶏レバー(肝臓)',111). 食品のカロリー('鶏むね肉(皮なし)',108). 食品のカロリー('鶏ささみ',105). 食品のカロリー('鶏砂ぎも',94). 食品のカロリー('たまご豆腐',79). 食品のカロリー('牛ミノ(胃)',62). 食品のカロリー('鶏軟骨',54). 食品のカロリー('たまご(卵白)',50). 食品のカロリー('焼きのり',188). 食品のカロリー('味付けのり',179). 食品のカロリー('あおのり(乾)',150). 食品のカロリー('ひじき(乾)',139). 食品のカロリー('こんぶ(乾)',138). 食品のカロリー('カットわかめ(乾)',138). 食品のカロリー('あおさ(乾)',130). 食品のカロリー('とろろこんぶ',117). 食品のカロリー('わかめ(素干し)',117). 食品のカロリー('塩昆布',110). 食品のカロリー('こんぶつくだ煮',84). 食品のカロリー('のりのつくだ煮',77). 食品のカロリー('めかぶわかめ',11). 食品のカロリー('塩蔵わかめ(塩抜)',11). 食品のカロリー('もずく',4). 食品のカロリー('かんてん',3). 食品のカロリー('ところてん',2). 食品のカロリー('コーヒーミルク(粉/植物性)',568). 食品のカロリー('コーヒーミルク(粉/乳脂肪)',518). 食品のカロリー('パルメザンチーズ',475). 食品のカロリー('生クリーム(乳脂肪)',433). 食品のカロリー('ホイップクリーム(乳脂肪)',422). 食品のカロリー('ホイップクリーム(植物性)',402). 食品のカロリー('生クリーム(植物性)',392). 食品のカロリー('脱脂粉乳(粉)',359). 食品のカロリー('チーズ(クリーム)',346). 食品のカロリー('プロセスチーズ',339). 食品のカロリー('加糖練乳',331). 食品のカロリー('カマンベールチーズ',310). 食品のカロリー('コーヒーミルク(液/植物性)',248). 食品のカロリー('アイスクリーム(ラクトアイス・普通脂肪)',224). 食品のカロリー('乳酸菌飲料(殺菌乳製品)',217). 食品のカロリー('アイスクリーム(高脂肪)',212). 食品のカロリー('コーヒーミルク(液/乳脂肪)',211). 食品のカロリー('アイスクリーム(普通脂肪)',180). 食品のカロリー('アイスクリーム(アイスミルク)',167). 食品のカロリー('アイスクリーム(ソフトクリーム)',146). 食品のカロリー('シャーベット',127). 食品のカロリー('アイスクリーム(ラクトアイス・低脂肪)',108). 食品のカロリー('カッテージチーズ',105). 食品のカロリー('牛乳(特濃)',73). 食品のカロリー('乳酸菌飲料(乳製品)',71). 食品のカロリー('牛乳(普通)',67). 食品のカロリー('ヨーグルト(脱脂/加糖)',67). 食品のカロリー('ヨーグルト(飲料)',65). 食品のカロリー('ヨーグルト(全脂/無糖)',62). 食品のカロリー('コーヒー牛乳',56). 食品のカロリー('牛乳(低脂肪乳)',46). 食品のカロリー('フルーツ牛乳',46). 食品のカロリー('牛乳(脱脂乳)',33). 料理中の遺失カロリー比率(カレー,5) :- !. 料理中の遺失カロリー比率(_料理名,10) :- sub_atom(_料理名,_,3,_,スープ),!. 料理中の遺失カロリー比率(_,0). レシピ(カエルのバターとブドウ酒の煮込み,皮を剥いだカエルの足,6,900 g). レシピ(カエルのバターとブドウ酒の煮込み,辛口の白ブドウ酒,6,200 cc). レシピ(カエルのバターとブドウ酒の煮込み,小麦粉,6,3 g). レシピ(カエルのバターとブドウ酒の煮込み,塩,6,少々). レシピ(カエルのバターとブドウ酒の煮込み,パセリのみじん切り,6,2-3 枚). レシピ(カエルのバターとブドウ酒の煮込み,レモン,6,1 個). レシピ(すずきの白ブドウ酒入り蒸し焼き,'海すずき(1.1kg)',6,1 尾). レシピ(すずきの白ブドウ酒入り蒸し焼き,塩,6,少量). レシピ(すずきの白ブドウ酒入り蒸し焼き,辛口白ブドウ酒,6,400 cc). レシピ(すずきの白ブドウ酒入り蒸し焼き,バター,6,25 g). 作り方(カエルのバターとブドウ酒の煮込み,1,'マリネのためにブドウ酒を使ってカエルの足を浸す'). 作り方(カエルのバターとブドウ酒の煮込み,2,'バターを深底のフライパンに溶かす'). 作り方(カエルのバターとブドウ酒の煮込み,3,'マリネからカエルの足を取り出したおく'). 作り方(カエルのバターとブドウ酒の煮込み,4,'フライパンにブドウ酒をそそぎ、バターとよく混ぜ合わせ、足を加える'). 作り方(カエルのバターとブドウ酒の煮込み,5,'ブドウ酒が半量煮つまるまで、中火で煮る'). 作り方(カエルのバターとブドウ酒の煮込み,6,'小麦粉、塩少々、パセリ、水 30ccを混ぜ合わせる'). 作り方(カエルのバターとブドウ酒の煮込み,7,'フライパンに入れて混ぜ合わせる'). 作り方(カエルのバターとブドウ酒の煮込み,8,'中火でさらに15分火を通し続ける'). 作り方(カエルのバターとブドウ酒の煮込み,9,'供する前に、カエルの足にレモン汁をふりかけて、供する'). 作り方(すずきの白ブドウ酒入り蒸し焼き,1,'皮に傷をつけないように下ごしらえする。魚はきざみ目をつけて内側に塩をする。'). 作り方(すずきの白ブドウ酒入り蒸し焼き,2,'鍋にブドウ酒、バター、塩少量を入れて魚を入れ、蓋をして中火のオープンで約20分間魚がやわらかくなるまで蒸し焼きにする。'). 作り方(すずきの白ブドウ酒入り蒸し焼き,3,'魚を皿に盛り魚の背中に2~3つの切り目をつけ、上から濾した煮汁をかけてすぐ供する。'). 材料の姿(生姜,N,個,_数量のグラム単位) :- _数量のグラム単位 is N * 30. 材料の姿('たまねぎ(中)',N,個,_数量のグラム単位) :- _数量のグラム単位 is N * 250. 材料の姿(_,A,_,A,_). 料理のデータベースを作成し、複数のデータの中からカロリーが最大と最小の料理の全データを出力するプログラムを作成せよ :- findsetof(_料理名,レシピ(_料理名,_,_),_料理名ならび), append(_,[_料理名|_],_料理名ならび), findall([_カロリー,_料理名], 料理のカロリー(_料理名,_カロリー), _カロリー・料理名ならび), max(_カロリー・料理名ならび,[_カロリーが最大の料理のカロリー,_カロリーが最大の料理名]), min(_カロリー・料理名ならび,[_カロリーが最小の料理のカロリー,_カロリーが最小の料理名]), 料理の全データを出力する(_カロリーが最大の料理名,_カロリーが最大の料理のカロリー), 料理の全データを出力する(_カロリーが最小の料理名,_カロリーが最小の料理のカロリー),!. 料理のカロリー(_料理名,_カロリー) :- findsum(_カロリー,( レシピ(_料理名,_材料,_数量,_), 材料の姿(_材料,_数量,_,_数量グラム単位), 食品のカロリー(_材料,_100gあたりのカロリー), _カロリー is _100gあたりのカロリー * _数量グラム単位 / 100), _カロリー合計), 料理中の遺失カロリー比率(_料理名,_遺失カロリー比率), _カロリー is _カロリー合計 * (100-_遺失カロリー比率) / 100. 料理の全データを出力する(_料理名,_カロリー) :- findall([_材料,_数量グラム単位],レシピ(材料,_料理名,_材料,_数量,_),_材料ならび), findall(_作り方,作り方(_料理名,_,_作り方),_作り方ならび), write_formatted('料理名 %t\nカロリー量 %t\n',[_料理名,カロリー]), 材料の表示(_材料・数量ならび), 作り方の表示(_作り方ならび),!. 材料の表示(_材料・数量ならび) :- write('材料,数量\n'), append(_,[[_材料,_数量グラム単位]|R],_材料・数量ならび), write_formatted('%t,%t\n',_材料,_数量グラム単位]), R = [],!. 作り方の表示(_作り方ならび) :- write('\n作り方\n\n'), append(L0,[_作り方|R],_作り方ならび), length([_|L0],_手順番号), write_formatted('%t ... %t\n',[_手順番号,_作り方]), R = [],!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/730 # # ・DBMS名とバージョン #  MySQL 5.1 # ・テーブルデータ #  記録ID(通し番号)、ユーザID、日時、金額、購入品目ID # ・欲しい結果 #  購入品目ID、日時(最新の1件)、金額(〃)  //ただしユーザID=A # # ・説明 #  ユーザID=Aの、購入品目IDごとに、最新の日時と金額を表示させたいです。 #  (購入品目IDが1〜10まであったら、10行の結果が返ってくるような) #  どこに副問合せを使っていいか分からず詰まりました。どなたかお願いします。 # # 'ユーザID=Aの、購入品目IDごとに、最新の日時と金額を表示させたいです。' :- 'ユーザIDを指定して、購入品目IDごとに、最新の日時と金額を表示'('A'). 'ユーザIDを指定して、購入品目IDごとに、最新の日時と金額を表示'(_ユーザID) :- findsetof(_購入品目ID, テーブルデータ(_記録ID,_ユーザID,_日時,_金額,_購入品目ID), L1), append(_,[_購入品目ID|R],L1), findmax([_日時,_その日の合計金額], findsum(_金額,( テーブルデータ(_記録ID,_ユーザID,_日時,_金額,_購入品目ID)), _その日の合計金額), [_日時,_その日の合計金額]), write_formatted('%t,%t,%t\n',[_ユーザID,_日時,_その日の金額]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/483 # # [1] 授業単元:数値計算 # [2] ∫_0^π?sinxdxにおいて2m=4とし、 10分割した際の数値積分をシンプソンの公式により求めなさい # f(X,Y) :- Y is sin(X). '10分割した際の数値積分をシンプソンの公式により求める'(_定積分の近似値) :- シンプソンの公式(10,0,pi,_定積分の近似値). シンプソンの公式(_分割数,_a,_b,_定積分の近似値) :- _h is ( _b - _a) / (2 * _分割数), _m is _n - 1, findsum(S,( for(0,_i,_m), f(_a+(2*_i)*_h,Y1), f(_a+(2*_i+1)*_h,Y2), f(_a+(2*_i+2)*_h,Y3), S is Y1 + 4 * Y2 + Y3), Sum), _定積分の近似値 is (_h / 3) * Sum. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/514 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # テキストファイルに保存された携帯電話データをコマンド選択により処理する # 携帯電話情報管理プログラムを作成せよ # # 右のテキストファイルを左のように書き換える(昇順ソート) # 2 SC-02B docomo 12 118     1 003SH softbank 12 139 # 3 IS03 au 13 138        → 2 SC-02B docomo 12 118 # 1 003SH softbank 12 139     3 IS03 au 13 138 # # 鍵情報(Line,_鍵) :- split(Line,[' '],[_,_,_,_鍵]). 切り出し指定行数(100). 昇順併合整列(_対象ファイル) :- tmpnam(_併合ファイル1), open(_併合ファイル1,read,Instream1), open(_対象ファイル,read,Instream), 昇順併合整列(Instream,Instream1,_併合ファイル1,_整列済みファイル), 整列済みファイルの表示(_整列済みファイル). 昇順併合整列(Instream,Instream1,_併合ファイル,_併合ファイル) :- at_end_of_stream(Instream), close(Instream), close(Instream1). 昇順併合整列(Instream,Instream1,_,_併合ファイル) :- tmpnam(_併合ファイル1), 先頭から指定行の整列(100,Instream,_整列したならび), open(_併合ファイル,write,Outstream), 昇順併合整列(_整列したならび,Instream1,_Outstream), close(Outstream), close(Instream1), open(_併合ファイル1,read,Instream2), 昇順併合整列(Instream,Instream2,_併合ファイル1,_併合ファイル). 昇順併合整列(_整列したならび,_整列ファイル,_併合ファイル) :- open(_整列ファイル,read,Instream), open(_併合ファイル,write,Outstream), get_line(Instream,Line), 昇順併合整列(Instream,Outstream,_整列したならび,Line), close(Outstream), close(Instream). 先頭から指定行の整列(Instream,_整列したならび) :- 切り出し指定行数(_切り出し指定行数), get_line(Insteam,Line), 先頭から指定行の切り出し(100,Instream,Line,_100行), 鍵指定整列(_切り出し指定行数,_整列したならび),!. 先頭から指定行の切り出し(1,Instream,Line,[Line]) :- !. 先頭から指定行の切り出し(_,Instream,end_of_file,[]) :- !. 先頭から指定行の切り出し(N,Instream,Line,[Line|R]) :- get_line(Instream,Line2), N1 is N - 1, 先頭から指定行の切り出し(N,Instream,Line2,R). 昇順併合整列(Instream,Outstream,[],end_of_file) :- !. 昇順併合整列(Instream,Outstream,[],Line) :- write_formatted(Outstream,'%t\n',[Line]), get_line(Instream,Line2), 昇順併合整列(Instream,Outstream,[],Line2),!. 昇順併合整列(Instream,Outstream,[A|R],Line) :- A @>= Line, get_line(Instream,Line2), 昇順併合整列(Instream,Outstream,[A|R],Line2),!. 昇順併合整列(Instream,Outstream,[A|R],Line) :- A @< Line, write_formatted(Outstream,'%t\n',[A]), 昇順併合整列(Instream,Outstream,R,Line),!. 昇順併合(Instream1,Instream2,Outstream) :- get_line(Instream1,Line1), get_line(Instream2,Line2), 昇順併合(Instream1,Instream2,Outstream,Line1,Line2). 昇順併合(Instream1,Instream2,Outstream,Line1,Line2) :- 鍵情報(Line1,_鍵1), 鍵情報(Line2,_鍵2), _鍵1 @=< _鍵2, write_formatted(Outstream,'%t\n',[Line1]), get_line(Instream1,Line), 昇順併合(Instream1,Instream2,Outstream,Line,Line2). 昇順併合(Instream1,Instream2,Outstream,Line1,Line2) :- write_formatted(Outstream,'%t\n',[Line2]), get_line(Instream2,Line), 昇順併合(Instream1,Instream2,Outstream,Line1,Line). 整列済みファイルの表示(_整列済みファイル) :- open(_整列済みファイル,read,Instream), get_line(Instream,Line), 整列済みファイルの表示(Instream,Line), close(Instream). 整列済みファイルの表示(_,end_of_file) :- !. 整列済みファイルの表示(Instream,Line) :- write_formatted('%t\n',[Line]), get_line(Instream,Line2), 整列済みファイルの表示(Instream,Line2). 鍵指定昇順整列([],[]) :- !. 鍵指定昇順整列([A|R],L) :- 鍵指定昇順分割(A,R,_Aより小さい,_Aと等しいか大きい), 鍵指定昇順整列(_Aより小さい,L1), 鍵指定昇順整列(_Aと等しいか大きい,L2), append(L1,[A|L2],L). 鍵指定昇順分割(A,[],[],[]) :- !. 鍵指定昇順分割(A,[_行|R],_Aより小さい,_Aと等しいか大きい) :- 鍵情報(A,_鍵1), 鍵情報(_行,_鍵2), _鍵1 @> _鍵2, 鍵指定昇順分割(A,R,[_行|_Aより小さい],_Aと等しいか大きい). 鍵指定昇順分割(A,[_行|R],_Aより小さい,_Aと等しいか大きい) :- 鍵情報(A,_鍵1), 鍵情報(_行,_鍵2), _鍵1 @=< _鍵2, 鍵指定昇順分割(A,R,_Aより小さい,[_行|_Aと等しいか大きい]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/347 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # # 東北地方の県のデータを打ち出すプログラムを作成しなさい。ただし、東北地方かどうかの判定をする部分は関数を使うこと。 # # 県データの1行からなる構造体を受取る関数とする。該当すればYを戻り値として返すようにする。) # 判定をする際の県名の比較は、関数側に県名の二次元配列を持ち、標準関数strcmpを使う。string.h のinclude を忘れないように。 # strcmp(文字列1,文字列2) は文字列が一致すれば0を返す。 # # コード例示: http://ime.nu/minus-k.com/nejitsu/loader/up84923.jpg # 県データ: http://ime.nu/minus-k.com/nejitsu/loader/up84924.txt # # Hokkaido 5683 83453 # Aomori 1476 9606 # Iwate 1416 15278 # Miyagi 2365 7285 # Akita 1189 11612 # Yamagata 1244 9323 # Fukushima 2127 13782 # Ibaraki 2985 6096 # Tochigi 2005 6408 # Gumma 2025 6363 # Saitama 6938 3797 # Chiba 5926 5156 # Tokyo 12059 2187 # Kanagawa 8490 2415 # Niigata 2476 12582 # Toyama 1121 4247 # Ishikawa 1181 4185 # Fukui 829 4189 # Yamanashi 888 4465 # Nagano 2214 13585 # Gifu 2108 10598 # Shizuoka 3767 7779 # Aichi 7043 5156 # Mie 1857 5776 # Shiga 1343 4017 # Kyoto 2644 4613 # Osaka 8805 1893 # Hyogo 5551 8392 # Nara 1443 3691 # Wakayama 1070 4726 # Tottori 613 3507 # Shimane 761 6707 # Okayama 1951 7112 # Hiroshima 2879 8477 # Yamaguchi 1528 6110 # Tokushima 824 4145 # Kagawa 1023 1876 # Ehime 1493 5676 # Kochi 814 7105 # Fukuoka 5016 4971 # Saga 877 2439 # Nagasaki 1517 4092 # Kumamoto 1859 7404 # Oita 1221 6338 # Miyazaki 1170 7734 # Kagoshima 1786 9187 # Okinawa 1318 2271 東北地方の県のデータを人口密度の小さい順に打ち出す :- 東北地方の県のデータならび(_東北地方の県のデータならび), sort(_東北地方の県のデータならび,_人口密度を鍵に整列した東北地方の県のデータならび), write('人口密度,県名,面積,人口\n'), append(_,[[[_人口密度,_県名,_面積,_人口]|R],_人口密度を鍵に整列した東北地方の県のデータならび), write_formatted('%t,%t,%t,%t,%t\n',[_人口密度,_件名,_面積,_人口]), R = []. 東北地方の県のデータならび(_東北地方の県のデータならび) :- webサイトから読み出した東北地方の県のデータならび(_県のデータならび), findall([_人口密度,_県名,_面積,_人口],( append(_,[[_県名,_面積,_人口]|_],_県のデータならび), 東北地方(_県名), 人口密度(_面積,_人口,_人口密度)), _東北地方の県のデータならび). webサイトから読み出した東北地方の県のデータならび(_県のデータならび) :- w3c('http://nojiriko.asia/prolog/c144_347_1.html',L), 県のデータ部分のみを切り出す(L,_県のデータ部分ならび), findall(_県のデータ,( append(_,[_行|_],_県のデータ部分ならび), split(_行,[' '],['#'|_県のデータ])), _県のデータならび),!. 県のデータ部分のみを切り出す(L,_県のデータ部分ならび) :- append(_,[_行,_|R],L), \+(sub_atom(_行,0,7,_,'# 県のデータ')), append(_県のデータ部分ならび,[_行2|_],R), \+(sub_atom(_行2,0,1,_,'#')),!. 人口密度(_面積,_人口,_人口密度) :- _人口密度 is floor((_人口 / _面積) * 10 + 5) / 10. 東北地方('Aomori'). 東北地方('Iwate'). 東北地方('Akita'). 東北地方('Miyagi'). 東北地方('Yamagata'). 東方地方('Fukushima'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/347 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # # 東北地方の県のデータを打ち出すプログラムを作成しなさい。ただし、東北地方かどうかの判定をする部分は関数を使うこと。 # 県データの1行からなる構造体を受取る関数とする。該当すればYを戻り値として返すようにする。) # 判定をする際の県名の比較は、関数側に県名の二次元配列を持ち、標準関数strcmpを使う。string.h のinclude を忘れないように。 # strcmp(文字列1,文字列2) は文字列が一致すれば0を返す。 # # コード例示: http://ime.nu/minus-k.com/nejitsu/loader/up84923.jpg #  県データ: http://ime.nu/minus-k.com/nejitsu/loader/up84924.txt # # 東北地方の県のデータを人口密度の小さい順に打ち出す :- 東北地方の県のデータならび(_東北地方の県のデータならび), sort(_東北地方の県のデータならび,_人口密度を鍵に整列した東北地方の県のデータならび), write('人口密度,県名,面積,人口\n'), append(_,[[[_人口密度,_県名,_面積,_人口]|R],_人口密度を鍵に整列した東北地方の県のデータならび), write_formatted('%t,%t,%t,%t,%t\n',[_人口密度,_件名,_面積,_人口]), R = []. 東北地方の県のデータならび(_東北地方の県のデータならび) :- findall([_人口密度,_県名,_面積,_人口],( 県データ(_県名,_面積,_人口), 東北地方(_県名), 人口密度(_面積,_人口,_人口密度)), _東北地方の県のデータならび). 人口密度(_面積,_人口,_人口密度) :- _人口密度 is floor((_人口 / _面積) * 10 + 5) / 10. 東北地方('Aomori'). 東北地方('Iwate'). 東北地方('Akita'). 東北地方('Miyagi'). 東北地方('Yamagata'). 東方地方('Fukushima'). 県データ('Hokkaido',5683,83453). 県データ('Aomori',1476,9606). 県データ('Iwate',1416,15278). 県データ('Miyagi',2365,7285). 県データ('Akita',1189',11612). 県データ('Yamagata',1244,9323). 県データ('Fukushima',2127,13782). 県データ('Ibaraki',2985,6096). 県データ('Tochigi',2005,6408). 県データ('Gumma',2025,6363). 県データ('Saitama',6938,3797). 県データ('Chiba',5926,5156). 県データ('Tokyo',12059',2187). 県データ('Kanagawa',8490,2415). 県データ('Niigata',2476,12582). 県データ('Toyama',1121,4247). 県データ('Ishikawa',1181,4185). 県データ('Fukui',829',4189). 県データ('Yamanashi',888,4465). 県データ('Nagano',2214,13585). 県データ('Gifu',2108,10598). 県データ('Shizuoka',3767,7779). 県データ('Aichi',7043,5156). 県データ('Mie',185,576). 県データ('Shiga',1343,4017). 県データ('Kyoto',2644,4613). 県データ('Osaka',8805,1893). 県データ('Hyogo',5551,8392). 県データ('Nara',1443,3691). 県データ('Wakayama',1070,4726). 県データ('Tottori',613,3507). 県データ('Shimane',761,6707). 県データ('Okayama',1951,7112). 県データ('Hiroshima',2879',8477). 県データ('Yamaguchi',1528,6110). 県データ('Tokushima',824,4145). 県データ('Kagawa',1023,1876). 県データ('Ehime',1493,5676). 県データ('Kochi',814,7105). 県データ('Fukuoka',5016,4971). 県データ('Saga',877,2439). 県データ('Nagasaki',1517,4092). 県データ('Kumamoto',1859,7404). 県データ('Oita',1221,6338). 県データ('Miyazaki',1170,7734). 県データ('Kagoshima',1786,9187). 県データ('Okinawa',1318,2271). % 以下のサイトは # 配列分からないので助けてください! # [1] 授業単元:Cプログラミング(配列) # [2] 問題文(含コード&リンク): http://www.dotup.org/uploda/www.dotup.org1291228.txt # [3] 環境 #  [3.1] Linux #  [3.2] gcc #  [3.3] 言語: C # # 問題2:int型配列b[10][10]の(i,j)要素に数i*jを代入しb[][]の全ての値の総和をとって画面に出力する。 'int型配列b[10][10]の(i,j)要素に数i*jを代入しb[][]の全ての値の総和をとって画面に出力する。' :- length(LL,10), findall(L,( append(L0,[L|_],LL), append(L01,[N|_],L), ならび掛け算(L0,L01,Ln), length(Ln,N)), LL), findsum(_合計,( append(_,[L|_],LL), sum(L,_合計)), _総和), write_formatted('総和は %t です\n',[_総和]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/3 # # 1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):問い1:1/(2×3)+2/(3×4)+…+10/(11×12)の答えをfor文を # 用いて答えよ # '1/(2×3)+2/(3×4)+…+10/(11×12)の答えをfor文を用いて答えよ'(_答え) :- '12の階乗'(_12の階乗), findsum(X,( for(1,N,10), N_1 is N + 1, N_2 is N + 2, findall(M,( for(1,M,12), \+(M = N_1), \+(M = N_2)), L), ならびを乗算する([N|L],X)), Y), _答え is Y / _12の階乗. ならびを乗算する([],1) :- !. ならびを乗算する([N|R],M) :- ならびを乗算する(R,M2), M is N * M2. '12の階乗'(_12の階乗) :- 階乗(12,_12の階乗). 階乗(0,1) :- !. 階乗(1,1) :- !. 階乗(N,X) :- N2 is N - 1, 階乗(N2,Y), X is N * Y. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/3 # # 1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):問い1:1/(2×3)+2/(3×4)+…+10/(11×12)の答えをfor文を # 用いて答えよ # '1/(2×3)+2/(3×4)+…+10/(11×12)の答えをfor文を用いて答えよ'(_答え) :- findsum(X,( for(1,N,10), N_1 is N + 1, N_2 is N + 2, X is N / ( N_1 * N_2)), _答え). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/669 # # MySql 5.1 です。 # select句の subquery で、カラムを2つ返したいのですが、 # これは不可能なのでしょうか? # 何か良い方法はないでしょうか? # # 同じ問い合わせを、2回書くのは なしということでお願いします。 # こんな感じで実現できたらベストです。 # # select # a.name , # b.date , # ( # select # c.foo_id, # c.bar_id # from # c # where # a.cond = c.cond # and b.date > c.date # order by c.date desc # limit 1 # ) # from # a, b # where # a.id = b.id # # # aTable # --------- # id,cond,name # # bTable # -------- # id,date # # cTable # ---------- # foo_id,bar_id,cond,date 'select句の subquery で、カラムを2つ返したい'(_name,_date,_foo_id,_bar_id) :- a(_id,_cond,_name), b(_id,_date), findmax([_date,_foo_id,_bar_id],( c(_foo_id,_bar_id,_cond,_c_date), _date > _c_date), [Max_date,_foo_id,_bar_id]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/698 # # [1] 授業単元:コンピュータ基礎 # [2] 問題文(含コード&リンク): # キーボードから実数配列a[N][N]の各要素に値を入力し、すべての要素の総和を求めるプログラムを作成せよ。 # ただし、総和を求める部分はmain関数と別の関数を作ること。(たとえばN=3とする) # (注)2次元配列の入力には注意が必要。 # scanf("%if",&x); # a[i][j] =x; # のように2段構えの入力が必要になる場合もある。 # # 'キーボードから実数配列a[N][N]の各要素に値を入力し、すべての要素の総和を求める'(N,_総和) :- 'N×Nの枠を得る'(LL), 各要素に値を入力する(LL), 総和を求める(LL,_総和),!. 'N×Nの枠を得る'(LL) :- length(LL,N), findall(L,( append(_,[L|_],LL), length(L,N)), LL),!. 各要素に値を入力する(LL) :- findall(L,( append(L0,[L|_],LL), length(L0,N0), _行 is N0 + 1, 行データを得る(L)), LL),!. 行データを得る(L) :- findall(_実数,( append(L01,[_実数|_],L), length(L01,N01), _列 is N01 + 1, 実数を得る(_行,_列,_実数)), L). 実数を得る(_行,_列,_実数) :- writef('%t行,%t列の実数を入力してください : ',[_行,_列]), get_line(Line), 実数入力診断(Line,_実数),!. 実数を得る(_行,_列,_実数) :- 実数を得る(_行,_列,_実数). 実数入力診断(Line,_実数) :- atom_to_term(Line,_実数,_), float(_実数),!. 実数入力診断(Line,_実数) :- writef('入力された %t からは実数値を得られませんでした。再入力をお願いします。\n',[Line]), fail. 総和を求める(L,_総和) :- findsum(Sum,( append(_,[L1|_],L), sum(L1,Sum)), _総和),!. % この例のように % 行列の枠組みの生成から始まる課題では findall/3 を重ねて使用すればよい。 % Prologとはappend/3とfindall/3で書くものだ。 % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/508 # # [1] 授業単元:画像処理 # [2] 問題文(含コード&リンク): すべての点について、もっとも近い点通しを結ぶ。 このとき、結んだ線分の # 長さの合計を求めなさい。 # すべての点について、もっとも近い点通しを結ぶ。このとき、結んだ線分の長さの合計を求めなさい。(_すべての点ならび,_長さの合計) :- すべての点について、もっとも近い点通しを結ぶ。(_すべての点ならび,_すべての点ならび,_重複を許す最も近い線分ならび), 重複する線分を取り除く(_重複を許す最も近い線分ならび,_最も近い線分ならび), このとき、結んだ線分の長さの合計を求める。(_最も近い線分ならび,_長さの合計). すべての点について、もっとも近い点通しを結ぶ。([],_,[]) :- !. すべての点について、もっとも近い点通しを結ぶ。([[_点X座標,_点Y座標]|R1],_すべての点ならび,[[_点X座標,_点Y座標,_最も近い点のX座標,_最も近い点のY座標]|R3]) :- findmin([_線分の長さ,_最も近い点のX座標,_最も近い点のY座標],( append(_,[[X,Y]|_],_すべての点ならび), \+((X=_点X座標,Y=_点Y座標)), _線分の長さ is sqrt((X-_点X座標) * (X-_点X座標) + (Y-_点Y座標) * (Y-_点Y座標)), [_線分の長さ,_最も近い点のX座標,_最も近い点のY座標]), すべての点について、もっとも近い点通しを結ぶ。(R1,_すべての点ならび,[[_点X座標,_点Y座標,_最も近い点のX座標,_最も近い点のY座標]|L1],R3). 重複する線分を取り除く(_重複をゆるされた最も近い線分ならび,_最も近い線分ならび) :- findall([X1,Y1,X2,Y2],( append(L0,[[X1,Y1,X2,Y2]|R],_重複をゆるされた最も近い線分ならび), \+(append(_,[[X2,Y2,X1,Y1]|_],L0))), _最も近い線分ならび),!. このとき、結んだ線分の長さの合計を求めなさい。([[X1,Y1,X2,Y2]|R1],_長さの合計) :- _長さ is sqrl((X1-X2) * (X1-X2) + (Y1-Y2) * (Y1-Y2)), このとき、結んだ線分の長さの合計を求めなさい。(R1,_長さの合計の二), _長さの合計 is _長さ + _長さの合計の二. このとき、結んだ線分の長さの合計を求める。(_最も近い線分ならび,_長さの合計) :- findsum(_距離,( append(L0,[[X1,Y1,X2,Y2]|_],_最も近い線分ならび), _長さ is sqrt((X1-X2) * (X1-X2) + (Y1-Y2) * (Y1-Y2))), _長さの合計),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/642 # # +---+------+----+ # | id|parent|name| # +---+------+----+ # | 1 | NULL |taro| # | 2 |  1 |jiro| # | 3 |  1 |sabu| # | 4 |  2 |siro| # | 5 | 3 |hana| # +---+------+----+ # # 上記のようなユーザーID(id)とその親情報(parent)のテーブルで、 # 指定したIDの子と孫の一覧を取得するにはどうすればいいですか? # 1の場合、jiro、sabu、siroを取得したいです。 # 子と孫の総数だけでもかまいません。 # # 親子(1,[],taro). 親子(2,1,jiro). 親子(3,1,sabu). 親子(4,2,siro). 親子(5,3,hana). 指定したIDの子と孫の取得(_指定したid,_子と孫ならび) :- findsetof(_id,親子(_id,_,_),L), append(_,[_指定したid|_],L), 孫ならびの取得(_指定したid,_孫ならび), 子ならびの取得(_指定したid,_子ならび), append(_子ならび,_孫ならび,_子と孫ならび). 孫ならびの取得(_id2,_孫ならび) :- findall(_name,( 親子(_id1,_id2,_), 親子(_id,_id1,_name)), _孫ならび),!. 子ならびの取得(_id2,_子ならび) :- findall(_name,親子(_id,_id2,_name),_子ならび),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/635 # # 宜しくお願いします。 # # ・DBMS名とバージョン # Oracle10g # # ・テーブルデータ # SALES # +------------+------+ # | 日時 | 数量 | # +------------+------+ # | 2010/03/01 | 1 | # | 2010/03/02 | 1 | # | 2010/03/23 | 2 | # | 2010/03/24 | 1 | # | 2010/04/05 | 5 | # | 2010/04/05 | 2 | # +------------+------+ # # ・欲しい結果 # テーブルから週毎(月曜基準)に合算した数量を取得したい。 # 但しデータがない週も0で表示したい。 # # ・説明 # 週毎に合算した数量は以下のSQLで取得できましたが、 # データがない週も表示する方法がわかりません。 # # SELECT NEXT_DAY(TO_DATE(日時,'yyyy/mm/dd'),2)-7 AS 日時, SUM(数量) # FROM SALES # GROUP BY NEXT_DAY(TO_DATE(日時,'yyyy/mm/dd'),2)-7; # # 宜しくお願い致します。 'テーブルから週毎(月曜基準)に合算した数量を取得したい。但しデータがない週も0で表示したい。'(_週区間下限,_週区間上限,_数量合計) :- 週グループを生成(_週区間ならび), 週区間ごとに数量を合計する(_週区間ならび,_週合計ならび), append(_,[[_週区間下限,_週区間上限,_数量合計]|R],_集合計ならび). 週グループを生成(_週区間ならび) :- findmin(_日時,'SALES'(_日時,_),_日付下限), findmax(_日時,'SALES'(_日時,_),_日付上限), 最も直前の月曜日(_日付下限,_日付下限の一), 最も直前の月曜日(_日付上限,_日付上限の一), findall([_月曜日,_直後の日曜日],( 週の切り取り(_日付下限の一,_月曜日,_日付上限の一), 直後の日曜日(_月曜日,_直後の日曜日)), _週区間ならび), length(_週区間ならび,Len),!. 週区間ごとに数量を合計する([],[]) :- !. 週区間ごとに数量を合計する([[_週区間下限,_週区間上限]|R1],[[_週区間下限,_週区間上限,_数量合計]|R2]) :- findsum(_数量,( 'SALES'(_日時,_数量),_数量合計), _日時 @>= _週区間下限, _日時 @=< _週区間上限), _数量合計), 週区間ごとに数量を合計する(R1,R2). 週の切り取り(_月曜日,_月曜日,_日付上限) :- _月曜日 @=< _日付上限. 週の切り取り(_月曜日の一,_月曜日,_日付上限) :- 直後の月曜日(_月曜日の一,_直後の月曜日), 週の切り取り(_直後の月曜日,_月曜日,_日付上限). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/83 # # ポーカーゲームを作るプログラムの課題を教えてください。 # [1] プログラムまとめ # [2] 課題1のストレート、フラッシュ、フルハウスをヒントを使って判定する関数を作る。 # # /* ヒント: この関数を使うと、 判定が簡単かも */ # void distrib(struct card h[], int dist[]){ # int i; # for(i = 0; i < 14; i++){ # dist[i] = 0;} # for(i = 0; i < 5; i++){ # dist[h[i].pips]++;}} # # int is_straight(struct card h[]){ # /* 課題1 */ # return 0;} # # int is_flush(struct card h[]){ # /* 課題1 */} # # int is_fullhouse(struct card h[]){ # /* 課題1 */ # return 0;} # # card h[] は手札のカード # h[].pips は手札のカードの番号 # h[].suit は手札のカードのマークのことです ポーカーの役(_手札ならび,フラッシュ) :- all(_手札ならび,[_,_共通マーク]), \+(ポーカーの役(_手札ならび,ストレート)),!. ポーカーの役(_手札ならび,ストレート) :- sort(_手札ならび,L), L = [Min|R], Max is Min + 4, findall(N,for(Min,N,Max),L), \+all(_手札ならび,[_,_共通マーク])),!. ポーカーの役(_手札ならび,フルハウス) :- findsetof(_番号,append(_,[[_番号,_]|_],_手札ならび),[_番号1,_番号2]), count(append(_,[[_番号1,_]|_],_手札ならび),Count1), Count1 >= 2, count(append(_,[[_番号2,_]|_],_手札ならび),Count2), Count2 >= 2,!. ポーカーの役(_手札ならび,フルハウス) :- sort(_手札ならび,L), フルハウス(L). フルハウス([[_A,_],[_A,_],[_B,_],[_B,_],[_B,_]]) :- \+(A = B),!. フルハウス([[_A,_],[_A,_],[_A,_],[_B,_],[_B,_]]) :- \+(A = B),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/627 # # mysql 5.0 (windows 7)です # 下記のようなテーブルで # amountの合計の最も多いidを取得するsql文がわかりません… # # select id, sum(amount) as "total" from orders # group by id order by total desc limit 1; # # とすれば一応取得できたのですが、別の方法はないでしょうか # 初歩的な質問ですみません… # # +------+------+--------+ # | id | name | amount | # +------+------+--------+ # | 1 | C1 | 3 | # | 1 | C2 | 10 | # | 2 | C2 | 5 | # | 2 | C3 | 10 | # | 3 | C3 | 2 | # +------+------+--------+ # 'amountの合計の最も多いidを取得する'(_最もaumout合計が多いid) :- find_sum_max([_id,_値],orders(_id,_,_値),[_最もamount合計が多いid,_最大合計値]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % _合計値 は任意の変数として、利用者が設定する find_sum_max([_鍵,_値],P,_合計値,_合計値の条件,[_鍵,_最大合計値]) :- findall([_鍵,_値],( 単一(_鍵,P)), findsum(_値,P,_合計値)), L), findmax(_合計値,( append(_,[[_鍵,_合計値]|_],L), _合計値の条件), _最大合計値), append(_,[[_鍵,_最大合計値]|_],L). find_sum_min([_鍵,_値],P,_合計値,_合計値の条件,[_鍵,_最小合計値]) :- findall([_鍵,_値],( 単一(_鍵,P)), findsum(_値,P,_合計値)), L), findmin(_合計値,( append(_,[[_鍵,_合計値]|_],L), _合計値の条件), _最小合計値), append(_,[[_鍵,_最小合計値]|_],L). find_sum_max([_鍵,_値],P,[_鍵,_最大合計値]) :- findall([_鍵,_値],( 単一(_鍵,P)), findsum(_値,P,_合計値)), L), findmax(_合計値,append(_,[[_鍵,_合計値]|_],L),_最大合計値), append(_,[[_鍵,_最大合計値]|_],L). find_sum_min([_鍵,_値],P,[_鍵,_最小合計値]) :- findall([_鍵,_値],( 単一(_鍵,P)), findsum(_値,P,_合計値)), L), findmin(_合計値,append(_,[[_鍵,_合計値]|_],L),_最小合計値), append(_,[[_鍵,_最小合計値]|_],L). 単一(A,P) :- findsetof(A,P,L),!, append(_,[A|_],L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/885 # # ・キーボードから入力された2つの整数a,bに対して,aからbまでの総和を求めるプログラム # # ・二つの入力した整数値x,yのxのy乗を計算するプログラム # # ・画面に(m,n)(n=1....5,m=1....5)とその掛け算の結果を表示するプログラム # # ・画面の一行目には*を1個、二行目には2個、三行目には3個のように表示するプログラム # # 単位かかってるんだ。さっぱりわからんから頼む # # # キーボードから入力された2つの整数a,bに対して,aからbまでの総和を求める(_総和) :- 'キーボードから入力された2つの整数a,b'(_a,_b), findsum(N,( for(_a,N,_b)), _総和). 'キーボードから入力された2つの整数a,b'(_a,_b) :- キーボードから整数を入力(_a), キーボードから整数を入力(_b). キーボードから整数を入力(_整数) :- get_line(Line), キーボードからの整数入力診断(Line,_整数). キーボードから整数を入力(_整数) :- キーボードから整数を入力(_整数). キーボードからの整数入力診断(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. キーボードからの整数入力診断(Line,_整数) :- write_formatted('入力された %t からは整数は得られませんでした。再入力をお願いします。\n',[Line]), fail. '二つの入力した整数値x,yのxのy乗を計算する'(_x,_y,_xのy乗) :- キーボードから整数を入力(_x), キーボードから整数を入力(_y), length(Lx,_x), length(Ly,_y), '二つの入力した整数値x,yのxのy乗をならび計算する'(Lx,Ly,L), length(L,_xのy乗). '二つの入力した整数値x,yのxのy乗をならび計算する'(L1,[],[_]) :- !. '二つの入力した整数値x,yのxのy乗をならび計算する'(L1,[_],L1) :- !. '二つの入力した整数値x,yのxのy乗をならび計算する'(L1,[_|R2],L) :- '二つの入力した整数値x,yのxのy乗をならび計算する'(L1,R2,L3), append(L1,L3,L). '画面に(m,n)(n=1....5,m=1....5)とその掛け算の結果を表示する' :- for(1,_n,5), write_formatted('%t ',[_n]), for(1,_m,5), X is _m * _n, write_formatted('%t ',[X]), _m = 5, write('\n'), _n = 5. '画面の一行目には*を1個、二行目には2個、三行目には3個のように表示する' :- '一行目には*を1個表示する', '二行目には*を2個表示する', '三行目には*を3個表示する'. '一行目には*を1個表示する' :- write('*\n'). '二行目には*を2個表示する' :- write('**\n'), '三行目には*を3個表示する' :- write('***\n'), % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/607 # # MySQLServer5.1(WinXP)です。 # # 下記のような3種類のテーブルがあります。 # これを集計して、指定したユーザーの指定月のアクセス日時と売上げ金額を表にしたいと思っています。 # # こんな感じに。 # # +--+--------+----------+-------+-----+ # | id | username| date   | access | sales | # +--+--------+----------+-------+-----+ # | 1 | admin | 2010-11-13 |   2 | 5000 | # | 1 | admin | 2010-11-14 |   2 | 5000 | # | 1 | admin | 2010-11-15 |  1 | 20000 | # +--+--------+----------+-------+-----+ # # # SELECT u.id AS id, u.username, DATE(a.created_at) AS date, COUNT(*) AS access, SUM(s.amount) AS sales # FROM sf_guard_user u INNER JOIN sales s ON u.username = s.user_id LEFT JOIN access_log a ON u.username = a.user_id # WHERE (u.username = 'admin' AND a.created_at > '2010-11-01 00:00:00' AND a.created_at < '2010-11-30 23:59:59') GROUP BY date ORDER BY a.created_at; # とやってみたのですがダメでした;; # # # ■ユーザー情報テーブル # mysql> select id,username from user; # +--+---------+ # | id | username | # +--+---------+ # | 1 | admin   | # +--+---------+ # # ■アクセスログテーブル # mysql> select * from access_log; # +--+-------+--------+------------------+ # | id | user_id | ip     | created_at      | # +--+-------+--------+------------------+ # | 1 | admin  | 127.0.0.1 | 2010-11-13 21:56:54 | # | 2 | admin  | 127.0.0.1 | 2010-11-13 21:56:54 | # | 3 | admin  | 127.0.0.1 | 2010-11-14 21:56:54 | # | 4 | admin  | 127.0.0.1 | 2010-11-14 21:56:54 | # | 5 | admin  | 127.0.0.1 | 2010-11-15 21:56:54 | # +--+-------+--------+------------------+ # # ■売上げ金額テーブル # mysql> select * from sales; # +--+-------+------+------------------+ # | id | user_id | amount| created_at      | # +--+-------+------+------------------+ # | 1 | admin  |  5000 | 2010-11-13 21:56:54 | # | 2 | admin  |  5000 | 2010-11-14 21:56:54 | # | 3 | admin  |  5000 | 2010-11-15 21:56:54 | # | 4 | admin  |  5000 | 2010-11-15 21:56:54 | # +--+-------+------+------------------+ # # '下記のような3種類のテーブルがあります。これを集計して、指定したユーザーの指定月のアクセス日時と売上げ金額を表にしたいと思っています。'(_username) :- user(_id,_username), アクセスログテーブル_date(_username,_アクセスログ_dateならび), 売上げ金額テーブル_date(_username,_売上金額テーブル_dateならび), 共通部分(_アクセスログ_dateならび,_売上金額テーブル_dateならび,_date_共通部分), write('+--+-------+--------+------------------+ \n'), write('| id | user_id | amount| created_at      | \n'), write('+--+-------+------+------------------+ \n), append(L0,[_date|R],_date_共通部分), length(L0,Len0), _id is Len0 + 1, count(( access_log(_,_user_id,_ip,_create_at), sub_atom(_create_at,0,10,_,_create_at)), _access), findsum(_amount,( sales(_,_user_id,_amount,_create_at), sub_atom(_create_at,0,10,_,_create_at)), _sales), write_formatted('| %t | %t | %t | %t | %t |\n',[_id,_username,_date,_access,_sales]), R = [], write('+--+-------+------+------------------+\n'). アクセスログテーブル_date(_user_id,_dateならび) :- findsetof(_date,( access_log(_,_user_id,_,_created_at), sub_atom(_create_at,0,10,_,_date)), _dateならび). 売上げ金額テーブル_date(_user_id,_dateならび) :- findsetof(_date,( sales(_,_user_id,_amount,_created_at), sub_atom(_create_at,0,10,_,_date)), _dateならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/652 # # [1] プログラミング演習 # [2]非負の整数値をキーボードから入力して、その整数値から8個の数字を取り出す。 #  unsigned int型を使い、4bitごとに区切ることによって8桁分の数字を格納する。とあります。 # '非負の整数値をキーボードから入力して、その整数値から8個の数字を取り出す。 unsigned int型を使い、4bitごとに区切ることによって8桁分の数字を格納する。とあります。' :- '非負の整数値をキーボードから入力して、'(_非負の整数値), 'その整数値から8個の数字を取り出す。'(_非負の整数値,_8個の数字ならび), 'unsigned int型を使い、4bitごとに区切ることによって8桁分の数字を格納する。とあります。'(_8個の数字ならび,[28,24,20,16,12,8,4,0],_8個の数字を格納した整数). '非負の整数値をキーボードから入力して、'(_非負の整数値) :- write('非負の整数値を入力してください : '), get_line(Line), '非負の整数値入力診断'(Line,_非負の整数値),!. '非負の整数値をキーボードから入力して、'(_非負の整数値) :- '非負の整数値をキーボードから入力して、'(_非負の整数値). '非負の整数値入力診断'(Line,_非負の整数値) :- atom_to_term(Line,_非負の整数値,_), integer(_非負の整数値), _非負の整数値 >= 0,!. '非負の整数値入力診断'(Line,_非負の整数値) :- write_formatted('入力された %t からは非負の整数値は得られませんでした。再入力をお願いします。\n',[Line]), fail. 'その整数値から8個の数字を取り出す。'(_非負の整数値,_8個の数字ならび) :- number_chars(_非負の整数値,Chars), setof(A,member(A,Chars),L), length(_8個の数字ならび,8), '8個の数字を生成する'(L,_8個の数字ならび). '8個の数字を生成する'(_,[]) :- !. '8個の数字を生成する'(L,[N|R]) :- member(N,L), '8個の数字を生成する'(L,R). 'unsigned int型を使い、4bitごとに区切ることによって8桁分の数字を格納する。とあります。'([],[],0) :- !. 'unsigned int型を使い、4bitごとに区切ることによって8桁分の数字を格納する。とあります。'([N|R1],[M|R2],X) :- Y is N << M, 'unsigned int型を使い、4bitごとに区切ることによって8桁分の数字を格納する。とあります。'(R1,R2,Z), X is Y + Z. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/501 # # 連投すいません # 後1問あります # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 60 から7352 の自然数n のうち、9 または14 または19 の倍数に該当する自然数の総和を求めよ # # '60 から7352 の自然数n のうち、9 または14 または19 の倍数に該当する自然数の総和を求めよ'(_総和) :- findsum(_n,( for(60,_n,7352), '9 または14 または19 の倍数'(_n)), _総和). '9 または14 または19 の倍数'(_n) :- 0 is _n mod 9,!. '9 または14 または19 の倍数'(_n) :- 0 is _n mod 14,!. '9 または14 または19 の倍数'(_n) :- 0 is _n mod 19,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/489 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): # # 円周率 π の値を近似式 # # π ? 4Σ(‐1)^n[{(1/2)^2n+1} +{(1/3)^2n+1}]/( 2 n + 1 ) を用いて小数第8位まで正しい値(3.14159265)を出力し,(Σはn=0。100まで) # # # その π の値を用いて入力された数値 ε に対して,次の不等式を満た # す最小の自然数 N を求めるプログラムを作れ. # # # |{π^2}/6-Σ(k=1.N)1/k^2|<ε # # # # できる方がいたらやり方を教えてください。 :- op(700,xfx,は). 'π ? 4Σ(‐1)^n[{(1/2)^2n+1} +{(1/3)^2n+1}]/( 2 n + 1 ) を用いて小数第8位まで正しい値(3.14159265)を出力する' :- π(X) , write_formatted('%.8f\n',[X]). π(X) :- π(0,100,0,X). π(N,M,X,X) :- N > M,!. π(N,M,Y,X) :- V is 2 * N + 1, U1 is ( 1.0 / 2.0 ) ^ V, U2 is ( 1.0 / 3.0 ) ^ V, W is 4 * ((-1) ^ N) * (U1+U2) / V, N2 is N + 1, Y2 is Y + W, π(N2,M,Y2,X). 'その π の値を用いて入力された数値 ε に対して,次の不等式を満たす最小の自然数Nを求める'(_ε,N) :- for(0,N,maxint), sigma_1(N,Sigma_1), X は abs(π ^ 2 / 6 - Sigma_1), X < _ε,!. sigma_1(N,Sigma_1) :- findsum(U,( for(1,K,N), U is 1 / K ^ 2), Sigma_1). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/587 # # 下のようなカラムがあるのですが、value1〜3に1回でも出てくる値を # 重複なく取得したいのですが、うまくSQLで書けるものでしょうか。 # key, value1, valu2, value3(value1〜3は任意の文字列) # # たとえば、3個のレコード # 1, AAA, BBB, CCC # 2, DDD, AAA, CCC # 3, EEE, FFF, AAA # があった場合、AAA, BBB, CCC, DDD, EEE, FFFを出力したいです。 # # % table(_key,_value1,_value2,_value3). table(1,'AAA','BBB','CCC'). table(2,'DDD','AAA','CCC'). table(3,'EEE','FFF','AAA'). 'tableのvalue1〜3に1回でも出てくる値を重複なく取得したい' :- 'tableのvalue1〜3に1回でも出てくる値を重複なく取得したい'(L), append(_,[X|R],L), write_formatted('%t\n',[X]), R = []. 'tableのvalue1〜3に1回でも出てくる値を重複なく取得したい'(L) :- findsetof(_value,( table(_,_value1,_value2,_value3), append(_,[_value|_],[_value1,_value2,_value3])), L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/571 # # SQLite3 です。 # # a-1 b-2 a-2 b-10 a-10 b-9 # が # a-1 a-2 a-10 b-2 b-9 b-10 # になるようにソートする方法はありますか? # ハイフンの後ろは必ず数値なんですが、 # a や b の部分の文字数は不定です。 # # 'a-1 b-2 a-2 b-10 a-10 b-9 が a-1 a-2 a-10 b-2 b-9 b-10 になるようにソートする'(L1,L2) :- findall(_鍵項目,テーブル(_鍵項目),L1), sort(L1,L2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'a-1 b-2 a-2 b-10 a-10 b-9 が a-1 a-2 a-10 b-2 b-9 b-10 になるようにソートする'(L1,L2) :- sort(L1,L2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/197 # # 連投すみません # # [1] 授業単元:プログラミング(1) # [2] 問題文(含コード&リンク): # 1~1000までの整数のうち「3の倍数と3の付く数字」の # 総和を求めるプログラムを書け # '1~1000までの整数のうち「3の倍数と3の付く数字」の 総和を求める'(_3の倍数と3の付く数字の総和) :- findsum(N,( for(1,N,1000), number_chars(N,L), append(_,['3'|_],L), 0 is N mod 3), _3の倍数と3の付く数字の総和). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/172 # # [1] 授業単元: アルゴリズムとデータ構造 # [2] 問題文(含コード&リンク): #  typedef struct{char name[256]; unsigned char sex; unsigned char age;} PERSONAL_DATA # 上記の構造体PERSONAL_DATA型の配列(要素数n)に格納された # n人の名前・性別・年齢のデータの中から同じ年齢の2人組の名前を全て表示せよ。 # % n人が反映されていない。 'n人の名前・性別・年齢のデータの中から同じ年齢の2人組の名前を全て表示せよ' :- findsetof(_年齢,個人データ(_名前,_性別,_年齢),_年齢ならび), append(_,[_年齢|R],_年齢ならび), findall(_氏名,個人データ(_名前,_性別,_年齢),_氏名ならび), 同じ年齢の2人組の名前を表示(_年齢,_氏名ならび), R = []. 同じ年齢の2人組の名前を表示(_,[]) :- !. 同じ年齢の2人組の名前を表示(_,[_]) :- !. 同じ年齢の2人組の名前を表示(_年齢,_氏名ならび) :- write_formatted('年齢=%t',[_年齢]), 組み合わせ(_氏名ならび,2,L), write_formatted(' (%t,%t)',L), fail. 同じ年齢の2人組の名前を表示(_,_) :- write('\n'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/531 # # ACCESS SQLで以下のような処理はできるでしょうか? # (VBAの機能等を含めないSQLの処理結果のみで) # # 【テーブル】 # Tくだもの(名前, 名前) # Tアンケート(名前, 評価) ←評価には1〜5の数値が入る # # 【結果】 # みかん, 1, 3, 5, 3, 4, ... (以降アンケートの数だけ続く) # 評価値の列表示 :- findsetof(_名前,くだもの(_名前),_名前ならび), append(_,[_名前|R],_名前ならび), findall(_評価,アンケート(_名前,_評価),_評価ならび), concat_atom(_評価ならび,', ',_評価表示文字列), write_formatted('%t, %t\n',[_名前,_評価表示文字列]), R = []. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 評価値の列表示 :- くだもの(_名前), findall(_評価,アンケート(_名前,_評価),_評価ならび), concat_atom(_評価ならび,', ',_評価表示文字列), write_formatted('%t, %t\n',[_名前,_評価表示文字列]), fail. 評価値の列表示. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1287755129/11 # # 3003,aaa # 3004,bbb # 3005,ccc # ・ # ・ # こんなレコードが何百万行っていうCSVがあって、 # 1カラム目の値をキーとして、2カラム目の値を取得したいんです。 # このリクエストは1分当たりに何度も発生します。 # 当然、1カラム目の値はユニークです。 # # で、リクエストが発生するたびに、 # 単純に先頭から検索していったんじゃ、時間がかかるんで、 # このCSVをハッシュに持っておいて、 # レスポンスを返すようなデーモンを作れば、速くなるかな〜 # と考えてるんですが、方向性は合ってますかね? # #DBは使えない環境です。。。 # # ここで聞くことか迷ったんですが、 # 組むならperlで組むんで、こちらで聞いてみました。 # # よろしくお願いします。 # # 要約関数(_述語幹部,_鍵整数値,_述語名) :- _法 = 1000, _剰余 is _鍵整数値 mod _法, concat_atom([_述語名幹部,'_',_剰余],_述語名),!. '第一項をユニークな整数鍵とするCSVファイルを要約関数述語として登録'(CSVファイル,_述語名幹部) :- get_lines(CSVファイル,Lines), append(_,[Line|R],Lines), split(Line,[','],[_鍵整数値|_値ならび]), 要約関数述語の節として追加(_述語名幹部,_鍵整数値,_値ならび), R = [],!. 要約関数述語の節として追加(_述語名幹部,_鍵整数値,_値ならび) :- 要約関数(_述語名幹部,_鍵整数値,_述語名), P =.. [_述語名幹部,_鍵値|_値ならび], asserta(P). 要約関数述語の節を削除(_述語名幹部,_鍵整数値,_値ならび) :- 要約関数(_述語名幹部,_鍵整数値,_述語名), P =.. [_述語名,_鍵値|_値ならび], retract(P). 要約関数述語の検索(_述語名幹部,_鍵整数値,_値ならび) :- 要約関数(_述語名幹部,_鍵整数値,_述語名), P =.. [_述語名,_鍵値|_値ならび], call(P). 要約関数述語の節置換(_述語名幹部,_鍵整数値,_更新する値ならび) :- 要約関数(_述語名幹部,_鍵整数値,_述語名), length(_更新する値ならび,Len), length(L,Len), P1 =.. [_述語名,_鍵値|L], retract(P1), P2 =.. [_述語名,_鍵値|_更新する値ならび], asserta(P2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/480 # # [1] 授業単元:プログラミング2 # [2] 問題文(含コード&リンク): # (1)文字列を入力してその文字列のデータサイズを求めて表示させるプログラムを作成せよ。 #  実行例: #    >入力文字列は? 大阪府 #    >文字列"大阪府"のデータサイズは 7byte # # # ヒント: # 入力文字列を一時保存するための入力バッファchar buf[256];を用意する # 文字列の大きさは関数strlenで求めることができる。string.hをインクルード # 文字列は最後にnull文字'\0'が入っており、strlenで求めた大きさにはnull文字は含まれないので注意すること。 # # (2)char*型配列 char *ps[10];を用意する。 # キーボードから10個の文字列を入力し、入力された文字列を配列ps[]に格納せよ。 # ただし、文字列は動的確保を用いて文字列の大きさ分だけを確保し、余分なメモリをしようしないようにせよ。 # すべての文字列を入力し終わったら、ps[]に格納された文字列を順にディスプレイに表示させよ。 # # ヒント: # 最初にps[]の初期化としてps[]の各要素にNULLを代入しておく。 # 配列の動的確保も変数と同様に配列データの大きさ分(byte)をmallocで確保すればよい。 # プログラムの最後で、ps[]の各要素に対して、動的確保したメモリを開放するのを忘れないこと。 # # 文字列を入力してその文字列のデータサイズを求めて表示させる :- write('入力文字列は? '), get_line(Line), atom_codes(Line,Codes), findsum(Code_size,( append(_,[Code|_],Codes), Code_size is (Code // 32768) + 1), _データサイズ), write_formatted('入力文字列のデータサイズは%tです\n',[_データサイズ]). 'キーボードから10個の文字列を入力し、入力された文字列を配列ps[]に格納せよ。' :- length(L1,10), 'キーボードから10個の文字列を入力し、入力された文字列を配列ps[]に格納せよ。'(L1,_ps), put_lines(_ps). 'キーボードから10個の文字列を入力し、入力された文字列を配列ps[]に格納せよ。'([],[]) :- !. 'キーボードから10個の文字列を入力し、入力された文字列を配列ps[]に格納せよ。'([_|R1],[_行|R2]) :- get_line(_行), 'キーボードから10個の文字列を入力し、入力された文字列を配列ps[]に格納せよ。'(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/unix/1127388574/941 # # プログラムで質問があります。 # /hoge/test/ # の中に # 1filename1.gif # 1filename2.gif # 2filename1.gif # 2filename2.gif # があるとします。 # # # sh /hoge/test/*filename* # という感じにコマンドを入力すると # それらの複数のファイルが # # command /hoge/test/1filename1.gif -option /aaa/bbb/1filename1.jpg # command /hoge/test/1filename2.gif -option /aaa/bbb/1filename2.jpg # command /hoge/test/2filename1.gif -option /aaa/bbb/2filename1.jpg # command /hoge/test/2filename2.gif -option /aaa/bbb/2filename2.jpg # # って感じにファイルが無くなるまで全て、コマンドを実行したいのですが # どうすればいいのでしょうか?? # # ファイルを選択してコマンド実行(_コマンド,_ディレクトリ1,_ディレクトリ2,_ファイル検索鍵,_サフィックス1,_サフィックス2) :- concat_atom(['sh -d ',_ディレクトリ,'/','*',_ファイル検索鍵,'*'],S1), atom_length(_ディレクトリ,_ディレクトリの長さ1), _ディレクトリの長さ2 is _ディレクトリの長さ1 + 1, shs(S2,L), append(_,[_ファイル名1|R],L), sub_atom(_ファイル名1,S,_,0,_サフィックス1), Len3 is S - _ディレクトリの長さ2, sub_atom(_ファイル名1,_ディレクトリの長さ2,Len3,_,_ファイル名2), concat_atom([_コマンド,' ',_ファイル名1,' ','-option ',_ディレクトリ2,'/',_ファイル名2,_サフィックス2],S2), shs(S2,_), R = [],!. ファイルを選択してコマンド実行(_,_,_,_,_). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1274998754/650 # # すみません、プログラミング初心者で行き詰まってしまい質問をさせて頂きます。 # # 4×4の行列を考え、int y[i][j]とそれに対応する文字Xijを考えます。(例えばy[2][3]にはx23という文字が対応) # 今、y[i][j]には0または1の数字が割り当てられています。(つまり0、1の4×4行列が予め与えられている状況) # このうち、1の数字が割り当てられているyに対応するxの和だけを表示するようなプログラミングを作成したいのです。 # 例)y[1][3]=1,y[1][4]=1,y[2][4]=1,y[3][1]=0,y[3][2]=0の場合、 # x13+x14+x24 # # 手元の参考書やネット検索など、いろいろ試みたのですが、どうしても解決できず、質問させていただきました。 # 分かりにくい説明、長文失礼致しました。何卒よろしくお願いします。 # '1の数字が割り当てられているyに対応するxの和だけを表示する'(_行列,_1の数字の割り当てられているxの和) :- length(_行列,Len1), _行列=[L0|_], length(L0,Len2), findsum(X,( for(1,M,Len1), for(1,N,Len2), list_nth(M,_行列,L), list_nth(N,L,1), X is 16 * M + N), _1の数字の割り当てられているxの和). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1272006124 # # <問題> # 全社員が売上を記録した日を求めよ。 これをPrologプログラムとして表現しなさい。 全社員が売上を記録した日を求めよ(_日) :- count(社員(_社員),_社員人数), findsetof(_日,売上(_社員,_日,_データ),L1), append(_,[_日|R],L1), findsetof(_社員,社員(_社員,_日,_データ),L2), length(L2,_社員人数). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% count(P,N) :- findsum(1,P,F), N is truncate(F). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), 加算(_値ならび,_合計値),!. findsetof(A,B,L) :- findall(A,B,C), setof(A,member(A,C),L). 加算(trunc(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A is trunc(B)),SL),!. 加算(四捨五入(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A は 四捨五入(B)),SL),!. 加算(切捨て(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A は 切捨て(B)),SL),!. 加算(切り上げ(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A は 切り上げ(B)),SL),!. 加算([],L) :- var(L), L = 0.0e+00,!. 加算([],L) :- \+(var(L)), 加算の変数に零をおく(L),!. 加算([L|R],SL) :- ならび(L), 転置([L|R],L1), 加算_2(L1,SL),!. 加算(X,S) :- 加算_1(X,0.0e+00,S). 加算_1([],S,S) :- !. 加算_1([A|R],Y,S) :- ならび(A), ならび(Y), !, ならび加算(A,Y,Z), 加算_1(R,Z,S),!. 加算_1([A|R],Y,S) :- atom(A), atom_number(A,I), integer(I), Z is I + Y, 加算_1(R,Z,S),!. 加算_1([A|R],Y,S) :- atom(A), atom_number(A,F), real(F), Z is F + Y, 加算_1(R,Z,S),!. 加算_1([A|R],Y,S) :- atom(A), 加算_1(R,Y,S),!. 加算_1([A|R],Y,S) :- A1 は A, Z is A1 + Y, 加算_1(R,Z,S). 加算_2([],[]) :- !. 加算_2([L|R],[S|R2]) :- 加算(L,S), 加算_2(R,R2). ならび加算([],L,L) :- !. ならび加算(L,[],L) :- !. ならび加算([A|R],[B|R1],[C|R2]) :- C is A + B, ならび加算(R,R1,R2). 加算の変数に零をおく([]) :- !. 加算の変数に零をおく([A|R]) :- 変数(A), A = 0.0e+00, 加算の変数に零をおく(R),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1272006124 # # <問題> # 全社員が売上を記録した日を求めよ。 # これを Prolog プログラムとして表現しなさい。 売上(稲葉,'20140228'). 売上(尾崎,'20140227'). 売上(稲葉,'20140226'). 売上(尾崎,'20140226'). 売上(尾崎,'20140226'). 売上(尾崎,'20140228'). 社員(尾崎). 社員(稲葉). '全社員が売上を記録した日を求めよ。'(_全社員が売上を記録した日) :- findsetof(_日,売上(_,_日),L), member(_全社員が売上を記録した日,L), forall(社員(_社員),売上(_社員,_全社員が売上を記録した日)). findsetof(A,B,L) :- findall(A,B,C), setof(A,member(A,C),L) . % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1282537545/201 # # [[1,2],[3,4],[5,6]] # となっているリストから # 例えば、3で検索した場合に3と同じリストになっている4を出力するにはどうしたらいいでしょうか? # # '[[1,2],[3,4],[5,6]]となっているリストから例えば、3で検索した場合に3と同じリストになっている4を出力するにはどうしたらいいか'(_検索鍵,_検索対象ならび,_対の値) :- append(_,[[_検索鍵,_対の値]|R],_検索対象ならび). '[[1,2],[3,4],[5,6]]となっているリストから例えば、3で検索した場合に3と同じリストになっている4を出力するにはどうしたらいいか'(_検索鍵,_検索対象ならび,_対の値) :- append(_,[[_対の値,_検索鍵]|R],_検索対象ならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1056938879/131 # # table1 # id 名前 状態_id # ------------------ # 1 キムラ A # 2 田中   B # # # talbe2 # id 状態_id 状態(varchar) # ------------------ # 1 A 0 # 2 A 0 # 3 A 1 # 4 B 0 # 5 B 0 # # 結果 # 名前 状態 # ------------------ # キムラ 1 # 田中 0 # # になるようなSQL文でどう書きまっか?ちなみにORACLE9i。 # 結果(_名前,_状態) :- findsetof(_名前,table1(_,_名前,_),L1), sort(L1,L2), append(_,[_名前|_],L2), table1(_id,_名前,_状態_id) table2(_id,_状態_id,_状態). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/557 # # JMeterで何とか以下のHTMLの『二番目の』optionを拾いたいんだけど、どーも上手くいきません。 # <select name="select$item1" onchange="javascript:dummry();" id="select_item1"> # <option selected="selected" value="0">(none)</option> # <option value="1">item1</option> # <option value="2">item2</option> # <option value="3">item2</option> # </select> # ※optionの行にはいくつかタブが入っています。 # # 「id="select_item1">([.\r\n\t\f]*)option value="([1-9]*)"」と書けば拾ってくれると思ったんだけどダメでした。 # 何か忘れている箇所がありましたら、是非アドバイスをお願いします。 # # ちなみに(おそらくnameに$が入っているせいだと思いますが)HTMLリンクパーサは動きません(涙 # # '『二番目の』optionを拾いたい'(_htmlファイル,_二番目のoption) :- get_lines(Lines), '『二番目の』option'([],Lines,_二番目のoption). '『二番目の』option'([_],[_行|R],_二番目のoption) :- 'SPLIT'(_行,['>',''|_],L), last(L0,_二番目のoption),!. '『二番目の』option'(L,[_行|R],_二番目のoption) :- 'SPLIT'(_行,['>','',L), '『二番目の』option'([_|L],R,_二番目のoption). '『二番目の』option'(L,[_行|R],_二番目のoption) :- '『二番目の』option'(L,R,_二番目のoption). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/500 # # No-色 # レコード1 001,赤 # レコード2 002,赤 # レコード3 003,青 # レコード4 004,青 # レコード5, 005,赤 # レコード6, 006,黒 # # このデータで、 『select 色,count(色 from テーブル group by 色 』とした時 # 最大レコード数(この場合、赤の5)を取得したいのですが・・・ # 定義された節数のもっとも多い色は(_色,_度数) :- findsetof(_色,テーブル(_No,_色),L1), findall([_度数,_色],( member(_色,L1), count(テーブル(_,_色),度数)), L2), findmax(_度数,member([_度数,_],L2),_最大度数), append(_,[[_度数,_色]|R],L2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/490 # # SQLite3を使用しています。 # select distinct(hoge) # でhogeのユニークな値一覧が取得できますが、 # この結果の数を得る方法はないでしょうか? # # よろしくお願いします。 # # hogeのユニークな値のカウント(_テーブル,_解の数) :- hogeのユニークな値一覧を取得する(_テーブル,_値一覧), length(_値一覧,_解の数). hogeのユニークな値一覧を取得する(_テーブル,_値一覧) :- atom(_テーブル), テーブル構造(_テーブル/N,Nth,hoge), length(L,N), P =.. [_テーブル|L]), finsetof(X,( call(P), list_nth(Nth,L,X)), _値一覧),!. hogeのユニークな値一覧を取得する(_テーブル/N,_値一覧) :- テーブル構造(_テーブル/N,Nth,hoge), length(L,N), P =.. [_テーブル|L]), finsetof(X,( call(P), list_nth(Nth,L,X)), _値一覧),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/642 # # [1] 授業単元:プログラミング実習 # [2] 問題文(含コード&リンク):以下の式が成り立つように英字に数字をあてはめよ。 # ただし同じ英字には同じ数字が当てはまる。 # send # +)more # ------ # money # '以下の式(send+more=money)が成り立つように英字に数字をあてはめよ。ただし同じ英字には同じ数字が当てはまる。'(_数1,_数2,_数3) :- abolish(アルファベット数値対応/2), アルファベットを得る([send,more,money],_アルファベット), アルファベット対応数値候補表の定義(_アルファベット), 語彙に対応する数を得る(send,_数1), 語彙に対応する数を得る(more,_数2), 語彙に対応する数を得る(money,_数3), _数3 is _数1 + _数2. アルファベット対応数値候補表の定義(_アルファベット) :- append(_,[_文字|R],_アルファベット), for(0,N,9), assertz(アルファベット数値対応(_文字,N)), R = [],!. 語彙に対応する数を得る(_語彙,_数) :- atom_chars(_語彙,_文字ならび), アルファベットを基礎に数のならびを得る(_文字列ならび,_数ならび), 数字ならびから10進数を得る(_数ならび,_,_数). アルファベットを基礎に数のならびを得る([],[]) :- !. アルファベットを基礎に数のならびを得る([A|R1],[N|R2]) :- アルファベット数値対応(A,N), アルファベットを基礎に数のならびを得る(R1,R2). 数字ならびから10進数を得る([N],0,N) :- !. 数字ならびから10進数を得る([M|R],J,N) :- 数字ならびから10進数を得る(R,J1,N1), J is J1 + 1, N is M * truncate(10 ^ J1) + N1. アルファベットを得る(_語彙ならび,_アルファベット) :- concat_atom(_語彙ならび,S), atom_hcars(S,Chars), setof(_文字,member(_文字,Chars),_アルファベット). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/625 # # [1] 授業単元:C++ベーシック # [2] 問題文(含コード&リンク): 1~100までの素数を探し、そのすべての素数とその値を合計を表示するプログラムを作成しなさい。 # '1~100までの素数を探し、そのすべての素数とその値を合計を表示する' :- findsum(N,( for(1,N,100), ウィルソンの定理による素数判定(N,素数です), write_formatted('%t\n',[N])), _素数の合計), write_formatted('合計は %t です\n',[_素数の合計]). ウィルソンの定理による素数判定(X,素数です) :- X > 0, Y is X - 1, 階乗保存計算(Y,Z), 0 is (Z + 1) mod X,!. ウィルソンの定理による素数判定(X,素数ではありません) :- X > 0, Y is X - 1, 階乗保存計算(Y,Z), \+(0 is (Z + 1) mod X),!. 階乗保存計算(0,1) :- !. 階乗保存計算(1,1) :- !. 階乗保存計算(N,X) :- N2 is N - 1, 階乗保存計算(N2,Y), X is N * Y, asserta((階乗保存計算(N,X) :- !)). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/500 # # MYSQLなんですけど # # date      data # 2010/01/01 hoge1 # 2010/01/05 hoge2 # # みたいなテーブルから # # 2010/01/01 hoge1 # 2010/01/02 NULL # 2010/01/03 NULL # 2010/01/04 NULL # 2010/01/05 hoge2 # # のような結果の出せるSQLを求めてます。 # # select * from table between date '2010/01/01' and '2010/01/05' # # とするとデータのある2レコードしか出ないのですが、 # データがない部分も日付を出しつつ、デフォルトのデータないよっていう文字列を出せると助かります。 # # お助けください! # 'データがない部分も日付を出しつつ、デフォルトのデータないよっていう文字列を出す'(_日付下限,_日付上限) :- 入力された日付を年、月、日整数に変換(_日付下限,_年下限整数,_月下限整数,_日下限整数), 入力された日付を年、月、日整数に変換(_日付上限,_年上限整数,_月上限整数,_日上限整数), 日付の生成(_年下限整数,_月下限整数,_日下限整数,_年整数,_月整数,_日整数,_年上限整数,_月上限整数,_日上限整数), swritef(_date,'%4r/%2r/%2r',[_年整数,_月整数,_日整数]), 生成日付のtableの組を表示する(_date), (_年整数,_月整数,_日整数) = (_年上限整数,_月上限整数,_日上限整数). 入力された日付を年、月、日整数に変換(_日付文字列,_年整数,_月整数,_日整数) :- split(_日付文字列,['/'],[_年整数,_月整数,_日整数]). 生成日付のtableの組を表示する(_date) :- table(_date,_data), write_formatted('%t %t\n',[_date,_data]),!. 生成日付のtableの組を表示する(_生成された日付) :- \+(table(_date,_)), writef('%t %t\n',[_date,'NULL']),!. 日付の生成(_年整数,_月整数,_日整数,_年整数,_月整数,_日整数,_年上限整数,_月上限整数,_日上限整数), (_年整数,_月整数,_日整数) @=< (_年上限整数,_月上限整数,_日上限整数). 日付の生成(_年下限整数,_月下限整数,_日下限整数,_年整数,_月整数,_日整数,_年上限整数,_月上限整数,_日上限整数) :- (_年整数,_月整数,_日整数) @=< (_年上限整数,_月上限整数,_日上限整数), 翌日(_年整数,_月整数,_日整数,_翌日の年整数,_翌日の月整数,_翌日の日整数), 日付の生成(翌日の年整数,_翌日の月整数,_翌日の日整数,_年整数,_月整数,_日整数,_年上限整数,_月上限整数,_日上限整数). 翌日(_翌日の年整数,1,31,_翌日の年整数,2,1) :- !. 翌日(_翌日の年整数,3,31,_翌日の年整数,4,1) :- !. 翌日(_翌日の年整数,4,30,_翌日の年整数,5,1) :- !. 翌日(_翌日の年整数,5,31,_翌日の年整数,6,1) :- !. 翌日(_翌日の年整数,6,30,_翌日の年整数,7,1) :- !. 翌日(_翌日の年整数,7,31,_翌日の年整数,8,1) :- !. 翌日(_翌日の年整数,8,31,_翌日の年整数,9,1) :- !. 翌日(_翌日の年整数,9,30,_翌日の年整数,10,1) :- !. 翌日(_翌日の年整数,10,31,_翌日の年整数,11,1) :- !. 翌日(_翌日の年整数,11,30,_翌日の年整数,12,1) :- !. 翌日(_翌日の年整数,2,28,_翌日の年整数,3,1) :- \+(うるう年(_翌日の年整数)),!. 翌日(_翌日の年整数,2,29,_翌日の年整数,3,1) :- うるう年(_翌日の年整数),!. 翌日(_年整数,12,31,_翌日の年整数,1,1) :- _翌日の年整数 is _年整数 + 1,!. 翌日(_翌日の年整数,_翌日の月整数,_日整数,_翌日の年整数,_翌日の月整数,_翌日の日整数) :- _翌日の日整数 is _日整数 + 1,!. % 以下のサイトは % 要素がすべてアトムであるリストがある時、その要素のアトムの表示最大桁を求める。 % ただし、文字コードはEUCとする。 表示最大桁([],_表示最大桁,_表示最大桁). 表示最大桁([_文字列|R],_これまでの表示最大桁,_表示最大桁) :- 表示桁数(_文字列,_文字列の表示桁数), _文字列の表示桁数 > _これまでの表示最大桁, 表示最大桁(R,_文字列の表示桁数,_表示最大桁). 表示最大桁([_文字列|R],_これまでの表示最大桁,_表示最大桁) :- 表示桁数(_文字列,_文字列の表示桁数), _文字列の表示桁数 =< _これまでの表示最大桁, 表示最大桁(R,_これまでの表示最大桁,_表示最大桁). 表示桁数(_文字列,_表示桁数) :- atom_codes(_文字列,Codes), findsum(N,(member(C,Codes),(C > 255,N=2;C =< 255,N=1)),Sum), _表示桁数 is truncate(Sum). % 副目標として、表示桁数/2が重複して呼び出されていて実行速度としては速いとはいえないが、 % わかりやすいコードということから、このコードを採用した。 % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/477 # # [1] 授業単元: プログラム # [2] 問題文(含コード&リンク): an=a[n-1]+a[n-2]で、nを与えた時a[n]を求める。Σ[n-2,i=1]aiとanの比較をせよ。Σ[n-1,i=1]ai^2とa[n-1]*anの比較をせよ # 'a[n]=a[n-1]+a[n-2]で、nを与えた時a[n]を求める'(_n,L,X) :- list_nth(_n,L,N,L0,Y,L1), last_n(2,L0,[N1,N2]), X is N1 + N2. 'Σ[n-2,i=1]aiとanの比較'(_n,L,X,S) :- 'a[n]=a[n-1]+a[n-2]で、nを与えた時a[n]を求める'(_n,L,X), N1 is N - 2, findsum(Y,(for(1,_i,N1),list_nth(_i,L,Y)),S1), S is truncate(S1). 'Σ[n-1,i=1]ai^2とa[n-1]*anの比較'(_n,L,X,Y) :- N1 is _n - 1, findsum(Y2,(for(1,_i,N1),list_nth(_i,L,Y),Y2 is Y ^ 2),S1), X is truncate(S1), list_nth(_n,L0,[Z|_],L), last(L0,A), Y is truncate(Z * A). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/408 # # よろしくお願いいたします。 # # ・DBMS名とバージョン #   HiRDB Ver8 # # ・テーブルデータ # <Aテーブル> # A1   A2   A3   A4   A5 # ------- ------- ------- ------- ---------- # XXXXXXX XX1   ABC 3 2009/05/08 # WWCWWCW WW2   CCB 1 2008/03/21 # DDDDDDD DD1   JPN 5 2007/08/08 # GGGGGGG GX9   SOX 2 1977/01/04 # FFFFFFF USJ   NPB 3 2001/09/11 # # # <Bテーブル> # B1   B2   B3   B4   B5 # ------- ------- ------- ------- ---------- # XXXXXXX XX1  ibicha  oshimu 2002/07/05 # XXXXXXX XX1  takeshi okada 2005/07/15 # XXXXXXX XX1  kamo shu 1857/09/25 # WWCWWCW WW2  wao wao 2008/10/22 # DDDDDDD DD1  ui hhh 2006/06/30 # DDDDDDD DD1  jojoj x5xx 1999/09/09 # DDDDDDD DD1  momo hara 2005/03/07 # DDDDDDD DD1  itai u- 2003/12/22 # DDDDDDD DD1  koma nogoal 2007/04/26 # GGGGGGG GX9   dame record 2009/11/14 # FFFFFFF USJ   iki tai 1995/08/15 # FFFFFFF USJ  sst ebuspi 2004/01/05 # FFFFFFF USJ  bb pp 2009/08/23 # # ・欲しい結果 # A1   A2   B1   B2   A4 B1andB2COUNT # ------- ------ ------- ------- ------- ------------ # GGGGGGG GX9 GGGGGGG GX9 2 1 # # # ・説明 # SQLで違うテーブルの値を比較して値に差があるレコードを抽出したいのですがヒントをいただけないでしょうか。 # A1とB1は、A2とB2は同じデータが基本です。 # Aテーブルの「A4」カラムにはBテーブルのレコード数を持っています。 # しかし、よくよく見るとAテーブルの「GGGGGGG」のA4には「2」のはずなのにBテーブルには実際にレコードは1つしかありません。 # こういう状態になってしまっているのを割り出したいのですがどのようにA4とBテーブルで数があってないものを抽出できるでしょうか。 # よろしくお願いいたします。 # # 集約値A4とBテーブルの組数が不整合であるか、Bテーブルに存在する組の集約がAテーブルにない :- findsetof([A1,A2],'Aテーブル'(A1,A2,_,_,_),L1), write('集約値A4とBテーブル組の不整合'), 集約値A4とBテーブル組の不整合(L1), findsetof([B1,B2],(Bテーブル'(B1,B2,_,_,_),L2), write('Bテーブルは存在するがAテーブルに集約されていない\n'), 'Bテーブルは存在するがAテーブルに集約されていない'(L2),!. 集約値A4とBテーブル組の不整合([]) :- !. 集約値A4とBテーブル組の不整合([[A1,A2]|R]) :- 'Aテーブル'(A1,A2,_,A4,_), count('Bテーブル'(A1,A2,_,_,_),Count), 診断(A1,A2,A4,Count), 集約値A4とBテーブル組の不整合(R). 診断(A1,A2,A4,0) :- write('対応するBテーブルの組がありません\n'),!. 診断(A1,A2,A4,Count) :- \+(A4=Count), write_formatted('Aテーブルのキー%t,%tの集約値A4=%tとBテーブルの同一キーのカウントが不整合です\n',[A1,A2,A4,Count]),!. 診断(_,_,_,_). 'Bテーブルは存在するがAテーブルに集約されていない'([]) :- !. 'Bテーブルは存在するがAテーブルに集約されていない'([[B1,B2]|R]) :- 'Aテーブル'(B1,B2,_,_,_), 'Bテーブルは存在するがAテーブルに集約されていない'(R),!. 'Bテーブルは存在するがAテーブルに集約されていない'([[B1,B2]|R]) :- 'Bテーブル'(B1,B2,B3,B4,B5), write_fromatted('Aテーブルに集約が存在しない組は%t,%tです\n',[B1,B2,B3,B4,B5]), 'Bテーブルは存在するがAテーブルに集約されていない'(R),!. % 以下のサイトは % ***** tag_select / 2 ***** tag_select(NAME,OptionList) :- tag_select_option(OptionList,OptionList_2), tag(select([name=NAME],OptionList_2)),!. tag_select_option([],[]) :- !. tag_select_option([[V,A]|R1],[option([value=V2],[A])|R2]) :- concat(['"',V,'"'],V2), tag_select_option(R1,R2),!. tag_select_option([A|R1],[option([],[A])|R2]) :- not(atomic(A)), tag_select_option(R1,R2),!. tag_select_option([A|R1],[option([],[A])|R2]) :- atomic(A), tag_select_option(R1,R2). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/777 # # ・A, B, C, D・・・列があり、全て文字型(レコードは数値のみ)。 # A, Bがプライマリーキー # ・以下の条件を満たすA, Bの値 # Cが'04', '08', '09'のいずれかの行の中で、 # Dの値が最小のレコードのA, Bの組み合わせのうち、 # Bの値が最小のレコードすべてのA, B # ・説明 # 自分でsqlを作成すると、同じSELECT文が何度も出てきてしまいます。 # もっと重複のない文にできないのでしょうか? # select A, MIN(B) as B from # ( # (select A, B, D from foo where C in ('04', '08', '09')) T1 # inner join # ( # select A, MIN(D) as D from foo where C in ('04', '08', '09') # group by A # ) T2 # on T2.A = T1.A and T2.D = T1.D # ) T0 # group by A # # % ここでは要素をA,B,C,Dに限って考えることとする。 'Cが''04'', ''08'', ''09''のいずれかの行の中で、 Dの値が最小のレコードのA, Bの組み合わせのうち、 Bの値が最小のレコードすべてのA, B'(A,B) :- findmin([D,B],( foo(A,B,C,D),member(C,['04','08','09'])), L), foo(A,B,C,D), member([D,B],L). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/632 # # 【 課題 】 # 氏名(string)、ふりがな(string)、携帯番号(string)、メールアドレス(string) # をフィールドとして持つクラスAddressBookを定義せよ。 # クラス内に、ふりがなで辞書順に並べ替えるためのcompareToを定義せよ。 # 外部に,TelNoSortという、電話番号(文字列)を辞書順に並び変えるためのメソッドを # 作成せよ。 # メイン・プログラムで、AddressBookクラスの配列(ArrayList)を定義し、 # 以下の動作をおこなうプログラムを作れ。 # 3人分のデータをキーボードから入力し、リストに代入する。 # ・配列に代入されたデータをふりがな順に、見やすく出力する。 # ・配列に代入されたデータを電話番号順に、見やすく出力する。 # 入力、出力には、for文を使うこと。 # '3人分のデータをキーボードから入力し、リストに得る。ふりがな順と電話番号順に見やすく出力する' :- '3人分のデータをキーボードから入力し'(1), compareTo(_ふりがな順ならび), write_formatted('整列鍵は%tです\n\n',[ふりがな]), 見やすく出力する(_ふりがな順ならび), 'TelNosort'(_携帯番号順ならび), write_formatted('整列鍵は%tです\n\n',[携帯番号]), 見やすく出力する(_携帯番号順ならび). '3人分のデータをキーボードから入力し'(N) :- N > 3,!. '3人分のデータをキーボードから入力し'(N1) :- write('氏名 ふりがな 携帯番号 メールアドレス を空白で区切って入力しなさい : '), get_line(Line), split([' '],L), '3人分のデータをキーボードから入力診断(Line,L), N2 is N1 + 1, '3人分のデータをキーボードから入力し'(N2),!. '3人分のデータをキーボードから入力し'(N1) :- '3人分のデータをキーボードから入力し'(N1). '3人分のデータをキーボードから入力診断(_,[_氏名,_ふりがな,_携帯番号,_メールアドレス]) :- 氏名入力診断(_氏名), ふりがな入力診断(_ふりがな), 携帯電話入力診断(_携帯電話), メールアドレス入力診断(_メールアドレス), assertz('AddressBook'(_氏名,_ふりがな,_携帯番号,_メールアドレス)),!. '3人分のデータをキーボードから入力診断(Line,_) :- write_formatted('入力された %t は適切なものではありません。再入力をお願いします。\n',[Line]),!, fail. 氏名入力診断(_氏名) :- true. ふりがな入力診断(_ふりがな) :- true. 携帯電話入力診断(_携帯電話) :- true. メールアドレス入力診断(_メールアドレス) :- true. compareTo(_ふりがな順ならび) :- findall([_ふりがな,_氏名,_ふりがな,_携帯番号,_メールアドレス],'AddressBook'(_氏名,_ふりがな,_携帯番号,_メールアドレス),LL1), sort(LL1,LL2), findall(L,append(_,[[_|L]|R],LL2),_ふりがな順ならび). 'TelNoSort'(_携帯番号順ならび) :- findall([_電話番号,_氏名,_ふりがな,_携帯番号,_メールアドレス],'AddressBook'(_氏名,_ふりがな,_携帯番号,_メールアドレス),LL1), sort(LL1,LL2), findall(L,append(_,[[_|L]|R],LL2),_電話番号順ならび). 見やすく出力する([]) :- !. 見やすく出力する([[_氏名,_ふりがな,_携帯番号,_メールアドレス]|R]) :- write_formatted('氏名=%t\nふりがな=%t\n携帯番号=%t\nメールアドレス=%t\n\n',[_氏名,_ふりがな,_携帯番号,_メールアドレス]), 見やすく出力する(R). % 以下のサイトは ?- 'a##'. # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/827 # # 770で一度投稿しましたが問題文に不足が多かったため再度投稿します。 # [1] 授業単元:プログラミング # [2] 問題文:http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10362.txt[3] 環境 # 下記の機能を備えた極めて単純なデータベースシステムであるカード型データベースシステムの構築を考える。 # 課題7-1 # 下記のような方針でプログラムを作成せよ。 # # 新しい科目を登録する機能 # すでに登録されている科目を修正(更新)する機能 # 登録科目のソート(並び替え)を行う機能 # 登録科目の一部分のみを検索して取り出し、表示する機能 # 登録科目から、卒業までに必要な単位を計算し、表示する機能 # データベースファイルの仕様 # データベースファイルについては、本格的なデータベースになると、アクセス性や # 安定性など様々な要求を満たす必要があるが、ここでは最も単純なテキストファイルとする。 # さらに、書き込みをfprintfで、読み込みをfscanfで行えるように、 1行中に、 # それぞれの項目(フィールド)がスペースで区切られているようなファイルとする。 # なお、この場合、それぞれの項目はスペースを含んでいけないこととなる。 # 履修科目データベースシステムの例においては、例えば、 # 単位の種類(必修、選択必修など)、単位数、年次、前期か後期か、再履修かどうか、成績の6項目を含むこととする。 # ここで、いくつかの選択肢から選択するものについては、数字で置き換えることとする。 # このような仕様に基づいたファイルの例は以下のようなものになる。ここでは、ファイル名は、"ユーザ名_kamokudb.txt"とする。 # typedef struct _KAMOKU { # char name[MAX_KAMOKU_NAME]; /* 科目名 */ # int tanni_type; /* 必修、選択必修、選択、自由のいずれか */ # int tanni; /* 何単位か */ # int nenji; /* 何年次か */ # int kouki_flag; /* 前期なら0、後期なら1 */ # int sairi_flag; /* 再履修なら1、そうでないなら0 */ # int seiseki; /* 59点以下は不可、-1は未履修であることを示す */ # } KAMOKU; # # KAMOKU kamoku_list[200]; 履修科目データベースシステムを実装し、実行した例を以下に示す。なお、これは一例であって、課題は以下の通りに動作する必要はない。 ****** 単位データベースシステム ****** ユーザー名を入力して下さい:yamada ユーザー yamada は存在しません。データベースを新規に作成しますか? [1] Yes [2] No 番号を選択してください:1 **** 機能選択 **** [1] 科目登録 [2] 科目修正・削除 [3] データベース表示 [4] 必要単位数の表示 [5] 検索 [6] 並び替え [99] プログラム終了 機能を選択してください:1 **** 科目登録 **** 登録する科目を入力します。スペースを含まないローマ字で入力して下さい。 エンターキーのみを入力すると、科目の登録が終了します。 科目名:programming_ennsyuu_2 programming_ennsyuu_2 の情報を入力して下さい。 [1] 必修 [2] 選択必修 [3] 選択 [4] 自由 単位の種類:1 単位数:1 年次:2 [1] 前期 [2] 後期 前期・後期:2 [1] 非再履修 [2] 再履修 再履修:1 成績(-1:未履修):70 programming_ennsyuu_2 の情報を次のように登録します:必修, 1単位, 2年次, 後期, 非再履修, 70点 [1] 登録 [2] 再入力 番号を選択してください:1 programming_ennsyuu_2 の情報を登録しました。 科目名:denki_kairo_ennsyuu : 科目名: 科目登録を終了します。 **** 機能選択 **** : 機能を選択してください:2 **** 科目修正・削除 **** [1] programming_ennsyuu_2 [2] denki_kairo_ennsyuu [3] denki_kairo_kiso [4] digital_shingou_syori : 修正・削除する科目を選択して下さい:2 denki_kairo_ennsyuu の情報を修正して下さい。 最初の単位の種類で、[0] 削除 を選択すると、削除されます。 また、エンターキーを押すと、大括弧内の値が選択されます。 [0] 削除 [1] 必修 [2] 選択必修 [3] 選択 [4] 自由 単位の種類[3]: 単位数[1]: 年次[2]: [1] 前期 [2] 後期 前期・後期[1]: [1] 非再履修 [2] 再履修 再履修[1]: 成績(-1:未履修)[75]:85 denki_kairo_ennsyuu の情報を次のように修正します:選択, 1単位, 2年次, 前期, 非再履修, 85点 [1] 登録 [2] 再入力 番号を選択してください:1 denki_kairo_ennsyuu の情報を修正しました。 : 機能を選択してください:5 **** 検索 **** [1] 科目名 [2] 年次 [3] 前期・後期 [4] 不可の科目 検索したい項目を選択して下さい:2 年次を検索します。 検索対象:2 年次が 2 であるのは以下のものです: denki_kairo_kiso: 選択必修, 2単位, 2年次, 前期, 非再履修, 65点 denki_kairo_ennsyuu: 選択, 1単位, 2年次, 前期, 非再履修, 85点 programming_ennsyuu_1: 必修, 1単位, 2年次, 前期, 非再履修, 75点 programming_ennsyuu_2: 必修, 1単位, 2年次, 後期, 非再履修, 70点 digital_shingou_syori: 必修, 2単位, 2年次, 後期, 非再履修, 30点 : : 機能を選択してください:6 **** 並び替え **** [1] 科目名 [2] 年次 [3] 点数 どの項目で並べ替えるか選択して下さい:3 点数を昇順で並べ替えます。 digital_shingou_syori: 必修, 2単位, 2年次, 前期, 非再履修, 30点 denki_kairo_kiso: 選択必修, 1単位, 2年次, 前期, 非再履修, 65点 programming_ennsyuu_2: 必修, 1単位, 2年次, 後期, 非再履修, 70点 programming_ennsyuu_1: 必修, 1単位, 2年次, 前期, 非再履修, 75点 denki_kairo_ennsyuu: 選択, 1単位, 2年次, 前期, 非再履修, 85点 : : 機能を選択してください:4 **** 必要単位数の表示 **** 卒業に必要な単位数は、合計 62単位 総合基礎部門 計0単位 選択必修科目 0単位 選択科目 0単位 専門教育部門 計62単位 必修科目 12単位 選択必修科目 16単位 選択科目 34単位 : 機能を選択してください:99 プログラムを終了します。 データベースファイル yamada_kamokudb.txt を更新しました。 拡張 上記のプログラムの拡張を考える。例えば、以下のようなものが考えられる。 修得済み単位数や、不可となった科目を表示するなど、上記以外の機能を提供する。 検索において、完全一致のものだけでなく、条件に見合ったものを出力するようにする。 並び替えにおいて、年次だけでなく、年次と前期・後期を考慮した並べ替えをするなど、 他の並び替え方法を提供する。 データベースファイルとして、コンマ区切りのテキストファイルを用いる。 上記では、データファイルにスペース区切りのテキストファイルを用いたが、コンマ区切りのテキストファイル(CSVファイル)が用いられることも多い。この場合、フィールドにスペースが含まれていても問題なく動作する(ただし、コンマが含まれる場合には何らかの対策が必要になる)。 CSVファイルの読み込みのためには、いくつかの方法があるが、fgetsで読み込み、文字','を探す方法などが考えられる。また、strchrという関数が、文字列から特定の文字を含む箇所を取り出すものであるため、 fgetsとこれを組み合わせる方法もある。 構造体の配列を用いるのではなく、構造体へのポインタに対しmallocでメモリ確保する方法を用いる。 この場合、状況に応じてサイズを変えることが可能となる。ただし、確保したメモリは、使わなくなった場合には解放する必要がある。 KAMOKU *kamoku_list = NULL; : int num_list = 200; : kamoku_list = malloc(sizeof(struct _KAMOKU) * num_list); /* これ以降は、200の要素を持つ構造体の配列と同様に使用できる */ : printf("成績:%d\n", kamoku_list[0].seiseki); : free(kamoku_list); その他、既存のデータベースシステム等を参考にして機能を追加する。 履修科目データベースの検索(_検索項目,_検索鍵,_検索データ) :- get_split_lines('ユーザ名_kamokudb.txt',[' '],LL), member(_検索データ,LL), 鍵情報(_検索項目名,_検索データ,_検索鍵). 鍵情報(科目名,[_科目名,_単位の種類,_単位数,_年次,_後期,_前期,_再履修,_成績],_科目名). 鍵情報(単位の種類,[_科目名,_単位の種類,_単位数,_年次,_後期,_前期,_再履修,_成績],_単位の種類). 鍵情報(単位数,[_科目名,_単位の種類,_単位数,_年次,_後期,_前期,_再履修,_成績],_単位数). 鍵情報(年次,[_科目名,_単位の種類,_単位数,_年次,_後期,_前期,_再履修,_成績],_年次). 鍵情報(後期,[_科目名,_単位の種類,_単位数,_年次,_後期,_前期,_再履修,_成績],_後期). 鍵情報(前期,[_科目名,_単位の種類,_単位数,_年次,_後期,_前期,_再履修,_成績],_前期). 鍵情報(再履修,[_科目名,_単位の種類,_単位数,_年次,_後期,_前期,_再履修,_成績],_再履修). 鍵情報(成績,[_科目名,_単位の種類,_単位数,_年次,_後期,_前期,_再履修,_成績],_成績). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 鍵情報ソースプログラムの生成(_項目名ならび) :- append(_,[_項目名|R],_項目名ならび), findall(B,(member(A,_項目名ならび),concat_atom(['_',A],B)),L2), concat_atom(L2,',',_項目名ならび文字列), write_formatted('鍵情報(%t,[%t],_%t).\n',[_項目名,_項目名ならび文字列,_項目名]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/455 # # 質問です。 # where句が膨大な数の条件式による論理和(OR)で構成されているselect文において、 # 得られた各レコードがどの条件式によるものかを判断したい場合どのようにするべきですか? # # 例えば下のようなテーブル(t)に対して # id name sex age # 0 tanaka male 25 # 1 yamada female 18 # 2 suzuki male 16 # # select name from t where age < 20 or sex = 'male'; # # を発行した場合すべてのnameが得られますが、それぞれのレコードがどの条件式によって得られたものかを判断したいと考えています。 # # '膨大な数の条件式による論理和(OR)で構成されているselect文において、得られた各レコードがどの条件式によるものかを判断したい'(_id,_name,_sex,_age,_条件式) :- t(_id,_name,_sex,_age), 条件(_id,_name,_sex,_age,_条件式). 条件式(_id,_name,_sex,_age,age < 20) :- _age < 20,!. 条件式(_id,_name,_sex,_age,sex = male) :- _sex = male,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/451 # # 最近になってDBの勉強を始めたのですが詰ってしまったのでちょっと質問させてください。 # # 使っているのは、derbyです、バージョンはij起動時に10.5と表示されています # # ・テーブルデータ # 受注表 # ------------------- # 顧客コード | 受注個数 # ------------------- # 001 | 100 # 002 | 200 # 003 | 100 # 001 | 300 # 003 | 400 # # ・欲しい結果 # 結果 # --------------------------------- # 顧客コード | 個人平均値 | 全体平均値 # --------------------------------- # 001 |200 |240 # 002 |200 |240 # 003 |250 |240 # # ・説明 # SELECT #   顧客コード, #   AVG(受注個数) AS 個人平均値, #   (SELECT AVG(受注個数) FROM 受注表) AS 全体平均値  # FROM # 受注表 # GROUP BY # 顧客コード; # # 上記のSQLだとエラーが出て動かない(エラーメッセージ失念してしまいました) # どこがどう悪いのか現在の自分では分からなくてどうしようもない状態です。 # '受注簿から 顧客コード | 個人平均値 | 全体平均値 を各行に表示' :- findavg(_受注個数,受注表(_,_受注個数),_全体平均値), findsetof(_顧客コード,受注表(_顧客コード,_受注個数),L), append(_,[_顧客コード|R],L), findavg(_受注個数,受注表(_顧客コード,_受注個数),_個人平均値), write_formatted('%t | %t | %t\n',[_顧客コード,_個人平均値,_全体平均値]), R = []. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1263824755/91 # # [1] 授業単元:情報処理 # [2] 問題文: # # 問1 キーボードから3個の実数(整数でない)値を1行に1組として計5組入力し、 # ファイル(ファイル名data1.txt)に保存する。 # # 問2 #  問1で作ったファイルから実数値を読み込み、総合計と各組の実数の平均を求める。 # ただし、ファイルに書かれている組の数は不明とする。 # 'キーボードから3個の実数(整数でない)値を1行に1組として計5組入力し、ファイル(ファイル名data1.txt)に保存する。 ' :- 'キーボードから3個の実数(整数でない)値を1行に1組として計5組入力'(1,L), open('data1.txt',write,Output), append(_,[[V1,V2,V3]|R],L), write_formatted(Output,'%t,%t,%t\n',[V1,V2,V3]), R = [], close(Output),!. 'キーボードから3個の実数(整数でない)値を1行に1組として計5組入力'(3,[]) :- !. 'キーボードから3個の実数(整数でない)値を1行に1組として計5組入力'(N,[L|R]) :- write_formatted('%t組目の入力 _実数1 _実数2 _実数3 : ',[N]), get_line(Line), 入力の診断(Line,L), N2 is N + 1, 'キーボードから3個の実数(整数でない)値を1行に1組として計5組入力'(N2,R),!. 'キーボードから3個の実数(整数でない)値を1行に1組として計5組入力'(N,X) :- 'キーボードから3個の実数(整数でない)値を1行に1組として計5組入力'(N,X). 入力の診断(Line,[V1,V2,V3]) :- split(Line,[' ',','],[V1,V2,V3]), real(V1), real(V2), real(V3),!. 入力の診断(Line,[V1,V2,V3]) :- write_formatted('%tは実数を3個(間をスペースであける)になっていません',[Line]), fail. '問1で作ったファイルから実数値を読み込み、総合計と各組の実数の平均を求める。'(_総合計,_各組の実数の平均) :- get_lines('data1.txt',Lines), 総合計の取得(Line,_総合計), 各組の平均の取得(Lines,_各組の実数の平均). 総合計の取得(Lines,_総合計) :- findsum(_各行の合計,( member(Line,Lines), split(Line,[','],[V1,V2,V3]), _各行の合計 is V1+V2+V3), _総合計). 各組の平均の取得(Lines,_各組の実数の平均ならび) :- findall(_各組の実数の平均,( member(Line,Lines), split(Line,[','],[V1,V2,V3]), _各組の実数の平均 is (V1+V2+V3) / 3), _各組の実数の平均ならび). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/609 # # postgres8.4を使ってます。 # レコード数が3件以上あるものを取得したいのですが # どう書けばよいでしょうか。 # # やりたいことのイメージはこんな感じです。 # select recordCD from Table where recordCD in (select recordCD from Table where count(recordCD) > 3); # % これだとrecodCDが件数分出力されてしまうので、一件のみの出力に変更した recordCDの位置を得る(_引数の数,_位置番号) :- 'テーブル構造'('Table',_引数の数,_位置番号,recordCD). レコード数が3件以上あるものを取得する(_recordCD) :- recordCDの位置を得る(_引数の数,_位置番号), functor(Q,'Table',_引数の数), arg(_位置番号,Q,_recordCD), findsetof(_recordCD,call(Q),L1), member(_recordCD,L1), count(Q,Count), Count >= 3. % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/609 # # postgres8.4を使ってます。 # レコード数が3件以上あるものを取得したいのですが # どう書けばよいでしょうか。 # # やりたいことのイメージはこんな感じです。 # select recordCD from Table where recordCD in (select recordCD from Table where count(recordCD) > 3); # % これだとrecodCDが件数分出力されてしまうので、一件のみの出力に変更した recordCDの位置を得る(_引数の数,_位置番号) :- 'テーブル構造'('Table',_引数の数,_位置番号,recordCD). レコード数が3件以上あるものを取得する(_recordCD) :- recordCDの位置を得る(_引数の数,_位置番号), functor(Q,'Table',_引数の数), arg(_位置番号,Q,_recordCD), findsetof(_recordCD,call(Q),L1), member(_recordCD,L1), count(Q,Count), Count >= 3. % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/594 # #(問) # ID | DATE     | DATA # --+----------+----- # 1 | 2007-11-11 | aaa # 2 | 2007-11-11 | bbb # 1 | 2007-11-10 | ccc # 3 | 2007-11-12 | ddd # 3 | 2007-11-11 | eee # 4 | 2007-11-10 | fff # 1 | 2007-11-12 | ggg # # このようなテーブルから、各idに対して最新の5件だけ抽出しなさい 各idに対して最新の5件だけ抽出する(_ID,_DATE,_DATA) :- findsetof(_ID,テーブル(_ID_1,_DATE_1,_DATA_1),L1), member(_ID,L1), findall([_DATE,_ID,_DATE,_DATA],テーブル(_ID1,_DATE,_DATA),L2), 最新の5件を抽出(L3,Len,_ID,_DATE,_DATA). 最新の5件を抽出(L1,_ID,_DATE,_DATA) :- sort(L1,L2), reverse(L2,L3), length(L3,Len), '5件を抽出'(L3,Len,_ID,_DATE,_DATA). '5件を抽出'(L,Len,_ID,_DATE,_DATA) :- Len =< 5, member([_,_ID,_DATE,_DATA],L). '5件を抽出'(L,Len,_ID,_DATE,_DATA) :- Len > 5, for(1,N,5), list_nth(N,L,[_,_ID,_DATE,_DATA]), N =< 5. % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/445 # # MySQL 5.1での質問です。 # # A B C # 1 q name1 # 2 w name2 # 3 e name3 # 4 q name4 # 5 t name5 # # 上記テーブルのB列の重複を除いたA,B,C列がほしい場合 # # SELECT DISTINCT B FROM table_name; # # ではB列の重複を除くだけで他の列がとれません。他の列も併せて取得する場合はどのような解決策がありますか? # # 望んでる結果は以下のものです。 # # A B C # 1 q name1 # 2 w name2 # 3 e name3 # 5 t name5 # 'B列の重複を除く際のルール'(_重複行ならび,_重複を除いた行) :- _重複行ならび = [_重複を除いた行|_],!. 'B列の重複を除いたA,B,C列がほしい'(_重複を除いた行) :- findsetof(_B列,foo(_,_B列,_),_重複を取り除いたB列ならび), member(_B列,_重複を取り除いたB列ならび), findall(_行,( member([_A列,_B列,_C列],foo(_A列,_B列,_C列)), L1), 'B列の重複を除く際のルール'(L1,_重複を除いた行). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1136788500/499 # # Visual Basicでの質問なんですが、 # # 今給料明細のプログラミングをしてまして、 # 1日目の就業時間 8時間30分 # 2日目の就業時間 8時間30分 # 3日目〜〜 # 4日目〜〜 # # 総労働時間123時間30分 # などという用に作りたいのですが、 # timeserial関数を使って計算したところ24時間以降はまた1になってしまいます。 # 何かいい方法はないでしょうか? # # :- op(450,xfx,時間). :- op(440,xf,分). :- op(500,xfx,日目の就業時間). 就業時間合計(_時間,_分) :- findsum([_N2,_N3],(N 日目の就業時間 N2 時間 N3 分),[_時間_1,_分_1]), _分 is truncate(_分_1) mod 60, _時間プラス is _分_1 // 60, _時間 is truncate(_時間_1) + _時間プラス. /* 就業時間合計(_就業時間テキスト,_時間,_分) :- get_lines(_就業時間テキスト,Lines), member(Line,Lines),, replace(Line,日目の就業時間,' 日目の就業時間',Line1), replace(Line1,時間,' 時間',Line2), replace(Line2,分,' 分',Line3), atom_to_term(Line3,Term,_), assertz(Term), fail. 就業時間合計(_就業時間テキスト,_時間,_分) :- 就業時間(_時間,_分). */ % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/386 # # ・DBMS名とバージョン #   SQL Server Compact 3.5 # # ・テーブルデータ 家計簿のようなデータです # Cd1 Cd2  Item      Cost # ---+----+-----------+---------------- # 1   0    食費      NULL # 1   1    弁当      500 # 2   0    光熱費     NULL # 2   1    水道料     1000 # 2   1    水道料     2000 # 2   2    ガス料     4000   # # ・欲しい結果 # Cd1 Cd2  Item      Sum # ---+----+-----------+---------------- # 1   0    食費      500 # 2   0    光熱費    7000 # # ・説明 # Cd1が大分類、Cd2が中分類を表してます。 # Cd2が0の場合、Itemは大分類の名称。それ以外の場合、中分類の名称が入ってます。 # 大分類ごとにItemと合計額が欲しいです。 # # # 大分類ごとにItemと合計額が欲しい :- findsetof([_Cd1,_Item],家計簿(_cd1,0,_Item,_),L1), member([_Cd1,_Item],L1), findsum(_Cost,(家計簿(_Cd1,_Cd2,_,_Cost),\+(_Cd2=0)),_Sum), write_formatted('%t %t %t %t\n',[_Cd1,0,_Item,_Sum]), fail. 大分類ごとにItemと合計額が欲しい. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/374 # # はじめまして # # ・Access2000 # # 下のようなテーブルがあったときに # # テーブルA # 名前 科目 点数 # ---------------------- # 岡村 国語 51 # 岡村 数学 48 # 岡村 英語 39 # 徳田 国語 60 # 徳田 数学 30 # 徳田 英語 48 # 渡辺 国語 28 # 渡辺 数学 67 # 渡辺 英語 25 # # 下のように各科目の最高点を名前つきで取得するにはどうすればいいのでしょうか? # # 結果(各科目の最高点) # ---------------------- # 徳田 国語 60 # 岡村 数学 48 # 徳田 英語 48 # # # よろしくおねがいします。 # # # 各科目の最高点を名前つきで取得する(_最高点ならび) :- findsetof(_科目,テーブルA(_,_科目,_),_科目ならび), findall([_最高点氏名,_科目2,_最高点],( member(_科目2,_科目ならび), findmax([_点数,_名前2],テーブルA(_名前2,_科目2,_点数),[_最高点,_最高点氏名])), _最高点ならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/369 # # 会社コード|部署コード|課コード|給料 # # というテーブルがあったとき、 # GROUP BY 会社コード , 部署コード # で部署毎の給料合計を出したいけど、 # 抽出結果の列には課コードも含めたい、 # というときってどうしたら良いのでしょうか? # イメージは↓の感じです。 # A会社|B部署|C課|100万円 # A会社|B部署|D課|100万円 # A会社|E部署|F課|500万円 # A会社|E部署|G課|500万円 # '抽出結果に課コードを加えた、会社コード・部署コードで集約した給与合計ならび'(_給与合計ならび) :- findsetof([_会社コード,_部署コード,_課コード],給料(_会社コード,_部署コード,_課コード,_),L1), findall([_会社コード,_部署コード,_課コード,_給与合計],( member([_会社コード,_部署コード,_課コード],L1), findsum(_給与,給与(_会社コード,_部署コード,_,_給与),_給与合計)),_給与合計ならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/364 # # 商品コード|売上店舗|売上個数 # # というテーブルから、 # 店舗毎の売上をまとめた列を追加した以下のようなテーブルを作りたいです。 # # 商品コード|店舗a売上個数|店舗b売上個数|店舗c売上個数| # # 現在は店舗毎の売上を集計したテーブルを別に作って、それを結合させて作っていますが、それ以外で単一のsqlで書く場合どうなるでしょうか? # # 簡単かと思ったら思いつきません。。 # お願いします。 # # # '商品コード|店舗a売上個数|店舗b売上個数|店舗c売上個数|'(_商品番号・売上店舗別売上合計ならび) :- findsetof(_商品番号,商品売上(_商品番号,_,_),L1), findall([_商品番号|_店舗別売上合計ならび],( member(_商品番号,L1), findall(_店舗別売上合計ならび,( member(_売上店舗,[a,b,c]), findsum(_売上個数, 商品売上(_商品番号,_売上店舗,_売上個数), _店舗別売上合計ならび))), _商品番号・売上店舗別売上合計ならび). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1279286575/74 # # 【質問テンプレ】 # [1] 授業単元:情報処理課題 # [2] 問題文(含コード&リンク):英語の文章で構成されるテキストファイルに対して、その中に含まれる総文字数と異なる文字ごとの出現回数とを数え上げよ。 # [3.3] 言語:C # [4] 期限:2010年07月19日00:00まで # [5] その他の制限:Xcodeを使用しています。読み込むファイルは"/Users/user/Desktop/data.txt"で。 # # 似たようなプログラムを作った時は「数列を入力し総文字数と数字ごとに出現回数とを数え上げグラフで表示」というような課題で # 数字だったので0〜9までを表示することが簡単に出来ましたがアルファベットなのでa-zをどう表示したものか # またstrlenだと半角空白も数えてしまうので総"文字"数とずれてくるのではないかと悩んでいます。 # よろしくお願いします。 # # 英語の文章で構成されるテキストファイルに対して、その中に含まれる総文字数と異なる文字ごとの出現回数とを数え上げる(_総文字数,_文字ごとの出現度数ならび) :- get_chars('/Users/user/Desktop/data.txt',Chars), length(Chars,_総文字数), findsetof(C,member(C,Chars),L1), findall([C,_出現度数],(member(C,L1),count(member(C,Chars),_出現度数)),_文字ごとの出現度数ならび). findsetof(A,B,L) :- findall(A,B,C), setof(A,member(A,C),L). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/920 # # [1] C言語プログラミング演習 # [2] 問題文(含コード&リンク # ATM(Automated Teller Machine; 現金自動預け払い機)システムを実現するプログラムを考える。 # # 氏名,口座番号,暗証番号,預金残高を要素とする構造体を宣言し, 512人分の口座が作成可能なようにせよ.また,初期値として次のように構造体の内容を設定せよ. # # 立命太郎の口座番号は1234で,預金残高を1,234,560円に設定する. # 野路花子の口座番号は5678で,預金残高を987,600円に設定する. # 衣笠一郎の口座番号は9012で,預金残高を538,600円に設定する. # 暗証番号は口座番号に1111を足して10000で割った余りに設定する. # ここで暗証番号は、口座番号を引数としてとり、それに1111を足して10000で # 割った余りを計算する関数を作成して設定すること. # 上記の方法で初期値を設定し、設定された3人の預金残高を画面へ出力する # プログラムを作成せよ.ただし、ひとり分の預金残高を表示する関数を作成して、 # これを繰り返し使って3人の預金残高を出力すること. # # % ./initAccount # 預金残高は次のとおりです. # 立命太郎 (1234) 1234560 円 # 野路花子 (5678) 987600 円 # 衣笠一郎 (9012) 538600 円 # % 預金口座の初期設定(_ファイル) :- w3c('http://pc12.2ch.net/test/read.cgi/tech/1276810079/920',Lines), append(_,[Line|R],Lines), split(Line,[の口座番号は,'で,貯金残高を,円に設定する.'],[_氏名,_口座番号,_預金残高]), assertz(預金口座(_氏名,_口座番号,_預金残高)), _暗証番号 is (_口座番号 + 1111) mod 10000, assertz(預金口座暗証番号(_口座番号,_暗証番号)), R = [],!. 預金口座の初期設定(_). 設定された3人の預金残高を画面へ出力する :- findsetof(_口座番号,預金口座(_,_口座番号,_),_口座番号ならび), write('預金残高は次のとおりです.\n'), append(_,[_口座番号|R],_口座番号ならび), ひとり分の預金残高を表示する(_口座番号), R = []. ひとり分の預金残高を表示する(_口座番号) :- 預金口座(_氏名,_口座番号,_預金残高), write_formatted('%t (%t) %t 円\n',[_氏名,_口座番号,_預金残高]),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/887 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): # fgets() を使って50文字以下の文字列を入力し,文字列中の各 # 文字の出現回数を数えるプログラムを作成せよ。 # 実行例 # 文字列は? abcdef,abb(ccc110) # a : 2 # b : 3 # c : 4 # d : 1 # e : 1 # f : 1 # , : 1 # ( : 1 # 1 : 2 # 0 : 1 # ) : 1 # '50文字以下の文字列を入力し,文字列中の各文字の出現回数を数える' :- '50文字以下の文字列を入力し'(_50文字以下の文字列), 文字列中の各文字の出現回数を数える(_50文字以下の文字列,_文字ごとの出現回数ならび), 文字ごとの出現回数を表示する(_文字ごとの出現回数ならび). '50文字以下の文字列を入力し'(_50文字以下の文字列) :- get_line(_50文字以下の文字列), length(_50文字以下の文字列,_文字数), _文字数 =< 50. 文字列中の各文字の出現回数を数える(_文字列,_出現回数ならび) :- どんな文字が出現したかならびに数え上げる(_文字列,_重複を許さない文字ならび), 各文字の出現回数を数える(_文字列,_重複を許さない文字ならび,_出現回数ならび). どんな文字が出現したかならびに数え上げる(_文字列,_重複を許さない文字ならび) :- findsetof(_文字,( sub_atom(_文字列,_,1,_,_文字)), _重複を許さない文字ならび). 各文字の出現回数を数える(_文字列,_重複を許さない文字ならび,_出現回数ならび) :- findall([_出現回数,_文字],( append(_,[_文字|_],_重複を許さない文字ならび), count(sub_atom(_文字列,_,1,_,_文字),_出現回数)), _出現回数ならび). 文字ごとの出現回数を表示する(_文字ごとの出現回数ならび) :- append(_,[[_出現回数,_文字]|R],_文字ごとの出現回数ならび), writef('%t : %t\n',[_文字,_出現回数]), R = []. % % 文字列をならび(リスト)に変換しない場合は、非決定性述語sub_atom/5を使う。 % % 出現回数と文字の並びがひっくり返っているのは整列を求められた場合への備えだが、 % 好ましいことではないかも知れない。 % % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1274791771/248 # # TABLE test # id | data # ---+------ # 100 | AAA # # TABLE hoge # id | value # ---+------ # 100 | 10 # 100 | 20 # # TABLE 100 # id |val1| val2 # ---+---+---- # 100 | 20 | 40 # 100 | 30 | 60 # # SELECT a.id, test.data, a.cnt + b.cnt + c.cnt # FROM # (SELECT id, SUM( aa.val1 ) cnt FROM (SELECT id, val1 FROM `100`)aa)a, # (SELECT id, SUM( bb.val2 ) cnt FROM (SELECT id, val2 FROM `100`)bb)b, # (SELECT id, SUM( value ) cnt FROM hoge WHERE id = 100)c,test # WHERE a.id = c.id AND test.id = 100 # # 欲しい結果 # id data a.cnt + b.cnt + c.cnt # ---------------------------- # 100 AAA 180 '欲しい結果 id data a.cnt + b.cnt + c.cnt' :- test(_id,_data), findsum(U,(findsum(_value,hoge(_id,_value),U1),findsum(_val3,('100'(_id,_val1,_val2),_val3 is _val1 + _val2),U2),U is U1 + U2),S). write('id data a.cnt + b.cnt + c.cnt\n'), write_formatted('%t %t %t\n',[_id,_data,S]),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/523 # # [1] 授業単元: Visual Studio 入門 # [2] 問題文 3問ほどあるのでリンクを # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10782.txt # # 問題2 # 下に示すように,非負の整数を次々と読み込んでいき,各値の二乗値の和を表示するプログ # ラムを作成せよ.なお,整数の読み込みは,負の整数を読み込んだ段階で終了するものとし, # その数の二乗値の和は加算しないものとする. # # 整数を入力してください # 整数1 : 3 # 整数2 : 5 # 整数3 : -1 # 二乗値の合計は34 です. # '非負の整数を次々と読み込んでいき,各値の二乗値の和を表示する' :- write('整数を入力してください\n'), findsum(S,(非負の整数を次々と読み込んでいき(1,X),(X < 0,!,fail;S is X * X)),_二乗和), write_formatted('二乗値の合計は%t です.\n',[_二乗和]). 非負の整数を次々と読み込んでいき(N,X) :- write_formatted('整数%t : ',[N]),get_integer(X). 非負の整数を次々と読み込んでいき(N,X) :- N2 is N + 1, 非負の整数を次々と読み込んでいき(N2,X). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1274791771/243 # # プログラム言語で以下の集約を定義しなさい。  # SELECT CASE pref_name #        WHEN '徳島' THEN '四国' #        WHEN '香川' THEN '四国' #        WHEN '愛媛' THEN '四国' #        WHEN '高知' THEN '四国' #        WHEN '福岡' THEN '九州' #        WHEN '佐賀' THEN '九州' #        WHEN '長崎' THEN '九州' #        ELSE 'その他' END AS district, #     SUM(population) #  FROM PopTbl #  GROUP BY CASE pref_name #        WHEN '徳島' THEN '四国' #        WHEN '香川' THEN '四国' #        WHEN '愛媛' THEN '四国' #        WHEN '高知' THEN '四国' #        WHEN '福岡' THEN '九州' #        WHEN '佐賀' THEN '九州' #        WHEN '長崎' THEN '九州' #        ELSE 'その他' END; 地方で集約する(_地方,_人口) :- findsetof(_地方,( 'PopTbl'(_pref_name,_population), 地方(_地方,_pref_name)), L1), append(_,[_地方|_],L1), findsum(_population,( 'PopTbl'(_pref_name,_population), 地方(_地方,_pref_name)), _人口). 地方(四国,徳島). 地方(四国,香川). 地方(四国,愛媛). 地方(四国,高知). 地方(九州,福岡). 地方(九州,佐賀). 地方(九州,長崎). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1200175247/877 # # [1] 授業単元:2分探索法 # [2] 問題文: http://nojiriko.asia/jpeg/up10962.jpg にコピーさせていただきました。 # _学籍番号+_氏名+_誕生_月+_誕生_日 :- open('data_b.txt',append,Output), write_formatted(Output,'%t %t %t %t\n',[_学籍番号,_氏名,_誕生_月,_誕生_日]), close(Output). 'data_b.txtを読み込み、4月1日を年初めとして、誕生日の早いもの順にソートし、その結果を「output_b.txt」ファイルに出力する' :- get_split_lines('data_b.txt',[' '],LL), 鍵項目の付加(LL,LL2), 整列(LL2,LL3), 鍵項目を除去しながら出力する(LL3). 鍵項目の付加([],[]) :- !. 鍵項目の付加([[_学籍番号,_氏名,_誕生_月,_誕生_日]|R1],[[_誕生_月_2,_誕生_日,_学籍番号,_氏名,_誕生_月,_誕生_日]|R2]) :- '1-3月を13-15月に修正'(_誕生_月,_誕生月_2), 鍵項目の付加(R1,R2). '1-3月を13-15月に修正'(_誕生_月,_誕生月_2) :- _誕生_月 >= 1,_誕生_月 =< 3,_誕生_月_2 is _誕生_月 + 12,!. '1-3月を13-15月に修正'(_誕生_月,_誕生月). 鍵項目を除去しながら出力する([]) :- !. 鍵項目を除去しながら出力する([[_,_|L]|R]) :- open('out_b.txt',append,Output), write_formatted(Output,'%t %t %t月 %t日\n',L), close(Output), 鍵項目を除去しながら出力する(R). 'output_b.txtを読み込み、ある誕生日を入力したときに、その学生の学籍番号、氏名、誕生月、誕生日を二分探索法により出力する'(_誕生_月,_誕生_日) :- get_split_lines('output_b.txt',[' ',月,日],LL), 二分探索法(LL,_誕生_月,_誕生_日,[_学籍番号,_氏名,_誕生_月,_誕生_日]), write_formatted('%t %t %t %t月%t日\n',[_学籍番号,_誕生_月,_誕生_日]). 二分探索法(LL,_誕生_月,_誕生_年,[_学籍番号,_氏名,_誕生_月,_誕生_日]) :- '1-3月を13-15月に修正'(_誕生_月,_誕生月_0), length(LL,Len), Len0 is Len // 2, append(L0,[[_学籍番号_1,_氏名_1,_誕生_月_1,_誕生_日_1]|L1],LL), length(L0,Len0), '1-3月を13-15月に修正'(_誕生_月_1,_誕生月_10), 二分探索法(L0,L,L1,_誕生_月_0,_誕生_日,_誕生_月_10,_誕生_日_1,[_学籍番号,_氏名,_誕生_月,_誕生_日]). 二分探索法(L0,L,L1,_誕生_月,_誕生_日,_誕生_月,_誕生_日,L) :- !. 二分探索法(L0,L,L1,_誕生_月_0,_誕生_日,_誕生_月_10,_誕生_日_1,[_学籍番号,_氏名,_誕生_月,_誕生_日]) :- [_誕生_月_0,_誕生_日] @> [_誕生_月_10,_誕生_日_1], 二分探索法(L0,_誕生_月,_誕生_年,[_学籍番号,_氏名,_誕生_月,_誕生_日]). 二分探索法(L0,L,L1,_誕生_月_0,_誕生_日,_誕生_月_10,_誕生_日_1,[_学籍番号,_氏名,_誕生_月,_誕生_日]) :- [_誕生_月_0,_誕生_日] @< [_誕生_月_10,_誕生_日_1], 二分探索法(L1,_誕生_月,_誕生_年,[_学籍番号,_氏名,_誕生_月,_誕生_日]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/335 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク):ファイルに保存された会員情報を指定された項目をキーとしてソートするプログラムを作成する. # 出力形式は,入力データと同じ,つまり1行に1人分のデータを格納し,各項目間はカンマで区切るものとする. # また,ソート済みのデータはファイルではなく標準出力に出力するものとする. # 整数型のデータについては数値として,文字列型のデータについては大文字/小文字を区別せずにソートをすること. # ソートアルゴリズムはこれまでの演習で使用したもの,していないものに関わらず,何を用いてもよい. # # また,会員数は最大で20,000人と仮定してもよい. # # 会員情報の入ったファイルのファイル名,キーとなる項目,正順か逆順かの指定はプログラム実行時の引数として与える.第一引数が会員情報の入ったファイル名,第二引数が項目番号(表1参照),第三引数がソート方法(0なら昇順,1なら降順)とする. # # 表1: データ型 項目名 項目番号 型 # 会員ID 1 整数(int) # 姓 2 文字列(最大で50文字) # 名 3 文字列(最大で50文字) # 年齢 4 整数(int) # 州 5 文字列(最大で50文字) # 郡 6 文字列(最大で50文字) # # # オンメモリ整列限界数(1000). ファイルに保存された会員情報を指定された項目をキーとしてソートする(_対象ファイル,_鍵項目番号,_ソート方法) :- オンメモリ整列限界数(_オンメモリ整列限界数), open(_対象ファイル,read,Input), ふたつの仮ファイルの取得と交互からくり生成, 入力出力ファイルを交互しながらの繰り返し(_,_仮出力ファイル,InputT,OutputT), 対象ファイルから読み込む(Input,_オンメモリ整列限界数,_鍵項目番号,LL,_診断), 昇降順・指定整列(LL,_ソート方法,_整列されたLL), 鍵項目番号とソート方法をしてファイルマージ(_整列されたLL,_ソート方法,InputT,OutputT), \+(_診断=1000),close(Input), 仮出力ファイルの内容を整理しながら標準出力に表示する(_仮出力ファイル). 入力出力ファイルを交互しながらの繰り返し(_仮ファイルA,_仮ファイルB,InputT,OutputT) :- 仮ファイルからくり(_仮ファイルA,_仮ファイルB), open(_仮ファイルA,read,InputT), open(_仮ファイルB,write,OutputT). 仮ファイルからくり(X) :- 仮ファイルからくり(X). ふたつの仮ファイルの取得と交互からくり生成 :- tmpnam(_仮ファイル1),open(_仮ファイル1,write,Output1),close(Output1), tmpnam(_仮ファイル2),opene(_仮ファイル2,write,Output2),close(Output2), asserta(仮ファイルからくり(_仮ファイル2,_仮ファイル1)), asserta(仮ファイルからくり(_仮ファイル1,_仮ファイル2)). 対象ファイルから読み込む(Input,_オンメモリ整列限界数,_鍵項目番号,LL,_診断) :- 対象ファイルから読み込む(Input,0,_オンメモリ整列限界数,_鍵項目番号,LL,_診断),!. 対象ファイルから読み込む(Input,_オンメモリ整列限界数,_オンメモリ整列限界数,_,[],_オンメモリ整列限界数) :- !. 対象ファイルから読み込む(Input,N,_オンメモリ整列限界数,_鍵項目番号,[[_鍵_1,_会員ID,_姓_1,_名_1,_年齢,_州_1,_郡_1]|R],_診断) :- get_line(Input,Line), N2 is N + 1, split([','],Line,[_会員ID,_姓,_名,_年齢,_州,_郡]), to_upper([_姓,_名,_州,_郡],[_姓_1,_名_1,_州_1,_郡_1]), list_nth(_鍵項目番号,[_会員ID,_姓_1,_名_1,_年齢,_州_1,_郡_1],_鍵), 文字項目なら大文字に変換(_鍵,_鍵項目番号,_鍵_1), 対象ファイルから読み込む(Input,N,_オンメモリ整列限界数,_鍵項目番号,R,_診断). 文字項目なら大文字に変換(_鍵,_鍵項目番号,_鍵_1) :- member(_鍵項目番号,[2,3,5,6]), to_upper(_鍵,_鍵_1),!. 文字項目なら大文字に変換(_鍵,_,_鍵). 昇降順・指定整列(LL,1,_整列されたLL) :- sort(LL,_整列されたLL). 昇降順・指定整列(LL,2,_整列されたLL) :- rsort(LL,_整列されたLL). 鍵項目番号とソート方法をしてファイルマージ([],end_of_file,_,InputT,OutputT) :- !. 鍵項目番号とソート方法をしてファイルマージ([L1|R1],end_of_file,_,InputT,OutputT) :- write_formatted(OutputT,'%t,%t,%t,%t,%t,%t,%t\n',L1), 鍵項目番号とソート方法をしてファイルマージ(R1,end_of_file,_,InputT,OutputT),!. 鍵項目番号とソート方法をしてファイルマージ([],[_鍵2|L2],_,InputT,OutputT) :- write_formatted(OutputT,'%t,%t,%t,%t,%t,%t,%t\n',[_鍵2|L2]), eofまでコピーする(InputT,OutputT), close(InputT), close(OutputT),!. 鍵項目番号とソート方法をしてファイルマージ([[_鍵1|L1]]|R1],[_鍵2|L2],1,InputT,OutputT) :- _鍵1 @=< _鍵2, write_formatted(OutputT,'%t\n',[_鍵1|L1]), 鍵項目番号とソート方法をしてファイルマージ(R1,[_鍵2|L2],_ソート方法,InputT,OutputT). 鍵項目番号とソート方法をしてファイルマージ([[_鍵1|L1]|R1],[_鍵2|L2],1,InputT,OutputT) :- _鍵1 @> _鍵2, write_formatted(OutputT,'%t\n',[_鍵2|L2]), get_line(InputT,Line), atom_to_term(Line,(_鍵3,_会員ID3,_姓3,_名3,_年齢3,_州3,_郡3),_), 鍵項目番号とソート方法をしてファイルマージ(R1,[_鍵3,_会員ID3,_姓3,_名3,_年齢3,_州3,_郡3],_ソート方法,InputT,OutputT). 鍵項目番号とソート方法をしてファイルマージ([[_鍵1|L1]|R1],[_鍵2|L2],2,InputT,OutputT) :- _鍵1 @>= _鍵2, write_formatted(OutputT,'%t\n',[_鍵1|L1]), 鍵項目番号とソート方法をしてファイルマージ(R1,[_鍵2|L2],_ソート方法,InputT,OutputT). 鍵項目番号とソート方法をしてファイルマージ([[_鍵1|L1]|R1],[_鍵2|L2],2,InputT,OutputT) :- _鍵1 @< _鍵2, write_formatted(OutputT,'%t\n',[_鍵2|L2]), get_line(InputT,Line), atom_to_term(Line,(_鍵3,_会員ID3,_姓3,_名3,_年齢3,_州3,_郡3),_), 鍵項目番号とソート方法をしてファイルマージ(R1,[_鍵3,_会員ID3,_姓3,_名3,_年齢3,_州3,_郡3],_ソート方法,InputT,OutputT). eofまでコピーする(InputT,OutputT) :- repeat, get_line(Line), ( Line=end_of_file;write_formatted('%t\n',[Line]),fail),!. 仮出力ファイルの内容を整理しながら標準出力に表示する(_仮出力ファイル) :- open(_仮出力ファイル,read,Input), repeat, get_line(Line), ( Line=end_of_file; split([','],Line,[_|L]), write_formatted('%t,%t,%t,%t,%t,%t\n',L), fail ). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/340 # # [1] 授業単元: プログラミング開発基礎 # [2] 問題文 複数ありますのでこちらで # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10764.txt # # 1 問題1 # 整数値を読み込んで,その数が10 で割り切れるかどうかを表示するプログラムを作成せよ. # なお,表示後に,もう一度続けるかの確認を促し,それに応じて何度でも繰り返せるようにすること # # 2 問題2 # 非負の整数値を読み込んで,その桁数を表示するプログラムを作成せよ. # なお,負の値を読み込んだ場合は,再入力を促すメッセージを表示すること. # # 3 問題3 # 二つの整数値を読み込んで,小さい方の数以上で大きい方の数以下の整数を全て加えた値を表示するプログラムを作成せよ. # 4 問題4 # 9999 を読み込むまで次々と整数値を読み込んでいき,合計値および平均値を表示するプログラムを作成せよ.なお,最後に読み込んだ9999 は合計には加えないものとする '整数値を読み込んで,その数が10 で割り切れるかどうかを表示する' :- 催促付き整数入力('整数値を入力してください : ',N), '10で割り切れるか判定する'(N), write('入力を続けますか y or n : '),get_line(Line), Line = y, '整数値を読み込んで,その数が10 で割り切れるかどうかを表示する'. '整数値を読み込んで,その数が10 で割り切れるかどうかを表示する'. '10で割り切れるか判定する'(N) :- 0 is N mod 10, write_formatted('あなたの入力した数%tは10で割り切れます\n',[N]),!. '10で割り切れるか判定する'(N) :- write_formatted('あなたの入力した数%tは10で割り切れません\n',[N]),!. '非負の整数値を読み込んで,その桁数を表示する' :- 催促付き整数入力('非負の整数値を入力してください : ',N),N >= 0, 入力された整数の桁数を表示する(1,N), write_formatted('入力を続けますか y or n : '),get_line(Line), Line = y, '非負の整数値を読み込んで,その桁数を表示する'. '非負の整数値を読み込んで,その桁数を表示する'. 入力された整数の桁数を表示する(M,N) :- truncate(10 ^ M) > N,write_formatted('入力された非負整数は%桁です\n',[M]),!. 入力された整数の桁数を表示する(M1,N) :- M2 is M1 + 1,入力された整数の桁数を表示する(M2,N). 二つの整数値を読み込んで,小さい方の数以上で大きい方の数以下の整数を全て加えた値を表示する :- write('整数値をカンマで区切り二つ読み込みます : '), get_split_line([','],[N1,N2]), 小さい順に(N1,N2,N3,N4), findsum(N,for(N3,N,N4),Sum1), Sum is truncate(Sum1), write_formatted('%t以上%t以下のすべての整数の和は%tです。\n',[N3,N4,Sum]). 小さい順に(N1,N2,N1,N2) :- N1 =< N2,!. 小さい順に(N1,N2,N2,N1) :- N1 > N2,!. '9999 を読み込むまで次々と整数値を読み込んでいき,合計値および平均値を表示する' :- findall(N,(repeat,get_integer(N),(N=9999,!,fail;true)),L), length(L,Len),\+(Len=0), 合計値および平均値(L,Len,0,_合計値,_平均値), write_formatted('合計値 = %t, 平均値 = %t\n',[_合計値,_平均値]). 合計値および平均値([],Len,_合計値,_合計値,_平均値) :- _平均値 is _合計値 / Len,!. 合計値および平均値([N|R],Len,_合計値1,_合計値,_平均値) :- _合計値2 is _合計値 + N, 合計値および平均値(R,Len,_合計値2,_合計値,_平均値). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1274791771/231 # # tbl1にnum1,num2,id1,id2,id3 # tbl2にid,name,ssというフィールドがあるとして # SELECT name, num1, num2, id1, id2, id3, time FROM tbl1, tbl2 # WHERE num1 = 1 # AND id1 = ( SELECT id FROM tbl2 WHERE ss = "monga") # 上記のようなSQLを # 特定のフィールドが他の行と重複してたら抜かすというのはどうやればいいでしょうか? # 単にdistinctつけるだけだとどれかひとつでも重複していなかったら抽出されますよね。 # id1,id2,id3が他のレコードのid1,id2,id3と重複してたら # 検索結果に入れないみたいな感じにしたいのですが。 # MYSQLです。 'id1,id2,id3が他のレコードのid1,id2,id3と重複してたら検索結果に入れない'([_name,_num1,_num2,_id1,_id2,_id3]) :- findall([_name,_num1,_num2,_id1,_id2,_id3],( tbl1(num1,_num2,_id1,_id2,_id3), num1 = 1, tbl2(id1,_name,monga)), L1), findsetof([_id1,_id2,_id3],member([_,_,_,_id1,_id2,_id3],L1),L2), findall([_id1,_id2,_id3],( count((member([_id1,_id2,_id3],L2),1)), L2), member([_name,_num1,_num2,_id1,_id2,_id3],L1), member([_id1,_id2,_id3],L2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/170 # # 【質問テンプレ】 # [1] 授業単元: C言語プログラミング # [2] 問題文(含コード&リンク): # 1.関数sqrtを使って1〜10までの二乗根の和を求めなさい。 # 2.16進数ABC.DEを10進数にしなさい。 # '関数sqrtを使って1〜10までの二乗根の和を求める'(X) :- findsum(Y,(for(1,N,10),Y is sqrt(N)),X). '16進数ABC.DEを10進数に変換'(X) :- 小数点を含む16進数の10進数への変換('ABC.DE',X). 小数点を含む16進数の10進数への変換(_16進文字列,_10進数) :- sub_atom(_16進文字列,S,1,RLen,'.'), sub_atom(_16進文字列,0,S,_,S_1), sub_atom(_16進文字列,S+1,RLen,_,S_2), '16進文字列表現を10進整数に変換'(S_1,N1), '16進文字列表現を10進整数に変換'(S_2,N2), Z is truncate(16 ^ RLen), _10進数 is N1 + N2 / Z. % '16進文字列表現を10進整数に変換'/2 は http://nojiriko.asia/prolog/c136_75.html 参照 % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1274791771/177 # # 質問させてください。 # # ・DBMS名とバージョン # MySQL 5.0.27-1 # # ・テーブルデータ # DATE    | DATA # ------------+---------- # 2010-06-01 | aaa # 2010-06-02 | bbb # 2010-06-03 | ccc # 2010-06-04 | ddd # 2010-06-05 | eee # 2010-06-06 | fff # 2010-06-07 | ggg # # ・欲しい結果 # 最新3件を昇順で。 # DATE    | DATA # ------------+---------- # 2010-06-05 | eee # 2010-06-06 | fff # 2010-06-07 | ggg # # ・説明 # select DATE, DATA from TABLE order by DATE desc limit 3; # とすれば、最新3件を降順で取得できますが、 # できれば降順でなく昇順で最新3件を取得したいです。 # # 'DATEの最新3件を昇順で取得する'(L) :- findsort([DATE],テーブル(DATE,DATA),L1), length(L,3), append(_,L,L1). findsort(_鍵ならび,P,_解ならび) :- P =.. [F|L1], append(_鍵ならび,L1,L2), findall(L2,P,L3), sort(L3,L4), findall(L1,member(L2,L4),_解ならび). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/955 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 以下のプログラムで、pointを昇順に並び替えるプログラムを作る。ソートの部分のみを書き換え、プログラムを作りなさい。 # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10713.txt # # struct data { # int car_num; # char name[MAX_LEN]; # char cons[MAX_LEN]; # char nationality[MAX_LEN]; # int birth; # double point; # }; % % ここでは単位節で定義された述語データベースの整列について考えよう。 % f1(1,'Jenson Button','McLaren','British',1980,106). f1(2,'Lewis Hamilton','McLaren','British',1985,109). f1(3,'Michael Schumacher','Mercedes GP','German',1969,34). f1(4,'Nico Rosberg','Mercedes GP','German',1985,74). f1(5,'Sebastian Vettel','Red Bull','German',1987,90). f1(6,'Mark Webber','Red Bull','Australian',1976,103). f1(7,'Felipe Massa','Ferrari','Brazilian',1981,67). f1(8,'Fernando Alonso','Ferrari','Spanish',1981,94). f1(9,'Rubens Barrichello','Williams','Brazilian',1972,7). f1(10,'Nico Hulkenberg','Williams','German',1987,1). f1(11,'Robert Kubica','Renault','Polish',1984,73). f1(12,'Vitaly Petrov','Renault','Russian',1984,6). f1(14,'Adrian Sutil','Force India','German',1983,23). f1(15,'Vitantonio Liuzzi','Force India','Italian',1981,12). f1(16,'Sebastien Buemi','Toro Rosso','Swiss',1988,5). f1(17,'Jaime Alguersuari','Toro Rosso','Spanish',1990,3). f1(18,'Jarno Trulli','Lotus','Italian',1974,0). f1(19,'Heikki Kovalainen','Lotus','Finnish',1981,0). f1(20,'Karun Chandhok','HRT','Indian',1984,0). f1(21,'Bruno Senna','HRT','Brazilian',1983,0). f1(22,'Pedro de la Rosa','BMW Sauber','Spanish',1971,0). f1(23,'Kamui Kobayashi','BMW Sauber','Japanese',1986,1). f1(24,'Timo Glock','Virgin','German',1982,0). f1(25,'Lucas di Grassi','Virgin','Brazilian',1984,0). pointを昇順に並び替える(L) :- clause_sort([1],f1/6,L). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% pointを昇順に並び替える(L) :- データ構造(f1,_データ構造ならび), list_nth(N,_データ構造ならび,[point|_]), length(_データ構造ならび,Len), length(L0,Len), P =.. [f1|L0], findall(L0,P,L1), findall([_point|L2],( member(L2,L1), list_nth(N,L2,_point)), L3), sort(L3,L4), findall(L5,member([_|L5],L4),L). データ構造ならび(f1,[[car_num],[name],[cons],[nationality],[birth],[point]]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% pointを昇順に並び替える(X) :- データ構造(f1,_データ構造ならび), list_nth(M,_データ構造ならび,[point|_]), length(_データ構造ならび,Len), clause_sort([M],f1/Len,X), %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% clause_sort(_順ならび,_関数 / _引数,X) :- functor(_頭部,_関数,_引数), findall(U,(clause(_頭部,_本体) , clause_sort_1(_順ならび,_頭部,_本体,U)),L), sort(L,L2), clause_sort_2(L2,X),!. clause_sort_1([],_頭部,_本体,[(_頭部 :- _本体)]) :- !. clause_sort_1([_鍵位置|R1],_頭部,_本体,[A|R2]) :- arg(_鍵位置,_頭部,A), clause_sort_1(R1,_頭部,_本体,R2). clause_sort_2([],[]) :- !. clause_sort_2([L|R1],[_頭部|R2]) :- last(L,(_頭部 :- true)), clause_sort_2(R1,R2), !. clause_sort_2([L|R1],[Q|R2]) :- last(L,Q), clause_sort_2(R1,R2),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/847 # # [1] 授業単元:繰り返し処理 # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10694.txt # # キーボードより整数値を繰り返して入力する。このとき、入力した値の合計を求め、 # 表示するプログラムを作成せよ。なお、この繰り返し処理は0(ゼロ)を入力したとき # に終了するものとする。 # # 実行例) # # 10 ← # 20 ←   キーボードからの入力(1,2行目:数値入力, 3行目:終了指 # # 0  ←    A # # 30 ←   ディスプレイへの出力(合計した結果) キーボードより整数値を繰り返して入力する。このとき、入力した値の合計を求め、表示する :- findsum(N,(repeat,get_integer(N),(N=0,!,fail;true)),_合計), _合計整数値 is truncate(_合計), write('%t\n',[_合計整数値]). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1274791771/139 # # 期間の抽出について相談です。 # 元情報 # ID    START    END # -----   -----    ----- # 10    2010/06/01  2010/06/12 # 10    2010/06/13  2010/06/14 # 10    2010/06/15  NULL # 20    2010/06/01  2010/06/11 # 20    2010/06/13  2010/06/15 # ↓ # 欲しい情報 # ID    START    END # -----   -----    ----- # 10    2010/06/01  NULL # 20    2010/06/01  2010/06/11 # 20    2010/06/13  2010/06/15 # # ・開始日、終了日の期間重複はなし # ・IDごとにデータを抽出。抽出単位は連続している期間の最小開始日と最大終了日 # ・期間は綺麗に連続(ID=10)することもあれば非連続することもある(ID=20) # # アドバイス願います。 # # 'IDごとにデータを抽出。抽出単位は連続している期間の最小開始日と最大終了日' :- findsetof(_ID,期間(_ID,_期間下限,_期間上限),L1), findall([_ID,_最小開始日,_最大終了日],( member(_ID,L1), findmin([_ID,_開始日],開始日(_ID,_開始日),_最小開始日), findmax([_ID,_終了日],終了日(_ID,_終了日),_最大終了日)), L). write('ID START END \n----- ----- ----- \n'), append(_,[[_ID,_Start,_End]|R],L), write_formatted('%t %t %t\n',[_ID,_Start,_End]), R = []. 開始日(_ID,_開始日) :- 期間(_ID,_開始日,_). 終了日(_ID,_終了日) :- 期間(_ID,_開始日,_終了日),\+(_終了日='NULL'). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/524 # # [1] 授業単元:データ構造 # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10662.txt # バケツソート(_整列されたならび) :- abolish('$temp'/2), findall(S,(for(1,_,2000),ランダムな文字列の発生(S)),L), バケツソート(L,_整列されたならび),!. バケツソート(L,_整列されたならび) :- バケツに吐き出す(L), findall(X,(鍵候補値を昇順に発生させる(S),バケツから拾い上げる(S,X)),_整列されたならび). 数値文字候補ならび(['0','1','2','3','4','5','6','7','8','9']). 鍵候補値を昇順に発生させる(S) :- 数値文字候補ならび(L), member(A,L),member(B,L),member(C,L),member(D,L),member(E,L), concat_atom([A,B,C,D,E],S). ランダムな文字列の発生(S) :- 数値文字候補ならび(L), findall(A,(for(1,_,5),M is (random mod 10) + 1,list_nth(M,L,A)),L2), concat_atom(L2,S),!. バケツに吐き出す([]) :- !. バケツに吐き出す([S|R]) :- retract('$temp'(S,L)), assertz('$temp'(S,[_|L])), バケツに吐き出す(R),!. バケツに吐き出す([N|R]) :- assertz('$temp'(S,[_])), バケツに吐き出す(R),!. バケツから拾い上げる(S,X) :- '$temp'(S,L1), all(L1,S), member(X,L1). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1274791771/96 # # 教えてください # table aから(dept,place)でのくくりでcount の次のレスに示すようにtop3を抽出したいです # # table a # dept|place|ext|count # aaaa|aaaaa|jar|10 # aaaa|aaaaa|com|4 # aaaa|aaaaa|scr|20 # aaaa|aaaaa|exe|80 # aaaa|aaaaa|bat|2 # aaaa|bbbbb|ace|10 # aaaa|bbbbb|arj|4 # aaaa|bbbbb|zip|20 # aaaa|bbbbb|rar|80 # aaaa|bbbbb|lzh|2 # bbbb|aaaaa|mdb|10 # bbbb|aaaaa|xls|4 # bbbb|aaaaa|ppt|20 # bbbb|aaaaa|doc|80 # bbbb|aaaaa|txt|2 # bbbb|bbbbb|gif|10 # bbbb|bbbbb|png|4 # bbbb|bbbbb|jpg|20 # bbbb|bbbbb|bmp|80 # bbbb|bbbbb|tif|2 # ↓ # aaaa|aaaaa|exe|80 # aaaa|aaaaa|scr|20 # aaaa|aaaaa|jar|10 # aaaa|bbbbb|rar|80 # aaaa|bbbbb|zip|20 # aaaa|bbbbb|ace|10 # bbbb|aaaaa|doc|80 # bbbb|aaaaa|ppt|20 # bbbb|aaaaa|mdb|10 # bbbb|bbbbb|bmp|80 # bbbb|bbbbb|jpg|20 # bbbb|bbbbb|gif|10 # 'table aからdept,placeのくくりでcountのtop3を抽出' :-     findsetof([_dept,_place],a(_dept,_place,_exit,_count)),     findall(X,findrsort([_count],a(_dept,_place,_ext,_count),X),L),     for(1,N,3),     list_nth(N,L,X),     write_formatted('%t|%t|%t|%t\n',X),     N = 3,     fail. 'table aからdept,placeのくくりでcountのtop3を抽出'. % findrsort/3,findsetof/2 は http://nojiriko.asia/prolog/findsort.html 参照 % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1274791771/39 # # # maindata # ----------------------------- # main_id | main_name | junle # ----------------------------- # 1000001 | aaaaaaaaa | 1 # 1000002 | bbbbbbbbb | 2 # 1000003 | ccccccccc | 1 # 1000004 | ddddddddd | 3 # 1000005 | eeeeeeeee | 1 # # itemdata # -------------------- # item_id | item_name # -------------------- # 9000001 | AAAAAAAAA # 9000002 | BBBBBBBBB # 9000003 | CCCCCCCCC # 9000004 | DDDDDDDDD # 9000005 | EEEEEEEEE # # itemlist # ------------------ # main_id | item_id # ------------------ # 1000001 | 9000001 # 1000001 | 9000004 # 1000002 | 9000002 # 1000002 | 9000005 # 1000004 | 9000002 # 1000004 | 9000004 # 1000004 | 9000005 # # という3つのテーブルがある場合に、maindata.junle='1'を条件に # main_id | main_name | itemlists # ---------------------------------------------------- # 1000001 | aaaaaaaaa | AAAAAAAAA DDDDDDDDD # 1000003 | ccccccccc | # 1000004 | eeeeeeeee | BBBBBBBBB DDDDDDDDD EEEEEEEEE # ---------------------------------------------------- # ※itemlistsは空白で連結 # # という結果を求めたいと思います。 # サブクエリを利用して一度に求めることは可能でしょうか? # それとも、アプリケーション側でループの際に都度itemlistsを生成する必要がありますでしょうか? # 'main_id | main_name | itemlists'(_main_id,_main_name,_itemlists) :- findsetof([_main_id,_main_name],( _junle='1', maindata(_main_id,_main_name,_junle)), L), member([_main_id,_main_name],L), findall(_item_name,( itemlist(_main_id,_item_id), itemdata(_item_id,_item_name)), _itemlists_1), concat_atom(_itemlists_1,' ',_itemlists). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1274791771/29 # # まったくわからないのです教えてください・・ # # 1、名前はわかっているが、コードが不明な商品の受注明細を照会するSELECT文を記述せよ。 # 副照会:商品名からコードを求めるSELECT文 # 主照会:商品コードから商品の受注明細を照会するSELECT文 # # 2、平均受注個数を超える商品に仕入れ先を照会するSELECT文を記述せよ。 # 副照会:商品の平均受注個数を求めるSELECT文 # 主照会:商品コード別に受注個数合計を求め、受注個数合計 > 平均受注個数であれば、仕入れ先を表示 # # 3、1月と2月に\50,000以上の注文があった顧客からの3月受注額を照会するSELECT文を記述せよ。 # 副照会:4月と5月に受注額合計が共に50000以上であるという条件をみたす顧客を照会 # 主照会:顧客別に6月の受注額合計を求めるSELECT文。 # # よろしくお願いいたします・ # 名前はわかっているが、コードが不明な商品の受注明細を照会する(_商品名,_受注明細) :- 商品名(_商品コード,_商品名), 受注明細(_顧客コード,_扱店コード,_受注日,_納品予定日,_商品コード,_荷姿,_数量,_単価,_金額,_入力時刻). '1月と2月に50,000以上の注文があった顧客からの3月受注額を照会する'(_顧客コード,_受注額) :- '1月と2月に50,000以上の注文があった顧客'(_顧客コード), findsum(_金額,(受注明細(_顧客コード,_,_受注日,_,_,_,_,_,_金額,_),sub_atom(_受注日,4,2,_,'03')),_受注額). '1月と2月に50,000以上の注文があった顧客'(_顧客コード) :- '1月に50000以上の注文があった顧客'(_1月に50000以上注文があった顧客コードならび), '2月に50000以上の注文があった顧客'(_2月に50000以上注文があった顧客コードならび), 積集合(_1月に50000以上注文があった顧客コードならび,_2月に50000以上注文があった顧客コードならび,_1月と2月に50000以上の注文があった顧客コードならび), member(_顧客コード,_1月と2月に50000以上の注文があった顧客コードならび). '1月に50000以上の注文があった顧客'(_1月に50000以上注文があった顧客コードならび), findsetof(_顧客番号,(受注明細(_顧客コード,_,_受注日,_,_,_,_,_,_金額,_),sub_atom(_受注日,5,2,'01')),_1月に注文があった顧客コードならび), findall(_顧客番号,( findsum(_金額,( member(_顧客番号,_1月に注文があった顧客コードならび), 受注明細(_顧客コード,_,_受注日,_,_,_,_,_,_金額,_), sub_atom(_受注日,4,2,_,'01')), _合計金額), _合計金額 > 50000), _1月に50000以上注文があった顧客コードならび),!. '2月に50000以上の注文があった顧客'(_2月に50000以上注文があった顧客コードならび), findsetof(_顧客番号,(受注明細(_顧客コード,_,_受注日,_,_,_,_,_,_金額,_),sub_atom(_受注日,5,2,'02')), _2月に注文があった顧客コードならび), findall(_顧客番号,( findsum(_金額,( member(_顧客番号,_2月に注文があった顧客コードならび), 受注明細(_顧客コード,_,_受注日,_,_,_,_,_,_金額,_), sub_atom(_受注日,4,2,_,'02')), _合計金額), _合計金額 > 50000), _2月に50000以上注文があった顧客コードならび),!. /* 平均受注個数を超える商品に仕入れ先を照会する(_商品コード,_顧客コード) :- 商品ごとの平均受注個数を調べる(_商品ごとの平均受注個数ならび), 平均受注個数を超える商品に仕入れ先を照会する(_商品ごと平均受注個数ならび,_商品コード,_顧客コード). 商品ごとの平均受注個数を調べる(_商品ごとの平均受注個数ならび) :- findall(_商品コード,商品名(_商品コード),_商品コードならび), findsetof([_顧客番号,_商品コード], 受注明細(_顧客コード,_,_,_,_商品コード,_,_,_,_,_), _顧客コード・商品コードならび), 荷姿変換(_荷姿,_数量,_数量_1,_単価,_単価_1,_金額,_金額_1), 荷姿変換(_荷姿,_数量,_数量,_単価,_単価,_金額,_金額) :- つまり荷姿変換は行わない. つまり荷姿変換は行わない. */ % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/960 # # ID|A|B|C| # --------- # 1 |1|2|3| # 2 |3|4|5| # 3 |7|8|9| (テーブルFOO) # # select FOO.ID,FOO.C from FOO,(select 1 AS EXPR) AS A # where FOO.A = A.EXPR or FOO.B = A.EXPR or FOO.C = A.EXPR; # # こんなかんじで得たCの内容を1のところにセットして # 該当するIDとCを全てリストアップするSQLはどう書けばよいでしょうか? # MySQL 5.0.67です。ストアドの作成権限はないです。 # # 'A,B,Cいずれかに1がある行の1のところにCをセットした行'(ID,A1,B1,C) :-     'FOO'(ID,A,B,C),     '1のところをCの値に置換'(A,B,C,A1,B1). '1のところをCの値に置換'(A,B,1,A,B) :- !. '1のところをCの値に置換'(1,1,C,C,C) :- !. '1のところをCの値に置換'(1,B,C,C,B) :- !. '1のところをCの値に置換'(A,1,C,A,C) :- !. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'A,B,Cいずれかに1がある行の1のところにCをセットした行'(ID,A1,B1,C) :-     'FOO'(ID,A,B,C),     '1のところをCの値に置換'(A,B,C,A1,B1). '1のところをCの値に置換'(A,B,1,A,B) :- !. '1のところをCの値に置換'(1,B,C,C,B1) :- '1のところをCの値に置換の一'(C,B,C,C,B1),!. '1のところをCの値に置換'(A,1,C,A1,C) :- '1のところをCの値に置換の一'(A,C,C,A1,C),!. '1のところをCの値に置換の一'(1,B,C,C,B1) :- '1のところをCの値に置換の一'(C,B,C,C,B1),!. '1のところをCの値に置換の一'(A,1,C,A1,C) :- '1のところをCの値に置換の一'(A,C,C,A1,C),!. '1のところをCの値に置換の一'(A,B,C,A,B). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/901 # # ../test/read.cgi/tech/1269438098/900 # こんな入力・出力例でいいの? # # Input: # # 2 # 1,1,murayama # 1,2,sugano # 3,3,koizumi # 3,4,abe # 5,5,hatoyama # 6,6,ozawa # # Output: # # #1 # Rep. Name: murayama # Rep. Attendance: 1 # Group: 001 # Group Attendance: 2 # # #2 # Rep. Name: koizumi # Rep. Attendance: 1 # Group: 003 # Group Attendance: 2 # 代表の生徒の名前、代表者の出席回数、グループメンバーの出席回数、グループの全体の出席回数の上位x番だけ出力する(_代表の生徒の名前,_代表者の出席回数,_グループメンバーの出席回数上位5位,_グループ全体の出席回数上位5位) :- findall([_代表の個人ID,_名前],生徒(_代表の個人ID,_代表の個人ID,_名前),_代表の個人ID・名前ならび), member([_代表の個人ID,_名前],_代表の個人ID・名前ならび), 代表者の出席回数(_代表の個人ID,_代表者の出席回数), グループメンバーの出席回数(_代表のID,_グループメンバーの出席回数ならび), グループメンバーの出席回数上位5位(_グループメンバーの出席回数ならび,グループメンバーの出席回数上位5位), グループ全体の出席回数(_代表のID,_グループ全体の出席回数ならび), グループ全体の出席回数上位5位(_グループ全体の出席回数ならび,グループ全体の出席回数上位5位). 代表者の出席回数(_代表の個人ID,_代表者の出席回数) :- count(出席者(_代表の個人ID),_代表者の出席回数). グループメンバーの出席回数(_代表のID,_グループメンバーの出席回数ならび) :- findsetof(_個人ID,(生徒(_代表のID,_個人ID,_),\+(_代表のID=_個人のID)),_グループメンバーならび), findall([_出席回数,_個人ID], ( member(_個人ID,_グループメンバーならび), count(出席者(_個人ID),_出席回数)), _グループメンバーの出席回数ならび),!. グループ全体の出席回数(_代表のID,_グループメンバーの出席回数ならび) :- findsetof(_個人ID,生徒(_代表のID,_個人ID,_),_グループメンバーならび), findall([_出席回数,_個人ID], ( member(_個人ID,_グループメンバーならび), count(出席者(_個人ID),_出席回数)), _グループ全体の出席回数ならび),!. グループメンバーの出席回数上位N位(N,_グループメンバーの出席回数ならび,_グループメンバーの出席回数上位5位) :- 大きい順に上位N位(N,_グループメンバーの出席回数ならび,_グループメンバーの出席回数上位5位). グループ全体の出席回数上位N位(N,_グループ全体の出席回数ならび,_グループ全体の出席回数上位5位) :- 大きい順に上位N位(N,_グループ全体の出席回数ならび,_グループ全体の出席回数上位5位). 大きい順に上位N位(L1,L) :- sort(L1,L2), reverse(L2,L3), length(L,N), append(L,_,L3),!. 大きい順に上位N位(L1,L) :- sort(L1,L2), reverse(L2,L),!. キーボードから代表者のID,個人のID,名前を入力するものとし、グループメンバーは代表者のIDでのみで関連付けされる :- キーボードから代表者のID,個人のID,名前を入力する(_代表者のID,_個人のID,_名前), assertz(生徒(_代表者のID,_個人のID,_名前)), キーボードから代表者のID,個人のID,名前を入力するものとし、グループメンバーは代表者のIDでのみで関連付けされる. キーボードから代表者のID,個人のID,名前を入力するものとし、グループメンバーは代表者のIDでのみで関連付けされる. キーボードから代表者のID,個人のID,名前を入力する(_代表者のID,_個人のID,_名前) :- get_split_line([','],[_代表者のID,_個人のID,_名前]). 出席者の入力 :- get_line(Line), atom_to_term(Line,_個人ID,_), integer(_個人ID), assertz(出席者(_個人ID)), 出席者の入力. 出席者の入力. % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/933 # # DEFENDANT  GUILT  JOROR # -----------+-------+-------- # HOGE      | 1     | FOO # HOGE      | 0     | BAR # HOGE      | 1     | BAZ # FUGA     | 1     | FOO # FUGA     | 1     | BAR # FUGA     | 1     | BAZ     (T_JUDGEテーブル) # # 上記のテーブルにDEFENDANTで絞込をかけた結果、GUILTに一つでも0がある場合 # 1行も取得せず、全部1の場合はそのまま一覧を返す場合どのようなSQLを書けば # よいでしょうか?この場合、HOGEで絞り込むと0行、FUGAなら3行と言う具合です。 # # DBMSはMySQL5.0.67です。 # # 'T_JUDGEテーブル'('HOGE',1,'FOO'). 'T_JUDGEテーブル'('HOGE',0,'BAR'). 'T_JUDGEテーブル'('HOGE',1,'BAZ'). 'T_JUDGEテーブル'('FUGA',1,'FOO'). 'T_JUDGEテーブル'('FUGA',1,'BAR'). 'T_JUDGEテーブル'('FUGA',1,'BAZ'). 'T_JUDGEテーブルにDEFENDANTで絞込をかけた結果、GUILTに一つでも0がある場合1行も取得せず、全部1の場合はそのまま一覧を返す'(_DEFENDANT,_GUILT,_JOROR) :- findsetof(_DEFENDANT,('T_JUDGEテーブル'(_DEFENDANT,_GUILT,_JOROR),\+(_GUILT=0)),L1), findsetof(_DEFENDANT,('T_JUDGEテーブル'(_DEFENDANT,_GUILT,_JOROR),_GUILT=0),L2), 差集合(L1,L2,L3), member(_DEFENDANT,L3), T_JUDGEテーブル(_DEFENDANT,_GUILT,_JOROR). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/801 # # [1] 授業単元:プログラミング演習 # [2] 問題文: # テストの点数を入力し合計点、平均点、受験者数、合格者数を表示するプログラムを作成しなさい。ただし、データの終わりの999(999点と表示しない)合格者は60点以上 # 実行例 # # 84         <--キーボードから点数入力 # 84点        <--入力した点数を表示 # 95 # 95点 # 48 # 48点 # 66 # 66点 # 80 # 80点 # 999     <--データの終わり(999点とは表示しない) # 合計点=373点 # 平均点=74.6点 # 受験者数=5名 # 合格者数=4名 # キーボードから点数入力 テストの点数を入力し合計点、平均点、受験者数、合格者数を表示するプログラムを作成しなさい。ただし、データの終わりの999(999点と表示しない)合格者は60点以上 :- 'テストの点数を入力し、ただし、データの終わりの999(999点と表示しない)'(_点数ならび), 合計点(_点数ならび,_合計点), 受験者数(_点数ならび,_受験者数), 合格者数(_点数ならび,_合格者数), 表示する('合計点=%t\n平均点=%t点\n受験者数=%t\n合格者数=%t\n',[_合計点,_平均点,_受験者数,合格者数]). 'テストの点数を入力し、ただし、データの終わりの999(999点と表示しない)'(_点数ならび) :- キーボードから点数入力('点数を入力してください(データの終わりの999) : ',_点数), 'テストの点数を入力し、ただし、データの終わりの999(999点と表示しない)'(_点数,_点数ならび). 'テストの点数を入力し、ただし、データの終わりの999(999点と表示しない)'(_点数,[]) :- 'ただし、データの終わりの999(999点と表示しない)'(_点数),!. 'テストの点数を入力し、ただし、データの終わりの999(999点と表示しない)'(_点数,[_点数|R]) :- 入力した点数を表示(_点数), キーボードから点数入力(_次の点数), 'テストの点数を入力し、ただし、データの終わりの999(999点と表示しない)'(_次の点数,R). キーボードから点数入力('点数を入力してください(データの終わりの999) : ',_点数) :- 催促付き整数入力('点数を入力してください(データの終わりの999) : ',_点数). キーボードから点数入力(_点数) :- get_integer(_点数). 入力した点数を表示(_点数) :- write_formatted('%t点\n',[_点数]). 'ただし、データの終わりの999(999点と表示しない)'(999). 合計点(_点数ならび,_合計点) :- 加算(_点数ならび,_合計点_浮動小数点),_合計点 is truncate(_合計点_浮動小数点数), 平均点(_点数ならび,_平均点) :- 平均(_点数ならび,_平均点). 受験者数(_点数ならび,_受験者数) :- length(_点数ならび,_受験者数). 合格者数(_点数ならび,_合格者数) :- 度数((member(_点数,_点数ならび),_点数>=60),_合格者数). 表示する(Format,_値ならび) :- write_formatted(Format,_値ならび). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 加算(trunc(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A is trunc(B)),SL),!. 加算(四捨五入(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A は 四捨五入(B)),SL),!. 加算(切捨て(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A は 切捨て(B)),SL),!. 加算(切り上げ(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A は 切り上げ(B)),SL),!. 加算([],L) :- var(L), 合計は原則として浮動小数点数, L = 0.0e+00,!. 加算([],L) :- var(L), 合計は原則として整数, L = 0,!. 加算([],L) :- \+(var(L)), 加算の変数に零をおく(L),!. 加算([L|R],SL) :- ならび(L), 転置([L|R],L1), 加算_2(L1,SL),!. 加算(X,S) :- 加算_1(X,0.0e+00,S). 全て整数([]) :- !. 全て整数([N|R]) :- integer(N),全て整数(R). 平均(L,Avg) :- list(L),findavg(A,member(A,L),Avg). 度数(A,[],0). 度数(A,[A|R],X) :- 度数(A,R,Y),X is Y + 1. 度数(A,[_|R],X) :- 度数(A,R,X). 度数(P,N) :- findsum(1,P,F),N is truncate(F). findavg(_集約項,_項,_算術平均) :- findall(_集約項,_項,_値ならび), 加算(_値ならび,_合計値), list_length(_値ならび,_ならびの長さ), _算術平均 is _合計値 / _ならびの長さ,!. 合計は原則として浮動小数点数. % 合計は原則として整数. % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/922 # # 売上データベースがあって、主テーブルの項目は、売上番号、得意先名、日付。 # 明細テーブルの項目は、明細番号、売上番号、商品、個数。売上番号で1対多でリンクしています。 # 商品(複数)と日付を指定して、 商品名 個数計 得意先計の一覧を出力したいです。 # ただし得意先名は同名を1とカウントしたいのです。 # SELECT 明細.商品, Sum(明細.個数) AS 個数計, Count(主.得意先) AS 得意先計 # FROM 主 INNER JOIN 明細 ON 主.売上番号 = 明細.売上番号 # WHERE 主.日付 Between '5/1/2010' And '5/4/2010' # GROUP BY 明細.商品 # HAVING 明細.商品='えんぴつ' or 明細.商品='筆'; # とすると、得意先計が複数カウント(同名は1とならない)してしまいます。 # どのように書いたらよいのでしょうか。 # '商品(複数)と日付を指定して、 商品名 個数計 得意先計の一覧を出力する'(_商品ならび,_日付下限,_日付上限,X) :- findall([_商品,_個数,_得意先名],(主(_売上番号,_得意先名,_日付),明細(_明細番号,_売上番号,_商品,_個数),member(_商品,_商品ならび),_日付@>=_日付下限,_日付@=<_日付上限),_選択ならび), findsetof([_商品,_得意先名],member([_商品,_個数,_得意先名],_選択ならび),_鍵ならび), findall([_商品,_個数計,_得意先名],(member([_商品,_得意先名],_鍵ならび),findsum(_個数,member([_商品,_個数,_得意先名],_選択ならび),_個数計)),X). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/771 # # [1] C言語演習 # [2] n科目の点数を入力してGPAを出す(100~90が4,80~89は3,70~79は2,60~69は # 1,60以下は0) # 科目(1,'prolog初級'). 科目(2,'自然言語の論理学'). 科目(3,'関数型言語'). 科目(4,'C#講習'). 科目のグレード・ポイント(1,4.0). 科目のグレード・ポイント(2,4.0). 科目のグレード・ポイント(3,2.0). 科目のグレード・ポイント(4,1.0). 点数評価値(_点数,4) :- _点数 >= 90,_点数 =< 100,!. 点数評価値(_点数,3) :- _点数 >= 80,_点数 < 90,!. 点数評価値(_点数,2) :- _点数 >= 70,_点数 < 80,!. 点数評価値(_点数,1) :- _点数 >= 60,_点数 < 70,!. 点数評価値(_点数,0) :- _点数 < 60,!. '点数を入力してGPAを出す(100~90が4,80~89は3,70~79は2,60~69は1,60以下は0)'(GPA) :- write('科目番号をリストで入力しなさい : ), read(_科目番号ならび), 点数を入力する(_科目番号ならび,_点数ならび), 'GPAの計算'(_点数ならび,GPA). 点数を入力する([],[]) :- !. 点数を入力する([_科目番号|R1],[[_科目番号,_点数]|R2]) :- 科目(_科目番号,_科目), write_formatted('%tの点数を入力してください : '), get_integer(_点数), 点数を入力する(R1,R2). 'GPAの計算'(_点数ならび,GPA) :- findsum(_科目のグレード・ポイント,科目のグレード・ポイント(_,_科目のグレード・ポイント),_科目のグレード・ポイントの合計), 'GPAの計算'(_点数ならび,0.0,X), GPA is X / _科目のグレード・ポイントの合計. 'GPAの計算'([],X,X) :- !. 'GPAの計算'([[_科目番号,_点数]|R1],S1,S2) :- 点数評価値(_点数,_点数評価値), 科目のグレード・ポイント(_科目番号,_科目のGP値), S2 is S1 + _点数評価値 * _科目のGP値, 'GPAの計算'([[_科目番号,_点数]|R1],S1,S2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/685 # # 1] 授業単元: プログラム演習 # [2] 問題文(含コード&リンク): # 下記のような成績があった時、各科目の平均、各学生の合計点の偏差値、科目毎の相関係数を求めるプログラムを配列を用いて実装しなさい。 # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10601.txt # # 名前   点数 #     英語 数学 物理  # 学生1 80 50 60 # 学生2 60 70 80 # 学生3 50 80 90 # 学生4 60 75 80 # 学生5 50 90 75 # # 名前   点数 #     英語 数学 物理  値位置(名前,[_名前,_,_,_],_名前). 値位置(英語,[_,_英語,_,_],_英語). 値位置(数学,[_,_,_数学,_],_数学). 値位置(物理,[_,_,_,_物理],_物理). 成績(学生1,80,50,60). 成績(学生2,60,70,80). 成績(学生3,50,80,90). 成績(学生4,60,75,80). 成績(学生5,50,90,75). 各科目の平均(_各科目の平均) :- findall([_科目,_科目の平均],( 値位置(_科目,[A,B,C,D],_点数), \+(_科目=名前), findavg(_点数,成績(A,B,C,D),_科目の平均)), _各科目の平均). 各学生の合計点の偏差値(_各学生の合計点の偏差値) :- findall(_名前,成績(_名前,_,_,_),_名前ならび), 標本を集める(_母集合), 偏差値(_母集合,_偏差値ならび), 名前と符合させる(_名前ならび,_偏差値ならび,_各学生の合計点の偏差値). 偏差値(_母集合,_偏差値ならび) :- 相加平均(_母集合,_算術合計), 標準偏差(_母集合,_標準偏差), findall(_偏差値,(member(_値,_母集合),偏差値(_値,_相加平均,_標準偏差,_偏差値)),_偏差値ならび). 偏差値(_標本値,_相加平均,_標準偏差,_偏差値) :- _偏差値 is 10 * (_標本値 - _相加平均) / _標準偏差 + 50.0. 各学生の合計点の総和(_合計点の総和) :- findsum(_各学生の合計点,各学生の合計点(_,_各学生の合計点),_合計点の総和). 各学生の合計点(_名前,_各学生の合計点) :- 成績(_名前,_英語,_数学,_物理), _各学生の合計点 is _英語 + _数学 + _物理. 標本を集める(_母集合) :- findall(_各学生の合計点,各学生の合計点(_,_各学生の合計点),_母集合). 名前と符合させる([],[],[]) :- !. 名前と符合させる([A|R1],[B|R2],[[A,B]|R3]) :- 名前と符合させる(R1,R2,R3). 科目間の相関係数(_科目1,_科目2,_相関係数) :- findall(_点数,(成績(A,B,C,D),値位置(_科目1,[A,B,C,D],_点数)),_科目1の点数ならび), findall(_点数,(成績(A,B,C,D),値位置(_科目2,[A,B,C,D],_点数)),_科目2の点数ならび), 相関係数(_科目1のならび,_科目2の点数ならび,_相関係数). 相関係数(_科目1の点数ならび,_科目2の点数ならび,_相関係数) :- length(_科目1の点数ならび,Len), 相加平均(_科目1の点数ならび,_科目1の相加平均), 相加平均(_科目2の点数ならび,_科目2の相加平均), 共分散(_科目1の点数ならび,_科目2の点数ならび,_共分散), 標準偏差(_科目1の点数ならび,Len,_科目1の相加平均,0.0,_科目1の標準偏差), 標準偏差(_科目2の点数ならび,Len,_科目2の相加平均,0.0,_科目2の標準偏差), _相関係数 is _共分散 / (_科目1の標準偏差 * _科目2の標準偏差). 共分散(_標本ならび1,_標本ならび2,_共分散) :- length(_標本ならび1,Len), length(_標本ならび2,Len), 相加平均(_標本ならび1,_標本ならび1の相加平均), 相加平均(_標本ならび2,_標本ならび2の相加平均), 共分散(_標本ならび1,_標本ならび2,Len,_標本ならび1の相加平均,_標本ならび2の相加平均,0.0,_共分散). 共分散([],[],Len,_,_,S,_共分散) :- _共分散 is S / Len,!. 共分散([A|R1],[B|R2],Len,_相加平均1,_相加平均2,S1,_共分散) :- U is (A-_相加平均1) * (B-_相加平均2), S2 is S1 + U, 共分散(R1,R2,Len,_相加平均1,_相加平均2,S2,S),!. % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/908 # # MySQL 5.1 # # TEAMが1 で、 # NAMEにaを含むデータを上位にして、 # SCOREの多い順に取り出したいのですが、 # どう書けばいいですか?お願いします。 # # これを # ID|TEAM|NAME|SCORE # --+----+----+----- # 1 | 1  | aaa | 200 # 2 | 2  | abb | 50 # 3 | 1  | ccc | 300 # 4 | 1  | daa | 400 # 5 | 1  | eae | 100 # 6 | 1  | fff  | 800 # # ↓こうしたい # ID|TEAM|NAME|SCORE # --+----+----+----- # 4 | 1  | daa | 400 # 1 | 1  | aaa | 200 # 5 | 1  | eae | 100 # 6 | 1  | fff  | 800 # 3 | 1  | ccc | 300 # 'TEAMが1でSCOREの多い順に取り出したい'(_SCOREの多い順ならび) :- 'TEAMが1でNAMEにaを含むデータを上位にして'(_aを含む鍵付きデータ,_aを含まない鍵付きデータ), 'SCOREの多い順に取り出したい'(_aを含む鍵付きデータ,_aを含まない鍵付きデータ,_SCOREの多い順ならび),!. 'SCOREの多い順に取り出したい'(_aを含む鍵付きデータ,_aを含まない鍵付きデータ,_SCOREの多い順ならび) :- 降順整列(_aを含む鍵付きデータ,_降順に整列したaを含む鍵付きデータ), 降順整列(_aを含まない鍵付きデータ,_降順に整列したaを含まない鍵付きデータ), 鍵を除去しながら結合する(_降順に整列したaを含む鍵付きデータ,_降順に整列したaを含まない鍵付きデータ,_SCOREの多い順ならび). 'TEAMが1でNAMEにaを含むデータを上位にして'(_aを含む鍵付きデータ,_aを含まない鍵付きデータ) :- findall([SCORE,ID,1,NAME,SCORE],(テーブル(ID,1,NAME,SCORE),'NAMEにaを含む(NAME)),_aを含む鍵付きデータ), findall([SCORE,ID,1,NAME,SCORE],(テーブル(ID,1,NAME,SCORE),\+('NAMEにaを含む'(NAME))),_aを含まない鍵付きデータ),!. 'NAMEにaを含む'(NAME) :- sub_atom(NAME,_,1,_,a),!. 鍵を除去しながら結合する([],[],[]) :- !. 鍵を除去しながら結合する([],Y,X) :- 鍵を除去しながら結合する(Y,[],X),!. 鍵を除去しながら結合する([[_|L]|R1],Y,[L|Z]) :- 鍵を除去しながら結合する(R1,Y,Z). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1269585561/10 # # ある会社では有給の最大取得可能日数を申請日の前年同日の翌日から申請日までに # 取得した有給日数の合計としています。しかしこの有給日数は欠勤や遅刻、早退に # よって減価します。この場合はマイナスの日数として入力されています。 # 一年以上前の取得有給日数は無効になるルールで有給の最大取得可能日数を示す # プログラムを書きなさい。 # # 有給テーブル # 個人ID # 取得日 # 日数 # 摘要 # 申請日の前年同日の翌日から申請日までに取得した有給日数の合計(_個人ID,_申請日,_有給の最大取得日数) :- 前年同日(_申請日,_前年同日), findsum(_日数,( 有給テーブル(_個人ID,_取得日,_日数,_), _取得日 @> _前年同日, _取得日 @=< _申請日), _有給の最大取得日数). 前年同日(_今日,_前年同日) :- sub_atom(_今日,4,4,_,'0229'), 前年(_今日,_前年), concat_atom([_前年,'0228'],_前年同日),!. 前年同日(_今日,_前年同日) :- 前年(_今日,_前年), sub_atom(_今日,_月日), concat_atom([_前年,_月日],_前年同日),!. 前年(_今日,_前年) :- sub_atom(_今日,0,4,_,_今年), atom_to_term(_今年,_今年整数,_), _前年整数 is _今年整数 - 1, swritef(_前年,'%t',[_前年整数]). % 以下のサイトは findsort(_集約項,_集約対象項,P,_射影項) :- findsetof(_集約項,P), append(_集約対象項,_射影項,L1), findall(L1,P,L2), sort(L2,L3), append(_集約対象項,_射影項,L), member(L,L3). findrsort(_集約項,_集約対象項,P,_射影項) :- findsetof(_集約項,P), append(_集約対象項,_射影項,L1), findall(L1,P,L2), sort(L2,L3), reverse(L3,L4), append(_集約対象項,_射影項,L), member(L,L4). findsort(_集約対象項,P,_射影項) :- append(_集約対象項,_射影項,L1), findall(L1,P,L2), sort(L2,L3), append(_集約対象項,_射影項,L), member(L,L3). findrsort(_集約対象項,P,_射影項) :- append(_集約対象項,_射影項,L1), findall(L1,P,L2), sort(L2,L3), reverse(L3,L4), append(_集約対象項,_射影項,L), member(L,L4). findsetof(A,B,L) :- findall(A,B,C), setof(A,member(A,C),L). findsetof(A,B) :- findall(A,B,C), setof(A,member(A,C),D), member(A,D). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/426 # # [1] 授業単元:プログラム # [2] 問題文(含コード&リンク):sample.txtを読み込み、データを身長の小さい人から順番に並び変えてans.txtに出力せよ。 # # sample.txtの中身はこんな感じです。 # 12 ヤマダタロウ 56.7 165.1 # 43 タナカハナコ 44.3 156.8 # 54 スズキイチロウ 70.3 179.2 # 左から番号、名前、体重、身長です # %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 鍵項目位置(身長,[_,_,_,_身長],[_身長]). % 鍵項目位置(体重,[_,_,_体重,_],[_体重]). % 鍵項目位置(身長・体重,[_,_,_体重,_身長],[_身長,_体重]). '鍵項目順に整列(昇順)の一般解'(Ls,_鍵名,_整列されたLs) :- findall(L2,(member(L1,Ls),先頭に鍵項目を付加する(_鍵名,L1,L2)),Ls2), sort(Ls2,Ls3), findall(L4,(member(L3,Ls3),先頭の鍵項目を除去する(_鍵名,L3,L4)),_整列されたLs). 先頭に鍵項目を付加する(_鍵名,L1,L2) :- 鍵項目位置(_鍵名,L1,L0), append(L0,L1,L2). 先頭の鍵項目を除去する(_鍵名,L1,L2) :- 鍵項目位置(_鍵名,L2,L0), append(L0,L2,L1). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/426 # # [1] 授業単元:プログラム # [2] 問題文(含コード&リンク):sample.txtを読み込み、データを身長の小さい人から順番に並び変えてans.txtに出力せよ。 # # sample.txtの中身はこんな感じです。 # 12 ヤマダタロウ 56.7 165.1 # 43 タナカハナコ 44.3 156.8 # 54 スズキイチロウ 70.3 179.2 # 左から番号、名前、体重、身長です # 'sample.txtを読み込み、データを身長の小さい人から順番に並び変えてans.txtに出力せよ' :-    get_split_lines('sample.txt',[' '],Ls),    findall([_身長|L1],(member(L1,Ls),list_nth(4,L1,_身長)),Ls2),    sort(Ls2,Ls3),    findall(L2,member([_|L2],Ls3),_整列されたLs),    put_lines('ans.txt',_整列されたLs). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 鍵項目位置(身長,[_,_,_,_身長],[_身長]). % 鍵項目位置(体重,[_,_,_体重,_],[_体重]). % 鍵項目位置(身長・体重,[_,_,_体重,_身長],[_身長,_体重]). '鍵項目順に整列(昇順)の一般解'(Ls,_鍵名,_整列されたLs) :- findall(L2,(member(L1,Ls),先頭に鍵項目を付加する(_鍵名,L1,L2)),Ls2), sort(Ls2,Ls3), findall(L4,(member(L3,Ls3),先頭の鍵項目を除去する(_鍵名,L3,L4)),_整列されたLs). 先頭に鍵項目を付加する(_鍵名,L1,L2) :- 鍵項目位置(_鍵名,L1,L0), append(L0,L1,L2). 先頭の鍵項目を除去する(_鍵名,L1,L2) :- 鍵項目位置(_鍵名,L2,L0), append(L0,L2,L1). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/823 # # mysql 5.1.38 # # table inputdaka # code int # inputdate date # data1 int # data2 int # # 指定された日(その日が存在しなければ直前の日付)及びその前日の # データを得る # # select inputdate,data1,data2 # from inputdaka # where code= 9999 # and # inputdate <= '2010-04-10' # order by inputdate desc limit 2; # # mysqlで、こう書きましたが、limitが使えないRDBでは # どうなるんですか? # '指定された日(その日が存在しなければ直前の日付)及びその前日のデータを得る'(_指定された日,_code,_inputdate,_data1,_data2) :- inputdaka(_code,_指定された日,_data1,_data2), _inputdate = _指定された日,!. '指定された日(その日が存在しなければ直前の日付)及びその前日のデータを得る'(_指定された日,_code,_inputdate,_data1,_data2) :- 前日(_指定された日,_前日), inputdaka(_code,_前日,_data1,_data2), _inputdate = _前日,!. '指定された日(その日が存在しなければ直前の日付)及びその前日のデータを得る'(_指定された日,_code,_inputdate,_data1,_data2) :- 前日(_指定された日,_前日), 前日(_前日,_前々日), inputdaka(_code,_前々日,_data1,_data2), _inputdate = _前々日,!. % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/817 # # [テーブルA] # ID, AGE, GROUP # --- ---- ----- # 1 , 10, A # 2 , 20, A # 3 , 30, A # 4 , 20, B # 5 , 40, B # 6 , 60, B # 7 , 10, C # 8 , 30, C # 9 , 50, C # 10 , 70, C # # ↑のテーブルから、 # 各GROUP毎にAGEで順位付けした結果を取得したいです。 # # <結果> # # ID, AGE, GROUP, RANK # --- ---- ----- ----- # 1 , 10, A 1 # 2 , 20, A 2 # 3 , 30, A 3 # 4 , 20, B 1 # 5 , 40, B 2 # 6 , 60, B 3 # 7 , 10, C 1 # 8 , 30, C 2 # 9 , 50, C 3 # 10 , 70, C 4 # # # GROUP BYを使ってみたのですが、 # どうも見当違いのSQLになってしまって。。 # # すいませんが、どのようなSQLを書けばよいかご教示ください。 # '各GROUP毎にAGEで順位付けした結果を取得'(X) :- findsetof(Group,'テーブルA'(_,_,Group),L1), '各GROUP毎にAGEで順位付けした結果を取得'(1,L1,X). '各GROUP毎にAGEで順位付けした結果を取得'(_,[],[]) :- !. '各GROUP毎にAGEで順位付けした結果を取得'(M,[Group|R1],X) :- findall([Age,Group],'テーブルA'(_,Age,Group),L2), 整列(L2,L3), 順序づけ(M,M2,1,L3,L4), '各GROUP毎にAGEで順位付けした結果を取得'(M2,R1,Y), append(L4,Y,X). 順序づけ(M,M,_,[],[]) :- !. 順序づけ(M,MX,N,[[Age,Group]|R1],[M,Age,Group,N|R2]) :- N2 is N + 1, M2 is M + 1, 順序づけ(M2,MX,N2,R1,R2). % 以下のサイトは % *** user: '西暦和暦変換' / 2 *** '西暦和暦変換'(_西暦年,_和暦年) :- atomic(_和暦年), \+(atomic(_西暦年)), atom_chars(_和暦年,L), '年漢字表現'(N,L2), append(L3,L2,L), concat_atom(L3,_元号), concat_atom(L2,_年), '西暦和暦表'(_西暦年,_元号,N,_). '西暦和暦変換'(_西暦年,_和暦年) :- atomic(_西暦年), \+(atomic(_和暦年)), '西暦和暦表'(_西暦年,_元号,_年,_), '年漢字表現'(_年,_年漢字表現文字ならび), concat_atom(_年漢字表現文字ならび,_年漢字表現), concat_atom([_元号,_年漢字表現],_和暦年). '西暦和暦変換'(_西暦年,_和暦年) :- var(_西暦年), var(_和暦年), '西暦和暦表'(_西暦年,_元号,_年,_), '年漢字表現'(_年,_年漢字表現文字ならび), concat_atom(_年漢字表現文字ならび,_年漢字表現), concat_atom([_元号,_年漢字表現],_和暦年). '西暦和暦変換'(_西暦年,_和暦年) :- var(_西暦年), var(_和暦年), '西暦和暦表'(_西暦年,_元号,_年,_), '年漢字表現'(_年,_年漢字表現文字ならび), concat_atom(_年漢字表現文字ならび,_年漢字表現), concat_atom([_元号,_年漢字表現],_和暦年). '西暦和暦変換'(_西暦年,_和暦年) :- atomic(_西暦年), atom(_和暦年), '西暦和暦表'(_西暦年,_元号,_年,_), '年漢字表現'(_年,_年漢字表現文字ならび), concat_atom(_年漢字表現文字ならび,_年漢字表現), concat_atom([_元号,_年漢字表現],_和暦年). 西暦和暦表(645,大化,1,[]). 西暦和暦表(646,大化,2,[]). 西暦和暦表(647,大化,3,[]). 西暦和暦表(648,大化,4,[]). 西暦和暦表(649,大化,5,[]). 西暦和暦表(650,大化,6,[]). 西暦和暦表(650,白雉,1,[]). 西暦和暦表(651,白雉,2,[]). 西暦和暦表(652,白雉,3,[]). 西暦和暦表(653,白雉,4,[]). 西暦和暦表(654,白雉,5,[]). 西暦和暦表(686,朱鳥,1,[]). 西暦和暦表(687,朱鳥,2,[]). 西暦和暦表(701,大宝,1,[]). 西暦和暦表(702,大宝,2,[]). 西暦和暦表(703,大宝,3,[]). 西暦和暦表(704,大宝,4,[]). 西暦和暦表(704,慶雲,1,[]). 西暦和暦表(705,慶雲,2,[]). 西暦和暦表(706,慶雲,3,[]). 西暦和暦表(707,慶雲,4,[]). 西暦和暦表(708,慶雲,5,[]). 西暦和暦表(708,和銅,1,[]). 西暦和暦表(709,和銅,2,[]). 西暦和暦表(710,和銅,3,[]). 西暦和暦表(711,和銅,4,[]). 西暦和暦表(712,和銅,5,[]). 西暦和暦表(713,和銅,6,[]). 西暦和暦表(714,和銅,7,[]). 西暦和暦表(715,和銅,8,[]). 西暦和暦表(715,霊亀,1,[]). 西暦和暦表(716,霊亀,2,[]). 西暦和暦表(717,霊亀,3,[]). 西暦和暦表(717,養老,1,[]). 西暦和暦表(718,養老,2,[]). 西暦和暦表(719,養老,3,[]). 西暦和暦表(720,養老,4,[]). 西暦和暦表(721,養老,5,[]). 西暦和暦表(722,養老,6,[]). 西暦和暦表(723,養老,7,[]). 西暦和暦表(724,養老,8,[]). 西暦和暦表(724,神亀,1,[]). 西暦和暦表(725,神亀,2,[]). 西暦和暦表(726,神亀,3,[]). 西暦和暦表(727,神亀,4,[]). 西暦和暦表(728,神亀,5,[]). 西暦和暦表(729,神亀,6,[]). 西暦和暦表(729,天平,1,[]). 西暦和暦表(730,天平,2,[]). 西暦和暦表(731,天平,3,[]). 西暦和暦表(732,天平,4,[]). 西暦和暦表(733,天平,5,[]). 西暦和暦表(734,天平,6,[]). 西暦和暦表(735,天平,7,[]). 西暦和暦表(736,天平,8,[]). 西暦和暦表(737,天平,9,[]). 西暦和暦表(738,天平,10,[]). 西暦和暦表(739,天平,11,[]). 西暦和暦表(740,天平,12,[]). 西暦和暦表(741,天平,13,[]). 西暦和暦表(742,天平,14,[]). 西暦和暦表(743,天平,15,[]). 西暦和暦表(744,天平,16,[]). 西暦和暦表(745,天平,17,[]). 西暦和暦表(746,天平,18,[]). 西暦和暦表(747,天平,19,[]). 西暦和暦表(748,天平,20,[]). 西暦和暦表(749,天平,21,[]). 西暦和暦表(749,天平感宝,1,[]). 西暦和暦表(749,天平勝宝,1,[]). 西暦和暦表(750,天平勝宝,2,[]). 西暦和暦表(751,天平勝宝,3,[]). 西暦和暦表(752,天平勝宝,4,[]). 西暦和暦表(753,天平勝宝,5,[]). 西暦和暦表(754,天平勝宝,6,[]). 西暦和暦表(755,天平勝宝,7,[]). 西暦和暦表(756,天平勝宝,8,[]). 西暦和暦表(757,天平勝宝,9,[]). 西暦和暦表(757,天平宝字,1,[]). 西暦和暦表(758,天平宝字,2,[]). 西暦和暦表(759,天平宝字,3,[]). 西暦和暦表(760,天平宝字,4,[]). 西暦和暦表(761,天平宝字,5,[]). 西暦和暦表(762,天平宝字,6,[]). 西暦和暦表(763,天平宝字,7,[]). 西暦和暦表(764,天平宝字,8,[]). 西暦和暦表(765,天平宝字,9,[]). 西暦和暦表(765,天平神護,1,[]). 西暦和暦表(766,天平神護,2,[]). 西暦和暦表(767,天平神護,3,[]). 西暦和暦表(767,神護景雲,1,[]). 西暦和暦表(768,神護景雲,2,[]). 西暦和暦表(769,神護景雲,3,[]). 西暦和暦表(770,神護景雲,4,[]). 西暦和暦表(770,宝亀,1,[]). 西暦和暦表(771,宝亀,2,[]). 西暦和暦表(772,宝亀,3,[]). 西暦和暦表(773,宝亀,4,[]). 西暦和暦表(774,宝亀,5,[]). 西暦和暦表(775,宝亀,6,[]). 西暦和暦表(776,宝亀,7,[]). 西暦和暦表(777,宝亀,8,[]). 西暦和暦表(778,宝亀,9,[]). 西暦和暦表(779,宝亀,10,[]). 西暦和暦表(780,宝亀,11,[]). 西暦和暦表(781,天応,1,[]). 西暦和暦表(782,天応,2,[]). 西暦和暦表(782,延暦,1,[]). 西暦和暦表(783,延暦,2,[]). 西暦和暦表(784,延暦,3,[]). 西暦和暦表(785,延暦,4,[]). 西暦和暦表(786,延暦,5,[]). 西暦和暦表(787,延暦,6,[]). 西暦和暦表(788,延暦,7,[]). 西暦和暦表(789,延暦,8,[]). 西暦和暦表(790,延暦,9,[]). 西暦和暦表(791,延暦,10,[]). 西暦和暦表(792,延暦,11,[]). 西暦和暦表(793,延暦,12,[]). 西暦和暦表(794,延暦,13,[]). 西暦和暦表(795,延暦,14,[]). 西暦和暦表(796,延暦,15,[]). 西暦和暦表(797,延暦,16,[]). 西暦和暦表(798,延暦,17,[]). 西暦和暦表(799,延暦,18,[]). 西暦和暦表(800,延暦,19,[]). 西暦和暦表(801,延暦,20,[]). 西暦和暦表(802,延暦,21,[]). 西暦和暦表(803,延暦,22,[]). 西暦和暦表(804,延暦,23,[]). 西暦和暦表(805,延暦,24,[]). 西暦和暦表(806,延暦,25,[]). 西暦和暦表(806,大同,1,[]). 西暦和暦表(807,大同,2,[]). 西暦和暦表(808,大同,3,[]). 西暦和暦表(809,大同,4,[]). 西暦和暦表(810,大同,5,[]). 西暦和暦表(810,弘仁,1,[]). 西暦和暦表(811,弘仁,2,[]). 西暦和暦表(812,弘仁,3,[]). 西暦和暦表(813,弘仁,4,[]). 西暦和暦表(814,弘仁,5,[]). 西暦和暦表(815,弘仁,6,[]). 西暦和暦表(816,弘仁,7,[]). 西暦和暦表(817,弘仁,8,[]). 西暦和暦表(818,弘仁,9,[]). 西暦和暦表(819,弘仁,10,[]). 西暦和暦表(820,弘仁,11,[]). 西暦和暦表(821,弘仁,12,[]). 西暦和暦表(822,弘仁,13,[]). 西暦和暦表(823,弘仁,14,[]). 西暦和暦表(824,弘仁,15,[]). 西暦和暦表(824,天長,1,[]). 西暦和暦表(825,天長,2,[]). 西暦和暦表(826,天長,3,[]). 西暦和暦表(827,天長,4,[]). 西暦和暦表(828,天長,5,[]). 西暦和暦表(829,天長,6,[]). 西暦和暦表(830,天長,7,[]). 西暦和暦表(831,天長,8,[]). 西暦和暦表(832,天長,9,[]). 西暦和暦表(833,天長,10,[]). 西暦和暦表(834,天長,11,[]). 西暦和暦表(834,承和,1,[]). 西暦和暦表(835,承和,2,[]). 西暦和暦表(836,承和,3,[]). 西暦和暦表(837,承和,4,[]). 西暦和暦表(838,承和,5,[]). 西暦和暦表(839,承和,6,[]). 西暦和暦表(840,承和,7,[]). 西暦和暦表(841,承和,8,[]). 西暦和暦表(842,承和,9,[]). 西暦和暦表(843,承和,10,[]). 西暦和暦表(844,承和,11,[]). 西暦和暦表(845,承和,12,[]). 西暦和暦表(846,承和,13,[]). 西暦和暦表(847,承和,14,[]). 西暦和暦表(848,承和,15,[]). 西暦和暦表(848,嘉祥,1,[]). 西暦和暦表(849,嘉祥,2,[]). 西暦和暦表(850,嘉祥,3,[]). 西暦和暦表(851,嘉祥,4,[]). 西暦和暦表(851,仁寿,1,[]). 西暦和暦表(852,仁寿,2,[]). 西暦和暦表(853,仁寿,3,[]). 西暦和暦表(854,仁寿,4,[]). 西暦和暦表(854,斉衡,1,[]). 西暦和暦表(855,斉衡,2,[]). 西暦和暦表(856,斉衡,3,[]). 西暦和暦表(857,斉衡,4,[]). 西暦和暦表(857,天安,1,[]). 西暦和暦表(858,天安,2,[]). 西暦和暦表(859,天安,3,[]). 西暦和暦表(859,貞観,1,[]). 西暦和暦表(860,貞観,2,[]). 西暦和暦表(861,貞観,3,[]). 西暦和暦表(862,貞観,4,[]). 西暦和暦表(863,貞観,5,[]). 西暦和暦表(864,貞観,6,[]). 西暦和暦表(865,貞観,7,[]). 西暦和暦表(866,貞観,8,[]). 西暦和暦表(867,貞観,9,[]). 西暦和暦表(868,貞観,10,[]). 西暦和暦表(869,貞観,11,[]). 西暦和暦表(870,貞観,12,[]). 西暦和暦表(871,貞観,13,[]). 西暦和暦表(872,貞観,14,[]). 西暦和暦表(873,貞観,15,[]). 西暦和暦表(874,貞観,16,[]). 西暦和暦表(875,貞観,17,[]). 西暦和暦表(876,貞観,18,[]). 西暦和暦表(877,貞観,19,[]). 西暦和暦表(877,元慶,1,[]). 西暦和暦表(878,元慶,2,[]). 西暦和暦表(879,元慶,3,[]). 西暦和暦表(880,元慶,4,[]). 西暦和暦表(881,元慶,5,[]). 西暦和暦表(882,元慶,6,[]). 西暦和暦表(883,元慶,7,[]). 西暦和暦表(884,元慶,8,[]). 西暦和暦表(885,元慶,9,[]). 西暦和暦表(885,仁和,1,[]). 西暦和暦表(886,仁和,2,[]). 西暦和暦表(887,仁和,3,[]). 西暦和暦表(888,仁和,4,[]). 西暦和暦表(889,仁和,5,[]). 西暦和暦表(889,寛平,1,[]). 西暦和暦表(890,寛平,2,[]). 西暦和暦表(891,寛平,3,[]). 西暦和暦表(892,寛平,4,[]). 西暦和暦表(893,寛平,5,[]). 西暦和暦表(894,寛平,6,[]). 西暦和暦表(895,寛平,7,[]). 西暦和暦表(896,寛平,8,[]). 西暦和暦表(897,寛平,9,[]). 西暦和暦表(898,寛平,10,[]). 西暦和暦表(898,昌泰,1,[]). 西暦和暦表(899,昌泰,2,[]). 西暦和暦表(900,昌泰,3,[]). 西暦和暦表(901,昌泰,4,[]). 西暦和暦表(901,延喜,1,[]). 西暦和暦表(902,延喜,2,[]). 西暦和暦表(903,延喜,3,[]). 西暦和暦表(904,延喜,4,[]). 西暦和暦表(905,延喜,5,[]). 西暦和暦表(906,延喜,6,[]). 西暦和暦表(907,延喜,7,[]). 西暦和暦表(908,延喜,8,[]). 西暦和暦表(909,延喜,9,[]). 西暦和暦表(910,延喜,10,[]). 西暦和暦表(911,延喜,11,[]). 西暦和暦表(912,延喜,12,[]). 西暦和暦表(913,延喜,13,[]). 西暦和暦表(914,延喜,14,[]). 西暦和暦表(915,延喜,15,[]). 西暦和暦表(916,延喜,16,[]). 西暦和暦表(917,延喜,17,[]). 西暦和暦表(918,延喜,18,[]). 西暦和暦表(919,延喜,19,[]). 西暦和暦表(920,延喜,20,[]). 西暦和暦表(921,延喜,21,[]). 西暦和暦表(922,延喜,22,[]). 西暦和暦表(923,延喜,23,[]). 西暦和暦表(923,延長,1,[]). 西暦和暦表(924,延長,2,[]). 西暦和暦表(925,延長,3,[]). 西暦和暦表(926,延長,4,[]). 西暦和暦表(927,延長,5,[]). 西暦和暦表(928,延長,6,[]). 西暦和暦表(929,延長,7,[]). 西暦和暦表(930,延長,8,[]). 西暦和暦表(931,延長,9,[]). 西暦和暦表(931,承平,1,[]). 西暦和暦表(932,承平,2,[]). 西暦和暦表(933,承平,3,[]). 西暦和暦表(934,承平,4,[]). 西暦和暦表(935,承平,5,[]). 西暦和暦表(936,承平,6,[]). 西暦和暦表(937,承平,7,[]). 西暦和暦表(938,承平,8,[]). 西暦和暦表(938,天慶,1,[]). 西暦和暦表(939,天慶,2,[]). 西暦和暦表(940,天慶,3,[]). 西暦和暦表(941,天慶,4,[]). 西暦和暦表(942,天慶,5,[]). 西暦和暦表(943,天慶,6,[]). 西暦和暦表(944,天慶,7,[]). 西暦和暦表(945,天慶,8,[]). 西暦和暦表(946,天慶,9,[]). 西暦和暦表(947,天慶,10,[]). 西暦和暦表(947,天暦,1,[]). 西暦和暦表(948,天暦,2,[]). 西暦和暦表(949,天暦,3,[]). 西暦和暦表(950,天暦,4,[]). 西暦和暦表(951,天暦,5,[]). 西暦和暦表(952,天暦,6,[]). 西暦和暦表(953,天暦,7,[]). 西暦和暦表(954,天暦,8,[]). 西暦和暦表(955,天暦,9,[]). 西暦和暦表(956,天暦,10,[]). 西暦和暦表(957,天暦,11,[]). 西暦和暦表(957,天徳,1,[]). 西暦和暦表(958,天徳,2,[]). 西暦和暦表(959,天徳,3,[]). 西暦和暦表(960,天徳,4,[]). 西暦和暦表(961,天徳,5,[]). 西暦和暦表(961,応和,1,[]). 西暦和暦表(962,応和,2,[]). 西暦和暦表(963,応和,3,[]). 西暦和暦表(964,応和,4,[]). 西暦和暦表(964,康保,1,[]). 西暦和暦表(965,康保,2,[]). 西暦和暦表(966,康保,3,[]). 西暦和暦表(967,康保,4,[]). 西暦和暦表(968,康保,5,[]). 西暦和暦表(968,安和,1,[]). 西暦和暦表(969,安和,2,[]). 西暦和暦表(970,安和,3,[]). 西暦和暦表(970,天禄,1,[]). 西暦和暦表(971,天禄,2,[]). 西暦和暦表(972,天禄,3,[]). 西暦和暦表(973,天禄,4,[]). 西暦和暦表(973,天延,1,[]). 西暦和暦表(974,天延,2,[]). 西暦和暦表(975,天延,3,[]). 西暦和暦表(976,天延,4,[]). 西暦和暦表(976,貞元,1,[]). 西暦和暦表(977,貞元,2,[]). 西暦和暦表(978,貞元,3,[]). 西暦和暦表(978,天元,1,[]). 西暦和暦表(979,天元,2,[]). 西暦和暦表(980,天元,3,[]). 西暦和暦表(981,天元,4,[]). 西暦和暦表(982,天元,5,[]). 西暦和暦表(983,天元,6,[]). 西暦和暦表(983,永観,1,[]). 西暦和暦表(984,永観,2,[]). 西暦和暦表(985,永観,3,[]). 西暦和暦表(985,寛和,1,[]). 西暦和暦表(986,寛和,2,[]). 西暦和暦表(987,寛和,3,[]). 西暦和暦表(987,永延,1,[]). 西暦和暦表(988,永延,2,[]). 西暦和暦表(989,永延,3,[]). 西暦和暦表(989,永祚,1,[]). 西暦和暦表(990,永祚,2,[]). 西暦和暦表(990,正暦,1,[]). 西暦和暦表(991,正暦,2,[]). 西暦和暦表(992,正暦,3,[]). 西暦和暦表(993,正暦,4,[]). 西暦和暦表(994,正暦,5,[]). 西暦和暦表(995,正暦,6,[]). 西暦和暦表(995,長徳,1,[]). 西暦和暦表(996,長徳,2,[]). 西暦和暦表(997,長徳,3,[]). 西暦和暦表(998,長徳,4,[]). 西暦和暦表(999,長徳,5,[]). 西暦和暦表(999,長保,1,[]). 西暦和暦表(1000,長保,2,[]). 西暦和暦表(1001,長保,3,[]). 西暦和暦表(1002,長保,4,[]). 西暦和暦表(1003,長保,5,[]). 西暦和暦表(1004,長保,6,[]). 西暦和暦表(1004,寛弘,1,[]). 西暦和暦表(1005,寛弘,2,[]). 西暦和暦表(1006,寛弘,3,[]). 西暦和暦表(1007,寛弘,4,[]). 西暦和暦表(1008,寛弘,5,[]). 西暦和暦表(1009,寛弘,6,[]). 西暦和暦表(1010,寛弘,7,[]). 西暦和暦表(1011,寛弘,8,[]). 西暦和暦表(1012,寛弘,9,[]). 西暦和暦表(1012,長和,1,[]). 西暦和暦表(1013,長和,2,[]). 西暦和暦表(1014,長和,3,[]). 西暦和暦表(1015,長和,4,[]). 西暦和暦表(1016,長和,5,[]). 西暦和暦表(1017,長和,6,[]). 西暦和暦表(1017,寛仁,1,[]). 西暦和暦表(1018,寛仁,2,[]). 西暦和暦表(1019,寛仁,3,[]). 西暦和暦表(1020,寛仁,4,[]). 西暦和暦表(1021,寛仁,5,[]). 西暦和暦表(1021,治安,1,[]). 西暦和暦表(1022,治安,2,[]). 西暦和暦表(1023,治安,3,[]). 西暦和暦表(1024,治安,4,[]). 西暦和暦表(1024,万寿,1,[]). 西暦和暦表(1025,万寿,2,[]). 西暦和暦表(1026,万寿,3,[]). 西暦和暦表(1027,万寿,4,[]). 西暦和暦表(1028,万寿,5,[]). 西暦和暦表(1028,長元,1,[]). 西暦和暦表(1029,長元,2,[]). 西暦和暦表(1030,長元,3,[]). 西暦和暦表(1031,長元,4,[]). 西暦和暦表(1032,長元,5,[]). 西暦和暦表(1033,長元,6,[]). 西暦和暦表(1034,長元,7,[]). 西暦和暦表(1035,長元,8,[]). 西暦和暦表(1036,長元,9,[]). 西暦和暦表(1037,長元,10,[]). 西暦和暦表(1037,長暦,1,[]). 西暦和暦表(1038,長暦,2,[]). 西暦和暦表(1039,長暦,3,[]). 西暦和暦表(1040,長暦,4,[]). 西暦和暦表(1040,長久,1,[]). 西暦和暦表(1041,長久,2,[]). 西暦和暦表(1042,長久,3,[]). 西暦和暦表(1043,長久,4,[]). 西暦和暦表(1044,長久,5,[]). 西暦和暦表(1044,寛徳,1,[]). 西暦和暦表(1045,寛徳,2,[]). 西暦和暦表(1046,寛徳,3,[]). 西暦和暦表(1046,永承,1,[]). 西暦和暦表(1047,永承,2,[]). 西暦和暦表(1048,永承,3,[]). 西暦和暦表(1049,永承,4,[]). 西暦和暦表(1050,永承,5,[]). 西暦和暦表(1051,永承,6,[]). 西暦和暦表(1052,永承,7,[]). 西暦和暦表(1053,永承,8,[]). 西暦和暦表(1053,天喜,1,[]). 西暦和暦表(1054,天喜,2,[]). 西暦和暦表(1055,天喜,3,[]). 西暦和暦表(1056,天喜,4,[]). 西暦和暦表(1057,天喜,5,[]). 西暦和暦表(1058,天喜,6,[]). 西暦和暦表(1058,康平,1,[]). 西暦和暦表(1059,康平,2,[]). 西暦和暦表(1060,康平,3,[]). 西暦和暦表(1061,康平,4,[]). 西暦和暦表(1062,康平,5,[]). 西暦和暦表(1063,康平,6,[]). 西暦和暦表(1064,康平,7,[]). 西暦和暦表(1065,康平,8,[]). 西暦和暦表(1065,治暦,1,[]). 西暦和暦表(1066,治暦,2,[]). 西暦和暦表(1067,治暦,3,[]). 西暦和暦表(1068,治暦,4,[]). 西暦和暦表(1069,治暦,5,[]). 西暦和暦表(1069,延久,1,[]). 西暦和暦表(1070,延久,2,[]). 西暦和暦表(1071,延久,3,[]). 西暦和暦表(1072,延久,4,[]). 西暦和暦表(1073,延久,5,[]). 西暦和暦表(1074,延久,6,[]). 西暦和暦表(1074,承保,1,[]). 西暦和暦表(1075,承保,2,[]). 西暦和暦表(1076,承保,3,[]). 西暦和暦表(1077,承保,4,[]). 西暦和暦表(1077,承暦,1,[]). 西暦和暦表(1078,承暦,2,[]). 西暦和暦表(1079,承暦,3,[]). 西暦和暦表(1080,承暦,4,[]). 西暦和暦表(1081,承暦,5,[]). 西暦和暦表(1081,永保,1,[]). 西暦和暦表(1082,永保,2,[]). 西暦和暦表(1083,永保,3,[]). 西暦和暦表(1084,永保,4,[]). 西暦和暦表(1084,応徳,1,[]). 西暦和暦表(1085,応徳,2,[]). 西暦和暦表(1086,応徳,3,[]). 西暦和暦表(1087,応徳,4,[]). 西暦和暦表(1087,寛治,1,[]). 西暦和暦表(1088,寛治,2,[]). 西暦和暦表(1089,寛治,3,[]). 西暦和暦表(1090,寛治,4,[]). 西暦和暦表(1091,寛治,5,[]). 西暦和暦表(1092,寛治,6,[]). 西暦和暦表(1093,寛治,7,[]). 西暦和暦表(1094,寛治,8,[]). 西暦和暦表(1094,嘉保,1,[]). 西暦和暦表(1095,嘉保,2,[]). 西暦和暦表(1096,嘉保,3,[]). 西暦和暦表(1096,永長,1,[]). 西暦和暦表(1097,永長,2,[]). 西暦和暦表(1097,承徳,1,[]). 西暦和暦表(1098,承徳,2,[]). 西暦和暦表(1099,承徳,3,[]). 西暦和暦表(1099,康和,1,[]). 西暦和暦表(1100,康和,2,[]). 西暦和暦表(1101,康和,3,[]). 西暦和暦表(1102,康和,4,[]). 西暦和暦表(1103,康和,5,[]). 西暦和暦表(1104,康和,6,[]). 西暦和暦表(1104,長治,1,[]). 西暦和暦表(1105,長治,2,[]). 西暦和暦表(1106,長治,3,[]). 西暦和暦表(1106,嘉承,1,[]). 西暦和暦表(1107,嘉承,2,[]). 西暦和暦表(1108,嘉承,3,[]). 西暦和暦表(1108,天仁,1,[]). 西暦和暦表(1109,天仁,2,[]). 西暦和暦表(1110,天仁,3,[]). 西暦和暦表(1110,天永,1,[]). 西暦和暦表(1111,天永,2,[]). 西暦和暦表(1112,天永,3,[]). 西暦和暦表(1113,天永,4,[]). 西暦和暦表(1113,永久,1,[]). 西暦和暦表(1114,永久,2,[]). 西暦和暦表(1115,永久,3,[]). 西暦和暦表(1116,永久,4,[]). 西暦和暦表(1117,永久,5,[]). 西暦和暦表(1118,永久,6,[]). 西暦和暦表(1118,元永,1,[]). 西暦和暦表(1119,元永,2,[]). 西暦和暦表(1120,元永,3,[]). 西暦和暦表(1120,保安,1,[]). 西暦和暦表(1121,保安,2,[]). 西暦和暦表(1122,保安,3,[]). 西暦和暦表(1123,保安,4,[]). 西暦和暦表(1124,保安,5,[]). 西暦和暦表(1124,天治,1,[]). 西暦和暦表(1125,天治,2,[]). 西暦和暦表(1126,天治,3,[]). 西暦和暦表(1126,大治,1,[]). 西暦和暦表(1127,大治,2,[]). 西暦和暦表(1128,大治,3,[]). 西暦和暦表(1129,大治,4,[]). 西暦和暦表(1130,大治,5,[]). 西暦和暦表(1131,大治,6,[]). 西暦和暦表(1131,天承,1,[]). 西暦和暦表(1132,天承,2,[]). 西暦和暦表(1132,長承,1,[]). 西暦和暦表(1133,長承,2,[]). 西暦和暦表(1134,長承,3,[]). 西暦和暦表(1135,長承,4,[]). 西暦和暦表(1135,保延,1,[]). 西暦和暦表(1136,保延,2,[]). 西暦和暦表(1137,保延,3,[]). 西暦和暦表(1138,保延,4,[]). 西暦和暦表(1139,保延,5,[]). 西暦和暦表(1140,保延,6,[]). 西暦和暦表(1141,保延,7,[]). 西暦和暦表(1141,永治,1,[]). 西暦和暦表(1142,永治,2,[]). 西暦和暦表(1142,康治,1,[]). 西暦和暦表(1143,康治,2,[]). 西暦和暦表(1144,康治,3,[]). 西暦和暦表(1144,天養,1,2 / 23). 西暦和暦表(1145,天養,2,[]). 西暦和暦表(1145,久安,1,7 / 22). 西暦和暦表(1146,久安,2,[]). 西暦和暦表(1147,久安,3,[]). 西暦和暦表(1148,久安,4,[]). 西暦和暦表(1149,久安,5,[]). 西暦和暦表(1150,久安,6,[]). 西暦和暦表(1151,久安,7,[]). 西暦和暦表(1151,仁平,1,1 / 26). 西暦和暦表(1152,仁平,2,[]). 西暦和暦表(1153,仁平,3,[]). 西暦和暦表(1154,仁平,4,[]). 西暦和暦表(1154,久寿,1,10 / 28). 西暦和暦表(1155,久寿,2,[]). 西暦和暦表(1156,久寿,3,[]). 西暦和暦表(1156,保元,1,4 / 27). 西暦和暦表(1157,保元,2,[]). 西暦和暦表(1158,保元,3,[]). 西暦和暦表(1159,保元,4,[]). 西暦和暦表(1159,平治,1,4 / 20). 西暦和暦表(1160,平治,2,[]). 西暦和暦表(1160,永暦,1,1 / 10). 西暦和暦表(1161,永暦,2,[]). 西暦和暦表(1161,応保,1,9 / 4). 西暦和暦表(1162,応保,2,[]). 西暦和暦表(1163,応保,3,[]). 西暦和暦表(1163,長寛,1,3 / 29). 西暦和暦表(1164,長寛,2,[]). 西暦和暦表(1165,長寛,3,[]). 西暦和暦表(1165,永万,1,6 / 5). 西暦和暦表(1166,永万,2,[]). 西暦和暦表(1166,仁安,1,8 / 27). 西暦和暦表(1167,仁安,2,[]). 西暦和暦表(1168,仁安,3,[]). 西暦和暦表(1169,仁安,4,[]). 西暦和暦表(1169,嘉応,1,4 / 8). 西暦和暦表(1170,嘉応,2,[]). 西暦和暦表(1171,嘉応,3,[]). 西暦和暦表(1171,承安,1,4 / 21). 西暦和暦表(1172,承安,2,[]). 西暦和暦表(1173,承安,3,[]). 西暦和暦表(1174,承安,4,[]). 西暦和暦表(1175,承安,5,[]). 西暦和暦表(1175,安元,1,7 / 28). 西暦和暦表(1176,安元,2,[]). 西暦和暦表(1177,安元,3,[]). 西暦和暦表(1177,治承,1,8 / 4). 西暦和暦表(1178,治承,2,[]). 西暦和暦表(1179,治承,3,[]). 西暦和暦表(1180,治承,4,[]). 西暦和暦表(1181,治承,5,[]). 西暦和暦表(1181,養和,1,7 / 14). 西暦和暦表(1182,養和,2,[]). 西暦和暦表(1182,寿永,1,5 / 27). 西暦和暦表(1183,寿永,2,[]). 西暦和暦表(1184,寿永,3,[]). 西暦和暦表(1185,寿永,4,[]). 西暦和暦表(1185,文治,1,8 / 14). 西暦和暦表(1186,文治,2,[]). 西暦和暦表(1187,文治,3,[]). 西暦和暦表(1188,文治,4,[]). 西暦和暦表(1189,文治,5,[]). 西暦和暦表(1190,文治,6,[]). 西暦和暦表(1190,建久,1,4 / 11). 西暦和暦表(1191,建久,2,[]). 西暦和暦表(1192,建久,3,[]). 西暦和暦表(1193,建久,4,[]). 西暦和暦表(1194,建久,5,[]). 西暦和暦表(1195,建久,6,[]). 西暦和暦表(1196,建久,7,[]). 西暦和暦表(1197,建久,8,[]). 西暦和暦表(1198,建久,9,[]). 西暦和暦表(1199,建久,10,[]). 西暦和暦表(1199,正治,1,4 / 27). 西暦和暦表(1200,正治,2,[]). 西暦和暦表(1201,正治,3,[]). 西暦和暦表(1201,建仁,1,2 / 13). 西暦和暦表(1202,建仁,2,[]). 西暦和暦表(1203,建仁,3,[]). 西暦和暦表(1204,建仁,4,[]). 西暦和暦表(1204,元久,1,2 / 20). 西暦和暦表(1205,元久,2,[]). 西暦和暦表(1206,元久,3,[]). 西暦和暦表(1206,建永,1,4 / 27). 西暦和暦表(1207,建永,2,[]). 西暦和暦表(1207,承元,1,10 / 25). 西暦和暦表(1208,承元,2,[]). 西暦和暦表(1209,承元,3,[]). 西暦和暦表(1210,承元,4,[]). 西暦和暦表(1211,承元,5,[]). 西暦和暦表(1211,建暦,1,3 / 9). 西暦和暦表(1212,建暦,2,[]). 西暦和暦表(1213,建暦,3,[]). 西暦和暦表(1213,建保,1,12 / 6). 西暦和暦表(1214,建保,2,[]). 西暦和暦表(1215,建保,3,[]). 西暦和暦表(1216,建保,4,[]). 西暦和暦表(1217,建保,5,[]). 西暦和暦表(1218,建保,6,[]). 西暦和暦表(1219,建保,7,[]). 西暦和暦表(1219,承久,1,4 / 12). 西暦和暦表(1220,承久,2,[]). 西暦和暦表(1221,承久,3,[]). 西暦和暦表(1222,承久,4,[]). 西暦和暦表(1222,貞応,1,4 / 13). 西暦和暦表(1223,貞応,2,[]). 西暦和暦表(1224,貞応,3,[]). 西暦和暦表(1224,元仁,1,11 / 20). 西暦和暦表(1225,元仁,2,[]). 西暦和暦表(1225,嘉祿,1,4 / 20). 西暦和暦表(1226,嘉祿,2,[]). 西暦和暦表(1227,嘉祿,3,[]). 西暦和暦表(1227,安貞,1,12 / 10). 西暦和暦表(1228,安貞,2,[]). 西暦和暦表(1229,安貞,3,[]). 西暦和暦表(1229,寛喜,1,3 / 5). 西暦和暦表(1230,寛喜,2,[]). 西暦和暦表(1231,寛喜,3,[]). 西暦和暦表(1232,寛喜,4,[]). 西暦和暦表(1232,貞永,1,4 / 2). 西暦和暦表(1233,貞永,2,[]). 西暦和暦表(1233,天福,1,4 / 15). 西暦和暦表(1234,天福,2,[]). 西暦和暦表(1234,文暦,1,11 / 5). 西暦和暦表(1235,文暦,2,[]). 西暦和暦表(1235,嘉禎,1,9 / 19). 西暦和暦表(1236,嘉禎,2,[]). 西暦和暦表(1237,嘉禎,3,[]). 西暦和暦表(1238,嘉禎,4,[]). 西暦和暦表(1238,暦仁,1,11 / 23). 西暦和暦表(1239,暦仁,2,[]). 西暦和暦表(1239,延応,1,2 / 7). 西暦和暦表(1240,延応,2,[]). 西暦和暦表(1240,仁治,1,7 / 16). 西暦和暦表(1241,仁治,2,[]). 西暦和暦表(1242,仁治,3,[]). 西暦和暦表(1243,仁治,4,[]). 西暦和暦表(1243,寛元,1,2 / 26). 西暦和暦表(1244,寛元,2,[]). 西暦和暦表(1245,寛元,3,[]). 西暦和暦表(1246,寛元,4,[]). 西暦和暦表(1247,寛元,5,[]). 西暦和暦表(1247,宝治,1,2 / 28). 西暦和暦表(1248,宝治,2,[]). 西暦和暦表(1249,宝治,3,[]). 西暦和暦表(1249,建長,1,3 / 18). 西暦和暦表(1250,建長,2,[]). 西暦和暦表(1251,建長,3,[]). 西暦和暦表(1252,建長,4,[]). 西暦和暦表(1253,建長,5,[]). 西暦和暦表(1254,建長,6,[]). 西暦和暦表(1255,建長,7,[]). 西暦和暦表(1256,建長,8,[]). 西暦和暦表(1256,康元,1,10 / 5). 西暦和暦表(1257,康元,2,[]). 西暦和暦表(1257,正嘉,1,3 / 14). 西暦和暦表(1258,正嘉,2,[]). 西暦和暦表(1259,正嘉,3,[]). 西暦和暦表(1259,正元,1,3 / 26). 西暦和暦表(1260,正元,2,[]). 西暦和暦表(1260,文応,1,4 / 23). 西暦和暦表(1261,文応,2,[]). 西暦和暦表(1261,弘長,1,2 / 20). 西暦和暦表(1262,弘長,2,[]). 西暦和暦表(1263,弘長,3,[]). 西暦和暦表(1264,弘長,4,[]). 西暦和暦表(1264,文永,1,2 / 28). 西暦和暦表(1265,文永,2,[]). 西暦和暦表(1266,文永,3,[]). 西暦和暦表(1267,文永,4,[]). 西暦和暦表(1268,文永,5,[]). 西暦和暦表(1269,文永,6,[]). 西暦和暦表(1270,文永,7,[]). 西暦和暦表(1271,文永,8,[]). 西暦和暦表(1272,文永,9,[]). 西暦和暦表(1273,文永,10,[]). 西暦和暦表(1274,文永,11,[]). 西暦和暦表(1275,文永,12,[]). 西暦和暦表(1275,建治,1,4 / 25). 西暦和暦表(1276,建治,2,[]). 西暦和暦表(1277,建治,3,[]). 西暦和暦表(1278,建治,4,[]). 西暦和暦表(1278,弘安,1,2 / 29). 西暦和暦表(1279,弘安,2,[]). 西暦和暦表(1280,弘安,3,[]). 西暦和暦表(1281,弘安,4,[]). 西暦和暦表(1282,弘安,5,[]). 西暦和暦表(1283,弘安,6,[]). 西暦和暦表(1284,弘安,7,[]). 西暦和暦表(1285,弘安,8,[]). 西暦和暦表(1286,弘安,9,[]). 西暦和暦表(1287,弘安,10,[]). 西暦和暦表(1288,弘安,11,[]). 西暦和暦表(1288,正応,1,4 / 28). 西暦和暦表(1289,正応,2,[]). 西暦和暦表(1290,正応,3,[]). 西暦和暦表(1291,正応,4,[]). 西暦和暦表(1292,正応,5,[]). 西暦和暦表(1293,正応,6,[]). 西暦和暦表(1293,永仁,1,8 / 5). 西暦和暦表(1294,永仁,2,[]). 西暦和暦表(1295,永仁,3,[]). 西暦和暦表(1296,永仁,4,[]). 西暦和暦表(1297,永仁,5,[]). 西暦和暦表(1298,永仁,6,[]). 西暦和暦表(1299,永仁,7,[]). 西暦和暦表(1299,正安,1,4 / 25). 西暦和暦表(1300,正安,2,[]). 西暦和暦表(1301,正安,3,[]). 西暦和暦表(1302,正安,4,[]). 西暦和暦表(1302,乾元,1,11 / 21). 西暦和暦表(1303,乾元,2,[]). 西暦和暦表(1303,嘉元,1,8 / 5). 西暦和暦表(1304,嘉元,2,[]). 西暦和暦表(1305,嘉元,3,[]). 西暦和暦表(1306,嘉元,4,[]). 西暦和暦表(1306,徳治,1,12 / 14). 西暦和暦表(1307,徳治,2,[]). 西暦和暦表(1308,徳治,3,[]). 西暦和暦表(1308,延慶,1,10 / 9). 西暦和暦表(1309,延慶,2,[]). 西暦和暦表(1310,延慶,3,[]). 西暦和暦表(1311,延慶,4,[]). 西暦和暦表(1311,応長,1,4 / 28). 西暦和暦表(1312,応長,2,[]). 西暦和暦表(1312,正和,1,3 / 20). 西暦和暦表(1313,正和,2,[]). 西暦和暦表(1314,正和,3,[]). 西暦和暦表(1315,正和,4,[]). 西暦和暦表(1316,正和,5,[]). 西暦和暦表(1317,正和,6,[]). 西暦和暦表(1317,文保,1,2 / 3). 西暦和暦表(1318,文保,2,[]). 西暦和暦表(1319,文保,3,[]). 西暦和暦表(1319,元応,1,4 / 28). 西暦和暦表(1320,元応,2,[]). 西暦和暦表(1321,元応,3,[]). 西暦和暦表(1321,元亨,1,2 / 23). 西暦和暦表(1322,元亨,2,[]). 西暦和暦表(1323,元亨,3,[]). 西暦和暦表(1324,元亨,4,[]). 西暦和暦表(1324,正中,1,12 / 9). 西暦和暦表(1325,正中,2,[]). 西暦和暦表(1326,正中,3,[]). 西暦和暦表(1326,嘉暦,1,4 / 26). 西暦和暦表(1327,嘉暦,2,[]). 西暦和暦表(1328,嘉暦,3,[]). 西暦和暦表(1329,嘉暦,4,[]). 西暦和暦表(1329,元徳,1,8 / 29). 西暦和暦表(1330,元徳,2,[]). 西暦和暦表(1331,元徳,3,[]). 西暦和暦表(1331,元弘,1,8 / 9). 西暦和暦表(1332,元弘,2,[]). 西暦和暦表(1332,正慶,1,4 / 28). 西暦和暦表(1333,正慶,2,[]). 西暦和暦表(1334,正慶,3,[]). 西暦和暦表(1334,建武,1,1 / 29). 西暦和暦表(1335,建武,2,[]). 西暦和暦表(1336,建武,3,[]). 西暦和暦表(1337,建武,4,[]). 西暦和暦表(1338,建武,5,[]). 西暦和暦表(1338,暦応,1,8 / 28). 西暦和暦表(1339,暦応,2,[]). 西暦和暦表(1340,暦応,3,[]). 西暦和暦表(1341,暦応,4,[]). 西暦和暦表(1342,暦応,5,[]). 西暦和暦表(1342,康永,1,4 / 27). 西暦和暦表(1343,康永,2,[]). 西暦和暦表(1344,康永,3,[]). 西暦和暦表(1345,康永,4,[]). 西暦和暦表(1345,貞和,1,10 / 21). 西暦和暦表(1346,貞和,2,[]). 西暦和暦表(1347,貞和,3,[]). 西暦和暦表(1348,貞和,4,[]). 西暦和暦表(1349,貞和,5,[]). 西暦和暦表(1350,貞和,6,[]). 西暦和暦表(1350,観応,1,2 / 27). 西暦和暦表(1351,観応,2,[]). 西暦和暦表(1352,観応,3,[]). 西暦和暦表(1352,文和,1,9 / 27). 西暦和暦表(1353,文和,2,[]). 西暦和暦表(1354,文和,3,[]). 西暦和暦表(1355,文和,4,[]). 西暦和暦表(1356,文和,5,[]). 西暦和暦表(1356,延文,1,3 / 28). 西暦和暦表(1357,延文,2,[]). 西暦和暦表(1358,延文,3,[]). 西暦和暦表(1359,延文,4,[]). 西暦和暦表(1360,延文,5,[]). 西暦和暦表(1361,延文,6,[]). 西暦和暦表(1361,康安,1,3 / 29). 西暦和暦表(1362,康安,2,[]). 西暦和暦表(1362,貞治,1,9 / 23). 西暦和暦表(1363,貞治,2,[]). 西暦和暦表(1364,貞治,3,[]). 西暦和暦表(1365,貞治,4,[]). 西暦和暦表(1366,貞治,5,[]). 西暦和暦表(1367,貞治,6,[]). 西暦和暦表(1368,貞治,7,[]). 西暦和暦表(1368,応安,1,2 / 18). 西暦和暦表(1369,応安,2,[]). 西暦和暦表(1370,応安,3,[]). 西暦和暦表(1371,応安,4,[]). 西暦和暦表(1372,応安,5,[]). 西暦和暦表(1373,応安,6,[]). 西暦和暦表(1374,応安,7,[]). 西暦和暦表(1375,応安,8,[]). 西暦和暦表(1375,永和,1,5 / 27). 西暦和暦表(1376,永和,2,[]). 西暦和暦表(1377,永和,3,[]). 西暦和暦表(1378,永和,4,[]). 西暦和暦表(1379,永和,5,[]). 西暦和暦表(1379,康暦,1,3 / 22). 西暦和暦表(1380,康暦,2,[]). 西暦和暦表(1381,康暦,3,[]). 西暦和暦表(1381,永徳,1,2 / 10). 西暦和暦表(1382,永徳,2,[]). 西暦和暦表(1383,永徳,3,[]). 西暦和暦表(1384,永徳,4,[]). 西暦和暦表(1384,至徳,1,4 / 28). 西暦和暦表(1385,至徳,2,[]). 西暦和暦表(1386,至徳,3,[]). 西暦和暦表(1387,至徳,4,[]). 西暦和暦表(1387,嘉慶,1,8 / 23). 西暦和暦表(1388,嘉慶,2,[]). 西暦和暦表(1389,嘉慶,3,[]). 西暦和暦表(1389,康応,1,2 / 9). 西暦和暦表(1390,康応,2,[]). 西暦和暦表(1390,明徳,1,3 / 26). 西暦和暦表(1391,明徳,2,[]). 西暦和暦表(1392,明徳,3,[]). 西暦和暦表(1393,明徳,4,[]). 西暦和暦表(1394,明徳,5,[]). 西暦和暦表(1394,応永,1,7 / 5). 西暦和暦表(1395,応永,2,[]). 西暦和暦表(1396,応永,3,[]). 西暦和暦表(1397,応永,4,[]). 西暦和暦表(1398,応永,5,[]). 西暦和暦表(1399,応永,6,[]). 西暦和暦表(1400,応永,7,[]). 西暦和暦表(1401,応永,8,[]). 西暦和暦表(1402,応永,9,[]). 西暦和暦表(1403,応永,10,[]). 西暦和暦表(1404,応永,11,[]). 西暦和暦表(1405,応永,12,[]). 西暦和暦表(1406,応永,13,[]). 西暦和暦表(1407,応永,14,[]). 西暦和暦表(1408,応永,15,[]). 西暦和暦表(1409,応永,16,[]). 西暦和暦表(1410,応永,17,[]). 西暦和暦表(1411,応永,18,[]). 西暦和暦表(1412,応永,19,[]). 西暦和暦表(1413,応永,20,[]). 西暦和暦表(1414,応永,21,[]). 西暦和暦表(1415,応永,22,[]). 西暦和暦表(1416,応永,23,[]). 西暦和暦表(1417,応永,24,[]). 西暦和暦表(1418,応永,25,[]). 西暦和暦表(1419,応永,26,[]). 西暦和暦表(1420,応永,27,[]). 西暦和暦表(1421,応永,28,[]). 西暦和暦表(1422,応永,29,[]). 西暦和暦表(1423,応永,30,[]). 西暦和暦表(1424,応永,31,[]). 西暦和暦表(1425,応永,32,[]). 西暦和暦表(1426,応永,33,[]). 西暦和暦表(1427,応永,34,[]). 西暦和暦表(1428,応永,35,[]). 西暦和暦表(1428,正長,1,4 / 27). 西暦和暦表(1429,正長,2,[]). 西暦和暦表(1429,永享,1,9 / 5). 西暦和暦表(1430,永享,2,[]). 西暦和暦表(1431,永享,3,[]). 西暦和暦表(1432,永享,4,[]). 西暦和暦表(1433,永享,5,[]). 西暦和暦表(1434,永享,6,[]). 西暦和暦表(1435,永享,7,[]). 西暦和暦表(1436,永享,8,[]). 西暦和暦表(1437,永享,9,[]). 西暦和暦表(1438,永享,10,[]). 西暦和暦表(1439,永享,11,[]). 西暦和暦表(1440,永享,12,[]). 西暦和暦表(1441,永享,13,[]). 西暦和暦表(1441,嘉吉,1,2 / 17). 西暦和暦表(1442,嘉吉,2,[]). 西暦和暦表(1443,嘉吉,3,[]). 西暦和暦表(1444,嘉吉,4,[]). 西暦和暦表(1444,文安,1,2 / 5). 西暦和暦表(1445,文安,2,[]). 西暦和暦表(1446,文安,3,[]). 西暦和暦表(1447,文安,4,[]). 西暦和暦表(1448,文安,5,[]). 西暦和暦表(1449,文安,6,[]). 西暦和暦表(1449,宝徳,1,7 / 28). 西暦和暦表(1450,宝徳,2,[]). 西暦和暦表(1451,宝徳,3,[]). 西暦和暦表(1452,宝徳,4,[]). 西暦和暦表(1452,享徳,1,7 / 25). 西暦和暦表(1453,享徳,2,[]). 西暦和暦表(1454,享徳,3,[]). 西暦和暦表(1455,享徳,4,[]). 西暦和暦表(1455,康正,1,7 / 25). 西暦和暦表(1456,康正,2,[]). 西暦和暦表(1457,康正,3,[]). 西暦和暦表(1457,長祿,1,9 / 28). 西暦和暦表(1458,長祿,2,[]). 西暦和暦表(1459,長祿,3,[]). 西暦和暦表(1460,長祿,4,[]). 西暦和暦表(1460,寛正,1,12 / 21). 西暦和暦表(1461,寛正,2,[]). 西暦和暦表(1462,寛正,3,[]). 西暦和暦表(1463,寛正,4,[]). 西暦和暦表(1464,寛正,5,[]). 西暦和暦表(1465,寛正,6,[]). 西暦和暦表(1466,寛正,7,[]). 西暦和暦表(1466,文正,1,2 / 28). 西暦和暦表(1467,文正,2,[]). 西暦和暦表(1467,応仁,1,3 / 5). 西暦和暦表(1468,応仁,2,[]). 西暦和暦表(1469,応仁,3,[]). 西暦和暦表(1469,文明,1,4 / 28). 西暦和暦表(1470,文明,2,[]). 西暦和暦表(1471,文明,3,[]). 西暦和暦表(1472,文明,4,[]). 西暦和暦表(1473,文明,5,[]). 西暦和暦表(1474,文明,6,[]). 西暦和暦表(1475,文明,7,[]). 西暦和暦表(1476,文明,8,[]). 西暦和暦表(1477,文明,9,[]). 西暦和暦表(1478,文明,10,[]). 西暦和暦表(1479,文明,11,[]). 西暦和暦表(1480,文明,12,[]). 西暦和暦表(1481,文明,13,[]). 西暦和暦表(1482,文明,14,[]). 西暦和暦表(1483,文明,15,[]). 西暦和暦表(1484,文明,16,[]). 西暦和暦表(1485,文明,17,[]). 西暦和暦表(1486,文明,18,[]). 西暦和暦表(1487,文明,19,[]). 西暦和暦表(1487,長享,1,7 / 20). 西暦和暦表(1488,長享,2,[]). 西暦和暦表(1489,長享,3,[]). 西暦和暦表(1489,延徳,1,8 / 21). 西暦和暦表(1490,延徳,2,[]). 西暦和暦表(1491,延徳,3,[]). 西暦和暦表(1492,延徳,4,[]). 西暦和暦表(1492,明応,1,7 / 19). 西暦和暦表(1493,明応,2,[]). 西暦和暦表(1494,明応,3,[]). 西暦和暦表(1495,明応,4,[]). 西暦和暦表(1496,明応,5,[]). 西暦和暦表(1497,明応,6,[]). 西暦和暦表(1498,明応,7,[]). 西暦和暦表(1499,明応,8,[]). 西暦和暦表(1500,明応,9,[]). 西暦和暦表(1501,明応,10,[]). 西暦和暦表(1501,文龜,1,2 / 29). 西暦和暦表(1502,文龜,2,[]). 西暦和暦表(1503,文龜,3,[]). 西暦和暦表(1504,文龜,4,[]). 西暦和暦表(1504,永正,1,2 / 30). 西暦和暦表(1505,永正,2,[]). 西暦和暦表(1506,永正,3,[]). 西暦和暦表(1507,永正,4,[]). 西暦和暦表(1508,永正,5,[]). 西暦和暦表(1509,永正,6,[]). 西暦和暦表(1510,永正,7,[]). 西暦和暦表(1511,永正,8,[]). 西暦和暦表(1512,永正,9,[]). 西暦和暦表(1513,永正,10,[]). 西暦和暦表(1514,永正,11,[]). 西暦和暦表(1515,永正,12,[]). 西暦和暦表(1516,永正,13,[]). 西暦和暦表(1517,永正,14,[]). 西暦和暦表(1518,永正,15,[]). 西暦和暦表(1519,永正,16,[]). 西暦和暦表(1520,永正,17,[]). 西暦和暦表(1521,永正,18,[]). 西暦和暦表(1521,大永,1,8 / 23). 西暦和暦表(1522,大永,2,[]). 西暦和暦表(1523,大永,3,[]). 西暦和暦表(1524,大永,4,[]). 西暦和暦表(1525,大永,5,[]). 西暦和暦表(1526,大永,6,[]). 西暦和暦表(1527,大永,7,[]). 西暦和暦表(1528,大永,8,[]). 西暦和暦表(1528,享祿,1,8 / 20). 西暦和暦表(1529,享祿,2,[]). 西暦和暦表(1530,享祿,3,[]). 西暦和暦表(1531,享祿,4,[]). 西暦和暦表(1532,享祿,5,[]). 西暦和暦表(1532,天文,1,7 / 29). 西暦和暦表(1533,天文,2,[]). 西暦和暦表(1534,天文,3,[]). 西暦和暦表(1535,天文,4,[]). 西暦和暦表(1536,天文,5,[]). 西暦和暦表(1537,天文,6,[]). 西暦和暦表(1538,天文,7,[]). 西暦和暦表(1539,天文,8,[]). 西暦和暦表(1540,天文,9,[]). 西暦和暦表(1541,天文,10,[]). 西暦和暦表(1542,天文,11,[]). 西暦和暦表(1543,天文,12,[]). 西暦和暦表(1544,天文,13,[]). 西暦和暦表(1545,天文,14,[]). 西暦和暦表(1546,天文,15,[]). 西暦和暦表(1547,天文,16,[]). 西暦和暦表(1548,天文,17,[]). 西暦和暦表(1549,天文,18,[]). 西暦和暦表(1550,天文,19,[]). 西暦和暦表(1551,天文,20,[]). 西暦和暦表(1552,天文,21,[]). 西暦和暦表(1553,天文,22,[]). 西暦和暦表(1554,天文,23,[]). 西暦和暦表(1555,天文,24,[]). 西暦和暦表(1555,弘治,1,10 / 23). 西暦和暦表(1556,弘治,2,[]). 西暦和暦表(1557,弘治,3,[]). 西暦和暦表(1558,弘治,4,[]). 西暦和暦表(1558,永祿,1,2 / 28). 西暦和暦表(1559,永祿,2,[]). 西暦和暦表(1560,永祿,3,[]). 西暦和暦表(1561,永祿,4,[]). 西暦和暦表(1562,永祿,5,[]). 西暦和暦表(1563,永祿,6,[]). 西暦和暦表(1564,永禄,7,[]). 西暦和暦表(1565,永禄,8,[]). 西暦和暦表(1566,永禄,9,[]). 西暦和暦表(1567,永禄,10,[]). 西暦和暦表(1568,永禄,11,[]). 西暦和暦表(1569,永禄,12,[]). 西暦和暦表(1570,永禄,13,[]). 西暦和暦表(1570,元龜,1,4 / 23). 西暦和暦表(1571,元龜,2,[]). 西暦和暦表(1572,元龜,3,[]). 西暦和暦表(1573,元龜,4,[]). 西暦和暦表(1573,天正,1,7 / 28). 西暦和暦表(1574,天正,2,[]). 西暦和暦表(1575,天正,3,[]). 西暦和暦表(1576,天正,4,[]). 西暦和暦表(1577,天正,5,[]). 西暦和暦表(1578,天正,6,[]). 西暦和暦表(1579,天正,7,[]). 西暦和暦表(1580,天正,8,[]). 西暦和暦表(1581,天正,9,[]). 西暦和暦表(1582,天正,10,[]). 西暦和暦表(1583,天正,11,[]). 西暦和暦表(1584,天正,12,[]). 西暦和暦表(1585,天正,13,[]). 西暦和暦表(1586,天正,14,[]). 西暦和暦表(1587,天正,15,[]). 西暦和暦表(1588,天正,16,[]). 西暦和暦表(1589,天正,17,[]). 西暦和暦表(1590,天正,18,[]). 西暦和暦表(1591,天正,19,[]). 西暦和暦表(1592,天正,20,[]). 西暦和暦表(1592,文禄,1,12 / 8). 西暦和暦表(1593,文禄,2,[]). 西暦和暦表(1594,文禄,3,[]). 西暦和暦表(1595,文禄,4,[]). 西暦和暦表(1596,文禄,5,[]). 西暦和暦表(1596,慶長,1,10 / 27). 西暦和暦表(1597,慶長,2,[]). 西暦和暦表(1598,慶長,3,[]). 西暦和暦表(1599,慶長,4,[]). 西暦和暦表(1600,慶長,5,[]). 西暦和暦表(1601,慶長,6,[]). 西暦和暦表(1602,慶長,7,[]). 西暦和暦表(1603,慶長,8,[]). 西暦和暦表(1604,慶長,9,[]). 西暦和暦表(1605,慶長,10,[]). 西暦和暦表(1606,慶長,11,[]). 西暦和暦表(1607,慶長,12,[]). 西暦和暦表(1608,慶長,13,[]). 西暦和暦表(1609,慶長,14,[]). 西暦和暦表(1610,慶長,15,[]). 西暦和暦表(1611,慶長,16,[]). 西暦和暦表(1612,慶長,17,[]). 西暦和暦表(1613,慶長,18,[]). 西暦和暦表(1614,慶長,19,[]). 西暦和暦表(1615,慶長,20,[]). 西暦和暦表(1615,元和,1,7 / 13). 西暦和暦表(1616,元和,2,[]). 西暦和暦表(1617,元和,3,[]). 西暦和暦表(1618,元和,4,[]). 西暦和暦表(1619,元和,5,[]). 西暦和暦表(1620,元和,6,[]). 西暦和暦表(1621,元和,7,[]). 西暦和暦表(1622,元和,8,[]). 西暦和暦表(1623,元和,9,[]). 西暦和暦表(1624,元和,10,[]). 西暦和暦表(1624,寛永,1,2 / 30). 西暦和暦表(1625,寛永,2,[]). 西暦和暦表(1626,寛永,3,[]). 西暦和暦表(1627,寛永,4,[]). 西暦和暦表(1628,寛永,5,[]). 西暦和暦表(1629,寛永,6,[]). 西暦和暦表(1630,寛永,7,[]). 西暦和暦表(1631,寛永,8,[]). 西暦和暦表(1632,寛永,9,[]). 西暦和暦表(1633,寛永,10,[]). 西暦和暦表(1634,寛永,11,[]). 西暦和暦表(1635,寛永,12,[]). 西暦和暦表(1636,寛永,13,[]). 西暦和暦表(1637,寛永,14,[]). 西暦和暦表(1638,寛永,15,[]). 西暦和暦表(1639,寛永,16,[]). 西暦和暦表(1640,寛永,17,[]). 西暦和暦表(1641,寛永,18,[]). 西暦和暦表(1642,寛永,19,[]). 西暦和暦表(1643,寛永,20,[]). 西暦和暦表(1644,寛永,21,[]). 西暦和暦表(1644,正保,1,12 / 16). 西暦和暦表(1645,正保,2,[]). 西暦和暦表(1646,正保,3,[]). 西暦和暦表(1647,正保,4,[]). 西暦和暦表(1648,正保,5,[]). 西暦和暦表(1648,慶安,1,2 / 15). 西暦和暦表(1649,慶安,2,[]). 西暦和暦表(1650,慶安,3,[]). 西暦和暦表(1651,慶安,4,[]). 西暦和暦表(1652,慶安,5,[]). 西暦和暦表(1652,承応,1,9 / 18). 西暦和暦表(1653,承応,2,[]). 西暦和暦表(1654,承応,3,[]). 西暦和暦表(1655,承応,4,[]). 西暦和暦表(1655,明暦,1,4 / 13). 西暦和暦表(1656,明暦,2,[]). 西暦和暦表(1657,明暦,3,[]). 西暦和暦表(1658,明暦,4,[]). 西暦和暦表(1658,万治,1,7 / 23). 西暦和暦表(1659,万治,2,[]). 西暦和暦表(1660,万治,3,[]). 西暦和暦表(1661,万治,4,[]). 西暦和暦表(1661,寛文,1,4 / 25). 西暦和暦表(1662,寛文,2,[]). 西暦和暦表(1663,寛文,3,[]). 西暦和暦表(1664,寛文,4,[]). 西暦和暦表(1665,寛文,5,[]). 西暦和暦表(1666,寛文,6,[]). 西暦和暦表(1667,寛文,7,[]). 西暦和暦表(1668,寛文,8,[]). 西暦和暦表(1669,寛文,9,[]). 西暦和暦表(1670,寛文,10,[]). 西暦和暦表(1671,寛文,11,[]). 西暦和暦表(1672,寛文,12,[]). 西暦和暦表(1673,寛文,13,[]). 西暦和暦表(1673,延宝,1,9 / 21). 西暦和暦表(1674,延宝,2,[]). 西暦和暦表(1675,延宝,3,[]). 西暦和暦表(1676,延宝,4,[]). 西暦和暦表(1677,延宝,5,[]). 西暦和暦表(1678,延宝,6,[]). 西暦和暦表(1679,延宝,7,[]). 西暦和暦表(1680,延宝,8,[]). 西暦和暦表(1681,延宝,9,[]). 西暦和暦表(1681,天和,1,9 / 29). 西暦和暦表(1682,天和,2,[]). 西暦和暦表(1683,天和,3,[]). 西暦和暦表(1684,天和,4,[]). 西暦和暦表(1684,貞享,1,2 / 21). 西暦和暦表(1685,貞享,2,[]). 西暦和暦表(1686,貞享,3,[]). 西暦和暦表(1687,貞享,4,[]). 西暦和暦表(1688,貞享,5,[]). 西暦和暦表(1688,元禄,1,9 / 30). 西暦和暦表(1689,元禄,2,[]). 西暦和暦表(1690,元禄,3,[]). 西暦和暦表(1691,元禄,4,[]). 西暦和暦表(1692,元禄,5,[]). 西暦和暦表(1693,元禄,6,[]). 西暦和暦表(1694,元禄,7,[]). 西暦和暦表(1695,元禄,8,[]). 西暦和暦表(1696,元禄,9,[]). 西暦和暦表(1697,元禄,10,[]). 西暦和暦表(1698,元禄,11,[]). 西暦和暦表(1699,元禄,12,[]). 西暦和暦表(1700,元禄,13,[]). 西暦和暦表(1701,元禄,14,[]). 西暦和暦表(1702,元禄,15,[]). 西暦和暦表(1703,元禄,16,[]). 西暦和暦表(1704,元禄,17,[]). 西暦和暦表(1704,宝永,1,3 / 13). 西暦和暦表(1705,宝永,2,[]). 西暦和暦表(1706,宝永,3,[]). 西暦和暦表(1707,宝永,4,[]). 西暦和暦表(1708,宝永,5,[]). 西暦和暦表(1709,宝永,6,[]). 西暦和暦表(1710,宝永,7,[]). 西暦和暦表(1711,宝永,8,[]). 西暦和暦表(1711,正徳,1,4 / 25). 西暦和暦表(1712,正徳,2,[]). 西暦和暦表(1713,正徳,3,[]). 西暦和暦表(1714,正徳,4,[]). 西暦和暦表(1715,正徳,5,[]). 西暦和暦表(1716,正徳,6,[]). 西暦和暦表(1716,享保,1,6 / 22). 西暦和暦表(1717,享保,2,[]). 西暦和暦表(1718,享保,3,[]). 西暦和暦表(1719,享保,4,[]). 西暦和暦表(1720,享保,5,[]). 西暦和暦表(1721,享保,6,[]). 西暦和暦表(1722,享保,7,[]). 西暦和暦表(1723,享保,8,[]). 西暦和暦表(1724,享保,9,[]). 西暦和暦表(1725,享保,10,[]). 西暦和暦表(1726,享保,11,[]). 西暦和暦表(1727,享保,12,[]). 西暦和暦表(1728,享保,13,[]). 西暦和暦表(1729,享保,14,[]). 西暦和暦表(1730,享保,15,[]). 西暦和暦表(1731,享保,16,[]). 西暦和暦表(1732,享保,17,[]). 西暦和暦表(1733,享保,18,[]). 西暦和暦表(1734,享保,19,[]). 西暦和暦表(1735,享保,20,[]). 西暦和暦表(1736,享保,21,[]). 西暦和暦表(1736,元文,1,4 / 28). 西暦和暦表(1737,元文,2,[]). 西暦和暦表(1738,元文,3,[]). 西暦和暦表(1739,元文,4,[]). 西暦和暦表(1740,元文,5,[]). 西暦和暦表(1741,元文,6,[]). 西暦和暦表(1741,寛保,1,2 / 27). 西暦和暦表(1742,寛保,2,[]). 西暦和暦表(1743,寛保,3,[]). 西暦和暦表(1744,寛保,4,[]). 西暦和暦表(1744,延享,1,2 / 21). 西暦和暦表(1745,延享,2,[]). 西暦和暦表(1746,延享,3,[]). 西暦和暦表(1747,延享,4,[]). 西暦和暦表(1748,延享,5,[]). 西暦和暦表(1748,寛延,1,7 / 12). 西暦和暦表(1749,寛延,2,[]). 西暦和暦表(1750,寛延,3,[]). 西暦和暦表(1751,寛延,4,[]). 西暦和暦表(1751,宝暦,1,10 / 27). 西暦和暦表(1752,宝暦,2,[]). 西暦和暦表(1753,宝暦,3,[]). 西暦和暦表(1754,宝暦,4,[]). 西暦和暦表(1755,宝暦,5,[]). 西暦和暦表(1756,宝暦,6,[]). 西暦和暦表(1757,宝暦,7,[]). 西暦和暦表(1758,宝暦,8,[]). 西暦和暦表(1759,宝暦,9,[]). 西暦和暦表(1760,宝暦,10,[]). 西暦和暦表(1761,宝暦,11,[]). 西暦和暦表(1762,宝暦,12,[]). 西暦和暦表(1763,宝暦,13,[]). 西暦和暦表(1764,宝暦,14,[]). 西暦和暦表(1764,明和,1,6 / 2). 西暦和暦表(1765,明和,2,[]). 西暦和暦表(1766,明和,3,[]). 西暦和暦表(1767,明和,4,[]). 西暦和暦表(1768,明和,5,[]). 西暦和暦表(1769,明和,6,[]). 西暦和暦表(1770,明和,7,[]). 西暦和暦表(1771,明和,8,[]). 西暦和暦表(1772,明和,9,[]). 西暦和暦表(1772,安永,1,11 / 16). 西暦和暦表(1773,安永,2,[]). 西暦和暦表(1774,安永,3,[]). 西暦和暦表(1775,安永,4,[]). 西暦和暦表(1776,安永,5,[]). 西暦和暦表(1777,安永,6,[]). 西暦和暦表(1778,安永,7,[]). 西暦和暦表(1779,安永,8,[]). 西暦和暦表(1780,安永,9,[]). 西暦和暦表(1781,安永,10,[]). 西暦和暦表(1781,天明,1,4 / 2). 西暦和暦表(1782,天明,2,[]). 西暦和暦表(1783,天明,3,[]). 西暦和暦表(1784,天明,4,[]). 西暦和暦表(1785,天明,5,[]). 西暦和暦表(1786,天明,6,[]). 西暦和暦表(1787,天明,7,[]). 西暦和暦表(1788,天明,8,[]). 西暦和暦表(1789,天明,9,[]). 西暦和暦表(1789,寛政,1,1 / 25). 西暦和暦表(1790,寛政,2,[]). 西暦和暦表(1791,寛政,3,[]). 西暦和暦表(1792,寛政,4,[]). 西暦和暦表(1793,寛政,5,[]). 西暦和暦表(1794,寛政,6,[]). 西暦和暦表(1795,寛政,7,[]). 西暦和暦表(1796,寛政,8,[]). 西暦和暦表(1797,寛政,9,[]). 西暦和暦表(1798,寛政,10,[]). 西暦和暦表(1799,寛政,11,[]). 西暦和暦表(1800,寛政,12,[]). 西暦和暦表(1801,寛政,13,[]). 西暦和暦表(1801,享和,1,2 / 5). 西暦和暦表(1802,享和,2,[]). 西暦和暦表(1803,享和,3,[]). 西暦和暦表(1804,享和,4,[]). 西暦和暦表(1804,文化,1,2 / 11). 西暦和暦表(1805,文化,2,[]). 西暦和暦表(1806,文化,3,[]). 西暦和暦表(1807,文化,4,[]). 西暦和暦表(1808,文化,5,[]). 西暦和暦表(1809,文化,6,[]). 西暦和暦表(1810,文化,7,[]). 西暦和暦表(1811,文化,8,[]). 西暦和暦表(1812,文化,9,[]). 西暦和暦表(1813,文化,10,[]). 西暦和暦表(1814,文化,11,[]). 西暦和暦表(1815,文化,12,[]). 西暦和暦表(1816,文化,13,[]). 西暦和暦表(1817,文化,14,[]). 西暦和暦表(1818,文化,15,[]). 西暦和暦表(1818,文政,1,4 / 22). 西暦和暦表(1819,文政,2,[]). 西暦和暦表(1820,文政,3,[]). 西暦和暦表(1821,文政,4,[]). 西暦和暦表(1822,文政,5,[]). 西暦和暦表(1823,文政,6,[]). 西暦和暦表(1824,文政,7,[]). 西暦和暦表(1825,文政,8,[]). 西暦和暦表(1826,文政,9,[]). 西暦和暦表(1827,文政,10,[]). 西暦和暦表(1828,文政,11,[]). 西暦和暦表(1829,文政,12,[]). 西暦和暦表(1830,文政,13,[]). 西暦和暦表(1830,天保,1,12 / 1). 西暦和暦表(1831,天保,2,[]). 西暦和暦表(1832,天保,3,[]). 西暦和暦表(1833,天保,4,[]). 西暦和暦表(1834,天保,5,[]). 西暦和暦表(1835,天保,6,[]). 西暦和暦表(1836,天保,7,[]). 西暦和暦表(1837,天保,8,[]). 西暦和暦表(1838,天保,9,[]). 西暦和暦表(1839,天保,10,[]). 西暦和暦表(1840,天保,11,[]). 西暦和暦表(1841,天保,12,[]). 西暦和暦表(1842,天保,13,[]). 西暦和暦表(1843,天保,14,[]). 西暦和暦表(1844,天保,15,[]). 西暦和暦表(1844,弘化,1,12 / 2). 西暦和暦表(1845,弘化,2,[]). 西暦和暦表(1846,弘化,3,[]). 西暦和暦表(1847,弘化,4,[]). 西暦和暦表(1848,弘化,5,[]). 西暦和暦表(1848,嘉永,1,2 / 28). 西暦和暦表(1849,嘉永,2,[]). 西暦和暦表(1850,嘉永,3,[]). 西暦和暦表(1851,嘉永,4,[]). 西暦和暦表(1852,嘉永,5,[]). 西暦和暦表(1853,嘉永,6,[]). 西暦和暦表(1854,嘉永,7,[]). 西暦和暦表(1854,安政,1,11 / 27). 西暦和暦表(1855,安政,2,[]). 西暦和暦表(1856,安政,3,[]). 西暦和暦表(1857,安政,4,[]). 西暦和暦表(1858,安政,5,[]). 西暦和暦表(1859,安政,6,[]). 西暦和暦表(1860,安政,7,[]). 西暦和暦表(1860,万延,1,3 / 18). 西暦和暦表(1861,万延,2,[]). 西暦和暦表(1861,文久,1,2 / 19). 西暦和暦表(1862,文久,2,[]). 西暦和暦表(1863,文久,3,[]). 西暦和暦表(1864,文久,4,[]). 西暦和暦表(1864,元治,1,2 / 20). 西暦和暦表(1865,元治,2,[]). 西暦和暦表(1865,慶応,1,4 / 8). 西暦和暦表(1866,慶応,2,[]). 西暦和暦表(1867,慶応,3,[]). 西暦和暦表(1868,慶応,4,[]). 西暦和暦表(1868,明治,1,9 / 8). 西暦和暦表(1869,明治,2,[]). 西暦和暦表(1870,明治,3,[]). 西暦和暦表(1871,明治,4,[]). 西暦和暦表(1872,明治,5,[]). 西暦和暦表(1873,明治,6,[]). 西暦和暦表(1874,明治,7,[]). 西暦和暦表(1875,明治,8,[]). 西暦和暦表(1876,明治,9,[]). 西暦和暦表(1877,明治,10,[]). 西暦和暦表(1878,明治,11,[]). 西暦和暦表(1879,明治,12,[]). 西暦和暦表(1880,明治,13,[]). 西暦和暦表(1881,明治,14,[]). 西暦和暦表(1882,明治,15,[]). 西暦和暦表(1883,明治,16,[]). 西暦和暦表(1884,明治,17,[]). 西暦和暦表(1885,明治,18,[]). 西暦和暦表(1886,明治,19,[]). 西暦和暦表(1887,明治,20,[]). 西暦和暦表(1888,明治,21,[]). 西暦和暦表(1889,明治,22,[]). 西暦和暦表(1890,明治,23,[]). 西暦和暦表(1891,明治,24,[]). 西暦和暦表(1892,明治,25,[]). 西暦和暦表(1893,明治,26,[]). 西暦和暦表(1894,明治,27,[]). 西暦和暦表(1895,明治,28,[]). 西暦和暦表(1896,明治,29,[]). 西暦和暦表(1897,明治,30,[]). 西暦和暦表(1898,明治,31,[]). 西暦和暦表(1899,明治,32,[]). 西暦和暦表(1900,明治,33,[]). 西暦和暦表(1901,明治,34,[]). 西暦和暦表(1902,明治,35,[]). 西暦和暦表(1903,明治,36,[]). 西暦和暦表(1904,明治,37,[]). 西暦和暦表(1905,明治,38,[]). 西暦和暦表(1906,明治,39,[]). 西暦和暦表(1907,明治,40,[]). 西暦和暦表(1908,明治,41,[]). 西暦和暦表(1909,明治,42,[]). 西暦和暦表(1910,明治,43,[]). 西暦和暦表(1911,明治,44,[]). 西暦和暦表(1912,明治,45,[]). 西暦和暦表(1912,大正,1,7 / 30). 西暦和暦表(1913,大正,2,[]). 西暦和暦表(1914,大正,3,[]). 西暦和暦表(1915,大正,4,[]). 西暦和暦表(1916,大正,5,[]). 西暦和暦表(1917,大正,6,[]). 西暦和暦表(1918,大正,7,[]). 西暦和暦表(1919,大正,8,[]). 西暦和暦表(1920,大正,9,[]). 西暦和暦表(1921,大正,10,[]). 西暦和暦表(1922,大正,11,[]). 西暦和暦表(1923,大正,12,[]). 西暦和暦表(1924,大正,13,[]). 西暦和暦表(1925,大正,14,[]). 西暦和暦表(1926,大正,15,[]). 西暦和暦表(1926,昭和,1,12 / 25). 西暦和暦表(1927,昭和,2,[]). 西暦和暦表(1928,昭和,3,[]). 西暦和暦表(1929,昭和,4,[]). 西暦和暦表(1930,昭和,5,[]). 西暦和暦表(1931,昭和,6,[]). 西暦和暦表(1932,昭和,7,[]). 西暦和暦表(1933,昭和,8,[]). 西暦和暦表(1934,昭和,9,[]). 西暦和暦表(1935,昭和,10,[]). 西暦和暦表(1936,昭和,11,[]). 西暦和暦表(1937,昭和,12,[]). 西暦和暦表(1938,昭和,13,[]). 西暦和暦表(1939,昭和,14,[]). 西暦和暦表(1940,昭和,15,[]). 西暦和暦表(1941,昭和,16,[]). 西暦和暦表(1942,昭和,17,[]). 西暦和暦表(1943,昭和,18,[]). 西暦和暦表(1944,昭和,19,[]). 西暦和暦表(1945,昭和,20,[]). 西暦和暦表(1946,昭和,21,[]). 西暦和暦表(1947,昭和,22,[]). 西暦和暦表(1948,昭和,23,[]). 西暦和暦表(1949,昭和,24,[]). 西暦和暦表(1950,昭和,25,[]). 西暦和暦表(1951,昭和,26,[]). 西暦和暦表(1952,昭和,27,[]). 西暦和暦表(1953,昭和,28,[]). 西暦和暦表(1954,昭和,29,[]). 西暦和暦表(1955,昭和,30,[]). 西暦和暦表(1956,昭和,31,[]). 西暦和暦表(1957,昭和,32,[]). 西暦和暦表(1958,昭和,33,[]). 西暦和暦表(1959,昭和,34,[]). 西暦和暦表(1960,昭和,35,[]). 西暦和暦表(1961,昭和,36,[]). 西暦和暦表(1962,昭和,37,[]). 西暦和暦表(1963,昭和,38,[]). 西暦和暦表(1964,昭和,39,[]). 西暦和暦表(1965,昭和,40,[]). 西暦和暦表(1966,昭和,41,[]). 西暦和暦表(1967,昭和,42,[]). 西暦和暦表(1968,昭和,43,[]). 西暦和暦表(1969,昭和,44,[]). 西暦和暦表(1970,昭和,45,[]). 西暦和暦表(1971,昭和,46,[]). 西暦和暦表(1972,昭和,47,[]). 西暦和暦表(1973,昭和,48,[]). 西暦和暦表(1974,昭和,49,[]). 西暦和暦表(1975,昭和,50,[]). 西暦和暦表(1976,昭和,51,[]). 西暦和暦表(1977,昭和,52,[]). 西暦和暦表(1978,昭和,53,[]). 西暦和暦表(1979,昭和,54,[]). 西暦和暦表(1980,昭和,55,[]). 西暦和暦表(1981,昭和,56,[]). 西暦和暦表(1982,昭和,57,[]). 西暦和暦表(1983,昭和,58,[]). 西暦和暦表(1984,昭和,59,[]). 西暦和暦表(1985,昭和,60,[]). 西暦和暦表(1986,昭和,61,[]). 西暦和暦表(1987,昭和,62,[]). 西暦和暦表(1988,昭和,63,[]). 西暦和暦表(1989,昭和,64,[]). 西暦和暦表(1989,平成,1,1 / 7). 西暦和暦表(1990,平成,2,[]). 西暦和暦表(1991,平成,3,[]). 西暦和暦表(1992,平成,4,[]). 西暦和暦表(1993,平成,5,[]). 西暦和暦表(1994,平成,6,[]). 西暦和暦表(1995,平成,7,[]). 西暦和暦表(1996,平成,8,[]). 西暦和暦表(1997,平成,9,[]). 西暦和暦表(1998,平成,10,[]). 西暦和暦表(1999,平成,11,[]). 西暦和暦表(2000,平成,12,[]). 西暦和暦表(2001,平成,13,[]). 西暦和暦表(2002,平成,14,[]). 西暦和暦表(2003,平成,15,[]). 西暦和暦表(2004,平成,16,[]). 西暦和暦表(2005,平成,17,[]). 西暦和暦表(2006,平成,18,[]). 西暦和暦表(2007,平成,19,[]). 西暦和暦表(2008,平成,20,[]). 西暦和暦表(2009,平成,21,[]). 西暦和暦表(2010,平成,22,[]). 西暦和暦表(2011,平成,23,[]). 西暦和暦表(2012,平成,24,[]). 西暦和暦表(2013,平成,25,[]). 西暦和暦表(2014,平成,26,[]). '年漢字表現'(1,['元','年']). '年漢字表現'(2,['二','年']). '年漢字表現'(3,['三','年']). '年漢字表現'(4,['四','年']). '年漢字表現'(5,['五','年']). '年漢字表現'(6,['六','年']). '年漢字表現'(7,['七','年']). '年漢字表現'(8,['八','年']). '年漢字表現'(9,['九','年']). '年漢字表現'(10,['十','年']). '年漢字表現'(11,['十','一','年']). '年漢字表現'(12,['十','二','年']). '年漢字表現'(13,['十','三','年']). '年漢字表現'(14,['十','四','年']). '年漢字表現'(15,['十','五','年']). '年漢字表現'(16,['十','六','年']). '年漢字表現'(17,['十','七','年']). '年漢字表現'(18,['十','八','年']). '年漢字表現'(19,['十','九','年']). '年漢字表現'(20,['二','十','年']). '年漢字表現'(21,['二','十','一','年']). '年漢字表現'(22,['二','十','二','年']). '年漢字表現'(23,['二','十','三','年']). '年漢字表現'(24,['二','十','四','年']). '年漢字表現'(25,['二','十','五','年']). '年漢字表現'(26,['二','十','六','年']). '年漢字表現'(27,['二','十','七','年']). '年漢字表現'(28,['二','十','八','年']). '年漢字表現'(29,['二','十','九','年']). '年漢字表現'(30,['三','十','年']). '年漢字表現'(31,['三','十','一','年']). '年漢字表現'(32,['三','十','二','年']). '年漢字表現'(33,['三','十','三','年']). '年漢字表現'(34,['三','十','四','年']). '年漢字表現'(35,['三','十','五','年']). '年漢字表現'(36,['三','十','六','年']). '年漢字表現'(37,['三','十','七','年']). '年漢字表現'(38,['三','十','八','年']). '年漢字表現'(39,['三','十','九','年']). '年漢字表現'(40,['四','十','年']). '年漢字表現'(41,['四','十','一','年']). '年漢字表現'(42,['四','十','二','年']). '年漢字表現'(43,['四','十','三','年']). '年漢字表現'(44,['四','十','四','年']). '年漢字表現'(45,['四','十','五','年']). '年漢字表現'(46,['四','十','六','年']). '年漢字表現'(47,['四','十','七','年']). '年漢字表現'(48,['四','十','八','年']). '年漢字表現'(49,['四','十','九','年']). '年漢字表現'(50,['五','十','年']). '年漢字表現'(51,['五','十','一','年']). '年漢字表現'(52,['五','十','二','年']). '年漢字表現'(53,['五','十','三','年']). '年漢字表現'(54,['五','十','四','年']). '年漢字表現'(55,['五','十','五','年']). '年漢字表現'(56,['五','十','六','年']). '年漢字表現'(57,['五','十','七','年']). '年漢字表現'(58,['五','十','八','年']). '年漢字表現'(59,['五','十','九','年']). '年漢字表現'(60,['六','十','年']). '年漢字表現'(61,['六','十','一','年']). '年漢字表現'(62,['六','十','二','年']). '年漢字表現'(63,['六','十','三','年']). '年漢字表現'(64,['六','十','四','年']). '年漢字表現'(65,['六','十','五','年']). '年漢字表現'(66,['六','十','六','年']). '年漢字表現'(67,['六','十','七','年']). '年漢字表現'(68,['六','十','八','年']). '年漢字表現'(69,['六','十','九','年']). '元号年の元号の頭文字,年,月および日で表記された日付を入力する'(_元号年の元号の頭文字,_年,_月,_日) :-   write('元号の頭文字,年,月,日 :'),   get_split_line([','],[_元号年の元号の頭文字,_年,_月,_日]). '元号年の元号の頭文字,年,月および日で表記された日付を入力させ,その年の元日からその日付までの日数を計算し,結果を表示する' :-   '元号年の元号の頭文字,年,月および日で表記された日付を入力する'(_元号年の元号の頭文字,_年,_月,_日),   元号の頭文字をローマ字変換した時にの最初の文字(_元号,_元号年の元号の頭文字),   元年の西暦は(_元号,_元年の西暦年),   _西暦年 is _元年の西暦年 + _年 - 1,   その年の元日からその日付までの日数を計算する(_西暦年,_月,_日,_日数),   write_formatted('その年の元旦からの日数は%t日です。\n',[_日数]). その年の元日からその日付までの日数を計算する(_西暦年,_月,_日,_日数) :-   年初から前月末日までの日数(_西暦年,_月,_前月末日までの日数),   _日数 is _前月末日までの日数 + _日. 年初から前月末日までの日数(_西暦年,_月,_前月末日までの日数) :-   N is _月 - 1,   findsum(_日数,(for(1,M,N),月の日数(_西暦年,_月,_日数)),_前月末日までの日数). 元号の頭文字をローマ字変換した時にの最初の文字(明治,m). 元号の頭文字をローマ字変換した時にの最初の文字(大正,t). 元号の頭文字をローマ字変換した時にの最初の文字(昭和,s). 元号の頭文字をローマ字変換した時にの最初の文字(平成,h). 元年の西暦は(明治,1868). 元年の西暦は(大正,1912). 元年の西暦は(大正,1926). 元年の西暦は(昭和,1989). 月の日数(_,_月,31) :- member(_月,[1,3,5,7,8,10,12]). 月の日数(_,_月,30) :- member(_月,[4,6,8,10]). 月の日数(_年,2,29) :- うるう年(_年). 月の日数(_年,2,28) :- \+(うるう年(_年)). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4),fail. 月別日数ならび(平年,[31,28,31,30,31,30,31,31,30,31,30,31]). 月別日数ならび(うるう年,[31,29,31,30,31,30,31,31,30,31,30,31]). うるう年回数(_起点西暦年,_終点西暦年,_うるう年回数) :- count((for(_起点西暦年,N,_終点西暦年),うるう年(N)),_うるう年回数). 今日は元旦から何日目(_年,_月,_日,_元旦から何日目) :- うるう年(_年), 月別日数ならび(うるう年,_月別日数ならび), N1 is _月-1, append(L1,_,_月別日数ならび), length(L1,N1), sum(L1,_前月までの合計日数), _元旦から何日目 is _前月までの合計日数 + _日,!. 今日は元旦から何日目(_年,_月,_日,_元旦から何日目) :- \+(うるう年(_年)), 月別日数ならび(平年,_月別日数ならび), N1 is _月-1, append(L1,_,_月別日数ならび), length(L1,N1), sum(L1,_前月までの合計日数), _元旦から何日目 is _前月までの合計日数 + _日,!. 今日から大晦日まで何日あるか(_年,_月,_日,_何日) :- うるう年(_年), 今日は元旦から何日目(_年,_月,_日,_元旦から何日目), _何日 is 366 - _元旦から何日 + 1. 今日から大晦日まで何日あるか(_年,_月,_日,_何日) :- \+(うるう年(_年)), 今日は元旦から何日目(_年,_月,_日,_元旦から何日目), _何日 is 365 - _元旦から何日 + 1. % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/789 # # [TABLE1] # # key1 key2 data # ------------------------------------ # AAA 01 zzz # AAA 02 yyy # BBB 01 xxx # BBB 03 www # CCC 02 vvv # DDD 03 uuu # # # # [TABLE2] # key1 data # ------------------------------------ # MMM 01&02 # NNN 01only # OOO 02only # # # このようなテーブルから、以下のデータを抽出したいです。 # # # # key1 key2 data1 data2 # --------------------------------------------- # AAA 01 zzz 01&02 # BBB 01 xxx 01only # CCC 02 vvv 02only # # # TABLE1のKEYはkey1とkey2です。 # このTABLE1から、各key1に対して一意にデータを抽出します。 # 抽出はkey2の値が01と02のもののみを対象とし、 # 01があれば01のデータを、なければ02のデータを引っ張ってきます(data1)。 # # さらに、各key1におけるkey2の状況?をdata2として付加したいです。 # ここではTABLE2に格納されていることにしましたが、 # 条件文で単に文字列を設定するのでも構いません。 # # SQLServer2000を使用します。 # どのようなSQLを書けばよいでしょうか? # よろしくお願いします。 # # 'TABLE1から、各key1に対してkey2の値が01と02のもののみを対象とし、01があれば01のデータを、なければ02のデータを抽出し各key1におけるkey2の状況をdata2として付加してTABLE2に追加して出力' :- findsetof(_key1,('TATLE1'(_key1,_key2,_data),key2の対象は01か02のみ(_key2)),L1), 見出し, member(_key1,L1), '01があれば01のデータを、なければ02のデータを抽出し各key1におけるkey2の状況をdata2として付加'(_key1,L2), write_formatted('%t %t %t %t\n',L2), fail. 'TABLE1から、各key1に対してkey2の値が01と02のもののみを対象とし、01があれば01のデータを、なければ02のデータを抽出し各key1におけるkey2の状況をdata2として付加してTABLE2に追加して出力'. key2の対象は01か02のみ('01') :- !. key2の対象は01か02のみ('02') :- !. '01があれば01のデータを、なければ02のデータを抽出し各key1におけるkey2の状況をdata2として付加'(_key1,X) :- findall([_key1,_key2,_data],'01があれば01のデータを、なければ02のデータを抽出し'(_key1,_key2,_data),L), 各key1におけるkey2の状況(L,X), X = [_,_,_,TABLE2data], assertz('TABLE2'(_key1,TABLE2data)),!. '01があれば01のデータを、なければ02のデータを抽出し'(_key1,'01',_data) :- 'TABLE1'(_key1,'01',_data). '01があれば01のデータを、なければ02のデータを抽出し'(_key1,'02',_data) :- 'TABLE1'(_key1,'02',_data). 各key1におけるkey2の状況([[_key1,'01',_data]],[_key1,'01',_data,'01only']) :- !. 各key1におけるkey2の状況([[_key1,'02',_data]],[_key1,'02',_data,'02only']) :- !. 各key1におけるkey2の状況([[_key1,'01',_data],[_key1,'02',_]],[_key1,'01',_data,'01&02']) :- !. 各key1におけるkey2の状況([[_key1,'02',_],[_key1,'01',_data]],[_key1,'01',_data,'01&02']) :- !. 見出し :- write('key1 key2 data1 data2 \n'-----------------------------------\n'). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/751 # # # 年月日と金額を持ったテーブルがあります。前年度合計と今年度合計を出したいのですが、 # # 年月日 金額 # 20080402 200 # 20080404 200 # 20090401 100 # 20090401 500 # 20090404 300 # # とあった場合、↓にしたいです # # 年月日 今年度合計 前年度合計 # 20090401 600 0 # 20090402 0 200 # 20090404 300 200 # # 両年度金額が無い場合は表示無しで、年月日は8桁の数値型です。 # うるう年は考慮しなくて構いません。 年月日と金額を持ったテーブルがあります。前年度合計と今年度合計を出したいのですが :- 初めに重複しない年月日ならびを取り出します(_重複しない年月日ならび), 見出しです, 重複しない年月日ならびから順に年月日を取り出し今年度合計と前年度合計を計算して表示します(_重複しない年月日ならび). 初めに重複しない年月日ならびを取り出します(_重複しない年月日ならび) :- findsetof(_年月日,テーブル(_年月日,_),_重複しない年月日ならび). 見出しです :- write_formatted('%8s %10s %10s\n',[年月日,今年度合計,前年度合計]). 重複しない年月日ならびから順に年月日を取り出し今年度合計と前年度合計を計算して表示します([]) :- !. 重複しない年月日ならびから順に年月日を取り出し今年度合計と前年度合計を計算して表示します([_年月日|R]) :- _前年同日 is _年月日 - 10000, ある年月日の金額合計(_年月日,_今年度合計), その前年同日の金額合計(_前年同日,_前年度合計), 年月日と今年度合計と前年度合計を表示します(_年月日,_今年度合計,_前年度合計), 重複しない年月日ならびから順に年月日を取り出し今年度合計と前年度合計を計算して表示します(R). ある年月日の金額合計(_年月日,_金額合計) :- findsum(_金額,(テーブル(_年月日,_金額),_金額合計). その前年同日の金額合計(_前年同日,_前年同日金額合計) :- findsum(_前年同日金額,(テーブル(_前年同日,_前年同日金額),_前年同日金額合計). 年月日と今年度合計と前年度合計を表示します(_年月日,_今年度合計,_前年度合計) :- write_formatted('%t %10.0f %10.0f\n',[_年月日,_今年度合計,_前年度合計]). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/713 # # # A B C # - - - # 1 3 a # 1 5 b # 2 8 c # 2 4 d # 2 6 e # 3 3 f # 3 1 g # # 上記のようなSAMPLEテーブルがあるとき、 # AごとにBが最大となるレコードのCを得たい、 # つまり、抽出結果を下記のようにしたいと考えています。 # # A C # - - # 1 b # 2 c # 3 f 'SAMPLE'('1','3','a'). 'SAMPLE'('1','5','b'). 'SAMPLE'('2','8','c'). 'SAMPLE'('2','4','d'). 'SAMPLE'('2','6','e'). 'SAMPLE'('3','3','f'). 'SAMPLE'('3','1','g'). 'AごとにBが最大となるレコードのCを得る'(X,Y) :- findsetof(A,'SAMPLE'(A,_,_),L), member(A,L), findmax([B,A,C],'SAMPLE'(A,B,C),[_,X,Y]). findsetof(A,B,C) :- findall(A,B,L), setof(A,member(A,L),C). findmax(A,P,X) :- findall(A,P,L), sort(L,L2), last(L2,X). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/599 # # 以下のSQLで最新日の2000円以上の売上があった商品を抽出しているんですが、 # SELECT * FROM SALES WHERE uriage >= 2000 AND date = (select max(date) from SALES) # 「その商品の前回売上があった日の売上額」と「前回の売上と比べてどれだけ増えたのかの増加率」 # を出したい場合どうしたらいいでしょう? # # 商品ID(id) | 日付(date) | 売上額(uriage) | 前回売上額 | 売上増加率 # 3 | 1267714800 | 2500 | ????? | ????? # 4 | 1267714800 | 2800 | ????? | ????? # # [日付の形式はunixtimeで、データ登録の際は日付だけ変更させ、時間と秒は常に統一させています] # [mysql 5.1] # 前回売上との比較売上表(_年/_月/_日) :-     findall(_商品ID,(売上(_商品ID,_日付,_),localtime(_日付,_年,_月,_日,_,_,_,_)),_売上のあった商品IDならび), sort(_売上のあった商品IDならび     member(_商品ID2,_売上のあった商品IDならび),     当日の売上金額計(_商品ID2,_年/_月/_日,_売上金額計),     前回売上があった日(_商品ID2,_日付,_前回売上があった日),     前回売上があった日の売上金額計(_商品ID2,_前回売上があった日,_前回売上があった日の売上金額計),     売上行表示(_商品ID2,_年/_月/_日,_売上金額計,_前回売上があった日の売上金額計),     fail. 前回売上との比較売上表(_,_,_). 前回売上があった日(_商品ID,_日付,_前回売上があった日) :-     localtime(_日付,_年1,_月1,_日1,_,_,_,_),     findmax(_年2/_月2/_日2,(売上(_商品ID,_日付2,_),localtime(_日付2,_年2,_月2,_日2,_,_,_,_),_年1/_月1,_日1 @> _年2/_月2/_日2),_前回売上があった日). 前回売上があった日の売上金額計(_商品ID,_年/_月/_日,_売上金額計) :-     findsum(_売上金額,(売上(_商品ID,_日付2,_売上金額),localtime(_日付2,_年,_月,_日,_,_,_,_)),_売上金額計). 当日の売上金額計(_商品ID,_年/_月/_日,_売上金額計) :-     findsum(_売上金額,(売上(_商品ID,_日付,_売上金額),localtime(_日付,_年,_月,_日,_,_,_,_)),_売上金額計). 売上行表示(_商品ID,_年/_月/_日,_売上金額計,0.0) :-     write_formatted('%8d | %2d/%2d/%2d | %12.0f\n',[_商品ID2,_年/_月/_日,_売上金額計]),!. 売上行表示(_商品ID,_年/_月/_日,_売上金額計,_前回売上金額計) :-     _売上増加率 is _売上金額計 / _前回売上のあった日の売上金額計,     write_formatted('%8d | %2d/%2d/%2d | %12.0f | %12.0f | %4.1f\n',[_商品ID,_年/_月/_日,_売上金額計,_前回売上金額計,_売上増加率]),!. % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/594 # #(問) # ID | DATE     | DATA # --+----------+----- # 1 | 2007-11-11 | aaa # 2 | 2007-11-11 | bbb # 1 | 2007-11-10 | ccc # 3 | 2007-11-12 | ddd # 3 | 2007-11-11 | eee # 4 | 2007-11-10 | fff # 1 | 2007-11-12 | ggg # # このようなテーブルから、各idに対して最新の5件だけ抽出しなさい 各idに対して最新の5件だけ抽出する(_テーブル名,L) :-    functor(Q,_テーブル名,3),    重複を排除したidならびの抽出(ID,Q,L1),    整列(L1,L2),    findall(L3,(member(ID,L1),idに対して最新の5件だけ抽出する(ID,Q,L3)),L). idに対して最新の5件だけ抽出する(ID,Q,L) :-    目標Qの第一引数はID(ID,Q),    idに対して組ならびを抽出する(Q,L3),    最新の5件だけ抽出する(L3,L). idに対して組ならびを抽出する(Q,L3) :-    findall(L1,(call(Q),引数部分だけ抽出する(Q,L1)),L2),    整列(L2,L3),!. 重複を排除したidならびの抽出(ID,Q,L1) :- setof(ID,Q,L1). 目標Qの第一引数はID(ID,Q) :- arg(1,Q,ID),!.    引数部分だけ抽出する(Q,L1) :- Q =.. [_|L1]. 最新の5件だけ抽出する(L3,L) :-    length(L,5),    append(_,L,L3),!. 最新の5件だけ抽出する(L,L) :- !. % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/521 # # 販売集計処理について教えてください。 # 商品テーブル # 商品名 販売本数 # ─── ──── # お菓子 # お弁当 # 飲み物 # # 販売履歴テーブル # 商品名 # ─── # 商品テーブルの各商品が、販売履歴テーブルに何件ずつあるかを集計し、 # 商品テーブルの販売本数に記録させたいと思っております(日次処理)。 販売履歴(飲み物). 販売履歴(お菓子). 販売履歴(お弁当). 販売履歴(お菓子). 販売履歴(お菓子). 販売履歴(飲み物). 販売履歴(お弁当). 販売履歴(お弁当). 販売集計処理 :-   一意な商品名ならびを得る(L),   商品テーブルに追加(L). 一意な商品名ならびを得る(L) :- setof(_商品名,販売履歴(_商品名),L). 商品テーブルに追加([]) :- !. 商品テーブルに追加([_商品名|R]) :-   count(販売履歴(_商品名),_販売本数),   assertz(商品(_商品名,_販売本数)),   商品テーブルに追加(R). 販売履歴(飲み物). % 以下のサイトは % *** user: findsetof / 3 *** findsetof(A,B,L) :- findall(A,B,C), setof(A,member(A,C),L) . % *** user: findsetof / 3 *** findsetof(A,B,L) :- B =.. [_|L1], setof(A,L1 ^ B,L). % *** user: findsetof / 3 *** findsetof(A,B,L) :- term_variables(B,VL), setof(A,VL ^ B,L) % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1263824755/826 # # [1] 授業単元:C++  # [2] 問題文(含コード&リンク): # 任意の整数から整数までの合計を計算するプログラムを作成せよ。ただし、必ず、(始めに入れた数字)<(最後に入れた数字)となるように数値を入力するものとする。 # 始めの数を入力せよ # 156 # 終わりの数を入力せよ # 328 # 156から328までの合計は41866です。 # # 上の問題では(始めに入れた数字)<(最後に入れた数字)としたが、これを、(始めに入れた数字)≧(最後に入れた数字)と入力しても合計を計算できるようなプログラムも作成せよ # 任意の整数から整数までの合計を計算する(_開始整数,_終了整数,_合計) :- findsum(N,for(_開始整数,N,_終了整数),_合計). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1263824755/683 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): http://ime.nu/ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10530.zip # ポーカープログラム # # 1,二つのクラス(Card,Deck)が与えられていて、 # game1.hとgame1.cppのプラグラムを書け。 # このプログラムはデッキから5枚配る事を1回とし、 # その中に何回ペアまたはフラッシュ(同じ手札に同じマークが5枚揃う事)が # あるかの10000回の統計であり、以下を表示させること # # 何回の統計か # そのうち何個の手札がペアを持つか # そのうち何個の手札がフラッシュを持つか # ペアは全体の何%か # フラッシュは全体の何%か # # 無作為化する為に以下を必ず含める事 # stand(unsigned)time(NULL); # # #2,新しいクラスhand(hand.hとhand.cpp)と、これを実行させる為の # game2.hとgame2.cppを書け。 # これはカードの配布、ペア・フラッシュの確認、そしてデッキにカードを戻す為の # プログラムである。 # ペアまたはフラッシュの出現度数(_回数,_ペアの度数,_フラッシュの度数) :- findsum([M1,M2],(for(1,N,_回数),トランプの準備([A,B,C,D,E|R]),役([A,B,C,D,E],M1,M2)),[_ペアの度数,_フラッシュの度数]). 役(L,1,0) :- sort(L,L1),ペア(L1),!. 役([A|R],0,1) :- sub_atom(A,1,1,_,_種類),フラッシュ(_種類,R),!. ペア([A,B]) :- sub_atom(A,0,1,_,C),sub_atom(B,0,1,_,C),!. ペア([A,B,C|R]) :- sub_atom(A,0,1,_,E),sub_atom(B,0,1,_,E),sub_atom(C,0,1,_,E),ペア(R),!. ペア([A,B,C|R]) :- sub_atom(A,0,1,_,E),sub_atom(B,0,1,_,E),\+(sub_atom(C,0,1,_,E)),!. ペア([A|R]) :- ペア(R). フラッシュ(_,[]) :- !. フラッシュ(A,[B|R]) :- sub_atom(B,1,1,_,A),フラッシュ(A,R). トランプの準備(X) :- findall(U,(for(1,N,52),一枚のカードを作る(N,U)),_整列したカード), トランプを切るようにならびを切る(41,53,_整列したカード,X),!. 一枚のカードを作る(N,U) :- M is N mod 13, M2 is (N - 1) // 13, 数字カード・絵カード(M,U1), カードの種類(M2,U2), concat_atom([U1,U2],U),!. 数字カード・絵カード(1,'A') :- !. 数字カード・絵カード(10,'T') :- !. 数字カード・絵カード(11,'J') :- !. 数字カード・絵カード(12,'Q') :- !. 数字カード・絵カード(0,'K') :- !. 数字カード・絵カード(N,N). カードの種類(0,s) :- !. カードの種類(1,h) :- !. カードの種類(2,d) :- !. カードの種類(3,c) :- !. トランプを切るようにならびを切る(0,_要素数,L,L) :- !. トランプを切るようにならびを切る(N,_要素数,L,X) :- M1 is (random mod _要素数) + 1, M2 is (random mod _要素数) + 1, \+(M1=M2), swap_nth(M1,M2,L,L1), N2 is N - 1, トランプを切るようにならびを切る(N2,_要素数,L1,X),!. トランプを切るようにならびを切る(N,_要素数,L,X) :- トランプを切るようにならびを切る(N,_要素数,L,X),!. swap_nth(M,N,L1,L2) :- list_nth(M,L1,A), list_nth(N,L1,B), swap(A,B,L1,L2),!. swap(A,B,L,LX) :- append(L1,[A|L2],[B|L3],L), append(L1,[B|L2],[A|L3],LX),!. swap(A,B,L,LX) :- append(L1,[B|L2],[A|L3],L), append(L1,[A|L2],[B|L3],LX),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1263824755/307 # # [1] Cプログラミング入門: # [2] http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10460.txt # '4:配列 COM に含まれる配列 MAN の数字の個数 count を求めよ'(COM,MAN,Count) :- '配列 COM に含まれる配列 MAN の数字の個数 count を求めよ'(COM,MAN,L), findsum(M,member([_,M],L),Count),!. count([],0) :- !. count([_|R],Count) :- count(R,Count1),Count is Count1 + 1,!. count(P,Count) :- findsum(1,P,Count). '配列 COM に含まれる配列 MAN の数字の個数 count を求めよ'(COM,[],[]) :- !. '配列 COM に含まれる配列 MAN の数字の個数 count を求めよ'(COM,[N|R1],[[N,Count]|R2]) :- count(member(N,COM),Count), '配列 COM に含まれる配列 MAN の数字の個数 count を求めよ'(COM,R1,R2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1263824755/200 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): # A組、B組、C組にそれぞれn人の生徒がいて、 # A組の生徒が一列に並んでいる。 # このとき、B組の生徒をA組の生徒の隣に並ばせたいが # なるべく隣同士で身長に差がないようにしたい。 # どうやって計算すればいいでしょう? # 加えて、C組の生徒もB組の隣に並ばせたい場合はどうすれば? # (身長の配列) double height_a[n], height_b[n], height_c[n]; なるべく隣同士で身長に差のない並び方(La,Lb,N,LbX) :- findmin([S,L],ならび候補(La,Lb,N,L,S),Min), Min = [_,LbX],!. ならび候補(La,Lb,N,L,S) :- 順列(Lb,N,L), findsum(U,(for(1,M,N),list_nth(M,La,A),list_nth(M,L,B),U is (B-A) ^ 2),S). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1263824755/124 # # [1] 授業単元: Cプログラミング入門 # [2] 問題文(含コード&リンク): 入力された2つの文字列(日本語その他バイト文字は不可) # を比較するプログラムを作成せよ。ただし、大文字小文字の違いは無視。単語間に連続して # スペース・タブが複数入っていても単独のスペースとしない。 # # [5] その他の制限: 文字列とポインタまでやってます。 # 入力に関して、キーボードから1つ目の文字列を1行で入力し、改行する。 # この時、入力を促す文字は一切表示しない。入力文字数は128文字まで。 # 出力に関して、一致すれば何も表示しない。不一致の場合は最初に不一致となる # 入力1の文字と入力2の文字(1文字+スペース+1文字+改行)を表示する。 # どちらかが末端の場合は代わりにスペースで埋める。 複数の整数を平均値に近い順にソートする(_整数ならび,_平均値に近い順に整列された整数ならび) :- 'キーボードからまず、入力する整数の個数を入力(最大で100とする)し、改行'(_入力する整数の個数), 指定した数の整数をスペース1つ開けて1行で入力する(_入力する整数の個数,_整数ならび), 相加平均(_整数ならび,_平均値の一), _平均値 is truncate(_平均値の一), 平均値からの隔たりによる整列(_平均値からの隔たりのならび,_平均値,_平均値からの隔たりを鍵として付加して整列された整数ならび), 整列した整数をスペース1つのみあけて1行で出力する(_平均値からの隔たりを鍵として付加して整列された整数ならび). 'キーボードからまず、入力する整数の個数を入力(最大で100とする)し、改行'(_入力する整数の個数) :- repeat, get_integer(_入力する整数の個数), _入力する整数の個数 =< 100,!. 指定した数の整数をスペース1つ開けて1行で入力する(_入力する整数の個数,_整数ならび) :- length(_整数ならび,_入力する整数の個数), get_split_line([' '],_整数ならび). 平均値からの隔たりによる整列([X|Xs],_平均値,Ys) :- U is X - _平均値, 平均値からの隔たりにより分割する(Xs,U,Y,_平均値,Littles,Bigs), 平均値からの隔たりによる整列(Littles,_平均値,Ls), 平均値からの隔たりによる整列(Bigs,_平均値,Bs), append(Ls,[X|Bs],Ys) . 平均値からの隔たりによる整列([],_,[]). 平均値からの隔たりにより分割する([X|Xs],U,Y,_平均値,[[U,X]|Ls],Bs) :- V is X - _平均値, V < U, 平均値からの隔たりにより分割する(Xs,U,Y,_平均値,Ls,Bs),!. 平均値からの隔たりにより分割する([X|Xs],U,Y,_平均値,[[U,X]|Ls],Bs) :- U is X - _平均値, X < Y, 平均値からの隔たりにより分割する(Xs,U,Y,_平均値,Ls,Bs),!. 平均値からの隔たりにより分割する([X|Xs],U,Y,_平均値,Ls,[[U,X]|Bs]) :- 平均値からの隔たりにより分割する(Xs,U,Y,_平均値,Ls,Bs) . 平均値からの隔たりにより分割する([],Y,_,[],[]). 整列した整数をスペース1つのみあけて1行で出力する([]) :- !. 整列した整数をスペース1つのみあけて1行で出力する([[A,B]]) :- write_formatted('%t\n',[A]) :- !. 整列した整数をスペース1つのみあけて1行で出力する([[B,A]|R]) :- write_formatted('%t ',[A]), 整列した整数をスペース1つのみあけて1行で出力する(R) % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/678 # # [1] 授業単元: 基礎プログラミングおよび演習 # [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10352.txt # # あるWebページに対する24時間分の閲覧者の名前、閲覧開始時刻および閲覧継続時間を表す「閲覧データ」があるとしよう。 # 1名以上の閲覧データから、閲覧している人数がもっとも多い30分刻みでの時間帯を求め、そのときの閲覧者名を印字する # プログラムを作成せよ。状況によっては日をまたぐこともあるが、ここではどの時間帯に閲覧が多いのかを知りたいので # 日の違いは考えなくてよい。各閲覧データは標準入力から、 # # 閲覧者名 # 閲覧開始時刻 閲覧継続時間 # # の2行で与えられる。ここで閲覧者名は英小文字2文字の後に4桁の数字が続く。閲覧開始時刻は24時間制での時を100倍し、 # 分を加えた数を表す4桁の数字、閲覧継続時間は分を表す高々3桁の数字である。時刻および時間は30分刻み(つまり0分か30分) # である。たとえば、 # # ku7535 # 0130 60 # # は、名前がku7535、開始時刻が1時30分、継続時間が60分、つまり1時30分から2時30分直前まで閲覧していたことを表す。 # まず閲覧データに対する構造体 user を定義し、それを要素とする大きさNの大域的な配列 users を用意せよ(Nはマクロ # である)。次に、N人分のデータを読み込むか、閲覧者名としてアスタリスク(*)が与えられるまで、標準入力から閲覧データを # 読み込み、配列 users にセットするとともに閲覧データを返す関数 int read_users(void) を作成せよ。最後に配列 users の # 先頭からn個の閲覧データを対象に、24時間中で最大人数が閲覧している30分刻みでの時間帯と、そのときの閲覧者名を印字 # する関数 void print_prime_time(int n) を定義せよ。ただし最大閲覧者数となる時間帯は一般に複数あることに注意すること。 # さらに以下のmain関数と組み合わせてプログラムを作成せよ。 標準入力から閲覧履歴読み込む(_閲覧履歴ならび) :- get_lines(Lines), 閲覧者情報の取得(Lines,_閲覧履歴ならび), 閲覧者履歴の登録(_閲覧者履歴ならび),!. 閲覧履歴の取得と登録([],[]) :- !. 閲覧履歴の取得と登録([_閲覧者名,B|R1],[[_閲覧者名,_閲覧開始時刻,_閲覧継続時間]|R2]) :- split(B,[' '],[_閲覧開始時刻,_閲覧継続時間]), assertz(閲覧履歴(_閲覧者名,_閲覧開始時刻,_閲覧継続時間)), 閲覧履歴の取得と登録(R1,R2),!. 先頭からn個の閲覧データを対象に、24時間中で最多人数が閲覧している30分刻みでの時刻と、そのときの閲覧者名を印字(N,_時,_分,_閲覧者ならび) :- 先頭からn個の閲覧データを対象に、24時間中で最多人数が閲覧している30分刻みでの時刻と、そのときの閲覧者名(N,_閲覧履歴ならび,_時刻,_閲覧者ならび), _時 is _時刻 // 100, _分 is _時刻 mod 100, concat_atom(_閲覧者ならび,' ',_閲覧者ならび表示), write_formatted('最多閲覧時間 %t時%t分から %t\n',[_時,_分,_閲覧者ならび表示]). 先頭からn個の閲覧データを対象に、24時間中で最多人数が閲覧している30分刻みでの時刻と、そのときの閲覧者名(N,_閲覧履歴ならび,_時刻,_閲覧者ならび) :- 先頭からn個の閲覧データを対象に(N,_閲覧履歴ならび,_先頭からn個のデータ), 閲覧分布ならびを作る(_先頭からn個のデータ,_履歴分布ならび), 最多閲覧者時刻(_履歴分布ならび,_最多閲覧者時刻ならび), member(_時刻,_最多閲覧者時刻), setof(_閲覧者名,member([_閲覧者名,_時刻,_],_履歴分布ならび),_閲覧者ならびの一). 先頭からn個の閲覧データを対象に(N,_閲覧履歴ならび,_先頭からn個のデータ) :- length(_先頭からn個のデータ,N), append(_先頭からn個のデータ,_,_閲覧履歴ならび),!. 閲覧分布ならびを作る([],[]) :- !. 閲覧分布ならびを作る([[_閲覧者名,_閲覧開始時刻,_閲覧継続時間]|R1],X) :- 閲覧継続時間を30分ごとに刻む(_閲覧者名,_閲覧開始時刻,_閲覧継続時間,L), 閲覧分布ならびを作る(R1,Y), append(L,Y,X). 閲覧継続時間を30分ごとに刻む(_,_,0,[]) :- !. 閲覧継続時間を30分ごとに刻む(_閲覧者名,_閲覧開始時刻,_閲覧継続時間,[[_閲覧者名,_閲覧開始時刻,30]|R]) :- 次の30分を閲覧開始時刻とする(_閲覧開始時刻,_次の閲覧開始時刻), _閲覧継続時間2 is _閲覧継続時間 - 30, 閲覧継続時間を30分ごとに刻む(_閲覧者名,_次の閲覧開始時刻,_閲覧継続時間2,R),!. 次の30分を閲覧開始時刻とする(2330,0) :- !. 次の30分を閲覧開始時刻とする(_閲覧開始時刻,_次の閲覧開始時刻) :- 30 is _閲覧開始時刻 mod 100, _次の閲覧開始時刻 is _閲覧開始時刻 - 30 + 100,!. 次の30分を閲覧開始時刻とする(_閲覧開始時刻,_次の閲覧開始時刻) :- 0 is _閲覧開始時刻 mod 100, _次の閲覧開始時刻 is _閲覧開始時刻 + 30,!. 最多閲覧者時刻(_履歴分布ならび,_最多閲覧者時刻ならび) :- findall(L1,setof(_閲覧開始時刻,member([_,_閲覧開始時刻,_],_履歴分布ならび),L1),L2), 最多閲覧者時刻の二(L2,_履歴分布ならび,L3), findmax(Count,member([Count,_,_],L3),Max), findall([_閲覧開始時刻,_閲覧者ならび],member([Max,_閲覧開始時刻,_閲覧者ならび],L3),_最多閲覧者時刻ならび). 最多閲覧者閲覧開始時刻の二([],_,[]) :- !. 最多閲覧者閲覧開始時刻の二([[_閲覧開始時刻]|R1],_履歴分布ならび,[[Count,_閲覧開始時刻,L1]|R2]) :- findall([_閲覧者名,_閲覧開始時刻],member([_閲覧者,_閲覧開始時刻,_],_履歴分布ならび),L1), length(L1,Count), 最多閲覧者閲覧開始時刻の二(R1,_履歴分布ならび,R2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/67 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10263.txt # # 元号年の元号の頭文字,年,月および日で表記された日付を入力させ,その年の元日からその日付 # までの日数を計算し,結果を表示するプログラムを作成したい. # 明治7 年1 月32 日,大正7 年13 月14 日,昭和65 年1 月14 日,平成7年1 月14 日 # および生年月日(昭和47年3月23日)を例に動作確認しなさい(以下の実行結果を参照). # # 「元号年月日」を入力してください: M 7 1 32 # そのような元号または年月日はありません # 「元号年月日」を入力してください: T 7 13 14 # そのような元号または年月日はありません # 「元号年月日」を入力してください: S 65 1 14 # そのような元号または年月日はありません #「元号年月日」を入力してください: H 7 1 14 # 西暦1995 年1 月14 日は元日から14 日目です '元号年の元号の頭文字(ローマ字),年,月および日で表記された日付を入力させ,その年の元日からその日付までの日数を計算し,結果を表示する' :- '元号年の元号の頭文字(ローマ字),年,月および日で表記された日付を入力する'(_元号の頭文字,_年,_月,_日), 西暦の年を得る(_元号の頭文字,_年,_西暦年), 'その年の元日からその日付までの日数を計算し、結果を表示する'(_西暦年,_月,_日,_日数). '元号年の元号の頭文字,年,月および日で表記された日付を入力する'(_元号年の元号の頭文字,_年,_月,_日) :- write('元号の頭文字,年,月,日 :'), get_split_line([','],[_元号年の元号の頭文字,_年,_月,_日]). 西暦の年を得る(_元号の頭文字,_年,_西暦年) :- 元号の頭文字をローマ字変換した時の最初の文字(_元号,_元号年の元号の頭文字), 元年の西暦は(_元号,_元年の西暦年), _西暦年 is _元年の西暦年 + _年 - 1. 'その年の元日からその日付までの日数を計算し、結果を表示する'(_西暦年,_月,_日,_日数) :- 'その年の元日からその日付までの日数を計算し、'(_西暦年,_月,_日,_日数), '結果を表示する'(_日数). その年の元日からその日付までの日数を計算する(_西暦年,_月,_日,_日数) :- 年初から前月末日までの日数(_西暦年,_月,_前月末日までの日数), _日数 is _前月末日までの日数 + _日. 年初から前月末日までの日数(_西暦年,_月,_前月末日までの日数) :- N is _月 - 1, findsum(_日数,(between(1,N,M),月の日数(_西暦年,_月,_日数)),_前月末日までの日数). 元号の頭文字をローマ字変換した時にの最初の文字(明治,m). 元号の頭文字をローマ字変換した時にの最初の文字(大正,t). 元号の頭文字をローマ字変換した時にの最初の文字(昭和,s). 元号の頭文字をローマ字変換した時にの最初の文字(平成,h). 元年の西暦は(明治,1868). 元年の西暦は(大正,1912). 元年の西暦は(昭和,1926). 元年の西暦は(平成,1989). うるう年(_年) :- '400で割り切れる年はうるう年である'(_年),!. うるう年(_年) :- '4で割り切れる年で100で割り切れない年がうるう年である'(_年). '400で割り切れる年はうるう年である'(_年) :- 0 is _年 mod 400,!. '4で割り切れる年で100で割り切れない年がうるう年である'(_年) :- 0 is _年 mod 4, \+(0 is _年 mod 100). 月の日数(_,_月,_日) :- '大の月は31日、小の月は30日'(_月,_日). 月の日数(_年,2,_日) :- '二月はうるう年の場合29日、うるう年でなければ28日'(_年,_日). '大の月は31日、小の月は30日'(_月,31) :- 大の月(_月). '大の月は31日、小の月は30日'(_月,30) :- 小の月(_月). 大の月(_月) :- member(_月,[1,3,5,7,8,10,12]). 小の月(_月) :- member(_月,[4,6,9,11]). '二月はうるう年の場合29日、うるう年でなければ28日'(_年,29) :- うるう年(_年). '二月はうるう年の場合29日、うるう年でなければ28日'(_年,28) :- \+(うるう年(_年)). 元号の頭文字をローマ字変換した時の最初の文字(明治,m). 元号の頭文字をローマ字変換した時の最初の文字(大正,t). 元号の頭文字をローマ字変換した時の最初の文字(昭和,s). 元号の頭文字をローマ字変換した時の最初の文字(平成,h). '結果を表示する'(_日数) :- writef('その年の元旦からの日数は%t日です。\n',[_日数]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/557 # # [1] 授業単元: 情報数学 # [2] 問題文(含コード&リンク): # オイラー級数を用いて、πの近似値を求めよ。 オイラー級数を用いて、πの近似値を求める(_円周率) :-   findsum(U,(for(1,N,100000),U is 1 / (N * N)),Sum),   _円周率 is sqrt(6 * Sum). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/38 # # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10261.txt # 以下のプログラムを作成せよ。 。# プログラムは日付・休日かどうか・出費の分類(朝食・昼食・夕食・本・休日)、 # 出費の金額・買ったものの名前を順に尋ね、2にある構造体の配列(最大20件)に格納して # 最後に配列のデータをファイルに追記する。連続で入力できるようにし、もしユーザが # 日付で0年と入力すると終了するようにする。 # # # 課題の流れ # # ・繰り返し構造 # 年月日、休日かどうか、出費の分類、金額、商品名を聞き、 # syuppi構造体の配列に順次記録する。 # 0年と入力されたら、繰り返しを終了 # # ・配列に記録した件数分、ファイルに1行ずつ記録する # # ・プログラムの最後で、ファイルに記録されているデータを表示せよ。 # # ###分類の2進数の計算の仕方 # 1ビット目から5ビット目まで朝食、昼食、夕食、本、休日の順でビットが立つ。 # 朝食なら1、昼食なら2、夕食なら4、本なら8、休日なら16 # として、合計をとれば良い。 # 休日の夕食なら 16+4=20となる # # ###たとえば、以下の行は以下を # 休日の2009年12月11日に朝食で食パンを350円 買い # 休日の2009年12月11日にJumpという本を240円 買った # # syokupan 17 2009 12 11 350 # Jump 24 2009 12 11 200 # 解析上鍵となる言葉([休日,年,月,日,円,朝食,夕食,本,は,が,の,に,で,ために,へ,を, 買]). 入力された行動要素を分類してから数値として記録する(_記録ならび) :- findall([_年,_月,_日,_記録,_購入物,_金額]), ( 入力文の解析(_文,_解析した文の要素), ( _文=end_of_file,!,fail; 要素の分類と記録([本,夕食,朝食,昼食,休日],_解析した文の要素,0,_記録), 日付の取得(_解析した文の要素,_年,_月,_日), 購入物と金額(_購入物,_金額) ))), _記録ならび). 日付の取得(_解析した文の要素,_日付) :- member([年,_年],_解析した文の要素), member([月,_月],_解析した文の要素), member([日,_日],_解析した文の要素),!. 購入物と金額(_解析した文の要素,_購入物,_金額) :- member([購入物,_購入物],_解析した文の要素), member([金額,_金額],_解析した文の要素),!. 購入物と金額(_,なし,0). 要素の分類と記録(R,_,_数値,_数値) :- !. 要素の分類と記録([_要素|R],_解析した文の要素,_数値1,_数値) :- member(_解析した文の要素), _要素に対応した加算数字(_要素,_加算数字), _数値2 is _数値1 + _加算数字, 要素の分類と記録(R,_解析した文の要素,_数値2,_数値). 要素に対応する加算数値(朝食,1). 要素に対応する加算数値(昼食,2). 要素に対応する加算数値(夕食,4). 要素に対応する加算数値(本,8). 要素に対応する加算数値(休日,16). 入力文の解析(_文,_解析した文の要素) :- 解析上鍵となる言葉(_鍵言葉ならび), sPLIT(_文,_鍵言葉ならび,L1), 有意な要素の収集(L1,_解析した文の要素),!. 有意な要素の収集(L,L1,_解析した文要素) :- member(_出費の分類,[朝食,昼食,夕食,本,休日]), \+(member(_出費の分類,L1)), 有意な要素の収集(L,[_出費の分類|L1],_解析した文要素),!. 有意な要素の収集(L,L1,_解析した文要素) :- member(X,[年,月,日,円], \+(member([X,_],L1)), append(_,[A,X|_],L), '整数か?ただし全角文字は整数に変換する'(A,N), 有意な要素の収集(L,[[X,N]|L1],_解析した文要素),!. 有意な要素の収集(L,L1,_解析した文要素) :- append(L0,[_購入物,を|R],L), \+(member(_購入物,[本,夕食,昼食,朝食,休日])), \+(member([購入物_購入物],L1)), 有意な要素の収集(L,[[購入物,_購入物]|L1],_解析した文要素),!. 有意な要素の収集(_,解析した文要素,_解析した文要素) :- !. /* 解析上鍵となる言葉([休日,年,月,日,円,朝食,夕食,昼食,本,は,が,の,に,で,ために,へ,を,買]). 形態素解析(文,'休日の2009年12月11日に朝食で食パンを350円買い',X). */ % *** user: '全角文字列整数変換' / 4 *** '全角文字列整数変換'(E,E,_全角文字列,_整数) :- '副文字列'(_全角文字列,E,1,_全角文字), '全角文字整数変換'(_全角文字,_整数),!. '全角文字列整数変換'(N,E,_全角文字列,_整数) :- '副文字列'(_全角文字列,N,1,_全角文字), '全角文字整数変換'(_全角文字,_整数の一), F is E - N, _整数の二 'は' trunc(10 ^ F * _整数の一), M is N + 1, '全角文字列整数変換'(M,E,_全角文字列,_整数の三), _整数 'は' _整数の三 + _整数の二,!. % *** user: '全角文字列整数変換' / 2 *** '全角文字列整数変換'(_全角文字列,_整数) :- '文字列長'(_全角文字列,_文字列長), '全角文字列整数変換'(1,_文字列長,_全角文字列,_整数),!. % *** user: '全角文字整数変換' / 2 *** '全角文字整数変換'('0',0) :- !. '全角文字整数変換'('1',1) :- !. '全角文字整数変換'('2',2) :- !. '全角文字整数変換'('3',3) :- !. '全角文字整数変換'('4',4) :- !. '全角文字整数変換'('5',5) :- !. '全角文字整数変換'('6',6) :- !. '全角文字整数変換'('7',7) :- !. '全角文字整数変換'('8',8) :- !. '全角文字整数変換'('9',9) :- !. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/194 # # [1] 授業単元: プログラミング1 # [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10277.txt # # 必修課題2 # 初項1公差1の等差数列がある(An={1 2 3 4 5 ・・・n})。数値XとYを入力して、 # この数列におけるX項からY項までの数列の和を算出するプログラムを作成せよ。 # 実行結果の例を以下に示す。 # ------------------------------------------------ # 第X項から:1 # 第Y項まで:10 # 初項1公差1の等差数列において、 # 第1項から第10項までの数列の和は55です。 # ------------------------------------------------ 初項1公差1の等差数列におけるX項からY項までの数列の和を算出する(X,Y,_和) :- findsum(N,between(X,Y,N),_和). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/67 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10263.txt # # 元号年の元号の頭文字,年,月および日で表記された日付を入力させ,その年の元日からその日付 # までの日数を計算し,結果を表示するプログラムを作成したい. # 明治7 年1 月32 日,大正7 年13 月14 日,昭和65 年1 月14 日,平成7年1 月14 日 # および生年月日(昭和47年3月23日)を例に動作確認しなさい(以下の実行結果を参照). # # 「元号年月日」を入力してください: M 7 1 32 # そのような元号または年月日はありません # 「元号年月日」を入力してください: T 7 13 14 # そのような元号または年月日はありません # 「元号年月日」を入力してください: S 65 1 14 # そのような元号または年月日はありません #「元号年月日」を入力してください: H 7 1 14 # 西暦1995 年1 月14 日は元日から14 日目です '元号年の元号の頭文字(ローマ字),年,月および日で表記された日付を入力させ,その年の元日からその日付までの日数を計算し,結果を表示する' :- '元号年の元号の頭文字(ローマ字),年,月および日で表記された日付を入力する'(_元号の頭文字,_年,_月,_日), 西暦の年を得る(_元号の頭文字,_年,_西暦年), 'その年の元日からその日付までの日数を計算し、結果を表示する'(_西暦年,_月,_日,_日数). '元号年の元号の頭文字,年,月および日で表記された日付を入力する'(_元号年の元号の頭文字,_年,_月,_日) :- write('元号の頭文字,年,月,日 :'), get_split_line([','],[_元号年の元号の頭文字,_年,_月,_日]). 西暦の年を得る(_元号の頭文字,_年,_西暦年) :- 元号の頭文字をローマ字変換した時の最初の文字(_元号,_元号年の元号の頭文字), 元年の西暦は(_元号,_元年の西暦年), _西暦年 is _元年の西暦年 + _年 - 1. 'その年の元日からその日付までの日数を計算し、結果を表示する'(_西暦年,_月,_日,_日数) :- 'その年の元日からその日付までの日数を計算し、'(_西暦年,_月,_日,_日数), '結果を表示する'(_日数). その年の元日からその日付までの日数を計算する(_西暦年,_月,_日,_日数) :- 年初から前月末日までの日数(_西暦年,_月,_前月末日までの日数), _日数 is _前月末日までの日数 + _日. 年初から前月末日までの日数(_西暦年,_月,_前月末日までの日数) :- N is _月 - 1, findsum(_日数,(between(1,N,M),月の日数(_西暦年,_月,_日数)),_前月末日までの日数). 元号の頭文字をローマ字変換した時にの最初の文字(明治,m). 元号の頭文字をローマ字変換した時にの最初の文字(大正,t). 元号の頭文字をローマ字変換した時にの最初の文字(昭和,s). 元号の頭文字をローマ字変換した時にの最初の文字(平成,h). 元年の西暦は(明治,1868). 元年の西暦は(大正,1912). 元年の西暦は(昭和,1926). 元年の西暦は(平成,1989). うるう年(_年) :- '400で割り切れる年はうるう年である'(_年),!. うるう年(_年) :- '4で割り切れる年で100で割り切れない年がうるう年である'(_年). '400で割り切れる年はうるう年である'(_年) :- 0 is _年 mod 400,!. '4で割り切れる年で100で割り切れない年がうるう年である'(_年) :- 0 is _年 mod 4, \+(0 is _年 mod 100). 月の日数(_,_月,_日) :- '大の月は31日、小の月は30日'(_月,_日). 月の日数(_年,2,_日) :- '二月はうるう年の場合29日、うるう年でなければ28日'(_年,_日). '大の月は31日、小の月は30日'(_月,31) :- 大の月(_月). '大の月は31日、小の月は30日'(_月,30) :- 小の月(_月). 大の月(_月) :- member(_月,[1,3,5,7,8,10,12]). 小の月(_月) :- member(_月,[4,6,9,11]). '二月はうるう年の場合29日、うるう年でなければ28日'(_年,29) :- うるう年(_年). '二月はうるう年の場合29日、うるう年でなければ28日'(_年,28) :- \+(うるう年(_年)). 元号の頭文字をローマ字変換した時の最初の文字(明治,m). 元号の頭文字をローマ字変換した時の最初の文字(大正,t). 元号の頭文字をローマ字変換した時の最初の文字(昭和,s). 元号の頭文字をローマ字変換した時の最初の文字(平成,h). '結果を表示する'(_日数) :- writef('その年の元旦からの日数は%t日です。\n',[_日数]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/38 # # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10261.txt # 以下のプログラムを作成せよ。 。# プログラムは日付・休日かどうか・出費の分類(朝食・昼食・夕食・本・休日)、 # 出費の金額・買ったものの名前を順に尋ね、2にある構造体の配列(最大20件)に格納して # 最後に配列のデータをファイルに追記する。連続で入力できるようにし、もしユーザが # 日付で0年と入力すると終了するようにする。 # # # 課題の流れ # # ・繰り返し構造 # 年月日、休日かどうか、出費の分類、金額、商品名を聞き、 # syuppi構造体の配列に順次記録する。 # 0年と入力されたら、繰り返しを終了 # # ・配列に記録した件数分、ファイルに1行ずつ記録する # # ・プログラムの最後で、ファイルに記録されているデータを表示せよ。 # # ###分類の2進数の計算の仕方 # 1ビット目から5ビット目まで朝食、昼食、夕食、本、休日の順でビットが立つ。 # 朝食なら1、昼食なら2、夕食なら4、本なら8、休日なら16 # として、合計をとれば良い。 # 休日の夕食なら 16+4=20となる # # ###たとえば、以下の行は以下を # 休日の2009年12月11日に朝食で食パンを350円 買い # 休日の2009年12月11日にJumpという本を240円 買った # # syokupan 17 2009 12 11 350 # Jump 24 2009 12 11 200 # 解析上鍵となる言葉([休日,年,月,日,円,朝食,夕食,本,は,が,の,に,で,ために,へ,を, 買]). 入力された行動要素を分類してから数値として記録する(_記録ならび) :- findall([_年,_月,_日,_記録,_購入物,_金額]), ( 入力文の解析(_文,_解析した文の要素), ( _文=end_of_file,!,fail; 要素の分類と記録([本,夕食,朝食,昼食,休日],_解析した文の要素,0,_記録), 日付の取得(_解析した文の要素,_年,_月,_日), 購入物と金額(_購入物,_金額) ))), _記録ならび). 日付の取得(_解析した文の要素,_日付) :- member([年,_年],_解析した文の要素), member([月,_月],_解析した文の要素), member([日,_日],_解析した文の要素),!. 購入物と金額(_解析した文の要素,_購入物,_金額) :- member([購入物,_購入物],_解析した文の要素), member([金額,_金額],_解析した文の要素),!. 購入物と金額(_,なし,0). 要素の分類と記録(R,_,_数値,_数値) :- !. 要素の分類と記録([_要素|R],_解析した文の要素,_数値1,_数値) :- member(_解析した文の要素), _要素に対応した加算数字(_要素,_加算数字), _数値2 is _数値1 + _加算数字, 要素の分類と記録(R,_解析した文の要素,_数値2,_数値). 要素に対応する加算数値(朝食,1). 要素に対応する加算数値(昼食,2). 要素に対応する加算数値(夕食,4). 要素に対応する加算数値(本,8). 要素に対応する加算数値(休日,16). 入力文の解析(_文,_解析した文の要素) :- 解析上鍵となる言葉(_鍵言葉ならび), sPLIT(_文,_鍵言葉ならび,L1), 有意な要素の収集(L1,_解析した文の要素),!. 有意な要素の収集(L,L1,_解析した文要素) :- member(_出費の分類,[朝食,昼食,夕食,本,休日]), \+(member(_出費の分類,L1)), 有意な要素の収集(L,[_出費の分類|L1],_解析した文要素),!. 有意な要素の収集(L,L1,_解析した文要素) :- member(X,[年,月,日,円], \+(member([X,_],L1)), append(_,[A,X|_],L), '整数か?ただし全角文字は整数に変換する'(A,N), 有意な要素の収集(L,[[X,N]|L1],_解析した文要素),!. 有意な要素の収集(L,L1,_解析した文要素) :- append(L0,[_購入物,を|R],L), \+(member(_購入物,[本,夕食,昼食,朝食,休日])), \+(member([購入物_購入物],L1)), 有意な要素の収集(L,[[購入物,_購入物]|L1],_解析した文要素),!. 有意な要素の収集(_,解析した文要素,_解析した文要素) :- !. /* 解析上鍵となる言葉([休日,年,月,日,円,朝食,夕食,昼食,本,は,が,の,に,で,ために,へ,を,買]). 形態素解析(文,'休日の2009年12月11日に朝食で食パンを350円買い',X). */ % *** user: '全角文字列整数変換' / 4 *** '全角文字列整数変換'(E,E,_全角文字列,_整数) :- '副文字列'(_全角文字列,E,1,_全角文字), '全角文字整数変換'(_全角文字,_整数),!. '全角文字列整数変換'(N,E,_全角文字列,_整数) :- '副文字列'(_全角文字列,N,1,_全角文字), '全角文字整数変換'(_全角文字,_整数の一), F is E - N, _整数の二 'は' trunc(10 ^ F * _整数の一), M is N + 1, '全角文字列整数変換'(M,E,_全角文字列,_整数の三), _整数 'は' _整数の三 + _整数の二,!. % *** user: '全角文字列整数変換' / 2 *** '全角文字列整数変換'(_全角文字列,_整数) :- '文字列長'(_全角文字列,_文字列長), '全角文字列整数変換'(1,_文字列長,_全角文字列,_整数),!. % *** user: '全角文字整数変換' / 2 *** '全角文字整数変換'('0',0) :- !. '全角文字整数変換'('1',1) :- !. '全角文字整数変換'('2',2) :- !. '全角文字整数変換'('3',3) :- !. '全角文字整数変換'('4',4) :- !. '全角文字整数変換'('5',5) :- !. '全角文字整数変換'('6',6) :- !. '全角文字整数変換'('7',7) :- !. '全角文字整数変換'('8',8) :- !. '全角文字整数変換'('9',9) :- !. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/5 # # [1] 授業単元: プログラミング1 # [2] 問題文(含コード&リンク): 5教科のテストの点数を入力し、それらの合計点を算出するようなプログラムを作成せよ。実行結果の例を以下に示す。 # ----------------------------------------------- # 国語:? # 算数:? # 理科:? # 社会:? # 英語:? # 合計点は?点です。 # '5教科'(国語). '5教科'(算数). '5教科'(理科). '5教科'(社会). '5教科'(英語). '5教科のテストの点数を入力し、それらの合計点を算出して表示する' :- '5教科のテストの点数を入力し、それらの合計点を算出'(_合計点), write_formatted('合計点は%t点です\n',[_合計点]). '5教科のテストの点数を入力し、それらの合計点を算出'(_合計点) :- findsum(_点数,('5教科'(_教科),催促付き整数入力('%t : ',[_教科],_点数)),_合計点). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 催促付き整数入力(_表示パターン,_催促情報ならび,_整数) :- write_formatted(_表示パターン,_催促情報ならび), get_integer(_整数),!. 催促付き整数入力(_催促,_整数) :- write(_催促), get_integer(_整数),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/966 # # 下のように支払い金額の計算書を出力するように下のプログラムを修正してください。 # menu0 650 1 650 # menu1 680 2 1360 # menu2 720 3 2160 # menu3 840 2 1680 # menu4 920 1 920 # menu5 980 0 0 # menu6 1080 0 0 # menu7 1280 1 1280 # goukei 10 6370 # # メニュー番号を10回打ち込んでメニューそれぞれの個数と合計を出力する感じです。 単価表(menu0,650). 単価表(menu1,680). 単価表(menu2,720). 単価表(menu3,840). 単価表(menu4,920). 単価表(menu5,980). 単価表(menu6,1080). 単価表(menu7,1280). 支払い金額の計算書を出力する :- length(L,10), メニュー番号と数量を10回打ち込む(L), 支払い金額の計算書を出力する(L). 支払い金額の計算書を出力する(L) :- 単価表(Menu,_単価), findsum(_数量,member([Menu,_数量],L),_合計数量), _合計金額 is _合計数量 * _単価, write_formatted('%t %t %t %t\n',[Menu,_単価,_合計数量,_合計金額]), fail. 支払い金額の計算書を出力する(L) :- findsum([_数量,_金額],(単価表(Menu,_単価),member([Menu,_数量],L),_金額 is _数量 * _単価),[_合計数量,_合計金額]), write_formatted('gokei %5s %t %t\n',[Menu,' ',_合計数量,_合計金額]). メニュー番号と数量を10回打ち込む([]). メニュー番号と数量を10回打ち込む([L1|R]) :- get_split_line([' ',','],L1), メニュー番号と数量を10回打ち込む(R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/890 # # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク): # sinxをテイラー展開しn項目で打ち切ったものについて # xについては0から2πまでの範囲を0.05π刻みでけいさんし、nについてはn=1,2,3,4(すなわち3次、5次、7次、9次までの展開)について計算し # x   sinx 3次まで ・・・・・9次まで # 0.0 … # 0.157 … # のような数表を自分で指定したファイルに出力するプログラムを作成しなさい。 # 'sin(X)をテイラー展開'(_ファイル名) :- tell(_ファイル名), テイラー展開(0.0), told. テイラー展開(F) :- F > 2 * pi,!. テイラー展開(F) :- Y is sin(F),write_formatted('%5.3f %8.7f ',[F,Y]),fail. テイラー展開(F) :- for(1,N,4),テイラー展開(sin(F),N,Y),write_formatted('%8.7f ',[Y]),N=4, write('\n'), F2 is F + pi * 0.05, テイラー展開(F2). テイラー展開(sin(X),N,Y) :- findsum(Z,(for(0,M,N),テイラー展開の二(sin(X),M,Z)),Y). テイラー展開の二(sin(X),N,Y) :- U is 2 * N + 1, 階乗(U,U2), Y is (((-1) ^ N) / U2) * (X ^ (2 * N + 1)). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/330 # # ■テーブルデータ # ・IDテーブル   # ・マスターテーブル # 1, 2, 3      # 1, A # 1, 2, 4      # 2, A # 5, -1, -1     # 3, A # -1, 1, 2      # 4, B # 2, -1, 5      # -1, Z # # ■やりたいこと # マスターテーブルを参照してIDテーブルの各IDにクラス(A, B, Z)を振り当て、 # 各レコードが同一クラスに属するか否かを判定し、同一クラスに属するレコード # だけクラス付で抽出する。 # ここで「同一クラスに属する」とは、クラスA, B, Zからなるグループに対して、 # Z以外の要素が一種類しか存在しない場合に、グループはそのクラスに属すると定める。 # 最終的に欲しいデータは # # 1, 2, 3, A # 5, -1, -1, B # -1, 1, 2, A # # となります。よろしくお願いします。 'クラスA, B, Zからなるグループに対して、Z以外の要素が一種類しか存在しない' :- 'ID'(L), setof(U,(member(ID,L),マスター(ID,U),\+(U='Z')),[_クラス]), concat_atom(L,',',S), write_formatted('%t,%t\n',[S,_クラス]), fail. 'クラスA, B, Zからなるグループに対して、Z以外の要素が一種類しか存在しない'. % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/330 # # ■テーブルデータ # ・IDテーブル   # ・マスターテーブル # 1, 2, 3      # 1, A # 1, 2, 4      # 2, A # 5, -1, -1     # 3, A # -1, 1, 2      # 4, B # 2, -1, 5      # -1, Z # # ■やりたいこと # マスターテーブルを参照してIDテーブルの各IDにクラス(A, B, Z)を振り当て、 # 各レコードが同一クラスに属するか否かを判定し、同一クラスに属するレコード # だけクラス付で抽出する。 # ここで「同一クラスに属する」とは、クラスA, B, Zからなるグループに対して、 # Z以外の要素が一種類しか存在しない場合に、グループはそのクラスに属すると定める。 # 最終的に欲しいデータは # # 1, 2, 3, A # 5, -1, -1, B # -1, 1, 2, A # # となります。よろしくお願いします。 'クラスA, B, Zからなるグループに対して、Z以外の要素が一種類しか存在しない' :- 'ID'(Id_1,Id_2,Id_3), マスター(Id_1,_クラス1), マスター(Id_2,_クラス2), マスター(Id_3,_クラス3), setof(U,(member(U,[_クラス1,_クラス2,_クラス3]),\+(U='Z')),[_クラス]), write_formatted('%t,%t,%t,%t\n',[Id_1,Id_2,Id_3,_クラス]), fail. 'クラスA, B, Zからなるグループに対して、Z以外の要素が一種類しか存在しない'. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/810 # # [1] アルゴリズム # # [2] 自然数の数列内にあるnよりも大きい数と小さい数が # 数列上においてnの前後にそれぞれ一つずつある場合、そのnを出力する。 # つまり、(n-a,...,n+b,....n,....n+c,....,n-d)という風になっているnを探すプログラムです。 # 自然数の数列内にあるnよりも大きい数と小さい数が数列上においてnの前後にそれぞれ一つずつある場合、そのnを出力(_自然数ならび) :- append(L1,[N|L2],_自然数ならび), findsum(1,(member(A,L1),A > N),1), findsum(1,(member(B,L2),B < N),1), write_formatted('%t\n',[N]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/771 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク):これに全て記載 http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10245.c # # 問題 # graph.cの関数print_graph_memory()を参考に、グラフの連結であるか否かの判定を行うプログラムを作成せよ。 # または連結な場合は、一筆書きできるか否かの判定を行うようにせよ。 # sample5.dimacs、sample6.dimacs、sample7.dimacsを連結判定・一筆書き判定せよ。 有向グラフに於いて一筆書き(A,_経路) :- setof((B,C),有向グラフ(B,C),L), length(L,Len), 有向グラフに於いて一筆書き(A,A,Len,[],_経路). 有向グラフに於いて一筆書き(A,A,Len,L,[]) :- length(L,Len),!. 有向グラフに於いて一筆書き(A,S,Len,L,[A|R]) :- 有向グラフ(A,B), \+(member((A,B),L)), 有向グラフに於いて一筆書き(B,S,Len,[(A,B)|L],R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/754 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # 入力されたデータをもとに売上明細を作成して表示する。 # 入力データは商品名と金額で、最大20件とし、^zで終了する。 # 入力されたデータは構造体配列に記録し、 # 入力終了後金額を集計して合計を表示する。 # <構造体メンバ> # 商品名:char型10桁 # 金額:long型 # <実行結果> # ^z # 商品名    金額 # パソコン   248500 # ラジオ     3200 # テレビ    120500 # オーディオ  314000 # レイゾウコ   65800 # クーラー    79000 # 合計    831000 # 入力されたデータをもとに売上明細を作成して表示する :- 売上データの収集(_収集されたデータ), findsum(_金額,member([_,_金額],_収集されたデータ),_金額合計), write('商品名 金額\n'), 明細表の印刷(_収集されたデータ,_金額合計),!. 売上データの収集(_収集されたデータ) :- write('商品名と金額をカンマで区切って入力してください\n'). findall([A2,B], ( for(1,N,10),get_line(Line), ( Line=end_of_file,!,fail; split(Line,[','],[A,B]), '10桁の文字列'(A,A2))),_収集されたデータ),!. 明細表の印刷([],_金額合計) :- write_formatted('%10s %10d\n',[金額合計,_金額合計]). 明細表の印刷([[_商品名,_金額]|R],_金額合計) :- write_formatted('%10s %10d\n',[_商品名,_金額]), 明細表の印刷(R,_金額合計). '10桁の文字列'(_文字列,_10桁の文字列) :- atom_chars(_文字列,Chars), length(L,10), apend(Chars,L1,L), all(L1,' '), atom_chars(_10桁の文字列,L),!. '10桁の文字列'(_文字列,_10桁の文字列) :- sub_atom(_文字列,0,10,_,_10桁の文字列). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/314 # # ユーザーが複数の資格を持っているというありがちなテーブル構成があるのですが、 # 「資格1または資格2を持っているユーザー」の検索はできるのですが、 # 「資格1と資格2」を両方持っているユーザー」の検索ができません。 # # データベースはpostgresです。 # # テーブル構成はこんな感じです。 # # ユーザーテーブル # [ユーザーID、名前] # 001,山田 # 002,鈴木 # # 資格テーブル # [ユーザーID、資格] # 001,資格1 # 001,資格2 # 002,資格1 # ユーザーID('001',山田). ユーザーID('002',鈴木). 資格('001',資格1). 資格('001',資格2). 資格('002',資格1). '「資格1と資格2」を両方持っているユーザー'(X) :- setof(_名前,(資格(_ユーザーID,資格1),資格(_ユーザーID,資格2),ユーザーID(_ユーザーID,_名前)),X). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/690 # # [1] 授業単元: # プログラミング基礎 # [2] 問題文(含コード&リンク): # キーボードから実数配列a[N][N]の各要素に値を入力し、すべての要素の総和を求めるプログラムを作成せよ。 # ただし、総和を求める部分はmain関数と別の関数を作ること。 # program :- user_parameters([A]), atom_to_term(A,N,_), write_formatted('一行にカンマ区切りで%t個、%t行の浮動小数点数を入力してください(eofはctrl-dを入力)\n',[N,N]), 'キーボードから実数配列a[N][N]の各要素に値を入力し、すべての要素の総和を求める'(_総和), write_formatted('総和は%tです\n',[_総和]). 'キーボードから実数配列a[N][N]の各要素に値を入力し、すべての要素の総和を求める'(_総和) :- get_split_lines(user_input,[','],L), findsum(S1,(member(Line,L),findsum(Line,S1)),_総和). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1197620454/543 # # C#の宿題助けてくださしあ><お願いします。 # Visual Studio 2005使用です。 # 問題文などはzipの中に入っています。説明不足等がありましたら補足します。 # http://ime.nu/uproda11.2ch-library.com/11213069.zip.shtml # DLキーは2chです。 # 問い1 # ・二次元配列arrayを使ってユーザーのログインページを作りなさい。 # ・ユーザー名、パスワードのエラーメッセージを表示させること # 問い2 # 問い1のプログラムを応用して、新規ユーザー登録ボタンを作りなさい。kadai_06_02_01ユーザー登録は配列を利用すること # あらかじめユーザ登録用配列は3ユーザー分の名前とパスワードをセットしておくこと。 # ユーザー登録は10名までとする。10ユーザーを超えた場合はエラーを表示させなさい。 # つまり残り7枠を登録さればよい。 # プログラムはfor、while、do whileのどれかひとつでよい。 # ユーザー名のエラーはフラグを作って表示させたいです。でないと長くなると思うので ・・・。 # デザインは作成済みです。イメージがつかみにくいかもしれませんがよろしくお願いします・・・。 # slnファイルの名前がフォルダ名と違っていますが気にしないでください。 # 配列を使わないユーザー認証ページを作ってみたのでそちらを参考にしていただければと思います。 ttylogin :- write('\nlogin: '), get_line(_ユーザー名), write('password: '), system('stty -echo raw'), get_char(X),put_char('*'), パスワードを得る(X,Password), system('stty echo -raw'), ユーザ管理(_ユーザー名,Password,_診断), assertz(ログイン情報(_ユーザー名,Password,_診断)), シェル(_ユーザー名,_診断), ttylogin. パスワードを得る('\r',[]) :- !. パスワードを得る(C,[C|R]) :- get_char(C2), put_char('*'), パスワードを得る(C2,R). ユーザ管理(_ユーザー名,Password,ok) :- concat_atom(Password,PasswordAtom), カエサル暗号(17,PasswordAtom,_暗号文), user_password(_ユーザ名,_暗号文),!. ユーザ管理(_ユーザー名,Password,'UserPassword Error') :- user_passwork(_ユーザー名,_),!. ユーザ管理(_ユーザー名,Password,S) :- concat_atom([ユーザー名,_ユーザー名,は登録がありません],S),!. user_password(tama,'Jrslif'). シェル(_,S) :- \+(S==ok),!. シェル(_,_) :- system. adduser :- write('username : '),get_line(_ユーザー名), rawmode,write('password : '),get_char(Char),put_char(*), パスワードを得る(Char,Password),norawmode, write('Retype Password : '),get_char(Char2),put_char(*), パスワードを得る(Char2,Password2), パスワードは一致する(Password,Password2), 定義枠の限界を越えていない, ユーザー登録(_ユーザー名,Password), パスワードは一致する(A,A) :- !. パスワードは一致する(A,B) :- \+(A,B),write('タイプされたパスワードは一致しません\n'),fail. ユーザー登録(_ユーザー名,Password) :- concat_atom(Password,PasswordAtom), カエサル暗号(17,PasswordAtom,PasswordAtom2), assertz(user_password(_ユーザ-名,PasswordAtom2)). 定義枠の限界を越えていない :- 定義数の数(user_password/2,N),N < 10,!. 定義枠の限界を越えていない :- write('登録ユーザーが10を越えています。\n登録できません。\n'),fail. 定義節の数(Functor / Arity,N) :- functor(P,Functor,Arity),findsum(1,clause(P,_),F),N is truncate(F). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/486 # # [1] 授業単元:C言語演習 # [2] 問題文: 1〜100までの数字を繰り返し入力し、最後に0を入力するとこれまでに # 入力された値の合計値を表示するプログラムを作成しなさい。ただし # 1〜100以外の数字が入力されたときは”エラー”と表示させる。 '1〜100までの数字を繰り返し入力し、最後に0を入力するとこれまでに入力された値の合計値を表示する'(_合計値) :- findsum(X,(repeat,get_integer(X),(X=0,!,fail;範囲範囲チェック(X)),_合計値), write_formatted('合計は%t\n',[_合計値]). 整数範囲チェック(X):- X > 0,X =< 100. 整数範囲チェック(X):- \+((X >0,X =<100)),write('整数範囲エラー\n'),fail. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % *** user: findsum / 3 *** findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), 加算(_値ならび,_合計値),!. % *** user: 加算 / 2 *** 加算([],0) :- !. 加算(X,S) :- 加算_1(X,0,S) . % *** user: 加算_1 / 3 *** 加算_1([],S,S) :- !. 加算_1([A|R],Y,S) :- Z is A + Y, 加算_1(R,Z,S). % *** user: get_integer / 1 *** get_integer(N) :- get_line(Line), ( Line = end_of_file, !, fail ; atom_to_term(Line,N,_), integer(N) ), ! . get_integer(N) :- get_integer(N) . % *** user: get_line / 1 *** get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). % *** user: get_line_1 / 2 *** get_line_1('\n',[]) :- !. get_line_1(end_of_file,[]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R) . % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/456 # # [1] 授業単元: C++ # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10195.txt # # 今回はナップサック問題について考えプログラムを作成する。N個の荷物があって、個々の荷物の重さをWi、値段をPiとする。但しiは1からNの整数を意味する。 # 袋には最大Wの重さまで入れられるとすると、最大でいくら分を入れることができるか?という問題。 # データファイルは、始めの一行に荷物の個数Nが書かれており、次に重さが整数でN行分書かれている。その次の行からN行分、それぞれの荷物の価値が書かれているとする。 # 下のデータファイルの場合は、3個の荷物があり、重みは10、20、13、で # それぞれの値段は23、23、10という状況を表す。 # ------------------- # 3 # 10 # 20 # 13 # 23 # 23 # 10 # ------------------- # 荷物の重みと値段はともに、1から100までの乱数で与えることとする。 # void_write_data_file(char*file,intN)という関数を呼ぶとN個分のデータを乱数で生成し、文字列変数fileに入っている # ファイル名のファイルを開き、そこにデータを記録する。void_read_data_file(char*file)という関数を呼ぶと、文字列変数fileによって名前が指定されたファイルを開き、大域変数の荷物の重み配列W[]と値段配列[]\\\\\にデータを入力する。 ナップサック問題(_ファイル名,N,_許容最大重量,_詰めることのできる最高合計金額) :-   データファイルの読み出し(_ファイル名,N,_価格ならび,_重さならび),   findall(M,for(1,M,N),_1からNまで),   findmax(_合計価格,詰め物の作成(N,_1からNまで,_許容最大重量,_重さならび,_価格ならび,_合計価格),_詰めることのできる最高合計金額). データファイルの読み出し(_ファイル名,N,_重さならび,_価格ならび) :-   see(_ファイル名),get_integer(N),get_integers(L1),seen,   length(L2,N),length(L3,N),   append(_重さならび,_価格ならび,L1),!. 詰め物の作成(N,_1からNまで,_許容最大重量,_重さならび,_価格ならび,_合計価格) :-   for(1,M,N),   組合せ(_1からNまで,M,L),   findsum(Wi,(member(A,L),list_nth(A,_重さならび,Wi)),_合計重量),   _合計重量 =< _許容最大重量,   findsum(Pi,(member(A,L),list_nth(A,_価格ならび,Pi)),_合計金額). get_integers(L) :-   findall(I,(get_line(Line),(Line=end_of_file,!,fail;atom_to_term(Line,I,_))),L),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/212 # # [1] 授業単元:プログラミング演習 # [2] 問題文: # 3行3列の実数行列A=[a_ij]とB[b_ij]の積ABを計算せよ。 # ただし、乗算結果の行列を[c_ij]として次の計算を行うものとする。 # 行列の要素への入力は、代入文あるいは初期化子をもちいること。 # c_ij=Σa_ik×b_kj (Σはk=0で、2までです) # 行列の掛け算(_行列a,_行列b,_行列c) :- findall(L1,(for(1,N,3),length(L1,3)),_行列c), findall(W,重複順列([1,2,3],2,W),_重複順列), 行列の掛け算(_重複順列,_行列a,_行列b,_行列c),!. 行列の掛け算([],_,_,_) :- !. 行列の掛け算([[I,J]|R1],_行列a,_行列b,_行列c) :- findsum(U,( for(1,K,3), 行列要素(_行列a,I,K,N1), 行列要素(_行列b,K,J,N2), U is N1 * N2),S), 行列要素(_行列c,I,J,S), 行列の掛け算(R1,_行列a,_行列b,_行列c). 行列要素(_行列,_行,_列,_値) :- list_nth(_行,_行列,_行の値ならび), list_nth(_列,_行の値ならび,_値). 重複順列(L,N,X) :- length(X,N),重複順列(L,X). 重複順列(L,[]). 重複順列(L,[A|R]) :- member(A,L),重複順列(L,R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258320456/20 # # ある自然数nについて,nの約数のうち,nより小さいものの和がnと一致するとき,nは完全数と呼ばれる. # # たとえば,6の約数は 1, 2, 3, 6 であり, # # 6 = 1 + 2 + 3 # # なので,6は完全数である. # # 1000以下のすべての完全数を表示するプログラムを作成せよ. # '1000以下のすべての完全数を表示する' :- for(1,N,1000), 完全数(N), writef('%t\n',[N]), N=1000. '1000以下のすべての完全数を表示する'. 完全数(N) :- findsum(M,(for(1,M,N),0 is N mod M,M < N),X),N is truncate(X). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/67 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 1から100までの数の合計を計算し、表示するプログラムを作成しなさい。 # # # キーボードから10人分の身長を順次、配列に記録し、全部を入力してから、10人の身長を表示しなさい。さらに合計と平均を計算して表示するプログラムを作成しなさい。 # 配列を使う問題 # 1から100までの数の合計を計算し、表示する :- findsum(N,for(1,N,100),_合計), write(_合計). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), '加算'(_値ならび,_合計値), !. キーボードから10人分の身長を順次、配列に記録し、全部を入力してから、10人の身長を表示 :- キーボードから10人分の身長を順次、配列に記録し(L), '10人の身長を表示'(L), さらに合計と平均を計算して表示する(L). キーボードから10人分の身長を順次、配列に記録し(L) :- findall(N,(for(1,M,10),get_integer(_身長)),L), '10人の身長を表示'(L) :- member(_身長,L), write_formatted('%t\n',[_身長]), fail; '10人の身長を表示'(_). さらに合計と平均を計算して表示する(L) :- 合計と平均を計算して表示する(L). 合計と平均を計算して表示する(L) :- findsum(L,_合計), findavg(L,_平均), write_formatted('合計は%t, 平均は%t\n',[_合計,_平均]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1153585095/954 # # 1000よりも小さいすべての「3または5の倍数」の合計を計算し,結果を表示するプログラムを作成せよ. # # '1000よりも小さいすべての「3または5の倍数」の合計を計算し,結果を表示する' :- '1000よりも小さいすべての「3または5の倍数」の合計'(_合計), write(_合計). '1000よりも小さいすべての「3または5の倍数」の合計'(_合計) :- findsum(N,(for(1,N,1000),'3または5の倍数'(N),N < 1000),_合計). '3または5の倍数'(N) :- 0 is N mod 3,!. '3または5の倍数'(N) :- 0 is N mod 5,!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/562 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10061.txt # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/563 # # [1] 授業単元:ソフトウェア工学 # [2] 問題文(含コード&リンク): # (π/4) = tan^-1(1) = 1 - (1/3) + (1/5) - … + (-1)^k * (1/(2k+1)) + … # の公式を用いて、第n項までの多項式近似により円周率を求め、その誤差と計算時間を測定するプログラムを作成せよ。 func(K,X) :- X is (-1)^K * (1/(2*K+1)). π(M,Pi) :- findsum(U,(for(0,K,M),func(M,U)),S),Pi is S * 4. 計算時間と誤差(M,_計算時間,_誤差) :- A is time,for(1,N,100),π(M,Pi),N=100,B is time, _誤差 is Pi - pi, _計算時間 is (B - A) / 100. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/451 # # http://ime.nu/www.dotup.org/uploda/www.dotup.org315213.docx.html # 【質問テンプレ】 # [1] 授業単元:計算機実習応用 # [2] 問題文(含コード&リンク): # http://ime.nu/www.dotup.org/uploda/www.dotup.org315213.docx.html # # 問1 上のプログラムのfunction1()の定義を改造して,function1(int x, int y)がx*x+y*yの値をint型で返すようなプログラムに改造し,100*100+50*50の計算をさせて画面に結果を表示させよ(仮引数が2つになっている). # # 問2 このプログラムを改造し,2つの非負の実数の四則演算(和差積商)を求め画面表示させるプログラムにせよ.なお,配布した1030sample.exeのように動作するように作ること.また以下の点をよく考えること. # 1.aとbの値(ゼロより大きい実数)をキーボードから入力させること(scanfを2回使う) # 2.関数wasasekisho(double x, double y, double * pwa, double * psa, double * pseki, double * psho)を定義して中身を作ること # 4.main関数に帰ってきてから1030sample.exeのように表示されるものを作ること(printfをうまく使う). # # 問3 上記のプログラムを改造して,与えられたデータの平均値を計算する関数はそのまま利用し,main関数の中で分散値を計算して両者を画面表示させなさい(分散を計算する関数は定義しない).画面表示の形式としては, # データの平均は 4.460000 # データの分散は 7.623000 # 続行するには何かキーを押してください.. . 関数定義(function1(X,Y),_値) :- function1(X,Y,_値). 関数定義(wasasekisho(X,Y),_値) :- wasasekisho(X,Y,Pwa,Psa,Pseki,Psho), _値 = [Pwa,Psa,Pseki,Psho]. 関数定義(heikin(L),_値) :- 相加平均(L,_値). 関数定義(bunsan(L),_値) :- 分散(L,_値). function1(X,Y,Z) :- Z is X * X + Y * Y. wasasekisho(X,Y,Pwa,Psa,Pseki,Psho) :- Pwa is X + Y,Psa is X - Y,Pseki is X * Y,Psho is X / Y. 相加平均(L,Avg) :- findsum(U,member(U,L),Avg). 分散(L,_分散) :- length(L,Len), 相和平均(L,_相加平均), 分散(L,Len,_相加平均,0.0,_分散). 分散([],N,M,S,V) :- V is S / N,!. 分散([A|R],N,M,S,V) :- S1 is (A - M) ^ 2, S2 is S + S1, 分散(R,N,M,S2,V). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), 加算(_値ならび,_合計値),!. % 加算の解はすべての要素が整数の時整数、それ以外は浮動小数点数になります 加算(_値ならび,_合計値) :- 加算(_値ならび,0,_合計値). 加算([],_合計値,_合計値). 加算([A|R],S1,_合計値) :- S2 is A + S1, 加算(R,S2,_合計値). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/365 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10019.txt # # 区分積分法を用いて、 y=3x*x , (0 ≦ x ≦1)の面積を求めるプログラム f(X,Y) :- Y is 3 * X * X. 区分求積法(M,Sum) :- findsum(U,(for(0,N,M),V is N / M,f(V,W),U is 1.0 / M * W),Sum). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/326 # # [1] 授業単元:C言語とアルゴリズム # [2] 問題文: http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10008.txt # ●問題1−1 反復型処理(ビット列の表示) #  符号なし32bit整数を入力して、その数を2進表示するプログラムを作成しなさい。 # さらに0のビットと1のビットの数を教示しなさい。ただし、2進表示は実行例のように4桁ずつ区切ること。 # # [実行例] # 符号なし32bit整数を入力してください. # 987654321 # 987654321 は2進表示で 0011 1010 1101 1110 0110 1000 1011 0001 です. # 0のビット数は15,1のビット数は17です. # # ●問題1−2  #  符号なし32bit整数を2つ入力して、それらを2進表示するプログラムを作成しなさい。 # さらに、実行例のようにビット反転(1の補数表示〜),ビットシフト(<<, >>), ビット論理積(&),ビット論理和(|), # ビット排他的論理和(^)を表示しなさい。ただし2進表示は4桁ずつ区切ること. # また問題1−1で作成した2進表示の関数を再利用すること。 # # [実行例] # 符号なし32bit整数2つを入力してください. # 987654321 123456789 # 987654321 は2進表示で 0011 1010 1101 1110 0110 1000 1011 0001 , # 123456789 は2進表示で 0000 0111 0101 1011 1100 1101 0001 0101 です. # 〜987654321 は2進表示で 1100 0101 0010 0001 10010111 0100 1110 , # 〜123456789 は2進表示で 1111 1000 1010 0100 0011 0010 1110 1010 です. # 987654321 << 1は2進表示で 0111 0101 1011 1100 1101 0001 0110 0010 , # 123456789 >> 1は2進表示で 0000 0011 1010 1101 1110 0110 1000 1010 です. # 987654321 & 123456879 は2進表示で 0000 0010 0101 1010 0100 1000 0001 0001 です. # 987654321 | 123456879 は2進表示で 0011 1111 1101 1111 1110 1101 1011 0101 です. # 987654321 ^ 123456879 は2進表示で 0011 1101 1000 0101 1010 0101 1010 0100 です. 符号なし32bit整数を入力して、その数を2進表示する(_10進数) :- 二進数(_10進数,L), '4文字区切り'(L,S), findsum(1,member(0,L),S0), findsum(1,member(1,L),S1), write_formatted('%t は2進表示で %t です\n0のビット数は%t,1のビット数は%tです.\n',[_10進数,S,S0,S1]). 符号なし32bit整数を2つ入力して、論理和を2進表示する(_10進数_1,_10進数_2) :- 二進数(_10進数_1,L_1), 二進数(_10進数_2,L_2), ビットの論理和(L_1,L_2,L_3), '4文字区切り'(L_3,S), write_formatted('%t は2進表示で %t ,\n%t は2進表示で %t です.\n',[_10進数_1,S_1,_10進数_2,S_2]). ビットを反転して表示(_10進数) :- 二進数(_10進数,L), ビットの反転(L,L1), '4文字区切り'(L1,S), write_formatted('〜%t は2進表示で %t です.\n',[_10進数,S]). ビットを左シフトして表示(_10進数,_シフト数) :- 二進数(_10進数,L), ビットの左シフト(_シフト数,L,L1), '4文字区切り'(L1,S), write_formatted('%t >> %t は2進表示で %t です.\n',[_10進数,_シフト数,S]). ビットを右シフトして表示(_10進数,_シフト数) :- 二進数(_10進数,L), ビットの右シフト(_シフト数,L,L1), '4文字区切り'(L1,S), write_formatted('%t >> %t は2進表示で %t です.\n',[_10進数,_シフト数,S]). 符号なし32bit整数を2つ入力して、論理和を2進表示する(_10進数_1,_10進数_2) :- 二進数(_10進数_1,L_1), 二進数(_10進数_2,L_2), ビットの論理和(L_1,L_2,L_3), '4文字区切り'(L_3,S), write_formatted('%t | %t は2進表示で %t です.\n',[_10進数_1,_10進数_2,S]). 符号なし32bit整数を2つ入力して、論理積を2進表示する(_10進数_1,_10進数_2) :- 二進数(_10進数_1,L_1), 二進数(_10進数_2,L_2), ビットの論理積(L_1,L_2,L_3), '4文字区切り'(L_3,S), write_formatted('%t & %t は2進表示で %t です.\n',[_10進数_1,_10進数_2,S]). 符号なし32bit整数を2つ入力して、排他的論理和を2進表示する(_10進数_1,_10進数_2) :- 二進数(_10進数_1,L_1), 二進数(_10進数_2,L_2), ビットの排他的論理和(L_1,L_2,L_3), '4文字区切り'(L_3,S), write_formatted('%t ^ %t は2進表示で %t です.\n',[_10進数_1,_10進数_2,S]). ビットの反転([],[]). ビットの反転([0|R1],[1|R2]) :- ビットの反転(R1,R2). ビットの反転([1|R1],[0|R2]) :- ビットの反転(R1,R2). ビットの右回転(_シフト数,_ビットならび,_シフトしたビットならび) :- ならびの回転(右方向,_シフト数,_ビットならび,_シフトしたビットならび). ビットの左回転(_シフト数,_ビットならび,_シフトしたビットならび) :- ならびの回転(左方向,_シフト数,_ビットならび,_シフトしたビットならび). ビットの左シフト(_シフト数,_ビットならび,_シフトしたビットならび) :- length(L1,_シフト数), length(L2,_シフト数), all(L2,0), append(L1,L3,_ビットならび), append(L3,L2,_シフトしたビットならび). ビットの右シフト(_シフト数,_ビットならび,_シフトしたビットならび) :- length(L1,_シフト数), length(L2,_シフト数), all(L2,0), append(L3,L1,_ビットならび), append(L2,L3,_シフトしたビットならび). ビットの論理和([],[],[]). ビットの論理和([0|R1],[0|R2],[0|R3]) :- ビットの論理和(R1,R2,R3). ビットの論理和([1|R1],[0|R2],[1|R3]) :- ビットの論理和(R1,R2,R3). ビットの論理和([0|R1],[1|R2],[1|R3]) :- ビットの論理和(R1,R2,R3). ビットの論理和([1|R1],[1|R2],[1|R3]) :- ビットの論理和(R1,R2,R3). ビットの論理積([],[],[]). ビットの論理積([0|R1],[0|R2],[0|R3]) :- ビットの論理積(R1,R2,R3). ビットの論理積([1|R1],[0|R2],[0|R3]) :- ビットの論理積(R1,R2,R3). ビットの論理積([0|R1],[1|R2],[0|R3]) :- ビットの論理積(R1,R2,R3). ビットの論理積([1|R1],[1|R2],[1|R3]) :- ビットの論理積(R1,R2,R3). ビットの排他的論理和([],[],[]). ビットの排他的論理和([0|R1],[0|R2],[0|R3]) :- ビットの排他的論理和(R1,R2,R3). ビットの排他的論理和([1|R1],[0|R2],[1|R3]) :- ビットの排他的論理和(R1,R2,R3). ビットの排他的論理和([0|R1],[1|R2],[1|R3]) :- ビットの排他的論理和(R1,R2,R3). ビットの排他的論理和([1|R1],[1|R2],[0|R3]) :- ビットの排他的論理和(R1,R2,R3). 二進数(_10進数,L) :- length(L,32), 二進数(_10進数,[],X), append(L1,X,L), all(L1,0). 二進数(J,Y,[J|Y]) :- J < 2. 二進数(J,Y,X) :- J >= 2,J2 is J // 2,M is J mod 2,二進数(J2,[M|Y],X). '4文字区切り'([],''). '4文字区切り'([A,B,C,D|R],S) :- '4文字区切り'(R,S1), concat_atom([A,B,C,D,' ',S1],S). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/256 # # # 2変量のデータ {{x1, y1}, {x2, y2}, ... , {xn, yn}} を引数として,散布図と相関係数を出力する関数を作成せよ. 相関係数(_サンプルならび,_相関係数) :- length(_サンプルならび,Len), x要素の取り出し(_サンプルならび,LX), y要素の取り出し(_サンプルならび,LY), 標準偏差(LX,_標準偏差X), 標準偏差(LY,_標準偏差Y), 相加平均(LX,_平均値X), 相加平均(LY,_平均値Y), findsum(U,(for(1,I,Len),list_nth(I,LX,X), list_nth(I,LY,Y), U is (X-_平均値X) * (Y-_平均値Y)), S1), _相関係数 is ( 1 / ((Len-1)*_標準偏差X*_標準偏差Y)) * S1. x要素の取り出し(L,LX) :- findall(X,member([X,_],L),LX). y要素の取り出し(L,LY) :- findall(Y,member([_,Y],L),LY). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/55 # # [1] 授業単元:プログラム言語論 # [2] 問題文(含コード&リンク): # # 設問1.C言語、またはC++言語で、割り算を計算するdev(int x,int y)関数(*)を作成しなさい。 # ただし、不変表明(assert)を使って、0で除算を実行した場合にエラーを出力するようにすること。 # (*)関数devは、int型の返値を持ち、x/yを計算するものとする。 :- op(700,xfx,は). 関数定義(div(X,Y),Z) :- div(X,Y,Z). div(X,Y,Z) :- length(L1,X), length(L2,Y), div(L1,L2,DIV,MOD), length(DIV,Z). div(_,[],_,_) :- write('0除算エラー\n'),!. div(L1,L2,[_|D],MOD) :- append(L2,L3,L1), div(L3,L2,D,MOD). div(L1,L2,[],L1) :- \+(append(L2,L3,L1)). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% findavg(_集約項,_項,_算術平均) :- findall(_集約項,_項,_値ならび), '加算'(_値ならび,_合計値), length(_値ならび,_ならびの長さ), _算術平均 is _合計値 / _ならびの長さ,!. 加算(trunc(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A is trunc(B)),SL),!. 加算(四捨五入(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A は 四捨五入(B)),SL),!. 加算(切捨て(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A は 切捨て(B)),SL),!. 加算(切り上げ(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A は 切り上げ(B)),SL),!. 加算([],L) :- var(L), L = 0.0e+00,!. 加算([],L) :- \+(var(L)), 加算の変数に零をおく(L),!. 加算([L|R],SL) :- ならび(L), 行列の転置([L|R],L1), 加算_2(L1,SL),!. 加算(X,S) :- 加算_1(X,0.0e+00,S) . 加算_1([],S,S) :- !. 加算_1([A|R],Y,S) :- ならび(A), ならび(Y), !, ならび加算(A,Y,Z), 加算_1(R,Z,S),!. 加算_1([A|R],Y,S) :- atom(A), atom_number(A,I), integer(I), Z is I + Y, 加算_1(R,Z,S),!. 加算_1([A|R],Y,S) :- atom(A), atom_number(A,F), real(F), Z is F + Y, 加算_1(R,Z,S),!. 加算_1([A|R],Y,S) :- atom(A), 加算_1(R,Y,S),!. 加算_1([A|R],Y,S) :- A1 は A, Z is A1 + Y, 加算_1(R,Z,S). 加算_1(A,Y,S) :- とからりすと(A,L), !, 加算_1(L,Y,S) . 加算_2([],[]) :- !. 加算_2([L|R],[S|R2]) :- 加算(L,S), 加算_2(R,R2). 加算の変数に零をおく([]) :- !. 加算の変数に零をおく([A|R]) :- 変数(A), A = 0.0e+00, 加算の変数に零をおく(R),!. とからりすと(A,[A]) :- atomic(A),!. とからりすと(A と B,C) :- とからりすと(A,A1), とからりすと(B,B1), append(A1,B1,C). 変数(_変数) :- var(_変数). ならび([_|_]). _項 は (_ネットワーク :: _式) :- _ネットワーク :: _項 は _式, ! . _評価項 は N : L :- M は N, L1 は L, list_nth(M,L1,_評価項), ! . _評価項 は prolog(_評価項) :- functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), !, error_protect(_評価項,fail) . _評価値 は [X|{P}] :- findall(X,P,_評価値), ! . _評価項 は ` _値 :- !, _評価項 = _値, ! . _項 は _式 :- var(_式), _項 = _式, ! . _項 は _式 :- error_protect(一時関数定義(_式,_項),fail) . _項 は _式 :- atom(_式), member(_式,[minint,maxint,cputtime,time,csize,cused,dbsize,dbused,gsize,gused,noptrs,ptrsued,ssize,sused,tsize,tused]), !, _項 is _式, ! . _項 は _式 :- 二項組込み関数(_式), 二項組込み関数の評価(_式,_項) . _項 は _式 :- 二項組込み関数(_式), !, fail . _項 は _式 :- functor(_式,Functor,1), arg(1,_式,Arg), Y は Arg, functor(_式_1,Functor,1), arg(1,_式_1,Y), member(Functor,[atom,real,integer,var,float,list]), !, error_protect(_式_1,fail), _項 = Y, ! . _項 は _式 :- atom(_式), error_protect(get_global(_式,_項),fail), ! . _項 は _式 :- real(_式), _項 = _式, ! . _項 は _式 :- real(_式), !, fail . _項 は _式 :- list(_式), findall(X,(member(U,_式) , X は U),_項) . _項 は _式 :- list(_式), !, fail. _項 は _erlang_module : _erlang関数 :- erlang関数評価(_erlang_module : _erlang関数,_項),!. _項 は _式 :- 関数定義(_式,_項),!. _項 は _式 :- functor(_式,_関数,_次数), function(_関数,_次数), findall(Arg,(for(1,N,_次数) , arg(N,_式,Arg)),L), 関数評価に於いて引数部分の関数評価(L,L2), _式の二 =.. [_関数|L2], error_protect(_項 is _式の二,fail) . _項 は _評価関数 :- error_protect(_項 is _評価関数,fail),!. _評価項 は prolog(_評価項) :- functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), !, error_protect(_評価項,fail),!. _項 は _評価項 :- 述語評価が可能(_評価項,_関数,_次数,_次数足す一), _評価項 =.. _評価項の項分解ならび, findall(Arg,(for(1,N,_次数) , arg(N,_評価項,Arg)),L), 関数評価に於いて引数部分の関数評価(L,L2), append(L2,[_],_変数を付加した引数ならび), _解付き評価項 =.. [_関数|_変数を付加した引数ならび], error_protect(_解付き評価項,fail), arg(_次数足す一,_解付き評価項,_項) . _項 は _評価項 :- \+(述語評価が可能(_評価項,_関数,_次数,_次数足す一)), functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), error_protect(_評価項,fail), arg(Arg,_評価項,_項) . _項 は _評価項 :- \+(述語評価が可能(_評価項,_関数,_次数,_次数足す一)), functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), \+(error_protect(_評価項,fail)), _評価項 = _項,!. _項 は _式 :- atomic(_式), \+(述語評価が可能(_式,_関数,_次数,_次数足す一)), _項 = _式,!. 述語評価が可能(_評価項,_関数,_次数,_次数足す一) :- functor(_評価項,_関数,_次数), _次数足す一 is _次数 + 1, \+(predicate_type(_関数,_次数足す一,undefined)),!. 関数評価に於いて引数部分の関数評価([],[]). 関数評価に於いて引数部分の関数評価([L|R1],[L2|R2]) :- list(L), !, 関数評価に於いて引数部分の関数評価(L,L2), 関数評価に於いて引数部分の関数評価(R1,R2), ! . 関数評価に於いて引数部分の関数評価([F|R1],[F|R2]) :- \+(error_protect(F2 は F,fail)), !, 関数評価に於いて引数部分の関数評価(R1,R2) . 関数評価に於いて引数部分の関数評価([F|R1],[F2|R2]) :- error_protect(F2 は F,fail), 関数評価に於いて引数部分の関数評価(R1,R2) . erlang関数評価(os : cmd(Command),_項) :- erlang :: (os : cmd(Command) -> _項_1), _項 は string2atom(_項_1),!. erlang関数評価(_erlang_module : _erlang関数,_項) :- erlang :: (_erlang_module : _erlang関数 -> _項),!. 関数定義(_項の一 + _項の二,_値) :- _値の一 は _項の一, number(_値の一), _値の二 は _項の二, number(_値の二), _値 is _値の一 + _値の二, !. 関数定義(_項の一 + _項の二,_値) :- _値の一 は _項の一, atomic(_値の一), _値の二 は _項の二, atomic(_値の二), concat_atom([_値の一,_値の二],_値), !. 関数定義(_ならびの一 + _ならびの二,_値) :- ( 変数(_ならびの一) ; _ならびの一 == [] ; list(_ならびの一) ; 変数(_ならびの二) ; _ならびの二 == [] ; list(_ならびの二) ), !, append(_ならびの一,_ならびの二,_値) . 関数定義(_項の一 * _項の二,_値) :- _値の一 は _項の一, list(_値の一), _値の二 は _項の二, integer(_値の二), findall(_値の一,for(1,_,_値の二),LY), concat_list(LY,_値), !. 関数定義(_項の一 * _項の二,_値) :- _値の一 は _項の一, atom(_値の一), _値の二 は _項の二, integer(_値の二), findall(_値の一,for(1,_,_値の二),L), concat_atom(L,_値), !. 関数定義(_項の一 * _項の二,_値) :- _値の一 は _項の一, atomic(_値の一), _値の二 は _項の二, atomic(_値の二), concat_atom([_値の一,_値の二],_値), !. 関数定義(_ならびの一 * _ならびの二,_値) :- ( 変数(_ならびの一) ; _ならびの一 == [] ; list(_ならびの一) ; 変数(_ならびの二) ; _ならびの二 == [] ; list(_ならびの二) ), !, append(_ならびの一,_ならびの二,_値) . 関数定義(` _値,_値) :- !. 関数定義(@ _式,_値) :- _値 は _式,!. 関数定義(四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _値の二 >= 0.0e+00, _四捨五入後の値 is floor(_値の二 + 0.5) * 1.0,!. 関数定義(四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _四捨五入後の値 is ceil(_値の二 - 0.5),!. 関数定義(切り捨て(_値),_切り捨て後の値) :- _値の二 は _値, _切り捨て後の値 は floor(_値の二) * 1.0,!. 関数定義(切り上げ(_値),_切り上げ後の値) :- _値の二 は _値, _切り上げ後の値 は ceil(_値の二),!. 関数定義(十円未満四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _四捨五入後の値 は floor(_値の二 / 10 + 0.5) * 10,!. 関数定義(十円未満切り捨て(_値),_切り捨て後の値) :- _値の二 は _値, _切り捨て後の値 は trunc(_値の二 / 10) * 10,!. 関数定義(十円未満切り上げ(_値),_切り上げ後の値) :- _値の二 は _値, _切り上げ後の値 は ceil(_値の二 / 10) * 10,!. 関数定義(百円未満四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _四捨五入後の値 は floor(_値の二 / 100 + 0.5) * 100,!. 関数定義(百円未満切り上げ(_値),_切り上げ後の値) :- _値の二 は _値, _切り上げ後の値 は ceil(_値の二 / 100) * 100,!. 関数定義(百円未満切り捨て(_値),_切り捨て後の値) :- _値の二 は _値, _切り捨て後の値 は floor(_値の二 / 100) * 100,!. 関数定義(整数化(_値),_整数化された値) :- _値の二 は _値, _整数化された値 is trunc(_値の二),!. 関数定義(char_code(_項),_値) :- ( atom(_項), atomic_length(_項,1), char_code(_項,_値) ; integer(_項), char_code(_値,_項) ; 複合項(_項), _項の一 は _項, _値 は char_code(_項の一) ), !. 関数定義($ _大域変数名,_値) :- atom(_大域変数名), get_global(_大域変数名,_値の一), _値 は _値の一,!. 関数定義(S,E) :- functor(S,select,1), to(S,E),!. 関数定義(setq(A,B),E) :- atom(A), B1 は B, set_global(A,B1), E = B1,!. 関数定義(++ A,X) :- A1 は A, list(A1), 加算(A1,X),!. 関数定義(A ++ B,X) :- C is B / A, X = A + C + B,!. 関数定義(car(A),E) :- A1 は A, A1 = [E|_],!. 関数定義(cdr(A),E) :- A1 は A, A1 = [_|E],!. 関数定義(cons(A,B),E) :- A1 は A, B1 は B, E = [A1|B1],!. 関数定義(length(A),E) :- A1 は A, list(A1), length(A1,E),!. 関数定義(decode(A,B,C,D),E) :- A1 は A, B1 は B, A1 = B1, E は C,!. 関数定義(decode(A,B,C,D),E) :- E は D,!. 関数定義(decompcons(A),E) :- A1 は A, decompcons(A1,E),!. 関数定義(substr(A,B,C),E) :- 関数定義(subatomic(A,B,C),E),!. 関数定義(subatomic(A,B,C),E) :- A1 は A, B1 は B, C1 は C, subatomic(A1,B1,C1,E),!. 関数定義(concat(A),E) :- A1 は A, concat(A1,E),!. 関数定義(concat(A,B),E) :- A1 は A, B1 は B, concat(A1,B1,E),!. 関数定義(append(A,B),E) :- A1 は A, B1 は B, append(A1,B1,E),!. 関数定義(reverse(A),E) :- A1 は A, reverse(A1,E),!. 関数定義(string2atom(A),E) :- A2 は A, flat(A2,B), atom_codes(E,B),!. 関数定義(P,E) :- functor(P,greatest,Arg), P =.. [greatest|L], findall(B,(member(A,L) , B は A),L2), max(L2,E),!. 関数定義(P,E) :- functor(P,least,Arg), P =.. [least|L], findall(B,(member(A,L) , B は A),L2), min(L2,E),!. 関数定義(cel(_列数,_行数,_行列),_解) :- _関数評価された行数 は _行数, _関数評価された列数 は _列数, list_nth(_関数評価された行数,_行列,_行), list_nth(_関数評価された列数,_行,_解),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/376 # # ・課題 # 与えられたベクトルファイル(c.txt)を読み込み # 1-normの結果を表示させるプログラムを作成せよ # # 途中までのソースとベクトルファイルです # http://ime.nu/rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/809.java # http://ime.nu/kissho.xii.jp/1/src/1jyou94333.txt.html # ( c.txt = ) # 0.9999999973 # 0.0000000023 # -0.0000000016 # t798 :- t798(1). t798(P) :- float_format(_,f(22,21)), get_lines('c.txt',Lines), findall(V,(member(Line,Lines),atom_to_term(Line,V,_)),L), ベクトルのnorm(L,1,X), write_formatted('|C|=%t の時 |C|%t = %t\n',[L,P,X]). ベクトルのnorm(L,P,X) :- findsum(B,(member(A,L),B is abs(A) ^ P),S), X is S ^ (1 / P). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1250204272/974 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # new と deleteを使ったプログラムの作成 #  人数、名前、点数を入力し、横棒グラフを表示するプログラムを作りなさい。 # ただし、グラフは5点刻みとし、点数は0点から100点の範囲とする。 # <実行画面> # 人数 : 3 # 1人目の名前 : A # 1人目の点数 : 80 # 2人目の名前 : B # 2人目の点数 : 55 # 3人目の名前 : C # 3人目の点数 : 95 # # 名( 点 )| 50 100 # --------+---------+---------+ # A ( 80)|**************** # B ( 55)|*********** # C ( 95)|******************* # 平均 77|*************** # :- op(800,xfx,人目の名前). :- op(800,xfx,人目の点数). 1人目の名前 'A'. 1人目の点数 80. 2人目の名前 'B'. 2人目の点数 55. 3人目の名前 'C'. 3人目の点数 95. t786 :- write(' 名(点)| 50 100\n--------+---------+---------+\n'), N 人目の名前 _名前, N 人目の点数 _点数, 星表現(_点数,_星表現), write_formatted('%4s(%2d)|%t\n',[_名前,_点数,_星表現]), fail. t786 :- findavg(V,_ 人目の点数 V,_平均点), 星表現(_平均点,_星表現), write_formatted('平均(%2d)|%t\n',[_平均点,_星表現]). 星表現(_点数,_星表現) :- Y is _点数 // 5, all(Y,L,'*'), concat_atom(Y,_星表現). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% all(Length,L,A) :- length(L,Length), all(L,A). all([],_). all([A|R],A) :- all(R,A). findavg(_集約項,_項,_算術平均) :- findall(_集約項,_項,_値ならび), '加算'(_値ならび,_合計値), length(_値ならび,_ならびの長さ), _算術平均 is _合計値 / _ならびの長さ,!. 加算([],0.0). 加算([A|R1],X) :- 加算(R1,Y), X is A + Y. concat_atom([],'') :- !. concat_atom([Atom],Atom) :- !. concat_atom([Atom1|R1],Atom) :- concat_atom(R1,Atom2), atom_append(Atom1,Atom2,Atom). concat_atom([],_,'') :- !. concat_atom([Atom],_,Atom) :- !. concat_atom([Atom1|R1],_区切り文字,Atom) :- concat_atom(R1,_区切り文字,Atom2), atom_append(Atom1,_区切り文字,Atom3), atom_append(Atom3,Atom2,Atom). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1250204272/926 # # 以前回答いただいた課題の発展課題です。よろしくお願いします。 # 以前の回答は>>841にあります。以前の問題文は>>770を参照してください。 # ただし>>770の分類には全角英数が抜けています。 # [1] 授業単元:プログラミング演習2 # [2] 問題文(含コード&リンク): # 前回の課題の分類の結果「半角英数:XX字、半角カナ:XX字・・・」 # という結果が得られたとき、その結果のファイルを読み込み # 各分類からその結果の比率に合わせてランダムに文字列を出力する # プログラムを作成せよ。出力する文字数は解析に用いた文字の合計である。 # (例えば半角英数が全体の60%だった場合、出力される文字列の中にランダムに半角英数文字が60%の割合で含まれることになる) # 分類は以下の通りとする。 # 1.半角英数 # 2.半角カナ # 3.半角記号 # 4.全角英数 # 5.全角かな # 6.全角記号 # 7.漢字 サンプルの文字分類('半角英数',9234). サンプルの文字分類('全角漢字',1061). サンプルの文字分類('全角記号',210). サンプルの文字分類('全角カナ',687). サンプルの文字分類('全角かな',705). t778(_生成文字数,_発生文) :- findall([_分類,_文字数],サンプルの文字分類(_分類,_文字数),_文字分類ならび), t778_1(_文字分類ならび,_生成文字数,_発生文). t778_1(_文字分類ならび,_生成文字数,_発生文) :- テキスト文字総数(_文字分類ならび,_テキスト総文字数), 乗算合同法によってM個の正規分布ならびを得る(_生成文字数,_正規分布1), 乗算合同法によってM個の正規分布ならびを得る(_生成文字数,_正規分布2), 連続文字番号の割り当て(0,_文字分類ならび,_仮文字番号ならび), t778(_正規分布1,_正規分布2,_仮文字番号ならび,_発生文字コードならび), atom_codes(_発生文,_発生文字コードならび). t778_2([],[],_,_,[]) :- !. t778_2([V1|R1],[V2|R2],_テキスト総文字数,_仮文字番号ならび,[_生成文字コード|R3]) :- member([_分類,_仮文字番号下限,_仮文字番号上限],_仮文字番号ならび), _テキスト総文字数 * V1 >= _仮文字番号下限, _テキスト総文字数 * V1 =< _仮文字番号上限, 一文字生成する(_分類,V2,_生成文字コード), t778_2(R1,R2,_テキスト総文字数,_仮文字番号ならび,R3). 一文字生成する(_分類,V,_生成文字コード) :- sub_atom(_分類,0,2,_,全角), eucコード分類(_分類,C1,C2), _生成文字コード is truncate((((C2 - C1 + 2) // 2) * V) * 2 + C1. 一文字生成する(_分類,V,_生成文字コード) :- sub_atom(_分類,0,2,_,半角), eucコード分類(_分類,C1,C2), _生成文字コード is truncate(((C2 - C1 + 1) * V) + C1. テキスト文字総数(_文字分類ならび,_テキスト総文字数) :- findsum(_発生文字数,member([_,_発生文字数],_文字分類ならび),_テキスト総文字数). 連続文字番号の割り当て(_,[],[]) :- !. 連続文字番号の割り当て(N,[[_分類,S]|R1],[[分類,N,N1]|R2]) :- N2 is N + S, N1 is N + S - 1, 連続文字番号の割り当て(N2,R1,R2). eucコード分類(半角英数,0x30,0x39). eucコード分類(半角英数,0x51,0x5a). eucコード分類(半角英数,0x61,0x6a). eucコード分類(全角数字,0xa3b0,0xa3b9). eucコード分類(半角カナ,0x8ea1,0x8ed6). eucコード分類(全角カナ,0xa5a1,0xa5f6). eucコード分類(全角かな,0xa4a1,0xa4f3). eucコード分類(全角記号,0xa1a1,0xa2fe). eucコード分類(全角漢字,0xb0a1,0xfcee). 乗算合同法によってM個の正規分布ならびを得る(M,L) :- _初期値 is random mod 29571, 乗算合同法によってM個の正規分布ならびを得る(M,_初期値,L). 乗算合同法によってM個の正規分布ならびを得る(M,_初期値,L) :- 乗算合同法による正規分布ならび(M,16087,_初期値,65535,L). 乗算合同法による正規分布ならび(0,A,N,_法,[]) :- !. 乗算合同法による正規分布ならび(M,A,N,_法,[X|R]) :- X is N / _法, 乗算合同法演算(A,N,_法,N2), M1 is M - 1, 乗算合同法による正規分布ならび(M1,A,N2,_法,R). 乗算合同法演算(A,N,_法,N2) :- N2 is (A * N) mod _法. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1250204272/907 # # [1] C言語とアルゴリズム # [2] 選択型処理 あるお店では会員制をとっている。会員には一般会員と特別会員があり、 # 一般会員は購入金額の1割引きのサービスを、特別会員は3割引きのサービスを受けられる。 # 非会員の場合は購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。 # この店のある日のデータ(data03.dat)が与えられたとき、実行例のような出力が得られるプログラムを作成しなさい。 # ただし、data03.datには以下の形式で会員種別と購入金額が記載されているものとする。 # [会員種別(1桁) 購入金額] # ここで、会員種別は1が一般会員、2が特別会員、3が非会員を表す。 # 会員種別の判定にはswitch文を用い、一般会員は「会」、特別会員は「特」、 # 非会員は「非」と表しなさい。 # # [data03.dat] http://prolog.asia/data/data03.dat # 『実行例』 # 種別  購入金額(円)  支払い金額(円)   # 会     3200        2880    ←一般会員は1割引き # 特     2400        1680    ←特別会員は3割引き # 非     4800        4800    ←非会員は通常割り引かない # 特     6500        4550 # 会     10800 9720 # 特     18200 12740 # 非    21400 20400    ←非会員も購入金額が15000円以上なら1000円引き # 会     890 801 # 会     3900        3510 # 特     6200        4340 # ----------------------------------------- # 合計    78290        65421 ←最後の行に合計を出力すること 'あるお店では会員制をとっている。会員には一般会員と特別会員があり、 一般会員は購入金額の1割引きのサービスを、特別会員は3割引きのサービスを受けられる。 非会員の場合は購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。 この店のある日のデータ(data03.dat)が与えられたとき、実行例のような出力が得られるプログラムを作成しなさい。 ただし、data03.datには以下の形式で会員種別と購入金額が記載されているものとする。 [会員種別(1桁) 購入金額] ここで、会員種別は1が一般会員、2が特別会員、3が非会員を表す。 会員種別の判定にはswitch文を用い、一般会員は「会」、特別会員は「特」、 非会員は「非」と表しなさい。' :- get_split_lines('data03.da