需要解释代码:在Prolog中重复第n个元素
例如,我正在编写一个程序来重复Prolog中的一个元素需要解释代码:在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,所以我们计
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]
如果你能理解我的解释,你可能也能理解跟踪输出