我是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,但这是不同的故事)。
答案 0 :(得分:2)
您可以自己轻松地编写成员函数
my_member(H, [H|_]).
my_member(X, [_|T]) :-
my_member(X,T).
答案 1 :(得分:0)
根据您的条件,当两个列表具有至少一个共同的元素时,返回True
和False
(如果它们没有共同的元素)。
您要做的就是检查列表的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
希望这对您有所帮助。