Prolog SWI: Logtalk, Как мне загрузить мои собственные файлы проекта?

Поэтому на этой неделе я установил Logtalk, одно из расширений для Пролога. В этом случае я использую Prolog SWI и столкнулся с небольшим затруднением. Я не уверен, как на самом деле консультироваться с моими собственными проектами, используя Logtalk. Я ознакомился с примерами, которые предоставляет Logtalk, чтобы понять сам код, и при этом я смог загрузить их и выполнить их идеально. Однако я не понимаю, что происходит на самом деле, когда logtalk загружает файл, и как я могу загружать свои собственные проекты.

Я возьму пример "hello_world" в качестве предмета обсуждения. Файл с именем hello_world находится в папке примеров файлов Logtalk. и все же с этим обращаются вот так:

| ?- logtalk_load(hello_world(loader)).

Первое, что я подумал, это "это функтор", глядя на то, что он делал с помощью trace, я обнаружил, что он вызывается из библиотеки и ему рассказывают, как добраться до папки с примерами, где он затем открывает "hello_world". "папка, а затем файл" загрузчик ". После чего произошла нормальная компиляция.

Я взглянул на библиотеку и не мог понять, что происходит. Я также подумал, что это не может быть практическим способом загрузки пользовательских проектов в Logtalk. Был еще один пост, в котором спрашивалось, как это сделать с помощью SWI, но в нем не было никаких ответов и не было сделано никаких попыток выяснить проблему.

Теперь позвольте мне кое-что прояснить, я могу использовать "consult('...')". Команда просто отлично, я даже могу использовать "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). Мне кажется, этот бит имеет смысл для меня, как я получаю файл загрузчика, нет.

Правильно ли я понял это или нет, еще неизвестно, но даже если я правильно понял, я все еще теряюсь в том, как я загружаю свои собственные проекты. Спасибо за любую помощь, которую вы можете оказать, если бы вы могли привести пример, который будет лучшим, поскольку я учусь на примерах довольно быстро.

НЕМНОГО ОБНОВЛЕНИЯ

Вы спросили, использую ли я консоль logtalk для запуска своей программы, и я использую ту, которая указана и указана в файле "QUICK_START" [Пуск> Программы> Logtalk > "Logtalk - Prolog-SWI (console)"] Я подумал, что нужно дважды проверить, работают ли надстройки logtalk, и протестировать пример" birds ", поскольку он использует объекты и является хорошим знакомым примером. Еще раз, все работает нормально при использовании функтора logtalk_load/2.

Я посмотрел на то, на что ссылался путь к библиотеке, учитывая отзывы, полученные до сих пор. Посмотрим, как logtalk загружает файлы. Настроить как есть, без изменений logtalk обращается к папке, содержащей файл пролога, называемый libpaths. Это в основном то, как примеры найдены, все это частичное описание того, откуда взять файл. Поэтому, когда я говорю "logtalk_load/2" из того, что я могу сказать, я по крайней мере иду к этому файлу и нахожу, где находится папка, которую я запрашиваю.

Теперь, так как я уже поместил свою собственную папку проекта в папку примеров, я быстро добавил свою собственную папку в список, чтобы проверить, будет ли это, по крайней мере, частичным решением, которое поможет мне понять вещи немного больше. Я добавил следующее в файл libpaths.pl.

logtalk_library_path(my_project, examples('my_project/')).
% The path must end in a / so I have done so

Итак, я объявил путь к своей папке, получил свою папку, и файл загрузчика - это то, что я буду вызывать, когда использую загрузчик. Не думая о настройке моей собственной папки пути к библиотекам, у меня должно быть достаточно, чтобы все заработало и немного практиковалось. Но увы нет, кажется, мое расследование не удалось, и мне вернули следующее:

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)

Вызов не удался, я просто не могу найти ссылку, где бы он ни находился. И я в лучшем случае начинающий, когда дело доходит до такого рода проблем, я использую компьютеры только 3 года и программирую последние 2 года в визуальных студиях с использованием C# и C++. По крайней мере, я пролил немного света на этот вопрос, есть ли еще полезные советы, учитывая эту информацию?

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/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 определяется вами при использовании предоставленного установщика. По умолчанию 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)}.

Надеюсь это поможет.

Что делает меня неуверенным в моем ответе, так это то, что вы утверждаете consult работает но не logtalk_load, Вам нужно запустить другую программу, чтобы попасть в Logtalk, чем Prolog. В Unix это было бы что-то вроде swilgt для SWI-пролога или gplgt для GNU Пролог. У меня нет Windows, поэтому я не могу точно сказать вам, что вам нужно там делать, кроме, может быть, убедиться, что вы используете бинарный файл с именем Logtalk, а не просто Prolog.

В противном случае, я думаю, что ваша основная проблема в том, что в Windows сложно контролировать ваш рабочий каталог. В среде Unix вы бы переместили свой терминал в каталог с вашими файлами в нем и запустили Logtalk или 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 как показано в документации. Я не могу найти точную ссылку на то, где каталог пользователя 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/')).
*/

Вы можете просто раскомментировать эти строки и вставить свой собственный материал, чтобы получить постоянный ярлык.

Вы также можете написать plrc файл для SWI Prolog, чтобы определить другие вещи, которые будут происходить при запуске. Другой вариант выглядит чище, так как он специфичен для Logtalk, но plrc является более общим.

Если у вас есть этот механизм, файл загрузчика будет намного полезнее.

ПРИМЕЧАНИЕ. У меня нет Windows для тестирования какого-либо из этих компонентов, поэтому вам может потребоваться внести одно или оба следующих изменения в предыдущее:

  • Вам может понадобиться использовать / вместо \ в ваших путях (или, может быть, либо будет работать, кто знает?). Я бы наверное попробовал / Во-первых, потому что так работают все остальные системы.
  • Вам может понадобиться использовать %LOGTALKUSER% вместо $LOGTALKUSER в зависимости от того, как Logtalk расширяет переменные.

Надеюсь, что это поможет, и я надеюсь, что вы будете придерживаться Logtalk, он может использовать таких страстных пользователей, как вы!

Другие вопросы по тегам