2013-03-29 67 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

你的帮助够了,谢谢。我喜欢理解事情,而不是仅仅被告知要做什么。 –

相关问题