需要解释代码:重复Prolog中的第N个元素

时间:2013-12-16 18:08:19

标签: prolog

我正在编写一个程序来重复Prolog中的元素,例如

repeat_nth(1, [H|T], [H,H|T]).
repeat_nth(N, [H|T], [H|T1]) :-
    N > 1,
    N1 is N-1,
    repeat_nth(N1, T, T1).

直到最后一行,我才能理解这里的一切。如果有人能用简单的语言解释发生什么事情会很棒。三江源。

1 个答案:

答案 0 :(得分:1)

最后一行发生的是递归。假设我们拨打电话repeat_nth(2, [1,2,3], X)。 2不是1所以我们输入第二条规则。现在2大于1,所以我们将N1计算为N-1。因此,N1将等于1.最后一行将是呼叫repeat_nth(1, [2,3], T1)。从那里,我们将输入第一条规则,并将[2,2,3]统一为T1。返回第二个规则中的呼叫站点,不再需要做任何事情,X将与[1,2,2,3]统一。

您可能会发现调用trace, repeat_nth(2, [1,2,3], X).或尝试使用trace进行其他查询有助于查看Prolog的功能。它向您展示了这样的事情:

?- trace, repeat_nth(2, [1,2,3], X).
   Call: (7) repeat_nth(2, [1, 2, 3], _G1360) ? 
   Call: (8) 2>1 ? 
   Exit: (8) 2>1 ? 
   Call: (8) _G1492 is 2+ -1 ? 
   Exit: (8) 1 is 2+ -1 ? 
   Call: (8) repeat_nth(1, [2, 3], _G1480) ? 
   Exit: (8) repeat_nth(1, [2, 3], [2, 2, 3]) ? 
   Exit: (7) repeat_nth(2, [1, 2, 3], [1, 2, 2, 3]) ? 
X = [1, 2, 2, 3] 

如果您可以按照我的解释,您也可以按照跟踪输出。