2013-03-29 65 views
1

所以這一週,我安裝了Logtalk,這是Prolog的擴展之一。在這種情況下,我正在使用Prolog SWI,並且遇到了一些問題。我不確定如何使用Logtalk實際諮詢我自己的項目。爲了理解代碼本身,我已經看了Logtalk自帶的例子,這樣我就可以加載並完美地執行它們。我不明白的是當logtalk加載文件時實際發生的事情,以及我如何加載自己的項目。Prolog SWI:Logtalk,如何加載我自己的項目文件?

我會以「hello_world」爲例討論問題。名爲hello_world的文件位於Logtalk文件的示例文件夾中。但它被諮詢,像這樣:

| ?- logtalk_load(hello_world(loader)). 

第一件事,我認爲是「這是一個函子」,看着使用跟蹤它在做什麼,我發現,它被從庫打來電話,被告知如何進入examples文件夾,然後打開「hello_world」文件夾,然後打開「loader」文件。之後正常編譯發生。

我看了看圖書館,無法弄清楚發生了什麼。我也認爲這不可能是在Logtalk中加載用戶創建的項目的實際路線。還有一篇文章是在問如何與SWI做到這一點,但沒有任何答覆,也沒有看到任何努力來解決這個問題。

現在讓我明確一些事情,我可以使用「諮詢('...')」。命令就好了,我甚至可以使用「consult」打開我的項目,但是如果我這樣做的話,logtalk控制檯似乎沒有使用任何logtalk擴展,所以只是香草序言。我已經使用Windows的安裝程序來安裝logtalk,我知道它正在工作,因爲我一直在看它附帶的示例。

我試圖找到一個教程,但它是很難找到任何東西的Logtalk,我發現最多的是上載該文件從您的項目中:

logtalk_load/1. 
logtalk_load/2. 

我理解像這樣:

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

所以每次都保存一個巨大的人工負載我想有一個加載程序文件將加載我的項目的其他組件(這是什麼Logtalk的例子一樣)。這一點對我來說很有意義,我想,我如何到達我的加載程序文件,沒有。

我是否正確地理解了它,還有待觀察,但即使我已經正確理解了它,但我仍然對如何加載自己的項目感到迷茫。感謝您提供的任何幫助,如果您能舉出一個最好的例子,我很快就會從例子中學習。

LITTLE UPDATE

你問我是不是使用logtalk控制檯我的程序運行,而我,我使用的是提供並在「QUICK_START」文件[開始>程序中提到的一個> Logtalk>「Logtalk - Prolog-SWI(console)」]我想仔細檢查logtalk add是否正在工作並測試了「鳥」示例,因爲它使用了對象,並且是一個很好的熟悉示例。再次,使用logtalk_load/2仿函數時,一切正常。

考慮到目前給出的反饋,我看看庫路徑指的是多一點。研究logtalk如何加載文件。按照目前的設置,在不改變事情的情況下,logtalk會查詢包含名爲libpaths的序言文件的文件夾。它基本上是如何找到這些示例的,它只是從哪裏獲取文件的部分描述。所以當我說「logtalk_load/2」時,至少我可以告訴這個文件並找到我要求的文件夾。

現在,因爲我已經在examples文件夾中放置了自己的項目文件夾,所以我立即將自己的文件夾添加到列表中以測試這是否至少可以成爲部分解決方案,以幫助我更好地理解事情。我將以下內容添加到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正在尋找一個參考。對於這類問題,我是最好的新手,我現在只用3年的時間使用電腦,而使用c#和C++的視覺工作室使用過去的2年編程。至少我已經更多地瞭解了這個問題,在給出這些信息的情況下,還有更多有用的建議嗎?

回答

2

請在將來使用官方的Logtalk支持渠道尋求幫助。你會在那裏得到及時的答覆。丹尼爾,謝謝你爲這個用戶提供幫助。

我假設你使用的是Logtalk 2.x.請注意,Logtalk 3.x支持相對和完整的源文件路徑。在Logtalk 2.x中,所述logtalk_compile/1-2(編譯至硬盤)和logtalk_load/1-2(編譯和加載到內存中)謂詞采取任何一個源文件(沒有.lgt擴展名)的名稱,或所述源文件的位置,使用「庫加載符號」。要使用前者,首先需要將當前工作目錄更改爲包含該文件的目錄。這使得第二個選項更加靈活。

?- logtalk_load(hello_world(loader)). 

