(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.