2016-09-24 106 views
1

我是Prolog的新手,並且遇到了這種練習練習。該問題要求定義一個謂詞Prolog列表的交錯元素

zipper([[List1,List2]], Zippered). //this is two lists within one list. 

該謂詞應該將List1的元素與List2的元素交錯。

例如,

zipper([[1,3,5,7], [2,4,6,8]], Zippered) -> Zippered = [1,2,3,4,5,6,7,8]. 

zipper([[1,3,5], [2,4,6,7,8]], Zippered) -> Zippered = [1,2,3,4,5,6,7,8]. 

到目前爲止,我有兩個不同的列表中選擇一個解決方案:

zipper ([],[],Z). 
zipper([X],[],[X]). 
zipper([],[Y],[Y]). 
zipper([X|List1],[Y|List2],[X,Y|List]) :- zipper(List1,List2,List). 

我不知道我怎麼能對一個列表翻譯這個解決方案。任何關於我可以開始的建議都會非常有幫助!

+1

這似乎很容易,因爲你已經把所有的成分。您只需要以正確的方式調用謂詞:'zipper([[List1,List2]],Zippered): - 拉鍊(List1,List2,Zippered).'注意'[[List1,List2]]'是絕對的**不是**代表一對清單的好方法。要麼使用單獨的參數,要麼使用習慣的'( - )/ 2'運算符來表示對:'List1-List2'。 – mat

回答

1

首先你應該改變zipper ([],[],Z).zipper ([],[],[]).。然後,爲了讓它適用於一個列表,您可以在評論中進行建議,或者可以稍微改變它。所以我的版本是:

zipper([],[],[]). 
zipper([X,[]],X). 
zipper([[],Y],Y). 
zipper([[X|List1],[Y|List2]],[X,Y|List]) :- zipper([List1,List2],List). 

併爲你的例子:

?- zipper([[1,3,5,7], [2,4,6,8]], Zippered). 
Zippered = [1, 2, 3, 4, 5, 6, 7, 8] ; 
Zippered = [1, 2, 3, 4, 5, 6, 7, 8] ; 
false. 

?- zipper([[1,3,5],[2,4,6,7,8]],Zippered). 
Zippered = [1, 2, 3, 4, 5, 6, 7, 8] ; 
false.