List 序言:使用nth1/3在列表中增加值

List 序言:使用nth1/3在列表中增加值,list,prolog,List,Prolog,我试图实现一个递归Prolog谓词,当给定一个包含Dim元素的全0列表ResultList和另一个值高达Dim的列表时,它通过第二个列表运行,并将+1增加到ResultList的第n个元素,并返回ResultList,到目前为止,我有: increment_list([],_). increment_list([Element|Tail],ResultList):- nth1(Element,ResultList,_ is _+1), increment_list(Tail,Re

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

我明显感到困难和困惑的是如何增加值,有没有可能在不定义额外谓词或单例变量的情况下增加值?

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

不,不定义额外的谓词是不可能做到的,尽管库可能会使它更容易。在对
nth1/3
的调用中插入
\uu1+1
的想法肯定行不通。请记住,Prolog将统一这些值,而不是计算它们
is/2
将执行算术运算,但是这个表达式在任何地方都没有多大意义,因为您正在丢弃加法的结果。还要记住,Prolog不会就地计算表达式。这是Prolog的一个核心区别。您的
increment\u list/3
完全没有必要,您只需删除它并将
increment\u list/3
重命名为
increment\u list/3
。另外,我建议
succ/2
succ(I,I1),succ(H1,H2)
;这个谓词的优点是它可以递增也可以递减,并且有助于使用其他调用模式生成谓词。好的解决方案+1我在理解增量时遇到困难,尤其是
I1是I+1
H2是H1+1
C1是C+1
,我们在哪里精确地增加最终列表?比方说,我希望它是递减的,而不是递增的,我应该在哪里更改它?我假设它是
H1
?@间距,您不能在Prolog中变异变量。使
递增/4
起作用的是第4个参数中发生的事情,其中
H2
T2
结束。您可以将其视为该谓词的返回路径,尽管这只是这里的一个约定,不是语言所要求的。damiano添加的最新版本消除了我的困惑,在上次编辑之后,我能够找到它!非常感谢。