score(Movies,Total) :-
findall(Money,(member(Movie,Movies),takings(Movie,Money)),Profit),
sum_list(Profit,Total)
我想使用递归转换此规则,但我不知道如何。帮助! 链接到回答此问题的上一个问题:Sum up data from facts
最佳答案
% 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),这就是为什么在 Prolog 中谈论列表时经常会看到符号 [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
与第一部电影统一起来,并传递列表的尾部Movies
递归到谓词。仅当列表为空时,子句 score([],0)
才会匹配并统一 score(Movies,Total0)
中的 0 与 Total0
>.
我知道这可以有更多详细的解释,但这些解释在 Prolog 示例中随处可见。
关于Prolog findall/3 规则转换为递归规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60582468/