2013-12-09 48 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).