Пролог не возвращает запрашиваемое значение - PullRequest
2 голосов
/ 16 ноября 2011

У меня есть эта программа на Прологе, она удаляет элементы каждого n-го элемента из списка, например: removenth ([1,2,3,4,5,6], 2, R). он должен вернуть: R = [1,3,5].

У меня есть это:

removeallNth(F, N, R):- removeallNth(F, N, 1, R).
removeallNth([], _, _, R).
removeallNth([H|T], N, C, R):- N \== C, Nc is C + 1, concat(R,H,S),  
removeallNth(T, N, Nc, S).
removeallNth([_|T], N, C, R):- N == C, removeallNth(T, N, 1, R).

Проблема в том, что он возвращает true вместо R = [1,3,5]. Я проверил в отладчике SWI-Prolog, и он приходит к правильному результату, но затем продолжает проверять вещи Я понимаю, что это связано с объединением, но я не знаю, как его применить.

1 Ответ

4 голосов
/ 16 ноября 2011

Рассмотрим эту модификацию вашей программы:

removeallNth(F, N, R):- removeallNth(F, N, 1, R).

removeallNth([], _, _, []).
removeallNth([H|T], N, C, [H|R]):-
  N \== C, Nc is C + 1,
  removeallNth(T, N, Nc, R).
removeallNth([_|T], N, C, R):-
  N == C,
  removeallNth(T, N, 1, R).

В первом предложении removeallNth / 4 вы должны вернуть пустой список.

Во втором предложении removeallNth / 4 вам не нужно выполнять concat, вам просто нужно добавить add в список, возвращенный в 4-м аргументе заголовка этого предложения.

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