リストの中身を構造に関わらず順に出力するprolog

前の記事でごとカテゴリの再帰的構造を持ったリストから、語だけのリストを取り出すことを書いた。その取り出したリストも、構造化されているので、それらをベタに全て出力するprologを記述しようとした。

慣れないので、色々、試行錯誤したが結局次のような簡単な述語になった。

printlist(L) :- atom(L),write(L).
printlist(L) :- [H|[T]] = L,printlist(H),printlist(T),!.

最初のclauseで、それが単項だったらただ印刷するを定義しておいて。リストだった場合には、頭と尻尾を、自身を呼び出すだけのものである。

これで大体以下のような結果になる。

1 ?- [user].
|: printlist(L) :- atom(L),write(L).
|: printlist(L) :- [H|[T]] = L,printlist(H),printlist(T),!.
|: ^D
% user://1 compiled 0.00 sec, 2 clauses
true.

2 ?- printlist([a,[b,c]]).
abc
true.

3 ?- printlist([[a,b],c]).
abc
true.

4 ?- printlist([[a,b],[c,d]]).
abcd
true.

5 ?-  printlist([a,b]).
ab
true.

これだけの範囲では、予定通りの結果が出せている。