Добавьте в начало списка тот же элемент, который находится в конце списка - PullRequest
0 голосов
/ 24 мая 2018

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

Я пытался просмотреть похожие вопросы, но все еще застрял.

Я знаю, что поступаю неправильно, но вот что у меня получилось:

addLastToFront([], []).
addLastToFront(L, [H|T]) :- append(T, [H], L).

Который производит:

 ?- addLastToFront([a,b,c,d], X) --> ([d,a,b,c])

Что я пытаюсь сделать:

?- addLastToFront([a,b,c,d], X) --> ([d,a,b,c,d])

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

SWI Prolog имеет last(L, X), который успешно выполняется, если X является последним элементом L.

Вооружившись этим предикатом, вы можете легко определить необходимый предикат last_as_first(L, [X|L]), равный [X|L] - это список, сформированный из последнего элемента списка L, который также используется в качестве заголовка , если X - последний элемент L.В Прологе написано:

last_as_first(L, [X|L]) :- last(L, X).

Если вы хотите использовать append/3, вы можете определить last(L, X) как append(_, [X], L).

last_as_first(L, [X|L]) :- append(_, [X], L).
0 голосов
/ 24 мая 2018
list([])     --> [].
list([L|Ls]) --> [L], list(Ls).

concatenation([]) --> [].
concatenation([List|Lists]) -->
        list(List),
        concatenation(Lists).

Вы можете использовать эту DCG из https://www.metalevel.at/prolog/dcg, а затем запросить:

?-List1 =[a,b,c],phrase(concatenation([Front,[Last]]),List1),List2 = [Last|List1].
Front = [a, b],
Last = c,
List1 = [a, b, c],
List2 = [c, a, b, c];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...