【问题标题】:Two lists have at least one common element without Prolog built-in predicates两个列表至少有一个没有 Prolog 内置谓词的公共元素
【发布时间】:2019-12-12 09:15:55
【问题描述】:

我是 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,但这是另一回事) .

【问题讨论】:

    标签: prolog swi-prolog-for-sharing


    【解决方案1】:

    你可以很容易地自己编写成员函数

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

    【讨论】:

    • 你的第一个子句是不必要的,因为如果你省略它,Prolog 已经失败了。
    • 你是对的!谢谢你的评论。我已经更正了代码...
    【解决方案2】:

    根据您的情况,当两个列表至少有一个共同元素时,如果它们没有共同元素,则返回 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
    

    希望这对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-11
      • 1970-01-01
      • 1970-01-01
      • 2018-05-07
      • 1970-01-01
      相关资源
      最近更新 更多