Пролог: увеличение значения в списке с помощью nth1 / 3 - PullRequest
0 голосов
/ 07 мая 2018

Я пытаюсь реализовать рекурсивный предикат Пролога, который, когда ему дан весь список 0 ResultList с Dim элементами и другой список со значениями до Dim, выполняется через этот второй список и увеличивается на +1 до n-й элемент ResultList и возвращает ResultList, пока у меня есть:

increment_list([],_).
increment_list([Element|Tail],ResultList):-
    nth1(Element,ResultList,_ is _+1),
    increment_list(Tail,ResultList).

Так например

?-increment_list([1,2,4,3,4],[0,0,0,0]).

Вернется:

[1,1,1,2]

Что, по-видимому, вызывает у меня затруднения и путаница в том, как увеличить значение, возможно ли это сделать без определения дополнительного предиката или наличия единственной переменной?

1 Ответ

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

В прологе вы не можете изменить значение в списке. Вы можете сделать что-то вроде этого:

increment_list([],L,L).
increment_list([H|T],LT,LO):-
    increment_nth(H,1,LT,LT1),
    increment_list(T,LT1,LO).

increment_nth(_,_,[],[]).
increment_nth(I,I,[H1|T1],[H2|T1]):-!, 
    succ(H1,H2).
increment_nth(I,C,[H|T1],[H|T2]):-
    C1 is C+1,
    increment_nth(I,C1,T1,T2).

Это в основном вложенный цикл. В каждом цикле вы создаете новый список, который является тем же самым предыдущим списком, за исключением значения в рассматриваемом вами индексе, которое является предыдущим индексом, увеличенным на единицу.

?- increment_list([1,2,4,3,4,1],[0,0,0,0],LO).
LO = [2, 1, 1, 2]

EDIT

Благодаря Дэниелу Лайонсу, я изменил предикат.

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