【发布时间】:2019-11-07 18:14:17
【问题描述】:
我正在学习 Prolog,但我很难理解递归回溯。我试图了解回溯时搜索树的样子,但我有点迷路了。
例如下面的代码行,从列表中删除所有出现的元素:
remove_all(_, [], []).
remove_all(El, [El|Tail], Tail2):-
remove_all(El, Tail, Tail2).
remove_all(El, [Head|Tail], [Head|Tail2]):-
not(El = Head),
remove_all(El, Tail, Tail2).
现在我查询以下内容?-remove_all( 2, [1,4,2,3,5,2,7,2], X).我使用在线 SWISH Prolog 来执行它,并得到以下树
Call:remove_all(2, [1, 4, 2, 3, 5, 2, 7, 2], _4896)
Call:not(2=1)
Exit:not('10758ac0-dc91-4335-a0d8-48b7b11776c0' : (2=1))
Call:remove_all(2, [4, 2, 3, 5, 2, 7, 2], _5128)
Call:not(2=4)
Exit:not('10758ac0-dc91-4335-a0d8-48b7b11776c0' : (2=4))
Call:remove_all(2, [2, 3, 5, 2, 7, 2], _5146)
Call:remove_all(2, [3, 5, 2, 7, 2], _5146)
Call:not(2=3)
Exit:not('10758ac0-dc91-4335-a0d8-48b7b11776c0' : (2=3))
Call:remove_all(2, [5, 2, 7, 2], _5164)
Call:not(2=5)
Exit:not('10758ac0-dc91-4335-a0d8-48b7b11776c0' : (2=5))
Call:remove_all(2, [2, 7, 2], _5182)
Call:remove_all(2, [7, 2], _5182)
Call:not(2=7)
Exit:not('10758ac0-dc91-4335-a0d8-48b7b11776c0' : (2=7))
Call:remove_all(2, [2], _5200)
Call:remove_all(2, [], _5200)
Exit:remove_all(2, [], [])
Exit:remove_all(2, [2], [])
Exit:remove_all(2, [7, 2], [7])
Exit:remove_all(2, [2, 7, 2], [7])
Exit:remove_all(2, [5, 2, 7, 2], [5, 7])
Exit:remove_all(2, [3, 5, 2, 7, 2], [3, 5, 7])
Exit:remove_all(2, [2, 3, 5, 2, 7, 2], [3, 5, 7])
Exit:remove_all(2, [4, 2, 3, 5, 2, 7, 2], [4, 3, 5, 7])
Exit:remove_all(2, [1, 4, 2, 3, 5, 2, 7, 2], [1, 4, 3, 5, 7])
X = [1, 4, 3, 5, 7]
我无法理解的是这些代码行中的回溯是如何发生的
Exit:remove_all(2, [], [])
Exit:remove_all(2, [2], [])
Exit:remove_all(2, [7, 2], [7])
Exit:remove_all(2, [2, 7, 2], [7])
Exit:remove_all(2, [5, 2, 7, 2], [5, 7])
Exit:remove_all(2, [3, 5, 2, 7, 2], [3, 5, 7])
Exit:remove_all(2, [2, 3, 5, 2, 7, 2], [3, 5, 7])
Exit:remove_all(2, [4, 2, 3, 5, 2, 7, 2], [4, 3, 5, 7])
Exit:remove_all(2, [1, 4, 2, 3, 5, 2, 7, 2], [1, 4, 3, 5, 7])
Prolog 解释器如何对此执行递归?能不能解释一下。
【问题讨论】:
标签: prolog