我试图用以下代码制作一个计数器:
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))
为参数的城市。
答案 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,
失败,你没有替代规则。