我不知道我在这里缺少什么。
我想添加一个元素,如果它在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).
感谢您的帮助。
答案 0 :(得分:1)
关于您的代码的两条评论:
答案 1 :(得分:1)
list
,res
和s0
是原子。将每个字母的首字母大写,以使它们成为变量。
目前,您对addop和res的调用可能失败,因为没有匹配规则。
答案 2 :(得分:1)
您真的需要使用memberchk
和includes
吗?如果列表项很简单,那么您可以使用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).