Prolog挑战

时间:2011-11-25 15:05:29

标签: prolog dcg

我有以下子列表算法的实现。 问题:给定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).

2 个答案:

答案 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的评论,这是“子集”而不是“子列表”。