3

背景

整数系数列表可用于表示多项式(在 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 教程讨论了递归搜索列表:“它查看某项是否是列表中的第一项。如果是,我们成功。如果不是,那么我们丢弃列表中的第一项并查看其余项” .

on(Item,[Item|Rest]).  

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

      on(Item,Tail).

问题

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

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

4

2 回答 2

3

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

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

一旦我找到它,我如何使用它来计算如上所述?

好吧,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)))
于 2013-02-24T00:53:07.823 回答
2

我制作了一个 90 秒的视频来展示如何使用 SWI-Prolog 的 guitracer 直观地理解简单的 Prolog 程序。在 Ubuntu/Debian 上只需执行此操作,您就可以使用视频中的命令(即、(加载文件)、,然后是查询)sudo apt-get install swi-prolog自己尝试调试器。swipl[filename]guitracer.trace.

使用 SWI-Prolog 的 guitracer

如果文本不可读,请右键单击图像并选择“查看图像”(Firefox)。

于 2013-02-24T01:40:04.257 回答