【问题标题】:Prolog SWI : Logtalk, How do I load my own project files?Prolog SWI:Logtalk,如何加载我自己的项目文件?
【发布时间】:2013-03-29 15:53:20
【问题描述】:

所以这周包括我安装 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++ 进行编程。至少我对这件事有了更多的了解,根据这些信息有什么更有用的建议吗?

【问题讨论】:

    标签: loading swi-prolog logtalk


    【解决方案1】:

    以后请使用官方 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 文件(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)}.
    

    希望这会有所帮助。

    【讨论】:

    • 谢谢,我现在可以运行了。我还有一个问题:正如 Daniel 已经指出的,settings.lgt 中还有另一行表示文件夹声明。 logtalk_library_path(项目,'$HOME/projects/')。假设我想创建一个项目文件夹,$HOME 部分是一个未声明的变量,如果我要为此声明一个路径,我是否必须声明完整路径或者是否有合适的方法来使用 logtalk 的默认路径正如您所说,已经知道我何时安装?只是好奇,知道会很方便。
    • 在 Windows 上,当使用例如SWI-Prolog 或 GNU Prolog 作为后端 Prolog 编译器,已经定义了一个名为 home 的库(其他一些 Prolog 编译器无法正确扩展环境变量)。因此,您可以定义具有home 作为根的其他库,如您引用的logtalk_library_path(projects, '$HOME/projects/') 示例中一样。您还可以将%HOME% 定义为Windows 环境变量。
    • 你也可以使用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 用户目录中并使用 $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 更通用。

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

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

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

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

    【讨论】:

    • 谢谢丹尼尔,我对图书馆路径业务的运作方式做了一半的研究。我已经编辑了 OP 以进行更新,不确定我的项目文件可能还需要在哪里引用。
    • 你应该在 Logtalk 邮件列表中询问这个问题。这种问题在 Windows 之外根本不存在,所以我无法提供帮助。
    • 您的帮助已经够多了,谢谢。我喜欢了解事情,而不是仅仅被告知要做什么。
    猜你喜欢
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多