Объяснение алгоритма Пролог для добавления двух списков вместе
Это алгоритм для добавления двух списков:
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;) у нас есть добавленный список?
Может кто-нибудь объяснить этот алгоритм шаг за шагом?