需要解释代码:在Prolog中重复第n个元素

需要解释代码:在Prolog中重复第n个元素,prolog,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). 我能理解这里的一切直到最后一行。如果有人能简单地解释发生了什么,那就太好了。谢谢。最后一行发生的是递归。假设我们调用重复(2[1,2,3],X)。2不是1,所以我们进入第二条规则。现在2大于1,所以我们计

例如,我正在编写一个程序来重复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).

我能理解这里的一切直到最后一行。如果有人能简单地解释发生了什么,那就太好了。谢谢。

最后一行发生的是递归。假设我们调用
重复(2[1,2,3],X)
。2不是1,所以我们进入第二条规则。现在2大于1,所以我们计算N1为N-1。因此N1等于1。因此,最后一行将是调用
repeat\n(1[2,3],T1)
。从那里,我们将进入第一条规则,并将T1统一为
[2,2,3]
。返回第二条规则中的调用站点,不需要做更多的事情,X将与
[1,2,2,3]
统一

您可能会发现调用
trace、重复(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] 
如果你能理解我的解释,你可能也能理解跟踪输出