2011-11-28 58 views
1
domains 
    list=symbol* 

    predicates 
    path(symbol,symbol) 
    solve(symbol,symbol,list) 
    insert(symbol,list,list) 

    clauses 
    path(a,b). 
    path(b,c). 
    path(c,d). 
    path(d,e). 
    path(a,d). 
    path(c,e). 

solve(X, Z, P):- 
    path(X,Z), 
insert(Z,Temp,P), 
P=Temp. 

solve(X,Z,P):- 
path(X,Y), 
insert(Y,Temp,P), 
P=Temp, 
    solve(Y,Z,P). 

insert(X,[X|Tail],Tail). 
insert(X,[Y|Tail],[Y|Tail1]):- 
insert(X,Tail,Tail1). 

要打印的我已經跟着去從一個點到another.But越來越errors.For實例的路徑,我想:要打印的路徑,但得到的錯誤

goal 
solve(a,c,P). 

回答:P = [a,b,c]

+0

請說明你得到了什麼樣的錯誤,以及這是哪種非標準的Prolog方言。 –

+0

iam使用turbo prolog,因此我不知道錯誤是什麼,但光標指向第一個插入謂詞中的尾部。 – Zohaib

+1

瞭解Prolog的第一件事是統一不是任務。你的構造函數'insert(Z,Temp,P),P = Temp'與'insert/3'的第一個子句和目標'solve(a,c,P)'一起導致循環數據結構(即, 'P = [b | P]')。你得到的錯誤取決於Prolog系統。 – twinterer

回答

1

我沒有得到你的求解謂詞。下面是我對應該如何猜測:

solve(Start, End, [Start|PathMinusStart]) :- 
    solve_(Start, End, PathMinusStart). 
solve_(Start, End, [End]) :- 
    path(Start, End). 
solve_(Start, End, [Waypoint|Path]) :- 
    path(Start, Waypoint), 
    solve_(Waypoint, End, Path). 

解決會給你的路徑相繼使用;瀏覽他們一個(好,我想,至少,因爲我不知道序言執行什麼你正在使用)。

+0

你的代碼是正確的,我得到了它的感謝。 – Zohaib

1
search_path(Node, End, Temp, Path) :- path(Node,End),reverse([End | [Node | Temp]], Path). 
search_path(Node, End, Temp, Path) :- 
    path(Node, Next), 
    not(member(Node, Temp)), 
    search_path(Next, End, [Node | Temp], Path). 

solve(Start, End, Path) :- search_path(Start, End, [], Path).