2016-09-23 84 views
2

我正在使用SWI-Prolog,我很新,仍在学习。实际上,这个问题是Why can't my rule solve for X in a simple algebraic equation?的后续行动为什么Prolog/clpq不能解决这个二次方程?

我已经导入clpq。

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

我的方程是6X + 7× - 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减少,但它并没有解决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

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). 
相关问题