Пролог findall / 3 rule преобразуется в рекурсивное правило - PullRequest
2 голосов
/ 08 марта 2020
score(Movies,Total) :-
    findall(Money,(member(Movie,Movies),takings(Movie,Money)),Profit),
    sum_list(Profit,Total)

Я хочу преобразовать это правило с помощью рекурсии, но я не уверен, как это сделать. Помогите! Ссылка на предыдущий вопрос, который отвечает на этот вопрос: Суммируйте данные из фактов

Ответы [ 2 ]

3 голосов
/ 08 марта 2020
% 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).

Я знаю, что это может иметь гораздо больше деталей в объяснениях, но эти объяснения повсюду место в прологе примеров.

0 голосов
/ 08 марта 2020

Таким образом:)

recursive_score([H], CurrentMoney):-
    takings(H, Value),
    CurrentMoney is Value.
recursive_score([H|T], Money):-
    takings(H, Value),
    recursive_score(T, CurrentMoney),
    Money is CurrentMoney + Value.
...