【问题标题】:Splitting list with a specific "marker"带有特定“标记”的拆分列表
【发布时间】:2013-12-09 22:07:23
【问题描述】:

我必须创建一个谓词,将特定点的列表拆分为更小的列表。

例如它必须将以下列表 [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). 

是否有更优雅的替代解决方案? 非常感谢!

【问题讨论】:

    标签: list split prolog


    【解决方案1】:
    split(I, S, [L|Cs]) :-
       append(L, [S|T], I) -> split(T, S, Cs) ; [L|Cs] = [I].
    

    【讨论】:

    • 拆分([1,2],2,L)。产生 L=[[1],[]]。预计?
    • 当然。否则你怎么知道列表以分隔符结尾?通常有一个选项可以改变这种行为,并摆脱空瓶。
    • 啊我现在明白了 :) 我试图在我的解决方案中摆脱它,认为它是多余的 :)
    • 非常好的解决方案(+1)
    【解决方案2】:

    我试了一下,这就是我想出的:)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 2016-06-28
      • 1970-01-01
      • 2022-10-07
      • 1970-01-01
      相关资源
      最近更新 更多