我正在尝试实现一个递归的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]
我显然遇到困难和困惑的是如何增加值,是否可以在不定义额外谓词或具有单例变量的情况下执行此操作?
答案 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,我修改了谓词。