我是 prolog 的新手,我在 prolog 中有一个列表A=[1,2,3,4]
,比我使用nth(N,[_|T],R)
. 现在我有第 N 个元素R
,比我做了一些计算R
。现在我想要更新列表中的第 n 个元素。
因为我要对列表中的每个元素进行大量计算,所以我不能每次都创建一个新列表。
我没有找到任何更新列表的方法。
我是 prolog 的新手,我在 prolog 中有一个列表A=[1,2,3,4]
,比我使用nth(N,[_|T],R)
. 现在我有第 N 个元素R
,比我做了一些计算R
。现在我想要更新列表中的第 n 个元素。
因为我要对列表中的每个元素进行大量计算,所以我不能每次都创建一个新列表。
我没有找到任何更新列表的方法。
从您与@Orbling 交换的评论看来,您需要的是一种 maplist / 4
process_list(A, B, C) :-
maplist(process_elem, A, B, C).
process_elem(A, B, C) :- C is A + B. % or whatever needed
如果您正在使用索引,process_elem
那么这是不合适的。然后递归访问列表,向下传递索引
process_list(A, B, C) :-
process_list(1, A, B, C).
process_list(I, [A|As], [B|Bs], [C|Cs]) :-
C is A + B * I, % or whatever needed
J is I + 1,
!, process_list(J, As, Bs, Cs).
process_list(_, [], [], []).
编辑只是为了添加@Orbling建议的问题答案中公开的各种方式,这里是使用nth0 / 4的方式
?- I = 6, nth0(I,"hello world",_,T), nth0(I,U,0'W,T), format('~s',[U]).
hello World
关于我们的对话,您可以将两个列表添加在一起,创建第三个列表,方法是指定源列表的两个头元素相加在一起,构成结果列表的头元素,并且这适用于其余的列表。
还需要一个基本情况,即当两个源列表为空时,结果列表也应为空。
addLists([X|A], [Y|B], [Z|C]) :- Z is X+Y, addLists(A, B, C).
addLists([], [], []).
请记住,您的目标始终是指定答案的约束,而不是回答它的方法。Prolog 与其他编程语言非常不同,因为您不告诉它如何做某事,您只需告诉它答案为真的条件并让它推断它。