我正在编写一个程序来重复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).
直到最后一行,我才能理解这里的一切。如果有人能用简单的语言解释发生什么事情会很棒。三江源。
答案 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]
如果您可以按照我的解释,您也可以按照跟踪输出。