2014-06-11 1 views
1

B-Prolog에서 ensure_loaded/1 work 을 다른 많은 Prolog 시스템에서도 사용할 수있는 해결 방법이 있습니까? 목표는 나머지 코드 이 어떤 프롤로그 시스템을 사용하는지에 관계없이 ensure_loaded/1을 사용할 수 있도록 전문을 준비하는 것입니다.해결 방법 ensure_loaded/1 B-Prolog?

  • 많은 프롤로그 시스템처럼, 상대 경로는 현재 자문 파일 가 해결되지 않는 것 같다.
  • 프롤로그 텍스트가 허용되지 않는 것 같습니다. 일부 바이트 코드가 필요합니다. 따라서 을 컴파일해야합니다.

    :- set_prolog_flag(redefine_builtin, on). 
    ensure_loaded(X) :- 
        atom_concat('<base>\\',X,Y), 
        consult(Y). 
    :- set_prolog_flag(redefine_builtin, off). 
    

    그러나 다음 지시문 와 프롤로그 텍스트가 상담을 할 때, 내가 작업 습관 :

    :- ensure_loaded('suite.p'). 
    

    그것은 여전히 ​​제품군을 찾지을

그래서 나는 다음과 같은 시도 .피.

어떻게해야합니까? B-프롤로그 I의 Logtalk 어댑터 파일 경로의 확장을 (해야한다)에 관한

안녕

+1

포함

?- set_prolog_flag(redefine_builtin, on). ?- consult('<base>\\bprolog.p'). consulting::<base>\bprolog.p consulting::<base>\suite.p Etc.. 

안녕/1'? 이 방법으로 문제가 해결되는 것은 아니지만 최소한 경로 확인이 구현되는 방식을 좁힐 수 있습니다. – false

+0

경로 계산 자체는 질문의 문제가 아니라 B-Prolog에서 지시문의 재정의입니다. –

답변

0

사용 :

% '$lgt_expand_path'(+nonvar, -atom) 
% 
% expands a file path to a full path 

'$lgt_expand_path'(Path, ExpandedPath) :- 
    % first expand any environment variable 
    expand_environment(Path, ExpandedPath0), 
    ( ( sub_atom(ExpandedPath0, 0, 1, _, '/') 
      % assume POSIX full path 
     ; sub_atom(ExpandedPath0, 1, 1, _, ':') 
      % assume Windows full Path starting with a drive letter followed by ":" 
     ) -> 
     % assume full path 
     ExpandedPath = ExpandedPath0 
    ; % assume path relative to the current directory 
     working_directory(Current), 
     atom_concat(Current, '/', Directory), 
     atom_concat(Directory, ExpandedPath0, ExpandedPath) 
    ). 

그것은 해킹 (즉, 예를 시도하여 개선 할 수있다 기본적입니다 B-Prolog 자체에서 제공해야하는 기능이 누락 된 경우 실행중인 OS가 무엇인지 찾아보십시오.

+0

귀하의 요구 사항은 귀하의 질문에 어디서나 표현되지 않습니다. 내 대답은 단순히 B-Prolog에서 경로에서 전체 경로로 이동하는 방법을 보여줍니다. 이 지식을 통해 코드 스 니펫을 다시 작성하고 파일이 발견되었는지 확인할 수 있습니다. –

+2

Logtalk을 사용할 수있는 답장은 없습니다. 코드 스 니펫은 이미'ensure_loaded/1' 지시자의 내장 정의를 오버라이드하고 있습니다. 나의 제안은 단순히'consult/1'을 호출하기 전에 경로를 확장하려고 시도하는 것입니다 (답장에서 설명한대로). –

0

다음 분석 및 해결 방법에만 도달 할 수있었습니다.

set_prolog_flag (redefine_builtin, on)은 B-Prolog의 Prolog 텍스트 내에서 이 작동하지 않습니다. 내가 얻을 : 나는 최고 수준의 set_prolog_flag (redefine_builtin에)을 수행 할 때

B-Prolog Version 8.1 
?- consult('<base>\\bprolog.p'). 
consulting::<base>\bprolog.p 
** Error : Trying to redefine built- 
    in:'<base>\\bprolog.p',18::ensure_loaded/1 
*** error(file_not_found,suite.p) 

는, 일이 잘 있습니다 : 당신이`로받을 수 있나요 무엇