Prologで繰り返し処理を行う方法
下に示したのは、表(或いは行列)形式で与えられたデータをcsvファイル形式で書き出すプログラムです。
ここでappend/3を使うのはfailでの失敗駆動を避けるためですが、少し不自然な感じがします。
どのように改良したら、もっと分り易いコードになるでしょうか。
put_csv_lines(_csvファイル,_区切り符号,LL) :-
tell(_csvファイル),
一行ずつ表示する(LL),
told.
一行ずつ表示する(LL) :-
append(_,[L|R],LL),
concat_atom(L,_区切り符号,_行表示),
writef('%t\n',[_行表示]),
R = [].
ここで append/3 が使われている主な理由は最後の副目標 R = [] で全ての行が終了した時点で 述語も真で終わりたいからです。その問題がなければ、member/2 で良い筈です。
一行ずつ表示する(Outstream,LL) :-
member(L,LL),
concat_atom(L,_区切り符号,_行表示),
swritef(_改行付き行表示,'%t\n',[_行表示]),
write(Outstream,_改行付き行表示),
fail.
一行ずつ表示する(_,_).
このスタイルを嫌ったのが上記の append/3 を使った定義ということになります。さて、他に これに代わる表現はないでしょうか?