Prolog言語による最も初歩的な行列式の計算

gyouretusiki(3,0,-2,0],[-1,3,1],[4,2,1).
下記コードに対して上記コードのように使う。
中身は
gyouretusiki(正方行列のサイズ,正方行列を2次元配列の要領で渡す).

計算量低減を何もしていないもっとも原始的な行列式の計算プログラム。
サイズ9くらいまではいける。


revSgn(1,-1).
revSgn(-1,1).
swaps(E,Es,R,Re4):-
	append(Re1,[R|Re2],Es),
	Re3=[E|Re2],
	append(Re1,Re3,Re4).

a([],[Sgn],Sgn):-!.
a([E|Es],[E|Rs],Sgn):-
	a(Es,Rs,Sgn).
a([E|Es],[R|Rs1],Sgn):-
	swaps(E,Es,R,Rs),
 	revSgn(Sgn,Sgn1),
	a(Rs,Rs1,Sgn1).

gyouretusiki_sub([],[M],Mult,Mult1):-Mult1 is Mult*M.
gyouretusiki_sub([Row|Rows],[P|Points],Mult,Result):-
	nth1(P,Row,M),
	Mult1 is Mult*M,
 	gyouretusiki_sub(Rows,Points,Mult1,Result).

sum([],Sum,Sum):-!.
sum([X|Xs],Sum,Result):-
	Sum1 is Sum+X,
	sum(Xs,Sum1,Result).

gyouretusiki(Size,Mat):-
	findall(E,between(1,Size,E),Seed),
	findall(E2,a(Seed,E2,1),Seed2),
	findall(E4,(member(E3,Seed2),
		   gyouretusiki_sub(Mat,E3,1,E4))
	       ,Ans0),
	sum(Ans0,0,Ans1),
	write(Ans1). 
最終更新:2015年06月04日 10:35