このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1294061094/258
#  すいません不備があったのでもう一度書き込みします。 
#   
#  [1] 授業単元: プログラミング演習  
#  [2] 問題文(含コード&リンク): http://ime.nu/www.dotup.org/uploda/www.dotup.org1355480.txt.html 
#  
#  縦30横30のます目があり、オフのます目の周囲に3つのオンのます目があれば、次の回ではオンになる
#  オンのます目の周りに2つ、3つのます目があれば、次の回でもオンになる
#  これら以外での場合では次の回ではオフになる
#  ますの上端下端、右端左端は接続されている
#  これを50回繰り返したときのますの状態 オン=1 オフ=0で表現
#  初期の状態は外部からあらかじめファイルを呼び出すものとする

'縦30横30のます目があり、オフのます目の周囲に3つのオンのます目があれば、次の回ではオンになる。オンのます目の周りに2つ、3つのます目があれば、次の回でもオンになる。これら以外での場合では次の回ではオフになるますの上端下端、右端左端は接続されている。これを50回繰り返したときのますの状態を オン=1 オフ=0で表現。初期の状態は外部からあらかじめファイルを呼び出すものとする' :-
        '初期の状態は外部からあらかじめファイルを呼び出すものとする'(_外部ファイル,LL),
        length(Ln,50),
        全体のます目を書き換える(Ln,LL1,LL2).

'初期の状態は外部からあらかじめファイルを呼び出すものとする'(_外部ファイル,LL) :-
        see(_外部ファイル),
        read(LL),
        seen,!.

全体のます目を書き換える([],LL,LL) :- !.
全体のます目を書き換える([_|Ln],LL1,LL) :-
        全体のます目を書き換える(LL1,LL2),
        全体のます目を書き換える(Ln,LL2,LL).

全体のます目を書き換える(LL1,LL2) :-
        findall(L,(
                    append(L0,[L1|_],LL1),
                    length(L0,Len0),
                    _行 is Len0 + 1,
                    findall(K,(
                                append(L01,[K1|_],L1),
                                length(L01,Len01),
                                _列 is Len01 + 1,
                                ます目変換(_行,_列,K1,K)),
                            L)),
                LL2).

ます目変換(_行,_列,1,1) :-
        隣接(LL,_行,_列,_隣1,_隣2,_隣3,_隣4),
        S is _隣+_隣2+_隣3+_隣4,
        S >= 2,S =< 3,!.
ます目変換(_行,_列,0,1) :-
        隣接(LL,_行,_列,_隣1,_隣2,_隣3,_隣4),
        3 is _隣+_隣2+_隣3+_隣4,!.
ます目変換(_行,_列,_,0).

隣接(LL,_行,_列,_隣1,_隣2,_隣3,_隣4) :-
        行隣(LL,_行,_列,_隣1,_隣2),
        列隣(LL,_行,_列,_隣3,_隣4),!.

行隣(LL,_行,1,_隣1,_隣2) :-
        list_nth(_行,LL,L1),
        list_nth(30,L1,_隣1),
        list_nth(2,L1,_隣2).
行隣(LL,_行,30,_隣1,_隣2) :-
        list_nth(_行,LL,L1),
        list_nth(29,L1,_隣1),
        list_nth(1,L1,_隣2).
行隣(LL,_行,_列,_隣1,_隣2) :-
        list_nth(_行,LL,L1),
        _列_1 is _列 - 1,
        list_nth(_列_1,L1,_隣1),
        _列_2 is _列 + 1,
        list_nth(_列_2,L1,_隣2),!.

列隣(LL,_行,1,_隣1,_隣2) :-
        list_nth(30,LL,L1),
        list_nth(_列,L1,_隣1),
        list_nth(2,LL,L2),
        list_nth(_列,L2,_隣2),!.
列隣(LL,_行,30,_隣1,_隣2) :-
        list_nth(29,LL,L1),
        list_nth(_列,L1,_隣1),
        list_nth(1,LL,L2),
        list_nth(_列,L2,_隣2),!.
列隣(LL,_行,_列,_隣1,_隣2) :-
        _行1 is _行 - 1,
        list_nth(_行1,LL,L1),
        list_nth(_列,L1,_隣1),
        _行2 is _行 + 1,
        list_nth(_行2,LL,L2),
        list_nth(_列,L2,_隣2),!.