1

所以这周包括我安装 Logtalk,Prolog 的扩展之一。在这种情况下,我使用的是 Prolog SWI,但遇到了一些障碍。我不确定如何使用 Logtalk 实际咨询我自己的项目。为了理解代码本身,我查看了 Logtalk 附带的示例,并且这样做我已经能够加载它们并完美地执行它们。我不明白的是当 logtalk 加载文件时实际发生了什么,以及如何加载我自己的项目。

我将以“hello_world”示例作为讨论的重点。名为 hello_world 的文件位于 Logtalk 文件的示例文件夹中。然而它的咨询是这样的:

| ?- logtalk_load(hello_world(loader)).

我想到的第一件事是“这是一个仿函数”,使用跟踪查看它在做什么,我发现它是从库中调用的,并被告知如何进入示例文件夹,然后它打开了“hello_world " 文件夹,然后是 "loader" 文件。之后进行正常编译。

我看了看图书馆,不知道发生了什么。我还认为这不可能是在 Logtalk 中加载用户创建的项目的实用途径。还有另一个帖子询问如何使用 SWI 进行此操作,但没有任何回复,看起来也没有做出任何努力来解决问题。

现在让我明确一点,我可以使用“咨询('...')”。命令很好,我什至可以使用“咨询”来打开我的项目,但是如果我这样做,logtalk 控制台似乎没有使用任何 logtalk 扩展,所以只是 vanilla 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 ( console)"] 我想仔细检查一下 logtalk 附加组件是否正常工作并测试了“birds”示例,因为它使用了对象并且是一个非常熟悉的示例。再一次,使用 logtalk_load/2 仿函数时一切正常。

鉴于到目前为止给出的反馈,我看了一下库路径所指的更多内容。研究 logtalk 如何加载文件。设置为到目前为止,没有改变任何事情 logtalk 咨询一个文件夹,其中包含一个名为 libpaths 的 prolog 文件。它基本上是如何找到示例的,它只是从何处获取文件的部分描述。因此,当我说“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 正在寻找的参考。当涉及到这些问题时,我充其量只是个新手,我现在使用计算机仅 3 年,过去 2 年在 Visual Studio 中使用 c# 和 c++ 进行编程。至少我已经对此事有了更多的了解,鉴于这些信息,还有什么更有用的建议吗?

4

2 回答 2

2

让我不确定我的答案的只是你声称通常的consult作品而不是logtalk_load。你必须运行一个不同的程序来访问 Logtalk 而不是 Prolog。在 Unix 中,它类似于swilgtSWI-Prolog 或gplgtGNU Prolog。我没有 Windows,所以我不能真正告诉你在那里需要做什么,除了可能确保你运行的是一个名为 Logtalk 的二进制文件,而不仅仅是 Prolog。

否则我认为你的基本问题是在 Windows 中很难控制你的工作目录。在 Unix 环境中,您可以将终端导航到包含文件的目录,然后从那里启动 Logtalk 或 Prolog。然后,当您命名文件时,它们将位于当前目录中,因此 Prolog 可以轻松找到它们。如果您正在运行命令行 Prolog,您可能可以配置菜单项,以便它会为您执行此操作,但您必须知道要将其发送到哪里。

您可以使用函子表示法来获取子目录(例如,foo(bar(baz(bat(afile))))finds 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 用户目录中,并$LOGTALKUSER 按照文档中的说明使用。我找不到关于 Logtalk 用户目录在 Windows 上的位置的明确参考,但我希望它位于您的用户的 Documents and Settings 文件夹中。所以你可以把东西放在那里并通过像这样定义一个新的 logtalk_library_path 来引用它。

这很好,但是如果您每次启动时都必须继续重新输入这些断言,它仍然会让您感到兴奋和干燥。幸运的是,在您的 Logtalk 用户目录中有一个名为 Logtalk 设置文件,该文件settings.lgt在顶部附近有一大块注释掉的代码:

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

您可以简单地取消注释这些行并插入您自己的内容以获得持久的快捷方式。

您还可以为 SWI Prolog编写一个plrc文件来定义启动时要发生的其他事情。另一个选项看起来更干净,因为它是 Logtalk 特定的,但 aplrc更通用。

一旦你有了那个机器,拥有一个加载器文件会更有帮助。

注意:我没有 Windows 来测试任何这些东西,因此您可能需要对前面的内容进行以下任一或两项更改:

  • 您可能需要使用/而不是\在您的路径中(或者可能会工作,谁知道?)。我可能会/先尝试,因为这就是所有其他系统的工作方式。
  • 您可能需要使用%LOGTALKUSER%而不是$LOGTALKUSER,具体取决于 Logtalk 如何扩展变量。

希望这会有所帮助,我希望你坚持使用 Logtalk,它可以使用像你这样的热情用户!

于 2013-03-30T05:58:29.410 回答
2

以后请使用官方 Logtalk 支持渠道寻求帮助。你会在那里得到及时的回复。Daniel,感谢您为该用户提供帮助。

我假设您使用的是 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/1make/0edit/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 上),正如 Daniel 解释的那样。Logtalk 用户目录的位置由您在使用提供的安装程序时定义。默认设置My Documents\Logtalk在 Windows 中。编辑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-04-01T14:01:15.687 回答