3

サブリストアルゴリズムの以下の実装があります。問題:2つのリストが与えられた場合、一方が他方のサブリストであるかどうかを判別します。私は本当にPrologで別の明確な解決策が必要になるでしょう。

解決策1:

sublist([H1|T1], L, [H2|T2]):-
  H1 = H2,
  sublist(T1, L, T2).
sublist([], _, _)
sublist([H1|T1],L,[H2|T2]):-
  sublist(L,L,T2).

解決策2:

sublist([H|T], [H|L]):- check(T,L),
sublist(S, [H|T]):- sublist(S,T).
check([H|T], [H|R]):-
   check(T,R).
check([],_).

解決策3:

sublist(S,L):-
  append(_,R,L),
  append(S,_,R).

解決策3':

sublist(S,L):-
  append3(_,S,_,L).
4

2 に答える 2

2
?- phrase((...,seq(Sublist),...),List).

と:

... --> [] | [_], ... .

seq([]) --> [].
seq([E|Es]) --> [E], seq(Es).

(警告:このソリューションを説明できるようにするには、最初にDCGを理解する必要があります!)

于 2011-11-25T15:15:04.053 に答える
0
sublist([], _).
sublist([H|T], List) :-
    select(H, List, R),!,
    sublist(T, R).

リストを最初に並べ替えると、より効率的になります。

Prologの方言によっては、select/3名前が異なる場合があります。

警告:falseのコメントによると、これは「サブリスト」ではなく「サブセット」です。

于 2011-11-25T15:24:39.957 に答える