2014-10-20 1 views
2

У меня проблема с реализацией квадратичного уравнения в прологе. Я знаю некоторые основы, но в то же время я не могу понять вывод консоли 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 

ответ

0

о

аргументы не достаточно инстанцирован

вы должны поменять местами дельта/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 
). 
+0

Спасибо большое, я буду принимать ваши советы! – RMachnik

+0

Но можем ли мы вернуть 'false' или sth, что и в первом случае, когда' D1 <0'? Да, мы можем :) Мы должны сделать это так: '... (D1 <0 ->!, Fail ; ...' – RMachnik