このディレクトリの索引


正方行列の要素積(_正方行列,_行列の要素積) :-
        length(_正方行列,_n),
        'n次正方行列の各行と各列から、要素を一つずつ、重複しないように取り出して、その要素積を取る'(_n,_正方行列,_行列の要素積).

'n次正方行列の各行と各列から、要素を一つずつ、重複しないように取り出して、その要素積を取る'(_n,_n次正方行列,_行列の要素積) :-
        '1からnまでの順列(_n,_順列),
        '各行と各列から、要素を一つずつ、重複しないように取り出して'(_順列,_n次正方行列,_要素ならび),
        その要素積を取る(_要素ならび,_行列の要素積).

'1からnまでの順列'(_n,_順列) :-
        findall(_整数,(
                    between(1,_n,_整数)),
                _1からnまでの整数ならび),
        順列(_1からnまでの整数ならび,_n,_順列).

'各行と各列から、要素を一つずつ、重複しないように取り出して'([],[],[]).
'各行と各列から、要素を一つずつ、重複しないように取り出して'([_列目|R1],[_行|R2],[_要素|R3]) :-
        nth1(_列目,_行,_要素),
        '各行と各列から、要素を一つずつ、重複しないように取り出して'(R1,R2,R3).

その要素積を取る(_要素ならび,_行列の要素積) :-
        ならびの積(_要素ならび,_行列の要素積).

ならびの積([],1).
ならびの積([A|R],M) :-
        ならびの積(R,M_2),
        M is A * M_2.

順列(Y,0,[]).
順列(Y,N,[A|X]) :-
        del(A,Y,Z),
        M is N - 1,
        順列(Z,M,X).

del(A,[A|X],X).
del(A,[B|X],[B|Y]) :-
        del(A,X,Y).