Есть ли способ проверить, является ли вход n меньше или равен длине списка? - PullRequest
1 голос
/ 12 октября 2019

Я новичок в прологе, я хочу получить функцию: drop (N, X, Y), которая печатает список Y, который является списком X с удаленным N-м элементом. Если X не имеет N-го элемента, то предикат должен потерпеть неудачу. Пример: 1) drop (2, [1,2,3,4,5,6], Y) должен дать Y = [1,3,4,5,6].

2) drop (8, [1,2,3,4,5,6], Y) должен завершиться неудачей.

Я попытался получить функцию, которая добавляет элемент X к Y, если это не N-й элемент, и пропускаетэлемент, если это N-й элемент. Пожалуйста, смотрите следующий код:

drop(N,X,Y) :- integer(N),N>0,drop(X,1,N,Y).
drop([], _ , _ , [] ) .
drop( [X1|X] , P , N , [X1|Y] ) :- N=\=P , P1 is P+1 , drop(X,P1,N,Y) .
drop( [_|X] , P , N ,Y) :- N =:= P , P1 is P+1 , drop(X,P1,N,Y) .

Проблема возникает, если N больше, чем длина списка, мой код напечатает весь список, но в этом случае должна произойти ошибка функции. Я не могу найти способ сравнить N с длиной списка, так как каждая функция в прологе возвращает двоичное значение (насколько мне известно). Любая помощь будет высоко ценится!

1 Ответ

0 голосов
/ 12 октября 2019

Вы совсем близко. Здесь вы должны изменить две вещи:

  1. как только мы достигнем правильного индекса, мы больше не должны возвращаться к drop, а просто возвращаем остальную часть списка;и
  2. вы должны удалить строку drop([], _, _, []), так как, если мы отбросили элемент, мы больше не будем рекурсировать (см. предыдущий пункт).

Обратите внимание, что мы можем каждый раз уменьшатьзначение для N и, таким образом, не позволяет использовать две переменные. Нравится:

drop(N, X, Y) :-
    integer(N),
    drop_(N, X, Y).

drop_(<b>1</b>, [_|T], T).
drop_(N, [X|T], [X|T2]) :-
    N > 1,
    N1 is N-1,
    drop_(N1, T, T2).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...