このディレクトリの索引

% 以下のサイトは 相加平均(L,_相加平均) :- 算術平均(L,_相加平均). 算術平均([],N,S,M) :- M is S / N,!. 算術平均([A|R],N,S,M) :- S1 is S + A,算術平均(R,N,S1,M) . 算術平均(L,M) :- length(L,N),算術平均(L,N,0.0,M). 標準偏差([],N,M,S,V) :- V is sqrt(S / (N - 1)),!. 標準偏差([A|R],N,M,S,V) :- S1 is (A - M) ^ 2,S2 is S + S1,標準偏差(R,N,M,S2,V). 標準偏差(L,V) :- length(L,N),算術平均(L,M),標準偏差(L,N,M,0.0,V) . 平均偏差(L,_平均偏差) :- 算術平均(L,Avg), length(L,N), 平均偏差(L,Avg,0.0,Amd), _平均偏差 is Amd / N. 平均偏差([],_,X,X). 平均偏差([A|R1],Avg,Y,X) :- Y2 is Y + abs(A-Avg), 平均偏差(R1,Avg,Y2,X). 尖度(_標本,_尖度) :- length(_標本,_標本数), 算術平均(_標本,_算術平均), 分散(_標本,_分散), findsum(U,(member(A,_標本),U is (A-_算術平均) ^ 4),X1), _尖度 is X1 / ((sqrt(_分散) ^ 4) * _標本数). 尖度([],N,M,S1,S2,V) :- V is S2 / (M * S2 ^ 2). 尖度([A|R],N,M,S1,S2,V) :- S3 is (A - M) ^ 2, S4 is (A - M) ^ 4, S5 is S1 + S3, S6 is S2 + S4, 尖度(R,N,M,S5,S6,V). 分散(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). 相乗平均(L,_相乗平均) :- 幾何平均(L,_相乗平均). 幾何平均([],N,S,M) :- M is exp(S / N),!. 幾何平均([A|R],N,S,M) :- S0 is ln(A), S1 is S + S0, 幾何平均(R,N,S1,M). 幾何平均(_標本ならび,_幾何平均) :- length(_標本ならび,_標本数), 幾何平均(_標本ならび,_標本数,0,_幾何平均). 加重平均(_標本ならび,_加重平均) :- findsum(_重み,member([_重み,_],_標本ならび),S), findsum(M,(member([A,B],_標本ならび),M is A * B),S2), _加重平均 is S2 / S,!. 偏差値(_母集合,_偏差値ならび) :- 加算(_母集合,_算術合計), length(_母集合,_ならびの長さ), _算術平均 is _算術合計 / _ならびの長さ, 標準偏差(_母集合,_標準偏差), findall(_偏差値,( member(_値,_母集合) , 偏差値(_値,_算術平均,_標準偏差,_偏差値)), _偏差値ならび). 偏差値(_標本値,_算術平均,_標準偏差,_偏差値) :- _偏差値 is 10 * (_標本値 - _算術平均) / _標準偏差 + 50. 中央値(_標本ならび,_中央値) :- medium(_標本ならび,_中央値). medium(L,_中央値) :- quicksort(L,L2), length(L2,Len), Len2 is Len // 2, medium(L2,Len2,_中央値). medium(L,Len,_中央値) :- append(L1,[_中央値|L2],L), length(L1,Len), length(L2,Len),!. medium(L,Len,_中央値) :- Len2 is Len - 1, append(L1,[_中央値1,_中央値2|L2],L), length(L1,Len2), length(L2,Len2), _中央値 is (_中央値1 + _中央値2) / 2. 最小公倍数(N1 * A,B,C) :- integer(B), 最小公倍数(A,B,C), N1 is C // A,!. 最小公倍数(A,N2 * B,C) :- integer(A), 最小公倍数(A,B,C), N2 is C // B,!. 最小公倍数(N1 * A,N2 * B,C) :- 最小公倍数(A,B,C), N1 is C // A, N2 is C // B,!. 最小公倍数(A,B,X) :- integer(A), integer(B), 最大公約数をユークリッドの互除法で求める(A,B,C), X is A * B // C. 最小公倍数([N1 * A|R],X) :- findall(U,member(_ * U,[N1 * A|R]),L1), 最小公倍数(L1,X), 最小公倍数_2([N1 * A|R],X),!. 最小公倍数([A,B],X) :- 最小公倍数(A,B,X),!. 最小公倍数([A|R],X) :- 最小公倍数(R,B), 最小公倍数(A,B,X),!. 最大公約数(M,N,X) :- 最大公約数をユークリッドの互除法で求める(M,N,X),!. 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1312201995/826 # [1] 授業単元:クイックソート # [2] 問題文(含コード&リンク): http://ime.nu/ideone.com/duPFX # # 問題1. 整数データの配列a[], 全体のサイズn を引数にとり、単純なpivot(=x とする) により # x 以下の左部分とx より大きな右部分に分割して、pivot の値, 左部分、右部分を # 表示する関数を作成して正しく動くことを確認せよ。 # # 問題2. 整数データの配列に対してソートをかける関数を、クイックソートで作成し、正 しく動くことを確認せよ。 # ただし、pivot は単純なものでよい。これをquick と呼ぶ。 # # 問題2. 整数データの配列に対してソートをかける関数を、クイックソートで作成し、正 しく動くことを確認せよ。 # ただし、pivot は単純なものでよい。これをquick と呼ぶ。 # # 問題3. 問題2 を変更して、pivot を両端と中央での値の3個の値の中央値として # クイックソートを作成し、正しく動くことを確認せよ。 # これをquick2 と呼ぶことにする。 # # 問題4. 問題3 を変更して、もし配列のサイズが10 以下であれば挿入ソートを # 行うように再帰呼び出しを変更しなさい。これをquick3 と呼ぶことにする。 # # 問題5.Merge ソート,quick,quick2,quick3 について時間計測をして比較しなさい # '整数データのならび_a, 全体のサイズ_nを引数にとり、単純なpivot(=x とする)によりx 以下の左部分とx より大きな右部分に分割して、pivot の値, 左部分、右部分を表示する'(_a,_n,_x) :- 軸要素を得る(_a,_x), '単純なpivot(=x とする)によりx 以下の左部分とx より大きな右部分に分割して'(_a,_x,_左部分,_右部分), 'pivot の値, 左部分、右部分を表示する'(_x,_左部分,_右部分). 軸要素を得る(_a,_x) :- _a = [_x|_]. '単純なpivot(=x とする)によりx 以下の左部分とx より大きな右部分に分割して'([],_x,[],[]). '単純なpivot(=x とする)によりx 以下の左部分とx より大きな右部分に分割して'([A|R1],_x,[A|R2],R3) :- A @=< _x, '単純なpivot(=x とする)によりx 以下の左部分とx より大きな右部分に分割して'(R1,_x,R2,R3). '単純なpivot(=x とする)によりx 以下の左部分とx より大きな右部分に分割して'([A|R1],_x,R2,[A|R3]) :- A @> _x, '単純なpivot(=x とする)によりx 以下の左部分とx より大きな右部分に分割して'(R1,_x,R2,R3). 'pivot の値, 左部分、右部分を表示する'(_x,_左部分,_右部分) :- writef('%q+[%q]+%q\n',[_左部分,_x,_右部分]). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1312201995/826 # [1] 授業単元:クイックソート # [2] 問題文(含コード&リンク): http://ime.nu/ideone.com/duPFX # # 問題1. 整数データの配列a[], 全体のサイズn を引数にとり、単純なpivot(=x とする) により # x 以下の左部分とx より大きな右部分に分割して、pivot の値, 左部分、右部分を # 表示する関数を作成して正しく動くことを確認せよ。 # # 問題2. 整数データの配列に対してソートをかける関数を、クイックソートで作成し、正 しく動くことを確認せよ。 # ただし、pivot は単純なものでよい。これをquick と呼ぶ。 # # 問題2. 整数データの配列に対してソートをかける関数を、クイックソートで作成し、正 しく動くことを確認せよ。 # ただし、pivot は単純なものでよい。これをquick と呼ぶ。 # # 問題3. 問題2 を変更して、pivot を両端と中央での値の3個の値の中央値として # クイックソートを作成し、正しく動くことを確認せよ。 # これをquick2 と呼ぶことにする。 # # 問題4. 問題3 を変更して、もし配列のサイズが10 以下であれば挿入ソートを # 行うように再帰呼び出しを変更しなさい。これをquick3 と呼ぶことにする。 # # 問題5.Merge ソート,quick,quick2,quick3 について時間計測をして比較しなさい # quick([],[]). quick(_ならび,_整列されたならび) :- 軸要素を得る(_ならび,_x), '単純なpivot(=x とする)によりx 以下の左部分とx より大きな右部分に分割して'(_ならび,_x,_左部分,_右部分), quick(_左部分,_整列された左部分), quick(_右部分,_整列された右部分), append(_整列された左部分,[_x|_整列された右部分],_整列されたならび). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1312201995/826 # [1] 授業単元:クイックソート # [2] 問題文(含コード&リンク): http://ime.nu/ideone.com/duPFX # # 問題1. 整数データの配列a[], 全体のサイズn を引数にとり、単純なpivot(=x とする) により # x 以下の左部分とx より大きな右部分に分割して、pivot の値, 左部分、右部分を # 表示する関数を作成して正しく動くことを確認せよ。 # # 問題2. 整数データの配列に対してソートをかける関数を、クイックソートで作成し、正 しく動くことを確認せよ。 # ただし、pivot は単純なものでよい。これをquick と呼ぶ。 # # 問題2. 整数データの配列に対してソートをかける関数を、クイックソートで作成し、正 しく動くことを確認せよ。 # ただし、pivot は単純なものでよい。これをquick と呼ぶ。 # # 問題3. 問題2 を変更して、pivot を両端と中央での値の3個の値の中央値として # クイックソートを作成し、正しく動くことを確認せよ。 # これをquick2 と呼ぶことにする。 # # 問題4. 問題3 を変更して、もし配列のサイズが10 以下であれば挿入ソートを # 行うように再帰呼び出しを変更しなさい。これをquick3 と呼ぶことにする。 # # 問題5.Merge ソート,quick,quick2,quick3 について時間計測をして比較しなさい # 軸要素を得る([A],A) :- !. 軸要素を得る([A,B],A) :- !. 軸要素を得る(_a,_x) :- 要素数が偶数の場合(_a,A,B,C). 中間値(A,B,C,_x),!. 軸要素を得る(_a,_x) :- 要素数が奇数の場合(_a,A,B,C), 中間値(A,B,C,_x),!. 要素数が偶数の場合(_a,_x) :- append([A|R1],[B|R2],_a), length(R1,N), length(R2,N), last(R2,C),!. 要素数が奇数の場合(_a,_x) :- append([A|R1],[B|R2],_a), length([A|R1],N), length(R2,N), last(R2,C),!. quick2([],[]). quick2(_ならび,_整列されたならび) :- 軸要素を得る(_ならび,_x), '単純なpivot(=x とする)によりx 以下の左部分とx より大きな右部分に分割して'(_ならび,_x,_左部分,_右部分), quick2(_左部分,_整列された左部分), quick2(_右部分,_整列された右部分), append(_整列された左部分,[_x|_整列された右部分],_整列されたならび). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1312201995/826 # [1] 授業単元:クイックソート # [2] 問題文(含コード&リンク): http://ime.nu/ideone.com/duPFX # # 問題1. 整数データの配列a[], 全体のサイズn を引数にとり、単純なpivot(=x とする) により # x 以下の左部分とx より大きな右部分に分割して、pivot の値, 左部分、右部分を # 表示する関数を作成して正しく動くことを確認せよ。 # # 問題2. 整数データの配列に対してソートをかける関数を、クイックソートで作成し、正 しく動くことを確認せよ。 # ただし、pivot は単純なものでよい。これをquick と呼ぶ。 # # 問題2. 整数データの配列に対してソートをかける関数を、クイックソートで作成し、正 しく動くことを確認せよ。 # ただし、pivot は単純なものでよい。これをquick と呼ぶ。 # # 問題3. 問題2 を変更して、pivot を両端と中央での値の3個の値の中央値として # クイックソートを作成し、正しく動くことを確認せよ。 # これをquick2 と呼ぶことにする。 # # 問題4. 問題3 を変更して、もし配列のサイズが10 以下であれば挿入ソートを # 行うように再帰呼び出しを変更しなさい。これをquick3 と呼ぶことにする。 # # 問題5.Merge ソート,quick,quick2,quick3 について時間計測をして比較しなさい # quick3([],[]) :- !. quick3(_ならび,_整列したならび) :- \+(append([_,_,_,_,_,_,_,_,_,_],_,_ならび)), 挿入ソート(_ならび,_整列したならび),!. quick3(_ならび,_整列されたならび) :- 軸要素を得る(_ならび,_x), '単純なpivot(=x とする)によりx 以下の左部分とx より大きな右部分に分割して'(_ならび,_x,_左部分,_右部分), quick2(_左部分,_整列された左部分), quick2(_右部分,_整列された右部分), append(_整列された左部分,[_x|_整列された右部分],_整列されたならび). 挿入ソート(_ならび,_整列したならび) :- 挿入ソート(_ならび,[],_整列したならび). 挿入ソート([],L,L) :- !. 挿入ソート(L,[],L) :- !. 挿入ソート([A|R1],[B|R2],L) :- A @=< B, 挿入ソート(R1,[A,B|R2],L),!. 挿入ソート([A|R1],[B|R2],L) :- A @> B, 挿入(A,[B|R2],L2), 挿入ソート(R1,L2,L). 挿入(A,[],[A]) :- !. 挿入(A,[B|R1],[A,B|R1]) :- A @=< B,!. 挿入(A,[B|R1],[B|R2]) :- A @> B, 挿入(A,R1,R2). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1312201995/893 # C言語で5つの整数の中心値(中央値)を求めるプログラムを作成するという問題を出されたのですが # さっぱり分かりません # for文の課題なのでfor文を使って頂けるとありがたいです # # '5つの整数の中心値(中央値)を求める'(V1,V2,V3,V4,V5,_中央値) :- 最大値([V1,V2,V3,V4,V5],_,L1), 最小値(L1,_,L2), 最大値(L2,_,L3), 最小値(L3,_,[_中央値]). 最大値(L,_最大値,L1) :- append(L0,[_最大値|R],L), \+((member(A,L0),A > _最大値)), \+((member(B,R),B > _最大値)), append(L0,R,L1),!. 最小値(L,_最小値,L1) :- append(L0,[_最小値|R],L), \+((member(A,L0),A < _最小値)), \+((member(B,R),B < _最小値)), append(L0,R,L1),!. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1335517816/886 # [1] 授業単元:情報解析 # [2] 問題文(含コード&リンク): y = 2*x^n + 3x + 5 の式における # 前進/中央/後退 差分による微分値を(n = 2,6) で求めるプログラムを作成しなさい。 # ただし微分値は2点微分。 # f(N,X,Y) :- Y is 2 * X ^ N + 3 * X + 5. 'x=1 ,y = 2*x^n + 3x + 5 の式における前進/中央/後退 差分による微分値を(n = 2,6) で求めるプログラムを作成しなさい。ただし微分値は2点微分。'(_差分,_微分値) :- f(N,X,_中央値), 前進差分による微分値(N,X,_差分,_中央値,_前進微分値), 後退差分による微分値(N,X,_差分,_中央値,_後退微分値), _微分値 is (_前進微分値+_後退微分値) / 2. 前進差分による微分値(N,X,_差分,_中央値,_前進微分値) :- X_2 is X + _差分, f(N,X_2,_前進差分値), _前進微分値 is (_前進差分値-_中央値) / _差分. 後退差分による微分値(N,X,_差分,_中央値,_後退微分値) :- _X_1 is X - _差分, f(N,X_1,_後退差分値), _後退微分値 is (_中央値-_後退差分値) / _差分. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1339338438/164 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # n人の点数を読み込み、その中央値を求めたい。 # そこで、次の関数を 作成しなさい。 # *標準入力から読み込んだ点数を配列に代入する関数。 # ただし、呼び出し時には人数は与えられず、負の点数が入力されたら、 # その直前までの点数を返すものとする。また、人数を関数の返却値で返す。 # 例.85, 58, 90, 65, 45, -1 のときは、5名の点数を配列に入れ、 # 関数自身は人数の5を返却する。 # *配列の中身を昇順に並べ替える関数。ここで、配列のi番目とj番目の要 # 素の値を入れ替えるには、次のように行う。 # int temp = ary[i]; # ary[i] = ary[j]; # ary[j] = temp; # * 配列から中央値を返却する関数。 # 中央値は、データ数が奇数個のときは、 1番目から数えて(n+1)/2$番目の # データであり、偶数個のときは、n/2番目とn/2+1番目のデータの平均値でる。 # 例.50, 70, 90のときは、中央値は70であり、50, 70, 80, 90のときは、 中 # 央値は75である。 # 適切な実行例を作成し、上記の関数が正しく動作することを示しなさい。 # 'n人の点数を読み込み、その中央値を求めたい。そこで、次の関数を作成しなさい。 *標準入力から読み込んだ点数を配列に代入する関数。ただし、呼び出し時には人数は与えられず、負の点数が入力されたら、その直前までの点数を返すものとする。また、人数を返却値で返す。'(_人数,_中央値) :- 整数を得る(人数,_人数), '人数分の点数を入力する。ただし、負の点数が入力されたら、その直前の点数を返す'(_人数,_点数ならび), 中央値(_点数ならび,_中央値). '人数分の点数を入力する。ただし、負の点数が入力されたら、その直前の点数を返す'(_人数,_点数ならび) :- length(Ln,_人数), findall(_点数,( member(_,Ln), 整数を得る(点数,_点数), ( _点数 < 0,!,fail;true)), _点数ならび). 中央値(_標本ならび,_中央値) :- 整列(_標本ならび,_整列した標本ならび), length(_整列した標本ならび,_要素数), _要素数の半分 is _要素数 // 2, 中央値(_整列した標本ならび,_要素数の半分,_中央値). 中央値(_整列した標本ならび,_要素数の半分,_中央値) :- length(L1,_要素数の半分), length(L2,_要素数の半分), append(L1,[_中央値|L2],_整列した標本ならび),!. 中央値(_整列した標本ならび,_要素数の半分,_中央値) :- _要素数の半分_1 is _要素数の半分 - 1, length(L1,_要素数の半分_1), length(L2,_要素数の半分_1), append(L1,[_中央値1,_中央値2|L2],_整列した標本ならび), _中央値 is (_中央値1 + _中央値2) / 2. 整列([],[]) :- !. 整列(_対象ならび,_整列したならび) :- _対象ならび = [_軸要素|_残り対象ならび], 整列(_軸要素,_残り対象ならび,_整列したならび). 整列(_軸要素,_軸要素を除いた対象ならび,_整列したならび) :- 分割(_軸要素,_軸要素を除いた対象ならび,_軸要素に等しいかより小さい要素のならび,_軸要素より大きい要素のならび), 整列(_軸要素に等しいかより小さい要素のならび,_整列した軸要素に等しいかより小さい要素のならび), 整列(_軸要素より大きい要素のならび,_整列した軸要素より大きい要素のならび), append(_軸要素に等しいかより小さい要素のならび,[_軸要素|_整列した軸要素より大きい要素のならび],_整列したならび). 分割(_軸要素,[],[],[]). 分割(_軸要素,[_要素|_残り対象ならび],[_要素|_軸要素に等しいかより小さい要素のならび],_軸要素より大きい要素のならび) :- _要素 @=< _軸要素, 分割(_軸要素,_残り対象ならび,_軸要素に等しいかより小さい要素のならび,_軸要素より大きい要素のならび). 分割(_軸要素,[_要素|_残り対象ならび],_軸要素に等しいかより小さい要素のならび,[_要素|_軸要素より大きい要素のならび]) :- _要素 @> _軸要素, 分割(_軸要素,_残り対象ならび,_軸要素に等しいかより小さい要素のならび,_軸要素より大きい要素のならび). % 整数を得る/2 % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1349527750/338 # 7個のデータを入力し、中央地を表示するプログラムを作成して下さい # # 例 # 1番目の数字を入力してください: 13 # 2番目の数字を入力してください: 22 # ・・・ # 中央値は 22 です。 # # '7個のデータを入力し、中央地を表示する' :- '7個のデータを入力し'(_7個のデータ), 中央値を表示する(_7個のデータ). '7個のデータを入力し'(_7個のデータ) :- '7個のデータを'(_7個のデータ), 入力し(1,_7個のデータ),!. '7個のデータを'(_7個のデータ) :- length(_7個のデータ,7). 入力し(_何番目,[]) :- _何番目 > 7. 入力し(_何番目,[_データ|R]) :- writef('%t番目のデータを入力してください: ',[_何番目]), get_line(_データ), _何番目_2 is _何番目 + 1, 入力し(_何番目_2,R). 中央値を表示する(_7個のデータ) :- バブルソート(_7個のデータ,[_,_,_,_中央値,_,_,_]), 表示する(_中央値). バブルソート(L1,L2) :- 軽い泡はちょっと浮き上がる(L1,L3), 泡が浮き上がったら最初からやり直す(L3,L2),!. バブルソート(L,L) :- 浮き上がる泡がなくなったらバブルソート終了. 軽い泡はちょっと浮き上がる(L1,L3) :- append(L0,[_重い泡,_軽い泡|R],L1), _重い泡 @> _軽い泡, append(L0,[_軽い泡,_重い泡|R],L3). 泡が浮き上がったら最初からやり直す(L3,L2) :- バブルソート(L3,L2). 浮き上がる泡がなくなったらバブルソート終了. 表示する(_中央値) :- writef('中央値は %t です\n',[_中央値]). % 以下のサイトは # # 1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となるPrologプログラムを作成しなさい。 # '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となるPrologプログラムを作成しなさい。'(_乱数ならび) :- '1から99までを値域とする乱数'(_乱数), '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(_乱数,0,0,0,_乱数ならび). '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(_,1,3,3,[]) :- !. '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(22,0,_22以下の頻度_1,_22以下の頻度_1,[22|R]) :- var(_22の枠), '1から99までを値域とする乱数'(_乱数), '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(_乱数,1,_22以下の頻度_1,_22以下の頻度_1,R),!. '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(_値,_22,_22以下の頻度_1,_22以下の頻度_1,[_値|R]) :- _値 =< 22, _22以下の頻度_1 < 3, _22以下の頻度_2 is _22以下の頻度_1 + 1, '1から99までを値域とする乱数'(_乱数), 中央値が22となる(_乱数,_22,_22以下の頻度_2,_22以上の頻度_1,R),!. '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(_値,_22,_22以下の頻度_1,_22以下の頻度_1,[_値|R]) :- _値 >= 22, _22以上の頻度_1 < 3, _22以上の頻度_2 is _22以上の頻度_1 + 1, '1から99までを値域とする乱数'(_乱数), '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(_乱数,_22,_22以下の頻度_1,_22以上の頻度_2,R),!. '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(_,_22,_22以下の頻度_1,_22以下の頻度_1,R) :- '1から99までを値域とする乱数'(_乱数), '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(_乱数,_22,_22以下の頻度_1,_22以上の頻度_1,R),!. '1から99までを値域とする乱数'(_乱数) :- _乱数 is random(99) + 1. % 以下のサイトは # # 1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となるPrologプログラムを作成しなさい。 # '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となるPrologプログラムを作成しなさい。'(_乱数ならび) :- '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(0,0,0,_乱数ならび). '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(1,3,3,[]) :- !. '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(_22_1,_以下_1,_以上_1,[_乱数|R]) :- '1から99までを値域とする乱数'(_乱数), '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(_乱数,_22_1,_以下_1,_以上_1,_22_2,_以下_2,_以上_2), '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(_22_2,_以下_2,_以上_2,R),!. '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(22,0,_以下,_以上,1,_以下,_以上) :- !. '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(_乱数,_22,_以下_1,_以上_1,_22,_以下_2,_以上_1) :- '乱数が22以下で枠がまだある'(_乱数,_以下_1,_以下_2),!. '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(_乱数,_22,_以下_1,_以上_1,_22,_以下_1,_以上_2) :- '乱数が22以上で枠がまだある'(_乱数,_以上_1,_以上_2),!. '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(_,_22,_以下,_以上,_22,_以下,_以上) :- 既に枠が埋まってしまっている場合は乱数は使用されない. '乱数が22以下で枠がまだある'(_乱数,_以下_1,_以下_2) :- _乱数 =< 22, _以下_1 < 3, _以下_2 is _以下_1 + 1,!. '乱数が22以上で枠がまだある'(_乱数,_以上_1,_以上_2) :- _乱数 >= 22, _以上_1 < 3, _以上_2 is _以上_1 + 1,!. '1から99までを値域とする乱数'(_乱数) :- _乱数 is random(99) + 1. 既に枠が埋まってしまっている場合は乱数は使用されない. % 以下のサイトは # # ならびの中央値 # 中央値(_ならび,_中央値) :- 整列(_ならび,_整列済みならび), length(L0,_同じ要素数), length(R,_同じ要素数), 中央値(_整列済みならび,L0,R,_中央値),!. 中央値(_整列済みならび,L0,R,_中央値) :- append(L0,[_中央値_1,_中央値_2|R],_整列済みならび), _中央値 is (_中央値_1 + _中央値_2) / 2. 中央値(_整列済みならび,L0,R,_中央値) :- append(L0,[_中央値|R],_整列済みならび). 整列([],[]). 整列([_軸要素|R],L2) :- 分割(_軸要素,R,_軸要素に等しいか小さい要素ならび,_軸要素より大きい要素ならび), 整列(_軸要素に等しいか小さい要素ならび,_整列した軸要素に等しいか小さい要素ならび), 整列(_軸要素より大きい要素ならび,_整列した軸要素より大きい要素ならび), append(_整列した軸要素に等しいか小さい要素ならび,[_軸要素|_整列した軸要素より大きい要素ならび],L2). 分割(_,[],[],[]). 分割(_軸要素,[_値|R1],[_値|R2],R3) :- _値 @=< _軸要素, 分割(_軸要素,R1,R2,R3). 分割(_軸要素,[_値|R1],R2,[_値|R3]) :- _値 @> _軸要素, 分割(_軸要素,R1,R2,R3). % 以下のサイトは # # ならびの中央値 # 中央値(L,_中央値) :- 整列(L,L1), length(L,_要素数), Div_2 is _要素数 // 2, Mod_2 is _要素数 mod 2, 中央値(L1,Div_2,Mod_2,_中央値). 中央値(L,Div_2,1,_中央値) :- nth0(Div_2,L,_中央値). 中央値(L,Div_2,0,_中央値) :- nth1(Div_2,L,_値_1), nth0(Div_2,L,_値_2), _中央値 is (_値_1 + _値_2) / 2. 整列([],[]). 整列([_軸要素|R],L2) :- 分割(_軸要素,R,_軸要素に等しいか小さい要素ならび,_軸要素より大きい要素ならび), 整列(_軸要素に等しいか小さい要素ならび,_整列した軸要素に等しいか小さい要素ならび), 整列(_軸要素より大きい要素ならび,_整列した軸要素より大きい要素ならび), append(_整列した軸要素に等しいか小さい要素ならび,[_軸要素|_整列した軸要素より大きい要素ならび],L2). 分割(_,[],[],[]). 分割(_軸要素,[_値|R1],[_値|R2],R3) :- _値 @=< _軸要素, 分割(_軸要素,R1,R2,R3). 分割(_軸要素,[_値|R1],R2,[_値|R3]) :- _値 @> _軸要素, 分割(_軸要素,R1,R2,R3). % 以下のサイトは # # 1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となるPrologプログラムを作成しなさい。 # '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となるPrologプログラムを作成しなさい。'(L) :- '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'([],L). '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となる'(L1,L) :- 乱数を発生させる(_乱数), 乱数を挿入して整列させる(_乱数,L1,L2), '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となるの二'(L2,LL). '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となるの二'(L1,L) :- 中央値が存在する(L1,L). '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となるの二'(L1,L) :- '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となる'(L1,L). 中央値が存在する(L1,L) :- append(L0,[[_1,_2,_3,_4,_5,_6,_7,_8]|R],L1), 44 is _4 + _5, 中央値が存在する(L1,L0,[_1,_2,_3,_4,_5,_6,_7,_8],R,L). 中央値が存在する(L1,_,L,_,L). 中央値が存在する(L1,L0,_,R,L) :- append(L0,R,L2), '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となる'(L2,L). 乱数を発生させる(_乱数) :- _乱数 is random(99) + 1. 乱数を挿入して整列させる(_乱数,[],[_乱数]) :- !. 乱数を挿入して整列させる(_乱数,[N|R],[_乱数,N|R]) :- _乱数 =< N,!. 乱数を挿入して整列させる(_乱数,[N|R1],[N|R2]) :- _乱数 > N, 乱数を挿入して整列させる(_乱数,R1,R2). % 以下のサイトは # # 1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となるPrologプログラムを作成しなさい。 # '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となる'(_1,_2,_3,_4,_5,_6,_7,_8) :- '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となる'([],[_1,_2,_3,_4,_5,_6,_7,_8]). '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となる'([_1,_2,_3,_4,_5,_6,_7,_8|_],[_8,_7,_6,_5,_4,_3,_2,_1]) :- 整列([_1,_2,_3,_4,_5,_6,_7,_8],[_,_,_,M,N,_,_,_]), 44 is M + N. '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となる'(L1,L) :- N is random(99) + 1, '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となる'([N|L1],L). 整列([],[]). 整列([_軸要素|R1],L) :- 分割(_軸要素,R1,L1,L2), 整列(L1,L3), 整列(L2,L4), append(L3,[_軸要素|L4],L). 分割(_,[],[],[]). 分割(_軸要素,[A|R1],[A|R2],R3) :- A @=< _軸要素, 分割(_軸要素,R1,R2,R3). 分割(_軸要素,[A|R1],R2,[A|R3]) :- A @> _軸要素, 分割(_軸要素,R1,R2,R3). % 以下のサイトは 有限個のデータを小さい順に並べた時中央に位置する値(_有限個のデータ,_中央値) :- 小さい順に並べた時(_有限個のデータ,_小さい順に並べた有限個のデータ), 中央に位置する値(_小さい順に並べた有限個のデータ,_中央値). 中央に位置する値(_小さい順に並べた有限個のデータ,_中央値) :- length(_小さい順に並べた有限個のデータ,_データ数), 中央に位置する値(_小さい順に並べた有限個のデータ,_データ数,_中央値). 中央に位置する値(_小さい順に並べた有限個のデータ,_データ数,_中央値) :- 'データが奇数個の場合は、中央の位置にある値'(_小さい順に並べた有限個のデータ,_データ数,_中央値). 中央に位置する値(_小さい順に並べた有限個のデータ,_データ数,_中央値) :- 'データが偶数個の場合は、中央に近い2つの値の算術平均をとる'(_小さい順に並べた有限個のデータ,_データ数,_中央値). 'データが奇数個の場合は、中央の位置にある値'(_小さい順に並べた有限個のデータ,_データ数,_中央値) :- 奇数(_データ個数), _中央の位置 is (_データ個数 // 2) + 1, nth1(_中央の位置,_小さい順に並べた有限個のデータ,_中央値). 'データが偶数個の場合は、中央に近い2つの値の算術平均をとる'(_小さい順に並べた有限個のデータ,_データ数,_中央値) :- 偶数(_データ個数), 中央に近い2つの値の(_小さい順に並べた有限個のデータ,_値_1,_値_2), _中央値 is ( _値_1 + _値_2 ) / 2. 偶数(_整数) :- 0 is _整数 // 2. 奇数(_整数) :- 1 is _整数 // 2. 中央に近い2つの値の(_小さい順に並べた有限個のデータ,_データ個数,_値_1,_値_2) :- _中央に近い位置_1 is _データ個数 // 2, succ(_中央に近い位置_1,_中央に近い位置_2), nth1(_中央に近い位置_1,_小さい順に並べた有限個のデータ,_値_1), nth1(_中央に近い位置_2,_小さい順に並べた有限個のデータ,_値_2). 小さい順に並べた時(小さい順に並べた時([],[]). 小さい順に並べた時(小さい順に並べた時(_有限個のデータ,_小さい順に並べた有限個のデータ) :- 軸要素の選定(_有限個のデータ,_軸要素,_軸要素を除いたならび), 軸要素より小さい要素ならびと軸要素に等しいか大きい要素ならび(_軸要素,_軸要素を除いたならび,_軸要素より小さい要素ならび,_軸要素に等しいか大きい要素ならび), '軸要素で分割した二つの要素ならびを それぞれ小さい順に並べて結合する'(_軸要素,_軸要素より小さい要素ならび,_軸要素に等しいか大きい要素ならび,_小さい順に並べた有限個のデータ). '軸要素で分割した二つの要素ならびを それぞれ小さい順に並べて結合する'(_軸要素,_軸要素より小さい要素ならび,_軸要素に等しいか大きい要素ならび,_小さい順に並べた有限個のデータ) :- 小さい順に並べた時(_軸要素より小さい要素ならび,_小さい順にならべた軸要素より小さい要素ならび), 小さい順に並べた時(_軸要素に等しいか大きい要素ならび,_小さい順にならべた軸要素に等しいか大きい要素ならび), append(_小さい順にならべた軸要素より小さい要素ならび,[_軸要素|_小さい順にならべた軸要素より小さい要素ならび],_小さい順に並べた有限個のデータ). 軸要素の選定([_軸要素|_軸要素を除いたならび],_軸要素,_軸要素を除いたならび). 軸要素より小さい要素ならびと軸要素に等しいか大きい要素ならび(_,[],[],[]). 軸要素より小さい要素ならびと軸要素に等しいか大きい要素ならび(_軸要素,[A|R],[A|_軸要素より小さい要素ならび],_軸要素に等しいか大きい要素ならび) :- A @< _軸要素, 軸要素より小さい要素ならびと軸要素に等しいか大きい要素ならび(_軸要素,R,_軸要素より小さい要素ならび,_軸要素に等しいか大きい要素ならび). 軸要素より小さい要素ならびと軸要素に等しいか大きい要素ならび(_軸要素,[A|R],_軸要素より小さい要素ならび,[A|_軸要素に等しいか大きい要素ならび]) :- A @>= _軸要素, 軸要素より小さい要素ならびと軸要素に等しいか大きい要素ならび(_軸要素,R,_軸要素より小さい要素ならび,_軸要素に等しいか大きい要素ならび).