Я потратил целый день на это и не могу найти решение. Поскольку Google не дает никаких других подобных вопросов, я уверен, что делаю что-то не так.
У меня есть свежая полная установка swi-prolog 8.2.3.1 на Windows 10. Я убедился, что графические параметры выбраны. В основной папке swipl есть папка xpce. Когда я пытаюсь загрузить библиотеку xpce в пролог, я получаю следующую ошибку:
?- [library('pce')].
ERROR: source_sink `library(pce)' does not exist
ERROR: In:
ERROR: [20] throw(error(existence_error(source_sink,...),_8462))
ERROR: [16] '$resolve_source_path'(library(pce),_8494,[expand(true)]) at c:/program files/swipl/boot/init.pl:2315
ERROR: [15] '$load_file'(library(pce),user,[expand(true)]) at c:/program files/swipl/boot/init.pl:2289
ERROR: [9] <user>
ERROR:
ERROR: Note: some frames are missing due to last-call optimization.
ERROR: Re-run your program in debug mode (:- debug.) to get more detail.
Я попытался обратиться к файлу с :- use_module(library(pce)).
и получил ту же ошибку. Я понятия не имею, как действовать дальше. Он отлично работает с ubunutu на wsl на той же машине, но без графического интерфейса, помогает только убедиться, что команды верны.
Дополнительная информация о результатах решения @david-tonhofer:
У меня есть этот файл в "C:\Program Files\swipl\xpce\prolog\lib". Итак, я попробовал следующее:
?- file_search_path(library,X).
X = app_config(lib) ;
X = swi(library) ;
X = swi(library/clp) ;
false.
2 ?- assertz(file_search_path(library,pce('prolog/lib'))).
true.
3 ?- file_search_path(library,X).
X = app_config(lib) ;
X = swi(library) ;
X = swi(library/clp) ;
X = pce('prolog/lib').
4 ?- file_search_path(library,pce('prolog/lib')).
true.
5 ?- file_search_path(pce,X).
false.
6 ?- assertz(file_search_path(pce,'C:/Program Files/swipl/xpce/')).
true.
7 ?- file_search_path(pce,X).
X = 'C:/Program Files/swipl/xpce/'.
8 ?- use_module(library(pce)).
true.
Должен быть файл
./swiplexe_8.3.14/lib/swipl/xpce/prolog/lib/pce.pl
в вашем установочном каталоге.
Вызов
?- use_module(library(pce)).
на верхнем уровне Пролога или
:- use_module(library(pce)).
указывает ему загрузить pce.pl
, найденный в пути к библиотеке.
Возможно, ваш путь к библиотеке неполный....
Проконсультируйтесь с вашим путем поиска, выполнив
?- file_search_path(library,X).
X = app_config(lib) ;
X = swi(library) ;
X = swi(library/clp) ;
X = pce('prolog/lib'). <--- should be there
Расширьте путь поиска, выдав
?- assertz(file_search_path(library,SOME_PATH_AS_STRING_OR_ATOM)).
Однако факт
file_search_path(library,pce('prolog/lib')).
указывает на двухуровневый поиск.
Нам также нужно убедиться, что pce
установлен:
У меня есть это:
?- file_search_path(pce,X).
X = '/usr/local/logic/swiplexe_8.3.14/lib/swipl/xpce'.
Поэтому может потребоваться выпуск
?- assertz(file_search_path(pce,DIR_OF_XPCE_AS_STRING_OR_ATOM)).
@vaeng Убедитесь, что у вас есть pce('prolog/lib').
, а не pce('xpce/prolog/lib').
в file_search_path/1
.
И вход для pce
должен остановиться на C:/Program Files/swipl/xpce/
Спасибо. Это сработало. Когда я начинаю еще один сеанс swipl, все это пропало. Есть ли способ сохранить его навсегда?
@vaeng Да, есть init.pl, который читается при запуске сессии: См. файл инициализации пользователя. Добавьте туда директивы :- ..
. В настоящее время у меня ничего нет в этом файле, поэтому я не знаю, почему он работает у меня из коробки.
Да, это сработало. Большое спасибо. Это была настоящая большая головная боль, чтобы решить. Я надеюсь, что это может помочь другим, у вас есть аналогичная проблема.
Запуск следующих двух строк будет работать:
assertz(file_search_path(library,pce('prolog/lib'))).
assertz(file_search_path(pce,swi(xpce))).
Во второй строке «swi» относится к корневой папке swipl. Если вы хотите проверить все пути, вот пример:
?- file_search_path(X,Y).
X = swi,
Y = 'c:/program files/swipl' ;
X = library,
Y = app_config(lib) ;
X = library,
Y = swi(library) ;
X = library,
Y = swi(library/clp) .
@vaeng Пожалуйста, попробуйте установить факт
file_search_path(pce,DIR_OF_XPCE_AS_STRING_OR_ATOM)
; это может быть решением