Пролог: Предикат палиндрома никогда не завершается успешно

Я разработал алгоритм проверки палиндрома, который просто переворачивает заданный список элементов; используя наивный реверс. Затем программа проверяет, дает ли она тот же список или нет. Но у меня, кажется, проблема, которую я не могу понять. Программа всегда возвращает false. Вот программа, которую я разработал до сих пор...

reverseCurrentList([H|T],ReversedList):-
    reverseCurrentList(T,RevT),
    append(RevT,[H],ReversedList).

isPalindrome(GivenList):- 
    reverseCurrentList(GivenList,ReversedList),
    GivenList=@=ReversedList.

Изменить: окончательная версия

В итоге остановился на следующем коде:

% A palindrome can be read forward or backward; e.g. [x,a,m,a,x]

% is_palindrome(L) :- L is a palindrome list

is_palindrome(L) :-
   reverse(L,L).

person user3490561    schedule 10.05.2014    source источник
comment
Я не уверен, что понимаю этот вопрос. Изначально у вас был собственный предикат для палиндрома, который не работал, потому что в нем отсутствовал базовый случай, который @dasblinkenlight указал в своем ответе, и вы приняли ответ. Затем вы отредактировали свою проблему с другой реализацией, используя reverse, которая отлично работает.   -  person lurker    schedule 10.05.2014
comment
@lurker Я ошибся, сэр, извините. Теперь это исправлено.   -  person user3490561    schedule 10.05.2014
comment
@repeat Я думаю, его следует вернуть, чтобы он был полезен. В нынешнем виде это действительно не имеет смысла.   -  person lurker    schedule 14.08.2015
comment
Выложите обе версии   -  person false    schedule 15.08.2015


Ответы (1)


В вашем правиле reverseCurrentList отсутствует базовое предложение, поэтому оно никогда не будет успешным. Рекурсивный вызов продолжает брать элементы из списка до тех пор, пока список не станет пустым, после чего [H|T] больше не объединяется, поэтому правило не выполняется.

Добавьте это второе предложение в свою программу:

reverseCurrentList([], []).
person Sergey Kalinichenko    schedule 10.05.2014
comment
Большое спасибо, сэр, теперь это работает. Но могу я спросить, что означает это основное предложение? означает ли это, что реверсирование останавливается, когда 2 списка пусты? Если да, то как программа после этого проверяет, равны ли 2 списка? - person user3490561; 10.05.2014
comment
@user3490561 user3490561 Рекурсивное предложение, которое вы написали, переворачивает список, добавляя заголовок к результату переворачивания хвоста, то есть переворачивая список, который короче на один элемент. В какой-то момент в хвосте нет элементов. Именно здесь вступает в действие предложение base: оно сообщает вашей программе, как решить вырожденный случай, т. е. как перевернуть пустой список. Как только эта цель достигнута, ваша программа прекращает обращение и начинает добавлять заголовки списков к рекурсивно построенным обращенным спискам. - person Sergey Kalinichenko; 10.05.2014
comment
Большое спасибо, сэр, за ваш точный и информативный ответ. - person user3490561; 10.05.2014
comment
Обратите внимание, что isPalindrome([A,B]) терпит неудачу, но скорее должен преуспеть в объединении A с B. - person false; 15.08.2015