Explicación de un algoritmo Prolog para agregar dos listas juntas

Este es un algoritmo para adjuntar dos listas:

Domains
list= integer*

Predicates
nondeterm append(list, list, list)

Clauses
append([], List, List) :- !.
append([H|L1], List2, [H|L3]) :- append(L1, List2, L3).

Goal
append([9,2,3,4], [-10,-5,6,7,8], Ot).

El resultado es una lista.[9,2,3,4,-10,-5,6,7,8], y se guarda en "Ot".

Mi pregunta es, ¿cómo funciona esto?

Lo que entiendo es que en cada llamada recursiva, en la primera lista, solo se obtiene la cola como una lista (reduciendo así su tamaño1 hasta que sea[] ), el segundo argumento "List2"no cambia en absoluto, y el tercer argumento ... al principio es[], y después de cada llamada recursiva tienes su cola, pero ya que es[], se mantiene[].

Entonces, ¿cómo es que, de repente, en el tercer argumento ("Ot") ¿Tenemos la lista adjunta? ¿Puede alguien explicar este algoritmo paso a paso?

Respuestas a la pregunta(2)

Su respuesta a la pregunta