Prolog比较表

Prolog比较表,prolog,Prolog,编写一个谓词,显示列表1是否以与列表2相同的元素结尾 大概是 endsWith([a,b,c,d,e],[c,d,e])在 endsWith([a,b,c,d,e],[c,e,d])为false只需几行代码即可解决问题: 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

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

大概是

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


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

只需几行代码即可解决问题:

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

希望有帮助。

如果要确保两个列表都以至少一个元素的公共子列表结尾:

same_end(L1, L2) :- append(_, [X|Xs], L1), append(_, [X|Xs], L2).
如果你真的想让第一个列表在第二个列表中结束:

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

您是否认为第一个列表以整个第二个列表结尾,或者它们至少有一个元素的共同结尾?
endsWith([a | Xs],[b])
错误失败另外,
last/2
是SWI和GNU Prolog已经提供的谓词。重新定义预定义谓词通常不是一个好主意。您可以使用
append/3
same_end(L1,L2):-append(X[Xs],L1),append(X[Xs],L2)。