2014-01-07 2 views
1

Имеет ли пролог встроенные предикаты, которые могут импортировать и экспортировать полные файлы во время выполнения?Динамическая база данных - включая и исключая файлы

Мне нужны предикаты, такие как «assert» и «retract». Проблема в том, что «assert» и «retract» обрабатывает только динамический список, а не полный файл.

Я знаю два способа, как включить файл в другой:

:- include('file.pl'). 
:- consult('file.pl'). 

В основном, это происходит в начале кода.

Могу ли я использовать эти предикаты в середине моего кода? (Я думаю, что предикат сработал, но у меня были проблемы с предикатом include ...)
И есть ли шанс, как снова исключить/«удалить» включенный файл? (более важный вопрос)

Я нашел встроенный предикат «delete_file/1», который буквально удаляет файл (из вашей памяти) - это не то, что я хотел. Но файл по-прежнему не был удален из текущей программы, только из памяти, что было действительно странно ...

Я надеюсь, что кто-то может мне помочь, потому что я не мог найти ничего, кроме предикатов, описанных выше. Благодаря!!

ответ

2

Не все прологи распознают consult (например, GNU Prolog не). Но include/1 и consult/1, похоже, работают в середине файла с помощью SWI Prolog и include/1 в GNU Prolog.

Отказ от использования товара ... другой вопрос. Prolog справляется с файлом, перетаскивая все факты и предикаты, и тот факт, что все это из определенного файла забывается, когда операция выполняется. Это как будто вы набрали их всех вручную. В нем нет записей о том, что какой-либо конкретный набор предикатов или фактов был из определенного файла с запросом. Чтобы «отменить» любые такие факты или предикаты, вам нужно будет сделать retract/1 или retractall/1 по позициям, указанным в результате include или consult. Это может быть просто, если функторы, с которыми вы консультируетесь, уникальны, потому что тогда вы можете уйти с retractall(my_unique_functor(_,_)). или retract(foo(_)).. Но если у вас есть смесь из них (существующих и вновь заявленных) и вы хотите, чтобы их выбрали, вам придется их сортировать.

1

Logtalk включает в себя пример программирования "named_databases", который поддерживает функциональность, которую вы ищете:

https://github.com/LogtalkDotOrg/logtalk3/tree/master/examples/named_databases

Этот пример поддерживает ECLIPSE, Lean Пролог, SICStus Пролог, SWI-Prolog и ПЕА и он использует в своей реализации модульную систему (за исключением Lean Prolog, которая обеспечивает основную часть функциональности) для фактических баз данных и механизм расширения терминатора Logtalk для оптимизации использования именованных предикатов базы данных.

Смежные вопросы