2014-06-11 3 views
1

GNU Prolog에서 ensure_loaded/1 work 을 다른 많은 Prolog 시스템에서도 사용할 수있는 해결 방법이 있습니까? 목표는 나머지 부분이 코드가 어떤 Prolog 시스템을 사용하는지에 관계없이 ensure_loaded/1을 사용할 수 있도록 전치부를 갖는 것입니다. workaround ensure_loaded/1 GNU Prolog?

나는 시도 다음

:- multifile(term_expansion/2). 
term_expansion((:- ensure_loaded(X)), 
    (:- atom_concat('<base>\\', X, Y), 
    include(Y))). 

을하지만, 다음 쿼리는 작동하지 않습니다

:- ensure_loaded('suite.p'). 

경로 계산 자체가 질문 의 문제가 아니라의 재정 아니다 GNU Prolog의 지시어. 문제를 일으키는 다른 지시문은 입니다. meta_predicate/1. 바이트 코드 충돌 다음과 같이

GNU Fatal

안녕

답변

1

부분 솔루션입니다 :

ensure_loaded(File) :- 
    absolute_file_name(File, Path), 
    ( predicate_property(_, prolog_file(Path)) -> 
     true 
    ; consult(Path) 
    ). 

그것은 파일이 적어도 하나 개의 조건을 정의하지만 그건 현명한 있다고 가정합니다 인수. 그러나 ensure_loaded/1 지시문의 기본 기능 외 정의를 재정의 할 수있는 방법이없는 것으로 보입니다. 해결 방법은 ensure_loaded/1 지시문을 initialization/1 지시문 안에 포함하는 것입니다. 예를 들면 :

:- initialization(ensure_loaded('suite.pl')). 

따라서이 우리가 정말 ensure_loaded/1 조건를 정의하고 같은 부분적인 해결책 인 아닌 지시.

+0

A는 ** 필요 ** 기능은 정의 할 수 있도록 '파일이 이미 내 응답으로 수행되는,로드 된 경우/1' 지침 또는 술어가 시스템을 조회 할 수있다 ensure_loaded 'predicate_property/2'에 대한 호출에 의해 간단하게 해결되지는 않습니다. 그것은 내 게시물의 주요 기여입니다. 'absolute_file_name/2' 호출은'prolog_file/1' 속성이 절대 파일 경로를 사용하기 때문에 필요합니다. 'include/1' 지시자는 파일이 이미로드되어 있는지 찾는 것을 돕지 않습니다. –

0

현재 내 생각에 은 GNU Prolog 1.4.4의 표준 배포판으로는 불가능합니다. 다큐는 말한다.

는 GNU 프롤로그 컴파일러 (4.4 절)이 자동으로 각 용어 1에 expand_term/2에서 읽은 호출하지만, 현재 릴리스에서는, 만 DCG 변환이 (컴파일러에 의해 수행되는, 즉 을 term_expansion/2는 사용할 수 없습니다). term_expansion/2를 사용하려면 명시 적으로 expand_term/2를 호출하는 데 필요한 입니다.

또한 term_expansion/2 에 대한 일부 Prolog 코드를 명령 줄을 통해 삽입하려고했지만 awail하지 않았습니다. 툴 체인 에는 다른 도구에 옵션을 전달하는 -O, -L, -A와 같은 옵션이 있습니다. pl2wam에 Prolog 텍스트를 전달하는 옵션은 실제로 내부에서 발행 된 consult/1의 실행 중에는 최상위 수준입니다.

적어도 내 결과는 지금까지 있습니다.

안녕