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

計算量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).
最終更新:2015年06月15日 14:47