Prolog添加和删除列表元素,如果不存在于第二个列表中

时间:2010-06-07 10:03:45

标签: list prolog

我不知道我在这里缺少什么。

我想添加一个元素,如果它在arg1中但不在arg2中,并且想要删除一个元素,如果它在arg1中但不在arg2中。

我正在使用if条件,其中包含一个函数,如果元素在arg2列表中,则返回true,否则返回false。然后使用内置谓词追加并选择添加或删除。

我的所有目标搜索都是假的。我根据我想要的谓词,添加或删除来评论和取消注释。

includes([],_).
includes([P|Z],S) :-
    memberchk(P,S), includes(Z,S).

addop([],list,res).
addop([P|R],list,res) :-
    includes(P,s0) -> addop(R,list,res) ; append(P,list,res),
    addop(R,list,res).


rem([],list,res).
rem([P|R],list,res) :-
    includes(P,list) -> rem(R,list,res) ; select(P,list,res),
    rem(R,list,res).

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

关于您的代码的两条评论:

  • 您的包含谓词似乎将列表作为第一个参数,但您似乎使用它就好像它是来自addop和rem的原子一样。
  • 你的addop谓词引用s0,它没有在任何地方定义,所以你的代码不能编译。

答案 1 :(得分:1)

listress0是原子。将每个字母的首字母大写,以使它们成为变量。

目前,您对addop和res的调用可能失败,因为没有匹配规则。

答案 2 :(得分:1)

您真的需要使用memberchkincludes吗?如果列表项很简单,那么您可以使用member谓词(通常是内置的):

% member(Element, List) -- determines whether Element is a member of list List
member(X, [X|_]).
member(X, [_|T]):- member(X, T).

使用它,addop可以定义如下:

% addop(A, B, R) -- returns items from A which are not in B
% (filters A over B)
addop(A, [], A).
addop([], _, []).
addop([H | T], L, R):- member(H, L), addop(T, L, R). % skip the item
addop([H | T], L, [H | R]) :- addop(T, L, R). % add the item to the result

添加rem可能是:

% rem(A, B, R) -- returns items from A which are in B
% (A intersect B)
rem(_, [], []).
rem([], _, []).
rem([H | T], L, [H | R]) :- member(H, L), rem(T, L, R). % add the item to result
rem([_ | T], L, R):- rem(T, L, R).