未捕获的异常:error(existence_error(procedure,likes/0),friend/0)(七种语言)

uncaught exception: error(existence_error(procedure,likes/0),friend/0) (Seven Languages)

目前正在学习七周内的七种语言这本书,并且一直在努力将第一个序言示例添加到 运行。这涉及与 this question 相同的代码段;但是我相信我的问题是完全不同的。

我已经按照书中的定义定义了likesfriend;我的 friends.pl:

likes(wallace, cheese).
likes(grommit, cheese).
likes(wendolene, sheep).

friend(X, Y) :- \+(X = Y), likes(X, Z), likes(Y, Z).

我正在使用 gnu prolog(v1.4.5,在 Ubuntu 18.10 上),我可以通过 | ?- [friends.pl]| ?- ['friends.pl'] 加载 friends.pl 咨询文件或通过使用其 --consult-file 参数调用 gprolog:gprolog --consult-file friends.pl 就好了

询问 likes 事实或 friend 规则的第一部分就可以了:

| ?- likes(grommit, cheese).

yes
| ?- friend(grommit, grommit).

no

但是,当我尝试查询与规则的第二部分有关的查询时,我得到以下信息:

| ?- friend(grommit, wendolene).
uncaught exception: error(existence_error(procedure,likes/0),friend/0)

当我阅读错误消息时,它告诉我没有采用 0 个参数的过程 "likes",对吗?但是在我的规则中哪里引用了这样的 0 参数过程?我在这里做错了什么? 无法相信这是我序言中的一个错误 ;)?

GNU Prolog 在 [=12] 上有几份关于此问题的报告(当存在具有相同名称的谓词且元数为 1 或更大时,源代码中未调用的元数为零的谓词存在错误) =].解决方案是下载 GNU Prolog 源代码并手动编译。