このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1357748713/595
#  [1] 授業単元: C言語 
#  [2] 問題文(含コード&リンク): 
#  5列5行の多次元配列(0または1が適当に並べられているもの)を用意し 
#  1がある配列の上下左右の配列のうち2または3個1が存在するならその配列を0に変更し 
#  そうでない場合は1のままにする この操作を10回行った配列を求めるプログラムを作成する 
#  またこの配列は上下左右繋がっていて1,1の配列の場合上は1,5、左は5.1である 
#  

'5列5行の多次元配列(0または1が適当に並べられているもの)を用意し
1がある配列の上下左右の配列のうち2または3個1が存在するならその配列を0に変更し
そうでない場合は1のままにする
この操作を10回行った配列を求めるプログラムを作成する
またこの配列は上下左右繋がっていて1,1の配列の場合上は1,5、左は5.1である'(_5列5行の多次元配列,_変換された5列5行の多次元配列) :-
        '5列5行の多次元配列(0または1が適当に並べられているもの)を用意し1がある配列の上下左右の配列のうち2または3個1が存在するならその配列を0に変更しそうでない場合は1のままにするこの操作を10回行った配列を求める'(_5列5行の多次元配列,_変換された5列5行の多次元配列).

'5列5行の多次元配列(0または1が適当に並べられているもの)を用意し1がある配列の上下左右の配列のうち2または3個1が存在するならその配列を0に変更しそうでない場合は1のままにするこの操作を10回行った配列を求める'(_5列5行の多次元配列,_変換された5列5行の多次元配列) :-
        前後左右の配列に1が2または3個存在するならこの配列の列全体を0に置換する(0,_5列5行の多次元配列,_変換された5列5行の多次元配列).

前後左右の配列に1が2または3個存在するならこの配列の列全体を0に置換することを10回繰り返す(10,_5列5行の多次元配列,_5列5行の多次元配列) :- !.
前後左右の配列に1が2または3個存在するならこの配列の列全体を0に置換することを10回繰り返す(N,_5列5行の多次元配列_1,_変換された5列5行の多次元配列) :-
        前後左右の配列に1が2または3個存在するならこの配列の列全体を0に置換する(_5列5行の多次元配列_1,_5列5行の多次元配列_2),
        N_2 is N + 1,
        前後左右の配列に1が2または3個存在するならこの配列の列全体を0に置換することを10回繰り返す(N2,_5列5行の多次元配列_2,_変換された5列5行の多次元配列).

前後左右の配列に1が2または3個存在するならこの配列の列全体を0に置換する(_5列5行の多次元配列_1,_5列5行の多次元配列_2) :-
        列の置換(_5列5行の多次元配列_1,_置換された5列5行の多次元配列_1),
        行の置換(_5列5行の多次元配列_1,_置換された5列5行の多次元配列_2),
        二つの配列の論理積を取る(_置換された5列5行の多次元配列_1,_置換された5列5行の多次元配列_2,_5列5行の多次元配列_2).

行の置換(_5列5行の多次元配列,_置換された5列5行の多次元配列) :-
        '最終行を前、第一行を後ろに付加した5列6行の多次元配列'(_5列5行の多次元配列,_5列7行の多次元配列),
        findall(L,(
                    append(L0,[_前の行,_行,_後の行|R],_5列7行の多次元配列),
                    '1が2または3個存在するならこの配列の列全体を0に置換する'(_前の行,_行,_後の行,L)),
                _置換された5列5行の多次元配列).

列の置換(_5列5行の多次元配列,_置換された5列5行の多次元配列) :-
        転置(_5列5行の多次元配列,_転置された5列5行の多次元配列),
        行の置換(_転置された5列5行の多次元配列,_置換された転置された5列5行の多次元配列_1),
        転置(_置換された転置された5列5行の多次元配列_1,_置換された5列5行の多次元配列).

'最終行を前、第一行を後ろに付加した5列7行の多次元配列'(_5列5行の多次元配列,_5列7行の多次元配列) :-
        last(_5列5行の多次元配列,_最終行),
        _5列5行の多次元配列 = [_第一行|_],
        append([_最終行|_5列5行の多次元配列],[_第一行],_5列7行の多次元配列),!.

'1が2または3個存在するならこの配列の列全体を0に置換する'(_前の行,_行,_後の行,[0,0,0,0,0]) :-
        count(member(1,_前の行),_前の行の1の個数),
        between(2,3,_前の行の1の個数),!.
'1が2または3個存在するならこの配列の列全体を0に置換する'(_前の行,_行,_後の行,[0,0,0,0,0]) :-
        count(member(1,_後の行),_後の行の1の個数),
        between(2,3,_後の行の1の個数),!.
'1が2または3個存在するならこの配列の列全体を0に置換する'(_,_行,_,_行).

二つの配列の論理積を取る([],[],[]) :- !.
二つの配列の論理積を取る([L1|R1],[L2|R2],[L3|R3]) :-
        '2つのならび要素の論理積'(L1,L2,L3),
        二つの配列の論理積を取る(R1,R2,R3).

'2つのならび要素の論理積'([],[],[]) :- !.
'2つのならび要素の論理積'([N1|R1],[N2|R2],[N3|R3]) :-
        N3 is N1 /\ N2,
        '2つのならび要素の論理積'(R1,R2,R3).