1

我正在尝试使用 jpl 将相同的 swipl 文件加载到不同的模块中。我必须这样做的原因是因为我想要一个可以断言新谓词的模块,同时保持另一个不变。问题是 swipl 似乎禁止这样做,

jpl.PrologException: PrologException: error(permission_error(load, source, 'load.pro'), context(/(load_files, 2), 'Non-module file already loaded into module stable; trying to load into to_mess'))
    at jpl.Query.get1(Query.java:336)
    at jpl.Query.hasMoreSolutions(Query.java:258)
    at jpl.Query.oneSolution(Query.java:688)
    at jpl.Query.hasSolution(Query.java:759)

我试图为 load_files 设置 redefine_module(true),但还是不行

val query = new Query(s"load_files(${m}:'${loader}', [redefine_module(true)])")
query.allSolutions()

我已经被这个阻止了几个小时,但在网上找不到解决方案。有人可以帮忙吗??

4

3 回答 3

0

You can use Logtalk running on SWI-Prolog + JPL to easily accomplish having two encapsulation units (objects instead of modules in this case) sharing a common initial definition (the contents of the file you're trying to load in two or more different modules). For the details of using Logtalk + SWI-Prolog + JPL see for example:

https://github.com/LogtalkDotOrg/logtalk3/wiki/Using-Logtalk-with-JPL

For the code sharing implied in your question, one solution is to put the contents of the file in an object and then derive from it (using inheritance) as many object as needed. For a more specific advice I would need more details on what you're trying to accomplish.

于 2013-08-14T10:50:11.240 回答
0

据我所知,jpl 似乎并不总是与您在 swipl 控制台中取得的成果一致,即使它们来自完全相同的构建。

再次阅读 load_files/2 的文档,我最终得到了这个解决方案来让事情顺利进行......

load_files(stable:'load.pl', [register(false)]) .
load_files('load.pl', [register(false)]) .

注意我不能将新谓词断言到模块中(这在 swipl 控制台中有效,但不是通过 jpl),所以我只是将文件加载到一个应该是稳定的模块中,然后再次将同一组文件加载到 prolog vm(没有模块)直接在那里我可以断言新的谓词。

更新:如果我直接通过 jpl(无模块)在 prolog 中断言新谓词,则谓词将超越模块。这与 swipl 控制台的行为不同。

更新:这是错误的 - 尽管 jpl 没有抱怨或抛出异常,但该文件实际上只加载了一次。

于 2013-08-14T16:03:07.107 回答
0

模块名称是任意的,我认为您可以在名称后附加一个递增的整数。只要确保跟踪它,以便能够引用断言的谓词。

于 2013-08-13T23:30:44.180 回答