【发布时间】:2021-06-02 17:47:36
【问题描述】:
在SWI Prolog manual中,我发现了如下注释:
例如,假设一个应用程序可以推理多个世界。将特定世界的数据存储在模块中很有吸引力,因此我们只需通过调用该世界中的目标来从世界中提取信息。
这实际上很好地描述了我想要实现的目标。但是我遇到了一个问题。虽然我确实想为许多不同的世界建模,但我也想在所有这些世界中分享一些东西。所以我的想法是有一个allworlds 模块来处理每个世界中的真实事物,并为每个我想推理的世界提供一个模块,而后者从前者导入。所以我会在 REPL 中做这样的事情:
allworlds:asserta(grandparent(X, Z) :- (parent(X, Y), parent(Y, Z))).
allworlds:dynamic(parent/2).
add_import_module(greece, allworlds, start).
greece:asserta(parent(kronos, zeus)).
greece:asserta(parent(zeus, ares)).
现在我想查询greece:grandparent(kronos, X) 并得到X = ares,但我得到的只是false。当allworlds:grandparent 调用parent 时,它不会像我想要的那样调用greece:parent,而是allworlds:parent。我的研究似乎表明我需要使 grandparent 谓词模块透明。但是调用allworlds:module_transparent(grandparent/2). 并不能解决问题,而且它也已被弃用。这就是我卡住的地方。我怎样才能得到这个工作? meta_predicate/1 是解决方案的一部分吗?不幸的是,我无法对其文档做出正面或反面。
【问题讨论】:
-
这似乎与我前段时间尝试做的类似。看看:A cross-module “interface” call in SWI-Prolog
标签: module prolog swi-prolog