2010-10-30 5 views
2

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

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

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

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 элементов списка, который я отправляю.

+0

Это выглядит подозрительно, как домашнее задание ... – Cameron

+0

Лучше использовать 0 в качестве индекса первого элемента. – starblue

ответ

0

Ваш базовый футляр 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, ...) для возврата только первого элемента (без его обертывания в список) нарушит вашу рекурсию.

+0

Базовый блок принимает (0, X, X). должен был всегда возвращать ввод, если N был 0, «вы не хотели ничего удалять, здесь вы идете». Предполагается, что вся функция будет работать так: «Возьмите N первых элементов». – shaungus

+0

@shaungus: Хорошо, теперь я понимаю, что за вашим исходным корпусом, но оно не работает с вашей рекурсией, в которой говорится: «take (n) списка - это заголовок этого списка с выводом (n-1) хвоста этого списка »- когда n-1 достигает 0, бит должен быть 0 единиц. Вы можете альтернативно определить базовый случай как 'take (1, [H | T], H)., Оставив take (0) неопределенным, если это имеет для вас больше смысла (вам нужно будет изменить подкласс N> 0 к N> 1 в вашем рекурсивном случае). Я лично предпочитаю, чтобы взять (0) вернуть пустой список, поскольку это имеет смысл и кажется действительным для меня («дайте мне 0 элементов») – Cameron

+0

нормально, я мог бы иметь два разных способа мышления в зависимости от того, где я был в функции , Я вижу это сейчас X). В любом случае я получил его работу, спасибо – shaungus

Смежные вопросы