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?