基本示例中的 Prolog 存在错误过程

Zor*_*ino 6 prolog gnu-prolog

我正在尝试学习 Prolog 的基础知识,并使用以下代码继续遇到existing_error。

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).
Run Code Online (Sandbox Code Playgroud)

在执行诸如 dos_come_after(m1, m3) 之类的查询时,我不断收到以下错误。

uncaught exception: error(existence_error(procedure,comes_after/0),does_come_after/0)
Run Code Online (Sandbox Code Playgroud)

这是显示错误的屏幕截图:

序言错误

我做错了什么,我应该记住什么以避免将来出现这些错误?提前致谢。

fal*_*lse 6

错误消息告诉您 Prolog 需要一个 predicate 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}
Run Code Online (Sandbox Code Playgroud)

  • 是的,我认为您对版本的看法是正确的。看起来其他人也有同样的问题:http://lists.gnu.org/archive/html/users-prolog/2017-02/threads.html 我降级到 1.4.4,这似乎解决了问题! (2认同)

Ilh*_*tra 6

不幸的是,这是 1.4.5 版本的问题。

幸运的是,您可以使用一个技巧来代替降级:

您可以在终端(gprolog 外部)上运行此命令,而不是在 gprolog 内使用Consult(file_name)

    gplc file_name.pl
Run Code Online (Sandbox Code Playgroud)

它将输出一个可以运行的可执行文件

    ./file_name
Run Code Online (Sandbox Code Playgroud)

它应该解决您存在的错误问题。