2011-11-25 264 views
3

我有以下實現的子列表算法。 問題:給定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

你是什麼意思是一個列表是另一個子列表?因爲有幾種解釋。即([a,b,c],[a,c]),子列表([a,b,c],[c,a])''''子列表([a ,b,c],[a,b])? – salva

+0

正確的例子是:?-sublist([a b c],[d e b a b c f])True \ n?-sublist([a b c],[a e b f c])失敗 – Ravul

回答

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

有:

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

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

(警告:爲了能夠解釋這個解決方案,您需要先了解DCG中!)

+0

這是一個很好的解決方案,謝謝! – Ravul

0
sublist([], _). 
sublist([H|T], List) :- 
    select(H, List, R),!, 
    sublist(T, R). 

你可以做,如果它更有效名單被命令開始。

根據您的Prolog方言,select/3可能會有不同的名稱。

警告:根據虛假評論,這比「子列表」更像「子集」。

+0

對於'? - sublist([a,c],[a,b,c])',您的解決方案可能不成功。 – false

+1

嗯。取決於列表是用來表示一個集合還是一個列表。由於我通常使用列表作爲集合,所以這可能會使我的想法產生偏差。如果列表代表一個序列,並且該子列表應該是部分序列,那麼你是對的。 – twinterer

+0

關於序列和集合有這種含糊之處。不過:'sublist([a,c],[A,B,c])'應該產生一個合適的答案。 – false