我正在阅读 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,谢谢。
编辑:
我没有检查,但程序实际上可以正常工作,但仍然发出警告,这是有道理的,但是有没有办法消除错误或理解为什么会出现错误?
单例变量是一个警告,而不是一个错误。
它旨在提醒您,命名变量在规则中仅出现一次。
如果您想抑制该特定变量的警告,请将其重命名为以下划线开头的名称(例如_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)