prolog程序:比较两个列表';并返回列表1上的唯一元素列表
此程序比较两个列表的项,并返回一个列表,其中的项是第一个列表的成员,而不是第二个列表的成员。例如:prolog程序:比较两个列表';并返回列表1上的唯一元素列表,prolog,Prolog,此程序比较两个列表的项,并返回一个列表,其中的项是第一个列表的成员,而不是第二个列表的成员。例如: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] 我需
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]
您的请求是一个谓词,它返回一个列表,其中的项是第一个列表的成员,而不是第二个列表的成员。但你的例子是:
list1=[a,b,d], list2=[r,a,f,b] ----> result =[a,b]
返回一个包含两个列表(交叉点)中成员的列表的结果。我假设你想要你所要求的,而不是你的例子所显示的
在你的原稿中,你有:
comp(_, [], _).
如果您查询,比如说,comp([a],]X)
,这将不会给出正确的结果,因为您使用的是“不在乎”术语,。
。这是对您可能想要表达的内容的不当表达,即comp(L,[],L)
(如果您从列表中排除空列表的元素,则列表本身就是一个列表)。此外,您的原始子句中没有一个实例化结果(它们都在该位置有“不在乎”\uu
)
更正的版本可能如下所示:
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.
?-
请注意,键入
后的“false”响应代码>表示没有其他解决方案。在您的示例中:列表1=[a,b,d],列表2=[r,a,f,b]--->result=[a,b](看起来像是交集),列表1=[y,h,b],列表2=[b,t]--->rezult=[h,y](看起来像是集的差)。。。你需要哪一个??