将相同的prolog文件加载到jpl中的不同模块中

时间:2013-08-13 22:24:14

标签: prolog swi-prolog jpl

我正在尝试使用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()

我被封锁了几个小时,但无法在线找到解决方案。有人可以帮忙吗?

3 个答案:

答案 0 :(得分:0)

模块名称是任意的,我认为你可以在名称后附加一个增加的整数。 请务必跟踪它,以便能够引用断言的谓词。

答案 1 :(得分:0)

您可以使用在SWI-Prolog + JPL上运行的Logtalk轻松完成两个封装单元(在这种情况下为对象而不是模块)共享一个公共初始定义(您尝试加载的文件内容为两个或两个更多不同的模块)。有关使用Logtalk + SWI-Prolog + JPL的详细信息,请参阅:

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

对于您的问题中隐含的代码共享,一种解决方案是将文件的内容放在一个对象中,然后根据需要从它(使用继承)派生尽可能多的对象。有关更具体的建议,我需要更多有关您要完成的内容的详细信息。

答案 2 :(得分:0)

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

再次阅读load_files / 2的文档,我最终得到了这个解决方案,让事情有效......

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

注意我无法在模块中断言新的谓词(这在swipl控制台中有效,但 NOT 到jpl),所以我只是将文件加载到一个应该是稳定的模块中,并加载相同的模块一组文件再次直接进入prolog vm(无模块),我可以断言新的谓词。

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

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