编辑
这越来越多毛了,我的回答并没有准确地考虑到请求......所以让我们看看你的代码有最小的变化:
concat([], L, L).
concat([H|T], L, [H|Res]) :-
concat(T, L, Res).
repl([], _, _, []).
repl([Val|T], Val, Repl, Res) :- !, % as noted by @repeat, better to commit early...
repl(T, Val, Repl, Temp),
concat(Repl, Temp, Res). % !.
repl([H|T], Val, Repl, [H|Res]) :-
repl(T, Val, Repl, Res).
削减只是提交第二个条款......
恢复旧答案
您的 concat/3 与众所周知的 append/3 相同,因此请考虑这种方法
repl(ListOrig, Element, Replace, ListUpdated) :-
append(H, [Element|T], ListOrig),
append(H, Replace, Temp),
append(Temp, T, ListUpdated).
?- repl([1, 2, 3], 3, [2, 3, 4], L).
L = [1, 2, 2, 3, 4] ;
false.
编辑
根据评论的要求,此扩展处理要匹配更改的元素列表,具有简单的模式匹配(注意:在前一个子句之前添加)
repl(ListOrig, [], _Replace, ListOrig).
repl(ListOrig, [E|Es], Replace, ListUpdated) :-
repl(ListOrig, E, Replace, Temp),
repl(Temp, Es, Replace, ListUpdated).
测试
?- repl([1,2,3],[2,3],[x,y,z],R).
R = [1, x, y, z, x, y, z] ;
false.
编辑
我没有注意到如果没有找到 Element 它不应该失败......最后一个“catchall”子句可以处理这种情况:
repl(ListOrig, _Element, _Replace, ListOrig).
或者更好,扩展原来的喜欢
repl(ListOrig, Element, Replace, ListUpdated) :-
( append(H, [Element|T], ListOrig)
-> append(H, Replace, Temp),
append(Temp, T, ListUpdated)
; ListOrig = ListUpdated
).