このディレクトリの索引
#  お題: 
#  入力 
#  AND 
#  
#  出力 
#  DDDDD 
#  DNNND 
#  DNAND 
#  DNNND 
#  DDDDD 
#  

囲み(_入力) :-
        atom_chars(_入力,[_中心の文字|_囲み文字ならび]),
        囲み(_囲み文字ならび,[[_中心の文字]],_囲み),
        出力(_囲み).

囲み([],_囲み,_囲み) :- !.
囲み([_文字|R],_囲み_1,_囲み) :-
        文字で囲む(_文字,_囲み_1,_囲み_2),
        囲み(R,_囲み_2,_囲み).

文字で囲む(_文字,_囲み_1,_囲み_2) :-
        囲みの先頭と末尾に_文字の行を付加する(_文字,_囲み_1,_先頭と末尾に_文字の行を付加された囲み_1),
        囲みの各行の先頭と末尾に_文字を付加する(_文字,_先頭と末尾に_文字の行を付加された囲み_1,_囲み_2).

囲みの先頭と末尾に_文字の行を付加する(_文字,_囲み,_先頭と末尾に_文字の行を付加された囲み_1) :-
        転置(_囲み_1,_転置された囲み_1),
        行の先頭と末尾に文字を付加する(_文字,_転置された囲み_1,_行の先頭と末尾に_文字を付加された転置された囲み_1),
        転置(_行の先頭と末尾に文字を付加された転置された囲み_1,_先頭と末尾に_文字の行を付加された囲み_1).

囲みの各行の先頭と末尾に_文字を付加する(_文字,_囲み,_行の先頭と末尾に_文字を付加された囲み) :-
        findall(_先頭と末尾に_文字を付加された行,(
                    member(_行,_囲み),
                    append([_文字|_行],[_文字],_先頭と末尾に_文字を付加された行)),
                _行の先頭と末尾に_文字を付加された囲み).

出力(_囲み) :-
        forall(member(_行,_囲み),(atomic_list_concat(_行,_行文字列),writef('%t\n',[_行文字列])).

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

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