【问题标题】:go/0 Undefined procedure save/1go/0 未定义程序保存/1
【发布时间】:2011-10-31 08:08:05
【问题描述】:

swi-prolog 5.10.2

我已经输入了这个 prolog 程序。但是,当我运行选项 a 时,我收到以下错误。

go/0 Undefined Procedure save/1

我确信 save 是一个正确的关键字谓词,并且文件的路径也确实存在。不知道我哪里出错了。

What does the /0 /1 mean in go and save?

源代码

/* Shopping list */

go:-reconsult('~/projects/prolog/chap7/shopping.pl'),
    write('a: See list'), nl,
    write('b: Add to list'), nl,
    write('c: Delete from list'), nl,
    read(Choice),
    choice(Choice),
    save('~/projects/prolog/chap7/shopping.pl').

/*
  facts for shopping
*/
item(potatoes).
item(bread).
item(coffee).

/*
  Rules for shopping list
*/
choice(a):-listing(item), nl.
choice(b):-write('Enter an item: '),
        read(Item),
        assert(item(Item)).
choice(c):-write('Item to delete: '),
        read(Item),
        retract(item(Item)).
choice(_):-write('Incorrect entry.'), nl.

非常感谢,

【问题讨论】:

    标签: prolog swi-prolog


    【解决方案1】:

    错误消息指出,您定义的谓词go/0 使用了系统无法识别的谓词save/1,并将其标记为未定义的过程。谓词通常由 name/arity 形式的 谓词指示符 标识,其中 name 是谓词的名称,表示为一个原子,arity 是一个数字,表示已定义谓词的参数数量接受:例如,go/0 是谓词 go 的标识符,没有参数,在您的程序中定义; save/1 是谓词 save 的标识符,带有一个参数,您尝试调用但系统无法找到该参数。当谓词已通过两个或多个重载版本定义时,例如每个定义都有不同的数量,可以通过将每个数量括在括号中来引用它,用逗号分隔,例如p/[1,2]。谓词有时称为过程,这两个术语大致等价。

    正如在older SWI-Prolog manuals 中看到的那样(链接指的是2.9 版)save/1 确实曾经在标准库中定义并且通常在这些系统上可用。即使在那些旧系统中,也建议使用save_program/[1,2] 来创建新程序,而不是save/1,据说后者仅用于调试目的。然而,在现代 SWI-Prolog 系统中,save/1save_program/[1,2] 都不可用。虽然似乎save/1 没有等效的谓词,但save_program/[1,2] 的角色已由qsave_program/[1,2] 承担,您可以阅读有关in the latest version of the manual 的信息。请务必阅读有关its limitations 的信息,以防万一您想扩展您在此处发布的简单 sn-p 之外的程序方式。

    我从未使用过那种程序,我必须假设您知道自己在做什么。但是,注意到程序开头的 reconsult/1 调用使用了稍后由 save/1 保存的相同文件,我请求您意识到文本文件中的一堆 Prolog 谓词之间存在差异,即格式reconsult/1 可以阅读和理解,以及至少qsave_program(但我也维护savesave_program)用来在磁盘上编写程序的半文本半二进制格式。因为,通过阅读您的代码,您似乎对存储购物清单的项目感兴趣,作为旁注,我想补充一点,您可以使用listing/1 的组合将感兴趣的谓词保存在纯文本文件中I/O proceduresopen/3set_output/1current_output/1 等。

    【讨论】:

    • 我正在阅读的序言书出版于 1994 年。所以可能已经过时了。感谢您的回答。
    【解决方案2】:

    您写道:“寻找可信和/或官方的答案 来源”。如果您需要第一手反馈,您应该发布您的 SWI 邮件列表上的问题:

    SWI-Prolog 5.11.29, Mailing list

    通常你在循环中有 SWI prolog 的主要作者,并且 许多贡献者。

    最好的问候

    【讨论】:

      【解决方案3】:

      不确定为什么会出现错误,因为我对 SWI Prolog 不是很熟悉,但 /1 /0 表示谓词中的参数数量。在这种情况下,您使用 1 个参数调用 save,因此是 save/1。

      另外,您是否尝试过使用谓词 save_program/1?据我所知,保存只能用于调试(来自http://euclid.barry.edu/~segami/Manual/sec-2.9.html)。

      在我看到的示例中,save/save_program 谓词总是在不带引号或文件扩展名的情况下调用。我的印象是语言为你处理了这部分。 比如:save(filename),而不是 save('filename.pl')。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-19
        • 2012-01-05
        • 1970-01-01
        • 2014-09-01
        • 2019-11-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多