2017-11-04 21 views
3

我在学习Prolog的基础知识,并使用以下代码继续运行到exists_error。基本示例中的Prolog存在错误

comes_after(m1, m2). 
comes_after(m2, m3). 
comes_after(m3, m4). 
comes_after(m4, m5). 
comes_after(m5, m6). 

does_come_after(X, Y) :- comes_after(X, Y). 
does_come_after(X, Z) :- comes_after(X, Y), does_come_after(Y, Z). 

当执行查询如do_come_after(m1,m3)时,我不断收到以下错误。

uncaught exception: error(existence_error(procedure,comes_after/0),does_come_after/0) 

这里有一个截图显示错误:

Prolog Error

我在做什么错了,我应该牢记,以避免在未来这些错误?提前致谢。

+0

看起来没事,但你does_come_after的逻辑可能有点瑕疵。但不应该导致这个错误。你究竟是怎么称呼这个逻辑的? – Xaser

+0

似乎你没有查阅包含谓词的文件... – coder

+0

我没有查阅这个文件,而是使用come_after()谓词对它进行了测试。我更新了这篇文章,查看截图的具体内容。谢谢! – Zoroshino

回答

3

错误消息告诉您Prolog期望谓词comes_after/0,但没有找到。此外,从谓词does_come_after/0调用时会出现此问题。现在,你的定义都使用arity 2.因此,comes_after/2does_come_after/2。所以系统预期不会发生。

如果是这样,这必须与您的安装有关。你有1.4.5这是最新的版本,1.4.4仍然是当前的稳定版本。

因此,您可能安装了另一个较旧的系统,该系统通过提供不兼容的pl2wam编译器而受到干扰。要验证这一点,请说which pl2wampl2wam --version

特别是,1.3或甚至1.2的版本可能产生这样的结果。在GNU中没有版本检查。

为了确保我总是得到正确的版本,我说:

export PATH=/opt/gupu/gprolog-1.4.5/bin:${PATH} 
+1

是的,我认为你是对的版本的东西。看起来像其他人也有同样的问题:http://lists.gnu.org/archive/html/users-prolog/2017-02/threads.html 我降级到1.4.4,似乎已经解决问题! – Zoroshino

+0

@Zoro:更新 – false