我的任务是让myReplace(E1,L1,E2,L2)
使E1
中L1
的第一次出现被E2
取代,并在L2
中返回。我编写了下面描述的代码,它运行正常。
myReplace(E1,[],E2,[]).
myReplace(E1,[E1|Xs],E2,[E2|Ys]):-
myReplace(E1,Xs,E1,Ys).
myReplace(E1,[H|Hs],E2,[H|Ts]):-
E1 \= H,
myReplace(E1,Hs,E2,Ts).
但是,例如myReplace(2,[1,2,3,2,1],5,X)
应该提供X = [1,5,3,2,1]
和X = [1,2,3,5,1]
。但是我的代码只提供了一个X = [1,5,3,2,1]
的解决方案。
同样,当myReplace(2,X,5,[1,5,3,5,1])
仅回溯解决方案X = [1,2,3,5,1]
和X = [1,5,3,2,1]
时,我的解决方案又为X = [1,5,3,5,1]
提供了另一个解决方案。
请你帮我解决这个问题。
谢谢:)
答案 0 :(得分:3)
怎么样?
myReplace(E1,[E1|Xs],E2,[E2|Xs]).
myReplace(E1,[H|Hs],E2,[H|Ts]):-
myReplace(E1,Hs,E2,Ts).
如果我没有错,那就是一个(也是唯一一个)替代品。
记住你必须删除
myReplace(E1,[],E2,[]).
否则你得到L1 = L2
(无替换)作为解决方案。
并且观察到,正如Lurker所指出的,这并不是“L1中E1的第一次出现被取代”。
答案 1 :(得分:2)
如果我理解你的问题,你想得到所有的答案来代替L1中每一次出现的E1。如果您使用append/3
,则可以免费获得回溯:
my_replace(X, As, Y, Bs) :-
append(As_front, [X|As_back], As),
append(As_front, [Y|As_back], Bs).
根据这个定义,我得到:
?- my_replace(2,[1,2,3,2,1],5,X).
X = [1, 5, 3, 2, 1] ;
X = [1, 2, 3, 5, 1] ;
false
请参阅other solution,了解如何查看原始代码的问题。