误差序言多项式
Error prolog polynomial
我正在尝试在 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"为总度,列表为其他变量。
谢谢大家。
你"expired"在as_polynomial/2
的第二个子句中减去你自己。你有没有注意到:
as_polynomial(+(X, Y), poly(D)) :- ...
和
as_polynomial(-(X, Y), poly(D)) :- ...
相同吗?
您可能需要将减号传递给 as_monomial(-Y, Q)
而不是 as_monomial(Y, Q)
并在 as_monomial/2
.
的另一个子句中处理术语 -X
有一大堆删减,我觉得其中大部分都没有必要,尤其是。如果你知道在 *(A, B)
中,A
是一个数字,B
和原子,或者在 ^(A, B)
中,A
是一个原子,而 B
是一个数字。
好的。我以这种方式解决了处理 -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), !.
我正在尝试在 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"为总度,列表为其他变量。
谢谢大家。
你"expired"在as_polynomial/2
的第二个子句中减去你自己。你有没有注意到:
as_polynomial(+(X, Y), poly(D)) :- ...
和
as_polynomial(-(X, Y), poly(D)) :- ...
相同吗?
您可能需要将减号传递给 as_monomial(-Y, Q)
而不是 as_monomial(Y, Q)
并在 as_monomial/2
.
-X
有一大堆删减,我觉得其中大部分都没有必要,尤其是。如果你知道在 *(A, B)
中,A
是一个数字,B
和原子,或者在 ^(A, B)
中,A
是一个原子,而 B
是一个数字。
好的。我以这种方式解决了处理 -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), !.