このディレクトリの索引

:- op(470,xfx,(#)). :- op(700,xfx,は). :- op(710,xfx,(::)). A は B :- A is B. 連立一次方程式の解(_拡大係数行列,_解ならび) :- ガウス行列に変形(_拡大係数行列,_ガウス行列,_), 連立一次方程式の一般解(_ガウス行列,_解ならび). 連立一次方程式の一般解(_ガウス行列,_解ならび) :- 解が1つだけ存在する場合(_ガウス行列,_解ならび),!. 連立一次方程式の一般解(_ガウス行列,解は無数に存在する) :- 解が無数にある場合(_ガウス行列),!. 連立一次方程式の一般解(_ガウス行列,解は存在しない) :- 解がない場合(_ガウス行列). 解が1つだけ存在する場合(_ガウス行列,_解ならび) :- '行が下がるごとに、最初に現れる0でない要素が、1つずつ右にずれていく'(0,_ガウス行列), 既約ガウス行列に変形(_ガウス行列,_既約ガウス行列), 既約ガウス行列の各行の最終要素が解である(_既約ガウス行列,_解ならび). '行が下がるごとに、最初に現れる0でない要素が、1つずつ右にずれていく'(_,[]) :- !. '行が下がるごとに、最初に現れる0でない要素が、1つずつ右にずれていく'(N,[L|R]) :- 先頭から0がN要素(N,L), succ(N,N_2), '行が下がるごとに、最初に現れる0でない要素が、1つずつ右にずれていく'(N_2,R). 先頭から0がN要素(N,L) :- append(L1,[A|_],L), \+(A=0),!, length(L1,N). 既約ガウス行列の各行の最終要素が解である(_既約ガウス行列,_解ならび) :- findall(_解,( member(_行,_既約ガウス行列), last(_行,_解)),_解ならび). 解が無数にある場合(_ガウス行列) :- length(_ガウス行列,N), 行列の階数(_ガウス行列,_ガウス行列の階数), \+(N = _ガウス行列の階数). 解がない場合(_ガウス行列) :- \+('行が下がるごとに、最初に現れる0でない要素が、1つずつ右にずれていく'(0,_ガウス行列)), '最終要素が0でなく、それ以外は0である行がある'(_ガウス行列),!. '最終要素が0でなく、それ以外は0である行がある'(_ガウス行列) :- member(L,_ガウス行列), 最終要素が0でなく(L), それ以外は0である(L),!. 最終要素が0でなく(L) :- append(L1,[N],L), \+(N = 0),!. それ以外は0(L) :- append(L1,[_],L), all(L1,0),!. % *** user: 'ガウス行列' / 2 *** 'ガウス行列'(_,[]) :- ! . 'ガウス行列'(L,[_行|R]) :- append(L,_,_行), '要素がゼロ以外に出会うまで'(_行,P1,_), 'ガウス行列'([0|P1],R) . 'ガウス行列'(_,[]) :- ! . 'ガウス行列'(L,[_行|R]) :- append(L,_,_行), '要素がゼロ以外に出会うまで'(_行,P1,_), 'ガウス行列'([0|P1],R) . % *** user: 'ガウス行列' / 1 *** 'ガウス行列'(_行列) :- 'ガウス行列'([],_行列) . % *** user: 'ガウス行列に変形' / 7 *** 'ガウス行列に変形'(N,M,Len,_,_行列,_行列,[]) :- M > Len, ! . 'ガウス行列に変形'(N,M,Len,0,_行列1,X,UL) :- nth1(M,_行列1,_行1), nth1(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) :- nth1(M,_行列1,_行1), nth1(N,_行1,B), B = 0, M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,0,_行列1,X,UL), ! . 'ガウス行列に変形'(N,M,Len,A,_行列1,X,[-1|R]) :- nth1(M,_行列1,_行1), nth1(N,_行1,0), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列1,X,R), ! . 'ガウス行列に変形'(N,M,Len,A,_行列1,X,[N1|R]) :- nth1(M,_行列1,_行1), nth1(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,[N1|R]) :- nth1(M,_行列1,_行1), nth1(N,_行1,B), '最小公倍数'(N2 * A,N1 * B,_), N1 < 0, !, '行基本変形'(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) :- nth1(M,_行列1,_行1), nth1(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) :- nth1(M,_行列1,_行1), nth1(N,_行1,B), B = 0, M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,0,_行列1,X), ! . 'ガウス行列に変形'(N,M,Len,A,_行列1,X) :- nth1(M,_行列1,_行1), nth1(N,_行1,0), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列1,X), ! . 'ガウス行列に変形'(N,M,Len,A,_行列1,X) :- nth1(M,_行列1,_行1), nth1(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) :- nth1(N,_行列1,_行), nth1(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) :- nth1(N,_行列1,_行), nth1(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: '既約ガウス行列に変形の二' / 4 *** '既約ガウス行列に変形の二'(N,Len,_既約ガウス行列,_既約ガウス行列) :- N > Len, ! . '既約ガウス行列に変形の二'(N,Len,G,_既約ガウス行列) :- nth1(N,G,_行), nth1(N,_行,A), '行基本変形'(1 / A # N,G,G1), N2 is N + 1, '既約ガウス行列に変形の二'(N2,Len,G1,_既約ガウス行列) . % *** user: '既約ガウス行列の一' / 2 *** '既約ガウス行列の一'(_,[]) :- ! . '既約ガウス行列の一'(L,[_行|R]) :- append(L,_,_行), '要素がゼロ以外に出会うまで'(_行,P1,[1|_]), '既約ガウス行列の一'([0|P1],R) . % *** user: '既約ガウス行列の一' / 1 *** '既約ガウス行列の一'([_行]) :- '零以外の最初の要素が1'(_行), ! . '既約ガウス行列の一'([_行|R]) :- '零以外の最初の要素が1'(_行), '既約ガウス行列の一'(R) . % *** user: '既約ガウス行列' / 2 *** '既約ガウス行列'(_,[]) :- ! . '既約ガウス行列'(L,[_行|R]) :- append(L,_,_行), '要素がゼロ以外に出会うまで'(_行,P1,[1|_]), '既約ガウス行列'([0|P1],R) . % *** user: '既約ガウス行列' / 1 *** '既約ガウス行列'(_行列) :- '既約ガウス行列の一'([],_行列), '行列の転置'(_行列,_転置された行列), '既約ガウス行列検査'(_転置された行列) . % *** user: '既約ガウス行列検査' / 1 *** '既約ガウス行列検査'([]) :- ! . '既約ガウス行列検査'([L|R]) :- append(L1,[1|L2],L), append(L1,L2,L3), 'すべての要素'(L3,0), '既約ガウス行列検査'(R), ! . '既約ガウス行列検査'([L|R]) :- \+(append(L1,[1|L2],L)), '既約ガウス行列検査'(R) . % *** user: '既約ガウス行列に変形' / 5 *** '既約ガウス行列に変形'(N,0,_,_行列,_行列) :- ! . '既約ガウス行列に変形'(N,M,Len,0,_行列1,X) :- nth1(M,_行列1,_行1), nth1(N,_行1,B), \+(B = 0), '行の置換'(N,M,_行列1,_行列2), M2 is N - 1, '既約ガウス行列に変形'(N,M2,Len,B,_行列2,X), ! . '既約ガウス行列に変形'(N,M,A,_行列1,_行列) :- nth1(M,_行列1,_行1), nth1(N,_行1,0), M2 is M - 1, '既約ガウス行列に変形'(N,M2,A,_行列1,_行列) . '既約ガウス行列に変形'(N,M,A,_行列1,_行列) :- nth1(M,_行列1,_行1), nth1(N,_行1,B), \+(B = 0), '最小公倍数'(N2 * A,N1 * B,_), '行基本変形'(N1 # M - N2 # N,_行列1,_行列2), M2 is M - 1, '既約ガウス行列に変形'(N,M2,A,_行列2,_行列) . % *** user: '既約ガウス行列に変形' / 3 *** '既約ガウス行列に変形'(1,_既約ガウス行列,_既約ガウス行列) :- ! . '既約ガウス行列に変形'(N,_ガウス行列,_既約ガウス行列) :- nth1(N,_ガウス行列,L0), '最初に現れる0ではない要素・位置'(1,L0,_列,Y), M is N - 1, nth1(M,_ガウス行列,L), '既約ガウス行列に変形'(_列,M,Y,_ガウス行列,G1), N2 is N - 1, '既約ガウス行列に変形'(N2,G1,_既約ガウス行列), ! . % *** user: '既約ガウス行列に変形' / 2 *** '既約ガウス行列に変形'(_行列,_既約ガウス行列) :- \+('ガウス行列'(_行列)), 'ガウス行列に変形'(_行列,_ガウス行列), '既約ガウス行列に変形'(_ガウス行列,_既約ガウス行列), ! . '既約ガウス行列に変形'(_ガウス行列,_既約ガウス行列) :- length(_ガウス行列,Len), '既約ガウス行列に変形'(Len,_ガウス行列,G1), '既約ガウス行列に変形の二'(1,Len,G1,_既約ガウス行列) . % *** user: 'n次正方行列の要素を行・列順序で取り出す' / 5 *** 'n次正方行列の要素を行・列順序で取り出す'(_n,_正方行列,_i行,_j列,_正方行列の要素) :- between(1,_n,_i行), nth1(_i行,_正方行列,L), nth1(_j列,L,_正方行列の要素) . % *** user: 'n次正方行列の要素を列・行順序で取り出す' / 5 *** 'n次正方行列の要素を列・行順序で取り出す'(_n,_正方行列,_i行,_j列,_正方行列の要素) :- between(1,_n,_j列), nth1(_i行,_正方行列,L), nth1(_j列,L,_正方行列の要素) . % *** user: 'n次正方行列から、第i行と第j列を取り除いた正方行列(n-1次正方行列の行列式に、(-1)のi+j乗をかけたものを、Aの(i,j)余因子といい、Cijで表します。' / 5 *** 'n次正方行列から、第i行と第j列を取り除いた正方行列(n-1次正方行列の行列式に、(-1)のi+j乗をかけたものを、Aの(i,j)余因子といい、Cijで表します。'(_n,_正方行列,_i,_j,_余因子) :- '正方行列から第i行と第j列を取り除く'(_正方行列,_i,_j,_n_1次正方行列), '行列式の値'(_n_1次正方行列,_n_1次正方行列の行列式の値), 'i,jから乗数を得る'(_i,_j,_乗数), _余因子 is _乗数 * _n_1次正方行列の行列式の値. % *** user: 'i,jから乗数を得る' / 3 *** 'i,jから乗数を得る'(_i,_j,-1) :- 1 is (_i + _j) mod 2, ! . 'i,jから乗数を得る'(_i,_j,1) :- 0 is (_i + _j) mod 2, ! . % *** user: '第何行を取り除く' / 3 *** '第何行を取り除く'(_正方行列,_第何行,_第i行が取り除かれた行列) :- append(L0,[L|R],_正方行列), length([_|L0],_第何行), append(L0,R,_第i行が取り除かれた行列) . % *** user: '正方行列から第i行と第j列を取り除く' / 4 *** '正方行列から第i行と第j列を取り除く'(_正方行列,_i,_j,_n_1次正方行列) :- '第何行を取り除く'(_正方行列,_i,_第i行が取り除かれた行列), '転置'(_第i行が取り除かれた行列,_転置された第i行が取り除かれた行列), '第何行を取り除く'(_転置された第i行が取り除かれた行列,_j,_転置された第i行第j列が取り除かれた行列), '転置'(_転置された第i行第j列が取り除かれた行列,_n_1次正方行列) . % *** user: '正方行列の対角要素' / 2 *** '正方行列の対角要素'(_正方行列,_対角要素) :- findall(A,(append(L0,[L|_],_正方行列) , \+(L = []) , length(L0,N2) , length(L1,N2) , append(L1,[A|_],L)),_対角要素) . % *** user: '正方行列' / 3 *** '正方行列'(N,_次数,[]) :- N > _次数, ! . '正方行列'(N,_次数,[_行|R]) :- length(_行,_次数), N2 is N + 1, '正方行列'(N2,_次数,R) . % *** user: '正方行列' / 2 *** '正方行列'(_,[]) :- ! . '正方行列'(_行数,[_行|R]) :- length(_行,_行数), '正方行列'(_行数,R) . % *** user: '正方行列' / 1 *** '正方行列'(_正方行列) :- length(_正方行列,_行数), '正方行列'(1,_行数,_正方行列) . % *** user: '正方行列の行列式' / 2 *** '正方行列の行列式'(_正方行列,_行列式) :- findsum(_符号付き要素積,'行列の符号付き要素積'(_正方行列,_符号付き要素積),_行列式) . % *** user: '正方行列の行列式の値' / 2 *** '正方行列の行列式の値'(_正方行列,_行列式の値) :- 'ガウス行列に変形'(_正方行列,X,Y), '行列式|C|の値'(X,Z1), 'ならびの積'(Y,Z2), _行列式の値 is Z1 // Z2 . % *** user: '正方行列の逆行列' / 3 *** '正方行列の逆行列'(_n次,_正方行列,_逆行列) :- '単位行列'(_n次,_単位行列), '二つのならびの同一順序要素の結合'(_正方行列,_単位行列,LL2), '既約ガウス行列に変形'(LL2,LL3), '行列の行の先頭からn列を切り取った残り行列'(_n次,LL3,_逆行列) . % *** user: '正方行列の逆行列' / 2 *** '正方行列の逆行列'(_正方行列,_逆行列) :- length(_正方行列,_n次), '単位行列'(_n次,_単位行列), '二つのならびの同一順序要素の結合'(_正方行列,_単位行列,LL2), '既約ガウス行列に変形'(LL2,LL3), '行列の行の先頭からn列を切り取った残り行列'(_n次,LL3,_逆行列) . % *** user: '単位行列' / 4 *** '単位行列'(M,N1,N,[]) :- N1 > N, ! . '単位行列'(M,M,N,[1|R]) :- N2 is M + 1, '単位行列'(M,N2,N,R) . '単位行列'(M,N1,N,[0|R]) :- \+(N1 = M), N2 is N1 + 1, '単位行列'(M,N2,N,R) . % *** user: '単位行列' / 3 *** '単位行列'(M,N,[]) :- M > N, ! . '単位行列'(M,N,[_行|R]) :- '単位行列'(M,1,N,_行), M2 is M + 1, '単位行列'(M2,N,R) . % *** user: '単位行列' / 2 *** '単位行列'(N,_単位行列) :- '単位行列'(1,N,_単位行列) . % *** user: '単位行列' / 1 *** '単位行列'(_単位行列) :- '正方行列'(_単位行列), length(_単位行列,_次数), '単位行列'(_次数,_単位行列) . % *** user: '単位行列の生成' / 2 *** '単位行列の生成'(N,LL) :- length(L,N), findall(L,(append(L0,[1|R],L) , all(L0,0) , all(R,0)),LL), ! . % *** user: '行列式の値' / 4 *** '行列式の値'(_正方行列,_i,_n,_行列式の値) :- findsum(W,('n次正方行列の要素を列・行順序で取り出す'(_n,_正方行列,_i,_j,_正方行列の要素) , '余因子'(_n,_正方行列,_i,_j,_余因子) , W is _正方行列の要素 * _余因子),_行列式の値) . % *** user: '行列式の値' / 2 *** '行列式の値'([[A,B],[C,D]],_行列式の値) :- _行列式の値 is A * D - B * C, ! . '行列式の値'(_正方行列,_行列式の値) :- _正方行列 = [_行_1|R], length([_行_1|R],_i), length(_行_1,_n), '行列式の値'(_正方行列,_i,_n,_行列式の値) . % *** user: '行列のすべての要素に値を掛ける' / 5 *** '行列のすべての要素に値を掛ける'(_行目,_n,LL,_,LL) :- _行目 > _n, ! . '行列のすべての要素に値を掛ける'(_行目,_n,LL1,_乗数 / _除数,LL2) :- '行基本変形'(_乗数 / _除数 # _行目,LL1,LL3), _行目_2 is _行目 + 1, '行列のすべての要素に値を掛ける'(_行目_2,_n,LL3,_乗数 / _除数,LL2) . % *** user: '行列の掛算_2' / 3 *** '行列の掛算_2'(_,[],[]) :- ! . '行列の掛算_2'(A,[B|R2],[C|R3]) :- '行列の掛算_3'(A,B,C), '行列の掛算_2'(A,R2,R3) . % *** user: '行列要素' / 4 *** '行列要素'(_行,_列,_行列,_値) :- nth1(_行,_行列,L), nth1(_列,L,_値) . % *** user: '行列の列置換' / 4 *** '行列の列置換'(_列,_置換する列,_対象行列,_置換された行列) :- '行列の転置'(_対象行列,_転置された行列), '要素番号によるならびの置換'(_列,_置換する列,_転置された行列,_置換された行列の二), '行列の転置'(_置換された行列の二,_置換された行列) . % *** user: '行列の行置換' / 4 *** '行列の行置換'(_行,_置換する行,_対象行列,_置換された行列) :- '要素番号によるならびの置換'(_行,_置換する行,_対象行列,_置換された行列), ! . % *** user: '行列の要素積の符号を判断する' / 3 *** '行列の要素積の符号を判断する'(_順列,_符号付き要素積,_符号付き要素積) :- '偶順列'(_順列), ! . '行列の要素積の符号を判断する'(_順列,_要素積の一,_符号付き要素積) :- '奇順列'(_順列), _符号付き要素積 is _要素積の一 * -1, ! . % *** user: '行列の符号付き要素積' / 2 *** '行列の符号付き要素積'(_正方行列,_符号付き要素積) :- length(_正方行列,Len), findall(U,for(1,U,Len),L0), '順列'(L0,Len,_順列), findall(V,(for(1,M,Len) , nth1(M,_正方行列,L1) , nth1(M,_順列,N) , nth1(N,L1,V)),L2), '積'(L2,_要素積の一), '行列の要素積の符号を判断する'(_順列,_要素積の一,_符号付き要素積) . % *** user: '行列から列を選択する' / 3 *** '行列から列を選択する'(_,[],[]) :- ! . '行列から列を選択する'(_選択する列位置ならび,[_行|R1],[L|R2]) :- '列の選択'(_選択する列位置ならび,_行,L), '行列から列を選択する'(_選択する列位置ならび,R1,R2) . % *** user: '行列行置換' / 5 *** '行列行置換'(N,N,L,[_|R],[L|R]) :- ! . '行列行置換'(M,N,L,[A|R1],[A|R2]) :- M2 is M + 1, '行列行置換'(M2,N,L,R1,R2) . % *** user: '行列の結合' / 5 *** '行列の結合'(Len1,Len2,[_行1],[_行2],[_行3]) :- append(_行1,_行2,_行3), length(_行1,Len1), length(_行2,Len2) . '行列の結合'(Len1,Len2,[_行1|R1],[_行2|R2],[_行3|R3]) :- append(_行1,_行2,_行3), '行列の結合'(Len1,Len2,R1,R2,R3), length(_行1,Len1), length(_行2,Len2) . % *** user: '行列の結合' / 3 *** '行列の結合'([_行1|R1],[_行2|R2],_結合された行列) :- '行列の結合'(Len1,Len2,[_行1|R1],[_行2|R2],_結合された行列), Len1 > 0, Len2 > 0 . % *** user: '行列の置換' / 5 *** '行列の置換'(_列,_行,_置換要素,_対象行列,_置換された行列) :- n_th(_行,_対象行列,_対象行), '要素番号によるならびの置換'(_列,_置換要素,_対象行,_置換された行), '要素番号によるならびの置換'(_行,_置換された行,_対象行列,_置換された行列), ! . % *** user: '行列の転置' / 2 *** '行列の転置'(_行列,_転置された行列) :- 転置(_行列,_転置された行列). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). % *** user: m_trans / 3 *** m_trans([],[],[]) :- ! . m_trans([[A|R]|R1],[A|R2],[R|R3]) :- m_trans(R1,R2,R3) . % *** user: m_trans / 2 *** m_trans([[]|_],[]) :- ! . m_trans(L,[B|R1]) :- m_trans(L,B,R2), m_trans(R2,R1), ! . % *** user: '行列式|C|の値' / 2 *** '行列式|C|の値'(_行列,_値) :- length(_行列,Len), findall(U,(for(1,N,Len) , nth1(N,_行列,_行) , nth1(N,_行,U)),L), 'ならびの積'(L,_値) . % *** user: '行列の階数' / 2 *** '行列の階数'(_行列,_階数) :- 'ガウス行列に変形'(_行列,_ガウス行列), count((member(L,_ガウス行列) , \+('すべての要素が0か0.0'(L))),_階数) . % *** user: '行列の要素積' / 2 *** '行列の要素積'(_正方行列,_要素積) :- length(_正方行列,Len), findall(U,for(1,U,Len),L0), '順列'(L0,Len,_順列), findall(V,(for(1,M,Len) , nth1(M,_正方行列,L1) , nth1(M,_順列,N) , nth1(N,L1,V)),L2), '積'(L2,_要素積) . % *** user: '行列の掛算' / 3 *** '行列の掛算'(L1,L2,X) :- '転置'(L2,L4), '行列の掛算_1'(L1,L4,X) . % *** user: '行列の掛算_1' / 3 *** '行列の掛算_1'([],_,[]) :- ! . '行列の掛算_1'([A|R1],L,[S1|R3]) :- '行列の掛算_2'(A,L,S1), '行列の掛算_1'(R1,L,R3) . % *** user: '行列の掛算_3' / 3 *** '行列の掛算_3'([],[],0) :- ! . '行列の掛算_3'([A|R1],[B|R2],S) :- '分数を含む掛算'(A,B,S1), '行列の掛算_3'(R1,R2,S2), '分数を含む加算'(S1,S2,S), ! . % *** user: '行列の行の先頭からn列を切り取った残り行列' / 3 *** '行列の行の先頭からn列を切り取った残り行列'(_n列,LL1,LL2) :- length(L0,_n列), findall(L2,(member(L1,LL1) , append(L0,L2,L1)),LL2) . % *** 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: '行基本変形' / 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, !, '分数を含む乗算'(-1,_乗数2,_乗数3), '行基本変形'(_乗数1 # _行目1 + _乗数3 # _行目2,_行列,X), ! . '行基本変形'(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- _乗数2 >= 0, _乗数1 < 0, '分数を含む乗算'(_乗数1,-1,_乗数3), !, '行基本変形'(_乗数3 # _行目1 + _乗数2 # _行目2,_行列,X), ! . '行基本変形'(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- _乗数2 < 0, _乗数1 >= 0, '分数を含む乗算'(_乗数2,-1,_乗数3), !, '行基本変形'(_乗数1 # _行目1 + _乗数3 # _行目2,_行列,X), ! . '行基本変形'(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- _乗数2 < 0, _乗数1 < 0, !, '分数を含む乗算'(-1,_乗数2,_乗数3), '行基本変形'(_乗数1 # _行目1 + _乗数3 # _行目2,_行列,X), ! . '行基本変形'(_乗数1 # _行目1 + _乗数2 # _行目2,_行列,X) :- !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行1) , '分数を含む乗算'(A,_乗数1,U)),_乗算された行1), findall(W,(member(B,_行2) , '分数を含む乗算'(B,_乗数2,W)),_乗算された行2), '項加算'([_乗算された行1,_乗算された行2],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X), ! . '行基本変形'(# _行目1 + _乗数 # _行目2,_行列,X) :- !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行2) , '分数を含む乗算'(A,_乗数,U)),_乗算された行), '項加算'([_乗算された行,_行1],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X), ! . '行基本変形'(# _行目1 - _乗数 # _行目2,_行列,X) :- !, '分数を含む乗算'(-1,_乗数,_乗数2), '行基本変形'(# _行目1 + _乗数2 * _行目2,_行列,X), ! . '行基本変形'(# _行目1 + _乗数 / _除数 * _行目2,_行列,X) :- integer(_除数), !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行2) , '分数を含む乗算'(A,_乗数,A2) , '分数を含む除算'(A2,_除数,U)),_除算された行), '項加算'([_行1,_除算された行],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X), ! . '行基本変形'(# _行目1 + _乗数 / _除数 # _行目2,_行列,X) :- \+(integer(_除数)), !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行2) , '分数を含む乗算'(A,_乗数,A2) , '分数を含む除算'(A2,_除数,U)),_除算された行), '項加算'([_行1,_除算された行],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X), ! . '行基本変形'(# _行目1 - _乗数 / _除数 # _行目2,_行列,X) :- !, '分数を含む乗算'(-1,_除数,_除数2), '行基本変形'(# _行目1 + _乗数 / _除数2 * _行目2,_行列,X), ! . '行基本変形'(_乗数 / _除数 # _行目,_行列,X) :- integer(_除数), !, list_nth(_行目,_行列,_行1), findall(Y,(member(A,_行1) , '行基本変形除算'(A,_乗数,_除数,Y)),_行2), replace_nth(1,_行目,_行2,_行列,X), ! . '行基本変形'(_乗数 / _除数 # _行目,_行列,X) :- \+(integer(_除数)), !, list_nth(_行目,_行列,_行1), findall(X,(member(A,_行1) , '分数を含む乗算'(A,_乗数,A2) , '分数を含む除算'(A2,_除数,X)),_行2), replace_nth(1,_行目,_行2,_行列,X), ! . '行基本変形'(_乗数 # _行目,_行列,X) :- !, list_nth(_行目,_行列,_行1), findall(X,(member(A,_行1) , '分数を含む乗算'(A,_乗数,X)),_行2), replace_nth(1,_行目,_行2,_行列,X), ! . % *** user: '行基本変形2' / 3 *** '行基本変形2'(_乗数 # _行目,_行列,X) :- nth1(_行目,_行列,_行), findall(U,(member(A,_行) , U is A * _乗数),_乗算された行), replace_nth(1,_行目,_乗算された行,_行列,X), ! . % *** 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の適用' / 5 *** '行基本変形3の適用'(A,B,_行列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,_行列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の適用' / 4 *** '行基本変形3の適用'(A,B,_行列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,_行列1,_行列2) :- B < 0, A2 is abs(A), B2 is abs(B), '最小公倍数'(N1 * A2,N2 * B2,_), '行基本変形'(N2 # M + N1 # N,_行列1,_行列2), ! . % *** user: '行基本変形除算' / 4 *** '行基本変形除算'(A,_乗数,_除数,X) :- integer(A), integer(_乗数), integer(_除数), A2 is A * _乗数, 0 is A2 mod _除数, X is A * _乗数 // _除数, ! . '行基本変形除算'(A,_乗数,_除数,X) :- integer(A), integer(_乗数), integer(_除数), A2 is A * _乗数, \+(0 is A2 mod _除数), '約分'(A2 / _除数,X), ! . '行基本変形除算'(A,_乗数,_除数,X) :- X is A * _乗数 / _除数 . '分数を含む掛算'(A,B,C) :- '分数を含む乗算'(A,B,C). % *** user: '分数を含む乗算' / 3 *** '分数を含む乗算'(A1 / B1,A2 / B2,C) :- B3 is B1 * B2, A3 is A1 * A2, '約分'(A3 / B3,C), ! . '分数を含む乗算'(V,A2 / B2,C) :- number(V), A3 is V * A2, '約分'(U / B2,C), ! . '分数を含む乗算'(A1 / B1,V,C) :- number(V), A3 is A1 * V, '約分'(A3 / B1,C), ! . '分数を含む乗算'(A,B,C) :- C is A * B . % *** user: '分数を含む掛算' / 3 *** '分数を含む掛算'(A1 / A2,B1 / B2,C) :- S1 is A1 * B1, S2 is A2 * B2, '約分'(S1 / S2,C), ! . '分数を含む掛算'(A1 / A2,B,C) :- S1 is A1 * B, '約分'(S1 / A2,C), ! . '分数を含む掛算'(A,B1 / B2,C) :- S1 is B1 * A, '約分'(S1 / B2,C), ! . '分数を含む掛算'(A,B,C) :- C is A * B . % *** user: '分数を含む加算' / 3 *** '分数を含む加算'(A,B,C) :- number(A), number(B), C is A + B, ! . '分数を含む加算'(A1 / B1,A2 / B2,C) :- A3 is A1 * B2 + A2 * B1, B3 is B1 * B2, '約分'(A3 / B3,C), ! . '分数を含む加算'(A1 / B1,V,C) :- number(V), A2 is V * B1, C3 is A1 + A2, '約分'(C3 / B1,C), ! . '分数を含む加算'(V,A2 / B2,C) :- number(V), A1 is V * B2, C3 is A1 + A2, '約分'(C3 / B2,C), ! . % *** user: '分数公倍数' / 3 *** '分数公倍数'(A1 / A2,B1 / B2,C1 / C2) :- C1 is A1 * B1, C2 is A2 * B2, ! . '分数公倍数'(A,B1 / B2,C1 / B2) :- integer(A), C1 is A * B1, ! . '分数公倍数'(A1 / A2,B,C1 / A2) :- integer(B), C1 is A1 * B, ! . '分数公倍数'(A,B1 / B2,C1 / B2) :- A float, C1 is A * B1, ! . '分数公倍数'(A1 / A2,B,C1 / A2) :- B float, C1 is A1 * B, ! . % *** user: '分数を含む減算' / 3 *** '分数を含む減算'(A,B,C) :- number(A), number(B), C is A - B, ! . '分数を含む減算'(A1 / B1,A2 / B2,C) :- A3 is A1 * B2 - A2 * B1, B3 is B1 * B2, '約分'(A3 / B3,C), ! . '分数を含む減算'(A1 / B1,V,C) :- number(V), A2 is V * B1, C3 is A1 - A2, '約分'(C3 / B1,C), ! . '分数を含む減算'(V,A2 / B2,C) :- number(V), A1 is V * B2, C3 is A1 - A2, '約分'(C3 / B2,C), ! . % *** user: '分数を含む除算' / 3 *** '分数を含む除算'(A,B,C) :- number(A), number(B), '約分'(A / B,C), ! . '分数を含む除算'(A1 / B1,A2 / B2,C) :- '分数を含む乗算'(A1 / B1,B2 / A2,C), ! . '分数を含む除算'(V,A2 / B2,C) :- number(V), '分数を含む乗算'(V,B2 / A2,C), ! . '分数を含む除算'(A1 / B1,V,C) :- number(V), B2 is V * B1, '約分'(A1 / B2,C), ! . % *** user: '最小公倍数' / 3 *** '最小公倍数'(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 . % *** user: '最小公倍数' / 2 *** '最小公倍数'([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), ! . % *** user: '最小公倍数_2' / 2 *** '最小公倍数_2'([],_) :- ! . '最小公倍数_2'([N * A|R],Y) :- N is Y // A, '最小公倍数_2'(R,Y), ! . '最小公倍数_2'([A|R],Y) :- integer(A), '最小公倍数_2'(R,Y), ! . % *** user: '最大公約数をユークリッドの互除法で求める' / 3 *** '最大公約数をユークリッドの互除法で求める'(M,N,N) :- 0 is M mod N, ! . '最大公約数をユークリッドの互除法で求める'(M,N,X) :- Mod is M mod N, '最大公約数をユークリッドの互除法で求める'(N,Mod,X) . % *** user: '最大公約数' / 3 *** '最大公約数'(M,N,X) :- '最大公約数をユークリッドの互除法で求める'(M,N,X), ! . % *** user: '要素数はnの倍数' / 2 *** '要素数はnの倍数'(L,_n) :- length(L,Len), 0 is Len mod _n . % *** user: '要素を削除するのニ' / 3 *** '要素を削除するのニ'(A,[],[]) :- ! . '要素を削除するのニ'(A,[A|R1],R2) :- '要素を削除するのニ'(A,R1,R2), ! . '要素を削除するのニ'(A,[B|R1],[B|R2]) :- '要素を削除するのニ'(A,R1,R2) . % *** user: '要素を削除する' / 3 *** '要素を削除する'(_,[],_) :- !, fail . '要素を削除する'(A,[A|R1],R2) :- '要素を削除するのニ'(A,R1,R2), ! . '要素を削除する'(A,[B|R1],[B|R2]) :- '要素を削除する'(A,R1,R2) . % *** user: '要素がn個' / 3 *** '要素がn個'(A,L,_n) :- findall(_,append(_,[A|_],L),L1), length(L1,_n), ! . % *** user: '要素数をnで割ると余りがmを収集' / 4 *** '要素数をnで割ると余りがmを収集'(L,_n,_m,Lx) :- findall(A,(append(L0,[A|R],L) , '要素数をnで割ると余りがm'([_|L0],_n,_m)),Lx) . % *** user: '要素数がnで割り切れる' / 2 *** '要素数がnで割り切れる'(L,_n) :- length(L,Len), 0 is Len mod _n . % *** user: '要素数が奇数' / 1 *** '要素数が奇数'(L) :- length(L,N), 1 is N mod 2 . % *** user: '要素位置は' / 2 *** '要素位置は'(L0,_要素位置) :- length([_|L0],_要素位置) . % *** user: '要素がゼロ以外に出会うまで' / 3 *** '要素がゼロ以外に出会うまで'([A|R],[],[A|R]) :- \+((A = 0 ; A = 0.0e+00)), ! . '要素がゼロ以外に出会うまで'([0|R],[0|R1],R2) :- '要素がゼロ以外に出会うまで'(R,R1,R2) . '要素がゼロ以外に出会うまで'([0.0e+00|R],[0.0e+00|R1],R2) :- '要素がゼロ以外に出会うまで'(R,R1,R2) . % *** user: '要素' / 2 *** '要素'(A,B) :- member(A,B) . % *** user: '要素番号によるならびの置換' / 4 *** '要素番号によるならびの置換'(_要素番号,_置換要素,_対象ならび,_置換ならび) :- update_list(_要素番号,_置換要素,_対象ならび,_置換ならび), ! . % *** user: '要素の複製' / 3 *** '要素の複製'(_複製数,_要素,_複製ならび) :- findall(_要素,for(1,N,_複製数),_複製ならび) . % *** user: '要素数' / 2 *** '要素数'(_ならび,_要素数) :- 'ならび'(_ならび), list_length(_ならび,_要素数) . % *** user: '要素数が偶数' / 1 *** '要素数が偶数'(L) :- length(L,N), 0 is N mod 2 . % *** user: '要素数をnで割ると余りがm' / 3 *** '要素数をnで割ると余りがm'(L,_n,_m) :- length(L,Len), _m is Len mod _n . % *** user: '要素数割り算' / 5 *** '要素数割り算'(L1,L2,Div,Div,L1) :- append([_|_],L1,L2), ! . '要素数割り算'(L1,L2,L4,Div,Mod) :- append(L2,L3,L1), length(L2,Len), length(L5,Len), '要素数割り算'(L3,L5,[_|L4],Div,Mod) . % *** user: '要素数割り算' / 4 *** '要素数割り算'(L1,L2,Div,Mod) :- length(L1,Len1), length(L2,Len2), length(L11,Len1), length(L22,Len2), '要素数割り算'(L11,L22,[],Div,Mod) . % *** user: '行の整列' / 5 *** '行の整列'(_,_,_,[],[]) :- ! . '行の整列'(N,S,E,[A|R1],[B|R2]) :- N >= S, N =< E, sort(A,B), M is N + 1, '行の整列'(M,S,E,R1,R2), ! . '行の整列'(N,S,E,[A|R1],[A|R2]) :- \+((N >= S , N =< E)), M is N + 1, '行の整列'(M,S,E,R1,R2), ! . % *** user: '行の整列' / 4 *** '行の整列'(_行目から,_行目まで,_表,_整列した表) :- '行の整列'(1,_行目から,_行目まで,_表,_整列した表), ! . % *** user: '行の整列' / 2 *** '行の整列'(_表,_整列した表) :- list_length(_表,E), '行の整列'(1,1,E,_表,_整列した表), ! . % *** user: '行の反転' / 5 *** '行の反転'(_,_,_,[],[]) :- ! . '行の反転'(N,S,E,[A|R1],[B|R2]) :- N >= S, N =< E, reverse(A,B), M is N + 1, '行の反転'(M,S,E,R1,R2), ! . '行の反転'(N,S,E,[A|R1],[A|R2]) :- \+((N >= S , N =< E)), M is N + 1, '行の反転'(M,S,E,R1,R2), ! . % *** user: '行の反転' / 4 *** '行の反転'(_行目から,_行目まで,_表,_反転した表) :- '行の反転'(1,_行目から,_行目まで,_表,_反転した表), ! . % *** user: '行の反転' / 2 *** '行の反転'(_表,_反転した表) :- list_length(_表,E), '行の反転'(1,1,E,_表,_反転した表), ! . % *** user: '行の置換' / 4 *** '行の置換'(_行番号1,_行番号2,_行列,_置換された行列) :- nth1(_行番号1,_行列,_行1), nth1(_行番号2,_行列,_行2), '要素番号によるならびの置換'(_行番号2,_行1,_行列,_行列2), '要素番号によるならびの置換'(_行番号1,_行2,_行列2,_置換された行列), ! . % *** user: 'すべての要素が0か0.0' / 1 *** 'すべての要素が0か0.0'([]). 'すべての要素が0か0.0'([0|R]) :- 'すべての要素が0か0.0'(R) . 'すべての要素が0か0.0'([0.0e+00|R]) :- 'すべての要素が0か0.0'(R) . % *** user: 'すべての要素' / 2 *** 'すべての要素'([A],A). 'すべての要素'([A|R],A) :- 'すべての要素'(R,A) . % *** user: 'すべての要素が変数である' / 1 *** 'すべての要素が変数である'([V]) :- var(V), ! . 'すべての要素が変数である'([V|R]) :- var(V), 'すべての要素が変数である'(R) . % *** user: 'すべての要素を左右反転する' / 2 *** 'すべての要素を左右反転する'([],[]) :- ! . 'すべての要素を左右反転する'([L1|R1],[L2|R2]) :- reverse(L1,L2), 'すべての要素を左右反転する'(R1,R2) . % *** user: '最初に現れる0ではない要素・位置' / 4 *** '最初に現れる0ではない要素・位置'(Nth,[X|_],Nth,X) :- \+((X = 0 ; X = 0.0e+00)), ! . '最初に現れる0ではない要素・位置'(Mth,[0|R],Nth,X) :- Mth_2 is Mth + 1, '最初に現れる0ではない要素・位置'(Mth_2,R,Nth,X) . '最初に現れる0ではない要素・位置'(Mth,[0.0e+00|R],Nth,X) :- Mth_2 is Mth + 1, '最初に現れる0ではない要素・位置'(Mth_2,R,Nth,X) . % *** user: replace_nth / 5 *** replace_nth(_,_,_,[],[]) :- ! . replace_nth(S,S,Y,[_|R1],[Y|R2]) :- S2 is S + 1, replace_nth(S2,S,Y,R1,R2), ! . replace_nth(S,N,Y,[A|R1],[A|R2]) :- S2 is S + 1, replace_nth(S2,N,Y,R1,R2) . % *** user: '余因子' / 5 *** '余因子'(_n,_正方行列,_i,_j,_余因子) :- 'n次正方行列から、第i行と第j列を取り除いた正方行列(n-1次正方行列の行列式に、(-1)のi+j乗をかけたものを、Aの(i,j)余因子といい、Cijで表します。'(_n,_正方行列,_i,_j,_余因子) . % *** user: '余因子行列の要素が余因子である' / 4 *** '余因子行列の要素が余因子である'(_n,_正方行列,_i,L) :- length(L,_n), findall(_余因子,(nth1(_j,L,_余因子) , '余因子'(_n,_正方行列,_i,_j,_余因子)),L) . % *** user: '余因子行列' / 3 *** '余因子行列'(_n,_正方行列,_余因子行列) :- length(_余因子行列,_n), findall(L,(nth1(_i,_余因子行列,L) , '余因子行列の要素が余因子である'(_n,_正方行列,_i,L)),_余因子行列) . % *** user: '余因子行列で行列値|a|を求める' / 2 *** '余因子行列で行列値|a|を求める'(_a,_行列式_aの値) :- '余因子行列'(_n,_a,_余因子行列), _a = [_aの第一行|_], _余因子行列 = [_余因子行列の第一行|_], '二つのならびの積の和'(_aの第一行,_余因子行列の第一行,_行列式_aの値) . % *** user: '余因子行列を使って逆行列を得る' / 3 *** '余因子行列を使って逆行列を得る'(_n,_正方行列,_逆行列) :- '余因子行列で行列値|a|を求める'(_正方行列,_行列式の値), '余因子行列'(_n,_正方行列,_余因子行列), '転置'(_余因子行列,_転置された余因子行列), '行列のすべての要素に値を掛ける'(1,_n,_転置された余因子行列,1 / _行列式の値,_逆行列) . % *** user: 'とからりすと' / 2 *** 'とからりすと'(A,[A]) :- atomic(A), ! . 'とからりすと'(A 'と' B,C) :- 'とからりすと'(A,A1), 'とからりすと'(B,B1), append(A1,B1,C) . % *** user: '項加算_1' / 3 *** '項加算_1'([],S,S) :- ! . '項加算_1'([A|R],Y,S) :- 'ならび'(A), 'ならび'(Y), !, 'ならび項加算'(A,Y,Z), '項加算_1'(R,Z,S), ! . '項加算_1'([A|R],Y,S) :- atom(A), atom_number(A,I), integer(I), Z is I + Y, '項加算_1'(R,Z,S), ! . '項加算_1'([A|R],Y,S) :- atom(A), atom_number(A,F), real(F), Z is F + Y, '項加算_1'(R,Z,S), ! . '項加算_1'([A|R],Y,S) :- atom(A), '項加算_1'(R,Y,S), ! . '項加算_1'([A|R],Y,S) :- '分数を含む加算'(A,Y,Z), '項加算_1'(R,Z,S) . '項加算_1'(A,Y,S) :- 'とからりすと'(A,L), !, '項加算_1'(L,Y,S) . % *** user: '項加算_2' / 2 *** '項加算_2'([],[]) :- ! . '項加算_2'([L|R],[S|R2]) :- '項加算'(L,S), '項加算_2'(R,R2) . % *** user: '項加算' / 2 *** '項加算'(trunc(L),SL) :- '項加算'(L,SL2), findall(A,(member(B,SL2) , A is trunc(B)),SL), ! . '項加算'('四捨五入'(L),SL) :- '項加算'(L,SL2), findall(A,(member(B,SL2) , A 'は' '四捨五入'(B)),SL), ! . '項加算'('切捨て'(L),SL) :- '項加算'(L,SL2), findall(A,(member(B,SL2) , A 'は' '切捨て'(B)),SL), ! . '項加算'('切り上げ'(L),SL) :- '項加算'(L,SL2), findall(A,(member(B,SL2) , A 'は' '切り上げ'(B)),SL), ! . '項加算'([],L) :- var(L), L = 0, ! . '項加算'([],L) :- \+(var(L)), '加算の変数に零をおく'(L), ! . '項加算'([L|R],SL) :- 'ならび'(L), m_trans([L|R],L1), '項加算_2'(L1,SL), ! . '項加算'(X,S) :- '項加算_1'(X,0,S) . % *** user: '加算' / 2 *** '加算'(truncate(L),SL) :- '加算'(L,SL2), findall(A,(member(B,SL2) , A is truncate(B)),SL), ! . '加算'('四捨五入'(L),SL) :- '加算'(L,SL2), findall(A,(member(B,SL2) , A 'は' '四捨五入'(B)),SL), ! . '加算'('切捨て'(L),SL) :- '加算'(L,SL2), findall(A,(member(B,SL2) , A 'は' '切捨て'(B)),SL), ! . '加算'('切り上げ'(L),SL) :- '加算'(L,SL2), findall(A,(member(B,SL2) , A 'は' '切り上げ'(B)),SL), ! . '加算'([],L) :- var(L), L = 0, ! . '加算'([],L) :- \+(var(L)), '加算の変数に零をおく'(L), ! . '加算'([L|R],SL) :- 'ならび'(L), m_trans([L|R],L1), '加算_2'(L1,SL), ! . '加算'(X,S) :- '加算_1'(X,0,S) . % *** user: '加算_1' / 3 *** '加算_1'([],S,S) :- ! . '加算_1'([A|R],Y,S) :- 'ならび'(A), 'ならび'(Y), !, 'ならび加算'(A,Y,Z), '加算_1'(R,Z,S), ! . '加算_1'([A|R],Y,S) :- atom(A), atom_number(A,I), integer(I), Z is I + Y, '加算_1'(R,Z,S), ! . '加算_1'([A|R],Y,S) :- atom(A), atom_number(A,F), real(F), Z is F + Y, '加算_1'(R,Z,S), ! . '加算_1'([A|R],Y,S) :- atom(A), '加算_1'(R,Y,S), ! . '加算_1'([A|R],Y,S) :- A1 'は' A, Z is A1 + Y, '加算_1'(R,Z,S) . '加算_1'(A,Y,S) :- 'とからりすと'(A,L), !, '加算_1'(L,Y,S) . % *** user: '加算_2' / 2 *** '加算_2'([],[]) :- ! . '加算_2'([L|R],[S|R2]) :- '加算'(L,S), '加算_2'(R,R2) . % *** user: '加算の変数に零をおく' / 1 *** '加算の変数に零をおく'([]) :- ! . '加算の変数に零をおく'([A|R]) :- '変数'(A), A = 0, '加算の変数に零をおく'(R), ! . ならび(L) :- is_list(L). list(L) :- is_list(L). % *** user: '逆交差要素の一' / 5 *** '逆交差要素の一'(_,N,Len,_,[]) :- N > Len, ! . '逆交差要素の一'(M,_,_,_,[]) :- M =< 0, ! . '逆交差要素の一'(M,N,Len,LL,[]) :- M =< M - Len, ! . '逆交差要素の一'(M,N,Len,LL,[]) :- N >= N + Len, ! . '逆交差要素の一'(M,N,Len,LL,[A|R]) :- '行列要素'(M,N,LL,A), M1 is M - 1, N2 is N + 1, '逆交差要素の一'(M1,N2,Len,LL,R), ! . % *** user: '逆行列' / 2 *** '逆行列'(_行列,_逆行列) :- length(_行列,N), '変数正方行列'(1,N,_逆行列), '各行に単位行列の各行を結合して拡張した行列'(N,_行列,_行列の二), '既約ガウス行列に変形'(_行列の二,_既約ガウス行列), '行列の結合'(_,_逆行列,_既約ガウス行列) . % *** user: '各行で最初に現れる0ではない要素が1である' / 1 *** '各行で最初に現れる0ではない要素が1である'([]). '各行で最初に現れる0ではない要素が1である'([_行|R]) :- '最初に現れる0ではない要素が1である'(_行), '各行で最初に現れる0ではない要素が1である'(R) . % *** user: '各行で最初に現れる0ではない要素が1である列において他の要素がすべて0である' / 3 *** '各行で最初に現れる0ではない要素が1である列において他の要素がすべて0である'(_,_,[]). '各行で最初に現れる0ではない要素が1である列において他の要素がすべて0である'(N,_行列,[_行|R]) :- '最初に現れる0ではない要素・位置'(1,_行,_列位置,1), N2 is N + 1, '列において他の要素がすべて0である'(_行列,N,_列位置), '各行で最初に現れる0ではない要素が1である列において他の要素がすべて0である'(N2,_行列,R) . % *** user: '各行に単位行列の各行を結合して拡張した行列' / 3 *** '各行に単位行列の各行を結合して拡張した行列'(N,_行列,_行列の二) :- '単位行列'(N,L), '行列の結合'(_行列,L,_行列の二) . % *** user: '列において他の要素がすべて0である' / 3 *** '列において他の要素がすべて0である'(_行列,N,_列位置) :- length(_行列,Len), findall(U,(for(1,M,Len) , not M = N , nth1(M,_行列,_行) , nth1(_列位置,_行,U)),L), all(L,0), ! . % *** user: '変数分離' / 3 *** '変数分離'([],[],[]) :- ! . '変数分離'([V|R1],[V|R2],R3) :- var(V), '変数分離'(R1,R2,R3) . '変数分離'([A|R1],R2,[A|R3]) :- \+(var(A)), '変数分離'(R1,R2,R3) . % *** user: '変数でない項目だけ置き換える' / 3 *** '変数でない項目だけ置き換える'([],[],[]). '変数でない項目だけ置き換える'([Term|R1],[_|R2],[Term|R3]) :- \+(var(Term)), '変数でない項目だけ置き換える'(R1,R2,R3) . '変数でない項目だけ置き換える'([V|R1],[Term|R2],[Term|R3]) :- var(V), '変数でない項目だけ置き換える'(R1,R2,R3) . % *** user: '変数指定項複写' / 6 *** '変数指定項複写'(M,N,P,P1,V,V1) :- M > N, ! . '変数指定項複写'(M,N,P,P1,V,V1) :- arg(M,P,T), arg(M,P1,T1), '変数指定項複写'(T,T1,V,V1), M1 is M + 1, '変数指定項複写'(M1,N,P,P1,V,V1), ! . % *** user: '変数指定項複写' / 4 *** '変数指定項複写'(P,P1,V,V1) :- struct(P), functor(P,F,A), functor(P1,F,A), '変数指定項複写'(1,A,P,P1,V,V1), ! . '変数指定項複写'(P,P1,L1,L2) :- var(P), list(L1), list(L2), L1 = [V|_], L2 = [P1|_], P == V, ! . '変数指定項複写'(P,P1,L1,L2) :- var(P), list(L1), list(L2), L1 = [V|R1], L2 = [V2|R2], \+(P == V), '変数指定項複写'(P,P1,R1,R2), ! . '変数指定項複写'(P,P1,V,P1) :- var(P), var(V), P == V, ! . '変数指定項複写'(P,P1,V,V1) :- var(P), var(V), \+(P == V), ! . '変数指定項複写'(P,P1,V,V1) :- \+(var(P)), parse_atom(P,1,Q,_), \+(P == Q), sprintf('%q',[P],P1), ! . '変数指定項複写'(P,P,V,V1). % *** user: '変数を順に単一化する' / 3 *** '変数を順に単一化する'(_,[],[]) :- ! . '変数を順に単一化する'([],X,X) :- ! . '変数を順に単一化する'([A|R1],[V|R2],[A|R3]) :- var(V), '変数を順に単一化する'(R1,R2,R3), ! . '変数を順に単一化する'([A|R1],[B|R2],[B|R3]) :- \+(var(B)), '変数を順に単一化する'([A|R1],R2,R3) . % *** user: '変数を順に固定値に置換' / 5 *** '変数を順に固定値に置換'([],_,[],X,X) :- ! . '変数を順に固定値に置換'(R,_,R,[],[]) :- ! . '変数を順に固定値に置換'([_固定値|R0],_忌避変数ならび,R02,[A|R],[A|R1]) :- var(A), \+((member(B,_忌避変数ならび) , A == B)), A = _固定値, '変数を順に固定値に置換'(R0,_忌避変数ならび,R02,R,R1), ! . '変数を順に固定値に置換'([_固定値|R0],_忌避変数ならび,R02,[A|R],[A|R1]) :- var(A), member(B,_忌避変数ならび), A == B, '変数を順に固定値に置換'([_固定値|R0],_忌避変数ならび,R02,R,R1), ! . '変数を順に固定値に置換'([_固定値|R0],_忌避変数ならび,R02,[A|R],[A|R1]) :- atomic(A), '変数を順に固定値に置換'([_固定値|R0],_忌避変数ならび,R02,R,R1), ! . '変数を順に固定値に置換'(_固定値ならび,_忌避変数ならび,R02,[A|R],[B|R1]) :- struct(A), A =.. L, '変数を順に固定値に置換'(_固定値ならび,_忌避変数ならび,R0,L,L1), B =.. L1, '変数を順に固定値に置換'(R0,_忌避変数ならび,R02,R,R1), ! . % *** user: '変数を順に固定値に置換' / 4 *** '変数を順に固定値に置換'(_固定値ならび,_忌避変数ならび,_対象ならび,_置換ならび) :- '変数を順に固定値に置換'(_固定値ならび,_忌避変数ならび,R02,_対象ならび,_置換ならび), ! . % *** user: '変数を順に固定値に置換' / 3 *** '変数を順に固定値に置換'(_固定値ならび,_対象ならび,_置換ならび) :- '変数を順に固定値に置換'(_固定値ならび,[],_対象ならび,_置換ならび), ! . % *** user: '変数名の解決' / 1 *** '変数名の解決'([]) :- ! . '変数名の解決'([Varname = Var|R]) :- var(Var), Varname = Var, '変数名の解決'(R), ! . % *** user: '変数ならびの生成' / 3 *** '変数ならびの生成'(N,N,[]) :- ! . '変数ならびの生成'(S,E,[A|R]) :- S < E, S1 is S + 1, '変数ならびの生成'(S1,E,R) . % *** user: '変数を固定値に置換' / 3 *** '変数を固定値に置換'(A,X,X) :- var(X), A = X, ! . '変数を固定値に置換'(_,[],[]) :- ! . '変数を固定値に置換'(_固定値,[A|R],[A|R1]) :- var(A), A = _固定値, '変数を固定値に置換'(_固定値,R,R1), ! . '変数を固定値に置換'(_固定値,[A|R],[A|R1]) :- atomic(A), '変数を固定値に置換'(_固定値,R,R1), ! . '変数を固定値に置換'(_固定値,[A|R],[B|R1]) :- struct(A), A =.. L, '変数を固定値に置換'(_固定値,L,L1), B =.. L1, '変数を固定値に置換'(_固定値,R,R1), ! . % *** user: '変数束縛表示' / 1 *** '変数束縛表示'([]) :- ! . '変数束縛表示'([VN = V]) :- '表示'('%t = %q',[VN,V]), telling(F), tell(user_output), write_formatted('%t = %q.',[VN,V]), told, tell(F), ! . '変数束縛表示'([VN,V|R]) :- '表示'('%t = %q,',[VN,V]), telling(F), tell(user_output), write_formatted('%t = %q,',[VN,V]), told, tell(F), '変数束縛表示'(R) . % *** user: '変数ならび表示' / 1 *** '変数ならび表示'([]) :- ! . '変数ならび表示'([_変数項]) :- nl, write(_変数項), '表示'('\n%t',[_変数項]), reads(X), !, \+(X = (;)) . '変数ならび表示'([_変数項|_残りならび]) :- nl, write(_変数項), '表示'('\n%t',[_変数項]), '変数ならび表示'(_残りならび) . % *** user: '変数' / 1 *** '変数'(_項) :- var(_項) . % *** user: '変数ならび' / 3 *** '変数ならび'(0,R,R) :- ! . '変数ならび'(N,[_|R],X) :- M is N - 1, '変数ならび'(M,R,X) . % *** user: '変数ならび' / 1 *** '変数ならび'([]) :- ! . '変数ならび'([_変数|_残りならび]) :- '変数'(_変数), !, '変数ならび'(_残りならび) . % *** user: '変数ならび生成' / 2 *** '変数ならび生成'(0,[]) :- ! . '変数ならび生成'(_生成数,[_生成された変数|_残りならび]) :- _残り生成数 'は' _生成数 - 1, '変数ならび生成'(_残り生成数,_残りならび) . % *** user: '変数が存在する' / 1 *** '変数が存在する'([V|_]) :- var(V), ! . '変数が存在する'([Q|_]) :- struct(Q), Q =.. [_|L], '変数が存在する'(L), ! . '変数が存在する'([_|R]) :- '変数が存在する'(R) . % *** user: '変数正方行列' / 3 *** '変数正方行列'(M,N,[]) :- M > N . '変数正方行列'(M,N,[L|R]) :- length(L,N), M2 is M + 1, '変数正方行列'(M2,N,R) . % *** user: '変数は全て単一' / 2 *** '変数は全て単一'([],_). '変数は全て単一'([A|B],A) :- var(A), '変数は全て単一'(B,A) . '変数は全て単一'([A|B],C) :- \+(var(A)), '変数は全て単一'(B,C) . % *** user: '逆置' / 3 *** '逆置'(_順列,_ある要素,_逆置要素) :- append(_,[_ある要素|R],_順列), append(_,[_逆置要素|R1],R), _逆置要素 < _ある要素 . % *** user: '逆交差要素' / 5 *** '逆交差要素'(M,N,Len,LL,X) :- M2 is M + N - 1, '逆交差要素'(M2,Len,LL,X) . % *** user: '逆交差要素' / 4 *** '逆交差要素'(M,Len,_,_) :- M - Len >= Len, !, fail . '逆交差要素'(M,Len,LL,L) :- M =< Len, '逆交差要素の一'(M,1,Len,LL,L) . '逆交差要素'(M,Len,LL,L) :- M > Len, N is M - Len + 1, '逆交差要素の一'(Len,N,Len,LL,L) . '逆交差要素'(M,Len,LL,L) :- M2 is M + 1, '逆交差要素の一'(M2,Len,LL,L) . % *** user: '逆交差要素' / 2 *** '逆交差要素'(LL,L) :- length(LL,Len), '逆交差要素'(1,Len,LL,L) . % *** user: '逆斜行要素' / 7 *** '逆斜行要素'(M,N,Len1,Len2,LL,Z,X) :- M2 is M + N - 1, '逆斜行要素'(M2,Len1,Len2,LL,Z,X) . % *** user: '逆斜行要素' / 6 *** '逆斜行要素'(M,Len1,Len2,_,_,_) :- M - Len1 >= Len1, !, fail . '逆斜行要素'(M,Len1,Len2,LL,Z,L) :- M =< Len1, '逆斜行要素の一'(M,1,Len1,Len2,LL,Z,L) . '逆斜行要素'(M,Len1,Len2,LL,Z,L) :- M > Len1, N is M - Len1 + 1, '逆斜行要素の一'(Len1,N,Len1,Len2,LL,Z,L) . '逆斜行要素'(M,Len1,Len2,LL,Z,L) :- M2 is M + 1, '逆斜行要素の一'(M2,Len1,Len2,LL,Z,L) . % *** user: '逆斜行要素' / 5 *** '逆斜行要素'(M,Len,_,_,_) :- M - Len >= Len, !, fail . '逆斜行要素'(M,Len,LL,Z,L) :- M =< Len, '逆斜行要素の一'(M,1,Len,LL,Z,L) . '逆斜行要素'(M,Len,LL,Z,L) :- M > Len, N is M - Len + 1, '逆斜行要素の一'(Len,N,Len,LL,Z,L) . '逆斜行要素'(M,Len,LL,Z,L) :- M2 is M + 1, '逆斜行要素の一'(M2,Len,LL,Z,L) . % *** user: '逆斜行要素' / 2 *** '逆斜行要素'(LL,L) :- length(LL,Len), '逆斜行要素'(1,Len,LL,_,L) . % *** user: '逆斜行要素の一' / 7 *** '逆斜行要素の一'(_,N,Len1,Len2,_,[],[]) :- N > Len2, ! . '逆斜行要素の一'(M,_,_,_,_,[],[]) :- M =< 0, ! . '逆斜行要素の一'(M,N,Len1,Len2,LL,[],[]) :- M =< M - Len1, ! . '逆斜行要素の一'(M,N,Len1,Len2,LL,[],[]) :- N >= N + Len2, ! . '逆斜行要素の一'(M,N,Len1,Len2,LL,[[M,N]|R1],[A|R2]) :- '行列要素'(M,N,LL,A), M1 is M - 1, N2 is N + 1, '逆斜行要素の一'(M1,N2,Len1,Len2,LL,R1,R2), ! . % *** user: '逆斜行要素の一' / 6 *** '逆斜行要素の一'(M,_,_,_,[],[]) :- M =< 0, ! . % *** user: '上三角行列' / 3 *** '上三角行列'(N,N,_) :- ! . '上三角行列'(M,N,_行列) :- M2 is M + 1, nth1(M2,_行列,_行), findall(0,for(1,I,M),L), append(L,_,_行), '上三角行列'(M2,N,_行列) . % *** user: '上三角行列' / 1 *** '上三角行列'(_行列) :- length(_行列,_行), '上三角行列'(1,_行,_行列) . % *** user: '下三角行列' / 3 *** '下三角行列'(N,N,_) :- ! . '下三角行列'(M,N,_行列) :- nth1(M,_行列,_行), M2 is M + 1, findall(0,for(N,I,M2),L), append(_,L,_行), '下三角行列'(M2,N,_行列) . % *** user: '下三角行列' / 1 *** '下三角行列'(_行列) :- length(_行列,_行), '下三角行列'(1,_行,_行列) . % *** user: '零行列' / 1 *** '零行列'([]) :- ! . '零行列'([A|R]) :- '零行列_1'(A), '零行列'(R) . % *** user: '零行列_1' / 1 *** '零行列_1'([]) :- ! . '零行列_1'([0|R]) :- !, '零行列_1'(R) . '零行列_1'([0.0e+00|R]) :- '零行列_1'(R) . % *** user: '零以外の最初の要素が1' / 1 *** '零以外の最初の要素が1'([1]) :- ! . '零以外の最初の要素が1'([1|_]) :- ! . '零以外の最初の要素が1'([0|R]) :- '零以外の最初の要素が1'(R) . % *** user: '約分の二' / 3 *** '約分の二'(_分子,1,_分子) :- ! . '約分の二'(_分子,1.0,_分子) :- ! . '約分の二'(_分子,_分母,_分子 / _分母). % *** user: '約分' / 2 *** '約分'(B / A,X) :- '最大公約数'(B,A,C), _分子 is B // C, _分母 is A // C, '約分の二'(_分子,_分母,X), ! . % *** user: (all) / 2 *** all([],_). all([A|R],A) :- all(R,A). % *** user: '右下がり対角要素ならび' / 3 *** '右下がり対角要素ならび'(_n,_正方行列,_右下がり対角要素ならび) :- findall(V,(nth1(_nth1,_正方行列,L) , nth1(_nth1,L,V)),_右下がり対角要素ならび) . % *** user: '右上がり対角要素ならび' / 3 *** '右上がり対角要素ならび'(_n,_正方行列,_右上がり対角要素ならび) :- findall(V,(append(_,[L|R],_正方行列) , length([_|R],_nth1) , nth1(_nth1,L,V)),_右上がり対角要素ならび), ! . % *** user: '二つの対角要素を得る' / 4 *** '二つの対角要素を得る'(_n,_正方行列,_右下がり対角要素ならび,_右上がり対角要素ならび) :- '右下がり対角要素ならび'(_n,_正方行列,_右下がり対角要素ならび), '右上がり対角要素ならび'(_n,_正方行列,_右上がり対角要素ならび) . % *** user: '二つの対角要素の積を得る' / 4 *** '二つの対角要素の積を得る'(_n,_正方行列,_右下がり対角要素の積,_右上がり対角要素の積) :- '二つの対角要素を得る'(_n,_正方行列,_右下がり対角要素ならび,_右上がり対角要素ならび), '対角要素の掛算'(_右下がり対角要素ならび,_右下がり対角要素の積), '対角要素の掛算'(_右上がり対角要素ならび,_右上がり対角要素の積) . % *** user: '二つのならびの積の和' / 3 *** '二つのならびの積の和'([],[],0). '二つのならびの積の和'([A|R1],[B|R2],S) :- '二つのならびの積の和'(R1,R2,S_1), S is S_1 + A * B . % *** user: '二つのならびの同一順序要素の結合' / 3 *** '二つのならびの同一順序要素の結合'([],[],[]). '二つのならびの同一順序要素の結合'([A|R1],[B|R2],[C|R3]) :- append(A,B,C), '二つのならびの同一順序要素の結合'(R1,R2,R3) . % *** user: '二つの要素を交換する' / 4 *** '二つの要素を交換する'(L1,_要素位置1,_要素位置2,L2) :- nth1(_要素位置1,L1,A), nth1(_要素位置2,L1,B), '指定要素を置換する'(1,L1,[[_要素位置1,B],[_要素位置2,A]],L2) . % *** user: '対角要素の掛算' / 2 *** '対角要素の掛算'([],1). '対角要素の掛算'([A|R],X) :- '対角要素の掛算'(R,Y), X is A * Y . % *** user: '対角行列' / 3 *** '対角行列'(N,_対角要素が変数の対角行列,_変数ならび) :- integer(N), length(L,N), length(LX,N), findall([X,A],(append(L1,[A|L2],L) , length(L1,N1) , length(L11,N1) , length(L2,N2) , length(L22,N2) , L11 all 0 , L22 all 0 , append(L11,[A|L22],X)),LY), '対角行列_1'(LY,_対角要素が変数の対角行列,_変数ならび) . % *** user: '対角行列' / 2 *** '対角行列'(N,L) :- integer(N), length(LN,N), findall(LN,(append(L1,[A|L2],LN) , L1 all 0 , L2 all 0),L) . % *** user: '対角行列' / 1 *** '対角行列'(L) :- \+(var(L)), length(L,N), length(LN,N), findall(LN,(append(L1,[A|L2],LN) , L1 all 0 , L2 all 0),L) . % *** user: '対角要素' / 4 *** '対角要素'(M,N,_,[]) :- M > N, ! . '対角要素'(M,N,_行列,[_要素|R]) :- nth1(M,_行列,_行), list_length(_行,N), nth1(M,_行,_要素), M2 is M + 1, '対角要素'(M2,N,_行列,R) . % *** user: '対角要素' / 2 *** '対角要素'(_行列,_対角要素) :- list_length(_行列,N), '対角要素'(1,N,_行列,_対角要素) . % *** user: '対角行列_1' / 3 *** '対角行列_1'([],[],[]) :- ! . '対角行列_1'([[L,V]|R1],[L|R2],[V|R3]) :- '対角行列_1'(R1,R2,R3) . % *** user: '対角成分' / 4 *** '対角成分'(M,N,_,[]) :- M > N, ! . '対角成分'(M,N,_行列,[_成分|R]) :- nth1(M,_行列,_行), list_length(_行,N), nth1(M,_行,_成分), M2 is M + 1, '対角成分'(M2,N,_行列,R) . % *** user: '対角成分' / 2 *** '対角成分'(_行列,_対角成分) :- list_length(_行列,N), '対角成分'(1,N,_行列,_対角成分) . % *** user: '対角要素に交差した要素' / 2 *** '対角要素に交差した要素'(_行列,_対角要素に交差した要素) :- reverse(_行列,_行を逆順にした行列), '対角要素'(_行を逆順にした行列,_対角要素の一), reverse(_対角要素の一,_対角要素に交差した要素) . % *** user: '指定要素を置換する' / 4 *** '指定要素を置換する'(_,[],_,[]). '指定要素を置換する'(N,[L1|R1],_置換情報,[L2|R2]) :- member([N,L2],_置換情報), N2 is N + 1, '指定要素を置換する'(N2,R1,_置換情報,R2) . '指定要素を置換する'(N,[L1|R1],_置換情報,[L1|R2]) :- N2 is N + 1, '指定要素を置換する'(N2,R1,_置換情報,R2) . findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). findavg(A,B,C) :- findsum(A,B,S), length(A,D), C is S / D. % *** user: '列の選択' / 3 *** '列の選択'([],_,[]) :- ! . '列の選択'([_列位置|R1],_行,[A|R2]) :- integer(_列位置), nth1(_列位置,_行,A), '列の選択'(R1,_行,R2), ! . '列の選択'([A|R1],_行,[B|R2]) :- \+(integer(A)), B 'は' A, '列の選択'(R1,_行,R2), ! . % *** user: '列の選択' / 3 *** '列の選択'([],_,[]) :- ! . '列の選択'([_列位置|R1],_行,[A|R2]) :- integer(_列位置), nth1(_列位置,_行,A), '列の選択'(R1,_行,R2), ! . '列の選択'([A|R1],_行,[B|R2]) :- \+(integer(A)), B 'は' A, '列の選択'(R1,_行,R2), ! . % *** user: '列の整列' / 5 *** '列の整列'(_,_,_,[],[]) :- ! . '列の整列'(N,S,E,[A|R1],[B|R2]) :- N >= S, N =< E, sort(A,B), M is N + 1, '列の整列'(M,S,E,R1,R2), ! . '列の整列'(N,S,E,[A|R1],[A|R2]) :- \+((N >= S , N =< E)), M is N + 1, '列の整列'(M,S,E,R1,R2), ! . % *** user: '列の整列' / 4 *** '列の整列'(_列目から,_列目まで,_表,_整列した表) :- '行列の転置'(_表,_転置表), '列の整列'(1,_列目から,_列目まで,_転置表,_整列した転置表), '行列の転置'(_整列した転置表,_整列した表), ! . % *** user: '列の整列' / 2 *** '列の整列'(_表,_整列した表) :- '行列の転置'(_表,_転置表), list_length(_転置表,E), '列の整列'(1,1,E,_転置表,_整列した転置表), '行列の転置'(_整列した転置表,_整列した表), ! . % *** user: '列の反転' / 5 *** '列の反転'(_,_,_,[],[]) :- ! . '列の反転'(N,S,E,[A|R1],[B|R2]) :- N >= S, N =< E, reverse(A,B), M is N + 1, '列の反転'(M,S,E,R1,R2), ! . '列の反転'(N,S,E,[A|R1],[A|R2]) :- \+((N >= S , N =< E)), M is N + 1, '列の反転'(M,S,E,R1,R2), ! . % *** user: '列の反転' / 4 *** '列の反転'(_列目から,_列目まで,_表,_反転した表) :- '行列の転置'(_表,_転置表), '列の反転'(1,_列目から,_列目まで,_転置表,_反転した転置表), '行列の転置'(_反転した転置表,_反転した表), ! . % *** user: '列の反転' / 2 *** '列の反転'(_表,_反転した表) :- '行列の転置'(_表,_転置表), length(_転置表,E), '列の反転'(1,1,E,_転置表,_反転した転置表), '行列の転置'(_反転した転置表,_反転した表), ! . % *** user: '列において他の要素がすべて0である' / 3 *** '列において他の要素がすべて0である'(_行列,N,_列位置) :- length(_行列,Len), findall(U,(for(1,M,Len) , not M = N , nth1(M,_行列,_行) , nth1(_列位置,_行,U)),L), all(L,0), ! . 順列(Y,0,[]). 順列(Y,N,[A|X]) :- select(A,Y,Z), M is N - 1, 順列(Z,M,X). 組合せ(L,1,[A]) :- member(A,L). 組合せ([A|R1],N,[A|R2]) :- 'Nを1減らして残り要素の組合せ'(R1,N,R2). 組合せ([_|R1],N,R2) :- 'Nはそのままで残り要素の組合せ'(R1,N,R2). 'Nを1減らして残り要素の組合せ'(R1,N,R2) :- succ(N_1,N), 組合せ(R1,N_1,R2). 'Nはそのままで残り要素の組合せ'(R1,N,R2) :- 組合せ(R1,N,R2). % *** user: 'LU分解' / 2 *** 'LU分解'(LL1,LL2) :- '行数・列数のうち小さい方の回数制御ならび'(LL1,_回数制御ならび), 'LU分解'(_回数制御ならび,LL1,LL2). % *** user: '行数・列数のうち小さい方の回数制御ならび' / 2 *** '行数・列数のうち小さい方の回数制御ならび'(LL1,_回数制御ならび) :- 行数(LL1,_行数), 列数(LL1,_列数), min_list([_行数,_列数],Len), length(Ln,Len). 行数(LL1,_行数) :- length(LL1,_行数). 列数([L|_],_列数) :- length(L,_列数). % *** 'n次正方の疎行列の生成' / 3 *** 'n次正方の疎行列の生成'(_n,_行位置_列位置_値ならび,_n次正方の疎行列) :- 変数正方行列(1,_n,_n次正方の疎行列), 正方の疎行列の生成(_行位置_列位置_値ならび,_n次正方の疎行列), n次正方の疎行列の変数を0で埋める(_n次正方の疎行列). % *** 正方の疎行列の生成 / 2 *** 正方の疎行列の生成([],[]) :- !. 正方の疎行列の生成([[_i,_j,_値]|R],_n次正方の疎行列) :- nth1(_i,_n次正方の疎行列,L), nth1(_j,L,_値), 正方の疎行列の生成(R,_n次正方の疎行列). % *** n次正方の疎行列の変数を0で埋める / 1 *** n次正方の疎行列の変数を0で埋める([]) :- !. n次正方の疎行列の変数を0で埋める([L|R]) :- ならびの変数を0で埋める(L), n次正方の疎行列の変数を0で埋める(R). % *** ならびの変数を0で埋める / 1 *** ならびの変数を0で埋める([]). ならびの変数を0で埋める([0|R]) :- ならびの変数を0で埋める(R),!. ならびの変数を0で埋める([A|R]) :- ならびの変数を0で埋める(R). % *** user: 'LU分解' / 3 *** 'LU分解'([],LL,LL). 'LU分解'([_|Ln],_主小行列_1,[_lL|_LU_3]) :- '_lLと_uLと_主小行列に分割し主小行列部分を計算する'(_主小行列_1,_lL,_uL,_主小行列_2), 'LU分解'(Ln,_主小行列_2,_LU_2), '_uLを主小行列に貼り付ける'(_uL,_LU_2,_LU_3). % *** '_lLと_uLと_主小行列に分割し主小行列部分を計算する' / 4 *** '_lLと_uLと_主小行列に分割し主小行列部分を計算する'([_lL|R1],_lL,_uL,_主小行列) :- _lL = [_l|L], '_uLと_主小行列を切り出す'(_l,R1,_uL,R2), '主小行列部分を計算する'(R2,_lL,_uL,_主小行列). % *** '_uLと_主小行列を切り出す' / 4 *** '_uLと_主小行列を切り出す'(_,[],[],[]). '_uLと_主小行列を切り出す'(_l,[[_u_1|L]|R2],[_u_2|R3],[L|R4]) :- 分数を含む除算(_u_1,_l,_u_2), '_uLと_主小行列を切り出す'(_l,R2,R3,R4). % *** '主小行列部分を計算する' / 4 *** 主小行列部分を計算する([],[],[],[]). 主小行列部分を計算する([L1|R1],_lL,[_u|_uL],[L3|R4]) :- 主小行列部分の一行を計算する(L1,_lL,_u,L3), 主小行列部分を計算する(R1,_lL,_uL,R4). % *** '主小行列部分の一行を計算する' / 4 *** 主小行列部分の一行を計算する([],[],_,[]) :- !. 主小行列部分の一行を計算する([_d_1|R1],[_l|R3],_u,[_d_2|R4]) :- '_d_2 is _d_1 - _u * _l'(_u,_l,_d_1,_d_2), 主小行列部分の一行を計算する(R1,R3,_u,R4). % *** '_d_2 is _d_1 - _u * _l' / 4 *** '_d_2 is _d_1 - _u * _l'(_u,_l,_d_1,_d_2) :- 分数を含む掛算(_u,_l,Y), 分数を含む減算(_d_1,Y,_d_2). % *** '_uLを主小行列に貼り付ける' / 3 *** '_uLを主小行列に貼り付ける'([],[],[]). '_uLを主小行列に貼り付ける'([_u|_uL],[L1|_LU_2],[[_u|L1]|_LU_3]) :- '_uLを主小行列に貼り付ける'(_uL,_LU_2,_LU_3).