Я изучаю Пролог, и мне трудно понять рекурсивный возврат. Я пытаюсь понять, как выглядит дерево поиска при возврате, и я вроде как потерян.
Например, приведенные ниже строки кода, удаляет все вхождения элемента из списка:
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, чтобы выполнить его с трассировкой, и я получил следующее дерево
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 выполняет рекурсию по этому вопросу? Могут ли некоторые объяснить, пожалуйста.