目前正在研究《七周内的七种语言》一书,并且一直坚持要运行第一个序言示例。这涉及相同的代码片作为这个问题 ; 但是我相信我的问题是完全不同的。
我已经定义likes并friend如书中所述;我的friends.pl:
likes(wallace, cheese).
likes(grommit, cheese).
likes(wendolene, sheep).
friend(X, Y) :- \+(X = Y), likes(X, Z), likes(Y, Z).
Run Code Online (Sandbox Code Playgroud)
我使用GNU序言(v1.4.5,在Ubuntu 18.10),我可以加载friends.pl consultfile,无论是通过| ?- [friends.pl]或| ?- ['friends.pl']或通过调用其gprolog --consult-file参数:gprolog --consult-file friends.pl就好了
询问likes事实或friend规则的第一部分很好:
| ?- likes(grommit, cheese).
yes
| ?- friend(grommit, grommit).
no
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试查询涉及规则第二部分的查询时,会得到以下信息:
| ?- friend(grommit, wendolene).
uncaught exception: error(existence_error(procedure,likes/0),friend/0)
Run Code Online (Sandbox Code Playgroud)
当我阅读错误消息时,它告诉我没有使用“ 0”参数的过程“喜欢”,对吗?但是在我的规则中,哪里引用了这样的0参数过程?我在这里做错了什么?不能相信这是我序言中的错误;)?
关于Ubuntu的GNU Prolog,已经有多个关于此问题的报告(当具有同名一个或多个同名谓词的谓词存在时,在源代码中未调用具有零的谓词0的谓词的存在错误)。解决方案是下载GNU Prolog源代码并手动编译。