1
member(X,[X|T]).
member(X,[H|T]):-member(X,T).

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

delallocc(X,L,L1):-member(X,L),delfstocc(X,L,R),!,delallocc(X,R,L1);write(L).

〃〃〃

首先,我在不使用 cut 的情况下编写了这段代码,然后我尝试将 cut 运算符放在每个谓词之后,直到我得到完美的答案,但实际上我不明白使用 cut 后它是如何工作的。我知道 cut 运算符停止 prolog 进行匹配,但是我无法正确使用它,所以我想帮助跟踪这段代码,这段代码只是删除了列表中所有出现的元素。

4

1 回答 1

1

首先,就削减而言,实际上是这样处理的:

“目标成功并将 Prolog 提交给所有选择,因为父目标与发生剪切的子句的头部统一”。

另见:http ://www.swi-prolog.org/pldoc/doc_for?object=!/0

关于从列表中删除:为了实现您想要的,您的方法不必要地复杂。这是一个更简单的解决方案:

对于空列表,delete 始终为真:

del([],_X,[]).

当列表的头部与要删除的元素相同时,它不属于另一个列表:

del([X|Xs], X, Ys) :- del(Xs, X, Ys).

当列表的头部与要删除的元素同时,它属于另一个列表:

del([X|Xs], Z, [X|Ys]) :- dif(X,Z), del(Xs, X, Ys).

(注意:从句的顺序很重要!为什么?)

此解决方案不使用剪切和尝试回溯。您可以在适当的位置使用剪切来防止回溯。

于 2013-03-18T14:05:49.247 回答