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.
非常感谢,
答案 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
(但我保持save
和save_program
)的半文半二进制格式在磁盘上编写程序。因为,通过阅读您的代码,您似乎可能对存储购物清单的项目感兴趣,作为旁注,我想补充一点,您可以通过使用{{1}的组合来保存对纯文本文件感兴趣的谓词。 } I/O procedures listing/1
,open/3
,set_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')。