首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >误差prolog多项式

误差prolog多项式
EN

Stack Overflow用户
提问于 2016-11-21 09:15:35
回答 2查看 377关注 0票数 0

我试图在prolog中写一个多项式,在这里我研究每个变量的等级。我的问题是,当我做验证时,这个问题不考虑负作为系数的符号。例如,-4*x被认为是4*x,减号是过期的。我把代码放在这里,我还研究了一个简单的单项。你能帮帮我吗?

代码语言:javascript
复制
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).

示例:

代码语言:javascript
复制
?- 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”是总度,列表是其他变量。

谢谢大家。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-21 11:29:08

您在as_polynomial/2的第二个子句中“过期”了减号。你是否注意到:

代码语言:javascript
复制
as_polynomial(+(X, Y), poly(D)) :- ...

代码语言:javascript
复制
as_polynomial(-(X, Y), poly(D)) :- ...

是一样的吗?

您可能需要将减号传递给您的as_monomial(-Y, Q),而不是as_monomial(Y, Q),并在as_monomial/2的另一个子句中处理术语-X

有一大堆的削减,我觉得大部分都是不必要的,尤其是。如果您知道在*(A, B)中,A是一个数字,而B和atom,或者在^(A, B)中,A是一个原子,B是一个数字。

票数 2
EN

Stack Overflow用户

发布于 2016-11-22 09:55:48

好吧。我解决了这样对待-X的问题!我在程序中加入了一个新的条款,所以我有:

代码语言:javascript
复制
........

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), !.
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40716476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档