Почему Prolog/clpq не решит это квадратное уравнение?

Я использую SWI-Prolog, я очень новый и все еще учусь. На практике этот вопрос является продолжением вопроса. Почему мое правило не может найти решение для X в простом алгебраическом уравнении?

Я импортировал 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.

Хм... там все выглядит хорошо. Для полноты я также запустил квадратные уравнения. ("Уравнения" во множественном числе, потому что я думаю, что в Прологе нет оператора " ±". По крайней мере, я не смог его найти.)

?- 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).
Другие вопросы по тегам