2014-12-02 74 views
1

请给出一些关于在Prolog中截取三个列表的建议吗?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

您的相交的两个列表代码有点故障,看到最后三个答案:

?- 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 = [].