2

我对序言很陌生。使用 SICStus,当我对已查阅过的文件进行更改时,SICStus 无法识别这些更改。唯一的方法是我关闭窗口并重新启动它。但显然这是不切实际的,因为每次更改文件时都关闭窗口不仅烦人而且浪费时间。我正在使用 Windows 版本的 Sicstus 4.2.1。到目前为止,我已经尝试过命令consult(file)、reconsult(file)、compile(file),但没有一个有所作为。SICStus 只是忽略所做的更改,直到我关闭并打开窗口。

比如说,我有谓词 test/2。然后我删除了它并保存了文件。然后我输入 reconsult(file)。我的期望是 SICStus 会识别所做的更改并说谓词不存在。但它继续存在,就好像它存在一样。只有在我关闭窗口并重新开始之后,它才会正确地抱怨谓词不存在。

奇怪的是,它使用 reconsult(file) 识别新添加的谓词,但如果它被更改或删除,它不会。

4

1 回答 1

2

consult/1, reconsult/1, 和'.'/2— 都是 1970 年代首次定义的遗留内置插件1。今天它们只是为了快速而肮脏的编译。这些构造的语义是(并且实际上仍然是),因此特定于实现,不可能就准备好标准化的干净语义达成一致。你指出了其中一个弱点。是的,一旦定义,您就不能隐式取消定义谓词。使用 SICStus 的特定实现abolish/2来删除谓词。

一般来说,宁可使用ensure_loaded/1,因为这将检查文件修改日期是否已更改。更通用的使用方法是发出make.但是再次警告某些更改没有正确考虑。我仍然使用make.重新加载更改的文件。

最干净的方法是使用模块,同样,界面的变化没有被正确考虑,相反,会发出一些警告:

| ?- use_module(modulefile).
% compiling /home/ulrich/SO/modulefile.pl...
* predicate test/2 imported by user from modulefile is private
* Approximate lines: 1-2, file: '/home/ulrich/SO/modulefile.pl'
%  module modulefile imported into user
% compiled /home/ulrich/SO/modulefile.pl in module modulefile, 0 msec 2768 bytes
yes

1 我知道的最早的文档是 1978-09 的 DECsystem-10 Prolog 用户指南。带有勘误表的 1978-10 版本在这里

于 2016-11-05T16:47:02.883 回答