提供以下知识库:
cityinCountry(paris, france ) . /* Paris is a city in France*/
cityinCountry(berlin, germany).
cityinCountry(cairo, egypt).
cityinCountry(munich, germany).
为什么cityinCountry(_City, germany).
返回True
,而cityinCountry(City, germany).
返回berlin; munich
?
对于变量状态I给出的定义是,它们由以大写字母或下划线(_)开头的标识符表示。但是,我的两个示例的行为有所不同。有人可以解释一下吗?
答案 0 :(得分:2)
它仍然是变量,但是通过在查询中使用此名称,您是在告诉Prolog(或至少是Prolog的实现)您不想显示其值。例如。 cityInCountry(_City, Country)
将打印预期的四个结果,但仅显示Country
的值。
很奇怪,我找不到与此相关的明确文档,例如在http://www.swi-prolog.org/pldoc/man?section=singleton中。唯一的区别是
单例变量是在子句中仅出现一次的变量。它始终可以由匿名变量_代替。但是,在某些情况下,人们倾向于给变量起一个名字。混淆变量是一个常见错误,如果变量仅使用一次,Prolog系统通常会发出警告(由style_check / 1控制)。可以通过以下划线(例如
_Name
)将变量告知系统一次出现。
我能找到的最接近的是http://www.cse.unsw.edu.au/~billw/dictionaries/prolog/dontcare.html:
这表明_变量实际上代表什么,但是具有Prolog找到解决方案时通常不会报告
_Anybody
的绑定的功能。
但是_Anybody
位于规则的主体内,无论如何在现代Prolog实现中都不会报告。