私は prolog が初めてで、 prolog に のようなリストがあり、A=[1,2,3,4]
を使用して n 番目の要素にアクセスしnth(N,[_|T],R)
ました。R
で計算を行ったよりも、 にN 番目の要素がありR
ます。今私が欲しいのは、リストの n 番目の要素を更新することです。
リスト内の各要素で多くの計算を行っているため、毎回新しいリストを作成することはできません。
リストを更新する方法が見つかりませんでした。
私は prolog が初めてで、 prolog に のようなリストがあり、A=[1,2,3,4]
を使用して n 番目の要素にアクセスしnth(N,[_|T],R)
ました。R
で計算を行ったよりも、 にN 番目の要素がありR
ます。今私が欲しいのは、リストの n 番目の要素を更新することです。
リスト内の各要素で多くの計算を行っているため、毎回新しいリストを作成することはできません。
リストを更新する方法が見つかりませんでした。
私たちの会話に関しては、2 つのリストを一緒に追加して 3 番目のリストを作成できます。これは、ソース リストの 2 つの head 要素を追加して結果リストの head 要素を作成し、これを残りのリストに適用することを指定することによって行います。リスト。
また、基本ケース、つまり 2 つのソース リストが空である場合、結果リストも空である必要があります。
addLists([X|A], [Y|B], [Z|C]) :- Z is X+Y, addLists(A, B, C).
addLists([], [], []).
回答の方法よりも、回答の制約を指定することを常に目指していることを忘れないでください。Prolog は他のプログラミング言語とは非常に異なります。何かを行う方法を伝えるのではなく、単に答えに対して真の条件を伝え、それを推測させるだけです。
@Orbling と交換したコメントから、必要なのは一種のマップリスト/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(_, [], [], []).
edit @Orblingが提案する質問への回答で公開されているさまざまな方法に追加するだけです。ここでは、 nth0 /4を使用する方法です
?- I = 6, nth0(I,"hello world",_,T), nth0(I,U,0'W,T), format('~s',[U]).
hello World