2012-01-25 55 views
0

在Prolog程序陳述如下:鄰居,鎮,壩,鏈接關係

town(a). 
town(b). 
town(c). 
town(d). 
dam(e). 
dam(f). 
link(a,b). 
link(a,c). 
link(c,d). 
link(b,d). 
link(b,c). 
link(c,e). 
link(a,e). 
link(d,f). 
neighbour(X,Y):- link(X,Y) ; link(Y,X). 

這將是正確的程序all_neighbours(L,X)返回所有鄰近城鎮的名單L到X:all_neighbours(L,X): - 鎮(Y),findall(Y,鄰居(X,Y),L)。

這將是正確的程序has_dam(L)它返回至少有一個相鄰壩所有城鎮的名單L:has_dam(L): - 壩(Y),鎮(X), findall(X,neighbor(X,Y),L)。

這將是正確的程序no_dam(L)返回有沒有相鄰壩所有城鎮的名單L:no_dam(L): - 鎮(X),不大壩(Y)的findall (X,鄰居(X,Y),L)。

回答

1

不,沒有一個是正確的。對於剩下的

all_neighbours(Neighbourhood, X) :- 
    findall(Y, (town(Y), neighbour(X, Y)), Neighbourhood). 

,類似:第一,調用town應在findall的範圍內進行的。請注意圍繞findall的第二個參數的括號。這些都是必需的,因爲

findall(Y, town(Y), neighbour(X, Y), Neighbourhood) 

將被解析爲(可能的不存在的)findall/4通話。

要了解findall查詢,拼出來:

找到所有Y使得(Y是一個小鎮,鄰居XY),並調用結果Neighbourhood