このディレクトリの索引

% 以下のサイトは # 出典 :: CodeIQ q1385 言語不問:通分と約分を実装しよう # # 小学生が分数を学ぶときに、最初に躓くのが「通分」です。 # # 分母の異なる分数の足し算や引き算を行うとき、先に通分を行っておく必要があります。 # # また、計算した結果、「約分」できる場合は、可能な限り簡単な分数にしないと正解になりません。 # # 【問題】 # # では、入力される二つの分数について足し算を行った時に、 # # 正しい答えを出力するプログラムを作り、 # # 問1〜問5の標準入力に対して、出力内容を答えてください。 # # ※分母が1の時には整数として出力してください。 # # ■例 # # 例1) # # 【標準入力】 # # 5/6 # # 1/10 # # 【標準出力】 # # 14/15 # # 例2) # # 【標準入力】 # # 1/3 # # 2/3 # # 【標準出力】 # # 1 # # ■問1〜5 # # 問1) # # 1/3 # # 2/7 # # 問2) # # 2/8 # # 3/5 # # 問3) # # 3/10 # # 1/6 # # 問4) # # 3/4 # # 5/8 # # 問5) # # 2/5 # # 2/3 # # 【解答方法】 # # 解答用テキストファイルanswer_q1385.txtをダウンロードし、必要事項をご記入ください。 # # 必須事項がすべて記入されていることをご確認いただいた後、テキストファイルのままアップロードしてください。 # # 【注意】 # # ・ご提出いただいたプログラムは個別に実行テストを行いますので、 # #  解答用テキストファイルに書かれた解答が正解していても最高評価になるとは限りません。 # # ・プログラミング言語は不問ですが、古すぎる実行環境・特殊な設備を要する実行環境では採点できない場合がございます。 # # ・使用する言語は1解答につき必ず1種類でお願いします。 # #  どうしても複数の言語を用いる場合は、解答に「メインの言語名」を明記してください。 # '問1〜問5の標準入力に対して、出力内容を答えてください。 ■問1〜5 問1) 1/3 2/7 問2) 2/8 3/5 問3) 3/10 1/6 問4) 3/4 5/8 問5) 2/5 2/3' :- between(1,5,N), '入力される二つの分数について足し算を行った時に、正しい答えを出力する', N = 5. '入力される二つの分数について足し算を行った時に、正しい答えを出力する' :- 入力される二つの分数(_分子_1 / _分母_1,_分子_2 / _分母_2), 分数の加算(_分子_1 / _分母_1,_分子_2 / _分母_2,_加算された分子 / _加算された分母), 約分(_加算された分子 / _加算された分母,_約分された分子 / _約分された分母), 答えを出力する(_約分された分子 / _約分された分母). 分数の加算(_分子_1 / _分母_1,_分子_2 / _分母_2,_加算された分子 / _通分された分母) :- 通分(_分子_1 / _分母_1,_分子_2 / _分母_2,_通分された分子_1 / _通分された分母,_通分された分子_2 / _通分された分母), _加算された分子 is _通分された分子_1 + _通分された分子_2,!. 入力される二つの分数(_分子_1 / _分母_1,_分子_2 / _分母_2) :- 入力される分数(_分子_1 / _分母_1), 入力される分数(_分子_2 / _分母_2). 入力される分数(_分子 / _分母) :- 行入力(_行), read_term_from_atom(_行,_分子 / _分母,[]). 行入力(_行) :- get_char(_先読み文字), 行ならびを得る(_先読み文字,_行ならび), atom_chars(_行,_行ならび). 行ならびを得る('\n',[]) :- !. 行ならびを得る(_先読み文字,[_先読み文字|R]) :- get_char(_次の文字), 行ならびを得る(_次の文字,R). 答えを出力する(_約分された分子 / _約分された分母) :- writef('%t\n',[_約分された分子 / _約分された分母]). 約分(_分子 / _分母,X) :- 最大公約数で分子分母を割って約分する(_分子,_分母,_分子_1,_分母_1), 負数の場合のマイナス符号は分子側に付ける(_分子_1,_分母_1,_分子_2,_分母_2), 分母が1の時は整数に変形(_分子_2,_分母_2,X). 最大公約数で分子分母を割って約分する(_分子_1,_分母_1,_分子,_分母) :- 最大公約数(_分子_1,_分母_1,_最大公約数), _分子 is _分子_1 // _最大公約数, _分母 is _分母_1 // _最大公約数. 負数の場合のマイナス符号は分子側に付ける(_分子_1,_分母_1,_分子,_分母) :- 分母が負数だったら分子分母ともに符号を反転する(_分子_1,_分母_1,_分子,_分母),!. 負数の場合のマイナス符号は分子側に付ける(_分子,_分母,_分子,_分母). 分母が負数だったら分子分母ともに符号を反転する(_分子_1,_分母_1,_分子,_分母) :- _分母_1 =< 0, _分子 is _分子_1 * -1, _分母 is _分母_1 * -1. 分母が1の時は整数に変形(_分子,1,_分子) :- !. 分母が1の時は整数に変形(_分子,1.0,_分子) :- !. 分母が1の時は整数に変形(_分子,_分母,_分子 / _分母). 通分(_分子_1 / _分母_1,_分子_2 / _分母_2,_通分された分子_1 / _最小公倍数,_通分された分子_2 / _最小公倍数) :- 最小公倍数([_分母_1,_分母_2],_最小公倍数), _通分された分子_1 is _分子_1 * (_最小公倍数 // _分母_1), _通分された分子_2 is _分子_2 * (_最小公倍数 // _分母_2). 最大公約数([_整数],_整数). 最大公約数([_整数|R],_最大公約数) :- 最大公約数(R,_最大公約数_2), 二つの整数の最大公約数(_整数,_最大公約数_2,_最大公約数). 二つの整数の最大公約数(M,N,X) :- 二つの整数の絶対値をとる(M,N,M_2,N_2), 最大公約数をユークリッドの互除法で求める(M_2,N_2,Y), 負数解の可能性も探る(M,M_2,N,N_2,Y,X). 負数解の可能性も探る(M,M_2,N,N_2,Y,X) :- setof(X,[M,M_2,N,N_2,Y,X] ^ 負数解の可能性(M,M_2,N,N_2,Y,X),L), member(X,L). 負数解の可能性(M,M_2,_,_,Y,X) :- X is Y * (M // M_2). 負数解の可能性(_,_,N,N_2,Y,X) :- X is Y * (N // N_2). 二つの整数の絶対値をとる(M,N,M_2,N_2) :- M_2 is abs(M), N_2 is abs(N). 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). 最小公倍数(_整数_1,_整数_2,_最小公倍数) :- 二つの整数の最小公倍数(_整数_1,_整数_2,_最小公倍数). 最小公倍数(_整数ならび,_最小公倍数) :- '最小公倍数とは、0ではない複数の整数の公倍数のうち最小のものをさす'(_整数ならび,_最小公倍数). '最小公倍数とは、0ではない複数の整数の公倍数のうち最小のものをさす'([_整数],_整数). '最小公倍数とは、0ではない複数の整数の公倍数のうち最小のものをさす'([_整数|R],_最小公倍数) :- '最小公倍数とは、0ではない複数の整数の公倍数のうち最小のものをさす'(R,_最小公倍数_1), 二つの整数の最小公倍数(_整数,_最小公倍数_1,_最小公倍数). 二つの整数の最小公倍数(A,B,X) :- 二つの整数の最大公約数(A,B,_最大公約数), X is A * B // _最大公約数. % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #353 # # 素数pと素数qから(p-1)と(q-1)の最小公倍数を求める。 # 最大p*qまでの数で、n*最小公倍数+1の集合を求める。 # この集合の中から、eで割り切れる数を探す。 # 例:p=5,q=7:(5-1)と(7-1)つまり4と6の最小公倍数は12。 # 例:p*q=35なので12+1,24+1,36+1(>35)つまり13と25。 # 例:25/5=5=dとなる。eは割り切れる数があらかじめ入力される。 '素数pと素数qから(p-1)と(q-1)の最小公倍数を求める。 最大p*qまでの数で、n*最小公倍数+1の集合を求める。 この集合の中から、eで割り切れる数を探す。'(_p,_q,_e,X) :- _n is _p * _q, '素数pと素数qから(p-1)と(q-1)の最小公倍数を求める。'(_p,_q,_最小公倍数), '最大p*qまでの数で、n*最小公倍数+1の集合を求める。'(_n,_最小公倍数,_集合), 'この集合の中から、eで割り切れる数を探す。'(_集合,_e,X). '素数pと素数qから(p-1)と(q-1)の最小公倍数を求める。'(_p,_q,_最小公倍数) :- _p_1 is _p - 1, _q_1 is _q - 1, 最小公倍数(_p_1,_q_1,_最小公倍数). '最大p*qまでの数で、n*最小公倍数+1の集合を求める。'(_n,_最小公倍数,_集合) :- findall(_s,( between(1,_n,_), _s is _n * _最小公倍数 + 1), _集合). 'この集合の中から、eで割り切れる数を探す。'(_集合,_e,X) :- member(X,_集合), 0 is X mod _e. 最小公倍数(A,B,X) :- 最大公約数をユークリッドの互除法で求める(A,B,C), X is A * B // C. 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). % 以下のサイトは 行列から行を取り出す(_行列,_行) :- 行列から行を取り出す(_行列,_,_行). 行列から行を取り出す(_行列,_行目,_行) :- nth1(_行目,_行列,_行). 行列から列を取り出す(_行列,_列) :- 行列から列を取り出す(_行列,_nth1,_列). 行列から列を取り出す(_行列,_列目,_列) :- 転置(_行列,_転置された行列), nth1(_列目,_転置された行列,_列). 行列の位置要素を取り出す(_行列,_行目,_列目,_要素) :- nth1(_行目,_行列,_行), nth1(_列目,_行,_要素). 行列の要素を置換する(_行列,_置換対象値,_置換値,_置換された行列) :- findall(_置換された行,( member(_行,_行列), 行を全置換する(_行,_置換対象値,_置換値,_置換された行)), _置換された行列). 行を全置換する([],_,_,[]). 行を全置換する([A|R1],A,B,[B|R4]) :- 行を全置換する(R1,A,B,R4),!. 行を全置換する([C|R1],A,B,[C|R4]) :- 行を全置換する(R1,A,B,R4). 行列の位置要素を置換する(_行列,_行目,_列目,_値,_置換された行列) :- 行を取り出す(_行列,_行目,_それまでの行ならび,_行,_それより後の行ならび), 行の列要素を置換する(_行,_列目,_値,_置換された行),!, append(_それまでの行ならび,[_置換された行|_それより後の行ならび],_置換された行列). 行を取り出す(_行列,_行目,_それまでの行ならび,_行,_それより後の行ならび) :- _行目_1 is _行目 - 1, length(_それまでの行ならび,_行目_1), append(_それまでの行ならび,[_行|_それより後の行ならび],_行列). 行の列要素を置換する(_行,_列目,_値,_置換された行) :- _列目_1 is _列目 - 1, length(L0,_列目_1), append(L0,[_|R],_行), append(L0,[_値|R],_置換された行). 行列の行を入れ替える(_行列,_行目_1,_行目_2,_入れ替えた行列) :- _行目_1 > _行目_2, 行列の行を入れ替える(_行列,_行目_2,_行目_1,_入れ替えた行列). 行列の行を入れ替える(_行列,_行目_1,_行目_2,_入れ替えた行列) :- _行目_1 < _行目_2, 行列の行を取り出す(_行列,_行目_2,_前ならび_2,_行_2,_後ろならび_2), 行列の行を取り出す(_前ならび_2,_行目_1,_前ならび_1,_行_1,_後ろならび_1), append(_前ならび_1,[_行_2|_後ろならび_1],_前ならび_2_2), append(_前ならび_2_2,[_行_1|_後ろならび_2],_入れ替えた行列). 行列の行を取り出す(_行列,_行目_2,_前ならび_2,_行_2,_後ろならび_2) :- _行目_2_1 is _行目_2 - 1, length(_前ならび_2,_行目_2_1), append(_前ならび_2,[_行_2|_後ろならび_2],_行列). 行列の行を取り出す(_前ならび_2,_行目_1,_前ならび_1,_行_1,_後ろならび_1) :- _行目_1_1 is _行目_1 - 1, length(_前ならび_1,_行目_1_1), append(_前ならび_1,[_行_1|_後ろならび_1],_前ならび_2). 行列の列を入れ替える(_行列,_列目_1,_列目_2,_入れ替えた行列) :- 転置(_行列,_転置された行列), 行列の行を入れ替える(_転置された行列,_列目_1,_列目_2,_入れ替えた転置された行列), 転置(_入れ替えた転置された行列,_入れ替えた行列). 行全体をn倍する(_行列,_行目,_n倍,_行がn倍された行列) :- _行目_1 is _行目 - 1, length(L0,_行目_1), append(L0,[_行|R],_行列), 行要素全てをn倍する(_行,_n倍,_全ての要素がn倍された行), append(L0,[_全ての要素がn倍された行|R],_行がn倍された行列). 行要素全てをn倍する([],_,[]) :- !. 行要素全てをn倍する([A|R1],_n倍,[B|R2]) :- B is A * _n倍, 行要素全てをn倍する(R1,_n倍,R2). 列全体をn倍する(_行列,_列目,_n倍,_列がn倍された行列) :- 転置(_行列,_転置された行列), 行全体をn倍する(_転置された行列,_列目,_n倍,_行がn倍された転置された行列), 転置(_行がn倍された転置された行列,_列がn倍された行列). 二つの行のある列要素がそれぞれの最小公倍数になるように二つの行を倍する(_行列,_行目_1,_行目_2,_列目,_変形した行列) :- 行列の位置要素を取り出す(_行列,_行目_1,_列目,_要素_1), 行列の位置要素を取り出す(_行列,_行目_2,_列目,_要素_2), 最小公倍数を取る(_要素_1,_要素_2,_最小公倍数), _行目_1の倍数 is _最小公倍数 // _要素_1, _行目_2の倍数 is _最小公倍数 // _要素_2, 行全体をn倍する(_行列,_行目_1,_行目_1の倍数,_行列_2), 行全体をn倍する(_行列,_行目_2,_行目_2の倍数,_変形した行列). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/48 # # [1] 授業単元:関数ポインタ # [2] 問題文(含コード&amp;リンク):http://codepad.org/O3eDo7F3 # # 以下のプログラムは2つの整数を入力させ,各種処理を選び, # 計算した結果をファイルへ出力するものであるが,作成途中である. # 下記に従い,プログラムを完成させよ. # ・各処理を行う場合は関数ポインタ引数とするをprocess()用いる. # ・加算:tasu(),除算(商):waru(),除算(剰余):amari(), #  最大公約数:yakusu(),最小公倍数:baisu()を用いる. # ・除算は商と剰余を求める. # ・最大公約数は2つの整数で共通の約数のうち最大のもの, #  最小公倍数は2つの整数で共通の倍数のうち最小のものである. # ・結果は「14 ÷ 5 = 2 余り 4」や「6 と 4 の最小公倍数は 12」のように #  計算式等も含めkekka.txtへ出力する. # # #include< stdio.h > # #include< stdlib.h > # # int process(ここを書く); # int tasu(ここを書く); # int waru(ここを書く); # int amari(ここを書く); # int yakusu(ここを書く); # int baisu(ここを書く); # # int main() # { # FILE *fp; //結果を出力するファイルのファイルポインタ # # int a, b; // 入力する2つ整数 # int op; // 選択された処理を示す変数 # int result1, result2; // 演算結果を格納する変数 # # fp = fopen("kekka.txt","w"); // ファイルを開く # if(fp == NULL) # { # printf("ファイルオープンエラー \n"); # exit(1); # } # # printf("1つめの整数を入力してください:"); # scanf("%d", &a); # printf("2つめの整数を入力してください:"); # scanf("%d", &b); # printf("1:加算,2:除算,3:最大公約数,4:最小公倍数\n"); # do { # printf("演算の番号を入力してください:"); # scanf("%d", &op); # } while(op<1 || op>4); # # ここを書く # # fclose(fp); // ファイルを閉じる # return 0; # } # # int process(ここを書く) # { # ここを書く # } # # int tasu(ここを書く) # { # ここを書く # } # # int waru(ここを書く) # { # ここを書く # } # # int amari(ここを書く) # { # ここを書く # } # # int yakusu(ここを書く) # { # ここを書く # } # # int baisu(ここを書く) # { # ここを書く # } '2つの整数を入力させ,各種処理を選び, 計算した結果をファイルへ出力するものである. 下記に従い,プログラムを完成させよ. ・各処理を行う場合は関数ポインタ引数とするをprocess()用いる ・加算:tasu(),除算(商):waru(),除算(剰余):amari()  最大公約数:yakusu(),最小公倍数:baisu()を用いる. ・除算は商と剰余を求める. ・最大公約数は2つの整数で共通の約数のうち最大のもの,  最小公倍数は2つの整数で共通の倍数のうち最小のものである. ・結果は「14 ÷ 5 = 2 余り 4」や「6 と 4 の最小公倍数は 12」のように  計算式等も含めkekka.txtへ出力する.' :- open('kekka.txt',write,Outstream), 二つの整数と演算番号を得る(_一つ目の整数,_二つ目の整数), 演算処理と結果を表示する(Outstream,_一つ目の整数,_二つ目の整数,_演算番号), \+(between(1,4,_演算番号)), close(Outstream). 二つの整数と演算番号を得る(_一つ目の整数,_二つ目の整数,_演算番号) :- 整数を得る('1つめの整数を入力してください',true,_一つ目の整数), 整数を得る('2つめの整数を入力してください',true,_二つ目の整数), 整数を得る('演算子番号を入力してください\n1:加算,2:除算,3:最大公約数,4:最小公倍数',between(1,4,_演算番号),_演算番号). 演算処理と結果を表示する(Outstream,_一つ目の整数,_二つ目の整数,_演算番号) :- 整数を得る('演算番号を入力してください\n1:加算,2:除算,3:最大公約数,4:最小公倍数',true,_演算番号), 演算処理(_演算番号,_一つ目の整数,_二つ目の整数,_結果文字列), writef(Outstream,'%t\n',[_結果文字列]). 演算処理と結果を表示する(Outstream,_一つ目の整数,_二つ目の整数,_演算番号) :- 演算処理と結果を表示する(Outstream,_一つ目の整数,_二つ目の整数,_演算番号). 演算処理(1,_一つ目の整数,_二つ目の整数,_結果文字列) :- _結果 is _一つ目の整数 + _二つ目の整数, swritef(_結果文字列,'%t + %t = %t',[_一つ目の整数,_二つ目の整数,_結果]). 演算処理(2,_一つ目の整数,_二つ目の整数,_結果文字列) :- _商 is _一つ目の整数 // _二つ目の整数, _剰余 is _一つ目の整数 mod _二つ目の整数, swritef(_結果文字列,'%t %% %t = %t 余り %t',[_一つ目の整数,_二つ目の整数,_商,_剰余]). 演算処理(最大公約数,_一つ目の整数,_二つ目の整数,_結果文字列) :- 最大公約数(_一つ目の整数,_二つ目の整数,_結果), swritef(_結果文字列,'%t と %t の最大公約数は %t,[_一つ目の整数,_二つ目の整数,_結果]). 演算処理(4,_一つ目の整数,_二つ目の整数,_結果文字列) :- 最小公倍数(_一つ目の整数,_二つ目の整数,_結果), swritef(_結果文字列,'%t と %t の最小公倍数は %t,[_一つ目の整数,_二つ目の整数,_結果]). 演算処理(N,_,_,'終了します') :- \+(between(1,4,N)). 最大公約数(M,N,X) :- 最大公約数をユークリッドの互除法で求める(M,N,X),!. 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). 最小公倍数(M,N,X) :- 最大公約数をユークリッドの互除法で求める(M,N,Y), X is M * N // Y. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/323 # # [1] 授業単元: # [2] 問題文(含コード&リンク): # 西暦年数を与えて、その年の干支を求めるプログラムを作成せよ。 # 干支は、十干と十二支とをそろぞれサイクリックに変えながら組み合わせることによって60(10と12の最小公倍数)通りが得られる。 # 例:1989年は己巳。 # 基準年(1896). 基準年の干(丙). 基準年の支(申). '西暦年数を与えて、その年の干支を求める'(_西暦年,_干支) :- 基準年の干支を得る(_基準年,_基準年の干,_基準年の支), _何年後 is _西暦年 - _基準年, 干支(0,_何年後,_基準年の干,_基準年の支,_干支). 基準年の干支を得る(_基準年,_基準年の干,_基準年の支) :- 基準年(_基準年), 基準年の干(_基準年の干), 基準年の支(_基準年の支). 干支(_何年後,_何年後,_干,_支,_干支) :- atom_concat(_干,_支,_干支),!. 干支(_n年後_1,_何年後,_干_1,_支_1,_干支) :- 前年または翌年の干支を得る(_n年後_1,_干_1,_支_1,_n年後_2,_干_2,_支_2), 干支(_n年後_2,_何年後,_干_2,_支_2,_干支). 前年または翌年の干支を得る(_n年後_1,_干_1,_支_1,_n年後_2,_干_2,_支_2) :- _n年後_1 < 0, 前年の干支を得る(_n年後_1,_干_1,_支_1,_n年後_2,_干_2,_支_2). 前年または翌年の干支を得る(_n年後_1,_干_1,_支_1,_n年後_2,_干_2,_支_2) :- _n年後_1 >= 0, 翌年の干支を得る(_n年後_1,_干_1,_支_1,_n年後_2,_干_2,_支_2). 前年の干支を得る(_n年後_1,_干_1,_支_1,_n年後_2,_干_2,_支_2) :- _n年後_2 is _n年後_1 - 1, 十干巡回(_干_2,_干_1), 十二支巡回(_支_2,_支_1). 翌年の干支を得る(_n年後_1,_干_1,_支_1,_n年後_2,_干_2,_支_2) :- _n年後_2 is _n年後_1 + 1, 十干巡回(_干_1,_干_2), 十二支巡回(_支_1,_支_2). 十干巡回(甲,乙). 十干巡回(乙,丙). 十干巡回(丙,丁). 十干巡回(丁,戊). 十干巡回(戊,己). 十干巡回(己,庚). 十干巡回(庚,辛). 十干巡回(辛,壬). 十干巡回(壬,癸). 十干巡回(癸,甲). 十二支巡回(子,丑). 十二支巡回(丑,寅). 十二支巡回(寅,卯). 十二支巡回(卯,辰). 十二支巡回(辰,巳). 十二支巡回(巳,午). 十二支巡回(午,未). 十二支巡回(未,申). 十二支巡回(申,酉). 十二支巡回(酉,戌). 十二支巡回(戌,亥). 十二支巡回(亥,子). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/978 # # 【課題】http://www.dotup.org/uploda/www.dotup.org3052126.txt.html # 【形態】1. Javaアプリケーション(main()で開始) # 【GUI】4. 制限なし # 【期限】提出期限:6月4日 20時まで # 【Ver】java version "1.7.0_03" # 【 補足 】Java初心者なので教えていただけると幸いです。 # # # 最小公倍数と最大公約数 # # 2数MとNの最小公倍数と最大公約数を求める # # 整数を2 つM,N 入力して,その最小公倍数(LCM)と最大公約数(GCD) を求めて表示する # # for文で1つのソースコード # 「ユークリッドの互助法」でもう一つ作成する。 # # # 一応やってみましたが最小公倍数がうまく出力せずユークリッドを使用する方法はよくわかりませんでした。 # よろしくお願いします。 # ソース # import java.util.Scanner; # public class LCM_GCD { # # public static void main(String args[]) # { # # Scanner sc = new Scanner(System.in); # int i; # int j=0; # int m,n; # int a=0; # System.out.println("整数を2つ入力してください"); # m=sc.nextInt(); # n=sc.nextInt(); # # # for( i = 1; i <= n; i++) { # if(m*i % n == 0) { # a = i; # break; # } # } # # # # // for(i=1;i<=n;i++){ # //for(j=1;j<=m;j++){ # //if(m*i==n*j){ # //a=m*i; # //break; # //} # // } # //} # System.out.println("最小公倍数は"+a); # # # for(j=m;j>=1;j--){ # if(m%j==0&&n%j==0){ # break; # } # } # System.out.println("最大公約数は"+j); # # # # # } # # } 'ユークリッドの互除法により最大公約数を得る'(_m,_m,_m). 'ユークリッドの互除法により最大公約数を得る'(_m,_n,_最大公約数) :- _m > _n, _剰余 is _m mod _n, ユークリッドの互除法により最大公約数を得る(_m,_n,_剰余,_最大公約数). 'ユークリッドの互除法により最大公約数を得る'(_m,_n,_最大公約数) :- _m < _n, ユークリッドの互除法により最大公約数を得る(_n,_m,_最大公約数). ユークリッドの互除法により最大公約数を得る(_,_最大公約数,0,_最大公約数) :- !. ユークリッドの互除法により最大公約数を得る(_m,_n,_剰余,_最大公約数) :- 'ユークリッドの互除法により最大公約数を得る'(_n,_剰余,_最大公約数). 最小公倍数(_m,_n,_最小公倍数) :- Y is _m * _n, ユークリッドの互除法により最大公約数を得る(_m,_n,_最大公約数), _最小公倍数 is ( _m * _n ) // 最大公約数. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/83 # # [1] 授業単元:整数演算 # [2] 問題文(含コード&リンク):1個以上32個以下の正整数の最大・最小・最小公倍数・最大公約数を求めよ # 1個以上32個以下の正整数の最大・最小・最小公倍数・最大公約数を求めよ(_N個,_整数ならび,_最大,_最小,_最小公倍数,_最大公約数) :- _N個 >= 1,_N個 =< 32, 'N個の正の整数を得る'(_N個,_整数ならび), _整数ならび = [_最初の整数|_残りならび], 最大値と最小値を同時に取得する(_残りならび,_最初の整数,_最初の整数,_最大値,_最小値), 最大公約数(_整数ならび,_最大公約数), 最小公倍数(_整数ならび,_最小公倍数). 'N個の正の整数を得る'(_N個,_整数ならび) :- length(L,_N個), _整数ならび = L, findall(_正の整数,( append(_,[_正の整数|R],L), length([_正の整数|R],_残り個数), 正の整数を得る(_残り個数,_正の整数)), L). 正の整数を得る(_残り個数,_正の整数) :- write_formatted('正の整数を入力してください(残り%t個) : ',[_残り個数]), get_line(Line), 正の整数診断(Line,_正の整数),!. 正の整数を得る(_残り個数,_正の整数) :- 正の整数を得る(_残り個数,_正の整数). 正の整数診断(Line,_正の整数) :- atom_to_term(Line,_正の整数,_), integer(_正の整数), _正の整数 > 0,!. 正の整数診断(Line,_正の整数) :- write_formatted('入力された %t から正の整数は得られません。再入力をお願いします。',[Line]), fail. 最大公約数([N1|R],_最大公約数) :- 最大公約数の三(R,N1,_最大公約数). 最大公約数の三([],_最大公約数,_最大公約数). 最大公約数の三([N|R],_最大公約数_1,_最大公約数) :- 最大公約数(N,_最大公約数_1,_最大公約数_2), 最大公約数の三(R,_最大公約数_2,_最大公約数). 最小公倍数([N1|R],_最小公倍数) :- 最小公倍数の三(R,N1,_最小公倍数). 最小公倍数の三([],_最小公倍数,_最小公倍数). 最小公倍数の三([N|R],_最小公倍数_1,_最小公倍数) :- 最小公倍数(N,_最小公倍数_1,_最小公倍数_2), 最小公倍数の三(R,_最小公倍数_2,_最小公倍数). 最大公約数(M,N,X) :- 最大公約数をユークリッドの互除法で求める(M,N,X),!. 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). 最小公倍数(A,B,X) :- integer(A), integer(B), 最大公約数をユークリッドの互除法で求める(A,B,C), X is A * B // C. 最大値と最小値を同時に取得する([],_最大値,_最小値,_最大値,_最小値) :- 最大値と最小値を同時に取得する([N|R],_最大値_1,_最小値_1,_最大値,_最小値) :- N > _最大値, 最大値と最小値を同時に取得する(R,N,_最小値_1,_最大値,_最小値),!. 最大値と最小値を同時に取得する([N|R],_最大値_1,_最小値_1,_最大値,_最小値) :- N < _最小値, 最大値と最小値を同時に取得する(R,_最大値_1,N,_最大値,_最小値),!. 最大値と最小値を同時に取得する([N|R],_最大値_1,_最小値_1,_最大値,_最小値) :- 最大値と最小値を同時に取得する(R,_最大値_1,_最小値_1,_最大値,_最小値),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/89 # # [1] 授業単元:Cプログラミング入門2 # [2] 問題文(含コード&リンク): # 複数の自然数に対する最小公倍数を求めるプログラムを作成せよ。 # 最小公倍数を求める関数を作成する必要あり # int型のオーバーフローは考慮しないで良い。 # 関数名はlcm # int lcm(int num0,int num1) # num1 num2は入力値 # lcmの戻り値は最小公倍数 # 入力に関して:キーボードから入力する整数の個数を入力し(最大10)改行する次に指定した数の整数を入力するように作る # 最小公倍数(A,B,X) :- integer(A), integer(B), 最大公約数をユークリッドの互除法で求める(A,B,C), X is A * B // C. 最大公約数をユークリッドの互除法で求める(A,B,B) :- 0 is A mod B,!. 最大公約数をユークリッドの互除法で求める(A,B,C) :- Mod is A mod B, 最大公約数をユークリッドの互除法で求める(B,Mod,C). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/657 # # 【 課題 】 # (5)4つの相異なる1桁の正の整数がある。これらの最小公倍数として考えられる最大の値を求めるプログラム # # 【 形態 】http://ime.nu/www.javadrive.jp/install/jdk/で設定したのですが1でしょうか… # 【 期限 】12月16日です # 【 Ver  】1.6.0_22 # 【 補足 】ぎりぎりで丸投げですがよろしくお願いします! # # '4つの相異なる1桁の正の整数がある。これらの最小公倍数として考えられる最大の値を求める'(_4つの相異なる1桁の正の整数ならび,_最小公倍数) :- 最小公倍数として考えられる最大の値(_4つの相異なる1桁の正の整数ならび,_最小公倍数). 最小公倍数として考えられる最大の値([A,B],_最小公倍数) :- 最小公倍数(A,B,_最小公倍数),!. 最小公倍数として考えられる最大の値([A,B|R],_最小公倍数) :- 最小公倍数(A,B,_最小公倍数の一), 最小公倍数として考えられる最大の値([_最小公倍数の一|R],_最小公倍数). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/323 # # [1] 授業単元: # [2] 問題文(含コード&リンク): # 西暦年数を与えて、その年の干支を求めるプログラムを作成せよ。 # 干支は、十干と十二支とをそろぞれサイクリックに変えながら組み合わせることによって60(10と12の最小公倍数)通りが得られる。 # 例:1989年は己巳。 # 西暦年数を与えて、その年の干支を求める(_西暦年数,_干支) :- 基準年(_基準年), 西暦を年ならび表現に変換(_基準年,_基準年ならび表現), 西暦を年ならび表現に変換(_西暦年数,_西暦年ならび表現), 西暦年数を与えて、その年の干支を求める(_基準年ならび表現,_西暦年ならび表現,_干支). 西暦年数を与えて、その年の干支を求める(_基準年ならび表現,_西暦年ならび表現,_干支) :- _西暦年ならび表現 @=< _基準年ならび表現, 基準年起点の十干・十二支ならび(_基準年の十干ならび,_基準年の十二支ならび), 六十干支を遡って生成(_基準年ならび表現,_基準年の十干ならび,_基準年の十二支ならび,_西暦年ならび表現,_干支). 西暦年数を与えて、その年の干支を求める(_基準年ならび表現,_西暦年ならび表現,_干支) :- _西暦年ならび表現 @> _基準年ならび表現, 基準年起点の十干・十二支ならび(_基準年の十干ならび,_基準年の十二支ならび), 六十干支の生成(_基準年ならび表現,_基準年の十干ならび,_基準年の十二支ならび,_西暦年ならび表現,_干支). 西暦を年ならび表現に変換(_年,_年ならび表現) :- length(_年ならび表現,_年), all(_年ならび表現,年),!. 基準年起点の十干・十二支ならび(_基準年の十干ならび,_基準年の十二支ならび) :- 基準年の干(_基準年の干), 基準年の支(_基準年の支), findall(_干,十干(_,_干,_,_),L1), ならびの回転(右方向,L1,_基準年の十干ならび), _基準年の十干ならび = [_基準年の干|_], findall(_支,十二支(_支,_),L3), ならびの回転(右方向,L3,_基準年の十二支ならび), _基準年の十二支ならび = [_基準年の支|_],!. 基準年(2010). 基準年の干(庚). 基準年の支(寅). 六十干支を遡って生成(_西暦年ならび表現,[_十干|R1],[_十二支|R2],_西暦年ならび表現,_六十干支) :- atom_concat(_十干,_十二支,_六十干支). 六十干支を遡って生成([_|_年ならび表現],_十干ならび1,_十二支ならび1,_西暦年ならび表現,_六十干支) :- ならびの回転(右方向,_十干ならび1,_十干ならび2), ならびの回転(右方向,_十二支ならび1,_十二支ならび2),!, 六十干支を遡って生成(_年ならび表現,_十干ならび2,_十二支ならび2,_西暦年ならび表現,_六十干支). 六十干支の生成(_西暦年ならび表現,[_十干|_],[_十二支|_],_西暦年ならび表現,_六十干支) :- concat_atom([_十干,_十二支],_六十干支). 六十干支の生成(_年ならび表現,_十干ならび1,_十二支ならび1,_西暦年,_六十干支) :- ならびの回転(左方向,_十干ならび1,_十干ならび2), ならびの回転(左方向,_十二支ならび1,_十二支ならび2), 六十干支の生成([年|_年ならび表現],_十干ならび2,_十二支ならび2,_西暦年ならび表現,_六十干支). 十干(陽,甲,木の兄,きのえ). 十干(陰,乙,木の弟,きのと). 十干(陽,丙,火の兄,ひのえ). 十干(陰,丁,火の弟,ひのと). 十干(陽,戊,土の兄,つちのえ). 十干(陰,己,土の弟,つちのと). 十干(陽,庚,金の兄,かのえ). 十干(陰,辛,金の弟,かのと). 十干(陽,壬,水の兄,みずのえ). 十干(陰,癸,水の弟,みずのと). 十二支(子,ね). 十二支(丑,うし). 十二支(寅,とら). 十二支(卯,う). 十二支(辰,たつ). 十二支(巳,み). 十二支(午,うま). 十二支(未,ひつじ). 十二支(申,さる). 十二支(酉,とり). 十二支(戌,いぬ). 十二支(亥,い). ならびの回転(左方向,[A|R],L) :- append(R,[A],L). ならびの回転(右方向,L1,L) :- append(R,[A],L1), append([A],R,L). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 六十干支の生成(_六十干支ならび) :- findall(_十干,十干(_十干,_),_十干ならび), findall(_十二支,十二支(_十二支,_),_十二支ならび), 六十干支の生成(_十干ならび,_十二支ならび,_六十干支ならび). 六十干支の生成(_六十干支ならび) :- findall(_十干,十干(_十干,_),_十干ならび), findall(_十二支,十二支(_十二支,_),_十二支ならび), 六十干支の生成(_十干ならび,_十二支ならび,_六十干支ならび). 六十干支の生成([_十干|R1],[_十二支|R2],_六十干支) :- concat_atom([_十干,_十二支],_六十干支). 六十干支の生成(_十干ならび1,_十二支ならび1,_六十干支) :- ならびの回転(左方向,_十干ならび1,_十干ならび2), ならびの回転(左方向,_十二支ならび1,_十二支ならび2), 六十干支の生成(_十干ならび2,_十二支ならび2,_六十干支). 六十干支を遡って生成([_十干|R1],[_十二支|R2],_六十干支) :- atom_concat(_十干,_十二支,_六十干支). 六十干支を遡って生成(_十干ならび1,_十二支ならび1,_六十干支) :- ならびの回転(右方向,_十干ならび1,_十干ならび2), ならびの回転(右方向,_十二支ならび1,_十二支ならび2),!, 六十干支を遡って生成(_十干ならび2,_十二支ならび2,_六十干支). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1250204272/381 # # [1] 授業単元: 情報工学:数理I # [2] 問題文(含コード&リンク): ガウス行列を既約ガウス行列に変形する関数を定義せよ % *** user: '既約ガウス行列に変形' / 5 *** '既約ガウス行列に変形'(N,0,_,_行列,_行列) :- !. '既約ガウス行列に変形'(N,M,A,_行列1,_行列) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,0), M2 is M - 1, '既約ガウス行列に変形'(N,M2,A,_行列1,_行列). '既約ガウス行列に変形'(N,M,A,_行列1,_行列) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), \+(B = 0), /* '行基本変形3の適用'(A,B,M,N,_行列1,_行列2), */ '最小公倍数'(N2 * A,N1 * B,_), '行基本変形'(N1 # M - N2 # N,_行列1,_行列2), M2 is M - 1, '既約ガウス行列に変形'(N,M2,A,_行列2,_行列). % *** user: '既約ガウス行列に変形' / 3 *** '既約ガウス行列に変形'(1,_既約ガウス行列,_既約ガウス行列) :- !. '既約ガウス行列に変形'(N,_ガウス行列,_既約ガウス行列) :- list_nth(N,_ガウス行列,L0), '最初に現れる0ではない要素・位置'(1,L0,_列,Y), M is N - 1, list_nth(M,_ガウス行列,L), '既約ガウス行列に変形'(_列,M,Y,_ガウス行列,G1), N2 is N - 1, '既約ガウス行列に変形'(N2,G1,_既約ガウス行列),!. % *** user: '既約ガウス行列に変形' / 2 *** '既約ガウス行列に変形'(_ガウス行列,_既約ガウス行列) :- length(_ガウス行列,Len), '既約ガウス行列に変形'(Len,_ガウス行列,G1), '既約ガウス行列に変形の二'(1,Len,G1,_既約ガウス行列). 既約ガウス行列に変形の二(N,Len,_既約ガウス行列,_既約ガウス行列) :- N > Len,!. 既約ガウス行列に変形の二(N,Len,G,_既約ガウス行列) :- list_nth(N,G,_行), list_nth(N,_行,A), 行基本変形(1 / A # N,G,G1), N2 is N + 1, 既約ガウス行列に変形の二(N2,Len,G1,_既約ガウス行列). % *** user: 行基本変形3の適用 / 7 *** 行基本変形3の適用(A,B,M,N,_行列1,_行列2,N2) :- B >= 0, A2 is abs(A), B2 is abs(B), 最小公倍数(N1 * A2,N2 * B2,_), 行基本変形(N2#M-N1#N,_行列1,_行列2),!. 行基本変形3の適用(A,B,M,N,_行列1,_行列2,N2) :- B < 0, A2 is abs(A), B2 is abs(B), 最小公倍数(N1 * A2,N2 * B2,_), 行基本変形(N2#M+N1#N,_行列1,_行列2),!. % *** user: 行基本変形3の適用 / 6 *** 行基本変形3の適用(A,B,M,N,_行列1,_行列2) :- B >= 0, A2 is abs(A), B2 is abs(B), 最小公倍数(N1 * A2,N2 * B2,_), 行基本変形(N2#M-N1#N,_行列1,_行列2),!. 行基本変形3の適用(A,B,M,N,_行列1,_行列2) :- B < 0, A2 is abs(A), B2 is abs(B), 最小公倍数(N1 * A2,N2 * B2,_), 行基本変形(N2#M+N1#N,_行列1,_行列2),!. % *** user: '行基本変形' / 5 *** '行基本変形'(*,_乗数,_行目,_行列,X) :- '行基本変形'(*,_乗数,1,_行目,_行列,X) . % *** user: '行基本変形' / 3 *** '行基本変形'(_行列式,_行列,X) :- atom(_行列式), \+(_行列式 = []), & '行列式変換' # [2|pro], '行列式述語変換'(_行列式,P), '行基本変形'(P,_行列,X),!. '行基本変形'([],_行列,[]) :-!. '行基本変形'([N|R1],_行列,[L|R2]) :- !, list_nth(N,_行列,L), '行基本変形'(R1,_行列,R2),!. '行基本変形'(# _行目1 # _行目2,_行列,X) :- list_nth(_行目1,_行列,_行1), list_nth(_行目2,_行列,_行2), 'ならびの位置指定置換'(_行目2,_行1,_行列,_行列1), 'ならびの位置指定置換'(_行目1,_行2,_行列1,X),!. '行基本変形'(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- _乗数2 >= 0, _乗数1 >= 0, !, _乗数3 is -1 * _乗数2, '行基本変形'(_乗数1 # _行目1 + _乗数3 # _行目2,_行列,X),!. '行基本変形'(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- _乗数2 >= 0, _乗数1 < 0, _乗数3 is _乗数1 * (-1), !, '行基本変形'(_乗数3 # _行目1 + _乗数2 # _行目2,_行列,X),!. '行基本変形'(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- _乗数2 < 0, _乗数1 >= 0, _乗数3 is _乗数1 * (-1), !, '行基本変形'(_乗数3 # _行目1 + _乗数2 # _行目2,_行列,X),!. '行基本変形'(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- _乗数2 < 0, _乗数1 < 0, !, _乗数3 is -1 * _乗数2, '行基本変形'(_乗数1 # _行目1 + _乗数3 # _行目2,_行列,X),!. '行基本変形'(_乗数1 # _行目1 + _乗数2 # _行目2,_行列,X) :- !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行1) , U is A * _乗数1),_乗算された行1), findall(W,(member(B,_行2) , W is B * _乗数2),_乗算された行2), '型推論加算'([_乗算された行1,_乗算された行2],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X),!. '行基本変形'(# _行目1 + _乗数 # _行目2,_行列,X) :- !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行2) , U is A * _乗数),_乗算された行), '型推論加算'([_乗算された行,_行1],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X),!. '行基本変形'(# _行目1 - _乗数 # _行目2,_行列,X) :- !, _乗数2 is -1 * _乗数, '行基本変形'(# _行目1 + _乗数2 * _行目2,_行列,X),!. '行基本変形'(# _行目1 + _乗数 / _除数 * _行目2,_行列,X) :- integer(_除数), !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行2) , U is A * _乗数 // _除数),_除算された行), '型推論加算'([_行1,_除算された行],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X),!. '行基本変形'(# _行目1 + _乗数 / _除数 # _行目2,_行列,X) :- \+(integer(_除数)), !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行2) , U is A * _乗数 / _除数),_除算された行), '型推論加算'([_行1,_除算された行],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X),!. '行基本変形'(# _行目1 - _乗数 / _除数 # _行目2,_行列,X) :- !, _除数2 is -1 * _除数, '行基本変形'(# _行目1 + _乗数 / _除数2 * _行目2,_行列,X),!. '行基本変形'(_乗数 / _除数 # _行目,_行列,X) :- integer(_除数), !, list_nth(_行目,_行列,_行1), findall(X,(member(A,_行1) , X is A * _乗数 // _除数),_行2), replace_nth(1,_行目,_行2,_行列,X),!. '行基本変形'(_乗数 / _除数 # _行目,_行列,X) :- \+(integer(_除数)), !, list_nth(_行目,_行列,_行1), findall(X,(member(A,_行1) , X is A * _乗数 / _除数),_行2), replace_nth(1,_行目,_行2,_行列,X),!. '行基本変形'(_乗数 # _行目,_行列,X) :- !, list_nth(_行目,_行列,_行1), findall(X,(member(A,_行1) , X is A * _乗数),_行2), replace_nth(1,_行目,_行2,_行列,X),!. % *** user: 行基本変形 / 5 *** 行基本変形(*,_乗数,_行目,_行列,X) :- 行基本変形(*,_乗数,1,_行目,_行列,X). % *** user: 行基本変形 / 6 *** 行基本変形(*,_乗数,_行目,_行目,[_行1|R1],[_行2|R1]) :- findall(X,(member(A,_行1) , X is A * _乗数),_行2) . 行基本変形(*,_乗数,M,_行目,[_行|R1],[_行|R2]) :- M2 is M + 1, 行基本変形(*,_乗数,M2,_行目,R1,R2). % *** user: 正方行列の行列式の値 / 2 *** 正方行列の行列式の値(_正方行列,_行列式の値) :- ガウス行列に変形(_正方行列,X,Y), '行列式|C|の値'(X,Z1), ならびの積(Y,Z2), _行列式の値 is Z1 // Z2. % *** user: ならびの積 / 2 *** ならびの積([A],A) :- !. ならびの積([A|R],X) :- ならびの積(R,Y), X is A * Y. % *** user: '行列式|C|の値' / 2 *** '行列式|C|の値'(_行列,_値) :- length(_行列,Len), findall(U,(for(1,N,Len) , list_nth(N,_行列,_行) , list_nth(N,_行,U)),L), ならびの積(L,_値). 要素がゼロ以外に出会うまで([A|R],[],[A|R]) :- \+((A = 0;A=0.0)),!. 要素がゼロ以外に出会うまで([0|R],[0|R1],R2) :- 要素がゼロ以外に出会うまで(R,R1,R2). 要素がゼロ以外に出会うまで([0.0|R],[0.0|R1],R2) :- 要素がゼロ以外に出会うまで(R,R1,R2). 最初に現れる0ではない要素・位置(Nth,[X|_],Nth,X) :- \+((X = 0;X=0.0)),!. 最初に現れる0ではない要素・位置(Mth,[0|R],Nth,X) :- Mth_2 is Mth + 1, 最初に現れる0ではない要素・位置(Mth_2,R,Nth,X) . 最初に現れる0ではない要素・位置(Mth,[0.0|R],Nth,X) :- Mth_2 is Mth + 1, 最初に現れる0ではない要素・位置(Mth_2,R,Nth,X) . % *** user: ならびの位置指定置換 / 4 *** ならびの位置指定置換(1,A,[_|R],[A|R]) :- !. ならびの位置指定置換(N,A,[B|R1],[B|R2]) :- N1 is N - 1, ならびの位置指定置換(N1,A,R1,R2) . 最小公倍数(N1 * A,B,C) :- integer(B), 最小公倍数(A,B,C), N1 is C // A,!. 最小公倍数(A,N2 * B,C) :- integer(A), 最小公倍数(A,B,C), N2 is C // B,!. 最小公倍数(N1 * A,N2 * B,C) :- 最小公倍数(A,B,C), N1 is C // A, N2 is C // B,!. 最小公倍数(A,B,X) :- integer(A), integer(B), 最大公約数をユークリッドの互除法で求める(A,B,C), X is A * B // C. 最小公倍数([N1 * A|R],X) :- findall(U,member(_ * U,[N1 * A|R]),L1), 最小公倍数(L1,X), 最小公倍数_2([N1 * A|R],X),!. 最小公倍数([A,B],X) :- 最小公倍数(A,B,X),!. 最小公倍数([A|R],X) :- 最小公倍数(R,B), 最小公倍数(A,B,X),!. 最小公倍数_2([],_) :- !. 最小公倍数_2([N * A|R],Y) :- N is Y // A, 最小公倍数_2(R,Y),!. 最小公倍数_2([A|R],Y) :- integer(A), 最小公倍数_2(R,Y),!. 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1245853701/162 # # [1] 授業単元:数値計算 # [2] 問題文(含コード&リンク):の連立1次方程式の解をガウスの消去法用いて解くプログラムを作成しなさい。 #    (この行列を使用してください # {{10,-9,0,0,0,0,0,0}, # {-9,17,-8,0,0,0,0,0}, # {0,-8,17,-9,0,0,0,0}, # {0,0-9,13,-4,0,0,0}, # {0,0,0,-4,12,-8,0,0}, # {0,0,0,0,-8,10,-2,0}, # {0,0,0,0,0,-2,2,7}} % 以下の定義では必ずしもこの問題に必要としない行列処理の述語定義も含んで % います。 問題の行列([[10,-9,0,0,0,0,0,0], [-9,17,-8,0,0,0,0,0], [0,-8,17,-9,0,0,0,0], [0,0-9,13,-4,0,0,0], [0,0,0,-4,12,-8,0,0], [0,0,0,0,-8,10,-2,0], [0,0,0,0,0,-2,2,7]]). t310(_解ならび) :- 問題の行列(_問題の行列), 既約ガウス行列に変形(_問題の行列,_既約ガウス行列), findall(X,(member(L,_既約ガウス行列),last(L,X)),_解ならび). ガウス行列(_,[]) :- !. ガウス行列(L,[_行|R]) :- append(L,_,_行), 要素がゼロ以外に出会うまで(_行,P1,_), ガウス行列([0|P1],R). ガウス行列(_,[]) :- !. ガウス行列(L,[_行|R]) :- append(L,_,_行), 要素がゼロ以外に出会うまで(_行,P1,_), ガウス行列([0|P1],R). ガウス行列(_行列) :- ガウス行列([],_行列). % *** user: 'ガウス行列に変形' / 7 *** 'ガウス行列に変形'(N,M,Len,_,_行列,_行列,[]) :- M > Len,!. 'ガウス行列に変形'(N,M,Len,0,_行列1,X,UL) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), \+(B = 0), '行の置換'(N,M,_行列1,_行列2), M2 is N + 1, 'ガウス行列に変形'(N,M2,Len,B,_行列2,X,UL),!. 'ガウス行列に変形'(N,M,Len,0,_行列1,X,UL) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), B = 0, M2 is N + 1, 'ガウス行列に変形'(N,M2,Len,0,_行列1,X,UL),!. 'ガウス行列に変形'(N,M,Len,A,_行列1,X,[(-1)|R]) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,0), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列1,X,R),!. 'ガウス行列に変形'(N,M,Len,A,_行列1,X,[N1|R]) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), '最小公倍数'(N2 * A,N1 * B,_), N1 >= 0,!, '行基本変形'(N1 # M - N2 # N,_行列1,_行列2), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列2,X,R),!. 'ガウス行列に変形'(N,M,Len,A,_行列1,X,[N3|R]) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), '最小公倍数'(N2 * A,N1 * B,_), N1 < 0,!, N3 is N1 * (-1), '行基本変形'(N3 # M + N2 # N,_行列1,_行列2), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列2,X,R),!. % *** user: 'ガウス行列に変形' / 6 *** 'ガウス行列に変形'(N,M,Len,_,_行列,_行列) :- M > Len,!. 'ガウス行列に変形'(N,M,Len,0,_行列1,X) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), \+(B = 0), '行の置換'(N,M,_行列1,_行列2), M2 is N + 1, 'ガウス行列に変形'(N,M2,Len,B,_行列2,X),!. 'ガウス行列に変形'(N,M,Len,0,_行列1,X) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), B = 0, M2 is N + 1, 'ガウス行列に変形'(N,M2,Len,0,_行列1,X),!. 'ガウス行列に変形'(N,M,Len,A,_行列1,X) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,0), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列1,X),!. 'ガウス行列に変形'(N,M,Len,A,_行列1,X) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), '最小公倍数'(N2 * A,N1 * B,_), '行基本変形'(N1 # M - N2 # N,_行列1,_行列2), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列2,X),!. % *** user: ガウス行列に変形 / 5 *** ガウス行列に変形(N,Len,X,X,[]) :- N >= Len,!. ガウス行列に変形(N,Len,_行列1,X,UL) :- list_nth(N,_行列1,_行), list_nth(N,_行,A), M is N + 1, ガウス行列に変形(N,M,Len,A,_行列1,_行列2,UL1), N2 is N + 1, ガウス行列に変形(N2,Len,_行列2,X,UL2), append(UL1,UL2,UL). % *** user: ガウス行列に変形 / 4 *** ガウス行列に変形(N,Len,X,X) :- N >= Len,!. ガウス行列に変形(N,Len,_行列1,X) :- list_nth(N,_行列1,_行), list_nth(N,_行,A), M is N + 1, ガウス行列に変形(N,M,Len,A,_行列1,_行列2), N2 is N + 1, ガウス行列に変形(N2,Len,_行列2,X). % *** user: ガウス行列に変形 / 3 *** ガウス行列に変形(_行列,_ガウス行列,UL) :- length(_行列,Len), ガウス行列に変形(1,Len,_行列,_ガウス行列,UL). % *** user: ガウス行列に変形 / 2 *** ガウス行列に変形(_行列,_ガウス行列) :- length(_行列,Len), ガウス行列に変形(1,Len,_行列,_ガウス行列). 既約ガウス行列に変形(_ガウス行列,_既約ガウス行列) :- length(_ガウス行列,Len), 既約ガウス行列に変形(Len,_ガウス行列,G1), 既約ガウス行列に変形の二(1,Len,G1,_既約ガウス行列). % *** user: '既約ガウス行列に変形' / 5 *** '既約ガウス行列に変形'(N,0,_,_行列,_行列) :- !. '既約ガウス行列に変形'(N,M,A,_行列1,_行列) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,0), M2 is M - 1, '既約ガウス行列に変形'(N,M2,A,_行列1,_行列). '既約ガウス行列に変形'(N,M,A,_行列1,_行列) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), \+(B = 0), /* '行基本変形3の適用'(A,B,M,N,_行列1,_行列2), */ '最小公倍数'(N2 * A,N1 * B,_), '行基本変形'(N1 # M - N2 # N,_行列1,_行列2), M2 is M - 1, '既約ガウス行列に変形'(N,M2,A,_行列2,_行列). % *** user: '既約ガウス行列に変形' / 3 *** '既約ガウス行列に変形'(1,_既約ガウス行列,_既約ガウス行列) :- !. '既約ガウス行列に変形'(N,_ガウス行列,_既約ガウス行列) :- list_nth(N,_ガウス行列,L0), '最初に現れる0ではない要素・位置'(1,L0,_列,Y), M is N - 1, list_nth(M,_ガウス行列,L), '既約ガウス行列に変形'(_列,M,N,Y,_ガウス行列,G1), N2 is N - 1, '既約ガウス行列に変形'(N2,G1,_既約ガウス行列),!. % *** user: '既約ガウス行列に変形' / 2 *** 既約ガウス行列に変形(_行列,_既約ガウス行列) :- \+(ガウス行列(_行列)), ガウス行列に変形(_行列,_ガウス行列), 既約ガウス行列に変形(_ガウス行列,_既約ガウス行列),!. 既約ガウス行列に変形(_ガウス行列,_既約ガウス行列) :- length(_ガウス行列,Len), 既約ガウス行列に変形(Len,_ガウス行列,G1), 既約ガウス行列に変形の二(1,Len,G1,_既約ガウス行列). % *** user: '既約ガウス行列に変形の二' / 4 *** 既約ガウス行列に変形の二(N,Len,_既約ガウス行列,_既約ガウス行列) :- N > Len,!. 既約ガウス行列に変形の二(N,Len,G,_既約ガウス行列) :- list_nth(N,G,_行), list_nth(N,_行,A), 行基本変形(1 / A # N,G,G1), N2 is N + 1, 既約ガウス行列に変形の二(N2,Len,G1,_既約ガウス行列). % *** user: 行基本変形3の適用 / 7 *** 行基本変形3の適用(A,B,M,N,_行列1,_行列2,N2) :- B >= 0, A2 is abs(A), B2 is abs(B), 最小公倍数(N1 * A2,N2 * B2,_), 行基本変形(N2#M-N1#N,_行列1,_行列2),!. 行基本変形3の適用(A,B,M,N,_行列1,_行列2,N2) :- B < 0, A2 is abs(A), B2 is abs(B), 最小公倍数(N1 * A2,N2 * B2,_), 行基本変形(N2#M+N1#N,_行列1,_行列2),!. % *** user: 行基本変形3の適用 / 6 *** 行基本変形3の適用(A,B,M,N,_行列1,_行列2) :- B >= 0, A2 is abs(A), B2 is abs(B), 最小公倍数(N1 * A2,N2 * B2,_), 行基本変形(N2#M-N1#N,_行列1,_行列2),!. 行基本変形3の適用(A,B,M,N,_行列1,_行列2) :- B < 0, A2 is abs(A), B2 is abs(B), 最小公倍数(N1 * A2,N2 * B2,_), 行基本変形(N2#M+N1#N,_行列1,_行列2),!. % *** user: 行基本変形 / 3 *** 行基本変形(_行列式,_行列,X) :- atom(_行列式), \+(_行列式 = []), & 行列式変換#2.pro, 行列式述語変換(_行列式,P), 行基本変形(P,_行列,X),!. 行基本変形([],_行列,[]) :- !. 行基本変形([N|R1],_行列,[L|R2]) :- !, list_nth(N,_行列,L), 行基本変形(R1,_行列,R2),!. '行基本変形'(# _行目1 # _行目2,_行列,X) :- list_nth(_行目1,_行列,_行1), list_nth(_行目2,_行列,_行2), ならびの位置指定置換(_行目2,_行1,_行列,_行列1), ならびの位置指定置換(_行目1,_行2,_行列1,X),!. 行基本変形(_乗数1 # _行目1 + _乗数2 # _行目2,_行列,X) :- !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行1) , U is A * _乗数1),_乗算された行1), findall(W,(member(B,_行2) , W is B * _乗数2),_乗算された行2), 型推論加算([_乗算された行1,_乗算された行2],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X),!. 行基本変形(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- !, _乗数3 is -1 * _乗数2, 行基本変形(_乗数1 # _行目1 + _乗数3 # _行目2,_行列,X),!. 行基本変形( # _行目1 + _乗数 # _行目2,_行列,X) :- !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行2) , U is A * _乗数),_乗算された行), 型推論加算([_乗算された行,_行1],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X),!. 行基本変形( # _行目1 - _乗数 # _行目2,_行列,X) :- !, _乗数2 is -1 * _乗数, 行基本変形( # _行目1 + _乗数2 * _行目2,_行列,X),!. 行基本変形( # _行目1 + _乗数 / _除数 * _行目2,_行列,X) :- integer(_除数), !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行2) , U is A * _乗数 // _除数),_除算された行), 型推論加算([_行1,_除算された行],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X),!. 行基本変形( # _行目1 + _乗数 / _除数 # _行目2,_行列,X) :- \+(integer(_除数)), !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行2) , U is A * _乗数 / _除数),_除算された行), 型推論加算([_行1,_除算された行],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X),!. 行基本変形( # _行目1 - _乗数 / _除数 # _行目2,_行列,X) :- !, _除数2 is -1 * _除数, 行基本変形( # _行目1 + _乗数 / _除数2 * _行目2,_行列,X),!. 行基本変形(_乗数 / _除数 # _行目,_行列,X) :- integer(_除数), !, list_nth(_行目,_行列,_行1), findall(X,(member(A,_行1) , X is A * _乗数 // _除数),_行2), replace_nth(1,_行目,_行2,_行列,X),!. 行基本変形(_乗数 / _除数 # _行目,_行列,X) :- \+(integer(_除数)), !, list_nth(_行目,_行列,_行1), findall(X,(member(A,_行1) , X is A * _乗数 / _除数),_行2), replace_nth(1,_行目,_行2,_行列,X),!. 行基本変形(_乗数 # _行目,_行列,X) :- !, list_nth(_行目,_行列,_行1), findall(X,(member(A,_行1) , X is A * _乗数),_行2), replace_nth(1,_行目,_行2,_行列,X),!. % *** user: 行基本変形 / 5 *** 行基本変形(*,_乗数,_行目,_行列,X) :- 行基本変形(*,_乗数,1,_行目,_行列,X). % *** user: 行基本変形 / 6 *** 行基本変形(*,_乗数,_行目,_行目,[_行1|R1],[_行2|R1]) :- findall(X,(member(A,_行1) , X is A * _乗数),_行2) . 行基本変形(*,_乗数,M,_行目,[_行|R1],[_行|R2]) :- M2 is M + 1, 行基本変形(*,_乗数,M2,_行目,R1,R2). % *** user: 正方行列の行列式の値 / 2 *** 正方行列の行列式の値(_正方行列,_行列式の値) :- ガウス行列に変形(_正方行列,X,Y), '行列式|C|の値'(X,Z1), ならびの積(Y,Z2), _行列式の値 is Z1 // Z2. % *** user: ならびの積 / 2 *** ならびの積([A],A) :- !. ならびの積([A|R],X) :- ならびの積(R,Y), X is A * Y. % *** user: '行列式|C|の値' / 2 *** '行列式|C|の値'(_行列,_値) :- length(_行列,Len), findall(U,(for(1,N,Len) , list_nth(N,_行列,_行) , list_nth(N,_行,U)),L), ならびの積(L,_値). 要素がゼロ以外に出会うまで([A|R],[],[A|R]) :- \+((A = 0;A=0.0)),!. 要素がゼロ以外に出会うまで([0|R],[0|R1],R2) :- 要素がゼロ以外に出会うまで(R,R1,R2). 要素がゼロ以外に出会うまで([0.0|R],[0.0|R1],R2) :- 要素がゼロ以外に出会うまで(R,R1,R2). 最初に現れる0ではない要素・位置(Nth,[X|_],Nth,X) :- \+((X = 0;X=0.0)),!. 最初に現れる0ではない要素・位置(Mth,[0|R],Nth,X) :- Mth_2 is Mth + 1, 最初に現れる0ではない要素・位置(Mth_2,R,Nth,X). 最初に現れる0ではない要素・位置(Mth,[0.0|R],Nth,X) :- Mth_2 is Mth + 1, 最初に現れる0ではない要素・位置(Mth_2,R,Nth,X). % *** user: ならびの位置指定置換 / 4 *** ならびの位置指定置換(1,A,[_|R],[A|R]) :- !. ならびの位置指定置換(N,A,[B|R1],[B|R2]) :- N1 is N - 1, ならびの位置指定置換(N1,A,R1,R2) . 最小公倍数(N1 * A,B,C) :- integer(B), 最小公倍数(A,B,C), N1 is C // A,!. 最小公倍数(A,N2 * B,C) :- integer(A), 最小公倍数(A,B,C), N2 is C // B,!. 最小公倍数(N1 * A,N2 * B,C) :- 最小公倍数(A,B,C), N1 is C // A, N2 is C // B,!. 最小公倍数(A,B,X) :- integer(A), integer(B), 最大公約数をユークリッドの互除法で求める(A,B,C), X is A * B // C. 最小公倍数([N1 * A|R],X) :- findall(U,member(_ * U,[N1 * A|R]),L1), 最小公倍数(L1,X), 最小公倍数_2([N1 * A|R],X),!. 最小公倍数([A,B],X) :- 最小公倍数(A,B,X),!. 最小公倍数([A|R],X) :- 最小公倍数(R,B), 最小公倍数(A,B,X),!. 最小公倍数_2([],_) :- !. 最小公倍数_2([N * A|R],Y) :- N is Y // A, 最小公倍数_2(R,Y),!. 最小公倍数_2([A|R],Y) :- integer(A), 最小公倍数_2(R,Y),!. 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). % 以下のサイトは ガウス行列(_,[]) :- !. ガウス行列(L,[_行|R]) :- append(L,_,_行), 要素がゼロ以外に出会うまで(_行,P1,_), ガウス行列([0|P1],R). ガウス行列(_,[]) :- ! . ガウス行列(L,[_行|R]) :- append(L,_,_行), 要素がゼロ以外に出会うまで(_行,P1,_), ガウス行列([0|P1],R) . ガウス行列(_行列) :- ガウス行列([],_行列) . % *** user: 'ガウス行列に変形' / 7 *** 'ガウス行列に変形'(N,M,Len,_,_行列,_行列,[]) :- M > Len, ! . 'ガウス行列に変形'(N,M,Len,0,_行列1,X,UL) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), \+(B = 0), '行の置換'(N,M,_行列1,_行列2), M2 is N + 1, 'ガウス行列に変形'(N,M2,Len,B,_行列2,X,UL), ! . 'ガウス行列に変形'(N,M,Len,0,_行列1,X,UL) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), B = 0, M2 is N + 1, 'ガウス行列に変形'(N,M2,Len,0,_行列1,X,UL), ! . 'ガウス行列に変形'(N,M,Len,A,_行列1,X,[(-1)|R]) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,0), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列1,X,R), ! . 'ガウス行列に変形'(N,M,Len,A,_行列1,X,[N1|R]) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), '最小公倍数'(N2 * A,N1 * B,_), N1 >= 0,!, '行基本変形'(N1 # M - N2 # N,_行列1,_行列2), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列2,X,R), ! . 'ガウス行列に変形'(N,M,Len,A,_行列1,X,[N3|R]) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), '最小公倍数'(N2 * A,N1 * B,_), N1 < 0,!, N3 is N1 * (-1), '行基本変形'(N3 # M + N2 # N,_行列1,_行列2), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列2,X,R), ! . % *** user: 'ガウス行列に変形' / 6 *** 'ガウス行列に変形'(N,M,Len,_,_行列,_行列) :- M > Len, ! . 'ガウス行列に変形'(N,M,Len,0,_行列1,X) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), \+(B = 0), '行の置換'(N,M,_行列1,_行列2), M2 is N + 1, 'ガウス行列に変形'(N,M2,Len,B,_行列2,X), ! . 'ガウス行列に変形'(N,M,Len,0,_行列1,X) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), B = 0, M2 is N + 1, 'ガウス行列に変形'(N,M2,Len,0,_行列1,X), ! . 'ガウス行列に変形'(N,M,Len,A,_行列1,X) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,0), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列1,X), ! . 'ガウス行列に変形'(N,M,Len,A,_行列1,X) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), '最小公倍数'(N2 * A,N1 * B,_), '行基本変形'(N1 # M - N2 # N,_行列1,_行列2), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列2,X), ! . % *** user: ガウス行列に変形 / 5 *** ガウス行列に変形(N,Len,X,X,[]) :- N >= Len, !. ガウス行列に変形(N,Len,_行列1,X,UL) :- list_nth(N,_行列1,_行), list_nth(N,_行,A), M is N + 1, ガウス行列に変形(N,M,Len,A,_行列1,_行列2,UL1), N2 is N + 1, ガウス行列に変形(N2,Len,_行列2,X,UL2), append(UL1,UL2,UL). % *** user: ガウス行列に変形 / 4 *** ガウス行列に変形(N,Len,X,X) :- N >= Len, !. ガウス行列に変形(N,Len,_行列1,X) :- list_nth(N,_行列1,_行), list_nth(N,_行,A), M is N + 1, ガウス行列に変形(N,M,Len,A,_行列1,_行列2), N2 is N + 1, ガウス行列に変形(N2,Len,_行列2,X). % *** user: ガウス行列に変形 / 3 *** ガウス行列に変形(_行列,_ガウス行列,UL) :- length(_行列,Len), ガウス行列に変形(1,Len,_行列,_ガウス行列,UL). % *** user: ガウス行列に変形 / 2 *** ガウス行列に変形(_行列,_ガウス行列) :- length(_行列,Len), ガウス行列に変形(1,Len,_行列,_ガウス行列). % *** user: '既約ガウス行列に変形' / 5 *** '既約ガウス行列に変形'(N,0,_,_行列,_行列) :- ! . '既約ガウス行列に変形'(N,M,A,_行列1,_行列) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,0), M2 is M - 1, '既約ガウス行列に変形'(N,M2,A,_行列1,_行列) . '既約ガウス行列に変形'(N,M,A,_行列1,_行列) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), \+(B = 0), /* '行基本変形3の適用'(A,B,M,N,_行列1,_行列2), */ '最小公倍数'(N2 * A,N1 * B,_), '行基本変形'(N1 # M - N2 # N,_行列1,_行列2), M2 is M - 1, '既約ガウス行列に変形'(N,M2,A,_行列2,_行列) . % *** user: '既約ガウス行列に変形' / 2 *** '既約ガウス行列に変形'(_行列,_既約ガウス行列) :- \+('ガウス行列'(_行列)), 'ガウス行列に変形'(_行列,_ガウス行列), '既約ガウス行列に変形'(_ガウス行列,_既約ガウス行列), ! . '既約ガウス行列に変形'(_ガウス行列,_既約ガウス行列) :- length(_ガウス行列,Len), '既約ガウス行列に変形'(Len,_ガウス行列,G1), '既約ガウス行列に変形の二'(1,Len,G1,_既約ガウス行列) . % *** user: 行基本変形3の適用 / 7 *** 行基本変形3の適用(A,B,M,N,_行列1,_行列2,N2) :- B >= 0, A2 is abs(A), B2 is abs(B), 最小公倍数(N1 * A2,N2 * B2,_), 行基本変形(N2#M-N1#N,_行列1,_行列2),!. 行基本変形3の適用(A,B,M,N,_行列1,_行列2,N2) :- B < 0, A2 is abs(A), B2 is abs(B), 最小公倍数(N1 * A2,N2 * B2,_), 行基本変形(N2#M+N1#N,_行列1,_行列2),!. % *** user: 行基本変形3の適用 / 6 *** 行基本変形3の適用(A,B,M,N,_行列1,_行列2) :- B >= 0, A2 is abs(A), B2 is abs(B), 最小公倍数(N1 * A2,N2 * B2,_), 行基本変形(N2#M-N1#N,_行列1,_行列2),!. 行基本変形3の適用(A,B,M,N,_行列1,_行列2) :- B < 0, A2 is abs(A), B2 is abs(B), 最小公倍数(N1 * A2,N2 * B2,_), 行基本変形(N2#M+N1#N,_行列1,_行列2),!. % *** user: '行基本変形' / 5 *** '行基本変形'(*,_乗数,_行目,_行列,X) :- '行基本変形'(*,_乗数,1,_行目,_行列,X) . % *** user: '行基本変形' / 5 *** '行基本変形'(*,_乗数,_行目,_行列,X) :- '行基本変形'(*,_乗数,1,_行目,_行列,X) . % *** user: '行基本変形' / 3 *** '行基本変形'(_行列式,_行列,X) :- atom(_行列式), \+(_行列式 = []), & '行列式変換' # [2|pro], '行列式述語変換'(_行列式,P), '行基本変形'(P,_行列,X), ! . '行基本変形'([],_行列,[]) :- ! . '行基本変形'([N|R1],_行列,[L|R2]) :- !, list_nth(N,_行列,L), '行基本変形'(R1,_行列,R2), ! . '行基本変形'(# _行目1 # _行目2,_行列,X) :- list_nth(_行目1,_行列,_行1), list_nth(_行目2,_行列,_行2), 'ならびの位置指定置換'(_行目2,_行1,_行列,_行列1), 'ならびの位置指定置換'(_行目1,_行2,_行列1,X), ! . '行基本変形'(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- _乗数2 >= 0, _乗数1 >= 0, !, _乗数3 is -1 * _乗数2, '行基本変形'(_乗数1 # _行目1 + _乗数3 # _行目2,_行列,X), ! . '行基本変形'(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- _乗数2 >= 0, _乗数1 < 0, _乗数3 is _乗数1 * (-1), !, '行基本変形'(_乗数3 # _行目1 + _乗数2 # _行目2,_行列,X), ! . '行基本変形'(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- _乗数2 < 0, _乗数1 >= 0, _乗数3 is _乗数1 * (-1), !, '行基本変形'(_乗数3 # _行目1 + _乗数2 # _行目2,_行列,X), ! . '行基本変形'(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- _乗数2 < 0, _乗数1 < 0, !, _乗数3 is -1 * _乗数2, '行基本変形'(_乗数1 # _行目1 + _乗数3 # _行目2,_行列,X), ! . '行基本変形'(_乗数1 # _行目1 + _乗数2 # _行目2,_行列,X) :- !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行1) , U is A * _乗数1),_乗算された行1), findall(W,(member(B,_行2) , W is B * _乗数2),_乗算された行2), '型推論加算'([_乗算された行1,_乗算された行2],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X), ! . '行基本変形'(# _行目1 + _乗数 # _行目2,_行列,X) :- !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行2) , U is A * _乗数),_乗算された行), '型推論加算'([_乗算された行,_行1],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X), ! . '行基本変形'(# _行目1 - _乗数 # _行目2,_行列,X) :- !, _乗数2 is -1 * _乗数, '行基本変形'(# _行目1 + _乗数2 * _行目2,_行列,X), ! . '行基本変形'(# _行目1 + _乗数 / _除数 * _行目2,_行列,X) :- integer(_除数), !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行2) , U is A * _乗数 // _除数),_除算された行), '型推論加算'([_行1,_除算された行],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X), ! . '行基本変形'(# _行目1 + _乗数 / _除数 # _行目2,_行列,X) :- \+(integer(_除数)), !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行2) , U is A * _乗数 / _除数),_除算された行), '型推論加算'([_行1,_除算された行],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X), ! . '行基本変形'(# _行目1 - _乗数 / _除数 # _行目2,_行列,X) :- !, _除数2 is -1 * _除数, '行基本変形'(# _行目1 + _乗数 / _除数2 * _行目2,_行列,X), ! . '行基本変形'(_乗数 / _除数 # _行目,_行列,X) :- integer(_除数), !, list_nth(_行目,_行列,_行1), findall(X,(member(A,_行1) , X is A * _乗数 // _除数),_行2), replace_nth(1,_行目,_行2,_行列,X), ! . '行基本変形'(_乗数 / _除数 # _行目,_行列,X) :- \+(integer(_除数)), !, list_nth(_行目,_行列,_行1), findall(X,(member(A,_行1) , X is A * _乗数 / _除数),_行2), replace_nth(1,_行目,_行2,_行列,X), ! . '行基本変形'(_乗数 # _行目,_行列,X) :- !, list_nth(_行目,_行列,_行1), findall(X,(member(A,_行1) , X is A * _乗数),_行2), replace_nth(1,_行目,_行2,_行列,X), ! . % *** user: 行基本変形 / 5 *** 行基本変形(*,_乗数,_行目,_行列,X) :- 行基本変形(*,_乗数,1,_行目,_行列,X) . % *** user: 行基本変形 / 6 *** 行基本変形(*,_乗数,_行目,_行目,[_行1|R1],[_行2|R1]) :- findall(X,(member(A,_行1) , X is A * _乗数),_行2) . 行基本変形(*,_乗数,M,_行目,[_行|R1],[_行|R2]) :- M2 is M + 1, 行基本変形(*,_乗数,M2,_行目,R1,R2) . 要素がゼロ以外に出会うまで([A|R],[],[A|R]) :- \+((A = 0; A = 0.0)),!. 要素がゼロ以外に出会うまで([0|R],[0|R1],R2) :- 要素がゼロ以外に出会うまで(R,R1,R2). 要素がゼロ以外に出会うまで([0.0|R],[0.0|R1],R2) :- 要素がゼロ以外に出会うまで(R,R1,R2). 最初に現れる0ではない要素・位置(Nth,[X|_],Nth,X) :- \+((X = 0;X = 0.0)),!. 最初に現れる0ではない要素・位置(Mth,[0|R],Nth,X) :- Mth_2 is Mth + 1, 最初に現れる0ではない要素・位置(Mth_2,R,Nth,X) . 最初に現れる0ではない要素・位置(Mth,[0.0|R],Nth,X) :- Mth_2 is Mth + 1, 最初に現れる0ではない要素・位置(Mth_2,R,Nth,X) . 最小公倍数(N1 * A,B,C) :- integer(B), 最小公倍数(A,B,C), N1 is C // A,!. 最小公倍数(A,N2 * B,C) :- integer(A), 最小公倍数(A,B,C), N2 is C // B,!. 最小公倍数(N1 * A,N2 * B,C) :- 最小公倍数(A,B,C), N1 is C // A, N2 is C // B,!. 最小公倍数(A,B,X) :- integer(A), integer(B), 最大公約数をユークリッドの互除法で求める(A,B,C), X is A * B // C. 最小公倍数([N1 * A|R],X) :- findall(U,member(_ * U,[N1 * A|R]),L1), 最小公倍数(L1,X), 最小公倍数_2([N1 * A|R],X),!. 最小公倍数([A,B],X) :- 最小公倍数(A,B,X),!. 最小公倍数([A|R],X) :- 最小公倍数(R,B), 最小公倍数(A,B,X),!. 最小公倍数_2([],_) :- !. 最小公倍数_2([N * A|R],Y) :- N is Y // A, 最小公倍数_2(R,Y),!. 最小公倍数_2([A|R],Y) :- integer(A), 最小公倍数_2(R,Y),!. 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). % 以下のサイトは ガウス行列(_,[]) :- !. ガウス行列(L,[_行|R]) :- append(L,_,_行), 要素がゼロ以外に出会うまで(_行,P1,_), ガウス行列([0|P1],R). ガウス行列(_,[]) :- ! . ガウス行列(L,[_行|R]) :- append(L,_,_行), 要素がゼロ以外に出会うまで(_行,P1,_), ガウス行列([0|P1],R) . ガウス行列(_行列) :- ガウス行列([],_行列) . % *** user: 'ガウス行列に変形' / 7 *** 'ガウス行列に変形'(N,M,Len,_,_行列,_行列,[]) :- M > Len, ! . 'ガウス行列に変形'(N,M,Len,0,_行列1,X,UL) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), \+(B = 0), '行の置換'(N,M,_行列1,_行列2), M2 is N + 1, 'ガウス行列に変形'(N,M2,Len,B,_行列2,X,UL), ! . 'ガウス行列に変形'(N,M,Len,0,_行列1,X,UL) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), B = 0, M2 is N + 1, 'ガウス行列に変形'(N,M2,Len,0,_行列1,X,UL), ! . 'ガウス行列に変形'(N,M,Len,A,_行列1,X,[(-1)|R]) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,0), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列1,X,R), ! . 'ガウス行列に変形'(N,M,Len,A,_行列1,X,[N1|R]) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), '最小公倍数'(N2 * A,N1 * B,_), N1 >= 0,!, '行基本変形'(N1 # M - N2 # N,_行列1,_行列2), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列2,X,R), ! . 'ガウス行列に変形'(N,M,Len,A,_行列1,X,[N3|R]) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), '最小公倍数'(N2 * A,N1 * B,_), N1 < 0,!, N3 is N1 * (-1), '行基本変形'(N3 # M + N2 # N,_行列1,_行列2), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列2,X,R), ! . % *** user: 'ガウス行列に変形' / 6 *** 'ガウス行列に変形'(N,M,Len,_,_行列,_行列) :- M > Len, ! . 'ガウス行列に変形'(N,M,Len,0,_行列1,X) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), \+(B = 0), '行の置換'(N,M,_行列1,_行列2), M2 is N + 1, 'ガウス行列に変形'(N,M2,Len,B,_行列2,X), ! . 'ガウス行列に変形'(N,M,Len,0,_行列1,X) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), B = 0, M2 is N + 1, 'ガウス行列に変形'(N,M2,Len,0,_行列1,X), ! . 'ガウス行列に変形'(N,M,Len,A,_行列1,X) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,0), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列1,X), ! . 'ガウス行列に変形'(N,M,Len,A,_行列1,X) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), '最小公倍数'(N2 * A,N1 * B,_), '行基本変形'(N1 # M - N2 # N,_行列1,_行列2), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列2,X), ! . % *** user: ガウス行列に変形 / 5 *** ガウス行列に変形(N,Len,X,X,[]) :- N >= Len, !. ガウス行列に変形(N,Len,_行列1,X,UL) :- list_nth(N,_行列1,_行), list_nth(N,_行,A), M is N + 1, ガウス行列に変形(N,M,Len,A,_行列1,_行列2,UL1), N2 is N + 1, ガウス行列に変形(N2,Len,_行列2,X,UL2), append(UL1,UL2,UL). % *** user: ガウス行列に変形 / 4 *** ガウス行列に変形(N,Len,X,X) :- N >= Len, !. ガウス行列に変形(N,Len,_行列1,X) :- list_nth(N,_行列1,_行), list_nth(N,_行,A), M is N + 1, ガウス行列に変形(N,M,Len,A,_行列1,_行列2), N2 is N + 1, ガウス行列に変形(N2,Len,_行列2,X). % *** user: ガウス行列に変形 / 3 *** ガウス行列に変形(_行列,_ガウス行列,UL) :- length(_行列,Len), ガウス行列に変形(1,Len,_行列,_ガウス行列,UL). % *** user: ガウス行列に変形 / 2 *** ガウス行列に変形(_行列,_ガウス行列) :- length(_行列,Len), ガウス行列に変形(1,Len,_行列,_ガウス行列). % *** user: '既約ガウス行列に変形' / 5 *** '既約ガウス行列に変形'(N,0,_,_行列,_行列) :- ! . '既約ガウス行列に変形'(N,M,A,_行列1,_行列) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,0), M2 is M - 1, '既約ガウス行列に変形'(N,M2,A,_行列1,_行列) . '既約ガウス行列に変形'(N,M,A,_行列1,_行列) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), \+(B = 0), /* '行基本変形3の適用'(A,B,M,N,_行列1,_行列2), */ '最小公倍数'(N2 * A,N1 * B,_), '行基本変形'(N1 # M - N2 # N,_行列1,_行列2), M2 is M - 1, '既約ガウス行列に変形'(N,M2,A,_行列2,_行列) . % *** user: '既約ガウス行列に変形' / 2 *** '既約ガウス行列に変形'(_行列,_既約ガウス行列) :- \+('ガウス行列'(_行列)), 'ガウス行列に変形'(_行列,_ガウス行列), '既約ガウス行列に変形'(_ガウス行列,_既約ガウス行列), ! . '既約ガウス行列に変形'(_ガウス行列,_既約ガウス行列) :- length(_ガウス行列,Len), '既約ガウス行列に変形'(Len,_ガウス行列,G1), '既約ガウス行列に変形の二'(1,Len,G1,_既約ガウス行列) . % *** user: 行基本変形3の適用 / 7 *** 行基本変形3の適用(A,B,M,N,_行列1,_行列2,N2) :- B >= 0, A2 is abs(A), B2 is abs(B), 最小公倍数(N1 * A2,N2 * B2,_), 行基本変形(N2#M-N1#N,_行列1,_行列2),!. 行基本変形3の適用(A,B,M,N,_行列1,_行列2,N2) :- B < 0, A2 is abs(A), B2 is abs(B), 最小公倍数(N1 * A2,N2 * B2,_), 行基本変形(N2#M+N1#N,_行列1,_行列2),!. % *** user: 行基本変形3の適用 / 6 *** 行基本変形3の適用(A,B,M,N,_行列1,_行列2) :- B >= 0, A2 is abs(A), B2 is abs(B), 最小公倍数(N1 * A2,N2 * B2,_), 行基本変形(N2#M-N1#N,_行列1,_行列2),!. 行基本変形3の適用(A,B,M,N,_行列1,_行列2) :- B < 0, A2 is abs(A), B2 is abs(B), 最小公倍数(N1 * A2,N2 * B2,_), 行基本変形(N2#M+N1#N,_行列1,_行列2),!. % *** user: '行基本変形' / 5 *** '行基本変形'(*,_乗数,_行目,_行列,X) :- '行基本変形'(*,_乗数,1,_行目,_行列,X) . % *** user: '行基本変形' / 5 *** '行基本変形'(*,_乗数,_行目,_行列,X) :- '行基本変形'(*,_乗数,1,_行目,_行列,X) . % *** user: '行基本変形' / 3 *** '行基本変形'(_行列式,_行列,X) :- atom(_行列式), \+(_行列式 = []), & '行列式変換' # [2|pro], '行列式述語変換'(_行列式,P), '行基本変形'(P,_行列,X), ! . '行基本変形'([],_行列,[]) :- ! . '行基本変形'([N|R1],_行列,[L|R2]) :- !, list_nth(N,_行列,L), '行基本変形'(R1,_行列,R2), ! . '行基本変形'(# _行目1 # _行目2,_行列,X) :- list_nth(_行目1,_行列,_行1), list_nth(_行目2,_行列,_行2), 'ならびの位置指定置換'(_行目2,_行1,_行列,_行列1), 'ならびの位置指定置換'(_行目1,_行2,_行列1,X), ! . '行基本変形'(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- _乗数2 >= 0, _乗数1 >= 0, !, _乗数3 is -1 * _乗数2, '行基本変形'(_乗数1 # _行目1 + _乗数3 # _行目2,_行列,X), ! . '行基本変形'(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- _乗数2 >= 0, _乗数1 < 0, _乗数3 is _乗数1 * (-1), !, '行基本変形'(_乗数3 # _行目1 + _乗数2 # _行目2,_行列,X), ! . '行基本変形'(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- _乗数2 < 0, _乗数1 >= 0, _乗数3 is _乗数1 * (-1), !, '行基本変形'(_乗数3 # _行目1 + _乗数2 # _行目2,_行列,X), ! . '行基本変形'(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- _乗数2 < 0, _乗数1 < 0, !, _乗数3 is -1 * _乗数2, '行基本変形'(_乗数1 # _行目1 + _乗数3 # _行目2,_行列,X), ! . '行基本変形'(_乗数1 # _行目1 + _乗数2 # _行目2,_行列,X) :- !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行1) , U is A * _乗数1),_乗算された行1), findall(W,(member(B,_行2) , W is B * _乗数2),_乗算された行2), '型推論加算'([_乗算された行1,_乗算された行2],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X), ! . '行基本変形'(# _行目1 + _乗数 # _行目2,_行列,X) :- !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行2) , U is A * _乗数),_乗算された行), '型推論加算'([_乗算された行,_行1],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X), ! . '行基本変形'(# _行目1 - _乗数 # _行目2,_行列,X) :- !, _乗数2 is -1 * _乗数, '行基本変形'(# _行目1 + _乗数2 * _行目2,_行列,X), ! . '行基本変形'(# _行目1 + _乗数 / _除数 * _行目2,_行列,X) :- integer(_除数), !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行2) , U is A * _乗数 // _除数),_除算された行), '型推論加算'([_行1,_除算された行],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X), ! . '行基本変形'(# _行目1 + _乗数 / _除数 # _行目2,_行列,X) :- \+(integer(_除数)), !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行2) , U is A * _乗数 / _除数),_除算された行), '型推論加算'([_行1,_除算された行],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X), ! . '行基本変形'(# _行目1 - _乗数 / _除数 # _行目2,_行列,X) :- !, _除数2 is -1 * _除数, '行基本変形'(# _行目1 + _乗数 / _除数2 * _行目2,_行列,X), ! . '行基本変形'(_乗数 / _除数 # _行目,_行列,X) :- integer(_除数), !, list_nth(_行目,_行列,_行1), findall(X,(member(A,_行1) , X is A * _乗数 // _除数),_行2), replace_nth(1,_行目,_行2,_行列,X), ! . '行基本変形'(_乗数 / _除数 # _行目,_行列,X) :- \+(integer(_除数)), !, list_nth(_行目,_行列,_行1), findall(X,(member(A,_行1) , X is A * _乗数 / _除数),_行2), replace_nth(1,_行目,_行2,_行列,X), ! . '行基本変形'(_乗数 # _行目,_行列,X) :- !, list_nth(_行目,_行列,_行1), findall(X,(member(A,_行1) , X is A * _乗数),_行2), replace_nth(1,_行目,_行2,_行列,X), ! . % *** user: 行基本変形 / 5 *** 行基本変形(*,_乗数,_行目,_行列,X) :- 行基本変形(*,_乗数,1,_行目,_行列,X) . % *** user: 行基本変形 / 6 *** 行基本変形(*,_乗数,_行目,_行目,[_行1|R1],[_行2|R1]) :- findall(X,(member(A,_行1) , X is A * _乗数),_行2) . 行基本変形(*,_乗数,M,_行目,[_行|R1],[_行|R2]) :- M2 is M + 1, 行基本変形(*,_乗数,M2,_行目,R1,R2) . 要素がゼロ以外に出会うまで([A|R],[],[A|R]) :- \+((A = 0; A = 0.0)),!. 要素がゼロ以外に出会うまで([0|R],[0|R1],R2) :- 要素がゼロ以外に出会うまで(R,R1,R2). 要素がゼロ以外に出会うまで([0.0|R],[0.0|R1],R2) :- 要素がゼロ以外に出会うまで(R,R1,R2). 最初に現れる0ではない要素・位置(Nth,[X|_],Nth,X) :- \+((X = 0;X = 0.0)),!. 最初に現れる0ではない要素・位置(Mth,[0|R],Nth,X) :- Mth_2 is Mth + 1, 最初に現れる0ではない要素・位置(Mth_2,R,Nth,X) . 最初に現れる0ではない要素・位置(Mth,[0.0|R],Nth,X) :- Mth_2 is Mth + 1, 最初に現れる0ではない要素・位置(Mth_2,R,Nth,X) . 最小公倍数(N1 * A,B,C) :- integer(B), 最小公倍数(A,B,C), N1 is C // A,!. 最小公倍数(A,N2 * B,C) :- integer(A), 最小公倍数(A,B,C), N2 is C // B,!. 最小公倍数(N1 * A,N2 * B,C) :- 最小公倍数(A,B,C), N1 is C // A, N2 is C // B,!. 最小公倍数(A,B,X) :- integer(A), integer(B), 最大公約数をユークリッドの互除法で求める(A,B,C), X is A * B // C. 最小公倍数([N1 * A|R],X) :- findall(U,member(_ * U,[N1 * A|R]),L1), 最小公倍数(L1,X), 最小公倍数_2([N1 * A|R],X),!. 最小公倍数([A,B],X) :- 最小公倍数(A,B,X),!. 最小公倍数([A|R],X) :- 最小公倍数(R,B), 最小公倍数(A,B,X),!. 最小公倍数_2([],_) :- !. 最小公倍数_2([N * A|R],Y) :- N is Y // A, 最小公倍数_2(R,Y),!. 最小公倍数_2([A|R],Y) :- integer(A), 最小公倍数_2(R,Y),!. 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1250204272/381 # # [1] 授業単元: 情報工学:数理I # [2] 問題文(含コード&リンク): ガウス行列を既約ガウス行列に変形する関数を定義せよ % *** user: '既約ガウス行列に変形' / 5 *** '既約ガウス行列に変形'(N,0,_,_行列,_行列) :- !. '既約ガウス行列に変形'(N,M,A,_行列1,_行列) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,0), M2 is M - 1, '既約ガウス行列に変形'(N,M2,A,_行列1,_行列). '既約ガウス行列に変形'(N,M,A,_行列1,_行列) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), \+(B = 0), /* '行基本変形3の適用'(A,B,M,N,_行列1,_行列2), */ '最小公倍数'(N2 * A,N1 * B,_), '行基本変形'(N1 # M - N2 # N,_行列1,_行列2), M2 is M - 1, '既約ガウス行列に変形'(N,M2,A,_行列2,_行列). % *** user: '既約ガウス行列に変形' / 3 *** '既約ガウス行列に変形'(1,_既約ガウス行列,_既約ガウス行列) :- !. '既約ガウス行列に変形'(N,_ガウス行列,_既約ガウス行列) :- list_nth(N,_ガウス行列,L0), '最初に現れる0ではない要素・位置'(1,L0,_列,Y), M is N - 1, list_nth(M,_ガウス行列,L), '既約ガウス行列に変形'(_列,M,Y,_ガウス行列,G1), N2 is N - 1, '既約ガウス行列に変形'(N2,G1,_既約ガウス行列),!. % *** user: '既約ガウス行列に変形' / 2 *** '既約ガウス行列に変形'(_ガウス行列,_既約ガウス行列) :- length(_ガウス行列,Len), '既約ガウス行列に変形'(Len,_ガウス行列,G1), '既約ガウス行列に変形の二'(1,Len,G1,_既約ガウス行列). 既約ガウス行列に変形の二(N,Len,_既約ガウス行列,_既約ガウス行列) :- N > Len,!. 既約ガウス行列に変形の二(N,Len,G,_既約ガウス行列) :- list_nth(N,G,_行), list_nth(N,_行,A), 行基本変形(1 / A # N,G,G1), N2 is N + 1, 既約ガウス行列に変形の二(N2,Len,G1,_既約ガウス行列). % *** user: 行基本変形3の適用 / 7 *** 行基本変形3の適用(A,B,M,N,_行列1,_行列2,N2) :- B >= 0, A2 is abs(A), B2 is abs(B), 最小公倍数(N1 * A2,N2 * B2,_), 行基本変形(N2#M-N1#N,_行列1,_行列2),!. 行基本変形3の適用(A,B,M,N,_行列1,_行列2,N2) :- B < 0, A2 is abs(A), B2 is abs(B), 最小公倍数(N1 * A2,N2 * B2,_), 行基本変形(N2#M+N1#N,_行列1,_行列2),!. % *** user: 行基本変形3の適用 / 6 *** 行基本変形3の適用(A,B,M,N,_行列1,_行列2) :- B >= 0, A2 is abs(A), B2 is abs(B), 最小公倍数(N1 * A2,N2 * B2,_), 行基本変形(N2#M-N1#N,_行列1,_行列2),!. 行基本変形3の適用(A,B,M,N,_行列1,_行列2) :- B < 0, A2 is abs(A), B2 is abs(B), 最小公倍数(N1 * A2,N2 * B2,_), 行基本変形(N2#M+N1#N,_行列1,_行列2),!. % *** user: '行基本変形' / 5 *** '行基本変形'(*,_乗数,_行目,_行列,X) :- '行基本変形'(*,_乗数,1,_行目,_行列,X) . % *** user: '行基本変形' / 3 *** '行基本変形'(_行列式,_行列,X) :- atom(_行列式), \+(_行列式 = []), & '行列式変換' # [2|pro], '行列式述語変換'(_行列式,P), '行基本変形'(P,_行列,X),!. '行基本変形'([],_行列,[]) :-!. '行基本変形'([N|R1],_行列,[L|R2]) :- !, list_nth(N,_行列,L), '行基本変形'(R1,_行列,R2),!. '行基本変形'(# _行目1 # _行目2,_行列,X) :- list_nth(_行目1,_行列,_行1), list_nth(_行目2,_行列,_行2), 'ならびの位置指定置換'(_行目2,_行1,_行列,_行列1), 'ならびの位置指定置換'(_行目1,_行2,_行列1,X),!. '行基本変形'(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- _乗数2 >= 0, _乗数1 >= 0, !, _乗数3 is -1 * _乗数2, '行基本変形'(_乗数1 # _行目1 + _乗数3 # _行目2,_行列,X),!. '行基本変形'(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- _乗数2 >= 0, _乗数1 < 0, _乗数3 is _乗数1 * (-1), !, '行基本変形'(_乗数3 # _行目1 + _乗数2 # _行目2,_行列,X),!. '行基本変形'(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- _乗数2 < 0, _乗数1 >= 0, _乗数3 is _乗数1 * (-1), !, '行基本変形'(_乗数3 # _行目1 + _乗数2 # _行目2,_行列,X),!. '行基本変形'(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- _乗数2 < 0, _乗数1 < 0, !, _乗数3 is -1 * _乗数2, '行基本変形'(_乗数1 # _行目1 + _乗数3 # _行目2,_行列,X),!. '行基本変形'(_乗数1 # _行目1 + _乗数2 # _行目2,_行列,X) :- !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行1) , U is A * _乗数1),_乗算された行1), findall(W,(member(B,_行2) , W is B * _乗数2),_乗算された行2), '型推論加算'([_乗算された行1,_乗算された行2],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X),!. '行基本変形'(# _行目1 + _乗数 # _行目2,_行列,X) :- !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行2) , U is A * _乗数),_乗算された行), '型推論加算'([_乗算された行,_行1],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X),!. '行基本変形'(# _行目1 - _乗数 # _行目2,_行列,X) :- !, _乗数2 is -1 * _乗数, '行基本変形'(# _行目1 + _乗数2 * _行目2,_行列,X),!. '行基本変形'(# _行目1 + _乗数 / _除数 * _行目2,_行列,X) :- integer(_除数), !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行2) , U is A * _乗数 // _除数),_除算された行), '型推論加算'([_行1,_除算された行],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X),!. '行基本変形'(# _行目1 + _乗数 / _除数 # _行目2,_行列,X) :- \+(integer(_除数)), !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行2) , U is A * _乗数 / _除数),_除算された行), '型推論加算'([_行1,_除算された行],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X),!. '行基本変形'(# _行目1 - _乗数 / _除数 # _行目2,_行列,X) :- !, _除数2 is -1 * _除数, '行基本変形'(# _行目1 + _乗数 / _除数2 * _行目2,_行列,X),!. '行基本変形'(_乗数 / _除数 # _行目,_行列,X) :- integer(_除数), !, list_nth(_行目,_行列,_行1), findall(X,(member(A,_行1) , X is A * _乗数 // _除数),_行2), replace_nth(1,_行目,_行2,_行列,X),!. '行基本変形'(_乗数 / _除数 # _行目,_行列,X) :- \+(integer(_除数)), !, list_nth(_行目,_行列,_行1), findall(X,(member(A,_行1) , X is A * _乗数 / _除数),_行2), replace_nth(1,_行目,_行2,_行列,X),!. '行基本変形'(_乗数 # _行目,_行列,X) :- !, list_nth(_行目,_行列,_行1), findall(X,(member(A,_行1) , X is A * _乗数),_行2), replace_nth(1,_行目,_行2,_行列,X),!. % *** user: 行基本変形 / 5 *** 行基本変形(*,_乗数,_行目,_行列,X) :- 行基本変形(*,_乗数,1,_行目,_行列,X). % *** user: 行基本変形 / 6 *** 行基本変形(*,_乗数,_行目,_行目,[_行1|R1],[_行2|R1]) :- findall(X,(member(A,_行1) , X is A * _乗数),_行2) . 行基本変形(*,_乗数,M,_行目,[_行|R1],[_行|R2]) :- M2 is M + 1, 行基本変形(*,_乗数,M2,_行目,R1,R2). % *** user: 正方行列の行列式の値 / 2 *** 正方行列の行列式の値(_正方行列,_行列式の値) :- ガウス行列に変形(_正方行列,X,Y), '行列式|C|の値'(X,Z1), ならびの積(Y,Z2), _行列式の値 is Z1 // Z2. % *** user: ならびの積 / 2 *** ならびの積([A],A) :- !. ならびの積([A|R],X) :- ならびの積(R,Y), X is A * Y. % *** user: '行列式|C|の値' / 2 *** '行列式|C|の値'(_行列,_値) :- length(_行列,Len), findall(U,(for(1,N,Len) , list_nth(N,_行列,_行) , list_nth(N,_行,U)),L), ならびの積(L,_値). 要素がゼロ以外に出会うまで([A|R],[],[A|R]) :- \+((A = 0;A=0.0)),!. 要素がゼロ以外に出会うまで([0|R],[0|R1],R2) :- 要素がゼロ以外に出会うまで(R,R1,R2). 要素がゼロ以外に出会うまで([0.0|R],[0.0|R1],R2) :- 要素がゼロ以外に出会うまで(R,R1,R2). 最初に現れる0ではない要素・位置(Nth,[X|_],Nth,X) :- \+((X = 0;X=0.0)),!. 最初に現れる0ではない要素・位置(Mth,[0|R],Nth,X) :- Mth_2 is Mth + 1, 最初に現れる0ではない要素・位置(Mth_2,R,Nth,X) . 最初に現れる0ではない要素・位置(Mth,[0.0|R],Nth,X) :- Mth_2 is Mth + 1, 最初に現れる0ではない要素・位置(Mth_2,R,Nth,X) . % *** user: ならびの位置指定置換 / 4 *** ならびの位置指定置換(1,A,[_|R],[A|R]) :- !. ならびの位置指定置換(N,A,[B|R1],[B|R2]) :- N1 is N - 1, ならびの位置指定置換(N1,A,R1,R2) . 最小公倍数(N1 * A,B,C) :- integer(B), 最小公倍数(A,B,C), N1 is C // A,!. 最小公倍数(A,N2 * B,C) :- integer(A), 最小公倍数(A,B,C), N2 is C // B,!. 最小公倍数(N1 * A,N2 * B,C) :- 最小公倍数(A,B,C), N1 is C // A, N2 is C // B,!. 最小公倍数(A,B,X) :- integer(A), integer(B), 最大公約数をユークリッドの互除法で求める(A,B,C), X is A * B // C. 最小公倍数([N1 * A|R],X) :- findall(U,member(_ * U,[N1 * A|R]),L1), 最小公倍数(L1,X), 最小公倍数_2([N1 * A|R],X),!. 最小公倍数([A,B],X) :- 最小公倍数(A,B,X),!. 最小公倍数([A|R],X) :- 最小公倍数(R,B), 最小公倍数(A,B,X),!. 最小公倍数_2([],_) :- !. 最小公倍数_2([N * A|R],Y) :- N is Y // A, 最小公倍数_2(R,Y),!. 最小公倍数_2([A|R],Y) :- integer(A), 最小公倍数_2(R,Y),!. 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1245853701/162 # # [1] 授業単元:数値計算 # [2] 問題文(含コード&リンク):の連立1次方程式の解をガウスの消去法用いて解くプログラムを作成しなさい。 #    (この行列を使用してください # {{10,-9,0,0,0,0,0,0}, # {-9,17,-8,0,0,0,0,0}, # {0,-8,17,-9,0,0,0,0}, # {0,0-9,13,-4,0,0,0}, # {0,0,0,-4,12,-8,0,0}, # {0,0,0,0,-8,10,-2,0}, # {0,0,0,0,0,-2,2,7}} % 以下の定義では必ずしもこの問題に必要としない行列処理の述語定義も含んで % います。 問題の行列([[10,-9,0,0,0,0,0,0], [-9,17,-8,0,0,0,0,0], [0,-8,17,-9,0,0,0,0], [0,0-9,13,-4,0,0,0], [0,0,0,-4,12,-8,0,0], [0,0,0,0,-8,10,-2,0], [0,0,0,0,0,-2,2,7]]). t310(_解ならび) :- 問題の行列(_問題の行列), 既約ガウス行列に変形(_問題の行列,_既約ガウス行列), findall(X,(member(L,_既約ガウス行列),last(L,X)),_解ならび). ガウス行列(_,[]) :- !. ガウス行列(L,[_行|R]) :- append(L,_,_行), 要素がゼロ以外に出会うまで(_行,P1,_), ガウス行列([0|P1],R). ガウス行列(_,[]) :- !. ガウス行列(L,[_行|R]) :- append(L,_,_行), 要素がゼロ以外に出会うまで(_行,P1,_), ガウス行列([0|P1],R). ガウス行列(_行列) :- ガウス行列([],_行列). % *** user: 'ガウス行列に変形' / 7 *** 'ガウス行列に変形'(N,M,Len,_,_行列,_行列,[]) :- M > Len,!. 'ガウス行列に変形'(N,M,Len,0,_行列1,X,UL) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), \+(B = 0), '行の置換'(N,M,_行列1,_行列2), M2 is N + 1, 'ガウス行列に変形'(N,M2,Len,B,_行列2,X,UL),!. 'ガウス行列に変形'(N,M,Len,0,_行列1,X,UL) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), B = 0, M2 is N + 1, 'ガウス行列に変形'(N,M2,Len,0,_行列1,X,UL),!. 'ガウス行列に変形'(N,M,Len,A,_行列1,X,[(-1)|R]) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,0), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列1,X,R),!. 'ガウス行列に変形'(N,M,Len,A,_行列1,X,[N1|R]) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), '最小公倍数'(N2 * A,N1 * B,_), N1 >= 0,!, '行基本変形'(N1 # M - N2 # N,_行列1,_行列2), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列2,X,R),!. 'ガウス行列に変形'(N,M,Len,A,_行列1,X,[N3|R]) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), '最小公倍数'(N2 * A,N1 * B,_), N1 < 0,!, N3 is N1 * (-1), '行基本変形'(N3 # M + N2 # N,_行列1,_行列2), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列2,X,R),!. % *** user: 'ガウス行列に変形' / 6 *** 'ガウス行列に変形'(N,M,Len,_,_行列,_行列) :- M > Len,!. 'ガウス行列に変形'(N,M,Len,0,_行列1,X) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), \+(B = 0), '行の置換'(N,M,_行列1,_行列2), M2 is N + 1, 'ガウス行列に変形'(N,M2,Len,B,_行列2,X),!. 'ガウス行列に変形'(N,M,Len,0,_行列1,X) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), B = 0, M2 is N + 1, 'ガウス行列に変形'(N,M2,Len,0,_行列1,X),!. 'ガウス行列に変形'(N,M,Len,A,_行列1,X) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,0), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列1,X),!. 'ガウス行列に変形'(N,M,Len,A,_行列1,X) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), '最小公倍数'(N2 * A,N1 * B,_), '行基本変形'(N1 # M - N2 # N,_行列1,_行列2), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列2,X),!. % *** user: ガウス行列に変形 / 5 *** ガウス行列に変形(N,Len,X,X,[]) :- N >= Len,!. ガウス行列に変形(N,Len,_行列1,X,UL) :- list_nth(N,_行列1,_行), list_nth(N,_行,A), M is N + 1, ガウス行列に変形(N,M,Len,A,_行列1,_行列2,UL1), N2 is N + 1, ガウス行列に変形(N2,Len,_行列2,X,UL2), append(UL1,UL2,UL). % *** user: ガウス行列に変形 / 4 *** ガウス行列に変形(N,Len,X,X) :- N >= Len,!. ガウス行列に変形(N,Len,_行列1,X) :- list_nth(N,_行列1,_行), list_nth(N,_行,A), M is N + 1, ガウス行列に変形(N,M,Len,A,_行列1,_行列2), N2 is N + 1, ガウス行列に変形(N2,Len,_行列2,X). % *** user: ガウス行列に変形 / 3 *** ガウス行列に変形(_行列,_ガウス行列,UL) :- length(_行列,Len), ガウス行列に変形(1,Len,_行列,_ガウス行列,UL). % *** user: ガウス行列に変形 / 2 *** ガウス行列に変形(_行列,_ガウス行列) :- length(_行列,Len), ガウス行列に変形(1,Len,_行列,_ガウス行列). 既約ガウス行列に変形(_ガウス行列,_既約ガウス行列) :- length(_ガウス行列,Len), 既約ガウス行列に変形(Len,_ガウス行列,G1), 既約ガウス行列に変形の二(1,Len,G1,_既約ガウス行列). % *** user: '既約ガウス行列に変形' / 5 *** '既約ガウス行列に変形'(N,0,_,_行列,_行列) :- !. '既約ガウス行列に変形'(N,M,A,_行列1,_行列) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,0), M2 is M - 1, '既約ガウス行列に変形'(N,M2,A,_行列1,_行列). '既約ガウス行列に変形'(N,M,A,_行列1,_行列) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), \+(B = 0), /* '行基本変形3の適用'(A,B,M,N,_行列1,_行列2), */ '最小公倍数'(N2 * A,N1 * B,_), '行基本変形'(N1 # M - N2 # N,_行列1,_行列2), M2 is M - 1, '既約ガウス行列に変形'(N,M2,A,_行列2,_行列). % *** user: '既約ガウス行列に変形' / 3 *** '既約ガウス行列に変形'(1,_既約ガウス行列,_既約ガウス行列) :- !. '既約ガウス行列に変形'(N,_ガウス行列,_既約ガウス行列) :- list_nth(N,_ガウス行列,L0), '最初に現れる0ではない要素・位置'(1,L0,_列,Y), M is N - 1, list_nth(M,_ガウス行列,L), '既約ガウス行列に変形'(_列,M,N,Y,_ガウス行列,G1), N2 is N - 1, '既約ガウス行列に変形'(N2,G1,_既約ガウス行列),!. % *** user: '既約ガウス行列に変形' / 2 *** 既約ガウス行列に変形(_行列,_既約ガウス行列) :- \+(ガウス行列(_行列)), ガウス行列に変形(_行列,_ガウス行列), 既約ガウス行列に変形(_ガウス行列,_既約ガウス行列),!. 既約ガウス行列に変形(_ガウス行列,_既約ガウス行列) :- length(_ガウス行列,Len), 既約ガウス行列に変形(Len,_ガウス行列,G1), 既約ガウス行列に変形の二(1,Len,G1,_既約ガウス行列). % *** user: '既約ガウス行列に変形の二' / 4 *** 既約ガウス行列に変形の二(N,Len,_既約ガウス行列,_既約ガウス行列) :- N > Len,!. 既約ガウス行列に変形の二(N,Len,G,_既約ガウス行列) :- list_nth(N,G,_行), list_nth(N,_行,A), 行基本変形(1 / A # N,G,G1), N2 is N + 1, 既約ガウス行列に変形の二(N2,Len,G1,_既約ガウス行列). % *** user: 行基本変形3の適用 / 7 *** 行基本変形3の適用(A,B,M,N,_行列1,_行列2,N2) :- B >= 0, A2 is abs(A), B2 is abs(B), 最小公倍数(N1 * A2,N2 * B2,_), 行基本変形(N2#M-N1#N,_行列1,_行列2),!. 行基本変形3の適用(A,B,M,N,_行列1,_行列2,N2) :- B < 0, A2 is abs(A), B2 is abs(B), 最小公倍数(N1 * A2,N2 * B2,_), 行基本変形(N2#M+N1#N,_行列1,_行列2),!. % *** user: 行基本変形3の適用 / 6 *** 行基本変形3の適用(A,B,M,N,_行列1,_行列2) :- B >= 0, A2 is abs(A), B2 is abs(B), 最小公倍数(N1 * A2,N2 * B2,_), 行基本変形(N2#M-N1#N,_行列1,_行列2),!. 行基本変形3の適用(A,B,M,N,_行列1,_行列2) :- B < 0, A2 is abs(A), B2 is abs(B), 最小公倍数(N1 * A2,N2 * B2,_), 行基本変形(N2#M+N1#N,_行列1,_行列2),!. % *** user: 行基本変形 / 3 *** 行基本変形(_行列式,_行列,X) :- atom(_行列式), \+(_行列式 = []), & 行列式変換#2.pro, 行列式述語変換(_行列式,P), 行基本変形(P,_行列,X),!. 行基本変形([],_行列,[]) :- !. 行基本変形([N|R1],_行列,[L|R2]) :- !, list_nth(N,_行列,L), 行基本変形(R1,_行列,R2),!. '行基本変形'(# _行目1 # _行目2,_行列,X) :- list_nth(_行目1,_行列,_行1), list_nth(_行目2,_行列,_行2), ならびの位置指定置換(_行目2,_行1,_行列,_行列1), ならびの位置指定置換(_行目1,_行2,_行列1,X),!. 行基本変形(_乗数1 # _行目1 + _乗数2 # _行目2,_行列,X) :- !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行1) , U is A * _乗数1),_乗算された行1), findall(W,(member(B,_行2) , W is B * _乗数2),_乗算された行2), 型推論加算([_乗算された行1,_乗算された行2],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X),!. 行基本変形(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- !, _乗数3 is -1 * _乗数2, 行基本変形(_乗数1 # _行目1 + _乗数3 # _行目2,_行列,X),!. 行基本変形( # _行目1 + _乗数 # _行目2,_行列,X) :- !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行2) , U is A * _乗数),_乗算された行), 型推論加算([_乗算された行,_行1],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X),!. 行基本変形( # _行目1 - _乗数 # _行目2,_行列,X) :- !, _乗数2 is -1 * _乗数, 行基本変形( # _行目1 + _乗数2 * _行目2,_行列,X),!. 行基本変形( # _行目1 + _乗数 / _除数 * _行目2,_行列,X) :- integer(_除数), !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行2) , U is A * _乗数 // _除数),_除算された行), 型推論加算([_行1,_除算された行],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X),!. 行基本変形( # _行目1 + _乗数 / _除数 # _行目2,_行列,X) :- \+(integer(_除数)), !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行2) , U is A * _乗数 / _除数),_除算された行), 型推論加算([_行1,_除算された行],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X),!. 行基本変形( # _行目1 - _乗数 / _除数 # _行目2,_行列,X) :- !, _除数2 is -1 * _除数, 行基本変形( # _行目1 + _乗数 / _除数2 * _行目2,_行列,X),!. 行基本変形(_乗数 / _除数 # _行目,_行列,X) :- integer(_除数), !, list_nth(_行目,_行列,_行1), findall(X,(member(A,_行1) , X is A * _乗数 // _除数),_行2), replace_nth(1,_行目,_行2,_行列,X),!. 行基本変形(_乗数 / _除数 # _行目,_行列,X) :- \+(integer(_除数)), !, list_nth(_行目,_行列,_行1), findall(X,(member(A,_行1) , X is A * _乗数 / _除数),_行2), replace_nth(1,_行目,_行2,_行列,X),!. 行基本変形(_乗数 # _行目,_行列,X) :- !, list_nth(_行目,_行列,_行1), findall(X,(member(A,_行1) , X is A * _乗数),_行2), replace_nth(1,_行目,_行2,_行列,X),!. % *** user: 行基本変形 / 5 *** 行基本変形(*,_乗数,_行目,_行列,X) :- 行基本変形(*,_乗数,1,_行目,_行列,X). % *** user: 行基本変形 / 6 *** 行基本変形(*,_乗数,_行目,_行目,[_行1|R1],[_行2|R1]) :- findall(X,(member(A,_行1) , X is A * _乗数),_行2) . 行基本変形(*,_乗数,M,_行目,[_行|R1],[_行|R2]) :- M2 is M + 1, 行基本変形(*,_乗数,M2,_行目,R1,R2). % *** user: 正方行列の行列式の値 / 2 *** 正方行列の行列式の値(_正方行列,_行列式の値) :- ガウス行列に変形(_正方行列,X,Y), '行列式|C|の値'(X,Z1), ならびの積(Y,Z2), _行列式の値 is Z1 // Z2. % *** user: ならびの積 / 2 *** ならびの積([A],A) :- !. ならびの積([A|R],X) :- ならびの積(R,Y), X is A * Y. % *** user: '行列式|C|の値' / 2 *** '行列式|C|の値'(_行列,_値) :- length(_行列,Len), findall(U,(for(1,N,Len) , list_nth(N,_行列,_行) , list_nth(N,_行,U)),L), ならびの積(L,_値). 要素がゼロ以外に出会うまで([A|R],[],[A|R]) :- \+((A = 0;A=0.0)),!. 要素がゼロ以外に出会うまで([0|R],[0|R1],R2) :- 要素がゼロ以外に出会うまで(R,R1,R2). 要素がゼロ以外に出会うまで([0.0|R],[0.0|R1],R2) :- 要素がゼロ以外に出会うまで(R,R1,R2). 最初に現れる0ではない要素・位置(Nth,[X|_],Nth,X) :- \+((X = 0;X=0.0)),!. 最初に現れる0ではない要素・位置(Mth,[0|R],Nth,X) :- Mth_2 is Mth + 1, 最初に現れる0ではない要素・位置(Mth_2,R,Nth,X). 最初に現れる0ではない要素・位置(Mth,[0.0|R],Nth,X) :- Mth_2 is Mth + 1, 最初に現れる0ではない要素・位置(Mth_2,R,Nth,X). % *** user: ならびの位置指定置換 / 4 *** ならびの位置指定置換(1,A,[_|R],[A|R]) :- !. ならびの位置指定置換(N,A,[B|R1],[B|R2]) :- N1 is N - 1, ならびの位置指定置換(N1,A,R1,R2) . 最小公倍数(N1 * A,B,C) :- integer(B), 最小公倍数(A,B,C), N1 is C // A,!. 最小公倍数(A,N2 * B,C) :- integer(A), 最小公倍数(A,B,C), N2 is C // B,!. 最小公倍数(N1 * A,N2 * B,C) :- 最小公倍数(A,B,C), N1 is C // A, N2 is C // B,!. 最小公倍数(A,B,X) :- integer(A), integer(B), 最大公約数をユークリッドの互除法で求める(A,B,C), X is A * B // C. 最小公倍数([N1 * A|R],X) :- findall(U,member(_ * U,[N1 * A|R]),L1), 最小公倍数(L1,X), 最小公倍数_2([N1 * A|R],X),!. 最小公倍数([A,B],X) :- 最小公倍数(A,B,X),!. 最小公倍数([A|R],X) :- 最小公倍数(R,B), 最小公倍数(A,B,X),!. 最小公倍数_2([],_) :- !. 最小公倍数_2([N * A|R],Y) :- N is Y // A, 最小公倍数_2(R,Y),!. 最小公倍数_2([A|R],Y) :- integer(A), 最小公倍数_2(R,Y),!. 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). % 以下のサイトは 相加平均(L,_相加平均) :- 算術平均(L,_相加平均). 算術平均([],N,S,M) :- M is S / N,!. 算術平均([A|R],N,S,M) :- S1 is S + A,算術平均(R,N,S1,M) . 算術平均(L,M) :- length(L,N),算術平均(L,N,0.0,M). 標準偏差([],N,M,S,V) :- V is sqrt(S / (N - 1)),!. 標準偏差([A|R],N,M,S,V) :- S1 is (A - M) ^ 2,S2 is S + S1,標準偏差(R,N,M,S2,V). 標準偏差(L,V) :- length(L,N),算術平均(L,M),標準偏差(L,N,M,0.0,V) . 平均偏差(L,_平均偏差) :- 算術平均(L,Avg), length(L,N), 平均偏差(L,Avg,0.0,Amd), _平均偏差 is Amd / N. 平均偏差([],_,X,X). 平均偏差([A|R1],Avg,Y,X) :- Y2 is Y + abs(A-Avg), 平均偏差(R1,Avg,Y2,X). 尖度(_標本,_尖度) :- length(_標本,_標本数), 算術平均(_標本,_算術平均), 分散(_標本,_分散), findsum(U,(member(A,_標本),U is (A-_算術平均) ^ 4),X1), _尖度 is X1 / ((sqrt(_分散) ^ 4) * _標本数). 尖度([],N,M,S1,S2,V) :- V is S2 / (M * S2 ^ 2). 尖度([A|R],N,M,S1,S2,V) :- S3 is (A - M) ^ 2, S4 is (A - M) ^ 4, S5 is S1 + S3, S6 is S2 + S4, 尖度(R,N,M,S5,S6,V). 分散(L,V) :- length(L,N), 算術平均(L,M), 分散(L,N,M,0.0e+00,V). 分散([],N,M,S,V) :- V is S / N,!. 分散([A|R],N,M,S,V) :- S1 is (A - M) ^ 2, S2 is S + S1, 分散(R,N,M,S2,V). 相乗平均(L,_相乗平均) :- 幾何平均(L,_相乗平均). 幾何平均([],N,S,M) :- M is exp(S / N),!. 幾何平均([A|R],N,S,M) :- S0 is ln(A), S1 is S + S0, 幾何平均(R,N,S1,M). 幾何平均(_標本ならび,_幾何平均) :- length(_標本ならび,_標本数), 幾何平均(_標本ならび,_標本数,0,_幾何平均). 加重平均(_標本ならび,_加重平均) :- findsum(_重み,member([_重み,_],_標本ならび),S), findsum(M,(member([A,B],_標本ならび),M is A * B),S2), _加重平均 is S2 / S,!. 偏差値(_母集合,_偏差値ならび) :- 加算(_母集合,_算術合計), length(_母集合,_ならびの長さ), _算術平均 is _算術合計 / _ならびの長さ, 標準偏差(_母集合,_標準偏差), findall(_偏差値,( member(_値,_母集合) , 偏差値(_値,_算術平均,_標準偏差,_偏差値)), _偏差値ならび). 偏差値(_標本値,_算術平均,_標準偏差,_偏差値) :- _偏差値 is 10 * (_標本値 - _算術平均) / _標準偏差 + 50. 中央値(_標本ならび,_中央値) :- medium(_標本ならび,_中央値). medium(L,_中央値) :- quicksort(L,L2), length(L2,Len), Len2 is Len // 2, medium(L2,Len2,_中央値). medium(L,Len,_中央値) :- append(L1,[_中央値|L2],L), length(L1,Len), length(L2,Len),!. medium(L,Len,_中央値) :- Len2 is Len - 1, append(L1,[_中央値1,_中央値2|L2],L), length(L1,Len2), length(L2,Len2), _中央値 is (_中央値1 + _中央値2) / 2. 最小公倍数(N1 * A,B,C) :- integer(B), 最小公倍数(A,B,C), N1 is C // A,!. 最小公倍数(A,N2 * B,C) :- integer(A), 最小公倍数(A,B,C), N2 is C // B,!. 最小公倍数(N1 * A,N2 * B,C) :- 最小公倍数(A,B,C), N1 is C // A, N2 is C // B,!. 最小公倍数(A,B,X) :- integer(A), integer(B), 最大公約数をユークリッドの互除法で求める(A,B,C), X is A * B // C. 最小公倍数([N1 * A|R],X) :- findall(U,member(_ * U,[N1 * A|R]),L1), 最小公倍数(L1,X), 最小公倍数_2([N1 * A|R],X),!. 最小公倍数([A,B],X) :- 最小公倍数(A,B,X),!. 最小公倍数([A|R],X) :- 最小公倍数(R,B), 最小公倍数(A,B,X),!. 最大公約数(M,N,X) :- 最大公約数をユークリッドの互除法で求める(M,N,X),!. 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X).