我只在Prolog工作了幾天。我瞭解一些事情,但這真令我困惑。在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!
爲什麼它在一個工作手,但不是其他?我覺得我錯過了很簡單的事情。
有了這個特定的任務,還請考慮一個更一般的情況:什麼應該'? - flatten([X],Ls)。yield?你可能會認爲它「顯然」應該產生'Ls = [X]'。然而,你有以下問題:'? - flatten([X],Ls),Ls = [X],X = [a]。* *成功*,**但是**如果我們簡單地交換目標我們得到:??Ls = [X],X = [a],flatten([X],Ls)。,或者更緊湊地說,'? - flatten([[a]],[[ a]])。',當然*必須失敗*,因爲[[a]]不是一個平面列表。那麼,這是什麼?失敗或成功?這表明這根本不是一個很好的關係。 – mat 2015-05-07 08:39:10
這就是爲什麼我建議你看看'append/2'。它將這種關係限制在一個更有意義且通常也更實用的版本上。 – mat 2015-05-07 08:55:56