目前正在阅读《七周七种语言》一书,并且坚持要运行第一个prolog示例。这与这个问题涉及相同的代码片段;但是我相信我的问题完全不同。
我已经定义了书中的likes
和friend
;我 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']
或使用其--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 参数过程?我在这里做错了什么?不敢相信这是我的序言;)中的错误?
Ubuntu 上的 GNU Prolog 中,已经有几份关于此问题的报告(当存在具有相同名称的谓词且 arity 为 1 或更大时,源代码中未调用的谓词存在错误)。解决方案是下载GNU Prolog源代码并手动编译。