2012-03-26 114 views
0

諮詢?- go(c, g).返回false,但對於?- go(a, d).表示正確。我實際上並不瞭解它,因爲我已經添加了適當的規則,並且對於其中的大多數規則而言都是有效的。控制檯中的測試

下面是我使用的語句:

door(a, b). 
door(b, c). 
door(c, d). 
door(b, e). 
door(e, f). 
door(e, g). 

go(FromRoom, ToRoom):- 
    door(FromRoom,ToRoom). 

go(FromRoom, ToRoom):- 
    door(ToRoom, FromRoom). 

go(FromRoom, ToRoom) :- 
    door(FromRoom, NextRoom), 
    go(NextRoom, ToRoom), !. 

go(FromRoom, ToRoom):- 
    door(ToRoom,NextRoom), 
    go(NextRoom, FromRoom), !. 

回答

0

您需要蓄能器添加到您的謂詞,以避免卡在INF循環。

door(a, b). 
door(b, c). 
door(c, d). 
door(b, e). 
door(e, f). 
door(e, g). 

go(From, To, T) :- 
    T=[From|T1], 
    go(From, To, [To], T1). 
go(From, To,T, T) :- 
    door(From, To),!. 
go(From,To,T,T) :- 
    door(To,From),!. 
go(From, To, Acc,T) :- 
    door(X, Do),!, 
    \+ member(X, Acc), 
    go(From, X, [X|Acc],T). 
go(From,To,Acc,T) :- 
    door(X,Z),!, 
    \+member(Z,Acc), 
    go(X,To,[X|Acc],T). 
+0

我不能改變,因爲這是我們必須使用它的規則可能是錯誤的計劃 – user1232622 2012-03-26 17:25:02

+0

所以你的問題是什麼? – whd 2012-03-26 17:47:03

+0

我的問題是,去(c,g)。應該說是的,但爲什麼它說不,當我把它放在控制檯 – user1232622 2012-03-26 17:55:49

0

你第四條規則應該閱讀

go(FromRoom, ToRoom):- 
door(ToRoom,NextRoom), 
go(FromRoom,NextRoom),!. 

,因爲你已經在呼喚門/ 2交換搜索順序,但是這會導致循環,作爲正確的@whd說。這裏一個版本的 '回報' 的路徑

go(Room, Room, Path, Path). 

go(FromRoom, ToRoom, SoFar, Path) :- 
    (door(FromRoom, NextRoom) ; door(NextRoom, FromRoom)), 
    \+ member(NextRoom, SoFar), 
    go(NextRoom, ToRoom, [NextRoom|SoFar], Path). 

測試:

enter image description here

?- go(c,g,[],P). 
P = [g, e, b, c, d] ; 
P = [g, e, b] ; 
false. 

由於Prolog的搜索順序,這是需要一個旅遊'在d之前回去。很容易避免在頂層調用SoFar參數...

+0

第四條規則,你告訴我改變NextRoom和FromRoom你能告訴我爲什麼這樣做應該做,然後我可以更好地理解 – user1232622 2012-03-27 18:25:18

+0

對不起,我想不出比我已經解釋的更清楚了 – CapelliC 2012-03-27 19:26:35