2
score(Movies,Total) :-
    findall(Money,(member(Movie,Movies),takings(Movie,Money)),Profit),
    sum_list(Profit,Total)

我想使用递归转换此规则,但我不确定如何。帮助!链接到回答这个问题的上一个问题:根据事实总结数据

4

2 回答 2

3
% 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 和Total0in score(Movies,Total0)

我知道这可以在解释中包含更多细节,但是这些解释在 Prolog 示例中无处不在。

于 2020-03-07T22:09:47.427 回答
0

这边走 :)

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.
于 2020-03-07T22:19:22.287 回答