I am learning Prolog and I have difficulty in understanding the recursive backtracking. I am trying to understand how the search tree looks like while backtracking and I am kind of lost.
Say for Example the below lines of code, removes all the occurrences of an element from a list :
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).
Now I query the following ?- remove_all( 2, [1,4,2,3,5,2,7,2], X). I used the online SWISH Prolog to execute it with the trace and I got the following tree
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]
What I am not able to understand is how the backtracking is happening in these lines of code
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])
How does the Prolog interpreter perform recursion on this? Can some please explain.