Список пролога. Проверьте, похож ли первый и последний элемент в списке

Пример:

firstlast([1,2,3,4,1]).
true;

firstlast([1,2,3,4]).
false;

firstlast([5,10,4,3]).
false;

exc...

Проблема в том, что мне разрешено использовать рекурсию только с предикатом firstlast. ? Я действительно пытался сломать это, но, похоже, я не могу проверить / сравнить последний элемент с первым.

Какие-нибудь намеки?


person Anonymous    schedule 10.10.2012    source источник


Ответы (4)


ОБНОВЛЕНИЕ: поскольку вам не разрешено использовать другие предикаты, попробуйте следующее:

firstlast([H,H]).
firstlast([F,_|T]) :- firstlast([F|T]).

Первый предикат имеет дело с базовым случаем, второй удаляет второй элемент в списке из трех или более элементов и выполняет рекурсию вниз.

person Sergey Kalinichenko    schedule 10.10.2012
comment
Xs = [f,Xs], firstlast(Xs). успешно. Это предназначено? - person false; 10.10.2012
comment
@false Я только что попробовал это в SWI и получил false обратно. Я что-то упустил? (примечание: я отредактировал свой ответ, в первой строке была опечатка - там last(X,list) вместо last(X,List)) - person Sergey Kalinichenko; 10.10.2012
comment
first(H, H). необходимо удалить. - person false; 10.10.2012

Вы, наверное, имеете в виду, что первый и последний элементы совпадают. Вот решение с использованием dcg -нотации:

firstlast(Xs) :-
    phrase(([X],...,[X]), Xs).

... --> [] | [_], ... .

Я не уверен, получится firstlast([1]) или нет ...

person false    schedule 10.10.2012

Ну, поскольку вы можете использовать рекурсию только с firstlast / 1, решение будет выглядеть так:

firstlast(...) :- ... .
firstlast(...) :- ... .
firstlast(...) :- ... .
....
firstlast(...) :- ... .

некоторые из них будут правилами, относящимися к базовому случаю, а некоторые из них - правилами, которые «разъедают» проблему. эта проблема требует одной проверки: сравнить первый и последний элемент. Итак, в вашем базовом случае у вас должны быть только эти 2 элемента; тебе больше ничего не нужно. поэтому решение будет игнорировать все остальные элементы

последний совет: вы можете получить доступ к двум первым элементам списка с помощью следующего шаблона объединения:

foo([H1,H2|T])
person Thanos Tintinidis    schedule 10.10.2012

Так честно, я получил это:

firstlast([H,_|T]) :-
(T1 = H, T1 = T) -> firstlast([H|T]).

Мой код сравнивает последний и первый элементы, но рекурсия неверна: /

Как было сказано выше, нельзя допускать успеха с одним элементом в списке. Хотя мне разрешено использовать только предикат firstlast.

person Anonymous    schedule 10.10.2012
comment
Этот код был бы гораздо более заметным, если бы вы добавили его в сам вопрос, а не отправили бы в качестве ответа. Вы всегда можете изменить свой вопрос, щелкнув ссылку edit. - person Sergey Kalinichenko; 10.10.2012