このディレクトリの索引
#  S(1≦S≦10)
#  L(100≦L≦100)
#  標準入力から以下の形式で与えられる
#  S L
#  
#  例を参考にoとxを配置せよ
#  
#  例
#  3 2
#  oooxxx
#  oooxxx
#  oooxxx
#  xxxooo
#  xxxooo
#  xxxooo
#  
#  2 3
#  ooxxoo
#  ooxxoo
#  xxooxx
#  xxooxx
#  ooxxoo
#  ooxxoo
#  
#  1 1
#  o
#  
#  2 1
#  oo
#  

:- dynamic(行パターン,1).

白(白).

黒(黒).

'_行数 is S * L,
S(1≦S≦10)
L(100≦L≦100)
標準入力から以下の形式で与えられる
S L' :-
        'S Lを得る'(_s,_l),
        表示パターンの形成(_s,_l,LL1),
        出力する(LL1).

表示パターンの形成(_s,_l,_表示パターン) :-
        行パターンの定義(_s,_l),
        表の形成(_s,_l,_表示パターン),
        転置して具体値を埋める(_表示パターン).

行パターンの定義(_s,_l) :-
        白(_白),
        黒(_黒),
        行パターンの生成(_白,_黒,_s,_l),
        行パターンの生成(_黒,_白,_s,_l).

行パターンの生成(_文字_1,_文字_2,_s,_l) :-
        length(Ln,_l),
        findall(文字,(
                     同一文字列トグル(Ln,_s,_文字_1,_文字_2,_文字)),
                _行パターン),
        assertz(行パターン(_行パターン)).

同一文字列トグル([_|_],_s,_文字,_,_文字) :-
        between(1,_s,_).
同一文字列トグル([_|Ln],_s,_文字_1,_文字_2,_文字) :-
        同一文字列トグル(Ln,_s,_文字_2,_文字_1,_文字).

転置して具体値を埋める([L1|R]) :-
        転置([L1|R],LL2),
        findall(L,(
                    member(L,LL2),
                    行パターン(L)),
                LL2).

表の形成(_s,_l,[_行パターン|LL]) :-
        行パターン(_行パターン),!,
        findall(L,(
                    between(2,_l,_),
                    length(L,_s)),
                LL).

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

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

'S Lを得る'(S,L) :-
        get_line(Line),
        split(Line,[' '],[S,L]).

出力する(LL) :-
        flatten(LL,L),
        forall(member(A,L),format('~w\n',[A])).