单例变量错误

w12*_*220 3 prolog

我正在阅读 Ivan Bratko 的《人工智能编程》一书,我陷入了一个基本问题并遇到了错误,并且之前关于堆栈溢出的答案似乎没有帮助。

我试图使用先前的事实作为参数来编写规则并收到错误

Single variables: [Y]
Run Code Online (Sandbox Code Playgroud)

我试图运行的代码是这样的

parent(myfather,me).
parent(mymother,me).

happy(X) :- 
  parent(X,Y).
Run Code Online (Sandbox Code Playgroud)

我过去曾成功制定过这样的规则,但我认为我只是错过了一些非常明显的东西,说明为什么这不起作用。我认为当编译并运行时

happy(myfather).
Run Code Online (Sandbox Code Playgroud)

它将返回true,因为它将用myfather替换happy规则中的X,然后用parent(myfather,Y)检查parent(X,Y)。然后尝试查看是否有一个事实表明父母(我的父亲,其他......)。

如果相关的话,我也在 macOS 上使用 swipl,谢谢。

编辑:

我没有检查,但程序实际上可以正常工作,但仍然发出警告,这是有道理的,但是有没有办法消除错误或理解为什么会出现错误?

ffe*_*rri 5

单例变量是一个警告,而不是一个错误。

它旨在提醒您,命名变量在规则中仅出现一次。

如果您想抑制该特定变量的警告,请将其重命名为以下划线开头的名称(例如_Y),例如:

happy(X) :- parent(X, _Y).
Run Code Online (Sandbox Code Playgroud)

或将其重命名为_匿名变量),例如:

happy(X) :- parent(X, _).
Run Code Online (Sandbox Code Playgroud)

 

这种类型的警告对于发现拼写错误非常有用,例如输入错误的变量名:

happy(Child) :- parent(Chidl, Parent), happy(Parent).
Run Code Online (Sandbox Code Playgroud)

警告:单例变量:[Child,Chidl]

或其他类型的拼写错误,例如用句号代替逗号:

happy(Child) :- parent(Child, Parent). happy(Parent).
Run Code Online (Sandbox Code Playgroud)

警告:单例变量:[Parent]

警告:单例变量:[Parent]

或其他逻辑错误。

 

如果没有单例变量警告,这些错误将不会被注意到并且更难以追踪。

因此,看到此警告通常也会为寻找其他类型的错误敲响警钟。如果没有其他错误,则只需将单例变量设置为匿名即可修复它。

 

如果您知道自己在做什么,则可以使用以下命令全局禁用警告:

:- style_check(-singleton).
Run Code Online (Sandbox Code Playgroud)