我需要这样做:
replace(L,P,E,R)
,其中L是当前列表,P是元素插入的位置,E是要插入的元素,R是返回的新列表。
示例:
L = [1,2,3,4,5],
replace(L,2,'@',R).
R = [1,2,'@',4,5]
我试过这个,但没有任何反应,列表连续不变:
replaceInThePosition([_|T],1,E,[['1',E]|T]).
replaceInThePosition([H|T],P,E,[H|R]) :-
P > 0, NP is P-1, replaceInThePosition(T,NP,E,R), !.
答案 0 :(得分:2)
你不远了。
您可以尝试使用
replaceInThePosition([_|T],0,E,[E|T]).
replaceInThePosition([H|T],P,E,[H|R]) :-
P > 0, NP is P-1, replaceInThePosition(T,NP,E,R).
我的意思是:
1)0
代替1
在第一个子句中(或1
在第一个子句中,但P > 1
在第二个子句中;但在这种情况下来自{{1}你统一replaceInThePosition([1, 2, 3, 4, 5], 2, '@', R)
,而不是R = [1, @, 3, 4, 5]
)
2)R = [1, 2, @, 4, 5]
表示第一个句子中的最后一个错误,而不是[E|T]
3)在第二个句子的末尾没有剪切(没有[['1',E]|T]
)(没有必要:!
为零时的第一个子句; P
时的第一个子句;所以它们是相互排斥的
答案 1 :(得分:0)
您可以使用append/3
执行此操作:
substitute(L, P, E, R) :-
PreLen is P - 1,
length(PreLen, P1),
append(Pre, [_|T], L),
append(Pre, [E|T], R).
答案 2 :(得分:0)
另一种可能性:
/*
L is the current list,
P is the position where the element will be insert,
E is the element to insert and
R is the return, the new list
*/
replaceInThePosition(L, P, E, R) :-
findall(X, (nth0(I,L,Y), (I == P -> X=E ; X=Y)), R).