Prolog SWI:Logtalk,如何加载我自己的项目文件?

时间:2013-03-29 15:53:21

标签: loading swi-prolog logtalk

因此本周我安装了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”来打开我的项目,但是如果我这样做,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的例子)。对我来说,这一点对我来说是有意义的,我是如何得到我的装载文件的,不是。

我是否正确理解它仍然有待观察,但即使我已经正确理解它,我仍然对如何加载我自己的项目感到迷茫。感谢您提供的任何帮助,如果您能举出一个最好的例子,我会很快从示例中学习。

LITTLE UPDATE

你问我是否正在使用logtalk控制台来运行我的程序,而且我正在使用在“QUICK_START”文件中提供并引用的那个[开始>节目> Logtalk> “Logtalk - Prolog-SWI(控制台)”]我想仔细检查logtalk add ons是否正常工作并测试了“bird”示例,因为它使用了对象,这是一个很好的例子。再一次,使用logtalk_load / 2仿函数时一切正常。

考虑到目前为止给出的反馈,我看了一下库路径的含义。研究logtalk如何加载文件。设置为目前为止,没有更改的东西logtalk咨询文件夹,其中包含一个名为libpaths的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正在寻找的参考。在谈到这些问题时,我充其量只是一个新手,我现在只使用计算机3年,并使用c#和c ++在可视化工作室中编写过去2。至少我已经对这个问题有了更多的了解,给出了这些信息更有用的建议吗?

2 个答案:

答案 0 :(得分: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,它可以使用像你这样的热情用户!

答案 1 :(得分:2)

将来请使用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/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)}.

希望这有帮助。