このディレクトリの索引

% 以下のサイトは # 出典 :: Qiita_47443e0fb2988c1332b2 表(1,×,×,×,×,×). 表(2,×,×,×,○,×). 表(3,×,×,○,×,×). 表(4,×,○,×,×,×). 表(5,×,×,○,○,○). 表(6,×,○,○,×,×). 表(7,×,○,×,○,○). 表(8,×,○,○,○,○). 表(9,○,×,×,×,×). 表(10,○,×,×,○,×). 表(11,○,×,○,×,○). 表(12,○,○,×,×,○). 表(13,○,×,○,○,○). 表(14,○,○,○,×,○). 表(15,○,○,×,○,○). 表(16,○,○,○,○,○). 結婚できるか(_結婚できるか) :- findall(_項目の判定,聞き取り(_項目の判定),[_年収,_身長,_学歴,_親が資産家]), 結婚できるか(_年収,_身長,_学歴,_親が資産家,_結婚できるか). 聞き取り項目(年収,年収). 聞き取り項目(身長,身長). 聞き取り項目(学歴,学歴). 聞き取り項目(親の資産額,親が資産家). 聞き取り(_項目の判定) :- 聞き取り項目の値を得る(_項目,_値), 項目の判定(_項目,_値,_項目の判定). 聞き取り項目の値を得る(_項目,_値) :- 聞き取り項目(_質問,_項目), writef('%t : ',[_質問]), 行入力(_値). 項目の判定(_項目,_値,_項目の判定) :- P =.. [_項目,_値,_項目の判定], call(P). 年収(_年収文字列,○) :- 年収が10000000円以上(_年収文字列),!. 年収(_,×). 年収が10000000円以上(_年収文字列) :- atom_number(_年収文字列,_年収), _年収 >= 10000000. 親が資産家(_資産額文字列,○) :- 親の資産が10000000円以上(_資産額文字列),!. 親が資産家(_,×). 親の資産が10000000円以上(_資産額文字列) :- atom_number(_資産額文字列,_資産額), _資産額 >= 100000000. 身長(_身長文字列,○) :- 身長が180cm以上(_身長文字列),!. 身長(_,×). 身長が180cm以上(_身長文字列) :- atom_number(_身長文字列,_身長), _身長 >= 180. 学歴(_学歴,○) :- 最終学歴の偏差値が65以上(_学歴),!. 学歴(_学歴,×). 最終学歴の偏差値が65以上(_大学卒) :- 入試時点の偏差値(_大学卒,_偏差値), _偏差値 >= 65. 入試時点の偏差値(南河内大学,71). 入試時点の偏差値(私立東京未来大学,62). 結婚できるか(_年収,_身長,_学歴,_親が資産家,結婚できる) :- 表(_,_年収,_身長,_学歴,_親が資産家,○). 結婚できるか(_年収,_身長,_学歴,_親が資産家,結婚できない) :- 表(_,_年収,_身長,_学歴,_親が資産家,×). 行入力(_行文字列) :- 行入力文字ならびを得る(_行入力文字ならび), atom_chars(_行文字列,_行入力文字ならび). 行入力文字ならびを得る(_行入力文字ならび) :- findall(_文字,(文字入力(_文字),(行入力終了(_文字),!,fail;true)),_行入力文字ならび). 文字入力(end_of_file) :- at_end_of_stream(user_input). 文字入力(_文字) :- get_char(_文字). 文字入力(_文字) :- 文字入力(_文字). 行入力終了(end_of_file). 行入力終了('\n'). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/49 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # http://ime.nu/codepad.org/5oepZpDW # 上記のプログラムに5人の得点(10点満点)を受け取ると、5人の得点の偏差値を戻すhensachi関数を追加せよ。 # そして5人のテストの得点を整数型配列data[5]の各要素それぞれ入力すると、5人の得点の平均点に加えて偏差値も出力するプログラムをheikin関数およびhensachi関数を利用して作成しなさい。 # '5人の得点(10点満点)を受け取ると、5人の得点の偏差値を戻す'(_5人の得点の偏差値) :- '5人の得点(10点満点)を受け取ると'(_5人の得点ならび), '5人の得点の偏差値を戻す'(_5人の得点ならび,_5人の得点の偏差値). '5人の得点(10点満点)を受け取ると'(_5人の得点ならび) :- length(_5人の得点ならび,5), findall(_得点,( append(Ln,[_|_],_5人の得点ならび), '得点(10点満点)を受け取る'(Ln,_得点)), _5人の得点ならび). '得点(10点満点)を受け取る'(Ln,_得点) :- length([_|Ln],_何人目), writef('%t人目の得点(10点満点)を入力してください : ',[_何人目]), get_line(Line), '診断: 得点(10点満点)を受け取る'(Line,_得点),!. '得点(10点満点)を受け取る'(Ln,_得点) :- '得点(10点満点)を受け取る'(Ln,_得点). '診断: 得点(10点満点)を受け取る'(Line,_得点) :- atom_to_term(Line,_得点,_), integer(_得点), _得点 >= 0, _得点 =< 10,!. 偏差値(_標本値,_算術平均,_標準偏差,_偏差値) :- _偏差値 is 10 * (_標本値 - _算術平均) / _標準偏差 + 50. 偏差値(_標本ならび,_偏差値ならび) :- 平均値(_標本ならび,_平均値), 標準偏差(_標本ならび,_標準偏差), findall(_偏差値,( member(_値,_標本ならび), 偏差値(_値,_平均値,_標準偏差,_偏差値)), _偏差値ならび). 標準偏差(_標本ならび,V) :- length(_標本ならび,N), 平均値(_標本ならび,M), 標準偏差(_標本ならび,N,M,0.0,V). 標準偏差([],N,M,S,V) :- V is sqrt(S / (N - 1)),!. 標準偏差([A|R],N,M,S,V) :- S1 is (A - M) ^ 2, S2 is S + S1, 標準偏差(R,N,M,S2,V). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/331 # # [1] 授業単元:一般情報処理 # [2] 問題文(含コード&リンク):次のような動作をするプログラムを作成せよ。 #                配列内のデータの最小値を返す。int min() 配列内のデータの最大値を返す。int max() # 配列内のデータの平均値を返す。double mean() 配列内のデータの標準偏差を返す。double stdev() # ただしmain関数は次のものを使うこと。 #                int main(void){ # int a[15]={81,36,45,67,73,98,62,56,77,61,65,70,25,51,18}; # printf("min=%d\n",min(15,a)); # printf("max=%d\n",max(15,a)); # printf("average=%lf\n",mean(15,a)); # printf("standard deviation=%lf\n",stdev(15,a)); # return 0; } # さらに、配列a[]の各要素の偏差値を表示するプログラムを作成せよ # 平均値([],N,S,M) :- M is S / N,!. 平均値([A|R],N,S,M) :- S1 is S + A,平均値(R,N,S1,M) . 平均値(L,M) :- length(L,N),平均値(L,N,0.0,M) . 最小値最大値([A|R],_最小値,_最大値) :- 最小値最大値(R,A,A,_最小値,_最大値). 最小値最大値([],_最小値,_最大値,_最小値,_最大値) :- !. 最小値最大値([A|R],_最小値1,_最大値1,_最小値,_最大値) :- A @> _最大値,最小値最大値(R,_最小値1,A,_最小値,_最大値),!. 最小値最大値([A|R],_最小値1,_最大値1,_最小値,_最大値) :- A @< _最小値,最小値最大値(R,A,_最大値1,_最小値,_最大値),!. 最小値最大値([A|R],_最小値1,_最大値1,_最小値,_最大値) :- 最小値最大値(R,_最小値1,_最大値1,_最小値,_最大値),!. 標準偏差(L,V) :- length(L,N),平均値(L,M),標準偏差(L,N,M,0.0,V). 標準偏差([],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). 偏差値(_標本値,_算術平均,_標準偏差,_偏差値) :- _偏差値 is 10 * (_標本値 - _算術平均) / _標準偏差 + 50 . 偏差値(L,_偏差値ならび) :- 平均値(L,_平均値), 標準偏差(L,_標準偏差), findall(_偏差値,(member(_値,L) ,偏差値(_値,_平均値,_標準偏差,_偏差値)),_偏差値ならび). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/456 # # (1) 【main 関数のみ】 # int型配列 x[101] を定義し、キーボードから人数 N と N 人分の点数を入力し、平均点と # 偏差値を計算し、結果を画面に出力するプログラムを作成せよ。 # ◆ 条件 #  人数 N に負の値や101以上の値が入力されたときには、再入力するものとす # る。 #  点数 x[i] に負の値や100点を超える値が入力されたときには、再入力する # ものとする。 # ◆ 偏差値 Ti の計算式 # 10( xi   ) # Ti   50 #  # ただし # N # 1 # x #  i # N i 1 # N # 1 #  (x #   )2 # i # N i 1 # ここに、N :データの数 xi :個々の点数 μ:平均 σx:標準偏差 # # # 'int型配列 x[101] を定義し、キーボードから人数 N と N 人分の点数を入力し、平均点と偏差値を計算し、結果を画面に出力する' :- キーボードから人数Nを入力(N), キーボードからN人分の点数を入力(N,L), 相加平均(L,_相加平均), 標準偏差(L,_標準偏差), 偏差値(L,_相加平均,_標準偏差,_偏差値), write_formatted('平均点は%4.1f点です。\n',[_相加平均]), write_formatted('偏差値は%4.1fです。\n',[_偏差値]). キーボードから人数Nを入力(N) :- repeat,get_integer(N),N>=0,N=<100,!. キーボードからN人分の点数を入力(0,[]) :- !. キーボードからN人分の点数を入力(N,[I|R]) :- get_integer(I), I >= 0,I =< 100, N1 is N - 1, キーボードからN人分の点数を入力(N1,R),!. キーボードからN人分の点数を入力(N,L) :- キーボードからN人分の点数を入力(N,L). % 相加平均/3,標準偏差/2,偏差値/4の定義は http://nojiriko.asia/prolog/suchikeisan.html を参照してください。 % 以下のサイトは # 出典:: 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),!. % 以下のサイトは 相加平均(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).