Предикаты write_pl_state_file / 1 и read_pl_state_file / 1 связаны с информацией / состоянием, которое влияет на синтаксический анализ терминов, т.е. определения операторов, флаги Prolog преобразования символов и т.д. *
Так что это часть вашего решения (возможно), но в более фундаментальном плане вы хотите сохранить определения динамических предложений, возможно, в форме, позволяющей восстановить их путем обращения к файлу.
Предикат перечисление / 0 делает что-то вроде этого, но отображает динамические предложения для «консоли», а не для файла. Возможно, вы хотите использовать базовый предикат portray_clause / 2 , который позволяет перенаправлять вывод в файл (поток).
Автор Даниэль Диаз отметил небольшое изменение (добавление новой строки в конец вывода) для portray_clause / 2 в последних примечаниях к выпуску для версии 1.4.0, так что вы можете захотеть чтобы убедиться, что у вас установлена последняя версия для удобства чтения.
Добавлено:
Похоже, что начиная с версии 1.3.2 GNU Prolog поддерживает отправку перечисления / 0 выходных данных в текущий поток (а не только на консоль, как в 1.3.1 и более ранних версиях).
Вот тестовый пример:
| ?- assertz(whoami(i)).
| ?- assertz(whoami(me)).
| ?- assertz(whoami(myself)).
, который создает три предложения (факта) для динамического предиката whoami / 1 .
Затем я создал файл myClauses.pl со следующим запросом:
| ?- open('myClauses.pl',write,S), set_output(S), listing, close(S).
Как только поток S закрыт, токовый выход сбрасывается на консоль.
Вы обнаружите, что файл myClauses.pl содержит пустую строку, за которой следуют три предложения, так что исходный код находится в правильной форме, к которой следует обращаться. Однако у меня возникла проблема с предикатом consult / 1 (и его эквивалентом в меню File -> Consult ...) в моем недавно установленном GNU Prolog 1.4.0 под Windows. Компиляция работает из командной строки и создает файл байт-кода, который load / 1 может правильно обрабатывать в консоли, поэтому существует небольшая проблема в настройке. Я отправлю дальнейшую заметку, когда получу этот квадрат, отправив отчет об ошибке. Я еще не пробовал это под Linux.