在Prolog中不使用成员函数查找两个集合的交集

3
我正在编写一个函数,接受两个集合并返回它们的交集。但是,我不想在我的代码中使用成员函数。以下是该成员函数:
member( X, [ X | T ] ).
member( X, [ _ | T ] ) :- member( X, T ).

这是我目前的翻译内容:

     set_int(_,[],_).   
     set_int([H|T],[H|T1],[H|T2]) :-
           set_int(T,T1,T2).
     set_int(T,[X|T1],T2) :-
           set_int(T,T1,T2). 

请帮我理清我的逻辑。

2个回答

1
如果您编写set_int来处理第一个项的3种情况(空列表、一个元素的列表和更长的列表),则可以有效地使用set_int([A],B,[A])代替member(A,B)

0

我认为只有在您的集合是有序的情况下,您才能处理成员(或等效物)。在这种假设下,我们可以仅比较头部:

set_int([X|Xs], [Y|Ys], Is) :-
    X @< Y,
    !, set_int(Xs, [Y|Ys], Is).
set_int([X|Xs], [Y|Ys], Is) :-
    X @> Y,
    !, set_int([X|Xs], Ys, Is).
set_int([Z|Xs], [Z|Ys], [Z|Is]) :-
    !, set_int(Xs, Ys, Is).
set_int(_, _, []).

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接