为什么Prolog/clpq不解这个二次方程?
Why won't Prolog/clpq solve this quadratic equation?
我正在使用 SWI-Prolog,我很新,还在学习中。实际上,这个问题是
的后续问题
我导入了clpq
?- use_module(library(clpq)).
true.
我的等式是 6x2 + 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.
嗯...那里看起来一切都很好。为了完整起见,我还 运行 二次方程。 ("Equations" 复数,因为我猜 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 不能求解我的方程式?
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).
我正在使用 SWI-Prolog,我很新,还在学习中。实际上,这个问题是
我导入了clpq
?- use_module(library(clpq)).
true.
我的等式是 6x2 + 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.
嗯...那里看起来一切都很好。为了完整起见,我还 运行 二次方程。 ("Equations" 复数,因为我猜 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 不能求解我的方程式?
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).