2014-10-20 100 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 2014-10-20 21:16:13

+0

但是當'D1 <0'時,我們可以返回'false'還是類似於第一種情況?是的,我們可以:)我們必須這樣做 '...(D1 <0 - >!,失敗 ; ...' – RMachnik 2014-10-20 21:21:09