2014-04-04 82 views
2

林在序言nrew。即時通訊嘗試學習壓縮功能。問題是這樣的。Prolog的壓縮功能

拉鍊(L1,L2,X):該列表X由「拉上」第一2個參數構成。

的結果應該是這樣的:

?- zip([a, b, c], [x, y, z], X). 
L = [a, x, b, y, c, z] 
?- zip([a, b], [x, y, z], X). 
false 
?- zip([a, b, c, d], X, [a, p, b, q, c, r, d, s]). 
X = [p, q, r, s] 

我有這個迄今所做。 我可以得到第一個第三的結果,但不是第二個。任何人都可以幫助我解決第二個問題。謝謝

zip([X],[Y],[X,Y]). 
zip([], [], []). 
zip([X|Xs], [Y|Ys], [X,Y|Zs]) :- 
    zip(Xs,Ys,Zs). 

zip([X|Xs],[],[X|Xs]). 
zip([Y|Ys],[],[Y|Ys]). 

zip(Xs, [], Xs). 
zip([], Ys, Ys). 

我該如何定義這個函數? allsame(L):列表L包含相同的元素。 我應該得到這個。

?- allsame([b, b, b]). 
true 
?- allsame([c, c, c, Y, c, c, X, c]). 
X = c, Y = c 
+2

如果給出前兩個參數,那麼謂詞應該失敗是很常見的。而且,這個名字更像是「隔行」或類似的。 'zip'通常被認爲是一個'map'函數 – false

回答

4

您有它:

zip([], [], []). 
zip([X|Xs], [Y|Ys], [X,Y|Zs]) :- zip(Xs,Ys,Zs). 

僅此一點就足以確定你正在尋找的關係。額外的從句沒有幫助。

測試:

?- zip([a, b, c], [x, y, z], X). 
X = [a, x, b, y, c, z]. 

?- zip([a, b], [x, y, z], X). 
false. 

?- zip([a, b, c, d], X, [a, p, b, q, c, r, d, s]). 
X = [p, q, r, s]. 
+0

謝謝m09。我對此仍然陌生。我還有一件事。我能做些什麼來得到這個。 allsame(L):列表L包含相同的元素。例如, ? - allsame([b,b,b])。 true ? - allsame([c,c,c,Y,c,c,X,c])。 X = c,Y = c – aman

+0

@aman應該發佈爲新問題。 – lurker

2

@ M09給出了正確的答案。但是,我想解釋一下爲什麼你有什麼是不正確的:

(1) zip([X],[Y],[X,Y]). 

這條規則說[X,Y]是當你壓縮[X][Y]你會得到什麼。這是正確的,不會導致問題。這條規則對於下面的規則來說簡直是多餘的(我會解釋它......)。

(2) zip([], [], []). 

這條規則說[]是當你壓縮[][]這是正確的,因爲簡單的規則,你可以有拉鍊你會得到什麼。

(3) zip([X|Xs], [Y|Ys], [X,Y|Zs]) :- 
     zip(Xs,Ys,Zs). 

這條規則說[X,Y|Zs]是當你壓縮[X|Xs][Y|Ys]如果Zs是當你壓縮XsYs你會得到什麼,你會得到什麼。這也是合乎邏輯和正確的。請注意,zip([X], [Y], [X,Y])zip([X|[]], [Y|[]], [X,Y|[]]).,因此它可以從規則(2)和(3)中派生。它將匹配規則(3)第一,zip([X|[]], [Y|[]], [X,Y|Zs]) :- zip([], [], Zs).,然後Zs將成爲由規則[](2)`。

(4) zip([X|Xs],[],[X|Xs]). 
(5) zip([Y|Ys],[],[Y|Ys]). 

規則(4)說[X|Xs]是當你壓縮[X|Xs][]你會得到什麼。規則(5)在邏輯上說完全一樣的東西,只有一個不同的變量名稱。這些都是不正確的,因爲這意味着,例如,zip([a,b,c], [], Z)將是真實的,如果Z = [a,b,c]

(6) zip(Xs, [], Xs). 

這條規則說Xs是當你壓縮Xs[]你會得到什麼。或者換句話說,任何輸入,用[]壓縮,將再次成爲輸入值。它甚至不一定是一個清單!這顯然是不正確的。像zip(x, [], Z)這樣的查詢將會以Z = x獲得成功,zip(friend(bill,mary), [], Z)將成功獲得Z = friend(bill,mary)

(7) zip([], Ys, Ys). 

這條規則說Ys是當你壓縮[]Ys你會得到什麼。這是不正確的(6)是不正確的。實際上,這個規則與(2)和(3)相結合就是爲什麼查詢zip([a, b], [x, y, z], X).會產生結果而不是失敗。規則(2)和(3)將遞歸到zip([b], [y,z], [b,y|T]) :- zip([], [z], T).然後zip([], [z], T)將最終在規則(7)T = [z]成功,並最終產生一個最終結果的X = [a, x, b, y, z]zip([a, b], [x, y, z], X)