このディレクトリの索引

% 以下のサイトは 親(為義). 親(頼朝). 親(範頼). 子(頼朝). 子(範頼). 子(公暁). 親子テーブル候補(_親子テーブル候補) :- 属性集合である親と子の直積上の部分集合候補(_親子テーブル候補). 属性集合である親と子の直積上の部分集合候補(_親子テーブル候補) :- 属性集合である親と子の直積上の(_属性集合_親_と_属性集合_子の直積), 部分集合候補(_属性集合_親_と_属性集合_子の直積,_親子テーブル候補). 属性集合である親と子の直積上の(_親と子の直積) :- 属性集合_親(_属性集合_親), 属性集合_子(_属性集合_子), 直積([_属性集合_親,_属性集合_子],_親と子の直積). 属性集合_親(_属性集合_親) :- setof(_親,親(_親),_属性集合_親). 属性集合_子(_属性集合_子) :- setof(_子,子(_子),_属性集合_子). 直積(_集合ならび,_直積集合) :- member項の生成(_集合ならび,_member項,_要素変数ならび), findall(_要素変数ならび,_member項,_直積集合). member項の生成([_集合],member(_要素変数,_集合),[_要素変数]). member項の生成([_集合|R1],(member(_要素変数,_集合),U),[_要素変数|R2]) :- member項の生成(R1,U,R2). 冪集合(_集合,_冪集合) :- findall(L,部分集合(_集合,L),_冪集合). 部分集合(_,[]). 部分集合(A,B) :- length(A,C), between(1,C,D), 組合せ(A,D,B) . 組合せ(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). 部分集合候補(_属性集合_親_と_属性集合_子の直積,_親子テーブル候補) :- 冪集合(_属性集合_親_と_属性集合_子の直積,_冪集合), member(_親子テーブル候補,_冪集合). % 以下のサイトは 親(為義). 親(頼朝). 親(載家). 子(頼朝). 子(載家). 属性集合である親と子の直積上の部分集合候補(_親子テーブル候補) :- 属性集合親(_属性集合親), 属性集合子(_属性集合子), 直積(_属性集合親,_属性集合子,_親と子の直積), member(_直積上の部分集合の組,_親と子の直積), 冪集合(_親と子の直積,_冪集合), member(_親子テーブル候補,_冪集合). 属性集合親(_属性集合親) :- setof(_親,親(_親),_属性集合親). 属性集合子(_属性集合子) :- setof(_子,子(_子),_属性集合子). 直積(L1,L2,LL) :- findall([A,B],( member(A,L1), member(B,L2)),LL). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/785 # # 与えられた自然数nを上回る2の冪を返す関数をなるべく最短処理になるように自作してください # 宿題じゃないので期限は問いません # 例: # n=1 → 1 # n=2 → 2 # n=3 → 4 # n=6 → 8 # n=300 → 512 # # 与えられた自然数nを上回る2の冪を返す(0,1) :- !. 与えられた自然数nを上回る2の冪を返す(_n,_2の冪) :- _n_1 is _n >> 1, 与えられた自然数nを上回る2の冪を返す(_n_1,_2の冪_2), _2の冪 is _2の冪_2 << 1. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/785 # # 与えられた自然数nを上回る2の冪を返す関数をなるべく最短処理になるように自作してください # 宿題じゃないので期限は問いません # 例: # n=1 → 1 # n=2 → 2 # n=3 → 4 # n=6 → 8 # n=300 → 512 # # 与えられた自然数nを上回る2の冪を返す(_n,_2の冪) :- 与えられた自然数nを上回る2の冪を返す(_n,1,_2の冪). 与えられた自然数nを上回る2の冪を返す(0,X,X) :- !. 与えられた自然数nを上回る2の冪を返す(N,X_1,X) :- M is N >> 1, X_2 is X_1 << 1, 与えられた自然数nを上回る2の冪を返す(M,X_2,X). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/785 # # 与えられた自然数nを上回る2の冪を返す関数をなるべく最短処理になるように自作してください # 宿題じゃないので期限は問いません # 例: # n=1 → 1 # n=2 → 2 # n=3 → 4 # n=6 → 8 # n=300 → 512 # # 与えられた自然数nを上回る2の冪を返す(_n,_2の冪) :- count('1ビット右シフト'(_n),_冪), _2の冪 is 2 ^ _冪. '1ビット右シフト'(0) :- !,fail. '1ビット右シフト'(N). '1ビット右シフト'(N) :- M is N >> 1, '1ビット右シフト'(M). count(P,N) :- findall(1,P,L), length(L,N). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/785 # # 与えられた自然数nを上回る2の冪を返す関数をなるべく最短処理になるように自作してください # 宿題じゃないので期限は問いません # 例: # n=1 → 1 # n=2 → 2 # n=3 → 4 # n=6 → 8 # n=300 → 512 # # 与えられた自然数nを上回る2の冪を返す(_n,_2の冪) :- between(0,_n,_冪), _2の冪 is 2 ^ _冪, _2の冪 > _n,!. % 以下のサイトは 冪集合和(_対象集合,_冪集合和) :- findall(_部分集合和,( 部分集合和(_対象集合,_部分集合和)), _冪集合和). 部分集合和([], 0). 部分集合和([_|R1],_部分集合和) :- 部分集合和(R1,_部分集合和). 部分集合和([N|R1], _部分集合和) :- 部分集合和(R1,_部分集合和_2), _部分集合和 is _部分集合和_2 + N. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 冪集合和(_集合,_冪集合和) :- length(_集合,Len), findall(S,( between(1,Len,N), 組合せ和(_集合,N,L,S)), LS), _冪集合和 = [0|LS]. 組合せ和(X,1,[A],A) :- member(A,X). 組合せ和([A|Y],N,[A|X],S) :- N > 1, M is N - 1, 組合せ和(Y,M,X,S1), S is S1 + A. 組合せ和([_|Y],N,A,S) :- N > 1, 組合せ和(Y,N,A,S). % 以下のサイトは 冪集合(_対象集合,_冪集合) :- findall(_部分集合,( 部分集合(_対象集合,_部分集合)), _冪集合). 部分集合([], []). 部分集合([_|R1], LL) :- 部分集合(R1,LL). 部分集合([L|R1], [L|R2]) :- 部分集合(R1,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 冪集合(_集合,_冪集合) :- length(_集合,Len), findall(L,( between(1,Len,N), 組合せ(_集合,N,L)), _冪集合_0), _冪集合 = [[]|_冪集合_0]. 組合せ(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). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 以下のサイトは ?- 'a##'. # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/354 # # [1] 授業単元: 繰り返し # [2] 問題文(含コード&リンク): http://ime.nu/codepad.org/ULbfD1pL # 冪乗計算 # # /*キーボードから整数n (2<=n<=9) を入力し # 値をすべて表示するプログラムを作成せよ。 # # 例)n = 5 の場合 # 2 4 # 3 9 27 # 4 16 64 256 # 5 25 125 625 3125 */ 'キーボードから整数n (2<=n<=9) を入力し、i^j (2<=i<=n,1<=j<=i) の値をすべて表示する' :- 'キーボードから整数n (2<=n<=9) を入力し'(_整数n), 'i^j (2<=i<=n,1<=j<=i) の値をすべて表示する'(2,_n), write('\n'). 'キーボードから整数n (2<=n<=9) を入力し'(_整数n) :- 整数を得る('整数n (2<=n<=9)',(_整数n >=2,_整数n =< 9),_整数n),!. 'i^j (2<=i<=n,1<=j<=i) の値をすべて表示する'(_i,_n) :- _i > _n,!. 'i^j (2<=i<=n,1<=j<=i) の値をすべて表示する'(_i,_n) :- 'i ^ j の表示'(_i), _i_2 is _i + 1, 'i^j (2<=i<=n,1<=j<=i) の値をすべて表示する'(_i_2,_n). 'i ^ j の表示'(_i) :- between(1,_i,_j), _x is _i ^ _j, writef('%t ',[_x]), _i = _j. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/53 # # [1]C言語 for文 while文 do while文 # [2]問題 http://ime.nu/codepad.org/oxqRFj3G # [3]Linux gcc # [4]10月9日 10時 # [5]長めですがよろしくお願いします…。 # # /* # 6. キーボードから正の整数n を一つ入力し、0 以上n 以下の2 のべき乗(2i の形をした整数) をす # べて表示するプログラムをfor 文を用いて作成せよ。 # # 7.問題6をwhileかdo whileで作成せよ # # 11. 銀行の一年間の定期預金の年利は1.25%である。キーボードからこの定期預金に預ける元 # 金(円) と預金期間(年) を入力し、1 年毎の元利合計(元本+利息) を小数点以下を切り落として整 # 数で出力するプログラムをfor 文を利用して作成せよ。なお、各行を「・・年後(タブ)・・・円」の # 形式で表示すること。 # # 16. 漸化式an+1 = an +3, a1 = -5 で表わされる数列がある。初項(n = 1) から第10 項(n = 10) # までを表示するプログラムを作成せよ。 # # 17. 1 から10 までの整数を一行に表示し、さらにこれを5 回繰り返すプログラムを作成せよ。た # だし、for を2 つ用いること。 # 1 2 3 4 5 6 7 8 9 10 # 1 2 3 4 5 6 7 8 9 10 # 1 2 3 4 5 6 7 8 9 10 # 1 2 3 4 5 6 7 8 9 10 # 1 2 3 4 5 6 7 8 9 10 # */ '銀行の一年間の定期預金の年利は1.25%である。キーボードからこの定期預金に預ける元金(円) と預金期間(年) を入力し、1 年毎の元利合計(元本+利息) を小数点以下を切り落として整数で出力するプログラムをfor 文を利用して作成せよ。なお、各行を「・・年後(タブ)・・・円」の形式で表示すること。' :- '銀行の一年間の定期預金の年利は1.25%である'(_年利), 'キーボードからこの定期預金に預ける元金(円) と預金期間(年) を入力し'(_元金,_預金期間), '1 年毎の元利合計(元本+利息) を小数点以下を切り落として整数で出力するプログラムをfor 文を利用して作成せよ。なお、各行を「・・年後(タブ)・・・円」の形式で表示すること。'(_元金,_年利,_預金期間). '銀行の一年間の定期預金の年利は1.25%である'(_年利) :- _年利 = 1.0125. 'キーボードからこの定期預金に預ける元金(円) と預金期間(年) を入力し'(_元金,_預金期間) :- 'キーボードからこの定期預金に預ける元金(円)を入力'(_元金), 'キーボードからこの定期預金に預ける預金期間(年) を入力'(_預金期間). 'キーボードからこの定期預金に預ける元金(円)を入力'(_元金,_預金期間) :- 整数を得る('この定期預金に預ける元金(円)',_元金 > 0,_元金). 'キーボードからこの定期預金に預ける預金期間(年) を入力'(_預金期間) :- 整数を得る('この定期預金に預ける預金期間(年)',_預金期間 > 0,_預金期間). '1 年毎の元利合計(元本+利息) を小数点以下を切り落として整数で出力するプログラムをfor 文を利用して作成せよ。なお、各行を「・・年後(タブ)・・・円」の形式で表示すること。'(_元金,_年利,_預金期間) :- '1 年毎の元利合計(元本+利息) をfor 文を利用して'(_元金,_預金期間,_年後,_元利合計), '小数点以下を切り落として整数で出力するプログラムを作成する。なお、各行を「・・年後(タブ)・・・円」の形式で表示する'(_元利合計ならび). '1 年毎の元利合計(元本+利息) をfor 文を利用して'(_元金,_年利,_預金期間,_年後,_元利合計) :- for(1,_年後,_預金期間), _元利合計 is _元金 * (_年利 ^ _年後). '小数点以下を切り落として整数で出力する。なお、各行を「・・年後(タブ)・・・円」の形式で表示する'(_年後,_元利合計) :- writef('%t年後\t',[_年後]), format('~0f\n',[_元利合計]), _年後 = _預金期間,!. % for/3 % 整数を得る/3 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/53 # # [1]C言語 for文 while文 do while文 # [2]問題 http://ime.nu/codepad.org/oxqRFj3G # [3]Linux gcc # [4]10月9日 10時 # [5]長めですがよろしくお願いします…。 # # /* # 6. キーボードから正の整数n を一つ入力し、0 以上n 以下の2 のべき乗(2i の形をした整数) をす # べて表示するプログラムをfor 文を用いて作成せよ。 # # 7.問題6をwhileかdo whileで作成せよ # # 11. 銀行の一年間の定期預金の年利は1.25%である。キーボードからこの定期預金に預ける元 # 金(円) と預金期間(年) を入力し、1 年毎の元利合計(元本+利息) を小数点以下を切り落として整 # 数で出力するプログラムをfor 文を利用して作成せよ。なお、各行を「・・年後(タブ)・・・円」の # 形式で表示すること。 # # 16. 漸化式an+1 = an +3, a1 = -5 で表わされる数列がある。初項(n = 1) から第10 項(n = 10) # までを表示するプログラムを作成せよ。 # # 17. 1 から10 までの整数を一行に表示し、さらにこれを5 回繰り返すプログラムを作成せよ。た # だし、for を2 つ用いること。 # 1 2 3 4 5 6 7 8 9 10 # 1 2 3 4 5 6 7 8 9 10 # 1 2 3 4 5 6 7 8 9 10 # 1 2 3 4 5 6 7 8 9 10 # 1 2 3 4 5 6 7 8 9 10 # */ 'キーボードから正の整数n を一つ入力し、0 以上n 以下の2 のべき乗(2i の形をした整数) をすべて表示するプログラムをfor 文を用いて作成せよ。' :- 'キーボードから正の整数n を一つ入力し'(_n), '0 以上n 以下の2 のべき乗(2i の形をした整数) をすべて表示するプログラムをfor 文を用いて作成せよ。'(_n). 'キーボードから正の整数n を一つ入力し'(_n) :- 整数を得る(正の整数,_n > 0,_n). '0 以上n 以下の2 のべき乗(2i の形をした整数) をすべて表示するプログラムをfor 文を用いて作成せよ。'(_n) :- findall(_2のi乗,( for(0,_i,_n), '2のi乗'(_i,_2のi乗)), _2のべき乗), writef('%t\n',[_2のべき乗]). '2のi乗'(0,1). '2のi乗'(_i,X) :- _i_1 is _i - 1, '2のi乗'(_i_1,Y), X is 2 * Y. % for/3 % 整数を得る/3 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/31 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # # 以下の問題文の ^ はべき乗をあらわす記号とする。 # # 1.二次方程式 "ax^2+bx+c=0" のxの解を"解の公式"を使って求め、表示しなさい。 # a,b,cは乱数によって決定されるdouble型の変数とする。 # a,b,cは "a≠0 , b^2-4ac>=0" を満たすものとする。 # 解の公式は {-b±√(b^2-4ac)}/(2a) を使うこと。 # # 2.解の公式を使って解く上記方法には問題点があります。 # 上記問題点とは、"a=0 , b^2-4ac<0"の時という意図ではありません、 # あくまで"a≠0 , b^2-4ac>=0"である前提での問題点です。 # その問題点がなんであるかを答え、 # その問題点を解決するプログラムを作成しなさい。 # # '二次方程式 "ax^2+bx+c=0" のxの解を"解の公式"を使って求め、表示しなさい。a,b,cは乱数によって決定されるdouble型の変数とする。a,b,cは "a≠0 , b^2-4ac>=0" を満たすものとする。解の公式は {-b±√(b^2-4ac)}/(2a) を使うこと。' :- 'a,b,cは乱数によって決定される'(_a,_b,_c), 'a,b,cは "a≠0 , b^2-4ac>=0" を満たすものとする。'(_a,_b,_c), '解の公式は {-b±√(b^2-4ac)}/(2a) を使うこと。'(_a,_b,_c,_解), 表示する(_a,_b,_c,_解). 'a,b,cは乱数によって決定される'(_a,_b,_c) :- 'aは0を避ける'(_a), _b is random(12) - 6, _c is random(12) - 6. 'aは0を避ける'(_a) :- _a is random(12) - 6, \+(_a = 0),!. 'aは0を避ける'(_a) :- 'aは0を避ける'(_a). 'a,b,cは "a≠0 , b^2-4ac>=0" を満たすものとする。'(_a,_b,_c) :- \+(_a = 0), _b ^ 2 - 4 * _a * _c >= 0.0. '解の公式は {-b±√(b^2-4ac)}/(2a) を使うこと。'(_a,_b,_c,虚根です) :- 'b^2-4ac < 0の場合'(_a,_b,_c),!. '解の公式は {-b±√(b^2-4ac)}/(2a) を使うこと。'(_a,_b,_c,_解) :- 'b^2-4ac=0の場合'(_a,_b,_c), _解 is (-1 * _b) / (2 * _a),!. '解の公式は {-b±√(b^2-4ac)}/(2a) を使うこと。'(_a,_b,_c,_解) :- _解 is (-1 * _b + sqrt(_b ^2 - 4 * _a * _c)) / (2 * _a). '解の公式は {-b±√(b^2-4ac)}/(2a) を使うこと。'(_a,_b,_c,_解) :- _解 is (-1 * _b - sqrt(_b ^2 - 4 * _a * _c)) / (2 * _a). 'b^2-4ac=0の場合'(_a,_b,_c) :- _b ^ 2 - 4 * _a * _c = 0.0. 'b^2-4ac < 0の場合'(_a,_b,_c) :- _b ^ 2 - 4 * _a * _c < 0.0. 表示する(_a,_b,_c,_解) :- \+(number(_解)), writef('%t\n',[_解]),!. 表示する(_a,_b,_c,_解) :- writef('%tx^2+%tx+%t=0 の解は x = %t\n',[_a,_b,_c,_解]), fail. 表示する(_,_,_,_). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/31 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # # 以下の問題文の ^ はべき乗をあらわす記号とする。 # # 1.二次方程式 "ax^2+bx+c=0" のxの解を"解の公式"を使って求め、表示しなさい。 # a,b,cは乱数によって決定されるdouble型の変数とする。 # a,b,cは "a≠0 , b^2-4ac>=0" を満たすものとする。 # 解の公式は {-b±√(b^2-4ac)}/(2a) を使うこと。 # # 2.解の公式を使って解く上記方法には問題点があります。 # 上記問題点とは、"a=0 , b^2-4ac<0"の時という意図ではありません、 # あくまで"a≠0 , b^2-4ac>=0"である前提での問題点です。 # その問題点がなんであるかを答え、 # その問題点を解決するプログラムを作成しなさい。 # # '二次方程式 "ax^2+bx+c=0" のxの解を"解の公式"を使って求め、表示しなさい。a,b,cは乱数によって決定されるdouble型の変数とする。a,b,cは "a≠0 , b^2-4ac>=0" を満たすものとする。解の公式は {-b±√(b^2-4ac)}/(2a) を使うこと。' :- 'a,b,cは乱数によって決定される'(_a,_b,_c), 'a,b,cは "a≠0 , b^2-4ac>=0" を満たすものとする。'(_a,_b,_c), '解の公式は {-b±√(b^2-4ac)}/(2a) を使うこと。'(_a,_b,_c,_解), 表示する(_a,_b,_c,_解). 'a,b,cは乱数によって決定される'(_a,_b,_c) :- 'aは0を避ける'(_a), _b is random(12) - 6, _c is random(12) - 6. 'aは0を避ける'(_a) :- _a is random(12) - 6, \+(_a = 0),!. 'aは0を避ける'(_a) :- 'aは0を避ける'(_a). 'a,b,cは "a≠0 , b^2-4ac>=0" を満たすものとする。'(_a,_b,_c) :- \+(_a = 0), _b ^ 2 - 4 * _a * _c >= 0.0. '解の公式は {-b±√(b^2-4ac)}/(2a) を使うこと。'(_a,_b,_c,_解) :- _解 is (-1 * _b + sqrt(_b ^2 - 4 * _a * _c)) / (2 * _a). '解の公式は {-b±√(b^2-4ac)}/(2a) を使うこと。'(_a,_b,_c,_解) :- _解 is (-1 * _b - sqrt(_b ^2 - 4 * _a * _c)) / (2 * _a). 表示する(_a,_b,_c,_解) :- writef('%tx^2+%tx+%t=0 の解は x = %t\n',[_a,_b,_c,_解]), fail. 表示する(_,_,_,_). % 以下のサイトは # [1,2,3,4,5]というリストを受け取って、 # [[],[1],[2],[3],[4],[5],[1,2],[2,3],[3,4],[4,5],[5,1],[1,2,3]...]というリストを返す関数を作りたい 冪集合(_集合,_冪集合) :- findall(L,部分集合(_集合,L),_冪集合). 部分集合(L,X) :- length(L,M), for(1,N,M), 組合せ(L,N,X). 部分集合(_,[]). 組合せ(L,1,[A]) :- member(A,L). 組合せ([A|R1],N,[A|R3]) :- N > 1, N_1 is N - 1, 組合せ(R1,N_1,R3). 組合せ([_|R1],N,L) :- N > 1, 組合せ(R1,N,L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/158 # # [1] 授業単元:べき乗計算の関数 # [2] 問題文(含コード&リンク): # この問題では、全て正の整数の入力にのみ対応することとする。 # べき乗(nのk乗)を求める関数int power(int n, int k)を作成し、テスト用のmainプログラムを作成して、 # 咲き制した関数の動作確認を行いなさい。 # ならび冪乗(_n,_k,_冪乗) :- integer(_冪乗), length(_ならび冪乗,_冪乗), 上限付きlength(Ln,_ならび冪乗,_n), 上限付きlength(Ln1,_ならび冪乗,_n), 上限付きlength(Lk1,_ならび冪乗,_k), Lk1 = [_|Lk], ならび冪乗(Ln,Ln1,Lk,_ならび冪乗). ならび冪乗(_n,_k,_冪乗) :- var(_冪乗), length(Ln,_n), length(Ln1,_n), length(Lk1,_k), Lk1 = [_|Lk], ならび冪乗(Ln,Ln1,Lk,_ならび冪乗), length(_ならび冪乗,_冪乗). ならび冪乗(Ln,Ln1,[],Ln). ならび冪乗(Ln,Ln1,[_|Lk],_ならび冪乗) :- findall(Ln1,( append(_,[_|_],Ln)),LLn), flatten(LLn,Ln2), ならび冪乗(Ln2,Ln1,Lk,_ならび冪乗). '上限付きlength'(L,MaxL,Len) :- length(L,Len), length(MaxL,Max), ( Len > Max, !, fail ; true ). % 以下のサイトは # prologでの冪集合が難しい。でも、たぶんできると思う。 冪集合(_集合,_冪集合) :- length(_集合,Len), length(LL,Len), findall(L2,( append(L,[_|_],[_|LL]), length(L,N), 組合せ(_集合,L,L2)), LL2), _冪集合 = [[]|LL2],!. '組合せ'(X,[_],[A]) :- member(A,X) . '組合せ'([A|Y],[_|L],[A|X]) :- '組合せ'(Y,L,X) . '組合せ'([_|Y],L,A) :- \+(L = [_]), '組合せ'(Y,L,A) . % 以下のサイトは # prologでの冪集合が難しい。でも、たぶんできると思う。 冪集合(_集合,_冪集合) :- length(_集合,Len), findall(L,( for(1,N,Len), 組合せ(_集合,N,L)), LL), _冪集合 = [[]|LL],!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 組合せ(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). for(S,N,E) :- E >= S, for_2(S,N,E). for(S,N,E) :- E < S, for_1(S,N,E). for_1(S,_,E) :- S < E,!,fail. for_1(N,N,E). for_1(S,N,E) :- S1 is S - 1,for_1(S1,N,E). for_2(S,_,E) :- S > E,!,fail. for_2(N,N,E). for_2(S,N,E) :- S1 is S + 1,for_2(S1,N,E). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/373 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # # 以下の問題文の ^ はべき乗をあらわす記号とする。 # # 1.二次方程式 "ax^2+bx+c=0" のxの解を"解の公式"を使って求め、表示しなさい。 # a,b,cは乱数によって決定されるdouble型の変数とする。 # a,b,cは "a≠0 , b^2-4ac>=0" を満たすものとする。 # 解の公式は {-b±√(b^2-4ac)}/(2a) を使うこと。 # # '二次方程式 "ax^2+bx+c=0" のxの解を"解の公式"を使って求め、表示する'(_a,_b,_c) :- \+(_a = 0),\+(_a = 0.0), _b ^ 2 - 4 * _a * _c >= 0, X_1 is ((-1) * _b + sqrt(_b ^ 2 - 4 * _a * _c)) / ( 2 * _a), X_2 is ((-1) * _b - sqrt(_b ^ 2 - 4 * _a * _c)) / ( 2 * _a), write_formatted('%tx^2+%tx+%t=0 の解は\n',[_a,_b,_c]), write_formatted('x = %t または x = %t\n',[X_1,X_2]). '二次方程式 "ax^2+bx+c=0" のxの解を"解の公式"を使って求め、表示する'(_a,_b,_c) :- ((_a = 0);(_a = 0.0)), X is ((-1) * _c) / _b, write('これは二次方程式ではありません。一次方程式として解を求めます。\n'), write_formatted('%tx+%t=0 の解は\n',[_b,_c]), write_formatted('x = %t\n',[X]). '二次方程式 "ax^2+bx+c=0" のxの解を"解の公式"を使って求め、表示する'(_a,_b,_c) :- \+(_a = 0),\+(_a = 0.0), _b ^ 2 - 4 * _a * _c < 0, write_formatted('%tx^2+%tx+%t=0 の解は虚根となります\n',[_a,_b,_c]),!.