Сохранение базы данных GProlog - PullRequest
0 голосов
/ 13 ноября 2011

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

Я пробовал это

saveState :-
  write_pl_state_file('backup.dat').

loadState :-
  file_exists('backup.dat'),
  read_pl_state_file('backup.dat'); !.

но это не работает.

Есть ли способ сохранить эту базу данных в файл?

Ответы [ 2 ]

1 голос
/ 13 ноября 2011

Предикаты 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.

0 голосов
/ 15 ноября 2011

Вы можете использовать current_predicate/1 или predicate_property/2 для доступа к предикатам и clause/2 для доступа к предложениям для предиката.

Затем вы можете написать утилиту сохранения, используя эту информацию.

...