Но ваш алгоритм все же был интересен. Существует встроенный last/2
(по крайней мере, в SWI Prolog), который не страдает от снижения производительности вашего рекурсивного подхода. С этим, вот версия, которая реализует вашу идею:
symmetric([]).
symmetric([L]).
symmetric([H|T]):-
last(T,H), % this forces the last element to equal the first
append(T1,[H],T), % this deconstructs the rest list in one without the last elem.
symmetric(T1). % and recurses on that
Интересно использование предиката append/3
для деконструкции начального списка отдыха в список отдыха без последнего элемента.
РЕДАКТИРОВАТЬ: я понял, что я могу обойтись даже без last/2
, просто с append/3
. Итак, вот улучшенная версия:
symmetric([]).
symmetric([L]).
symmetric([H|T]):-
append(T1,[H],T), % deconstruct and assure symmetry
symmetric(T1). % and recurse
Теперь, здесь append
выполняет деконструкцию для получения T1, а также обеспечивает соответствие последнего элемента списка первому: -).