首页 > 解决方案 > Prolog:使用 nth1/3 增加列表中的值

问题描述

我正在尝试实现一个递归 Prolog 谓词,当给定一个ResultList包含Dim元素的全 0 列表和另一个值高达 的列表时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]

我显然遇到的困难和困惑是如何增加值,是否可以在不定义额外谓词或具有单例变量的情况下做到这一点?

标签: listprolog

解决方案


在 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,我修改了谓词。


推荐阅读