2017-09-17 79 views
1

首先,我看到今天早些時候提出的這個相同的問題,我決定親自嘗試一下(並且遇到麻煩)。我希望沒關係,我爲此創建了一個新問題!編程Prolog中的二次公式

我試圖做一個prolog程序,解決二次公式X =( - b±√b 2 -4ac)/ 2a。實現的謂詞二次型([A,B,C],[Result])將a,b和c列表作爲第一個參數,並將結果列表作爲第二個參數。然而,名單給我帶來麻煩。我寫了這個代碼:

quadratic([A,B,C], [X]):- 
    underRoot([A,B,C], UnderRootResult), 
    UnderRootResult<0, 
     X is 0. 
quadratic([A,B,C], [X]):- 
    underRoot([A,B,C], UnderRootResult), 
    UnderRootResult=:=0, 
     X is -B/2*A. 
quadratic([A,B,C], [X]):- 
    underRoot([A,B,C], UnderRootResult), 
    UnderRootResult>0, 
     X is -B - sqrt(UnderRootResult)/2*A, 
     X is -B + sqrt(UnderRootResult)/2*A. 

(這可能是錯誤百出,所以原諒我提前) 運行這會給我要underRoot/2未定義的程序錯誤。我真的不明白爲什麼會發生這種情況。我覺得我有如何編程這個總體想法,但我犯了很多新手的錯誤。我似乎無法找出問題所在,所以我會很感激任何幫助!另外,如果我被允許一次提出兩個問題,那麼如果在列表中> 0的情況下如何得到兩個X作爲一個結果?

+0

謂詞以小寫開始,所以'UnderRoot'可能是錯了嗎? –

+0

我不能相信這一點。對不起,犯了這個錯誤。 – Rose

+0

您可以編寫** X是-B-sqrt(UnderRootResult)/(2 * A)**和** Y是-B + sqrt(UnderRootResult)/(2 * A)**並且您寫入L = [X ,Y]。 – joel76

回答

1

這裏有很多事情。首先,身體中的所有呼叫通常放在同一列,但這不是一個真正的錯誤。

此外,我沒有找到underRoot/2謂詞。我們可以實現一個這樣的:

underRoot([A,B,C],X) :- 
    X is B*B-4*A*C. 

而且你總是把[X]在條款的頭。但在UnderRoot小於零的情況下,沒有解決方案,所以列表應該是[]。此外,在UnderRoot > 0的情況下,有兩種解決方案,因此解決方案應爲[X1,X2]

最後如果你寫-B/2*A,它會被解釋爲:(-B/2)*A,所以你會乘以A。所以你需要使用-B/(2*A)

所以這給我們帶來了一個如下議案:

quadratic(L, []) :- 
    underRoot(L, U), 
    U < 0. 
quadratic([A,B,C], [X]) :- 
    underRoot([A,B,C],0), 
    X is -B/(2*A). 
quadratic([A,B,C], [X1, X2]) :- 
    underRoot([A,B,C],U) :- 
    SU is sqrt(U), 
    X1 is (-B-SU)/(2*A), 
    X2 is (-B+SU)/(2*A). 
+0

是的,我注意到我在這裏寫下的代碼中犯了一些錯誤,並自己想出了它。我只有第二個條款留下了麻煩,因爲它以某種方式給了我錯誤的答案,所以看到你的代碼確實有幫助,它也是一個更有效的寫下來的方法。非常感謝! – Rose