go / 0未定义的过程保存/ 1

时间:2011-10-24 07:52:32

标签: prolog swi-prolog

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.

非常感谢,

3 个答案:

答案 0 :(得分:6)

错误消息指出您定义的谓词go/0使用系统无法识别的谓词save/1并将其标记为未定义的过程。谓词通常由{em>谓词指示符以name/arity形式标识,其中name是谓词的名称,表示为atom,而arity是表示谓词具有多少参数的数字已定义为接受:因此,例如,go/0是谓词go的标识符,没有参数,在您的程序中定义;和save/1是谓词save的标识符,带有一个参数,您尝试调用但系统无法找到。当通过两个或更多个重载版本定义谓词时,例如对于每个定义,对于不同的arity,可以通过将每个arity括在括号之间来引用,用逗号分隔,例如, p/[1,2]。谓词有时被称为程序,这两个术语大致相同。

因为可以在older SWI-Prolog manuals中看到(链接指的是版本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]执行,您可以阅读in the latest version of the manual。请务必阅读its limitations,以防万一您希望将程序扩展到您在此处发布的简单代码段之外。

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

答案 1 :(得分:3)

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

SWI-Prolog 5.11.29, Mailing list

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

最好的问候

答案 2 :(得分: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')。