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)
提前谢谢了,
错误消息指出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,等.
| 归档时间: |
|
| 查看次数: |
1361 次 |
| 最近记录: |