我有以下子列表算法的实现。 问题:给定2个列表,确定一个是否是另一个的子列表。 我真的需要Prolog中另一个独特的解决方案。
解决方案一:
sublist([H1|T1], L, [H2|T2]):-
H1 = H2,
sublist(T1, L, T2).
sublist([], _, _)
sublist([H1|T1],L,[H2|T2]):-
sublist(L,L,T2).
解决方案二:
sublist([H|T], [H|L]):- check(T,L),
sublist(S, [H|T]):- sublist(S,T).
check([H|T], [H|R]):-
check(T,R).
check([],_).
解决方案三:
sublist(S,L):-
append(_,R,L),
append(S,_,R).
解决方案三':
sublist(S,L):-
append3(_,S,_,L).
答案 0 :(得分:2)
?- phrase((...,seq(Sublist),...),List).
使用:
... --> [] | [_], ... .
seq([]) --> [].
seq([E|Es]) --> [E], seq(Es).
(警告:为了能够解释这个解决方案,你需要先了解DCG!)
答案 1 :(得分:0)
sublist([], _).
sublist([H|T], List) :-
select(H, List, R),!,
sublist(T, R).
如果命令列表开头,你可以提高效率。
根据您的Prolog方言,select/3
可能有不同的名称。
警告:根据false的评论,这是“子集”而不是“子列表”。