このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1294061094/31
#  [1] 授業単元:C言語 
#  [2] 問題文(含コード&リンク): http://ime.nu/www.dotup.org/uploda/www.dotup.org1341084.txt 
#  
#  ファイルls-Rを読み込んでメモリ上にディレクトリツリーを構築し、全ファイルをホームディレクトリからの相対パスで出力せよ。
#  ※ファイルls-Rはunixコマンドでls-rをしたものです

'ファイルls-Rを読み込んでメモリ上にディレクトリツリーを構築し、全ファイルをホームディレクトリからの相対パスで出力せよ。'(_ホームディレクトリ) :-
        get_lines('ls-R',Lines),
        'メモリ上にディレクトリツリーを構築し、'(Lines,_ディレクトリツリー),
        '全ファイルをホームディレクトリからの相対パスで出力する'(_ホームディレクトリ).

'メモリ上にディレクトリツリーを構築し、'([]) :- !.
'メモリ上にディレクトリツリーを構築し、'([''|R]) :-
        'メモリ上にディレクトリツリーを構築し、'(R),!.
'メモリ上にディレクトリツリーを構築し、'([_ディレクトリ|R]) :-
        sub_atom(_ディレクトリ,_,1,0,':'),
        sub_atom(_ディレクトリ,0,_,1,_ディレクトリパス),
        'メモリ上にディレクトリツリーを構築し、'(_ディレクトリパス,R).

'メモリ上にディレクトリツリーを構築し、'(_,[]) :- !.
'メモリ上にディレクトリツリーを構築し、'(_ディレクトリパス,[''|R]) :-
        'メモリ上にディレクトリツリーを構築し、'(R),!.
'メモリ上にディレクトリツリーを構築し、'(_ディレクトリパス,[_ファイルまたはディレクトリ|R]) :-
        assertz(dir(_ディレクトリパス,_ファイルまたはディレクトリ)),
        'メモリ上にディレクトリツリーを構築し、'(_ディレクトリパス,R).

'全ファイルをホームディレクトリからの相対パスで出力する'(_ホームディレクトリ) :-
        dir(_ディレクトリ,_パス),
        '全ファイルをホームディレクトリからの相対パスで出力する'(_ホームディレクトリ,_パス),fail.
'全ファイルをホームディレクトリからの相対パスで出力する'(_).

'全ファイルをホームディレクトリからの相対パスで出力する'(_ホームディレクトリ,_パス) :-
        dir(_パス,_パス2),
        ホームディレクトリからの相対パス(_ホームディレクトリ,_パス,_相対パス),
        write_formatted('%t/\n',[_相対パス]),
        dir(_パス,_パス2),
        '全ファイルをホームディレクトリからの相対パスで出力する'(_ホームディレクトリ,_パス2).
'全ファイルをホームディレクトリからの相対パスで出力する'(_ホームディレクトリ,_パス) :-
        ホームディレクトリからの相対パス(_ホームディレクトリ,_パス,_相対パス),
        write_formatted('%t\n',[_相対パス]).

ホームディレクトリからの相対パス(_ホームディレクトリ,_パス,_相対パス) :-
        atom_chars(_ホームディレクトリ,Chars1),
        atom_chars(_ホームディレクトリ,Chars2),
        append(Chars2,R,Chars1),
        相対パスの微調整(R,_相対パス).
ホームディレクトリからの相対パス(_ホームディレクトリ,_パス,_相対パス) :-
        split(_ホームディレクトリ,[/],L1),
        split(_パス,[/],L2),
        append(L0,[A|R1],L1),
        append(L0,[B|R2],L2),
        遡り相対パス(A,R1,B,R2,_相対パス).

相対パスの微調整([/|R],_相対パス) :-
        concat_atom(R,_相対パス),!.
相対パスの微調整(L,_相対パス) :-
        concat_atom(L,_相対パス),!.

遡り相対パス(A,R1,B,R2,_相対パス) :-
        \+(A=B),
        findall('..',(
                    append(_,[_|_],[B|R2])),
                LP),
        append(LP,[B|R2],L3),
        concat_atom(L3,'/',_相対パス),!.