此程序比较两个列表的项目,并返回一个列表,其中的项目是第一个列表的成员,而不是第二个列表的成员。例如:list1=[a,b,d], list2=[r,a,f,b] ----> result =[a,b]
。
go:- comp([y,h,b],[b,t],R),!.
comp([],_,_) :- !.
comp(_,[],_) :- !.
comp([H|T],B,_) :- memberchk(H,B),comp(T,B,_); comp(T,B,R),write([H]).
目前的结果是[h][y]
我需要的结果应该是[h,y]
答案 0 :(得分:2)
您的请求是针对一个谓词,返回一个列表,其中的项目是第一个列表的成员,而不是第二个列表的成员。但是你的例子:
list1=[a,b,d], list2=[r,a,f,b] ----> result =[a,b]
的结果是否返回包含两个列表中的成员的列表(交集)。我假设你想要你所要求的,而不是你的例子。
在原版中,你有:
comp(_, [], _).
如果您查询comp([a], [], X)
,因为您使用的是“请勿关注”字词_
,那么这将无法给出正确的结果。这是你可能想要表达的不恰当的表达,即comp(L, [], L)
(如果从中排除空列表的元素,则列表本身就是这样)。此外,您的原始子句都没有实例化结果(所有这些都在该位置都有“不关心”_
)。
更正后的版本可能如下所示:
comp([], _, []).
comp(L, [], L).
comp([H|T], S, R) :-
( memberchk(H, S)
-> comp(T, S, R)
; R = [H|RT],
comp(T, S, RT)
).
?- comp([y,h,b],[b,t],R).
R = [y, h] ;
false.
?-
请注意,输入;
后的“错误”响应意味着没有其他解决方案。