2016-09-24 195 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.