2012-01-05 40 views
2

我已經寫了下面的遞歸函數的參數分配到更大的兩個數字:分配的參數中較大的兩個數

max(A,B,X) :- 
    A >= B, 
    X is A. 

max(A,B,X) :- 
    max(B,A,X). 

可正常工作,但是作爲一個初來乍到Prolog的,我不敢相信這是最有效的解決方案。有沒有更好的方法來做到這一點?

此外,按';'在調用該函數之後再次重複它。這是正確的行爲?

預先感謝您。

回答

4

這似乎令人費解。嘗試類似

max(A,B,A) :- A > B . 
max(A,B,B) :- A =< B . 

雖然你可能想要把某種類型的檢查。

[編輯刪除了切割的需要,併爲預實例第三個參數提供更好的支持。]

另一種選擇,當然,可能是這樣的:

max(A,B,M) :- A > B -> M=A ; M=B . 

這將拋出一個錯誤是A或B是未綁定的,而第一個例子,無論它是如何工作的我被調用(只要2個參數被實例化)。例如,調用它作爲

max(A,3,5). 

得到X=5

+0

謝謝你@尼古拉斯凱莉,這比我的解決方案好得多。我可以要求更詳細的說明爲什麼切割是必要的嗎?即使沒有它,我也沒有收到第二個錯誤的結果。 – Jonathan 2012-01-05 19:36:39

+1

沒有剪切,像max(2,1,X)'會在第一次成功時給出'X = 2'。回溯將隨後產生「X = 1」。進一步的回溯將會失敗。隨着切割,只有一個解決方案:'X = 2'。 – 2012-01-05 19:51:46

+0

原來我錯了,說我沒有收到第二次錯誤的結果;切割當然可以解決這個問題。感謝您的詳細解釋。 – Jonathan 2012-01-05 20:16:21

4

爲什麼不使用內置算術「max」函數? Z是最大(X,Y)。或者,如果你想在其他方向使用謂詞,也可以使用約束。