1

我是 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).

但是当我问在线嗖嗖序言工具时common_elements([3,13,8,1],[5,3,7,3,1]).,它回答了真正的 37 次,而不是像 common_list/2 和 common_list2/2 那样的 3 (我必须使用 cut 来获得 1 而不是 3,但这是另一回事)。

4

2 回答 2

1

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

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

于 2019-12-12T09:50:37.557 回答
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

希望这对您有所帮助。

于 2019-12-12T12:20:29.730 回答