Prolog和递归规则

时间:2016-05-23 09:13:42

标签: prolog

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应该是已知的,尤其应该是一个空列表 - 因为第三条规则(停止条件重复)。

即使我的直觉是对的,我也会要求深入解释。

提前致谢。

0 个答案:

没有答案