Сохранение изменений assert и retract в SWI Prolog

В этой теме 1 ответ, 2 участника, последнее обновление  Васильев Владимир Сергеевич 2 года/лет, 6 мес. назад.

  • Автор
    Сообщения
  • #2162

    questioner
    Участник

    Предикаты assert и retract предназначены для добавления данных в базу данных и их удаления. В SWI Prolog они могут изменять только данные, описанные как dynamic, например:
    :- dynamic ig_node/4, ig_edge/3.
    Тут описаны два вида записей базы данных, к которым я смогу применять assert. Однако база данных находится в оперативной памяти и после окончания сессии все изменения теряются. Каким образом я могу внести изменения прямо в .pl-файл (чтобы увидеть их при следующем запуске)?

  • #2172

    Ключевое слово dynamic разрешает изменение предиката во время выполнения программы, т.е. использование функций assert и retract. Обращения к динамическим предикатам распределяются по потокам при параллельной обработке. Предикат, сохраняемый в файл должен быть динамическим.

    Предикаты assert и retract выполняют добавление и удаление данных из внутренней базы данных, которая всегда располагается в памяти текущего процесса, которая освобождается операционной системой при завершении сессии (процесса).

    Данные из внутренней базы данных не будет автоматически переписываться в файл, однако вы можете сделать это предикатами tell и told, которые открывают и закрывают файл. При закрытии файла данные сохраняются на диске. Для записи фактов из базы в файл можно использовать предикат listing, который выводит данные из базы на текущее устройство.

    tell('database_file.txt'), % открытие файла для записи
    listing(ig_node), % переписывание данных из базы в файл
    told. % закрытие файла (сохранение изменений в файле)

    Для загрузки данных из файла используется следующий синтаксис:
    ['database_file.txt'].

    При этом данные из файла загружаются во внутреннюю базу, это могут быть как факты, так и функции.

Для ответа в этой теме необходимо авторизоваться.