我想知道是否有可能定义一个与模块中的内置谓词具有相同的名称和特性的动态谓词。我希望使用delete_import_module/2将内置谓词隐藏在模块中就足够了。唉,这似乎行不通。例如,我不能在模块halt/1中为foo创建一个子句
?- delete_import_module(foo, user).
true.
?- asserta(foo:halt(x)).
ERROR: No permission to modify static procedure `halt/1'
ERROR: In:
ERROR: [10] assert(foo:halt(x))
ERROR: [9] toplevel_call(user:user: ...) at /usr/lib64/swipl-8.4.1/boot/toplevel.pl:1117它似乎仍然认为我说的是system:halt/1,尽管这在foo中是看不见的。为什么会这样呢?
发布于 2021-12-30 16:12:12
我注意到,如果在添加子句之前调用谓词,问题就解决了:
?- delete_import_module(foo, user).
true.
?- foo:halt(_).
Correct to: "system:halt(_)"? no
ERROR: Unknown procedure: foo:halt/1
ERROR: However, there are definitions for:
ERROR: halt/0
ERROR:
ERROR: In:
ERROR: [10] foo:halt(_20078)
ERROR: [9] toplevel_call(user:foo: ...) at /usr/lib64/swipl-8.4.1/boot/toplevel.pl:1117
Exception: (10) foo:halt(_8960) ? no debug
?- assert(foo:halt(_)).
true.
?- @(listing, foo).
:- dynamic halt/1.
halt(_).
true.我还尝试过以其他方式戳谓词(使用current_predicate/1和clause/2),但效果不同。
因此,虽然这确实解决了问题,但我仍然想知道这里发生了什么。这是个虫子吗?我在Fedora Linux上使用SWI Prolog 8.4.1。
https://stackoverflow.com/questions/70531545
复制相似问题