score(Movies,Total) :-
findall(Money,(member(Movie,Movies),takings(Movie,Money)),Profit),
sum_list(Profit,Total)
我想使用递归转换此规则,但我不确定如何。帮助!链接到回答这个问题的上一个问题:根据事实总结数据
score(Movies,Total) :-
findall(Money,(member(Movie,Movies),takings(Movie,Money)),Profit),
sum_list(Profit,Total)
我想使用递归转换此规则,但我不确定如何。帮助!链接到回答这个问题的上一个问题:根据事实总结数据
% 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.
代码说明
Prolog 中的列表是使用|递归构造和解构的。操作员。由于 0 是计算整数的初始值,因此[ ],称为空列表,是封闭列表的初始值。要递归地构建到封闭列表的前面,请使用当前列表和| 操作员。使用时| 在 Prolog 中,通常将添加的项目称为Head (H),将添加到的当前关闭列表称为Tail (T),这就是为什么您在交谈时经常看到符号[H|T]关于 Prolog 中的列表。
所以构造列表 [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
与第一部电影统一起来,并将列表的尾部Movies
递归地传递给谓词。只有当列表为空时,子句才会score([],0)
匹配并统一 0 和Total0
in score(Movies,Total0)
。
我知道这可以在解释中包含更多细节,但是这些解释在 Prolog 示例中无处不在。
这边走 :)
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.