このディレクトリの索引

http://pc12.2ch.net/test/read.cgi/tech/1250204272/412
#  [1] 授業単元:C言語・基礎応用 
#  [2] 問題文(含コード&リンク): 
#  http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9940.txt 

# //プロトタイプの宣言//
# void DataSave(void);
# void DataLoad(void);
# 
# //グローバル変数の宣言//
# g_aData[20] = {1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,4,4};
# 
# グローバル変数に格納された配列の数字列を読み込んで
# ランレングス符号化を行い、バイナリデータとして
# 圧縮・解凍するプログラムを作成せよ。

ランレングス符号化圧縮([],[]) :- !.
ランレングス符号化圧縮(L1,[A,Len|R]) :-
    先頭から同一要素(L1,[A|R1],R2),
    length([A|R1],Len),
    ランレングス符号化圧縮(R2,R).

ランレングス符号化解凍([],[]) :- !.
ランレングス符号化解凍([A,Len|R1],L) :-
    ランレングス符号化解凍の二(L,Len,A,R2),
    ランレングス符号化解凍(R1,R2).

先頭から同一要素([],[],[]) :- !.
先頭から同一要素([A,A|R],[A|R2],R3)
  :-
    先頭から同一要素([A|R],R2,R3),!.
先頭から同一要素([A|R],[A],R)
  :-
    not([A|_]=R),!.

ランレングス符号化解凍の二([A|R],1,A,R) :- !.
ランレングス符号化解凍の二([A|R1],M,A,R) :-
    M1 is M - 1,
    ランレングス符号化解凍の二(R1,M1,A,R).