创建一个计数器Prolog

时间:2015-05-21 20:05:52

标签: 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))为参数的城市。

1 个答案:

答案 0 :(得分:0)

您提供的代码中存在几个问题。

1)

首先,一句话,在prolog中,“=”不是像C / C ++和其他命令式语言那样的分配。这意味着您无法输入:

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

但使用单个查询:

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

2)

这两个陈述可能是错误的:

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

因为第三个参数在第一个参数中是一个列表,而不在第二个参数中。

3)

最后,你所谓的“contador / counter”(也就是说,可能更好地称为“累加器”)并未正确“完成”。当原始列表用尽时,声明:

contador([], 0,[]).

已应用,但此语句请求计数器等于cero。可能会有更好的东西:

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

4)

这两个陈述:

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

可以统一为一个:

cidade(A,_,_,Regiao),

5) 一般情况下,尝试跳过“是”运算符。例如,替换:

Tr is Tot + 1,

使用:

succ(Tot,Tr),

6)

如果声明:

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

失败,你没有替代规则。