prolog - 从左到右获取列表的产品

标签 prolog

如何从左到右获取列表的乘积? 例如:

?- product([1,2,3,4], P).
P = [1, 2, 6, 24] .

我认为一种方法是重载仿函数并使用 3 个参数:

product([H|T], Lst) :- product(T, H, Lst).

我不确定从这里到哪里去。

最佳答案

您可以使用此处找到的库 (lambda):http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/lambda.pl 完全不可读:

:- use_module(library(lambda)).
:- use_module(library(clpfd)).


product(L, R) :-
    foldl(\X^Y^Z^(Y = [] 
             -> Z = [X, [X]]
             ;   Y = [M, Lst],
                 T #= X * M,
                 append(Lst, [T], Lst1),
                 Z = [T, Lst1]),
          L, [], [_, R]).

感谢@Mike_Hartl 的建议,代码非常简单:

product([], []).

product([H | T], R) :-
    scanl(\X^Y^Z^( Z #= X * Y), T, H, R).

关于prolog - 从左到右获取列表的产品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15146810/

相关文章:

prolog - 计算余弦泰勒近似值的递归程序在 Prolog 中不起作用

prolog - swi prolog 中的优化

prolog - Prolog中谓词名称后的斜杠是什么意思?

functional-programming - Prolog 与 Erlang(和其他函数式语言)

prolog - 如何在 Prolog 中找到数字中的最大数字?

python - 来自 AllegroGraph Python API 的 Prolog 查询中的 OWL 推理

operator-overloading - 尝试在 Prolog 中定义运算符时出现问题

prolog - 在 Prolog 中定义避免算术错误 is/2 的规则

prolog - 自动机和序言

arrays - 序幕,骑士攻击