2015-02-23 70 views
1

剛開始的序言,並通過這樣的路線/ 3的第一條規則有一個實踐的路線問題路線進入無限循環序言

train(a,b). 
train(b,a). 
train(b,c). 
train(c,b). 

route(X,Y,[]) :- 
     train(X,Y) 
    ; train(Y,X). 
route(X,Y,[H|T]) :- 
    route(X,H,[]), 
    route(H,Y,T). 

給出了兩個直接連接的地方空集的狀態,有一個路線。第二條規則規定了從一個地方到另一個地方有中間地點的情況。但是當我查詢這個,我有一個循環路線。

有人說有助手謂詞visited_route/4跟蹤已經去過的地方,但不知道這種方式是如何工作的。提示或例子會有所幫助。

+0

請不要污衊你的問題! – false 2015-02-24 12:36:42

回答

1

你目前的解決方案的問題是,Prolog求解器會生成無限的曲目,如[a,b,a,b,a,b,a ...]永遠不會結束。

您可能想要做的是排除X,Y或H是T的成員(這可能是visited_route/4謂詞)的情況。這樣,你永遠不會通過同一個節點兩次。

編輯

我已經坐了下來,我的勁Prolog的知識一點點,創造這樣的代碼,這似乎工作:

train(a,b). 
%train(b,a). Your predicate is symmetric, you don't need to specify both directions 
train(b,c). 
%train(c,b). 
train(c,d). 
train(c,e). 
train(d,f). 
train(e,f). 

visited_route(X, Y, [], V) :- 
    (train(X,Y) ; train(Y,X)), 
    not(member(Y, V)). 

visited_route(X, Y, [H | T], V) :- 
    visited_route(X, H, [], [X | V]), 
    visited_route(H, Y, T, [X | V]). 

route(X,Y,R) :- 
    visited_route(X, Y, R, []). 

參觀路線有一個包含所有節點的附加列表從X到Y的方式訪問(不包括Y)。當求解者在第一個visited_route謂詞中找到一個從X到Y的路時,它會檢查路由是否沒有經過已經訪問過的節點,如果是,則丟棄候選者。