2016-11-28 75 views
1

我所要做的是創建一個Prolog的實例和負載與JPL(以Java爲Prolog的接口)複製的副本。我可以想出幾種可能的方式來做到這一點,但是沒有一個能夠完全解決問題,這就是我來到這裏的原因。製作和SWI-Prolog的實例的負載副本JPL

首先,我知道我可以節省使用qsave_program/2狀態的副本。這會創建一個我可以運行的exe文件。不過,我需要使用JPL從Java中查詢保存的實例。我試過尋找這方面的文檔,但我找不到任何(可能不是一個常見問題)。有沒有什麼辦法可以運行使用qsave_program/2保存的實例並從JPL查詢?

第二個想法是將查詢原始實例的所有動態斷言條款。然而,我不知道所聲稱的是什麼,所以我不能直接要求那些東西,而是我必須根據它們是動態的這一事實來收集這些條款。然後,我可以簡單地從JPL啓動另一個實例並聲明這些事實以創建副本。這可能嗎?這是否會有效地創造一個州的副本?

+0

我想到了一種可能的解決方案,但它肯定不是很漂亮。我掌控着通過JPL發送的所有查詢。我可以列出所有查詢的列表,並且每當我創建一個新實例時,都可以做出相同的查詢(並且只是忽略答案),使我處於與之前相同的狀態。 –

回答

0

好吧,這裏是我決定的解決方案。我能找到我需要用下面的查詢重申所有謂詞:

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

這也是爲什麼我認爲這會爲我工作。 predicate_property(X,dynamic)會給我所有的動態謂詞。我不停留在這裏的原因是因爲有很多謂詞是動態的,我不需要在我的新的prolog實例中明確聲明它們的子句。具有built_in屬性的謂詞可以忽略,因爲當我創建我的序言查詢的新實例時,這些謂詞將自動定義。即使它們是由用戶明確定義的,該定義將被重新實例化,因爲我正在諮詢相同的文件。我也可以忽略那些沒有子句的謂詞(number_of_clauses(0)),因爲謂詞在沒有子句的情況下不會影響狀態。因此,一旦我擁有了所有我想要的動態謂詞,就可以找到這些謂詞的所有解決方案,列出通過JPL以Java返回的術語,打開文件的新諮詢並重新聲明這些術語。