2016-09-23 5 views
2

私はSWI-Prologを使用しています。私は非常に新しく、まだ学習しています。実際には、この質問はフォローアップですWhy can't my rule solve for X in a simple algebraic equation?Prolog/clpqがこの2次方程式を解くのはなぜですか?

私はclpqをインポートしました。

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

私の式は6X + 7倍である - 二次方程式を使用している場合、Xは文字通り-1.5又はも1/3である3 = 0、。

?- {(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. 

うん...すべてがうまく見えます。完全性のために、私は二次方程式も実行しました。 (「式」、複数の私はプロローグには±オペレータはありませんと思いますので。少なくとも、私は1つを見つけることができませんでした。)

?- 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. 

をさて、すべてがチェックアウトしているようです。それで、なぜ私の方程式を解決できなかったのですか?

答えて

1

CLPQには非線形制約に制限があります。例えば、非線形制約6x2 + 7x-3 = 0は、xの値が与えられたときにのみ解くことができるので、CLPQは2次または他の非線形方程式を解くことができない。代わりに、あなたは何ができる:CLPQはあなたを与えるだろう

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

:あなたは(正確たとえば、あなたのように)行うことができ二次方程式については

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

false. 

を同じようCLPRとあなたが方程式を解くことができることを

注意を:CLPQ(又はCLPR)と

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). 

?- 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). 
関連する問題