【问题标题】:SICStus Prolog ignores changesSICStus Prolog 忽略更改
【发布时间】:2016-11-05 14:28:53
【问题描述】:

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

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

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

【问题讨论】:

  • reconsult(file) 应该识别谓词的更改,即是否添加或删除子句。这不是发生在你身上吗? PS。在SICStus IDE 中,您可以通过按下按钮重新启动 SICStus 顶层。
  • 就我而言,不,reconsult 根本无法识别更改。
  • 这很奇怪,而不是当我在 4.2.1 中尝试此操作时发生的情况。请将复制者发送给 SICStus 支持,以便我进行调查。

标签: prolog sicstus-prolog


【解决方案1】:

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 版本是 here。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    相关资源
    最近更新 更多