首先,謂詞得到一半的工作:重新排序列表中,這樣每一個第二個元素挑選出來,並追加到後面,保持順序:
untangle([], []).
untangle([X|Xs], [X|Ys]) :-
untangle_1([X|Xs], [X|Ys], Bs, Bs).
% The rest of the Untangled is the list at the back;
% the list at the back is now empty
untangle_1([], Back, Back, []).
% Keep elements in odd positions at the front
untangle_1([X|Xs], [X|Untangled], Back, Bs) :-
untangle_2(Xs, Untangled, Back, Bs).
% Same as above
untangle_2([], Back, Back, []).
% Move elements in even positions to the back
untangle_2([X|Xs], Untangled, Back, [X|Bs]) :-
untangle_1(Xs, Untangled, Back, Bs).
這是非常相似到定義爲in this answer的interwine/3
。而不是使用兩個「解壓縮」元素列表,它將它們放在同一列表的前面和後面。
現在你需要的是洗牌,否則將被追加到後面的元素:
shuffle([], []).
shuffle([X|Xs], Shuffled) :-
untangle_1([X|Xs], Shuffled, Back, Bs),
shuffle(Bs, Back).
難道我理解是否正確?
?- shuffle([a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z], S), write(S).
[a,c,e,g,i,k,m,o,q,s,u,w,y,b,f,j,n,r,v,z,d,l,t,h,x,p]
S = [a, c, e, g, i, k, m, o, q|...].
您還會注意到,在模式shuffle(+List, -Shuffled)
,shuffle(-List, +Shuffled)
和shuffle(?List, ?Shuffled)
這shuffle/2
作品。就我所能看到的而言,它的語義(在實現中幾乎完全相同)與false的解決方案相同。
是的,你釘了它!那是對的。要做更多的測試,但它看起來像我想要的那樣工作。非常感謝你! – TreEnt 2014-10-02 14:34:45