序言中列表的后缀
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],[]].
我想定义一个谓词 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],[]].