【发布时间】:2016-03-28 12:45:32
【问题描述】:
对于以下查询(以及以下定义的谓词),我得到了一个意想不到的答案:
?- rep([1,2,3], 3, [2,3,4], L).
L = [1, 2, 2, 3, 4] ;
L = [1, 2, 3]. % unexpected answer
第一个结果是我想要的。第二个我不想要……
如何防止第二个?可能是在某处添加!?
concat([], L, L).
concat([H|T], L, [H|Res]) :-
concat(T, L, Res).
repl([], _, _, []).
repl([Val|T], Val, Repl, Res) :-
repl(T, Val, Repl, Temp),
concat(Repl, Temp, Res).
repl([H|T], Val, Repl, [H|Res]) :-
repl(T, Val, Repl, Res).
【问题讨论】:
-
剪切应该在 concat/3 调用之后进行:
concat(Repl, Temp, Res), !. -
@CapelliC。不坚定! 如果我们要使用cut,那么我们最好这样做:
repl([Val|T], Val, Repl, Res) :- !, concat(Repl, Temp, Res), repl(T, Val, Repl, Temp). -
请更具体!你对
?- repl([x,y,x,y,x],x,[x,y,x],L).有什么期望
标签: list replace prolog dcg prolog-dif