或:你提到,你舉的例子hello_world,可以通過鍵入加載

?- {hello_world(loader)}. 

Logtalk 2.x和3.x還提供了一些SWI-Prolog的功能,例如整合如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文件(%LOGTALKUSER%\settings.lgt在Windows上)丹尼爾解釋的目錄。 Logtalk用戶目錄的位置由您在使用提供的安裝程序時定義。 Windows中默認爲My Documents\Logtalk。編輯libpaths.pl文件不是一個好主意。優先使用settings.lgt文件來定義您自己的庫路徑。假設,因爲它似乎是你的情況,你已經創建了一個%LOGTALKUSER%\examples\project_aim目錄,添加以下行到你的%LOGTALKUSER%\settings.lgt文件:

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

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

如果你有一個%LOGTALKUSER%\examples\project_aim\loader.lgt文件,然後可以通過鍵入加載:

?- {project_aim(loader)}. 

希望這有助於。

+0

謝謝,我現在正在運行。我還有一個問題:正如Daniel已經指出的那樣,settings.lgt中還有一行表示文件夾聲明。 logtalk_library_path(項目,'$ HOME/projects /')。假設我想創建一個項目文件夾,$ HOME部分是一個未聲明的變量,如果我要爲此聲明一個路徑,是否必須聲明完整路徑或是否有合適的方式來使用logtalk的默認路徑就像你說的那樣,我已經知道什麼時候安裝了?只是好奇,會很方便知道。 –

+0

在Windows上,使用例如SWI-Prolog或GNU Prolog作爲後端Prolog編譯器時,已經定義了一個名爲'home'的庫(其他一些Prolog編譯器未能正確地擴展環境變量)。因此,您可以定義其他庫,其中'home'爲root,就像您引用的'logtalk_library_path(projects,'$ HOME/projects /')'示例。您也可以將'%HOME%'定義爲Windows環境變量。 –

+0

你也可以使用'logtalk_library_path(projects,home('projects /'))'。 –

2

什麼讓我不確定我的答案只是你聲稱通常的consult工程,但不是logtalk_load。你必須運行一個不同的程序來訪問Logtalk而不是Prolog。在Unix中,它將類似於SWI-Prolog的swilgt或GNU Prolog的gplgt。我沒有Windows,所以我不能真正告訴你在那裏需要做什麼,除了可能確保你正在運行一個名爲Logtalk的二進制文件而不是簡單的Prolog。

否則我認爲你的基本問題是在Windows中很難控制你的工作目錄。在Unix環境中,您需要將終端導航到包含文件的目錄,然後從此處啓動Logtalk或Prolog。然後,當您命名文件時,它們將位於當前目錄中,因此Prolog將無法找到它們。如果您正在運行命令行Prolog,則可以配置菜單項以便它爲您執行此操作,但您必須知道要將它發送到何處。

您可以使用函子符號來獲取子目錄(例如,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來引用它。

這很好,但如果每次啓動時必須重新輸入這些聲明,它仍然會讓你高興而乾燥。幸運的是,其中有註釋掉的代碼頂部附近的一大塊在Logtalk用戶目錄下名爲settings.lgt一個Logtalk設置文件:

% 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/')). 
*/ 

你可以簡單地取消註釋這些行並插入自己的東西來獲得持久捷徑。

您也可以write a plrc file for SWI Prolog定義其他的東西在啓動時發生。另一個選項似乎更清潔,因爲它是Logtalk特定的,但plrc更一般。

一旦你有了這個機器,有一個加載器文件將會更有幫助。

注意:我沒有Windows測試任何這方面的東西,所以你可能需要做一個或兩個以下更改前述:

  • 您可能需要使用/而不是\在你的路徑(或者可能會工作,誰知道?)。我可能會先嚐試/,因爲這就是所有其他系統的工作原理。
  • 您可能需要使用%LOGTALKUSER%代替$LOGTALKUSER,取決於Logtalk如何擴展變量。

希望這有助於我希望你堅持使用Logtalk,它可以使用像你這樣的激情用戶!

+0

謝謝丹尼爾,我對圖書館路徑業務的工作方式進行了一半研究。我編輯了一個更新的OP,不知道我的項目文件可能需要引用的地方。 –

+0

您應該在Logtalk郵件列表上提問。這種問題根本不存在於Windows之外,所以我無法提供幫助。 –

+0

你的幫助夠了,謝謝。我喜歡理解事情,而不是僅僅被告知要做什麼。 –

相關問題