Объяснение алгоритма Пролог для добавления двух списков вместе

Это алгоритм для добавления двух списков:

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).

Результатом является список[9,2,3,4,-10,-5,6,7,8]и он сохранен в & quot;Ot& Quot ;.

У меня вопрос, как это работает?

Я понимаю, что при каждом рекурсивном вызове в первом списке вы получаете только хвост в виде списка (таким образом, его размер уменьшается на1 пока это не[] ) второй аргумент & quot;List2& Quot; вообще не меняется, а 3-й аргумент ... сначала это[]и после каждого рекурсивного вызова вы получаете его хвост, но так как он[]остается[].

Так как же вдруг в 3-м аргументе (& quot;Ot& quot;) у нас есть добавленный список? Может кто-нибудь объяснить этот алгоритм шаг за шагом?

Ответы на вопрос(2)

Ваш ответ на вопрос