Разрешить квадратное уравнение в прологе
У меня проблема с реализацией квадратного уравнения в прологе. Я знаю некоторые основы, но в то же время я не могу понять вывод консоли swish.swi. Буду признателен за любую помощь или предложения с вашей стороны по поводу моих ошибок.
delta(A, B, C, D):- D is B*B - 4*A*C.
equation(A,B,C,X):- D1<0,delta(A,B,C,D1),X is 0. % or false... but how to retur false there?
equation(A,B,C,X):- D1 =:= 0,delta(A,B,C,D1),X is -B/2*A.
equation(A,B,C,X): D1>0,delta(A,B,C,D1),X is -B-sqrt(D1)/2*A.
equation(A,B,C,X): D1>0,delta(A,B,C,D1),X is -B+sqrt(D1)/2*A.
Я получаю две ошибки там после runnign equation(2, 0, 1, X).
Full stop in clause-body? Cannot redefine ,/2
</2: Arguments are not sufficiently instantiated
1 ответ
Решение
Около
Аргументы недостаточно проработаны
Вы должны поменять местами delta/4 и тест. Кроме того, лучше использовать if/then/else, чтобы избежать пересчета результата:
equation(A,B,C,X) :-
delta(A,B,C,D1),
( D1 < 0
-> X is 0
; D1 =:= 0
-> X is -B/2*A
; X is -B-sqrt(D1)/2*A
).
В последних двух предикатах (тех, где D>0) вы забыли написать "-" после ":". Ваш код работает хорошо, это была просто синтаксическая ошибка. Ниже я исправил код для вас:
delta(A, B, C, D):- D is B*B - 4*A*C.
equation(A,B,C,X):- D1<0, delta(A,B,C,D1), X is 0.
equation(A,B,C,X):- D1 =:= 0, delta(A,B,C,D1), X is -B/2*A.
equation(A,B,C,X):- delta(A,B,C,D1), D1>0, X is ((-1*B-sqrt(D1))/2*A).
equation(A,B,C,X):- delta(A,B,C,D1), D1>0, X is ((-1*B+sqrt(D1))/2*A).