Prolog三个列表的交集

时间:2014-12-02 10:55:07

标签: list prolog interception

请提供一些关于在Prolog中拦截三个名单的建议吗?

我拦截了两个名单:

prunik([], _, []).

prunik([H1|T1], L2, [H1|Res]) :-
    member(H1, L2),
    prunik(T1, L2, Res).

prunik([_|T1], L2, Res) :-
    prunik(T1, L2, Res).

当我提出这个问题时,它有效:

prunik([1,3,5,2,4], [6,1,2], X).

我尝试重拍三个列表,但我真的不知道。请问有什么建议吗?

1 个答案:

答案 0 :(得分:1)

交叉两个列表的代码有点错误,请参阅最后3个答案:

?- prunik([1,3,5,2,4], [6,1,2], X).
X = [1, 2] ;
X = [1] ;
X = [2] ;
X = [].

但是,如果您希望扩展代码以使用三个列表:

prunik([], _, _, []).

prunik([H1|T1], L2, L3, [H1|Res]) :-
    member(H1, L2),
    member(H1, L3),
    prunik(T1, L2, L3, Res).

prunik([_|T1], L2, L3, Res) :-
    prunik(T1, L2, L3, Res).

示例输入/输出:

?- prunik([1,2,3], [3,2,4,5,6], [2,3,4], R).
R = [2, 3] ;
R = [2] ;
R = [3] ;
R = [].