删除列表中的第一个匹配项 - prolog

时间:2013-04-07 00:05:58

标签: prolog

我只需删除列表中的一个匹配项。实际上无论是第一次还是最后一次都没关系。需要删除一个匹配。

我无法理解为什么以下内容无法正常工作。

deleteOne(_,[],[]).

deleteOne(Term, [Term|Tail], Result) :- 
    deleteOne(Term, [], [Result|Tail]), !.

deleteOne(Term, [Head|Tail], [Head|TailResult]) :- 
    deleteOne(Term, Tail, TailResult), !.

输出

41 ?- deleteOne(5,[2,3,1,5,2,3,1],X).
X = [2, 3, 1, 5, 2, 3, 1].

当我用空字符串或一些随机字符串替换term时,它可以工作。

 deleteOne(Term, [Term|Tail], Result) :- 
    deleteOne("", Tail, Result), !.

输出

41 ?- deleteOne(5,[2,3,1,5,2,3,1],X).
X = [2, 3, 1, 2, 3, 1].

但我不认为这是出于多种原因的最佳解决方案。不是我当前的问题,而是例如更长的列表。或者如果列表包含空字符串 - 不知道这是否可以在Prolog中使用。

为什么第一个例子不起作用?还有其他解决方案吗?

2 个答案:

答案 0 :(得分:2)

你的第一个不起作用,因为这没有多大意义:

deleteOne(Term, [Term|Tail], Result) :- 
    deleteOne(Term, [], [Result|Tail]), !.

这意味着下一个结果必须将当前结果作为其头部。

更好的解决方案是:

delete_one(_, [], []).
delete_one(Term, [Term|Tail], Tail).
delete_one(Term, [Head|Tail], [Head|Result]) :-
  delete_one(Term, Tail, Result).

如果您希望它具有决定性,请在第二个子句中添加剪切。它可以这样做:

?- delete_one(2, [1, 2, 3, 1, 2, 3], X).
X = [1,3,1,2,3] ? ;
X = [1,2,3,1,3] ? ;
X = [1,2,3,1,2,3] ? ;    
no

答案 1 :(得分:0)

要仅从列表L中删除项目X的首次出现。在这里,我使用了剪切操作。

delete(X,[X|T],T):-!.
delete(X,[Y|T],[Y|T1]):-delete(X,T,T1).