2013-03-29 2 views
1

그래서 이번 주에는 Prolog의 확장 중 하나 인 Logtalk을 설치하는 것으로 구성되었습니다. 이 경우에는 Prolog SWI를 사용하고 있으며 약간의 문제가 발생했습니다. Logtalk을 사용하여 내 프로젝트에 실제로 문의하는 방법을 모르겠습니다. Logtalk이 코드 자체를 이해하기 위해 제공하는 예제를 살펴 보았습니다. 그렇게함으로써 코드를로드하고 완벽하게 실행할 수있었습니다. Logtalk에서 파일을로드 할 때 실제로 진행되는 작업과 내 프로젝트를로드하는 방법을 이해할 수 없습니다.Prolog SWI : Logtalk, 내 프로젝트 파일을 어떻게로드합니까?

"hello_world"예제를 토론의 요점으로 삼을 것입니다. hello_world라는 파일은 Logtalk 파일의 examples 폴더에 있습니다. 아직 그렇게 같이 상담을 :

| ?- logtalk_load(hello_world(loader)). 

우선 내가 "그 펑터이다"라고 생각, 그것은 추적을 사용하여 무엇을하고 있었는지보고, 나는 그것이 라이브러리에서 호출되는되었으며 말했다되고 있다는 발견 어떻게하면 "hello_world"폴더를 연 다음 "로더"파일을 열 었는지 예제 폴더로 이동하는 방법을 설명합니다. 그 후 정상적인 컴파일이 발생했습니다.

나는 도서관을보고 무슨 일이 있었는지 알 수 없었다. 또한 Logtalk에서 사용자가 만든 프로젝트를로드하는 실제 경로가 될 수 없다고 생각했습니다. SWI로도이를 수행하는 방법을 묻는 또 다른 게시물이 있었지만 문제를 파악하기 위해 어떤 응답도 없었으며 보이지 않았습니다.

이제 내가 명확하게 말하면서 "consult ('...')를 사용할 수 있습니다." 명령을 잘 사용하면 "consult"를 사용하여 프로젝트를 열 수도 있습니다. 그러나 이렇게하면 logtalk 콘솔은 logtalk 확장을 사용하지 않는 것처럼 보이므로 바닐라 프롤로그입니다. Logtalk을 설치하기 위해 Windows 용 설치 프로그램을 사용했으며, 내가 함께 제공되는 예제를 살펴봤을 때 작동한다는 것을 알고 있습니다. 내가 이해

logtalk_load/1. 
logtalk_load/2. 

:

내가 튜토리얼을 찾기 위해 노력했지만이 Logtalk 아무것도의 많은 부분을 찾기 매우 어렵습니다, 내가 찾은 가장로드에이 문서는 프로젝트 내에서입니다 과 같이 :

