このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1377511459/294
#  縦横6マスのボックスがあります。 
#  全てのマスを○×で埋めます。 
#  ○と×はそれぞれ連続2個まで繋がっててOK。 
#  縦横の各列は○と×の数は同じにならなければいけない。 
#  ○と×の並び方が他の列と重複するのはNG。(縦と横を比較して同じなのはOK。縦と縦、横と横が同じ並びって言うのがNG) 
#  これはどうやって解けばいいのか教えてください。 
# 
# 


'縦横6マスのボックスがあります。
全てのマスを○×で埋めます。
○と×はそれぞれ連続2個まで繋がっててOK。
縦横の各列は○と×の数は同じにならなければいけない。
○と×の並び方が他の列と重複するのはNG。(縦と横を比較して同じなのはOK。縦と縦、横と横が同じ並びって言うのがNG)
これはどうやって解けばいいのか教えてください。'(LL) :-
        行候補ならびを得る(_行候補ならび),
        面を規定する(LL),
        転置(LL,_転置されたLL),
        面候補を得る(_行候補ならび,LL),
        転置診断(_転置されたLL,_行候補ならび).

行候補ならびを得る(_行候補ならび) :-
        findall(L,(
                    順列([○,○,○,×,×,×],6,L),
                    \+(append(_,[A,A,A|_],L))),
                _重複があり得る行候補ならび),
        sort(_重複があり得る行候補ならび,_行候補ならび).

面を規定する(LL) :-
        length(LL,6),
        findall(L,(
                    member(L,LL),
                    length(L,6)),
                LL).

面候補を得る(_行候補ならび,[L1,L2,L3,L4,L5,L6]) :-
        member(L1,_行候補ならび),
        member(L2,_行候補ならび),
        member(L3,_行候補ならび),
        member(L4,_行候補ならび),
        member(L5,_行候補ならび),
        member(L6,_行候補ならび),
        sort([L1,L2,L3,L4,L5,L6],[_,_,_,_,_,_]).

転置診断(_転置されたLL,_行候補ならび) :-
        sort(_転置されたLL,[_,_,_,_,_,_]),
        findall(_,(
                    member(L,_転置されたLL),
                    member(L,_行候補ならび),
                    \+(append(_,[A,A,A|_],L))),
                [_,_,_,_,_,_]).


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

転置([[]|_],[]) :- !.
転置(L,[L1|R2]) :-
        転置(L,L2,L1),
        転置(L2,R2).

転置([],[],[]) :- !.
転置([[A|R1]|R2],[R1|R3],[A|R4]) :-
        転置(R2,R3,R4).

順列(Y,0,[]).
順列(Y,N,[A|X]) :-
        del(A,Y,Z),
        M is N - 1,
        順列(Z,M,X).

del(A,[A|X],X).
del(A,[B|X],[B|Y]) :-
        del(A,X,Y).