2

我是 prolog 的新手,我在 prolog 中有一个列表A=[1,2,3,4],比我使用nth(N,[_|T],R). 现在我有第 N 个元素R,比我做了一些计算R。现在我想要更新列表中的第 n 个元素。

因为我要对列表中的每个元素进行大量计算,所以我不能每次都创建一个新列表。

我没有找到任何更新列表的方法。

4

2 回答 2

1

从您与@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
于 2012-11-19T17:44:23.813 回答
1

关于我们的对话,您可以将两个列表添加在一起,创建第三个列表,方法是指定源列表的两个头元素相加在一起,构成结果列表的头元素,并且这适用于其余的列表。

还需要一个基本情况,即当两个源列表为空时,结果列表也应为空。

addLists([X|A], [Y|B], [Z|C]) :- Z is X+Y, addLists(A, B, C).
addLists([], [], []).

请记住,您的目标始终是指定答案的约束,而不是回答它的方法。Prolog 与其他编程语言非常不同,因为您不告诉它如何做某事,您只需告诉它答案为真的条件并让它推断它。

于 2012-11-19T17:37:58.307 回答