2013-12-09 5 views
1

특정 지점의 목록을 작은 목록으로 분할하는 술어를 만들어야했습니다.특정 "마커"가있는 목록 분할

예. 제로가있는 다음 목록 [4,5,0,3,2,0,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). 

어쩌면 대체 솔루션이 있습니까 :

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

내 솔루션 (! 실제로 작동) 다음은? 대단히 감사합니다!

답변

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).