2015-05-21 42 views
-1

我試圖做出反擊了以下代碼:創建一個計數器的Prolog

contador([], 0,[]). 
contador([via(A,_,_)|R], Tot,Regiao):- 
    cidade(A,_,_,Reg1),Reg1==Regiao, 
    Tr is Tot + 1, 
    contador(R,Tr,Regiao). 

鑑於我的清單的格式和CIDADE:

L=[via(porto,lisboa,_),via(braga,faro,_),via(guimaraes,santarem,_)] 

cidade(lisboa,_,_,A) 

爲什麼不工作?

cidade(porto,portugal,40,litoral). 
cidade(braga,portugal,350,interior). 
cidade(guimares,portugal,40,litoral). 
cidade(alverca,portugal,30,valedotejo). 
cidade(santarem,portugal,25,valedotejo). 
cidade(faro,portugal,20,litoral). 
cidade(sevilha,espanha,60,interior). 

使用此列表:

A = [via(porto, braga, 5), via(braga, guimaraes, 9), via(guimaraes, alverca, 7), via(alverca, faro, 10)] ; 

我試圖做到以下幾點:

?-contador(A,Tot,litoral). 
false. 

我的目標是計算已A(cidades(_,_,_,A))作爲參數的城市。

+2

顯示完整的代碼,包括數據庫事實和您正在嘗試運行的查詢。 –

+0

如果'Regiao'和'Reg1'不同,會發生什麼? – false

+0

它應該跳過列表中的成員,不遞增Tot並轉到下一個 – sirsomething

回答

0

您提供的代碼有幾個問題。

1)

首先,此話,在序言, 「=」 是不象在C/C的assignement ++等勢在必行lenguages。這意味着你不能鍵入:

A=[...]. 
contador(...). 

但使用一個單一查詢:

A=[...],contador(...). 

2)

這兩句話是有可能的錯誤:

contador([], 0,[]). 
contador([via(A,_,_)|R], Tot,Regiao):-... 

因爲第三論點在第一個列表中,而不在第二個列表中。

3)

最後,你所謂的「康塔多/計數器」(那就是,或許,更好地稱爲「acumulator」)未正確「完成」。當原始列表用完時,聲明:

contador([], 0,[]). 

已應用,但此語句請求計數器等於cero。也許,這將是更好的東西,如:

contador([], R, _) :- ... /* do something with R */ 

4)

這兩句話:

cidade(A,_,_,Reg1),Reg1==Regiao, 

可以在單一一個統一:

cidade(A,_,_,Regiao), 

5) 通常,嘗試跳過「is」運算符。舉例,替換:

Tr is Tot + 1, 

有:

succ(Tot,Tr), 

6)

如果聲明:

cidade(A,_,_,Reg1),Reg1==Regiao, 

失敗,你沒有改變規則。

+0

使用這種方法: '康塔([],0,_) 康塔([通過(A,_,_)| R],托特,Regiao): - \t CIDADE(A,_,_,Regiao) \t SUCC(托特,Tr), \t contador(R,Tr,Regiao) ' 當達到succ(Tot,Tr)時,它表示參數未被充分實例化 – sirsomething

+0

在查詢中,必須傳遞等於「0」的初始計數器。 –