Prolog findall/3 规则转换为递归规则

标签 prolog prolog-findall

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/

相关文章:

command-line - 在命令行中使用 swipl 运行 prolog 代码

Prolog:md5 谓词

Prolog - 查找列表列表(列表)的所有组合(产品)

prolog - 如何在 findall/3 元谓词中使用 and

prolog - prolog中的递归如何进行数字加法

prolog - 在 Prolog 中定义运算符

list - 跟踪序言代码

Prolog findall/3 : more than one bag

prolog - 在 Prolog 中查找具有多个变量的all