Я работаю с 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!
Почему это работает на один час и, но не другой? Я чувствую, что мне не хватает чего-то очень простого.
С этой конкретной задачей, пожалуйста, также рассмотрите более общий случай: что должно?? - сгладить ([X], Ls).? Yield? Вы можете подумать, что это «очевидно» должно дать 'Ls = [X]'. Однако у вас есть следующая проблема: '? - flatten ([X], Ls), Ls = [X], X = [a]. * * Успешно *, **, но ** если мы просто обмениваем цели на коммутативность конъюнкции, получим:?? - Ls = [X], X = [a], сгладить ([X], Ls) .' или более компактно,?? - flatten ([[a]], [[ a]]). ', который, конечно же, должен завершиться неудачно *, потому что' [[a]] 'не является плоским списком. Итак, что это? Неудача или успех? Это показывает, что это действительно не очень хорошая связь. – mat
Вот почему я рекомендую вам взглянуть на 'append/2'. Это ограничивает это отношение более значимой, а зачастую и более практичной версией. – mat