首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SWI Prolog:避免内置谓词和动态谓词之间的名称冲突

问SWI Prolog:避免内置谓词和动态谓词之间的名称冲突
EN

Stack Overflow用户
提问于 2021-12-30 12:15:27
回答 1查看 63关注 0票数 2

我想知道是否有可能定义一个与模块中的内置谓词具有相同的名称和特性的动态谓词。我希望使用delete_import_module/2将内置谓词隐藏在模块中就足够了。唉,这似乎行不通。例如,我不能在模块halt/1中为foo创建一个子句

代码语言:javascript
复制
?- 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中是看不见的。为什么会这样呢?

EN

回答 1

Stack Overflow用户

发布于 2021-12-30 16:12:12

我注意到,如果在添加子句之前调用谓词,问题就解决了:

代码语言:javascript
复制
?- 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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70531545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档