我只需删除列表中的一个匹配项。实际上无论是第一次还是最后一次都没关系。需要删除一个匹配。
我无法理解为什么以下内容无法正常工作。
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中使用。
为什么第一个例子不起作用?还有其他解决方案吗?
答案 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).