2013-04-27 2 views
2

У меня возникли проблемы с пониманием того, как пролог работает со списками. Я пытаюсь написать функцию, которая добавит хвост в данный список и вернет новый список. но моя реализация не работает, и я не могу понять, как ее исправить. Вот что у меня есть:Добавление хвоста в Prolog

% add_tail(L,M,E) :- L is M with [E] appended. 
% I wanna do this without using the append predicate 

add_tail([E],[],E). 
add_tail(List, [H|T], E):- 
    add_tail(List1, T, E), 
    List is [H|List1]. 

уточнить, что я хочу, чтобы эта функция делать, вот пример вывода:

?- add_tail(L,[1,2,3],4). 
L = [1,2,3,4]. 
+0

проверить [этот ответ] (http://stackoverflow.com/questions/15733735/why-prolog-outputs-a-weird-tree-like-list/15743688#15743688). это связано. –

ответ

1

Проверить this из:

append([X|Y],Z,[X|W]) :- append(Y,Z,W). 
append([],X,X). 

вторая строка (append([],X,X)) просто утверждает, что добавление элемента X в пустой список равно самому этому элементу (условие прерывания). Первая строка состояние добавляющего Z к списку [X|Y] (X это голова, остальное Y) приводит новый список [X|W], тогда как W является результатом добавления Z к Y.

Пример

?- append([1,2,3],[4],L). 
L = [1,2,3,4] 

В вашем случае вам просто нужно изменить порядок параметров!

+0

Спасибо за помощь. –

+0

Добро пожаловать! –

+0

На самом деле, у вас есть ошибка в вашем определении. добавление элемента 'X' в конец пустого списка' [] 'должно приводить к списку, а не к элементу' X'. –