Создайте и загрузите копию экземпляра SWI-Prolog с JPL

Я пытаюсь создать копию экземпляра Prolog и загрузить эту копию с помощью JPL (интерфейс Java-Prolog). Я могу придумать несколько возможных способов сделать это, но ни один из них не проработан полностью, и именно поэтому я пришел сюда.

Во-первых, я знаю, что могу сохранить копию состояния, используя qsave_program/2. Это создает исполняемый файл, который я могу запустить. Однако мне нужно запросить этот сохраненный экземпляр из Java с помощью JPL. Я пытался найти документацию для этого, но не смог найти (вероятно, не распространенная проблема). Есть ли способ запустить экземпляр, сохраненный с помощью qsave_program/2, и запросить его из JPL?

Вторая идея заключалась бы в том, чтобы запросить исходный экземпляр для всех динамически утвержденных предложений. Однако я не могу знать, что утверждалось, поэтому я не могу запрашивать эти вещи напрямую, а скорее должен собирать эти пункты, исходя из того, что они динамические. Тогда я мог бы просто запустить другой экземпляр из JPL и подтвердить эти факты, чтобы создать копию. Это возможно? И будет ли это эффективно создавать копию государства?


person Ben Mathers    schedule 28.11.2016    source источник
comment
Я подумал об одном возможном решении, хотя оно, конечно, некрасиво. Я контролирую все запросы, отправляемые через JPL. Я мог бы составить список всех сделанных запросов, и всякий раз, когда я создаю новый экземпляр, делать те же самые запросы (и просто игнорируя ответы), чтобы привести меня в то же состояние, в котором я был раньше.   -  person Ben Mathers    schedule 02.12.2016


Ответы (1)


Хорошо, вот решение, которое я выбрал. Я могу найти все предикаты, которые мне нужно будет подтвердить, с помощью следующего запроса:

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

Вот почему я думаю, что это сработает для меня. predicate_property(X,dynamic) даст мне все динамические предикаты. Причина, по которой я не останавливаюсь здесь, заключается в том, что существует множество динамических предикатов, предложения которых мне не нужно явно утверждать в моем новом экземпляре пролога. Предикаты со свойством built_in можно игнорировать, потому что они будут автоматически определены при создании нового экземпляра моего пролог-запроса. Даже если они явно определены пользователем, это определение будет восстановлено, поскольку я обращаюсь к тому же файлу. Я также могу игнорировать те предикаты, у которых нет предложений (number_of_clauses(0)), потому что предикаты не влияют на состояние, если у них нет предложений.

Итак, когда у меня есть все нужные мне динамические предикаты, я могу найти все решения для этих предикатов, составить список условий, возвращенных в Java через JPL, открыть новую консультацию файла и подтвердить эти условия.

person Ben Mathers    schedule 02.12.2016