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

ant*_*009 2 prolog swi-prolog

swi-prolog 5.10.2

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

go/0 Undefined Procedure save/1
Run Code Online (Sandbox Code Playgroud)

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

What does the /0 /1 mean in go and save?
Run Code Online (Sandbox Code Playgroud)

源代码

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

提前谢谢了,

Giu*_*lli 6

错误消息指出go/0您定义的谓词使用save/1系统无法识别的谓词并将其标记为未定义的过程.谓词通常由表单中的谓词指示符标识name/arity,其中name是谓词的名称,表示为atom,arity是表示谓词已定义接受的参数的数字:因此,例如,go/0标识符对于谓词go,没有参数,在程序中定义; 并且save/1是谓词的标识符save,有一个参数,您尝试调用但系统无法找到.当通过两个或更多个重载版本定义谓词时,例如对于每个定义具有不同的arity,可以通过将每个arity括在括号之间来引用,例如用逗号分隔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(但我维护save,save_program也)用于在磁盘上编写程序.因为,通过阅读您的代码,您似乎可能对存储购物清单的项目感兴趣,作为旁注,我想补充一点,您可以通过结合listing/1使用I/O来保存对纯文本文件感兴趣的谓词程序open/3,set_output/1,current_output/1,等.