2013-05-30 52 views
3

我在尋找一個機會,切片名單成更小的列表,像:序言:片大名單中較小的單獨列表

[1,2,3,4] -> [[1,2],[2,3],[3,4]] 
[1,2] -> [[1,2]] 

等..

首先,我搜索用於構建謂詞的解決方案。但我無法想出它與他們一起做。這是正確的?! 所以我寫了一個自己的斷言:

slice([],[]). 
slice([H1,H2|T], Output) :- 
    append([H2],T,New), 
    slice(New, [[H1,H2]|Output]). 

但在過去的迭代步驟,當新的僅包含一個元素,用統一的[H1,H2 | T]失敗..

回答

0
slice([], []). 
slice([_], []) :- !. 
slice([H1, H2 | T], [[H1, H2] | SliceT]) :- 
    slice([H2 | T], SliceT). 
1

建立在@SergeyDymchenko的答案上,很大程度上取決於您想如何處理單個元素列表的特殊情況,[1]

你放棄它,這樣

[1] --> [] 

如果是這樣,謝爾蓋的回答是正確的。

或者,你「片」成一個單一的元素的子列表,這樣

[1] --> [ [1] ] 

如果是這樣,你需要修改謝爾蓋的回答的第二學期:

slice([]  , []   ) . 
slice([H]  , [ [H] ]  ) . 
slice([H1,H2|T] , [[H1,H2]|R]) :- 
    slice([H2|T] , R) 
    . 

第三個原因是簡單失敗,將單個元素的列表視爲謂詞的無效輸入:單個元素的列表不能分解爲2元素的子列表,每個列表包含相鄰的對。

只有您可以確定此問題的真實語義。

+0

從這個問題你的第二個替代方案不符合測試的例子。 –

+0

@SergeyDymchenko - 由於OP沒有給出一個單一元素列表的例子,儘管他暗示它是問題所在,我更懷疑這是她的分析沒有考慮的特殊情況。無論是哪種情況,問題都沒有指定對單個元素列表的期望處理:單個元素是否應該導致失敗,從結果集中排除或作爲短子列表包含在結果集中。 –

+0

在單個元素上不存在失敗的可能性,因爲如果從任何更長的列表開始,您總是會遇到單元素列表。 –

2

定義slice/2基於mapadj/3Prolog lambdas串聯!簡單地寫:

slice(Xs,Yss) :- 
    mapadj(\X0^X1^[X0,X1]^true, Xs, Yss). 

示例查詢:

?- slice([1,2],Yss). 
Yss = [[1,2]]. 

?- slice([1,2,3,4],Yss). 
Yss = [[1,2],[2,3],[3,4]]. 
相關問題