2015-11-15 2 views
0

мне удалось отменить список:Пролог: Удалить последний элемент списка

reverse([],Z,Z). 
reverse([H|T],Z,A) :- reverse(T,Z,[H|A]). 

и я хочу программу, которая удаляет последний элемент списка.

+0

Вы можете (1) обратный список, удалить головку, а затем обратном снова, или (2) использовать 'добавляемых/3' предикат (подсказка: использовать последний элемент списка в виде единого элемента списка для второго аргумента) или (3) напишите простую рекурсию, которая опускает последний элемент, когда вы дойдете до конца (подсказка: базовый пример будет 'remove_last ([_],?)' что бы '?' было?). Вариант 1 здесь был бы наименее эффективным. – lurker

+0

Подумайте, чтобы отменить список перед удалением последнего элемента - хорошая идея. –

+0

Как я уже сказал, вариант 1, вероятно, является наименее желательной идеей. Это просто понять. – lurker

ответ

0

Зачем вам что-то менять?

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
% remove_last(IN_LIST, OUT_LIST). 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 

% 1. No last element to remove, fail - cut stops alternatives 
remove_last([], []) :- !, fail. 

% 2. Only one element in list - return empty list - cut stops alternatives 
remove_last([_], []) :- !. 

% 3. If the rules above did not match, preserve the head of the 
% list in the result list and recurse... 
remove_last([X | T], [X | T2]) :- 
    remove_last(T, T2). 
Смежные вопросы