list - 如何对 Prolog 列表的元素执行算术运算

标签 list recursion prolog axiom

背景

整数系数列表可用于表示多项式(在 X 中)。例如,1 + 3x + 3x^2 + 2x^3 表示为 [1,3,3,2]。

设 P 为这些列表之一。

我需要编写采用这些系数的公理,并用它们做不同的事情。

示例: 关系 eval(P,A,R) 的公理,其中 R 是在 X = A 时对 P 表示的多项式求值的结果(期望 P 和 A 被完全实例化) .例如,eval([3,1,2],3,R) 生成 R=24。 (这是因为 3(3)^0 + 1(3)^1 + 2(3)^2 = 3 + 3 + 18 = 24)。

Prolog tutorial讨论递归地搜索列表:“它查看列表中的第一项是否是第一项。如果是,我们就成功了。如果不是,那么我们将丢弃列表中的第一项并查看其余项”。

on(Item,[Item|Rest]).  

on(Item,[DisregardHead|Tail]):-

      on(Item,Tail).

问题

这段代码如何丢弃列表中的第一项?

那么问题就变成了,一旦我找到它,我该如何使用它来进行如上所述的计算?

最佳答案

How does this code throw away the first item in the list?

通过在列表的尾部递归调用 on,您将忽略第一个元素。由于您不会使用它,因此您应该将其称为 _ 而不是 DisregardHead(一些编译器会警告您注意“单例变量”)。

once I've found it, how do I use it to calculate as described above?

好吧,on 应该返回多个结果 - 每个匹配项一个 - 而您的目标是获得一个考虑了整个列表的单个 结果。所以你不应该忽略第一个元素,而是将它合并到结果中。示例:

my_pred([],0).
my_pred([Item|Tail],Result) :-
    my_pred(Tail,IntermResult),
    combine(Item,IntermResult,Result). % Ex.: Result is Item + IntermResult

我没有给出完整的代码,因为您似乎还在学习,但如果您愿意,可以这样做。这也是一个非常简单的例子,并没有优化(即没有尾递归)。

附加提示:如果您以这种方式表达您的多项式,应该清楚如何进行递归计算:

1 + x * (3 + x * (3 + x * (2 + x * 0)))

关于list - 如何对 Prolog 列表的元素执行算术运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15047449/

相关文章:

javascript - trim 对象树上的叶子

prolog - 什么是学习prolog的好网站?

Prolog 查询返回 H128

Prolog 和列表统一

c++ - 对 STL::抽象数据类型列表进行排序

r - 从 R 中的四个整数列表生成所有可能的排列

python - 使用列表理解分解此列表

c++ - 通过 C++ 类接口(interface)处理序列

javascript - 为什么返回未定义但 console.log 返回一个 int?

c - 使用递归函数来计算字母的出现次数