prolog - 如何在 Prolog 中添加多项式?

标签 prolog clpfd

我有以下任务:

Write a method that will add two polynoms. I.e 0+2*x^3 and 0+1*x^3+2*x^4 will give 0+3*x^3+2*x^4.

我还编写了以下代码:

add_poly(+A1*x^B1+P1,+A2*x^B2+P2,+A3*x^B3+P3):-
    (
       B1=B2,
       B3 = B2,
       A3 is A1+A2,
       add_poly(P1,P2,P3)
    ;
       B1<B2,
       B3=B1,
       A3=A1,
       add_poly(P1,+A2*x^B2+P2,P3)
    ;
       B1>B2,
       B3=B2,
       A3=A2,
       add_poly(+A1*x^B1+P1,P2,P3)
    ).
add_poly(X+P1,Y+P2,Z+P3):-
    Z is X+Y,
    add_poly(P1,P2,P3).

我的问题是我不知道如何停止。我想在参数之一为空时停止,而不是将第二个参数附加到第三个参数。但我如何检查它们是否为空? 谢谢。

最佳答案

几点说明:

尽量避免开头出现析取 (;)/2。它们需要特殊的缩进才能可读。它们使阅读单个规则变得更加复杂 - 想想您必须编写和跟踪的所有额外的 (=)/2 目标。


然后,我不确定您可以对多项式做出什么假设。你能假设它们是以规范形式编写的吗?


对于你的程序:考虑你的第一条规则的头部:

add_poly(+A1*x^B1+P1,+A2*x^B2+P2,+A3*x^B3+P3):-

我将概括一些论点:

add_poly(+A1*x^B1+P1,_,_):-

以及一些子术语:

 add_poly(+_+_,_,_):-

这对应于:

add_poly(+(+(_),_),_,_) :-

不确定你喜欢这个。

因此,此规则仅适用于以前缀 + 开头,后跟中缀 + 的术语。至少您的示例数据不包含前缀 +

另外,请注意 + 运算符是左结合。这意味着 1+2+3+4 与左侧关联:

?- write_canonical(1+2+3+4).
+(+(+(1,2),3),4)

因此,如果您有一个术语 0+3*x^3+2*x^4,您“看到”的第一件事就是 _+2*x^4。左侧的术语嵌套得更深。


对于您的实际问题(如何停止) - 您必须明确测试最左边的子项是整数,使用 integer/1 - 或者可能是项 (*)/2 (即取决于您的假设)。

关于prolog - 如何在 Prolog 中添加多项式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11703041/

相关文章:

c++ - PL_new_term_refs() : No foreign environment

prolog - 相当于 SWIProlog 中 SICStus 的 nvalue/2

prolog - 代码速度问题

clpfd - 剖析 ECLiPSe CLP?

prolog - 实现我自己的后继谓词

performance - 测量执行时间 ECLiPSe CLP(或 Prolog)

prolog - 如何实现完全声明式的 Horn 逻辑?

prolog - 如何从无限集中找到最短长度的列表(Prolog)

list - Prolog,列表中 Y 之前的 X

从 C 创建序言列表