错误序言多项式

时间:2016-11-21 09:15:35

标签: prolog polynomials

我正在尝试在prolog中写一个多项式,我在那里研究每个变量的等级。我的问题是,当我进行验证时,问题不会将负数视为系数的符号。例如,-4 * x被认为是4 * x而减号被认为是过期的。我把代码放在我也研究一个简单的单项式的地方。你能救我吗?

as_monomial(X, m(X, 0, [])) :- number(X), !.
as_monomial(^(Y, Z), m(1, Z, [v(Z, Y)])) :- !.
as_monomial(*(X, ^(Y, Z)), m(G, K, Q)) :- as_monomial(X, m(G, TD, Vars)), K is (TD + Z), ordina_m([v(Z, Y)| Vars], Q), !.
as_monomial(*(X, Y), m(G, K, Q)) :- as_monomial(X, m(G, TD, Vars)), K is (TD + 1), ordina_m([v(1, Y)| Vars], Q), !.
as_monomial(X, m(1, 1, [v(1, X)])).

ordina_m(List, Sorted) :- sort(2, @=<, List,  Sorted).
ordina_poly(List, Sorted) :- sort(2, @>=, List,  Sorted).

is_monomial(m(_C, TD, VPs)) :- integer(TD), TD >= 0, is_list(VPs).

as_polynomial(+(X, Y), poly(D)) :- as_monomial(Y, Q), is_monomial(Q), as_polynomial(X, poly(Qs)), ordina_poly([Q| Qs], D), !.
as_polynomial(-(X, Y), poly(D)) :- as_monomial(Y, Q), is_monomial(Q), as_polynomial(X, poly(Qs)), ordina_poly([Q| Qs], D), !.
as_polynomial(X, poly([Q])) :- as_monomial(X, Q), is_monomial(Q).

示例:

?- as_polynomial(4*y^6-4*d,Q).
Output:
Q = poly([m(4, 6, [v(6, y)]), m(4, 1, [v(1, d)])]).
Real output:
Q = poly([m(4, 6, [v(6, y)]), m(-4, 1, [v(1, d)])]).

其中“-4”是系数,“1”是totaldegree,列表是其他变量。

谢谢大家。

2 个答案:

答案 0 :(得分:2)

你&#34;已过期&#34;在as_polynomial/2的第二个条款中减去你自己。你注意到了身体:

as_polynomial(+(X, Y), poly(D)) :- ...

as_polynomial(-(X, Y), poly(D)) :- ...

是一样的吗?

您可能需要将减号传递给as_monomial(-Y, Q)而不是as_monomial(Y, Q),并在-X的另一条款中处理as_monomial/2这个词。

有一大堆削减,我感觉大多数都没有必要,尤其是如果您知道在*(A, B)中,A是一个数字B和原子,或^(A, B)中的A,则B是一个原子而delayedexpansion是一个数字。

答案 1 :(得分:0)

好。我用这种方式解决了处理-X的问题!我在程序中添加了一个新子句,所以我有:

........

as_monomial(*(X, Y), m(G, K, Q)) :- as_monomial(X, m(G, TD, Vars)), K is (TD + 1), ordina_m([v(1, Y)| Vars], Q), !.

as_monomial(-(X), m(Q, Y, L)) :- as_monomial(X, m(A, Y, L)), Q is A *(-1), !.

as_monomial(X, m(1, 1, [v(1, X)])).

.......

as_polynomial(-(X, Y), poly(D)) :- as_monomial(-Y, Q), is_monomial(Q), as_polynomial(X, poly(Qs)), ordina_poly([Q| Qs], D), !.