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

时间:2013-02-24 00:43:59

标签: 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).

问题

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

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

2 个答案:

答案 0 :(得分: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

我没有提供完整的代码,因为它似乎仍然在学习,但如果这就是你想要的,那就可以做到。这也是一个非常简单的例子,并没有进行优化(即没有尾递归)。

附加提示:如果你用这种方式表达你的polinoomial,应该清楚如何进行递归计算:

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

答案 1 :(得分:2)

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

Using SWI-Prolog's guitracer

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