差分リスト

「差分リスト」の編集履歴(バックアップ)一覧はこちら

差分リスト」(2014/05/08 (木) 10:44:09) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

ここでは差分リストについて紹介します。 差分リストは特殊な型ということではなく、 リストとユニフィケーションの合わせ技です。 試しに差分リスト無しで、特定の単語ごとに文章を区切る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
ここでは差分リストについて紹介します。 差分リストは特殊な型ということではなく、 リストとユニフィケーションの合わせ技です。 試しに差分リスト無しで、特定の単語ごとに文章を区切る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とかにしても問題なく動きます。

表示オプション

横に並べて表示:
変化行の前後のみ表示: