我要做的是创建一个Prolog实例的副本,并使用JPL(Java-Prolog接口)加载该副本。我可以想到几种可能的方法,但是没有一种方法可以完全解决,这就是我来这里的原因。
首先,我知道我可以使用qsave_program/2
保存状态的副本。这会创建一个我可以运行的exe文件。但是,我需要使用JPL从Java查询此保存的实例。我已经尝试过为此寻找文档,但我找不到任何(可能不是常见问题)。有没有办法可以运行使用qsave_program/2
保存的实例并从JPL查询它?
第二个想法是查询原始实例的所有动态断言子句。但是,我不知道断言是什么,所以我不能直接要求这些东西,而是我必须根据它们是动态的事实来收集这些条款。然后我可以简单地从JPL启动另一个实例并断言这些事实来创建副本。这可能吗?这会有效地创建一个州的副本吗?
答案 0 :(得分:0)
好的,这是我决定采用的解决方案。我可以使用以下查询找到我需要重新声明的所有谓词:
predicate_property(X,dynamic),\+predicate_property(X,built_in),\+predicate_property(X,number_of_clauses(0)).
这就是为什么我认为这对我有用。
predicate_property(X,dynamic)
将为我提供所有动态谓词。我不能在这里停下来的原因是因为有很多谓词是动态的,我不需要在新的prolog实例中明确断言。可以忽略具有属性built_in
的谓词,因为在我创建prolog查询的新实例时会自动定义这些谓词。即使它们是由用户明确定义的,该定义也将被重新实例化,因为我正在查询相同的文件。我也可以忽略那些没有子句(number_of_clauses(0)
)的谓词,因为如果没有子句,谓词不会影响状态。
因此,一旦我拥有了我想要的所有动态谓词,我就可以找到这些谓词的所有解决方案,列出通过JPL在Java中返回的条款,打开文件的新咨询,并重新声明这些条款。 / p>