背景
整数系数列表可用于表示多项式(在 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/