Пролог, как сохранить первые 3 элемента в списке в другой список - PullRequest
1 голос
/ 12 октября 2011

Я пробовал что-то вроде этого: указанный путь = [[1,2], [2,3], [3,4], [5,6]]

first_three(N,[H|T],[H|_]):- not(N=0),N is N-1, first_three(N,T,L). 

тогда я вызываю first_three(3, путь, Y), но он возвращает нет.

Ответы [ 2 ]

1 голос
/ 12 октября 2011

Прежде всего, N is N - 1 не может быть успешным - N не является переменной в смысле императивного языка программирования, поэтому вы не сохраняете значения в ней, ее можно назначить только один раз, так сказать- поэтому вы можете захотеть ввести новую переменную и вызвать что-то вроде N1 is N - 1, а затем использовать N1 в рекурсивном вызове first_three.Затем последний аргумент этого рекурсивного вызова возник из ниоткуда, поэтому вам, возможно, придется обратить на него внимание.В качестве последнего предложения, попробуйте разделить предикат на две части: первая для управления элементарным базовым случаем, где N равно 0, вторая для управления мясными делами, основанная на другом.1009 * О, а поскольку N является переменной величиной, я бы предложил использовать другое имя, а не вводящее в заблуждение first_three для вашего предиката.

1 голос
/ 12 октября 2011

Вам необходимо добавить базовый вариант (когда N = 0). И вам также нужно создать новую свежую переменную, чтобы назначить предшественник N, и, наконец, вам также нужно вернуть результат рекурсии ([H | L] в начале класса):

first_three(0,_,[).
first_three(N,[H|T],[H|L]):- 
  N\=0,
  N1 is N-1, 
  first_three(N,T,L).

Конечно, вы также можете написать что-то вроде этого:

first_three([One,Two, Three|_], [One,Two, Three]).

и назовите его:

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