2016-11-28 1 views
1

내가하려는 것은 Prolog 인스턴스의 복사본을 만들고 JPL (Java-Prolog Interface)로 해당 복사본을로드하는 것입니다. 나는 이것을 할 수있는 몇 가지 가능한 방법을 생각할 수 있지만, 그것들 중 어느 것도 완벽하게 해결되지 않았고, 그래서 내가 여기에 온 이유입니다.JPL로 SWI-Prolog 인스턴스의 복사본 만들기 및로드

우선, 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)은 모든 동적 술어를 제공합니다. 필자가 여기서 멈추지 않는 이유는 동적 인 술어가 많아서 프롤로그의 새로운 인스턴스에서 명시 적으로 주장 할 필요가없는 절이 있기 때문입니다. built_in 속성을 가진 조건자는 내 프롤로그 쿼리의 새 인스턴스를 만들 때 자동으로 정의되므로 무시할 수 있습니다. 사용자가 명시 적으로 정의하더라도 동일한 파일을 참조하기 때문에 해당 정의가 다시 인스턴스화됩니다. 절이 없으면 술어가 상태에 영향을주지 않으므로 절이없는 술어도 무시할 수 있습니다 (number_of_clauses(0)).

내가 원하는 모든 동적 술어가 있으면, 나는 그 술어에 대한 모든 해결책을 찾고, JPL을 통해 Java로 리턴 된 용어의 목록을 작성하고, 파일의 새로운 협의를 열고, 해당 용어를 다시 지정할 수 있습니다.