このディレクトリの索引


行列から行を取り出す(_行列,_行) :-
        行列から行を取り出す(_行列,_,_行).

行列から行を取り出す(_行列,_行目,_行) :-
        nth1(_行目,_行列,_行).

行列から列を取り出す(_行列,_列) :-
        行列から列を取り出す(_行列,_nth1,_列).

行列から列を取り出す(_行列,_列目,_列) :-
        転置(_行列,_転置された行列),
        nth1(_列目,_転置された行列,_列).

行列の位置要素を取り出す(_行列,_行目,_列目,_要素) :-
        nth1(_行目,_行列,_行),
        nth1(_列目,_行,_要素).

行列の要素を置換する(_行列,_置換対象値,_置換値,_置換された行列) :-
        findall(_置換された行,(
                    member(_行,_行列),
                    行を全置換する(_行,_置換対象値,_置換値,_置換された行)),
                _置換された行列).

行を全置換する([],_,_,[]).
行を全置換する([A|R1],A,B,[B|R4]) :-
        行を全置換する(R1,A,B,R4),!.
行を全置換する([C|R1],A,B,[C|R4]) :-
        行を全置換する(R1,A,B,R4).

行列の位置要素を置換する(_行列,_行目,_列目,_値,_置換された行列) :-
        行を取り出す(_行列,_行目,_それまでの行ならび,_行,_それより後の行ならび),
        行の列要素を置換する(_行,_列目,_値,_置換された行),!,
        append(_それまでの行ならび,[_置換された行|_それより後の行ならび],_置換された行列).

行を取り出す(_行列,_行目,_それまでの行ならび,_行,_それより後の行ならび) :-
        _行目_1 is _行目 - 1,
        length(_それまでの行ならび,_行目_1),
        append(_それまでの行ならび,[_行|_それより後の行ならび],_行列).

行の列要素を置換する(_行,_列目,_値,_置換された行) :-
        _列目_1 is _列目 - 1,
        length(L0,_列目_1),
        append(L0,[_|R],_行),
        append(L0,[_値|R],_置換された行).

行列の行を入れ替える(_行列,_行目_1,_行目_2,_入れ替えた行列) :-
        _行目_1 > _行目_2,
        行列の行を入れ替える(_行列,_行目_2,_行目_1,_入れ替えた行列).
行列の行を入れ替える(_行列,_行目_1,_行目_2,_入れ替えた行列) :-
        _行目_1 < _行目_2,
        行列の行を取り出す(_行列,_行目_2,_前ならび_2,_行_2,_後ろならび_2),
        行列の行を取り出す(_前ならび_2,_行目_1,_前ならび_1,_行_1,_後ろならび_1),        append(_前ならび_1,[_行_2|_後ろならび_1],_前ならび_2_2),
        append(_前ならび_2_2,[_行_1|_後ろならび_2],_入れ替えた行列).

行列の行を取り出す(_行列,_行目_2,_前ならび_2,_行_2,_後ろならび_2) :-
        _行目_2_1 is _行目_2 - 1,
        length(_前ならび_2,_行目_2_1),
        append(_前ならび_2,[_行_2|_後ろならび_2],_行列).

行列の行を取り出す(_前ならび_2,_行目_1,_前ならび_1,_行_1,_後ろならび_1) :-
        _行目_1_1 is _行目_1 - 1,
        length(_前ならび_1,_行目_1_1),
        append(_前ならび_1,[_行_1|_後ろならび_1],_前ならび_2).

行列の列を入れ替える(_行列,_列目_1,_列目_2,_入れ替えた行列) :-
        転置(_行列,_転置された行列),
        行列の行を入れ替える(_転置された行列,_列目_1,_列目_2,_入れ替えた転置された行列),
        転置(_入れ替えた転置された行列,_入れ替えた行列).

行全体をn倍する(_行列,_行目,_n倍,_行がn倍された行列) :-
        _行目_1 is _行目 - 1,
        length(L0,_行目_1),
        append(L0,[_行|R],_行列),
        行要素全てをn倍する(_行,_n倍,_全ての要素がn倍された行),
        append(L0,[_全ての要素がn倍された行|R],_行がn倍された行列).

行要素全てをn倍する([],_,[]) :- !.
行要素全てをn倍する([A|R1],_n倍,[B|R2]) :-
        B is A * _n倍,
        行要素全てをn倍する(R1,_n倍,R2).

列全体をn倍する(_行列,_列目,_n倍,_列がn倍された行列) :-
        転置(_行列,_転置された行列),
        行全体をn倍する(_転置された行列,_列目,_n倍,_行がn倍された転置された行列),
        転置(_行がn倍された転置された行列,_列がn倍された行列).

二つの行のある列要素がそれぞれの最小公倍数になるように二つの行を倍する(_行列,_行目_1,_行目_2,_列目,_変形した行列) :-
        行列の位置要素を取り出す(_行列,_行目_1,_列目,_要素_1),
        行列の位置要素を取り出す(_行列,_行目_2,_列目,_要素_2),
        最小公倍数を取る(_要素_1,_要素_2,_最小公倍数),
        _行目_1の倍数 is _最小公倍数 // _要素_1,
        _行目_2の倍数 is _最小公倍数 // _要素_2,
        行全体をn倍する(_行列,_行目_1,_行目_1の倍数,_行列_2),
        行全体をn倍する(_行列,_行目_2,_行目_2の倍数,_変形した行列).

転置([],[],[]) :- !.
転置([[A|R1]|R2],[R1|R3],[A|R4]) :-
        転置(R2,R3,R4).

転置([[]|_],[]) :- !.
転置(L,[L1|R2]) :-
        転置(L,L2,L1),
        転置(L2,R2).