compress([X,Y|Xs], Q) :- dif(X,Y), compress([Y|Xs], QR), append([X], QR, Q).
compress([X,X|Xs], Q) :- compress([X|Xs], Q).
compress([], []).
compress([X|[]], Q) :- compress([], QR) ,append([X], QR ,Q).
我在上面的代码中还有一个问题:
让我们考虑一下:
compress([1,2,2,3,4], Q).
让Q
成为_G900
的惯例。
第一步是统一第一条规则。所以:
compress([1,2|[2,3,4]], _G900) :- dif(1,2), compress([2|[2,3,4], G_901), append([1], _G901, _G900).
问题在于最后一个子目标 - append([1], _G901, _G900).
为什么?我无法理解append
[1]
到_G901
是如何实现的。毕竟,G_901
是任何实例。所以,我有一个问题是理解Prolog中的工作重现。我基于其他语言的直觉是:
在append
被执行之前_G901
应该是已知的,尤其应该是一个空列表 - 因为第三条规则(停止条件重复)。
即使我的直觉是对的,我也会要求深入解释。
提前致谢。