Explicação de um algoritmo Prolog para anexar duas listas juntas

Este é um algoritmo para juntar duas 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).

O resultado é uma lista[9,2,3,4,-10,-5,6,7,8]e está guardado em "Ot".

Minha pergunta é: como isso funciona?

O que eu entendo é que em toda chamada recursiva, na primeira lista, você obtém apenas a cauda como uma lista (reduzindo assim seu tamanho1 até que seja[] ), o segundo argumento "List2"não muda nada, e o terceiro argumento ... no começo é[], e depois de cada chamada recursiva você pega o rabo, mas já que é[], Isso fica[].

Então como é que, de repente, no terceiro argumento ("Ot") temos a lista anexada? Alguém pode explicar este algoritmo passo a passo?

questionAnswers(2)

yourAnswerToTheQuestion