2012-05-12 57 views
1

我正在努力爭取使用Prolog列表。從給定列表中創建兩個列表

這裏是我的問題:我需要在列表和兩個變量,並存儲在列表A中的奇數元素和偶數元素列表B.

我得到了這一點,但它不給結果即時尋找

store(X, [], []). 
store([X,Y|Z],[X|_],[Y|_]):-store(Z,X,Y). 

的結果應該是:

where ?- store ([a,b,c,1,2,3], A, B). 
     A = [b,1,3]. 
     B = [a,c,2]. 

回答

1

從列表參數構建額外的名單做它的遞歸訪問,存儲元素在適當情況下。看看你能不能完成這個片段

odd_even([], [], []). 
odd_even([N|Ns], [N|Odds], Evens) :- 
    odd(N), 
    !, odd_even(Ns, Odds, Evens). 
% here another odd_even for evens 

odd(N) :- 
    ... % use rem/2 to find the integer remainder of N is 1 

編輯:在在另一個地方(通常稱爲分裂),參觀擺脫甚至地方在列表和元素的元素只是將它們放在兩個額外的參數上:我們需要一個更多的終止規則,因爲現在我們將兩個參數放在一起從要被分割的列表中。

split([], [], []). 
split([X], [], [X]). 
split([X,Y|R], [X|Xs], [Y|Ys]) :- 
    split(R,Xs,Ys). 

有一種情況需要考慮:如果奇數vs偶數必須從列表末尾「計數」。 然後我們應該在完成時交換(最終)列表...這將需要在遞歸訪問中添加2個更多參數,或者計數num.of.elements以事先決定在哪裏執行它們...

+0

I應該讓我的問題更清楚。我想要位置1,3,5 ....中的元素在列表A中,元素位於位置2,4,6中的元素中。 – STee

+0

謝謝,我一直在努力去理解從一個元素中取多個元素名單的頭。 – STee

+0

我可以理解基本案例和遞歸案例,但不能理解代碼的第二部分:split([X],[],[X])。 – STee