Prolog を使って数日しか経っていません。私はいくつかのことを理解していますが、これは本当に私を混乱させます。
リストを受け取ってそれを平坦化する関数を書くとします。
?- flatten([a,[b,c],[[d],[],[e]]],Xs).
Xs = [a,b,c,d,e]. % expected result
この関数は、リストの内部構造を取り出します。
これは私がこれまでに持っているものです:
flatten2([],[]).
flatten2([Atom|ListTail],[Atom|RetList]) :-
atom(Atom), flatten2(ListTail,RetList).
flatten2([List|ListTail],RetList) :-
flatten2(List,RetList).
今、これは私が呼び出すときに動作します:
?- flatten2([a,[b,c],[[d],[],[e]]], R).
R = [a,b,c,d,e]. % works as expected!
しかし、入力したリストがすでにフラット化されているかどうかを確認するために呼び出すと、次false
の代わりにが返されtrue
ます。
?- flatten2([a,[b,c],[[d],[],[e]]], [a,b,c,d,e]).
false. % BAD result!
一方では機能するのに、他方では機能しないのはなぜですか? 非常に単純なものが欠けているように感じます。