Вопрос по database – Пролог вставлять, изменять и удалять факты в отдельном текстовом файле базы данных

4

У меня есть файл базы данных пролога с большим количеством фактовknowledge.pl, Например:

father_of(joe,paul).
father_of(joe,mary).
mother_of(jane,paul).
mother_of(jane,mary).
male(paul).
male(joe).
female(mary).
female(jane). % and so on.

Этот файл просматривается (consult / 1) каждый раз, когда моя программа выполняется снова.

Я хотел бы иметь возможность вставлять, изменять и удалять нужные мне факты (некоторые из них напрямую, некоторые другие, которые удовлетворяют определенным условиям) путем записи или удаления непосредственно в этом текстовом файле базы данных.

что-то вроде assertz, retract и retractall, но изменяя этот текстовый файл, чтобы изменения оставались там постоянно.

как мне это сделать?

Ваш Ответ

2   ответа
3

либо изменить базу данных, а затем сохранить ее в файле.

разница в том, что при первом подходе у вас будет загружена БД старого файла, в то время как второй подход изменит его во время выполнения.

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

1) объявите все предикаты, которые вы хотите изменить, как Динамический 2) утверждать, убирать и т.д. во время выполнения 3) записывать новую базу данных в файл. вы можете использовать Листинг / 1

Чтобы написать, вы можете сделать что-то вроде:

tell(knowledge),
.....
told.

или ты можешь использовать другой предикаты. возможно используя Set_prolog_IO / 3 было бы самым простым способом.

Теперь, если вы хотите первое, вы должны построить предикаты (вероятно, используяuniv operator) или другие предикаты для работы со строками, а затем записать их в файл

РЕДАКТИРОВАТЬ

there is list / 0, но в нем будут перечислены все загруженные предикаты (что-то, что вы, возможно, не хотите). после некоторых поисков я нашел Source_file / 2; так что вы можете сделать что-то вроде

findall(X,source_file(X,FileName),L).

заметьте, что source_file / 2 требует Абсолютный имя файла. вы можете использовать Absolute_file_name / 2 чтобы получить способ, которым source_file / 2 форматирует предикат, немного странно (я ожидал что-то вроде foo / 1), но похоже, что вы можете передать его в листинг / 1, и он отлично работает, так что вы можете сделать что-то вроде:

save(FileName):-
    absolute_file_name(FileName,Abs),
    findall(X,source_file(X,Abs),L),
    tell(FileName),
    maplist(listing,L),
    told.

с другой стороны, у вас всегда может быть список с предикатами, которые вы хотите сохранить где-то в файле

Имея список / 1 из всех предикатов не идеально, но в любом случае это будет работать, спасибо. Есть ли способ сделать что-то вроде листинга, но с целым текстовым файлом? Только для одного конкретного файла, а не для всех загруженных файлов во время выполнения. На всякий случай у меня есть больше, чем предикаты в файле, такие как правила или импорт модуля или библиотеки. mll
@ manullamas проверь мои правки;) Thanos Tintinidis
3

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

Тогда есть библиотека для ' внешние столы ', то есть хранится в файлах и индексируется. Вы должны использовать это, если у вас есть данные, которые не помещаются в памяти, или если загрузка / сохранение всего набора данных занимает слишком много времени.

В противном случае, ответ от thanosQR предлагает «старомодный» способ справиться с постоянством.

Да, это выглядит довольно интересно! Thanos Tintinidis
anyway, благодаря вашему вопросу, я «обнаружил» persistency.pl, и я думаю, что сразу же буду использовать. Спасибо вам CapelliC

Похожие вопросы