このディレクトリの索引

% 以下のサイトは :- dynamic(フィボナッチ数/2). フィボナッチ数(_n番目,_n番目のフィボナッチ数) :- '0番目のフィボナッチ数は0、1番目は1、2番目も1である。これらが停止節となる。'(_n番目,_n番目のフィボナッチ数),!. フィボナッチ数(_n番目,_n番目のフィボナッチ数) :- '_n番目のフィボナッチ数は_n-2番目のフィボナッチ数と_n-1番目のフィボナッチ数を加えたものである'(_n番目,_n番目のフィボナッチ数). '0番目のフィボナッチ数は0、1番目は1、2番目も1である。これらが停止節となる。'(0,0). '0番目のフィボナッチ数は0、1番目は1、2番目も1である。これらが停止節となる。'(1,1). '0番目のフィボナッチ数は0、1番目は1、2番目も1である。これらが停止節となる。'(2,1). '_n番目のフィボナッチ数は_n-2番目のフィボナッチ数と_n-1番目のフィボナッチ数を加えたものである'(_n番目,_n番目のフィボナッチ数) :- '_n番目のフィボナッチ数は_n-2番目のフィボナッチ数と_n-1番目のフィボナッチ数を'(_n番目,_n_2番目のフィボナッチ数,_n_1番目のフィボナッチ数), 加えたものである(_n_2番目のフィボナッチ数,_n_1番目のフィボナッチ数,_n番目のフィボナッチ数), '_n番目のフィボナッチ数を記憶する'(_n番目,_n番目のフィボナッチ数). '_n番目のフィボナッチ数は_n-2番目のフィボナッチ数と_n-1番目のフィボナッチ数を'(_n番目,_n_2番目のフィボナッチ数,_n_1番目のフィボナッチ数) :- '_n-2番目のフィボナッチ数と'(_n番目,_n_2番目のフィボナッチ数), '_n-1番目のフィボナッチ数を'(_n番目,_n_1番目のフィボナッチ数). '_n-2番目のフィボナッチ数と'(_n番目,_n_2番目のフィボナッチ数) :- _n_2番目 is _n番目 - 2, フィボナッチ数(_n_2番目,_n_2番目のフィボナッチ数). '_n-1番目のフィボナッチ数を'(_n番目,_n_1番目のフィボナッチ数) :- _n_1番目 is _n番目 - 1, フィボナッチ数(_n_1番目,_n_1番目のフィボナッチ数). 加えたものである(_n_2番目のフィボナッチ数,_n_1番目のフィボナッチ数,_n番目のフィボナッチ数) :- _n番目のフィボナッチ数 is _n_2番目のフィボナッチ数 + _n_1番目のフィボナッチ数. '_n番目のフィボナッチ数を記憶する'(_n番目,_n番目のフィボナッチ数) :- asserta((フィボナッチ数(_n番目,_n番目のフィボナッチ数) :- ! )). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 153代目 #344 # [1] 授業単元: プログラミング基礎 # [2] 問題文(含コード&リンク): 3問 http://ime.nu/ideone.com/kXOZ8 # # 1)帰納を使い、フィボナッチ数を表示するプログラミングを作れ。 # 例 0,1,1,2,3,5,8,13... # # 2)帰納を使い、インプットした数字nが偶数の場合は、 # 1*3*5*7...n の計算式を行いその答えを表示するプログラミングを作れ。 # ただし、nが奇数の場合は、-1と表示させる。 # # 3)帰納を使い、最大公約数を求めよ。 '帰納を使い、インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行いその答えを表示するプログラミングを作れ。ただし、nが偶数の場合は、-1と表示させる。'(_n) :- 'ただし、nが偶数の場合は、-1と表示させる。'(_n). '帰納を使い、インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行いその答えを表示するプログラミングを作れ。ただし、nが偶数の場合は、-1と表示させる。'(_n) :- 'インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行いその答えを表示する'(_n). 'ただし、nが偶数の場合は、-1と表示させる。'(_n) :- 偶数(_n). '-1と表示させる'. 偶数(_偶数) :- 0 is _偶数 mod 2. '-1と表示させる' :- writef('%w\n',[-1]). 'インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行いその答えを表示する'(_n) :- 奇数(_n), '帰納を使い、インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行いその答えを表示する'(1,_n,1). 奇数(_奇数) :- 1 is _奇数 mod 2. '帰納を使い、インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行いその答えを表示する'(_n,_n,_答え) :- 'その答えを表示する'(_答え),!. '帰納を使い、インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行いその答えを表示する'(N,_n,S1) :- 'インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を先頭から順に計算して行く'(N,_n,S1). 'その答えを表示する'(_答え) :- writef('%w\n',[_答え]). '帰納を使い、インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を先頭から順に計算して行く'(N,_n,S1) :- 'N_1に2を加えてN_2とした上で、N_2とM_1を掛けてM_2とする'(N_1,M_1,N_2,M_2), '帰納を使い、インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行いその答えを表示する'(N_2,_n,S2). 'N_1に2を加えてN_2とした上で、N_2とM_1を掛けてM_2とする'(N_1,M_1,N_2,M_2) :- N_2 is N_1 + 2, M_2 is M_1 * N_2. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 153代目 #344 # [1] 授業単元: プログラミング基礎 # [2] 問題文(含コード&リンク): 3問 http://ime.nu/ideone.com/kXOZ8 # # 1)帰納を使い、フィボナッチ数を表示するプログラミングを作れ。 # 例 0,1,1,2,3,5,8,13... # # 2)帰納を使い、インプットした数字nが偶数の場合は、 # 1*3*5*7...n の計算式を行いその答えを表示するプログラミングを作れ。 # ただし、nが奇数の場合は、-1と表示させる。 # # 3)帰納を使い、最大公約数を求めよ。 '帰納を使い、インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行いその答えを表示するプログラミングを作れ。ただし、nが偶数の場合は、-1と表示させる。'(_n) :- 'ただし、nが偶数の場合は、-1と表示させる。'(_n). '帰納を使い、インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行いその答えを表示するプログラミングを作れ。ただし、nが偶数の場合は、-1と表示させる。'(_n) :- 'インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行いその答えを表示する'(_n). 'ただし、nが偶数の場合は、-1と表示させる。'(_n) :- 偶数(_n). '-1と表示させる'. 'インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行いその答えを表示する'(_n) :- 奇数(_n), '帰納を使い、インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行いその答えを表示する'(1,_n,1). '帰納を使い、インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行いその答えを表示する'(_n,_n,_答え) :- 'その答えを表示する'(_答え),!. '帰納を使い、インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行いその答えを表示する'(N,_n,S1) :- 'インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行って計算して行く'(N,_n,S1). '帰納を使い、インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を計算して行く'(N,_n,S1) :- 'N_1に2を加えてN_2とした上で、N_2とM_1を掛けてM_2とする'(N_1,M_1,N_2,M_2), '帰納を使い、インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行いその答えを表示する'(N_2,_n,S2). 'N_1に2を加えてN_2とした上で、N_2とM_1を掛けてM_2とする'(N_1,M_1,N_2,M_2) :- N_2 is N_1 + 2, M_2 is M_1 * N_2. 偶数(_偶数) :- 0 is _偶数 mod 2. 奇数(_奇数) :- 1 is _奇数 mod 2. '-1と表示させる' :- writef('%w\n',[-1]). 'その答えを表示する'(_答え) :- writef('%w\n',[_答え]). % 以下のサイトは # 出典 :: Python の宿題ここで答えます Part 2 #229 # project euler problem02 # 出典::project euler Problem 2 「偶数のフィボナッチ数」 † # # フィボナッチ数列の項は前の2つの項の和である。最初の2項を 1, 2 とすれば、最初の10項は以下の通りである。 # 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... # 数列の項が400万を超えない範囲で、偶数の項の総和を求めよ。 # # (´・ω・`)再帰で書いたら深度が深すぎて怒られました。だれか教えてください。 # # 'フィボナッチ数列の項が400万を超えない範囲で、偶数の項の総和を求める'(_偶数の項の総和) :- 'フィボナッチ数列の項が400万を超えない範囲で、偶数の項の総和を求める'(1,2,2,_偶数の項の総和). 'フィボナッチ数列の項が400万を超えない範囲で、偶数の項の総和を求める'(N1,N2,_偶数の項の総和,_偶数の項の総和) :- N1 + N2 > 4000000,!. 'フィボナッチ数列の項が400万を超えない範囲で、偶数の項の総和を求める'(N1,N2,_偶数の項の総和_1,_偶数の項の総和) :- 'フィボナッチ数を計算して偶数の場合に限り、総和に加算していく'(N1,N2,_偶数の項の総和_1,_偶数の項の総和). 'フィボナッチ数を計算して偶数の場合に限り、総和に加算していく'(N1,N2,_偶数の項の総和_1,_偶数の項の総和) :- '次のフィボナッチ数を計算して_偶数の項の総和_1に加算'(N1,N2,_偶数の項の総和_1,N3,_偶数の項の総和_2), 'フィボナッチ数列の項が400万を超えない範囲で、偶数の項の総和を求める'(N2,N3,_偶数の項の総和_2,_偶数の項の総和). '次のフィボナッチ数を計算して_偶数の項の総和_1に加算'(N1,N2,_偶数の項の総和_1,N3,_偶数の項の総和_2) :- 次のフィボナッチ数を計算して(N1,N2,N3), '_偶数の項の総和_1に加算'(N3,_偶数の項の総和_1,_偶数の項の総和_2). 次のフィボナッチ数を計算して(_ふたつ前のフィボナッチ数,_ひとつ前のフィボナッチ数,_フィボナッチ数) :- _フィボナッチ数 is _ふたつ前のフィボナッチ数 + _ひとつ前のフィボナッチ数. '_偶数の項の総和_1に加算'(N3,_偶数の項の総和_1,_偶数の項の総和_2) :- 足すべき値(N3,_足すべき値), _偶数の項の総和_2 is _偶数の項の総和_1 + _足すべき値. 足すべき値(N,N) :- 偶数(N). 足すべき値(N,0) :- 奇数(N). 偶数(_偶数) :- 0 is _偶数 mod 2. 奇数(_奇数) :- 1 is _奇数 mod 2. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/657 # # 【 課題 】 # (4)配列を使って、n番目までのフィボナッチ数列を表示するプログラム。 # 最大何番目の値が求められるか確かめること。 # # 【 形態 】http://ime.nu/www.javadrive.jp/install/jdk/で設定したのですが1でしょうか… # 【 期限 】12月16日です # 【 Ver  】1.6.0_22 # 【 補足 】ぎりぎりで丸投げですがよろしくお願いします! # # n番目までのフィボナッチ数列を(_n,_n番目までのフィボナッチ数ならび) :- n番目までの(_n,_n番目までのフィボナッチ数ならび), フィボナッチ数列を(_n番目までのフィボナッチ数ならび). n番目までの(_n,_n番目までのフィボナッチ数ならび) :- length(_n番目までのフィボナッチ数ならび,_n). フィボナッチ数列を(L) :- 要素数2以下のフィボナッチ数列(L). フィボナッチ数列を([1,1|R]) :- フィボナッチ数でならびを満たす([1,1|R]). 要素数2以下のフィボナッチ数列([1]). 要素数2以下のフィボナッチ数列([1,1]). フィボナッチ数でならびを満たす([A,B,C]) :- C is A + B. フィボナッチ数でならびを満たす([A,B,C|R]) :- C is A + B, フィボナッチ数でならびを満たす([B,C|R]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/657 # # 【 課題 】 # (4)配列を使って、n番目までのフィボナッチ数列を表示するプログラム。 # 最大何番目の値が求められるか確かめること。 # # 【 形態 】http://ime.nu/www.javadrive.jp/install/jdk/で設定したのですが1でしょうか… # 【 期限 】12月16日です # 【 Ver  】1.6.0_22 # 【 補足 】ぎりぎりで丸投げですがよろしくお願いします! # # n番目までのフィボナッチ数列を表示する(_n) :- n番目までのフィボナッチ数列を(_n,_n番目までのフィボナッチ数ならび), 表示する(_n番目までのフィボナッチ数ならび). n番目までのフィボナッチ数列を(_n,_n番目までのフィボナッチ数ならび) :- n番目までの(_n,_n番目までのフィボナッチ数ならび), フィボナッチ数列を(_n番目までのフィボナッチ数ならび). n番目までの(_n,_n番目までのフィボナッチ数ならび) :- length(_n番目までのフィボナッチ数ならび,_n). フィボナッチ数列を(L) :- 要素数2以下のフィボナッチ数列(L). フィボナッチ数列を([1,1|R]) :- フィボナッチ数でならびを満たす([1,1|R]). 要素数2以下のフィボナッチ数列([1]). 要素数2以下のフィボナッチ数列([1,1]). フィボナッチ数でならびを満たす([A,B,C]) :- C is A + B. フィボナッチ数でならびを満たす([A,B,C|R]) :- C is A + B, フィボナッチ数でならびを満たす([B,C|R]). 表示する(_n番目までのフィボナッチ数ならび) :- writef('%t\n',[_n番目までのフィボナッチ数ならび]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/657 # # 【 課題 】 # (4)配列を使って、n番目までのフィボナッチ数列を表示するプログラム。 # 最大何番目の値が求められるか確かめること。 # # 【 形態 】http://ime.nu/www.javadrive.jp/install/jdk/で設定したのですが1でしょうか… # 【 期限 】12月16日です # 【 Ver  】1.6.0_22 # 【 補足 】ぎりぎりで丸投げですがよろしくお願いします! # # n番目までのフィボナッチ数列を表示する(_n) :- n番目までのフィボナッチ数列を(_n,_n番目までのフィボナッチ数ならび), 表示する(_n番目までのフィボナッチ数ならび). n番目までのフィボナッチ数列を(_n,_n番目までのフィボナッチ数ならび) :- n番目までの(_n,_n番目までのフィボナッチ数ならび), フィボナッチ数列を(_n番目までのフィボナッチ数ならび). n番目までの(_n,_n番目までのフィボナッチ数ならび) :- length(_n番目までのフィボナッチ数ならび,_n). フィボナッチ数列を([1]) :- !. フィボナッチ数列を([1,1]) :- !. フィボナッチ数列を([1,1|R]) :- フィボナッチ数でならびを満たす([1,1|R]). フィボナッチ数でならびを満たす([A,B,C]) :- C is A + B,!. フィボナッチ数でならびを満たす([A,B,C|R]) :- C is A + B, フィボナッチ数でならびを満たす([B,C|R]). 表示する(_n番目までのフィボナッチ数ならび) :- writef('%t\n',[_n番目までのフィボナッチ数ならび]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/657 # # 【 課題 】 # (4)配列を使って、n番目までのフィボナッチ数列を表示するプログラム。 # 最大何番目の値が求められるか確かめること。 # # 【 形態 】http://ime.nu/www.javadrive.jp/install/jdk/で設定したのですが1でしょうか… # 【 期限 】12月16日です # 【 Ver  】1.6.0_22 # 【 補足 】ぎりぎりで丸投げですがよろしくお願いします! # # 'n番目までのフィボナッチ数列を表示する'(N) :- n番目までのフィボナッチ数列を(N,L), 表示する(L). n番目までのフィボナッチ数列を(N,L) :- n番目までの(N,L), フィボナッチ数列を(L). n番目までの(N,L) :- length(L,N). フィボナッチ数列を([1]) :- !. フィボナッチ数列を([1,1]) :- !. フィボナッチ数列を([1,1|R]) :- フィボナッチ数列でならびを満たす([1,1|R]). フィボナッチ数列でならびを満たす([A,B,C]) :- C is A + B,!. フィボナッチ数列でならびを満たす([A,B,C|R]) :- C is A + B, フィボナッチ数列でならびを満たす([B,C|R]),!. 表示する(L) :- writef('%t\n',[L]). % 以下のサイトは :- dynamic(下三桁フィボナッチ数/2). 下三桁の足し算の定義節の生成 :- between(0,999,M), between(0,999,N), S is ( M + N ) mod 1000, assertz((下三桁の足し算(M,N,S) :- !)), N = 999, M = 999. 下三桁フィボナッチ数(0,1) :- !. 下三桁フィボナッチ数(1,1) :- !. 下三桁フィボナッチ数(N,X) :- 隣り合う2つの数を加える(N,X), asserta((下三桁フィボナッチ数(N,X) :- !)). 隣り合う2つの数を加える(N,X) :- N_1 is N - 1, N_2 is N - 2, 下三桁フィボナッチ数(N_1,Y), 下三桁フィボナッチ数(N_2,Z), 下三桁の足し算(Y,Z,X). :- 下三桁の足し算の定義節の生成. % 以下のサイトは :- dynamic(フィボナッチ数/2). 'repeat-failループでのフィボナッチ数列の計算'(0,[0]) :- !. 'repeat-failループでのフィボナッチ数列の計算'(1,[0,1]) :- !. 'repeat-failループでのフィボナッチ数列の計算'(N,_フィボナッチ数列) :- 初期化(N,L), 'フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である。2からNまでのフィボナッチ数を登録する'(L,N), findall(_フィボナッチ数,フィボナッチ数(_,_フィボナッチ数),_フィボナッチ数列). 'フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である。2からNまでのフィボナッチ数を登録する'(L,N) :- repeat, append(L1,[A,B,C|L2],L), フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である(A,B,C), L1=[],!. フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である(A,B,C) :- フィボナッチ数(B,_一つ前のフィボナッチ数), フィボナッチ数(C,_二つ前のフィボナッチ数), _フィボナッチ数 is _一つ前のフィボナッチ数 + _二つ前のフィボナッチ数, フィボナッチ数が未登録ならば登録する(A,_フィボナッチ数). フィボナッチ数が未登録ならば登録する(A,_フィボナッチ数) :- \+(フィボナッチ数(A,_)), assertz(フィボナッチ数(A,_フィボナッチ数)). 初期化(N,L) :- abolish(フィボナッチ数/2), assertz(フィボナッチ数(0,0)), assertz(フィボナッチ数(1,1)), 'Nから0までの逆順リストを用意する'(N,L). 'Nから0までの逆順リストを用意する'(N,L) :- findall(M,between(0,N,M),L1), reverse(L1,L). % 以下のサイトは :- dynamic(フィボナッチ数/2). 'repeat-failループでのフィボナッチ数列の計算'(0,[0]) :- !. 'repeat-failループでのフィボナッチ数列の計算'(1,[0,1]) :- !. 'repeat-failループでのフィボナッチ数列の計算'(N,_) :- 初期化(N,L), 'フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である。2からNまでのフィボナッチ数を登録する'(L,N). 'repeat-failループでのフィボナッチ数列の計算'(_,_フィボナッチ数列) :- findall(M,フィボナッチ数(_,M),_フィボナッチ数列). 'フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である。2からNまでのフィボナッチ数を登録する'(L,N) :- repeat, append(L1,[A,B,C|L2],L), フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である(A,B,C), (L1=[],!,fail;fail). フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である(A,B,C) :- フィボナッチ数(B,_一つ前のフィボナッチ数), フィボナッチ数(C,_二つ前のフィボナッチ数), _フィボナッチ数 is _一つ前のフィボナッチ数 + _二つ前のフィボナッチ数, フィボナッチ数が未登録ならば登録する(A,_フィボナッチ数). フィボナッチ数が未登録ならば登録する(A,_フィボナッチ数) :- \+(フィボナッチ数(A,_)), assertz(フィボナッチ数(A,_フィボナッチ数)). 初期化(N,L) :- abolish(フィボナッチ数/2), assertz(フィボナッチ数(0,0)), assertz(フィボナッチ数(1,1)), 'Nから0までの逆順リストを用意する'(L). 'Nから0までの逆順リストを用意する'(N,L) :- findall(M,between(0,N,M),L1), reverse(L1,L). % 以下のサイトは :- dynamic(フィボナッチ数/2). 'repeat-failループでのフィボナッチ数列の計算'(N,_) :- 初期化, findall(M,between(0,N,M),L1), reverse(L1,L2), フィボナッチ数の解決(L2,N). 'repeat-failループでのフィボナッチ数列の計算'(_,_フィボナッチ数列) :- findall(M,フィボナッチ数(_,M),_フィボナッチ数列). 初期化 :- abolish(フィボナッチ数/2), assertz(フィボナッチ数(0,0)), assertz(フィボナッチ数(1,1)). フィボナッチ数の解決(L,N) :- repeat, append(L1,[A,B,C|L2],L), フィボナッチ数(B,V_1), フィボナッチ数(C,V_2), V is V_1 + V_2, \+(フィボナッチ数(A,V)), assertz(フィボナッチ数(A,V)), (L1=[],!,fail;fail). % 以下のサイトは :- dynamic(フィボナッチ数/2). :- dynamic(id/1). 'repeat-failループでのフィボナッチ数列の計算'(N,_フィボナッチ数) :- フィボナッチ数プログラムの初期化(N), フィボナッチ数の解決(N). 'repeat-failループでのフィボナッチ数列の計算'(N,_フィボナッチ数) :- フィボナッチ数(N,_フィボナッチ数). フィボナッチ数プログラムの初期化(N) :- フィボナッチ数とidをabolish, フィボナッチ数0番目と1番目の定義, フィボナッチ数構造の定義(N). フィボナッチ数とidをabolish :- abolish(フィボナッチ数/2), abolish(id/1). フィボナッチ数0番目と1番目の定義 :- assertz(フィボナッチ数(0,0)), assertz(フィボナッチ数(1,1)). フィボナッチ数構造の定義(N) :- between(2,N,M), asserta(id(M)), asserta(フィボナッチ数(M,V)), N = M. フィボナッチ数の解決(N) :- 先頭のidから順にMとVを得る(M,V), (idの先頭データのフィボナッチ数が解決済みならば(M,N,V),!,fail; 'Vが未解決の時は、フィボナッチ数を二つ前と一つ前のフィボナッチ数の和に更新する'(M,V)). 先頭のidから順にMとVを得る(M,V) :- 先頭のidから順にMと(M), 'Vを得る'(M,V). 先頭のidから順にMと(M) :- repeat, id(M). 'Vを得る'(M,V) :- フィボナッチ数(M,V). idの先頭データのフィボナッチ数が解決済みならば(M,N,V) :- M = N, integer(V). 'Vが未解決の時は、フィボナッチ数を二つ前と一つ前のフィボナッチ数の和に更新する'(M,V) :- 'Vが未解決の時は'(V), 二つ前のフィボナッチ数と一つ前のフィボナッチ数を得る(M,V_1,V_2), 'V_1とV_2が共に整数の時はVはV_1とV_2の和である'(V_1,V_2,V), フィボナッチ数の更新(M,V), fail. 'Vが未解決の時は'(V) :- \+(integer(V)). 二つ前のフィボナッチ数と一つ前のフィボナッチ数を得る(M,V_1,V_2) :- 二つ前のフィボナッチ数と(M,V_2), 一つ前のフィボナッチ数を得る(M,V_1). 二つ前のフィボナッチ数と(M,V_2) :- M_2 is M - 2, フィボナッチ数(M_2,V_2). 一つ前のフィボナッチ数を得る(M,V_1) :- succ(M_1,M), フィボナッチ数(M_1,V_1). 'V_1とV_2が共に整数の時はVはV_1とV_2の和である'(V_1,V_2,V) :- integer(V_1), integer(V_2), V is V_1 + V_2. フィボナッチ数の更新(M,V) :- retract(フィボナッチ数(M,_)), assertz(フィボナッチ数(M,V)). % 以下のサイトは :- dynamic('_n番目のフィボナッチ数は_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'/2). フィボナッチ数(_n番目,_フィボナッチ数) :- '_n番目のフィボナッチ数は_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'(_n番目,_フィボナッチ数). '_n番目のフィボナッチ数は_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'(0, 0) :- !. '_n番目のフィボナッチ数は_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'(1, 1) :- !. '_n番目のフィボナッチ数は_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'(_n番目,_フィボナッチ数) :- '_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'(_n番目,_フィボナッチ数). '_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'(_n番目,_フィボナッチ数) :- '_n-1番目のフィボナッチ数と'(_n番目,_フィボナッチ数_1), '_n-2番目のフィボナッチ数を'(_n番目,_フィボナッチ数_2), 加算したものになる(_フィボナッチ数_1,_フィボナッチ数_2,_フィボナッチ数), '_n番目のフィボナッチ数の計算結果を保存する'(_n番目,_フィボナッチ数). '_n-1番目のフィボナッチ数と'(_n番目,_フィボナッチ数_1) :- _n_1番目 is _n番目 - 1, '_n番目のフィボナッチ数は_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'(_n_1番目,_フィボナッチ数_1). '_n-2番目のフィボナッチ数を'(_n番目,_フィボナッチ数_2) :- _n_2番目 is _n番目 - 2, '_n番目のフィボナッチ数は_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'(_n_2番目,_フィボナッチ数_2). 加算したものになる(_フィボナッチ数_1,_フィボナッチ数_2,_フィボナッチ数) :- _フィボナッチ数 is _フィボナッチ数_1 + _フィボナッチ数_2. '_n番目のフィボナッチ数の計算結果を保存する'(_n番目,_フィボナッチ数) :- asserta(('_n番目のフィボナッチ数は_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'(_n番目,_フィボナッチ数) :- ! )). % 以下のサイトは :- dynamic('_n番目のフィボナッチ数は_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'/2). フィボナッチ数(_n番目,_フィボナッチ数) :- '_n番目のフィボナッチ数は_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'(_n番目,_フィボナッチ数). '_n番目のフィボナッチ数は_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'(_n番目,_フィボナッチ数) :- '停止節 :: 0番目のフィボナッツ数は0、1番目のフィボナッチ数は1である'(_n番目,_フィボナッチ数),!. '_n番目のフィボナッチ数は_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'(_n番目,_フィボナッチ数) :- '_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'(_n番目,_フィボナッチ数). '停止節 :: 0番目のフィボナッツ数は0、1番目のフィボナッチ数は1である'(0,0). '停止節 :: 0番目のフィボナッツ数は0、1番目のフィボナッチ数は1である'(1,1). '_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'(_n番目,_フィボナッチ数) :- '_n-1番目のフィボナッチ数と'(_n番目,_フィボナッチ数_1), '_n-2番目のフィボナッチ数を'(_n番目,_フィボナッチ数_2), 加算したものになる(_フィボナッチ数_1,_フィボナッチ数_2,_フィボナッチ数), '_n番目のフィボナッチ数の計算結果を保存する'(_n番目,_フィボナッチ数). '_n-1番目のフィボナッチ数と'(_n番目,_フィボナッチ数_1) :- _n_1番目 is _n番目 - 1, フィボナッチ数(_n_1番目,_フィボナッチ数_1). '_n-2番目のフィボナッチ数を'(_n番目,_フィボナッチ数_2) :- _n_2番目 is _n番目 - 2, フィボナッチ数(_n_2番目,_フィボナッチ数_2). 加算したものになる(_フィボナッチ数_1,_フィボナッチ数_2,_フィボナッチ数) :- _フィボナッチ数 is _フィボナッチ数_1 + _フィボナッチ数_2. '_n番目のフィボナッチ数の計算結果を保存する'(_n番目,_フィボナッチ数) :- asserta(('_n番目のフィボナッチ数は_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'(_n番目,_フィボナッチ数) :- ! )). % 以下のサイトは フィボナッチ数列を20個目までカンマ区切りで出力する :- フィボナッチ数列を20個目までの数列の枠を作り初期値を埋める(_数列の枠), フィボナッチ数で数列の枠を埋める(_数列の枠), フィボナッチ数列をカンマ区切りで出力する(_数列の枠). フィボナッチ数列を20個目までの数列の枠を作り初期値を埋める(_数列の枠) :- length(_数列の枠,20), _数列の枠 = [1,1|_]. フィボナッチ数で数列の枠を埋める([_,_]). フィボナッチ数で数列の枠を埋める([_二つ前のフィボナッチ数,_一つ前のフィボナッチ数,_フィボナッチ数|R]) :- フィボナッチ数は二つ前のフィボナッチ数に一つ前のフィボナッチを加えたものです(_二つ前のフィボナッチ数,_一つ前のフィボナッチ数,_フィボナッチ数), フィボナッチ数で数列の枠を埋める([_一つ前のフィボナッチ数,_フィボナッチ数|R]). フィボナッチ数は二つ前のフィボナッチ数に一つ前のフィボナッチを加えたものです(_二つ前のフィボナッチ数,_一つ前のフィボナッチ数,_フィボナッチ数) :- _フィボナッチ数 is _二つ前のフィボナッチ数 + _一つ前のフィボナッチ数. フィボナッチ数列をカンマ区切りで出力する(_数列の枠) :- atomic_list_concat(_数列の枠,',',_フィボナッチ数列出力文字列), writef('%t\n',[_フィボナッチ数列出力文字列]). % 以下のサイトは フィボナッチ数(Nth,X) :- フィボナッチ数(0,0,1,Nth,X). フィボナッチ数(Nth,M,N,Nth,M). フィボナッチ数(Nth_1,M,N,Nth,X) :- フィボナッチ数は事実上の決定性状態にあるとは言えない(Nth_1,Nth,M,X), M2 is M + N, Nth_2 is Nth_1 + 1, フィボナッチ数(Nth_2,N,M2,Nth,X). フィボナッチ数は事実上の決定性状態にあるとは言えない(Nth_1,Nth,M,X) :- \+(フィボナッチ数出現位置が既に事実上の決定性状態(Nth_1,Nth)), \+(フィボナッチ数が既に事実上の決定性状態(M,X)). フィボナッチ数出現位置が既に事実上の決定性状態(Nth_1,Nth) :- integer(Nth), Nth_1 > Nth. フィボナッチ数が既に事実上の決定性状態(M,X) :- number(X), M > X. % 以下のサイトは # # フィボナッチ数列によるFizzBuzz # フィボナッチ数列を表示してのFizzBuzz(N) :- fibfizzbuzz(N). fibfizzbuzz(N) :- fibfizzbuzz_2(1,0,1,Y,FizzBuzz), writef('%t ',[FizzBuzz]), Y = N. fibfizzbuzz(N,_1,_2,Y,FizzBuzz) :- _4 is _1 + _2, fibfizzbuzz_2(N,_2,_4,Y,FizzBuzz). fibfizzbuzz_2(1,0,1,1,1). fibfizzbuzz_2(N,_2,_4,N,FizzBuzz) :- N > 1, fizzbuzz診断(N,_4,FizzBuzz). fibfizzbuzz_2(N,_2,_4,Y,FizzBuzz) :- N_2 is N + 1, fibfizzbuzz(N_2,_2,_4,Y,FizzBuzz). fizzbuzz診断(_,_4,'FizzBuzz') :- 0 is _4 mod 15,!. fizzbuzz診断(_,_4,'Fizz') :- 0 is _4 mod 3,!. fizzbuzz診断(_,_4,'Buzz') :- 0 is _4 mod 5,!. fizzbuzz診断(_,_4,_4). % 以下のサイトは # # フィボナッチ数列によるFizzBuzz # フィボナッチ数列番号と見てのFizzBuzz(N) :- fibfizzbuzz(N). fibfizzbuzz(N) :- fibfizzbuzz_2(1,0,1,Y,FizzBuzz), writef('%t ',[FizzBuzz]), Y = N. fibfizzbuzz(N,_1,_2,Y,FizzBuzz) :- _4 is _1 + _2, fibfizzbuzz_2(N,_2,_4,Y,FizzBuzz). fibfizzbuzz_2(1,0,1,1,1). fibfizzbuzz_2(N,_2,_4,N,FizzBuzz) :- N > 1, fizzbuzz診断(N,_4,FizzBuzz). fibfizzbuzz_2(N,_2,_4,Y,FizzBuzz) :- N_2 is N + 1, fibfizzbuzz(N_2,_2,_4,Y,FizzBuzz). fizzbuzz診断(_,_4,'FizzBuzz') :- 0 is _4 mod 15,!. fizzbuzz診断(_,_4,'Fizz') :- 0 is _4 mod 3,!. fizzbuzz診断(_,_4,'Buzz') :- 0 is _4 mod 5,!. fizzbuzz診断(N,_4,N). % 以下のサイトは # # お題:n番目からn+9番目のフィボナッチ数の総和を求めよ。 # 'n番目からn+9番目のフィボナッチ数の総和'(Nth,_フィボナッチ数の総和) :- 'n番目からn+9番目のフィボナッチ数ならび'(Nth,_フィボナッチ数ならび), sum_list(_フィボナッチ数ならび,_フィボナッチ数の総和),!. 'n番目からn+9番目のフィボナッチ数ならび'(Nth,_フィボナッチ数ならび) :- findall(X,'n番目からn+9番目のフィボナッチ数'(Nth,X),_フィボナッチ数ならび). 'n番目からn+9番目のフィボナッチ数'(Nth_1,X) :- Nth_9 is Nth_1 + 9, 'n番目からn+9番目のフィボナッチ数'(0,0,1,Nth_1,Nth_9,X). 'n番目からn+9番目のフィボナッチ数'(Nth,M,N,Nth_1,Nth_9,M) :- between(Nth_1,Nth_9,Nth). 'n番目からn+9番目のフィボナッチ数'(Nth,M,N,Nth_1,Nth_9,X) :- M2 is M + N, Nth_2 is Nth + 1, Nth_2 =< Nth_9, 'n番目からn+9番目のフィボナッチ数'(Nth_2,N,M2,Nth_1,Nth_9,X). % 以下のサイトは # 御題 # # 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 _式. % 以下のサイトは # 御題 # # 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以下の素数を得る'(_100以下の素数ならび) :- findall(N,( between(1,100,N)), _1から100までのならび), エラトステネスの篩(_1から100までのならび,_100以下の素数ならび). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). '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\' と出力すること。' :- '100以下のフィボナッチ数列を得る'(_100以下のフィボナッチ数ならび), '100以下の素数を得る'(_100以下の素数ならび), between(1,100,_数), 'フィボナッチ数列に現れる数のときは数の代わりに \'Fib\' と、素数のときは \'Prime\' と出力し、フィボナッチ数列に現れて且つ素数の場合には \'FibPrime\' と出力すること。'(_数,_100以下のフィボナッチ数ならび,_100以下の素数ならび,L), 'Nが100になるまで出力する'(_数,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. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/676 # # 問題 # n番目のフィボナッチ数を求める関数f(n)を再帰的に定義した場合に # この関数を呼び出す回数を求めよ。 # 例 # n=10のときの関数fの呼び出し回数=109 # n=30のときの関数fの呼び出し回数=1664079 # 'n番目のフィボナッチ数を求める述語を再帰的に定義した場合にこの述語を呼び出す回数を求める'(_n番目,_フィボナッチ数,_呼び出す回数) :- '帰納を使い、フィボナッチ数を得る'(_n番目,_フィボナッチ数,1,_呼び出す回数). '帰納を使い、フィボナッチ数を得る'(0,0,S,S). '帰納を使い、フィボナッチ数を得る'(1,0,S,S). '帰納を使い、フィボナッチ数を得る'(2,1,S,S). '帰納を使い、フィボナッチ数を得る'(N,X,S_1,S) :- N > 2, N_1 is N - 1, N_2 is N - 2, S_2 is S_1 + 2, '帰納を使い、フィボナッチ数を得る'(N_1,X_1,S_2,S_3), '帰納を使い、フィボナッチ数を得る'(N_2,X_2,S_3,S), X is X_1 + X_2,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/344 # # [1] 授業単元: プログラミング基礎 # [2] 問題文(含コード&リンク): 3問 http://ime.nu/ideone.com/kXOZ8 # # 1)帰納を使い、フィボナッチ数を表示するプログラミングを作れ。 # 例 0,1,1,2,3,5,8,13... # # 2)帰納を使い、インプットした数字nが偶数の場合は、 # 1*3*5*7...n の計算式を行いその答えを表示するプログラミングを作れ。 # ただし、nが奇数の場合は、-1と表示させる。 # # 3)帰納を使い、最大公約数を求めよ。 最大公約数(A,B,B) :- 'AがBで割り切れる'(A,B),!. 最大公約数(A,B,X) :- 'AをBで割った余りを除数としBを被除数とする'(A,B,X). 'AをBで割った余りを除数としBを被除数とする'(A,B,X) :- _余り is A mod B, 最大公約数(B,_余り,X). 'AがBで割り切れる'(A,B) :- 0 is A mod B. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/344 # # [1] 授業単元: プログラミング基礎 # [2] 問題文(含コード&リンク): 3問 http://ime.nu/ideone.com/kXOZ8 # # 1)帰納を使い、フィボナッチ数を表示するプログラミングを作れ。 # 例 0,1,1,2,3,5,8,13... # # 2)帰納を使い、インプットした数字nが偶数の場合は、 # 1*3*5*7...n の計算式を行いその答えを表示するプログラミングを作れ。 # ただし、nが奇数の場合は、-1と表示させる。 # # 3)帰納を使い、最大公約数を求めよ。 '帰納を使い、インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行いその答えを表示するプログラミングを作れ。ただし、nが偶数の場合は、-1と表示させる。'(_n,-1) :- 偶数(_n). '帰納を使い、インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行いその答えを表示するプログラミングを作れ。ただし、nが偶数の場合は、-1と表示させる。'(_n,_答え) :- 奇数(_n), '帰納を使い、インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行いその答えを'(1,_n,1,_答え). '帰納を使い、インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行いその答えを表示する'(_n,_n,_答え,_答え) :- 表示する('%t\n',[_答え]),!. '帰納を使い、インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行いその答えを表示する'(N,_n,S1,_答え) :- 'N_1に2を加えてN_2とした上で、N_2とM_1を掛けてM_2とする'(N_1,M_1,N_2,M_2), '帰納を使い、インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行いその答えを表示する'(N_2,_n,S2,_答え). 'N_1に2を加えてN_2とした上で、N_2とM_1を掛けてM_2とする'(N_1,M_1,N_2,M_2) :- N_2 is N_1 + 2, M_2 is M_1 * N_2. 偶数(_偶数) :- 0 is _偶数 mod 2. 奇数(_奇数) :- 1 is _奇数 mod 2. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/344 # # [1] 授業単元: プログラミング基礎 # [2] 問題文(含コード&リンク): 3問 http://ime.nu/ideone.com/kXOZ8 # # 1)帰納を使い、フィボナッチ数を表示するプログラミングを作れ。 # 例 0,1,1,2,3,5,8,13... # # 2)帰納を使い、インプットした数字nが偶数の場合は、 # 1*3*5*7...n の計算式を行いその答えを表示するプログラミングを作れ。 # ただし、nが奇数の場合は、-1と表示させる。 # # 3)帰納を使い、最大公約数を求めよ。 '帰納を使い、フィボナッチ数を表示する'(X) :- '帰納を使い、フィボナッチ数を表示する'(1,X). writef('%t\n',[X]). '帰納を使い、フィボナッチ数を表示する'(N,X) :- '帰納を使い、フィボナッチ数を得る'(N,X). '帰納を使い、フィボナッチ数を表示する'(N,X) :- N_2 is N + 1, '帰納を使い、フィボナッチ数を表示する'(N_2,X). '帰納を使い、フィボナッチ数を表示する'(X) :- X_2 is X + 1, 帰納を使い、フィボナッチ数を得る(X_2). '帰納を使い、フィボナッチ数を得る'(0,0). '帰納を使い、フィボナッチ数を得る'(1,0). '帰納を使い、フィボナッチ数を得る'(2,1). '帰納を使い、フィボナッチ数を得る'(N,X) :- N > 2, N_1 is N - 1, N_2 is N - 2, '帰納を使い、フィボナッチ数を得る'(N_1,X_1), '帰納を使い、フィボナッチ数を得る'(N_2,X_2), X is X_1 + X_2,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/344 # # [1] 授業単元: プログラミング基礎 # [2] 問題文(含コード&リンク): 3問 http://ime.nu/ideone.com/kXOZ8 # # 1)帰納を使い、フィボナッチ数を表示するプログラミングを作れ。 # 例 0,1,1,2,3,5,8,13... # # 2)帰納を使い、インプットした数字nが偶数の場合は、 # 1*3*5*7...n の計算式を行いその答えを表示するプログラミングを作れ。 # ただし、nが奇数の場合は、-1と表示させる。 # # 3)帰納を使い、最大公約数を求めよ。 帰納を使い、フィボナッチ数を表示するプログラミングを作れ(X) :- 帰納を使い、フィボナッチ数を表示するプログラミングを作れ(0,1,X). 帰納を使い、フィボナッチ数を表示するプログラミングを作れ(M,N,M). 帰納を使い、フィボナッチ数を表示するプログラミングを作れ(M,N,X) :- M2 is M + N, 帰納を使い、フィボナッチ数を表示するプログラミングを作れ(N,M2,X). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/621 # # 3) 配列を利用して、23番目までのフィボナッチ数列を画面に整列させた状態で表示させなさい。 # 1,1,2,3,5,8,13,21,34,… #  [3.1] Windows7 #  [3.3] C言語 # [4] 木曜19時まで # [5] 配列まで # わかる方どうかよろしくお願いします。 # '23番目までのフィボナッチ数列を画面に整列させた状態で表示させる' :- フィボナッチ数列(23,L), concat_atom(L,',',S), writef('%t\n',[S]). フィボナッチ数列(N,L) :- フィボナッチ数列(0,N,[0],L). フィボナッチ数列(Max,Max,L1,L) :- reverse(L1,L),!. フィボナッチ数列(0,Max,L1,L) :- フィボナッチ数列(1,Max,[1|L1],L),!. フィボナッチ数列(1,Max,L1,L) :- フィボナッチ数列(2,Max,[1|L1],L),!. フィボナッチ数列(N,Max,[A,B|R1],L) :- N2 is N + 1, C is A + B, フィボナッチ数列(N2,Max,[C,A,B|R1],L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/621 # # [1] C言語演習 # [2] http://ime.nu/codepad.org/QMwiwwtp を改良して、 #   80〜100:優 70〜 79:良 60〜 69:可 0〜 59:不可 #  の分布グラフを表示するプログラムを作成しなさい。 # 【実行結果】 # 点数を入力してください。 # 1番:17 # 2番:38 # 3番:100 # 4番:95 # 5番:23 # □ 分布グラフ □ #  優:** #  良: #  可: # 不可:*** # ◆´,魏造して、「不可一覧表」も表示できるようにしなさい。 # 【実行結果】 # ,離廛蹈哀薀爐硫爾 # 不可一覧表 # 1番 ( 17点) # 2番 ( 38点) # 5番 ( 23点) # と表示させる。 #  配列を利用して、23番目までのフィボナッチ数列を画面に整列させた状態で表示させなさい。 # 1,1,2,3,5,8,13,21,34,… #  [3.1] Windows7 #  [3.3] C言語 # [4] 木曜19時まで # [5] 配列まで # わかる方どうかよろしくお願いします。 # # '入力する人数を得て、その人数分の点数を入力する。それを80〜100:優 70〜 79:良 60〜 69:可 0〜 59:不可 の分布グラフとして表示しなさい。さらに不可一覧表も表示しなさい' :- 入力する人数を得る(_人数), n人分の点数を得る(_人数,_点数ならび), グラフ分布(_点数ならび,L1,L2,L3,L4), グラフ表示(L1,L2,L3,L4), 不可一覧表表示(_点数ならび). 入力する人数を得る(_人数) :- write('入力する人数を入れてください : '), get_line(Line), 入力する人数診断(Line,_人数),!. 入力する人数を得る(_人数) :- 入力する人数を得る(_人数). 入力する人数診断(Line,_人数) :- atom_to_term(Line,_人数,_), integer(_人数), _人数 > 0,!. 入力する人数診断(Line,_人数) :- writef('入力された %t から人数が得られません。再入力をお願いします。\n',[Line]), fail. n人分の点数を得る(_n人分,_点数ならび) :- length(_点数ならび,_n人分), findall(_点数,( append(_,[_点数|_],_点数ならび), 点数を入力してください(_点数)), _点数ならび). 点数を入力してください(_点数) :- writef('点数を入力してください : '), get_line(Line,_点数,_), 点数入力診断(Line,_点数),!. 点数を入力してください(_点数) :- 点数を入力してください(_点数). 点数入力診断(Line,_点数) :- atom_to_term(Line,_点数,_), integer(_点数), _点数 >= 0, _点数 =< 100,!. 点数入力診断(Line,_点数) :- writef('入力された %t から適切な点数が得られません。再入力をお願いします。\n',[Line]), fail. グラフ分布([],[],[],[],[]). グラフ分布([_点数|R],[*|L1],L2,L3,L4) :- _点数 >= 80,_点数 =< 100, グラフ分布(R,L1,L2,L3,L4). グラフ分布([_点数|R],L1,[*|L2],L3,L4) :- _点数 >= 70,_点数 =< 79, グラフ分布(R,L1,L2,L3,L4). グラフ分布([_点数|R],L1,L2,[*|L3],L4) :- _点数 >= 60,_点数 =< 69, グラフ分布(R,L1,L2,L3,L4). グラフ分布([_点数|R],L1,L2,L3,[*|L4]) :- _点数 >= 0,_点数 =< 59, グラフ分布(R,L1,L2,L3,L4). グラフ表示(L1,L2,L3,L4) :- concat_atom(L1,_優), concat_atom(L2,_良), concat_atom(L3,_可), concat_atom(L4,_不可), writef(' 優: %t\n 良: %t\n 可: %t\n不可: %t\n',[_優,_良,_可,_不可]). 不可一覧表表示(_点数ならび) :- append(L0,[_点数|_],_点数ならび), _点数 < 60, length([_|L0],_n番目), writef('[%t番目] %t点\n',[_n番目,_点数]), fail. 不可一覧表表示(_点数ならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1258320456/229 # # project euler problem02 # http://ime.nu/odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%202 # # フィボナッチ数列の項は前の2つの項の和である。最初の2項を 1, 2 とすれば、最初の10項は以下の通りである。 # 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... # 数列の項が400万を超えない範囲で、偶数の項の総和を求めよ。 # # (´・ω・`)再帰で書いたら深度が深すぎて怒られました。だれか教えてください。 # # 'フィボナッチ数列の項が400万を超えない範囲で、偶数の項の総和を求める'(_偶数の項の総和) :- 'フィボナッチ数列の項が400万を超えない範囲で、偶数の項の総和を求める'(偶数番目,1,2,0,_偶数の項の総和). 'フィボナッチ数列の項が400万を超えない範囲で、偶数の項の総和を求める'(_,N1,N2,_偶数の項の総和,_偶数の項の総和) :- N1 + N2 > 4000000,!. 'フィボナッチ数列の項が400万を超えない範囲で、偶数の項の総和を求める'(偶数番目,N1,N2,_偶数の項の総和_1,_偶数の項の総和) :- N3 is N1 + N2, _偶数の項の総和_2 is _偶数の項の総和_1 + N2, 'フィボナッチ数列の項が400万を超えない範囲で、偶数の項の総和を求める'(奇数番目,N2,N3,_偶数の項の総和_2,_偶数の項の総和). 'フィボナッチ数列の項が400万を超えない範囲で、偶数の項の総和を求める'(奇数番目,N1,N2,_偶数の項の総和_1,_偶数の項の総和) :- N3 is N1 + N2, 'フィボナッチ数列の項が400万を超えない範囲で、偶数の項の総和を求める'(偶数番目,N2,N3,_偶数の項の総和_2,_偶数の項の総和). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1258320456/229 # # project euler problem02 # http://ime.nu/odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%202 # # フィボナッチ数列の項は前の2つの項の和である。最初の2項を 1, 2 とすれば、最初の10項は以下の通りである。 # 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... # 数列の項が400万を超えない範囲で、偶数の項の総和を求めよ。 # # (´・ω・`)再帰で書いたら深度が深すぎて怒られました。だれか教えてください。 # # 'フィボナッチ数列の項が400万を超えない範囲で、偶数の項の総和を求める'(_偶数の項の総和) :- 'フィボナッチ数列の項が400万を超えない範囲で、偶数の項の総和を求める'(1,1,2,0,_偶数の項の総和). 'フィボナッチ数列の項が400万を超えない範囲で、偶数の項の総和を求める'(_,N1,N2,_偶数の項の総和,_偶数の項の総和) :- N1 + N2 > 4000000,!. 'フィボナッチ数列の項が400万を超えない範囲で、偶数の項の総和を求める'(M1,N1,N2,_偶数の項の総和_1,_偶数の項の総和) :- N3 is N1 + N2, _偶数の項の総和_2 is _偶数の項の総和_1 + N2 * M1, 'トグル-0-1'(M1,M2), 'フィボナッチ数列の項が400万を超えない範囲で、偶数の項の総和を求める'(M2,N2,N3,_偶数の項の総和_2,_偶数の項の総和). 'トグル-0-1'(0,1) :- !. 'トグル-0-1'(1,0) :- !. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/746 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # 問題2  30個目までのフィボナッチ数を順に計算し、その結果を順に配列 fib に格納しなさい。 また計算終了後に、 a_1, a_2, a_16, a_25 に相当する結果を表示しなさい。 # <実行例> # a_01 = 1 # a_02 = 1 # a_16 = 987 # a_25 = 75025 # '30個目までのフィボナッチ数を順に計算し、その結果を順に配列 fib に格納しなさい。また計算終了後に、a_1, a_2, a_16, a_25 に相当する結果を表示しなさい。'(_fib) :- '30個目までのフィボナッチ数を順に計算し、その結果を順に配列 fib に格納しなさい。'(_fib), 'また計算終了後に、a_1, a_2, a_16, a_25 に相当する結果を表示しなさい。'(_fib). '30個目までのフィボナッチ数を順に計算し、その結果を順に配列 fib に格納しなさい。'(_fib) :- length(_fib,30), 'n番目までのフィボナッチ数列'(_fib). n番目までのフィボナッチ数列([1]) :- !. n番目までのフィボナッチ数列([1,1]) :- !. n番目までのフィボナッチ数列([1,1|R]) :- n番目までのフィボナッチ数列の二([1,1|R]). n番目までのフィボナッチ数列の二([A,B,C]) :- C is A + B,!. n番目までのフィボナッチ数列の二([A,B,C|R]) :- C is A + B, n番目までのフィボナッチ数列の二([B,C|R]),!. 'また計算終了後に、a_1, a_2, a_16, a_25 に相当する結果を表示しなさい。'(_fib) :- append(_,[_何番目|R],[1,2,16,25]), length([_|L0],_何番目), append(L0,[_何番目のフィボナッチ数|_],_fib), write_formatted('a_%02d = %t\n',[_何番目,_何番目のフィボナッチ数]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/657 # # 【 課題 】 # (4)配列を使って、n番目までのフィボナッチ数列を表示するプログラム。 # 最大何番目の値が求められるか確かめること。 # # 【 形態 】http://ime.nu/www.javadrive.jp/install/jdk/で設定したのですが1でしょうか… # 【 期限 】12月16日です # 【 Ver  】1.6.0_22 # 【 補足 】ぎりぎりで丸投げですがよろしくお願いします! # # 'n番目までのフィボナッチ数列を表示する'(N) :- length(L,N), n番目までのフィボナッチ数列(L), write_formatted('%t\n',[L]). n番目までのフィボナッチ数列([1]) :- !. n番目までのフィボナッチ数列([1,1]) :- !. n番目までのフィボナッチ数列([1,1|R]) :- n番目までのフィボナッチ数列の二([1,1|R]). n番目までのフィボナッチ数列の二([A,B,C]) :- C is A + B,!. n番目までのフィボナッチ数列の二([A,B,C|R]) :- C is A + B, n番目までのフィボナッチ数列の二([B,C|R]),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/390 # # [1] 授業単元: プログラミング言語 # [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10772.txt # # 演習1 # 再帰呼び出しを用いたフィボナッチ数 フィボナッチ数(0, 1). フィボナッチ数(1, 1). フィボナッチ数(N, X) :- N >= 2, N_1 is N - 1, フィボナッチ数(N_1, X1), N_2 is N - 2, フィボナッチ数(N_2, X2), X is X1 + X2.