Prolog:使用nth1 / 3增加列表中的值

时间:2018-05-07 11:57:42

标签: list prolog

我正在尝试实现一个递归的Prolog谓词,当给定一个包含ResultList元素的全0列表Dim和另一个值为Dim的列表时,它会通过第二个列表运行并将+1递增到ResultList的第n个元素并返回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 :(得分:3)

在prolog中,您无法修改列表中的值。你可以这样做:

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]

修改

感谢Daniel Lyons,我修改了谓词。