Загрузить один и тот же файл пролога в разные модули в jpl
Я пытаюсь использовать jpl для загрузки одного файла swipl в разные модули. Причина, по которой мне пришлось это сделать, заключается в том, что я хочу иметь модуль, в который я могу утверждать новые предикаты, оставляя другой нетронутым. Проблема в том, что swipl запрещает это,
jpl.PrologException: PrologException: error(permission_error(load, source, 'load.pro'), context(/(load_files, 2), 'Non-module file already loaded into module stable; trying to load into to_mess'))
at jpl.Query.get1(Query.java:336)
at jpl.Query.hasMoreSolutions(Query.java:258)
at jpl.Query.oneSolution(Query.java:688)
at jpl.Query.hasSolution(Query.java:759)
Я пытался установить redefine_module (true) для load_files, но до сих пор не пошел
val query = new Query(s"load_files(${m}:'${loader}', [redefine_module(true)])")
query.allSolutions()
Я был заблокирован этим в течение нескольких часов, но не могу найти решение онлайн. Кто-нибудь может помочь, пожалуйста?
3 ответа
Вы можете использовать Logtalk, работающий на SWI-Prolog + JPL, чтобы легко добиться того, чтобы два модуля инкапсуляции (в данном случае объекты вместо модулей) имели общее начальное определение (содержимое файла, который вы пытаетесь загрузить в два или более разных модуля).). Подробнее об использовании Logtalk + SWI-Prolog + JPL см., Например:
https://github.com/LogtalkDotOrg/logtalk3/wiki/Using-Logtalk-with-JPL
Для совместного использования кода, подразумеваемого в вашем вопросе, одно решение состоит в том, чтобы поместить содержимое файла в объект, а затем извлечь из него (используя наследование) столько объектов, сколько необходимо. Для более конкретного совета мне понадобится больше деталей о том, что вы пытаетесь достичь.
Имя модуля является произвольным, я думаю, вы можете добавить к имени увеличивающееся целое число. Обязательно следите за этим, чтобы иметь возможность ссылаться на утвержденные предикаты.
Из того, что я могу сказать, jpl, похоже, не всегда соответствует тому, чего вы достигли в консоли swipl, даже если они исходят из одной и той же сборки.
Снова читая документацию по load_files/2, я решил использовать это решение...
load_files(stable:'load.pl', [register(false)]) .
load_files('load.pl', [register(false)]) .
Примечание. Я не могу утверждать новые предикаты в модуле (это работает в консоли swipl, но НЕ через jpl), поэтому я просто загрузил файлы в модуль, который должен быть стабильным, и снова загрузил тот же набор файлов в пролог vm (нет модуль), где я могу утверждать новые предикаты.
Обновление: если я утверждаю новый предикат в прологе напрямую через jpl (без модуля), предикат превратится в модули. Это ведет себя не так, как у консоли swipl.
Обновление: это неправильно - хотя jpl не жалуется и не выдает исключение, файл фактически загружается только один раз.