序言中列表的后缀

Suffix of a list in prolog

我想定义一个谓词 suffix (S,L) 如果 S 是一个后缀为 列表 L。例如:

?− suffix([a,b,c],[b,c]).
true.

?− suffix([a,b,c],[b,a]).
false.

我尝试使用 suffix(S,L):- append(_,S,L). 但这不适用于我的示例,如上所示。

这有效(请参阅 https://swish.swi-prolog.org/p/gMgNaCKQ.pl 的工作示例):

suffix(L,S) :- append(_,S,L).

这也有效(有关工作示例,请参阅 https://swish.swi-prolog.org/p/XqCXArvz.pl):

suffix(    L  , L ) .                % every list is a suffix of itself, with the empty list [] as its prefix
suffix( [_|L] , S ) :- suffix(L,S) . % otherwise, pop the list and try again.
suffix(L, L).
suffix(LongLst, EndLst) :-
    suffix_(LongLst, EndLst).

suffix_([_|T], T).
suffix_([_|T], T2) :-
    suffix_(T, T2).

swi-prolog 中的用法:

?- time(findall(S, suffix([a, b, c, d, e, f, g], S), Ss)).
% 27 inferences, 0.000 CPU in 0.000 seconds (88% CPU, 1184730 Lips)
Ss = [[a,b,c,d,e,f,g],[b,c,d,e,f,g],[c,d,e,f,g],[d,e,f,g],[e,f,g],[f,g],[g],[]].