4

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

我已经在书中定义了likes和;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']调用带有--consult-file参数的 gprolog 来加载 friends.pl 咨询文件: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 参数过程?我在这里做错了什么?不敢相信这是我序言中的错误;)?

4

1 回答 1

6

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

于 2019-02-02T19:14:01.780 回答