2011-10-08 22 views
0

任何人都知道爲什麼這一直失敗?問題與'大於'

foo :- write('3 numbers: '), 
    read(A), 
    read(B), 
    read(C), 
    (A > B,B > C,write(A),tab(1),write(B),tab(1),write(C)); 
    (A > C,C > B,write(A),tab(1),write(C),tab(1),write(B)); 
    (B > A,A > C,write(B),tab(1),write(A),tab(1),write(C)); 
    (B > C,C > A,write(B),tab(1),write(C),tab(1),write(A)); 
    (C > B,B > A,write(C),tab(1),write(B),tab(1),write(A)); 
    (C > A,A > B,write(C),tab(1),write(B),tab(1),write(A)). 

是一個prolog函數,可以按順序打印3個輸入數字。 我不斷收到此錯誤:

uncaught exception: error(instantiation_error,(>)/2) 

回答

4

我認爲這將是更好,如果你不寫的一切到一個條款。這不僅會讓你的代碼更具可讀性,而且你也不會犯這個錯誤。

的問題是,你的代碼分析是這樣的:

(read AND read AND read AND test) OR test OR test OR … 

這意味着ABC只有在第一次測試值。而>要求兩個參數都有一個值。爲了解決這個問題,你可以使用括號:

foo :- write('3 numbers: '), 
    read(A), 
    read(B), 
    read(C), 
    ((A > B,B > C,write(A),tab(1),write(B),tab(1),write(C)); 
    (A > C,C > B,write(A),tab(1),write(C),tab(1),write(B)); 
    (B > A,A > C,write(B),tab(1),write(A),tab(1),write(C)); 
    (B > C,C > A,write(B),tab(1),write(C),tab(1),write(A)); 
    (C > B,B > A,write(C),tab(1),write(B),tab(1),write(A)); 
    (C > A,A > B,write(C),tab(1),write(B),tab(1),write(A))). 
+0

不錯!謝謝!問題解決了。 還有一個疑問,在它顯示答案後,它不停地問我'是真的嗎?' ..爲什麼? – juliomalegria

+1

@julio阿爾及利亞:我懷疑你正在看到一個提示,反映了** foo/0 **可能會在更多的「解決方案」中取得成功。您可以通過在規則末尾添加cut **!**來防止這種可能性。如果目標不包含自由變量(如本文所述),則某些Prolog實現將跳過頂級提示以獲得更多解決方案。 – hardmath

1

使用真IF-THEN-ELSE:

(A > B, B > C -> 
    write(A),tab(1),write(B),tab(1),write(C) 
; A > C, C > B -> 
    write(A),tab(1),write(C),tab(1),write(B) 
; B > A, A > C -> 
    write(B),tab(1),write(A),tab(1),write(C) 
; % etc