未捕获的异常:error(existence_error(procedure,likes/0),friend/0)(七种语言)
uncaught exception: error(existence_error(procedure,likes/0),friend/0) (Seven Languages)
目前正在学习七周内的七种语言这本书,并且一直在努力将第一个序言示例添加到 运行。这涉及与 this question 相同的代码段;但是我相信我的问题是完全不同的。
我已经按照书中的定义定义了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']
加载 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 源代码并手动编译。
目前正在学习七周内的七种语言这本书,并且一直在努力将第一个序言示例添加到 运行。这涉及与 this question 相同的代码段;但是我相信我的问题是完全不同的。
我已经按照书中的定义定义了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']
加载 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 源代码并手动编译。