如何使用PROLOG中的索引替换列表的元素

时间:2017-01-04 01:12:00

标签: list prolog

我需要这样做:

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), !.

3 个答案:

答案 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).