2016-09-24 92 views
1

我試圖創建一個查詢,還給了以下內容:列表操作與序言

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

也就是說,它需要一個列表的所有其他元素,並做了同樣的剩餘名單和穿一切在一起。

這是我的代碼到目前爲止。

sky([X|Y], Skied):- 
    split([X|Y],Z1), 
    split(X,Z2), 
    sky(Z2,Z3), 
    append(Z1,Z3,Skied). 

sky([],[]). 

split([X,_|T], [X|R]):- 
    split(T,R). 

split([X|[]], [X]). 
split([],[]). 

有人可以解釋爲什麼它不會工作,它背後的過程,就像一個視覺指南。謝謝!

回答

1

您的代碼幾乎是正確的,而不是split(X,Z2)您需要編寫split(Y,Z2)。這是因爲X是單個元素,並且split(X,Z2)將返回[X],如果我理解正確的話不是你想要的。你需要編寫split(Y,Z2)來獲取偶數元素(或者在你的描述中每隔一個元素)並且調用sky(Y,Z3)以遞歸方式進行。因此,新的版本是:

sky([X|Y], Skied):- 
    split([X|Y],Z1), 
    split(Y,Z2), 
    sky(Z2,Z3), 
    append(Z1,Z3,Skied). 

sky([],[]). 

split([X,_|T], [X|R]):- 
    split(T,R). 

split([X|[]], [X]). 
split([],[]). 

一些例子和輸出:

?- sky([1,2,3,4,5,6],X). 
X = [1, 3, 5, 2, 6, 4] ; 
false. 
?- sky([1,2,3,4,5,6,7,8,9],X). 
X = [1, 3, 5, 7, 9, 2, 6, 4, 8] ; 
false. 
+0

但是如果名單是什麼長?這會產生錯誤的結果,因爲我們不會從剩下的列表中取出其他所有元素等等。期望的輸出與您的輸出不同 – DoubleOseven

+0

現在我看到您想要[1,3,5,2,6,4]但它不是在你的描述中清楚你想要什麼。可以更清楚你要問什麼,或者給出另一個例子? – coder

+0

假設我們有以下清單:[1,2,3,4,5,6,7,8,9]輸出應該是:[1,3,5,7,9,2,6,4,8 ]。列表中的其他元素和剩下的列表以及剩餘列表中的其他元素......應該取出並最終放在一起。這是否有意義?感覺我不好解釋:s – DoubleOseven