代码之家  ›  专栏  ›  技术社区  ›  Walker

Prolog比较列表[关闭]

  •  -1
  • Walker  · 技术社区  · 6 年前

    编写一个谓词,显示列表1是否以与列表2相同的元素结尾。

    比如

    endsWith([a,b,c,d,e], [c,d,e]) 是真的,而

    endsWith([a,b,c,d,e], [c,e,d]) 为假

    2 回复  |  直到 6 年前
        1
  •  0
  •   damianodamiano    6 年前

    只需几行代码,您就可以解决您的问题:

    last([E],E):- !.
    last([_|T],E):-
        last(T,E).
    
    endsWith(L1,L2):-
        last(L1,E),
        last(L2,E).
    
    ?- endsWith([a,b,c,d,e], [c,d,e]).
    true
    
    ?- endsWith([a,b,c,d,e], [c,e,d]).
    false
    

    首先找到第一个列表的最后一个元素,然后检查它是否等于第二个列表的最后一个元素。如果要检查第一个列表是否以第二个列表结尾,可以使用 reverse/2 以这种方式:

    compareLists(_,[]):- !.
    compareLists([H|T],[H|T1]):-
        compareLists(T,T1).
    
    endsWithAllElements(L1,L2):-
        reverse(L1,L1R),
        reverse(L2,L2R),
        compareLists(L1R,L2R).
    
    ?- endsWithAllElements([a,b,c,d,e], [c,e,d]).
    false
    
    ?- endsWithAllElements([a,b,c,d,e], [c,d,e]).
    true
    

    希望有帮助。

        2
  •  0
  •   lurker    6 年前

    如果要确保两个列表以至少一个元素的公共子列表结尾,请执行以下操作:

    same_end(L1, L2) :- append(_, [X|Xs], L1), append(_, [X|Xs], L2).
    

    如果你真的想让第一个列表在第二个列表中结束:

    same_end(L1, L2) :- append(_, L2, L1).