前の記事でごとカテゴリの再帰的構造を持ったリストから、語だけのリストを取り出すことを書いた。その取り出したリストも、構造化されているので、それらをベタに全て出力する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.
これだけの範囲では、予定通りの結果が出せている。