如去(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).
如去(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).
您需要使用寫謂詞這是另外如下
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).
非常好的幫助,但去(a,d)。你知道怎麼把它放在這個格式中嗎?路由一個路由b路由c路由d是的 – user1232622 2012-03-25 10:09:03
@ user1232622你可以改變寫輸出來滿足你的需要。我喜歡看每個鏈接。我已經更新了答案 – 2012-03-25 10:20:56
感謝您的幫助,這很難找出 – user1232622 2012-03-25 10:39:20
請儘量不要在謂詞中混用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
當你將它輸出。但它現在是一個非常簡單的問題:在遞歸期間格式化列表而不是輸出事物。
@Mag謝謝你的例子! – 2012-03-25 16:20:32
一個好方法是簡單地將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])
到底是什麼問題? – 2012-03-25 09:24:38
prolog從1門到下一個,所以當我輸入去(a,d)。它打印出來的是,但我如何使它打印出全路徑 – user1232622 2012-03-25 09:34:44