このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1294061094/230
#  [1] 授業単元: プログラミング 
#  [2] 問題文(含コード&リンク):  
#  y.txtというアルファベットしか含まれていない単純なテキストファイルを用意します。  
#  それをC言語にて読み込んでランレングス圧縮します。  
#  そしてそれを圧縮したz.txtを新たに作り出します。  
#  作成した後、z.txtをもとのy.txtに戻す(復号化)プログラムを作成せよ。 
#  

'y.txtというアルファベットしか含まれていない単純なテキストファイルを用意します' :-
        length(L,1000),
        'y.txtというアルファベットしか含まれていない単純なテキストファイルを用意します'(L),
        put_chars('y.txt',L).

'y.txtというアルファベットしか含まれていない単純なテキストファイルを用意します'(L) :-
        アルファベットしか含まれていない文字列(L1),
        append(L1,R,L),
        'y.txtというアルファベットしか含まれていない単純なテキストファイルを用意します'(R),!.
'y.txtというアルファベットしか含まれていない単純なテキストファイルを用意します'([]) :- !.
'y.txtというアルファベットしか含まれていない単純なテキストファイルを用意します'(L) :-
        アルファベットしか含まれていない文字列(L1),
        ならびに書き込む(L1,L),
        append(L1,R,L),
        'y.txtというアルファベットしか含まれていない単純なテキストファイルを用意します'(R),!.
ならびに書き込む(L1,L,R) :-
        append(L1,R,L),!.
ならびに書き込む(L,L,[]).

アルファベットしか含まれていない連続文字ならび(L) :-
        Char is (random mod 26) + 65,
        連続出現(_連続数),
        length(_連続文字ならび,_連続数),
        all(_連続文字ならび,_乱順に選択された),
        アルファベットしか含まれていない文字列(L2),
        append(L1,L2,L).
        
連続出現(_連続数) :-
        Nth is (random mod 16) + 1,
        list_nth(Nth,[1,1,1,1,1,1,2,2,2,2,3,3,4,4,4,8],_連続数).

それ読み込んでランレングス圧縮します([A|R],L) :-
        append(L0,[B|R2],[A|R]),
        \+(A = B),
        all(L0,A),
        length(L0,Len),
        それ読み込んでランレングス圧縮します([B|R2],L2),
        append(L0,L2,L).
それ読み込んでランレングス圧縮します(_,[]) :- !.

'そしてそれを圧縮したz.txtを新たに作り出します'(L) :-
        put_chars('z.txt',L).

'作成した後、z.txtをもとのy.txtに戻す(復号化)' :-
        get_chars('z.txt',L1),
        ランレングス復号(L1,L2),
        put_chars('y.txt',L2).

ランレングス復号([],[]) :- !.
ランレングス復号([Char,N|R1],L) :-
        length(L0,N),
        all(L0,Char),
        ランレングス復号(R1,L1),
        appned(L0,L1,L).