两个列表至少具有一个公共元素,没有Prolog内置谓词

时间:2019-12-12 09:15:55

标签: prolog

我是prolog的新手。我想编写compare_lists / 2,它将比较2个列表,如果它们至少具有一个公共元素,则返回true。我知道可以用类似的方法完成

common_list([H|_],T) :- member(H,T).
   common_list([_|T],L) :-  common_list(T,L).



common_list2(L1,L2) :-member(X,L1),member(X,L2).

但是我想在没有Prolog内置谓词的情况下进行操作。我试图写这个

common_elements([H|_],[H|_]).
common_elements(L,[_|T]) :- common_elements(L,T).
common_elements([_|T],L):-common_elements(T,L).

但是当我问在线swish序言工具common_elements([3,13,8,1],[5,3,7,3,1]).时,它会回答true 37次,而不是3个,例如common_list / 2和common_list2 / 2(我必须使用cut才能得到1而不是3,但这是不同的故事)。

2 个答案:

答案 0 :(得分:2)

您可以自己轻松地编写成员函数

my_member(H, [H|_]).
my_member(X, [_|T]) :-
  my_member(X,T).

答案 1 :(得分:0)

根据您的条件,当两个列表具有至少一个共同的元素时,返回TrueFalse(如果它们没有共同的元素)。

您要做的就是检查列表的Head是否在第二个列表中。如果第二个列表中存在Head,则返回True。否则,请在第一个列表的末尾重复该过程,以完成其余过程。

我的方法如下:-

is_member(X,[X|_]):- !.
is_member(X,[_|T]):- is_member(X,T).

compare1([],[]):- false.
compare1([H|_],List):- is_member(H,List) , !.
compare1([H|T],List):- \+is_member(H,List) , compare1(T,List).

输出

?- compare1([3,4],[1,2,2]).
   false
?- compare1([1,2,3,4],[5,6]).
   false
?- compare1([1,2,3],[4,5,6,3]).
   true
?- compare1([1,2,3],[]).
   false
?- compare1([],[]).
   false
?- compare1([],[1,2,3]).
   false

希望这对您有所帮助。