我有以下任务:
编写一个将添加两个多项式的方法。 I.e 0 + 2 * x ^ 3和0 + 1 * x ^ 3 + 2 * x ^ 4将给出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).
我的问题是我不知道如何制止。当一个参数为null并且将第二个参数附加到第三个参数时,我想停止。但是我如何检查它们是否为空? 谢谢。
答案 0 :(得分:2)
几条评论:
尽量避免在开头使用析取(;)/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(这取决于你的假设)
答案 1 :(得分:1)
我假设你所说的多项式是1变量和整数指数。
这里是一个处理正常多项式形式的过程:多项式可以表示为因子的列表(和),其中(整数)指数由位置隐式表示。
:- [library(clpfd)].
add_poly(P1, P2, Sum) :-
normalize(P1, N1),
normalize(P2, N2),
append(N1, N2, Nt),
aggregate_all(max(L), (member(M, Nt), length(M, L)), LMax),
maplist(rpad(LMax), Nt, Nn),
clpfd:transpose(Nn, Tn),
maplist(sumlist, Tn, NSum),
denormalize(NSum, Sum).
rpad(LMax, List, ListN) :-
length(List, L),
D is LMax - L,
zeros(D, Z),
append(List, Z, ListN).
% the hardest part is of course normalization: here a draft
normalize(Ts + T, [N|Ns]) :-
normalize_fact(T, N),
normalize(Ts, Ns).
normalize(T, [N]) :-
normalize_fact(T, N).
% build a list with 0s left before position E
normalize_fact(T, Normal) :-
fact_exp(T, F, E),
zeros(E, Zeros),
nth0(E, Normal, F, Zeros).
zeros(E, Zeros) :-
length(Zeros, E),
maplist(copy_term(0), Zeros).
fact_exp(F * x ^ E, F, E).
fact_exp(x ^ E, 1, E).
fact_exp(F * x, F, 1).
fact_exp(F, F, 0).
% TBD...
denormalize(NSum, NSum).
试验:
?- add_poly(0+2*x^3, 0+1*x^3+2*x^4, P).
P = [0, 0, 0, 3, 2]
答案仍然是正常形式,应该写出denormalize / 2 ......