我已經寫了下面的遞歸函數的參數分配到更大的兩個數字:分配的參數中較大的兩個數
max(A,B,X) :-
A >= B,
X is A.
max(A,B,X) :-
max(B,A,X).
可正常工作,但是作爲一個初來乍到Prolog的,我不敢相信這是最有效的解決方案。有沒有更好的方法來做到這一點?
此外,按';'在調用該函數之後再次重複它。這是正確的行爲?
預先感謝您。
我已經寫了下面的遞歸函數的參數分配到更大的兩個數字:分配的參數中較大的兩個數
max(A,B,X) :-
A >= B,
X is A.
max(A,B,X) :-
max(B,A,X).
可正常工作,但是作爲一個初來乍到Prolog的,我不敢相信這是最有效的解決方案。有沒有更好的方法來做到這一點?
此外,按';'在調用該函數之後再次重複它。這是正確的行爲?
預先感謝您。
這似乎令人費解。嘗試類似
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
。
爲什麼不使用內置算術「max」函數? Z是最大(X,Y)。或者,如果你想在其他方向使用謂詞,也可以使用約束。
謝謝你@尼古拉斯凱莉,這比我的解決方案好得多。我可以要求更詳細的說明爲什麼切割是必要的嗎?即使沒有它,我也沒有收到第二個錯誤的結果。 – Jonathan 2012-01-05 19:36:39
沒有剪切,像max(2,1,X)'會在第一次成功時給出'X = 2'。回溯將隨後產生「X = 1」。進一步的回溯將會失敗。隨着切割,只有一個解決方案:'X = 2'。 – 2012-01-05 19:51:46
原來我錯了,說我沒有收到第二次錯誤的結果;切割當然可以解決這個問題。感謝您的詳細解釋。 – Jonathan 2012-01-05 20:16:21