2012-03-25 84 views
0

如去(a,d)。我希望它打印的路線以及諸如路線,路線B,路線,c和路線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(FromRoom, NextRoom), 
go(NextRoom, ToRoom). 
+0

到底是什麼問題? – 2012-03-25 09:24:38

+0

prolog從1門到下一個,所以當我輸入去(a,d)。它打印出來的是,但我如何使它打印出全路徑 – user1232622 2012-03-25 09:34:44

回答

1

您需要使用寫謂詞這是另外如下

go(FromRoom, ToRoom):- 
    door(FromRoom,ToRoom), 
    write('['), write(FromRoom), write(':'), write(ToRoom), write(']'). 

go(FromRoom, ToRoom) :- 
    door(FromRoom, NextRoom), 
    write('['), write(FromRoom), write(':'), write(NextRoom), write(']'), 
    go(NextRoom, ToRoom). 

,你想要的格式的路線是

go(FromRoom, ToRoom):- 
    door(FromRoom,ToRoom), 
    write(FromRoom), write(' route '), write(ToRoom). 

go(FromRoom, ToRoom) :- 
    door(FromRoom, NextRoom), 
    write(FromRoom), write(' route '), 
    go(NextRoom, ToRoom). 
+0

非常好的幫助,但去(a,d)。你知道怎麼把它放在這個格式中嗎?路由一個路由b路由c路由d是的 – user1232622 2012-03-25 10:09:03

+0

@ user1232622你可以改變寫輸出來滿足你的需要。我喜歡看每個鏈接。我已經更新了答案 – 2012-03-25 10:20:56

+0

感謝您的幫助,這很難找出 – user1232622 2012-03-25 10:39:20

2

請儘量不要在謂詞中混用IO和邏輯。它會讓你的代碼很難測試,調試,推理,並且會在回溯時產生非常混亂的輸出。

在這裏,您可以在遞歸期間保持列表中的道路。

一個例子是,用第三個參數:

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

go(FromRoom, ToRoom, [FromRoom|Path]) :- 
    door(FromRoom, NextRoom), 
    go(NextRoom, ToRoom, Path). 

查詢正確返回路徑:

?- go(a, g, Path). 
Path = [a, b, e, g] ; 
false. 

如果有必要,可以再格式化輸出列表Path當你將它輸出。但它現在是一個非常簡單的問題:在遞歸期間格式化列表而不是輸出事物。

+0

@Mag謝謝你的例子! – 2012-03-25 16:20:32

2

一個好方法是簡單地將go/2變成一個也考慮路線的關係。由於通常情況下描述列表時,DCG中是一個不錯的選擇:

go(From, To) --> [From, To], { door(From, To) }. 
go(From, To) --> [From], 
     { door(From, Next) }, 
     go(Next, To). 

例子:

?- phrase(go(a, d), Rooms). 
Rooms = [a, b, c, d] ; 
false. 

和關於寫/ 1:這是很少必要的,因爲我們常常可以讓頂級照顧打印答案。格式/ 2經常是一個比寫/ 1如果需要格式化輸出,例如更好的貼合,而不是:

write('['), write(From), write(':'), write(To), write(']') 

你可以寫:

format("[~w: ~w]", [From, To])