Prolog言語による少し高度な行列式の計算

「Prolog言語による少し高度な行列式の計算」の編集履歴(バックアップ)一覧に戻る

Prolog言語による少し高度な行列式の計算 - (2015/06/15 (月) 14:47:20) のソース

計算量N^2の方法による解法。
 
 
 
 search(R,[L],[R],L):-!.
 search(R,[L|Ls],[R|Ls],L):-
 	nth1(1,L,U),
 	U =\= 0,
 	!.
 search(R,[L|Ls],[L|Ls1],L1):-
 	search(R,Ls,Ls1,L1).
 
 dell(_,[],[],[]):-!.
 dell(M,[X|Xs],[Y|Ys],[Z|Zs]):-
 	Z is Y-X*M,
 	dell(M,Xs,Ys,Zs).
 
 mult(Dell,Num,Num1):- Dell=\=0,Num1 is Num/Dell.
 mult(_,Num,Num):-!.
 
 dell_List(_,[],[]):-!.
 dell_List(L,[L1|Ls1],[L2|Ls2]):-
 	[E|_]=L,
 	[E1|_]=L1,
 	mult(E,E1,M),
 	dell(M,L,L1,L2),
 	dell_List(L,Ls1,Ls2).
 
 dell_top([],[]):-!.
 dell_top([[_|Ls]|Ls1],[Ls|Result]):-
 	dell_top(Ls1,Result).
 
 gyouretu_t([[E]],[E1],S):-!,write([e,E,S]),E1 is E*S.
 gyouretu_t(Mat,[E|Result],S):-
 	[R|Mat1]=Mat,
 	[E|_]=R,
 	((E =\=0 ->Mat2 = Mat1,S1 is S,L = R);(search(R,Mat1,Mat2,L)),S1 is -S),
 	dell_List(L,Mat2,Mat3),
 	dell_top(Mat3,Mat4),
 	[E|_]=L,
  	write(S1),
 	gyouretu_t(Mat4,Result,S1).
 
 mult_list([],M,M):-!.
 mult_list([X|Xs],M,R):-
 	M1 is M*X,
 	mult_list(Xs,M1,R).
 gyouretu_tW(Mat,Ans):-
 	gyouretu_t(Mat,Es,1),
 	write(Es),
 	mult_list(Es,1,Ans).