このディレクトリの索引

% 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1247438792/776 # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): # 以下の機能を持った関数を含むプログラムを作成せよ. # 1.正の整数n,rを読み込み,その組み合わせnCrを計算する関数を再帰呼び出しを用いて作成せよ. # 2.正の整数n,rを読み込み,その組み合わせnCrを計算する関数を再帰呼び出しを用いないで作成せよ. t606_1(N,R,X) :- nCr(N,R,X). nCr(N,R,X) :- U is N-R, 階乗(N,K1), 階乗(R,K2), 階乗(U,K3), Y is K1 // K3, X is Y // K2. % 以下は見かけ再帰を含みませんが、実はfor/3やconcat_atom/3は再帰なしには書けない・・ t606_2(N,R,X) :- Y is N-R+1, findall(N1,for(N,N1,Y),L1), findall(N2,for(R,N2,1),L2), concat_atom(L1,'*',S1), concat_atom(L2,'*',S2), atom_to_term(S1,Term1,_), atom_to_term(S2,Term2,_), X is Term1 // Term2. /* t606_2(N,R,X) :- length(L,N), findsum(1,組み合わせ(L,R,_),Y), X is truncate(Y). */ 階乗(0,1) :- !. 階乗(1,1) :- !. 階乗(N,X) :- N2 is N - 1,階乗(N2,Y),X is N * Y. % 以下のサイトは nHr(N,R,X) :- N2 is N + R - 1, 階乗(N2,K1), N1 is N - 1, 階乗(N1,K2), 階乗(R,K3), X is K1 // (K2 * K3). 階乗(0,1) :- !. 階乗(1,1) :- !. 階乗(N,X) :- N2 is N - 1,階乗(N2,Y),X is N * Y. % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1247438792/956 # [1] 授業単元: C言語課題 # [2] 問題文(含コード&リンク): # # 入力した値を n とし、階乗の逆数の和 # 1 + 1/1! + 1/2! + 1/3! + ...... + 1/n! と、 # ネピア数(M_E)との比を計算し、小数点以下第 6 位 # まで求めて表示しなさい。繰り返しは for 文を使わず # while 文か do-while 文を利用して作成すること。 :- dynamic(階乗保存計算/2). '入力した値を n とし、階乗の逆数の和1 + 1/1! + 1/2! + 1/3! + ...... + 1/n! と、ネピア数(M_E)との比を計算し、小数点以下第 6 位まで求めて表示' :- '入力した値を n とし'(_n), 階乗の逆数の和とネピア数との比(_n,_階乗の逆数和とネピア数との比), format('~6f\n',[_階乗の逆数和とネピア数との比]). '入力した値を n とし'(_n) :- write('整数nを入力してください : '), get_integer(_n). 階乗の逆数の和とネピア数との比(_n,_階乗の逆数和とネピア数との比) :- 階乗の逆数の和(_n,_階乗の逆数の和), _ネピア数 is exp(1), _階乗の逆数和とネピア数との比 is floor((_階乗の逆数の和 / _ネピア数) * 1000000.0 + 0.5) / 1000000.0. 階乗の逆数の和(N,X) :- 階乗保存計算(N,K), 階乗の逆数の和(1,N,K,Y), X is 1 + Y / K. 階乗の逆数の和(M,N,_,1) :- M > N,!. 階乗の逆数の和(M,N,K,X) :- 階乗保存計算(M,U), Y is K // U, M2 is M + 1, 階乗の逆数の和(M2,N,K,Z), X is Y + Z. 階乗保存計算(1,1) :- !. 階乗保存計算(N,X) :- N2 is N - 1, 階乗保存計算(N2,Y), X is N * Y, asserta((階乗保存計算(N,X) :- !)). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1250204272/236 # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): # 任意の数xの例で説明すると(x-1)!+1 がもしxで割り切れるならばxは素数であると # 言え、割り切れないならばxは、素数ではないと言える。 # このような素数を判別することができる定理をウィルソンの定理と呼ぶ。 # # 入力した値の階乗を求めるプログラム(4桁まで対応)を改良して、ウィルソン # の定理による素数判定を実装せよ。 # http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9928.txt # # 素数ならば素数です。素数でないならば素数ではありません。と表示しなさい。 ウィルソンの定理による素数判定(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://pc12.2ch.net/test/read.cgi/tech/1248012902/443 # 【 課題 】(nの階乗 < 10000)が成り立つ最大の n を求める. # ループは while 文を利用すること. # n の階乗とは, n! := 1×2×3×…×n である.[ヒント]: 10000 を超えるまで # 順に階乗の n を増やし,階乗が 10000 を超えた時点で最後の n を乗算する前の # n を出力する.与えられた課題文をそのまま書きます '階乗の解が10000を越えた時点での最後のN'(N) :- '階乗の解が10000を越えた時点での最後のN'(1,1,N). '階乗の解が10000を越えた時点での最後のN'(N,X,X) :- (N + 1) * X >= 10000,!. '階乗の解が10000を越えた時点での最後のN'(N,Y,X) :- N2 is N + 1, Z is Y * N, '階乗の解が10000を越えた時点での最後のN'(N2,Z,X). % 以下のサイトは 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://pc12.2ch.net/test/read.cgi/tech/1263824755/245 # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): # キーボードから正の整数nを入力し、n!を計算して画面表示するプログラムを # 作成せよ。ただし、階乗を計算する関数のプロトタイプを「void kaiyo(int , int *)」 # とし、第1引数にnを、第2引数に計算結果を格納する変数のポインタを指定すること。 # kaijo(0,1) :- !. kaijo(N,X) :- N1 is N - 1, kaijo(N1,Y), X is N * Y. % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1269438098/411 # # [2] 問題文(含コード&リンク): #   簡単なんですけど、C言語苦手でお願いします。 #    #   すべて関数の部分だけで大丈夫です。 #   3つの実数の掛け算をもとめよ。 #   整数nの階乗n!をもとめよ。 #   配列・実数・data[]の平均値を求めよ。 #   2つの実数 aとbの内容を入れ替えよ。 # 3つの実数の掛け算をもとめよ(_実数1,_実数2,_実数3,_実数解) :- _実数解 is _実数1 * _実数2 * _実数3. '整数nの階乗n!をもとめよ'(0,1). '整数nの階乗n!をもとめよ'(1,1). '整数nの階乗n!をもとめよ'(_整数n,_n!) :- _整数nより1小さい数 is _整数n - 1, '整数nの階乗n!をもとめよ。 '(_整数nより1小さい数,_(n−1)!), _n! is _(n−1)! * _整数n. '配列・実数・data[]の平均値を求めよ'(_実数のならび,_平均値) :- 相加平均(_実数のならび,_平均値). '2つの実数 aとbの内容を入れ替えよ'(_a,_b,_b,_a). '2つの実数 aとbの内容を入れ替えよ'(a,b) :- retract(a(_a)), retract(b(_b)), assertz(a(_b)), assertz(b(_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.0e+00,M). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1269438098/641 # このスレの住民の方には楽勝かもしれませんがお願いします # # 場合の数を計算するときに、いわゆる「nCr」というものを使うことがある。これは、順番を特に決めない場合、n個のものからr個のものを取り出す場合をいい、 # 7C5 = 7! / (7-5)!5! # である。nCrであれば # nCr = n! / (n-r)!r! (但し、0≦r≦n) # # この数を計算したい。 # 1. nとrを入力させる。 # 2. n!を計算させる # 3. (n-r)!を計算させる # 4. r!を計算させる # 5. (2)/(3)/(4)を計算する # # しかしn!と(n-r)!がかなりの部分まで重複することを利用すれば、かなり計算の手間を省くことができる # 1から5の手順まで守ったプログラムと手間を省いたプログラムをそれぞれ作成しなさい # nCr(N,R,X) :- 階乗(N,U1), V is N - R, 階乗(V,U2), 階乗(R,U3), X is U1 // U2 // U3. %%%%%%%%%%%%%%%%%%%%%%%%%%% nCr(N,R,X) :- U is N - R + 1, 階乗(U,N,K1), 階乗(R,K2), X is K1 // K2 . %%%%%%%%%%%%%%%%%%%%%%%%%%%% 階乗(M,N,1) :- M > N,!. 階乗(M,N,X) :- M2 is M + 1, 階乗(M2,N,Y), X is M * Y. 階乗(0,1) :- !. 階乗(1,1) :- !. 階乗(N,X) :- N2 is N - 1, 階乗(N2,Y), X is N * Y, asserta((階乗(N,X) :- (!))). nCr :- 催促付き整数入力('n : ',N), 催促付き整数入力('r : ',R), nCr(N,R,X), write_formatted('nCr = %tC%t = %t\n',[N,R,X]). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1260532772/206 # [1] 授業単元: プログラミング1 # [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10285.txt # # 発展課題2 # 任意の整数Xを入力すると、整数Xの階乗を算出されるプログラムを作成せよ。 # ただし、0および負の整数を入力すると、「値が不適当です。」とメッセージが出るようにする。 # 階乗はn!=1×2×3・・・×nで表される。実行結果の例を以下に示す。 # ------------------------------------------------ # 整数を入力して下さい:5 # 5の階乗は120です。 # ------------------------------------------------ # ヒント:if文の中にfor文やwhile文を入れ込むこともできます。 '任意の整数Xを入力すると、整数Xの階乗を算出される'(_階乗の答え) :- ゼロ以外の正の整数を得る(X), 階乗(X,_階乗の答え),!. 階乗(0,1) :- !. 階乗(1,1) :- !. 階乗(N,X) :- N2 is N - 1, 階乗(N2,Y), X is N * Y,!. ゼロ以外の正の整数を得る(N) :- write('正の整数を入力してください : '), get_integer(N), N > 0,!. ゼロ以外の正の整数を得る(N) :- write('値が不適切です\n'), ゼロ以外の正の整数を得る(N). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1279286575/56 # n 個のものの中から r 個のものを取り出すときの組合せの数 nCr を求める関数 CCO(int n, int r) を再帰型で作成しなさい. # ただし, x, y の入力と結果の出力は main関数で行わせること. # # #include <stdio.h> # # int CCO(int x,int y) # { # if((x < 0) || (x < y)){ # return -1; # }else if(x <= 1){ # return 1; # }else{ # (return x * CCO(x-1))/(return y * CCO(y-1)); # } # } # int main(void) # { # int a,b; # # printf("値を入力してください: "); # scanf("%d", &a); # # printf("値を入力してください: "); # scanf("%d", &b); # # printf("%dC%d = %d\n", input1,input2, CCO(a,b)); # return 0; # } # # nCr :- 催促付き整数入力('n : ',N), 催促付き整数入力('r : ',R), nCr(N,R,X), write_formatted('nCr = %tC%t = %t\n',[N,R,X]). %%%%%%%%%%%%%%%%%%%%%%%%%%% nCr(N,R,X) :- U is N - R + 1, 階乗(U,N,K1), 階乗(R,K2), X is K1 // K2 . %%%%%%%%%%%%%%%%%%%%%%%%%%%% 階乗(M,N,1) :- M > N,!. 階乗(M,N,X) :- M2 is M + 1, 階乗(M2,N,Y), X is M * Y. 階乗(0,1) :- !. 階乗(1,1) :- !. 階乗(N,X) :- N2 is N - 1, 階乗(N2,Y), X is N * Y, asserta((階乗(N,X) :- (!))). % 以下のサイトは 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://hibari.2ch.net/test/read.cgi/tech/1286978599/487 # [1] 授業単元:C++入門 # [2] 問題文(含コード&リンク):e^x(自然対数)をテイラー展開したとき、x=1で計算した場合の # 自然対数の値の近似値を求めなさい。なお、計算処理は第4項までとする。 # 'e^x(自然対数)をテイラー展開したとき、x=1で計算した場合の自然対数の値の近似値を求めなさい。なお、計算処理は第4項までとする。 ' :- 'x=1で計算した場合の自然対数の値の近似値を求める'(1,4,1,_自然対数の値の近似値), write_formatted('第四項までの近似値は %t です\n',[_自然対数の値の近似値]). 'x=1で計算した場合の自然対数の値の近似値を求める'(M,N,S,S) :- M > N,!. 'x=1で計算した場合の自然対数の値の近似値を求める'(M,N,S1,S) :- 階乗(M,Mの階乗), S2 is S1 + 1 / Mの階乗, M2 is M + 1, 'x=1で計算した場合の自然対数の値の近似値を求める'(M2,N,S2,S). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1286978599/593 # [1] 授業単元:プログラム実習 # [2] 問題文(含コード&リンク):nとrを入力して # 順列 nPr と組み合わせ nCr を表示するものを作成すること。 # 'nとrを入力して 順列 nPr と組み合わせ nCr を表示する' :- nとrを入力して(_n,_r), '順列 nPr と組み合わせ nCr を表示する'(_n,_r). nとrを入力して(_n,_r) :- nの入力(_n), rの入力(_r),!. nの入力(_n) :- write(n : ), 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が得られませんでした\n再入力をお願いします\n',[Line]), fail. rの入力(_r) :- write(r : ), get_lire(Line), rの入力診断(Line,_r),!. rの入力(_r) :- rの入力(_r). rの入力診断(Line,_r) :- atom_to_term(Line,_r,_), irteger(_r), _r > 0,!. rの入力診断(Line,_r) :- write_formatted('入力された %t からは適切な整数rが得られませんでした\r再入力をお願いします\r',[Line]), fail. '順列 nPr と組み合わせ nCr を表示する'(_n,_r) :- nPr(_n,_r,X), nCr(_n,_r,Y), write_formatted('n=%t,r=%tの時の nPr=%t\nn=%t,r=%tの時の nCr=%t\n',[_n,_r,X,_n,_r,Y]). nPr(N,R,X) :- M is N - R + 1, 階乗(M,N,X). nCr(N,R,X) :- U is N - R + 1, 階乗(U,N,K1), 階乗(R,K2), X is K1 // K2. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1286978599/670 # [1] 授業単元:プログラミング実習 # [2] 問題文(含コード&リンク):nとrを入力して # 組み合わせの数nCrを求めるプログラムを作成せよ。 # nCr(N,R,X) :- 階乗(N,U1), V is N - R, 階乗(V,U2), 階乗(R,U3), X is U1 // U2 // U3. 階乗(M,N,1) :- M > N,!. 階乗(M,N,X) :- M2 is M + 1, 階乗(M2,N,Y), X is M * Y. 階乗(0,1) :- !. 階乗(1,1) :- !. 階乗(N,X) :- N2 is N - 1, 階乗(N2,Y), X is N * Y, asserta((階乗(N,X) :- (!))). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1286978599/851 # mCnを求めるプログラミングを教えて下さい。 # # ちなみにm=6n=3です。 # # 関数部分でc = factorial(n)/factorial(n-r)/factorial(r)を使ってください。 # mCr(M,R,_mCr) :- 階乗(M,X1), M1 is M - R, 階乗(M1,X2), 階乗(R,X3), _mCr is truncate(X1 / X2 / X3). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1288531658/243 # [1] 授業単元:プログラミング演習(テーマ:関数の使い方とデータの受け渡し方) # [2] 問題文(含コード&リンク):関数の再帰呼び出しを用いて、 # 入力した数値の階乗を求めるプログラムを作成せよ。 # また、再帰呼び出しをしない場合のプログラムも作成せよ。 # 関数の再帰呼び出しを用いて、入力した数値の階乗を求める(_入力した数値,_階乗) :- 関数の再帰呼び出しを用いて、入力した数値の階乗を求める(_入力した数値,_階乗). 関数の再帰呼び出しを用いて、入力した数値の階乗を求める(1,1). 関数の再帰呼び出しを用いて、入力した数値の階乗を求める(N,_階乗) :- N_1 is N - 1, 関数の再帰呼び出しを用いて、入力した数値の階乗を求める(N_1,_階乗_1), _階乗 is N * _階乗_1. /* 入力した数値(_入力した数値) :- write('正の整数を入力してください : '), get_line(Line), キーボードからの入力診断(Line,_入力した数値),!. 入力した数値(_正の整数) :- 入力した数値(_入力した数値). 入力した数値診断(Line,_入力した数値) :- atom_to_term(Line,_入力した数値,_), integer(_入力した数値), _入力した数値 > 0,!. 入力した数値診断(Line,_) :- write_formatted('入力された %t からは正の整数が得られませんでした。再入力をお願いします。\n',[Line]), fail. */ % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1288531658/572 # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): #   5個の果物から3個取り出してかごに入れるときの入れ方は何通りあるか。 #   この組み合わせを計算するプログラムを作成せよ。 # '5個の果物から3個取り出してかごに入れるときの入れ方は何通りあるか。'(_何通り) :- nCr(5,3,_何通り). nCr(N,R,X) :- /* abolish(階乗/2),'assertz_階乗_2', */ U is N - R + 1, 階乗(U,N,K1), 階乗(R,K2), X is K1 // K2. 階乗(M,N,1) :- M > N, !. 階乗(M,N,X) :- M2 is M + 1, 階乗(M2,N,Y), X is M * Y . 階乗(0,1) :- !. 階乗(1,1) :- !. 階乗(N,X) :- N2 is N - 1, 階乗(N2,Y), X is N * Y, asserta((階乗(N,X) :- (!))). 'assertz_階乗/2' :- assertz((階乗(0,1) :- !)), assertz((階乗(1,1) :- !)), assertz((階乗(N,X) :- N2 is N - 1,階乗(N2,Y),X is N * Y,asserta((階乗(N,X) :- (!))))). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1288531658/781 # こんにちは。基礎クラスで恐縮ですがよろしくお願いします。 # [1] 授業単元: C基礎 # [2] 問題文(含コード&リンク): # 問題2 キーボードから正の整数を1つ入力しその数が素数であるかを判定するプログラムを # for文 break文などを用いて作成せよ # % http://nojiriko.asia/prolog/c140_625.html キーボードから正の整数を1つ入力しその数が素数であるかを判定する :- キーボードから正の整数を1つ入力し(_正の整数), ウィルソンの定理による素数判定(_正の整数,_診断), write_formatted('%t\n',[_診断]). 正の整数を1つ入力し(_正の整数) :- get_line(Line), 正の整数の入力診断(Line,_正の整数),!. 正の整数を1つ入力し(_正の整数) :- 正の整数を1つ入力し(_正の整数). 正の整数の入力診断(Line,_正の整数) :- atom_to_term(Line,_正の整数,_), integer(_正の整数), _正の整数 >= 0,!. 正の整数の入力診断(Line,_正の整数) :- write_formatted('入力された %t から正の整数はえられませんでした。再入力をお願いします。\n',[Line]), fail. ウィルソンの定理による素数判定(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://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. % 以下のサイトは # 配列分からないので助けてください! # [1] 授業単元:Cプログラミング(配列) # [2] 問題文(含コード&リンク): http://www.dotup.org/uploda/www.dotup.org1291228.txt # [3] 環境 #  [3.1] Linux #  [3.2] gcc #  [3.3] 言語: C # 問題5:実数xの値をキーボードから入力し数列an=1/n! (n=0...9)を係数に持つ多項式 # f(x)=a0+a1x+・・・+a8x^8+a9x^9の値を計算して表示するプログラム。forループを使うこと # 配列分からないので助けてください! '実数xの値をキーボードから入力し数列an=1/n! (n=0...9)を係数に持つ多項式f(x)=a0+a1x+・・・+a8x^8+a9x^9の値を計算して表示する' :- '実数xの値をキーボードから入力し'(_実数x), '数列an=1/n! (n=0...9)を係数に持つ多項式f(x)=a0+a1x+・・・+a8x^8+a9x^9の値を'(_実数x,_多項式の項表示ならび,_多項式の値), 表示する(_実数x,_多項式の項表示ならび,_多項式の値). '実数xの値をキーボードから入力し'(_実数x) :- 催促付き実数入力('実数値を入力してください : ',_実数x),!. '数列an=1/n! (n=0...9)を係数に持つ多項式f(x)=a0+a1x+・・・+a8x^8+a9x^9の値を'(_実数x,_多項式の項表示ならび,_多項式の値) :- '数列an=1/n! (n=0...9)を係数に持つ'(_係数ならび), '多項式f(x)=a0+a1x+・・・+a8x^8+a9x^9の値を'(0,_係数ならび,_実数x,_多項式の項表示ならび,0.0,_多項式の値). '数列an=1/n! (n=0...9)を係数に持つ'(_係数ならび) :- findall(1/U,( for(0,N,9), 階乗(N,U)), _係数ならび). '多項式f(x)=a0+a1x+・・・+a8x^8+a9x^9の値を'(_,[],_,[],_多項式の値,_多項式の値) :- !. '多項式f(x)=a0+a1x+・・・+a8x^8+a9x^9の値を'(N,[_係数|R],[_項表示|R2],_実数x,S1,_多項式の値) :- S2 is S1 + _係数 * (_実数X ^ N), write_formatted_atom(_項表示,'%t*x^%1d',[_係数,N]), N_1 is N - 1, '多項式f(x)=a0+a1x+・・・+a8x^8+a9x^9の値を'(N_1,R,_実数x,R2,S2,_多項式の値). 催促付き実数入力(_催促文,_実数) :- write(_催促文), get_line(Line), 催促付き実数入力診断(Line,_実数),!. 催促付き実数入力(_催促文,_実数) :- 催促付き実数入力(_催促文,_実数). 催促付き実数入力診断(Line,_実数) :- atom_to_term(Line,_実数,_), float(_実数),!. 催促付き実数入力診断(Line,_実数) :- write_formatted('入力された %t から実数値は得られませんでした。再入力をお願いします。\n',[Line]), fail. 表示する(_実数x,_多項式の項表示ならび,_多項式の値) :- concat_atom(_多項式の項表示ならび,'+',_多項式表示), write_formatted('f(x)=%t に於いて、 x=%t\n',[_多項式表示,_実数x]), write_formatted('f(%t)=%t\n',[_実数x,_多項式の値]). 催促付き実数入力(_催促文,_実数) :- write(_催促文), get_line(Line), 催促付き実数入力診断(Line,_実数),!. 催促付き実数入力(_催促文,_実数) :- 催促付き実数入力(_催促文,_実数). 催促付き実数入力診断(Line,_実数) :- atom_to_term(Line,_実数,_), float(_実数),!. 催促付き実数入力診断(Line,_実数) :- write_formatted('入力された %t から実数値は得られませんでした。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは 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/1305867431/555 # 内容: # [1] 授業単元:C # [2] 問題文(含コード&リンク): # 正の整数を入力したとき、その数値が素数であれば「素数です」、素数でないなら「素数ではありません」と表示するプログラムを作成しなさい # 入力した値が0または負の整数であれば、繰り返し再入力させるようにプログラムを作成すること # '正の整数を入力したとき、その数値が素数であれば「素数です」、素数でないなら「素数ではありません」と表示する' :- '正の整数を入力する'(_1以上の正の整数), その数値が素数であれば「素数です」、素数でないなら「素数ではありません」と(_1以上の正の整数,_診断), 表示する(_診断). 正の整数を入力する(_1以上の正の整数) :- write('1以上の正の整数を入力してください : '), get_line(Line), 正の整数入力診断(Line,_1以上の正の整数),!. 正の整数を入力する(_1以上の正の整数) :- 正の整数を入力する(_1以上の正の整数). 正の整数入力診断(Line,_1以上の正の整数) :- atom_to_term(Line,_1以上の正の整数,_), integer(_1以上の正の整数), _1以上の正の整数 >= 1,!. 正の整数入力診断(Line,_1以上の正の整数) :- writef('入力された %t からは1以上の正の整数が得られません。再入力をお願いします。\n',[Line]), fail. その数値が素数であれば「素数です」、素数でないなら「素数ではありません」と(_その数値,_診断) :- _その数値 > 0, Y is _その数値 - 1, 階乗(Y,Z), 0 is (Z + 1) mod _その数値,!. その数値が素数であれば「素数です」、素数でないなら「素数ではありません」と(_その数値,素数ではありません) :- _その数値 > 0, Y is _その数値 - 1, 階乗(Y,Z), \+(0 is (Z + 1) mod _その数値),!. 階乗(M,N,1) :- M > N, !. 階乗(M,N,X) :- M2 is M + 1, 階乗(M2,N,Y), X is M * Y. 階乗(0,1) :- !. 階乗(1,1) :- !. 階乗(N,X) :- N2 is N - 1, 階乗(N2,Y), X is N * Y,!. 表示する(_診断) :- writef('%t\n',[_診断]). % 以下のサイトは # # 分割数 # n個の互いに区別できない品物を、m個以下に分割する方法の総和を求め、 # Mで割ったあまりを答えなさい。 # n個の互いに区別できない品物を、m個以下に分割する方法の総和を求め、Mで割ったあまりを答えなさい。(_n,_m,_分割数,_Mで割ったあまり) :- 分割数(_n,_m,_分割数,_Mで割ったあまり). 分割数(_n,_m,_分割数,_Mで割ったあまり) :- nCr(_n,_m,_総和), _Mで割ったあまり is _総和 mod _m. nCr(N,R,X) :- U is N - R + 1, 階乗(U,N,K1), 階乗(R,K2), X is K1 // K2. 階乗(M,N,1) :- M > N,!. 階乗(M,N,X) :- M2 is M + 1, 階乗(M2,N,Y), X is M * Y. 階乗(0,1) :- !. 階乗(1,1) :- !. 階乗(N,X) :- N2 is N - 1, 階乗(N2,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未満の素数ならび'(_素数ならび) :- '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/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/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未満の素数ならび'(Counter,_素数ならび) :- '1000未満の素数ならび'(0,Counter,5,[2,3],_素数ならび). '1000未満の素数ならび'(Counter,Counter,1000,_素数ならび,_素数ならび) :- !. '1000未満の素数ならび'(Counter1,Counter,N,L1,_素数ならび) :- 奇数(Counter1,Counter2,N), 既に計算済みの素数では割り切れない(Counter2,Counter3,N,L1), L1 = [M|_], ウィルソンの定理による素数判定(Counter3,Counter4,N,素数です), N2 is N + 1, append(L1,[N],L2), '1000未満の素数ならび'(Counter4,Counter,N2,L2,_素数ならび). '1000未満の素数ならび'(Counter1,Counter,N,L1,_素数ならび) :- N2 is N + 1, '1000未満の素数ならび'(Counter1,Counter,N2,L1,_素数ならび). 既に計算済みの素数では割り切れない(Counter,Counter,N,[]) :- !. 既に計算済みの素数では割り切れない(Counter1,Counter2,N,[M|R]) :- 0 is N mod M,!, fail. 既に計算済みの素数では割り切れない(Counter1,Counter,N,[M|R]) :- Counter2 is Counter1 + 1, 既に計算済みの素数では割り切れない(Counter2,Counter,N,R). ウィルソンの定理による素数判定(Counter1,Counter2,X,素数です) :- X > 0, Y is X - 1, 階乗保存計算(Y,Z), Counter2 is Counter1 + 1, 0 is (Z + 1) mod X,!. ウィルソンの定理による素数判定(Counter1,Counter2,X,素数ではありません) :- X > 0, Y is X - 1, 階乗保存計算(Y,Z), Counter2 is Counter1 + 2, \+(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) :- !)). 奇数(Counter1,Counter2,N) :- Counter2 is Counter1 + 1, 1 is N mod 2. % 以下のサイトは 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). 表示されている1の個数を表示する :- '1000未満の素数ならび'(_素数ならび), concat_atom(_素数ならび,' ',_素数ならび表示), writef('%t\n',[_素数ならび表示]), 表示されている1の個数を表示する(_素数ならび). 表示されている1の個数を表示する(_素数ならび) :- 表示されている1の個数を表示する(_素数ならび,_1の個数), writef('数字列に含まれる1の個数は %t 個です。\n',[_1の個数]). 表示されている1の個数を表示する([],0) :- !. 表示されている1の個数を表示する([N|R],_個数) :- number_chars(N,Chars), count(member('1',Chars),_個数1), 表示されている1の個数を表示する(R,_個数2) _個数 is _個数1 + _個数2,!. '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/1308749241/703 # [1] 授業単元:C # [2] 問題文(含コード&リンク): # 自然数を入力すると、その階乗を表示するようなプログラムを作成せよ。 # ただし、演算結果が1000桁以下になる場合のみ対応し、 # 演算結果が1000桁を超える場合はその旨を表示して終了すること。 # '自然数を入力すると、その階乗を表示する' :- 自然数を入力すると(_自然数), その階乗を表示する(_自然数). 自然数を入力すると(_自然数) :- write('自然数を入力してください : '), readln([_自然数]), integer(_自然数), _自然数 > 0,!. 自然数を入力すると(_自然数) :- 自然数を入力すると(_自然数). その階乗を表示する(_自然数) :- その階乗を(1,_自然数,1,_階乗), 表示する(_階乗),!. その階乗を表示する. その階乗を(N,_自然数,_階乗,_階乗) :- N > _自然数,!. その階乗を(N,_自然数,_階乗1,_階乗) :- _階乗2 is N * _階乗1, 演算結果が1000桁以下になる場合のみ(_階乗2), N2 is N + 1, その階乗を(N2,_自然数,_階乗2,_階乗),!. その階乗を(N,_自然数,_階乗1,_) :- _階乗2 is N * _階乗1, '演算結果が1000桁を超える場合はその旨を表示して終了する'(_自然数,_階乗2),!,fail. 表示する(N) :- writef('%t\n',[N]). '演算結果が1000桁以下になる場合のみ'(_階乗1) :- number_chars(_階乗1,L), length(L,Len), Len =< 1000,!. '演算結果が1000桁を超える場合はその旨を表示して終了する'(_自然数,_階乗2) :- number_chars(_階乗2,L), length(L,Len), Len > 1000, writef('%t数の階乗計算に於いて1000桁を超えてしまいました。プログラムを終了します。\n',[_自然数]). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1311089619/70 # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク): # 1〜N(N >= 1)までの、1ずつ増加する等差数列が与えられる、この時のNの階乗通り存在する組み合わせをすべて表示せよ # 例) # Nの値: 3 # 1 2 3 # 1 3 2 # 2 1 3 # 2 3 1 # 3 1 2 # 3 2 1 # なお、例のような表示順序で無くても良い、すべて表示されているならその表示順序は問わない。 # '1〜N(N >= 1)までの、1ずつ増加する等差数列が与えられる、この時のNの階乗通り存在する組み合わせをすべて表示する'(N) :- '1〜N(N >= 1)までの、1ずつ増加する等差数列が与えられる'(N,L), 'この時のNの階乗通り存在する組み合わせをすべて'(L,N,_順列ならび), 表示する(_順列ならび). '1〜N(N >= 1)までの、1ずつ増加する等差数列が与えられる'(N,L) :- findall(M,for(1,M,N),L). 'この時のNの階乗通り存在する組み合わせをすべて'(L,N,_順列ならび) :- findall(_順列,( 順列(L,N,_順列)), _順列ならび). 表示する(_順列ならび) :- append(_,[_順列|R],_順列ならび), concat_atom(_順列,' ',_行表示), writef('%t\n',[_行表示]), R = []. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1311089619/658 # 助けてください。5つあります。 # 明日提出期限です。 # # 入力した数の階乗を計算するプログラムを作れ。 # nの階乗とは、n!と書いて、次のような計算をするものである。 # n! = n × (n – 1) × (n – 2) × … × 2 × 1 # # ヒント)関数 fact(n)を n!を計算するプログラムとする。 # この時、 # n! = n × (n – 1)! # だから、fact(n) を計算するには、fact(n-1)を計算してから、nをかければ良い。 # # 階乗(0,1) :- !. 階乗(1,1) :- !. 階乗(N,X) :- N2 is N - 1, 階乗(N2,Y), X is N * Y. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1311089619/658 # 助けてください。5つあります。 # 明日提出期限です。 # # 入力した数の階乗を計算するプログラムを作れ。 # nの階乗とは、n!と書いて、次のような計算をするものである。 # n! = n × (n – 1) × (n – 2) × … × 2 × 1 # # ヒント)関数 fact(n)を n!を計算するプログラムとする。 # この時、 # n! = n × (n – 1)! # だから、fact(n) を計算するには、fact(n-1)を計算してから、nをかければ良い。 # # 階乗(0,1) :- !. 階乗(1,1) :- !. 階乗(N,X) :- N2 is N - 1, 階乗(N2,Y), X is N * Y. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1311089619/658 # 助けてください。5つあります。 # 明日提出期限です。 # # 入力した数の階乗を計算するプログラムを作れ。 # nの階乗とは、n!と書いて、次のような計算をするものである。 # n! = n × (n – 1) × (n – 2) × … × 2 × 1 # # ヒント)関数 fact(n)を n!を計算するプログラムとする。 # この時、 # n! = n × (n – 1)! # だから、fact(n) を計算するには、fact(n-1)を計算してから、nをかければ良い。 # 'n!'(_n,_階乗) :- 階乗式評価項文字列の生成(N,_階乗式評価項文字列), atom_to_term(_階乗式評価項文字列,P,VL), '文字列の中の変数と_論理変数を結びつける'('_n',VL,_n), '文字列の中の変数と_論理変数を結びつける'('_階乗',VL,_階乗), call(P). 階乗式評価項文字列の生成(_n,_階乗式評価項文字列) :- 階乗式文字列の生成(_n,_階乗式文字列), swritef(_階乗式評価項文字列,'_階乗 is %t,[_階乗式文字列]). 階乗式文字列の生成(_n,_階乗式文字列) :- _n_3 is _n - 3, findall(S,( for(0,M,_n_3), concat_atom(['(','_n',' - ',M,')'],S)), L), append(L,['2','1'],L1), concat_atom(L1,' * ',_階乗式文字列),!. '文字列の中の変数と_論理変数を結びつける'(_変数文字列,[_変数文字列=V],V) :- !. '文字列の中の変数と_論理変数を結びつける'(_変数文字列,[_|R],V) :- '文字列の中の変数と_論理変数を結びつける'(_変数文字列,R,V). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1320365280/137 # [1] 授業単元:基礎プロ # [2] 問題文(含コード&リンク): # キーボードから自然数 n を読み込む. # 読み込んだ自然数 n の階乗を計算する. # 計算結果を以下の実行例のように出力する. # # 実行例 # >./extra06-1 # 自然数を入力: 5 # 5! = 1 x 2 x 3 x 4 x 5 = 120 # >./extra06-1 # 自然数を入力: 6 # 6! = 1 x 2 x 3 x 4 x 5 x 6 = 720 # > # # この動作をするプログラムを作成せよ # 'キーボードから自然数 n を読み込む.読み込んだ自然数 n の階乗を計算する.計算結果を以下の実行例のように出力する.' 'キーボードから自然数 n を読み込む'(_n), '読み込んだ自然数 n の階乗を計算する.'(_n,_階乗式の文字列表現,_nの階乗), '計算結果を以下の実行例のように出力する.'(_n,_階乗式の文字列表現,_nの階乗). 'キーボードから自然数 n を読み込む'(_n) :- 自然数を読み込む(_n). '読み込んだ自然数 n の階乗を計算する.'(_n,_1からnまでの数ならび,_nの階乗) :- findall(N,for(1,N,_n),_1からnまでの数ならび), concat_atom(_1からnまでの数ならび,'*',_階乗式の文字列表現), atom_to_term(_階乗式の文字列表現,_式,_), _nの階乗 is _式. '計算結果を以下の実行例のように出力する.'(_n,_1からnまでの数ならび,_nの階乗) :- concat_atom(_1からnまでのならび,' × ',_階乗式の表示用文字列), writef('%t! = %t = %t\n',[_n,_階乗式の表示用文字列,_nの階乗]). 自然数を読み込む(_自然数) :- write('自然数を入力 : '), get_line(Line), 自然数を読み込み診断(Line,_自然数),!. 自然数を読み込む(_自然数) :- 自然数を読み込む(_自然数). 自然数を読み込み診断(Line,_自然数) :- atom_to_term(Line,_自然数,_), integer(_自然数), _自然数 >= 0,!. 自然数を読み込み診断(Line,_自然数) :- writef('入力された %t からは自然数が得られません。再入力をお願いします。\n',[Line]), fail. % % 目下の課題は以下の実行例をどのように述語定義の中に取り込むかだ % コメントはそのまま引数ゼロの述語として定義し、副目標として書いて置けばよいが % このような改行のある事例は述語アトムとして見やすいものにならない。 % /* # 実行例 # >./extra06-1 # 自然数を入力: 5 # 5! = 1 x 2 x 3 x 4 x 5 = 120 # >./extra06-1 # 自然数を入力: 6 # 6! = 1 x 2 x 3 x 4 x 5 x 6 = 720 # > */ % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1320365280/137 # [1] 授業単元:基礎プロ # [2] 問題文(含コード&リンク): # キーボードから自然数 n を読み込む. # 読み込んだ自然数 n の階乗を計算する. # 計算結果を以下の実行例のように出力する. # # 実行例 # >./extra06-1 # 自然数を入力: 5 # 5! = 1 x 2 x 3 x 4 x 5 = 120 # >./extra06-1 # 自然数を入力: 6 # 6! = 1 x 2 x 3 x 4 x 5 x 6 = 720 # > # # この動作をするプログラムを作成せよ # 'キーボードから自然数 n を読み込む.読み込んだ自然数 n の階乗を計算する.計算結果を以下の実行例のように出力する.' 'キーボードから自然数 n を読み込む'(_n), '読み込んだ自然数 n の階乗を計算する.'(_n,_階乗式の文字列表現,_nの階乗), '計算結果を以下の実行例のように出力する.'(_n,_階乗式の文字列表現,_nの階乗). 'キーボードから自然数 n を読み込む'(_n) :- 自然数を読み込む(_n). '読み込んだ自然数 n の階乗を計算する.'(_n,_1からnまでの数ならび,_nの階乗) :- findall(N,for(1,N,_n),_1からnまでの数ならび), mult(_1からnまでの数ならび,_nの階乗). /* findmult(_対象項,_実行項,_解) :- findall(_対象項,_実行項,L), mult(L,_解). */ mult([],1). mult([A|R],X) :- mult(R,Y), X is A * Y. '計算結果を以下の実行例のように出力する.'(_n,_1からnまでの数ならび,_nの階乗) :- concat_atom(_1からnまでのならび,' × ',_階乗式の表示用文字列), writef('%t! = %t = %t\n',[_n,_階乗式の表示用文字列,_nの階乗]). 自然数を読み込む(_自然数) :- write('自然数を入力 : '), get_line(Line), 自然数を読み込み診断(Line,_自然数),!. 自然数を読み込む(_自然数) :- 自然数を読み込む(_自然数). 自然数を読み込み診断(Line,_自然数) :- atom_to_term(Line,_自然数,_), integer(_自然数), _自然数 >= 0,!. 自然数を読み込み診断(Line,_自然数) :- writef('入力された %t からは自然数が得られません。再入力をお願いします。\n',[Line]), fail. % % 何故findmult/3を使わなかったか? % % 目下の課題は以下の実行例をどのように述語定義の中に取り込むかだ % コメントはそのまま引数ゼロの述語として定義し、副目標として書いて置けばよいが % このような改行のある事例は述語アトムとして見やすいものにならない。 % /* # 実行例 # >./extra06-1 # 自然数を入力: 5 # 5! = 1 x 2 x 3 x 4 x 5 = 120 # >./extra06-1 # 自然数を入力: 6 # 6! = 1 x 2 x 3 x 4 x 5 x 6 = 720 # > */ % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1320365280/414 # [1] 授業単元: アルゴリズム # [2] 問題文(含コード&リンク): # 整数nを入力、2以上nイカの全ての素数およびその素数の累積を表示(while文を使用) # 例) n=15の時: # 素数:2,3,5,7,11,13 累積:41 # :- dynamic(階乗保存計算/2). '2以上n以下の素数ならび'(_n,_素数ならび,_累計) :- '2以上n以下の素数ならび'(2,_n,[2],_素数ならび,2,_累計), '2以上n以下の素数ならび'(N,_n,_素数ならび,_素数ならび,S,S) :- N > _n,!. '2以上n以下の素数ならび'(N,_n,L1,_素数ならび,S1,S) :- 奇数(N), 既に計算済みの素数では割り切れない(N,L1), ウィルソンの定理による素数判定(N,素数です), N2 is N + 1, append(L1,[N],L2), S2 is S1 + N, '2以上n以下の素数ならび'(N2,_n,L2,_素数ならび,S2,S),!. '2以上n以下の素数ならび'(N,L1,_素数ならび,S1,S) :- N2 is N + 1, '2以上n以下の素数ならび'(N2,_n,L1,_素数ならび,S1,S). 既に計算済みの素数では割り切れない(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://toro.2ch.net/test/read.cgi/tech/1335517816/49 # [1] 授業単元 情報工学 # [2] 問題文 # n枚のカードからr枚のカードを選ぶ組み合わせを計算するプログラムを作成せよ。 # 但し、n≧1  r≧1  n≧rを前提してよい。(入力エラーの処理は不要) # 'n枚のカードからr枚のカードを選ぶ組み合わせを計算する'(_n,_r,_n枚のカードからr枚のカードを選ぶ組み合わせ) :- findall(N,between(1,_n,N),L), count(組合せ(L,_r,_),_n枚のカードからr枚のカードを選ぶ組み合わせ). 組合せ(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). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% nCr(_n,_r,_組合せ数) :- _z is _n - _r + 1, 階乗(_n,_z,_組合せ数). 階乗(_r,_r,_r). 階乗(_n,_r,_組合せ数) :- _n_1 is _n - 1, 階乗(_n_1,_r,_組合せ数_1), _組合せ数 is _組合せ数_1 * _n. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1335517816/190 # [1] 授業単元:プログラミング # [2] 問題文: # 1つの整数n(但しn>=1)を入力するとn!を返すseki関数を作成する。 # そしてn枚のカードからr枚のカードを選ぶ組み合わせを計算するプログラムを作成しなさい。 # 但し、n≧1、r≧1、n≧rを前提とする。 # :- dynamic('1つの整数n(但しn>=1)を入力するとn!を返す'/2). '1つの整数n(但しn>=1)を入力するとn!を返す'(1,1) :- !. '1つの整数n(但しn>=1)を入力するとn!を返す'(_n,X) :- _n_1 is _n - 1, '1つの整数n(但しn>=1)を入力するとn!を返す'(_n_1,X_1), X is _n * X_1, asserta(('1つの整数n(但しn>=1)を入力するとn!を返す'(_n,X) :- !)),!. 'そしてn枚のカードからr枚のカードを選ぶ組み合わせを計算する'(_n,_r,_組み合わせ数) :- '1つの整数n(但しn>=1)を入力するとn!を返す'(_n,_nの階乗), '1つの整数n(但しn>=1)を入力するとn!を返す'(_r,_rの階乗), Y is _nの階乗 // _rの階乗, _組み合わせ数 is Y // _rの階乗. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1335517816/755 # 【質問テンプレ】 # [1] 授業単元:c言語 # [2] 問題文(含コード&リンク):http://ime.nu/uproda.2ch-library.com/533330Hsq/lib533330.png # '実数を入力してsin(x)の近似値を無限級数展開を利用して求める'(_sin_x_の近似値) :- '実数を入力して'(_実数), 'sin(x)の近似値を無限級数展開を利用して求める'(1,_実数,0.0,_sin_x_の近似値). '実数を入力して'(_実数) :- write('実数を入力しなさい : '), get_line(Line), 実数入力診断(Line,_実数),!. '実数を入力して'(_実数) :- '実数を入力して'(_実数). 実数入力診断(Line,_実数) :- atom_to_term(Line,_実数,_), float(_実数),!. 実数入力診断(Line,_実数) :- writef('入力された %t からは実数が得られません。再入力をお願いします。\n',[Line]), fail. 'sin(x)の近似値を無限級数展開を利用して求める'(_,_v,_sin_x_の近似値,_sin_x_の近似値) :- _v < 1e-10,!. 'sin(x)の近似値を無限級数展開を利用して求める'(_k,_v_1,_x_1,_x) :- _i is (2 * _k - 1), 階乗(_i,_j), 符号の決定(_k,_1またはマイナス1), _v_2 is (_1またはマイナス1 * _v_1 ^ (2 * _k - 1)) / _j, _x_2 is _x_1 + _v_2, _k_2 is _k + 1, 'sin(x)の近似値を無限級数展開を利用して求める'(_k_2,_v_2,_x_2,_x). 符号の決定(_k,-1) :- 1 is (_k + 1) mod 2,!. 符号の決定(_k,1) :- 0 is (_k + 1) mod 2,!. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1339338438/93 # [1] 授業単元: C言語 # [2] 問題文:正の整数m,n(m>n)があるとき、 #       順列mPnを計算するプログラムの作成。 # '正の整数m,n(m>n)があるとき、順列mPnを計算する'(_m,_n,_mPn) :- 階乗(_n,_m,_mPn). 階乗(M,N,1) :- M > N,!. 階乗(M,N,X) :- M2 is M + 1, 階乗(M2,N,Y), X is M * Y. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1339338438/362 # 再帰関数を使わず、nの階乗を求めるプログラムを教えて下さい。 # '再帰関数を使わず、nの階乗を求める'(_n,_nの階乗) :- nの階乗を表す式文字列(_n,_式文字列), 式文字列を解析して式を評価する(_式文字列,_nの階乗). nの階乗を表す式文字列(_n,_式文字列) :- length(L,_n), findall(M,( append(L0,[_|_],L), length([_|L0],M)), L2), atomic_list_concat(L2,'*',_式文字列). 式文字列を解析して式を評価する(_式文字列,_nの階乗) :- atom_to_term(_式文字列,_式,_), _nの階乗 is _式. % length/2 も append/3 も atomic_list_concat/3 も再帰述語ですから % これは解答にはなっていません。 % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1339338438/362 # 再帰関数を使わず、nの階乗を求めるプログラムを教えて下さい。 # :- dynamic(temp/1). '再帰関数を使わず、nの階乗を求める'(_n,_nの階乗) :- abolish(temp/2), asserta(temp(_n,_n)), repeat, retract(temp(A,B)), A_1 is A - 1, _nの階乗 is B * A_1, asserta(temp(A_1,_nの階乗)), A_1 = 1,!. % これも repeat/0 が再帰述語です。 % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1276873238/840 # rubyで入力した自然数nの階乗n!を表示するプログラムが何でか知らんができない # 誰か暇なときでいいんで教えて # # '自然数nの階乗n!を表示する'(_n) :- '自然数nの階乗n!を'(1,_n,1,_自然数nの階乗), 表示する(_n,_自然数nの階乗). '自然数nの階乗n!を'(_n,_n,Y,_自然数nの階乗) :- _自然数nの階乗 is _n * Y. '自然数nの階乗n!を'(_m,_n,Y_1,X) :- _m < _n, Y_2 is _m * Y_1, _m_2 is _m + 1, '自然数nの階乗n!を'(_m_2,_n,Y_2,X). 表示する(_n,_自然数nの階乗) :- writef('自然数%tの階乗は %t です。\n',[_n,_自然数nの階乗]). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1276873238/849 # 問題 # 自然数nの二重階乗を求めよ。 # 例 # 0!! = 1 # 5!! = 15 # 15!! = 2027025 # # '自然数nの二重階乗を求める'(0,1). '自然数nの二重階乗を求める'(1,1). '自然数nの二重階乗を求める'(_m,_x) :- '_m が 1 より大きい時、_m - 2 の二重階乗 _x_2 に _m をかけたものが_m の二重階乗 _x となる'(_m,_x). '_m が 1 より大きい時、_m - 2 の二重階乗 _x_2 に _m をかけたものが_m の二重階乗 _x となる'(_m,_x) :- _m > 1, _m_2 is _m - 2, '自然数nの二重階乗を求める'(_m_2,_x_2), _x is _m * _x_2. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1276873238/849 # 問題 # 自然数nの二重階乗を求めよ。 # 例 # 0!! = 1 # 5!! = 15 # 15!! = 2027025 # # '自然数nの二重階乗は、_m が 1 より大きい時、_m - 2 の二重階乗 X_2 に _m をかけたものが_m の二重階乗 X となる。 _m が 0 か 1 の時は共に 1 となる。'(_m,_x) :- _m > 1, _m_2 is _m - 2, '自然数nの二重階乗を求める'(_m_2,X_2), X is _m * X_2. '自然数nの二重階乗は、_m が 1 より大きい時、_m - 2 の二重階乗 X_2 に _m をかけたものが_m の二重階乗 X となる。 _m が 0 か 1 の時は共に 1 となる。'(0,1). '自然数nの二重階乗は、_m が 1 より大きい時、_m - 2 の二重階乗 X_2 に _m をかけたものが_m の二重階乗 X となる。 _m が 0 か 1 の時は共に 1 となる。'(1,1). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1349527750/649 # [1] 情報処理演習 # [2] ここのNo.384です # http://ime.nu/s2.etowns.slyip.net/~c_cpp_homework/cgi-bin/joyful/joyful.cgi # 9. x を-3.14 以上 3.14 以下の範囲で 0.02 ずつ変化させ, y = cos x 及び y = sin xの値を画面表示するプログラムを作成せよ.ただし, y = cos x 及び y = sin xは,次式に示す多項式 # cos(X) = 1 - x^2/2! + x^4/4! - x^6/6! + x^8/8! - x^10/10! # sin(X) = x - x^3/3! + x^5/5! - x^7/7! + x^9/9! - x^11/11! # により計算すること.また,これらの計算を行う関数のプロトタイプをそれぞれ「double # mycos(double)」,「double mysin(double)」とし,3 で作成した「kaijo()」関数を利用すること. # # 14. 1 以上の整数 n を入力し,n の階乗を計算して画面表示するような void 型の関数 void # factorial(int) を用いて n の階乗を求めるようなプログラムを作成せよ.またこのプログラムと 3 で作成したプログラムを比較せよ. 'x を-3.14 以上 3.14 以下の範囲で 0.02 ずつ変化させ, y = cos x 及び y = sin xの値を画面表示するプログラムを作成せよ.ただし, y = cos x 及び y = sin xは,次式に示す多項式 cos(X) = 1 - x^2/2! + x^4/4! - x^6/6! + x^8/8! - x^10/10! sin(X) = x - x^3/3! + x^5/5! - x^7/7! + x^9/9! - x^11/11! により計算すること' :- between(1,314,N), X is -3.14 + N * 0.02, 'y = cos x 及び y = sin xの値を表示する'(X), N = 314. 'y = cos x 及び y = sin xの値を表示する'(X) :- cos(X,_cosX), sin(X,_sinX), 表示する(X,_cosX,_sinX). cos(X,_cosX) :- findall(U,( for(1,0,5), N_2 is N * 2, 階乗(N_2,N_2_の階乗), U is (((-1) ^ N) * (X ^ 2)) / N_2_の階乗), _cosX). sin(X,_cosX) :- findall(U,( for(1,0,5), N_2 is 1 + N * 2, 階乗(N_2,N_2_の階乗), U is (((-1) ^ N) * (X ^ 2)) / N_2_の階乗), _sinX), 表示する(X,_cosX,_sinX) :- writef('%t: %t, %t\n',[X,_cosX,_sinX]). % 以下のサイトは 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/1357748713/78 # [1] 授業単元:C言語 # [2] 問題 http://ime.nu/codepad.org/yV0KrZox # # # 問題5 # 任意の整数Xを入力し、Xの階乗の結果を表示するプログラムを作成しなさい。ただし、Xの階乗の計算は別関数で行い、入力と結果の表示はmain関数で行うようにすること。 # --------------------------------------------------------------------- # X:5 # 5の階乗は 120です。 # --------------------------------------------------------------------- '任意の整数Xを入力し、Xの階乗の結果を表示するプログラムを作成しなさい。ただし、Xの階乗の計算は別関数で行い、入力と結果の表示はmain関数で行うようにすること。' :- main. main :- '任意の整数Xを入力し、'(_X), 'Xの階乗'(_X,_Xの階乗), の結果を表示する(_X,_Xの階乗). '任意の整数Xを入力し、'(_X) :- 整数を得る('任意の整数X',true,_X). 'Xの階乗'(0,1). 'Xの階乗'(1,1). 'Xの階乗'(_X,_Xの階乗) :- _X_1 is _X - 1, 'Xの階乗'(_X_1,_Xの階乗_1), _Xの階乗 is _Xの階乗_1 * _X. の結果を表示する(_X,_Xの階乗) :- writef('%t の階乗は %t です\n',[_X,_Xの階乗]). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1357748713/345 # [1] 授業単元: #     計算機概論 # [2] 問題文(含コード&amp;リンク): #     キーボードから入力された自然数が素数であるかを調べるプログラムを作りなさい。 #     ただし、0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること。 # 'キーボードから入力された自然数が素数であるかを調べるプログラムを作りなさい。 ただし、0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること。' :- 'キーボードから入力された自然数が(0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること)'(_入力された自然数), 素数であるかを調べる(_入力された自然数). 'キーボードから入力された自然数が(0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること)'(_入力された自然数) :- write('自然数を入力してください : '), get_line(Line), '診断 :: 自然数入力'(Line,_入力された自然数),!. 'キーボードから入力された自然数が(0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること)'(_入力された自然数) :- 'キーボードから入力された自然数が(0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること)'(_入力された自然数). '診断 :: 自然数入力'(Line,_入力された自然数) :- atom_to_term(Line,_入力された自然数,_), integer(_入力された自然数), _入力された自然数 > 0,!. '診断 :: 自然数入力'(Line,_) :- writef('入力された %t から自然数を得ることができません。再入力をお願いします。\n',[Line]), fail. 素数であるかを調べる(1) :- write('プログラムを終了します\n'),!. 素数であるかを調べる(X) :- ウィルソンの定理による素数判定(X), write('素数です\n'),!. 素数であるかを調べる(_) :- write('素数ではありません\n'). ウィルソンの定理による素数判定(X) :- X > 0, Y is X - 1, 階乗(Y,Z), 0 is (Z + 1) mod X. 階乗(_n,X) :- findall(M,between(1,N,M),L), atomic_list_concat(L,*,S), atom_to_term(S,_式,_), X is _式. % 以下のサイトは # 御題 # # 1から100までの数を出力するプログラムを書け。 # ただしフィボナッチ数列に現れる数のときは数の代わりに 'Fib' と、 # 素数のときは 'Prime' と出力し、 # フィボナッチ数列に現れて且つ素数の場合には 'FibPrime' と出力すること。 # また出力先は'fibprime.bz2'というファイル名のbzip2圧縮形式ファイルとする。 '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。' '100以下のフィボナッチ数列を得る'(_100以下のフィボナッチ数ならび), '100以下の素数を得る'(_100以下の素数ならび), between(1,100,_数), 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、素数のときは ''Prime'' と出力し、フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数,_100以下のフィボナッチ数ならび,_100以下の素数ならび,L), 'Nが100になるまで出力する'(N,L). 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、素数のときは ''Prime'' と出力し、フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数,_100以下のフィボナッチ数ならび,_100以下の素数ならび,L) :- 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数,_100以下のフィボナッチ数ならび,L), '素数のときは ''Prime'' と'(_数,_100以下の素数ならび,L), それ以外の場合は数を(_数,L). 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数,_100以下のフィボナッチ数ならび,['Fib',_,_]) :- member(_数,_100以下のフィボナッチ数ならび),!. 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_,_,['',_,_]). '素数のときは ''Prime'' と'(_数,_100以下の素数ならび,[_,'Prime',_]) :- member(_数,_100以下の素数ならび),!. '素数のときは ''Prime'' と'(_,_,[_,'',_]). それ以外の場合は数を(_数,['','',_数]) :- !. それ以外の場合は数を(_,[_,_,'']). '100以下のフィボナッチ数列を得る'(L) :- '100以下のフィボナッチ数列'([1,0],L). '100以下のフィボナッチ数列'([B,A|R],L) :- C is A + B, C =< 100, '100以下のフィボナッチ数列'([C,B,A|R],L),!. '100以下のフィボナッチ数列'(L,L). '100以下の素数を得る'(L) :- findall(N,( between(1,100,N), 素数である(N)), L). 素数である(1) :- !. 素数である(X) :- X > 0, Y is X - 1, 階乗(Y,Z), 0 is (Z + 1) mod X. 階乗(_n,X) :- findall(M,between(1,_n,M),L), atomic_list_concat(L,*,S), atom_to_term(S,_式,_), X is _式. 'Nが100になるまで出力する'(N,L) :- atomic_list_concat(L,_表示文字列), writef('%t ',[_表示文字列]), N = 100. % 以下のサイトは # 御題 # # 1から100までの数を出力するプログラムを書け。 # ただしフィボナッチ数列に現れる数のときは数の代わりに 'Fib' と、 # 素数のときは 'Prime' と出力し、 # フィボナッチ数列に現れて且つ素数の場合には 'FibPrime' と出力すること。 # また出力先は'fibprime.bz2'というファイル名のbzip2圧縮形式ファイルとする。 '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。' :- '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(1,0,1). '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数,_,_) :- _数 > 100,!. '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数_1,_fib_1,_fib_2) :- 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数_1,_fib_1,_fib_2,_fib_1_2,_fib_2_2), _数_2 is _数_1 + 1, '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数_2,_fib_1_2,_fib_2_2). 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数_1,_fib_1,_fib_2,_fib_1_2,_fib_2_2) :- 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数_1,_fib_1,_fib_2,_fib_2_2,_fib_2_2,Fib), '素数のときは ''Prime'' と'(_数,Prime), '出力する'(_数_1,Fib,Prime),!. 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数_1,_fib_1,_fib_2,_fib_2_2,_数_1,'Fib') :- _数_1 is _fib_1 + _fib_2,!. 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数_1,_fib_1,_fib_2,_fib_1,_fib_2,''). '素数のときは ''Prime'' と'(_数,'Prime') :- 素数である(_数),!. '素数のときは ''Prime'' と'(_,''). '出力する'(_数_1,'','') :- write('%t ',[_数_1]),!. '出力する'(_数_1,Fib,Prime) :- write('%t%t ',[Fib,Prime]). % このプログラムの骨組みは %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 素数である(1) :- !. 素数である(X) :- X > 0, Y is X - 1, 階乗(Y,Z), 0 is (Z + 1) mod X. 階乗(_n,X) :- findall(M,between(1,_n,M),L), atomic_list_concat(L,*,S), atom_to_term(S,_式,_), X is _式. % 以下のサイトは :- dynamic(階乗保存計算/2). 'ウィルソンの定理を使って素数を判定する関数is_primeを実装し、100000以下の素数以外をリストに得る'(_10000以下の素数リスト) :- findall(_p,( between(1,10000,_p), is_prime(_p)), _10000以下の素数リスト). is_prime(_p) :- 'ウィルソンの定理とは pが素数 <=> (p-1)!+1 (mod p) == 0'(_p). 'ウィルソンの定理とは pが素数 <=> (p-1)!+1 (mod p) == 0'(_p) :- _p > 0, Y is _p - 1, 階乗保存計算(Y,Z), 0 is (Z + 1) mod _p,!. 階乗保存計算(0,1) :- !. 階乗保存計算(1,1) :- !. 階乗保存計算(N,X) :- N2 is N - 1, 階乗保存計算(N2,Y), X is N * Y, asserta((階乗保存計算(N,X) :- !)). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1357191974/53 # # お題:nの階乗の末尾の連続した0の個数を求める。 # :- dynamic(階乗保存計算/2). 'nの階乗の末尾の連続した0の個数を求める。'(_n,_末尾の連続した0の個数) :- 階乗保存計算(_n,_nの階乗), 末尾の連続した0の個数(_nの階乗,_末尾の連続した0の個数). 階乗保存計算(0,1) :- !. 階乗保存計算(1,1) :- !. 階乗保存計算(N,X) :- N2 is N - 1, 階乗保存計算(N2,Y), X is N * Y, asserta((階乗保存計算(N,X) :- !)). 末尾の連続した0の個数(_nの階乗,_末尾の連続した0の個数) :- atom_chars(_nの階乗,L), append(_,L1,L), all(L1,'0'), length(L1,_末尾の連続した0の個数). all([],_). all([A|R],A) :- all(R,A). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/955 # お題:自然数nの階乗の素因数2の個数を求める。(2014年センター試験) # n=5 -> 3 # n=13 -> 10 # # '自然数nの階乗の素因数2の個数を求める。(2014年センター試験)'(_n,_素因数2の個数) :- 自然数nの階乗の(_n,_自然数nの階乗), 素因数2の個数を求める(0,_自然数nの階乗,_素因数2の個数). 自然数nの階乗の(1,1) :- !. 自然数nの階乗の(_n,_自然数nの階乗) :- _n_1 is _n - 1, 自然数nの階乗の(_n_1,_自然数nの階乗_1), _自然数nの階乗 is _n * _自然数nの階乗_1. 素因数2の個数を求める(N,_素因数2の個数_1,_素因数2の個数) :- 素因数2が存在する(N,_素因数2の個数_1,D,_素因数2の個数_2), 素因数2の個数を求める(D,_素因数2の個数_2,_素因数2の個数). 素因数2の個数を求める(_,_素因数2の個数,_素因数2の個数). 素因数2が存在する(N,_素因数2の個数_1,D,_素因数2の個数_2) :- N > 0, 0 is N mod 2, D is N // 2, _素因数2の個数_2 is _素因数2の個数_1 + 1. % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/955 # お題:自然数nの階乗の素因数2の個数を求める。(2014年センター試験) # n=5 -> 3 # n=13 -> 10 # # '自然数nの階乗の素因数2の個数を求める。(2014年センター試験)'(_自然数n,_自然数nの階乗の素因数2の個数) :- findsum(_ある自然数の素因数2の個数,( between(1,_自然数n,_ある自然数), ある自然数の素因数2の個数を求める(_ある自然数,_ある自然数の素因数2の個数)), _自然数nの階乗の素因数2の個数). ある自然数の素因数2の個数を求める(_ある自然数,_ある自然数の素因数2の個数) :- nth0(_ある自然数の素因数2の個数,_,_), \+(0 is _ある自然数 mod (2 ^ (_ある自然数の素因数2の個数 + 1))),!. findsum(_選択項,_副目標,_合計) :- findall(_選択項,_副目標,_選択項ならび), sumlist(_選択項ならび,_合計). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/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/1390525149/83 # お題:次の式をn=10について計算し、大きい順に式と値を表示する。 # logは自然対数、sqrtは平方根、!は階乗、^は累乗とする。 # 2^n # 2^log(n) # 4^n # n # n^2 # n! # n*log(n) # log(n!) # log(log(n)) # sqrt(log(n)) # # '次の式をn=10について計算し、大きい順に式と値を表示する。 logは自然対数、sqrtは平方根、!は階乗、^は累乗とする。 2^n,2^log(n),4^n,n,n^2,n!,n*log(n),log(n!),log(log(n)),sqrt(log(n))' :- _n = 10, _nの階乗 is 10*9*8*7*6*5*4*3*2*1, findall([X,A],( nth1(_nth1,[2^_n,2^log(_n),4^_n,_n,_n^2,_nの階乗,_n*log(_n),log(_nの階乗),log(log(_n)),sqrt(log(_n))],F), nth1(_nth1,[2^_n,2^log(_n),4^_n,_n,_n^2,'10!',_n*log(_n),log('10!'),log(log(_n)),sqrt(log(_n))],A), X is F), L1), '大きい順に式と値を表示する。'(L1). '大きい順に式と値を表示する。'(L1) :- sort(L1,L2), reverse(L2,L3), forall(member([X,F],L3),writef('%t=%t\n',[F,X])). % 以下のサイトは # 出典::twitter_by_@twinkfrag_20150108 :- dynamic(階乗/2). :- dynamic(multifact/2). 階乗(0,1) :- !. 階乗(N,_階乗) :- N > 0, succ(N_1,N), 階乗(N_1,_階乗_1), _階乗 is _階乗_1 * N, asserta((階乗(N,_階乗) :- ! )). multifact(0,1) :- !. multifact(_n,_multifact) :- succ(_n_1,_n), multifact(_n_1,_multifact_1), 階乗(_n,_nの階乗), _multifact is _multifact_1 * _nの階乗, asserta((multifact(_n,_multifact) :- ! )). % 以下のサイトは # 出典::twitter_by_@twinkfrag_20150108 multifact(0,1) :- !. multifact(_n,_multifact) :- multifact(1,_n,1,1,_multifact). multifact(_n,_nの限界,_,_multifact,_multifact) :- '_nが_nの限界を越えた場合、解は整っている'(_n,_nの限界),!. multifact(_n,_nの限界,_階乗_1,_multifact_1,_multifact) :- 階乗とmultifactを更新して行く(_n,_nの限界,_階乗_1,_multifact_1,_multifact). '_nが_nの限界を越えた場合、解は整っている'(_n,_nの限界) :- _n > _nの限界. 階乗とmultifactを更新して行く(_n,_nの限界,_階乗_1,_multifact_1,_multifact) :- '_nの階乗を決定し、それを使って_nの_multifactを得る'(_n,_階乗_1,_multifact_1,_階乗_2,_multifact_2), succ(_n,_n_2), multifact(_n_2,_nの限界,_階乗_2,_multifact_2,_multifact). '_nの階乗を決定し、それを使って_nの_multifactを得る'(_n,_階乗_1,_multifact_1,_階乗_2,_multifact_2) :- _階乗_2 is _n * _階乗_1, _multifact_2 is _階乗_2 * _multifact_1.