为什么Prolog / clpq不能解决这个二次方程?

时间:2016-09-23 19:02:52

标签: prolog clpq

我正在使用SWI-Prolog,我很新,还在学习。实际上,这个问题是Why can't my rule solve for X in a simple algebraic equation?

的后续行动

我已导入clpq。

?- use_module(library(clpq)).
true.

我的等式是 6x 2 + 7x - 3 = 0 ,其中x实际上 -1.5 1 / 3 如果使用二次方程式。

?- {(6 * X ^ 2) + (7 * X) - 3 = 0}.
{-3+7*X+6*X^2=0}.

?- {(6 * X ^ 2) + (7 * X) - 3 = 0}, R is float(X).
ERROR: is/2: Arguments are not sufficiently instantiated

嗯,它通过将 3 的减法更改为 -3 的相加来略微减少了等式,但它没有解决X。我的第一步是尝试给出答案,看看是否接受了答案。

?- X is -1.5, (6 * X ^ 2) + (7 * X) - 3 =:= 0.
X = -1.5.
嗯......那里的一切看起来都不错。为了完整起见,我还运行了二次方程。 (“方程式”复数,因为我猜Prolog中没有±运算符。至少,我找不到一个。)

?- A is 6, B is 7, C is -3, X is (-B + sqrt((B ^ 2) - (4 * A * C))) / (2 * A).
A = 6,
B = 7,
C = -3,
X = 0.3333333333333333.

?- A is 6, B is 7, C is -3, X is (-B - sqrt((B ^ 2) - (4 * A * C))) / (2 * A).
A = 6,
B = 7,
C = -3,
X = -1.5.

好的,一切似乎都要检查出来。那么,为什么cplq无法解决我的等式?

1 个答案:

答案 0 :(得分:1)

CLPQ对非线性约束有限制。例如,非线性约束6x2 + 7x - 3 = 0只能在给出x的值时求解,因此CLPQ不能求解二次或任何其他非线性方程。相反,你可以这样做:

请注意,使用clpr可以解决方程式:

?- {9 = X^2}.
X = 3.0 ;
X = -3.0 ;

CLPQ会给你:

?- {9 = X^2}.
{9-X^2=0}.

false.

对于你可以做的二次方程式(完全如你所示):

 solve(X^2 + P*X + Q = 0):-
         X = -(P/2) + ((P/2)^2 - Q)^(1/2);
         X = -(P/2) - ((P/2)^2 - Q)^(1/2).

使用CLPQ(或CLPR):

?- solve(X^2+2*X+1=0).
X = - (2/2)+ ((2/2)^2-1)^ (1/2) ;
X = - (2/2)- ((2/2)^2-1)^ (1/2).