2013-12-09 69 views
1

我不得不創建一個謂詞,將特定點的列表拆分爲更小的列表。用特定的「標記」分割列表

E.g.它必須將以下列表[4,5,0,3,2,0,6,1]分開,其中零是。 的Prolog的回答應該是:

X=[[4,5],[3,2],[6,1]]. 

我的解決方案(!實際工作)如下:

get_chunk(_,[],[],[]). 
get_chunk(Splitter,[Splitter|L],[],L). 
get_chunk(Splitter,[Head|L],[Head|X],R) :- get_chunk(Splitter,L,X,R). 

split([],_,[]). 
split(SL,Splitter, [U|Us]) :- get_chunk(Splitter,SL,U,L), 
           split(L,Splitter,Us). 

有可能的替代解決方案,這是更優雅? 非常感謝!

回答

3
split(I, S, [L|Cs]) :- 
    append(L, [S|T], I) -> split(T, S, Cs) ; [L|Cs] = [I]. 
+0

分裂([1,2],2,L)。得到L = [[1],[]]。預期?當然是 – ssBarBee

+0

。否則,你如何知道列表以分隔符結束?通常有一個選項可以改變這種行爲,並擺脫空容器。 – CapelliC

+0

啊我現在明白了:)我試圖擺脫它在我的解決方案中認爲它是多餘的:) – ssBarBee

1

我給它一去,這裏是我想出了:)

split([],Spliter,[]) :- !. 
split(List,Spliter,[List]) :- not(member(Spliter,List)). 
split(List,Spliter,[X|Ss]) :- append(X,[Spliter|Y],List),!, 
           split(Y,Spliter,Ss).