使用prolog替换两个列表之间的元素

时间:2016-09-22 17:19:54

标签: list prolog

我的任务是让myReplace(E1,L1,E2,L2)使E1L1的第一次出现被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]提供了另一个解决方案。

请你帮我解决这个问题。

谢谢:)

2 个答案:

答案 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,了解如何查看原始代码的问题。