% base case
score([],0).
% recursive case
score([Movie|Movies],Total) :-
takings(Movie,Profit),
score(Movies,Total0),
Total is Total0 + Profit.
Пример выполнения
?- score([robots,hulk,bad_boys_ii],Y).
Y = 749200000.
Объяснение кода
Список в Прологе рекурсивно сконструирован и деконструирован с использованием оператора |, Поскольку 0 является начальным значением для подсчета целых чисел, [] , известный как пустой список, является начальным значением для закрытого списка. Для рекурсивного построения в начале закрытого списка используется текущий список и оператор | . При использовании | в Прологе обычно упоминаемый элемент добавляется как Голова , (H), а текущий закрытый список добавляется как Хвост * 1020. *, (T), и именно поэтому вы часто видите нотацию [H | T] , когда говорите о списке в Прологе.
Итак, чтобы построить список [1,2,3] будет [], затем добавьте 1, [1].
?- L = [1|[]].
L = [1].
Для добавления 2 будет [1], затем добавьте 2, [2,1].
?- L = [2|[1]].
L = [2, 1].
Для деконструкции списка [1,2,3] будут использоваться переменные поэтому [H | T] станет H, равным 1, а T будет [2,3].
?- [H|T] = [1,2,3].
H = 1,
T = [2, 3].
Когда вы попадаете в конец списка, это просто [] без головы.
?- [H|T] = [1].
H = 1,
T = [].
Так в коде [Movie|Movies]
принимает входной список фильмов и объединяет заголовок списка Movie
с первым mov ie и рекурсивно передает хвост списка Movies
предикату. Только когда список пуст, условие score([],0)
будет соответствовать и объединять 0 с Total0
в score(Movies,Total0)
.
Я знаю, что это может иметь гораздо больше деталей в объяснениях, но эти объяснения повсюду место в прологе примеров.