Правило Пролога для нахождения последнего элемента списка - PullRequest
0 голосов
/ 28 мая 2018

Я должен написать правило для пролога, которое находит последний элемент списка и добавляет 1 к нему.Вот что я придумала до сих пор.Это работает, но мой вопрос: можно ли написать это правило иначе:

element(D ,[_|B]):- element(D, B).
element(D, [X]):- D is X+1.

1 Ответ

0 голосов
/ 29 мая 2018

(1) Я бы переименовал предикат во что-то вроде last_element_incremented, которое было бы более наглядным, чем просто element, который мало что говорит.

(2) Чтобы правила неперекрывая, измените рекурсивное правило:

last_element_incremented(Xinc, [_,X|T]) :- last_element_incremented(Xinc, [X|T]).

(3) Если вы используете CLP (FD), вы можете сделать решение более общим.Кроме того, поменяйте местами порядок предложений, чтобы у вас не возникала проблема отсутствия завершения для более общих запросов:

last_element_incremented(Xinc, [X]) :- Xinc #= X + 1.
last_element_incremented(Xinc, [_,X|T]) :- last_element_incremented(D, [X|T]).

Затем можно выполнить запрос, например:

| ?- last_element_incremented(3, L).

L = [2] ? ;

L = [_,2] ? ;

L = [_,_,2] ? ;

L = [_,_,_,2] ? ;

(4) Наконец, вы можете просто использовать append/3:

last_element_incremented(Xinc, L) :- append(_, [X], L), Xinc #= X + 1.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...