このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1349527750/628
#  [1] c言語 
#  [2] 問題文:C言語でのポインタを使った行列の操作です。 
#  1 2 3 0 
#  0 0 0 1 
#  2 0 0 2 
#  0 0 0 1 
#  をファイルから読み込み,以下の操作を実行せよ。 
#  1,非零の要素を左から右へ、上から下へ書きならべた配列を作り、 
#  [1 2 3 1 2 2 1]とする。 
#  2,各要素が何行目・何列目にあるかを別の配列に格納し、 
#  A = [1 2 3 1 2 2 1] 非零要素リスト 
#  IA = [1 1 1 2 3 3 4] i行 
#  JA = [1 2 3 4 1 4 4] j列 
#  の配列が出力されるようにせよ。 
#  3,何番目の要素からiが始まるかを書きならべる。 
#  IAの中で、1が初めに出現するのは1番目、2が初めに出現するのは4番目、3が初めに出現するのは5番目、4が初めに出現するのは7番目なので、 
#  IA' = [1 4 5 7] の配列が出力されるようにせよ 
#   
#  

'非零の要素を左から右へ、上から下へ書きならべた配列を作り'(_行列,_非零要素ならび) :-
        flatten(_行列,_要素ならび),
        findall(_非零要素,(
                    member(_非零要素,_行列),
                    \+(_非零要素 = 0)),
               _非零要素ならび).

'各要素が何行目・何列目にあるかを別の配列に格納し'(_行列,_非零要素ならび,_非零要素の元々の行位置ならび,_非零要素の元々の列位置ならび) :-
        findall([_非零要素,_非零要素の元々の行位置,_非零要素の元々の列位置],(
                    nth1(_非零要素の元々の行位置,_行列,_行),
                    nth1(_非零要素の元々の列位置,_行,_非零要素),
                    \+(_非零要素 = 0)),
                LL),
        三つのならびに分解(LL,_非零要素ならび,_非零要素の元々の行位置ならび,_非零要素の元々の列位置ならび).

三つのならびに分解([],[],[],[]).
三つのならびに分解([[A,B,C]|R1],[A|R2],[B|R3],[C|R4]) :-
        三つのならびに分解(R1,R2,R3,R4).

'何番目の要素からiが始まるかを書きならべる。IAの中で、1が初めに出現するのは1番目、2が初めに出現するのは4番目、3が初めに出現するのは5番目、4が初めに出現するのは7番目なので、IA = [1 4 5 7] の配列が出力されるようにせよ'(_非零要素の元々の行位置ならび,_何番目の非零要素から元々の行列での行が変わったかを示すならび) :-
        findall(_何番目,(
                    append(L0,[I|R],_非零要素の元々の行位置ならび),
                    \+(member(I,L0),
                    length([_|L0],_何番目)),
                _何番目の非零要素から元々の行列での行が変わったかを示すならび).