2

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.

提前谢谢了,

4

3 回答 3

5

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

正如在旧的 SWI-Prolog 手册(链接指的是 2.9 版)中可以看到的那样,save/1确实曾经在标准库中定义过并且通常在这些系统上可用。即使在那些旧系统中,也建议使用save_program/[1,2]创建一个新程序而不是save/1,据说该程序仅用于调试目的。然而,在现代 SWI-Prolog 系统中,save/1两者save_program/[1,2]都没有。虽然似乎没有等效的谓词save/1,但角色save_program/[1,2]已经被扮演qsave_program/[1,2],您可以在最新版本的手册中阅读。一定要阅读它的局限性,以防万一您想扩展您的程序超出您在此处发布的简单代码段的方式。

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

于 2011-10-30T13:20:48.837 回答
3

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

SWI-Prolog 5.11.29,邮件列表

通常你有 SWI prolog 的主要作者和许多贡献者。

此致

于 2011-10-31T00:08:05.677 回答
2

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

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

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

于 2011-10-27T22:39:58.580 回答