差分リスト

ここでは差分リストについて紹介します。
差分リストは特殊な型ということではなく、
リストとユニフィケーションの合わせ技です。

試しに差分リスト無しで、特定の単語ごとに文章を区切るsplit述語を作成してみましょう。
test:-my_split('ab:cd:e:fg', ':', R),write(R).

my_split(A,C,R):-!,
	name(A,B),name(C,[D]),
	my_split2(B,D,[],R).

my_split2([],_,[],[]):-!.
my_split2([],_,T,[TT]):-!,name(TT,T).
my_split2([D|L],D,T,[TT|R]):-name(TT,T),my_split2(L,D,[],R).
my_split2([A|L],D,T,R):-append(T,[A],TT),my_split2(L,D,TT,R).

||?-test.
[ab,cd,e,fg]
yes
LOOP = 27
第3アリティをバッファとして使って、コロンが来たら第4アリティの結果にatom型にして格納しています。
この時、appendを用いています。
差分リストを使用した方法では、このappendの処理を行わずに同じことができます。

test:-my_split('ab:cd:e:fg', ':', R),write(R).
my_split(A,C,R):-!,
	name(A,B),name(C,[D]),
	my_split2(B,D,T-T,R).

my_split2([],_,T-[],[R]):-list(T),!,name(R,T).
my_split2([],_,_,[]):-!.
my_split2([D|L],D,T-[],[R|Z]):-!,name(R,T),my_split2(L,D,S-S,Z).
my_split2([A|L],D,T-[A|S],R):-my_split2(L,D,T-S,R).

||?-my_splitB('ab:cd:e:fg', ':', R).
R       = [ab,cd,e,fg]
yes
LOOP = 21
コツは第3アリティがT-[]になるまでは両方のTは初期化してない変数が有り、
右側のTが[]になって初めて値が決定するとこです。
因みにT-TはT+T,T/Tとかにしても問題なく動きます。
最終更新:2014年05月08日 10:44