prolog程序:比较两个列表的项目并返回List1上的唯一元素列表

时间:2013-12-02 11:27:50

标签: 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]

我需要的结果应该是[h,y]

1 个答案:

答案 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.

?-

请注意,输入;后的“错误”响应意味着没有其他解决方案。