prologにはflattenがあるんだ…

rubyでついつい使っちゃうflatten

> [[1,2,3],[4,5,[6],7]].flatten
=> [1, 2, 3, 4, 5, 6, 7]

なんとprologにもあった。

?- flatten([1,2,3,[4,5,[],6],[7],8],X).
X = [1, 2, 3, 4, 5, 6, 7, 8].

もしかしたらflattenはprolog由来?(schemeには無かったしな)

?- help(flatten).
flatten(+List1, -List2)
    Transform  List1, possibly holding lists  as elements into a  `flat'
    list by replacing  each list with its elements (recursively).  Unify
    the resulting flat list with List2.  Example:

    ?- flatten([a, [b, [c, d], e]], X).

    X = [a, b, c, d, e]

true.

自分で書いてみる

append(X,[],X).
append(X,[Y|YS],[Y|Z]):-append(X,YS,Z).

flatten2([X|XS],A):-flatten2(X,Y),flatten2(XS,Z),append(Z,Y,A).
flatten2([],[]).
flatten2(X,[X]).

実行結果

?- flatten2([[1,2],3],X).
X = [1, 2, 3] .

?- flatten2([[1,2],3,[],4,[5,6,7]],X).
X = [1, 2, 3, 4, 5, 6, 7] .