因此,这周我安装了Logtalk,这是Prolog的一个扩展。在这种情况下,我使用的是Prolog SWI,但我遇到了一个小问题。我不确定如何使用Logtalk实际咨询我自己的项目。为了理解代码本身,我查看了Logtalk附带的示例,通过这样做,我能够完美地加载和执行它们。但我不明白的是,当logtalk加载文件时,实际发生了什么,以及我如何加载我自己的项目。
我将以"hello_world“为例进行讨论。名为hello_world的文件位于Logtalk文件的examples文件夹中。然而,它是这样咨询的:
| ?- logtalk_load(hello_world(loader)).我想到的第一件事是“这是一个函数器”,通过使用跟踪,我发现它是从库中调用的,并且被告知如何到达examples文件夹,然后在那里打开"hello_world“文件夹,然后打开"loader”文件。之后发生了正常的编译。
我看了看图书馆,不知道是怎么回事。我还认为这不可能是在Logtalk中加载用户创建的项目的实际途径。还有另一篇帖子询问如何使用SWI来做这件事,但没有任何回复,看起来也没有做出任何努力来解决这个问题。
现在让我澄清一下,我可以使用“consult(‘...’)”。命令,我甚至可以使用"consult“来打开我的项目,但是如果我这样做的话,logtalk控制台似乎没有使用任何logtalk扩展,所以就是普通的prolog。我使用了windows的一个安装程序来安装logtalk,我知道它正在工作,因为我一直在看它附带的示例。
我试图找到一个教程,但很难找到许多Logtalk的东西,我找到的最多的是从你的项目中加载的文档:
logtalk_load/1.
logtalk_load/2.我是这样理解的:
logtalk_load(file). % Top level loading
logtalk_load(folder(file). % Bottom level loading因此,为了节省每次大量的手动加载,我需要一个加载程序文件来加载项目的其他组件(这就是Logtalk的示例所做的事情)。这一点对我来说是有意义的,我认为,我如何获得我的加载器文件,没有意义。
我是否正确地理解了它还有待观察,但即使我一直正确地理解它,我仍然不知道如何加载我自己的项目。感谢你能提供的任何帮助,如果你能给出一个例子,那将是最好的,因为我确实从例子中学到了很快。
小更新
您问我是否正在使用logtalk控制台来运行我的程序,我正在使用在"QUICK_START“文件开始>程序> Logtalk > "Logtalk - Prolog-SWI (控制台)”中提供和引用的控制台,我认为应该仔细检查logtalk附加组件是否工作,并测试“鸟”示例,因为它使用对象,并且是一个很好的熟悉示例。同样,在使用logtalk_load/2函数时,一切工作正常。
考虑到到目前为止给出的反馈,我更多地查看了库路径所引用的内容。查看logtalk如何加载文件。按照目前的设置,在不更改内容的情况下,logtalk会查询一个文件夹,其中包含一个名为libpath的prolog文件。它基本上是如何找到示例的,所有它只是从哪里获取文件的部分描述。所以,当我说"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正在查找的引用。当涉及到这类问题时,我充其量只是一个新手,我现在使用计算机只有三年,过去两年我在视觉工作室使用c#和c++编程。至少我对这个问题有了更多的了解,有没有更有帮助的建议呢?
发布于 2013-04-01 22:01:16
以后请使用官方Logtalk支持渠道获取帮助。你会在那里得到及时的回复。大牛,谢谢你给这个用户提供帮助。
我假设您使用的是Logtalk 2.x。请注意,Logtalk 3.x支持相对和完整的源文件路径。在Logtalk 2.x中,logtalk_compile/1-2 (编译到磁盘)和logtalk_load/1-2 (编译并加载到内存)谓词要么采用源文件的名称(不带.lgt扩展名),要么采用“库符号”加载的源文件的位置。要使用前者,首先需要将当前工作目录更改为包含该文件的目录。这使得第二种选择更加灵活。正如您所提到的,您引用的hello_world示例可以通过键入以下命令来加载:
?- logtalk_load(hello_world(loader)).或者:
?- {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文件(在Windows上为%LOGTALKUSER%\settings.lgt),正如Daniel解释的那样。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)}.希望这能有所帮助。
发布于 2013-03-30 13:58:29
让我不确定我的答案的是,你声称通常的consult可以工作,但logtalk_load不行。您必须运行与Prolog不同的程序才能进入Logtalk。在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)。你似乎已经明白了这一点,我至少可以证实这一点。这将在其预定义的functor列表中搜索,也在当前目录中搜索。但是你可以从任何地方启动Logtalk,然后运行assertz(logtalk_library_path(foo, 'C:\foo\bar\baz\bat')).,之后logtalk_load(foo(afile))将扩展到C:\foo\bar\baz\bat\afile.lgt。
在此技术的基础上,您可以将文件放在Logtalk用户目录中并使用$LOGTALKUSER as 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更通用。
一旦你有了这样的机制,拥有一个加载器文件将会更有帮助。
备注:我没有Window来测试这些东西,所以你可能需要对前面的代码进行以下两项或其中一项更改:
/而不是\ (也可能两者都可以,谁知道呢?)。我可能会先试试/,因为这是所有其他系统的工作方式。%LOGTALKUSER%而不是$LOGTALKUSER。希望这对你有所帮助,我希望你坚持使用Logtalk,它可以使用一些像你一样的热情用户!
https://stackoverflow.com/questions/15706681
复制相似问题