このディレクトリの索引

% 以下のサイトは 等差数列([_],_公差) :- var(_公差),!,fail. 等差数列(_等差数列,_公差) :- 等差数列とは公差確定問題である(_等差数列,_公差). 等差数列とは公差確定問題である([_],_公差). 等差数列とは公差確定問題である([V|_等差数列],_公差) :- '先頭要素が変数の時、後続の数列が等差数列で公差が決まれば、後続の等差数列の先頭要素と公差からVが求まる'([V|_等差数列],_公差). 等差数列とは公差確定問題である([A,B|_等差数列],_公差) :- 先頭要素と公差が変数でない時は後続の等差数列は順に解決できる([A,B|_等差数列],_公差). 等差数列とは公差確定問題である([A|_等差数列],_公差) :- '公差が変数でAは変数でない時は、次の変数でない要素とそれまでの要素数から公差を推計して、等差数列部分を確定していく'([A|_等差数列],_公差). '先頭要素が変数の時、後続の数列が等差数列で公差が決まれば、後続の等差数列の先頭要素と公差からVが求まる'([V|_等差数列],_公差) :- 変数である(V), 等差数列(_等差数列,_公差), _等差数列 = [_後続の等差数列の先頭要素|_], V is _後続の等差数列の先頭要素 - _公差. 先頭要素と公差が変数でない時は後続の等差数列は順に解決できる([A,B|_等差数列],_公差) :- 先頭要素と公差が変数でない時は(A,_公差), 後続ならびは順に解決できる([A,B|_等差数列],_公差). 先頭要素と公差が変数でない時は(A,_公差) :- 変数ではない(A), 変数ではない(_公差). 後続ならびは順に解決できる([A,B|_等差数列],_公差) :- B is A + _公差, 等差数列([B|_等差数列],_公差). '公差が変数でAは変数でない時は、次の変数でない要素とそれまでの要素数から公差を推計して、等差数列部分を確定していく'([A|_等差数列],_公差) :- 公差が変数でAは変数でない時は(A,_公差), 次の変数でない要素とそれまでの要素数から公差を推計して(A,_等差数列,_次の変数でない要素,_変数ならび,_残り等差数列,_公差), 等差数列部分を確定していく(A,_次の変数でない要素,_変数ならび,_残り等差数列,_公差). 公差が変数でAは変数でない時は(A,_公差) :- 変数である(_公差), 変数ではない(A). 次の変数でない要素とそれまでの要素数から公差を推計して(A,_等差数列,A,[],[],_公差) :- '等差数列が全て変数の時は変数は全てAとなり公差は0'(A,_等差数列,_公差),!. 次の変数でない要素とそれまでの要素数から公差を推計して(A,_等差数列,_次の変数でない要素,_変数ならび,_残りならび,_公差) :- 次の変数でない要素とそれまでの要素数から(_等差数列,_次の変数でない要素,_変数ならび,_残りならび), 公差を推計して(A,_次の変数でない要素,_変数ならび,_公差). 等差数列が全て変数の時は変数は全てAとなり公差は0(A,_等差数列,0) :- 等差数列が全て変数の時は(_等差数列), 変数は全てAとなり(A,_等差数列). 等差数列が全て変数の時は(_等差数列) :- forall(member(V,_等差数列),var(V)). 変数は全てAとなり(_等差数列,A) :- findall(A,member(_,_等差数列),_等差数列). 次の変数でない要素とそれまでの要素数から(_等差数列,_次の変数でない要素,_変数ならび,_残りならび) :- append(_変数ならび,[_次の変数でない要素|_残りならび],_等差数列), 要素は全て変数である(_変数ならび), 変数ではない(_次の変数でない要素). 要素は全て変数である(_変数ならび) :- forall(member(_変数,_変数ならび),変数である(_変数)). 公差を推計して(A,_次の変数でない要素,_変数ならび,_公差) :- length([_|_変数ならび],_分割数), _公差 is (_次の変数でない要素 - A) / _分割数. 等差数列部分を確定していく(A,B,L1,R2,_公差) :- 等差数列([A|L1],_公差), 等差数列([B|R2],_公差). 変数である(_変数) :- var(_変数). 変数ではない(_変数ではない項) :- \+(var(_変数ではない項)). % 以下のサイトは 等差数列([_],_公差) :- var(_公差),!,fail. 等差数列(_等差数列,_公差) :- 等差数列とは公差確定問題である(_等差数列,_公差),!. 等差数列とは公差確定問題である([_],_公差). 等差数列とは公差確定問題である([V|R],_公差) :- var(V), 等差数列(R,_公差), R = [B|_], V is B - _公差,!. 等差数列とは公差確定問題である([A,B|R],_公差) :- 変数ではない(A), 変数ではない(_公差), B is A + _公差, 等差数列([B|R],_公差). 等差数列とは公差確定問題である([A|R],_公差) :- var(_公差), 変数ではない(A), append(L1,[B|R2],R), forall(member(V,L1),var(V)), 変数ではない(B), length([_|L1],N), _公差 is (B - A) / N,!, 等差数列([A|L1],_公差), 等差数列([B|R2],_公差),!. 変数ではない(A) :- \+(var(A)). % 以下のサイトは # 出典 :: この話題は はにわさん のツイートを種にしています '0,1,2,3,・・・という数列'(X) :- '0,1,2,3,・・・という数列'(0,X). '0,1,2,3,・・・という数列'(X,X). '0,1,2,3,・・・という数列'(N,X) :- succ(N,N_2), '0,1,2,3,・・・という数列'(N_2,X). '1,2,4,8,・・・という数列'(X) :- '1,2,4,8,・・・という数列'(0,X). '1,2,4,8,・・・という数列'(X) :- '0,1,2,3,・・・という数列'(N), X is 2 ^ N. %%%%%%%%%%%% 実行列 %%%%%%%%%%%%%% ?- '0,1,2,3,・・・という数列'(X). X = 0; X = 1; X = 2; X = 3; X = 4; X = 5. ?- '0,1,2,3,・・・という数列'(36). true. ?- '0,1,2,3,・・・という数列'(-36). % 深い眠りに就く ?- '1,2,4,8,・・・という数列'(X). X = 1; X = 2; X = 4; X = 8; X = 16. ?- '1,2,4,8,・・・という数列'(57). % 深い眠りに就く ?- '1,2,4,8,・・・という数列'(X),X < 57. X = 1; X = 2; X = 4; X = 8; X = 16; X = 32; % 深い眠りに就く ?- '1,2,4,8,・・・という数列'(X),X >= 57. X = 64; X = 128; X = 256. ?- findall(X,('1,2,4,8,・・・という数列'(X),X<57),L). % 浅い眠りの後 スタックオーバーフロー ERROR ?- findall(X,('1,2,4,8,・・・という数列'(X),(X>=57,!,fail;X < 57)),L). L = [1, 2, 4, 8, 16, 32]. ?- % 以下のサイトは '1+3+5=9=3*3はA1+A2+A3=B=n*nになりますよね。 Bの平方根がnであるとき、ある整数BからAnをすべて求める方法を教えてください。 ただしA1..Anは全て奇数の一意数であり昇順に並んでいます'(B,_A1__An) :- 'Bの平方根はnである'(B,_n), '反転した1から始まる公差2の等差数列を求める'(_n,_反転した1から始まる公差2のn要素の等差数列), reverse(_反転した1から始まる公差2のn要素の等差数列,_A1__An). 'Bの平方根はnである'(B,_n) :- _n is sqrt(B), integer(_n). '反転した1から始まる公差2のn要素の等差数列を求める'(1,[1]) :- !. '反転した1から始まる公差2のn要素の等差数列を求める'(2,[3,1]) :- !. '反転した1から始まる公差2のn要素の等差数列を求める'(3,[5,3,1]) :- !. '反転した1から始まる公差2のn要素の等差数列を求める'(_n,[_m_2|[_m|R]]) :- '1を引く'(_n,_n_1), '反転した1から始まる公差2のn要素の等差数列を求める'(_n_1,[_m|R]), '2を足す'(_m,_m_2). '1を引く'(_n,_n_1) :- succ(_n_1,_n). '2を足す'(_m,_m_2) :- succ(_m,_m_1), succ(_m_1,_m_2). % 以下のサイトは '1+3+5=9=3*3はA1+A2+A3=B=n*nになりますよね Bの平方根がnであるとき、ある整数BからAnをすべて求める方法を教えてください ただしA1..Anは全て奇数の一意数であり昇順に並んでいます'(B,_A1__An) :- _n is sqrt(B), '1から始まる公差2のn要素の等差数列'(_n,_A1__An). '1から始まる公差2のn要素の等差数列'(_n,_1から始める公差2のn要素の等差数列) :- length(_1から始める公差2のn要素の等差数列,_n), _1から始める公差2のn要素の等差数列 = [1|_], '反転して公差-2にして等差数列を求める'(_1から始める公差2のn要素の等差数列). '反転して公差-2にして等差数列を求める'(L) :- reverse(L,L2), '等差数列'(L2,-2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/880 # # [1] 授業単元:C言語 # [2] 問題 http://codepad.org/I9NEBx3U # # #  [3]初日に1円、2日目に2円、3日目に4円というように #     前日の2倍の金額を貯金していったとき、貯金の合計金額が #     100万円を超えるのは何日目になるかを算出するプログラムを作成せよ。 # '初日に1円、2日目に2円、3日目に4円というように 前日の2倍の金額を貯金していったとき、貯金の合計金額が 100万円を超えるのは何日目になるかを算出する'(_何日目) :- 数列が1000000を超えるまで([1,2,4|R],_), length([1,2,4|R],_何日目). 数列が1000000を超えるまで([N],_) :- N > 1000000,!. 数列が1000000を超えるまで([A,B|R],_公差) :- 等差数列の連続した二項(A,B,_公差), 数列が1000000を超えるまで([B|R],_公差). 数列が1000000を超えるまで([A,B|R],_公比) :- 等比数列の連続した二項(A,B,_公比), 数列が1000000を超えるまで([B|R],_公比). 等差数列の連続した二項(A,B,_公差) :- var(B), B is A + _公差. 等差数列の連続した二項(A,B,_公差) :- \+(var(B)), _公差 is B - A. 等比数列の連続した二項(A,B,_公比) :- var(B), B is A * _公比. 等比数列の連続した二項(A,B,_公比) :- \+(var(B)), _公比 is B / A. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/880 # # [1] 授業単元:C言語 # [2] 問題 http://codepad.org/I9NEBx3U # # #  [2] 次の数列の和を計算するプログラムを繰り返し処理を用いて作成せよ。 #      0.2, 0.4, 0.6, ・・・・・,10.0(ただし、10.0は何項目か分からない事とする。 #      プログラム内では何回繰り返しするか記述しない条件にする事とする) # '次の数列の和を計算するプログラムを繰り返し処理を用いて作成せよ。      0.2, 0.4, 0.6, ・・・・・,10.0(ただし、10.0は何項目か分からない事とする。'(_数列の和) :- 次の数列の([0.2,0.4,0.6|R],10.0,_), 和を計算する([0.2,0.4,0.6|R],_数列の和). 次の数列の([_終了値],_終了値,_) :- !. 次の数列の([A,B|R],_終了値,_公差) :- 等差数列の連続した二項(A,B,_公差), 次の数列の([B|R],_終了値,_公差). 次の数列の([A,B|R],_終了値,_公比) :- 等比数列の連続した二項(A,B,_公比), 次の数列の([B|R],_終了値,_公比). 等差数列の連続した二項(A,B,_公差) :- var(B), B is A + _公差. 等差数列の連続した二項(A,B,_公差) :- \+(var(B)), _公差 is B - A. 等比数列の連続した二項(A,B,_公比) :- var(B), B is A * _公比. 等比数列の連続した二項(A,B,_公比) :- \+(var(B)), _公比 is B / A. 和を計算する([],0). 和を計算する([_数|R],_和) :- 和を計算する(R,_和_1), _和 is _和_1 + _数. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/880 # # [1] 授業単元:C言語 # [2] 問題 http://codepad.org/I9NEBx3U # # #  [1] 次の数列の第20項までの和を計算するプログラムを繰り返し処理を用いて作成せよ。 #      5,10,15,20,・・・・ # '次の数列の第20項までの和を計算する      5,10,15,20,・・・・'(_数列の和) :- 次の数列の第20項までの([5,10,15,20|R]), 和を計算する([5,10,15,20|R],_数列の和). 次の数列の第20項までの(L) :- 第20項までの(L), 次の数列の(L,_). 第20項までの(L) :- length(L,20). 次の数列の([],_). 次の数列の([A,B|R],_公差) :- 等差数列の連続した二項(A,B,_公差), 次の数列の([B|R],_公差). 次の数列の([A,B|R],_公比) :- 等比数列の連続した二項(A,B,_公比), 次の数列の([B|R],_公比). 等差数列の連続した二項(A,B,_公差) :- var(B), B is A + _公差. 等差数列の連続した二項(A,B,_公差) :- \+(var(B)), _公差 is B - A. 等比数列の連続した二項(A,B,_公比) :- var(B), B is A * _公比. 等比数列の連続した二項(A,B,_公比) :- \+(var(B)), _公比 is B / A. 和を計算する([],0). 和を計算する([_数|R],_和) :- 和を計算する(R,_和_1), _和 is _和_1 + _数. % 以下のサイトは # # 等差数列の再帰的定義 # 等差数列(_等差数列) :- 等差数列(_等差数列,_公差),!. 等差数列([_],_公差). 等差数列([A,B|R],_公差) :- '先頭の変数でない二要素の差が公差であり後続もこの公差の等差数列である時、等差数列である'([A,B|R],_公差),!. 等差数列([A,B|R],_公差) :- 'A,Bどちらかが変数の時は、後続が等差数列であるならば公差からAを決定して構わない'(A,B,R,_公差). '先頭の変数でない二要素の差が公差であり後続もこの公差の等差数列である時、等差数列である'([A,B|R],_公差) :- \+(var(A)), \+(var(B)), _公差 is B - A, 等差数列([B|R],_公差). 'A,Bどちらかが変数の時は、後続が等差数列であるならば公差からAを決定して構わない'(A,B,R,_公差) :- 'A,Bどちらかが変数の時は、'(A,B), '後続が等差数列であるならば公差からAを決定して構わない'(B,R,_公差,A),!. 'A,Bどちらかが変数の時は、'(A,B) :- var(A),!. 'A,Bどちらかが変数の時は、'(A,B) :- var(B). '後続が等差数列であるならば公差からAを決定して構わない'(B,R,_公差,A) :- 等差数列([B|R],_公差), A is B - _公差,!. % 以下のサイトは # # 等差数列の再帰的ではない定義(実は再帰的なのだが) # 等差数列とは隣り合う2つの項の差が全て等しい数列である(_等差数列) :- 隣り合う2つの項の差が(_等差数列,_隣り合う2つの項の差のリスト), 全て等しい(_隣り合う2つの項の差のリスト,_). 隣り合う2つの項の差が(_等差数列,_隣り合う2つの項の差のリスト) :- findall(_差,( append(_,[A,B|_],_等差数列), _差 is B - A), _隣り合う2つの項の差のリスト). 全て等しい([A],A). 全て等しい([A|R],A) :- 全て等しい(R,A). % 以下のサイトは # # 等差数列の再帰的ではない定義(実は再帰的なのだが) # 等差数列(_等差数列) :- 数列の差が(_等差数列,_差のリスト), 全て等しい(_差のリスト,_). 数列の差が(_等差数列,_差のリスト) :- findall(_差,( append(_,[A,B|_],_等差数列), _差 is B - A), _差のリスト). 全て等しい([A],A). 全て等しい([A|R],A) :- 全て等しい(R,A). % 以下のサイトは # # 等差数列の再帰的定義 # 等差数列(_等差数列) :- 等差数列(_等差数列,_公差). 等差数列([A,B],_公差) :- _公差 is B - A. 等差数列([A,B|R],_公差) :- \+(R = []), _公差 is B - A, 等差数列([B|R],_公差). % 以下のサイトは # # 等差数列の再帰的定義 # 等差数列(_等差数列) :- _等差数列 = [_,_|_], 等差数列(_等差数列,_公差). 等差数列([_],_公差). 等差数列([A,B|R],_公差) :- _公差 is B - A, 等差数列([B|R],_公差). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/936 # # 下のように定義される等比級数の第1項から第n項までの和 sum を # 求めるプログラムを for文を用いて作成せよ。 # # a1 = 1.0 # a i+1 = a i *0.5 # #    n # sum= Σ(ai) # i=1 # # # # すみません。かなりの時間ねばったんですが、できませんでした。 # お願いいたします。 # # sum(1,_n,Sum) :- sum(1,_n,1,0,_sum). sum(_n,_n,_ai,sum,_sum). sum(_i,_n,_ai,sum_1,_sum) :- _ai_2 is _ai * 0.5, _sum_2 is _sum_1 + _ai, _i_2 is _i + 1, sum(_i_2,_n,_ai_2,_sum_2,_sum). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% f(X,Y) :- Y is X * 0.5. sum(1,_n,Sum) :- sum(1,_n,1,P,0,_sum). sum(_n,_n,_ai,_sum,_sum). sum(_i,_n,_ai,_sum_1,_sum) :- f(_ai,_ai_2), _sum_2 is _sum_1 + _ai, _i_2 is _i + 1, sum(_i_2,_n,_ai_2,_sum_2,_sum). % % 大事なことは、http://nojiriko.asia/prolog/c152_503.html で定義したシグマは使えないことだ。 % この定義では式に関係する変数は第一引数だけであり、一つ前の計算結果に % 依存することがない。計算は完結していてデータの連関はない。 % データの連関が無いから、findall/3を使用できた。すなわち非決定性として、 % バックトラックさせることができた。 % ここでの例では_ai_2 は _ai に依存する。このようなケースでは再帰述語として書く。 % 更に言えば、ここでf/2として定義している本体部分を式として引数に持たせてはならない。 % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/754 # # [1] 授業単元: C言語プログラム # [2] 問題文(含コード&リンク): # 初項 a,交差 d及びn項目のnを引数で与え # 等差数列のn項目の値を戻り値で得る関数を作成する.引数,戻り値は整数型でよい. # an = a + (n-1) * d # 上の関数を用いて,初項,交差及びn項目をキーボード入力で与え,結果を出力するプログラムを作成せよ. # 実行例↓ # $./kadai1 # # a? 2 # d? 3 # n? 10 # Result: 29 # # '初項 a,交差 d及びn項目のnを引数で与え等差数列のn項目の値を戻り値で得る'(_a,_d,_n,_n項目の値) :- '等差数列のn項目の値を戻り値で得る'(_a,_d,0,_n,_n項目の値), '等差数列のn項目の値を戻り値で得る'(_n項目の値,_d,_n,_n,_n項目の値) :- !. '等差数列のn項目の値を戻り値で得る'(_a,_d,_n,_n項目の値) :- _n_2 is _n + 1, _a_2 is _a + _d, '等差数列のn項目の値を戻り値で得る'(_a_2,_d,_n_2,_n項目の値). '初項,交差及びn項目をキーボード入力で与え,結果を出力する' :- 初項をキーボード入力(_初項), 交差をキーボード入力(_交差), 'n項目をキーボード入力'(_n項目), '初項 a,交差 d及びn項目のnを引数で与え等差数列のn項目の値を戻り値で得る'(_初項,_交差,_n項目,_n項目の値), 結果を出力する(_初項,_交差,_n項目,_n項目の値),!. 初項をキーボード入力(_初項) :- write('初項 : '), get_integer(_初項),!. 初項をキーボード入力(_初項) :- 初項をキーボード入力(_初項). 交差をキーボード入力(_交差) :- write('交差 : '), get_integer(_交差),!. 交差をキーボード入力(_交差) :- 交差をキーボード入力(_交差). 'n項目をキーボード入力'(_n項目) :- write('n項目 : '), get_integer(_n項目),!. 'n項目をキーボード入力'(_n項目) :- 'n項目をキーボード入力'(_n項目). 結果を出力する(_n項目の値) :- writef('結果: %t\n',[_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/1305867431/425 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # この問題では、数列として扱う値はすべて実数での処理を想定する # 初項および項数を入力すると、その等差数列の和を求めるプログラムを作成する # ○公式を利用して求める場合→項数(初項+末項)÷2 # ○1つずつの項を順次足し合わせる場合→公差=(末項−初項)÷(項数−1) # との2種類の計算方法で値を求めるプログラムを作成しなさい # 公式を利用して等差数列の和を求める(_初項,_末項,_項数,_等差数列の和) :- '公式を利用して求める場合→項数(初項+末項)÷2'(_初項,_末項,_項数,_等差数列の和),!. '1つずつの項を順次足し合わせて等差数列の和を求める'(_初項,_末項,_項数,_等差数列の和) :- '1つずつの項を順次足し合わせる場合→公差=(末項‐初項)÷(項数‐1)'(_初項,_末項,_項数,_等差数列の和). '公式を利用して求める場合→項数(初項+末項)÷2'(_初項,_末項,_項数,_等差数列の和) :- _等差数列の和 is ((_初項 + _末項) * _項数) / 2. '1つずつの項を順次足し合わせる場合→公差=(末項‐初項)÷(項数‐1)'(_初項,_末項,_項数,_等差数列の和) :- 公差を求める(_初項,_末項,_項数,_公差), 等差数列の和(1,_項数,_公差,0.0,_等差数列の和). 交差を求める(_初項,_末項,_項数,_公差) :- _公差 is (_末項 - _初項) / (_項数 - 1). 等差数列の和(M,_項数,_,_等差数列の和,_等差数列の和) :- M > _項数,!. 等差数列の和(M,_項数,_公差,_等差数列の和の累積値1,_等差数列の和) :- _等差数列の和の累積値2 is _等差数列の和の累積値1 + _項差, M2 is M + 1, 等差数列の和(M2,_項数,_公差,_等差数列の和の累積値2,_等差数列の和). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/942 # # [1] プログラミング入門 # [2] 1+2+3+…n≦1000となるように、nの最大値とそのときの合計を求め、表示するプログラムを作成せよ #   注:「等差数列の和の公式は」ではなく、while文またはfor文を使用すること。 # '1+2+3+…n≦1000となるように、nの最大値とそのときの合計を表示' :- '1+2+3+…n≦1000となるように、nの最大値とそのときの合計を表示'(_nの最大値,_合計), write_formatted('nの最大値=%t,そのときの合計=%t\n',[_nの最大値,_合計]). '1+2+3+…n≦1000となるように、nの最大値とそのときの合計'(_nの最大値,_合計) :- '1+2+3+…n≦1000となるように、nの最大値とそのときの合計'(1,_nの最大値,0,_合計). '1+2+3+…n≦1000となるように、nの最大値とそのときの合計'(_n,_nの最大値,_合計1,_合計) :- _n2 is _n + 1, _合計2 is _合計1 + _n, _合計2 =< 1000, '1+2+3+…n≦1000となるように、nの最大値とそのときの合計'(_n2,_nの最大値,_合計2,_合計). '1+2+3+…n≦1000となるように、nの最大値とそのときの合計'(_nの最大値,_nの最大値,_合計,_合計). % 以下のサイトは # 出典:: 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,_数列の和) :- 初項1公差1の等差数列におけるX項からY項までの数列の和を算出する(X,Y,_,_数列の和). 初項1公差1の等差数列におけるX項からY項までの数列の和を算出する(X,Y,_初項1公差1の等差数列,_数列の和) :- 初項1公差1の等差数列におけるX項からY項までの数列の(X,Y,_初項1公差1の等差数列,_X項からY項までの数列), 和を算出する(_X項からY項までの数列,_数列の和). 初項1公差1の等差数列におけるX項からY項までの数列の(X,Y,_等差数列,_X項からY項までの数列) :- 初項1公差1の等差数列(_等差数列), 'X項からY項までの数列の'(X,Y,_等差数列,_X項からY項までの数列),!. 初項1公差1の等差数列(_等差数列) :- 初項1公差1の等差数列(1,_等差数列). 初項1公差1の等差数列(M,[M|R]) :- 公差1の(M,N), 初項1公差1の等差数列(N,X). 公差1の(M,N) :- succ(M,N). 'X項からY項までの数列の'(X,Y,_等差数列,_X項からY項までの数列) :- 'X項からY項までの数列'(X,Y,_X項からY項までの数列), append(_,_X項からY項までの数列,_,_等差数列), 'X項からY項までの数列は全て整数'(_X項からY項までの数列). 'X項からY項までの数列'(X,Y,_X項からY項までの数列) :- length([_|L1],X), length(L2,Y), append(L1,_X項からY項までの数列,L2). 'X項からY項までの数列は全て整数'(_X項からY項までの数列) :- forall(member(A,_X項からY項までの数列),integer(A)). 和を算出する(_X項からY項までの数列,_数列の和) :- sum_list(_X項からY項までの数ならび,_数列の和). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは # 出典:: 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://toro.2ch.net/test/read.cgi/tech/1357748713/654 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): # 無限等比級数の和を各項を順に加算していくことにより求めるプログラム # 1+(1/3)+(1/9)+(1/27)+..... # ただし、0.00001以下となる項を加えた時点で加算を終了することとする。 # '無限等比級数の和を各項を順に加算していくことにより求めるプログラム 1+(1/3)+(1/9)+(1/27)+..... ただし、0.00001以下となる項を加えた時点で加算を終了することとする。'(_無限等比級数) :- 無限等比級数の和を各項を順に加算していく(_無限等比級数). 無限等比級数の和を各項を順に加算していく(_無限等比級数) :- '100000以下の3の等比数列'(_100000以下の3の等比数列), 自分以外の要素を全部掛けることによって作られる数列の合計(_100000以下の3の等比数列,_自分以外の要素を全部掛けることによって作られる数列), ならびすべてを掛ける(_100000以下の3の等比数列,_分母), _無限等比級数 is _分子 / _分母. '100000以下の3の等比数列'(_100000以下の3の等比数列) :- '100000以下の3の等比数列'(1,_100000以下の3の等比数列). '100000以下の3の等比数列'(M,[M]) :- M >= 100000,!. '100000以下の3の等比数列'(M,[M|R]) :- M_2 is M * 3, '100000以下の3の等比数列'(M_2,R). 自分以外の要素を全部掛けることによって作られる数列の合計(L1,_数列の合計) :- findsum(M,( append(L0,[N|R],L1), append(L0,R,L3), ならびすべてを掛ける(L3,M)), _数列の合計). ならびすべてを掛ける(L,M) :- atomic_list_concat(L,'*',S), atom_to_term(S,_式,_), M is _式.