このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1291471791/919
#  [1] 授業単元:プログラミング  
#  [2] 問題文(含コード&リンク):  
#  [1] 授業単元:プログラミング  
#  [2] 問題文(含コード&リンク):  
#  http://ime.nu/ideone.com/v82fx 
#  
#  以下のパズルを解くプログラムを作りなさい. 
#  30x30の格子状のマス目を考える.各マス目はONまたはOFFのどちらかの状態をとる.
#  パズルの問題として30x30(すなわち900個)のマス目のON,OFFの状態が与えられる.
#  この初期状態から以下のルールを用いて各マス目のON,OFFの状態を変化させる.
#  ルール1: OFFのマス目の周囲に3つのONのマス目があれば次のステップではONになる.
#  ルール2: ONのマス目の周囲に2つか3つのONのマス目があれば次のステップでもONが維持される.
#  ルール3: 上以外の場合には次のステップではOFFになる.
#  但し,ここでの周囲とはマスに接している8マスを指し,30x30のマスのうち上端と下端, 右端と左端は接続されているものとする.
#  
#  この変化を100回繰り替えした時の各マスの状態を求めよ

'パズルの問題として30x30(すなわち900個)のマス目のON,OFFの状態が与えられる. この初期状態から以下のルールを用いて各マス目のON,OFFの状態を変化させる.'(LL1,LL2) :-
        length(LL2,30),
        findall(_マス目の値2,(
                    length(Line,30),
                    append(L00,[Line|_],LL2),
                    append(L01,[_マス目の値2|_],Line),
                    length(L00,_行の一),
                    length(L01,_列の一),
                    _行 is _行の一 + 1,
                    _列 is _列の一 + 1,
                    マス目の周囲(LL1,_行,_列,_マス目の値1,_マス目の周辺),                    
                    マス目の状態診断(_マス目の値1,_マス目の周辺,_マス目の値2)),
                LL2).

マス目の周囲(LL,1,_マス目の列,_マス目の値,_マス目の周辺ならび) :-
        append(LL0,[L],LL),
        append(LL,[L],LL1),
        マス目の周囲(LL,2,_マス目の列,_マス目の値,_マス目の周辺ならび),!.
マス目の周囲(LL,30,_マス目の列,_マス目の値,_マス目の周辺ならび) :-
        LL = [L1|R],
        append(R,L1,LL2),
        マス目の周囲(LL,29,_マス目の列,_マス目の値,_マス目の周辺ならび),!.
マス目の周囲(LL,_マス目の行,_マス目の列,_マス目の値,_マス目の周辺ならび) :-
        _マス目の行 >= 2,
        _マス目の行 =< 29,
        Nth1 is _マス目の行 - 2,
        length(L0,Nth1),
        append(L0,[Line1,Line2,Line3|_],LL),
        マス目の周囲([Line1,Line2,Line3],_マス目の列,_マス目の値,_マス目の周辺ならび),!.

マス目の周囲([Line1,Line2,Line3],1,_マス目の値,_マス目の周辺ならび),!.
        length(L0,29),
        findall(L,(
                    append(_,[Line|_],[Line1,Line2,Line3]),
                    append(L0,L1,Line),
                    append(L1,L0,L)),
                LL),
        マス目の周囲(Line1,Line2,Line3,2,_マス目の値,_マス目の周辺ならび),!.
マス目の周囲([Line1,Line2,Line3],30,_マス目の値,_マス目の周辺ならび) :-
        length(L1,29),
        findall(L,(
                    append(_,[Line|_],[Line1,Line2,Line3]),
                    append(L0,L1,Line),
                    append(L1,L0,L)),
                LL),
        マス目の周囲(Line1,Line2,Line3,29,_マス目の値,_マス目の周辺ならび),!.
マス目の周囲([Line1,Line2,Line3],_マス目の列,_マス目の値,[A1,A2,A3,A4,A6,A7,A8,A9]) :-
        _マス目の列 >= 2,
        _マス目の列 =< 29,
        Nth1 is _マス目の列 - 2,
        length(L0,Nth1),
        findall(U,(
                    append(_,[Line|_],[Line1,Line2,Line3]),
                    append(L0,[A,B,C|_],Line),
                    append(_,[U|_],[A,B,C])),
                L),
        L = [A1,A2,A3,A4,_マス目の値,A6,A7,A8,A9],!.

マス目の状態診断(_マス目の値,_マス目の周囲,'ON') :-
        'OFFのマス目の周囲に3つのONのマス目があれば次のステップではONになる'(_マス目の値,_マス目の周囲,OFF).
マス目の状態診断(_マス目の値,_マス目の周囲,'ON') :-
        'ONのマス目の周囲に2つか3つのONのマス目があれば次のステップでもONが維持される'(_マス目の値,_マス目の周囲,'ON'),!.
マス目の状態診断(_,_マス目の周囲,'OFF') :- 上以外の場合には次のステップではOFFになる.

上以外の場合には次のステップではOFFになる.

'OFFのマス目の周囲に3つのONのマス目があれば次のステップではONになる'('OFF',_マス目の周囲,'ON') :-
        count((append(_,['ON'|_],_マス目の周囲),2),!.

'ONのマス目の周囲に2つか3つのONのマス目があれば次のステップでもONが維持される'('ON',_マス目の周囲) :-
        count((append(_,['ON'|_],_マス目の周囲),Count),
        Count >= 2,
        Count =< 3,!.

'この変化を100回繰り替えした時の各マスの状態を求めよ'(LL1,LL2) :-
        length(Ln,100),
        'この変化を100回繰り替えした時の各マスの状態を求めよ'(Ln,LL1,LL2).

'この変化を100回繰り替えした時の各マスの状態を求めよ'([],LL,LL) :- !.
'この変化を100回繰り替えした時の各マスの状態を求めよ'([_|Ln],LL1,LL2) :-
        'パズルの問題として30x30(すなわち900個)のマス目のON,OFFの状態が与えられる. この初期状態から以下のルールを用いて各マス目のON,OFFの状態を変化させる.'(LL1,LL3),
        'この変化を100回繰り替えした時の各マスの状態を求めよ'(Ln,LL3,LL2).