このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1266565626/675
#  ../test/read.cgi/tech/1266565626/673 
#  ・とあるディレクトリd0以下に存在する全てのディレクトリをなぞる。 
#   
#  ・このとき、今位置するディレクトリdnの相対的な深さをdとして、 
#   d個のピリオドをディレクトリdnの名前の前に足した文字列> をファイルFに出力する。 
#   
#  ・また、このとき、今位置するディレクトリdnにテキストファイルがあれば、 
#   d+1個のピリオドをテキストファイルtnの名前の前に足し、拡張子.txtを除いた文字列 をファイルFに出力する。 
#  ・さらに、そのテキストファイルtnの内容をそのままファイルFに出力する。 
#   テキストファイルtnの内容の各行頭には、ピリオドはつけない。 
#   テキストファイルtnの内容のとある行頭にピリオドがある場合は、ピリオドの前に半角空白を入れる。 
#   
#  このような仕様です 
#   
#   
#  ../test/read.cgi/tech/1266565626/674 
#  ありがとうございます 
#   
#  まったくの期待通りですが、 
#  ピリオドの数が合わない部分がありました 
#   
#  下のようなディレクトリで試しました 
#  ttp://www1.axfc.net/uploader/Sc/so/128829.zip 
#  ウイルスチェックはしましたが、念のためもう一度お願いします 
#   

'とあるディレクトリd0以下に存在する全てのディレクトリをなぞる'(_出力ファイル,_階層_1,_とあるディレクトリ) :-
        ディレクトリ配下の情報を得る(_とあるディレクトリ,_ファイルディレクトリ情報ならび),
        このディレクトリ配下のファイルを順に表示する(_出力ファイル,_階層_1,_とあるディレクトリ,_ファイルディレクトリ情報ならび),
        配下のディレクトリを取り出す(_とあるディレクトリ,_フィルディレクトリ情報ならび,_階層_1,_階層_2,_デレクトリ_2),
        'とあるディレクトリd0以下に存在する全てのディレクトリをなぞる'(_出力ファイル,_階層_2,_ディレクトリ_2).
'とあるディレクトリd0以下に存在する全てのディレクトリをなぞる'(_,_,_).

ディレクトリ配下の情報を得る(_とあるディレクトリ,_ファイルディレクトリ情報ならび) :-
        atomic_list_concat(['ls -l ',_とあるディレクトリ],S),
        sh(S,_ファイルディレクトリ情報ならび).

このディレクトリ配下のファイルを順に表示する(_出力ファイル,_階層_1,_ディレクトリ,_ファイルディレクトリ情報ならび) :-
        配下のファイルを取り出す(_ファイルディレクトリ情報ならび,_テキストファイル,_入力ファイル),
        テキストファイルtnの内容をそのままファイルFに出力する(_階層_1,_入力ファイル,_テキストファイル,_出力ファイル),
        fail.
このディレクトリ配下のファイルを順に表示する(_,_,_,_).

配下のファイルを取り出す(_ファイルディレクトリ情報ならび,_テキストファイル,_入力ファイル) :-
        append(_,[[A|R1]|R],_ファイルディレクトリ情報ならび),
        sub_atom(A,0,1,_,'-'),
        last(R1,_テキストファイル),
        atomic_list_concat([_ディレクトリ,'/',_テキストファイル],__入力ファイル).

配下のディレクトリを取り出す(_とあるディレクトリ,_フィルディレクトリ情報ならび,_階層_1,_階層_2,_デレクトリ_2) :-
        append(_,[[A|R1]|R],L),
        sub_atom(A,0,1,_,d),
        last(R1,_ディレクトリ),
        atomic_list_concat([_とあるディレクトリ,'/',_ディレクトリ],_ディレクトリ_2),
        _階層_2 is _階層_1 + 1.

'今位置するディレクトリdnの相対的な深さをdとして、d個のピリオドをディレクトリdnの名前の前に足した文字列'(_相対位置,_今位置するディレクトリ,_ピリオドを名前の前に足した文字列) :-
        n個の同じ文字で構成される文字列(_相対位置,'.',S),
        atomic_list_concat([S,_今位置するディレクトリ],_ピリオドを名前の前に足した文字列).

テキストファイルtnの内容をそのままファイルFに出力する(_階層,_入力ファイル,_テキストファイル,_出力ファイル) :-
        'd+1個のピリオドをテキストファイルtnの名前の前に足し、拡張子.txtを除いた文字列を出力ファイルの先頭に書く'(_階層,_テキストファイル,_出力ファイル,Output),
        open(_入力ファイル,read,Input),
        get_char(Input,C),
        テキストファイルtnの内容をそのままファイルFに出力する(Input,Output,C).

'd+1個のピリオドをテキストファイルtnの名前の前に足し、拡張子.txtを除いた文字列を出力ファイルの先頭に書く'(_階層,_テキストファイル,_出力ファイル,Output) :-
        open(_出力ファイル,write,Output),
        'd+1個のピリオドをテキストファイルtnの名前の前に足し、拡張子.txtを除いた文字列'(_階層,_テキストファイル,_文字列),
        write_formatted(Output,'%t\n',[_文字列]).

'd+1個のピリオドをテキストファイルtnの名前の前に足し、拡張子.txtを除いた文字列'(_d,_テキストファイル,_文字列) :-
        _d_1 is _d + 1,
        n個の同じ文字で構成される文字列(_d_1,'.',_ピリオド文字列),
        atomic_list_concat([_ピリオド文字列,_テキストファイル],_ファイル_1),
        sub_atom(_ファイル_1,_開始点_1,4,0,'.txt'),
        sub_atom(_ファイル_1,0,_開始点_1,_,_文字列),!.

テキストファイルtnの内容をそのままファイルFに出力する(Input,Output,end_of_file) :-
        'Input,Outputの終了'(Input,Output).
テキストファイルtnの内容をそのままファイルFに出力する(Input,Output,'\n') :-
        改行処理(Input,Output,C2),
        テキストファイルtnの内容をそのままファイルFに出力する(Input,Output,C2).
テキストファイルtnの内容をそのままファイルFに出力する(Input,Output,C) :-
        改行以外の処理(Input,Output,C,C2),
        テキストファイルtnの内容をそのままファイルFに出力する(Input,Output,C2).

'Input,Outputの終了'(Input,Output) :-
        close(Input),
        close(Output).

改行処理(Input,Output,C2) :-
        put_char(Output,'\n'),
        get_char(Input,C2),
        行頭の特殊事情(Output,C2).

行頭の特殊事情(Output,'.') :-
        put_char(Output,' '),!.
行頭の特殊事情(_,_) :- !.

改行以外の処理(Input,Output,C,C2) :-
        put_char(Output,C),
        get_char(Input,C2).

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

全て同じ文字で構成される文字列(_文字列) :-
        atom_chars(_文字列,Chars),
        all(Chars,_).

n個の同じ文字で構成される文字列(N,_文字,_文字列) :-
        'Nが変数ではない時'(N,_文字,_文字列).
n個の同じ文字で構成される文字列(N,_文字,_文字列) :-
        'Nが変数の時'(N,_文字,_文字列).

'Nが変数ではない時'(N,_文字,_文字列) :-
        \+(var(N)),
        length(Chars,N),
        all(Chars,_文字),
        atom_chars(_文字列,Chars),!.

'Nが変数の時'(N,_文字,_文字列) :-
        var(N),
        atom_chars(_文字列,Chars),
        length(Chars,N),
        all(Chars,_文字).

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