2011-10-23 50 views
3

這裏是我的序言代碼:幾何比喻,爲什麼我沒有得到更多的答案?

figure(1, middle(circle, circle)). 
figure(2, top_left(circle, circle)). 
figure(3, bottom_right(circle, circle)). 
figure(4, middle(square, square)). 
figure(5, top_left(square, square)). 
figure(6, top_right(square, square)). 
figure(7, bottom_right(square, square)). 
figure(8, bottom_left(square, square)). 

relate(F1, F2, Relation) :- 
    ( figure(F1, middle(X, Y)), figure(F2, middle(Y, X)), F1 \== F2 -> 
     Relation = invert 
    ; figure(F1, middle(X, X)), figure(F2, middle(Y, Y)), F1 \== F2 -> 
     Relation = same_in_out 
    ; figure(F1, top_left(X, X)), figure(F2, bottom_right(Y, Y)), F1 \== F2 -> 
     Relation = opposite 
    ; figure(F1, top_right(X, X)), figure(F2, bottom_left(Y, Y)), F1 \== F2 -> 
     Relation = opposite 
    ; relate(F2, F1, Relation) 
    ). 

analogy((F1, F2), (F3, X)) :- 
    relate(F1, F2, Relation), relate(F3, X, Relation). 

代表此設置enter image description here

這裏是一個簡單的執行:

| ?- relate(2, X, Y). 

X = 3 
Y = opposite; 

no 
| ?- relate(2, 7, X). 

X = opposite; 

no 

我的問題是,爲什麼我沒有X = 7,Y =相反,當我涉及(2,X,Y)?

謝謝。

+2

你能想出一個更具描述性問題的標題嗎? – ObscureRobot

回答

4

因爲你IF-THEN-ELSE和前導不會走回頭路了這樣一個結構的使用:

?- (member(X, [1,2,3]) -> Y = hello ; Y = goodbye). 
X = 1, 
Y = hello. 

?- 

IF-THEN-ELSE真的意味着高效的系統安全。你應該使用普通的同時,脫節和事實的上市重寫你的斷言,如果你想不確定性/回溯:

relate(F1, F2, Relation) :- 
    figure(F1, Fig1), 
    figure(F2, Fig2), 
    relate_(Fig1, Fig2, Relation), 
    F1 \== F2. 

relate_(middle(X, Y), middle(Y, X), invert). 
% etc. 
2

除了larsmans答案:

如果您的Prolog系統具有「軟裁員」(例如,Eclipse中,SWI-Prolog的),則可以替換 ' - >' 通過/ 2 '* - >'/ 2,即

figure(F1, top_left(X, X)), figure(F2, bottom_right(Y, Y)), F1 \== F2 -> 
    Relation = opposite 

figure(F1, top_left(X, X)), figure(F2, bottom_right(Y, Y)), F1 \== F2 *-> 
    Relation = opposite 
替換

如果條件成功,則軟切換允許回溯到條件以便爲條件和結果返回替代解。如果條件成功,則替代分支將永遠不會執行。只有當條件徹底失敗時,纔會執行替代分支。

+1

+1,我剛學到一些有趣的東西! –

相關問題