このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1308749241/230
#  [1]プログラミング 
#  [2]問題文:行列の中、隣接する値kのみから構成される一つの正方形の範囲はsub-blockと呼ばれる。 
#  一つの正方形を読み込んで、入力値kに対する一番大きいsub-blockを探して、sub-blockの位置と大きさを表示するプログラムを作成せよ。 
#   
#  動作例:http://www.dotup.org/uploda/www.dotup.org1751871.txt.html 
#   
#  [3]環境 [3.1]windows [3.2]gcc [3.3]C言語 
#  [4]期限:7月4日まで 
#  [5]・正方行列はファイルから読み込む事  
#   ・最大sub-blockが複数ある場合は全て表示する事  
#   ・比較回数はできるだけ少なくする事  
# 

'一つの正方形を読み込んで、入力値kに対する一番大きいsub-blockを探して、sub-blockの位置と大きさを表示する'(_行列,N次,_入力値k,_行列の起点位置ならび) :-
        length(_行列,M),
        for(M,N次,1),
        M2 is M - N次 + 1,
        findall([_起点行,_起点列],(
                    for(1,_起点行,M2),
                    for(1,_起点列,M2),
                    行列の中から全てが同一要素の正方行列を切り取る(_行列,N次,_起点行,_起点列,_入力値k,_)),
                _行列の起点位置ならび),
        \+(_行列の起点位置ならび=[]),!.

行列の中から全てが同一要素の正方行列を切り取る(_行列,_n,_起点行,_起点列,_同一の要素,_正方行列) :-
        length([_|L0],_起点行),
        length(L,_n),
        length([_|L01],_起点列),
        length(L2,_n),
        append(L0,L,R1,_行列),
        findall(L2,(
                   append(_,[L3|_],L),
                   append(L01,L2,_,L3),
                   all(L2,_同一の要素)),
                _正方行列),!.

all([],_).
all([V|R],V) :-
        all(R,V).

append([],L1,L2,L) :-
        append(L1,L2,L).
append([A|R1],L1,L2,[A|R]) :-
        append(R1,L1,L2,R).