директива gprolog include не работает

Я запускаю gprolog версии 1.4.2 на машине Fedora 17 Linux.

Я написал небольшую программу на прологе, которая работает нормально. Я определил в нем несколько предикатов, которые хочу использовать в других пролог-программах. Поэтому я решил поместить их в отдельный файл и использовать директиву include (определенную в разделе 7.1.8 руководства GNU Prolog версии 1.4.2). Однако это не сработало. gprolog сказал, что эти предикаты (которые были во включенном файле) не определены.

Итак, в командной строке gprolog я набираю:

| ?- include('tools.pro').

И я получаю:

uncaught exception: error(existence_error(procedure,include/1),top_level/0

Таким образом, он явно не признает директиву. Я искал все и не могу найти причину, почему это должно произойти. Есть мысли по этому поводу?


person lurker    schedule 03.06.2013    source источник


Ответы (2)


Как указано в стандарте ISO Prolog, include/1 является директивой, а не предикатом. GNU Prolog строго следует официальному стандарту, поэтому вы не можете использовать include/1 в качестве предиката, в том числе в запросе верхнего уровня. Как объяснил Сергей, если вы хотите загрузить свои программы, вы можете использовать встроенный предикат consult/1 или его ярлык ([Fie1, File, ...]).

Чтобы использовать директиву include/1 в ваших исходных файлах, напишите перед ней оператор (:-)/1. Например:

:- include('tools.pro').
person Paulo Moura    schedule 04.06.2013
comment
Спасибо, Пауло. Это отлично сработало. Я пропустил описание «директивы» и «предиката». Я просто не мог найти пример или объяснение, как его использовать. Единственная загадка для меня сейчас заключается в том, что об этом говорится в руководстве по прологу GNU: если он не найден, он ищется в каждом каталоге родительских включателей. Я не уверен, о чем говорят «родительские включатели». - person lurker; 05.06.2013
comment
Пожалуйста. Что касается вашего вопроса о родительских включателях, я предполагаю, что он относится к сценариям, когда файл включает файл, который, в свою очередь, включает другие файлы. - person Paulo Moura; 05.06.2013

include/1 предназначен для использования в исходных файлах Prolog.

В приглашении запроса вы, вероятно, просто хотите просмотреть исходный файл: ['tools.pro'].

person Sergii Dymchenko    schedule 04.06.2013
comment
Спасибо. Мне это пришло в голову, но я попытался скомпилировать программу с включением, и она по-прежнему жаловалась, что не может найти эти предикаты. - person lurker; 04.06.2013
comment
Моя первоначальная проблема заключалась в том, что включение не распознается в скомпилированной программе. Я запустил его вручную по подсказке в качестве теста. Ваш ответ объясняет, почему этот ручной тест не работает, так что теперь я это понимаю. Но моя первоначальная проблема все еще существует, к сожалению. - person lurker; 04.06.2013
comment
Можете ли вы показать исходный файл Prolog, где используется include/1? - person Sergii Dymchenko; 04.06.2013
comment
У меня просто было это как include('../tools.pro'). в верхней части файла. - person lurker; 05.06.2013