整数系数列表可用于表示多项式(在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).
此代码如何丢弃列表中的第一项?
然后问题变成了,一旦我找到它,我如何使用它来计算如上所述?
答案 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.
然后查询)。
右键单击图像,如果文本不可读,请选择“查看图像”(Firefox)。