2014-04-04 115 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)