2015-10-21 3 views
2

Я новичок в Prolog, и я пытаюсь написать предикаты, которые сохраняются true, когда n элементов из списка. Это то, что я написал, и он, похоже, не работает:
take(N, List, Front):- length(Front, N), append(Front, [], List). Я предположил, что для переноса (N, List, Front), чтобы сохранить true, список и фронт должны быть теми же списками, что означает, что append(Front, [], List) должен иметь значение true, и Front должен иметь размер N, поэтому length(Front, N) должен иметь значение true.взять n элементов из списка перед списком в Prolog


Теперь, когда я пытаюсь это интерпретатор, я получаю следующее:
29 ?- take(5, [1,2,3,4,5], Polo).
Polo = [1, 2, 3, 4, 5]
30 ?- take(3, [1,2,3,4,5], Ok).
false.

ответ

2

Если вы хотите принять N элементы из передней List, это похоже на взятие N - 1 элементов с передней части хвоста List, с глава List, наклеенный на. Неудивительно, что принимать 0 элементов из чего угодно - это пустой список. (Помните, что вы можете деконструировать List как [Head | Tail].)

EDIT: Почему take(N, List, Front):- length(Front, N), append(Front, _, List). работы?

Потому что оба length и append делают что-то очень похожее на вышесказанное. length(Front, N) будет Front быть [F1, F2, F3... FN], с N неизвестных. _ может быть любым, поэтому он может быть другим списком с неизвестными. Затем append(Front, _, List) отправляет и объединяет два списка неизвестных и приравнивает каждый элемент конкатенации к элементам List. Например, если у вас есть N как 2, и List как [1, 2, 3, 4, 5], то append(Front, _, List) убедитесь, что [F1, F2, U1, U2, U3] матчи List:

append([F1, F2], _, [1, 2, 3, 4, 5]) утверждает, что F1 = 1 и append([F2], _, [2, 3, 4, 5]). Это утверждает, что F2 = 2 и append([], _, [3, 4, 5]). Это, в свою очередь, является условием разрыва для append, который утверждает, что _ = [3, 4, 5], что тривиально верно. Итак, Front = [F1, F2] = [1, 2].

Путь length конструирует [F1, F2] похож: length(First, 2) утверждает, что length(FirstTail, 1), и это утверждает length(FirstTailTail, 0), что является условием разрыва, так FirstTailTail = [], что делает First = [F1 | [F2 | []]] = [F1, F2].

+0

Спасибо, что определенно сработает, но по какой-то причине, если я поменяю take (N, List, Front): - length (Front, N), append (Front, [], List). (N, список, фронт): - длина (фронт, N), добавление (фронт, _, список). он отлично работает. Может кто-нибудь объяснить, почему. – killuminati

+0

Я имею в виду это: take (N, List, Front): - length (Front, N), append (Front, _, List). – killuminati

+0

Спасибо за объяснение, это делает его намного яснее. – killuminati

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