1

我想要做的是创建一个 Prolog 实例的副本并使用 JPL(Java-Prolog 接口)加载该副本。我可以想到几种可能的方法来做到这一点,但没有一个是完全解决的,这就是我来这里的原因。

首先,我知道我可以使用qsave_program/2. 这将创建一个我可以运行的 exe 文件。但是,我需要使用 JPL 从 Java 中查询这个保存的实例。我已经尝试为此寻找文档,但找不到任何文档(可能不是常见问题)。有什么方法可以运行使用保存的实例qsave_program/2并从 JPL 查询它?

第二个想法是查询所有动态断言子句的原始实例。但是,我不知道断言了什么,所以我不能直接要求这些东西,而是我必须根据它们是动态的事实来收集这些子句。然后我可以简单地从 JPL 启动另一个实例并断言这些事实来创建一个副本。这可能吗?这会有效地创建状态的副本吗?

4

1 回答 1

0

好的,这是我决定的解决方案。我可以通过以下查询找到我需要重新断言的所有谓词:

predicate_property(X,dynamic),\+predicate_property(X,built_in),\+predicate_property(X,number_of_clauses(0)).

这就是为什么我认为这对我有用。 predicate_property(X,dynamic)会给我所有的动态谓词。我不在这里停下来的原因是因为有很多谓词是动态的,我不需要在我的新序言实例中明确断言其子句。可以忽略具有该属性的谓词built_in,因为这些谓词将在我创建 prolog 查询的新实例时自动定义。即使它们是由用户明确定义的,该定义也会被重新实例化,因为我正在查阅同一个文件。我也可以忽略那些没有子句 ( number_of_clauses(0)) 的谓词,因为如果没有子句,谓词不会影响状态。

因此,一旦我拥有了我想要的所有动态谓词,我就可以找到这些谓词的所有解决方案,列出通过 JPL 在 Java 中返回的条款,打开文件的新咨询,并重新声明这些条款。

于 2016-12-02T06:19:41.773 回答