2011-10-24 68 views
2

SWI-Prolog的5.10.2去/ 0未定义程序保存/ 1

我已经输入这个Prolog程序。但是,当我运行选项我碰到下面的错误。

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. 

提前许多感谢,

回答

6

错误消息指出您定义的谓词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/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)的半文本半二进制格式用于将程序写入磁盘。因为通过阅读你的代码,看起来你可能会对存储购物清单的项目感兴趣,另外我还想补充一点,你可以使用listing/1I/O procedures这样的组合来保存纯文本文件中的兴趣谓词如open/3,set_output/1,current_output/1等。

+0

我读的prolog书是1994年出版的。所以也许过时了。感谢你的回答。 – ant2009

+0

只是好奇:哪本书? –

2

不知道为什么你得到的错误,因为我不是很熟悉SWI Prolog的,但/ 1/0表示谓词中的参数个数。在这种情况下,您使用1个参数调用保存,因此保存/ 1。

另外,你有没有尝试过使用谓词save_program/1?据我所知,保存应该只用于调试(从http://euclid.barry.edu/~segami/Manual/sec-2.9.html)。

在我看到的例子中,save/save_program谓词总是被调用而没有引号或文件扩展名。我的印象是这门语言为你处理这个部分。 喜欢:保存(文件名),而不是保存('filename.pl')。

3

你写:“寻找来自可信和/或官方 来源的答案。如果你需要的第一手反馈,你应该张贴的SWI邮件列表中 问题:

SWI-Prolog 5.11.29, Mailing list

通常你在循环SWI序言的主要作者,也 许多贡献者。

最好的问候