Пролог - получить первый список из списка списков - PullRequest
2 голосов
/ 31 октября 2010

У меня есть список, состоящий из небольших списков внутри, каждый список состоит из 2 элементов:

[[a,1],[b,2],[c,3]]  

Я использую функцию take (1, L, R), чтобы взять первый элемент из списка L и вернуть элемент R. Код для функции take находится здесь:

take(0,X,X).
take(N,[H|T],[H|R]):- 
    N>0, M is N-1,
    take(M,T,R).  

На данный момент забег может выглядеть так:

1 ?- take(1,[[a],[b],[c]],Taken).
Taken = [[a], [b], [c]]

Что совпадает с вводом! То же самое для «обычного» списка глубины 1 уровня:

2 ?- take(1,[a,b,c],Taken).
Taken = [a, b, c]

Вопрос:
Вопрос для вас: как я могу сделать результат похожим на:

1 ?- take(1,[[a],[b],[c]],Taken).
Taken = [a]

Я хочу вернуть первые N элементов списка, которые я отправил.

1 Ответ

0 голосов
/ 31 октября 2010

Ваш базовый случай take(0, X, X). делает именно то, что говорит - при любом значении X результат X. Я думаю, что вы пытались сказать, это take(1, [H|T], H). (что дает первый элемент списка).

Я думаю, что на самом деле вы ищете, это take(0, _, [ ])., который выдает пустой список, когда "берет" 0 элементов из любого списка.Это хорошо работает с вашим существующим рекурсивным регистром.

Вы говорите, что хотите получить «первые N элементов списка» - такой результат должен быть сохранен в списке из N элементов.Отсюда следует, что take(1, [a, b, c], Taken) даст Taken = [a], а не Taken = a.Точно так же, take(1, [[a], [b], [c]], Taken). даст Taken = [[a]]..В особом случае форма take (1, ...), возвращающая только первый элемент (без включения его в список), нарушит вашу рекурсию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...