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

标签 prolog gnu-prolog

目前正在阅读《七周内的七种语言》一书,并且坚持要运行第一个序言示例。这涉及与 this question 相同的代码段;但是我相信我的问题是完全不同的。

我已经定义了 likesfriend就像书中一样;我的 friend 们.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 个参数,对吗?但是在我的规则中哪里引用了这样的 0 参数过程?我在这里做错了什么?
不敢相信这是我序言中的错误 ;)?

最佳答案

在 Ubuntu 上的 GNU Prolog 上有多个关于此问题的报告(当存在具有相同名称且具有 arity 1 或更大值的谓词时,源代码中未调用具有 arity 0 的谓词的存在错误)。解决方案是下载 GNU Prolog 源代码并手动编译。

关于prolog - 未捕获异常 : error(existence_error(procedure, likes/0),friend/0)(七种语言),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54496409/

相关文章:

unit-testing - GNU Prolog 中的单元测试

prolog - 如何在 Prolog 中将数字列表转换为单词列表?

prolog - 扁平化列表

Prolog 将字符串列表转换为数字列表

Prolog动态算术表达式

prolog - 如何在 GNU Prolog 中使用 "long int"?

linux - 在 GNU-Prolog 中,我可以 'catch' 一个 linux 信号吗?

memory-management - 为什么 gprolog 需要这么多内存?

Prolog - 加法乘法

prolog - 在 Prolog 中使用具有不同/不存在的事实的 OR 运算符