列表中的相同元素

时间:2019-11-25 00:18:08

标签: prolog

我正在尝试编写一个谓词,以确定第一个列表是否与Prolog中的其他两个列表具有相同的元素。这是我尝试过的:

same([],[],[]).
same([A|As],[B|Bs],[C|Cs]) :- A = B, A = C, common(As,Bs,Cs).

输出应该是这样的:

?- same(E,[1,6,8,2,3],[3,7,9,10,2]).
E = [] ;
E = [2] ;
E = [2, 3] ;
E = [3] ;
false.

我不知道我在哪里错了。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

仅当三个列表具有相同的长度并且第一个列表中的每个项目与其余列表中的其他相应项目合并时,您的过程才会成功。也就是说,如果列表为空,则只有三个列表相同时,该列表才会成功。

您可以尝试如下操作:

same([], _, _).
same([A|As], Bs, Cs):-
  append(_, [A|Bs1], Bs),
  select(A, Cs, Cs1),
  same(As, Bs1, Cs1).

其中递归步骤从第二个列表中“取出”一个项目,然后从第三个列表中选择它。

样品运行:

?- same(E,[1,6,8,2,3],[3,7,9,10,2]).
E = [] ;
E = [2] ;
E = [2, 3] ;
E = [3] ;
false.