Prolog变量名称从下划线开始,然后是大写

时间:2019-02-27 16:04:52

标签: prolog

提供以下知识库:

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给出的定义是,它们由以大写字母或下划线(_)开头的标识符表示。但是,我的两个示例的行为有所不同。有人可以解释一下吗?

1 个答案:

答案 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实现中都不会报告。