logtalk_load(file). % Top level loading 
logtalk_load(folder(file). % Bottom level loading 

그래서 거대한 수동 부하 각 시간을 절약하기 위해 나는 (Logtalk에 대한 예제가하는 일입니다) 내 프로젝트의 다른 구성 요소를로드하는 로더 파일을 가질 것이다. 이 비트는 나에게 의미가있다. 내 생각에, 로더 파일에 어떻게 접근하는지는 알 수 없다.

정확하게 이해했는지 여부는 아직 알 수 없지만 올바르게 이해하고 있더라도 내 프로젝트를로드하는 방법에 대해서는 여전히 분실 상태입니다. 당신이 줄 수있는 도움을 주셔서 감사합니다. 예제에서 아주 빨리 배울 수있는 예제를 줄 수 있다면요.

조금 UPDATE

내 프로그램 실행에 대한 logtalk 콘솔을 사용하여 경우 당신은 질문, 그리고 내가 제공 [시작> 프로그램은 "QUICK_START"파일 중에 언급 된 하나를 사용하고, 나는 > Logtalk> "Logtalk - Prolog-SWI (콘솔)"] Logtalk 애드온이 제대로 동작하는지 테스트 한 결과 객체를 사용하고 있기 때문에 "birds"예제를 테스트 해 보았습니다. Logtalk_load/2 functor를 사용할 때 모든 것이 잘 작동합니다.

나는 지금까지 주어진 피드백을 감안할 때 라이브러리 경로가 무엇을 언급했는지 살펴 보았다. logtalk로 파일을로드하는 방법. 지금까지와 같이 설정을 변경하지 않고 logtalk는 libpaths라고하는 프롤로그 파일을 포함하는 폴더를 참조합니다.기본적으로 예제가 어떻게 발견되는지는 파일을 어디서 가져올 지 부분적인 설명입니다. 그래서 "logtalk_load/2"라고 말하면 적어도이 파일에 가서 폴더가 어디에 있는지 묻습니다.

예제 폴더에 내 프로젝트 폴더를 이미 배치 했으므로 목록에 내 자신의 폴더를 추가하여 신속하게 문제를 이해하는 데 도움이되는 부분 방법 솔루션이 될 수 있는지 테스트했습니다. libpaths.pl 파일에 다음을 추가했습니다.

logtalk_library_path(my_project, examples('my_project/')). 
% The path must end in a/so I have done so 

그래서, 내 폴더 경로 선언있어, 내 폴더를 얻고, 로더 파일 내가 로더를 사용할 때 호출됩니다 것입니다. 내 자신의 lib 경로 폴더를 설정하지 않고, 일을하고 실제적인 학습을하기에 충분해야합니다. 그러나 슬프게도 아니, 내 조사가 실패하고 난 다음 반환 된 것 같다 내가보고 싶어하지 무엇

ERROR: Unhandled exception: existence_error(library,project_aim) 

을, 내가 다시이 라이브러리 오류 사업입니다. 나는 어딘가에 내 프로젝트 폴더에 대한 참조가 누락되었지만 참조 할 필요가있는 곳을 모른다. 문제에 대한 추적을 실행하면 단순히 다음 있었다 도움이되지 않았다 발생합니다

Call: (17) logtalk_library_path(my_project, _G943) ? creep 
Fail: (17) logtalk_library_path(my_project, _G943) ? creep 
ERROR: Unhandled exception: existence_error(library,my_project) 

통화가 실패, 나는 단순히 logtalk이 찾고있다 적 참조를 찾는 아니에요. 그리고 저는 이런 종류의 문제에 관해서는 초보자입니다. 저는 C#과 C++를 사용하여 시각 스튜디오에서 지난 2 년간 컴퓨터를 단 3 년 만에 프로그래밍하고 프로그래밍 해 왔습니다. 적어도이 문제에 관해 더 많은 빛을 보았습니다.이 정보를 제공하는 더 유용한 조언이 있습니까?

답변

2

향후 도움을 받으려면 공식 Logtalk 지원 채널을 사용하십시오. 적시에 답변을 받으실 수 있습니다. Daniel,이 사용자에게 도움을 주셔서 감사합니다.

Logtalk 2.x를 사용하고 있다고 가정합니다. Logtalk 3.x는 상대 경로 및 전체 소스 파일 경로를 지원합니다. Logtalk 2.x에서 logtalk_compile/1-2 (디스크로 컴파일) 및 logtalk_load/1-2 (메모리로 컴파일 및로드) 조건자는 소스 파일의 이름 (.lgt 확장자 없음) 또는 "library"를 사용하여로드 할 소스 파일의 위치 표기법". 전자를 사용하려면 먼저 현재 작업중인 디렉토리를 파일이있는 디렉토리로 변경해야합니다. 이렇게하면 두 번째 옵션의 유연성이 향상됩니다. 또한 일부 SWI - 프롤로그 기능 등을 함께 통합을 제공

?- {hello_world(loader)}. 

Logtalk 2.x 및 3.x :

?- logtalk_load(hello_world(loader)). 

나 : 당신이 언급대로, 당신이 인용 hello_world 예는 입력하여로드 할 수 있습니다 consult/1, make/0, edit/0-1, 그래픽 트레이서 및 그래픽 프로파일 러. 예를 들어 :

?- [hello_world(loader)]. 

********** Hello World! ********** 
% [ /Users/pmoura/logtalk/examples/hello_world/hello_world.lgt loaded ] 
% [ /Users/pmoura/logtalk/examples/hello_world/loader.lgt loaded ] 
% (0 warnings) 
true. 

자신의 예제와 프로젝트를로드하려면, 가장 쉬운 방법은 다니엘이 설명한 바와 같이 $LOGTALKUSER/settings.lgt 파일 (Windows의 %LOGTALKUSER%\settings.lgt)에 파일을 포함하는 디렉토리에 라이브러리 경로를 추가하는 것입니다. Logtalk 사용자 디렉토리의 위치는 제공된 설치 프로그램을 사용할 때 사용자가 정의합니다. Windows의 기본값은 My Documents\Logtalk입니다. libpaths.pl 파일을 편집하는 것은 좋은 생각이 아닙니다. settings.lgt 파일을 우선적으로 사용하여 자신의 라이브러리 경로를 정의하십시오.이 사건 것 같다대로 %LOGTALKUSER%\settings.lgt 파일에 다음 행을 추가, 당신은 %LOGTALKUSER%\examples\project_aim 디렉토리를 만들었으므로, 가정 : 당신이 %LOGTALKUSER%\examples\project_aim\loader.lgt 파일이있는 경우

:- multifile(logtalk_library_path/2). 
:- dynamic(logtalk_library_path/2). 

logtalk_library_path(project_aim, examples('project_aim/'). 

, 당신은 입력하여로드 할 수 있습니다

?- {project_aim(loader)}. 

희망이 도움이됩니다.

+0

고마워, 이제 시작했다. 나는 한 가지 더 질문한다 : Daniel은 이미 설정에 한 줄 더있다는 것을 지적했다. lgt는 폴더 선언을 나타낸다. logtalk_library_path (프로젝트, '$ HOME/projects /'). 프로젝트 폴더를 만들고, $ HOME 부분이 선언되지 않은 변수라고 가정 해 보겠습니다.이 경로를 선언해야한다면 전체 경로를 선언해야하거나 기본 경로 인 logtalk을 사용할 수있는 적절한 방법이 있다고 가정 해 보겠습니다. 네가 말했듯이, 내가 설치하고있을 때 이미 알고 있니? 그냥 호기심, 알기 편리 할 것입니다. –

+0

Windows의 경우 예 : SWI-Prolog 나 GNU Prolog를 백엔드 Prolog 컴파일러로 사용하면'home' 라이브러리가 이미 정의되어 있습니다 (다른 Prolog 컴파일러 중 일부는 환경 변수를 제대로 확장하지 못합니다). 따라서'logtalk_library_path (projects, '$ HOME/projects /')'예제 에서처럼'home'을 루트로 갖는 다른 라이브러리를 정의 할 수 있습니다. '% HOME %'을 Windows 환경 변수로 정의 할 수도 있습니다. –

+0

'logtalk_library_path (projects, home ('projects /'))'를 사용할 수도 있습니다. –

2

내 대답이 불확실한 이유는 평소에 consult 작품이 아니라 logtalk_load이 아니라고 주장하는 것입니다. Prolog보다 Logtalk를 사용하려면 다른 프로그램을 실행해야합니다. Unix에서는 SWI-Prolog의 경우 swilgt이거나 GNU Prolog의 경우 gplgt과 같습니다. Windows가 없으므로 Logtalk라는 이름의 이진 파일을 실행하고 단순히 Prolog가 아닌 다른 파일을 실행하고 있는지 확인하는 것 이외에 실제로 필요한 작업을 말할 수는 없습니다.

그렇지 않으면 기본 문제는 Windows에서 작업 디렉토리를 제어하기 어렵다는 것입니다. 유닉스 환경에서는 파일이있는 디렉토리로 터미널을 탐색하고 거기에서 Logtalk 또는 Prolog를 시작한다. 그런 다음 파일의 이름을 지정할 때 현재 디렉토리에 있으므로 Prolog는 파일을 찾는 데 문제가 없습니다. 명령 행 프롤로그를 실행중인 경우 메뉴 항목을 구성하여 메뉴 항목을 구성 할 수 있지만 보낼 장소를 알아야합니다.

functor 표기법을 사용하여 하위 디렉토리로 이동할 수도 있습니다 (예 : foo(bar(baz(bat(afile))))foo\bar\baz\bat\afile.lgt). 이것은 당신이 알아 낸 것 같았고, 적어도 그것을 뒷받침 할 수 있습니다. 이것은 미리 정의 된 펑터 목록과 현재 디렉토리에서 검색합니다. 하지만 어디서나 Logtalk을 실행 한 다음 assertz(logtalk_library_path(foo, 'C:\foo\bar\baz\bat')).을 실행하면 logtalk_load(foo(afile))이 C : \ foo \ bar \ baz \ bat \ afile.lgt로 확장됩니다.

해당 기술을 바탕으로 Logtalk 사용자 디렉토리에 파일을 넣고 $LOGTALKUSERas demonstrated in the documentation을 사용할 수 있습니다. Logtalk 사용자 디렉토리가 Windows에있는 위치에 대한 확실한 참조를 찾을 수는 없지만 사용자의 Documents and Settings 폴더에 있어야합니다. 그래서 여러분은 거기에 물건을 넣고 이와 같이 새로운 logtalk_library_path를 정의함으로써 참조 할 수 있습니다.

당신이 발사 할 때마다 당신이이 주장을 다시 입력해야한다면 그것은 여전히 ​​당신을 높고 건조한 상태로 남겨 둡니다.

% To define a "library" path for your projects, edit and uncomment the 
% following lines (the library path must end with a slash character): 

/* 
:- multifile(logtalk_library_path/2). 
:- dynamic(logtalk_library_path/2). 

logtalk_library_path(my_project, '$HOME/my_project/'). 
logtalk_library_path(my_project_examples, my_project('examples/')). 
*/ 

당신은 단순히 그 라인의 주석을 해제하고 지속적를 얻기 위해 자신의 물건을 삽입 할 수 있습니다 다행히 상단에 주석 처리 된 코드의 덩어리를 가지고 당신의 Logtalk 사용자 디렉토리에 settings.lgt라는 Logtalk 설정 파일이있다 지름길.

write a plrc file for SWI Prolog 또한 시작시 발생하는 다른 사항을 정의 할 수 있습니다. 다른 옵션은 Logtalk에 고유하므로 더 명확 해 보이지만, plrc이 더 일반적입니다.

일단 장비를 설치하면 로더 파일을 사용하는 것이 훨씬 도움이됩니다.

참고 : 난에이 물건 중 하나를 테스트하기 위해 윈도우가없는, 그래서 당신은해야 할 수도 있습니다 중 하나 또는 선행하는 다음과 같이 변경 모두 :

    당신은 사용해야 할 수 있습니다
  • 귀하의 경로에 \ 대신 / 대신에 (또는 어쩌면 작동하는지, 누가 알겠습니까?). 아마 다른 시스템이 작동하는 방법이기 때문에 먼저 /을 시도해 볼 것입니다.
  • Logtalk에서 변수를 확장하는 방법에 따라 $LOGTALKUSER 대신 %LOGTALKUSER%을 사용해야 할 수도 있습니다.

희망이 있으면 도움이 되었으면합니다. Logtalk를 계속 사용하기를 바랍니다. 자신과 같은 열정적 인 사용자를 사용할 수 있습니다.

+0

감사합니다. 다니엘, 라이브러리 경로 비즈니스가 어떻게 작동하는지 반쯤 살펴 보았습니다. 업데이트를 위해 OP를 편집했는데 프로젝트 파일을 참조해야하는 곳이 어디인지 알 수 없습니다. –

+0

Logtalk 메일 링리스트에서이 질문을해야합니다. 이런 종류의 문제는 Windows 외부에 존재하지 않으므로 도움을 줄 수 없습니다. –

+0

도와 주셔서 감사합니다. 나는 일을 이해하기보다는 무엇을해야 할지를 말하기를 좋아합니다. –